@marver-design/marver 0.11.1 → 0.13.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/CHANGELOG.md +111 -0
- package/README.md +1 -1
- package/dist/auth-DdUKeVKt.mjs +1150 -0
- package/dist/{build-DI31MFTB.mjs → build-BxGrHFT2.mjs} +188 -33
- package/dist/cli.mjs +16 -7
- package/dist/collab-mAiNZlDj.mjs +970 -0
- package/dist/{comments-CRqaO2MH.mjs → comments-DHB_8BRa.mjs} +3 -2
- package/dist/{daemon-DSmaS453.mjs → daemon-BChkzDqQ.mjs} +3 -3
- package/dist/{dev-BWIL2ewj.mjs → dev-DLwt3Brb.mjs} +5 -5
- package/dist/events-B3LBn74P.mjs +103 -0
- package/dist/{init-BSclDg4I.mjs → init-BpitOqRQ.mjs} +2 -3
- package/dist/{config-t9coJ-Pq.mjs → manifest-CS6krOTe.mjs} +236 -4
- package/dist/{marver-id-B8-3WiHk.mjs → marver-id-CVCoaMGI.mjs} +106 -1
- package/dist/{marver-id-gate-BDzW6ahN.mjs → marver-id-gate-B2uraTHS.mjs} +100 -9
- package/dist/{plugin-DjBFxEQ7.mjs → plugin-DNc4Jpae.mjs} +82 -9
- package/dist/{profile-DcsJyppw.mjs → profile-BjAPAJSb.mjs} +1 -1
- package/dist/{serve-3APqaNSB.mjs → serve-EjEqsiYa.mjs} +70 -17
- package/dist/share-Gqo_Ygqw.mjs +158 -0
- package/dist/summary-C7CAypbB.mjs +211 -0
- package/dist/{sync-DELGomPk.mjs → sync-BZaCWqK-.mjs} +3 -102
- package/package.json +1 -1
- package/src/client/shell/App.tsx +62 -11
- package/src/client/shell/Comments.tsx +103 -22
- package/src/client/shell/LockedApp.tsx +113 -0
- package/src/client/shell/Play.tsx +97 -18
- package/src/client/shell/Toolbar.tsx +26 -2
- package/src/client/shell/canvas/Canvas.tsx +5 -15
- package/src/client/shell/canvas/ctl.ts +26 -0
- package/src/client/shell/comments-store.ts +96 -11
- package/src/client/shell/hash.ts +19 -0
- package/src/client/shell/icons.tsx +1 -0
- package/src/client/shell/mentions.ts +108 -1
- package/src/client/shell/sound.ts +32 -0
- package/src/client/shell/store.ts +66 -7
- package/src/client/shell/styles.css +68 -0
- package/src/shared/events.ts +20 -6
- package/dist/auth-B5yuwnOq.mjs +0 -494
- package/dist/collab-CWaG3Q4w.mjs +0 -340
- package/dist/manifest-C2tzkNaC.mjs +0 -233
- package/dist/update-DuWDj5nR.mjs +0 -77
- package/dist/utm-CxC3QN5X.mjs +0 -20
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,117 @@
|
|
|
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.13.0 - 2026-09-01
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **@-mentions in comments.** Type `@` in the composer to name someone already
|
|
10
|
+
visible in the canvas's comments - they get one mail for that comment and a
|
|
11
|
+
bell notification on the front door. Mentions ride the same identity-minimised
|
|
12
|
+
projection as authors: browsers only ever see opaque ids, and you can only
|
|
13
|
+
mention people you can already see. The agent side is real too: `marver
|
|
14
|
+
comments list --json` now carries each comment's mentions.
|
|
15
|
+
- **Reply mail.** A fresh reply mails the thread's other participants (the 10
|
|
16
|
+
most recent, at most once per person per thread per 6-hour window; history
|
|
17
|
+
imports never mail). Activity mail reads like a comment - who wrote it and a
|
|
18
|
+
snippet of what they said (capped, escaped; the identity service holds those
|
|
19
|
+
snippets for its delivery window - a disclosed tradeoff, documented in
|
|
20
|
+
docs/sharing.md) - and carries an unsubscribe link that mutes email without
|
|
21
|
+
touching the bell. Caveat: delivery needs Marver Sign In - a sovereign canvas
|
|
22
|
+
has no relay, and `share: { notify: false }` still declines everything.
|
|
23
|
+
- **Mentions light up in the canvas.** A mention of you pulses its comment pin
|
|
24
|
+
in accent blue until you open the thread, the marker stack opens on the
|
|
25
|
+
mentioning thread first, and a mention of YOU renders as the loudest chip -
|
|
26
|
+
including in your own view (they used to render plain exactly for the person
|
|
27
|
+
they were for). The @-picker got a solid background.
|
|
28
|
+
- **In-app notifications, with sound.** A fresh mention of you - or a reply in
|
|
29
|
+
a thread you are part of - raises a person-first pill while you are on the
|
|
30
|
+
canvas: the author's avatar, "name mentioned you", their message, and View,
|
|
31
|
+
with a soft two-tone ping (best-effort under browser autoplay rules; one
|
|
32
|
+
ping per batch). Same pill family the Live Jam agent uses, so they stack
|
|
33
|
+
together. History and first loads never announce.
|
|
34
|
+
- **Mail lands on the thread.** The activity mail's button ("Open the comment"
|
|
35
|
+
/ "Open the thread") deep-links straight to the conversation
|
|
36
|
+
(`#/b/<board>?c=<thread>`); the relay refuses any other link shape, so mail
|
|
37
|
+
can only ever point a reader back into the canvas that sent it.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- **Comment `profile` events now bind to the signed-in author.** They were
|
|
42
|
+
accepted with an arbitrary `author.email`, which let any commenter read the
|
|
43
|
+
opaque id of any guessed address off the projection.
|
|
44
|
+
- **Blank bodies and duplicate reply ids are refused.** Replay always discarded
|
|
45
|
+
them silently; the validator now agrees, so nothing downstream (like mail)
|
|
46
|
+
can fire for an event that was never going to render.
|
|
47
|
+
|
|
48
|
+
- **`marver share explain` now asks the canvas's own resolver.** It called
|
|
49
|
+
`resolveAccess` locally over the fetched roster, which drops the three things only the
|
|
50
|
+
server's `explain` route does - fills the owner role (a fresh owner was explained as an
|
|
51
|
+
ordinary ungranted person), explains a `@domain` through a synthetic member, and marks
|
|
52
|
+
the winning step. It now fetches `GET /__mv/api/share/explain?who=`, so the terminal and
|
|
53
|
+
the browser dialog can never disagree. `who` stays local (it lists only granted
|
|
54
|
+
non-owner principals, where a local resolve is identical).
|
|
55
|
+
|
|
56
|
+
## 0.12.0 - 2026-08-31
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
|
|
60
|
+
- **Sharing: grant people access to a canvas, person by person, from the terminal or
|
|
61
|
+
the browser.** On a canvas with a persistent volume and an owner account, `marver share`
|
|
62
|
+
manages a roster of *people* - who may open the canvas, who may comment, and until when -
|
|
63
|
+
over the canvas's owner-only routes; the browser share dialog drives the same routes.
|
|
64
|
+
`add`, `remove`, `block`, `unblock`, `general <mode>`, `list`, `requests`, `explain`, and
|
|
65
|
+
`who` cover the whole surface. Exact-email grants work on a password canvas; domain grants
|
|
66
|
+
(`@acme.com`), refused-visitor access requests, and the front door need Marver Sign In.
|
|
67
|
+
The full guide is [docs/sharing.md](docs/sharing.md).
|
|
68
|
+
|
|
69
|
+
**One resolver, one place.** A single pure function answers "what can this person do here" -
|
|
70
|
+
blocklist first (the only deny), then the owner, then grants additive with the highest match
|
|
71
|
+
winning, then a general-access floor, all clamped by each board's published ceiling. The gate
|
|
72
|
+
and comment writes enforce from it, reading one `share.json`, so the policy is one thing in
|
|
73
|
+
one place rather than a rule re-implemented per door. `marver share explain <email>` traces
|
|
74
|
+
it for one person and `marver share who` prints the grant matrix (both convenience views -
|
|
75
|
+
the dialog is the accurate read for the owner and for domain principals).
|
|
76
|
+
|
|
77
|
+
- **`design/publish.json` v2: a board can carry its artifact type and landing view, not just
|
|
78
|
+
its ceiling.** A board level may now be an object - `{ "max": "read" | "comment", "type":
|
|
79
|
+
"doc" | "slides" | "design" | "sketch" | "refs" | "mix", "open": "canvas" | "board" |
|
|
80
|
+
"present" | "focus" | "slides", "lock": true }` - where `max` is the ceiling (the only
|
|
81
|
+
field that affects access) and the rest choose how the board presents. `open` accepts all
|
|
82
|
+
five view names, but slides mode is v1.5: `open: "slides"` currently lands in `present`.
|
|
83
|
+
Every 0.11 canvas parses unchanged: a bare `"read"` or `"comment"` string is still a valid
|
|
84
|
+
row. (This is a schema version, unrelated to the read-privacy "v2" below.) Source paths
|
|
85
|
+
in a published bundle now go opaque by default (`reveal.source` defaults off) - the inlined
|
|
86
|
+
manifest used to carry every frame's repo path, which is a disclosure the moment a canvas
|
|
87
|
+
is shared beyond its own repo.
|
|
88
|
+
|
|
89
|
+
- **Access requests: a refused visitor can ask, and you can approve from the terminal.** When
|
|
90
|
+
someone is turned away at the identity gate, the canvas offers a request form instead of a
|
|
91
|
+
dead end (authenticated by a short-lived, origin-bound, single-purpose token - the refused
|
|
92
|
+
visitor has no session). Requests surface in `marver share requests` and the dialog;
|
|
93
|
+
approving grants canvas-wide at the role you choose, declining resolves silently. One
|
|
94
|
+
pending row per address, swept after 30 days.
|
|
95
|
+
|
|
96
|
+
- **The front door at `app.marver.design`.** A signed-in home page that lists the canvases a
|
|
97
|
+
person can reach, each row lit by a short summary the canvas itself signs and serves. The
|
|
98
|
+
front door holds no roster and makes no access decision - it asks each canvas, and each
|
|
99
|
+
canvas answers for itself, against browser-pinned keys. Keep a canvas silent there with
|
|
100
|
+
`share: { frontDoor: false }` in `design/config.ts`.
|
|
101
|
+
|
|
102
|
+
### Notes
|
|
103
|
+
|
|
104
|
+
- **Read privacy is still v2.** Sharing v1 controls who gets in and who may comment; every
|
|
105
|
+
admitted person can read every published board. The read boundary today is the bundle - a
|
|
106
|
+
board you do not publish is not in the build. Grants are canvas-scoped and approvals are
|
|
107
|
+
canvas-wide by design; `share.json` is already shaped for the per-board, per-person read
|
|
108
|
+
privacy that arrives in v2, served rather than bundled.
|
|
109
|
+
|
|
110
|
+
- **First boot writes `share.json` from your live 0.11 state and changes nothing you did not
|
|
111
|
+
ask for.** Every existing account gets the canvas-wide `comment` grant it already had
|
|
112
|
+
(clamped per board); until that first boot, every door keeps the legacy rules. Raising a
|
|
113
|
+
board's ceiling never silently re-promotes anyone granted under the old one - the roster
|
|
114
|
+
ratchets down on every boot and only your explicit re-confirm raises an entry.
|
|
115
|
+
|
|
5
116
|
## 0.11.1 - 2026-08-27
|
|
6
117
|
|
|
7
118
|
### Fixed
|
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
|
|