pmx-canvas 0.2.5 → 0.2.7
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 +87 -0
- package/dist/canvas/index.js +65 -65
- package/dist/types/client/nodes/ExtAppFrame.d.ts +3 -0
- package/dist/types/mcp/canvas-access.d.ts +23 -0
- package/package.json +1 -1
- package/skills/pmx-canvas/SKILL.md +20 -5
- package/skills/pmx-canvas/references/full-reference.md +24 -7
- package/src/client/App.tsx +2 -1
- package/src/client/nodes/ExtAppFrame.tsx +60 -15
- package/src/mcp/canvas-access.ts +111 -8
- package/src/server/server.ts +10 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,91 @@ All notable changes to `pmx-canvas` are documented here. This project follows
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.2.7] - 2026-06-25
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **Ghost Cursor of Intent is no longer hidden behind the welcome card on an empty board (report
|
|
13
|
+
Finding J).** The intent ghost lives inside the zoom/pan world transform (its own stacking
|
|
14
|
+
context), so its high z-index could not lift it above the `.welcome-card`, which is a sibling
|
|
15
|
+
outside the transform. The welcome card is now suppressed while a ghost intent is live
|
|
16
|
+
(`intents.value.size > 0`), so a `canvas_intent` signal on a fresh board is visible immediately;
|
|
17
|
+
the card returns when the intent clears/settles and the board is still empty. Verified by
|
|
18
|
+
screenshot in the WebKit backend.
|
|
19
|
+
- **MCP `--mcp` no longer silently splits to (or silently adopts) a wrong workspace — structural
|
|
20
|
+
fix (report Finding I).** The GitHub Copilot adapter spawns `pmx-canvas --mcp` from an incidental
|
|
21
|
+
cwd (e.g. `~/.copilot`); the old code then either split to a hidden fallback port (when the
|
|
22
|
+
preferred port was held) or adopted that incidental cwd as the workspace (when the port was free),
|
|
23
|
+
so writes landed on a canvas the project panel never renders. Now, in `createCanvasAccess`:
|
|
24
|
+
- **Port held by a different-workspace daemon →** the MCP server **attaches** to it (inherits its
|
|
25
|
+
workspace) so writes are visible where the panel renders, instead of splitting.
|
|
26
|
+
- **Free port + incidental launch cwd (`~/.copilot`-shaped) →** it still binds (the agent always
|
|
27
|
+
gets a working canvas) but emits a loud, actionable stderr warning instead of silently adopting
|
|
28
|
+
the cwd; a race-tolerant re-probe first attaches to any daemon that appeared on the port.
|
|
29
|
+
- **`PMX_CANVAS_WORKSPACE_ROOT=<abs project root>`** (new) pins the workspace for both the lookup
|
|
30
|
+
and the bound daemon (`startCanvasServer` honors it), overriding the launch cwd — the deterministic
|
|
31
|
+
host fix. `PMX_CANVAS_ALLOW_WORKSPACE_SPLIT=1` (or a distinct `PMX_CANVAS_PORT`) forces a separate
|
|
32
|
+
canvas. The incidental detector is **positive-signal only** (home dir / dot-child of home), so the
|
|
33
|
+
`mkdtemp` temp dirs the test suite runs from are never misflagged — startup behavior is
|
|
34
|
+
byte-identical for real projects and tests.
|
|
35
|
+
Verified on the real `--mcp` stdio path: port-held → attach (no fallback); incidental + free →
|
|
36
|
+
bind-but-warn (no split); `PMX_CANVAS_WORKSPACE_ROOT` → binds the project root (no warning); real
|
|
37
|
+
project → binds (no warning). Pure `shouldAttachToExistingDaemon` + `looksLikeIncidentalCwd`
|
|
38
|
+
helpers are unit-tested.
|
|
39
|
+
|
|
40
|
+
### Docs
|
|
41
|
+
|
|
42
|
+
- **Clarified the `color` contract: renderer color vs persisted metadata (report Finding H).** A
|
|
43
|
+
top-level `color` is a renderer parameter only for `group` (frame accent) and `graph` nodes; on
|
|
44
|
+
`markdown` / `status` / `context` it is dropped, and while an arbitrary `data.color` posted under
|
|
45
|
+
`data` persists like any `data.*` metadata, it is not read as a render color for basic node types.
|
|
46
|
+
The reference now states this renderer-vs-storage distinction so docs/schema/runtime agree.
|
|
47
|
+
- **Made the WebView automation timeout error actionable (report Finding G).** The chrome backend is
|
|
48
|
+
known-flaky on some hosts (Bun.WebView), reproduced in both the Copilot and Codex hosts; the webkit
|
|
49
|
+
backend (the macOS default) works. The timeout error now points to `start --backend webkit` and the
|
|
50
|
+
already-configurable `PMX_CANVAS_WEBVIEW_TIMEOUT_MS` instead of a dead-end "may be unavailable".
|
|
51
|
+
Not a PMX regression — no canvas source touches the WebView/automation path.
|
|
52
|
+
|
|
53
|
+
## [0.2.6] - 2026-06-25
|
|
54
|
+
|
|
55
|
+
### Fixed
|
|
56
|
+
|
|
57
|
+
- **WebKit ext-app black tile — single-app cold hydration now repaints (report Finding F, 0.2.5
|
|
58
|
+
reopened).** Reproduced locally for the first time in Bun's headless `webkit` WebView (A/B/A:
|
|
59
|
+
a node painted live, then black after a `webview stop`/`start` so it was present at cold load).
|
|
60
|
+
The mcp-app shell loads blank and the app draws its content *after* load (over the bridge); under
|
|
61
|
+
a cold-hydration burst WebKit fails to composite that late draw, so the layer stays black (clean
|
|
62
|
+
in Blink, and clean for a node created live into an idle panel). A parent-side transform/src nudge
|
|
63
|
+
does not repair a black layer — only a full remount (new iframe + bridge re-init, what expand+close
|
|
64
|
+
does) does, and only when it lands in an idle moment. Replaced the 0.2.4 fire-on-mount remount with
|
|
65
|
+
a post-boot (`ready` for empty apps, `done` after replayed tool output for restored apps),
|
|
66
|
+
**serialized** WebKit-only remount so each ext-app repaints into a progressively-quieter panel,
|
|
67
|
+
with the one-shot timer cleared only on unmount. This reliably repaints a **single**
|
|
68
|
+
present-at-load ext-app (verified by screenshot). A board with **several** ext-apps present at
|
|
69
|
+
WebKit panel-load can still black out (the simultaneous compositing burst is a host limit) —
|
|
70
|
+
expand-then-close or Chrome remains the fallback, and the skill caveat states this accurately.
|
|
71
|
+
Strict no-op in Blink/Gecko
|
|
72
|
+
(Chrome/Codex/Playwright unaffected). (The `.mcp-app-frame` GPU-layer class was evaluated and
|
|
73
|
+
rejected: its `translateZ(0)` stacking context breaks the AX emit→ack round-trip in the expanded
|
|
74
|
+
ext-app overlay.)
|
|
75
|
+
|
|
76
|
+
### Docs
|
|
77
|
+
|
|
78
|
+
- **Aligned the `color` contract to the runtime (report Finding H, 0.2.5).** `color` is honored only
|
|
79
|
+
on **group** (frame accent) and **graph** nodes; a top-level `color` on `markdown` / `status` /
|
|
80
|
+
`context` is ignored over both HTTP and CLI. The reference no longer implies basic nodes take a
|
|
81
|
+
`color` param — their meaning comes from node type/value (a `status` node color-codes from its
|
|
82
|
+
content). Group the nodes and color the group to tint a region.
|
|
83
|
+
- **Added an MCP wrong-workspace-split caveat to Workspace Safety (report Finding I).** An
|
|
84
|
+
`pmx-canvas --mcp` server binds a fallback port adopting its own launch `cwd` as the workspace if
|
|
85
|
+
its preferred port is taken by another workspace, so its writes land on a daemon the panel never
|
|
86
|
+
renders. Verify the MCP server's workspace before trusting its state; pin `cwd=<project>` or
|
|
87
|
+
`PMX_CANVAS_PORT`, or prefer the CLI's query/mutation commands (which never spawn a server) for
|
|
88
|
+
automation loops.
|
|
89
|
+
- **Finding G (chrome WebView `start` timeout) is environment-specific, not a 0.2.5 regression.** No
|
|
90
|
+
0.2.5 source touched the WebView/automation path; the chrome backend starts cleanly locally and in
|
|
91
|
+
the Codex retest. It timed out only in the Copilot-hosted pass — track as a host/environment issue.
|
|
92
|
+
|
|
8
93
|
## [0.2.5] - 2026-06-24
|
|
9
94
|
|
|
10
95
|
### Fixed
|
|
@@ -2448,6 +2533,8 @@ otherwise have to discover by trial and error.
|
|
|
2448
2533
|
- Regression coverage for snapshot flat-`id` aliases on both MCP and
|
|
2449
2534
|
HTTP surfaces, plus async / top-level-`await` WebView script bodies.
|
|
2450
2535
|
|
|
2536
|
+
[0.2.7]: https://github.com/pskoett/pmx-canvas/releases/tag/v0.2.7
|
|
2537
|
+
[0.2.6]: https://github.com/pskoett/pmx-canvas/releases/tag/v0.2.6
|
|
2451
2538
|
[0.2.5]: https://github.com/pskoett/pmx-canvas/releases/tag/v0.2.5
|
|
2452
2539
|
[0.2.4]: https://github.com/pskoett/pmx-canvas/releases/tag/v0.2.4
|
|
2453
2540
|
[0.2.3]: https://github.com/pskoett/pmx-canvas/releases/tag/v0.2.3
|