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.
Files changed (213) hide show
  1. package/README.md +16 -13
  2. package/bin/cli-args.js +2 -2
  3. package/common/dirPathKey.ts +19 -0
  4. package/common/shortcuts.ts +13 -0
  5. package/common/toolGroups.ts +5 -2
  6. package/common/toolbarPins.ts +107 -0
  7. package/dist/assets/AllPackages-CF2GkZ5g-BM2ZCqpM.js +2 -0
  8. package/dist/assets/BaseConfiguration-CAwZOAki-61HNB4KU.js +6 -0
  9. package/dist/assets/Element-BMI7Nj5w-jhgNonEG.js +1 -0
  10. package/dist/assets/{Entities-C8p_0jCn-Dw13tyTR.js → Entities-C8p_0jCn-uB3dgX2I.js} +1 -1
  11. package/dist/assets/FunctionList-YWk54TCy-i3alyZfA.js +1 -0
  12. package/dist/assets/{InputJax-C5dj-ntL-DBWzFhVU.js → InputJax-C5dj-ntL-Cz7UC3Uo.js} +1 -1
  13. package/dist/assets/{MathItem-YJvQL-XJ-DNYqBS01.js → MathItem-YJvQL-XJ-C1bORDtj.js} +1 -1
  14. package/dist/assets/{MmlFactory-DuXYIgx8-CWLIjjvy.js → MmlFactory-DuXYIgx8-Bif7yIsv.js} +1 -1
  15. package/dist/assets/Options-oARQeeuT-C50_lJqO.js +1 -0
  16. package/dist/assets/{OutputJax-DfUZNNCu-sgxDDWV-.js → OutputJax-DfUZNNCu-DE_RZgGD.js} +1 -1
  17. package/dist/assets/{PrioritizedList-6lun1Xqd-ykocRGXe.js → PrioritizedList-6lun1Xqd-C4vXSpxa.js} +1 -1
  18. package/dist/assets/Styles-BPXeoqzi-B0yxW5ro.js +1 -0
  19. package/dist/assets/{TeXAtom-LHT3KFWH-CNjc8vYz.js → TeXAtom-LHT3KFWH-sdnhniMs.js} +1 -1
  20. package/dist/assets/abnfDiagram-VCTEODGH-DoYNjdBB-DDU_ufuO.js +1 -0
  21. package/dist/assets/arc-CqByPKkF-DYCiP5i4.js +1 -0
  22. package/dist/assets/architecture-7GRP2DOG-CRS69XmP-BDFbpKIc.js +1 -0
  23. package/dist/assets/architectureDiagram-5GKGNRK7-BhcT6qS5-6joLXTpG.js +36 -0
  24. package/dist/assets/assistive-mml-DXJXho4o-DTTIy-v6.js +5 -0
  25. package/dist/assets/{blockDiagram-I7D4REHJ-1Cng0Q4K-DcIDSMg7.js → blockDiagram-I7D4REHJ-1Cng0Q4K-joPtLvDb.js} +3 -3
  26. package/dist/assets/c4Diagram-7LVT6UL2-CAb9c8nc-IQqW75OE.js +38 -0
  27. package/dist/assets/channel-BjESmYnj-4fT8Ljy3.js +1 -0
  28. package/dist/assets/{chunk-4HAMMTFA-ChwfIAnF-BV3UqcZo.js → chunk-4HAMMTFA-ChwfIAnF-COcrcqxY.js} +2 -2
  29. package/dist/assets/{chunk-75Z2AOVW-CbPA0Zt_-DP7076EE.js → chunk-75Z2AOVW-CbPA0Zt_-BF9bwhEX.js} +1 -1
  30. package/dist/assets/{chunk-DU6HZSFF-DuOx2LFX-B9i9yp2H.js → chunk-DU6HZSFF-DuOx2LFX-BT0kvgiW.js} +2 -2
  31. package/dist/assets/{chunk-F27PBJKO-CgBMw9yN-DheADmYc.js → chunk-F27PBJKO-CgBMw9yN-1FJUPFRX.js} +1 -1
  32. package/dist/assets/{chunk-GMAD6QVW-JTqlimUX-Bv32TXUx.js → chunk-GMAD6QVW-JTqlimUX-Bf8YP1up.js} +2 -2
  33. package/dist/assets/{chunk-GVQU2GXP-D6ccB4DO-94yHs3IY.js → chunk-GVQU2GXP-D6ccB4DO-BKIPWMRX.js} +1 -1
  34. package/dist/assets/{chunk-IMKFNOWR-ij1DSzMb-BqsuqPds.js → chunk-IMKFNOWR-ij1DSzMb-Ct1tQH8R.js} +1 -1
  35. package/dist/assets/{chunk-L3NEJ4N5-CUoAQVG2-DxJSvGS_.js → chunk-L3NEJ4N5-CUoAQVG2-DU3oJJeV.js} +1 -1
  36. package/dist/assets/chunk-OSK3NFVY-_VNbXQSu-CzWFtK18.js +10 -0
  37. package/dist/assets/{chunk-P2QGCYS3-B8lzOn3Y-CaFtW38P.js → chunk-P2QGCYS3-B8lzOn3Y-nhIUuhjm.js} +1 -1
  38. package/dist/assets/{chunk-POPQ4Y6H-Bh_uOTmp-D2RHBZ5s.js → chunk-POPQ4Y6H-Bh_uOTmp-BDpTYVeC.js} +1 -1
  39. package/dist/assets/{chunk-PWAF6VOD-DzjnfYSw-BJFV14F1.js → chunk-PWAF6VOD-DzjnfYSw-DKPY-7mP.js} +1 -1
  40. package/dist/assets/{chunk-SHT3W25Y-B8dQLS5w-Df12R7Gh.js → chunk-SHT3W25Y-B8dQLS5w-BOuFBdeA.js} +4 -4
  41. package/dist/assets/{chunk-SVP7TREG-B6A-T8Th-D6_Ichh1.js → chunk-SVP7TREG-B6A-T8Th-D0lLwfAu.js} +1 -1
  42. package/dist/assets/{chunk-TICWLB2K-C1kwD29l-DbGHkRkh.js → chunk-TICWLB2K-C1kwD29l-ClC085Mh.js} +2 -2
  43. package/dist/assets/{chunk-XXDRQBXY-vg0kfC73-aHwnHV68.js → chunk-XXDRQBXY-vg0kfC73-CQphc_9V.js} +1 -1
  44. package/dist/assets/classDiagram-ZZMXUADV-C7gP-pUH-CGYE0ALU.js +1 -0
  45. package/dist/assets/classDiagram-v2-VYDZK3BY-CUwV5k1F-CGYE0ALU.js +1 -0
  46. package/dist/assets/cose-bilkent-JH36ORCC-NuHCtE3P-Ctskoi14.js +1 -0
  47. package/dist/assets/cynefin-OW5HDTMX-C4iKivN4-Ck3MtWqY.js +1 -0
  48. package/dist/assets/cynefinDiagram-5FMLGOSQ-CA7sro34-B0HlDcFp.js +62 -0
  49. package/dist/assets/cytoscape.esm-DuKOKbur-Cp2HF8G-.js +321 -0
  50. package/dist/assets/dagre-B42rJlko-6iqQ6GWy.js +1 -0
  51. package/dist/assets/dagre-GXQ25YYZ-DOztjUR_-B9a9ItM-.js +4 -0
  52. package/dist/assets/{diagram-S7CK7UJ4-D_nsLfRT-DWr9WRW6.js → diagram-S7CK7UJ4-D_nsLfRT-BjeaPY2a.js} +3 -3
  53. package/dist/assets/diagram-UQ7AKVKN-DNN-YX9a-B7lns2-O.js +41 -0
  54. package/dist/assets/{diagram-VSXAHHWV--HENzo-l-DmNtXjHQ.js → diagram-VSXAHHWV--HENzo-l-CYS8QI0b.js} +1 -1
  55. package/dist/assets/diagram-VX7I27RA-m2m9dROj-Df30362U.js +24 -0
  56. package/dist/assets/diagram-Z3DM3KII-D4qpv4-B-DIRG03W8.js +24 -0
  57. package/dist/assets/{dist-DyY2Odgu.js → dist-BXSyA_TU.js} +1 -1
  58. package/dist/assets/dist-Ca5wsja_.js +11 -0
  59. package/dist/assets/{dist-FzB0wwv6.js → dist-Cz-H6Ed9.js} +1 -1
  60. package/dist/assets/{dist-CXRReMvS.js → dist-DQ0-6hCE.js} +1 -1
  61. package/dist/assets/dist-DYecIxGd.js +1 -0
  62. package/dist/assets/{dist-DeiyD9Ki-C1_gcVU2.js → dist-DeiyD9Ki-NpwH3Qk1.js} +1 -1
  63. package/dist/assets/dist-Dq9N76oy.js +1 -0
  64. package/dist/assets/dist-DyK-orJO.js +9 -0
  65. package/dist/assets/{dist-Lnp6Clqz.js → dist-J9wojbOY.js} +1 -1
  66. package/dist/assets/dist-nYE452Bv.js +2 -0
  67. package/dist/assets/dist-uJrW5fOA.js +11 -0
  68. package/dist/assets/ebnfDiagram-PWID7BFC-CAbv3sZg-CLaLnxQc.js +1 -0
  69. package/dist/assets/{erDiagram-RLTQ6QDP-a10Ryh0--C72i1ywY.js → erDiagram-RLTQ6QDP-a10Ryh0--CNmjy1Io.js} +2 -2
  70. package/dist/assets/eventmodeling-NTZA5JFV-DhqtNS8R-DND0wWFL.js +1 -0
  71. package/dist/assets/flowDiagram-HODETNUW-CAW_8mwY-B9sfp4B8.js +1 -0
  72. package/dist/assets/{ganttDiagram-EL5Y4UJY-Cb7leeOC-DYFiF709.js → ganttDiagram-EL5Y4UJY-Cb7leeOC-Bo_KYl5-.js} +1 -1
  73. package/dist/assets/gitGraph-4MIJSDKK-S_Zs6Nxs-BbhWwhsR.js +1 -0
  74. package/dist/assets/{gitGraphDiagram-WWUBYQGX-BCSbUpXG-DejyXZfK.js → gitGraphDiagram-WWUBYQGX-BCSbUpXG-B25LdXPq.js} +2 -2
  75. package/dist/assets/html-DdQiKDqM-CWXcuZKY.js +2 -0
  76. package/dist/assets/index-BQiJKXEe.js +5384 -0
  77. package/dist/assets/{index-C7OnGcwW.css → index-C1zBtRaC.css} +1 -1
  78. package/dist/assets/info-A6RAGUB7-4sGJh1is-BBy4DjBX.js +1 -0
  79. package/dist/assets/infoDiagram-27XIBGKW-BJRaZItN-CVeXTxkK.js +2 -0
  80. package/dist/assets/{ishikawaDiagram-5VMMS53U-DHlFe__S-CmJe5Tlt.js → ishikawaDiagram-5VMMS53U-DHlFe__S-s0Hksvvm.js} +2 -2
  81. package/dist/assets/{journeyDiagram-3NMN7TZE-BOIo3JM--Y8oQ4y77.js → journeyDiagram-3NMN7TZE-BOIo3JM--CUDKJOre.js} +2 -2
  82. package/dist/assets/{kanban-definition-UXKFOSKX-yrQdG683-CFIQzQvF.js → kanban-definition-UXKFOSKX-yrQdG683-Bu-56dzn.js} +5 -5
  83. package/dist/assets/{katex-DImtHWbS-DFcUm9x_.js → katex-DImtHWbS-ZlcWpGUi.js} +3 -3
  84. package/dist/assets/{lengths-CvmPfBid-BQ2m-oBM.js → lengths-CvmPfBid-DS9M1Zck.js} +1 -1
  85. package/dist/assets/{line-DUb1TjJS-C1or5HkU.js → line-DUb1TjJS-C6h_ukz1.js} +1 -1
  86. package/dist/assets/linear-xsuGWu5q-DCIuhl_K.js +1 -0
  87. package/dist/assets/liteAdaptor-C0FQiOEx-68b9WFkn.js +5 -0
  88. package/dist/assets/marp-DENGSRW0.js +3467 -0
  89. package/dist/assets/material-symbols-outlined-CQbRTMbb.woff2 +0 -0
  90. package/dist/assets/mathjax-DVEo4UYj-BeP6fXTI.js +1 -0
  91. package/dist/assets/{mermaid-parser.core-fkjeiYO7-Du7nNQKj.js → mermaid-parser.core-fkjeiYO7-BI7W6lAR.js} +20 -20
  92. package/dist/assets/mermaid.core-CZDx2Cyn-DunezLlE.js +44 -0
  93. package/dist/assets/{mindmap-definition-YA3MSWOX-BpKAVyqs-BjKrJvG3.js → mindmap-definition-YA3MSWOX-BpKAVyqs-DRRBWBS2.js} +1 -1
  94. package/dist/assets/mo-CrlNnGXX-DTWdNVwW.js +1 -0
  95. package/dist/assets/packet-AYTQ26CC-MQQyx8fI-BGwT-qpH.js +1 -0
  96. package/dist/assets/path-CciMXxPa-fybaL0A-.js +1 -0
  97. package/dist/assets/pegDiagram-XKGWAZYB-C7eG_Ohl-B2Ycq3J4.js +1 -0
  98. package/dist/assets/pie-WAS4IAKB-CyaL5i_d-BUM2aSuD.js +1 -0
  99. package/dist/assets/pieDiagram-E7YTZNPT-5f9wSfDR-D17gLilp.js +39 -0
  100. package/dist/assets/{quadrantDiagram-AXDQQJYC-mWeaOj5S-DS7mHc4o.js → quadrantDiagram-AXDQQJYC-mWeaOj5S-5l2e2-lu.js} +1 -1
  101. package/dist/assets/radar-RG4KPBEZ-DR-SsHDJ-B0abbdQP.js +1 -0
  102. package/dist/assets/railroad-74A4TZTK-C2gqsOGX-CGR3fOea.js +1 -0
  103. package/dist/assets/railroad-abnf-HS5TGJTU-Dpzw6P5u-bLa5M0Rd.js +1 -0
  104. package/dist/assets/railroad-ebnf-LZEXJU2U-J_BuIrPo-DD46tZ66.js +1 -0
  105. package/dist/assets/railroad-peg-WCYAUIDC-DzMStOR--CouNrg-J.js +1 -0
  106. package/dist/assets/railroadDiagram-O6MQD6OU-DJskhE7u-B7L40GB9.js +1 -0
  107. package/dist/assets/{requirementDiagram-BXWQKSXE-B5E0bU4h-CyS_2sxk.js → requirementDiagram-BXWQKSXE-B5E0bU4h-o05nW1Ur.js} +1 -1
  108. package/dist/assets/rolldown-runtime-B0Z9INg1.js +1 -0
  109. package/dist/assets/{rough.esm-CRiMXkOs-By172zw-.js → rough.esm-CRiMXkOs-Dy-Kn_BL.js} +1 -1
  110. package/dist/assets/{sankeyDiagram-P5KCCOFB-DS3AOTai-CSuBkdUO.js → sankeyDiagram-P5KCCOFB-DS3AOTai-CFeYTT2u.js} +1 -1
  111. package/dist/assets/{sequenceDiagram-WJ2MYXX4-Bn2L9osv-CHxEbZ0W.js → sequenceDiagram-WJ2MYXX4-Bn2L9osv-BGgRBUQD.js} +2 -2
  112. package/dist/assets/{src-CLC0ddSd-CjxPB3S7.js → src-CLC0ddSd-DeMngDQg.js} +1 -1
  113. package/dist/assets/stateDiagram-D77RDMKH-DbtoW7HL-D4l11dwx.js +1 -0
  114. package/dist/assets/stateDiagram-v2-MP3YSRHH-CX6RalKY-DOA8omDg.js +1 -0
  115. package/dist/assets/svg-CaHU_sxA-DGR0XOoK.js +8 -0
  116. package/dist/assets/swimlanes-42K2YHIH-90h8w_3B-BBRu6p3C.js +1 -0
  117. package/dist/assets/swimlanesDiagram-VR7AAH4N-49XH_TMr-DAJi7crp.js +8 -0
  118. package/dist/assets/tex-B1cONMvb-CWipwtJg.js +1 -0
  119. package/dist/assets/timeline-definition-24CTP7MA-Bx3KcICO-BEgprufy.js +120 -0
  120. package/dist/assets/treeView-Q6P3EWNA-gFs854Sn-B3zhZnF1.js +1 -0
  121. package/dist/assets/treemap-WGGIJYW6-DGh_szUA-BPTAC2rf.js +1 -0
  122. package/dist/assets/{vennDiagram-4TSXK5OY-DSexNe_H-B0-oluSn.js → vennDiagram-4TSXK5OY-DSexNe_H-CS1weuUo.js} +3 -3
  123. package/dist/assets/wardley-WFR3VGLG-BVLYL3gB-C2b5fV9M.js +1 -0
  124. package/dist/assets/{wardleyDiagram-VM6X3IG4-DesYYyZW-CIvLV4o_.js → wardleyDiagram-VM6X3IG4-DesYYyZW-B2Xol-7C.js} +36 -36
  125. package/dist/assets/{xychartDiagram-S5SC5T6Z-dIt6pHWV-C1D4f_2b.js → xychartDiagram-S5SC5T6Z-dIt6pHWV-Ba2mmvhL.js} +3 -3
  126. package/dist/index.html +4 -3
  127. package/package.json +16 -15
  128. package/plugins/plugins.json +2 -1
  129. package/server/agents/antigravity-usage.ts +1 -1
  130. package/server/backends/mulmoscript.spec.ts +188 -0
  131. package/server/backends/mulmoscript.ts +172 -12
  132. package/server/backends/openPath.ts +11 -0
  133. package/server/backends/shortcuts.ts +47 -16
  134. package/server/campaign/campaign-store.ts +1 -1
  135. package/server/config/app-config.ts +10 -0
  136. package/server/config/config-body.ts +1 -0
  137. package/server/index.ts +4 -1
  138. package/server/session/output-relay.ts +7 -0
  139. package/server/session/pty-connection.ts +6 -3
  140. package/server/session/terminal-mode-tracker.ts +114 -0
  141. package/server/session/types.ts +4 -0
  142. package/server/skills/mulmoterminal-config/SKILL.md +29 -1
  143. package/dist/assets/AllPackages-CF2GkZ5g-BUkwHhnA.js +0 -2
  144. package/dist/assets/BaseConfiguration-CAwZOAki-sAOejtXv.js +0 -6
  145. package/dist/assets/Element-BMI7Nj5w-CtzS4V48.js +0 -1
  146. package/dist/assets/FunctionList-YWk54TCy-CsA_edRr.js +0 -1
  147. package/dist/assets/Options-oARQeeuT-CU8UddjX.js +0 -1
  148. package/dist/assets/Styles-BPXeoqzi-DSzGxEMs.js +0 -1
  149. package/dist/assets/abnfDiagram-VCTEODGH-DoYNjdBB-CBWKmDCi.js +0 -1
  150. package/dist/assets/arc-CqByPKkF-88IlSEMD.js +0 -1
  151. package/dist/assets/architecture-7GRP2DOG-CRS69XmP-CfEYhnsg.js +0 -1
  152. package/dist/assets/architectureDiagram-5GKGNRK7-BhcT6qS5-BLtGEqlp.js +0 -36
  153. package/dist/assets/assistive-mml-DXJXho4o-DzIDEOlP.js +0 -5
  154. package/dist/assets/c4Diagram-7LVT6UL2-CAb9c8nc-C7a_Eswh.js +0 -38
  155. package/dist/assets/channel-BjESmYnj-m72KoOEU.js +0 -1
  156. package/dist/assets/chunk-2E4U76K2-CMyNbRyJ-uuFlgwng.js +0 -2
  157. package/dist/assets/chunk-CLGD4ZFX-CVw8XHcp-CLPfrpnT.js +0 -1
  158. package/dist/assets/chunk-LNGE3PJU-DhBy-8ZR-CBXc5vOK.js +0 -34
  159. package/dist/assets/chunk-OSK3NFVY-_VNbXQSu-Ccnx0KHf.js +0 -10
  160. package/dist/assets/chunk-TLUHSLCS-DYzGlCmi-CJdhEIVL.js +0 -2
  161. package/dist/assets/classDiagram-ZZMXUADV-C7gP-pUH-DLDPmUSl.js +0 -1
  162. package/dist/assets/classDiagram-v2-VYDZK3BY-CUwV5k1F-DLDPmUSl.js +0 -1
  163. package/dist/assets/cose-bilkent-JH36ORCC-NuHCtE3P-CArrWVtM.js +0 -1
  164. package/dist/assets/cynefin-OW5HDTMX-C4iKivN4-BQEcGeGg.js +0 -1
  165. package/dist/assets/cynefinDiagram-5FMLGOSQ-CA7sro34-BzZQpKl2.js +0 -62
  166. package/dist/assets/cytoscape.esm-DuKOKbur-CaSq5b0a.js +0 -321
  167. package/dist/assets/dagre-B42rJlko-DO9SsX8n.js +0 -1
  168. package/dist/assets/dagre-GXQ25YYZ-DOztjUR_-DOx-551u.js +0 -4
  169. package/dist/assets/diagram-UQ7AKVKN-DNN-YX9a-C9TXc-ah.js +0 -41
  170. package/dist/assets/diagram-VX7I27RA-m2m9dROj-Cq6wReC4.js +0 -24
  171. package/dist/assets/diagram-Z3DM3KII-D4qpv4-B-DtXyJB7G.js +0 -24
  172. package/dist/assets/dist-BQPlJ9lU.js +0 -9
  173. package/dist/assets/dist-Ci7pnEU6.js +0 -11
  174. package/dist/assets/dist-DOVOmrou.js +0 -11
  175. package/dist/assets/dist-DtF92Clz.js +0 -2
  176. package/dist/assets/dist-TlhJ1D4x.js +0 -1
  177. package/dist/assets/dist-berHSMWa.js +0 -1
  178. package/dist/assets/ebnfDiagram-PWID7BFC-CAbv3sZg-BbjG8-uo.js +0 -1
  179. package/dist/assets/eventmodeling-NTZA5JFV-DhqtNS8R-BK1N0_ZM.js +0 -1
  180. package/dist/assets/flowDiagram-HODETNUW-CAW_8mwY-B3-stLUn.js +0 -1
  181. package/dist/assets/gitGraph-4MIJSDKK-S_Zs6Nxs-BRRPIfYV.js +0 -1
  182. package/dist/assets/html-DdQiKDqM-CPke18TU.js +0 -2
  183. package/dist/assets/index-Z2OTrqqI.js +0 -1051
  184. package/dist/assets/info-A6RAGUB7-4sGJh1is-fp_xBD4Z.js +0 -1
  185. package/dist/assets/infoDiagram-27XIBGKW-BJRaZItN-DnsdjhkP.js +0 -2
  186. package/dist/assets/linear-xsuGWu5q-DO1NVk1F.js +0 -1
  187. package/dist/assets/liteAdaptor-C0FQiOEx-rHhNCala.js +0 -5
  188. package/dist/assets/marp-246Tptqb.js +0 -3467
  189. package/dist/assets/material-symbols-outlined-Bz-4pmf0.woff2 +0 -0
  190. package/dist/assets/mathjax-DVEo4UYj-BKhDfB9b.js +0 -1
  191. package/dist/assets/mermaid.core-CZDx2Cyn-B8TG9ViQ.js +0 -11
  192. package/dist/assets/mo-CrlNnGXX-DG8Vectz.js +0 -1
  193. package/dist/assets/packet-AYTQ26CC-MQQyx8fI-jr1o6-sN.js +0 -1
  194. package/dist/assets/path-CciMXxPa-COt_16Va.js +0 -1
  195. package/dist/assets/pegDiagram-XKGWAZYB-C7eG_Ohl-BhWdbn0k.js +0 -1
  196. package/dist/assets/pie-WAS4IAKB-CyaL5i_d-Bu147U5x.js +0 -1
  197. package/dist/assets/pieDiagram-E7YTZNPT-5f9wSfDR-Lecay4e9.js +0 -39
  198. package/dist/assets/radar-RG4KPBEZ-DR-SsHDJ-CN5skCMU.js +0 -1
  199. package/dist/assets/railroad-74A4TZTK-C2gqsOGX-aDdh8kqg.js +0 -1
  200. package/dist/assets/railroad-abnf-HS5TGJTU-Dpzw6P5u-RpiXuxqp.js +0 -1
  201. package/dist/assets/railroad-ebnf-LZEXJU2U-J_BuIrPo-C0a1HZjw.js +0 -1
  202. package/dist/assets/railroad-peg-WCYAUIDC-DzMStOR--DYIIa1Hw.js +0 -1
  203. package/dist/assets/railroadDiagram-O6MQD6OU-DJskhE7u-Dmh0-Us2.js +0 -1
  204. package/dist/assets/stateDiagram-D77RDMKH-DbtoW7HL-yabfmTgk.js +0 -1
  205. package/dist/assets/stateDiagram-v2-MP3YSRHH-CX6RalKY-GzlXJtMT.js +0 -1
  206. package/dist/assets/svg-CaHU_sxA-D8CRwYZQ.js +0 -8
  207. package/dist/assets/swimlanes-42K2YHIH-90h8w_3B-lAgM4Z9o.js +0 -1
  208. package/dist/assets/swimlanesDiagram-VR7AAH4N-49XH_TMr-4AicWyJt.js +0 -8
  209. package/dist/assets/tex-B1cONMvb-DydoaQyY.js +0 -1
  210. package/dist/assets/timeline-definition-24CTP7MA-Bx3KcICO-BH12S7gs.js +0 -120
  211. package/dist/assets/treeView-Q6P3EWNA-gFs854Sn-aY6owIcz.js +0 -1
  212. package/dist/assets/treemap-WGGIJYW6-DGh_szUA-YLwoYd-l.js +0 -1
  213. 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.9** and the [`claude`](https://claude.com/claude-code) CLI on your
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 **in Japanese** on X —
248
- 新バージョンや新機能のお知らせは X の
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.9**, plus these CLIs on your `PATH`:
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.9
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.9** (uses `node --env-file-if-exists`) and the `claude` CLI on `PATH`.
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:** in any directory MulmoTerminal knows about — the workspace it
1086
- was started in, plus the directories in your launcher's saved list (up to 64 in total, and one that
1087
- is no longer on disk is skipped). Those are read **once at startup**, so a repository you open for
1088
- the first time needs a restart before its decks can be shown. Any deck you can see in the file tree is also reachable there — right-click a row and choose
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 in Japanese on X: [@SingularitySoci](https://x.com/SingularitySoci)
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 = 9;
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.9.0-nightly…"). Only major.minor gate, and Number.parseInt stops at the
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.
@@ -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
+ };
@@ -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). */
@@ -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 three below save an artifact and draw it, and call nothing external.
179
- export const AUTO_ALLOWED_TOOLS: readonly string[] = ["presentForm", "presentChart", "presentHtml"];
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
+ }