mulmoclaude 1.7.2 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -1
- package/bin/mulmoclaude.js +14 -0
- package/client/assets/JsonEditor-BktU9OHD.js +10 -0
- package/client/assets/{PluginScopedRoot-BvlXkMBV.js → PluginScopedRoot-C8w5S4g8.js} +1 -1
- package/client/assets/{abnfDiagram-VRR7QNED-BanoRrli.js → abnfDiagram-VRR7QNED-vG7wED0r.js} +1 -1
- package/client/assets/{architectureDiagram-ZJ3FMSHR-BEgLzbC0.js → architectureDiagram-ZJ3FMSHR-CKq77qFp.js} +1 -1
- package/client/assets/{blockDiagram-677ZJIJ3-D6-nAhT2.js → blockDiagram-677ZJIJ3-CuluwDCv.js} +1 -1
- package/client/assets/{c4Diagram-LMCZKHZV-BHlfURC3.js → c4Diagram-LMCZKHZV-QF3fUCmD.js} +1 -1
- package/client/assets/channel-BVo9thDg.js +1 -0
- package/client/assets/{chunk-32BRIVSS-D9wEVNTU.js → chunk-32BRIVSS-CM5P4lyq.js} +1 -1
- package/client/assets/{chunk-52WLFC77-DWo67RXY.js → chunk-52WLFC77-CfpQuHNL.js} +1 -1
- package/client/assets/{chunk-C7G6YPKG-DZx-IR8j.js → chunk-C7G6YPKG-Dk0ur5qM.js} +1 -1
- package/client/assets/{chunk-EX3LRPZG-w7OrMXYQ.js → chunk-EX3LRPZG-87AronP_.js} +5 -5
- package/client/assets/chunk-FWX5IMBZ-Cd8gjahi.js +2 -0
- package/client/assets/{chunk-HOUHSVGY-CsniSN-m.js → chunk-HOUHSVGY-CxZlDK8n.js} +1 -1
- package/client/assets/{chunk-ICXQ74PX-r48BQ3SP.js → chunk-ICXQ74PX-Bg4Oo_jI.js} +1 -1
- package/client/assets/{chunk-MOJQB5TN-Zy5vyRW1.js → chunk-MOJQB5TN-vXdrkqxb.js} +1 -1
- package/client/assets/{chunk-OGEWGWER-CoEgBgV4.js → chunk-OGEWGWER-D8ar4g2C.js} +1 -1
- package/client/assets/{chunk-PUDLZKDR-B8qq3OpO.js → chunk-PUDLZKDR-CZdvX3zw.js} +9 -9
- package/client/assets/{chunk-Q4XR5HBZ-DGJYU9p1.js → chunk-Q4XR5HBZ-DcD9r_e3.js} +1 -1
- package/client/assets/{chunk-V7JOEXUC-D754YzMj.js → chunk-V7JOEXUC-D8xsZ8q2.js} +6 -6
- package/client/assets/{chunk-VAUOI2AC-BAbw2DCD.js → chunk-VAUOI2AC-BQfH6kLc.js} +1 -1
- package/client/assets/{chunk-VR4S4FIN-zILtmnP-.js → chunk-VR4S4FIN-BMk1Fnl2.js} +1 -1
- package/client/assets/chunk-WYO6CB5R-B9BCz_a4.js +127 -0
- package/client/assets/{chunk-ZGVPDNZ5-BSTv4rHJ.js → chunk-ZGVPDNZ5-Bq3d9n9g.js} +1 -1
- package/client/assets/classDiagram-OUVF2IWQ-BTJMlYvU.js +1 -0
- package/client/assets/classDiagram-v2-EOCWNBFH-BTJMlYvU.js +1 -0
- package/client/assets/{cynefinDiagram-TSTJHNR4-Bi8nukib.js → cynefinDiagram-TSTJHNR4-x3h5VMM0.js} +1 -1
- package/client/assets/{dagre-VKFMJZFB-C1ITHaIN.js → dagre-VKFMJZFB-dviCTKfT.js} +1 -1
- package/client/assets/{diagram-FQU43EPY-BaTTRfyt.js → diagram-FQU43EPY-0JeVXagv.js} +1 -1
- package/client/assets/{diagram-G47NLZAW-CacIL-Pg.js → diagram-G47NLZAW-BzN5YAWr.js} +1 -1
- package/client/assets/{diagram-NH7WQ7WH-C2XIWiyF.js → diagram-NH7WQ7WH-lFyFfjxD.js} +1 -1
- package/client/assets/{diagram-OA4YK3LP-Don4E7eX.js → diagram-OA4YK3LP-Dt3oggMg.js} +1 -1
- package/client/assets/{diagram-WEI45ONY-CyySk9Cj.js → diagram-WEI45ONY-Bn3rscct.js} +1 -1
- package/client/assets/{ebnfDiagram-CCIWWBDH-BTAOE5UD.js → ebnfDiagram-CCIWWBDH-CdsYW6Rq.js} +1 -1
- package/client/assets/{erDiagram-Q63AITRT-BmuYd4oT.js → erDiagram-Q63AITRT-Bad4BaVY.js} +1 -1
- package/client/assets/flowDiagram-23GEKE2U-CxqkMx0s.js +1 -0
- package/client/assets/{ganttDiagram-NO4QXBWP-CsSkApOb.js → ganttDiagram-NO4QXBWP-Cn_fdfCe.js} +1 -1
- package/client/assets/{gitGraphDiagram-IHSO6WYX-CtPRy8Z7.js → gitGraphDiagram-IHSO6WYX-CwHv3KxQ.js} +1 -1
- package/client/assets/{index-MNdG25W1.js → index-jQFYMjfF.js} +237 -233
- package/client/assets/index-rxM8QYSF.css +2 -0
- package/client/assets/{infoDiagram-FWYZ7A6U-DkCDDBsK.js → infoDiagram-FWYZ7A6U-C9PbBZKr.js} +1 -1
- package/client/assets/{ishikawaDiagram-FXEZZL3T-DhxgPq51.js → ishikawaDiagram-FXEZZL3T-BG98a2Dt.js} +1 -1
- package/client/assets/{journeyDiagram-5HDEW3XC-CuLTUpBK.js → journeyDiagram-5HDEW3XC-BgobpDYI.js} +1 -1
- package/client/assets/{kanban-definition-HUTT4EX6-N2X0Puic.js → kanban-definition-HUTT4EX6-BGcEGzpz.js} +10 -10
- package/client/assets/{line-BXNA28H5.js → line-Cq3d3BSq.js} +1 -1
- package/client/assets/{marp-DLKQhlvf.js → marp-BRMJ-LDQ.js} +1 -1
- package/client/assets/mermaid.core-B2IPB3a4.js +11 -0
- package/client/assets/{mindmap-definition-LN4V7U3C-CqqDm5WC.js → mindmap-definition-LN4V7U3C-B7yuGhz7.js} +24 -24
- package/client/assets/{pegDiagram-2B236MQR-DrzJ7Jz4.js → pegDiagram-2B236MQR-DSby-DBQ.js} +1 -1
- package/client/assets/{pieDiagram-ENE6RG2P-Ou2SXK-A.js → pieDiagram-ENE6RG2P-BB71abaQ.js} +1 -1
- package/client/assets/{quadrantDiagram-ABIIQ3AL-B-MGAr4e.js → quadrantDiagram-ABIIQ3AL-DprRXVvF.js} +1 -1
- package/client/assets/{railroadDiagram-RFXS5EU6-CaJYqOUh.js → railroadDiagram-RFXS5EU6-gzA4xHQH.js} +1 -1
- package/client/assets/{requirementDiagram-TGXJPOKE-06klrOCU.js → requirementDiagram-TGXJPOKE-z3Q6MA8i.js} +1 -1
- package/client/assets/{sankeyDiagram-HTMAVEWB-CP5k4rjG.js → sankeyDiagram-HTMAVEWB-KboGyKoV.js} +1 -1
- package/client/assets/{sequenceDiagram-DBY2YBRQ-DVjGagTt.js → sequenceDiagram-DBY2YBRQ-BV66diek.js} +1 -1
- package/client/assets/{stateDiagram-2N3HPSRC-CmEfTWWD.js → stateDiagram-2N3HPSRC-BL7k8WRO.js} +1 -1
- package/client/assets/stateDiagram-v2-6OUMAXLB-BwVU3mSQ.js +1 -0
- package/client/assets/{swimlanes-5IMT3BWC-B-BFEZsj.js → swimlanes-5IMT3BWC-C05WDVcU.js} +1 -1
- package/client/assets/swimlanesDiagram-G3AALYLV-uelXpt2y.js +8 -0
- package/client/assets/{timeline-definition-FHXFAJF6-CH_JlXvj.js → timeline-definition-FHXFAJF6-gl1dcp45.js} +5 -5
- package/client/assets/{vennDiagram-L72KCM5P-DlnvP9fL.js → vennDiagram-L72KCM5P-BOr1XDRT.js} +3 -3
- package/client/assets/vue-i18n-DwyyKgu3.js +3 -0
- package/client/assets/{wardleyDiagram-EHGQE667-CPX0a8kl.js → wardleyDiagram-EHGQE667-VDKJYezx.js} +1 -1
- package/client/assets/{xychartDiagram-FW5EYKEG-D_XBrDMx.js → xychartDiagram-FW5EYKEG-BaQ8QoU5.js} +1 -1
- package/client/index.html +4 -5
- package/package.json +7 -7
- package/server/agent/config.ts +46 -3
- package/server/agent/messageDecorate.ts +83 -9
- package/server/agent/prompt.ts +3 -2
- package/server/api/routes/agent.ts +44 -30
- package/server/api/routes/config.ts +9 -0
- package/server/api/routes/plugins.ts +79 -19
- package/server/api/routes/presentHtml.ts +8 -2
- package/server/api/routes/shutdown.ts +53 -0
- package/server/build/mcp-server.mjs +6679 -0
- package/server/index.ts +73 -3
- package/server/plugins/html-builtin.ts +2 -1
- package/server/plugins/markdown-builtin.ts +7 -7
- package/server/prompts/system/system.md +15 -0
- package/server/remoteHost/index.ts +34 -7
- package/server/system/config.ts +27 -2
- package/server/system/env.ts +11 -14
- package/server/system/logs/aaa +737 -0
- package/server/system/logs/bb +446 -0
- package/server/system/macosNotify.ts +47 -6
- package/server/utils/claudeConfigPath.ts +25 -4
- package/server/utils/envCoerce.ts +42 -0
- package/server/utils/files/by-path.ts +31 -0
- package/server/utils/files/document-store.ts +41 -0
- package/server/utils/files/markdown-store.ts +35 -1
- package/server/utils/html/htmlArtifactSplicer.ts +9 -1
- package/server/utils/launcher/create-shortcut.d.mts +25 -0
- package/server/utils/launcher/create-shortcut.mjs +164 -0
- package/server/utils/launcher/detect-server.d.mts +26 -0
- package/server/utils/launcher/detect-server.mjs +100 -0
- package/server/utils/launcher/launcher-page.d.mts +36 -0
- package/server/utils/launcher/launcher-page.mjs +239 -0
- package/server/utils/launcher/macos/create-app.d.mts +26 -0
- package/server/utils/launcher/macos/create-app.mjs +127 -0
- package/server/utils/launcher/macos/icon.d.mts +3 -0
- package/server/utils/launcher/macos/icon.mjs +54 -0
- package/server/utils/launcher/macos/launch.sh +51 -0
- package/server/utils/launcher/macos/message-file.sh +36 -0
- package/server/utils/launcher/macos/resolve-path.sh +119 -0
- package/server/utils/launcher/mark.d.mts +3 -0
- package/server/utils/launcher/mark.mjs +27 -0
- package/server/utils/launcher/messages.d.mts +28 -0
- package/server/utils/launcher/messages.mjs +415 -0
- package/server/utils/launcher/node-missing-text.d.mts +3 -0
- package/server/utils/launcher/node-missing-text.mjs +24 -0
- package/server/utils/launcher/platform.d.mts +11 -0
- package/server/utils/launcher/platform.mjs +107 -0
- package/server/utils/launcher/preflight.d.mts +34 -0
- package/server/utils/launcher/preflight.mjs +88 -0
- package/server/utils/launcher/run.mjs +65 -0
- package/server/utils/launcher/start.d.mts +17 -0
- package/server/utils/launcher/start.mjs +209 -0
- package/server/utils/launcher/windows/create-launcher.d.mts +16 -0
- package/server/utils/launcher/windows/create-launcher.mjs +132 -0
- package/server/utils/launcher/windows/icon.d.mts +5 -0
- package/server/utils/launcher/windows/icon.mjs +82 -0
- package/server/utils/launcher/windows/launch.vbs +86 -0
- package/server/utils/launcher/windows/locale.d.mts +7 -0
- package/server/utils/launcher/windows/locale.mjs +63 -0
- package/server/utils/time.ts +6 -0
- package/server/workspace/roles.ts +158 -11
- package/src/App.vue +34 -9
- package/src/components/SentAttachmentChip.vue +13 -3
- package/src/components/SettingsModal.vue +18 -4
- package/src/components/SettingsNotificationsTab.vue +50 -0
- package/src/components/SettingsQuitTab.vue +79 -0
- package/src/config/apiRoutes.ts +2 -0
- package/src/lang/de.ts +22 -0
- package/src/lang/en.ts +22 -0
- package/src/lang/es.ts +22 -0
- package/src/lang/fr.ts +22 -0
- package/src/lang/ja.ts +21 -0
- package/src/lang/ko.ts +21 -0
- package/src/lang/pt-BR.ts +22 -0
- package/src/lang/zh.ts +20 -0
- package/src/plugins/presentHtml/index.ts +3 -2
- package/src/plugins/textResponse/Preview.vue +3 -2
- package/src/plugins/textResponse/View.vue +4 -3
- package/src/plugins/textResponse/types.ts +8 -5
- package/src/types/attachment.ts +22 -0
- package/src/types/session.ts +6 -4
- package/src/types/sse.ts +7 -5
- package/src/utils/agent/pastedAttachment.ts +13 -2
- package/src/utils/agent/request.ts +20 -13
- package/src/utils/attachment/entries.ts +32 -0
- package/src/utils/markdown/sanitize.ts +9 -66
- package/src/utils/session/sessionHelpers.ts +6 -5
- package/src/utils/tools/result.ts +18 -8
- package/client/assets/JsonEditor-BrZEdf9X.js +0 -10
- package/client/assets/channel-CkfP_QOM.js +0 -1
- package/client/assets/chunk-FWX5IMBZ-BVoKdd_g.js +0 -2
- package/client/assets/chunk-WYO6CB5R-DOOEMpuR.js +0 -125
- package/client/assets/classDiagram-OUVF2IWQ-CsuRjVbb.js +0 -1
- package/client/assets/classDiagram-v2-EOCWNBFH-CsuRjVbb.js +0 -1
- package/client/assets/flowDiagram-23GEKE2U-Cg2bsWXx.js +0 -1
- package/client/assets/index-NWFSuC_L.css +0 -2
- package/client/assets/mermaid.core-S-qn8Fjh.js +0 -11
- package/client/assets/purify.es-sLXpNpJ5.js +0 -3
- package/client/assets/stateDiagram-v2-6OUMAXLB-v-85z0s6.js +0 -1
- package/client/assets/swimlanesDiagram-G3AALYLV-BWm8rLnX.js +0 -8
- package/client/assets/vue-i18n-n-3qAdTj.js +0 -3
package/README.md
CHANGED
|
@@ -51,6 +51,26 @@ npx mulmoclaude --help # Full flag list
|
|
|
51
51
|
|
|
52
52
|
Each boolean flag mirrors an environment variable, so `--disable-sandbox` and `DISABLE_SANDBOX=1` do the same thing. `--help` lists the rest: `--disable-macos-reminders` (skip the macOS Reminder notification sink) plus the `--journal-force-run`, `--chat-index-force-run`, and `--persist-tool-calls` debugging toggles.
|
|
53
53
|
|
|
54
|
+
## Start from an icon (macOS / Windows)
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
npx mulmoclaude create-shortcut # macOS: MulmoClaude.app / Windows: MulmoClaude.lnk
|
|
58
|
+
npx mulmoclaude create-shortcut --dir ~/Desktop
|
|
59
|
+
npx mulmoclaude create-shortcut --yes # Skip the confirmation prompt
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Creates a real app bundle on macOS (no Electron — an `Info.plist` and a shell stub) in `/Applications`, or `~/Applications` when that is not writable. On Windows it creates a Start Menu shortcut pointing at a `.vbs` stub run through `wscript.exe`, so no console window appears; the launcher's files live under `%LOCALAPPDATA%\MulmoClaude`. Double-clicking it:
|
|
63
|
+
|
|
64
|
+
1. reuses an already-running MulmoClaude by just opening the browser,
|
|
65
|
+
2. checks Node.js, `npx`, and Claude Code, and explains in your system language what to do when one is missing,
|
|
66
|
+
3. shows a progress page while `npx mulmoclaude@latest` starts, then switches to the app.
|
|
67
|
+
|
|
68
|
+
A GUI launch gets none of your shell's `PATH`, so the bundle asks your login shell for it before looking for anything — this is why a version manager (nodebrew / nvm / asdf / Volta) still works from the icon.
|
|
69
|
+
|
|
70
|
+
It also starts the server from your home directory rather than the `/` macOS hands a GUI app, so the `.env` it loads is `~/.env`.
|
|
71
|
+
|
|
72
|
+
The launcher writes `~/Library/Logs/MulmoClaude/launcher.log`. The bundle carries its own copy of the launcher code, so re-run the command after upgrading. Windows is not supported yet.
|
|
73
|
+
|
|
54
74
|
## How it works
|
|
55
75
|
|
|
56
76
|
The npm package ships with the pre-built client (Vite) and the server source — TypeScript, executed directly via `tsx`. No cloning, no build step for end users: `npx` downloads the package and starts the Express server.
|
|
@@ -129,7 +149,7 @@ Recommended: ≥ 32 characters of random data (shorter values trigger a startup
|
|
|
129
149
|
- **Auto memory** — the agent maintains a typed memory layout (`conversations/memory/<type>/<topic>.md`) and reads it ambient-style.
|
|
130
150
|
- **Web Push on task finish** — enable in Settings → Notifications to get a push on your phone when the answer to a question you asked is ready, even with the browser closed. Requires the RemoteHost connection + a registered device (see [`docs/remote-host.md`](https://github.com/receptron/mulmoclaude/blob/main/docs/remote-host.md#web-push-on-task-finish-2086)).
|
|
131
151
|
- **Google (Calendar / Tasks / Drive)** — link your Google account in Settings → Plugins → Google and consent in the browser; no Google Cloud setup needed. The agent then gets a `google` tool covering the full round trip — list, create, edit and delete calendar events and tasks (including putting a completed task back on the list), plus the Drive files it creates — and the phone remote can trigger the same commands.
|
|
132
|
-
- **Google Calendar ↔ collection sync** — a collection can mirror one of your calendars and keep itself current: the first sync starts as soon as you ask for the collection, an hourly pass follows, and a Sync button forces one. It calls the Calendar API directly rather than routing the events through the agent, so keeping it fresh costs no tokens. A **Push to Google** button beside it sends the other way, creating events for records you added and updating ones you edited — it never deletes, and it skips anything edited on both sides rather than picking a winner.
|
|
152
|
+
- **Google Calendar ↔ collection sync** — a collection can mirror one of your calendars and keep itself current: the first sync starts as soon as you ask for the collection, an hourly pass follows, and a Sync button forces one. It calls the Calendar API directly rather than routing the events through the agent, so keeping it fresh costs no tokens. A **Push to Google** button beside it sends the other way, creating events for records you added and updating ones you edited — it never deletes, and it skips anything edited on both sides rather than picking a winner. Ask for **two-way sync** and the collection pushes on the same schedule it pulls on, as one cycle, so there is no button to forget; a record the push could not send is then left alone by the pull instead of being overwritten. Without it the pull is automatic and the push is a button, so push before you sync — a pull overwrites a locally edited record as soon as Google reports a change to that event. Event **notes and location** travel in both directions alongside the title, times and colour. **The refresh token stays on your machine** (`~/.config/mulmo/`) — the sign-in service applies the OAuth client secret Google requires and keeps nothing. Prefer your own OAuth client? Drop a *desktop-app* client JSON in `~/.secrets/` and the whole flow stays local (see [`docs/remote-host.md`](https://github.com/receptron/mulmoclaude/blob/main/docs/remote-host.md)).
|
|
133
153
|
|
|
134
154
|
## Plugin authoring (`--dev-plugin`)
|
|
135
155
|
|
|
@@ -143,6 +163,13 @@ Server-side `definePlugin` factory edits still require a launcher restart (Node
|
|
|
143
163
|
- Architecture, scripts, and the publish flow live in `docs/developer.md` of the repo.
|
|
144
164
|
- Publish flow for this package: see `bin/prepare-dist.js` header comment plus `.claude/skills/publish-mulmoclaude/SKILL.md`.
|
|
145
165
|
|
|
166
|
+
## Updates
|
|
167
|
+
|
|
168
|
+
New releases and features are announced on X, **in Japanese**.
|
|
169
|
+
|
|
170
|
+
- [Singularity Society (@SingularitySoci)](https://x.com/SingularitySoci) — release and feature announcements
|
|
171
|
+
- [Satoshi Nakajima (@snakajima)](https://x.com/snakajima) — MulmoClaude's owner
|
|
172
|
+
|
|
146
173
|
## Related projects
|
|
147
174
|
|
|
148
175
|
This launcher is published by [Receptron](https://github.com/receptron), who also build MulmoTerminal below.
|
package/bin/mulmoclaude.js
CHANGED
|
@@ -100,6 +100,11 @@ const args = process.argv.slice(2);
|
|
|
100
100
|
if (args.includes("--help") || args.includes("-h")) {
|
|
101
101
|
console.log(`
|
|
102
102
|
Usage: npx mulmoclaude [options]
|
|
103
|
+
npx mulmoclaude create-shortcut [--dir <path>] [--yes]
|
|
104
|
+
|
|
105
|
+
Commands:
|
|
106
|
+
create-shortcut Create a clickable MulmoClaude.app (macOS) so the
|
|
107
|
+
app can be started without a terminal
|
|
103
108
|
|
|
104
109
|
Options:
|
|
105
110
|
--port <number> Server port (default: ${DEFAULT_PORT})
|
|
@@ -121,6 +126,15 @@ if (args.includes("--version")) {
|
|
|
121
126
|
process.exit(0);
|
|
122
127
|
}
|
|
123
128
|
|
|
129
|
+
// Generates the clickable app bundle and exits — it never starts a
|
|
130
|
+
// server. Imported lazily because the icon builder pulls in `sharp`,
|
|
131
|
+
// which nothing else on the launch path needs.
|
|
132
|
+
if (args[0] === "create-shortcut") {
|
|
133
|
+
const { runCreateShortcut } = await import("../server/utils/launcher/create-shortcut.mjs");
|
|
134
|
+
const { version } = require(join(PKG_DIR, "package.json"));
|
|
135
|
+
process.exit(await runCreateShortcut(args.slice(1), { version }));
|
|
136
|
+
}
|
|
137
|
+
|
|
124
138
|
const { requestedPort, portExplicit } = parsePortArg();
|
|
125
139
|
const noOpen = args.includes("--no-open");
|
|
126
140
|
const devPluginPaths = resolveDevPluginPaths();
|