@@ -4,111 +4,63 @@ All notable user-visible changes to this project are documented in this file.
44
55## [ Unreleased]
66
7+ ## [ 0.5.0] - 2026-06-17
8+
79### Added
810
9- - ` markdown ` parts: agents can publish prose (explanations, plans, tradeoff
10- write-ups) the viewer renders with consistent typography — headings, lists,
11- tables, links, and syntax-highlighted fenced code blocks (shiki, the same
12- highlighter the diff parts use). Available on all three tiers: a ` markdown ` part
13- over MCP and ` POST /api/surfaces ` , plus the CLI (` sideshow markdown ` , and
14- ` --md ` on ` sideshow publish ` ). Rendered as data, not sandboxed markup: raw
15- HTML in the source is escaped, so reach for an ` html ` part for live markup.
16- - The npm package now exposes a stable ` sideshow/server ` entrypoint for
17- integrations such as ` sideshow-term ` to reuse ` createApp ` and ` JsonFileStore `
18- without importing private ` dist/server/* ` internals.
19- - A ` terminal ` part renders monospace terminal output as a styled terminal
20- window directly in the viewer. The text travels inline and may carry ANSI SGR
21- escapes (colors, bold, italic, underline), which the viewer renders while
22- HTML-escaping the rest. Carriage returns are resolved (each line collapses to
23- its last redraw) so progress bars and spinners show their final state, not
24- every frame. Publish it across all tiers: a ` terminal ` part in
25- ` publish_surface ` (MCP), ` POST /api/surfaces ` , and ` sideshow terminal <file> `
26- / ` sideshow publish --terminal ` . (SGR colors are rendered; cursor-addressing
27- TUIs are not resolved.)
28- - Surfaces: a published card is now an ordered list of parts, not a single
29- HTML blob. A ` diff ` part renders a unified/git patch as a syntax-highlighted
30- split/unified code review (via @pierre/diffs ) directly in the viewer; an
31- ` html ` part is the sandboxed markup snippets always were. Combine them — e.g.
32- a diagram html part above its diff — in one versioned, commentable card.
33- - Generic publishing across all tiers: ` publish_surface ` /` update_surface ` (MCP),
34- ` POST /api/surfaces ` , and ` sideshow diff <patch> ` / ` sideshow publish --diff ` .
35- Diff parts are rendered from patch data by the viewer, so agents send a patch,
36- never markup, and the sandbox is untouched.
37- - Uploads: agents can push images, traces, and files across all three tiers —
38- ` POST /api/assets ` (raw bytes or base64 JSON), the ` upload_asset ` MCP tool, and
39- ` sideshow upload ` / ` image ` / ` trace ` / ` publish --image ` . Reference an upload
40- with an ` image ` part (rendered natively) or a ` trace ` part (a step timeline
41- beside the surface, plus a download link), or embed its URL inside an html part
42- (` <img src="/a/<id>"> ` — the surface CSP now allows the server's own origin).
43- An asset's id is the SHA-256 of its bytes, so its URL is content-addressed:
44- derive it before uploading (` sideshow asset-url <file> ` ) and reference it in a
45- surface published before — or alongside — the upload; the viewer briefly waits
46- for an in-flight asset instead of showing a broken image. Identical uploads
47- dedupe to one blob, and an asset lives as long as any surface references it
48- (even across sessions), so a referenced upload is never lost to a session
49- delete. Capped at 5 MB each.
50- - A copy button on each posted comment puts an agent-ready paste block on the
51- clipboard (surface title + id + the comment), for handing a comment straight
52- to a terminal agent.
53- - ` sideshow watch ` streams user comments to stdout one per line, re-arming the
54- long-poll forever and waiting for the first publish if no session exists yet.
55- It rides the shared server-side agent cursor (exactly-once across watch,
56- wait, and piggyback), and falls back to resolving the most recently active
57- session matching the current directory when no local session state is shared.
58- - A Claude Code plugin (` plugin/ ` , published via a repo-hosted marketplace)
59- bundles the sideshow MCP server, the skill, and a background monitor that
60- runs ` sideshow watch ` — browser comments arrive in the agent as notifications
61- without pasting or re-arming a watcher. Install with
11+ - Surfaces: a published card is now an ordered list of parts, not a single HTML
12+ blob. New part kinds render natively in the viewer alongside sandboxed ` html ` :
13+ ` diff ` (a syntax-highlighted code review from a patch), ` markdown ` (prose with
14+ highlighted fenced code), ` terminal ` (monospace output with ANSI colors), plus
15+ ` image ` and ` trace ` . Publish any of them across all three tiers — MCP
16+ (` publish_surface ` /` update_surface ` ), ` POST /api/surfaces ` , and the CLI.
17+ - Uploads: push images, traces, and files across all three tiers (`POST
18+ /api/assets` , the ` upload_asset` MCP tool, ` sideshow upload` / ` image` / ` trace`).
19+ Assets are content-addressed by SHA-256, identical uploads dedupe, and an
20+ asset lives as long as any surface references it. Capped at 5 MB each.
21+ - A Claude Code plugin (` plugin/ ` , via a repo-hosted marketplace) bundles the
22+ MCP server, the skill, and a background monitor — browser comments arrive in
23+ the agent as notifications without pasting or re-arming a watcher. Install with
6224 ` /plugin marketplace add modem-dev/sideshow ` then
6325 ` /plugin install sideshow@sideshow ` .
64- - A "connect Claude Code" link in the viewer (sidebar footer and the onboarding
65- screen) opens an integrations panel with the plugin install commands, what
66- the monitor runs, and the honest caveats (two commands, not a one-click;
67- needs Claude Code ≥ 2.1.105).
26+ - ` sideshow watch ` streams user comments to stdout, re-arming the long-poll
27+ forever (exactly-once across watch, wait, and piggyback).
28+ - A "connect Claude Code" link in the viewer opens an integrations panel with
29+ the plugin install commands and caveats.
30+ - A copy button on each comment puts an agent-ready paste block (surface title +
31+ id + comment) on the clipboard.
32+ - The npm package exposes a stable ` sideshow/server ` entrypoint so integrations
33+ can reuse ` createApp ` /` JsonFileStore ` without importing private internals.
6834
6935### Changed
7036
71- - The session sidebar now groups sessions by recency (Today / Yesterday /
72- Earlier) so the freshest work stays on top, and sessions with no surfaces yet
73- are dimmed and sunk to the bottom of their group — keeping a long history
74- scannable.
75- - The viewer is framed around leaving comments rather than messaging an agent:
76- composers read "Leave a comment…" with a "Comment" button. No delivery
77- receipts or "listening" indicators — a comment is an annotation the agent
78- picks up through the feedback loop, not a synchronous message.
79- - A surface card's open and delete actions are now minimal Lucide icons
80- (external-link and trash) instead of text labels; delete turns red on hover.
81- - ` sideshow-term watch ` now starts a local server in the background when needed,
82- and bare ` sideshow-term ` opens the watcher. Terminal servers default to port
83- 4243, with ` --port ` for choosing another local port. The watcher supports
84- mouse input for clicking sidebar snippets and wheel-scrolling content.
85- Agents can run ` sideshow-term clear ` to remove stale visualizations from the
86- current session, or ` sideshow-term clear --all ` to clear the whole surface.
87- ` sideshow-term serve ` remains for explicit server-only use.
88- - Snippets are now "surfaces" throughout the API: ` /api/surfaces ` , ` surface-* `
89- SSE events, and comments keyed by ` surfaceId ` . The old snippet endpoints and
90- the ` publish_snippet ` /` update_snippet ` tools remain as back-compat aliases, so
91- existing agent configs keep working. Stored boards migrate in place on load.
37+ - Snippets are now "surfaces" throughout the API (` /api/surfaces ` , ` surface-* `
38+ SSE events, comments keyed by ` surfaceId ` ). The old snippet endpoints and
39+ ` publish_snippet ` /` update_snippet ` tools remain as back-compat aliases; stored
40+ boards migrate in place on load.
41+ - The session sidebar groups sessions by recency (Today / Yesterday / Earlier),
42+ and sessions with no surfaces yet are dimmed and sunk to the bottom.
43+ - The viewer is framed around leaving comments rather than messaging an agent —
44+ composers read "Leave a comment…", with no delivery receipts or "listening"
45+ indicators.
46+ - A surface card's open and delete actions are now minimal Lucide icons.
47+ - ` sideshow-term ` auto-starts a local server when needed (bare ` sideshow-term `
48+ opens the watcher, default port 4243), supports mouse input, and gains
49+ ` clear ` / ` clear --all ` .
9250
9351### Fixed
9452
95- - ` sideshow-term ` now hardens STML parsing/rendering for untrusted markup:
96- entity decoding uses a tested HTML entity library, invalid numeric entities no
97- longer throw, oversized/deep/node-heavy snippets are bounded, terminal control
98- characters are neutralized, and render failures degrade to an in-view error.
99- - Local JSON storage now shares a single cold-load promise across concurrent
100- first requests, preventing a race that could overwrite persisted board data.
101- - The viewer no longer renders a part whose kind it doesn't recognize as a
102- broken diff ("Couldn't render diff — No diff content"). An unknown kind —
103- what a long-open browser tab sees after a new part type ships — now shows a
104- neutral "refresh sideshow to update the viewer" hint, and ` diff ` is dispatched
105- explicitly rather than as the catch-all.
106- - Malformed ` POST ` /` PUT /api/surfaces ` part payloads are now rejected before
107- they reach storage, instead of being saved and failing later in the viewer.
108- - ` sideshow-term ` can now be packaged and installed standalone: its server
109- runtime dependencies are declared, it reuses the ` sideshow ` package's server
110- core, and published installs run built JavaScript instead of TypeScript from
111- ` node_modules ` .
53+ - ` sideshow-term ` hardens STML parsing/rendering for untrusted markup (tested
54+ entity decoding, bounded size/depth, neutralized control characters, render
55+ failures degrade to an in-view error).
56+ - Local JSON storage shares a single cold-load promise across concurrent first
57+ requests, fixing a race that could overwrite persisted board data.
58+ - The viewer shows a neutral "refresh sideshow to update the viewer" hint for an
59+ unrecognized part kind instead of a broken-diff error.
60+ - Malformed ` POST ` /` PUT /api/surfaces ` part payloads are rejected before they
61+ reach storage.
62+ - ` sideshow-term ` can be packaged and installed standalone (declared server
63+ dependencies, reuses the ` sideshow ` server core, runs built JavaScript).
11264
11365## [ 0.4.0] - 2026-06-15
11466
0 commit comments