mulmoterminal 4.16.0 → 4.17.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 +16 -13
- package/bin/cli-args.js +2 -2
- package/common/dirPathKey.ts +19 -0
- package/common/shortcuts.ts +13 -0
- package/common/toolGroups.ts +5 -2
- package/common/toolbarPins.ts +107 -0
- package/dist/assets/AllPackages-CF2GkZ5g-BM2ZCqpM.js +2 -0
- package/dist/assets/BaseConfiguration-CAwZOAki-61HNB4KU.js +6 -0
- package/dist/assets/Element-BMI7Nj5w-jhgNonEG.js +1 -0
- package/dist/assets/{Entities-C8p_0jCn-Dw13tyTR.js → Entities-C8p_0jCn-uB3dgX2I.js} +1 -1
- package/dist/assets/FunctionList-YWk54TCy-i3alyZfA.js +1 -0
- package/dist/assets/{InputJax-C5dj-ntL-DBWzFhVU.js → InputJax-C5dj-ntL-Cz7UC3Uo.js} +1 -1
- package/dist/assets/{MathItem-YJvQL-XJ-DNYqBS01.js → MathItem-YJvQL-XJ-C1bORDtj.js} +1 -1
- package/dist/assets/{MmlFactory-DuXYIgx8-CWLIjjvy.js → MmlFactory-DuXYIgx8-Bif7yIsv.js} +1 -1
- package/dist/assets/Options-oARQeeuT-C50_lJqO.js +1 -0
- package/dist/assets/{OutputJax-DfUZNNCu-sgxDDWV-.js → OutputJax-DfUZNNCu-DE_RZgGD.js} +1 -1
- package/dist/assets/{PrioritizedList-6lun1Xqd-ykocRGXe.js → PrioritizedList-6lun1Xqd-C4vXSpxa.js} +1 -1
- package/dist/assets/Styles-BPXeoqzi-B0yxW5ro.js +1 -0
- package/dist/assets/{TeXAtom-LHT3KFWH-CNjc8vYz.js → TeXAtom-LHT3KFWH-sdnhniMs.js} +1 -1
- package/dist/assets/abnfDiagram-VCTEODGH-DoYNjdBB-DDU_ufuO.js +1 -0
- package/dist/assets/arc-CqByPKkF-DYCiP5i4.js +1 -0
- package/dist/assets/architecture-7GRP2DOG-CRS69XmP-BDFbpKIc.js +1 -0
- package/dist/assets/architectureDiagram-5GKGNRK7-BhcT6qS5-6joLXTpG.js +36 -0
- package/dist/assets/assistive-mml-DXJXho4o-DTTIy-v6.js +5 -0
- package/dist/assets/{blockDiagram-I7D4REHJ-1Cng0Q4K-DcIDSMg7.js → blockDiagram-I7D4REHJ-1Cng0Q4K-joPtLvDb.js} +3 -3
- package/dist/assets/c4Diagram-7LVT6UL2-CAb9c8nc-IQqW75OE.js +38 -0
- package/dist/assets/channel-BjESmYnj-4fT8Ljy3.js +1 -0
- package/dist/assets/{chunk-4HAMMTFA-ChwfIAnF-BV3UqcZo.js → chunk-4HAMMTFA-ChwfIAnF-COcrcqxY.js} +2 -2
- package/dist/assets/{chunk-75Z2AOVW-CbPA0Zt_-DP7076EE.js → chunk-75Z2AOVW-CbPA0Zt_-BF9bwhEX.js} +1 -1
- package/dist/assets/{chunk-DU6HZSFF-DuOx2LFX-B9i9yp2H.js → chunk-DU6HZSFF-DuOx2LFX-BT0kvgiW.js} +2 -2
- package/dist/assets/{chunk-F27PBJKO-CgBMw9yN-DheADmYc.js → chunk-F27PBJKO-CgBMw9yN-1FJUPFRX.js} +1 -1
- package/dist/assets/{chunk-GMAD6QVW-JTqlimUX-Bv32TXUx.js → chunk-GMAD6QVW-JTqlimUX-Bf8YP1up.js} +2 -2
- package/dist/assets/{chunk-GVQU2GXP-D6ccB4DO-94yHs3IY.js → chunk-GVQU2GXP-D6ccB4DO-BKIPWMRX.js} +1 -1
- package/dist/assets/{chunk-IMKFNOWR-ij1DSzMb-BqsuqPds.js → chunk-IMKFNOWR-ij1DSzMb-Ct1tQH8R.js} +1 -1
- package/dist/assets/{chunk-L3NEJ4N5-CUoAQVG2-DxJSvGS_.js → chunk-L3NEJ4N5-CUoAQVG2-DU3oJJeV.js} +1 -1
- package/dist/assets/chunk-OSK3NFVY-_VNbXQSu-CzWFtK18.js +10 -0
- package/dist/assets/{chunk-P2QGCYS3-B8lzOn3Y-CaFtW38P.js → chunk-P2QGCYS3-B8lzOn3Y-nhIUuhjm.js} +1 -1
- package/dist/assets/{chunk-POPQ4Y6H-Bh_uOTmp-D2RHBZ5s.js → chunk-POPQ4Y6H-Bh_uOTmp-BDpTYVeC.js} +1 -1
- package/dist/assets/{chunk-PWAF6VOD-DzjnfYSw-BJFV14F1.js → chunk-PWAF6VOD-DzjnfYSw-DKPY-7mP.js} +1 -1
- package/dist/assets/{chunk-SHT3W25Y-B8dQLS5w-Df12R7Gh.js → chunk-SHT3W25Y-B8dQLS5w-BOuFBdeA.js} +4 -4
- package/dist/assets/{chunk-SVP7TREG-B6A-T8Th-D6_Ichh1.js → chunk-SVP7TREG-B6A-T8Th-D0lLwfAu.js} +1 -1
- package/dist/assets/{chunk-TICWLB2K-C1kwD29l-DbGHkRkh.js → chunk-TICWLB2K-C1kwD29l-ClC085Mh.js} +2 -2
- package/dist/assets/{chunk-XXDRQBXY-vg0kfC73-aHwnHV68.js → chunk-XXDRQBXY-vg0kfC73-CQphc_9V.js} +1 -1
- package/dist/assets/classDiagram-ZZMXUADV-C7gP-pUH-CGYE0ALU.js +1 -0
- package/dist/assets/classDiagram-v2-VYDZK3BY-CUwV5k1F-CGYE0ALU.js +1 -0
- package/dist/assets/cose-bilkent-JH36ORCC-NuHCtE3P-Ctskoi14.js +1 -0
- package/dist/assets/cynefin-OW5HDTMX-C4iKivN4-Ck3MtWqY.js +1 -0
- package/dist/assets/cynefinDiagram-5FMLGOSQ-CA7sro34-B0HlDcFp.js +62 -0
- package/dist/assets/cytoscape.esm-DuKOKbur-Cp2HF8G-.js +321 -0
- package/dist/assets/dagre-B42rJlko-6iqQ6GWy.js +1 -0
- package/dist/assets/dagre-GXQ25YYZ-DOztjUR_-B9a9ItM-.js +4 -0
- package/dist/assets/{diagram-S7CK7UJ4-D_nsLfRT-DWr9WRW6.js → diagram-S7CK7UJ4-D_nsLfRT-BjeaPY2a.js} +3 -3
- package/dist/assets/diagram-UQ7AKVKN-DNN-YX9a-B7lns2-O.js +41 -0
- package/dist/assets/{diagram-VSXAHHWV--HENzo-l-DmNtXjHQ.js → diagram-VSXAHHWV--HENzo-l-CYS8QI0b.js} +1 -1
- package/dist/assets/diagram-VX7I27RA-m2m9dROj-Df30362U.js +24 -0
- package/dist/assets/diagram-Z3DM3KII-D4qpv4-B-DIRG03W8.js +24 -0
- package/dist/assets/{dist-DyY2Odgu.js → dist-BXSyA_TU.js} +1 -1
- package/dist/assets/dist-Ca5wsja_.js +11 -0
- package/dist/assets/{dist-FzB0wwv6.js → dist-Cz-H6Ed9.js} +1 -1
- package/dist/assets/{dist-CXRReMvS.js → dist-DQ0-6hCE.js} +1 -1
- package/dist/assets/dist-DYecIxGd.js +1 -0
- package/dist/assets/{dist-DeiyD9Ki-C1_gcVU2.js → dist-DeiyD9Ki-NpwH3Qk1.js} +1 -1
- package/dist/assets/dist-Dq9N76oy.js +1 -0
- package/dist/assets/dist-DyK-orJO.js +9 -0
- package/dist/assets/{dist-Lnp6Clqz.js → dist-J9wojbOY.js} +1 -1
- package/dist/assets/dist-nYE452Bv.js +2 -0
- package/dist/assets/dist-uJrW5fOA.js +11 -0
- package/dist/assets/ebnfDiagram-PWID7BFC-CAbv3sZg-CLaLnxQc.js +1 -0
- package/dist/assets/{erDiagram-RLTQ6QDP-a10Ryh0--C72i1ywY.js → erDiagram-RLTQ6QDP-a10Ryh0--CNmjy1Io.js} +2 -2
- package/dist/assets/eventmodeling-NTZA5JFV-DhqtNS8R-DND0wWFL.js +1 -0
- package/dist/assets/flowDiagram-HODETNUW-CAW_8mwY-B9sfp4B8.js +1 -0
- package/dist/assets/{ganttDiagram-EL5Y4UJY-Cb7leeOC-DYFiF709.js → ganttDiagram-EL5Y4UJY-Cb7leeOC-Bo_KYl5-.js} +1 -1
- package/dist/assets/gitGraph-4MIJSDKK-S_Zs6Nxs-BbhWwhsR.js +1 -0
- package/dist/assets/{gitGraphDiagram-WWUBYQGX-BCSbUpXG-DejyXZfK.js → gitGraphDiagram-WWUBYQGX-BCSbUpXG-B25LdXPq.js} +2 -2
- package/dist/assets/html-DdQiKDqM-CWXcuZKY.js +2 -0
- package/dist/assets/index-BQiJKXEe.js +5384 -0
- package/dist/assets/{index-C7OnGcwW.css → index-C1zBtRaC.css} +1 -1
- package/dist/assets/info-A6RAGUB7-4sGJh1is-BBy4DjBX.js +1 -0
- package/dist/assets/infoDiagram-27XIBGKW-BJRaZItN-CVeXTxkK.js +2 -0
- package/dist/assets/{ishikawaDiagram-5VMMS53U-DHlFe__S-CmJe5Tlt.js → ishikawaDiagram-5VMMS53U-DHlFe__S-s0Hksvvm.js} +2 -2
- package/dist/assets/{journeyDiagram-3NMN7TZE-BOIo3JM--Y8oQ4y77.js → journeyDiagram-3NMN7TZE-BOIo3JM--CUDKJOre.js} +2 -2
- package/dist/assets/{kanban-definition-UXKFOSKX-yrQdG683-CFIQzQvF.js → kanban-definition-UXKFOSKX-yrQdG683-Bu-56dzn.js} +5 -5
- package/dist/assets/{katex-DImtHWbS-DFcUm9x_.js → katex-DImtHWbS-ZlcWpGUi.js} +3 -3
- package/dist/assets/{lengths-CvmPfBid-BQ2m-oBM.js → lengths-CvmPfBid-DS9M1Zck.js} +1 -1
- package/dist/assets/{line-DUb1TjJS-C1or5HkU.js → line-DUb1TjJS-C6h_ukz1.js} +1 -1
- package/dist/assets/linear-xsuGWu5q-DCIuhl_K.js +1 -0
- package/dist/assets/liteAdaptor-C0FQiOEx-68b9WFkn.js +5 -0
- package/dist/assets/marp-DENGSRW0.js +3467 -0
- package/dist/assets/material-symbols-outlined-CQbRTMbb.woff2 +0 -0
- package/dist/assets/mathjax-DVEo4UYj-BeP6fXTI.js +1 -0
- package/dist/assets/{mermaid-parser.core-fkjeiYO7-Du7nNQKj.js → mermaid-parser.core-fkjeiYO7-BI7W6lAR.js} +20 -20
- package/dist/assets/mermaid.core-CZDx2Cyn-DunezLlE.js +44 -0
- package/dist/assets/{mindmap-definition-YA3MSWOX-BpKAVyqs-BjKrJvG3.js → mindmap-definition-YA3MSWOX-BpKAVyqs-DRRBWBS2.js} +1 -1
- package/dist/assets/mo-CrlNnGXX-DTWdNVwW.js +1 -0
- package/dist/assets/packet-AYTQ26CC-MQQyx8fI-BGwT-qpH.js +1 -0
- package/dist/assets/path-CciMXxPa-fybaL0A-.js +1 -0
- package/dist/assets/pegDiagram-XKGWAZYB-C7eG_Ohl-B2Ycq3J4.js +1 -0
- package/dist/assets/pie-WAS4IAKB-CyaL5i_d-BUM2aSuD.js +1 -0
- package/dist/assets/pieDiagram-E7YTZNPT-5f9wSfDR-D17gLilp.js +39 -0
- package/dist/assets/{quadrantDiagram-AXDQQJYC-mWeaOj5S-DS7mHc4o.js → quadrantDiagram-AXDQQJYC-mWeaOj5S-5l2e2-lu.js} +1 -1
- package/dist/assets/radar-RG4KPBEZ-DR-SsHDJ-B0abbdQP.js +1 -0
- package/dist/assets/railroad-74A4TZTK-C2gqsOGX-CGR3fOea.js +1 -0
- package/dist/assets/railroad-abnf-HS5TGJTU-Dpzw6P5u-bLa5M0Rd.js +1 -0
- package/dist/assets/railroad-ebnf-LZEXJU2U-J_BuIrPo-DD46tZ66.js +1 -0
- package/dist/assets/railroad-peg-WCYAUIDC-DzMStOR--CouNrg-J.js +1 -0
- package/dist/assets/railroadDiagram-O6MQD6OU-DJskhE7u-B7L40GB9.js +1 -0
- package/dist/assets/{requirementDiagram-BXWQKSXE-B5E0bU4h-CyS_2sxk.js → requirementDiagram-BXWQKSXE-B5E0bU4h-o05nW1Ur.js} +1 -1
- package/dist/assets/rolldown-runtime-B0Z9INg1.js +1 -0
- package/dist/assets/{rough.esm-CRiMXkOs-By172zw-.js → rough.esm-CRiMXkOs-Dy-Kn_BL.js} +1 -1
- package/dist/assets/{sankeyDiagram-P5KCCOFB-DS3AOTai-CSuBkdUO.js → sankeyDiagram-P5KCCOFB-DS3AOTai-CFeYTT2u.js} +1 -1
- package/dist/assets/{sequenceDiagram-WJ2MYXX4-Bn2L9osv-CHxEbZ0W.js → sequenceDiagram-WJ2MYXX4-Bn2L9osv-BGgRBUQD.js} +2 -2
- package/dist/assets/{src-CLC0ddSd-CjxPB3S7.js → src-CLC0ddSd-DeMngDQg.js} +1 -1
- package/dist/assets/stateDiagram-D77RDMKH-DbtoW7HL-D4l11dwx.js +1 -0
- package/dist/assets/stateDiagram-v2-MP3YSRHH-CX6RalKY-DOA8omDg.js +1 -0
- package/dist/assets/svg-CaHU_sxA-DGR0XOoK.js +8 -0
- package/dist/assets/swimlanes-42K2YHIH-90h8w_3B-BBRu6p3C.js +1 -0
- package/dist/assets/swimlanesDiagram-VR7AAH4N-49XH_TMr-DAJi7crp.js +8 -0
- package/dist/assets/tex-B1cONMvb-CWipwtJg.js +1 -0
- package/dist/assets/timeline-definition-24CTP7MA-Bx3KcICO-BEgprufy.js +120 -0
- package/dist/assets/treeView-Q6P3EWNA-gFs854Sn-B3zhZnF1.js +1 -0
- package/dist/assets/treemap-WGGIJYW6-DGh_szUA-BPTAC2rf.js +1 -0
- package/dist/assets/{vennDiagram-4TSXK5OY-DSexNe_H-B0-oluSn.js → vennDiagram-4TSXK5OY-DSexNe_H-CS1weuUo.js} +3 -3
- package/dist/assets/wardley-WFR3VGLG-BVLYL3gB-C2b5fV9M.js +1 -0
- package/dist/assets/{wardleyDiagram-VM6X3IG4-DesYYyZW-CIvLV4o_.js → wardleyDiagram-VM6X3IG4-DesYYyZW-B2Xol-7C.js} +36 -36
- package/dist/assets/{xychartDiagram-S5SC5T6Z-dIt6pHWV-C1D4f_2b.js → xychartDiagram-S5SC5T6Z-dIt6pHWV-Ba2mmvhL.js} +3 -3
- package/dist/index.html +4 -3
- package/package.json +16 -15
- package/plugins/plugins.json +2 -1
- package/server/agents/antigravity-usage.ts +1 -1
- package/server/backends/mulmoscript.spec.ts +188 -0
- package/server/backends/mulmoscript.ts +172 -12
- package/server/backends/openPath.ts +11 -0
- package/server/backends/shortcuts.ts +47 -16
- package/server/campaign/campaign-store.ts +1 -1
- package/server/config/app-config.ts +10 -0
- package/server/config/config-body.ts +1 -0
- package/server/index.ts +4 -1
- package/server/session/output-relay.ts +7 -0
- package/server/session/pty-connection.ts +6 -3
- package/server/session/terminal-mode-tracker.ts +114 -0
- package/server/session/types.ts +4 -0
- package/server/skills/mulmoterminal-config/SKILL.md +29 -1
- package/dist/assets/AllPackages-CF2GkZ5g-BUkwHhnA.js +0 -2
- package/dist/assets/BaseConfiguration-CAwZOAki-sAOejtXv.js +0 -6
- package/dist/assets/Element-BMI7Nj5w-CtzS4V48.js +0 -1
- package/dist/assets/FunctionList-YWk54TCy-CsA_edRr.js +0 -1
- package/dist/assets/Options-oARQeeuT-CU8UddjX.js +0 -1
- package/dist/assets/Styles-BPXeoqzi-DSzGxEMs.js +0 -1
- package/dist/assets/abnfDiagram-VCTEODGH-DoYNjdBB-CBWKmDCi.js +0 -1
- package/dist/assets/arc-CqByPKkF-88IlSEMD.js +0 -1
- package/dist/assets/architecture-7GRP2DOG-CRS69XmP-CfEYhnsg.js +0 -1
- package/dist/assets/architectureDiagram-5GKGNRK7-BhcT6qS5-BLtGEqlp.js +0 -36
- package/dist/assets/assistive-mml-DXJXho4o-DzIDEOlP.js +0 -5
- package/dist/assets/c4Diagram-7LVT6UL2-CAb9c8nc-C7a_Eswh.js +0 -38
- package/dist/assets/channel-BjESmYnj-m72KoOEU.js +0 -1
- package/dist/assets/chunk-2E4U76K2-CMyNbRyJ-uuFlgwng.js +0 -2
- package/dist/assets/chunk-CLGD4ZFX-CVw8XHcp-CLPfrpnT.js +0 -1
- package/dist/assets/chunk-LNGE3PJU-DhBy-8ZR-CBXc5vOK.js +0 -34
- package/dist/assets/chunk-OSK3NFVY-_VNbXQSu-Ccnx0KHf.js +0 -10
- package/dist/assets/chunk-TLUHSLCS-DYzGlCmi-CJdhEIVL.js +0 -2
- package/dist/assets/classDiagram-ZZMXUADV-C7gP-pUH-DLDPmUSl.js +0 -1
- package/dist/assets/classDiagram-v2-VYDZK3BY-CUwV5k1F-DLDPmUSl.js +0 -1
- package/dist/assets/cose-bilkent-JH36ORCC-NuHCtE3P-CArrWVtM.js +0 -1
- package/dist/assets/cynefin-OW5HDTMX-C4iKivN4-BQEcGeGg.js +0 -1
- package/dist/assets/cynefinDiagram-5FMLGOSQ-CA7sro34-BzZQpKl2.js +0 -62
- package/dist/assets/cytoscape.esm-DuKOKbur-CaSq5b0a.js +0 -321
- package/dist/assets/dagre-B42rJlko-DO9SsX8n.js +0 -1
- package/dist/assets/dagre-GXQ25YYZ-DOztjUR_-DOx-551u.js +0 -4
- package/dist/assets/diagram-UQ7AKVKN-DNN-YX9a-C9TXc-ah.js +0 -41
- package/dist/assets/diagram-VX7I27RA-m2m9dROj-Cq6wReC4.js +0 -24
- package/dist/assets/diagram-Z3DM3KII-D4qpv4-B-DtXyJB7G.js +0 -24
- package/dist/assets/dist-BQPlJ9lU.js +0 -9
- package/dist/assets/dist-Ci7pnEU6.js +0 -11
- package/dist/assets/dist-DOVOmrou.js +0 -11
- package/dist/assets/dist-DtF92Clz.js +0 -2
- package/dist/assets/dist-TlhJ1D4x.js +0 -1
- package/dist/assets/dist-berHSMWa.js +0 -1
- package/dist/assets/ebnfDiagram-PWID7BFC-CAbv3sZg-BbjG8-uo.js +0 -1
- package/dist/assets/eventmodeling-NTZA5JFV-DhqtNS8R-BK1N0_ZM.js +0 -1
- package/dist/assets/flowDiagram-HODETNUW-CAW_8mwY-B3-stLUn.js +0 -1
- package/dist/assets/gitGraph-4MIJSDKK-S_Zs6Nxs-BRRPIfYV.js +0 -1
- package/dist/assets/html-DdQiKDqM-CPke18TU.js +0 -2
- package/dist/assets/index-Z2OTrqqI.js +0 -1051
- package/dist/assets/info-A6RAGUB7-4sGJh1is-fp_xBD4Z.js +0 -1
- package/dist/assets/infoDiagram-27XIBGKW-BJRaZItN-DnsdjhkP.js +0 -2
- package/dist/assets/linear-xsuGWu5q-DO1NVk1F.js +0 -1
- package/dist/assets/liteAdaptor-C0FQiOEx-rHhNCala.js +0 -5
- package/dist/assets/marp-246Tptqb.js +0 -3467
- package/dist/assets/material-symbols-outlined-Bz-4pmf0.woff2 +0 -0
- package/dist/assets/mathjax-DVEo4UYj-BKhDfB9b.js +0 -1
- package/dist/assets/mermaid.core-CZDx2Cyn-B8TG9ViQ.js +0 -11
- package/dist/assets/mo-CrlNnGXX-DG8Vectz.js +0 -1
- package/dist/assets/packet-AYTQ26CC-MQQyx8fI-jr1o6-sN.js +0 -1
- package/dist/assets/path-CciMXxPa-COt_16Va.js +0 -1
- package/dist/assets/pegDiagram-XKGWAZYB-C7eG_Ohl-BhWdbn0k.js +0 -1
- package/dist/assets/pie-WAS4IAKB-CyaL5i_d-Bu147U5x.js +0 -1
- package/dist/assets/pieDiagram-E7YTZNPT-5f9wSfDR-Lecay4e9.js +0 -39
- package/dist/assets/radar-RG4KPBEZ-DR-SsHDJ-CN5skCMU.js +0 -1
- package/dist/assets/railroad-74A4TZTK-C2gqsOGX-aDdh8kqg.js +0 -1
- package/dist/assets/railroad-abnf-HS5TGJTU-Dpzw6P5u-RpiXuxqp.js +0 -1
- package/dist/assets/railroad-ebnf-LZEXJU2U-J_BuIrPo-C0a1HZjw.js +0 -1
- package/dist/assets/railroad-peg-WCYAUIDC-DzMStOR--DYIIa1Hw.js +0 -1
- package/dist/assets/railroadDiagram-O6MQD6OU-DJskhE7u-Dmh0-Us2.js +0 -1
- package/dist/assets/stateDiagram-D77RDMKH-DbtoW7HL-yabfmTgk.js +0 -1
- package/dist/assets/stateDiagram-v2-MP3YSRHH-CX6RalKY-GzlXJtMT.js +0 -1
- package/dist/assets/svg-CaHU_sxA-D8CRwYZQ.js +0 -8
- package/dist/assets/swimlanes-42K2YHIH-90h8w_3B-lAgM4Z9o.js +0 -1
- package/dist/assets/swimlanesDiagram-VR7AAH4N-49XH_TMr-4AicWyJt.js +0 -8
- package/dist/assets/tex-B1cONMvb-DydoaQyY.js +0 -1
- package/dist/assets/timeline-definition-24CTP7MA-Bx3KcICO-BH12S7gs.js +0 -120
- package/dist/assets/treeView-Q6P3EWNA-gFs854Sn-aY6owIcz.js +0 -1
- package/dist/assets/treemap-WGGIJYW6-DGh_szUA-YLwoYd-l.js +0 -1
- package/dist/assets/wardley-WFR3VGLG-BVLYL3gB-Bmrp_tbe.js +0 -1
package/README.md
CHANGED
|
@@ -57,7 +57,7 @@ ping to your phone when a task finishes. One `npx` command, no Electron, no conf
|
|
|
57
57
|
npx mulmoterminal@latest # starts on http://localhost:34567 and opens your browser
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
Requires **Node ≥ 22.
|
|
60
|
+
Requires **Node ≥ 22.12** and the [`claude`](https://claude.com/claude-code) CLI on your
|
|
61
61
|
`PATH`, already logged in. `npx mulmoterminal@latest init` reports what it can't find.
|
|
62
62
|
|
|
63
63
|
### Why not tmux + iTerm panes?
|
|
@@ -244,15 +244,16 @@ more.
|
|
|
244
244
|
view, everyday workflows, the full feature list, configuration, and mobile push notifications.
|
|
245
245
|
- **ユーザーガイド:** [日本語](https://receptron.github.io/mulmoterminal/guide/ja/) —
|
|
246
246
|
グリッドの使い方・日々のワークフロー・機能一覧・設定・スマホ通知の設定はこちら。
|
|
247
|
-
- **Updates / アップデート情報:** new releases and features are announced
|
|
248
|
-
|
|
249
|
-
[Singularity Society (@SingularitySoci)](https://x.com/SingularitySoci)
|
|
247
|
+
- **Updates / アップデート情報:** new releases and features are announced on X —
|
|
248
|
+
in English on [@mulmocast](https://x.com/mulmocast), in Japanese on
|
|
249
|
+
[Singularity Society (@SingularitySoci)](https://x.com/SingularitySoci)。
|
|
250
|
+
新バージョンや新機能のお知らせは X で。
|
|
250
251
|
|
|
251
252
|
---
|
|
252
253
|
|
|
253
254
|
## Install & run
|
|
254
255
|
|
|
255
|
-
Needs **Node ≥ 22.
|
|
256
|
+
Needs **Node ≥ 22.12**, plus these CLIs on your `PATH`:
|
|
256
257
|
|
|
257
258
|
> **Never installed any of this before?** The guide walks it end to end, macOS and Windows,
|
|
258
259
|
> assuming no command-line experience:
|
|
@@ -289,7 +290,7 @@ from any terminal (installed globally, just `mulmoterminal stop`). All three run
|
|
|
289
290
|
with `tmux` installed the agent sessions survive and come back under **Settings → Sessions that
|
|
290
291
|
survived a restart**; without it they end with the server.
|
|
291
292
|
|
|
292
|
-
**First-run setup (optional).** `npx mulmoterminal@latest init` checks your environment (Node ≥ 22.
|
|
293
|
+
**First-run setup (optional).** `npx mulmoterminal@latest init` checks your environment (Node ≥ 22.12
|
|
293
294
|
and every CLI in the table above), seeds the launcher's **directory
|
|
294
295
|
presets** from the projects in your Claude Code history, and writes `~/.mulmoterminal/config.json`.
|
|
295
296
|
It's **idempotent** — re-run it any time to refresh the presets; it overwrites the managed parts
|
|
@@ -575,7 +576,7 @@ detects `tmux` on `PATH` at startup and uses it automatically when present.
|
|
|
575
576
|
| Plugins | GUI-protocol Vue plugins (`@mulmoclaude/*`, `@mulmochat-plugin/*`): markdown, form, image, chart, HTML, collection, accounting, mulmoscript (MulmoCast video/slides), google |
|
|
576
577
|
| Tests | Vitest + @vue/test-utils + jsdom |
|
|
577
578
|
|
|
578
|
-
Requires **Node ≥ 22.
|
|
579
|
+
Requires **Node ≥ 22.12** (uses `node --env-file-if-exists`) and the `claude` CLI on `PATH`.
|
|
579
580
|
|
|
580
581
|
---
|
|
581
582
|
|
|
@@ -1082,11 +1083,13 @@ everything else on disk that happens to parse as a deck. Measured on a real work
|
|
|
1082
1083
|
matched, 33 were the user's own decks and 217 were a checked-out repository's test fixtures and
|
|
1083
1084
|
samples.** A menu is a short list of things you chose.
|
|
1084
1085
|
|
|
1085
|
-
**Where the decks have to live:**
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
**Open in the Canvas** — with no configuration at all
|
|
1086
|
+
**Where the decks have to live:** anywhere. A deck under the workspace — or under a directory in
|
|
1087
|
+
your launcher's saved list (up to 64 in total, read once at startup) — is addressed by its place in
|
|
1088
|
+
that directory; one anywhere else is addressed by its own path. Either way it opens, and a deck you
|
|
1089
|
+
open both ways is **one card**, not two. A deck you can see in the file tree is reachable there too
|
|
1090
|
+
— right-click a row and choose **Open in the Canvas** — with no configuration at all, as long as the
|
|
1091
|
+
pane knows the directory its tree is rooted at. It shows that path in its header; a pane still
|
|
1092
|
+
reading `(default workspace)` has nothing to resolve a row against and offers no entry.
|
|
1090
1093
|
|
|
1091
1094
|
If a deck cannot be opened (it was deleted, or the workspace moved since startup), the cell says
|
|
1092
1095
|
why rather than doing nothing.
|
|
@@ -2170,7 +2173,7 @@ MulmoTerminal is the seventh.
|
|
|
2170
2173
|
It exists because we run several coding agents every day and kept losing track of which one was
|
|
2171
2174
|
waiting on us. Everything here was built for that, then kept because it worked. MIT licensed.
|
|
2172
2175
|
|
|
2173
|
-
- **Updates** are announced
|
|
2176
|
+
- **Updates** are announced on X: in English [@mulmocast](https://x.com/mulmocast), in Japanese [@SingularitySoci](https://x.com/SingularitySoci)
|
|
2174
2177
|
- **Sister project:** [MulmoClaude](https://github.com/receptron/mulmoclaude)
|
|
2175
2178
|
|
|
2176
2179
|
## Contributing
|
package/bin/cli-args.js
CHANGED
|
@@ -387,7 +387,7 @@ export const SECOND_INSTANCE_NOTE = [
|
|
|
387
387
|
].join("\n");
|
|
388
388
|
|
|
389
389
|
const MIN_NODE_MAJOR = 22;
|
|
390
|
-
const MIN_NODE_MINOR =
|
|
390
|
+
const MIN_NODE_MINOR = 12;
|
|
391
391
|
|
|
392
392
|
/**
|
|
393
393
|
* The lowest Node the `init` check reports as good, for the "needs ≥ x.y" line.
|
|
@@ -398,7 +398,7 @@ export const MIN_NODE_LABEL = `${MIN_NODE_MAJOR}.${MIN_NODE_MINOR}`;
|
|
|
398
398
|
* Whether the running Node is new enough for the `init` pre-flight tick.
|
|
399
399
|
*
|
|
400
400
|
* `process.versions.node` is "major.minor.patch", with a "-prerelease" tag on the patch for
|
|
401
|
-
* nightlies ("22.
|
|
401
|
+
* nightlies ("22.12.0-nightly…"). Only major.minor gate, and Number.parseInt stops at the
|
|
402
402
|
* first non-digit, so that tag never reaches the comparison. A string that is not a version
|
|
403
403
|
* parses to NaN, and every comparison against NaN is false, so an unreadable version reads as
|
|
404
404
|
* "below minimum" — the safe direction for a display-only check.
|
package/common/dirPathKey.ts
CHANGED
|
@@ -43,3 +43,22 @@ export function dirPathKey(path: string): string {
|
|
|
43
43
|
|
|
44
44
|
/** Whether two paths name the same directory, as far as spelling can tell. */
|
|
45
45
|
export const isSameDirPath = (a: string | null | undefined, b: string | null | undefined): boolean => !!a && !!b && dirPathKey(a) === dirPathKey(b);
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Whether `path` names one file on its own — POSIX `/…`, a Windows drive root, a UNC share.
|
|
49
|
+
*
|
|
50
|
+
* NARROWER than `rootOf` on purpose, in the one place the two could disagree: a SINGLE leading
|
|
51
|
+
* backslash. `rootOf` keys `\deck.json` as `/deck.json`, which is right for its job (comparing two
|
|
52
|
+
* spellings of a directory lexically) and wrong for this one — on Windows that path is rooted on
|
|
53
|
+
* the process's CURRENT DRIVE, which the spelling does not carry and a browser cannot infer. Keying
|
|
54
|
+
* it would give `\deck.json` and `C:\deck.json` two identities for one file while conflating the
|
|
55
|
+
* first with a POSIX `/deck.json` (Codex P2 on #1976). A caller that needs a decision here gets
|
|
56
|
+
* "no", and whatever it falls back to is at worst what it did before.
|
|
57
|
+
*
|
|
58
|
+
* The same distinction `rootOf` already draws for `C:foo` and `\server\share`: a spelling that
|
|
59
|
+
* means something else must not borrow a rooted one's key.
|
|
60
|
+
*/
|
|
61
|
+
export const isRootedPath = (path: string): boolean => {
|
|
62
|
+
const trimmed = path.trim();
|
|
63
|
+
return /^[a-zA-Z]:[/\\]/.test(trimmed) || /^[/\\]{2}/.test(trimmed) || trimmed.startsWith("/");
|
|
64
|
+
};
|
package/common/shortcuts.ts
CHANGED
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
// show up in the other — so the on-disk format is the contract: an OBJECT WRAPPER
|
|
7
7
|
// `{ shortcuts: Shortcut[] }`, not a bare array, matching mulmoclaude/src/types/shortcuts.ts.
|
|
8
8
|
// Keep this type in sync with MulmoClaude's.
|
|
9
|
+
//
|
|
10
|
+
// It is a SUBSET of what a record may hold, not the whole of it: the file is the union of every
|
|
11
|
+
// version of both apps that has written it, and a stored record can carry fields this build has
|
|
12
|
+
// never heard of. `toShortcut` (server/backends/shortcuts.ts) carries those through rather than
|
|
13
|
+
// dropping them (#1996) — so this type says what MulmoTerminal understands, not what exists.
|
|
9
14
|
|
|
10
15
|
export const SHORTCUT_KINDS = ["collection", "feed"] as const;
|
|
11
16
|
export type ShortcutKind = (typeof SHORTCUT_KINDS)[number];
|
|
@@ -19,6 +24,14 @@ export interface Shortcut {
|
|
|
19
24
|
title: string;
|
|
20
25
|
/** Cached material-symbols glyph — refreshed on reconcile. */
|
|
21
26
|
icon: string;
|
|
27
|
+
/** Cached accent colour name — MulmoClaude's, and only MulmoClaude draws it (#1993).
|
|
28
|
+
*
|
|
29
|
+
* Carried rather than understood: this app has no accent palette, so it keeps whatever string
|
|
30
|
+
* the file holds and hands it back unchanged. Deliberately NOT validated here — deciding which
|
|
31
|
+
* colours are legal is the job of the app that draws them, and a check that drifted from theirs
|
|
32
|
+
* would silently delete a colour they consider valid, which is the bug this field exists to fix.
|
|
33
|
+
* Absent when the collection names none. */
|
|
34
|
+
color?: string;
|
|
22
35
|
}
|
|
23
36
|
|
|
24
37
|
/** True when two shortcuts target the same thing (the dedupe key). */
|
package/common/toolGroups.ts
CHANGED
|
@@ -84,6 +84,7 @@ const GROUP_BY_TOOL = new Map<string, ToolGroup>([
|
|
|
84
84
|
["presentForm", "render"],
|
|
85
85
|
["presentChart", "render"],
|
|
86
86
|
["presentHtml", "render"],
|
|
87
|
+
["presentShapeScript", "render"],
|
|
87
88
|
|
|
88
89
|
// presentCollection RENDERS, but it renders collection data and only makes sense next to
|
|
89
90
|
// manageCollection — a cell offered the view without the store gets a tool it cannot fill.
|
|
@@ -175,8 +176,10 @@ export const LEGACY_GUI_SERVER_IDS: readonly string[] = ["mulmoterminal-gui"];
|
|
|
175
176
|
// model spend money silently under a switch the UI presents as "let the agent draw", so it
|
|
176
177
|
// keeps Claude Code's prompt (answer it once per project and the prompt stops).
|
|
177
178
|
//
|
|
178
|
-
// The
|
|
179
|
-
|
|
179
|
+
// The four below save an artifact and draw it, and call nothing external.
|
|
180
|
+
// `presentShapeScript` does not even save one — the ShapeScript source travels in
|
|
181
|
+
// the result and is rendered client-side — so it clears the bar the others meet.
|
|
182
|
+
export const AUTO_ALLOWED_TOOLS: readonly string[] = ["presentForm", "presentChart", "presentHtml", "presentShapeScript"];
|
|
180
183
|
|
|
181
184
|
/** Tools that must keep the agent's permission prompt on EVERY claude session, including the
|
|
182
185
|
* workspace.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// Which of the pinned favourites the app toolbar shows without opening Collections (#1984).
|
|
2
|
+
//
|
|
3
|
+
// Shared because both sides decide from it: the server sanitizes what `~/.mulmoterminal/config.json`
|
|
4
|
+
// says, the browser renders the toolbar and writes the same field back.
|
|
5
|
+
//
|
|
6
|
+
// Deliberately NOT a field on `Shortcut`. The pins themselves live in `<workspace>/config/shortcuts.json`,
|
|
7
|
+
// which MulmoTerminal SHARES with MulmoClaude, and both apps rebuild every record when they write it
|
|
8
|
+
// (`normalizeShortcuts`) — so a field one app added is dropped the first time the other pins anything.
|
|
9
|
+
// This is a MulmoTerminal-side view preference over that shared list, and it holds only the identity
|
|
10
|
+
// of the pins it promotes: the label and the icon are read from the pin, so renaming a collection
|
|
11
|
+
// cannot leave the toolbar saying the old name.
|
|
12
|
+
import { SHORTCUT_KINDS, type Shortcut, type ShortcutKind } from "./shortcuts.js";
|
|
13
|
+
|
|
14
|
+
/** How many buttons the toolbar draws, and so how many pins can be promoted at once. The row
|
|
15
|
+
* already carries the view switch, the grid's own controls, the status tally and two gauges; past
|
|
16
|
+
* a handful the pins stop being "one press away" and start pushing that row into its horizontal
|
|
17
|
+
* scroll, which is the two-step this feature exists to remove. */
|
|
18
|
+
export const MAX_TOOLBAR_PINS = 5;
|
|
19
|
+
|
|
20
|
+
/** How many keys the FILE may hold, which is not the same number.
|
|
21
|
+
*
|
|
22
|
+
* Nothing here ever deletes a key it did not just demote: unpinning a promoted collection leaves
|
|
23
|
+
* its key in the config, where it draws nothing and takes no slot — and re-pinning brings the
|
|
24
|
+
* button straight back. That is a deliberate choice over tidying the file on save. Tidying means
|
|
25
|
+
* deciding "this pin is gone" from a list that might be stale, and one wrong answer deletes a
|
|
26
|
+
* promotion the user still wants, silently; four separate review findings on PR #1991 were all
|
|
27
|
+
* ways of getting that decision wrong. A key nobody can see costs a line of JSON.
|
|
28
|
+
*
|
|
29
|
+
* So the file's own limit is a sanity bound, not a budget — you would have to unpin forty-five
|
|
30
|
+
* promoted collections to meet it. */
|
|
31
|
+
export const MAX_STORED_TOOLBAR_PINS = 50;
|
|
32
|
+
|
|
33
|
+
/** How one promoted pin is named in the config: `"collection:works"`. */
|
|
34
|
+
export const toolbarPinKey = (pin: Pick<Shortcut, "kind" | "slug">): string => `${pin.kind}:${pin.slug}`;
|
|
35
|
+
|
|
36
|
+
// Split on the FIRST colon, not every colon: `kind` is one of two known words, so everything after
|
|
37
|
+
// it is the slug even if a slug ever contains one.
|
|
38
|
+
function parseToolbarPin(key: unknown): { kind: ShortcutKind; slug: string } | null {
|
|
39
|
+
if (typeof key !== "string") return null;
|
|
40
|
+
const separator = key.indexOf(":");
|
|
41
|
+
if (separator <= 0) return null;
|
|
42
|
+
const kind = SHORTCUT_KINDS.find((candidate) => candidate === key.slice(0, separator));
|
|
43
|
+
if (kind === undefined) return null;
|
|
44
|
+
const slug = key.slice(separator + 1);
|
|
45
|
+
return slug.length > 0 ? { kind, slug } : null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Keep the well-formed keys, in order, deduped, up to the FILE's bound. Anything else — a config
|
|
49
|
+
* written by hand, a key naming a kind this build does not have — is dropped rather than rendered
|
|
50
|
+
* as a blank button. The bound here is `MAX_STORED_TOOLBAR_PINS`, not the number of buttons:
|
|
51
|
+
* truncating to five would delete keys whose pins are merely unpinned right now. */
|
|
52
|
+
export function sanitizeToolbarPins(input: unknown): string[] {
|
|
53
|
+
if (!Array.isArray(input)) return [];
|
|
54
|
+
const out: string[] = [];
|
|
55
|
+
input.forEach((raw) => {
|
|
56
|
+
const pin = parseToolbarPin(raw);
|
|
57
|
+
if (!pin) return;
|
|
58
|
+
const key = toolbarPinKey(pin);
|
|
59
|
+
if (out.includes(key) || out.length >= MAX_STORED_TOOLBAR_PINS) return;
|
|
60
|
+
out.push(key);
|
|
61
|
+
});
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The pins the toolbar draws: the configured keys, in the CONFIG's order, resolved against the
|
|
66
|
+
* favourites that exist now, and cut to the number of buttons the row can carry.
|
|
67
|
+
*
|
|
68
|
+
* A key whose pin is gone — unpinned here, or in MulmoClaude, which writes the same file — is
|
|
69
|
+
* skipped rather than drawn: the title and icon come from the pin, so there is nothing to label it
|
|
70
|
+
* with. Skipped, not deleted, and it does not consume one of the five: re-pin it and the button is
|
|
71
|
+
* back exactly where it was.
|
|
72
|
+
*
|
|
73
|
+
* What counts as "gone" is gone from the list the CALLER holds. The client store reads
|
|
74
|
+
* `/api/shortcuts` once per page, so a pin removed by the other app is still drawn until something
|
|
75
|
+
* re-reads it — which opening Settings' Toolbar pins does (Codex, PR #1991). */
|
|
76
|
+
export function resolveToolbarPins(shortcuts: readonly Shortcut[], keys: readonly string[]): Shortcut[] {
|
|
77
|
+
const byKey = new Map(shortcuts.map((shortcut) => [toolbarPinKey(shortcut), shortcut]));
|
|
78
|
+
return keys
|
|
79
|
+
.flatMap((key) => {
|
|
80
|
+
const shortcut = byKey.get(key);
|
|
81
|
+
return shortcut ? [shortcut] : [];
|
|
82
|
+
})
|
|
83
|
+
.slice(0, MAX_TOOLBAR_PINS);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** The list to save after promoting or demoting one pin.
|
|
87
|
+
*
|
|
88
|
+
* DEMOTING removes exactly the key the user unticked, and nothing else. PROMOTING appends, so a
|
|
89
|
+
* hand-ordered config is not reshuffled by ticking one more box. Neither ever drops a key that was
|
|
90
|
+
* not the subject of the click — see `MAX_STORED_TOOLBAR_PINS` for why that restraint is the whole
|
|
91
|
+
* design rather than an omission.
|
|
92
|
+
*
|
|
93
|
+
* `live` is what is pinned right now (`toolbarPinKey` of each favourite). It is read ONLY to count
|
|
94
|
+
* the promotions that can actually be drawn: a key whose pin is gone draws nothing, so counting it
|
|
95
|
+
* toward the five would fill the row with buttons that are not there and leave nothing to untick
|
|
96
|
+
* (Codex, PR #1991). Nothing is deleted on the strength of it, which is what makes a stale `live`
|
|
97
|
+
* harmless here — at worst the count is off by one until the next read.
|
|
98
|
+
*
|
|
99
|
+
* Returns the SAME array when nothing would change: already promoted, not promoted anyway, or a
|
|
100
|
+
* promotion refused because the row is full. */
|
|
101
|
+
export function nextToolbarPins(keys: readonly string[], live: readonly string[], key: string, promote: boolean): readonly string[] {
|
|
102
|
+
if (!promote) return keys.includes(key) ? keys.filter((entry) => entry !== key) : keys;
|
|
103
|
+
if (keys.includes(key)) return keys;
|
|
104
|
+
const drawn = keys.filter((entry) => live.includes(entry)).length;
|
|
105
|
+
if (drawn >= MAX_TOOLBAR_PINS || keys.length >= MAX_STORED_TOOLBAR_PINS) return keys;
|
|
106
|
+
return [...keys, key];
|
|
107
|
+
}
|