unspaghettit 0.4.0 → 0.5.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/README.md +72 -420
- package/build/client/_app/immutable/assets/0.BICGpMpl.css +1 -0
- package/build/client/_app/immutable/assets/0.BICGpMpl.css.br +0 -0
- package/build/client/_app/immutable/assets/0.BICGpMpl.css.gz +0 -0
- package/build/client/_app/immutable/assets/ProjectionViewer.CAJs9mSm.css +1 -0
- package/build/client/_app/immutable/assets/ProjectionViewer.CAJs9mSm.css.br +0 -0
- package/build/client/_app/immutable/assets/ProjectionViewer.CAJs9mSm.css.gz +0 -0
- package/build/client/_app/immutable/chunks/-wbtE0Wz.js +2 -0
- package/build/client/_app/immutable/chunks/-wbtE0Wz.js.br +0 -0
- package/build/client/_app/immutable/chunks/-wbtE0Wz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/1YD06TSH.js +1 -0
- package/build/client/_app/immutable/chunks/1YD06TSH.js.br +0 -0
- package/build/client/_app/immutable/chunks/1YD06TSH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/1eydZG8c2.js +62 -0
- package/build/client/_app/immutable/chunks/1eydZG8c2.js.br +0 -0
- package/build/client/_app/immutable/chunks/1eydZG8c2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/5kkA9S0Z.js +1 -0
- package/build/client/_app/immutable/chunks/5kkA9S0Z.js.br +0 -0
- package/build/client/_app/immutable/chunks/5kkA9S0Z.js.gz +0 -0
- package/build/client/_app/immutable/chunks/8U1f2eNj.js +2 -0
- package/build/client/_app/immutable/chunks/8U1f2eNj.js.br +0 -0
- package/build/client/_app/immutable/chunks/8U1f2eNj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B09M61WJ.js +162 -0
- package/build/client/_app/immutable/chunks/B09M61WJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/B09M61WJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B0iFqXbB.js +96 -0
- package/build/client/_app/immutable/chunks/B0iFqXbB.js.br +0 -0
- package/build/client/_app/immutable/chunks/B0iFqXbB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B1xABoD7.js +1 -0
- package/build/client/_app/immutable/chunks/B1xABoD7.js.br +0 -0
- package/build/client/_app/immutable/chunks/B1xABoD7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B8gBHxth2.js +1 -0
- package/build/client/_app/immutable/chunks/B8gBHxth2.js.br +0 -0
- package/build/client/_app/immutable/chunks/B8gBHxth2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B9EDTZp0.js +88 -0
- package/build/client/_app/immutable/chunks/B9EDTZp0.js.br +0 -0
- package/build/client/_app/immutable/chunks/B9EDTZp0.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BDwoNRuh.js +2 -0
- package/build/client/_app/immutable/chunks/BDwoNRuh.js.br +0 -0
- package/build/client/_app/immutable/chunks/BDwoNRuh.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BESn8g1q2.js +3 -0
- package/build/client/_app/immutable/chunks/BESn8g1q2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BESn8g1q2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BJ1_SxZJ.js +1 -0
- package/build/client/_app/immutable/chunks/BJ1_SxZJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/BJ1_SxZJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BJZKfD3z2.js +62 -0
- package/build/client/_app/immutable/chunks/BJZKfD3z2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BJZKfD3z2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BK2Zktgk.js +1 -0
- package/build/client/_app/immutable/chunks/BK2Zktgk.js.br +0 -0
- package/build/client/_app/immutable/chunks/BK2Zktgk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BLoiWxmP.js +84 -0
- package/build/client/_app/immutable/chunks/BLoiWxmP.js.br +0 -0
- package/build/client/_app/immutable/chunks/BLoiWxmP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BNdNa-SK.js +1 -0
- package/build/client/_app/immutable/chunks/BNdNa-SK.js.br +0 -0
- package/build/client/_app/immutable/chunks/BNdNa-SK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BQZ-aX_H.js +1 -0
- package/build/client/_app/immutable/chunks/BQZ-aX_H.js.br +3 -0
- package/build/client/_app/immutable/chunks/BQZ-aX_H.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BQd2Qhhb.js +2 -0
- package/build/client/_app/immutable/chunks/BQd2Qhhb.js.br +0 -0
- package/build/client/_app/immutable/chunks/BQd2Qhhb.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BRXEH0cD2.js +4 -0
- package/build/client/_app/immutable/chunks/BRXEH0cD2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BRXEH0cD2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BWPyau1x.js +1 -0
- package/build/client/_app/immutable/chunks/BWPyau1x.js.br +0 -0
- package/build/client/_app/immutable/chunks/BWPyau1x.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BXzZkxK8.js +1 -0
- package/build/client/_app/immutable/chunks/BXzZkxK8.js.br +0 -0
- package/build/client/_app/immutable/chunks/BXzZkxK8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BYOFYXLE2.js +1 -0
- package/build/client/_app/immutable/chunks/BYOFYXLE2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BYOFYXLE2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BaIsDD6o.js +1 -0
- package/build/client/_app/immutable/chunks/BaIsDD6o.js.br +0 -0
- package/build/client/_app/immutable/chunks/BaIsDD6o.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bb88vIzY2.js +1 -0
- package/build/client/_app/immutable/chunks/Bb88vIzY2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bb88vIzY2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bc-btnTu.js +1 -0
- package/build/client/_app/immutable/chunks/Bc-btnTu.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bc-btnTu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BccHqFcL.js +1 -0
- package/build/client/_app/immutable/chunks/BccHqFcL.js.br +0 -0
- package/build/client/_app/immutable/chunks/BccHqFcL.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Be6AJv-Y2.js +5 -0
- package/build/client/_app/immutable/chunks/Be6AJv-Y2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Be6AJv-Y2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BeFL77tj.js +1 -0
- package/build/client/_app/immutable/chunks/BeFL77tj.js.br +0 -0
- package/build/client/_app/immutable/chunks/BeFL77tj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bed3n0vH2.js +1 -0
- package/build/client/_app/immutable/chunks/Bed3n0vH2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bed3n0vH2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BefE1n4q2.js +7 -0
- package/build/client/_app/immutable/chunks/BefE1n4q2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BefE1n4q2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bi8-7IBv.js +120 -0
- package/build/client/_app/immutable/chunks/Bi8-7IBv.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bi8-7IBv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BifhSqXX.js +1 -0
- package/build/client/_app/immutable/chunks/BifhSqXX.js.br +0 -0
- package/build/client/_app/immutable/chunks/BifhSqXX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BlSWIJFp.js +1 -0
- package/build/client/_app/immutable/chunks/BlSWIJFp.js.br +0 -0
- package/build/client/_app/immutable/chunks/BlSWIJFp.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BpQ79iQv.js +1 -0
- package/build/client/_app/immutable/chunks/BpQ79iQv.js.br +0 -0
- package/build/client/_app/immutable/chunks/BpQ79iQv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BuFlayix.js +1 -0
- package/build/client/_app/immutable/chunks/BuFlayix.js.br +0 -0
- package/build/client/_app/immutable/chunks/BuFlayix.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BxhSPDFu.js +139 -0
- package/build/client/_app/immutable/chunks/BxhSPDFu.js.br +0 -0
- package/build/client/_app/immutable/chunks/BxhSPDFu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C-WfXnUC.js +1 -0
- package/build/client/_app/immutable/chunks/C-WfXnUC.js.br +0 -0
- package/build/client/_app/immutable/chunks/C-WfXnUC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C-bYDTOw.js +1 -0
- package/build/client/_app/immutable/chunks/C-bYDTOw.js.br +0 -0
- package/build/client/_app/immutable/chunks/C-bYDTOw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C-ugm7-i2.js +1 -0
- package/build/client/_app/immutable/chunks/C-ugm7-i2.js.br +0 -0
- package/build/client/_app/immutable/chunks/C-ugm7-i2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C0Wa0kvB2.js +1 -0
- package/build/client/_app/immutable/chunks/C0Wa0kvB2.js.br +0 -0
- package/build/client/_app/immutable/chunks/C0Wa0kvB2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C1iguOWx.js +1 -0
- package/build/client/_app/immutable/chunks/C1iguOWx.js.br +0 -0
- package/build/client/_app/immutable/chunks/C1iguOWx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C4HT1CZz.js +11 -0
- package/build/client/_app/immutable/chunks/C4HT1CZz.js.br +0 -0
- package/build/client/_app/immutable/chunks/C4HT1CZz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C4W7h1uu.js +106 -0
- package/build/client/_app/immutable/chunks/C4W7h1uu.js.br +0 -0
- package/build/client/_app/immutable/chunks/C4W7h1uu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C8Fc0cco.js +1 -0
- package/build/client/_app/immutable/chunks/C8Fc0cco.js.br +0 -0
- package/build/client/_app/immutable/chunks/C8Fc0cco.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C8XGGcB1.js +231 -0
- package/build/client/_app/immutable/chunks/C8XGGcB1.js.br +0 -0
- package/build/client/_app/immutable/chunks/C8XGGcB1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C9cWQTtG.js +1 -0
- package/build/client/_app/immutable/chunks/C9cWQTtG.js.br +0 -0
- package/build/client/_app/immutable/chunks/C9cWQTtG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CGhzzHe4.js +1 -0
- package/build/client/_app/immutable/chunks/CGhzzHe4.js.br +0 -0
- package/build/client/_app/immutable/chunks/CGhzzHe4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CHdTS7qa.js +15 -0
- package/build/client/_app/immutable/chunks/CHdTS7qa.js.br +0 -0
- package/build/client/_app/immutable/chunks/CHdTS7qa.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CJcKAEcO2.js +1 -0
- package/build/client/_app/immutable/chunks/CJcKAEcO2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CJcKAEcO2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CLTKpxnB.js +1 -0
- package/build/client/_app/immutable/chunks/CLTKpxnB.js.br +0 -0
- package/build/client/_app/immutable/chunks/CLTKpxnB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CNv4GNjM.js +34 -0
- package/build/client/_app/immutable/chunks/CNv4GNjM.js.br +0 -0
- package/build/client/_app/immutable/chunks/CNv4GNjM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CPzx8yYf.js +70 -0
- package/build/client/_app/immutable/chunks/CPzx8yYf.js.br +0 -0
- package/build/client/_app/immutable/chunks/CPzx8yYf.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CQmm9nMS2.js +1 -0
- package/build/client/_app/immutable/chunks/CQmm9nMS2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CQmm9nMS2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CSKSodPl2.js +1 -0
- package/build/client/_app/immutable/chunks/CSKSodPl2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CSKSodPl2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CTgm3pse2.js +1 -0
- package/build/client/_app/immutable/chunks/CTgm3pse2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CTgm3pse2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CUsW5qRl2.js +1 -0
- package/build/client/_app/immutable/chunks/CUsW5qRl2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CUsW5qRl2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CV2qc2Q8.js +1 -0
- package/build/client/_app/immutable/chunks/CV2qc2Q8.js.br +0 -0
- package/build/client/_app/immutable/chunks/CV2qc2Q8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CVEvf7jc.js +1 -0
- package/build/client/_app/immutable/chunks/CVEvf7jc.js.br +0 -0
- package/build/client/_app/immutable/chunks/CVEvf7jc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CWiCMZki.js +1 -0
- package/build/client/_app/immutable/chunks/CWiCMZki.js.br +0 -0
- package/build/client/_app/immutable/chunks/CWiCMZki.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZjpSfW72.js +1 -0
- package/build/client/_app/immutable/chunks/CZjpSfW72.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZjpSfW72.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C_ti8jK-.js +85 -0
- package/build/client/_app/immutable/chunks/C_ti8jK-.js.br +0 -0
- package/build/client/_app/immutable/chunks/C_ti8jK-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CbZX1jWz.js +33 -0
- package/build/client/_app/immutable/chunks/CbZX1jWz.js.br +0 -0
- package/build/client/_app/immutable/chunks/CbZX1jWz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CdFWJ6ez.js +1 -0
- package/build/client/_app/immutable/chunks/CdFWJ6ez.js.br +0 -0
- package/build/client/_app/immutable/chunks/CdFWJ6ez.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ChlLeWny.js +1 -0
- package/build/client/_app/immutable/chunks/ChlLeWny.js.br +0 -0
- package/build/client/_app/immutable/chunks/ChlLeWny.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CkAtyrpe.js +1 -0
- package/build/client/_app/immutable/chunks/CkAtyrpe.js.br +0 -0
- package/build/client/_app/immutable/chunks/CkAtyrpe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ClJa2XGO.js +4 -0
- package/build/client/_app/immutable/chunks/ClJa2XGO.js.br +0 -0
- package/build/client/_app/immutable/chunks/ClJa2XGO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ClbGhxo0.js +1 -0
- package/build/client/_app/immutable/chunks/ClbGhxo0.js.br +0 -0
- package/build/client/_app/immutable/chunks/ClbGhxo0.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cnk_uJkO.js +1 -0
- package/build/client/_app/immutable/chunks/Cnk_uJkO.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cnk_uJkO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CpUvmGkq.js +1 -0
- package/build/client/_app/immutable/chunks/CpUvmGkq.js.br +0 -0
- package/build/client/_app/immutable/chunks/CpUvmGkq.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CsWsRE-S.js +1 -0
- package/build/client/_app/immutable/chunks/CsWsRE-S.js.br +0 -0
- package/build/client/_app/immutable/chunks/CsWsRE-S.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Csf4ldSv.js +292 -0
- package/build/client/_app/immutable/chunks/Csf4ldSv.js.br +0 -0
- package/build/client/_app/immutable/chunks/Csf4ldSv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CuRJVwEq.js +1 -0
- package/build/client/_app/immutable/chunks/CuRJVwEq.js.br +0 -0
- package/build/client/_app/immutable/chunks/CuRJVwEq.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CvPfg302.js +1 -0
- package/build/client/_app/immutable/chunks/CvPfg302.js.br +0 -0
- package/build/client/_app/immutable/chunks/CvPfg302.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CvnBh5hz2.js +41 -0
- package/build/client/_app/immutable/chunks/CvnBh5hz2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CvnBh5hz2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cvtkz7zx2.js +1 -0
- package/build/client/_app/immutable/chunks/Cvtkz7zx2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cvtkz7zx2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CwIe_3aJ2.js +2 -0
- package/build/client/_app/immutable/chunks/CwIe_3aJ2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CwIe_3aJ2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CwcyOev-2.js +1 -0
- package/build/client/_app/immutable/chunks/CwcyOev-2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CwcyOev-2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D-D-aCVK.js +1 -0
- package/build/client/_app/immutable/chunks/D-D-aCVK.js.br +1 -0
- package/build/client/_app/immutable/chunks/D-D-aCVK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D1_z6drZ.js +70 -0
- package/build/client/_app/immutable/chunks/D1_z6drZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/D1_z6drZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D3w5-9Ob2.js +1 -0
- package/build/client/_app/immutable/chunks/D3w5-9Ob2.js.br +0 -0
- package/build/client/_app/immutable/chunks/D3w5-9Ob2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D4_anEKG.js +1 -0
- package/build/client/_app/immutable/chunks/D4_anEKG.js.br +0 -0
- package/build/client/_app/immutable/chunks/D4_anEKG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D6jRqBbL.js +1 -0
- package/build/client/_app/immutable/chunks/D6jRqBbL.js.br +0 -0
- package/build/client/_app/immutable/chunks/D6jRqBbL.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D8TtvFq5.js +32 -0
- package/build/client/_app/immutable/chunks/D8TtvFq5.js.br +0 -0
- package/build/client/_app/immutable/chunks/D8TtvFq5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D8sk7M39.js +1 -0
- package/build/client/_app/immutable/chunks/D8sk7M39.js.br +0 -0
- package/build/client/_app/immutable/chunks/D8sk7M39.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D9MZmvmn2.js +24 -0
- package/build/client/_app/immutable/chunks/D9MZmvmn2.js.br +0 -0
- package/build/client/_app/immutable/chunks/D9MZmvmn2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DAMACDJq.js +36 -0
- package/build/client/_app/immutable/chunks/DAMACDJq.js.br +0 -0
- package/build/client/_app/immutable/chunks/DAMACDJq.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DBtldFQZ2.js +30 -0
- package/build/client/_app/immutable/chunks/DBtldFQZ2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DBtldFQZ2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DDqoSPm3.js +7 -0
- package/build/client/_app/immutable/chunks/DDqoSPm3.js.br +0 -0
- package/build/client/_app/immutable/chunks/DDqoSPm3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DEyXyZtJ.js +39 -0
- package/build/client/_app/immutable/chunks/DEyXyZtJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/DEyXyZtJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DIzW9ZVE2.js +8 -0
- package/build/client/_app/immutable/chunks/DIzW9ZVE2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DIzW9ZVE2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DJ1Yhnmr.js +1 -0
- package/build/client/_app/immutable/chunks/DJ1Yhnmr.js.br +0 -0
- package/build/client/_app/immutable/chunks/DJ1Yhnmr.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DMRB31d-2.js +1 -0
- package/build/client/_app/immutable/chunks/DMRB31d-2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DMRB31d-2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DNzq6p3w2.js +161 -0
- package/build/client/_app/immutable/chunks/DNzq6p3w2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DNzq6p3w2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DUr39uWh2.js +1 -0
- package/build/client/_app/immutable/chunks/DUr39uWh2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DUr39uWh2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DVaSOh4-.js +3 -0
- package/build/client/_app/immutable/chunks/DVaSOh4-.js.br +0 -0
- package/build/client/_app/immutable/chunks/DVaSOh4-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DVhQ1k0s2.js +3 -0
- package/build/client/_app/immutable/chunks/DVhQ1k0s2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DVhQ1k0s2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DWH50pe1.js +1 -0
- package/build/client/_app/immutable/chunks/DWH50pe1.js.br +3 -0
- package/build/client/_app/immutable/chunks/DWH50pe1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DY1BZ4Qc2.js +1 -0
- package/build/client/_app/immutable/chunks/DY1BZ4Qc2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DY1BZ4Qc2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DZSCUHXb.js +156 -0
- package/build/client/_app/immutable/chunks/DZSCUHXb.js.br +0 -0
- package/build/client/_app/immutable/chunks/DZSCUHXb.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ddx1CBA6.js +40 -0
- package/build/client/_app/immutable/chunks/Ddx1CBA6.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ddx1CBA6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dk9GLDty.js +1 -0
- package/build/client/_app/immutable/chunks/Dk9GLDty.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dk9GLDty.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DlWh-KOn2.js +1 -0
- package/build/client/_app/immutable/chunks/DlWh-KOn2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DlWh-KOn2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DletFdz12.js +1 -0
- package/build/client/_app/immutable/chunks/DletFdz12.js.br +0 -0
- package/build/client/_app/immutable/chunks/DletFdz12.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dm-G3nMe2.js +1 -0
- package/build/client/_app/immutable/chunks/Dm-G3nMe2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dm-G3nMe2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dogw7aIe2.js +132 -0
- package/build/client/_app/immutable/chunks/Dogw7aIe2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dogw7aIe2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DrMZ652T2.js +10 -0
- package/build/client/_app/immutable/chunks/DrMZ652T2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DrMZ652T2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DsF7k-Jl.js +1 -0
- package/build/client/_app/immutable/chunks/DsF7k-Jl.js.br +0 -0
- package/build/client/_app/immutable/chunks/DsF7k-Jl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ds_pPMdM.js +89 -0
- package/build/client/_app/immutable/chunks/Ds_pPMdM.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ds_pPMdM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dvfqp2bE2.js +206 -0
- package/build/client/_app/immutable/chunks/Dvfqp2bE2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dvfqp2bE2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/FPGifquY.js +1 -0
- package/build/client/_app/immutable/chunks/FPGifquY.js.br +0 -0
- package/build/client/_app/immutable/chunks/FPGifquY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/JobSK4jl.js +8 -0
- package/build/client/_app/immutable/chunks/JobSK4jl.js.br +0 -0
- package/build/client/_app/immutable/chunks/JobSK4jl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/KythIMN8.js +1 -0
- package/build/client/_app/immutable/chunks/KythIMN8.js.br +0 -0
- package/build/client/_app/immutable/chunks/KythIMN8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Lky-brJg.js +78 -0
- package/build/client/_app/immutable/chunks/Lky-brJg.js.br +0 -0
- package/build/client/_app/immutable/chunks/Lky-brJg.js.gz +0 -0
- package/build/client/_app/immutable/chunks/MWwyDxWm.js +1 -0
- package/build/client/_app/immutable/chunks/MWwyDxWm.js.br +0 -0
- package/build/client/_app/immutable/chunks/MWwyDxWm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/PoKicp1b.js +1 -0
- package/build/client/_app/immutable/chunks/PoKicp1b.js.br +0 -0
- package/build/client/_app/immutable/chunks/PoKicp1b.js.gz +0 -0
- package/build/client/_app/immutable/chunks/S9DkSFmq.js +1 -0
- package/build/client/_app/immutable/chunks/S9DkSFmq.js.br +2 -0
- package/build/client/_app/immutable/chunks/S9DkSFmq.js.gz +0 -0
- package/build/client/_app/immutable/chunks/TdbPyF2S2.js +1 -0
- package/build/client/_app/immutable/chunks/TdbPyF2S2.js.br +0 -0
- package/build/client/_app/immutable/chunks/TdbPyF2S2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/VBjup0bq2.js +10 -0
- package/build/client/_app/immutable/chunks/VBjup0bq2.js.br +0 -0
- package/build/client/_app/immutable/chunks/VBjup0bq2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Vhh-h91d.js +257 -0
- package/build/client/_app/immutable/chunks/Vhh-h91d.js.br +0 -0
- package/build/client/_app/immutable/chunks/Vhh-h91d.js.gz +0 -0
- package/build/client/_app/immutable/chunks/WAacuR06.js +1 -0
- package/build/client/_app/immutable/chunks/WAacuR06.js.br +0 -0
- package/build/client/_app/immutable/chunks/WAacuR06.js.gz +0 -0
- package/build/client/_app/immutable/chunks/XTEI1PxW2.js +24 -0
- package/build/client/_app/immutable/chunks/XTEI1PxW2.js.br +0 -0
- package/build/client/_app/immutable/chunks/XTEI1PxW2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/exo-lpMX.js +127 -0
- package/build/client/_app/immutable/chunks/exo-lpMX.js.br +0 -0
- package/build/client/_app/immutable/chunks/exo-lpMX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/gaw8GWTo2.js +1 -0
- package/build/client/_app/immutable/chunks/gaw8GWTo2.js.br +0 -0
- package/build/client/_app/immutable/chunks/gaw8GWTo2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/h6BdjjI9.js +321 -0
- package/build/client/_app/immutable/chunks/h6BdjjI9.js.br +0 -0
- package/build/client/_app/immutable/chunks/h6BdjjI9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/h_GqX5w-.js +1 -0
- package/build/client/_app/immutable/chunks/h_GqX5w-.js.br +0 -0
- package/build/client/_app/immutable/chunks/h_GqX5w-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/mo9pLZen2.js +1 -0
- package/build/client/_app/immutable/chunks/mo9pLZen2.js.br +0 -0
- package/build/client/_app/immutable/chunks/mo9pLZen2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ooT6HhuO2.js +1 -0
- package/build/client/_app/immutable/chunks/ooT6HhuO2.js.br +0 -0
- package/build/client/_app/immutable/chunks/ooT6HhuO2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pfd3enil.js +7 -0
- package/build/client/_app/immutable/chunks/pfd3enil.js.br +0 -0
- package/build/client/_app/immutable/chunks/pfd3enil.js.gz +0 -0
- package/build/client/_app/immutable/chunks/tIdewitl.js +1 -0
- package/build/client/_app/immutable/chunks/tIdewitl.js.br +0 -0
- package/build/client/_app/immutable/chunks/tIdewitl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/tOrX2Ng7.js +1 -0
- package/build/client/_app/immutable/chunks/tOrX2Ng7.js.br +0 -0
- package/build/client/_app/immutable/chunks/tOrX2Ng7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/tXrxDR9B.js +6 -0
- package/build/client/_app/immutable/chunks/tXrxDR9B.js.br +0 -0
- package/build/client/_app/immutable/chunks/tXrxDR9B.js.gz +0 -0
- package/build/client/_app/immutable/chunks/tefrehOD2.js +1 -0
- package/build/client/_app/immutable/chunks/tefrehOD2.js.br +0 -0
- package/build/client/_app/immutable/chunks/tefrehOD2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/vzsK5YEv2.js +2 -0
- package/build/client/_app/immutable/chunks/vzsK5YEv2.js.br +0 -0
- package/build/client/_app/immutable/chunks/vzsK5YEv2.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.savVpdoo.js +2 -0
- package/build/client/_app/immutable/entry/app.savVpdoo.js.br +0 -0
- package/build/client/_app/immutable/entry/app.savVpdoo.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.AX8S-T5k.js +1 -0
- package/build/client/_app/immutable/entry/start.AX8S-T5k.js.br +0 -0
- package/build/client/_app/immutable/entry/start.AX8S-T5k.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.DPLB0yrE.js +8 -0
- package/build/client/_app/immutable/nodes/0.DPLB0yrE.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.DPLB0yrE.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.ckBgjrYG.js +1 -0
- package/build/client/_app/immutable/nodes/1.ckBgjrYG.js.br +1 -0
- package/build/client/_app/immutable/nodes/1.ckBgjrYG.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.BrKQFzjf.js +1 -0
- package/build/client/_app/immutable/nodes/10.BrKQFzjf.js.br +1 -0
- package/build/client/_app/immutable/nodes/10.BrKQFzjf.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.tGaCW3Gg.js +1 -0
- package/build/client/_app/immutable/nodes/11.tGaCW3Gg.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.tGaCW3Gg.js.gz +0 -0
- package/build/client/_app/immutable/nodes/12.DcdJhU1D.js +2 -0
- package/build/client/_app/immutable/nodes/12.DcdJhU1D.js.br +0 -0
- package/build/client/_app/immutable/nodes/12.DcdJhU1D.js.gz +0 -0
- package/build/client/_app/immutable/nodes/13.DVgqJbmy.js +4 -0
- package/build/client/_app/immutable/nodes/13.DVgqJbmy.js.br +0 -0
- package/build/client/_app/immutable/nodes/13.DVgqJbmy.js.gz +0 -0
- package/build/client/_app/immutable/nodes/14.CDFDMZI3.js +371 -0
- package/build/client/_app/immutable/nodes/14.CDFDMZI3.js.br +0 -0
- package/build/client/_app/immutable/nodes/14.CDFDMZI3.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.LHXGgd9i.js +1 -0
- package/build/client/_app/immutable/nodes/2.LHXGgd9i.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.LHXGgd9i.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CrzS5O1R.js +1 -0
- package/build/client/_app/immutable/nodes/3.CrzS5O1R.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CrzS5O1R.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.2NrZGgO0.js +4 -0
- package/build/client/_app/immutable/nodes/4.2NrZGgO0.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.2NrZGgO0.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.DPwImeeA.js +48 -0
- package/build/client/_app/immutable/nodes/5.DPwImeeA.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.DPwImeeA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.DkAe8U-k.js +1 -0
- package/build/client/_app/immutable/nodes/6.DkAe8U-k.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.DkAe8U-k.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.LM-dklY_.js +5 -0
- package/build/client/_app/immutable/nodes/7.LM-dklY_.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.LM-dklY_.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.2uMOQtvP.js +3 -0
- package/build/client/_app/immutable/nodes/8.2uMOQtvP.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.2uMOQtvP.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.QL-xKfFd.js +1 -0
- package/build/client/_app/immutable/nodes/9.QL-xKfFd.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.QL-xKfFd.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/unspaghettit-demo.gif +0 -0
- package/build/server/chunks/0-CClTiwgp.js +15 -0
- package/build/server/chunks/0-CClTiwgp.js.map +1 -0
- package/build/server/chunks/1-CI8Tnoq8.js +9 -0
- package/build/server/chunks/1-CI8Tnoq8.js.map +1 -0
- package/build/server/chunks/10-VGqhJxX-.js +9 -0
- package/build/server/chunks/10-VGqhJxX-.js.map +1 -0
- package/build/server/chunks/11-DhRvpwbO.js +9 -0
- package/build/server/chunks/11-DhRvpwbO.js.map +1 -0
- package/build/server/chunks/12-BHl3mT8e.js +9 -0
- package/build/server/chunks/12-BHl3mT8e.js.map +1 -0
- package/build/server/chunks/13-BoP5JBCp.js +9 -0
- package/build/server/chunks/13-BoP5JBCp.js.map +1 -0
- package/build/server/chunks/14-7jHmiC-a.js +9 -0
- package/build/server/chunks/14-7jHmiC-a.js.map +1 -0
- package/build/server/chunks/2-3_euaNuR.js +9 -0
- package/build/server/chunks/2-3_euaNuR.js.map +1 -0
- package/build/server/chunks/3-eYoMyZgO.js +16 -0
- package/build/server/chunks/3-eYoMyZgO.js.map +1 -0
- package/build/server/chunks/4-CK8KHMgl.js +16 -0
- package/build/server/chunks/4-CK8KHMgl.js.map +1 -0
- package/build/server/chunks/5-OTd2AST0.js +9 -0
- package/build/server/chunks/5-OTd2AST0.js.map +1 -0
- package/build/server/chunks/6-BZkuqps_.js +9 -0
- package/build/server/chunks/6-BZkuqps_.js.map +1 -0
- package/build/server/chunks/7-BnLxVWEs.js +9 -0
- package/build/server/chunks/7-BnLxVWEs.js.map +1 -0
- package/build/server/chunks/8-D5-glAvk.js +9 -0
- package/build/server/chunks/8-D5-glAvk.js.map +1 -0
- package/build/server/chunks/9-DFgEkXPv.js +16 -0
- package/build/server/chunks/9-DFgEkXPv.js.map +1 -0
- package/build/server/chunks/FeatureCard-DP5Bw6U0.js +73 -0
- package/build/server/chunks/FeatureCard-DP5Bw6U0.js.map +1 -0
- package/build/server/chunks/ManageTagsDialog-6T7tk2V4.js +87 -0
- package/build/server/chunks/ManageTagsDialog-6T7tk2V4.js.map +1 -0
- package/build/server/chunks/NameMatch-iUyzWQGi.js +167 -0
- package/build/server/chunks/NameMatch-iUyzWQGi.js.map +1 -0
- package/build/server/chunks/ProgressBar-aVzED5l4.js +70 -0
- package/build/server/chunks/ProgressBar-aVzED5l4.js.map +1 -0
- package/build/server/chunks/ProjectionViewer-C4E9J58C.js +1276 -0
- package/build/server/chunks/ProjectionViewer-C4E9J58C.js.map +1 -0
- package/build/server/chunks/ProjectsIndex-D4YloETv.js +312 -0
- package/build/server/chunks/ProjectsIndex-D4YloETv.js.map +1 -0
- package/build/server/chunks/TagDotStrip-BBNew3Sw.js +88 -0
- package/build/server/chunks/TagDotStrip-BBNew3Sw.js.map +1 -0
- package/build/server/chunks/TagFilterSelect-TwiCLEfS.js +320 -0
- package/build/server/chunks/TagFilterSelect-TwiCLEfS.js.map +1 -0
- package/build/server/chunks/_layout.svelte-CqsZ0TZA.js +1382 -0
- package/build/server/chunks/_layout.svelte-CqsZ0TZA.js.map +1 -0
- package/build/server/chunks/_page.svelte-4Ltl7VP3.js +367 -0
- package/build/server/chunks/_page.svelte-4Ltl7VP3.js.map +1 -0
- package/build/server/chunks/_page.svelte-BHl-gKYd.js +73 -0
- package/build/server/chunks/_page.svelte-BHl-gKYd.js.map +1 -0
- package/build/server/chunks/_page.svelte-BIMkHGDT.js +37 -0
- package/build/server/chunks/_page.svelte-BIMkHGDT.js.map +1 -0
- package/build/server/chunks/_page.svelte-Bt2flY22.js +10686 -0
- package/build/server/chunks/_page.svelte-Bt2flY22.js.map +1 -0
- package/build/server/chunks/_page.svelte-BtQgLElC.js +453 -0
- package/build/server/chunks/_page.svelte-BtQgLElC.js.map +1 -0
- package/build/server/chunks/_page.svelte-BxCh-Iei.js +37 -0
- package/build/server/chunks/_page.svelte-BxCh-Iei.js.map +1 -0
- package/build/server/chunks/_page.svelte-C7doBH40.js +733 -0
- package/build/server/chunks/_page.svelte-C7doBH40.js.map +1 -0
- package/build/server/chunks/_page.svelte-CGp-h951.js +152 -0
- package/build/server/chunks/_page.svelte-CGp-h951.js.map +1 -0
- package/build/server/chunks/_page.svelte-CjsDnEtm.js +5 -0
- package/build/server/chunks/_page.svelte-CjsDnEtm.js.map +1 -0
- package/build/server/chunks/_page.svelte-CrrxtpMV.js +48 -0
- package/build/server/chunks/_page.svelte-CrrxtpMV.js.map +1 -0
- package/build/server/chunks/_page.svelte-MHt5Do2W.js +201 -0
- package/build/server/chunks/_page.svelte-MHt5Do2W.js.map +1 -0
- package/build/server/chunks/_page.svelte-Yer8OrDI.js +839 -0
- package/build/server/chunks/_page.svelte-Yer8OrDI.js.map +1 -0
- package/build/server/chunks/_page.svelte-zv7J2wKa.js +224 -0
- package/build/server/chunks/_page.svelte-zv7J2wKa.js.map +1 -0
- package/build/server/chunks/_server.ts-BRe0LC1T.js +961 -0
- package/build/server/chunks/_server.ts-BRe0LC1T.js.map +1 -0
- package/build/server/chunks/_server.ts-Bg0flkbK.js +23 -0
- package/build/server/chunks/_server.ts-Bg0flkbK.js.map +1 -0
- package/build/server/chunks/_server.ts-BiFrkgBO.js +56 -0
- package/build/server/chunks/_server.ts-BiFrkgBO.js.map +1 -0
- package/build/server/chunks/_server.ts-CX4FaAgQ.js +21 -0
- package/build/server/chunks/_server.ts-CX4FaAgQ.js.map +1 -0
- package/build/server/chunks/_server.ts-ChXv8uGU.js +146 -0
- package/build/server/chunks/_server.ts-ChXv8uGU.js.map +1 -0
- package/build/server/chunks/_server.ts-D7bWQKQ2.js +61 -0
- package/build/server/chunks/_server.ts-D7bWQKQ2.js.map +1 -0
- package/build/server/chunks/_server.ts-DP8DR1Rr.js +23 -0
- package/build/server/chunks/_server.ts-DP8DR1Rr.js.map +1 -0
- package/build/server/chunks/_server.ts-DWGGPMcL.js +50 -0
- package/build/server/chunks/_server.ts-DWGGPMcL.js.map +1 -0
- package/build/server/chunks/_server.ts-DgvjFFNZ.js +50 -0
- package/build/server/chunks/_server.ts-DgvjFFNZ.js.map +1 -0
- package/build/server/chunks/_server.ts-DnsZeBn3.js +104 -0
- package/build/server/chunks/_server.ts-DnsZeBn3.js.map +1 -0
- package/build/server/chunks/_server.ts-Dwc1kK9E.js +106 -0
- package/build/server/chunks/_server.ts-Dwc1kK9E.js.map +1 -0
- package/build/server/chunks/_server.ts-HPtYmvSa.js +69 -0
- package/build/server/chunks/_server.ts-HPtYmvSa.js.map +1 -0
- package/build/server/chunks/_server.ts-TmDMjHJU.js +56 -0
- package/build/server/chunks/_server.ts-TmDMjHJU.js.map +1 -0
- package/build/server/chunks/_server.ts-a1VzwrsR.js +21 -0
- package/build/server/chunks/_server.ts-a1VzwrsR.js.map +1 -0
- package/build/server/chunks/_server.ts-aAabNPO3.js +46 -0
- package/build/server/chunks/_server.ts-aAabNPO3.js.map +1 -0
- package/build/server/chunks/_server.ts-vKhF1AdX.js +23 -0
- package/build/server/chunks/_server.ts-vKhF1AdX.js.map +1 -0
- package/build/server/chunks/browserContainer-EMIwx3Vj.js +1578 -0
- package/build/server/chunks/browserContainer-EMIwx3Vj.js.map +1 -0
- package/build/server/chunks/builderModeStore.svelte-IR5FZmrw.js +893 -0
- package/build/server/chunks/builderModeStore.svelte-IR5FZmrw.js.map +1 -0
- package/build/server/chunks/client-sNd2OQ6I.js +50 -0
- package/build/server/chunks/client-sNd2OQ6I.js.map +1 -0
- package/build/server/chunks/error.svelte-1oacjNWR.js +14 -0
- package/build/server/chunks/error.svelte-1oacjNWR.js.map +1 -0
- package/build/server/chunks/featureQueueContext-B-zt4HV2.js +32 -0
- package/build/server/chunks/featureQueueContext-B-zt4HV2.js.map +1 -0
- package/build/server/chunks/featureStore.svelte-gWtqigFG.js +162 -0
- package/build/server/chunks/featureStore.svelte-gWtqigFG.js.map +1 -0
- package/build/server/chunks/hooks.server-BXHeSkyf.js +270 -0
- package/build/server/chunks/hooks.server-BXHeSkyf.js.map +1 -0
- package/build/server/chunks/internal-DeR_agnv.js +6652 -0
- package/build/server/chunks/internal-DeR_agnv.js.map +1 -0
- package/build/server/chunks/projectBundleClient-DtFjjA2y.js +168 -0
- package/build/server/chunks/projectBundleClient-DtFjjA2y.js.map +1 -0
- package/build/server/chunks/projectContextStore.svelte-RjjLg1b_.js +141 -0
- package/build/server/chunks/projectContextStore.svelte-RjjLg1b_.js.map +1 -0
- package/build/server/chunks/projectFeaturesStore.svelte-CGmfjwIJ.js +87 -0
- package/build/server/chunks/projectFeaturesStore.svelte-CGmfjwIJ.js.map +1 -0
- package/build/server/chunks/projectStore.svelte-BrJdNxU6.js +230 -0
- package/build/server/chunks/projectStore.svelte-BrJdNxU6.js.map +1 -0
- package/build/server/chunks/reconcile-Db_Z9eMF.js +393 -0
- package/build/server/chunks/reconcile-Db_Z9eMF.js.map +1 -0
- package/build/server/chunks/snapshotRepository-B33rz8Kg.js +1208 -0
- package/build/server/chunks/snapshotRepository-B33rz8Kg.js.map +1 -0
- package/build/server/chunks/state-CnR-Lf1m.js +64 -0
- package/build/server/chunks/state-CnR-Lf1m.js.map +1 -0
- package/build/server/chunks/stores-DLazwujy.js +35 -0
- package/build/server/chunks/stores-DLazwujy.js.map +1 -0
- package/build/server/chunks/sync-D230VUZO.js +955 -0
- package/build/server/chunks/sync-D230VUZO.js.map +1 -0
- package/build/server/chunks/syncAwareRepositories-BO5CeBoB.js +57 -0
- package/build/server/chunks/syncAwareRepositories-BO5CeBoB.js.map +1 -0
- package/build/server/chunks/tagPaletteStore.svelte-BUZcJN0E.js +181 -0
- package/build/server/chunks/tagPaletteStore.svelte-BUZcJN0E.js.map +1 -0
- package/build/server/index.js +1 -22
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +60 -37
- package/build/server/manifest.js.map +1 -1
- package/cli/README.md +19 -19
- package/cli/commands/dashboard.ts +6 -3
- package/mcp-server/bin.ts +5 -0
- package/mcp-server/server.ts +7 -0
- package/mcp-server/tools/_shared.ts +2 -0
- package/mcp-server/tools/provenance.ts +217 -0
- package/package.json +5 -4
- package/src/features/behavior-model/presentation/components/BehaviorGraph.svelte +12 -13
- package/src/features/behavior-model/presentation/components/FeatureHeader.svelte +8 -0
- package/src/features/behavior-model/presentation/loadSamplesFlow.ts +68 -0
- package/src/features/diagram-projection/application/projectionComposition.ts +32 -0
- package/src/features/diagram-projection/application/projectionEvents.ts +26 -0
- package/src/features/diagram-projection/domain/DiagramSpec.ts +39 -0
- package/src/features/diagram-projection/domain/ports/DiagramExporter.ts +13 -0
- package/src/features/diagram-projection/domain/ports/ProjectionEvents.ts +21 -0
- package/src/features/diagram-projection/domain/ports/Projector.ts +26 -0
- package/src/features/diagram-projection/domain/services/ProjectorRegistry.ts +32 -0
- package/src/features/diagram-projection/domain/services/projections/erProjector.ts +37 -0
- package/src/features/diagram-projection/domain/services/projections/flowchartProjector.ts +57 -0
- package/src/features/diagram-projection/domain/services/projections/graphToDiagramSpec.ts +18 -0
- package/src/features/diagram-projection/domain/services/projections/mindmapProjector.ts +57 -0
- package/src/features/diagram-projection/domain/services/projections/sequenceProjector.ts +61 -0
- package/src/features/diagram-projection/domain/services/projections/statechartProjector.ts +70 -0
- package/src/features/diagram-projection/domain/services/sourceFacts.ts +32 -0
- package/src/features/diagram-projection/infrastructure/exporters/DotExporter.ts +33 -0
- package/src/features/diagram-projection/infrastructure/exporters/MermaidExporter.ts +117 -0
- package/src/features/diagram-projection/infrastructure/exporters/SvgExporter.ts +73 -0
- package/src/features/diagram-projection/infrastructure/render/mermaidLoader.ts +25 -0
- package/src/features/diagram-projection/presentation/components/ExportPanel.svelte +162 -0
- package/src/features/diagram-projection/presentation/components/MermaidDiagram.svelte +232 -0
- package/src/features/diagram-projection/presentation/components/ProjectionViewer.svelte +325 -0
- package/src/features/domains/infrastructure/persistence/JsonFolderDomainRepository.ts +5 -3
- package/src/features/projects/application/use-cases/GetProjectAggregate.ts +7 -2
- package/src/features/projects/application/use-cases/ImportProjectBundle.ts +37 -0
- package/src/features/projects/presentation/components/ProjectEditor.svelte +7 -0
- package/src/features/projects/presentation/components/ProjectFeaturesPanel.svelte +29 -0
- package/src/features/projects/presentation/components/ProjectsIndex.svelte +52 -13
- package/src/features/source-provenance/application/ports/ProvenanceRepository.ts +8 -0
- package/src/features/source-provenance/domain/FeatureElements.ts +50 -0
- package/src/features/source-provenance/domain/Highlighting.ts +91 -0
- package/src/features/source-provenance/domain/Provenance.ts +220 -0
- package/src/features/source-provenance/infrastructure/io/ProvenanceJson.ts +98 -0
- package/src/features/source-provenance/infrastructure/persistence/InMemoryProvenanceRepository.ts +19 -0
- package/src/features/source-provenance/infrastructure/persistence/JsonFolderProvenanceRepository.ts +71 -0
- package/src/features/source-provenance/presentation/components/SourceViewer.svelte +228 -0
- package/src/features/source-provenance/presentation/stores/provenanceStore.svelte.ts +70 -0
- package/src/features/tutorial/infrastructure/tours/firstFeatureTour.ts +2 -4
- package/src/features/tutorial/presentation/components/GettingStartedBanner.svelte +92 -0
- package/src/features/tutorial/presentation/stores/onboardingStore.svelte.ts +65 -0
- package/src/features/tutorial/presentation/stores/tourStore.svelte.ts +6 -1
- package/src/hooks.server.ts +12 -2
- package/src/lib/server/security/localGuard.ts +133 -0
- package/src/lib/server/snapshotRepository.ts +5 -1
- package/src/lib/server/sync/wsServer.ts +11 -0
- package/src/routes/+layout.svelte +131 -149
- package/src/routes/api/projects/import/+server.ts +11 -3
- package/src/routes/api/snapshots/[id]/provenance/+server.ts +13 -0
- package/src/routes/features/+page.svelte +2 -1
- package/src/routes/features/[id]/+page.svelte +1 -1
- package/src/routes/features/[id]/graph/+page.svelte +4 -4
- package/src/routes/features/[id]/provenance/+page.svelte +54 -0
- package/src/routes/features/[id]/verify/+page.svelte +3 -3
- package/src/routes/mcp/+page.svelte +2 -645
- package/src/routes/mcp/+page.ts +11 -0
- package/src/routes/projects/[id]/graph/+page.svelte +3 -3
- package/src/routes/projects/[id]/mcp/+page.svelte +765 -0
- package/src/routes/tutorial/+page.svelte +48 -74
- package/src/shared/infrastructure/persistence/snapshotLayout.ts +75 -5
- package/static/unspaghettit-demo.gif +0 -0
- package/vite.config.ts +6 -0
- package/build/client/_app/immutable/assets/0.DCOD5ne_.css +0 -1
- 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/BehaviorGraph.Bk0xQRZk.css +0 -1
- 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 +0 -1
- 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/BANF9BhQ2.js +0 -2
- 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 +0 -1
- 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 +0 -3
- package/build/client/_app/immutable/chunks/BPl9BITm.js.br +0 -0
- package/build/client/_app/immutable/chunks/BPl9BITm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bcyn5YUg.js +0 -4
- 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 +0 -1
- 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/BjxqhpPG.js +0 -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 +0 -1
- 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 +0 -1
- package/build/client/_app/immutable/chunks/BzLd0mTH.js.br +0 -0
- package/build/client/_app/immutable/chunks/BzLd0mTH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C8b3IMj8.js +0 -1
- 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/ClC4qR7W2.js +0 -2
- 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 +0 -1
- 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 +0 -1
- 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/D64sGJRN.js +0 -1
- 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 +0 -1
- 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 +0 -1
- package/build/client/_app/immutable/chunks/Da59TXPe.js.br +0 -2
- package/build/client/_app/immutable/chunks/Da59TXPe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DhTiE3j02.js +0 -2
- 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 +0 -1
- package/build/client/_app/immutable/chunks/Dhqg7r_2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dhqg7r_2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DmyaDy4d2.js +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- package/build/client/_app/immutable/chunks/DtblIi6X2.js.br +0 -1
- package/build/client/_app/immutable/chunks/DtblIi6X2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/UkzDDeO42.js +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -5
- package/build/client/_app/immutable/chunks/aNMRV4sP2.js.br +0 -0
- package/build/client/_app/immutable/chunks/aNMRV4sP2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/cMamJTsF.js +0 -1
- package/build/client/_app/immutable/chunks/cMamJTsF.js.br +0 -0
- package/build/client/_app/immutable/chunks/cMamJTsF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ib21i2T_.js +0 -6
- package/build/client/_app/immutable/chunks/ib21i2T_.js.br +0 -0
- package/build/client/_app/immutable/chunks/ib21i2T_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/oVMDLirx.js +0 -1
- 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 +0 -1
- 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 +0 -1
- package/build/client/_app/immutable/chunks/suTxxv1t.js.br +0 -1
- package/build/client/_app/immutable/chunks/suTxxv1t.js.gz +0 -0
- package/build/client/_app/immutable/chunks/wXIHzLMQ2.js +0 -1
- 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 +0 -1
- 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 +0 -1
- 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/yShDxCNj.js +0 -1
- package/build/client/_app/immutable/chunks/yShDxCNj.js.br +0 -2
- package/build/client/_app/immutable/chunks/yShDxCNj.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Etd-exTb.js +0 -2
- 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 +0 -1
- 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 +0 -8
- 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.CER5ICKt.js +0 -1
- package/build/client/_app/immutable/nodes/1.CER5ICKt.js.br +0 -1
- package/build/client/_app/immutable/nodes/1.CER5ICKt.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.rT7cD8kX.js +0 -1
- 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 +0 -2
- 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/12.DCTRFMqo.js +0 -402
- 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.CF488WWF.js +0 -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 +0 -1
- 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 +0 -3
- 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 +0 -48
- 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 +0 -1
- 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 +0 -3
- 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 +0 -5
- 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/9.D72NaL3l.js +0 -1
- package/build/client/_app/immutable/nodes/9.D72NaL3l.js.br +0 -1
- package/build/client/_app/immutable/nodes/9.D72NaL3l.js.gz +0 -0
- package/build/server/chunks/0-8YZc572z.js +0 -15
- package/build/server/chunks/0-8YZc572z.js.map +0 -1
- package/build/server/chunks/1-DxkfSJLu.js +0 -9
- package/build/server/chunks/1-DxkfSJLu.js.map +0 -1
- package/build/server/chunks/10-DkObdGtU.js +0 -9
- package/build/server/chunks/10-DkObdGtU.js.map +0 -1
- package/build/server/chunks/11-DL94HxpZ.js +0 -9
- package/build/server/chunks/11-DL94HxpZ.js.map +0 -1
- package/build/server/chunks/12-CI74sCkt.js +0 -9
- package/build/server/chunks/12-CI74sCkt.js.map +0 -1
- package/build/server/chunks/2-qhWwQ4eL.js +0 -9
- package/build/server/chunks/2-qhWwQ4eL.js.map +0 -1
- package/build/server/chunks/3-CzoZtSTp.js +0 -16
- package/build/server/chunks/3-CzoZtSTp.js.map +0 -1
- package/build/server/chunks/4-CDa9DBsh.js +0 -16
- package/build/server/chunks/4-CDa9DBsh.js.map +0 -1
- package/build/server/chunks/5-qD2xxOrq.js +0 -9
- package/build/server/chunks/5-qD2xxOrq.js.map +0 -1
- package/build/server/chunks/6-B4mWzvDn.js +0 -9
- package/build/server/chunks/6-B4mWzvDn.js.map +0 -1
- package/build/server/chunks/7-zExv-fTN.js +0 -9
- package/build/server/chunks/7-zExv-fTN.js.map +0 -1
- package/build/server/chunks/8-BVrGdQg4.js +0 -9
- package/build/server/chunks/8-BVrGdQg4.js.map +0 -1
- package/build/server/chunks/9-BnZLRMYA.js +0 -9
- package/build/server/chunks/9-BnZLRMYA.js.map +0 -1
- package/build/server/chunks/BehaviorGraph-C-9z37Sm.js +0 -788
- package/build/server/chunks/BehaviorGraph-C-9z37Sm.js.map +0 -1
- package/build/server/chunks/FeatureCard-Bb50FEfp.js +0 -73
- package/build/server/chunks/FeatureCard-Bb50FEfp.js.map +0 -1
- package/build/server/chunks/ManageTagsDialog-D5xbAVNB.js +0 -87
- package/build/server/chunks/ManageTagsDialog-D5xbAVNB.js.map +0 -1
- package/build/server/chunks/ProgressBar-CUC2EZqG.js +0 -70
- package/build/server/chunks/ProgressBar-CUC2EZqG.js.map +0 -1
- package/build/server/chunks/ProjectsIndex-FgIu9dBp.js +0 -307
- package/build/server/chunks/ProjectsIndex-FgIu9dBp.js.map +0 -1
- package/build/server/chunks/TagDotStrip-0rn-IJVE.js +0 -88
- package/build/server/chunks/TagDotStrip-0rn-IJVE.js.map +0 -1
- package/build/server/chunks/TagFilterSelect-Dbu-7Dg4.js +0 -112
- package/build/server/chunks/TagFilterSelect-Dbu-7Dg4.js.map +0 -1
- package/build/server/chunks/_layout.svelte-pSSG85WT.js +0 -1342
- package/build/server/chunks/_layout.svelte-pSSG85WT.js.map +0 -1
- package/build/server/chunks/_page.svelte-BNH3szkk.js +0 -202
- package/build/server/chunks/_page.svelte-BNH3szkk.js.map +0 -1
- package/build/server/chunks/_page.svelte-BcuGvUt1.js +0 -37
- package/build/server/chunks/_page.svelte-BcuGvUt1.js.map +0 -1
- package/build/server/chunks/_page.svelte-BoOMG5Y0.js +0 -37
- package/build/server/chunks/_page.svelte-BoOMG5Y0.js.map +0 -1
- package/build/server/chunks/_page.svelte-C4PRh_wP.js +0 -454
- package/build/server/chunks/_page.svelte-C4PRh_wP.js.map +0 -1
- package/build/server/chunks/_page.svelte-Cqn34NXy.js +0 -74
- package/build/server/chunks/_page.svelte-Cqn34NXy.js.map +0 -1
- package/build/server/chunks/_page.svelte-DSCeOGv7.js +0 -99
- package/build/server/chunks/_page.svelte-DSCeOGv7.js.map +0 -1
- package/build/server/chunks/_page.svelte-DqWdGt48.js +0 -182
- package/build/server/chunks/_page.svelte-DqWdGt48.js.map +0 -1
- package/build/server/chunks/_page.svelte-DsQHSEl4.js +0 -49
- package/build/server/chunks/_page.svelte-DsQHSEl4.js.map +0 -1
- package/build/server/chunks/_page.svelte-Uioz8hsG.js +0 -834
- package/build/server/chunks/_page.svelte-Uioz8hsG.js.map +0 -1
- package/build/server/chunks/_page.svelte-p38jot9e.js +0 -735
- package/build/server/chunks/_page.svelte-p38jot9e.js.map +0 -1
- package/build/server/chunks/_page.svelte-yN5kzgJ9.js +0 -10707
- package/build/server/chunks/_page.svelte-yN5kzgJ9.js.map +0 -1
- package/build/server/chunks/_server.ts-1CtrHhte.js +0 -23
- package/build/server/chunks/_server.ts-1CtrHhte.js.map +0 -1
- package/build/server/chunks/_server.ts-71Qx1lQb.js +0 -21
- package/build/server/chunks/_server.ts-71Qx1lQb.js.map +0 -1
- package/build/server/chunks/_server.ts-BAyekGHB.js +0 -961
- package/build/server/chunks/_server.ts-BAyekGHB.js.map +0 -1
- package/build/server/chunks/_server.ts-BLWhU22T.js +0 -23
- package/build/server/chunks/_server.ts-BLWhU22T.js.map +0 -1
- package/build/server/chunks/_server.ts-C7EVZVxv.js +0 -61
- package/build/server/chunks/_server.ts-C7EVZVxv.js.map +0 -1
- package/build/server/chunks/_server.ts-CGjYuLmo.js +0 -50
- package/build/server/chunks/_server.ts-CGjYuLmo.js.map +0 -1
- package/build/server/chunks/_server.ts-CX6H8fSE.js +0 -56
- package/build/server/chunks/_server.ts-CX6H8fSE.js.map +0 -1
- package/build/server/chunks/_server.ts-CyEdTCLr.js +0 -50
- package/build/server/chunks/_server.ts-CyEdTCLr.js.map +0 -1
- package/build/server/chunks/_server.ts-DKVTM9Pj.js +0 -77
- package/build/server/chunks/_server.ts-DKVTM9Pj.js.map +0 -1
- package/build/server/chunks/_server.ts-Dip65hLJ.js +0 -56
- package/build/server/chunks/_server.ts-Dip65hLJ.js.map +0 -1
- package/build/server/chunks/_server.ts-Dm0tCs2i.js +0 -106
- package/build/server/chunks/_server.ts-Dm0tCs2i.js.map +0 -1
- package/build/server/chunks/_server.ts-DsYwK_uW.js +0 -46
- package/build/server/chunks/_server.ts-DsYwK_uW.js.map +0 -1
- package/build/server/chunks/_server.ts-RCEgegYU.js +0 -23
- package/build/server/chunks/_server.ts-RCEgegYU.js.map +0 -1
- package/build/server/chunks/_server.ts-XOLAT4dd.js +0 -146
- package/build/server/chunks/_server.ts-XOLAT4dd.js.map +0 -1
- package/build/server/chunks/_server.ts-afh_zLVi.js +0 -69
- package/build/server/chunks/_server.ts-afh_zLVi.js.map +0 -1
- package/build/server/chunks/browserContainer-BdldtueJ.js +0 -1577
- package/build/server/chunks/browserContainer-BdldtueJ.js.map +0 -1
- package/build/server/chunks/builderModeStore.svelte-BEZMQEqn.js +0 -893
- package/build/server/chunks/builderModeStore.svelte-BEZMQEqn.js.map +0 -1
- package/build/server/chunks/client-C9Cat4DK.js +0 -51
- package/build/server/chunks/client-C9Cat4DK.js.map +0 -1
- package/build/server/chunks/error.svelte-CzVR_A6P.js +0 -15
- package/build/server/chunks/error.svelte-CzVR_A6P.js.map +0 -1
- package/build/server/chunks/featureQueueContext-DuXpyTdC.js +0 -32
- package/build/server/chunks/featureQueueContext-DuXpyTdC.js.map +0 -1
- package/build/server/chunks/featureStore.svelte-DHZf88gu.js +0 -162
- package/build/server/chunks/featureStore.svelte-DHZf88gu.js.map +0 -1
- package/build/server/chunks/featuresStore.svelte-bUyQBg1-.js +0 -212
- package/build/server/chunks/featuresStore.svelte-bUyQBg1-.js.map +0 -1
- package/build/server/chunks/hooks.server-y3jdg_sB.js +0 -153
- package/build/server/chunks/hooks.server-y3jdg_sB.js.map +0 -1
- package/build/server/chunks/index-server-DvBux_Gf.js +0 -4815
- package/build/server/chunks/index-server-DvBux_Gf.js.map +0 -1
- package/build/server/chunks/internal-BFt8yDlf.js +0 -1820
- package/build/server/chunks/internal-BFt8yDlf.js.map +0 -1
- package/build/server/chunks/projectBundleClient-BtvWPh87.js +0 -168
- package/build/server/chunks/projectBundleClient-BtvWPh87.js.map +0 -1
- package/build/server/chunks/projectContextStore.svelte-jRJGJZ42.js +0 -141
- package/build/server/chunks/projectContextStore.svelte-jRJGJZ42.js.map +0 -1
- package/build/server/chunks/projectFeaturesStore.svelte-BwNEtDIL.js +0 -87
- package/build/server/chunks/projectFeaturesStore.svelte-BwNEtDIL.js.map +0 -1
- package/build/server/chunks/projectStore.svelte-BNuLNxk_.js +0 -230
- package/build/server/chunks/projectStore.svelte-BNuLNxk_.js.map +0 -1
- package/build/server/chunks/reconcile-CVG2LSlW.js +0 -393
- package/build/server/chunks/reconcile-CVG2LSlW.js.map +0 -1
- package/build/server/chunks/snapshotRepository-8f-2wTrb.js +0 -1024
- package/build/server/chunks/snapshotRepository-8f-2wTrb.js.map +0 -1
- package/build/server/chunks/state-CZZtjXLE.js +0 -61
- package/build/server/chunks/state-CZZtjXLE.js.map +0 -1
- package/build/server/chunks/sync-Bn6eSUhC.js +0 -955
- package/build/server/chunks/sync-Bn6eSUhC.js.map +0 -1
- package/build/server/chunks/syncAwareRepositories-DvUjq5Q6.js +0 -57
- package/build/server/chunks/syncAwareRepositories-DvUjq5Q6.js.map +0 -1
- package/build/server/chunks/tagPaletteStore.svelte-C71bdzDl.js +0 -181
- package/build/server/chunks/tagPaletteStore.svelte-C71bdzDl.js.map +0 -1
- package/build/server/chunks/tourStore.svelte-CYs4oLjF.js +0 -107
- package/build/server/chunks/tourStore.svelte-CYs4oLjF.js.map +0 -1
- /package/build/client/_app/immutable/assets/{12.nv0I59TU.css → 14.nv0I59TU.css} +0 -0
- /package/build/client/_app/immutable/assets/{12.nv0I59TU.css.br → 14.nv0I59TU.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{12.nv0I59TU.css.gz → 14.nv0I59TU.css.gz} +0 -0
- /package/build/client/_app/immutable/chunks/{BQ9GodWX2.js → BQ9GodWX.js} +0 -0
- /package/build/client/_app/immutable/chunks/{BQ9GodWX2.js.br → BQ9GodWX.js.br} +0 -0
- /package/build/client/_app/immutable/chunks/{BQ9GodWX2.js.gz → BQ9GodWX.js.gz} +0 -0
- /package/build/client/_app/immutable/chunks/{D5speDV82.js → D5speDV8.js} +0 -0
- /package/build/client/_app/immutable/chunks/{D5speDV82.js.br → D5speDV8.js.br} +0 -0
- /package/build/client/_app/immutable/chunks/{D5speDV82.js.gz → D5speDV8.js.gz} +0 -0
package/README.md
CHANGED
|
@@ -1,483 +1,135 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/lyriks-io/unspaghettit/main/static/unspaghettit_logo.png" alt="Unspaghettit" width="
|
|
2
|
+
<img src="https://raw.githubusercontent.com/lyriks-io/unspaghettit/main/static/unspaghettit_logo.png" alt="Unspaghettit" width="180" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<h1 align="center">Unspaghettit</h1>
|
|
6
6
|
|
|
7
|
-
<p align="center">
|
|
8
|
-
<em>Executable specifications for AI-assisted software development.</em>
|
|
9
|
-
</p>
|
|
7
|
+
<p align="center"><em>Your specs shouldn't be markdown. They should pass or fail.</em></p>
|
|
10
8
|
|
|
11
9
|
<p align="center">
|
|
12
|
-
<a href="https://github.com/lyriks-io/unspaghettit/actions/workflows/ci.yml">
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
<a href="https://www.
|
|
16
|
-
<img src="https://img.shields.io/badge/license-AGPL--3.0-blue.svg" alt="License: AGPL-3.0" />
|
|
17
|
-
</a>
|
|
18
|
-
<a href="https://nodejs.org/">
|
|
19
|
-
<img src="https://img.shields.io/badge/node-%E2%89%A520.10-43853d.svg" alt="Node ≥ 20.10" />
|
|
20
|
-
</a>
|
|
10
|
+
<a href="https://github.com/lyriks-io/unspaghettit/actions/workflows/ci.yml"><img src="https://github.com/lyriks-io/unspaghettit/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
11
|
+
<a href="https://www.gnu.org/licenses/agpl-3.0.html"><img src="https://img.shields.io/badge/license-AGPL--3.0-blue.svg" alt="License: AGPL-3.0" /></a>
|
|
12
|
+
<a href="https://nodejs.org/"><img src="https://img.shields.io/badge/node-%E2%89%A520.10-43853d.svg" alt="Node >= 20.10" /></a>
|
|
13
|
+
<a href="https://www.npmjs.com/package/unspaghettit"><img src="https://img.shields.io/npm/v/unspaghettit.svg" alt="npm" /></a>
|
|
21
14
|
</p>
|
|
22
15
|
|
|
23
|
-
<p align="center">
|
|
24
|
-
Local-first · MCP-native · AGPL-3.0
|
|
25
|
-
</p>
|
|
16
|
+
<p align="center"><strong>Local-first</strong> · <strong>MCP-native</strong> · <strong>AGPL-3.0</strong></p>
|
|
26
17
|
|
|
27
18
|
<p align="center">
|
|
28
|
-
<
|
|
19
|
+
<img src="https://raw.githubusercontent.com/lyriks-io/unspaghettit/main/static/unspaghettit-demo.gif" alt="Unspaghettit demo: prompt in your AI agent, the runtime builds, the simulator's red line" width="820" />
|
|
29
20
|
</p>
|
|
30
21
|
|
|
31
22
|
---
|
|
32
23
|
|
|
33
|
-
|
|
24
|
+
When you build with AI, the model never sees your system. It sees a fragment of context and guesses the rest from patterns. It doesn't understand. It infers.
|
|
34
25
|
|
|
35
|
-
|
|
26
|
+
Unspaghettit replaces the guessing with a runtime: a structured, executable model of what your product is supposed to do. Humans and AI agents read and edit it through MCP, and every scenario you write runs through a deterministic simulator and reports pass or fail, **before a line of code exists**.
|
|
36
27
|
|
|
37
|
-
|
|
28
|
+
Prompts become disposable. The specification stays.
|
|
38
29
|
|
|
39
|
-
## What it
|
|
30
|
+
## What it is and isn't
|
|
40
31
|
|
|
41
|
-
Unspaghettit
|
|
32
|
+
Unspaghettit is a local, executable specification layer: durable project memory the LLM can validate, simulate, score, and map back to source code. Concretely:
|
|
42
33
|
|
|
43
|
-
|
|
34
|
+
| It **is** | It **is not** |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| An executable specification runtime | A code generator |
|
|
37
|
+
| A typed MCP interface for humans and AI agents | A no-code / low-code platform |
|
|
38
|
+
| A deterministic simulator that passes or fails scenarios | An autonomous agent framework |
|
|
39
|
+
| Durable memory shared between you and the LLM | A hosted service that owns your source of truth |
|
|
40
|
+
| A two-way map between spec and code | A replacement for your stack (your team still writes the code) |
|
|
44
41
|
|
|
45
|
-
|
|
42
|
+
It runs *alongside* your AI coding tools: it defines and validates the contract they build against.
|
|
46
43
|
|
|
47
|
-
The
|
|
44
|
+
## The problem it kills
|
|
48
45
|
|
|
49
|
-
|
|
46
|
+
AI coding workflows go sideways fast. Specs drift. Prompts pile up. Generated systems lose coherence as they grow. Most tools answer this with markdown specs: documents the AI reads to generate code.
|
|
50
47
|
|
|
51
|
-
|
|
52
|
-
- **Small teams** where multiple humans and agents touch the same codebase and need a shared, versioned model of "what the product does".
|
|
53
|
-
- **Technical founders / product-minded engineers** who want a machine-readable spec they can hand to an LLM and get an honest report back.
|
|
54
|
-
- **Anyone with an existing codebase** that's drifted from its docs and wants the LLM to rebuild the spec from the code itself.
|
|
48
|
+
A document can't tell you it contradicts itself. Markdown drifts in silence. You find out when the code breaks.
|
|
55
49
|
|
|
56
|
-
|
|
50
|
+
Unspaghettit takes the other path. Your spec isn't a document. It runs.
|
|
57
51
|
|
|
58
|
-
|
|
59
|
-
- **Existing code becomes legible**: ask an LLM to reverse-map a codebase into features, actions, scenarios, and implementation coverage.
|
|
60
|
-
- **AI agents get structured context**: the LLM reads focused entities and actions instead of a giant prompt blob.
|
|
61
|
-
- **Specs become testable**: every scenario can run through the simulator before implementation exists.
|
|
62
|
-
- **Implementation stays auditable**: `.unspa.json` records where each spec entity is implemented and reports gaps.
|
|
63
|
-
- **Teams keep local ownership**: snapshots are plain JSON in your repo or local hub, with no hosted service required.
|
|
52
|
+
## See it work
|
|
64
53
|
|
|
65
|
-
|
|
54
|
+
You, in your AI agent:
|
|
66
55
|
|
|
67
|
-
From nothing to a running Unspaghettit workspace:
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
npm install -g unspaghettit
|
|
71
|
-
cd path/to/your-app
|
|
72
|
-
unspa init
|
|
73
|
-
unspa dashboard
|
|
74
56
|
```
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
Restart your IDE or AI client. When it comes back up, accept the MCP server and the guidance if your client asks. Then ask your LLM something like:
|
|
79
|
-
|
|
80
|
-
```text
|
|
81
|
-
Using the Unspaghettit MCP, create a new project.
|
|
82
|
-
Model the first feature and make it implementation-ready.
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
The dashboard opens at `http://localhost:3000`, so you can watch the spec take shape while the LLM works.
|
|
86
|
-
|
|
87
|
-
New to this? Hit `/tutorial` in the dashboard for a guided walkthrough (Project → Feature → Surface → Action → Parameter → Rule → Simulator, step by step).
|
|
88
|
-
|
|
89
|
-
For the full list of supported AI clients, the `unspa init` flags, and the shared-hub layout for multi-repo setups, jump to [Installation](#installation-clients-flags-advanced-setup).
|
|
90
|
-
|
|
91
|
-
## Scenarios as executable spec tests
|
|
92
|
-
|
|
93
|
-
The strongest idea in here, surfaced up front:
|
|
94
|
-
|
|
95
|
-
> Every scenario you author is an **executable assertion** about behavior. `run_all_scenarios` runs them through the deterministic simulator and reports pass/fail per assertion — a unit test suite for the spec itself, before the implementation exists.
|
|
96
|
-
|
|
97
|
-
Two complementary uses of the same scenarios:
|
|
98
|
-
|
|
99
|
-
- **Spec self-test (always on).** `run_all_scenarios` checks that the spec is internally consistent: every scenario's expected outcome matches what the simulator computes from the rules. Catches contradictions in product logic before a line of code is written.
|
|
100
|
-
- **Code-vs-spec test (preview).** `unspa scenarios export <featureId>` generates a Vitest file from those same scenarios, using the simulator's predictions as the oracle. You write one thin adapter (`UnspaAdapter` from `unspaghettit/cli/scenarios`) that calls your real implementation; the generated tests drive every scenario through it and assert state path-by-path. `unspa scenarios adapter <featureId>` **scaffolds that adapter for you** — a `case` per scenario-bearing action, pre-seeded with the implementation location from `.unspa.json` — so closing the loop is filling in TODOs, not writing the bridge from scratch. Experimental — adapter contract may shift between minor versions.
|
|
101
|
-
- **Verified coverage (preview).** Run that spec (`vitest run --reporter=json`) and `unspa coverage ingest <report>` stamps each action whose scenarios all passed as **verified** in `.unspa.json` — promoting it from *"claimed implemented"* to *"proven against the spec"* (and clearing the stamp on a regression). `unspa check --min-verified <pct>` then gates the build on the share of a feature that's proven. The full loop: `scenarios adapter` → fill → `scenarios export` → `vitest --reporter=json` → `coverage ingest` → `check --min-verified`.
|
|
102
|
-
|
|
103
|
-
Scenarios can be **multi-step**: a scenario's `steps[]` replays preceding actions (each through the simulator, threading state forward) before the action under test, so `run_all_scenarios` verifies whole flows — add to cart → apply coupon → checkout — not just single transitions.
|
|
104
|
-
|
|
105
|
-
Specs stop being documentation. They become a runtime contract you can break loudly.
|
|
106
|
-
|
|
107
|
-
## Core capabilities
|
|
108
|
-
|
|
109
|
-
- **Structured behavior specification**, features, surfaces, actions, states, rules, invariants, transitions, scenarios, personas, resources, entities, events.
|
|
110
|
-
- **Code → spec mapping**, an LLM can read an existing repo, model its behavior into an Unspaghettit runtime, and wire the spec back to source files through the behavioral index.
|
|
111
|
-
- **MCP-native**, every entity is created, read, edited, and validated through MCP tool calls. Works with any MCP-compatible IDE (Claude Code, Claude Desktop, Cursor, Gemini, Windsurf, Kiro, Codex).
|
|
112
|
-
- **Deterministic simulator & bounded model checking**, `dry_run_simulate` runs an action against a state snapshot. `run_all_scenarios` runs every scenario as a deterministic spec test, with pass/fail per assertion. `model_check` exhaustively explores the reachable state space (bounded) to find what example flows can't: invariant counterexamples with the **shortest action path** that reaches them, dead actions, deadlocks, and unreachable/terminal surfaces.
|
|
113
|
-
- **Safety + liveness properties**, invariants assert "nothing bad ever happens" — per-surface, feature-wide, or **cross-feature at the project level** (`projectInvariants`, e.g. "the orders feature's open count equals the billing feature's unpaid count", which a feature invariant can't reference). **Reachability goals** are the liveness complement: "something good stays reachable" — `reachable` (a target state is achievable) and `always_reachable` (it stays reachable from everywhere, with a counterexample path to any trap). All checked over the reachable state space.
|
|
114
|
-
- **One-command verification gate**, `unspa check` runs the whole spine headlessly and **exits non-zero on failure** — scenarios + maturity + reachability + model checking + spec→code drift + cross-feature event coherence + verified coverage — so the spec becomes a CI gate, not a document (`--json` for dashboards). `unspa ci` scaffolds a GitHub Actions workflow that runs it on every push/PR. `verify` and `get_drift` are the in-chat MCP forms; the dashboard's **Verify** tab renders the verdict with navigable counterexample traces that deep-link to the violating action.
|
|
115
|
-
- **Maturity scoring**, `score_feature` returns a per-area score with critical/recommended issues; surfaces the worst surfaces and biggest gaps.
|
|
116
|
-
- **Generated TypeScript contracts**, `generate_types` writes types for state shapes, event names, and action parameters. Your implementation imports them, so TypeScript catches drift when the spec changes.
|
|
117
|
-
- **Implementation audit**, record each implementation in a `.unspa.json` behavioral index (`{ file, line, signature }` per entity); the MCP reconciles it against the spec and reports coverage + gaps.
|
|
118
|
-
- **Implementation queue**, per-project "implement next" list (Feature / Surface / Action items). Drag-and-drop reorder in the dashboard, `mcp__unspa__get_next_queued` so a dev says "implement the next thing" without naming it. Auto-prunes items the behavioral index marks done.
|
|
119
|
-
- **Local-first**, everything lives in your repo. No telemetry, no hosted servers, no cloud dependency. Snapshots are plain JSON.
|
|
120
|
-
- **Multi-agent ready**, built-in Yjs WebSocket server lets multiple humans and/or LLMs edit the same runtime in real time. History entries carry `AI · for John` attribution so MCP-driven changes are distinguishable from direct human edits.
|
|
121
|
-
- **Encrypted backup / share**, the project page's **Export .unspa** button bundles project + features + status sidecars into a single passphrase-encrypted file. Passphrase never leaves the browser; envelope carries no identifier of contents. See [Security tiers](#security-tiers).
|
|
122
|
-
|
|
123
|
-
## Workflows — recipes by scenario
|
|
124
|
-
|
|
125
|
-
The LLM does the reading and writing through the MCP in every direction; Unspaghettit gives it a structured target, a deterministic simulator, and a verification gate. Pick the recipe that matches where you're starting. Copy-paste prompts for each are in [Working with the MCP in chat](#working-with-the-mcp-in-chat).
|
|
126
|
-
|
|
127
|
-
### Scenario 1 — From scratch: a new product (spec → code)
|
|
128
|
-
|
|
129
|
-
You have an idea and an AI assistant, and you want a spec you can trust *before and while* you build.
|
|
130
|
-
|
|
131
|
-
1. **Set up.** `unspa init` wires the MCP into your AI client; `unspa dashboard` lets you watch the model take shape at `http://localhost:3000`.
|
|
132
|
-
2. **Model it.** Tell the assistant what you're building and to use the Unspaghettit MCP at 100% maturity. It calls `create_project`, then `create_feature` / `apply_batch` to build surfaces, actions, state, rules, effects, events, invariants, and scenarios. Validation errors come back inline, so the model converges instead of drifting.
|
|
133
|
-
3. **Prove the spec is sound — before a line of code.** `run_all_scenarios` runs every scenario as a deterministic test; `model_check` explores the reachable state space for invariant counterexamples, dead actions, and soft-locks; `score_feature` / `get_spec_gaps` flag shallow modelling. Or one call: **`verify`**.
|
|
134
|
-
4. **Generate contracts.** `generate_types` writes TypeScript types for state shapes, event names, and parameters. Your code imports them, so TypeScript catches drift the moment the spec changes.
|
|
135
|
-
5. **Implement.** The assistant writes the code against those types, using the scenario results as the oracle, and records each entity's location in `.unspa.json` (`{file, line, signature}`) — never annotating source.
|
|
136
|
-
6. **Prove the code matches the spec.** `unspa scenarios adapter <id>` + `unspa scenarios export <id>` generate a Vitest suite from the scenarios; run it (`vitest --reporter=json`) and `unspa coverage ingest` marks each passing action **verified** (proven, not just claimed).
|
|
137
|
-
7. **Gate it.** `unspa ci` drops a GitHub Actions workflow running `unspa check --model-check --min-verified 80` on every push.
|
|
138
|
-
|
|
139
|
-
### Scenario 2 — Just one feature
|
|
140
|
-
|
|
141
|
-
You have a project (yours, or one of the samples) and want to add one capability without boiling the ocean.
|
|
142
|
-
|
|
143
|
-
1. Ask for the feature by name, scoped tight and implementation-ready — e.g. *"add a refund-approval flow for the support agent; reuse existing billing concepts; 100% maturity."* A Feature is one LLM-sized slice (1–15 surfaces); keep it that size and split if it grows.
|
|
144
|
-
2. The assistant adds it with `add_feature_to_project` + `apply_batch`, reusing existing events / entities / resources where they fit.
|
|
145
|
-
3. `verify <featureId>` (or the dashboard's **Verify** tab) confirms scenarios pass, invariants hold, and nothing's unreachable. Implement, then `coverage ingest` to prove it.
|
|
146
|
-
|
|
147
|
-
### Scenario 3 — From an existing codebase (code → spec)
|
|
148
|
-
|
|
149
|
-
You have a product whose behavior lives only in the code (and stale docs), and you want it made explicit and machine-checkable.
|
|
150
|
-
|
|
151
|
-
1. Point the assistant at the repo: *"read this repository and model the behavior already implemented; start with the most important user-facing flows."*
|
|
152
|
-
2. It reads the code and builds the model batch by batch — one Feature per coherent flow.
|
|
153
|
-
3. **Map it back.** For each spec entity it writes a `.unspa.json` entry pointing at the implementing `{file, line, signature}`, then `sync_from_index` reconciles the two and reports coverage + gaps.
|
|
154
|
-
4. **Find what's shallow or missing.** `score_feature`, `get_spec_gaps`, and `get_implementation_gaps` show where the model under-describes the code (or the code is unindexed). Iterate until it audits clean.
|
|
155
|
-
5. You now have a legible, machine-checkable map of what your product does, wired to the source — so future drift is visible.
|
|
156
|
-
|
|
157
|
-
### Scenario 4 — Keep spec and code in sync (audit & drift)
|
|
158
|
-
|
|
159
|
-
The model exists and the code exists; you want to know, at any moment, whether they still agree.
|
|
160
|
-
|
|
161
|
-
1. **Did the spec change under the code?** `get_drift` lists every implementation audited against an older spec than the one now on disk — re-audit those.
|
|
162
|
-
2. **Does the code still do what the spec says?** Re-run the scenario suite and `unspa coverage ingest`; a regression clears the `verifiedAt` stamp, so the proven share drops and the gate notices.
|
|
163
|
-
3. **One verdict.** `verify` (or `unspa check` in CI) folds scenarios + maturity + reachability + model checking + drift + cross-feature event coherence + verified coverage into a single pass/warn/fail.
|
|
164
|
-
|
|
165
|
-
### Scenario 5 — Gate it in CI
|
|
166
|
-
|
|
167
|
-
Make the spec a build gate, not a document that quietly rots.
|
|
168
|
-
|
|
169
|
-
```bash
|
|
170
|
-
unspa init --local # so the model travels with the repo in git
|
|
171
|
-
unspa ci # writes .github/workflows/unspaghettit.yml
|
|
172
|
-
# …or hand-roll the gate with the thresholds you care about:
|
|
173
|
-
unspa check --model-check --min-maturity 80 --min-verified 80 --fail-on-drift
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
`unspa check` exits non-zero on failure (`--json` for CI dashboards). The MCP exposes the same as `verify` / `get_drift` for the in-chat flow, so chat and CI verify identically.
|
|
177
|
-
|
|
178
|
-
## Working with the MCP in chat
|
|
179
|
-
|
|
180
|
-
Ready-to-paste prompt patterns for the common tasks: starting a new project, choosing a maturity level, asking questions about an existing spec, editing it, and moving from spec to implementation. Skim the subheadings and jump to the one you need.
|
|
181
|
-
|
|
182
|
-
Once `unspa init` has registered the MCP server and your AI client has restarted, you do not need to speak in Unspaghettit internals. Start with the product you want. Mention the Unspaghettit or Unspa MCP, the scope, and the level of completeness you want. For a first prompt, asking for 100% maturity usually gives a much better result because it pushes the agent to create complete scenarios, rules, and checks instead of a shallow outline.
|
|
183
|
-
|
|
184
|
-
### Start with a prompt
|
|
185
|
-
|
|
186
|
-
For a new product, this is usually enough:
|
|
187
|
-
|
|
188
|
-
```text
|
|
189
|
-
Using the Unspaghettit MCP, create a new project.
|
|
190
|
-
It is a mobile app that lets a user get one coupon each day for a shop near them.
|
|
57
|
+
Using the Unspaghettit MCP, create a project for a daily-coupon app.
|
|
58
|
+
A user gets one coupon per day for a shop near them.
|
|
191
59
|
Make each feature reach 100% maturity.
|
|
192
60
|
```
|
|
193
61
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
```text
|
|
197
|
-
Using the Unspa MCP, create a new project for a B2B invoicing app.
|
|
198
|
-
Start with three features only: customers, invoices, and payment follow-up.
|
|
199
|
-
Make it a solid first draft, not necessarily 100% maturity yet.
|
|
200
|
-
Ask me if a business rule is unclear.
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
For one feature:
|
|
204
|
-
|
|
205
|
-
```text
|
|
206
|
-
Using the Unspaghettit MCP, add a feature for approving refunds.
|
|
207
|
-
Keep it focused on the support agent workflow.
|
|
208
|
-
Make it implementation-ready and bring it to 100% maturity.
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
For an existing codebase:
|
|
212
|
-
|
|
213
|
-
```text
|
|
214
|
-
Using the Unspaghettit MCP, read this repository and create a spec that describes the behavior already implemented.
|
|
215
|
-
Start with the most important user-facing flows.
|
|
216
|
-
Map each spec entity back to the files that implement it, then report what is unclear or missing.
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
### Choose the maturity level
|
|
220
|
-
|
|
221
|
-
100% maturity is the recommended default for a first serious prompt. It helps the agent produce a richer spec on the first pass. Lower the target only when you explicitly want brainstorming, discovery, or a partial draft.
|
|
222
|
-
|
|
223
|
-
```text
|
|
224
|
-
Make this a rough product draft. Do not force 100% maturity yet.
|
|
225
|
-
I want enough structure to discuss the flow and discover missing business rules.
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
```text
|
|
229
|
-
Make this implementation-ready. Aim for 100% maturity.
|
|
230
|
-
If anything prevents 100%, explain the missing product decision instead of inventing it.
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
```text
|
|
234
|
-
Do not chase the score blindly. Prefer a clear product spec.
|
|
235
|
-
If a maturity check feels artificial for this feature, tell me why.
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
### Ask questions about the spec
|
|
239
|
-
|
|
240
|
-
The MCP is also useful as a query layer. Ask the agent to inspect the current model instead of relying on memory or screenshots.
|
|
62
|
+
Unspaghettit builds a structured runtime instead of a wall of prose:
|
|
241
63
|
|
|
242
|
-
```text
|
|
243
|
-
Using the Unspaghettit MCP, explain the Cart & checkout feature.
|
|
244
|
-
Explain what the user can do, what can block them, and what happens after each important action.
|
|
245
64
|
```
|
|
246
|
-
|
|
247
|
-
```text
|
|
248
|
-
What can block Place order?
|
|
249
|
-
Explain each blocker in product language and tell me which cases are already covered by scenarios.
|
|
65
|
+
features · surfaces · actions · state · rules · invariants · scenarios
|
|
250
66
|
```
|
|
251
67
|
|
|
252
|
-
|
|
253
|
-
Where is email verification used in this project?
|
|
254
|
-
Tell me what depends on it and what would change if we removed that requirement.
|
|
255
|
-
```
|
|
68
|
+
Then runs every scenario through the simulator:
|
|
256
69
|
|
|
257
|
-
```text
|
|
258
|
-
Using the Unspaghettit MCP, make a report of the current implementation of the specs in this codebase.
|
|
259
|
-
Tell me what is implemented, what is missing, and what looks stale.
|
|
260
70
|
```
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
You can ask for changes in normal product language. Add constraints when they matter.
|
|
265
|
-
|
|
266
|
-
```text
|
|
267
|
-
Using the Unspaghettit MCP, add a "Cancel subscription" flow.
|
|
268
|
-
Reuse the existing billing concepts when possible.
|
|
269
|
-
After the edit, tell me whether the maturity score changed and why.
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
```text
|
|
273
|
-
Before changing the spec, propose the change in plain English.
|
|
274
|
-
Once I approve, update the Unspaghettit project and run the relevant scenarios.
|
|
71
|
+
✓ user receives one coupon per day
|
|
72
|
+
✓ coupon expires at midnight
|
|
73
|
+
✗ second claim same day → blocked by invariant: DailyLimit
|
|
275
74
|
```
|
|
276
75
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
If you want code, say so in the same prompt. Include design, stack, and implementation constraints if they matter.
|
|
280
|
-
|
|
281
|
-
```text
|
|
282
|
-
Using the Unspaghettit MCP, implement the next queued feature.
|
|
283
|
-
Use the existing SvelteKit style and keep the UI quiet and mobile-friendly.
|
|
284
|
-
After implementation, update the implementation report for the spec.
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
```text
|
|
288
|
-
Using the Unspa MCP, implement the coupon discovery feature.
|
|
289
|
-
Use the current app stack. If the spec is missing something needed for implementation,
|
|
290
|
-
update the spec first, then write the code.
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
Good first prompt pattern: mention the Unspaghettit MCP, describe the product, set the maturity level, and say whether you want spec only or spec plus implementation.
|
|
294
|
-
|
|
295
|
-
## What makes it different
|
|
296
|
-
|
|
297
|
-
Unspaghettit is a local, executable specification layer for AI-assisted development. It gives the LLM durable project memory that can be validated, simulated, scored, and mapped back to source code.
|
|
76
|
+
No code has been written yet. The spec already fails loudly exactly where it should. That red line is a contradiction caught at design time instead of in production.
|
|
298
77
|
|
|
299
|
-
|
|
78
|
+
And it keeps failing loudly after the code exists: every spec entity maps to its implementation, drift is detected when either side changes alone, and `unspa check` runs it all as a CI gate. The spec doesn't just describe the build. It can fail it.
|
|
300
79
|
|
|
301
|
-
|
|
302
|
-
- autonomous agent frameworks, which decide how work gets done but usually do not model product behavior as a contract,
|
|
303
|
-
- hosted AI wrappers, which add a service boundary instead of keeping the source of truth in your repo,
|
|
304
|
-
- no-code platforms, which own the implementation path,
|
|
305
|
-
- code generators, because Unspaghettit generates contracts and audit data while your LLM or team writes the actual code.
|
|
80
|
+
## Start from anything
|
|
306
81
|
|
|
307
|
-
|
|
82
|
+
Point your AI agent at whatever you already have: a design screenshot, a product brief, a Jira backlog, an existing codebase. It reads that and builds the executable model through MCP. From there Unspaghettit runs both directions. Drive **spec → code**: design the behavior, watch it pass or fail, then implement against a spec that already holds together. Or go **code → spec**: turn existing behavior into a runtime map that's explicit and auditable.
|
|
308
83
|
|
|
309
|
-
|
|
310
|
-
- **Simulation before implementation.** Prove the spec is internally consistent before writing the code that implements it.
|
|
311
|
-
- **Explicit structure over prompt heuristics.** Humans and LLMs collaborate on the model, not on free-form prose.
|
|
312
|
-
- **Deterministic logic in the spec; judgment in the humans.** The runtime owns the gates and consequences. Humans (and LLMs as humans' agents) own taste, scope, and the parts that don't compress.
|
|
84
|
+
## What you get
|
|
313
85
|
|
|
314
|
-
|
|
86
|
+
- **Scenarios as spec tests**: the deterministic simulator runs every scenario, whole multi-step flows included, and reports pass or fail per assertion.
|
|
87
|
+
- **Bounded model checking**: explores the reachable state space for the paths you *didn't* write scenarios for: invariant counterexamples with the action path that reaches them, dead actions, deadlocks, and liveness goals ("done stays reachable").
|
|
88
|
+
- **Maturity scoring**: per-area scores with critical issues, so shallow modeling gets caught before it ships.
|
|
89
|
+
- **Spec ↔ code audit**: every entity records where it lives in code; coverage, gaps, and drift are reported, and generated scenario tests can *prove* the implementation matches, not just claim it.
|
|
90
|
+
- **A CI gate**: `unspa check` runs the whole verification spine and exits non-zero on failure; `unspa ci` scaffolds the GitHub Actions workflow.
|
|
91
|
+
- **Generated TypeScript contracts**: state, event, and parameter types your implementation imports, so the compiler catches divergence first.
|
|
92
|
+
- **Diagrams & provenance**: project the model as a statechart, sequence, ER, flowchart, or mindmap (export Mermaid, DOT, SVG/PNG), and trace every element back to the exact source span it was extracted from.
|
|
93
|
+
- **A live dashboard**: editor, simulator, behavior graph, verify view with navigable counterexample traces, implementation coverage, global search (⌘K).
|
|
94
|
+
- **Multi-agent ready**: real-time sync for several humans and AI agents editing at once, with per-agent attribution.
|
|
95
|
+
- **Local-first**: plain JSON on your disk. No accounts, no telemetry, no hosted service.
|
|
315
96
|
|
|
316
|
-
|
|
317
|
-
>
|
|
318
|
-
> Developing on the CLI itself? Clone the repo, then `npm install && npm run build && npm link`. See [cli/README.md](cli/README.md) for the dev setup.
|
|
319
|
-
|
|
320
|
-
### Supported AI clients
|
|
321
|
-
|
|
322
|
-
`unspa init` registers the MCP server with the AI clients you pick. Supported out of the box:
|
|
323
|
-
|
|
324
|
-
| Client | Project config | Global config |
|
|
325
|
-
| ------------------------ | ------------------------------- | -------------------------------------- |
|
|
326
|
-
| Claude Code (CLI + VSC) | `.mcp.json` | `~/.claude.json` |
|
|
327
|
-
| Claude Desktop | n/a (no project scope) | `%APPDATA%\Claude\claude_desktop_config.json` (Windows) / `~/Library/Application Support/Claude/...` (macOS) |
|
|
328
|
-
| Cursor | `.cursor/mcp.json` | `~/.cursor/mcp.json` |
|
|
329
|
-
| Gemini Code Assist / CLI | `.gemini/settings.json` | `~/.gemini/settings.json` |
|
|
330
|
-
| Windsurf | n/a | `~/.codeium/windsurf/mcp_config.json` |
|
|
331
|
-
| Kiro | `.kiro/settings/mcp.json` | `~/.kiro/settings/mcp.json` |
|
|
332
|
-
| Codex (VS Code) | prints snippet to paste manually | (manual paste) |
|
|
333
|
-
|
|
334
|
-
For Codex (and any other client without an automated config write), `unspa init` prints the MCP JSON snippet to copy into the client's settings.
|
|
335
|
-
|
|
336
|
-
Re-running `unspa init` is safe, every step is idempotent. Existing entries are preserved; managed blocks refresh in place.
|
|
337
|
-
|
|
338
|
-
You normally don't run the MCP server manually — your AI client spawns `unspa-mcp` on demand. `unspa serve` exists as a debugging hatch if you ever need to test the stdio interface yourself.
|
|
339
|
-
|
|
340
|
-
### Where the model lives (shared hub by default)
|
|
341
|
-
|
|
342
|
-
`unspa init` needs no decision about storage: the behavior model lives in a **shared hub** at `~/.unspa-hub/unspa`, and both the MCP server and `unspa dashboard` discover it automatically on the first run — no `UNSPA_SNAPSHOTS`, no special launch directory. One source of truth across every repo and every client (including **Claude Desktop**, which has no project scope), and one `unspa dashboard` run from anywhere serves it.
|
|
343
|
-
|
|
344
|
-
Want the model versioned **inside a specific repo** instead — travelling in git and PRs? Opt into a per-repo install:
|
|
97
|
+
## Quickstart
|
|
345
98
|
|
|
346
99
|
```bash
|
|
347
|
-
|
|
348
|
-
unspa init --custom # interactive: hub vs per-repo vs custom path
|
|
349
|
-
unspa init --hub /custom/path # a non-default hub location (pins UNSPA_SNAPSHOTS)
|
|
100
|
+
npm install -g unspaghettit
|
|
350
101
|
```
|
|
351
102
|
|
|
352
|
-
Discovery order, used by both the MCP and the dashboard: explicit `UNSPA_SNAPSHOTS` / `--snapshots` → a per-repo `unspa/` found by walking up from the launch directory → the shared hub. So a per-repo `unspa/` always wins when present, and everything else falls back to the hub.
|
|
353
|
-
|
|
354
|
-
Switching later is just a re-run: `unspa init` for the hub, `unspa init --local` for per-repo, or `unspa dashboard --snapshots <path>` for a one-off look at any folder. All loopback / single-machine; the hub is not a network service.
|
|
355
|
-
|
|
356
|
-
For the CLI details (commands, flags, troubleshooting), see [cli/README.md](cli/README.md).
|
|
357
|
-
|
|
358
|
-
## Example
|
|
359
|
-
|
|
360
|
-
Boot `unspa dashboard` and click **Load samples** to install the bundled **eShop** project. It includes 4 features — Account & auth, Catalog & reviews, Cart & checkout, and Order fulfillment — each small enough for an agent to reason about end to end.
|
|
361
|
-
|
|
362
|
-
The sample is intentionally complete: scenarios, rules, invariants, events, personas, entities, resources, and implementation mapping are all represented. Every feature scores 100% maturity, so it works as a clean reference model. To see maturity gaps, create a tiny scratch feature with an empty surface or an action without effects/scenarios; the dashboard will show the missing pieces.
|
|
363
|
-
|
|
364
|
-
If you'd rather follow a guided tour than poke at the sample, the dashboard's `/tutorial` page also has a 14-section written walkthrough and a **Run interactive tutorial** button that drives a spotlight tour through Project → Feature → Surface → Action → Parameter → Rule → Simulator, prefilling fields along the way.
|
|
365
|
-
|
|
366
|
-
## Views
|
|
367
|
-
|
|
368
|
-
The dashboard ships two views over the same model:
|
|
369
|
-
|
|
370
|
-
- **Expert** (default) — the full control surface: projects, features, surfaces, actions, the simulator, maturity, and implementation coverage.
|
|
371
|
-
- **Builder** (opt-in) — a simpler, guided view: browse projects → core features → features with Maturity / Built dials, accept AI-proposed improvements, and fill a per-project build queue where each item carries its own maturity / implementation goal.
|
|
372
|
-
|
|
373
|
-
Expert is always on. Builder is opt-in — enable it whenever you want:
|
|
374
|
-
|
|
375
103
|
```bash
|
|
376
|
-
|
|
377
|
-
unspa
|
|
378
|
-
unspa dashboard
|
|
379
|
-
unspa view remove builder # turn it back off
|
|
380
|
-
unspa view list # show which views are enabled
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
With one view enabled the header shows no switcher; enabling Builder adds an **Expert | Builder** toggle. Enabled views are persisted next to the model (`<snapshots>/views.json`).
|
|
384
|
-
|
|
385
|
-
## Collaboration
|
|
386
|
-
|
|
387
|
-
Multiple humans + AI agents can edit the same runtime live:
|
|
388
|
-
|
|
389
|
-
- **Real-time sync**, every dashboard tab subscribes to a per-room Yjs WebSocket. Out-of-band changes (MCP writes, other tabs) flow in without a reload, with an activity toast for each change carrying a breadcrumb path (`Project › Feature › Surface › Action`) and a "View" button.
|
|
390
|
-
- **Identity**, click the round avatar in the header to set your display name. Every history entry you create is tagged with it. Stored in browser localStorage, never sent off-machine. First visit prompts once; the avatar dropdown is the explicit way to change or reset later.
|
|
391
|
-
- **Attribution**, MCP-driven changes carry an `AI · for John` label, so the history shows both the agent and the human it is working with.
|
|
392
|
-
- **Project history**, read-only timeline tab on the project page lists every change (rename, feature add/remove, queue mutation, …) with author + timestamp. The shared per-project room feeds it, so MCP edits and human edits land in the same audit log.
|
|
393
|
-
- **Implementation queue**, drag-and-drop "implement next" list per project. The LLM uses `mcp__unspa__get_next_queued` so you can say "implement the next thing" without naming it. Items auto-prune as `.unspa.json` flips them to `implemented`.
|
|
394
|
-
- **Backup / share**, the project page's **Export .unspa** button produces an encrypted bundle (project + features + status). The matching **Import .unspa** on the projects index restores it. Passphrase is required on both ends; the file itself reveals nothing about its contents.
|
|
395
|
-
|
|
396
|
-
## Security tiers
|
|
397
|
-
|
|
398
|
-
Unspaghettit is local-first by default. Three tiers, all opt-in beyond the default:
|
|
399
|
-
|
|
400
|
-
| Tier | Setup | What it covers |
|
|
401
|
-
|---|---|---|
|
|
402
|
-
| **Default** | `unspa dashboard` | Loopback bind (`127.0.0.1:3000`). No auth, no telemetry, no callhome. Single-machine trust boundary. |
|
|
403
|
-
| **LAN-share** | `UNSPA_AUTH_TOKEN=<secret>`, optionally `UNSPA_ALLOWED_ORIGIN=http://host:3000`, then `unspa dashboard --host 0.0.0.0` | Every REST + WebSocket request requires the token. Origin allowlist closes browser-side CSRF. Set the **same** `UNSPA_AUTH_TOKEN` on the MCP server's env so its notify calls authenticate. The dashboard prints the auth posture in its startup banner. |
|
|
404
|
-
| **Backup / share** (orthogonal to live sharing) | Click **Export .unspa** on a project, enter a passphrase ≥ 8 chars | AES-GCM-256 + PBKDF2-SHA256 (600k iterations). Passphrase never leaves the browser. Envelope carries no project name or metadata. |
|
|
405
|
-
|
|
406
|
-
Full threat model + mitigations in [SECURITY.md](SECURITY.md).
|
|
407
|
-
|
|
408
|
-
## Architecture
|
|
409
|
-
|
|
410
|
-
How the pieces fit at runtime:
|
|
411
|
-
|
|
412
|
-
```
|
|
413
|
-
┌──────────────────────────┐
|
|
414
|
-
AI client │ MCP server (stdio) │
|
|
415
|
-
(Claude / Cursor / ───→│ - typed tool surface │←─── your code
|
|
416
|
-
Gemini / ...) │ - validation + simulator│ (via .unspa.json
|
|
417
|
-
└────────────┬─────────────┘ behavioral
|
|
418
|
-
│ index)
|
|
419
|
-
▼
|
|
420
|
-
┌──────────────────────────┐
|
|
421
|
-
│ unspa/ (or hub) │
|
|
422
|
-
│ feature JSON snapshots │←──→ Yjs WebSocket
|
|
423
|
-
│ = your runtime │ (live multi-agent)
|
|
424
|
-
└────────────┬─────────────┘
|
|
425
|
-
│
|
|
426
|
-
▼
|
|
427
|
-
┌──────────────────────────┐
|
|
428
|
-
│ SvelteKit dashboard │
|
|
429
|
-
│ (you, browsing the spec)│
|
|
430
|
-
└──────────────────────────┘
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
The spec is just JSON on disk. The MCP server, the dashboard, your AI client, and your application code all read and write through it. Nothing is hosted; everything is in your repo (or in a local hub you control).
|
|
434
|
-
|
|
435
|
-
Where the code lives:
|
|
436
|
-
|
|
437
|
-
```
|
|
438
|
-
unspaghettit/
|
|
439
|
-
├── unspa/ ← feature JSON snapshots (your runtime; empty on a fresh clone)
|
|
440
|
-
├── samples/ ← bundled sample projects (one folder per project, e.g. eshop/)
|
|
441
|
-
├── mcp-server/ ← MCP server (stdio)
|
|
442
|
-
├── src/ ← SvelteKit dashboard + domain
|
|
443
|
-
│ ├── features/behavior-model/ ← Feature/Surface/Action entities + transforms
|
|
444
|
-
│ ├── features/simulator/ ← deterministic simulator + bounded model checker
|
|
445
|
-
│ ├── features/verification/ ← verification spine (drift, liveness, gated verdict)
|
|
446
|
-
│ └── features/mcp-tools/ ← read-side tool implementations
|
|
447
|
-
├── cli/ ← `unspa` command (init / serve / dashboard)
|
|
448
|
-
└── build/ ← SvelteKit production build (npm run build)
|
|
104
|
+
cd path/to/your-app
|
|
105
|
+
unspa init # scaffold + register the MCP with your AI clients
|
|
106
|
+
unspa dashboard # http://localhost:3000
|
|
449
107
|
```
|
|
450
108
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
Built internally at Lyriks because existing AI workflows were becoming increasingly hard to reason about as systems grew. The runtime became useful enough that we released it as standalone OSS — AGPL-licensed and separate from other Lyriks research work.
|
|
109
|
+
Restart your IDE. Your LLM now has the full runtime as typed MCP tools. Open the dashboard and click **Load samples** to explore a complete eShop project, or **Run interactive tutorial** for a guided tour.
|
|
454
110
|
|
|
455
|
-
|
|
111
|
+
Full setup, client config, and shared-hub mode: [docs/getting-started.md](docs/getting-started.md).
|
|
456
112
|
|
|
457
|
-
##
|
|
113
|
+
## Documentation
|
|
458
114
|
|
|
459
|
-
|
|
115
|
+
| | |
|
|
116
|
+
| --- | --- |
|
|
117
|
+
| [Getting started](docs/getting-started.md) | Install, `unspa init`, client setup, hub mode, dashboard |
|
|
118
|
+
| [Core concepts](docs/concepts.md) | The model, scenarios as tests, maturity, model checking, the audit index |
|
|
119
|
+
| [Working with AI](docs/prompting.md) | Prompt patterns for spec, query, edit, and implementation |
|
|
120
|
+
| [Collaboration](docs/collaboration.md) | Multi-agent editing, real-time sync, attribution, history |
|
|
121
|
+
| [Security](docs/security.md) | Trust tiers, LAN sharing, encrypted backup |
|
|
122
|
+
| [Architecture](docs/architecture.md) | Repo layout, how the pieces fit, project status |
|
|
123
|
+
| [Worlds & quests](docs/worldbuilding.md) | Modeling interactive fiction and narrative state (for the brave) |
|
|
460
124
|
|
|
461
|
-
|
|
125
|
+
## Status
|
|
462
126
|
|
|
463
|
-
|
|
127
|
+
Early but functional. Used internally at [Lyriks.io](https://lyriks.io) to model products, generate typed scaffolding, audit implementation against spec, run multi-agent editing sessions, and recursively refine the runtime itself. We released it because existing AI workflows became hard to reason about as systems grew, and this fixed it.
|
|
464
128
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
There are two halves. **Building** the world maps locations to surfaces, world state to shared state, NPC schedules to time-driven rules, and "what the player can do here" to actions with preconditions. **Playing** the world is the dangerous part: a chat reads a saved game file on every turn, maps the player's intent to a modeled action, asks the deterministic simulator to resolve it, applies the diff back to disk, and narrates the result. The save file is canonical — your inventory, time of day, and current location survive the LLM forgetting the conversation.
|
|
468
|
-
|
|
469
|
-
It will probably not become the fastest game ever made, but it may become a strangely coherent one. Unspaghettit holds the deterministic logic: the rules, the gates, the consequences, the world state. The LLM gets all the room it needs to invent everything that should stay human-shaped: emotion, atmosphere, dialogue, visual design, awkward silences, suspicious taverns, bad decisions, and the exact kind of rain that falls before a betrayal.
|
|
470
|
-
|
|
471
|
-
Unspaghettit does not know how to be human. That is not its job. But for deterministic logic, it is a menace.
|
|
472
|
-
|
|
473
|
-
The two skills that make this possible (`unspa-worldbuild` and `unspa-worldplay`) are experimental and opt-in. The `unspa init` flow asks before installing them, or you can pass `--fun` to pre-check the box. (You may also notice the package publishes a longer bin alias — `unspaghettit` instead of `unspa`. Try invoking that name. Just don't tell anyone.)
|
|
129
|
+
## License
|
|
474
130
|
|
|
475
|
-
|
|
131
|
+
AGPL-3.0. Free to use, study, modify, and self-host. Improvements and derivative networked versions stay open under the same license. For SSO, RBAC, audit trails, and encryption at rest, see the enterprise build (`hello@lyriks.io`).
|
|
476
132
|
|
|
477
133
|
---
|
|
478
134
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
AGPL-3.0. You're free to use, study, modify, and self-host. Improvements and derivative networked versions stay open under the same license. See [LICENSE](LICENSE).
|
|
482
|
-
|
|
483
|
-
Enterprise-grade support and private commercial setups are available via `hello@lyriks.io`. Everything in this repo stays open under AGPL.
|
|
135
|
+
<p align="center">If Unspaghettit resonates, a ⭐ helps other people find it. An open-source project by <a href="https://lyriks.io">Lyriks.io</a>.</p>
|