mulmoterminal 4.24.0 → 4.26.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 (185) hide show
  1. package/README.ja.md +191 -0
  2. package/README.md +18 -8
  3. package/README.zh.md +172 -0
  4. package/bin/agent-bins.d.ts +15 -0
  5. package/bin/agent-bins.js +38 -0
  6. package/bin/cli-args.d.ts +1 -1
  7. package/bin/cli-args.js +7 -2
  8. package/bin/default-agent.d.ts +19 -0
  9. package/bin/default-agent.js +99 -0
  10. package/bin/has-command.d.ts +9 -0
  11. package/bin/has-command.js +120 -0
  12. package/bin/instances.d.ts +4 -0
  13. package/bin/instances.js +53 -5
  14. package/bin/mulmoterminal.js +104 -52
  15. package/bin/port-owner.d.ts +1 -1
  16. package/bin/port-owner.js +29 -8
  17. package/bin/prompt-yes-no.d.ts +17 -0
  18. package/bin/prompt-yes-no.js +74 -0
  19. package/common/defaultAgent.ts +31 -0
  20. package/dist/assets/{AllPackages-CF2GkZ5g-CPV8sWp7.js → AllPackages-B1YCJRYB-kggoNw6z.js} +1 -1
  21. package/dist/assets/{BaseConfiguration-CAwZOAki-CgwjtBos.js → BaseConfiguration-B6s_tKOW-RQzsRUNx.js} +1 -1
  22. package/dist/assets/{Element-BMI7Nj5w-CNbgJMcS.js → Element-BMI7Nj5w-BP5E_zl7.js} +1 -1
  23. package/dist/assets/{Entities-C8p_0jCn-jGc0TB3k.js → Entities-C8p_0jCn-C-_0T6vJ.js} +1 -1
  24. package/dist/assets/{FunctionList-YWk54TCy-Bgb6KEze.js → FunctionList-YWk54TCy-DyxSzbCI.js} +1 -1
  25. package/dist/assets/{InputJax-C5dj-ntL-_76qSQ1s.js → InputJax-C5dj-ntL-BtwdMizb.js} +1 -1
  26. package/dist/assets/{MathItem-YJvQL-XJ-C7VIwdl0.js → MathItem-YJvQL-XJ-CeeATAwp.js} +1 -1
  27. package/dist/assets/{MmlFactory-DuXYIgx8-C8y5JyE3.js → MmlFactory-DSoKkE7s-CYu-aCTG.js} +1 -1
  28. package/dist/assets/{Options-oARQeeuT-OsZXDklV.js → Options-oARQeeuT-TJSj2iQR.js} +1 -1
  29. package/dist/assets/{OutputJax-DfUZNNCu-C3lU-avz.js → OutputJax-DfUZNNCu-oLxtQ_g0.js} +1 -1
  30. package/dist/assets/{PrioritizedList-6lun1Xqd-By4DNtD0.js → PrioritizedList-6lun1Xqd-D4eZQDMF.js} +1 -1
  31. package/dist/assets/{Styles-BPXeoqzi-B8wyAcxp.js → Styles-5NmwS-3M-B9XVBSSq.js} +1 -1
  32. package/dist/assets/{TeXAtom-LHT3KFWH-EDG5BHqK.js → TeXAtom-B5ni9myz-B3RMDIY5.js} +1 -1
  33. package/dist/assets/{abnfDiagram-VCTEODGH-DoYNjdBB-BnLtOVnY.js → abnfDiagram-VCTEODGH-BGhi-oVb-DQZhwQSy.js} +1 -1
  34. package/dist/assets/{arc-CqByPKkF-DhUKhHXp.js → arc-CK5ru50N-CnsmPLzy.js} +1 -1
  35. package/dist/assets/architecture-7GRP2DOG-otSkCkT5-CFnWjMcA.js +1 -0
  36. package/dist/assets/architectureDiagram-5GKGNRK7-ELuPYMlf-Ci2fG9OM.js +36 -0
  37. package/dist/assets/{assistive-mml-DXJXho4o-CBaufTrA.js → assistive-mml-CdU3rUpx-PFS2LrE8.js} +1 -1
  38. package/dist/assets/{blockDiagram-I7D4REHJ-1Cng0Q4K-DY5d5Dzk.js → blockDiagram-I7D4REHJ-BZ7-OGWQ-iSiAD4OV.js} +4 -4
  39. package/dist/assets/{c4Diagram-7LVT6UL2-CAb9c8nc-UFG8RKoP.js → c4Diagram-7LVT6UL2-DCovPZ_4-DLrbYW62.js} +1 -1
  40. package/dist/assets/channel-Bmu_OOc6-CLX7xRxl.js +1 -0
  41. package/dist/assets/chunk-4HAMMTFA-DqpzLmar-Begag6kK.js +74 -0
  42. package/dist/assets/{chunk-75Z2AOVW-CbPA0Zt_-V-9N7qGv.js → chunk-75Z2AOVW-CT5TYzp5-Che06AJn.js} +1 -1
  43. package/dist/assets/{chunk-DU6HZSFF-DuOx2LFX-BKLlSA9a.js → chunk-DU6HZSFF-BVf-rtdf-BY6ORnqO.js} +2 -2
  44. package/dist/assets/{chunk-F27PBJKO-CgBMw9yN-CNVYqofR.js → chunk-F27PBJKO-rP8pUsk3-DnQrEHyt.js} +1 -1
  45. package/dist/assets/{chunk-IMKFNOWR-ij1DSzMb-CgETy66t.js → chunk-IMKFNOWR-D_IT0r3G-CZbWs1tw.js} +2 -2
  46. package/dist/assets/{chunk-POPQ4Y6H-Bh_uOTmp-LjNhJHl1.js → chunk-POPQ4Y6H-C5YURnHe-Pr-7cHNE.js} +1 -1
  47. package/dist/assets/{chunk-SHT3W25Y-B8dQLS5w-BFLHGoqo.js → chunk-SHT3W25Y-CfF0J8Qh-BjabP1RZ.js} +5 -5
  48. package/dist/assets/{chunk-SVP7TREG-B6A-T8Th-DNddPrrW.js → chunk-SVP7TREG-CTZbRIbX-B_MoCNpo.js} +1 -1
  49. package/dist/assets/{chunk-TICWLB2K-C1kwD29l-C3VMoZVq.js → chunk-TICWLB2K-DP1lYmZm-DBUczLZh.js} +4 -4
  50. package/dist/assets/{chunk-XXDRQBXY-vg0kfC73-BE-e8Ljw.js → chunk-XXDRQBXY-vg0kfC73-D9SGVKJn.js} +1 -1
  51. package/dist/assets/classDiagram-ZZMXUADV-BDQOAOBf-CH44RAkG.js +1 -0
  52. package/dist/assets/classDiagram-v2-VYDZK3BY-CwPXtzoF-CH44RAkG.js +1 -0
  53. package/dist/assets/{cose-bilkent-JH36ORCC-NuHCtE3P-LiXFh17v.js → cose-bilkent-JH36ORCC-qIiD3RGD-BUItDgWJ.js} +1 -1
  54. package/dist/assets/cynefin-OW5HDTMX-Xr6IPdZG-Ce8mYJyA.js +1 -0
  55. package/dist/assets/{cynefinDiagram-5FMLGOSQ-CA7sro34-GmHYMY-Q.js → cynefinDiagram-5FMLGOSQ-BZrUCS-v-Vi8fZx7J.js} +1 -1
  56. package/dist/assets/{cytoscape.esm-DuKOKbur-Cp2HF8G-.js → cytoscape.esm-Cu7uu3aJ-NgwPT4ez.js} +2 -2
  57. package/dist/assets/{dagre-B42rJlko-6iqQ6GWy.js → dagre-C2SZ8h4o-BotF2A9M.js} +1 -1
  58. package/dist/assets/dagre-GXQ25YYZ-CQcLM4na-DqruNADY.js +4 -0
  59. package/dist/assets/{diagram-S7CK7UJ4-D_nsLfRT-B95J-qHs.js → diagram-S7CK7UJ4-BdmcmUQh-BpurSv4a.js} +3 -3
  60. package/dist/assets/{diagram-UQ7AKVKN-DNN-YX9a-DwY8r3GK.js → diagram-UQ7AKVKN-BtvmEiYl-XHbHkO0x.js} +2 -2
  61. package/dist/assets/{diagram-VSXAHHWV--HENzo-l-nz7Z_yZX.js → diagram-VSXAHHWV-qEG6N0bV-Cr5ut8_j.js} +2 -2
  62. package/dist/assets/{diagram-VX7I27RA-m2m9dROj-CRF34bER.js → diagram-VX7I27RA-BA8is49N-Bq5gY7-i.js} +1 -1
  63. package/dist/assets/{diagram-Z3DM3KII-D4qpv4-B-LzlF_j9O.js → diagram-Z3DM3KII-XPcU7IOQ-C0yHj4hB.js} +1 -1
  64. package/dist/assets/{dist-BlFIEs_e.js → dist-BNoLRzs-.js} +1 -1
  65. package/dist/assets/{dist-CaFrslfb.js → dist-CoNrzCGM.js} +1 -1
  66. package/dist/assets/{dist-DeiyD9Ki-FXYzS2xC.js → dist-DeiyD9Ki-CG6FY-Fn.js} +1 -1
  67. package/dist/assets/{dist-C_1wm_T6.js → dist-DgKptpvT.js} +1 -1
  68. package/dist/assets/{dist-DR8_gdx_.js → dist-Fs7Cl-b9.js} +1 -1
  69. package/dist/assets/{ebnfDiagram-PWID7BFC-CAbv3sZg-G0Q1SrD6.js → ebnfDiagram-PWID7BFC-CTHIHdBS-BJwIOuLO.js} +1 -1
  70. package/dist/assets/{erDiagram-RLTQ6QDP-a10Ryh0--Cfj7rCT9.js → erDiagram-RLTQ6QDP-DVpWTNZj-D8m4MgiI.js} +2 -2
  71. package/dist/assets/eventmodeling-NTZA5JFV-B7bRrpt_-DnpJhuuA.js +1 -0
  72. package/dist/assets/flowDiagram-HODETNUW-r-3T5g30-BWizd0qT.js +1 -0
  73. package/dist/assets/{ganttDiagram-EL5Y4UJY-Cb7leeOC-Dh4N9mq0.js → ganttDiagram-EL5Y4UJY-BfAgk15F-0jMcI0Yj.js} +1 -1
  74. package/dist/assets/gitGraph-4MIJSDKK-BhzSx5wq-BmNB3hui.js +1 -0
  75. package/dist/assets/{gitGraphDiagram-WWUBYQGX-BCSbUpXG-CyLjboJM.js → gitGraphDiagram-WWUBYQGX-DEVVZ6wt-CawiFyGd.js} +2 -2
  76. package/dist/assets/graphlib-BYLhHyYO-CEk4IQ-f.js +10 -0
  77. package/dist/assets/{html-DdQiKDqM-BRajsLqs.js → html-Z7dGbczU-BwxpBy6_.js} +1 -1
  78. package/dist/assets/{index-CtIUGGYC.js → index-D7Oh_lqc.js} +370 -312
  79. package/dist/assets/info-A6RAGUB7-fR2SUJmJ-DJ6qtBt_.js +1 -0
  80. package/dist/assets/{infoDiagram-27XIBGKW-BJRaZItN-lg2aVGIh.js → infoDiagram-27XIBGKW-CvHUhAHd-Y8J_Kc2X.js} +1 -1
  81. package/dist/assets/{ishikawaDiagram-5VMMS53U-DHlFe__S-DCslwSGd.js → ishikawaDiagram-5VMMS53U-CeqyKdwk-q6ZNkcwN.js} +1 -1
  82. package/dist/assets/{journeyDiagram-3NMN7TZE-BOIo3JM--tDeRmiVV.js → journeyDiagram-3NMN7TZE-Jfi7MPDi-Bv6pv8wY.js} +1 -1
  83. package/dist/assets/{kanban-definition-UXKFOSKX-yrQdG683-3L3EQfqb.js → kanban-definition-UXKFOSKX-yOrlojns-B2y6NbLe.js} +4 -4
  84. package/dist/assets/{lengths-CvmPfBid-Cu9OItzz.js → lengths-CvmPfBid-CBfhrPT6.js} +1 -1
  85. package/dist/assets/{linear-xsuGWu5q-BgoiP9LM.js → linear-jdmEy-qs-oCunWRsH.js} +1 -1
  86. package/dist/assets/{liteAdaptor-C0FQiOEx-DM6GPGGE.js → liteAdaptor-pH5MXTG0-BY38m-jj.js} +1 -1
  87. package/dist/assets/{mathjax-DVEo4UYj-CfpbbeK0.js → mathjax-DVEo4UYj-C7BTzxwK.js} +1 -1
  88. package/dist/assets/{mermaid-parser.core-fkjeiYO7-BM31ZVzh.js → mermaid-parser.core-CzBW8Fof-CixE9zmB.js} +5 -5
  89. package/dist/assets/mermaid.core-Dv4uylek-Djmx6tFE.js +44 -0
  90. package/dist/assets/{mindmap-definition-YA3MSWOX-BpKAVyqs-DsergwMI.js → mindmap-definition-YA3MSWOX-DP_2R9Ga-kTAulFVa.js} +2 -2
  91. package/dist/assets/{mo-CrlNnGXX-C51z4JTr.js → mo-Xv_6CC7A-CcvkyIE0.js} +1 -1
  92. package/dist/assets/packet-AYTQ26CC-B_oKR9KZ-Pi3e-tAz.js +1 -0
  93. package/dist/assets/{pegDiagram-XKGWAZYB-C7eG_Ohl-vCqgDNWv.js → pegDiagram-XKGWAZYB-BsBWryhi-BiG1mp1T.js} +1 -1
  94. package/dist/assets/pie-WAS4IAKB-D1ZXrN1W-BOglNRvk.js +1 -0
  95. package/dist/assets/{pieDiagram-E7YTZNPT-5f9wSfDR-C6V60DBk.js → pieDiagram-E7YTZNPT-OugkS2pU-C5WoCQDp.js} +2 -2
  96. package/dist/assets/{quadrantDiagram-AXDQQJYC-mWeaOj5S-BcXxgymS.js → quadrantDiagram-AXDQQJYC-DXEAAaUE-U0asGLtC.js} +1 -1
  97. package/dist/assets/radar-RG4KPBEZ-BmUgDkiH-zXnWiLPM.js +1 -0
  98. package/dist/assets/railroad-74A4TZTK-6lEXVJo8-CAtjJocL.js +1 -0
  99. package/dist/assets/railroad-abnf-HS5TGJTU-BG28Qiz1-BzFi41zD.js +1 -0
  100. package/dist/assets/railroad-ebnf-LZEXJU2U-DzpHhtTH-CFTlT-st.js +1 -0
  101. package/dist/assets/railroad-peg-WCYAUIDC-B2CHCTyG-uG4QNP6w.js +1 -0
  102. package/dist/assets/{railroadDiagram-O6MQD6OU-DJskhE7u-8wnAghad.js → railroadDiagram-O6MQD6OU-BJys8O96-Dcm_CJA0.js} +1 -1
  103. package/dist/assets/{requirementDiagram-BXWQKSXE-B5E0bU4h-DIJO5wgK.js → requirementDiagram-BXWQKSXE-BaDgCtM5-BFyzmV4B.js} +2 -2
  104. package/dist/assets/{sankeyDiagram-P5KCCOFB-DS3AOTai-7y6xzknJ.js → sankeyDiagram-P5KCCOFB-puZsr_vK-CTerarXU.js} +1 -1
  105. package/dist/assets/{sequenceDiagram-WJ2MYXX4-Bn2L9osv-BuejIump.js → sequenceDiagram-WJ2MYXX4-D1ziEryC-Dk_Vh7EW.js} +6 -6
  106. package/dist/assets/{src-CLC0ddSd-BfIW4vqJ.js → src-CLC0ddSd-dG3DpXd2.js} +1 -1
  107. package/dist/assets/stateDiagram-D77RDMKH-HSEurT6h-CpOTqfOS.js +1 -0
  108. package/dist/assets/stateDiagram-v2-MP3YSRHH-DnOa-Otc-DgkDdTbh.js +1 -0
  109. package/dist/assets/{svg-CaHU_sxA-CSLsEQwZ.js → svg-D_RYJvQC-C4pZWbZ-.js} +1 -1
  110. package/dist/assets/swimlanes-42K2YHIH-umBsuvsI-C-uZTY-8.js +1 -0
  111. package/dist/assets/swimlanesDiagram-VR7AAH4N-ZLUyNmnU-CxUAVNvR.js +8 -0
  112. package/dist/assets/{tex-B1cONMvb-Bkjt5F6e.js → tex-Dx2UJ3VU-Ch7WPvt4.js} +1 -1
  113. package/dist/assets/{timeline-definition-24CTP7MA-Bx3KcICO-CJ9a4wnW.js → timeline-definition-24CTP7MA-D9plt22Y-BgXy-Pja.js} +2 -2
  114. package/dist/assets/treeView-Q6P3EWNA-BdvZ0_C5-VCyiiE1t.js +1 -0
  115. package/dist/assets/treemap-WGGIJYW6-CIJLPQlC-jg24gWZX.js +1 -0
  116. package/dist/assets/{vennDiagram-4TSXK5OY-DSexNe_H-DHrmLdk1.js → vennDiagram-4TSXK5OY-DZe7wY85-HHFNkULb.js} +1 -1
  117. package/dist/assets/wardley-WFR3VGLG-CKqtFD8V-hF5yPxTk.js +1 -0
  118. package/dist/assets/{wardleyDiagram-VM6X3IG4-DesYYyZW-CCkDs4rS.js → wardleyDiagram-VM6X3IG4-DK9yytWx-qeOMmNlR.js} +3 -3
  119. package/dist/assets/{xychartDiagram-S5SC5T6Z-dIt6pHWV-BLz9ne1A.js → xychartDiagram-S5SC5T6Z-CLSO4Pc9-DLpk6ryk.js} +3 -3
  120. package/dist/index.html +1 -1
  121. package/package.json +18 -18
  122. package/server/agents/antigravity-mcp.ts +7 -39
  123. package/server/agents/copilot-hooks-file.ts +8 -31
  124. package/server/agents/copilot-sessions.ts +50 -22
  125. package/server/agents/cursor-hooks-file.ts +9 -28
  126. package/server/agents/cursor-mcp.ts +9 -35
  127. package/server/agents/mcp-config-file.ts +55 -0
  128. package/server/agents/muse-session.ts +3 -34
  129. package/server/agents/owned-file.ts +68 -0
  130. package/server/agents/sqlite-read.ts +38 -0
  131. package/server/config/agent-from-argv.ts +28 -0
  132. package/server/config/app-config.ts +14 -0
  133. package/server/config/config-routes.ts +15 -3
  134. package/server/config/env.ts +10 -0
  135. package/server/files/open-dir.ts +10 -51
  136. package/server/files/spawnOpener.ts +23 -2
  137. package/server/index.ts +4 -1
  138. package/server/infra/pty-env.ts +19 -6
  139. package/server/infra/shapescript-manage-tool.ts +30 -11
  140. package/server/session/transcript-view-codex.ts +150 -0
  141. package/server/session/transcript-view-copilot.ts +76 -0
  142. package/server/session/transcript-view-cursor.ts +153 -0
  143. package/server/session/transcript-view-read.ts +225 -34
  144. package/server/session/transcript-view.ts +62 -18
  145. package/server/skills/mulmoterminal-config/SKILL.md +1 -0
  146. package/server/skills/mulmoterminal-model/SKILL.md +26 -1
  147. package/dist/assets/architecture-7GRP2DOG-CRS69XmP-P4uevvde.js +0 -1
  148. package/dist/assets/architectureDiagram-5GKGNRK7-BhcT6qS5-C-UI87I-.js +0 -36
  149. package/dist/assets/array-CApNbSU9-BifhSqXX.js +0 -1
  150. package/dist/assets/channel-BjESmYnj-HhGDjK-m.js +0 -1
  151. package/dist/assets/chunk-4HAMMTFA-ChwfIAnF-BfEAtGyB.js +0 -62
  152. package/dist/assets/chunk-GMAD6QVW-JTqlimUX-DyHsZBBk.js +0 -13
  153. package/dist/assets/chunk-GVQU2GXP-D6ccB4DO-Clguzy-D.js +0 -1
  154. package/dist/assets/chunk-L3NEJ4N5-CUoAQVG2-DYRxwLhr.js +0 -1
  155. package/dist/assets/chunk-OSK3NFVY-_VNbXQSu-EEWcLop2.js +0 -10
  156. package/dist/assets/chunk-P2QGCYS3-B8lzOn3Y-D8hwI5ry.js +0 -1
  157. package/dist/assets/chunk-PWAF6VOD-DzjnfYSw-Dc5rdlhh.js +0 -1
  158. package/dist/assets/classDiagram-ZZMXUADV-C7gP-pUH-Bg_X9p_Q.js +0 -1
  159. package/dist/assets/classDiagram-v2-VYDZK3BY-CUwV5k1F-Bg_X9p_Q.js +0 -1
  160. package/dist/assets/cynefin-OW5HDTMX-C4iKivN4-CgELbA4y.js +0 -1
  161. package/dist/assets/dagre-GXQ25YYZ-DOztjUR_-DORc4Sp6.js +0 -4
  162. package/dist/assets/eventmodeling-NTZA5JFV-DhqtNS8R-CULx_dzS.js +0 -1
  163. package/dist/assets/flowDiagram-HODETNUW-CAW_8mwY-Di1IwOZM.js +0 -1
  164. package/dist/assets/gitGraph-4MIJSDKK-S_Zs6Nxs-Ha4Adsp2.js +0 -1
  165. package/dist/assets/graphlib-I2XjzNHe-RhW8UfaN.js +0 -1
  166. package/dist/assets/info-A6RAGUB7-4sGJh1is-Dkn1ySIo.js +0 -1
  167. package/dist/assets/line-DUb1TjJS-Br-XhSBm.js +0 -1
  168. package/dist/assets/mermaid.core-CZDx2Cyn-J8_gyYwS.js +0 -44
  169. package/dist/assets/packet-AYTQ26CC-MQQyx8fI-CxhvuNQk.js +0 -1
  170. package/dist/assets/pie-WAS4IAKB-CyaL5i_d-DH8GUGCe.js +0 -1
  171. package/dist/assets/radar-RG4KPBEZ-DR-SsHDJ-BbvaJPFn.js +0 -1
  172. package/dist/assets/railroad-74A4TZTK-C2gqsOGX-CnpXx21Z.js +0 -1
  173. package/dist/assets/railroad-abnf-HS5TGJTU-Dpzw6P5u-BENuCxE5.js +0 -1
  174. package/dist/assets/railroad-ebnf-LZEXJU2U-J_BuIrPo-YOJK3-Vq.js +0 -1
  175. package/dist/assets/railroad-peg-WCYAUIDC-DzMStOR--DniOF8AP.js +0 -1
  176. package/dist/assets/rough.esm-CRiMXkOs-Dy-Kn_BL.js +0 -1
  177. package/dist/assets/stateDiagram-D77RDMKH-DbtoW7HL-COfSbmfQ.js +0 -1
  178. package/dist/assets/stateDiagram-v2-MP3YSRHH-CX6RalKY-BdG-o8jv.js +0 -1
  179. package/dist/assets/swimlanes-42K2YHIH-90h8w_3B-BEeZiMSh.js +0 -1
  180. package/dist/assets/swimlanesDiagram-VR7AAH4N-49XH_TMr-DRjaZMSJ.js +0 -8
  181. package/dist/assets/treeView-Q6P3EWNA-gFs854Sn-DnWXz9QS.js +0 -1
  182. package/dist/assets/treemap-WGGIJYW6-DGh_szUA-CNDhxIeu.js +0 -1
  183. package/dist/assets/wardley-WFR3VGLG-BVLYL3gB-CQfusywI.js +0 -1
  184. /package/dist/assets/{katex-DImtHWbS-ZlcWpGUi.js → katex-DJvMs1Qi-ZlcWpGUi.js} +0 -0
  185. /package/dist/assets/{path-CciMXxPa-fybaL0A-.js → path-D09ilxrb-fybaL0A-.js} +0 -0
package/README.ja.md ADDED
@@ -0,0 +1,191 @@
1
+ # MulmoTerminal
2
+
3
+ [English](README.md) · **日本語** · [简体中文](README.zh.md)
4
+
5
+ **コーディングエージェントのセッションを並列で走らせ、どれが自分を待っているかを見る。**
6
+
7
+ **並列 AI コーディングエージェントのためのブラウザ端末**です。複数のセッションが
8
+ 一つずつセルに入って並び、**あなたを待っているものだけが色で示されます**。
9
+ 既定は **Claude Code** で、ほかに6つの CLI を同格で扱えます —
10
+ Codex、Antigravity、Grok、Muse、GitHub Copilot CLI、Cursor CLI。
11
+ エージェント1体の vibe coding にシェル以外は要りません。これは**複数走らせて、どれが待っているか
12
+ 分からなくなったとき**のための道具です。セッションはリロードを越えて残り(tmux)、作業は
13
+ **git worktree** で隔離され、ターンが終わると**スマホに通知**が飛びます。
14
+
15
+ **すべてのセルが本物の pty です。** `htop`、`lazygit`、開発サーバー、Claude Code —
16
+ ここでは同じ種類のものです。だから「worktree あたり1セッション」の制限は**エージェントにだけ**
17
+ 掛かり、シェルや `yarn dev` はエージェントが作業している worktree に同居できます。
18
+
19
+ ## デモ
20
+
21
+ ![MulmoTerminal — 状態ごとに色分けされた Claude Code セッションのグリッドがリアルタイムに更新される様子](https://raw.githubusercontent.com/receptron/mulmoterminal/main/docs/guide/images/hero.gif)
22
+
23
+ *グリッドの実機。各セルが **作業中** / **完了** / **あなた待ち** で色分けされます。*
24
+
25
+ ```bash
26
+ npx mulmoterminal@latest # http://localhost:34567 で起動し、ブラウザが開きます
27
+ ```
28
+
29
+ **Node 22.12 以上**と、`PATH` に通ってログイン済みの
30
+ [`claude`](https://claude.com/claude-code) CLI が必要です。
31
+ `npx mulmoterminal@latest init` が、足りないものを教えてくれます。
32
+
33
+ ### tmux + iTerm のペインで十分では?
34
+
35
+ 並列に走らせること自体は難しくありません。tmux で十分です。失われるのは
36
+ **5つのうちどれが自分を待っているか**です。ペインは不透明で、作業中・完了・権限確認待ちの3つが、
37
+ 読むまで見分けられません。
38
+
39
+ MulmoTerminal では、すべてのセルが自分の状態を一つのグリッドに報告します —
40
+ 作業中(青)、完了(緑)、**あなた待ち**(琥珀)。画面外のセルが琥珀になれば音が鳴ります。
41
+ さらに**1セッション1行の cockpit roster** があるので、1つに答えている間も残り4つを見失いません。
42
+
43
+ tmux が入っていればその**上で**動き、[再起動を越えて残ります](#セッションの永続化-tmux)。
44
+
45
+ ## なぜ欲しくなるか
46
+
47
+ - **全エージェントを一度に見る。** 状態で色分けされたセルのグリッド — 作業中(青)、
48
+ **権限待ち / あなた待ち**(琥珀)、**完了・未確認**(青)、待機。注意音とツールバーの件数表示が
49
+ 付くので、画面外で詰まったエージェントを見落としません。1つの端末に張り付くのをやめて、
50
+ 10体を監督する側に回れます。1つを拡大しても **cockpit roster** が残りを視界に保ちます —
51
+ 1セッション1行で、AI 要約・直近のプロンプト・最新の返答・ブランチの **PR 状態**
52
+ (draft / CI 失敗 / ready / merged)が並びます。
53
+ - **端末だけでなく、エージェントのための GUI。** 端末の横の **Canvas** パネルが、
54
+ エージェントが MCP 経由で出したもの — **文書・フォーム・グラフ・生成画像・HTML・
55
+ コレクションカード** — をそれぞれ専用プラグインで描画します。
56
+ エージェントはテキストを流すのではなく、インターフェースを手渡してきます。
57
+ - **どこにいても呼び戻される。** 完了時・入力待ち時に**スマホへ Web Push** が飛び、
58
+ **RemoteHost** を使えばスマホから状況を見て、タップで(**yes / no / continue**)
59
+ 答えられます。席を立ち、呼ばれ、戻る。
60
+ - **再起動で何も失わない。** `tmux` があれば、サーバーのクラッシュ・再起動・`node --watch` の
61
+ リロードを越えて全セッションが生き残ります。ターン途中のエージェント、長いビルド、
62
+ 開発サーバーがそのまま走り続け、戻ると再接続されます。
63
+ - **グリッドから出ずに出荷する。** 各リポジトリのセルに **git ブランチのチップ**が出て、
64
+ ワンクリックで **git worktree** に隔離し、**diff** パネルを開き、
65
+ **commit / push / PR 作成**まで行えます。複数のエージェントが同じリポジトリを、
66
+ 衝突せずに触れます。
67
+ - **いくら掛かっているか分かる。** セッションごとの**コンテキスト %**・**トークン**・
68
+ **推定 $**、ツール呼び出しの**タイムライン**、セル名とコマンド出力の **AI 要約** —
69
+ 並列エージェントの壁が、読めるものに保たれます。
70
+ - **自分のものにする。** ディレクトリごとの**テーマ・色・名前バッジ**(`prod` は赤、
71
+ `staging` は琥珀)、設定可能なヘッダー、独自の注意音、そしてプロジェクトのスクリプト・
72
+ `.claude/skills`・デッキをセル内から起動する Run / Skill / Mulmo メニュー。
73
+
74
+ ![MulmoTerminal のグリッド — 4つの Claude セッションが、それぞれ色分けされたプロジェクトで並列に動いている](https://raw.githubusercontent.com/receptron/mulmoterminal/main/docs/guide/images/grid-2x2-live.png)
75
+
76
+ *グリッドは**並列エージェントの管制塔**です。各セルのヘッダーに、切り分けに必要なものが並びます —
77
+ **モデル・コンテキスト %**、**トークン数**(`⇡in ⇣out`)、**git ブランチ / 変更**のチップ、
78
+ そしてエージェントが何をしているかの AI 要約。**セルの枠の色が状態を示し**、画面外で詰まったセルは
79
+ 音で呼び戻します。多数を監督し、呼ばれたところにだけ入る。*
80
+
81
+ ### 中身の仕組み
82
+
83
+ 各セッションはサーバー上で本物の PTY として動き(エージェント CLI を疑似端末に入れています)、
84
+ WebSocket 経由でブラウザの [xterm.js](https://xtermjs.org/) 端末に流れます。
85
+
86
+ **cockpit roster** は全セッションを一覧し、**作業中**(考えている)・**あなた待ち**
87
+ (権限確認や質問 — 琥珀の点。答えるまで何も進みません)・**完了していて未確認**(緑の点)を
88
+ リアルタイムに反映します。これは**サーバーが起動時に注入する Claude / Codex の activity hook**
89
+ から取っており、画面の文字を解析しているのではありません。
90
+
91
+ > ここが要点です。端末の中では「権限確認で止まっている」と「まだ考えている」が**同じに見えます** —
92
+ > どちらも出力が止まるだけだからです。画面を読んでも区別できませんが、hook なら区別できます。
93
+ >
94
+ > (Codex は「入力待ち」を報告しません。確認ダイアログが自身の TUI に描かれ、rollout ファイルに
95
+ > 届かないためです。したがって Codex は「作業中 / 完了」の2状態になります。)
96
+
97
+ ## 使ってみた人が言うこと
98
+
99
+ > IDE や分割端末から移ってきた人の報告であって、ベンチマークでも、こちらが測定した主張でも
100
+ > ありません。環境によって違うはずです。
101
+
102
+ **「メモリを食わなくなった」** — エージェントを分けるために IDE のウィンドウを複数開くのは
103
+ 高くつきます。それぞれがエディタ・言語サーバー・拡張・ファイル監視を連れてくるためです。
104
+ **64GB のマシンがその負荷で引っかかっていた**人が、移行後は滑らかに動いたと報告しています。
105
+ ここではエージェントはサーバー上の PTY で、UI はブラウザのタブです。
106
+
107
+ **「別のエージェントに返事をしなくなった」** — スクロールするテキストのペインが6つ並ぶと、
108
+ どれも同じに見えます。**別のエージェントの端末に返事を打ち込んでいた**、最初に何を頼んだか
109
+ 分からなくなった、という報告があります。問題は注意力ではなく、**同じペインが N 個あると
110
+ N 個の文脈を頭に保持しなければならない**ことです。状態の色分け・名前バッジ・
111
+ ディレクトリごとの色が、それを頭から画面に移します。
112
+
113
+ **「多数を見ることと1つを読むことが、二者択一でなくなった」** — 端末を6分割すると、
114
+ どのペインも長い返答を読むには小さすぎます(4,000文字の返答でまさにそうなった、という報告)。
115
+ エージェントを増やすたびに、読みやすさを静かに諦めることになります。
116
+ **グリッド ↔ 拡大**がそれを解消します。全部を見て、1つを拡大してきちんと読む。
117
+ その間も cockpit roster が残りをテキストで視界に保ちます。
118
+
119
+ **「今までのセッションがそのまま来た」** — セッションはそのまま再開します(同じ
120
+ `claude --resume`、同じ履歴)。既に作業しているディレクトリを指定すれば、履歴はそこにあります。
121
+ 移行も、やり直しも要りません。
122
+
123
+ **10体いなくても元は取れます。** 並列 **1〜3** セッションの時点で移行する価値があったという
124
+ 報告があります。上に挙げた利点は「もっと多く走らせること」ではなく「見失わないこと」の話です。
125
+
126
+ ## インストールと起動
127
+
128
+ **Node 22.12 以上**と、`PATH` 上の以下の CLI が必要です。
129
+
130
+ > **どれも入れたことがない場合**は、コマンドラインの経験がない前提で、macOS と Windows の
131
+ > 両方を最初から説明したガイドがあります:
132
+ > [はじめに — 起動するまで](https://receptron.github.io/mulmoterminal/guide/ja/getting-started.html)
133
+
134
+ | | ツール | 何ができるようになるか | インストール |
135
+ | --- | --- | --- | --- |
136
+ | **必須** | [`claude`](https://claude.com/claude-code) | すべての Claude セッション。本アプリはその管制塔です | `npm i -g @anthropic-ai/claude-code` のあと、一度 `claude` を実行してログイン |
137
+ | **必須** | `git` | worktree による隔離、各セルのブランチ / 未保存ドット / diff 表示、PR フッター | `brew install git` · `sudo apt install git` · Windows: [git-scm.com](https://git-scm.com/download/win) |
138
+ | **必須** | `gh` | 横断的な **PR & Issue** ビューとワンクリック PR 作成。`gh` のログインを使うのでトークンは保存しません | [cli.github.com](https://cli.github.com) のあと `gh auth login` |
139
+ | 任意 | `glab` | **GitLab** プロジェクトで同じこと。self-hosted も設定可 | `brew install glab` のあと `glab auth login` |
140
+ | 推奨 | `tmux` | **セッションの永続化** — サーバー再起動を越えて端末が残ります | `brew install tmux` · `sudo apt install tmux` · Windows ネイティブ版は無し(通常の PTY にフォールバック) |
141
+ | 任意 | `codex` | セル内での **Codex セッション** | `npm i -g @openai/codex` |
142
+ | 任意 | `ffmpeg` | mulmo-script パネルからの動画生成 | `brew install ffmpeg` · `sudo apt install ffmpeg` |
143
+ | 任意 | `ollama` | 完全にローカルなモデルで Claude Code を動かす | [ollama.com/download](https://ollama.com/download) |
144
+
145
+ 必須でない行が無くてもサーバーは起動します。その機能が使えなくなるだけで、
146
+ ヘッダーやパネルがその旨を表示します。
147
+
148
+ ```bash
149
+ npx mulmoterminal@latest # http://localhost:34567 で起動しブラウザを開く
150
+ # またはグローバルに入れる:
151
+ npm install -g mulmoterminal
152
+ mulmoterminal
153
+ ```
154
+
155
+ **止め方。** 起動した端末で `Ctrl+C`。その端末が見つからなければ、ブラウザの
156
+ **Settings → Quit MulmoTerminal**、または任意の端末から **`npx mulmoterminal@latest stop`**。
157
+ `tmux` が入っていればエージェントのセッションは生き残り、**Settings → Sessions that survived
158
+ a restart** から戻ってきます。
159
+
160
+ **初回セットアップ(任意)。** `npx mulmoterminal@latest init` が環境を確認し、
161
+ Claude Code の履歴からランチャーの**ディレクトリ候補**を作り、`~/.mulmoterminal/config.json`
162
+ を書きます。**何度実行しても同じ結果**になるので、候補を更新したくなったらいつでも再実行できます。
163
+
164
+ ## ドキュメント
165
+
166
+ **[receptron.github.io/mulmoterminal](https://receptron.github.io/mulmoterminal/)**
167
+
168
+ - **ユーザーガイド:** [日本語](https://receptron.github.io/mulmoterminal/guide/ja/) —
169
+ グリッドの使い方・日々のワークフロー・機能一覧・設定・スマホ通知
170
+ - **User guide:** [English](https://receptron.github.io/mulmoterminal/guide/en/)
171
+ - **アップデート情報:** 新バージョンや新機能は X でお知らせしています —
172
+ 日本語は [Singularity Society (@SingularitySoci)](https://x.com/SingularitySoci)、
173
+ 英語は [@mulmocast](https://x.com/mulmocast)
174
+
175
+ ## 作っている人
176
+
177
+ **[receptron](https://github.com/receptron)** —
178
+ Microsoft で **Windows 95** のソフトウェアアーキテクトを務めた
179
+ **[中島聡](https://x.com/snakajima)** と **[有本勇](https://github.com/isamu)**。
180
+ **[GraphAI](https://github.com/receptron/graphai)** と同じ2人です。
181
+
182
+ ## ライセンス
183
+
184
+ MIT
185
+
186
+ ---
187
+
188
+ > **この README は、英語版の最初の約360行(製品の説明と導入)に対応しています。**
189
+ > 設定・アーキテクチャ・スクリプト・スキル・デッキ・worktree と PR・リモートホストなどの
190
+ > 詳細は、[英語版 README](README.md) と
191
+ > [日本語ユーザーガイド](https://receptron.github.io/mulmoterminal/guide/ja/) を参照してください。
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # MulmoTerminal
2
2
 
3
+ **English** · [日本語](README.ja.md) · [简体中文](README.zh.md)
4
+
3
5
  **Run multiple coding-agent sessions in parallel — and see which one needs you.**
4
6
 
5
7
  A **browser terminal** for **parallel AI coding agents**: several sessions side by side, each in
@@ -58,8 +60,10 @@ ping to your phone when a task finishes. One `npx` command, no Electron, no conf
58
60
  npx mulmoterminal@latest # starts on http://localhost:34567 and opens your browser
59
61
  ```
60
62
 
61
- Requires **Node ≥ 22.12** and the [`claude`](https://claude.com/claude-code) CLI on your
62
- `PATH`, already logged in. `npx mulmoterminal@latest init` reports what it can't find.
63
+ Requires **Node ≥ 22.12**, and by default the [`claude`](https://claude.com/claude-code) CLI —
64
+ on your `PATH` or named by `CLAUDE_BIN`, already logged in. Declare a different default agent
65
+ (`--agent codex`, or `"defaultAgent"` in `~/.mulmoterminal/config.json`) and start-up checks that
66
+ one instead. `npx mulmoterminal@latest init` reports what it can't find.
63
67
 
64
68
  ### Why not tmux + iTerm panes?
65
69
 
@@ -255,7 +259,7 @@ more.
255
259
 
256
260
  ## Install & run
257
261
 
258
- Needs **Node ≥ 22.12**, plus these CLIs on your `PATH`:
262
+ Needs **Node ≥ 22.12**, plus these CLIs — on your `PATH`, or named by the matching `<AGENT>_BIN`:
259
263
 
260
264
  > **Never installed any of this before?** The guide walks it end to end, macOS and Windows,
261
265
  > assuming no command-line experience:
@@ -264,7 +268,7 @@ Needs **Node ≥ 22.12**, plus these CLIs on your `PATH`:
264
268
 
265
269
  | | Tool | What it gives you | Install |
266
270
  | --- | --- | --- | --- |
267
- | **Required** | [`claude`](https://claude.com/claude-code) | every Claude session — this app is a cockpit for it | `npm i -g @anthropic-ai/claude-code`, then run `claude` once to log in |
271
+ | **Required** *(unless you declare another)* | [`claude`](https://claude.com/claude-code) | every Claude session — this app is a cockpit for it. Start-up requires it **by default**; declare a default agent and it checks that one instead — `npx mulmoterminal --agent codex`, or `"defaultAgent": "codex"` in `~/.mulmoterminal/config.json` (#2082). `CLAUDE_BIN` is honoured, so an install off `PATH` counts | `npm i -g @anthropic-ai/claude-code`, then run `claude` once to log in |
268
272
  | **Required** | `git` | [worktree isolation](#git-worktrees--pull-requests), each cell's branch / unsaved-dot / diff readout, the PR footer | `brew install git` · `sudo apt install git` · `sudo dnf install git` · Windows: [git-scm.com](https://git-scm.com/download/win) |
269
273
  | **Required** | `gh` | the cross-repo **PRs & Issues** view and one-click PR creation — it uses your `gh` login, so no token is stored | [cli.github.com](https://cli.github.com), then `gh auth login` |
270
274
  | Optional | `glab` | the same for **GitLab** projects (#981) — gitlab.com, and a self-hosted instance you declare in `gitlabHosts` (#1332). Same arrangement: the CLI holds the credentials, this app stores no token | `brew install glab`, then `glab auth login` (self-hosted: `glab auth login --hostname gitlab.example.com`) |
@@ -276,7 +280,10 @@ Needs **Node ≥ 22.12**, plus these CLIs on your `PATH`:
276
280
 
277
281
  The server starts without any of the non-required rows; you just lose that row's feature,
278
282
  and the header/panel for it says so. `git` and `gh` are marked required because losing them
279
- costs whole views rather than one button. `npx mulmoterminal@latest init` (below) reports which of
283
+ costs whole views rather than one button. `claude` is required only until you name a different
284
+ default agent — see
285
+ [Starting without Claude Code](https://receptron.github.io/mulmoterminal/guide/en/agents.html#default-agent)
286
+ · [日本語](https://receptron.github.io/mulmoterminal/guide/ja/agents.html#default-agent). `npx mulmoterminal@latest init` (below) reports which of
280
287
  these it can find.
281
288
 
282
289
  ```bash
@@ -346,8 +353,8 @@ npx mulmoterminal@latest --cwd ./my-project # work in a specific directory
346
353
  ```
347
354
 
348
355
  The published package ships the server (run via `tsx`) plus the pre-built web UI;
349
- `npx mulmoterminal@latest` checks for the `claude` CLI, picks a free port, starts the
350
- server, and opens the browser. For local development from a clone, see
356
+ `npx mulmoterminal@latest` checks for the `claude` CLI — or for whichever agent you set as the
357
+ default — picks a free port, starts the server, and opens the browser. For local development from a clone, see
351
358
  [Running](#running).
352
359
 
353
360
  **Won't start with `ERR_MODULE_NOT_FOUND`?** If a first `npx` run was interrupted, a half-unpacked `~/.npm/_npx/<hash>` cache can remain and a later run fails at startup — a corrupted npx cache, not a bug in the published package.
@@ -650,7 +657,10 @@ detects `tmux` on `PATH` at startup and uses it automatically when present.
650
657
  | Plugins | GUI-protocol Vue plugins (`@mulmoclaude/*`, `@mulmochat-plugin/*`): markdown, form, image, chart, HTML, collection, accounting, mulmoscript (MulmoCast video/slides), google |
651
658
  | Tests | Vitest + @vue/test-utils + jsdom |
652
659
 
653
- Requires **Node ≥ 22.12** (uses `node --env-file-if-exists`) and the `claude` CLI on `PATH`.
660
+ Requires **Node ≥ 22.12** (uses `node --env-file-if-exists`) and, by default, the `claude` CLI —
661
+ found on `PATH` or named by `CLAUDE_BIN`. Declaring a different default agent (`--agent codex`, or
662
+ `"defaultAgent"` in `~/.mulmoterminal/config.json`) makes start-up check that agent instead (#2082):
663
+ see [Starting without Claude Code](https://receptron.github.io/mulmoterminal/guide/en/agents.html#default-agent).
654
664
 
655
665
  ---
656
666
 
package/README.zh.md ADDED
@@ -0,0 +1,172 @@
1
+ # MulmoTerminal
2
+
3
+ [English](README.md) · [日本語](README.ja.md) · **简体中文**
4
+
5
+ **并行跑多个编码智能体会话 —— 一眼看出哪一个在等你。**
6
+
7
+ 一个给**并行 AI 编码智能体**用的**浏览器终端**:多个会话并排,每个占一格,
8
+ **在等你的那一个用颜色标出来**。默认是 **Claude Code**,另有六个 CLI 同为一等公民 ——
9
+ Codex、Antigravity、Grok、Muse、GitHub Copilot CLI、Cursor CLI。单个智能体的 vibe coding 一个 shell 就够了,
10
+ 这个工具是给**同时跑好几个、然后分不清谁在等你**的时候用的。会话能挺过刷新(tmux),
11
+ 工作隔离在 **git worktree** 里,一轮结束时**推送到手机**。
12
+
13
+ **每一格都是真实的 pty。** `htop`、`lazygit`、开发服务器、Claude Code —— 在这里是同一类东西。
14
+ 所以「每个 worktree 一个会话」的限制**只对智能体生效**,一个 shell 或 `yarn dev`
15
+ 可以和正在干活的智能体待在同一个 worktree 里。
16
+
17
+ ## 演示
18
+
19
+ ![MulmoTerminal —— 按状态着色的 Claude Code 会话网格,实时更新](https://raw.githubusercontent.com/receptron/mulmoterminal/main/docs/guide/images/hero.gif)
20
+
21
+ *实际运行中的网格 —— 每一格标为 **在跑**、**跑完了** 或 **等你**。*
22
+
23
+ ```bash
24
+ npx mulmoterminal@latest # 在 http://localhost:34567 启动并打开浏览器
25
+ ```
26
+
27
+ 需要 **Node 22.12 以上**,以及 `PATH` 上已登录的
28
+ [`claude`](https://claude.com/claude-code) CLI。
29
+ `npx mulmoterminal@latest init` 会告诉你缺了什么。
30
+
31
+ ### 为什么不用 tmux + iTerm 分屏?
32
+
33
+ 并行地跑起来从来不是难点,tmux 就能做。丢掉的是**五个里面哪一个在等你**。
34
+ 一个 pane 是不透明的:在跑、跑完了、卡在权限确认上 —— 不读一遍就分不出来。
35
+
36
+ 在 MulmoTerminal 里,每一格都把自己的状态报告给同一个网格 ——
37
+ 在跑(蓝)、跑完了(绿)、**等你**(琥珀)。屏幕外的格子变琥珀时会响一声。
38
+ 还有一个**每个会话一行的 cockpit roster**,所以你在回答其中一个的时候,
39
+ 不会丢掉另外四个的位置。
40
+
41
+ 装了 tmux 的话它就跑在 tmux **之上**,[重启也不会丢](#会话持久化-tmux)。
42
+
43
+ ## 为什么你会想要它
44
+
45
+ - **一眼看完所有智能体。** 按状态着色的会话网格 —— 在跑(蓝)、**被权限挡住 / 等你**(琥珀)、
46
+ **跑完但还没看**(蓝)、空闲。配上提示音和工具栏计数,屏幕外卡住的智能体不会溜过去。
47
+ 不用再守着一个终端,改成监督十个。放大其中一个,**cockpit roster** 仍然让其余的留在视野里 ——
48
+ 每个会话一行文字:AI 摘要、上一条 prompt、最新回复、以及分支的 **PR 阶段**
49
+ (draft / CI 失败 / ready / merged)。
50
+ - **给智能体的 GUI,而不只是终端。** 终端旁边的 **Canvas** 面板会把智能体通过 MCP 产出的东西 ——
51
+ **文档、表单、图表、生成的图片、HTML、collection 卡片** —— 各自用专属插件画出来。
52
+ 智能体不是给你打印文字,而是递给你一个界面。
53
+ - **人在哪里都能被叫回来。** 任务完成或等待输入时会**推送到手机**,配合 **RemoteHost**
54
+ 还能在手机上看会话、点一下就回答(**yes / no / continue**)。走开、被叫、回来。
55
+ - **重启不丢任何东西。** 有 `tmux` 的话,服务器崩溃、重启、`node --watch` 重载,
56
+ 每个会话都活着 —— 跑到一半的智能体、长时间的构建、开发服务器都继续跑,回来时自动接上。
57
+ - **不离开网格就能发布。** 每个仓库格子带 **git 分支标签**,一键隔离到 **git worktree**,
58
+ 打开 **diff** 面板,完成 **commit / push / 开 PR**。多个智能体可以在同一个仓库里互不干扰。
59
+ - **知道花了多少钱。** 每个会话的**上下文 %**、**token**、**预估 $**,工具调用的**时间线**,
60
+ 以及单元格标题和命令输出的 **AI 摘要** —— 让一整墙的并行智能体保持可读。
61
+ - **按你的习惯来。** 按目录设置**主题、颜色和名字徽章**(`prod` 红色、`staging` 琥珀色)、
62
+ 可配置的头部、自定义提示音,以及在格子里直接启动项目脚本、`.claude/skills` 和 deck 的
63
+ Run / Skill / Mulmo 菜单。
64
+
65
+ ![MulmoTerminal 的网格视图 —— 四个 Claude 会话并排运行,各自属于不同颜色的项目](https://raw.githubusercontent.com/receptron/mulmoterminal/main/docs/guide/images/grid-2x2-live.png)
66
+
67
+ *网格就是**并行智能体的驾驶舱**。每个格子的头部摆着你做判断需要的东西 ——
68
+ **模型 · 上下文 %**、**token 数**(`⇡in ⇣out`)、**git 分支 / 变更**标签,
69
+ 以及这个智能体正在做什么的 AI 摘要。**格子的边框颜色表示状态**,屏幕外卡住的格子会用声音把你叫回来。*
70
+
71
+ ### 底层是怎么回事
72
+
73
+ 每个会话在服务器上作为真实的 PTY 运行(把智能体 CLI 放进一个伪终端),
74
+ 通过 WebSocket 流到浏览器里的 [xterm.js](https://xtermjs.org/) 终端。
75
+
76
+ **cockpit roster** 列出所有会话,并实时反映哪些**在跑**(智能体在思考)、
77
+ 哪些**在等你**(权限确认或提问 —— 琥珀色圆点,你不答它就不往下走)、
78
+ 哪些**跑完了但你还没看**(绿色圆点)。这些来自**服务器在启动会话时注入的
79
+ Claude / Codex activity hook**,不是去解析屏幕上的文字。
80
+
81
+ > 这是关键。在终端里,「卡在权限确认上」和「还在思考」**看起来完全一样** ——
82
+ > 两者都只是不再输出了。读屏幕分不出来,hook 可以。
83
+ >
84
+ > (Codex 不上报「等待输入」:它的确认框画在自己的 TUI 里,不会进 rollout 文件。
85
+ > 所以对 Codex 来说只有「在跑 / 跑完了」两种状态。)
86
+
87
+ ## 换过来的人怎么说
88
+
89
+ > 以下是从 IDE 或分屏终端迁移过来的用户的反馈,不是基准测试,也不是我们测量过的结论。
90
+ > 你的环境可能不同。
91
+
92
+ **「它不再吃我的内存了」** —— 靠开多个 IDE 窗口来隔离智能体的代价很高:
93
+ 每个窗口都带上自己的编辑器、语言服务器、扩展和文件监听。有用户反馈说
94
+ **64GB 的机器在那种负载下会卡**,换过来之后就顺了。在这里智能体是服务器上的 PTY,
95
+ 界面是浏览器标签页。
96
+
97
+ **「我不再回错智能体了」** —— 六个滚动文字的 pane 长得一模一样。
98
+ 有用户描述过**把回复打进了另一个智能体的终端**,并且想不起来最初让它做什么。
99
+ 问题不在注意力,而在于 N 个相同的 pane 意味着要在脑子里保持 N 份上下文。
100
+ 状态着色、名字徽章和按目录的颜色,把这件事从脑子里搬到了屏幕上。
101
+
102
+ **「看很多和读一个不再是二选一」** —— 把终端切成六份,每个 pane 都小到读不完一段长回复
103
+ (有用户碰到的是 4000 字的回复)。于是每加一个智能体,你就默默接受更差的阅读体验。
104
+ **网格 ↔ 放大**去掉了这个取舍:先看全部,再把一个放大好好读,
105
+ 期间 cockpit roster 仍然以文字形式保留其余的。
106
+
107
+ **「我原有的会话跟着一起过来了」** —— 会话原样恢复(同样的 `claude --resume`,同样的记录)。
108
+ 指向一个你本来就在用的目录,历史就在那里。不用迁移,也不用重做。
109
+
110
+ **不需要十个智能体才划算。** 有用户反馈在并行 **1 到 3** 个会话时就已经值得换过来。
111
+ 上面这些好处讲的是「不再跟丢」,不是「跑得更多」。
112
+
113
+ ## 安装与运行
114
+
115
+ 需要 **Node 22.12 以上**,以及 `PATH` 上的这些 CLI:
116
+
117
+ | | 工具 | 它带来什么 | 安装 |
118
+ | --- | --- | --- | --- |
119
+ | **必需** | [`claude`](https://claude.com/claude-code) | 所有 Claude 会话,本应用是它的驾驶舱 | `npm i -g @anthropic-ai/claude-code`,然后跑一次 `claude` 登录 |
120
+ | **必需** | `git` | worktree 隔离、每格的分支 / 未保存点 / diff、PR footer | `brew install git` · `sudo apt install git` · Windows: [git-scm.com](https://git-scm.com/download/win) |
121
+ | **必需** | `gh` | 跨仓库的 **PR & Issue** 视图和一键开 PR。用你自己的 `gh` 登录,不存 token | [cli.github.com](https://cli.github.com),然后 `gh auth login` |
122
+ | 可选 | `glab` | 对 **GitLab** 项目做同样的事,支持自建实例 | `brew install glab`,然后 `glab auth login` |
123
+ | 推荐 | `tmux` | **会话持久化** —— 终端能挺过服务器重启 | `brew install tmux` · `sudo apt install tmux` · Windows 无原生版本(退回普通 PTY) |
124
+ | 可选 | `codex` | 在格子里跑 **Codex 会话** | `npm i -g @openai/codex` |
125
+ | 可选 | `ffmpeg` | 从 mulmo-script 面板渲染视频 | `brew install ffmpeg` · `sudo apt install ffmpeg` |
126
+ | 可选 | `ollama` | 用完全本地的模型跑 Claude Code | [ollama.com/download](https://ollama.com/download) |
127
+
128
+ 缺少非必需的行,服务器照样启动,只是少掉那一行的功能,并且界面会说明。
129
+
130
+ ```bash
131
+ npx mulmoterminal@latest # 在 http://localhost:34567 启动并打开浏览器
132
+ # 或者全局安装:
133
+ npm install -g mulmoterminal
134
+ mulmoterminal
135
+ ```
136
+
137
+ **怎么停。** 在启动它的终端按 `Ctrl+C`;找不到那个终端的话,用浏览器里的
138
+ **Settings → Quit MulmoTerminal**,或者在任意终端跑 **`npx mulmoterminal@latest stop`**。
139
+ 装了 `tmux` 的话智能体会话会活下来,从 **Settings → Sessions that survived a restart** 回来。
140
+
141
+ **首次配置(可选)。** `npx mulmoterminal@latest init` 会检查环境,
142
+ 从你的 Claude Code 历史里生成启动器的**目录预设**,并写入 `~/.mulmoterminal/config.json`。
143
+ 它是**幂等的**,想刷新预设随时可以再跑一次。
144
+
145
+ ## 文档
146
+
147
+ **[receptron.github.io/mulmoterminal](https://receptron.github.io/mulmoterminal/)**
148
+
149
+ - **用户指南(英文):** [English](https://receptron.github.io/mulmoterminal/guide/en/) ——
150
+ 网格视图、日常工作流、完整功能列表、配置、手机推送
151
+ - **用户指南(日文):** [日本語](https://receptron.github.io/mulmoterminal/guide/ja/)
152
+ - **更新:** 新版本和新功能在 X 上发布 ——
153
+ 英文 [@mulmocast](https://x.com/mulmocast),日文
154
+ [Singularity Society (@SingularitySoci)](https://x.com/SingularitySoci)
155
+
156
+ ## 谁在做
157
+
158
+ **[receptron](https://github.com/receptron)** ——
159
+ 在微软担任 **Windows 95** 软件架构师的
160
+ **[中島聡 (Satoshi Nakajima)](https://x.com/snakajima)**
161
+ 和 **[有本勇 (Isamu Arimoto)](https://github.com/isamu)**,
162
+ 也就是做 **[GraphAI](https://github.com/receptron/graphai)** 的同一组人。
163
+
164
+ ## 许可证
165
+
166
+ MIT
167
+
168
+ ---
169
+
170
+ > **本文对应英文 README 的前约 360 行(产品介绍与安装)。**
171
+ > 配置、架构、脚本、skills、deck、worktree 与 PR、远程主机等细节,
172
+ > 请看[英文 README](README.md) 和[用户指南](https://receptron.github.io/mulmoterminal/guide/en/)。
@@ -0,0 +1,15 @@
1
+ // Types for bin/agent-bins.js — hand-written for the reason every other bin/*.d.ts is: the file is
2
+ // plain JS because it runs before tsx does, and the specs and the server are TypeScript.
3
+ import type { TerminalAgent } from "../common/sessionAgent.js";
4
+
5
+ export interface AgentBinSpec {
6
+ /** The environment variable that overrides the command, e.g. `CLAUDE_BIN`. */
7
+ env: string;
8
+ /** The command as installed. NOT always the agent id — agy and cursor-agent are the commands. */
9
+ bin: string;
10
+ }
11
+
12
+ export declare const AGENT_BIN_SPEC: Record<TerminalAgent, AgentBinSpec>;
13
+ export declare function agentBin(agent: string, env?: Record<string, string | undefined>): string | null;
14
+ /** Only the agents this repository documents an install command for. */
15
+ export declare const AGENT_INSTALL_HINT: Partial<Record<TerminalAgent, string>>;
@@ -0,0 +1,38 @@
1
+ // Which binary each hosted agent runs, and the environment variable that overrides it.
2
+ //
3
+ // Here in `bin/` rather than in `server/` because the CLI needs it BEFORE the server exists: the
4
+ // start-up gate has to decide whether the declared agent is installed, and it runs under plain node
5
+ // with no tsx. The server imports from `bin/` already (bin/instances.js), so this direction is the
6
+ // established one.
7
+ //
8
+ // The table is duplicated knowledge by construction — `server/config/agent-bins.ts` builds the same
9
+ // mapping out of the adapters — so a spec pins the two together rather than a comment asking the
10
+ // next person to keep them in sync.
11
+ //
12
+ // The KEY is the agent id and the `bin` is NOT always the same word: agy and cursor-agent are the
13
+ // commands, `antigravity` and `cursor` are what the rest of the app calls them.
14
+ export const AGENT_BIN_SPEC = {
15
+ claude: { env: "CLAUDE_BIN", bin: "claude" },
16
+ codex: { env: "CODEX_BIN", bin: "codex" },
17
+ antigravity: { env: "ANTIGRAVITY_BIN", bin: "agy" },
18
+ grok: { env: "GROK_BIN", bin: "grok" },
19
+ muse: { env: "MUSE_BIN", bin: "muse" },
20
+ copilot: { env: "COPILOT_BIN", bin: "copilot" },
21
+ cursor: { env: "CURSOR_BIN", bin: "cursor-agent" },
22
+ };
23
+
24
+ /** The command that actually runs for `agent`, honouring its `<AGENT>_BIN` override. */
25
+ export function agentBin(agent, env = process.env) {
26
+ const spec = AGENT_BIN_SPEC[agent];
27
+ if (spec === undefined) return null;
28
+ return env[spec.env] || spec.bin;
29
+ }
30
+
31
+ /** The install command for the agents this repository actually documents one for — Claude Code in
32
+ * the start-up gate's own message, codex in PATH_TOOLS. The other five are deliberately ABSENT
33
+ * rather than guessed: an install line that is wrong is worse than none, because it is the one
34
+ * thing a stuck user will paste. They get the binary name and the guide link instead. */
35
+ export const AGENT_INSTALL_HINT = {
36
+ claude: "npm install -g @anthropic-ai/claude-code && claude auth login",
37
+ codex: "npm install -g @openai/codex",
38
+ };
package/bin/cli-args.d.ts CHANGED
@@ -16,7 +16,7 @@ export declare function saysYes(answer: unknown): boolean;
16
16
  export declare const SECOND_INSTANCE_NOTE: string;
17
17
  export declare const MIN_NODE_LABEL: string;
18
18
  export declare function nodeMeetsMinimum(version: string): boolean;
19
- export declare function serverNodeArgs(serverEntry: string, launchDir: string, port: number): string[];
19
+ export declare function serverNodeArgs(serverEntry: string, launchDir: string, port: number, declaredAgent?: string | null): string[];
20
20
  export declare function serverSpawnEnv(env: Record<string, string | undefined>, cwd: string): Record<string, string | undefined>;
21
21
  export interface RunningInstance {
22
22
  pid: number;
package/bin/cli-args.js CHANGED
@@ -426,9 +426,14 @@ export function nodeMeetsMinimum(version) {
426
426
  * MulmoTerminal's own port (#1857). Renaming it would only move that: `MULMOTERMINAL_PORT` is
427
427
  * deliberately given to PTYs (server/session/mcp-config.ts) for the MCP URLs, so a server
428
428
  * reading it as its bind port would clash with itself the moment `yarn dev` ran inside a cell.
429
+ *
430
+ * `--agent` rides the same channel for the same reason (#2082): it is a preference, and a
431
+ * preference in the environment would reach every terminal in every cell exactly as the port did.
432
+ * Omitted entirely when nothing was declared, so the server falls through to its config file.
429
433
  */
430
- export function serverNodeArgs(serverEntry, launchDir, port) {
431
- return ["--import", "tsx", `--env-file-if-exists=${join(launchDir, ".env")}`, serverEntry, "--port", String(port)];
434
+ export function serverNodeArgs(serverEntry, launchDir, port, declaredAgent = null) {
435
+ const base = ["--import", "tsx", `--env-file-if-exists=${join(launchDir, ".env")}`, serverEntry, "--port", String(port)];
436
+ return declaredAgent === null ? base : [...base, "--agent", declaredAgent];
432
437
  }
433
438
 
434
439
  /**
@@ -0,0 +1,19 @@
1
+ // Types for bin/default-agent.js. See that file for why the gate works the way it does.
2
+ import type { TerminalAgent } from "../common/sessionAgent.js";
3
+
4
+ export interface StartupGate {
5
+ /** Whose binary start-up must find. */
6
+ agent: TerminalAgent;
7
+ /** Always true today; named so a future "warn instead" cannot be added by accident. */
8
+ required: boolean;
9
+ /** Whether the user asked for this agent, which changes what the failure says. */
10
+ declared: boolean;
11
+ }
12
+
13
+ export declare function isKnownAgent(value: unknown): value is TerminalAgent;
14
+ /** The raw token after `--agent`, `""` for a valueless flag, or null when absent. */
15
+ export declare function parseAgentArg(args: readonly string[]): string | null;
16
+ export declare function resolveDeclaredAgent(input?: { cliAgent?: string | null; configAgent?: string | null }): string | null;
17
+ export declare function gateFor(declaredAgent: string | null): StartupGate;
18
+ export declare function configuredDefaultAgent(parsedConfig: unknown): string | null;
19
+ export declare function missingAgentMessage(gate: StartupGate, bin: string | null): string[];