@mulmoclaude/core 5.6.0 → 5.6.1

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.
@@ -930,7 +930,7 @@ Notes:
930
930
 
931
931
  ### Custom views
932
932
 
933
- When the built-in views (table / calendar / kanban / dashboard) don't fit what
933
+ When the built-in views (table / calendar / kanban) don't fit what
934
934
  the user wants to _see_ — a year/quarter overview, a Gantt bar, a printable
935
935
  report — author a **custom view**: an HTML file the host renders in a sandboxed
936
936
  iframe over the records. Register it in `views[]` (above); it becomes a button
@@ -187,6 +187,30 @@ invalid`), what to check depends on the sandbox:
187
187
  `~/.claude`. Do not chase the environment variable here — the host login is the one
188
188
  that counts.
189
189
 
190
+ On macOS with the sandbox on, MulmoClaude copies the login from the Keychain into
191
+ `~/.claude/.credentials.json` and, when the token has expired and a refresh token exists,
192
+ launches the `claude` CLI to renew it. Each launch is a real Claude session, so it waits a
193
+ few minutes after a failed renewal and stops after a few failures in a row.
194
+ Look for one of these server log lines:
195
+
196
+ - `Keychain credentials cannot be renewed (<reason>)` — the Keychain item has no
197
+ refresh token (for example an empty item), so no renewal is attempted.
198
+ - `Token renewal failed N times in a row; not trying again` — renewals kept failing, so
199
+ they stopped for this server process.
200
+ - `Access token expired; last renewal failed, next attempt in Ns` — waiting before the
201
+ next try.
202
+
203
+ The fix is the same `claude /login` on the host; the next turn picks the new login up
204
+ without a restart. If the server itself would not start (it exited asking for this, and
205
+ `yarn dev` did not restart it), start it again after `/login`. If `/login` succeeds and
206
+ the "cannot be renewed" line keeps coming back, the Keychain may hold a second, empty
207
+ `Claude Code-credentials` item. MulmoClaude reads both the item under the user's login
208
+ name and whatever a lookup by service name returns, and uses the better one, so a stray
209
+ item only matters when the real login is stored under another account name.
210
+ `security find-generic-password -s "Claude Code-credentials"` prints the account (`acct`)
211
+ of the item a service-only lookup returns; an account such as `unknown` is the stray item,
212
+ removed with `security delete-generic-password -s "Claude Code-credentials" -a <that acct>`.
213
+
190
214
  You will usually be reading this AFTER the user re-logged in (a failing turn never
191
215
  reaches you); answer "why did that happen" with the cause above rather than
192
216
  investigating MulmoClaude's settings.
@@ -215,7 +239,7 @@ Tell the user to enable the two opt-in mounts on the next agent spawn
215
239
  ```bash
216
240
  # Forward the host's SSH agent into the container.
217
241
  # Private keys stay on the host; only the signing oracle is exposed.
218
- SANDBOX_FORWARD_SSH_AGENT=1 \
242
+ SANDBOX_SSH_AGENT_FORWARD=1 \
219
243
  # Mount allowlisted config files/dirs read-only — including ~/.config/gh.
220
244
  SANDBOX_MOUNT_CONFIGS=gh \
221
245
  yarn dev # or: npx mulmoclaude
@@ -20,7 +20,7 @@ Under the hood it uses the Claude Code Agent SDK as its LLM core. Claude has ful
20
20
 
21
21
  ## Key Capabilities
22
22
 
23
- - Build **collections** — schema-driven data apps (todo lists, trackers, ledgers, decks) with table / calendar / kanban / dashboard views, plus LLM-authored **custom views**; manage a calendar scheduler
23
+ - Build **collections** — schema-driven data apps (todo lists, trackers, ledgers, decks) with table / calendar / kanban views, plus LLM-authored **custom views**; manage a calendar scheduler
24
24
  - Present documents and spreadsheets with rich formatting
25
25
  - Generate and edit images
26
26
  - Create interactive mind maps
@@ -33,7 +33,7 @@ Under the hood it uses the Claude Code Agent SDK as its LLM core. Claude has ful
33
33
 
34
34
  ## Collections — Apps from Data
35
35
 
36
- Collections are MulmoClaude's most distinctive capability: a **schema-driven data app declared in a single small JSON file**, with no database, ORM, or migration tool. You describe a data model, cross-record relations, computed fields, and per-record action buttons in a `schema.json`; the host reads that DSL and renders a full app — table, calendar, kanban board, and dashboard views — over a folder of plain `<id>.json` records. The same primitives power todo lists, recipe boxes, stock portfolios, invoice ledgers, vocabulary decks, and curricula, all without any app-specific host code. This is the core philosophy made concrete: a `schema.json` plus a folder of records **is** the app.
36
+ Collections are MulmoClaude's most distinctive capability: a **schema-driven data app declared in a single small JSON file**, with no database, ORM, or migration tool. You describe a data model, cross-record relations, computed fields, and per-record action buttons in a `schema.json`; the host reads that DSL and renders a full app — table, calendar and kanban board views — over a folder of plain `<id>.json` records. The same primitives power todo lists, recipe boxes, stock portfolios, invoice ledgers, vocabulary decks, and curricula, all without any app-specific host code. This is the core philosophy made concrete: a `schema.json` plus a folder of records **is** the app.
37
37
 
38
38
  Because Claude authors and edits the schema for you in conversation, you build and reshape these apps just by talking — "add a priority field," "track this as a kanban," "make rent recur monthly" — and the collection updates live. We call this **vibe crafting**: the end-user counterpart of a developer's "vibe coding" — you describe the app you want and Claude builds it, with the schema validated and custom views sandboxed so you get the power without the pitfalls. Records stay validated, computed fields (totals, cross-collection lookups) recompute on every render, and completion bells / recurring obligations are declared in the same schema.
39
39
 
@@ -41,7 +41,7 @@ See [Collection skills](config/helps/collection-skills.md) for the full schema D
41
41
 
42
42
  ## Custom Views — Views the Built-ins Don't Cover
43
43
 
44
- When the built-in table / calendar / kanban / dashboard views don't fit what you want to _see_ — a year-at-a-glance planner, a Gantt bar, a heat-map, a printable report — Claude authors a **custom view**: a single HTML file rendered in a sandboxed iframe over the collection's records. It reads (and optionally writes) records through a scoped token, stays live as the data changes, and can hand work back to a chat — all without any view-specific host code. The view is data, just like the rest of the collection, so you can ask for an entirely new way to look at your data in plain language and get it.
44
+ When the built-in table / calendar / kanban views don't fit what you want to _see_ — a year-at-a-glance planner, a Gantt bar, a heat-map, a printable report — Claude authors a **custom view**: a single HTML file rendered in a sandboxed iframe over the collection's records. It reads (and optionally writes) records through a scoped token, stays live as the data changes, and can hand work back to a chat — all without any view-specific host code. The view is data, just like the rest of the collection, so you can ask for an entirely new way to look at your data in plain language and get it.
45
45
 
46
46
  See [Custom views](config/helps/custom-view.md) for the authoring contract. A
47
47
  view can also target the **mobile remote app** (`target: "mobile"`) — rendered
@@ -90,7 +90,7 @@ On macOS, the Docker container uses a separate credential store from the host. B
90
90
  yarn sandbox:login
91
91
  ```
92
92
 
93
- This opens an interactive `claude login` session inside the container so that the sandbox has valid credentials.
93
+ This copies the Claude Code login from the macOS Keychain to `~/.claude/.credentials.json`, which the container reads. The server also does this before each turn while the sandbox is on, and at startup when the file is missing, so the command is only needed when that fails; run `claude /login` on the host first if the login itself has expired.
94
94
 
95
95
  ## Building the Image
96
96
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mulmoclaude/core",
3
- "version": "5.6.0",
3
+ "version": "5.6.1",
4
4
  "description": "Shared server-side core for MulmoClaude and MulmoTerminal — the always-shipped-together subsystems consolidated behind subpath exports so the two hosts can't drift. Server-only except the browser-safe ./artifacts, ./whisper/client, ./workspace-setup/slug, ./translation/client, ./remote-view, ./remote-host and ./plugin-vue entries. All host specifics are injected.",
5
5
  "repository": {
6
6
  "type": "git",