mulmoterminal 9.6.0 → 9.8.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 (219) hide show
  1. package/README.md +10 -3
  2. package/common/bundledSkills.ts +1 -0
  3. package/common/tmuxPrefix.ts +57 -0
  4. package/dist/assets/AllPackages-Dds4n8dW.js +2 -0
  5. package/dist/assets/{BaseConfiguration-B2CXnQzR.js → BaseConfiguration-CKTSCpgr.js} +1 -1
  6. package/dist/assets/{MmlFactory-CS1192-w.js → MmlFactory-DxipJZmz.js} +1 -1
  7. package/dist/assets/{TeXAtom-DgP9aXCP.js → TeXAtom-CB1NRlRO.js} +1 -1
  8. package/dist/assets/{abnfDiagram-YUKMZFIV-hhgBEMEq.js → abnfDiagram-YUKMZFIV-zyG-UwYd.js} +1 -1
  9. package/dist/assets/architecture-WOLXFQ4H-BwusCnuP.js +1 -0
  10. package/dist/assets/architectureDiagram-47P4ROYG-D7YcR9bo.js +36 -0
  11. package/dist/assets/{assistive-mml-fKzX6oTc.js → assistive-mml-DdYOICTM.js} +1 -1
  12. package/dist/assets/{blockDiagram-E7TT5TSB-DzJI6I2Q.js → blockDiagram-E7TT5TSB-BtcdxO-7.js} +2 -2
  13. package/dist/assets/{c4Diagram-CRA5TL53-CtJiRJPi.js → c4Diagram-CRA5TL53-B43k6MD-.js} +1 -1
  14. package/dist/assets/channel-DDSLBPGW.js +1 -0
  15. package/dist/assets/{chunk-2BW5OAIV-DTyc1chr.js → chunk-2BW5OAIV-BikeK-tv.js} +1 -1
  16. package/dist/assets/{chunk-3YJQHVM4-SZZtBSbB.js → chunk-3YJQHVM4-n_iFO7n9.js} +1 -1
  17. package/dist/assets/{chunk-4EA7E6EY-Dnh5IiDB.js → chunk-4EA7E6EY-Bpd0X581.js} +1 -1
  18. package/dist/assets/{chunk-7TKQ45FW-xY5f-VkB.js → chunk-7TKQ45FW-RYNhINxL.js} +1 -1
  19. package/dist/assets/{chunk-AW2ZBBNX-CzNEI48Y.js → chunk-AW2ZBBNX-B0kfmjxC.js} +1 -1
  20. package/dist/assets/{chunk-DBDB3WZW-CBaVRp3n.js → chunk-DBDB3WZW-w_bcBN1W.js} +1 -1
  21. package/dist/assets/{chunk-E2ZNV5FY-D_ZloHYl.js → chunk-E2ZNV5FY-X_CIqRj0.js} +6 -6
  22. package/dist/assets/{chunk-EU5HNXII-CM48kCcn.js → chunk-EU5HNXII-Cfa4b4Ay.js} +1 -1
  23. package/dist/assets/chunk-FVRAUYC3-XlrFmQ3o.js +2 -0
  24. package/dist/assets/{chunk-HJ2JQQFS-CDIS57pJ.js → chunk-HJ2JQQFS-E2ACvaz_.js} +1 -1
  25. package/dist/assets/{chunk-HTAEGDNF-DJINU5Vm.js → chunk-HTAEGDNF-DTs2QEx8.js} +1 -1
  26. package/dist/assets/{chunk-KQW6MTUR-DPMQ4ZII.js → chunk-KQW6MTUR-X8wNtPpU.js} +1 -1
  27. package/dist/assets/{chunk-NGNAAXSQ-DqoPQk1a.js → chunk-NGNAAXSQ-C2Wy9Xmz.js} +5 -5
  28. package/dist/assets/{chunk-NTY3LDVX-ABBLvDpj.js → chunk-NTY3LDVX-ORfE1UBr.js} +1 -1
  29. package/dist/assets/{chunk-VPRB5NB3-zipI-qki.js → chunk-VPRB5NB3-D5XLjvK4.js} +2 -2
  30. package/dist/assets/{chunk-XC4XBNZT-BjwIS2jF.js → chunk-XC4XBNZT-BvGzBZPH.js} +1 -1
  31. package/dist/assets/{chunk-XXDRQBXY-CazVBYiP.js → chunk-XXDRQBXY-Bmekemjm.js} +1 -1
  32. package/dist/assets/{classDiagram-v2-K4WV4PDN-Bv6BEoz9.js → classDiagram-v2-K4WV4PDN-BE-qvlHc.js} +1 -1
  33. package/dist/assets/cose-bilkent-JH36ORCC-Cfd1CIvE.js +1 -0
  34. package/dist/assets/cynefin-EF2NZ3EQ-BKBTwgXe.js +1 -0
  35. package/dist/assets/{cynefinDiagram-3GCD6N5R-DmyRL1jR.js → cynefinDiagram-3GCD6N5R-CKCyyusT.js} +1 -1
  36. package/dist/assets/cytoscape.esm-CHBj4VkZ.js +321 -0
  37. package/dist/assets/dagre-W4DXFKR2-CrvQCcNs.js +4 -0
  38. package/dist/assets/diagram-2UJZ2QOL-BfuvyxKl.js +200 -0
  39. package/dist/assets/{diagram-OVF4WLC6-CrmIKNJ_.js → diagram-OVF4WLC6-BlsFqIDA.js} +1 -1
  40. package/dist/assets/{diagram-PFPMY2P6-Cz4VhlvF.js → diagram-PFPMY2P6-KMg4O3dg.js} +2 -2
  41. package/dist/assets/{diagram-UMYRVEAY-C0_OEd0T.js → diagram-UMYRVEAY-BSv1unB1.js} +1 -1
  42. package/dist/assets/{diagram-YEKJPTXX-BhLd9EOW.js → diagram-YEKJPTXX-B7WTTWbt.js} +1 -1
  43. package/dist/assets/{diagram-ZIFT7M5P-tdbeX1GX.js → diagram-ZIFT7M5P-C8dZN40w.js} +1 -1
  44. package/dist/assets/{dist-B-lTjmBE.js → dist-BCaA294_.js} +1 -1
  45. package/dist/assets/{dist-CPuq5mCf.js → dist-BHJqrW0Q.js} +3 -3
  46. package/dist/assets/{dist--M5nyOuA.js → dist-BNEKXPjn.js} +1 -1
  47. package/dist/assets/dist-Blg44tSN.js +1 -0
  48. package/dist/assets/{dist-N2Vfmi62.js → dist-Bu2N1hwl.js} +1 -1
  49. package/dist/assets/{dist-E8f8sfaM.js → dist-CCniXtSX.js} +1 -1
  50. package/dist/assets/{dist-Z8kzHarM.js → dist-Coh8tZT6.js} +1 -1
  51. package/dist/assets/{dist-BV1OoWUP.js → dist-DNrC7Sfg.js} +1 -1
  52. package/dist/assets/{dist-CsojzGtC.js → dist-DlwkuoPy.js} +15 -15
  53. package/dist/assets/{dist-CQ6YfKVL.js → dist-Dwj1SmJg.js} +1 -1
  54. package/dist/assets/{dist-B-mUmtv8.js → dist-TOtPnL7E.js} +1 -1
  55. package/dist/assets/{ebnfDiagram-VR2GEFS7-D36sVn6o.js → ebnfDiagram-VR2GEFS7-BbxerigQ.js} +1 -1
  56. package/dist/assets/elk-IJKZMXRS-ChPwdCGe.js +27 -0
  57. package/dist/assets/{erDiagram-O2IAPWRE-CaVPyGk3.js → erDiagram-O2IAPWRE-CigEy4yu.js} +1 -1
  58. package/dist/assets/eventmodeling-K75KTNOO-B32Bu2sN.js +1 -0
  59. package/dist/assets/flowDiagram-OXPTDLAJ-nRr_qH4E.js +1 -0
  60. package/dist/assets/{ganttDiagram-R7TSEDQI-B_qO4Nhi.js → ganttDiagram-R7TSEDQI-dwflw4hr.js} +2 -2
  61. package/dist/assets/gitGraph-VSP46ZUC-BYvcplIB.js +1 -0
  62. package/dist/assets/{gitGraphDiagram-XJZIOB7I-DeiAOFyP.js → gitGraphDiagram-XJZIOB7I-NaChIo_6.js} +1 -1
  63. package/dist/assets/{html-D1d6cXUq.js → html-acscMdrT.js} +1 -1
  64. package/dist/assets/index-CPITW2xe.css +1 -0
  65. package/dist/assets/{index-DrkgQTL9.js → index-Ih0Hpbd3.js} +345 -345
  66. package/dist/assets/info-OHQRW6UA-Bo-6QiYF.js +1 -0
  67. package/dist/assets/{infoDiagram-5W2HQ5XZ-DBdrFN9s.js → infoDiagram-5W2HQ5XZ-CcFB0zb6.js} +1 -1
  68. package/dist/assets/{ishikawaDiagram-K3B6WC7H-DFmkMZqA.js → ishikawaDiagram-K3B6WC7H-wFxp7r4t.js} +2 -2
  69. package/dist/assets/{journeyDiagram-COXZFDF6-F8WZ7LhG.js → journeyDiagram-COXZFDF6-BbgSfrK1.js} +1 -1
  70. package/dist/assets/{kanban-definition-P3RFRI5V-D69TK8UM.js → kanban-definition-P3RFRI5V-tYnV1hcm.js} +1 -1
  71. package/dist/assets/{katex-ZlcWpGUi.js → katex-DJhrJSbw.js} +1 -1
  72. package/dist/assets/{line-C3UxcAKj.js → line-688aaVUi.js} +1 -1
  73. package/dist/assets/{linear-Mfk4bOQu.js → linear-BRoUytvd.js} +1 -1
  74. package/dist/assets/manifold-DOZl2Db1.js +2 -0
  75. package/dist/assets/{marp-Cg8ZzZOC.js → marp-BantkFXR.js} +15 -15
  76. package/dist/assets/material-symbols-outlined-CbWsDl0D.woff2 +0 -0
  77. package/dist/assets/mermaid-parser.core-DiToV0T2.js +7 -0
  78. package/dist/assets/{mermaid.core-xdDqFngm.js → mermaid.core-sfP_Moc8.js} +7 -7
  79. package/dist/assets/{mindmap-definition-LZFPQGKD-D0XqFq8l.js → mindmap-definition-LZFPQGKD-CUmLGDDU.js} +1 -1
  80. package/dist/assets/packet-JDAUHWVQ-BktXnTxs.js +1 -0
  81. package/dist/assets/{pegDiagram-BGZESJAR-CYX1PF0A.js → pegDiagram-BGZESJAR-DBJaifuJ.js} +1 -1
  82. package/dist/assets/pie-XZMESJXO-MURsT4zt.js +1 -0
  83. package/dist/assets/{pieDiagram-CAPJLFHJ-CHInvczR.js → pieDiagram-CAPJLFHJ-KBFNH84K.js} +1 -1
  84. package/dist/assets/{quadrantDiagram-GDMTTRAM-DTNouAH7.js → quadrantDiagram-GDMTTRAM-aDafcz0K.js} +1 -1
  85. package/dist/assets/radar-ABXABTNO-XGaGSfaF.js +1 -0
  86. package/dist/assets/railroad-I3PHUGI6-Bd6qibct.js +1 -0
  87. package/dist/assets/railroad-abnf-LNEFI6M7-DkNaL9yO.js +1 -0
  88. package/dist/assets/railroad-ebnf-DWYD2UWJ-DvmAcd2K.js +1 -0
  89. package/dist/assets/railroad-peg-JR7BVNR7-DWuSf601.js +1 -0
  90. package/dist/assets/{railroadDiagram-SM67HX2B-C3VcwA1y.js → railroadDiagram-SM67HX2B-B8HY7NzY.js} +1 -1
  91. package/dist/assets/{requirementDiagram-X7JNWC4A-BEJRea8N.js → requirementDiagram-X7JNWC4A-BBGNhdvl.js} +1 -1
  92. package/dist/assets/{sankeyDiagram-UM26HJRW-BfuAg96e.js → sankeyDiagram-UM26HJRW-B4-2hhw-.js} +1 -1
  93. package/dist/assets/{sequenceDiagram-ZO4K6R2Y-CC6kNJnO.js → sequenceDiagram-ZO4K6R2Y-CAY2xE1t.js} +1 -1
  94. package/dist/assets/src-JH1jZ6Eh.js +1 -0
  95. package/dist/assets/{stateDiagram-v2-TBUQTH76-CLmvvBWT.js → stateDiagram-v2-TBUQTH76-D5m-VWbn.js} +1 -1
  96. package/dist/assets/svg-C5MLNO6c.js +8 -0
  97. package/dist/assets/swimlanes-N4OXWK64-DmIZnn74.js +1 -0
  98. package/dist/assets/swimlanesDiagram-K3J5GTZL-kvijIHBW.js +8 -0
  99. package/dist/assets/{tex-bGJAXLWL.js → tex-BY05D_Xr.js} +1 -1
  100. package/dist/assets/{timeline-definition-YOQAKGHF-B0y0Ek2u.js → timeline-definition-YOQAKGHF-Cjl0wxDv.js} +1 -1
  101. package/dist/assets/treeView-D4JQ5SDB-D7Z4S83c.js +1 -0
  102. package/dist/assets/treemap-SAJKECNS-C4cCpscM.js +1 -0
  103. package/dist/assets/{usecaseDiagram-VIAY4XPW-CSx_2lRT.js → usecaseDiagram-VIAY4XPW-DirA4YUo.js} +6 -6
  104. package/dist/assets/{vennDiagram-BLWOH2XV-BLdAnXCX.js → vennDiagram-BLWOH2XV-Ci5neqkK.js} +1 -1
  105. package/dist/assets/wardley-7MLQ67FV-Civq_iI8.js +1 -0
  106. package/dist/assets/{wardleyDiagram-YMQ3BMBF-C7OyXDn4.js → wardleyDiagram-YMQ3BMBF-BrfWXnX6.js} +1 -1
  107. package/dist/assets/{xychartDiagram-TAQBALBS-CxRLvuvo.js → xychartDiagram-TAQBALBS-HRI4eeDt.js} +1 -1
  108. package/dist/index.html +3 -3
  109. package/docs/ChangeLog.md +8785 -0
  110. package/docs/facts.json +66 -0
  111. package/docs/guide/en/accounts.md +138 -0
  112. package/docs/guide/en/agents.md +252 -0
  113. package/docs/guide/en/alternatives.md +175 -0
  114. package/docs/guide/en/basics.md +377 -0
  115. package/docs/guide/en/blueprints.md +188 -0
  116. package/docs/guide/en/claude-ollama.md +75 -0
  117. package/docs/guide/en/config.md +2376 -0
  118. package/docs/guide/en/conversation.md +271 -0
  119. package/docs/guide/en/faq.md +285 -0
  120. package/docs/guide/en/feature-list.md +411 -0
  121. package/docs/guide/en/features.md +257 -0
  122. package/docs/guide/en/from-collection.md +263 -0
  123. package/docs/guide/en/getting-started.md +440 -0
  124. package/docs/guide/en/github.md +176 -0
  125. package/docs/guide/en/glossary.md +134 -0
  126. package/docs/guide/en/header-reference.md +359 -0
  127. package/docs/guide/en/header.md +322 -0
  128. package/docs/guide/en/index.md +293 -0
  129. package/docs/guide/en/mulmocast.md +154 -0
  130. package/docs/guide/en/notifications.md +148 -0
  131. package/docs/guide/en/phone.md +127 -0
  132. package/docs/guide/en/providers.md +384 -0
  133. package/docs/guide/en/remote.md +168 -0
  134. package/docs/guide/en/scenarios.md +116 -0
  135. package/docs/guide/en/shared-apps.md +551 -0
  136. package/docs/guide/en/token-rotation.md +165 -0
  137. package/docs/guide/en/v9.6.0.md +2 -0
  138. package/docs/guide/en/v9.7.0.md +58 -0
  139. package/docs/guide/en/v9.8.0.md +77 -0
  140. package/docs/guide/en/worktree.md +161 -0
  141. package/docs/guide/ja/accounts.md +106 -0
  142. package/docs/guide/ja/agents.md +247 -0
  143. package/docs/guide/ja/alternatives.md +157 -0
  144. package/docs/guide/ja/basics.md +364 -0
  145. package/docs/guide/ja/blueprints.md +186 -0
  146. package/docs/guide/ja/claude-ollama.md +57 -0
  147. package/docs/guide/ja/config.md +2250 -0
  148. package/docs/guide/ja/conversation.md +264 -0
  149. package/docs/guide/ja/faq.md +281 -0
  150. package/docs/guide/ja/feature-list.md +410 -0
  151. package/docs/guide/ja/features.md +224 -0
  152. package/docs/guide/ja/from-collection.md +263 -0
  153. package/docs/guide/ja/getting-started.md +442 -0
  154. package/docs/guide/ja/github.md +171 -0
  155. package/docs/guide/ja/glossary.md +135 -0
  156. package/docs/guide/ja/header-reference.md +352 -0
  157. package/docs/guide/ja/header.md +310 -0
  158. package/docs/guide/ja/index.md +318 -0
  159. package/docs/guide/ja/mulmocast.md +143 -0
  160. package/docs/guide/ja/notifications.md +137 -0
  161. package/docs/guide/ja/phone.md +120 -0
  162. package/docs/guide/ja/providers.md +376 -0
  163. package/docs/guide/ja/remote.md +163 -0
  164. package/docs/guide/ja/scenarios.md +111 -0
  165. package/docs/guide/ja/shared-apps.md +485 -0
  166. package/docs/guide/ja/token-rotation.md +155 -0
  167. package/docs/guide/ja/v9.6.0.md +2 -0
  168. package/docs/guide/ja/v9.7.0.md +55 -0
  169. package/docs/guide/ja/v9.8.0.md +71 -0
  170. package/docs/guide/ja/worktree.md +162 -0
  171. package/package.json +19 -17
  172. package/server/agents/rate-limit/account-rate-limits.ts +7 -1
  173. package/server/backends/files/openPath.ts +11 -0
  174. package/server/backends/files/presentPathRoot.ts +4 -0
  175. package/server/config/app-config.ts +7 -0
  176. package/server/config/config-routes.ts +5 -0
  177. package/server/help/help-sources.ts +59 -0
  178. package/server/help/routes.ts +24 -0
  179. package/server/infra/process/tmux.ts +19 -2
  180. package/server/infra/tools/plugins-registry.ts +3 -1
  181. package/server/routes/app-routes.ts +4 -0
  182. package/server/routes/ws-accept.ts +53 -0
  183. package/server/routes/ws-routes.ts +66 -87
  184. package/server/skills/mulmoterminal-help/SKILL.md +148 -0
  185. package/server/skills/mulmoterminal-keys/SKILL.md +23 -1
  186. package/dist/assets/AllPackages-BXiJ1WCv.js +0 -2
  187. package/dist/assets/architecture-WOLXFQ4H-C2eqTYis.js +0 -1
  188. package/dist/assets/architectureDiagram-47P4ROYG-FsL1segb.js +0 -36
  189. package/dist/assets/channel-BEijHRv-.js +0 -1
  190. package/dist/assets/chunk-FVRAUYC3-Cd0tkmQC.js +0 -2
  191. package/dist/assets/cose-bilkent-JH36ORCC-DRDvm6RQ.js +0 -1
  192. package/dist/assets/cynefin-EF2NZ3EQ-jj2DUfug.js +0 -1
  193. package/dist/assets/cytoscape.esm-Yq6u8L66.js +0 -321
  194. package/dist/assets/dagre-W4DXFKR2--qRyrnSG.js +0 -4
  195. package/dist/assets/diagram-2UJZ2QOL--Am2W9eP.js +0 -200
  196. package/dist/assets/dist-CYrIpcYc.js +0 -1
  197. package/dist/assets/elk-IJKZMXRS-Db-K1ezK.js +0 -27
  198. package/dist/assets/eventmodeling-K75KTNOO-DYuYDxxo.js +0 -1
  199. package/dist/assets/flowDiagram-OXPTDLAJ-B4CYTSfJ.js +0 -1
  200. package/dist/assets/gitGraph-VSP46ZUC-DXO4HvcW.js +0 -1
  201. package/dist/assets/index-BHPjYPj5.css +0 -1
  202. package/dist/assets/info-OHQRW6UA-W0rraMdj.js +0 -1
  203. package/dist/assets/manifold-C4_OD6jf.js +0 -2
  204. package/dist/assets/material-symbols-outlined-DJ9Z1fAF.woff2 +0 -0
  205. package/dist/assets/mermaid-parser.core-D9bG0VLG.js +0 -7
  206. package/dist/assets/packet-JDAUHWVQ-xlLarQgj.js +0 -1
  207. package/dist/assets/pie-XZMESJXO-4GeXkqd6.js +0 -1
  208. package/dist/assets/radar-ABXABTNO-Ccdu3jGM.js +0 -1
  209. package/dist/assets/railroad-I3PHUGI6-nD7Lif0z.js +0 -1
  210. package/dist/assets/railroad-abnf-LNEFI6M7-CUhu0O-Q.js +0 -1
  211. package/dist/assets/railroad-ebnf-DWYD2UWJ-DtcWz2W3.js +0 -1
  212. package/dist/assets/railroad-peg-JR7BVNR7-uhtRt6Pv.js +0 -1
  213. package/dist/assets/src-CllyRBe0.js +0 -1
  214. package/dist/assets/svg-D4axFevj.js +0 -8
  215. package/dist/assets/swimlanes-N4OXWK64-BTH3MSUE.js +0 -1
  216. package/dist/assets/swimlanesDiagram-K3J5GTZL-mPXto8oK.js +0 -8
  217. package/dist/assets/treeView-D4JQ5SDB-Cy-ron95.js +0 -1
  218. package/dist/assets/treemap-SAJKECNS-nOFGvES9.js +0 -1
  219. package/dist/assets/wardley-7MLQ67FV-BBijlArL.js +0 -1
package/README.md CHANGED
@@ -384,6 +384,12 @@ The launcher detects it and prints the exact, OS-appropriate removal command; ru
384
384
  > masked. Getting you unstuck is the goal; an issue is what is left when the first three steps
385
385
  > fail.
386
386
 
387
+ > **Have a question instead?** Press the **help** icon in the toolbar (next to the gear), or type
388
+ > `/mulmoterminal-help` in any session. The bundled skill answers questions about MulmoTerminal — what
389
+ > it can do, how a feature or a part of the screen works, how to set something up, what is new in
390
+ > your version and in the latest one — from the shipped guide, changelog and source, and names where
391
+ > each fact was checked. It changes nothing.
392
+
387
393
  ---
388
394
 
389
395
  ## Contents
@@ -752,7 +758,7 @@ the `claude` / `codex` sessions themselves.
752
758
  | `MULMOTERMINAL_HOME` | `~/.mulmoterminal` | Root for managed **git worktrees**. |
753
759
  | `CLAUDE_CONFIG_DIR` | `~/.claude` | Claude Code's own config directory. MulmoTerminal reads Claude's transcripts (`projects/`), prompt history (`history.jsonl`) and user skills (`skills/`) from it, and `.claude.json` from **inside** it (unset: `~/.claude.json`), which is how the per-project GUI MCP registration is checked (`server/session/project-dir.ts`). Set it in the environment MulmoTerminal starts from, so it matches the one Claude runs under. |
754
760
  | `MULMOCLAUDE_WORKSPACE_PATH` | `~/mulmoclaude` | Where the managed MulmoClaude workspace lives. MulmoTerminal seeds presets/helps **only** into this directory, so launching in an arbitrary project never writes them there (`server/backends/workspaceSetup.ts`), and it is what decides where MulmoTerminal's own runtime state goes — see the note under the table. Set it to the same value MulmoClaude uses. |
755
- | `MULMOTERMINAL_NO_SKILL_INSTALL` | unset | Set to any value to skip installing the bundled skills (`mulmoterminal-config` and the `-dirs` / `-theme` / `-header` / `-keys` / `-model` / `-notify` / `-bug-report` / `-decisions` family) into Claude's skills root (`~/.claude/skills/`, and `$CLAUDE_CONFIG_DIR/skills/` as well when that is set) and the Codex skills root on startup. |
761
+ | `MULMOTERMINAL_NO_SKILL_INSTALL` | unset | Set to any value to skip installing the bundled skills (`mulmoterminal-config` and the `-dirs` / `-theme` / `-header` / `-keys` / `-model` / `-notify` / `-bug-report` / `-decisions` / `-help` family) into Claude's skills root (`~/.claude/skills/`, and `$CLAUDE_CONFIG_DIR/skills/` as well when that is set) and the Codex skills root on startup. |
756
762
  | `GEMINI_IMAGE_MODEL` | `gemini-3.1-flash-image-preview` | Model used for image generation (needs `GEMINI_API_KEY`). The default is a **preview** model Google schedules for retirement around mid-2026, so pin a stable one here (e.g. `gemini-2.5-flash-image`) rather than waiting for a code change. |
757
763
  | `WAIT_REAP_GRACE_MS` | `1800000` | How long a **waiting** background session is kept before it's auto-reaped (`0` or negative = never). |
758
764
 
@@ -791,7 +797,7 @@ The Settings modal (the gear button) persists per-user UI choices to `~/.mulmote
791
797
 
792
798
  ![The Settings modal — a sidebar of grouped sections beside the one being edited](https://raw.githubusercontent.com/receptron/mulmoterminal/main/docs/guide/images/settings-tabs.png)
793
799
 
794
- *Open it from the gear button in the toolbar. The **sidebar** groups the sections — Appearance, Projects, Header & launch, Input, Models & servers, Notifications, Integrations, Sessions, Help — and one is on screen at a time; on a phone the sidebar becomes a picker above the section. The interface is available in **English, 日本語, 简体中文, 繁體中文 and 한국어**: it follows your browser's language unless you pick one under **Language** (per browser, like the theme). Translated so far: this modal, the grid's status words, and every button's hover tip and screen-reader label; the rest of the app's words are still English. Under the title, a **Version** row shows what is running: the version from the shipped `package.json`, plus a `commit <sha>` chip on a git checkout — there the version is only whatever was last released, so the commit is what identifies the build. When something newer exists, the row is followed by the header badge's update notice, command included. Pick a **theme**, set the **terminal font size**, **font** and **scroll speed** (and whether sending **returns to the latest output**), set a custom **attention sound**, list the repos the cross-repo **PRs & Issues** view should aggregate, add **launch commands** for grid cells, register your own **MCP servers**, and turn on the switches for what this app writes on your behalf — **issue work comments**, the **PR clone footer**, the **closing summary**, the **decision digest**, the **dev worklog** — no need to hand-edit the config file. Three settings stay with their skill because a form would be the wrong tool for them (`keymap`, `themes`, `buttons`/`chips`); Settings shows what each is doing now and launches that skill. Backends (`providers`), custom agents and accounts are added and removed in **Models and backends**. Note that **theme, font size, scroll speed and the return-to-latest switch are stored per browser** (they're display preferences, so a phone and a desktop keep their own); the rest live in `~/.mulmoterminal/config.json` and are shared by every client.*
800
+ *Open it from the gear button in the toolbar. The **sidebar** groups the sections — Appearance, Projects, Header & launch, Input, Models & servers, Notifications, Integrations, Sessions, Help — and one is on screen at a time; on a phone the sidebar becomes a picker above the section. The interface is available in **English, 日本語, 简体中文, 繁體中文 and 한국어**: it follows your browser's language unless you pick one under **Language** (per browser, like the theme). Translated so far: this modal, the grid's status words, and every button's hover tip and screen-reader label; the rest of the app's words are still English. Under the title, a **Version** row shows what is running: the version from the shipped `package.json`, plus a `commit <sha>` chip on a git checkout — there the version is only whatever was last released, so the commit is what identifies the build. When something newer exists, the row is followed by the header badge's update notice, command included. Pick a **theme**, set the **terminal font size**, **font** and **scroll speed** (and whether sending **returns to the latest output**), set a custom **attention sound**, list the repos the cross-repo **PRs & Issues** view should aggregate, add **launch commands** for grid cells, register your own **MCP servers**, and turn on the switches for what this app writes on your behalf — **issue work comments**, the **PR clone footer**, the **closing summary**, the **decision digest**, the **dev worklog** — no need to hand-edit the config file. Three settings stay with their skill because a form would be the wrong tool for them (`keymap`, `themes`, `buttons`/`chips`); Settings shows what each is doing now and launches that skill. Backends (`providers`), custom agents and accounts are added and removed in **Models and backends**. Note that **theme, font size, scroll speed and the return-to-latest switch are stored per browser** (they're display preferences, so a phone and a desktop keep their own); the rest live in `~/.mulmoterminal/config.json` and are shared by every client. **Help** links to the guide and has a button that opens a terminal where an agent answers questions about MulmoTerminal from the shipped docs and source — the same help desk as the toolbar's help icon.*
795
801
 
796
802
  | Field | Meaning |
797
803
  | ------------ | ------- |
@@ -816,6 +822,7 @@ The Settings modal (the gear button) persists per-user UI choices to `~/.mulmote
816
822
  | `worklogIntervalHours` | Worklog cadence in hours (default `6`, clamped to `1`–`168`). A stepper in the same Settings section covers the range. |
817
823
  | `feedRefreshEnabled` | `false` stops the hourly **collection/feed refresh** (one scheduled task per root — the workspace and every saved project directory). **On by default**; only an explicit `false` turns it off, so an existing config keeps the behaviour it has. Saved from Settings (or any `POST /api/config`), it applies at once — the running scheduler rebuilds its built-in tasks; a hand-edit applies after **Settings → Reload config file** (or a restart). Feeds still refresh on demand. Checkbox in Settings → **Sessions**. |
818
824
  | `calendarSyncEnabled` | `false` stops the hourly **Google Calendar sync** (pulls changed events into collections that declare a calendar). Same default and the same restart rule as `feedRefreshEnabled`; calendar collections still sync on demand. Checkbox in the same Settings section. With both off and `worklogEnabled` off, no **built-in** task is registered. Your own tasks in `config/scheduler/tasks.json` are unaffected — these switches do not touch them, and an enabled one still registers and still runs the tick loop. Only when there is no enabled user task either does the scheduler stop writing its state file and run logs. |
825
+ | `tmuxPrefix` | The prefix key of the dedicated tmux server: `"none"` (default — every key reaches the agent, so Ctrl+B is "one character left" again), `"C-b"` (tmux's own default) or another control key such as `"C-]"`. Applied to a running tmux server on save. See the [Configuration guide](https://receptron.github.io/mulmoterminal/guide/en/config.html#tmux-prefix). Settings → **Terminal keys** has a dropdown. |
819
826
  | `terminalSubmit` | Which bytes Claude reads as **submit** vs **newline**: `"cr"` (default — Enter submits, Shift+Enter makes a newline) or `"esc-cr"` (for a Claude Code rebound the other way). Applies to the keyboard **and** the phone remote-view submit, for **Claude sessions only** (shell/codex keep plain Enter). See the [Configuration guide](https://receptron.github.io/mulmoterminal/guide/en/config.html#terminal-submit). Settings → **Terminal keys** offers both, worded as behaviour. |
820
827
  | `copyOnSelect` | `true` puts a **mouse selection on the clipboard the moment it settles**, with no key pressed (the PuTTY / iTerm2 behaviour). **Off by default** — it changes the clipboard when you may only have meant to highlight something. There is a checkbox in Settings → **Terminal keys**, applied at once; a hand edit of the file needs a **server restart, then a tab reload** (the server reads this file once at startup, and the browser reads the value from it on load). Composes with the `copy` keymap action rather than replacing it. Over plain `http://` the browser gives a page no clipboard access, so a fallback asks xterm to copy instead; see the [Configuration guide](https://receptron.github.io/mulmoterminal/guide/en/config.html#copy-on-select). |
821
828
  | `questionPaneEnabled` | `true` offers a Claude session's **`AskUserQuestion` choices as buttons** in a pane beside the enlarged terminal. **The terminal's own dialog stays** and the pane drives it — a click presses the arrow keys and Enter in the real dialog, so either end can answer and the first one wins. Claude sessions only (the choices arrive on Claude Code's hooks). A **single** question can also be answered in your own words — a text box under the buttons writes into the dialog's own `Type something` row; several questions at once, or a multi-select one, get buttons only, and `Chat about this` stays in the terminal. **Off by default** — it lets a pane type into your terminal. Checkbox in Settings → **Terminal keys**, applied at once (the server re-reads the file per question). See the [Feature reference](https://receptron.github.io/mulmoterminal/guide/en/features.html#question-pane). |
@@ -2468,7 +2475,7 @@ server/
2468
2475
  backends/ wiki, collections, feeds, accounting, notifier,
2469
2476
  translation, whisper, remote-host, html, files
2470
2477
  skills/ bundled skills: mulmoterminal-config (entry point + audit), -dirs, -theme,
2471
- -header, -keys, -model, -notify, -bug-report, -decisions
2478
+ -header, -keys, -model, -notify, -bug-report, -decisions, -help
2472
2479
  fix-pty-perms.js postinstall: fixes node-pty binary permissions
2473
2480
  src/
2474
2481
  App.vue Layout; owns the grid, the overlays and the tab favicon
@@ -23,6 +23,7 @@ export const BUNDLED_SKILL_NAMES = [
23
23
  "mulmoterminal-bug-report",
24
24
  "mulmoterminal-decisions",
25
25
  "mulmoterminal-shared-app",
26
+ "mulmoterminal-help",
26
27
  ] as const;
27
28
 
28
29
  export type BundledSkillName = (typeof BUNDLED_SKILL_NAMES)[number];
@@ -0,0 +1,57 @@
1
+ // The tmux prefix key of the dedicated mulmoterminal tmux server (#2981).
2
+ //
3
+ // tmux's default `C-b` is also "one character left" in every readline, in Claude Code's input and
4
+ // in the macOS text system, so with it armed the first Ctrl+B in a cell is swallowed as a prefix and
5
+ // the next key is read as a tmux command. Nothing in this app uses the prefix: sessions are driven
6
+ // from the server with tmux commands, and the wheel reaches scrollback through the root table.
7
+ export const TMUX_PREFIX_NONE = "none";
8
+ export const TMUX_PREFIX_DEFAULT = TMUX_PREFIX_NONE;
9
+
10
+ // Control + one key, spelled the way tmux spells it. Deliberately narrow: each of these is written
11
+ // into a tmux conf line unquoted, so a character with meaning there never gets through.
12
+ const TMUX_CONTROL_KEY = /^C-(?:[a-z]|Space|\]|_|\^|@)$/u;
13
+
14
+ export const TMUX_PREFIX_CHOICES: readonly string[] = [TMUX_PREFIX_NONE, "C-b", "C-]"];
15
+
16
+ // vue-i18n reads `]` as path syntax, so the labels cannot be keyed by the tmux spelling itself.
17
+ export const TMUX_PREFIX_LABEL_KEYS: Readonly<Record<string, string>> = { none: "none", "C-b": "ctrlB", "C-]": "ctrlBracket" };
18
+
19
+ export const isTmuxPrefix = (input: unknown): input is string => input === TMUX_PREFIX_NONE || (typeof input === "string" && TMUX_CONTROL_KEY.test(input));
20
+
21
+ export const sanitizeTmuxPrefix = (input: unknown): string => (isTmuxPrefix(input) ? input : TMUX_PREFIX_DEFAULT);
22
+
23
+ /** The offered choices, plus the value in force when config.json holds a valid key the dropdown does
24
+ * not list, so the control shows what is running instead of a blank. */
25
+ export const tmuxPrefixChoicesFor = (current: string): readonly string[] =>
26
+ TMUX_PREFIX_CHOICES.includes(current) ? TMUX_PREFIX_CHOICES : [...TMUX_PREFIX_CHOICES, current];
27
+
28
+ const TMUX_OWN_DEFAULT_PREFIX = "C-b";
29
+
30
+ // The commands that put a prefix in force. Idempotent, so the same lines serve the conf file of a
31
+ // fresh server and a server that is already running. `unbind-key C-b` matters for "none" and for any
32
+ // other key: tmux binds the default's `send-prefix` in the prefix table independently of the option.
33
+ export function tmuxPrefixCommands(prefix: string): string[] {
34
+ if (prefix === TMUX_PREFIX_NONE) return ["set -g prefix None", `unbind-key ${TMUX_OWN_DEFAULT_PREFIX}`];
35
+ if (prefix === TMUX_OWN_DEFAULT_PREFIX) return [`set -g prefix ${prefix}`, `bind-key ${prefix} send-prefix`];
36
+ return [`set -g prefix ${prefix}`, `unbind-key ${TMUX_OWN_DEFAULT_PREFIX}`, `bind-key ${prefix} send-prefix`];
37
+ }
38
+
39
+ // `list-keys -T prefix` prints one `bind-key [-r] -T prefix <key> <command>` per binding. Every key in
40
+ // the prefix table that sends the prefix on, other than the one now in force, is left over from an
41
+ // earlier setting - possibly from an earlier PROCESS, which is why this reads the server's own table
42
+ // instead of remembering what was set last.
43
+ // Read as words, not a pattern: flags such as `-r` may precede `-T prefix`.
44
+ const sendPrefixKeyOf = (line: string): string | undefined => {
45
+ const words = line.trim().split(/\s+/u);
46
+ const tableAt = words.indexOf("-T");
47
+ const isPrefixTable = words[0] === "bind-key" && tableAt > 0 && words[tableAt + 1] === "prefix";
48
+ const sendsPrefix = words.length === tableAt + 4 && words[tableAt + 3] === "send-prefix";
49
+ return isPrefixTable && sendsPrefix ? words[tableAt + 2] : undefined;
50
+ };
51
+
52
+ export function staleSendPrefixKeys(listKeysOutput: string, prefix: string): string[] {
53
+ return listKeysOutput
54
+ .split("\n")
55
+ .map(sendPrefixKeyOf)
56
+ .filter((key): key is string => key !== undefined && key !== prefix);
57
+ }