@1agh/maude 0.30.0 → 0.32.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 +5 -5
- package/apps/studio/acp/bridge.ts +285 -0
- package/apps/studio/acp/env.ts +48 -0
- package/apps/studio/acp/index.ts +132 -0
- package/apps/studio/acp/probe.ts +112 -0
- package/apps/studio/acp/transcript.ts +149 -0
- package/apps/studio/annotations-layer.tsx +6 -1
- package/apps/studio/api.ts +225 -66
- package/apps/studio/bin/chat-open.sh +44 -0
- package/apps/studio/canvas-lib.tsx +112 -19
- package/apps/studio/canvas-list-watch.ts +177 -0
- package/apps/studio/canvas-shell.tsx +22 -2
- package/apps/studio/client/app.jsx +788 -26
- package/apps/studio/client/canvas-url.js +5 -0
- package/apps/studio/client/github.js +99 -0
- package/apps/studio/client/panels/ChatPanel.jsx +796 -0
- package/apps/studio/client/panels/CollabModelInfographic.jsx +71 -0
- package/apps/studio/client/panels/CreateProject.jsx +334 -0
- package/apps/studio/client/panels/DiffView.jsx +590 -0
- package/apps/studio/client/panels/GitPanel.jsx +767 -0
- package/apps/studio/client/panels/IdentityBar.jsx +294 -0
- package/apps/studio/client/panels/OnboardingWizard.jsx +598 -0
- package/apps/studio/client/panels/ReadinessList.jsx +189 -0
- package/apps/studio/client/panels/RepoBranchSwitcher.jsx +349 -0
- package/apps/studio/client/panels/acp-runtime.js +286 -0
- package/apps/studio/client/panels/chat-markdown.jsx +138 -0
- package/apps/studio/client/panels/git-grouping.js +86 -0
- package/apps/studio/client/styles/0-reset.css +4 -0
- package/apps/studio/client/styles/3-shell-maude.css +625 -3
- package/apps/studio/client/styles/5-maude-overrides.css +25 -0
- package/apps/studio/client/styles/6-acp-chat.css +821 -0
- package/apps/studio/client/styles/_index.css +2 -0
- package/apps/studio/client/tour/collab-tour.js +61 -0
- package/apps/studio/client/tour/overlay.jsx +11 -1
- package/apps/studio/client/whats-new.jsx +25 -10
- package/apps/studio/collab/registry.ts +13 -0
- package/apps/studio/collab/room.ts +36 -0
- package/apps/studio/cursors-overlay.tsx +17 -1
- package/apps/studio/dist/client.bundle.js +29097 -1534
- package/apps/studio/dist/comment-mount.js +4 -2
- package/apps/studio/dist/styles.css +5816 -1614
- package/apps/studio/git/endpoints.ts +338 -0
- package/apps/studio/git/service.ts +1334 -0
- package/apps/studio/git/watch.ts +97 -0
- package/apps/studio/github/endpoints.ts +358 -0
- package/apps/studio/github/service.ts +231 -0
- package/apps/studio/github/token.ts +53 -0
- package/apps/studio/hmr-broadcast.ts +9 -2
- package/apps/studio/http.ts +399 -1
- package/apps/studio/participants-chrome.tsx +69 -9
- package/apps/studio/paths.ts +12 -0
- package/apps/studio/readiness.ts +220 -0
- package/apps/studio/scaffold-design.ts +57 -0
- package/apps/studio/server.ts +65 -2
- package/apps/studio/sync/agent.ts +81 -1
- package/apps/studio/sync/codec.ts +24 -0
- package/apps/studio/sync/cold-start.ts +40 -0
- package/apps/studio/sync/hub-link.ts +137 -0
- package/apps/studio/test/acp-bridge.test.ts +127 -0
- package/apps/studio/test/acp-env.test.ts +65 -0
- package/apps/studio/test/acp-origin-gate.test.ts +95 -0
- package/apps/studio/test/acp-transcript.test.ts +112 -0
- package/apps/studio/test/canvas-create-api.test.ts +72 -0
- package/apps/studio/test/canvas-list-watch.test.ts +322 -0
- package/apps/studio/test/canvas-meta-api.test.ts +161 -27
- package/apps/studio/test/canvas-origin-gate.test.ts +35 -0
- package/apps/studio/test/chat-markdown.test.tsx +58 -0
- package/apps/studio/test/collab-session-survival.test.tsx +176 -0
- package/apps/studio/test/csrf-write-guard.test.ts +26 -0
- package/apps/studio/test/editing-presence.test.ts +103 -0
- package/apps/studio/test/fixtures/mock-acp-agent.mjs +45 -0
- package/apps/studio/test/git-api.test.ts +0 -0
- package/apps/studio/test/git-branches.test.ts +106 -0
- package/apps/studio/test/git-grouping.test.ts +106 -0
- package/apps/studio/test/git-watch.test.ts +97 -0
- package/apps/studio/test/github-api.test.ts +465 -0
- package/apps/studio/test/hub-link.test.ts +69 -0
- package/apps/studio/test/participants-chrome.test.ts +36 -1
- package/apps/studio/test/readiness.test.ts +127 -0
- package/apps/studio/test/sync-cold-seed-dedup.test.ts +187 -0
- package/apps/studio/test/sync-cold-start.test.ts +61 -1
- package/apps/studio/test/tour-overlay.test.tsx +18 -0
- package/apps/studio/tool-palette.tsx +18 -9
- package/apps/studio/use-chrome-visibility.tsx +66 -0
- package/apps/studio/use-collab.tsx +414 -187
- package/apps/studio/whats-new.json +82 -0
- package/apps/studio/ws.ts +44 -1
- package/cli/commands/design.mjs +1 -0
- package/cli/lib/gitignore-block.mjs +16 -3
- package/cli/lib/gitignore-block.test.mjs +13 -1
- package/package.json +11 -9
- package/plugins/design/dependencies.json +17 -0
- package/plugins/design/templates/_shell.html +30 -8
|
@@ -1,6 +1,88 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./whats-new.schema.json",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"id": "ai-editing-readiness-check",
|
|
6
|
+
"version": "0.32.0",
|
|
7
|
+
"date": "2026-06-24",
|
|
8
|
+
"kind": "feature",
|
|
9
|
+
"title": "See what AI editing needs",
|
|
10
|
+
"summary": "The welcome screen and the Assistant panel now show whether AI editing is ready — and if Claude Code, the maude CLI, or the Maude plugins are missing, they hand you the exact step to fix it. Check it any time under Help → Check AI editing readiness.",
|
|
11
|
+
"surface": "design-ui"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"id": "native-desktop-app",
|
|
15
|
+
"version": "0.31.0",
|
|
16
|
+
"date": "2026-06-23",
|
|
17
|
+
"kind": "feature",
|
|
18
|
+
"title": "Maude is now a desktop app",
|
|
19
|
+
"summary": "Install Maude for macOS or Windows — download, open, sign in with GitHub, and start designing, with no terminal at any step. It keeps itself up to date in the background: when a new version is ready you'll see “Maude updated · restart to apply,” and one click puts you on the latest. No npm, no command line.",
|
|
20
|
+
"learnMore": "https://maude.sh/desktop",
|
|
21
|
+
"surface": "design-ui"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "native-acp-chat-sidepanel",
|
|
25
|
+
"version": "0.31.0",
|
|
26
|
+
"date": "2026-06-23",
|
|
27
|
+
"kind": "feature",
|
|
28
|
+
"title": "Chat with Claude inside Maude",
|
|
29
|
+
"summary": "Open the Assistant panel (the ✦ in the menubar, or ⌘⇧A) and ask Claude for an edit, a critique, or a new screen — it changes the canvas while you watch, no terminal needed. It runs on your own installed Claude on your Pro/Max subscription: no login inside Maude, never metered API billing. Open several chats and work on different things at once — each runs in the background, so switching never interrupts a running one, and a switcher shows which chats are running, open, or saved (start a new one or delete an old one). Chats are saved per project and reopen with their history. Pick the model and effort, watch what Claude is doing live, and get a notification when a turn finishes while you're looking elsewhere. Native app only.",
|
|
30
|
+
"surface": "design-ui"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "branch-scoped-live-multiplayer",
|
|
34
|
+
"version": "0.31.0",
|
|
35
|
+
"date": "2026-06-23",
|
|
36
|
+
"kind": "feature",
|
|
37
|
+
"title": "Work together, live, in the same version",
|
|
38
|
+
"summary": "When you and a teammate are in the same shared version, you now collaborate live — you see each other's cursors, annotations, comments, and each other's canvas changes as they happen, like Figma. Your canvas list shows only the version you're in, so there's no clutter; switch to a teammate's draft to join them. When someone — or the AI agent — is editing a canvas, a soft badge in their colour gives you a heads-up so you don't step on each other (it's never a lock, and you can always keep working). The AI's \"is editing\" cue now reaches everyone on the team, new canvases show up instantly in a second tab and via Get latest for teammates, and live updates now slot in seamlessly without the presence avatars blinking.",
|
|
39
|
+
"surface": "design-ui"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "native-onboarding-switcher-collab-tour",
|
|
43
|
+
"version": "0.31.0",
|
|
44
|
+
"date": "2026-06-23",
|
|
45
|
+
"kind": "feature",
|
|
46
|
+
"title": "Get started & switch projects — no terminal",
|
|
47
|
+
"summary": "Open Maude for the first time and a friendly setup walks you in: sign in with GitHub to open or create a shared project, pick a local folder, or connect to a team hub — no terminal, ever. A new switcher at the bottom of the sidebar lets you jump between projects and between the Shared version and your own drafts, all in plain words. Happy with a draft? \"Add this draft to the Shared version\" folds it in, publishes, and tidies up in one click. And a re-openable \"How sharing works\" tour teaches the simple Save changes locally → Publish for everyone → Pull changes cycle — with a picture showing that being in a canvas together just happens, automatically.",
|
|
48
|
+
"surface": "design-ui"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "present-mode-and-chrome-toggles",
|
|
52
|
+
"version": "0.31.0",
|
|
53
|
+
"date": "2026-06-23",
|
|
54
|
+
"kind": "feature",
|
|
55
|
+
"title": "Presentation Mode — just your artboards",
|
|
56
|
+
"summary": "View ▸ Presentation Mode now clears everything but your work: the menubar, sidebar, and panels disappear along with the mini-map, zoom controls, tool palette, annotations, and comment pins — leaving a clean canvas perfect for a screenshot or a demo. Press Esc or the floating Exit button to bring it all back. The presentation button in the canvas toolbar enters it too. Prefer to hide just the floating extras? Two new View toggles — Minimap and Zoom controls — switch those off on their own. Nothing is lost: leaving Presentation Mode restores exactly what you had.",
|
|
57
|
+
"surface": "design-ui"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "sign-in-with-github",
|
|
61
|
+
"version": "0.31.0",
|
|
62
|
+
"date": "2026-06-23",
|
|
63
|
+
"kind": "feature",
|
|
64
|
+
"title": "Sign in with GitHub — projects without the terminal",
|
|
65
|
+
"summary": "Sign in with GitHub right from the account bar (just enter a short code — your access stays in your computer's keychain). Start a New project and Maude creates a private GitHub project and opens it; Pull a local copy brings down one of your projects to a folder you choose; Share invites a teammate by username. Publish and Get latest now use your sign-in directly, and you'll get a nudge when a teammate has shared new work. If you both changed the same canvas, Get latest opens a visual resolver — Keep mine, theirs, or both (both saves your version as a copy, so nothing is ever lost) — and finishes the merge for you.",
|
|
66
|
+
"surface": "design-ui"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "changes-panel-canvas-grouping",
|
|
70
|
+
"version": "0.31.0",
|
|
71
|
+
"date": "2026-06-23",
|
|
72
|
+
"kind": "improvement",
|
|
73
|
+
"title": "A cleaner Changes panel, grouped by canvas",
|
|
74
|
+
"summary": "Panning or zooming a canvas no longer counts as a change to save — the Changes panel now reflects your actual work, not your mouse. And changes are grouped by canvas: each one lists its supporting files (Layout & settings, Annotations) tucked underneath, so a single checkbox saves a canvas and everything that travels with it as one unit.",
|
|
75
|
+
"surface": "design-ui"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"id": "in-ui-git-layer",
|
|
79
|
+
"version": "0.31.0",
|
|
80
|
+
"date": "2026-06-23",
|
|
81
|
+
"kind": "feature",
|
|
82
|
+
"title": "See, save & publish — no terminal",
|
|
83
|
+
"summary": "A new Changes panel (View ▸ Changes, or ⌘⇧G) shows exactly what you've changed, with live colour-coded badges right in the file tree. Save a version with a message, Publish it to share with your team, or Get the latest they published — all in plain language, never a command line. And when a canvas changed, compare a real rendered before & after: both sides live with locked zoom & pan, an overlay wipe, and a simple Keep mine / theirs / both picker so nothing is ever lost. Open History to browse every saved version of a canvas and preview any one of them — and pick which past version to compare against, right in the diff.",
|
|
84
|
+
"surface": "design-ui"
|
|
85
|
+
},
|
|
4
86
|
{
|
|
5
87
|
"id": "in-canvas-token-editor",
|
|
6
88
|
"version": "0.30.0",
|
package/apps/studio/ws.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import type { ServerWebSocket, WebSocketHandler } from 'bun';
|
|
5
5
|
|
|
6
|
+
import type { Acp } from './acp/index.ts';
|
|
6
7
|
import type { Activity } from './activity.ts';
|
|
7
8
|
import type { Api } from './api.ts';
|
|
8
9
|
import type { Collab, RoomConn } from './collab/index.ts';
|
|
@@ -36,6 +37,15 @@ export type WsData =
|
|
|
36
37
|
id: string;
|
|
37
38
|
remote: string;
|
|
38
39
|
kind: 'canvas-hmr';
|
|
40
|
+
}
|
|
41
|
+
| {
|
|
42
|
+
// Phase 31 (DDR-123) — ACP chat bridge socket. Main origin ONLY,
|
|
43
|
+
// loopback-guarded at upgrade (server.ts); NEVER opened from the canvas
|
|
44
|
+
// origin. Carries the JSON chat protocol (prompt / cancel ↔ update /
|
|
45
|
+
// turn-end), bridged to the user's own `claude` via createAcp.
|
|
46
|
+
id: string;
|
|
47
|
+
remote: string;
|
|
48
|
+
kind: 'acp';
|
|
39
49
|
};
|
|
40
50
|
|
|
41
51
|
/**
|
|
@@ -82,7 +92,8 @@ export function createWs(
|
|
|
82
92
|
api: Api,
|
|
83
93
|
inspect: Inspect,
|
|
84
94
|
collab: Collab,
|
|
85
|
-
activity: Activity
|
|
95
|
+
activity: Activity,
|
|
96
|
+
acp: Acp
|
|
86
97
|
): Ws {
|
|
87
98
|
const clients = new Set<ServerWebSocket<WsData>>();
|
|
88
99
|
|
|
@@ -143,6 +154,26 @@ export function createWs(
|
|
|
143
154
|
// emits, so this is a no-op for unlinked projects.
|
|
144
155
|
ctx.bus.on('sync:status', (payload: unknown) => broadcast({ type: 'sync:status', payload }));
|
|
145
156
|
|
|
157
|
+
// Phase 27 Task 5 (E2) — live dirty-state. git/watch.ts recomputes gitStatus on
|
|
158
|
+
// a versionable file change (trailing-debounced) and emits 'git-status'. Only
|
|
159
|
+
// the same-origin inspector clients (the shell) get it — it carries the changed-
|
|
160
|
+
// file list, so it stays off the untrusted canvas-origin feed like the other
|
|
161
|
+
// privileged broadcasts. Drives the Changes-panel count + tree M/A/D badges.
|
|
162
|
+
ctx.bus.on('git-status', (payload: unknown) => broadcast({ type: 'git-status', payload }));
|
|
163
|
+
|
|
164
|
+
// Phase 30 — live canvas-list refresh. api.createCanvas / deleteCanvas emit
|
|
165
|
+
// this; inspector clients (the shell) re-read the branch-scoped tree via
|
|
166
|
+
// /_index-data. Loopback-only (same dev-server) — cross-machine peers get a
|
|
167
|
+
// new canvas through git "Get latest", not this event.
|
|
168
|
+
ctx.bus.on('canvas-list-update', (payload: unknown) =>
|
|
169
|
+
broadcast({ type: 'canvas-list-update', payload })
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
// Phase 31 (DDR-123) — `/design:chat` → `maude design chat-open` → POST
|
|
173
|
+
// /_api/acp/focus emits this; the shell (app.jsx, native-only) opens the
|
|
174
|
+
// Assistant panel. Inspector clients only — same-origin shell, like the rest.
|
|
175
|
+
ctx.bus.on('acp-focus', () => broadcast({ type: 'acp-focus' }));
|
|
176
|
+
|
|
146
177
|
// HMR broadcaster — turns fs:any change events into `canvas-hmr` messages.
|
|
147
178
|
// The iframe-side client (in _shell.html) decides reload strategy from `mode`.
|
|
148
179
|
// Uses broadcastHmr so the segregated canvas origin's HMR-only sockets get it.
|
|
@@ -189,6 +220,10 @@ export function createWs(
|
|
|
189
220
|
clients.add(ws);
|
|
190
221
|
return;
|
|
191
222
|
}
|
|
223
|
+
if (ws.data.kind === 'acp') {
|
|
224
|
+
acp.onOpen(ws);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
192
227
|
clients.add(ws);
|
|
193
228
|
// Snapshot carries the inspector state AND the activity map so a client
|
|
194
229
|
// opening mid-edit seeds its overlay state (Phase 13). Inspector-origin
|
|
@@ -197,6 +232,10 @@ export function createWs(
|
|
|
197
232
|
send(ws, { type: 'snapshot', state: inspect.state, activity: activity.state });
|
|
198
233
|
},
|
|
199
234
|
async close(ws) {
|
|
235
|
+
if (ws.data.kind === 'acp') {
|
|
236
|
+
acp.onClose(ws);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
200
239
|
if (ws.data.kind === 'collab') {
|
|
201
240
|
const binding = collabConns.get(ws.data.id);
|
|
202
241
|
if (binding) {
|
|
@@ -217,6 +256,10 @@ export function createWs(
|
|
|
217
256
|
// HMR-only canvas-origin socket: never accepts inbound messages (the
|
|
218
257
|
// canvas iframe only listens for canvas-hmr; it never sends).
|
|
219
258
|
if (ws.data.kind === 'canvas-hmr') return;
|
|
259
|
+
if (ws.data.kind === 'acp') {
|
|
260
|
+
acp.onMessage(ws, raw);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
220
263
|
if (ws.data.kind === 'collab') {
|
|
221
264
|
const binding = collabConns.get(ws.data.id);
|
|
222
265
|
if (!binding) return;
|
package/cli/commands/design.mjs
CHANGED
|
@@ -22,19 +22,32 @@ export const END_MARKER = '# maude:end';
|
|
|
22
22
|
*/
|
|
23
23
|
export function buildBlock(designRel = '.design') {
|
|
24
24
|
const root = designRel.replace(/\/+$/, '');
|
|
25
|
+
// The canonical IGNORED set is the DDR-115 runtime-state taxonomy — kept in
|
|
26
|
+
// lockstep with `apps/studio/git/service.ts` (isMaudeRuntimeState backstop)
|
|
27
|
+
// and the repo's own `.gitignore`. VERSIONED content (canvases, `.meta.json`,
|
|
28
|
+
// `*.annotations.svg`, `system/**`, `config.json`) is deliberately absent.
|
|
25
29
|
const lines = [
|
|
26
30
|
BEGIN_MARKER,
|
|
27
|
-
'# Maude design plugin runtime — gitignored even in linked mode (DDR-056).',
|
|
28
|
-
|
|
31
|
+
'# Maude design plugin runtime — gitignored even in linked mode (DDR-056/DDR-115).',
|
|
32
|
+
// Per-machine runtime JSON.
|
|
29
33
|
`${root}/_server.json`,
|
|
30
34
|
`${root}/_server.log`,
|
|
35
|
+
`${root}/_server.lock`,
|
|
31
36
|
`${root}/_active.json`,
|
|
32
37
|
`${root}/_sync.json`, // linked-mode offline/sync status (Task 8)
|
|
38
|
+
`${root}/_preflight.json`,
|
|
39
|
+
`${root}/_locator.json`, // regenerable slug→path index
|
|
40
|
+
`${root}/_export-history.json`,
|
|
41
|
+
// Per-machine / per-user dirs.
|
|
42
|
+
`${root}/_state/`, // binary CRDT logs (regenerable from hub)
|
|
33
43
|
`${root}/_history/`,
|
|
34
44
|
`${root}/_trash/`, // soft-deleted canvases (recoverable locally — Phase 22 delete)
|
|
35
45
|
`${root}/_draw/`, // draw-agent proof canvases (regenerable — Phase 25)
|
|
36
|
-
`${root}/
|
|
46
|
+
`${root}/_smoke/`, // batch-screenshot output (regenerable — DDR-021)
|
|
47
|
+
`${root}/_canvas-state/`, // per-machine canvas scratch + camera (`*.view.json`, DDR-115)
|
|
37
48
|
`${root}/_chat/`, // ACP transcripts (per-machine)
|
|
49
|
+
`${root}/_untrusted/`, // hub-synced untrusted file mirror (DDR-054)
|
|
50
|
+
`${root}/_comments/`, // hub-sync-only collab comments (DDR-102/DDR-115 — never git)
|
|
38
51
|
END_MARKER,
|
|
39
52
|
];
|
|
40
53
|
return `${lines.join('\n')}\n`;
|
|
@@ -31,17 +31,29 @@ test('buildBlock includes the runtime paths and is marker-wrapped', () => {
|
|
|
31
31
|
for (const p of [
|
|
32
32
|
'.design/_state/',
|
|
33
33
|
'.design/_server.json',
|
|
34
|
+
'.design/_server.log',
|
|
35
|
+
'.design/_server.lock',
|
|
34
36
|
'.design/_active.json',
|
|
35
37
|
'.design/_sync.json',
|
|
38
|
+
'.design/_preflight.json',
|
|
39
|
+
'.design/_locator.json',
|
|
40
|
+
'.design/_export-history.json',
|
|
36
41
|
'.design/_history/',
|
|
42
|
+
'.design/_trash/',
|
|
37
43
|
'.design/_draw/',
|
|
44
|
+
'.design/_smoke/',
|
|
45
|
+
'.design/_canvas-state/', // covers the DDR-115 `<slug>.view.json` camera
|
|
38
46
|
'.design/_chat/',
|
|
47
|
+
'.design/_untrusted/',
|
|
48
|
+
'.design/_comments/', // hub-sync-only (DDR-115)
|
|
39
49
|
]) {
|
|
40
50
|
assert.ok(block.includes(p), `missing ${p}`);
|
|
41
51
|
}
|
|
42
|
-
//
|
|
52
|
+
// VERSIONED content must NOT be ignored (DDR-115 taxonomy).
|
|
43
53
|
assert.ok(!block.includes('.design/config.json'));
|
|
44
54
|
assert.ok(!/\.design\/\*\.html/.test(block));
|
|
55
|
+
// Annotations are versioned — never in the ignore block.
|
|
56
|
+
assert.ok(!/annotations\.svg/.test(block), 'annotations must stay versioned');
|
|
45
57
|
});
|
|
46
58
|
|
|
47
59
|
test('buildBlock honors a custom design root', () => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@1agh/maude",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"description": "Marketplace of Claude Code plugins by Michal Dovrtěl: `design` (canvas-first design iteration) + `flow` (generic agentic workflow loop with .ai second brain). Ships the `maude` CLI (with `mdcc` legacy alias) to scaffold workspace, run the design dev server, and manage configs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
"start": "bun run apps/studio/server.ts",
|
|
21
21
|
"dev": "bun run apps/studio/server.ts --port 4555",
|
|
22
22
|
"dev:site": "pnpm --filter @maude/site dev --port 4398",
|
|
23
|
-
"
|
|
23
|
+
"dev:desktop": "PATH=\"$HOME/.cargo/bin:$PATH\" pnpm --filter @maude/desktop tauri dev",
|
|
24
|
+
"build:desktop": "PATH=\"$HOME/.cargo/bin:$PATH\" pnpm --filter @maude/desktop tauri build",
|
|
25
|
+
"build": "pnpm -r --if-present --filter '!@maude/desktop' run build",
|
|
24
26
|
"build:binary": "bun run apps/studio/build.ts --release",
|
|
25
27
|
"test": "node --test --test-reporter=spec cli/**/*.test.mjs",
|
|
26
28
|
"test:dev-server": "cd apps/studio && bun test",
|
|
@@ -41,13 +43,13 @@
|
|
|
41
43
|
"prepublishOnly": "bash scripts/check-version-parity.sh && bash apps/studio/bin/check-runtime-bundles.sh"
|
|
42
44
|
},
|
|
43
45
|
"optionalDependencies": {
|
|
44
|
-
"@1agh/maude-darwin-arm64": "0.
|
|
45
|
-
"@1agh/maude-darwin-x64": "0.
|
|
46
|
-
"@1agh/maude-linux-arm64": "0.
|
|
47
|
-
"@1agh/maude-linux-arm64-musl": "0.
|
|
48
|
-
"@1agh/maude-linux-x64": "0.
|
|
49
|
-
"@1agh/maude-linux-x64-musl": "0.
|
|
50
|
-
"@1agh/maude-win32-x64": "0.
|
|
46
|
+
"@1agh/maude-darwin-arm64": "0.32.0",
|
|
47
|
+
"@1agh/maude-darwin-x64": "0.32.0",
|
|
48
|
+
"@1agh/maude-linux-arm64": "0.32.0",
|
|
49
|
+
"@1agh/maude-linux-arm64-musl": "0.32.0",
|
|
50
|
+
"@1agh/maude-linux-x64": "0.32.0",
|
|
51
|
+
"@1agh/maude-linux-x64-musl": "0.32.0",
|
|
52
|
+
"@1agh/maude-win32-x64": "0.32.0"
|
|
51
53
|
},
|
|
52
54
|
"files": [
|
|
53
55
|
"cli",
|
|
@@ -170,6 +170,23 @@
|
|
|
170
170
|
"fallbackBehavior": "Discovery + critic-panel rounds fall back to numbered-prose chat. Slower, fewer options per round, no preview side-pane.",
|
|
171
171
|
"usedBy": ["skills/design-system/SKILL.md", "commands/setup-ds.md", "commands/new.md"],
|
|
172
172
|
"docsUrl": "https://docs.claude.com/en/docs/claude-code"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"id": "claude",
|
|
176
|
+
"type": "cli",
|
|
177
|
+
"hardness": "soft",
|
|
178
|
+
"check": {
|
|
179
|
+
"command": "claude --version",
|
|
180
|
+
"expectExit": 0
|
|
181
|
+
},
|
|
182
|
+
"install": {
|
|
183
|
+
"preferred": "npm i -g @anthropic-ai/claude-code",
|
|
184
|
+
"darwin": "brew install --cask claude-code"
|
|
185
|
+
},
|
|
186
|
+
"autoInstall": false,
|
|
187
|
+
"fallbackBehavior": "Phase 31 (DDR-123) — the native ACP chat sidepanel drives the user's OWN installed `claude` CLI on their Pro/Max subscription (never API billing). Without it the panel shows the not-connected explainer ('run `claude` in a terminal and `/login`'); every other design surface is unaffected.",
|
|
188
|
+
"usedBy": ["dev-server/acp/probe.ts", "dev-server/acp/bridge.ts"],
|
|
189
|
+
"docsUrl": "https://docs.claude.com/en/docs/claude-code"
|
|
173
190
|
}
|
|
174
191
|
]
|
|
175
192
|
}
|
|
@@ -170,7 +170,13 @@
|
|
|
170
170
|
// Phase 13.1 / DDR-077 — error-resilient HMR while an agent edits. Hoisted
|
|
171
171
|
// here so the HMR client (below) can soft-reload the canvas module instead
|
|
172
172
|
// of location.reload()-ing into a half-saved (broken) build.
|
|
173
|
-
|
|
173
|
+
// Phase 27 (E2) — DiffView "before" pane. `?sha=<ref>` renders the canvas
|
|
174
|
+
// AT a past version (the dev-server's serveHistoricalCanvas builds from
|
|
175
|
+
// `git show <sha>:<path>`). Baked into the module URL so both the initial
|
|
176
|
+
// import and the HMR soft-reload carry it.
|
|
177
|
+
const shaParam = params.get('sha');
|
|
178
|
+
const canvasQuery = shaParam ? ('?sha=' + encodeURIComponent(shaParam)) : '';
|
|
179
|
+
const canvasUrl = canvasRel ? ('/' + designRel + '/' + canvasRel + canvasQuery) : null;
|
|
174
180
|
const myFileKey = canvasRel ? (designRel + '/' + canvasRel) : null;
|
|
175
181
|
// True while an `ai-activity` entry is live for THIS canvas (an agent is
|
|
176
182
|
// running /design:edit|new on it). Mirrors ai-banner's gate: parent relays
|
|
@@ -202,13 +208,15 @@
|
|
|
202
208
|
|
|
203
209
|
// Soft reload — re-import the canvas module (cache-busted) and swap it in
|
|
204
210
|
// via the runtime, holding the last good render on a build/import error
|
|
205
|
-
// (no white flash).
|
|
206
|
-
// the
|
|
211
|
+
// (no white flash). Phase 30 (F4): used for EVERY canvas-body change while
|
|
212
|
+
// the runtime is mounted — agent edits, manual edits, AND cross-peer synced
|
|
213
|
+
// writes — so presence + in-canvas state survive. Falls back to the plain
|
|
214
|
+
// location.reload() below only when no runtime is present.
|
|
207
215
|
function softReload(version) {
|
|
208
216
|
if (!canvasUrl) { location.reload(); return; }
|
|
209
217
|
const rt = window.__maudeCanvasRuntime;
|
|
210
218
|
if (!rt || !rt.remount) { location.reload(); return; }
|
|
211
|
-
import(canvasUrl + '?v=' + (version || Date.now()))
|
|
219
|
+
import(canvasUrl + (canvasUrl.includes('?') ? '&' : '?') + 'v=' + (version || Date.now()))
|
|
212
220
|
.then((mod) => {
|
|
213
221
|
if (mod && typeof mod.default === 'function') {
|
|
214
222
|
rt.remount(mod.default);
|
|
@@ -344,10 +352,24 @@
|
|
|
344
352
|
// read the parent-verified local (NOT a canvas-writable global)
|
|
345
353
|
if (Date.now() - lastCssOptimisticAt < 1500) return;
|
|
346
354
|
}
|
|
347
|
-
// Phase
|
|
348
|
-
//
|
|
349
|
-
//
|
|
350
|
-
|
|
355
|
+
// Phase 30 (F4) — prefer an in-place hot-swap for ANY canvas-body
|
|
356
|
+
// (`module`) change whenever the canvas runtime is mounted: the
|
|
357
|
+
// soft-reload re-imports the module and remounts only the canvas
|
|
358
|
+
// content, KEEPING the iframe — and thus the live CollabProvider
|
|
359
|
+
// + presence cursors/avatars — mounted (the collab session is a
|
|
360
|
+
// module-level singleton that survives the remount, use-collab.tsx).
|
|
361
|
+
// This covers cross-peer SYNCED writes, which arrive as a `module`
|
|
362
|
+
// change with NO `ai-activity` entry: a teammate's edit must update
|
|
363
|
+
// seamlessly, never blink everyone's presence (and scroll / tool
|
|
364
|
+
// mode / undo survive too). It also keeps the Phase 13.1 / DDR-077
|
|
365
|
+
// hold-last-good behaviour for agent edits. (`agentEditing` is still
|
|
366
|
+
// tracked from ai-activity above but no longer gates the swap — any
|
|
367
|
+
// module change to the live canvas hot-swaps.) `hard` (_lib rebuild)
|
|
368
|
+
// is global and ALWAYS full-reloads. With no runtime (gallery
|
|
369
|
+
// thumbnails / ?comments=0) we full-reload; softReload itself also
|
|
370
|
+
// falls back to location.reload() when the re-import yields no usable
|
|
371
|
+
// default export.
|
|
372
|
+
if (msg.mode === 'module' && window.__maudeCanvasRuntime && window.__maudeCanvasRuntime.remount) {
|
|
351
373
|
softReload(msg.version);
|
|
352
374
|
} else {
|
|
353
375
|
location.reload();
|