unspaghettit 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -424
- package/build/client/_app/immutable/assets/0.BsujoiMC.css +1 -0
- package/build/client/_app/immutable/assets/0.BsujoiMC.css.br +0 -0
- package/build/client/_app/immutable/assets/0.BsujoiMC.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/2CIJV9nc.js +1 -0
- package/build/client/_app/immutable/chunks/2CIJV9nc.js.br +3 -0
- package/build/client/_app/immutable/chunks/2CIJV9nc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/2hLhZJjD2.js +1 -0
- package/build/client/_app/immutable/chunks/2hLhZJjD2.js.br +0 -0
- package/build/client/_app/immutable/chunks/2hLhZJjD2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/3UVfdb662.js +2 -0
- package/build/client/_app/immutable/chunks/3UVfdb662.js.br +0 -0
- package/build/client/_app/immutable/chunks/3UVfdb662.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B1n0bVhh2.js +1 -0
- package/build/client/_app/immutable/chunks/B1n0bVhh2.js.br +0 -0
- package/build/client/_app/immutable/chunks/B1n0bVhh2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B3p5Prmp.js +1 -0
- package/build/client/_app/immutable/chunks/B3p5Prmp.js.br +0 -0
- package/build/client/_app/immutable/chunks/B3p5Prmp.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B4cX2Gb42.js +5 -0
- package/build/client/_app/immutable/chunks/B4cX2Gb42.js.br +0 -0
- package/build/client/_app/immutable/chunks/B4cX2Gb42.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B6MJfyJI.js +1 -0
- package/build/client/_app/immutable/chunks/B6MJfyJI.js.br +0 -0
- package/build/client/_app/immutable/chunks/B6MJfyJI.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B7Ld9uRE2.js +1 -0
- package/build/client/_app/immutable/chunks/B7Ld9uRE2.js.br +0 -0
- package/build/client/_app/immutable/chunks/B7Ld9uRE2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B8_QNwhN.js +1 -0
- package/build/client/_app/immutable/chunks/B8_QNwhN.js.br +1 -0
- package/build/client/_app/immutable/chunks/B8_QNwhN.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B8gBHxth.js +1 -0
- package/build/client/_app/immutable/chunks/B8gBHxth.js.br +0 -0
- package/build/client/_app/immutable/chunks/B8gBHxth.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BDEjG0-V.js +1 -0
- package/build/client/_app/immutable/chunks/BDEjG0-V.js.br +0 -0
- package/build/client/_app/immutable/chunks/BDEjG0-V.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BDf3hVDY.js +7 -0
- package/build/client/_app/immutable/chunks/BDf3hVDY.js.br +0 -0
- package/build/client/_app/immutable/chunks/BDf3hVDY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BEZv2jK9.js +1 -0
- package/build/client/_app/immutable/chunks/BEZv2jK9.js.br +2 -0
- package/build/client/_app/immutable/chunks/BEZv2jK9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BJYt9DEi.js +1 -0
- package/build/client/_app/immutable/chunks/BJYt9DEi.js.br +0 -0
- package/build/client/_app/immutable/chunks/BJYt9DEi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BJZ3XYC12.js +1 -0
- package/build/client/_app/immutable/chunks/BJZ3XYC12.js.br +0 -0
- package/build/client/_app/immutable/chunks/BJZ3XYC12.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BK5md5Zs.js +89 -0
- package/build/client/_app/immutable/chunks/BK5md5Zs.js.br +0 -0
- package/build/client/_app/immutable/chunks/BK5md5Zs.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BNO8PXpM.js +1 -0
- package/build/client/_app/immutable/chunks/BNO8PXpM.js.br +0 -0
- package/build/client/_app/immutable/chunks/BNO8PXpM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BNtFSWSC.js +40 -0
- package/build/client/_app/immutable/chunks/BNtFSWSC.js.br +0 -0
- package/build/client/_app/immutable/chunks/BNtFSWSC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BODMD6rJ.js +1 -0
- package/build/client/_app/immutable/chunks/BODMD6rJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/BODMD6rJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BPLFAo0p2.js +1 -0
- package/build/client/_app/immutable/chunks/BPLFAo0p2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BPLFAo0p2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BQXcKXmZ2.js +41 -0
- package/build/client/_app/immutable/chunks/BQXcKXmZ2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BQXcKXmZ2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BSLn6m4D2.js +1 -0
- package/build/client/_app/immutable/chunks/BSLn6m4D2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BSLn6m4D2.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/BWtptBB32.js +1 -0
- package/build/client/_app/immutable/chunks/BWtptBB32.js.br +0 -0
- package/build/client/_app/immutable/chunks/BWtptBB32.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BYVgaVQ1.js +1 -0
- package/build/client/_app/immutable/chunks/BYVgaVQ1.js.br +0 -0
- package/build/client/_app/immutable/chunks/BYVgaVQ1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Basumi2t2.js +1 -0
- package/build/client/_app/immutable/chunks/Basumi2t2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Basumi2t2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BfCxGFh9.js +1 -0
- package/build/client/_app/immutable/chunks/BfCxGFh9.js.br +0 -0
- package/build/client/_app/immutable/chunks/BfCxGFh9.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/BjKsrp6D.js +1 -0
- package/build/client/_app/immutable/chunks/BjKsrp6D.js.br +6 -0
- package/build/client/_app/immutable/chunks/BjKsrp6D.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BnXQbBnK.js +85 -0
- package/build/client/_app/immutable/chunks/BnXQbBnK.js.br +0 -0
- package/build/client/_app/immutable/chunks/BnXQbBnK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BzsuqpLS2.js +8 -0
- package/build/client/_app/immutable/chunks/BzsuqpLS2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BzsuqpLS2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C0A-HG6d.js +1 -0
- package/build/client/_app/immutable/chunks/C0A-HG6d.js.br +0 -0
- package/build/client/_app/immutable/chunks/C0A-HG6d.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C0QpZqq7.js +1 -0
- package/build/client/_app/immutable/chunks/C0QpZqq7.js.br +3 -0
- package/build/client/_app/immutable/chunks/C0QpZqq7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C397Xuny.js +292 -0
- package/build/client/_app/immutable/chunks/C397Xuny.js.br +0 -0
- package/build/client/_app/immutable/chunks/C397Xuny.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/C9DakJMD.js +1 -0
- package/build/client/_app/immutable/chunks/C9DakJMD.js.br +0 -0
- package/build/client/_app/immutable/chunks/C9DakJMD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CBm5AXdl.js +34 -0
- package/build/client/_app/immutable/chunks/CBm5AXdl.js.br +0 -0
- package/build/client/_app/immutable/chunks/CBm5AXdl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CE2JlG_l.js +1 -0
- package/build/client/_app/immutable/chunks/CE2JlG_l.js.br +0 -0
- package/build/client/_app/immutable/chunks/CE2JlG_l.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CE4N3DsM.js +36 -0
- package/build/client/_app/immutable/chunks/CE4N3DsM.js.br +0 -0
- package/build/client/_app/immutable/chunks/CE4N3DsM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CFX_rB4g2.js +3 -0
- package/build/client/_app/immutable/chunks/CFX_rB4g2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CFX_rB4g2.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/CGkvQl0v2.js +30 -0
- package/build/client/_app/immutable/chunks/CGkvQl0v2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CGkvQl0v2.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/CM9ya9R5.js +231 -0
- package/build/client/_app/immutable/chunks/CM9ya9R5.js.br +0 -0
- package/build/client/_app/immutable/chunks/CM9ya9R5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CN4TM9z5.js +6 -0
- package/build/client/_app/immutable/chunks/CN4TM9z5.js.br +4 -0
- package/build/client/_app/immutable/chunks/CN4TM9z5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CQcPxj-M.js +11 -0
- package/build/client/_app/immutable/chunks/CQcPxj-M.js.br +0 -0
- package/build/client/_app/immutable/chunks/CQcPxj-M.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/CTRD2R1y.js +70 -0
- package/build/client/_app/immutable/chunks/CTRD2R1y.js.br +0 -0
- package/build/client/_app/immutable/chunks/CTRD2R1y.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/CU9-_wmX2.js +62 -0
- package/build/client/_app/immutable/chunks/CU9-_wmX2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CU9-_wmX2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CULY9yDS.js +1 -0
- package/build/client/_app/immutable/chunks/CULY9yDS.js.br +0 -0
- package/build/client/_app/immutable/chunks/CULY9yDS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CUpSevj82.js +1 -0
- package/build/client/_app/immutable/chunks/CUpSevj82.js.br +0 -0
- package/build/client/_app/immutable/chunks/CUpSevj82.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CUvgMu97.js +1 -0
- package/build/client/_app/immutable/chunks/CUvgMu97.js.br +0 -0
- package/build/client/_app/immutable/chunks/CUvgMu97.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/CWw-STqh2.js +1 -0
- package/build/client/_app/immutable/chunks/CWw-STqh2.js.br +0 -0
- package/build/client/_app/immutable/chunks/CWw-STqh2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZI9lQ5y.js +1 -0
- package/build/client/_app/immutable/chunks/CZI9lQ5y.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZI9lQ5y.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZNb0x60.js +8 -0
- package/build/client/_app/immutable/chunks/CZNb0x60.js.br +5 -0
- package/build/client/_app/immutable/chunks/CZNb0x60.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZjhCdkx.js +120 -0
- package/build/client/_app/immutable/chunks/CZjhCdkx.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZjhCdkx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C_BfkqQj2.js +1 -0
- package/build/client/_app/immutable/chunks/C_BfkqQj2.js.br +3 -0
- package/build/client/_app/immutable/chunks/C_BfkqQj2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CaXAkaVH.js +2 -0
- package/build/client/_app/immutable/chunks/CaXAkaVH.js.br +0 -0
- package/build/client/_app/immutable/chunks/CaXAkaVH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ce0G0NEU2.js +132 -0
- package/build/client/_app/immutable/chunks/Ce0G0NEU2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ce0G0NEU2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cio7Lne-.js +1 -0
- package/build/client/_app/immutable/chunks/Cio7Lne-.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cio7Lne-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ck7fLxFH2.js +1 -0
- package/build/client/_app/immutable/chunks/Ck7fLxFH2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ck7fLxFH2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CkgG2vj12.js +1 -0
- package/build/client/_app/immutable/chunks/CkgG2vj12.js.br +0 -0
- package/build/client/_app/immutable/chunks/CkgG2vj12.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CkwYPeQK.js +1 -0
- package/build/client/_app/immutable/chunks/CkwYPeQK.js.br +0 -0
- package/build/client/_app/immutable/chunks/CkwYPeQK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CltURiZ0.js +1 -0
- package/build/client/_app/immutable/chunks/CltURiZ0.js.br +0 -0
- package/build/client/_app/immutable/chunks/CltURiZ0.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CpJxgCib.js +1 -0
- package/build/client/_app/immutable/chunks/CpJxgCib.js.br +0 -0
- package/build/client/_app/immutable/chunks/CpJxgCib.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CqAJyebb.js +1 -0
- package/build/client/_app/immutable/chunks/CqAJyebb.js.br +0 -0
- package/build/client/_app/immutable/chunks/CqAJyebb.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CrBRkqIf.js +4 -0
- package/build/client/_app/immutable/chunks/CrBRkqIf.js.br +0 -0
- package/build/client/_app/immutable/chunks/CrBRkqIf.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CrYxhB9g.js +1 -0
- package/build/client/_app/immutable/chunks/CrYxhB9g.js.br +0 -0
- package/build/client/_app/immutable/chunks/CrYxhB9g.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CtpR9Zsd.js +96 -0
- package/build/client/_app/immutable/chunks/CtpR9Zsd.js.br +0 -0
- package/build/client/_app/immutable/chunks/CtpR9Zsd.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CtsLiFqq.js +1 -0
- package/build/client/_app/immutable/chunks/CtsLiFqq.js.br +0 -0
- package/build/client/_app/immutable/chunks/CtsLiFqq.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CuIMKdpZ.js +1 -0
- package/build/client/_app/immutable/chunks/CuIMKdpZ.js.br +1 -0
- package/build/client/_app/immutable/chunks/CuIMKdpZ.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/CuxYynFY.js +1 -0
- package/build/client/_app/immutable/chunks/CuxYynFY.js.br +0 -0
- package/build/client/_app/immutable/chunks/CuxYynFY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CvzmTz19.js +1 -0
- package/build/client/_app/immutable/chunks/CvzmTz19.js.br +0 -0
- package/build/client/_app/immutable/chunks/CvzmTz19.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cwlxg_jI2.js +1 -0
- package/build/client/_app/immutable/chunks/Cwlxg_jI2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cwlxg_jI2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CytoxYDC.js +1 -0
- package/build/client/_app/immutable/chunks/CytoxYDC.js.br +0 -0
- package/build/client/_app/immutable/chunks/CytoxYDC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D-bzr3Rt.js +1 -0
- package/build/client/_app/immutable/chunks/D-bzr3Rt.js.br +0 -0
- package/build/client/_app/immutable/chunks/D-bzr3Rt.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/D9MPVnoE2.js +206 -0
- package/build/client/_app/immutable/chunks/D9MPVnoE2.js.br +0 -0
- package/build/client/_app/immutable/chunks/D9MPVnoE2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DBCpiSCv.js +84 -0
- package/build/client/_app/immutable/chunks/DBCpiSCv.js.br +0 -0
- package/build/client/_app/immutable/chunks/DBCpiSCv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DMSYSDo82.js +10 -0
- package/build/client/_app/immutable/chunks/DMSYSDo82.js.br +0 -0
- package/build/client/_app/immutable/chunks/DMSYSDo82.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/DQWKNctN2.js +7 -0
- package/build/client/_app/immutable/chunks/DQWKNctN2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DQWKNctN2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DQuHIABk2.js +4 -0
- package/build/client/_app/immutable/chunks/DQuHIABk2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DQuHIABk2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DT5F1-d-.js +1 -0
- package/build/client/_app/immutable/chunks/DT5F1-d-.js.br +0 -0
- package/build/client/_app/immutable/chunks/DT5F1-d-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DVrhERYX2.js +1 -0
- package/build/client/_app/immutable/chunks/DVrhERYX2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DVrhERYX2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DWAgljeH.js +1 -0
- package/build/client/_app/immutable/chunks/DWAgljeH.js.br +0 -0
- package/build/client/_app/immutable/chunks/DWAgljeH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DWVg3pyI.js +139 -0
- package/build/client/_app/immutable/chunks/DWVg3pyI.js.br +0 -0
- package/build/client/_app/immutable/chunks/DWVg3pyI.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DWeRzxcG2.js +1 -0
- package/build/client/_app/immutable/chunks/DWeRzxcG2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DWeRzxcG2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DcvkBs962.js +1 -0
- package/build/client/_app/immutable/chunks/DcvkBs962.js.br +0 -0
- package/build/client/_app/immutable/chunks/DcvkBs962.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DdKDVl0G2.js +1 -0
- package/build/client/_app/immutable/chunks/DdKDVl0G2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DdKDVl0G2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dg8gJSFX.js +106 -0
- package/build/client/_app/immutable/chunks/Dg8gJSFX.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dg8gJSFX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Diyr50UO2.js +10 -0
- package/build/client/_app/immutable/chunks/Diyr50UO2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Diyr50UO2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DlHVqE8I2.js +1 -0
- package/build/client/_app/immutable/chunks/DlHVqE8I2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DlHVqE8I2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dm68_Exu2.js +24 -0
- package/build/client/_app/immutable/chunks/Dm68_Exu2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dm68_Exu2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dmt7ISOs.js +162 -0
- package/build/client/_app/immutable/chunks/Dmt7ISOs.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dmt7ISOs.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ds6AU9Ow.js +156 -0
- package/build/client/_app/immutable/chunks/Ds6AU9Ow.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ds6AU9Ow.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/DubrsqOt2.js +24 -0
- package/build/client/_app/immutable/chunks/DubrsqOt2.js.br +0 -0
- package/build/client/_app/immutable/chunks/DubrsqOt2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DwBIslDg.js +1 -0
- package/build/client/_app/immutable/chunks/DwBIslDg.js.br +0 -0
- package/build/client/_app/immutable/chunks/DwBIslDg.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DyQuOJWp.js +2 -0
- package/build/client/_app/immutable/chunks/DyQuOJWp.js.br +0 -0
- package/build/client/_app/immutable/chunks/DyQuOJWp.js.gz +0 -0
- package/build/client/_app/immutable/chunks/GozcEFao.js +2 -0
- package/build/client/_app/immutable/chunks/GozcEFao.js.br +0 -0
- package/build/client/_app/immutable/chunks/GozcEFao.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/LZcM6IZR.js +127 -0
- package/build/client/_app/immutable/chunks/LZcM6IZR.js.br +0 -0
- package/build/client/_app/immutable/chunks/LZcM6IZR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/N3JnnB0k.js +1 -0
- package/build/client/_app/immutable/chunks/N3JnnB0k.js.br +0 -0
- package/build/client/_app/immutable/chunks/N3JnnB0k.js.gz +0 -0
- package/build/client/_app/immutable/chunks/N4f8L7cR2.js +1 -0
- package/build/client/_app/immutable/chunks/N4f8L7cR2.js.br +0 -0
- package/build/client/_app/immutable/chunks/N4f8L7cR2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/SxsLGZon.js +78 -0
- package/build/client/_app/immutable/chunks/SxsLGZon.js.br +0 -0
- package/build/client/_app/immutable/chunks/SxsLGZon.js.gz +0 -0
- package/build/client/_app/immutable/chunks/VMh3BEza.js +1 -0
- package/build/client/_app/immutable/chunks/VMh3BEza.js.br +0 -0
- package/build/client/_app/immutable/chunks/VMh3BEza.js.gz +0 -0
- package/build/client/_app/immutable/chunks/VcOjGHJJ.js +88 -0
- package/build/client/_app/immutable/chunks/VcOjGHJJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/VcOjGHJJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/VesUvqet.js +1 -0
- package/build/client/_app/immutable/chunks/VesUvqet.js.br +0 -0
- package/build/client/_app/immutable/chunks/VesUvqet.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/W3EvcI_R2.js +62 -0
- package/build/client/_app/immutable/chunks/W3EvcI_R2.js.br +0 -0
- package/build/client/_app/immutable/chunks/W3EvcI_R2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ZUdhP7i92.js +2 -0
- package/build/client/_app/immutable/chunks/ZUdhP7i92.js.br +0 -0
- package/build/client/_app/immutable/chunks/ZUdhP7i92.js.gz +0 -0
- package/build/client/_app/immutable/chunks/aLf9ves12.js +1 -0
- package/build/client/_app/immutable/chunks/aLf9ves12.js.br +0 -0
- package/build/client/_app/immutable/chunks/aLf9ves12.js.gz +0 -0
- package/build/client/_app/immutable/chunks/f-j1ldZh.js +1 -0
- package/build/client/_app/immutable/chunks/f-j1ldZh.js.br +0 -0
- package/build/client/_app/immutable/chunks/f-j1ldZh.js.gz +0 -0
- package/build/client/_app/immutable/chunks/gEtmlKTD2.js +2 -0
- package/build/client/_app/immutable/chunks/gEtmlKTD2.js.br +0 -0
- package/build/client/_app/immutable/chunks/gEtmlKTD2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/glszpPm_.js +70 -0
- package/build/client/_app/immutable/chunks/glszpPm_.js.br +0 -0
- package/build/client/_app/immutable/chunks/glszpPm_.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/hPrUzghv.js +1 -0
- package/build/client/_app/immutable/chunks/hPrUzghv.js.br +0 -0
- package/build/client/_app/immutable/chunks/hPrUzghv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/hoxxCinl.js +1 -0
- package/build/client/_app/immutable/chunks/hoxxCinl.js.br +0 -0
- package/build/client/_app/immutable/chunks/hoxxCinl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/i-CYVfXN.js +1 -0
- package/build/client/_app/immutable/chunks/i-CYVfXN.js.br +0 -0
- package/build/client/_app/immutable/chunks/i-CYVfXN.js.gz +0 -0
- package/build/client/_app/immutable/chunks/neNX6gRo.js +1 -0
- package/build/client/_app/immutable/chunks/neNX6gRo.js.br +0 -0
- package/build/client/_app/immutable/chunks/neNX6gRo.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pHXL_F_g2.js +1 -0
- package/build/client/_app/immutable/chunks/pHXL_F_g2.js.br +0 -0
- package/build/client/_app/immutable/chunks/pHXL_F_g2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pW93EPUQ.js +7 -0
- package/build/client/_app/immutable/chunks/pW93EPUQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/pW93EPUQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/qP818rgB2.js +1 -0
- package/build/client/_app/immutable/chunks/qP818rgB2.js.br +0 -0
- package/build/client/_app/immutable/chunks/qP818rgB2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/sotTapaw.js +1 -0
- package/build/client/_app/immutable/chunks/sotTapaw.js.br +0 -0
- package/build/client/_app/immutable/chunks/sotTapaw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/wKcgcnDr2.js +1 -0
- package/build/client/_app/immutable/chunks/wKcgcnDr2.js.br +0 -0
- package/build/client/_app/immutable/chunks/wKcgcnDr2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/xj8Qu0id.js +39 -0
- package/build/client/_app/immutable/chunks/xj8Qu0id.js.br +0 -0
- package/build/client/_app/immutable/chunks/xj8Qu0id.js.gz +0 -0
- package/build/client/_app/immutable/chunks/y_FyOMsm.js +3 -0
- package/build/client/_app/immutable/chunks/y_FyOMsm.js.br +0 -0
- package/build/client/_app/immutable/chunks/y_FyOMsm.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.BER7E6R_.js +2 -0
- package/build/client/_app/immutable/entry/app.BER7E6R_.js.br +0 -0
- package/build/client/_app/immutable/entry/app.BER7E6R_.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.C8tjv31Y.js +1 -0
- package/build/client/_app/immutable/entry/start.C8tjv31Y.js.br +1 -0
- package/build/client/_app/immutable/entry/start.C8tjv31Y.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.CAeMhoMc.js +7 -0
- package/build/client/_app/immutable/nodes/0.CAeMhoMc.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.CAeMhoMc.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.4LtDz-oA.js +1 -0
- package/build/client/_app/immutable/nodes/1.4LtDz-oA.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.4LtDz-oA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.CFgia70s.js +1 -0
- package/build/client/_app/immutable/nodes/10.CFgia70s.js.br +2 -0
- package/build/client/_app/immutable/nodes/10.CFgia70s.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.Ch-vozvS.js +1 -0
- package/build/client/_app/immutable/nodes/11.Ch-vozvS.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.Ch-vozvS.js.gz +0 -0
- package/build/client/_app/immutable/nodes/12.B5VT8cKW.js +2 -0
- package/build/client/_app/immutable/nodes/12.B5VT8cKW.js.br +0 -0
- package/build/client/_app/immutable/nodes/12.B5VT8cKW.js.gz +0 -0
- package/build/client/_app/immutable/nodes/13.CuIA9vng.js +402 -0
- package/build/client/_app/immutable/nodes/13.CuIA9vng.js.br +0 -0
- package/build/client/_app/immutable/nodes/13.CuIA9vng.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.xI5MnJsL.js +1 -0
- package/build/client/_app/immutable/nodes/2.xI5MnJsL.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.xI5MnJsL.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CQ4bIhQ6.js +1 -0
- package/build/client/_app/immutable/nodes/3.CQ4bIhQ6.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CQ4bIhQ6.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.N8cjhzIv.js +3 -0
- package/build/client/_app/immutable/nodes/4.N8cjhzIv.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.N8cjhzIv.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.DfR2h3P4.js +48 -0
- package/build/client/_app/immutable/nodes/5.DfR2h3P4.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.DfR2h3P4.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.v43avk-a.js +1 -0
- package/build/client/_app/immutable/nodes/6.v43avk-a.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.v43avk-a.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.DJGq7-fq.js +5 -0
- package/build/client/_app/immutable/nodes/7.DJGq7-fq.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.DJGq7-fq.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.BYeGayrU.js +3 -0
- package/build/client/_app/immutable/nodes/8.BYeGayrU.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.BYeGayrU.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.d7hEqsWN.js +5 -0
- package/build/client/_app/immutable/nodes/9.d7hEqsWN.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.d7hEqsWN.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-B9lmqNZh.js +15 -0
- package/build/server/chunks/0-B9lmqNZh.js.map +1 -0
- package/build/server/chunks/1-BVxoYoy0.js +9 -0
- package/build/server/chunks/1-BVxoYoy0.js.map +1 -0
- package/build/server/chunks/10-DCxp8jT8.js +9 -0
- package/build/server/chunks/10-DCxp8jT8.js.map +1 -0
- package/build/server/chunks/11-BmTBBPbT.js +9 -0
- package/build/server/chunks/11-BmTBBPbT.js.map +1 -0
- package/build/server/chunks/12-CsbhRlL1.js +9 -0
- package/build/server/chunks/12-CsbhRlL1.js.map +1 -0
- package/build/server/chunks/13-0DWHZ1hi.js +9 -0
- package/build/server/chunks/13-0DWHZ1hi.js.map +1 -0
- package/build/server/chunks/2-e5usQqOM.js +9 -0
- package/build/server/chunks/2-e5usQqOM.js.map +1 -0
- package/build/server/chunks/3-DNXwTyoL.js +16 -0
- package/build/server/chunks/3-DNXwTyoL.js.map +1 -0
- package/build/server/chunks/4-CcbKZlu1.js +16 -0
- package/build/server/chunks/4-CcbKZlu1.js.map +1 -0
- package/build/server/chunks/5-D2sOEK0c.js +9 -0
- package/build/server/chunks/5-D2sOEK0c.js.map +1 -0
- package/build/server/chunks/6-BXhVICA0.js +9 -0
- package/build/server/chunks/6-BXhVICA0.js.map +1 -0
- package/build/server/chunks/7-11gAeU6R.js +9 -0
- package/build/server/chunks/7-11gAeU6R.js.map +1 -0
- package/build/server/chunks/8-_840pfm4.js +9 -0
- package/build/server/chunks/8-_840pfm4.js.map +1 -0
- package/build/server/chunks/9-9--rc8Zm.js +9 -0
- package/build/server/chunks/9-9--rc8Zm.js.map +1 -0
- package/build/server/chunks/FeatureCard-DMFAdOZD.js +73 -0
- package/build/server/chunks/FeatureCard-DMFAdOZD.js.map +1 -0
- package/build/server/chunks/ManageTagsDialog-rb6Nv8Rn.js +87 -0
- package/build/server/chunks/ManageTagsDialog-rb6Nv8Rn.js.map +1 -0
- package/build/server/chunks/ProgressBar-COGq-V1W.js +70 -0
- package/build/server/chunks/ProgressBar-COGq-V1W.js.map +1 -0
- package/build/server/chunks/ProjectionViewer-5lAckYHW.js +1276 -0
- package/build/server/chunks/ProjectionViewer-5lAckYHW.js.map +1 -0
- package/build/server/chunks/ProjectsIndex-BUAIKM29.js +307 -0
- package/build/server/chunks/ProjectsIndex-BUAIKM29.js.map +1 -0
- package/build/server/chunks/TagDotStrip-BeDG7Cqh.js +88 -0
- package/build/server/chunks/TagDotStrip-BeDG7Cqh.js.map +1 -0
- package/build/server/chunks/TagFilterSelect-CkbZdWK3.js +112 -0
- package/build/server/chunks/TagFilterSelect-CkbZdWK3.js.map +1 -0
- package/build/server/chunks/_layout.svelte-CgBWifc7.js +1342 -0
- package/build/server/chunks/_layout.svelte-CgBWifc7.js.map +1 -0
- package/build/server/chunks/_page.svelte-B-mdxSfs.js +37 -0
- package/build/server/chunks/_page.svelte-B-mdxSfs.js.map +1 -0
- package/build/server/chunks/_page.svelte-B6cpjvJE.js +37 -0
- package/build/server/chunks/_page.svelte-B6cpjvJE.js.map +1 -0
- package/build/server/chunks/_page.svelte-BXHSxkOq.js +10707 -0
- package/build/server/chunks/_page.svelte-BXHSxkOq.js.map +1 -0
- package/build/server/chunks/_page.svelte-CCfXJrLQ.js +454 -0
- package/build/server/chunks/_page.svelte-CCfXJrLQ.js.map +1 -0
- package/build/server/chunks/_page.svelte-CpNPTC27.js +99 -0
- package/build/server/chunks/_page.svelte-CpNPTC27.js.map +1 -0
- package/build/server/chunks/_page.svelte-D0MRtAqZ.js +735 -0
- package/build/server/chunks/_page.svelte-D0MRtAqZ.js.map +1 -0
- package/build/server/chunks/_page.svelte-DE_5ZkTk.js +49 -0
- package/build/server/chunks/_page.svelte-DE_5ZkTk.js.map +1 -0
- package/build/server/chunks/_page.svelte-cfUGFHhh.js +202 -0
- package/build/server/chunks/_page.svelte-cfUGFHhh.js.map +1 -0
- package/build/server/chunks/_page.svelte-epVS2H1-.js +368 -0
- package/build/server/chunks/_page.svelte-epVS2H1-.js.map +1 -0
- package/build/server/chunks/_page.svelte-j7WIQsUE.js +74 -0
- package/build/server/chunks/_page.svelte-j7WIQsUE.js.map +1 -0
- package/build/server/chunks/_page.svelte-sFsc403N.js +834 -0
- package/build/server/chunks/_page.svelte-sFsc403N.js.map +1 -0
- package/build/server/chunks/_page.svelte-zBBZNKzG.js +153 -0
- package/build/server/chunks/_page.svelte-zBBZNKzG.js.map +1 -0
- package/build/server/chunks/_server.ts-1lxF2NFW.js +146 -0
- package/build/server/chunks/_server.ts-1lxF2NFW.js.map +1 -0
- package/build/server/chunks/_server.ts-BP4OBqaD.js +21 -0
- package/build/server/chunks/_server.ts-BP4OBqaD.js.map +1 -0
- package/build/server/chunks/_server.ts-BVX4A2PU.js +69 -0
- package/build/server/chunks/_server.ts-BVX4A2PU.js.map +1 -0
- package/build/server/chunks/_server.ts-BaJa3Xt1.js +56 -0
- package/build/server/chunks/_server.ts-BaJa3Xt1.js.map +1 -0
- package/build/server/chunks/_server.ts-C5tp9sxp.js +23 -0
- package/build/server/chunks/_server.ts-C5tp9sxp.js.map +1 -0
- package/build/server/chunks/_server.ts-CeTvD5Mp.js +23 -0
- package/build/server/chunks/_server.ts-CeTvD5Mp.js.map +1 -0
- package/build/server/chunks/_server.ts-Cvu3XFUs.js +23 -0
- package/build/server/chunks/_server.ts-Cvu3XFUs.js.map +1 -0
- package/build/server/chunks/_server.ts-DFKEDp9D.js +46 -0
- package/build/server/chunks/_server.ts-DFKEDp9D.js.map +1 -0
- package/build/server/chunks/_server.ts-DG8DdQoB.js +961 -0
- package/build/server/chunks/_server.ts-DG8DdQoB.js.map +1 -0
- package/build/server/chunks/_server.ts-DN-6Y5lG.js +61 -0
- package/build/server/chunks/_server.ts-DN-6Y5lG.js.map +1 -0
- package/build/server/chunks/_server.ts-DSiY2IgM.js +106 -0
- package/build/server/chunks/_server.ts-DSiY2IgM.js.map +1 -0
- package/build/server/chunks/_server.ts-DapkfYPR.js +77 -0
- package/build/server/chunks/_server.ts-DapkfYPR.js.map +1 -0
- package/build/server/chunks/_server.ts-GHO81alX.js +50 -0
- package/build/server/chunks/_server.ts-GHO81alX.js.map +1 -0
- package/build/server/chunks/_server.ts-KPwcTd2q.js +56 -0
- package/build/server/chunks/_server.ts-KPwcTd2q.js.map +1 -0
- package/build/server/chunks/_server.ts-nBHIdesV.js +50 -0
- package/build/server/chunks/_server.ts-nBHIdesV.js.map +1 -0
- package/build/server/chunks/_server.ts-tonCHVx_.js +21 -0
- package/build/server/chunks/_server.ts-tonCHVx_.js.map +1 -0
- package/build/server/chunks/browserContainer-CnyD6-Fb.js +1577 -0
- package/build/server/chunks/browserContainer-CnyD6-Fb.js.map +1 -0
- package/build/server/chunks/builderModeStore.svelte-5gHGj8fb.js +893 -0
- package/build/server/chunks/builderModeStore.svelte-5gHGj8fb.js.map +1 -0
- package/build/server/chunks/client-BMtVEMju.js +51 -0
- package/build/server/chunks/client-BMtVEMju.js.map +1 -0
- package/build/server/chunks/error.svelte-x31ayNE1.js +15 -0
- package/build/server/chunks/error.svelte-x31ayNE1.js.map +1 -0
- package/build/server/chunks/featureQueueContext-BbgVWKQG.js +32 -0
- package/build/server/chunks/featureQueueContext-BbgVWKQG.js.map +1 -0
- package/build/server/chunks/featureStore.svelte-CNLEsBJy.js +162 -0
- package/build/server/chunks/featureStore.svelte-CNLEsBJy.js.map +1 -0
- package/build/server/chunks/featuresStore.svelte-CIFEpGD9.js +212 -0
- package/build/server/chunks/featuresStore.svelte-CIFEpGD9.js.map +1 -0
- package/build/server/chunks/index-server-Bzpc8zwf.js +4815 -0
- package/build/server/chunks/index-server-Bzpc8zwf.js.map +1 -0
- package/build/server/chunks/internal-CPpC8eDZ.js +1820 -0
- package/build/server/chunks/internal-CPpC8eDZ.js.map +1 -0
- package/build/server/chunks/projectBundleClient-BTd9AFu6.js +168 -0
- package/build/server/chunks/projectBundleClient-BTd9AFu6.js.map +1 -0
- package/build/server/chunks/projectContextStore.svelte-CFTa-2W7.js +141 -0
- package/build/server/chunks/projectContextStore.svelte-CFTa-2W7.js.map +1 -0
- package/build/server/chunks/projectFeaturesStore.svelte-BmMgsX-B.js +87 -0
- package/build/server/chunks/projectFeaturesStore.svelte-BmMgsX-B.js.map +1 -0
- package/build/server/chunks/projectStore.svelte-D47f2Ze4.js +230 -0
- package/build/server/chunks/projectStore.svelte-D47f2Ze4.js.map +1 -0
- package/build/server/chunks/reconcile-DWYiyWQW.js +393 -0
- package/build/server/chunks/reconcile-DWYiyWQW.js.map +1 -0
- package/build/server/chunks/snapshotRepository-DatB6XLT.js +1173 -0
- package/build/server/chunks/snapshotRepository-DatB6XLT.js.map +1 -0
- package/build/server/chunks/state-C8lQ-4Ip.js +61 -0
- package/build/server/chunks/state-C8lQ-4Ip.js.map +1 -0
- package/build/server/chunks/stores-C4apQGTo.js +35 -0
- package/build/server/chunks/stores-C4apQGTo.js.map +1 -0
- package/build/server/chunks/sync-Dorsvxhj.js +955 -0
- package/build/server/chunks/sync-Dorsvxhj.js.map +1 -0
- package/build/server/chunks/syncAwareRepositories-OJq78sW0.js +57 -0
- package/build/server/chunks/syncAwareRepositories-OJq78sW0.js.map +1 -0
- package/build/server/chunks/tagPaletteStore.svelte-CsI7lh_H.js +181 -0
- package/build/server/chunks/tagPaletteStore.svelte-CsI7lh_H.js.map +1 -0
- package/build/server/index.js +2 -2
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +52 -37
- package/build/server/manifest.js.map +1 -1
- 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/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/projects/presentation/components/ProjectFeaturesPanel.svelte +29 -0
- 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/lib/server/snapshotRepository.ts +5 -1
- package/src/routes/+layout.svelte +71 -111
- package/src/routes/api/snapshots/[id]/provenance/+server.ts +13 -0
- package/src/routes/features/[id]/graph/+page.svelte +3 -3
- package/src/routes/features/[id]/provenance/+page.svelte +54 -0
- package/src/routes/projects/[id]/graph/+page.svelte +3 -3
- package/src/shared/infrastructure/persistence/snapshotLayout.ts +12 -0
- 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/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/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/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/client/_app/immutable/assets/{12.nv0I59TU.css → 13.nv0I59TU.css} +0 -0
- /package/build/client/_app/immutable/assets/{12.nv0I59TU.css.br → 13.nv0I59TU.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{12.nv0I59TU.css.gz → 13.nv0I59TU.css.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,114 @@
|
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
AI coding works best when the human and the LLM share a stable model of the product. Without one, specs drift, prompts pile up, generated systems lose coherence, and important assumptions live only in chat history.
|
|
36
|
-
|
|
37
|
-
In one line: **a way to keep AI-assisted software aligned with what you actually meant.**
|
|
38
|
-
|
|
39
|
-
## What it does
|
|
40
|
-
|
|
41
|
-
Unspaghettit gives humans and LLMs a shared, **executable specification** for the systems they build together: a local, machine-checkable software design document that agents can read and update through MCP (the [Model Context Protocol](https://modelcontextprotocol.io) — how AI tools like Claude, Cursor, and Gemini talk to local programs).
|
|
42
|
-
|
|
43
|
-
Instead of keeping product intent in long prompts or markdown that slowly goes stale, you model the behavior as structured pieces: features, surfaces, actions, state, rules, effects, events, invariants, and scenarios. The MCP server exposes that specification to your AI coding tool, so the LLM can inspect, simulate, edit, and audit the model through typed tool calls instead of guessing from prose.
|
|
44
|
-
|
|
45
|
-
You can use it in both directions: start from an idea and drive **spec → code**, or point an LLM at an existing codebase and build a **code → spec** map that makes the current behavior explicit.
|
|
46
|
-
|
|
47
|
-
The specification becomes the source of truth; prompts become disposable again.
|
|
48
|
-
|
|
49
|
-
## Who it's for
|
|
50
|
-
|
|
51
|
-
- **Solo developers** shipping with an AI assistant who want product intent to survive between chat sessions.
|
|
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.
|
|
55
|
-
|
|
56
|
-
## Benefits
|
|
57
|
-
|
|
58
|
-
- **Less drift between intent and code**: scenarios, generated types, and implementation coverage all point back to the same spec.
|
|
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.
|
|
64
|
-
|
|
65
|
-
## Quickstart
|
|
66
|
-
|
|
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
|
-
```
|
|
75
|
-
|
|
76
|
-
`unspa init` wires the MCP server into the AI clients you choose. If your client supports skills or custom instructions, it can install the Unspaghettit guidance there too.
|
|
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`.
|
|
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.
|
|
102
25
|
|
|
103
|
-
|
|
26
|
+
Unspaghettit replaces the guessing with a runtime: a structured, executable model of what your product is supposed to do, that humans and AI agents read and edit through MCP. Every scenario you write runs through a deterministic simulator and reports pass or fail, **before a line of code exists**.
|
|
104
27
|
|
|
105
|
-
|
|
28
|
+
Prompts become disposable. The specification stays.
|
|
106
29
|
|
|
107
|
-
##
|
|
30
|
+
## See it work
|
|
108
31
|
|
|
109
|
-
|
|
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).
|
|
32
|
+
You, in your AI agent (Claude Code, Cursor, Gemini, Windsurf, Codex):
|
|
122
33
|
|
|
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
34
|
```
|
|
175
|
-
|
|
176
|
-
|
|
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.
|
|
35
|
+
Using the Unspaghettit MCP, create a project for a daily-coupon app.
|
|
36
|
+
A user gets one coupon per day for a shop near them.
|
|
191
37
|
Make each feature reach 100% maturity.
|
|
192
38
|
```
|
|
193
39
|
|
|
194
|
-
|
|
40
|
+
Unspaghettit builds a structured runtime instead of a wall of prose:
|
|
195
41
|
|
|
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
42
|
```
|
|
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.
|
|
43
|
+
features · surfaces · actions · state · rules · invariants · scenarios
|
|
209
44
|
```
|
|
210
45
|
|
|
211
|
-
|
|
46
|
+
Then runs every scenario through the simulator:
|
|
212
47
|
|
|
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
48
|
```
|
|
218
|
-
|
|
219
|
-
|
|
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.
|
|
49
|
+
✓ user receives one coupon per day
|
|
50
|
+
✓ coupon expires at midnight
|
|
51
|
+
✗ second claim same day → blocked by invariant: DailyLimit
|
|
231
52
|
```
|
|
232
53
|
|
|
233
|
-
|
|
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
|
-
```
|
|
54
|
+
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.
|
|
237
55
|
|
|
238
|
-
|
|
56
|
+
## The problem it kills
|
|
239
57
|
|
|
240
|
-
|
|
58
|
+
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.
|
|
241
59
|
|
|
242
|
-
|
|
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
|
-
```
|
|
60
|
+
A document can't tell you it contradicts itself. Markdown drifts in silence. You find out when the code breaks.
|
|
246
61
|
|
|
247
|
-
|
|
248
|
-
What can block Place order?
|
|
249
|
-
Explain each blocker in product language and tell me which cases are already covered by scenarios.
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
```text
|
|
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
|
-
```
|
|
256
|
-
|
|
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
|
-
```
|
|
261
|
-
|
|
262
|
-
### Change or extend the spec
|
|
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.
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
### Move from spec to implementation
|
|
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.
|
|
62
|
+
Unspaghettit takes the other path. Your spec isn't a document. It runs.
|
|
294
63
|
|
|
295
64
|
## What makes it different
|
|
296
65
|
|
|
297
|
-
Unspaghettit is a local, executable specification layer
|
|
298
|
-
|
|
299
|
-
That makes it different from:
|
|
300
|
-
|
|
301
|
-
- markdown prompt workflows, which are easy to write but cannot execute or report drift,
|
|
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.
|
|
66
|
+
Unspaghettit is a local, executable specification layer. It gives the LLM durable project memory that can be validated, simulated, scored, and mapped back to source code. That sets it apart from:
|
|
306
67
|
|
|
307
|
-
|
|
68
|
+
- **Markdown prompt workflows**, which are easy to write but cannot execute or report drift.
|
|
69
|
+
- **Autonomous agent frameworks**, which decide how work gets done but rarely model product behavior as a contract.
|
|
70
|
+
- **Hosted AI wrappers**, which add a service boundary instead of keeping the source of truth in your repo.
|
|
71
|
+
- **No-code platforms**, which own the implementation path.
|
|
72
|
+
- **Code generators**, because Unspaghettit produces contracts and audit data while your LLM or team writes the actual code.
|
|
308
73
|
|
|
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.
|
|
74
|
+
It works in both directions. Start from an idea and drive spec → code, or point an LLM at an existing codebase and build a code → spec map that makes current behavior explicit.
|
|
313
75
|
|
|
314
|
-
##
|
|
315
|
-
|
|
316
|
-
> The 30-second path is in [Quickstart](#quickstart) above. This section covers which AI clients are supported, the flags `unspa init` accepts, and the shared-hub layout for multi-repo setups.
|
|
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:
|
|
76
|
+
## Quickstart
|
|
345
77
|
|
|
346
78
|
```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)
|
|
79
|
+
npm install -g unspaghettit
|
|
350
80
|
```
|
|
351
81
|
|
|
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
82
|
```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)
|
|
83
|
+
cd path/to/your-app
|
|
84
|
+
unspa init # scaffold + register the MCP with your AI clients
|
|
85
|
+
unspa dashboard # http://localhost:3000
|
|
449
86
|
```
|
|
450
87
|
|
|
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.
|
|
88
|
+
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
89
|
|
|
455
|
-
|
|
90
|
+
Full setup, client config, and shared-hub mode: [docs/getting-started.md](docs/getting-started.md).
|
|
456
91
|
|
|
457
|
-
##
|
|
92
|
+
## Documentation
|
|
458
93
|
|
|
459
|
-
|
|
94
|
+
| | |
|
|
95
|
+
| --- | --- |
|
|
96
|
+
| [Getting started](docs/getting-started.md) | Install, `unspa init`, client setup, hub mode, dashboard |
|
|
97
|
+
| [Core concepts](docs/concepts.md) | The model, scenarios as tests, maturity, model checking, the audit index |
|
|
98
|
+
| [Working with AI](docs/prompting.md) | Prompt patterns for spec, query, edit, and implementation |
|
|
99
|
+
| [Collaboration](docs/collaboration.md) | Multi-agent editing, real-time sync, attribution, history |
|
|
100
|
+
| [Security](docs/security.md) | Trust tiers, LAN sharing, encrypted backup |
|
|
101
|
+
| [Architecture](docs/architecture.md) | Repo layout, how the pieces fit, project status |
|
|
102
|
+
| [Worlds & quests](docs/worldbuilding.md) | Modeling interactive fiction and narrative state (for the brave) |
|
|
460
103
|
|
|
461
|
-
|
|
104
|
+
## Status
|
|
462
105
|
|
|
463
|
-
|
|
106
|
+
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
107
|
|
|
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.)
|
|
108
|
+
## License
|
|
474
109
|
|
|
475
|
-
|
|
110
|
+
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
111
|
|
|
477
112
|
---
|
|
478
113
|
|
|
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.
|
|
114
|
+
<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>
|