mulmoterminal 1.1.0 → 1.2.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 (198) hide show
  1. package/README.md +79 -39
  2. package/bin/mulmoterminal.js +94 -9
  3. package/dist/assets/{abnfDiagram-VRR7QNED-6nNByj6v-DGtwdUf8.js → abnfDiagram-VRR7QNED-6nNByj6v-CK1tLzZi.js} +1 -1
  4. package/dist/assets/architecture-TIHT7OUA-CYMWc3UT-H5BlYssV.js +1 -0
  5. package/dist/assets/{architectureDiagram-ZJ3FMSHR-Bgnyaj_i-DGIWwfAV.js → architectureDiagram-ZJ3FMSHR-Bgnyaj_i-DYKRXxkz.js} +1 -1
  6. package/dist/assets/{blockDiagram-677ZJIJ3-DQ35o5E4-27RPR53D.js → blockDiagram-677ZJIJ3-DQ35o5E4-DkXlAnEd.js} +1 -1
  7. package/dist/assets/{c4Diagram-LMCZKHZV-ClWZeiWo-CqXuDI4P.js → c4Diagram-LMCZKHZV-ClWZeiWo-DXZ6SmWu.js} +1 -1
  8. package/dist/assets/channel-Di5rtkx0-B0y8mvDO.js +1 -0
  9. package/dist/assets/{chunk-32BRIVSS-CCt9wtYd-CGaPp4LL.js → chunk-32BRIVSS-CCt9wtYd-CzMB8O8i.js} +1 -1
  10. package/dist/assets/{chunk-52WLFC77-FbBbR4uI-UAwhz_M9.js → chunk-52WLFC77-FbBbR4uI-hzUvoH_V.js} +1 -1
  11. package/dist/assets/{chunk-C7G6YPKG-C87hlS9c-DedqefeW.js → chunk-C7G6YPKG-C87hlS9c-CrQXTywZ.js} +1 -1
  12. package/dist/assets/{chunk-EX3LRPZG-BqGqMXLN-Bb1Mz7iv.js → chunk-EX3LRPZG-BqGqMXLN-BSo1BpSI.js} +1 -1
  13. package/dist/assets/{chunk-FWX5IMBZ-BkbSAAuW-C2rOKQ0W.js → chunk-FWX5IMBZ-BkbSAAuW-BN9xwFlf.js} +2 -2
  14. package/dist/assets/{chunk-HOUHSVGY-Cxu0eDlh-Di1lybq-.js → chunk-HOUHSVGY-Cxu0eDlh-DilYgrtR.js} +1 -1
  15. package/dist/assets/{chunk-ICXQ74PX-hiraF_Xj-CDR-rXNa.js → chunk-ICXQ74PX-hiraF_Xj-Ck8cH9BW.js} +1 -1
  16. package/dist/assets/{chunk-MOJQB5TN-CqxshQHA--ID4cJe7.js → chunk-MOJQB5TN-CqxshQHA-hb8sT9ul.js} +1 -1
  17. package/dist/assets/{chunk-OGEWGWER-CjCr7ceX-D4uLoRem.js → chunk-OGEWGWER-CjCr7ceX-FCREpp2S.js} +1 -1
  18. package/dist/assets/{chunk-PUDLZKDR-Dx6M-vz1-CAsrnK3r.js → chunk-PUDLZKDR-Dx6M-vz1-EOkNGOKy.js} +1 -1
  19. package/dist/assets/{chunk-Q4XR5HBZ-CZd-9lTB-BJpdeIug.js → chunk-Q4XR5HBZ-CZd-9lTB-BHk1rWmk.js} +1 -1
  20. package/dist/assets/{chunk-V7JOEXUC-rI0xlC_O-f1PG3F-p.js → chunk-V7JOEXUC-rI0xlC_O-CIs_bL1j.js} +1 -1
  21. package/dist/assets/{chunk-VAUOI2AC-DrcykVNK-Dj0ZfRKp.js → chunk-VAUOI2AC-DrcykVNK-Cm1y1eF0.js} +1 -1
  22. package/dist/assets/{chunk-VR4S4FIN-O6iF8Yvf-BUapiHE2.js → chunk-VR4S4FIN-O6iF8Yvf-XaMLfxHT.js} +1 -1
  23. package/dist/assets/{chunk-WYO6CB5R-B83L_z6I-DOF2nExc.js → chunk-WYO6CB5R-B83L_z6I-C1WGAsfM.js} +1 -1
  24. package/dist/assets/{chunk-ZGVPDNZ5-BpFv9JSP-DYPeNPBm.js → chunk-ZGVPDNZ5-BpFv9JSP-BKMdOjwd.js} +1 -1
  25. package/dist/assets/classDiagram-OUVF2IWQ-BgAZMSbT-DaE02I1I.js +1 -0
  26. package/dist/assets/classDiagram-v2-EOCWNBFH-DxHTyui1-DaE02I1I.js +1 -0
  27. package/dist/assets/cynefin-VYW2F7L2-DqA3n9nY-937NWG5-.js +1 -0
  28. package/dist/assets/{cynefinDiagram-TSTJHNR4-x0-0sQ15-BLbtiLIJ.js → cynefinDiagram-TSTJHNR4-x0-0sQ15-vmlemYgO.js} +1 -1
  29. package/dist/assets/{dagre-VKFMJZFB-CQdfl-bx-DZX-S9Hf.js → dagre-VKFMJZFB-CQdfl-bx-D3bMpoFr.js} +1 -1
  30. package/dist/assets/{diagram-FQU43EPY-BOSB6VUb-DYrk9-JY.js → diagram-FQU43EPY-BOSB6VUb-Cb76gTiK.js} +1 -1
  31. package/dist/assets/{diagram-G47NLZAW-DLXrcXsN-DMUMSDYC.js → diagram-G47NLZAW-DLXrcXsN-C3GKnaLY.js} +1 -1
  32. package/dist/assets/{diagram-NH7WQ7WH-BMQp1rkF-DZu3Xn7Y.js → diagram-NH7WQ7WH-BMQp1rkF-CM69Zadf.js} +1 -1
  33. package/dist/assets/{diagram-OA4YK3LP-D1wQ0vUj-Ctkx0KEb.js → diagram-OA4YK3LP-D1wQ0vUj-C_m2O-pS.js} +1 -1
  34. package/dist/assets/{diagram-WEI45ONY-RR0DpF8R-sQWvPoC1.js → diagram-WEI45ONY-RR0DpF8R-CsLaijnw.js} +1 -1
  35. package/dist/assets/{ebnfDiagram-CCIWWBDH-M123uVJ8-edZCdQvS.js → ebnfDiagram-CCIWWBDH-M123uVJ8-vqN4J8aH.js} +1 -1
  36. package/dist/assets/{erDiagram-Q63AITRT-BWx_-PXG-CfR7msPF.js → erDiagram-Q63AITRT-BWx_-PXG-BC2_Ti6R.js} +1 -1
  37. package/dist/assets/eventmodeling-45OFAUF4-_BVSjAXf-Dr1OLGHI.js +1 -0
  38. package/dist/assets/flowDiagram-23GEKE2U-BeOc_anm-CCLlPnCf.js +1 -0
  39. package/dist/assets/{ganttDiagram-NO4QXBWP-BOoJ1eTw-B73WAEs4.js → ganttDiagram-NO4QXBWP-BOoJ1eTw-BJ8RzW36.js} +1 -1
  40. package/dist/assets/gitGraph-TEB2WS4Q-CH12KLTN-BGZXN91M.js +1 -0
  41. package/dist/assets/{gitGraphDiagram-IHSO6WYX-B2CJhk_G-D2IbZUGe.js → gitGraphDiagram-IHSO6WYX-B2CJhk_G-j7ZfRBi7.js} +1 -1
  42. package/dist/assets/{index-YA9xgtak.js → index-CrPHIo_O.js} +126 -126
  43. package/dist/assets/{index-SBAFcRMP.css → index-DhfRF3g0.css} +1 -1
  44. package/dist/assets/info-DKCQHKI2-Cbw3mbiK-U7eFrQdg.js +1 -0
  45. package/dist/assets/{infoDiagram-FWYZ7A6U-Mp1X3pBP-C20vVR0c.js → infoDiagram-FWYZ7A6U-Mp1X3pBP-BcxHFEoP.js} +1 -1
  46. package/dist/assets/{ishikawaDiagram-FXEZZL3T-BNG7tkJu-Dtf3IBKS.js → ishikawaDiagram-FXEZZL3T-BNG7tkJu-D4NHNB73.js} +1 -1
  47. package/dist/assets/{journeyDiagram-5HDEW3XC-Dbp_hY9X-Z7iGrqwh.js → journeyDiagram-5HDEW3XC-Dbp_hY9X-C5wWotnc.js} +1 -1
  48. package/dist/assets/{kanban-definition-HUTT4EX6-DSTc5u3q-js-QvcYr.js → kanban-definition-HUTT4EX6-DSTc5u3q-DaM6ePy2.js} +1 -1
  49. package/dist/assets/{line-B1wBwzrY-yLbpFjgh.js → line-B1wBwzrY-v5xPQ3Tb.js} +1 -1
  50. package/dist/assets/{marp-8yMkefyS.js → marp-C5wXHEN-.js} +1 -1
  51. package/dist/assets/material-symbols-outlined-BmmV8Mzf.woff2 +0 -0
  52. package/dist/assets/{mermaid-parser.core-DC7NPJ_M-IqvgPv4-.js → mermaid-parser.core-DC7NPJ_M-CdLorTPK.js} +2 -2
  53. package/dist/assets/{mermaid.core-DZM3Ha-E-964Ly4Uk.js → mermaid.core-DZM3Ha-E-H2ucOstP.js} +3 -3
  54. package/dist/assets/{mindmap-definition-LN4V7U3C-DYtgcMsY-DzFenrqW.js → mindmap-definition-LN4V7U3C-DYtgcMsY-BnSgJ097.js} +1 -1
  55. package/dist/assets/packet-7NZHBO7P-lwb58iYx-bUMa-SyO.js +1 -0
  56. package/dist/assets/{pegDiagram-2B236MQR-C43eIpKM-CPxm1zaJ.js → pegDiagram-2B236MQR-C43eIpKM-mXxeIrN3.js} +1 -1
  57. package/dist/assets/pie-RZYD4A2V-B1UWb4Gu-BmvZFSbc.js +1 -0
  58. package/dist/assets/{pieDiagram-ENE6RG2P-BkTqgJyR-SuQOUJv7.js → pieDiagram-ENE6RG2P-BkTqgJyR-BHLyQX_P.js} +1 -1
  59. package/dist/assets/{quadrantDiagram-ABIIQ3AL-Bm1Zjm45-CxN3pVD1.js → quadrantDiagram-ABIIQ3AL-Bm1Zjm45-CwECxXwc.js} +1 -1
  60. package/dist/assets/radar-I7S5WNFK-7CKcb_l--D2naYxey.js +1 -0
  61. package/dist/assets/railroad-3IZDKUUU-gCySKdnW-BB52Xytk.js +1 -0
  62. package/dist/assets/railroad-abnf-AHOZXSZD-BophH4r--pKzcYmzb.js +1 -0
  63. package/dist/assets/railroad-ebnf-EBAXGLYW-AZNjl_Zu-BXf-VL0l.js +1 -0
  64. package/dist/assets/railroad-peg-LSFZ7HO6-BSiEEyeb-BtIZNBUj.js +1 -0
  65. package/dist/assets/{railroadDiagram-RFXS5EU6-BkfbdeAs-x3RjQYe5.js → railroadDiagram-RFXS5EU6-BkfbdeAs-RtIkhujC.js} +1 -1
  66. package/dist/assets/{requirementDiagram-TGXJPOKE-CrGTTjYg-CZVJXiB0.js → requirementDiagram-TGXJPOKE-CrGTTjYg-Cn_wM9GJ.js} +1 -1
  67. package/dist/assets/{sankeyDiagram-HTMAVEWB-rWXPf03Z-DhdvF4v5.js → sankeyDiagram-HTMAVEWB-rWXPf03Z-B4NBlZda.js} +1 -1
  68. package/dist/assets/{sequenceDiagram-DBY2YBRQ-nkJYWO2m-Dvi_zljF.js → sequenceDiagram-DBY2YBRQ-nkJYWO2m-CMIBxvlT.js} +1 -1
  69. package/dist/assets/{stateDiagram-2N3HPSRC-T4-clK8b-nnUFeTnz.js → stateDiagram-2N3HPSRC-T4-clK8b-BAjJG2OJ.js} +1 -1
  70. package/dist/assets/stateDiagram-v2-6OUMAXLB-DIp7nhRd-CLL8JGdr.js +1 -0
  71. package/dist/assets/{swimlanes-5IMT3BWC-HmQNEntu-CnEGBQ_x.js → swimlanes-5IMT3BWC-HmQNEntu-B75jvy7P.js} +1 -1
  72. package/dist/assets/swimlanesDiagram-G3AALYLV-BeoZhwg7-5UMpA0Gl.js +8 -0
  73. package/dist/assets/{timeline-definition-FHXFAJF6-CNc9jSTP-DzXY5BW4.js → timeline-definition-FHXFAJF6-CNc9jSTP-B1AaTzX1.js} +1 -1
  74. package/dist/assets/treeView-QDETBFTQ-nIQcG1h9-DRcIJuj7.js +1 -0
  75. package/dist/assets/treemap-6X3UGDF4-BnsvC8yL-RxH8JYse.js +1 -0
  76. package/dist/assets/{vennDiagram-L72KCM5P-Dr3pTJ_0-Cz_J7qhF.js → vennDiagram-L72KCM5P-Dr3pTJ_0-C4GAKsik.js} +1 -1
  77. package/dist/assets/wardley-OPB4EBWU-8Odxkx6V-BMFgaEV7.js +1 -0
  78. package/dist/assets/{wardleyDiagram-EHGQE667-DSFc7ZZa-dN8C2khV.js → wardleyDiagram-EHGQE667-DSFc7ZZa-DUTWbway.js} +1 -1
  79. package/dist/assets/{xychartDiagram-FW5EYKEG-BP0Nn4Pp-BhdsqgjF.js → xychartDiagram-FW5EYKEG-BP0Nn4Pp-DQTMNwv_.js} +1 -1
  80. package/dist/index.html +2 -2
  81. package/package.json +17 -17
  82. package/server/backends/fileChange.ts +1 -1
  83. package/server/backends/notifier.ts +1 -1
  84. package/server/backends/remoteHost/skills.ts +1 -1
  85. package/server/backends/thumbnailStore.ts +1 -1
  86. package/server/backends/workspaceSetup.ts +1 -1
  87. package/server/cli-init.ts +101 -0
  88. package/server/{cwd-presets.spec.ts → config/cwd-presets.spec.ts} +43 -1
  89. package/server/config/cwd-presets.ts +78 -0
  90. package/server/{header-context.ts → config/header-context.ts} +3 -3
  91. package/server/{header-title.spec.ts → config/header-title.spec.ts} +2 -2
  92. package/server/{header-title.ts → config/header-title.ts} +3 -3
  93. package/server/{open-dir.ts → files/open-dir.ts} +1 -1
  94. package/server/{git-status.spec.ts → git/git-status.spec.ts} +5 -10
  95. package/server/index.ts +42 -36
  96. package/server/{install-config-skill.spec.ts → infra/install-config-skill.spec.ts} +1 -1
  97. package/server/{install-config-skill.ts → infra/install-config-skill.ts} +4 -3
  98. package/server/{plugins-registry.ts → infra/plugins-registry.ts} +5 -4
  99. package/server/{sandbox.ts → infra/sandbox.ts} +2 -1
  100. package/server/{web-push.ts → infra/web-push.ts} +1 -1
  101. package/server/mcp/broker.ts +1 -1
  102. package/server/{command-summary.ts → session/command-summary.ts} +1 -1
  103. package/dist/assets/architecture-TIHT7OUA-CYMWc3UT-DZ-Znbwf.js +0 -1
  104. package/dist/assets/channel-Di5rtkx0-DQLsM284.js +0 -1
  105. package/dist/assets/classDiagram-OUVF2IWQ-BgAZMSbT-DkPZzR8t.js +0 -1
  106. package/dist/assets/classDiagram-v2-EOCWNBFH-DxHTyui1-DkPZzR8t.js +0 -1
  107. package/dist/assets/cynefin-VYW2F7L2-DqA3n9nY-BYm2Z0OV.js +0 -1
  108. package/dist/assets/eventmodeling-45OFAUF4-_BVSjAXf-BkWd65jm.js +0 -1
  109. package/dist/assets/flowDiagram-23GEKE2U-BeOc_anm-S4lNiAx3.js +0 -1
  110. package/dist/assets/gitGraph-TEB2WS4Q-CH12KLTN-TRRwXHmK.js +0 -1
  111. package/dist/assets/info-DKCQHKI2-Cbw3mbiK-D8Wk2Q2C.js +0 -1
  112. package/dist/assets/material-symbols-outlined-DKJDg2oJ.woff2 +0 -0
  113. package/dist/assets/packet-7NZHBO7P-lwb58iYx-BUFe98QC.js +0 -1
  114. package/dist/assets/pie-RZYD4A2V-B1UWb4Gu-CW09MPfM.js +0 -1
  115. package/dist/assets/radar-I7S5WNFK-7CKcb_l--DXFUvOtM.js +0 -1
  116. package/dist/assets/railroad-3IZDKUUU-gCySKdnW-BU8WcG97.js +0 -1
  117. package/dist/assets/railroad-abnf-AHOZXSZD-BophH4r--Bsm5mLm7.js +0 -1
  118. package/dist/assets/railroad-ebnf-EBAXGLYW-AZNjl_Zu-BpVcU0NO.js +0 -1
  119. package/dist/assets/railroad-peg-LSFZ7HO6-BSiEEyeb-Da2qBADq.js +0 -1
  120. package/dist/assets/stateDiagram-v2-6OUMAXLB-DIp7nhRd-BviIi3HE.js +0 -1
  121. package/dist/assets/swimlanesDiagram-G3AALYLV-BeoZhwg7-gz62UWNS.js +0 -8
  122. package/dist/assets/treeView-QDETBFTQ-nIQcG1h9-DfpLaR6K.js +0 -1
  123. package/dist/assets/treemap-6X3UGDF4-BnsvC8yL-76EFh-rZ.js +0 -1
  124. package/dist/assets/wardley-OPB4EBWU-8Odxkx6V-D573z6BH.js +0 -1
  125. package/server/cwd-presets.ts +0 -40
  126. /package/server/{claude-args.spec.ts → agents/claude-args.spec.ts} +0 -0
  127. /package/server/{claude-args.ts → agents/claude-args.ts} +0 -0
  128. /package/server/{codex-args.spec.ts → agents/codex-args.spec.ts} +0 -0
  129. /package/server/{codex-args.ts → agents/codex-args.ts} +0 -0
  130. /package/server/{codex-session.spec.ts → agents/codex-session.spec.ts} +0 -0
  131. /package/server/{codex-session.ts → agents/codex-session.ts} +0 -0
  132. /package/server/{codex-sessions.spec.ts → agents/codex-sessions.spec.ts} +0 -0
  133. /package/server/{codex-sessions.ts → agents/codex-sessions.ts} +0 -0
  134. /package/server/{codex-skills.spec.ts → agents/codex-skills.spec.ts} +0 -0
  135. /package/server/{codex-skills.ts → agents/codex-skills.ts} +0 -0
  136. /package/server/{app-config.spec.ts → config/app-config.spec.ts} +0 -0
  137. /package/server/{app-config.ts → config/app-config.ts} +0 -0
  138. /package/server/{config-routes.ts → config/config-routes.ts} +0 -0
  139. /package/server/{config-schema.spec.ts → config/config-schema.spec.ts} +0 -0
  140. /package/server/{config-schema.ts → config/config-schema.ts} +0 -0
  141. /package/server/{dir-config.spec.ts → config/dir-config.spec.ts} +0 -0
  142. /package/server/{dir-config.ts → config/dir-config.ts} +0 -0
  143. /package/server/{header-config.spec.ts → config/header-config.spec.ts} +0 -0
  144. /package/server/{header-config.ts → config/header-config.ts} +0 -0
  145. /package/server/{header-context.spec.ts → config/header-context.spec.ts} +0 -0
  146. /package/server/{header-resolve.spec.ts → config/header-resolve.spec.ts} +0 -0
  147. /package/server/{header-resolve.ts → config/header-resolve.ts} +0 -0
  148. /package/server/{files-browse.spec.ts → files/files-browse.spec.ts} +0 -0
  149. /package/server/{files-browse.ts → files/files-browse.ts} +0 -0
  150. /package/server/{open-dir.spec.ts → files/open-dir.spec.ts} +0 -0
  151. /package/server/{pick-file.spec.ts → files/pick-file.spec.ts} +0 -0
  152. /package/server/{pick-file.ts → files/pick-file.ts} +0 -0
  153. /package/server/{scripts.spec.ts → files/scripts.spec.ts} +0 -0
  154. /package/server/{scripts.ts → files/scripts.ts} +0 -0
  155. /package/server/{gh.ts → git/gh.ts} +0 -0
  156. /package/server/{git-status.ts → git/git-status.ts} +0 -0
  157. /package/server/{gitRemote.spec.ts → git/gitRemote.spec.ts} +0 -0
  158. /package/server/{gitRemote.ts → git/gitRemote.ts} +0 -0
  159. /package/server/{issues.spec.ts → git/issues.spec.ts} +0 -0
  160. /package/server/{issues.ts → git/issues.ts} +0 -0
  161. /package/server/{pr-for-branch.spec.ts → git/pr-for-branch.spec.ts} +0 -0
  162. /package/server/{pr-for-branch.ts → git/pr-for-branch.ts} +0 -0
  163. /package/server/{prs.spec.ts → git/prs.spec.ts} +0 -0
  164. /package/server/{prs.ts → git/prs.ts} +0 -0
  165. /package/server/{worktree-diff.spec.ts → git/worktree-diff.spec.ts} +0 -0
  166. /package/server/{worktree-diff.ts → git/worktree-diff.ts} +0 -0
  167. /package/server/{worktree-pr.spec.ts → git/worktree-pr.spec.ts} +0 -0
  168. /package/server/{worktree-pr.ts → git/worktree-pr.ts} +0 -0
  169. /package/server/{worktree-routes.spec.ts → git/worktree-routes.spec.ts} +0 -0
  170. /package/server/{worktree-routes.ts → git/worktree-routes.ts} +0 -0
  171. /package/server/{worktrees.spec.ts → git/worktrees.spec.ts} +0 -0
  172. /package/server/{worktrees.ts → git/worktrees.ts} +0 -0
  173. /package/server/{accounting-tool.ts → infra/accounting-tool.ts} +0 -0
  174. /package/server/{host-tools.ts → infra/host-tools.ts} +0 -0
  175. /package/server/{pubsub.ts → infra/pubsub.ts} +0 -0
  176. /package/server/{sandbox.spec.ts → infra/sandbox.spec.ts} +0 -0
  177. /package/server/{spa-fallback.spec.ts → infra/spa-fallback.spec.ts} +0 -0
  178. /package/server/{spa-fallback.ts → infra/spa-fallback.ts} +0 -0
  179. /package/server/{tmux-routes.spec.ts → infra/tmux-routes.spec.ts} +0 -0
  180. /package/server/{tmux-routes.ts → infra/tmux-routes.ts} +0 -0
  181. /package/server/{tmux.spec.ts → infra/tmux.spec.ts} +0 -0
  182. /package/server/{tmux.ts → infra/tmux.ts} +0 -0
  183. /package/server/{web-push.spec.ts → infra/web-push.spec.ts} +0 -0
  184. /package/server/{activity-hook.spec.ts → session/activity-hook.spec.ts} +0 -0
  185. /package/server/{activity-hook.ts → session/activity-hook.ts} +0 -0
  186. /package/server/{activity-state.spec.ts → session/activity-state.spec.ts} +0 -0
  187. /package/server/{activity-state.ts → session/activity-state.ts} +0 -0
  188. /package/server/{command-summary.spec.ts → session/command-summary.spec.ts} +0 -0
  189. /package/server/{cost.spec.ts → session/cost.spec.ts} +0 -0
  190. /package/server/{cost.ts → session/cost.ts} +0 -0
  191. /package/server/{file-cache.spec.ts → session/file-cache.spec.ts} +0 -0
  192. /package/server/{file-cache.ts → session/file-cache.ts} +0 -0
  193. /package/server/{session-resolve.spec.ts → session/session-resolve.spec.ts} +0 -0
  194. /package/server/{session-resolve.ts → session/session-resolve.ts} +0 -0
  195. /package/server/{terminal-replay.spec.ts → session/terminal-replay.spec.ts} +0 -0
  196. /package/server/{terminal-replay.ts → session/terminal-replay.ts} +0 -0
  197. /package/server/{transcript.spec.ts → session/transcript.spec.ts} +0 -0
  198. /package/server/{transcript.ts → session/transcript.ts} +0 -0
package/README.md CHANGED
@@ -1,28 +1,57 @@
1
1
  # mulmoterminal
2
2
 
3
- A browser-based terminal + GUI workspace for coding agents — [Claude Code](https://claude.com/claude-code)
4
- and OpenAI's **Codex** — with a sidebar that lists the current project's chat sessions
5
- and shows live, hook-driven activity for each one.
6
-
7
- Each session runs as a real PTY on the server (the agent CLI in a pseudo-terminal) and
8
- is streamed to an [xterm.js](https://xtermjs.org/) terminal in the browser over a
9
- WebSocket. A sidebar lists every session for the project and reflects, in real time,
10
- which sessions are **working** (the agent is thinking) and which **need attention**
11
- (waiting for input, or finished with output you haven't seen).
12
-
13
- Around the terminal sit the things a coding session needs: a **grid** of parallel
14
- sessions, an optional **GUI panel** for rich tool output (documents, forms, images,
15
- charts), **git worktree** isolation with one-click **push / open PR**, a full-screen
16
- **file browser + editor**, per-session **cost & token** readouts, a cross-repo **PRs &
17
- Issues** view, and read-only **Wiki** and **Collections** browsers over the shared
18
- workspace.
19
-
20
- **Inserting a file path** like a native terminal, you can put a file's absolute
21
- path into the prompt: **drag a file** onto the terminal (works where the browser
22
- exposes the path via `file://`Firefox/Safari), or click the **📎 file button**
23
- in the terminal header, which asks the local server to open the OS file dialog and
24
- inserts the chosen path (works in every browser, including Chrome). The path is
25
- inserted at the cursor it is not submitted, so you can review it first.
3
+ **Run a whole team of coding agents from your browser and actually keep up with them.**
4
+
5
+ MulmoTerminal turns [Claude Code](https://claude.com/claude-code) (and OpenAI's **Codex**)
6
+ into a parallel, observable workspace: many agent sessions at once in a grid, each one
7
+ color-coded so you see at a glance which are **working**, which **need you**, and which are
8
+ **done** plus rich GUI output, git worktrees with one-click PRs, cost readouts, and a
9
+ ping to your phone when a task finishes. One `npx` command, no Electron, no config.
10
+
11
+ ```bash
12
+ npx mulmoterminal # starts on http://localhost:34567 and opens your browser
13
+ ```
14
+
15
+ ## Why you'll want it
16
+
17
+ - **See every agent at once.** A grid of live sessions, each cell color-coded by state —
18
+ **working** (blue), **blocked / needs a permission** (amber), **done, unreviewed** (blue),
19
+ **idle** — with an attention chime and a toolbar tally, so an off-screen agent that's stuck
20
+ never slips past you. Stop babysitting one terminal; supervise ten.
21
+ - **A GUI for your agents, not just a terminal.** Beside the terminal, a **Canvas** panel
22
+ renders what an agent produces over MCP **documents, forms, charts, generated images,
23
+ HTML, collection cards** each drawn by its own plugin. The agent doesn't just print
24
+ text; it hands you an interface.
25
+ - **Get pulled back from anywhere.** A finished background task sends a **Web Push to your
26
+ phone**, and the **RemoteHost** companion lets you watch and start sessions from the phone
27
+ itself — walk away, get pinged, jump back in.
28
+ - **Nothing is lost on a restart.** With `tmux`, every session survives a server crash,
29
+ restart, or `node --watch` reload — a mid-turn agent, a long build, a dev server all keep
30
+ running and reattach when you come back.
31
+ - **Ship without leaving the grid.** Each repo cell shows a **git branch chip**, isolates
32
+ work in a one-click **git worktree**, opens a **diff** panel, and does **commit / push /
33
+ open PR** — so several agents can work the same repo without colliding.
34
+ - **Know what it's costing.** Per-session **context %**, **token**, and **estimated $**
35
+ readouts, an **activity timeline** of tool calls, and **AI-summarized** cell titles and
36
+ command-output explanations — so a wall of parallel agents stays legible.
37
+ - **Make it yours.** Per-directory **themes, colors, and name badges** (`prod` in red,
38
+ `staging` in amber), a configurable header (buttons + info chips), custom attention sounds,
39
+ and Run / Skill menus to launch a project's scripts and `.claude/skills` right inside a cell.
40
+
41
+ ### What it is, under the hood
42
+
43
+ Each session runs as a real PTY on the server (the agent CLI in a pseudo-terminal) and is
44
+ streamed to an [xterm.js](https://xtermjs.org/) terminal in the browser over a WebSocket. A
45
+ sidebar lists every session for the project and reflects, in real time, which are **working**
46
+ (the agent is thinking) and which **need attention** (waiting for input, or finished with
47
+ output you haven't seen) — driven by Claude/Codex activity hooks the server injects per spawn.
48
+
49
+ **Inserting a file path** — like a native terminal, you can put a file's absolute path into
50
+ the prompt: **drag a file** onto the terminal (works where the browser exposes the path via
51
+ `file://` — Firefox/Safari), or click the **📎 file button** in the terminal header, which
52
+ asks the local server to open the OS file dialog and inserts the chosen path (works in every
53
+ browser, including Chrome). The path is inserted at the cursor — it is not submitted, so you
54
+ can review it first.
26
55
 
27
56
  ---
28
57
 
@@ -41,6 +70,13 @@ npm install -g mulmoterminal
41
70
  mulmoterminal
42
71
  ```
43
72
 
73
+ **First-run setup (optional).** `npx mulmoterminal init` checks your environment (Node ≥ 22.9,
74
+ the `claude` CLI, plus optional `tmux` / `gh` / `codex`), seeds the launcher's **directory
75
+ presets** from the projects in your Claude Code history, and writes `~/.mulmoterminal/config.json`.
76
+ It's **idempotent** — re-run it any time to refresh the presets; it overwrites the managed parts
77
+ and keeps your other settings. When `claude` is installed it can hand off to the
78
+ `/mulmoterminal-config` skill for interactive tweaks.
79
+
44
80
  A global install isn't auto-updated, so on startup MulmoTerminal checks npm and
45
81
  prints a one-line notice when a newer version is available (`npm i -g mulmoterminal`
46
82
  to update). Disable with `MULMOTERMINAL_NO_UPDATE_CHECK=1` (or `NO_UPDATE_NOTIFIER=1`).
@@ -1083,22 +1119,26 @@ resumed session falls back to any on-disk `ai-title`.
1083
1119
  server/
1084
1120
  index.ts Express app, /api routes, upgrade routing, PTY lifecycle,
1085
1121
  session state, hook injection, session discovery, GUI-MCP mount
1086
- agents/ AgentAdapter seam claude.ts, codex.ts, registry.ts
1087
- codex-*.ts Codex sessions, args, rollout discovery, skill mirroring
1088
- tmux.ts tmux-backed session persistence (own -L mulmoterminal server)
1089
- sandbox.ts Docker sandbox spawn for the single-view Claude session
1090
- worktrees.ts, worktree-*.ts git worktree create/list/diff/push/PR + routes
1091
- git-status.ts, gitRemote.ts, gh.ts, prs.ts, issues.ts git & GitHub (via gh)
1092
- cost.ts, transcript.ts cost estimate; usage/context from transcripts
1093
- files-browse.ts file tree + read/write (contained to project root)
1094
- scripts.ts Run-menu script.json loader
1095
- command-summary.ts POST /api/command/summarize (claude -p headless)
1096
- header-title.ts cheap-model AI title for the cell header (recent turns)
1097
- app-config.ts, config-routes.ts, dir-config.ts user + per-directory config
1098
- plugins-registry.ts, mcp/ GUI plugin registry + per-session MCP broker
1099
- backends/ wiki, collections, feeds, accounting, notifier,
1100
- translation, whisper, remote-host, html, files
1101
- pubsub.ts socket.io pub/sub at /ws/pubsub
1122
+ agents/ AgentAdapter seam + per-agent args/sessions: claude.ts,
1123
+ codex.ts, registry.ts, claude-args.ts, codex-args.ts,
1124
+ codex-session(s).ts, codex-skills.ts
1125
+ config/ user + per-directory + header config: app-config.ts,
1126
+ config-routes.ts, config-schema.ts, dir-config.ts,
1127
+ cwd-presets.ts, header-*.ts
1128
+ session/ per-session transcript/activity/cost: transcript.ts,
1129
+ session-resolve.ts, activity-*.ts, cost.ts,
1130
+ command-summary.ts, terminal-replay.ts, file-cache.ts
1131
+ git/ git & GitHub (via gh) + worktrees: git-status.ts, gitRemote.ts,
1132
+ gh.ts, prs.ts, issues.ts, pr-for-branch.ts, worktrees.ts, worktree-*.ts
1133
+ files/ files-browse.ts (contained tree read/write), pick-file.ts,
1134
+ open-dir.ts, scripts.ts (Run-menu script.json loader)
1135
+ infra/ process/transport/misc: tmux.ts, tmux-routes.ts, sandbox.ts,
1136
+ pubsub.ts (socket.io /ws/pubsub), spa-fallback.ts, host-tools.ts,
1137
+ plugins-registry.ts, web-push.ts, install-config-skill.ts, accounting-tool.ts
1138
+ mcp/ per-session MCP broker
1139
+ backends/ wiki, collections, feeds, accounting, notifier,
1140
+ translation, whisper, remote-host, html, files
1141
+ skills/ bundled mulmoterminal-config skill assets
1102
1142
  fix-pty-perms.js postinstall: fixes node-pty binary permissions
1103
1143
  src/
1104
1144
  App.vue Layout; owns the active session + single/grid view
@@ -11,6 +11,7 @@ import { get as httpGet } from "node:http";
11
11
  import { createRequire } from "node:module";
12
12
  import { createServer } from "node:net";
13
13
  import { dirname, join, resolve } from "node:path";
14
+ import { createInterface } from "node:readline";
14
15
  import { fileURLToPath } from "node:url";
15
16
  import { fetchLatestVersion, isNewerVersion } from "./update-check.js";
16
17
 
@@ -46,18 +47,87 @@ function checkForUpdate() {
46
47
  });
47
48
  }
48
49
 
49
- function claudeInstalled() {
50
+ // Detect a CLI on the user's PATH by asking for its version. Intentionally resolves from
51
+ // PATH — detecting the user's installed tools is the whole point of the pre-flight /
52
+ // `init` checks.
53
+ function hasCommand(cmd, versionArg = "--version") {
50
54
  try {
51
- // Intentionally resolves `claude` from the user's PATH — detecting their
52
- // Claude Code CLI install is the whole point of this pre-flight check.
53
55
  // eslint-disable-next-line sonarjs/no-os-command-from-path
54
- execSync("claude --version", { stdio: "pipe" });
56
+ execSync(`${cmd} ${versionArg}`, { stdio: "pipe" });
55
57
  return true;
56
58
  } catch {
57
59
  return false;
58
60
  }
59
61
  }
60
62
 
63
+ function claudeInstalled() {
64
+ return hasCommand("claude");
65
+ }
66
+
67
+ function promptYesNo(question) {
68
+ return new Promise((res) => {
69
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
70
+ rl.question(question, (answer) => {
71
+ rl.close();
72
+ res(/^y(es)?$/i.test(answer.trim()));
73
+ });
74
+ });
75
+ }
76
+
77
+ // `npx mulmoterminal init` — idempotent first-run setup. Environment/CLI checks + the
78
+ // optional interactive-config launch live here (PATH-command detection); the config
79
+ // derivation + write is the tsx-run server/cli-init.ts.
80
+ async function runInit(initArgs) {
81
+ log("Setting up MulmoTerminal…\n");
82
+
83
+ const [maj, min] = process.versions.node.split(".").map((n) => Number.parseInt(n, 10));
84
+ const nodeOk = maj > 22 || (maj === 22 && min >= 9);
85
+ console.log(nodeOk ? ` ✓ Node ${process.versions.node}` : ` ✗ Node ${process.versions.node} — MulmoTerminal needs ≥ 22.9`);
86
+
87
+ const hasClaude = claudeInstalled();
88
+ if (hasClaude) {
89
+ console.log(" ✓ Claude Code CLI");
90
+ } else {
91
+ console.log(" ✗ Claude Code CLI — not found");
92
+ console.log(" → npm install -g @anthropic-ai/claude-code (then run `claude` and log in)");
93
+ }
94
+
95
+ for (const [cmd, versionArg, why, hint] of [
96
+ ["tmux", "-V", "sessions survive a restart", "brew install tmux · apt install tmux"],
97
+ ["gh", "--version", "PRs & Issues view + one-click PRs", "https://cli.github.com (then: gh auth login)"],
98
+ ["codex", "--version", "run OpenAI Codex as an agent", "npm install -g @openai/codex"],
99
+ ]) {
100
+ console.log(hasCommand(cmd, versionArg) ? ` ✓ ${cmd} — ${why}` : ` ○ ${cmd} — optional (${why})\n → ${hint}`);
101
+ }
102
+
103
+ // Config half: derive working-dir presets from Claude history + write config.json.
104
+ console.log("");
105
+ const initExit = await new Promise((res) => {
106
+ const child = spawn(process.execPath, ["--import", "tsx", join(PKG_DIR, "server", "cli-init.ts"), ...initArgs], {
107
+ cwd: PKG_DIR,
108
+ env: { ...process.env },
109
+ stdio: "inherit",
110
+ });
111
+ child.on("exit", (code) => res(code ?? 0));
112
+ });
113
+ if (initExit) {
114
+ process.exitCode = initExit;
115
+ error("Setup did not complete — see the error above.");
116
+ return;
117
+ }
118
+
119
+ // Offer the interactive skill only in a real terminal; a non-TTY run (CI / piped input)
120
+ // must never block waiting on stdin.
121
+ if (hasClaude && process.stdin.isTTY && (await promptYesNo("\nConfigure interactively now with the /mulmoterminal-config skill? [y/N] "))) {
122
+ log("Launching Claude — use /mulmoterminal-config (or just ask it to configure MulmoTerminal).");
123
+ // eslint-disable-next-line sonarjs/no-os-command-from-path
124
+ spawn("claude", ["Use the mulmoterminal-config skill to configure MulmoTerminal."], { stdio: "inherit" });
125
+ return;
126
+ }
127
+ if (hasClaude) log("Later: run `claude` in any project and use /mulmoterminal-config");
128
+ log("Setup done. Start MulmoTerminal: npx mulmoterminal");
129
+ }
130
+
61
131
  function pickOpenCommand() {
62
132
  if (process.platform === "darwin") return "open";
63
133
  if (process.platform === "win32") return "start";
@@ -225,12 +295,15 @@ function runServer(port, noOpen, cwd, onChild) {
225
295
  });
226
296
  }
227
297
 
228
- async function main() {
229
- const args = process.argv.slice(2);
298
+ function printHelp() {
299
+ console.log(`
300
+ Usage: npx mulmoterminal [command] [options]
230
301
 
231
- if (args.includes("--help") || args.includes("-h")) {
232
- console.log(`
233
- Usage: npx mulmoterminal [options]
302
+ Commands:
303
+ (none) Start the server (default)
304
+ init First-run setup: check your environment, seed working-directory
305
+ presets from your Claude Code history, and write
306
+ ~/.mulmoterminal/config.json (idempotent — safe to re-run)
234
307
 
235
308
  Options:
236
309
  --cwd <dir> Working directory claude runs in (default: current directory; relative paths allowed)
@@ -239,6 +312,18 @@ Options:
239
312
  --version Show version
240
313
  --help Show this help
241
314
  `);
315
+ }
316
+
317
+ async function main() {
318
+ const args = process.argv.slice(2);
319
+
320
+ if (args[0] === "init") {
321
+ await runInit(args.slice(1));
322
+ return;
323
+ }
324
+
325
+ if (args.includes("--help") || args.includes("-h")) {
326
+ printHelp();
242
327
  return;
243
328
  }
244
329
  if (args.includes("--version")) {
@@ -1 +1 @@
1
- import{n as e}from"./chunk-Y2CYZVJY-Bdt8pFDJ-DsF7k-Jl.js";import{f as t}from"./src-Brzfja-q-ch1VcTiG.js";import{_ as n,g as r}from"./mermaid-parser.core-DC7NPJ_M-IqvgPv4-.js";import"./chunk-WYO6CB5R-B83L_z6I-DOF2nExc.js";import"./chunk-VAUOI2AC-DrcykVNK-Dj0ZfRKp.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CqxshQHA--ID4cJe7.js";import{t as s}from"./chunk-JWPE2WC7-BQ3zXr2k-DSd3Ct95.js";var c=r().RailroadAbnf.parser.LangiumParser,l=e(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=e(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=e(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=e(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=e(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=e(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=e(e=>{s(e,a),e.title&&a.setTitle(e.title),e.rules.map(e=>a.addRule(m(e)))},`populateDb`),g={parser:{parse:e(e=>{a.clear(),t.debug(`[ABNF Parser] Starting Langium parse`);let r=c.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new n(r);let i=r.value;t.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),t.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:a}},db:a,renderer:o,styles:i};export{g as diagram};
1
+ import{n as e}from"./chunk-Y2CYZVJY-Bdt8pFDJ-DsF7k-Jl.js";import{f as t}from"./src-Brzfja-q-ch1VcTiG.js";import{_ as n,g as r}from"./mermaid-parser.core-DC7NPJ_M-CdLorTPK.js";import"./chunk-WYO6CB5R-B83L_z6I-C1WGAsfM.js";import"./chunk-VAUOI2AC-DrcykVNK-Cm1y1eF0.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CqxshQHA-hb8sT9ul.js";import{t as s}from"./chunk-JWPE2WC7-BQ3zXr2k-DSd3Ct95.js";var c=r().RailroadAbnf.parser.LangiumParser,l=e(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=e(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=e(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=e(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=e(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=e(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=e(e=>{s(e,a),e.title&&a.setTitle(e.title),e.rules.map(e=>a.addRule(m(e)))},`populateDb`),g={parser:{parse:e(e=>{a.clear(),t.debug(`[ABNF Parser] Starting Langium parse`);let r=c.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new n(r);let i=r.value;t.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),t.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:a}},db:a,renderer:o,styles:i};export{g as diagram};
@@ -0,0 +1 @@
1
+ import{f as e}from"./mermaid-parser.core-DC7NPJ_M-CdLorTPK.js";export{e as createArchitectureServices};