Changelog
Generated from CHANGELOG.md in the project repository. Never maintained twice.
Unreleased
- changedPages: the project site uses the current shared theme (0.12.12).
0.6.0
8 November 2026
- breakingshow: a
show:file must live inside the project root (the working directory, or Vite'sroot); a path outside it is an error unless--allow-show-outside-rootor the plugin optionallowShowOutsideRootis set. Shown text also gets the secret and home-directory warnings thatexec:output has. Details: DSL reference. - breakingParser:
pauseon awaitstep is a positioned error instead of being silently ignored. - addedCLI:
castwright --versionand per-command--help. - addedCLI:
castwright validatechecksshow:steps (file,lines:range, language) without running the highlighter. - addedCLI: an
exec:step on Windows stops with a clear "not supported on Windows" message instead of a spawn failure. - addedCursor:
terminal.cursortakes effect — the cast carries it as DECSCUSR at t=0, and the SVG export draws block, bar or underline (no blink). - addedPlayer: plays asciicast v3 recordings, honours
idle_time_limit, skips truncated or malformed event lines with a warning, and rejects v1 and unknown versions with a clear error. - addedPlayer: the progress bar is an accessible seek slider; while focus is inside the demo, Left/Right/Home/End seek and
ktoggles play/pause. - addedPlayer:
castwright:ready,castwright:play,castwright:pause,castwright:endedandcastwright:errorevents, andposter="marker:<label>". - addedAstro:
<TerminalDemo src="…">takes the accessibility fallback as slot content and warns at build time when none is given. - addednpm:
node-ptyis declared as an optional peer dependency of@casoon/castwright. - addedPlayer: marker ticks on the seek bar, plus
handle.markersandhandle.seekToMarker(label); the slider's value text names the latest marker passed. - addedPlayer: drag scrubbing on the seek bar for mouse, touch and pen; it pauses while dragging and restores the previous play state on release.
- addedPlayer:
speedattribute and option (0.25–4×) andhandle.speed; optionalspeed-controladds a labelled speed button to the transport row. - addedPlayer: optional
copyattribute adds a button that copies the terminal's final text, with anaria-liveconfirmation. - changedParser: "unknown markup tag" hints at the
{{escape for shell braces such asawk '{print $1}'. - changedParser: the
outputline-width warning measures terminal columns — escape sequences are ignored, wide characters and emoji count twice. - changedRecord:
--recordwritesrawoutput as a double-quoted scalar. - changedPlayer: changing attributes or
caston a mounted<castwright-demo>rebuilds the player; playback pauses in hidden tabs. - changedAstro: the reserved height includes the title bar and transport row and honours
rows,chromeandcontrols. - changedPages: the project site uses the current shared theme (0.12.6).
- changedContributors: CI runs on Node 22 and 24 and builds on Windows and macOS; the publish gate runs the asciicast compatibility check; a tag creates a GitHub Release; issue and pull request templates and
SECURITY.mdadded. - fixedCompiler:
outputwithdelay > 0no longer appends a newline the text did not have, so--recordreplays match the live screen. - fixedParser: a double-quoted
output.rawis no longer decoded twice —"C:\\Users"keeps its backslashes. - fixedParser: error positions inside block and quoted scalars point at the offending character, including bad
rawescapes. - fixedSVG: characters forbidden in XML 1.0 are dropped instead of producing a malformed file, and non-
#rrggbbtheme colours are rejected. - fixedRecord:
--recordkeeps comments written on anexec:step. - fixedTape: a line edited with an unsupported key such as
Homeis typed but not run, andBackspaceremoves a whole grapheme. - fixedCLI: a missing or unwritable file prints
castwright: cannot read|write <file>: …instead of a stack trace, andcastwright devchecks the file exists. - fixedVite: the plugin forwards YAML parse warnings and watches
show:files before reading them, so creating a missing file recompiles the demo. - fixedPlayer: a looping demo no longer restarts or keeps playing after it scrolls out of view during the final-frame hold.
- fixedPlayer: the terminal size is restored on seek, restart and loop after a recording's resize events.
- fixedPlayer: switching
prefers-reduced-motionon while a demo plays stops it and shows the final frame. - fixedPlayer: disconnecting restores the host element's attributes and
--castwright-*properties;controls="hover"controls no longer capture clicks while invisible. - securityAstro: the inline cast JSON no longer breaks out of its
<script>block when a demo's output contains</script>or<!--. - securityDependencies: development and build dependencies updated to clear all
pnpm auditadvisories (Vitest 4, happy-dom 21, Vite 7.3.7, Astro 7.4.4 and their transitive packages); the published packages' runtime dependencies are unchanged.
0.5.2
30 October 2026
- changedProject page: the start page now carries a release teaser and an FAQ (theme 0.11.1).
- fixedCompiler: a closing
wait:holds the final screen in the player and in the SVG, GIF and MP4 exports, before the loop hold; it used to be dropped. Details: Player reference.
0.5.1
27 October 2026
- changedReleases: the packages are published from a tag workflow with npm Trusted Publishing (provenance, no stored token), after approval in the
npmenvironment.
0.5.0
26 October 2026
- addedSVG:
--start final|beginningchooses where the loop's first pass starts. Details: CLI reference. - changedSVG: opens on the finished screen, held for
--loop-delay, and then plays from the beginning — instead of an almost empty terminal while the first command is typed.--start beginningkeeps the old behaviour. - changedProject page: the start page shows a scene as castwright's own animated SVG export, says who castwright is for, and explains the way from a
.terminal.yamlfile to the web player, SVG, GIF and MP4 in a diagram, also in the documentation. - fixedSVG: after a
clear:the previous screen stays up until the next prompt, instead of a blank terminal for the length of the step's pause.
0.4.0
28 September 2026
- added
castwright build demo.tape --allow-exec --recordwrites the recorded tape to a newdemo.terminal.yamlnext to it: each command asrun:with exactly what it printed, hidden setup left out. The YAML then builds without running anything. An existing file is never overwritten. - changed
--recordno longer writes an emptyoutput:step for a command that printed nothing. - fixed
@casoon/castwrightaccepts Vite 8 as a peer. Astro 7 ships Vite 8, so installing@casoon/astro-castwrightin an Astro 7 project warned about an unmetvitepeer.
0.3.0
26 September 2026
- addedVHS
.tapefiles as input:castwright build,validateanddevand the Vite plugin take them next to*.terminal.yaml. With--allow-execeach typed command runs as anexec:step and its output is recorded; commands typed betweenHideandShowrun silently before each visible one. A documented subset, listed in the VHS tapes reference.
0.2.1
25 September 2026
- fixed
--recordno longer folds long lines when it rewrites the file: a recorded line stays exactly as the program printed it, and the rest of the file keeps its layout.
0.2.0
25 September 2026
- addedDSL parser and
ScriptIR:*.terminal.yamlwithrun,type,key,output,wait,clear,promptandmarker, inline colour markup, raw ANSI, and validation errors carrying file, line, column and the offending source line. - addedCompiler from
Scriptto asciicast v2, deterministic by construction: no wall clock, no unseeded randomness, grapheme-cluster typing, and snapshot tests over the whole example corpus to keep it that way. - addedSeven bundled themes, embedded in the cast header so a
.castlooks right wherever it is played. - added
castwrightCLI:build,validateanddev. - added
<castwright-demo>, a framework-agnostic web player on xterm.js — lazy, pausing when scrolled out of view, with seek implemented as replay rather than a skip. - addedAccessibility: the element's light-DOM children are the terminal's final text, generated at build time; the live terminal is hidden from assistive technology; reduced motion shows the final frame immediately; the terminal is never a keyboard trap.
- added
chrome="none"andcontrols="hover"for a bare looping demo that still has a real, focus-revealed pause control. - addedVite plugin at
@casoon/castwright/vite, covering every bundler-based framework, and a thin Astro integration with<TerminalDemo />on top of it. - addedA self-contained player bundle, so the no-bundler path needs no CDN.
- added
castwright build --format svg: one self-contained animated SVG — real text, the cast's theme, no script, reduced-motion aware — that plays inside a plain<img>, as a GitHub README embeds it. Each terminal line animates only when it changes, so a minute of demo is around 120 kB.--no-chromeand--loop-delayshape it. - added
--format gifand--format mp4, throughaggandffmpeg, with an install hint when either is missing. - added
show:puts a file on screen, syntax-highlighted at build time with Shiki (an optional peer dependency) — withlines,langandtheme. - added
exec:runs a real command in a pseudo-terminal and records its output with real timing, only with--allow-exec/allowExec: true.--recordwrites the output back into the file asrun:+output: { raw }, so the demo replays the same bytes on every build. node-pty is an optional peer dependency. - addedThe player works under a strict
style-src(no'unsafe-inline'), such as Astro's hash-based CSP. In Firefox, 24-bit colours additionally needstyle-src-attr 'unsafe-inline'. - fixedSeeking or restarting during playback could leave two runs' worth of output on screen.
- fixedPage styles now override the player's defaults (
castwright-demo { --castwright-… }), as the theming guide describes. - fixedThe window frame is as wide as the terminal instead of stretching across a wide page.