Skip to content

Commit 5c5e4d0

Browse files
benvinegarclaude
andcommitted
chore(release): 0.5.0
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 3c1da87 commit 5c5e4d0

3 files changed

Lines changed: 50 additions & 98 deletions

File tree

CHANGELOG.md

Lines changed: 47 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -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

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sideshow",
3-
"version": "0.4.0",
3+
"version": "0.5.0",
44
"description": "A live visual surface for terminal coding agents — agents draw HTML snippets, you watch them in the browser and comment back.",
55
"keywords": [
66
"agent-tools",

0 commit comments

Comments
 (0)