@marver-design/marver 0.11.0 → 0.12.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 (41) hide show
  1. package/CHANGELOG.md +83 -5
  2. package/README.md +17 -4
  3. package/dist/auth-DdUKeVKt.mjs +1150 -0
  4. package/dist/{build-Cr_ZLMdq.mjs → build-DmfxJc6L.mjs} +188 -33
  5. package/dist/cli.mjs +16 -7
  6. package/dist/collab-BmaOjwP1.mjs +781 -0
  7. package/dist/{comments-CRqaO2MH.mjs → comments-pNxjTrGN.mjs} +3 -2
  8. package/dist/{daemon-DSmaS453.mjs → daemon-WjonKlPz.mjs} +3 -3
  9. package/dist/{dev-CLBjRs0J.mjs → dev-BXq7yE1p.mjs} +5 -5
  10. package/dist/events-C9k-ceOj.mjs +101 -0
  11. package/dist/{init-BSclDg4I.mjs → init-BpitOqRQ.mjs} +2 -3
  12. package/dist/{config-t9coJ-Pq.mjs → manifest-CS6krOTe.mjs} +236 -4
  13. package/dist/{marver-id-B8-3WiHk.mjs → marver-id-CVCoaMGI.mjs} +106 -1
  14. package/dist/{marver-id-gate-BDzW6ahN.mjs → marver-id-gate-DOjnZakC.mjs} +94 -6
  15. package/dist/{plugin-vE7sxEeT.mjs → plugin-Boy7I_JH.mjs} +82 -9
  16. package/dist/{profile-DcsJyppw.mjs → profile-ChpTPd-X.mjs} +1 -1
  17. package/dist/secure-cookie-_K1Hsx8H.mjs +26 -0
  18. package/dist/{serve-CZ1KEQxd.mjs → serve-BeLLizNg.mjs} +72 -18
  19. package/dist/share-C64b1tdN.mjs +159 -0
  20. package/dist/summary-Bf9tiGrE.mjs +211 -0
  21. package/dist/{sync-DELGomPk.mjs → sync-WYxDN9IT.mjs} +3 -102
  22. package/package.json +1 -1
  23. package/src/client/shell/App.tsx +43 -8
  24. package/src/client/shell/Comments.tsx +9 -5
  25. package/src/client/shell/LockedApp.tsx +113 -0
  26. package/src/client/shell/Play.tsx +97 -18
  27. package/src/client/shell/Toolbar.tsx +26 -2
  28. package/src/client/shell/canvas/Canvas.tsx +5 -15
  29. package/src/client/shell/canvas/ctl.ts +26 -0
  30. package/src/client/shell/comments-store.ts +39 -9
  31. package/src/client/shell/hash.ts +19 -0
  32. package/src/client/shell/icons.tsx +1 -0
  33. package/src/client/shell/store.ts +54 -3
  34. package/src/client/shell/styles.css +27 -0
  35. package/src/shared/events.ts +8 -3
  36. package/templates/instructions/publish.md +15 -1
  37. package/dist/auth-B5yuwnOq.mjs +0 -494
  38. package/dist/collab-C-n-uQdm.mjs +0 -364
  39. package/dist/manifest-C2tzkNaC.mjs +0 -233
  40. package/dist/update-DuWDj5nR.mjs +0 -77
  41. package/dist/utm-CxC3QN5X.mjs +0 -20
package/CHANGELOG.md CHANGED
@@ -2,6 +2,81 @@
2
2
 
3
3
  Notable changes to `@marver-design/marver`. Format follows [Keep a Changelog](https://keepachangelog.com); versions follow semver.
4
4
 
5
+ ## 0.12.0 - 2026-08-31
6
+
7
+ ### Added
8
+
9
+ - **Sharing: grant people access to a canvas, person by person, from the terminal or
10
+ the browser.** On a canvas with a persistent volume and an owner account, `marver share`
11
+ manages a roster of *people* - who may open the canvas, who may comment, and until when -
12
+ over the canvas's owner-only routes; the browser share dialog drives the same routes.
13
+ `add`, `remove`, `block`, `unblock`, `general <mode>`, `list`, `requests`, `explain`, and
14
+ `who` cover the whole surface. Exact-email grants work on a password canvas; domain grants
15
+ (`@acme.com`), refused-visitor access requests, and the front door need Marver Sign In.
16
+ The full guide is [docs/sharing.md](docs/sharing.md).
17
+
18
+ **One resolver, one place.** A single pure function answers "what can this person do here" -
19
+ blocklist first (the only deny), then the owner, then grants additive with the highest match
20
+ winning, then a general-access floor, all clamped by each board's published ceiling. The gate
21
+ and comment writes enforce from it, reading one `share.json`, so the policy is one thing in
22
+ one place rather than a rule re-implemented per door. `marver share explain <email>` traces
23
+ it for one person and `marver share who` prints the grant matrix (both convenience views -
24
+ the dialog is the accurate read for the owner and for domain principals).
25
+
26
+ - **`design/publish.json` v2: a board can carry its artifact type and landing view, not just
27
+ its ceiling.** A board level may now be an object - `{ "max": "read" | "comment", "type":
28
+ "doc" | "slides" | "design" | "sketch" | "refs" | "mix", "open": "canvas" | "board" |
29
+ "present" | "focus" | "slides", "lock": true }` - where `max` is the ceiling (the only
30
+ field that affects access) and the rest choose how the board presents. `open` accepts all
31
+ five view names, but slides mode is v1.5: `open: "slides"` currently lands in `present`.
32
+ Every 0.11 canvas parses unchanged: a bare `"read"` or `"comment"` string is still a valid
33
+ row. (This is a schema version, unrelated to the read-privacy "v2" below.) Source paths
34
+ in a published bundle now go opaque by default (`reveal.source` defaults off) - the inlined
35
+ manifest used to carry every frame's repo path, which is a disclosure the moment a canvas
36
+ is shared beyond its own repo.
37
+
38
+ - **Access requests: a refused visitor can ask, and you can approve from the terminal.** When
39
+ someone is turned away at the identity gate, the canvas offers a request form instead of a
40
+ dead end (authenticated by a short-lived, origin-bound, single-purpose token - the refused
41
+ visitor has no session). Requests surface in `marver share requests` and the dialog;
42
+ approving grants canvas-wide at the role you choose, declining resolves silently. One
43
+ pending row per address, swept after 30 days.
44
+
45
+ - **The front door at `app.marver.design`.** A signed-in home page that lists the canvases a
46
+ person can reach, each row lit by a short summary the canvas itself signs and serves. The
47
+ front door holds no roster and makes no access decision - it asks each canvas, and each
48
+ canvas answers for itself, against browser-pinned keys. Keep a canvas silent there with
49
+ `share: { frontDoor: false }` in `design/config.ts`.
50
+
51
+ ### Notes
52
+
53
+ - **Read privacy is still v2.** Sharing v1 controls who gets in and who may comment; every
54
+ admitted person can read every published board. The read boundary today is the bundle - a
55
+ board you do not publish is not in the build. Grants are canvas-scoped and approvals are
56
+ canvas-wide by design; `share.json` is already shaped for the per-board, per-person read
57
+ privacy that arrives in v2, served rather than bundled.
58
+
59
+ - **First boot writes `share.json` from your live 0.11 state and changes nothing you did not
60
+ ask for.** Every existing account gets the canvas-wide `comment` grant it already had
61
+ (clamped per board); until that first boot, every door keeps the legacy rules. Raising a
62
+ board's ceiling never silently re-promotes anyone granted under the old one - the roster
63
+ ratchets down on every boot and only your explicit re-confirm raises an entry.
64
+
65
+ ## 0.11.1 - 2026-08-27
66
+
67
+ ### Fixed
68
+
69
+ - **The password gate's cookie now gets `Secure` from the pinned origin too.** 0.11.0 fixed
70
+ this for the collaboration session cookie and missed the gate's own, which is set in a
71
+ different file and is the one most likely to be sitting behind a plain `proxy_pass` - it is
72
+ the door on every password-mode canvas. Same rule, same reason: `MARVER_PUBLIC_ORIGIN`
73
+ decides when it is set, and `X-Forwarded-Proto` is the fallback only when there is nothing
74
+ better. Set `MARVER_PUBLIC_ORIGIN=https://your-canvas.example.com` and the thirty-day gate
75
+ cookie is https-only regardless of what your proxy tells the process.
76
+
77
+ Canvases behind a proxy that does send `X-Forwarded-Proto` - Railway, Fly, Vercel, Caddy,
78
+ and nginx configured with `proxy_set_header` - were never affected.
79
+
5
80
  ## 0.11.0 - 2026-08-27
6
81
 
7
82
  ### Added
@@ -105,15 +180,18 @@ Notable changes to `@marver-design/marver`. Format follows [Keep a Changelog](ht
105
180
 
106
181
  ### Fixed
107
182
 
108
- - **`Secure` on the session cookie no longer depends on a header your proxy may not send.**
109
- A canvas decided whether it was on https by reading `X-Forwarded-Proto`, and nginx's own
110
- documented `proxy_pass http://localhost:PORT` sets no `X-Forwarded-*` at all. A canvas
111
- served over https behind that configuration saw no header, concluded "not secure", and
112
- issued a thirty-day session cookie the browser would happily send over plain http. Where
183
+ - **`Secure` on the collaboration session cookie no longer depends on a header your proxy may
184
+ not send.** A canvas decided whether it was on https by reading `X-Forwarded-Proto`, and
185
+ nginx's own documented `proxy_pass http://localhost:PORT` sets no `X-Forwarded-*` at all. A
186
+ canvas served over https behind that configuration saw no header, concluded "not secure",
187
+ and issued a thirty-day session cookie the browser would happily send over plain http. Where
113
188
  `MARVER_PUBLIC_ORIGIN` is set it now decides - a deliberate statement by whoever deployed
114
189
  the canvas, rather than a guess about a proxy that may not be speaking. The header remains
115
190
  the fallback only where there is nothing better, which is development on loopback.
116
191
 
192
+ This release fixed the collaboration session cookie only. The password gate's own cookie
193
+ still guessed from the header - see 0.11.1.
194
+
117
195
  - **The collaboration credential has moved out of your repository, because `marver dev` was
118
196
  serving it.** It lived at `design/.local/collab.json`, and the dev server puts the repository
119
197
  on the web so frames can import from it. Authored frames run same-origin, so any frame could
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  **The agent-native design canvas.** A `design/` folder in your repo, one command, and a canvas of live frames built from your app's real components and theme. Your coding agent designs by writing files; the tool ships no AI.
8
8
 
9
- [marver.design](https://marver.design) · [Live Jam](docs/live-jam.md) · [Deploying a canvas](docs/publish.md) · [Changelog](CHANGELOG.md) · [Contributing](CONTRIBUTING.md) · [Issues](https://github.com/TNEP4/marver/issues)
9
+ [marver.design](https://marver.design) · [Live Jam](docs/live-jam.md) · [Deploying a canvas](docs/publish.md) · [Sharing](docs/sharing.md) · [Changelog](CHANGELOG.md) · [Contributing](CONTRIBUTING.md) · [Issues](https://github.com/TNEP4/marver/issues)
10
10
 
11
11
  ## Quickstart
12
12
 
@@ -28,6 +28,7 @@ Frames appear on the canvas the moment the files land. That's the loop.
28
28
  - **Everything hot-reloads.** The agent writes, you watch it land - live.
29
29
  - **True viewports.** Each frame is a real iframe: drag its edge and your actual breakpoints fire.
30
30
  - **Your agent answers on the canvas.** Tag `@marver` in a comment and it picks up the job, edits the real source, and replies in the thread - no wiring, on by default. See [Live Jam](#live-jam).
31
+ - **Feedback without a signup wall.** Publish the canvas, invite people by email, and they sign in as themselves - one free Marver account, Google or an emailed code, and it opens every canvas you ever share with them. Or keep it entirely self-hosted behind a shared password. See [Collaboration](#collaboration).
31
32
  - **No AI inside.** The designer is the coding agent you already run and pay for. `init` generates the `design/AGENTS.md` contract that teaches it the whole workflow.
32
33
 
33
34
  ## The canvas
@@ -40,9 +41,21 @@ Frames appear on the canvas the moment the files land. That's the loop.
40
41
 
41
42
  ## Collaboration
42
43
 
43
- - **Comments.** Google-Docs-style feedback pinned to actual elements. Press `c`, click a div inside a frame, write - the thread lives on that element and survives edits via a layered anchor (source semantics → structure → fuzzy text). Viewers on a published canvas comment with real names and avatars (invite-link accounts, no email infrastructure). `marver dev` syncs the same threads into `design/comments/*.jsonl`, where your agent works the queue: `npx marver comments list --open --json` → fork a variant → `resolve --addressed-in`. Live via SSE; one deploy, no extra services.
44
+ - **Comments.** Google-Docs-style feedback pinned to actual elements. Press `c`, click a div inside a frame, write - the thread lives on that element and survives edits via a layered anchor (source semantics → structure → fuzzy text). Viewers on a published canvas comment with real names and avatars - either a Marver account they already have, or an invite-link account on that canvas alone. `marver dev` syncs the same threads into `design/comments/*.jsonl`, where your agent works the queue: `npx marver comments list --open --json` → fork a variant → `resolve --addressed-in`. Live via SSE; one deploy, no extra services.
44
45
  - **Laser mode.** Press `l`: every element in every frame gets depth-hued outlines plus a hover label - the fastest way to see structure. Click any element to copy its full address (frame file + CSS path) for the agent.
45
- - **Publishing.** `npx marver build` exports a static canvas (default-closed: `design/publish.json` names what ships); `npx marver serve` hosts it with an optional password gate. One deploy on Railway, Docker, or any static host - the [publishing guide](docs/publish.md) has the one-pagers.
46
+ - **Publishing.** `npx marver build` exports a static canvas (default-closed: `design/publish.json` names what ships, and whether each board is `read` or `comment`); `npx marver serve` hosts it. One deploy on Railway, Docker, or any static host - the [publishing guide](docs/publish.md) has the one-pagers.
47
+
48
+ - **Two ways to let people in.** They are alternatives, not layers - pick one per canvas.
49
+
50
+ **Marver Sign In** (new in 0.11). Set `MARVER_ID_ISSUER=https://id.marver.design` and reviewers sign in as themselves, with Google or a six-digit code emailed to them. One free Marver account opens *every* canvas gated this way, so the second board you share costs them nothing: no new signup, no new password, no link to keep. You invite an email address and they are in.
51
+
52
+ That is the whole difference, and it is the difference between "I'll look later" and a comment actually landing on the board. It also means their real name and face ride along, so a thread is from a person rather than from an address.
53
+
54
+ **A shared password** (`MARVER_PASSWORD`). Fully self-hosted, no account anywhere but your own volume, nothing about your reviewers leaves your infrastructure - and still fully supported, not a legacy path. The trade is that every canvas is an island: reviewers claim an invite link and pick a name and password *on that canvas*, and do it again for the next one. Fine for one board, a toll on the fifth.
55
+
56
+ Either way the canvas runs on your infrastructure and stores its own comments and members. With Marver Sign In the identity service only ever tells your canvas that a verified address matched an entry on your invite list - it never sees your frames, your files, or your comments. Rights stay yours: `design/publish.json` decides which boards are readable and which are commentable, and `marver comments invite`/`revoke` decides who is on the list.
57
+
58
+ *Coming next:* one home for your account - every canvas you have been invited to, every canvas you have shared, and the access each one carries, in a single list. Today the account page at `id.marver.design` shows the canvases you have approved and lets you revoke them.
46
59
 
47
60
  ## Live Jam
48
61
 
@@ -61,7 +74,7 @@ The same glow, driven from the terminal. When your agent takes a request, it cre
61
74
  | `npx marver init` | Scaffold `design/` in this repo (safe to re-run; refreshes managed files) |
62
75
  | `npx marver dev` / `canvas` | Start the local canvas - hot reload, comments, Live Jam armed (`--port`, default 5199) |
63
76
  | `npx marver build` | Static export → `design/.dist`; what ships comes from `design/publish.json` (default-closed) |
64
- | `npx marver serve` | Serve the export; `MARVER_PASSWORD` gates it, `MARVER_DATA_DIR` persists comments + accounts |
77
+ | `npx marver serve` | Serve the export; `MARVER_ID_ISSUER` or `MARVER_PASSWORD` gates it, `MARVER_DATA_DIR` persists comments + accounts |
65
78
  | `npx marver comments …` | The agent's queue: `connect <url>` · `sync` · `list` · `reply` · `resolve` · `invite <email>` · `revoke <email>` |
66
79
  | `npx marver work …` | Working glow from the terminal: `start <scene/frame …>` · `done … \| --all` · `list` |
67
80