From 92dd1dd82cc9dc5ce30b18e778309d9df34f7cfd Mon Sep 17 00:00:00 2001 From: Dave Kerr Date: Wed, 4 Mar 2026 09:46:23 +0000 Subject: [PATCH 1/8] docs: add eval baseline docs, MCP tool reference, and screenshot-border baselines - Update evaluations/README.md with baseline naming convention, update workflow, MCP tool reference with parameters, and artifact naming guidance - Add CI/CD baselines for screenshot-border scenario --- evaluations/README.md | 71 ++++++++++++++- .../baseline-cicd-screenshot-bordered.png | 89 +++++++++++++++++++ .../baseline-cicd-screenshot.png | 89 +++++++++++++++++++ 3 files changed, 245 insertions(+), 4 deletions(-) create mode 100644 evaluations/scenarios/screenshot-border/baseline-cicd-screenshot-bordered.png create mode 100644 evaluations/scenarios/screenshot-border/baseline-cicd-screenshot.png diff --git a/evaluations/README.md b/evaluations/README.md index 62107ee..4cc4332 100644 --- a/evaluations/README.md +++ b/evaluations/README.md @@ -1,6 +1,6 @@ # Evaluations -Automated recording evaluations using Claude API with shellwright. +Automated recording and screenshot evaluations using Claude API with shellwright. ## Usage @@ -9,24 +9,87 @@ Automated recording evaluations using Claude API with shellwright. ```bash # Requires ANTHROPIC_API_KEY npm run eval + +# Run a single scenario +npm run eval -- screenshot-border ``` ### Generate comparison table ```bash npm run eval:compare +open scenarios/index.html ``` ## Adding a new scenario 1. Create a folder in `scenarios/` 2. Add a `prompt.md` with instructions for Claude -3. Run evaluations to generate the recording +3. Run evaluations to generate artifacts (GIFs, PNGs) + +## Baselines + +Baselines are reference artifacts committed to the repo for visual comparison. Each artifact `.` can have two baselines: + +| File | Source | +|------|--------| +| `baseline-local-.` | Developer machine | +| `baseline-cicd-.` | CI environment | + +### Updating baselines + +**Local baseline:** Run the eval locally and copy the output: + +```bash +npm run eval -- screenshot-border +cp scenarios/screenshot-border/screenshot.png scenarios/screenshot-border/baseline-local-screenshot.png +``` + +**CI/CD baseline:** Download the artifact from the PR preview and commit it: + +```bash +curl -o scenarios/vim-session/baseline-cicd-recording.gif \ + https://dwmkerr.github.io/shellwright/pr-preview/pr-XX/vim-session/recording.gif +``` + +The comparison page auto-discovers baselines by scanning for `baseline-{local,cicd}-*` files matching each artifact. + +## MCP tools available in scenarios + +Scenario prompts instruct Claude to use these shellwright MCP tools: + +| Tool | Description | +|------|-------------| +| `shell_start` | Start a new PTY session with a command | +| `shell_send` | Send input to a PTY session (use `\r` for Enter) | +| `shell_read` | Read the current terminal buffer as plain text | +| `shell_screenshot` | Capture terminal screenshot as PNG | +| `shell_record_start` | Start recording a terminal session (captures frames for GIF) | +| `shell_record_stop` | Stop recording and save GIF | +| `shell_stop` | Stop a PTY session | + +### Key parameters + +**`shell_start`** — `command`, `args`, `cols`, `rows`, `theme` (e.g., `one-dark`) + +**`shell_send`** — `input` (with escape sequences: `\r`=Enter, `\x1b`=Escape, `\x03`=Ctrl+C) + +**`shell_screenshot`** — `name` (without extension), `border: { style: "macos", title: "..." }` + +**`shell_record_start`** — `fps` (default: 10, max: 30) + +**`shell_record_stop`** — `name` (without extension, `.gif` added automatically) + +### Artifact naming + +Tools append extensions automatically — pass names **without** extensions: +- `name: "recording"` → `recording.gif` +- `name: "screenshot"` → `screenshot.png` ## CI Integration The `recording-eval.yaml` workflow runs on every PR: 1. Executes all scenarios 2. Generates comparison table -3. Uploads recordings as artifacts -4. Posts summary to PR +3. Deploys to GitHub Pages as PR preview +4. Uploads GIF and PNG artifacts diff --git a/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot-bordered.png b/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot-bordered.png new file mode 100644 index 0000000..5b10050 --- /dev/null +++ b/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot-bordered.png @@ -0,0 +1,89 @@ + + + + + + Page not found · GitHub Pages + + + + +
+ +

404

+

File not found

+ +

+ The site configured at this address does not + contain the requested file. +

+ +

+ If this is your site, make sure that the filename case matches the URL + as well as any file permissions.
+ For root URLs (like http://example.com/) you must provide an + index.html file. +

+ +

+ Read the full documentation + for more information about using GitHub Pages. +

+ + + + + + +
+ + diff --git a/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot.png b/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot.png new file mode 100644 index 0000000..5b10050 --- /dev/null +++ b/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot.png @@ -0,0 +1,89 @@ + + + + + + Page not found · GitHub Pages + + + + +
+ +

404

+

File not found

+ +

+ The site configured at this address does not + contain the requested file. +

+ +

+ If this is your site, make sure that the filename case matches the URL + as well as any file permissions.
+ For root URLs (like http://example.com/) you must provide an + index.html file. +

+ +

+ Read the full documentation + for more information about using GitHub Pages. +

+ + + + + + +
+ + From 6fefc306d9588851a83532195866225a45c16b5d Mon Sep 17 00:00:00 2001 From: Dave Kerr Date: Wed, 4 Mar 2026 09:51:48 +0000 Subject: [PATCH 2/8] fix: replace broken baseline PNGs with actual CI artifacts Previous baselines were HTML 404 pages from GitHub Pages, not PNGs. Downloaded real artifacts from CI run. --- .../baseline-cicd-screenshot-bordered.png | Bin 9379 -> 29828 bytes .../baseline-cicd-screenshot.png | Bin 9379 -> 17697 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot-bordered.png b/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot-bordered.png index 5b10050e051bff851e49e276d133b69c30d294b2..0ad10588b6e7840765f563e76a96200f38dc8f79 100644 GIT binary patch literal 29828 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 Z*VXs^t>)Y7p!>z^J5}(a^zoCV{|#Rn!Epcp diff --git a/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot.png b/evaluations/scenarios/screenshot-border/baseline-cicd-screenshot.png index 5b10050e051bff851e49e276d133b69c30d294b2..a983b4b6e43b7fd47de5a96e7b4cd6bbe1a44573 100644 GIT binary patch literal 17697 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 O>}?%SR2{!`^S=QijlyvN literal 9379 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 Z*VXs^t>)Y7p!>z^J5}(a^zoCV{|#Rn!Epcp From bf92118faedbf248f20db7ce3508bbf8e9219510 Mon Sep 17 00:00:00 2001 From: Dave Kerr Date: Wed, 4 Mar 2026 10:02:20 +0000 Subject: [PATCH 3/8] docs: rename evaluation headings to Evidence: Screenshots and Recordings Update PR comment, HTML page title, and h1 heading. --- .github/workflows/recording-eval.yaml | 6 +++--- evaluations/template.html | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/recording-eval.yaml b/.github/workflows/recording-eval.yaml index eedb9b2..e547a74 100644 --- a/.github/workflows/recording-eval.yaml +++ b/.github/workflows/recording-eval.yaml @@ -80,9 +80,9 @@ jobs: with: header: recording-eval message: | - ## Recording Evaluation - - 🎬 **[View recording comparisons](${{ steps.preview.outputs.preview-url }})** + ## Evidence + ### Screenshots and Recordings + **[View Recordings & Review](${{ steps.preview.outputs.preview-url }})** - name: Upload recordings if: github.event.action != 'closed' diff --git a/evaluations/template.html b/evaluations/template.html index e4581f4..639a1c6 100644 --- a/evaluations/template.html +++ b/evaluations/template.html @@ -3,7 +3,7 @@ - Recording Evaluation + Evidence: Screenshots and Recordings -

Recording Evaluation

+

Evidence: Screenshots and Recordings

Baselines: Local = developer machine, CI/CD = previous CI run.
To update a baseline: download the PR artifact and commit as baseline-local-<name>.ext or baseline-cicd-<name>.ext From 1e3c9bde14bbbaba111f3eacc2944ca859bdcfb6 Mon Sep 17 00:00:00 2001 From: Dave Kerr Date: Wed, 4 Mar 2026 10:06:15 +0000 Subject: [PATCH 4/8] docs: add border parameter to shell_screenshot in README Document the border object parameter with style and title options, add example JSON, and note that name should omit the extension. --- README.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f783e7..c1ed35a 100644 --- a/README.md +++ b/README.md @@ -280,7 +280,7 @@ drwxr-xr-x 10 user staff 320 Dec 18 09:00 .. ### **shell_screenshot** -Capture terminal as PNG. Also saves SVG, ANSI, and plain text versions: +Capture terminal as PNG. Also saves SVG, ANSI, and plain text versions. Pass `name` without extension (`.png` is added automatically): ```json { @@ -289,6 +289,27 @@ Capture terminal as PNG. Also saves SVG, ANSI, and plain text versions: } ``` +Add a macOS-style window border with optional title text: + +```json +{ + "session_id": "shell-session-a1b2c3", + "name": "my-screenshot", + "border": { + "style": "macos", + "title": "Terminal" + } +} +``` + +| Parameter | Type | Description | +|-----------|------|-------------| +| `session_id` | string | Session ID (required) | +| `name` | string | Screenshot name without extension (default: `screenshot_{timestamp}`) | +| `border` | object | Optional window border decoration | +| `border.style` | `"macos"` | Border style — macOS window chrome with traffic lights and drop shadow | +| `border.title` | string | Title text in the title bar | + The response contains a `download_url` for curl to save the file locally: ```json From a21c7abd02f2dc7b8a0bb42b737614da540dca02 Mon Sep 17 00:00:00 2001 From: Dave Kerr Date: Wed, 4 Mar 2026 10:06:41 +0000 Subject: [PATCH 5/8] docs: add border parameter to README, enforce tool docs in CLAUDE.md - Document shell_screenshot border parameter with examples in README - Add MCP Tools section to CLAUDE.md requiring README updates when tool schemas change --- CLAUDE.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 197f74b..ff7987e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -32,6 +32,10 @@ npm run dev # Development with hot-reload - **PTY** - Uses `node-pty` for pseudo-terminal management - **File Server** - HTTP file server runs on port 7498 regardless of MCP transport mode (stdio or HTTP). Tool results include `download_url` which is always valid. +## MCP Tools + +Tool names, descriptions, and parameters are registered in `src/index.ts` with schemas in `src/tools/`. The README.md [MCP Tools](#mcp-tools) section documents each tool with examples. **Any changes to tool schemas, parameters, or descriptions must be reflected in README.md.** + ## Commit Format Use conventional commits: `feat:`, `fix:`, `docs:`, `chore:`, `refactor:`, `test:` From 33034b21f1eec54bc13aaa7ffde06619c9d71dc5 Mon Sep 17 00:00:00 2001 From: Dave Kerr Date: Wed, 4 Mar 2026 10:39:21 +0000 Subject: [PATCH 6/8] feat: add border support to shell_record_start for GIF recordings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Frames already go through bufferToSvg → PNG, so borders apply naturally. Store border option in RecordingState and pass it to bufferToSvg per frame. Update README with border parameter docs for shell_record_start. --- README.md | 21 +++++++++++++++++++++ src/index.ts | 2 +- src/tools/shell-record-start.ts | 18 ++++++++++++------ src/tools/types.ts | 1 + 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c1ed35a..9185c02 100644 --- a/README.md +++ b/README.md @@ -331,6 +331,27 @@ Start recording frames for GIF export. Frames are captured at the specified FPS } ``` +Add a macOS-style window border to every frame: + +```json +{ + "session_id": "shell-session-a1b2c3", + "fps": 10, + "border": { + "style": "macos", + "title": "Terminal" + } +} +``` + +| Parameter | Type | Description | +|-----------|------|-------------| +| `session_id` | string | Session ID (required) | +| `fps` | number | Frames per second (default: 10, max: 30) | +| `border` | object | Optional window border applied to every frame | +| `border.style` | `"macos"` | Border style — macOS window chrome with traffic lights and drop shadow | +| `border.title` | string | Title text in the title bar | + The response confirms recording has started: ```json diff --git a/src/index.ts b/src/index.ts index 57f0b59..1f8da22 100644 --- a/src/index.ts +++ b/src/index.ts @@ -216,7 +216,7 @@ Tips: server.tool( "shell_record_start", - "Start recording a terminal session (captures frames for GIF/video export)", + "Start recording a terminal session (captures frames for GIF export). Optionally add a window border to every frame.", shellRecordStartSchema, async (params) => shellRecordStart(params, toolContext) ); diff --git a/src/tools/shell-record-start.ts b/src/tools/shell-record-start.ts index 2525e70..0ed0551 100644 --- a/src/tools/shell-record-start.ts +++ b/src/tools/shell-record-start.ts @@ -8,13 +8,17 @@ import { ToolContext } from "./types.js"; export const shellRecordStartSchema = { session_id: z.string().describe("Session ID"), fps: z.number().optional().describe("Frames per second (default: 10, max: 30)"), + border: z.object({ + style: z.enum(["macos"]).describe("Border style"), + title: z.string().optional().describe("Title text in the title bar"), + }).optional().describe("Optional window border decoration applied to every frame"), }; export async function shellRecordStart( - params: { session_id: string; fps?: number }, + params: { session_id: string; fps?: number; border?: { style: "macos"; title?: string } }, context: ToolContext ) { - const { session_id, fps } = params; + const { session_id, fps, border } = params; const session = context.sessions.get(session_id); if (!session) { throw new Error(`Session not found: ${session_id}`); @@ -34,14 +38,16 @@ export async function shellRecordStart( framesDir, frameCount: 0, fps: recordingFps, + border, interval: setInterval(async () => { if (!session.recording) return; const frameNum = session.recording.frameCount++; - const svg = bufferToSvg(session.terminal, session.cols, session.rows, { - theme: session.theme, - fontSize: context.config.FONT_SIZE, - fontFamily: context.config.FONT_FAMILY + const svg = bufferToSvg(session.terminal, session.cols, session.rows, { + theme: session.theme, + fontSize: context.config.FONT_SIZE, + fontFamily: context.config.FONT_FAMILY, + border, }); const png = new Resvg(svg, context.resvgOptions).render().asPng(); const framePath = path.join(framesDir, `frame${String(frameNum).padStart(6, "0")}.png`); diff --git a/src/tools/types.ts b/src/tools/types.ts index d41a09f..4c1b721 100644 --- a/src/tools/types.ts +++ b/src/tools/types.ts @@ -8,6 +8,7 @@ export interface RecordingState { frameCount: number; interval: ReturnType; fps: number; + border?: { style: string; title?: string }; } export interface Session { From 23ce1944b61a3baea3a0f3b1c2df8b0594503230 Mon Sep 17 00:00:00 2001 From: Dave Kerr Date: Wed, 4 Mar 2026 10:40:36 +0000 Subject: [PATCH 7/8] docs: consolidate border docs in README, reference from shell_record_start --- README.md | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 9185c02..df12a20 100644 --- a/README.md +++ b/README.md @@ -322,36 +322,16 @@ The response contains a `download_url` for curl to save the file locally: ### **shell_record_start** -Start recording frames for GIF export. Frames are captured at the specified FPS (default 10, max 30, compression occurs by deduplicating identical frames): - -```json -{ - "session_id": "shell-session-a1b2c3", - "fps": 10 -} -``` - -Add a macOS-style window border to every frame: +Start recording frames for GIF export. Frames are captured at the specified FPS (default 10, max 30, compression occurs by deduplicating identical frames). The optional `border` parameter (same as [`shell_screenshot`](#shell_screenshot)) applies window chrome to every frame: ```json { "session_id": "shell-session-a1b2c3", "fps": 10, - "border": { - "style": "macos", - "title": "Terminal" - } + "border": { "style": "macos", "title": "Terminal" } } ``` -| Parameter | Type | Description | -|-----------|------|-------------| -| `session_id` | string | Session ID (required) | -| `fps` | number | Frames per second (default: 10, max: 30) | -| `border` | object | Optional window border applied to every frame | -| `border.style` | `"macos"` | Border style — macOS window chrome with traffic lights and drop shadow | -| `border.title` | string | Title text in the title bar | - The response confirms recording has started: ```json From cffe912a8756c654b7932deee36f8a39cd76685b Mon Sep 17 00:00:00 2001 From: Dave Kerr Date: Wed, 4 Mar 2026 14:37:48 +0000 Subject: [PATCH 8/8] docs: simplify README tool docs, add bordered screenshot example - Remove parameter tables from shell_screenshot/shell_record_start to match style of other tool sections - Add bordered Claude Code screenshot example to Examples section - Enrich MCP tool descriptions with border info (off by default) --- README.md | 30 +++++++------------------ docs/examples/claude-code-bordered.png | Bin 0 -> 34287 bytes src/index.ts | 4 ++-- 3 files changed, 10 insertions(+), 24 deletions(-) create mode 100644 docs/examples/claude-code-bordered.png diff --git a/README.md b/README.md index df12a20..5d1734d 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,12 @@ Open [`k9s`](https://k9scli.io/) and show [Ark](https://github.com/mckinsey/agen ![Screenshot: Examples - K9S Agents](./docs/examples/k9s-agents.gif) +Take a bordered screenshot: + +> Open Claude Code. Take a screenshot with a macOS window border titled "Shellwright". + +![Screenshot: Examples - Bordered Screenshot](./docs/examples/claude-code-bordered.png) + Use [`htop`](https://github.com/htop-dev/htop): > Open htop and show the most resource intensive process. @@ -280,36 +286,16 @@ drwxr-xr-x 10 user staff 320 Dec 18 09:00 .. ### **shell_screenshot** -Capture terminal as PNG. Also saves SVG, ANSI, and plain text versions. Pass `name` without extension (`.png` is added automatically): - -```json -{ - "session_id": "shell-session-a1b2c3", - "name": "my-screenshot" -} -``` - -Add a macOS-style window border with optional title text: +Capture terminal as PNG. Also saves SVG, ANSI, and plain text versions. Pass `name` without extension (`.png` is added automatically). Optionally add a macOS-style window border (off by default): ```json { "session_id": "shell-session-a1b2c3", "name": "my-screenshot", - "border": { - "style": "macos", - "title": "Terminal" - } + "border": { "style": "macos", "title": "Terminal" } } ``` -| Parameter | Type | Description | -|-----------|------|-------------| -| `session_id` | string | Session ID (required) | -| `name` | string | Screenshot name without extension (default: `screenshot_{timestamp}`) | -| `border` | object | Optional window border decoration | -| `border.style` | `"macos"` | Border style — macOS window chrome with traffic lights and drop shadow | -| `border.title` | string | Title text in the title bar | - The response contains a `download_url` for curl to save the file locally: ```json diff --git a/docs/examples/claude-code-bordered.png b/docs/examples/claude-code-bordered.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3e8716d674d915e56fac14c3ad72b0253f56a6 GIT binary patch literal 34287 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 cW{)j@~HUj8!yLOpeH@{Y4c<1T=1qWal+W-In literal 0 HcmV?d00001 diff --git a/src/index.ts b/src/index.ts index 1f8da22..cee2658 100644 --- a/src/index.ts +++ b/src/index.ts @@ -202,7 +202,7 @@ Tips: server.tool( "shell_screenshot", - "Capture terminal screenshot as PNG. Returns a download_url - use curl to save the file locally (e.g., curl -o screenshot.png )", + "Capture terminal screenshot as PNG. Optionally add a macOS-style window border with border: { style: \"macos\", title: \"...\" } (off by default). Returns a download_url - use curl to save the file locally (e.g., curl -o screenshot.png )", shellScreenshotSchema, async (params) => shellScreenshot(params, toolContext) ); @@ -216,7 +216,7 @@ Tips: server.tool( "shell_record_start", - "Start recording a terminal session (captures frames for GIF export). Optionally add a window border to every frame.", + "Start recording a terminal session (captures frames for GIF export). Optionally add a macOS-style window border to every frame with border: { style: \"macos\", title: \"...\" } (off by default).", shellRecordStartSchema, async (params) => shellRecordStart(params, toolContext) );