Releases: coder/agent-tty
v0.4.3: Tag-attributed release pipeline dispatch
A single-fix patch release that re-pins the Release pipeline dispatch to the tag ref, so npm trusted publishing and provenance OIDC claims once again reference refs/tags/v<version> instead of main. No CLI, JSON envelope, snapshot, recording, or export behavior changes.
Fixed
- Release pipeline dispatched on the tag ref (#145 by @ThomasK33). The release-please workflow now invokes
gh workflow run release.yml --ref "$tag" --field "tag=$tag". Without--ref,gh workflow runattaches theworkflow_dispatchevent to the default branch, so the v0.4.2 release run was attributed tomainrather thanv0.4.2. With this change the run attaches torefs/tags/v<version>like the oldpush: tagsflow, the Actions UI shows the tag, and the OIDC token claims behind npm trusted publishing and provenance reference the tag instead of whatevermain's HEAD currently is.- No artifact-integrity impact for v0.4.2.
release.ymlresolves the tag from its input, checks out the tag explicitly, and validates the tag againstpackage.jsonand main-ancestry before building, so the v0.4.2 run built the correct commit. This fix only affects run attribution and OIDC claims.
- No artifact-integrity impact for v0.4.2.
Full Changelog: v0.4.2...v0.4.3
Install from npm once the trusted publish job for this workflow completes:
npm install -g "agent-tty@0.4.3"
agent-tty version --jsonIf you need a registry-independent fallback, install the verified tarball asset attached to this release:
VERSION=0.4.3
RELEASE_TAG=v0.4.3
gh release download "$RELEASE_TAG" --repo "coder/agent-tty" --pattern "agent-tty-${VERSION}.tgz"
npm install -g "./agent-tty-${VERSION}.tgz"
agent-tty version --jsonInstall from npm once the trusted publish job for this workflow completes:
npm install -g "agent-tty@0.4.3"
agent-tty version --jsonIf you need a registry-independent fallback, install the verified tarball asset from this release directly:
VERSION=0.4.3
RELEASE_TAG=v0.4.3
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.4.3/agent-tty-0.4.3.tgz
npm install -g "$TARBALL_URL"
agent-tty version --jsonFor private releases or environments that require authenticated downloads, fetch the asset first and then install locally:
gh release download "v0.4.3" --repo "coder/agent-tty" --pattern "agent-tty-0.4.3.tgz"
npm install -g "./agent-tty-0.4.3.tgz"
agent-tty version --jsonSHA-256 checksum: 38d9bfdb5c174fd3fd59226696d24a83a77e7716b68babfddbb71d5bd8ff062e (see agent-tty-0.4.3.tgz.sha256 for the portable checksum file).
This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.
v0.4.2: Release plumbing on release-please
A maintenance release that swaps the release machinery over to release-please while keeping Communique as the changelog author. No CLI, JSON envelope, snapshot, recording, or export behavior changes — the published npm tarball and GitHub Release artifacts are produced by the same tag-driven release.yml pipeline as v0.4.1.
Changed
- Release flow moved to release-please + Communique (#143 by @ThomasK33). The previous
[Unreleased]bot-PR workflow, therelease/*changelog workflow, and the localrelease:prep/release:finalizescripts are retired. A single standingchore(release): <version>PR is now maintained on every push tomain; merging it tagsv<version>, creates the GitHub Release, and dispatches the existing publish pipeline. Version selection follows Conventional Commits withbump-minor-pre-major+bump-patch-for-minor-pre-majorto match the pre-1.0 cadence (breaking → minor, feat/fix → patch);Release-As:footers still override. - CHANGELOG headings drop the
vprefix. New sections are written as## [0.4.2] - <date>instead of## [v0.4.2] - ...; release-please's PR-body parser requires a digit immediately after the bracket, so a leadingvwould cause the merge to produce no release. The historical## [v0.4.1]entry is left untouched. ## [Unreleased]anchor preserved. A custom node-strategy updater inserts new release sections below the[Unreleased]heading (release-please's stock updater would insert above it) and clears any staged draft once it has been folded into the generated notes. Maintainers can continue to stage draft wording under[Unreleased]and Communique will reconcile it into the next release.- ADR 0009 records the decision; ADR 0002 (release-it for release prep) is superseded, and
docs/RELEASE-PROCESS.mdhas been rewritten for the new flow.
Notes for maintainers
- Requires the existing
ANTHROPIC_API_KEYsecret (orOPENAI_API_KEY+COMMUNIQUE_MODELvar) — same contract as the retired workflows. - Any leftover
automation/update-unreleased-changelogPR should be closed; its workflow no longer exists.
Full Changelog: v0.4.1...v0.4.2
Install from npm once the trusted publish job for this workflow completes:
npm install -g "agent-tty@0.4.2"
agent-tty version --jsonIf you need a registry-independent fallback, install the verified tarball asset from this release directly:
VERSION=0.4.2
RELEASE_TAG=v0.4.2
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.4.2/agent-tty-0.4.2.tgz
npm install -g "$TARBALL_URL"
agent-tty version --jsonFor private releases or environments that require authenticated downloads, fetch the asset first and then install locally:
gh release download "v0.4.2" --repo "coder/agent-tty" --pattern "agent-tty-0.4.2.tgz"
npm install -g "./agent-tty-0.4.2.tgz"
agent-tty version --jsonSHA-256 checksum: cfaf6bdd998a43722082cb79a8052164ccae24b3e34f3bfa036404ab541857e5 (see agent-tty-0.4.2.tgz.sha256 for the portable checksum file).
This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.
v0.4.1: Maximize the Dashboard, `ls` alias, watchable WebM defaults
A small, quality-of-life release: a muscle-memory ls alias, a maximize affordance for the dashboard's Live View, and a saner default for record export --format webm so exported videos are actually watchable.
Added
agent-tty lsalias forlist(#135 by @ThomasK33). Mirrors thed→dashboardalias from v0.4.0. Wired as an explicit Commander alias (not prefix matching), so it resolves unambiguously tolistand is unaffected by other commands.agent-tty ls --helpnow reportsUsage: agent-tty list|ls [options].- Dashboard Live View maximize (#136 by @ThomasK33). Press
Enterfrom the session list or the focused Live View to expand the selected session's Live View to the full dashboard body (dropping the session list);Escrestores the split.- Maximize is a modal layer that never mutates
focus, soEscreturns to whatever was focused underneath (list → list, pane → pane). - Panning (
↑/↓ h/j/k/l) and thezOverview toggle keep working while maximized; the header and footer stay;Tab/H/aare inert so it reads as a distinct mode. - The maximized pane keeps the same right edge as the split view so toggling never shifts the frame, and pan resets on toggle to match every other geometry transition. Per ADR 0006 the Live View is still clipped/panned/overview to fit a pane — only the pane size changes — so this is a pure presentation affordance with no domain-model impact.
- Maximize is a modal layer that never mutates
Changed
-
WebM exports default to recorded wall-clock timing (#139 by @ThomasK33).
record export --format webmnow defaults to--timing recorded, so exports play back at the recorded pace instead of the previousaccelerateddefault that clamped every idle gap to 100ms and rendered most interactive sessions as ~2s flash-by clips.acceleratedandmax-speedremain available as explicit opt-ins.acceleratedhas been retuned for watchability: idle gaps now clamp to 400ms (was 100ms) and each frame holds at least 100ms (was 50ms), so opting into time compression no longer produces a flickery strobe.- Automation impact: the CLI JSON envelope shape is unchanged. Only the default value of
metadata.timingModediffers (recordedinstead ofaccelerated) when--timingis omitted, and accelerated exports are proportionally longer due to the retuned clamps. Pin--timing accelerated(or--timing max-speed) if you depend on the old behaviour.
Dogfood proof from the PR (a
echo; sleep 2; echo; sleep 2; echosession, ~4s wall time):Export metadata.timingModeVideo duration No flag (new default) recorded7.20s — matches session wall time + 1s final hold --timing accelerated(new 400ms clamp)accelerated4.00s --timing accelerated(old 100ms clamp)accelerated2.84s — the old flash-by behavior
Full Changelog: v0.4.0...v0.4.1
Install from npm once the trusted publish job for this workflow completes:
npm install -g "agent-tty@0.4.1"
agent-tty version --jsonIf you need a registry-independent fallback, install the verified tarball asset from this release directly:
VERSION=0.4.1
RELEASE_TAG=v0.4.1
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.4.1/agent-tty-0.4.1.tgz
npm install -g "$TARBALL_URL"
agent-tty version --jsonFor private releases or environments that require authenticated downloads, fetch the asset first and then install locally:
gh release download "v0.4.1" --repo "coder/agent-tty" --pattern "agent-tty-0.4.1.tgz"
npm install -g "./agent-tty-0.4.1.tgz"
agent-tty version --jsonSHA-256 checksum: 7a7f4157d23401b22736d6f76d05dbe1baa115c95febb6cbc09f783fb8d2ac4a (see agent-tty-0.4.1.tgz.sha256 for the portable checksum file).
This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.
v0.4.0: Batch sequences, Screen Hash, and the Home Registry
Added
agent-tty batch <session-id>: run an ordered sequence of input-and-waitsteps against one session in a single invocation, supplied as a positional JSON array or--file. Each step is one verb (type,paste,sendKeys,run, orwait); everywaitis anchored to a Wait Baseline (the Event Log sequence after the preceding input step) so it cannot match a stale screen the way a hand-writtenrun/wait/send-keysloop can (ADR 0007). Fail-fast by default with a non-zero exit and a per-step--jsonenvelope;--keep-goingattempts every step. SIGINT/SIGTERM flushes a partial envelope (in-flight stepinterrupted, later stepsnot-run). Adds a newWAIT_TIMEOUTerror and exit code11for timed-out wait steps inside a batch (#126, closes #123).- Optional
screenHashonsnapshotand render-waitresults (also on matchedbatchwait steps): a lowercase 64-char SHA-256 of the canonical visible-screen text (visibleLines[].textjoined by\n, no scrollback, cursor, or styles). Gives automation a stable token to tell whether the rendered screen actually changed between two observations without diffing full text, and unlike the Event Log sequence it does not advance on cursor moves or no-op repaints. Present on every result that observed a snapshot (live matches, captures, and the offlinematched:falsefallback); absent only when no screen was observed (live timeout, consecutive-failure giveup, replay-error throw). Standalonewaitadds an--after-seqflag, andtype/pasteresults now return their Event Logseqso callers can anchor a following wait themselves (#127, closes #125). agent-tty dis now a short alias foragent-tty dashboard. It is an explicit alias (not prefix matching), so it resolves unambiguously to the dashboard and never collides with the otherd-prefixed commands (destroy,doctor) (#129).- Home Registry + dashboard Home picker: agent-tty now remembers every Home (state root) that has hosted a Session in a per-machine, advisory index at
${XDG_STATE_HOME:-~/.local/state}/agent-tty/homes.json, auto-registered oncreateand independent ofAGENT_TTY_HOME. Newagent-tty home list [--all] [--json]lists registered Homes — Active Homes by default,--alladds terminal-only ones — each with live active/total Session counts and a last-seen timestamp, newest first;agent-tty home forget <path>deregisters a Home without touching disk. The read-onlydashboardgains an additive Home picker (pressH,Enterto switch): browsing Homes performs a read-only scan that never reconciles or mutates a Session, while entering a Home reconciles exactly as the single-Home dashboard does today. Both surfaces prune dead or empty Homes on read so a deletedmktemp -dHome never lingers in a listing (ADR 0008, #131, closes #130).
Changed
- Both renderer backends (
libghostty-vtandghostty-web) now produce one canonical visible-screen form (exactlyrowslines, full grapheme clusters, interior blank cells as spaces, ASCII-only trailing trim) shared by the new Screen Hash, host Screen Stability comparison, and the text Render Wait matcher. This narrows a long-standing divergence so the three can never disagree about "the screen", and intentionally changes the defaultghostty-webstability/text-wait comparand on screens with grapheme clusters, interior gaps, or non-ASCII trailing characters (#127). - README front door rewritten: agent-facing one-liner and "like Playwright, but for terminal apps" framing up top, a new "What you'd use it for" section, a "Watch sessions live" section covering the read-only
dashboard, and explicit PNG + WebM artifact positioning vs text/asciicast tools. The command surface is folded into prose and moved after the demos;ROADMAP.mdis retired and every cross-reference removed (#122). The Codex/Claude agent demo videos now sit right after "What you'd use it for", before Quickstart, instead of being buried near the bottom (#128). gcis now cross-Home by default (backward-incompatible): plainagent-tty gcsweeps every registered Home and deregisters the ones it empties or finds deleted, rather than collecting only the default Home. The result envelope changes shape accordingly — a top-levelhomes[]of per-Home outcomes (removedSessions,skippedSessions,totalBytesFreed,existed,deregistered) plus aggregateremovedSessionCount/totalBytesFreed/deregisteredHomes— replacing the former flatremovedSessions/skippedSessions/totalBytesFreed. Pass--home <path>(or setAGENT_TTY_HOME) to scope collection to a single Home as before.gcnever deletes a Home directory. Automation that relied ongcmeaning the default Home, or on the old result shape, must pass--homeand readhomes[](ADR 0008, #131, closes #130).
Install from npm once the trusted publish job for this workflow completes:
npm install -g "agent-tty@0.4.0"
agent-tty version --jsonIf you need a registry-independent fallback, install the verified tarball asset from this release directly:
VERSION=0.4.0
RELEASE_TAG=v0.4.0
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.4.0/agent-tty-0.4.0.tgz
npm install -g "$TARBALL_URL"
agent-tty version --jsonFor private releases or environments that require authenticated downloads, fetch the asset first and then install locally:
gh release download "v0.4.0" --repo "coder/agent-tty" --pattern "agent-tty-0.4.0.tgz"
npm install -g "./agent-tty-0.4.0.tgz"
agent-tty version --jsonSHA-256 checksum: c48849ffd5e2053363621d8e97ac573bd0f1d73575cdc29f677fedd93fbd1c7e (see agent-tty-0.4.0.tgz.sha256 for the portable checksum file).
This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.
v0.3.0: Session Dashboard
Added
agent-tty dashboard: a read-only, interactive Session Dashboard with a list of sessions and a live view of the selected one, sourced fromevents.jsonlvialibghostty-vtreplayTo/snapshotso it never queries the live host (ADR 0006). Tab toggles list vs. Live View focus,zswitches to a block-glyph overview,atoggles active/all scope, and watched sessions pin-on-exit with a final-screen freeze and exit badge. Requires the optionallibghostty-vtrenderer (noghostty-webfallback), sodoctornow reports adashboardreadiness capability. Interactive-only — no--json, fails fast on non-interactive terminals;list --jsonremains the machine-readable path (#113, closes #109).inspect --jsonnow reportshost.cliVersion,host.rpcSocketPath,rendererRuntime.profile,rendererRuntime.booted,rendererRuntime.bootInFlight(live mode), andeventLogBytes(live and offline replay). All fields are optional schema additions; existing consumers are unaffected (#104).- Canonical proof-bundle lock-down: a new
CanonicalBundleManifestSchemarequiressha256andbyteson every artifact,npm run validate-bundle:canonical(also wired throughmise run validate-bundles) runs eight drift-detection rules plus catalog parity across the four canonical bundles, and thelinux-staticCI job now fails on bundle drift (#104). - Hero Demo bundle (
dogfood/agent-uses-agent-tty/) replaced with an external Outer Camera flow: VHS records real Codex (gpt-5.5) and Claude (claude-opus-4-7) TUIs whileagent-ttyproduces the inner Neovim proof artifacts. A newmise run demo:agent-uses-agent-ttytask regenerates and promotes the demo with pinnedvhs/ttyd/ffmpeg(#105). - Hero Demo video playback workflow:
mise run demo:agent-uses-agent-tty:upload-assetsprepares H.264 MP4 upload assets (with the curated thumbnail held as the opening frames so GitHub's natural first-frame poster shows the end state), andmise run demo:agent-uses-agent-tty:apply-video-urlsrewrites the inline<video>srcs in the root and bundle READMEs and refreshes the manifest. Full guidance lives indogfood/agent-uses-agent-tty/VIDEO_PLAYBACK.md(#106). - README rebuild with one-line value prop, badge row, hero GIF, a "Why not tmux/expect/asciinema/Playwright?" comparison table, a two-backend "How it works" section (
libghostty-vt+ghostty-web), and an origin story. Addsassets/hero.{gif,tape}and a Playwright-rendered 1200×630 social card underassets/social-preview.*(#108). - Session Dashboard planning docs: ADR 0006 (Event Log Follow +
libghostty-vtbackend),docs/prd/session-dashboard/PRD.md, and new glossary terms inCONTEXT.mdfor Session Dashboard, Live View, and Event Log Follow (#110).
Changed
- README hero GIF and the
dogfood/agent-uses-agent-tty/Codex/Claude recordings now record inside a tmux two-pane split: the agent drives a session on the left whileagent-tty dashboardlive-mirrors it on the right. Both panes share oneAGENT_TTY_HOMEso the dashboard auto-follows the newest session; the status bar is disabled so VHS's whole-screenWait+Screenscrape stays unambiguous, and each run uses an isolated, reaped tmux server socket. Panes runbash --norcwith a minimal prompt to keep the mirror free of personal shell clutter, and the hero launches the dashboard on camera (typingagent-tty dashboardinto the right pane, hopping back with the tmux prefix). A newmise run demo:herotask (whichdependsonbuild) regenerates the hero GIF;tmux(>= 3.1, pinned to3.6inmise) joinsvhs/ttyd/ffmpegas a recorder prerequisite. Agent recordings now run via a bounded worker pool (--concurrency, default2) — since each run is mostly an idle review-window sleep, overlapping the two agents roughly halves wall-clock; same-agent attempts stay serialized so two sessions of one account never record at once (#116). - Spawned shells now default
PROMPT_EOL_MARK=(empty) in the session environment, suppressing the inverse-video%end-of-partial-line marker thatzshprints when output lacks a trailing newline.agent-ttystrips a hidden completion-marker postamble after eachrun, which desynced the rendered cursor and left that%in snapshots, screenshots, and recordings; the new default keeps captures clean. The marker is zsh-only and inert in other shells. Opt back in per session withagent-tty create --env PROMPT_EOL_MARK='%B%S%#%s%b' -- <shell>to restore zsh's styled default (a lone'%'expands to nothing), or pass any explicit--env PROMPT_EOL_MARK=...value. The default is applied at PTY spawn time and is not written to the manifest, soinspect,list, andcreate --jsonenv maps are unchanged (#114). inspectcollects renderer state and the session snapshot in a single synchronous tick before awaiting, so concurrent RPC handlers cannot interleave a mutated renderer state with a stale session snapshot (#104).
Fixed
- Wide characters (CJK/emoji) no longer misalign per-cell snapshot rendering. The
libghostty-vtbackend'smapNativeCellspacked one array entry per native cell record and discarded the nativecol/width, so a width-2 glyph became a single entry with no spacer for its trailing column — shifting every cell after it one column left and offsetting the cursor-cell highlight in the Session Dashboard (which pinslibghostty-vt). Cells are now column-indexed: each row places records at their true column and emits an empty spacer for a wide glyph's trailing column, matching theghostty-webbackend sosnapshot --include-cellsand the dashboard Live View stay aligned past wide glyphs.visibleLinestext was already correct (#118, closes #112). - Restored the empty
## [Unreleased]heading onmainafter the v0.2.0 release-prep commit so theUpdate Unreleased Changelogworkflow stops failing on every push.docs/RELEASE-PROCESS.mdnow documents the rename-and-insert rule that keeps both[Unreleased]and[v<version>]headings present after a release cut (#103).
Install from npm once the trusted publish job for this workflow completes:
npm install -g "agent-tty@0.3.0"
agent-tty version --jsonIf you need a registry-independent fallback, install the verified tarball asset from this release directly:
VERSION=0.3.0
RELEASE_TAG=v0.3.0
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.3.0/agent-tty-0.3.0.tgz
npm install -g "$TARBALL_URL"
agent-tty version --jsonFor private releases or environments that require authenticated downloads, fetch the asset first and then install locally:
gh release download "v0.3.0" --repo "coder/agent-tty" --pattern "agent-tty-0.3.0.tgz"
npm install -g "./agent-tty-0.3.0.tgz"
agent-tty version --jsonSHA-256 checksum: 3db1110ec263a945865889f6cb3c6a9a339123c63fbe151cb6a510a8aef845dc (see agent-tty-0.3.0.tgz.sha256 for the portable checksum file).
This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.
v0.2.0: First stable release
Added
- New non-rendered
run_completeevent in the canonical event log carrying{ marker, inputRunSeq }, so automation consumers can correlateinput_runwith completion without scanning rendered output (#55, tracking #21). release:prepandrelease:finalizenpm scripts plus a pinnedrelease-itconfig that update version files, create a singlerelease/<version>commit, and tagv${version}from a clean, syncedmainwithout publishing or creating GitHub Releases (#72).- "Agent Demo" section in the README and an evergreen
dogfood/agent-uses-agent-tty/bundle that records Codex and Claude TUIs drivingnvim --cleanthrough agent-tty, with outer/inner WebMs, asciicasts, transcripts, thumbnails, and areproduce.shscript (#54). dogfood/issue-21-run-completion-clean/verification bundle proving snapshots, screenshots, asciicasts, WebM, and theoutputevent stream contain no completion-marker bytes while the publicrunenvelope still exposesmarker,completed, anddurationMs(#55).- AFK Triage maintainer flow under
.sandcastle/that fans out Claude Code triage agents acrossneeds-triageand activeneeds-infoGitHub issues, each in its own per-issue Coder workspace ondev.coder.com, governed bydocs/adr/0004-afk-triage-apply-policy.mdand the AFK comment marker policy (#86, #89).
Changed
run --waitno longer leaks its internal completion marker into rendered artifacts. Completion is signaled via an APC sentinel consumed by the host PTY ingestion path beforeoutputevents are appended, with a defensive scrub for any echoedprintfpostamble. Waits resolve on the newrun_completeevent instead of polling rendered snapshots for marker text. The publicrunJSON envelope is unchanged (#55, tracking #21).- Asciicast export now explicitly skips non-rendered events (
input_text,input_paste,input_keys,input_run,run_complete,signal,exit) so recordings only containo,r, andmframes (#55). wait --text/--regex/--screen-stable-ms/--cursor-row/--cursor-colvalidation is centralized in a shared render-wait matcher used by both live host polling and CLI offline replay fallback. Invalid, unsafe (nested-quantifier), or out-of-range patterns are rejected locally withINVALID_INPUTbefore any RPC or offline replay snapshot work. PublicwaitJSON shapes and human output are unchanged (#76).- Renderer dispose now uses a per-lifecycle
ResourceScopefor deterministic LIFO release of page, browser context, browser, and local server. Publicdispose()remains best-effort and resolves successfully; individual cleanup failures are surfaced through the logger aswarnentries with{ name, error }instead of being silently swallowed. Concurrent artifact-manifest appends route through a genericKeyedSerializer<string>while preserving existing serialization semantics (#83). AbortSignalis now threaded through host-sidewait,waitForRender,runcompletion, lifecycle polling, andsendRpc, with timers, sockets, and listeners registered againstResourceScope. The RPC server also aborts the per-request context when a client socket closes, so abandoned RPC requests release host resources promptly. A bounded 1s liveness probe on the existing RPC socket avoids indefinite hangs during host startup when a stale socket neither accepts nor rejects a connection promptly. Public JSON envelopes and protocol schemas are unchanged (#94, fixes #84).- The supported Node range is now
>=24.0.0 <27and the project toolchain is pinned to Node 26.1.0. Playwright is bumped to1.60.0, which ships the upstream fix for the Node 26playwright install chromiumextraction hang (microsoft/playwright#40724) that previously forced a Node 26 revert in #91. CLI behavior and JSON contracts are unchanged (#98). - Local and CI dependency bootstrap now uses
aube:mise run bootstraprunsaube exec playwright install chromiumandmise run bootstrap-cirunsaube ci. Themise-pinnedaubewas bumped to1.10.4(migrating frompnpm/npmlockfiles toaube-lock.yaml), andpnpm.allowBuildspermits native builds for@coder/libghostty-vt-node,esbuild,fsevents,node-pty,@parcel/watcher, andmsgpackr-extract(#51, #57, #73, #91). - Internal session-status policy, event-log codec, snapshot capture, screenshot capture, command-target resolution, waited-run completion bookkeeping, and Zod result-validation parsing are centralized into shared modules. No CLI, protocol, JSON envelope, manifest entry, or
rendererBackendreporting changes (#67, #68, #69, #70, #75, #78, #93). - Repository tooling switched from ESLint / Prettier to Oxc:
npm run format/format:checknow invokeoxfmt, andnpm run lint/lint:fixinvokeoxlintplusoxlint-tsgolintfor type-aware checks. CI andmisetask names are unchanged (#71).
Fixed
- Default-location screenshot PNGs, snapshot JSON files, and
record exportartifacts are now rolled back when the subsequent artifact-manifest append fails, so a manifest-validation failure no longer leaves an orphaned, unmanifested file under the session'sartifacts/directory. Explicit--outpaths supplied by the caller are preserved on failure because they belong to the user, not the session manifest (#95, fixes #79). EventLog.opennow closes the underlying file handle when validation (size-limit check or existing-content parsing) fails, preventing a file-descriptor leak on rejected session host startup (#51).npm run release:prepandnpm run release:finalizenow work on aube-only checkouts wherepackage-lock.jsondoes not exist.readPackageVersions/assertPackageVersionsMatchskip the lockfile-coherence assertions whenpackage-lock.jsonis absent, andrelease-prep.mjsstages onlypackage.jsonin that case. The npm-lockfile path is still fully supported when apackage-lock.jsonis present (#101).
Install from npm once the trusted publish job for this workflow completes:
npm install -g "agent-tty@0.2.0"
agent-tty version --jsonIf you need a registry-independent fallback, install the verified tarball asset from this release directly:
VERSION=0.2.0
RELEASE_TAG=v0.2.0
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.2.0/agent-tty-0.2.0.tgz
npm install -g "$TARBALL_URL"
agent-tty version --jsonFor private releases or environments that require authenticated downloads, fetch the asset first and then install locally:
gh release download "v0.2.0" --repo "coder/agent-tty" --pattern "agent-tty-0.2.0.tgz"
npm install -g "./agent-tty-0.2.0.tgz"
agent-tty version --jsonSHA-256 checksum: 38d23f670a5159e983b46206c7f01a45188f8315094e4792738a3e9e5e548481 (see agent-tty-0.2.0.tgz.sha256 for the portable checksum file).
This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.
v0.1.1-beta.4: Selectable libghostty-vt renderer backend
This beta adds a selectable semantic renderer backend so snapshot, wait, and getVisibleText can run against either the existing ghostty-web Playwright pipeline or the new native libghostty-vt addon. PNG screenshots and WebM exports continue to use ghostty-web, and artifact metadata honestly reports the actual producer. The release also clarifies skill discovery in --help, declares an explicit Apache-2.0 license, and restructures the user-facing documentation.
Highlights
- New
--renderer <ghostty-web|libghostty-vt>flag (plusAGENT_TTY_RENDERERenv var anddefaultRendererconfig key) for per-command renderer selection. - Optional
@coder/libghostty-vt-nodenative addon, loaded lazily and only when explicitly selected. - Apache-2.0 license is now declared in the repo and in
package.jsonmetadata.
Added
-
Selectable libghostty-vt renderer backend (#42) by @ThomasK33. Adds
@coder/libghostty-vt-node@0.1.0-beta.0as anoptionalDependencyand wires a renderer registry through the host RPC, offline replay, and CLI commands.- Selection precedence: CLI flag → env var → config →
ghostty-web(default). - Unknown renderer names fail fast before any backend is constructed.
- Missing native addon produces an actionable error pointing at
--renderer ghostty-webas recovery. libghostty-vtis semantic-only in v1:screenshotandrecord export --format webmtransparently fall back toghostty-web, andrendererBackendin artifact metadata reports the actual producer (so a screenshot requested with--renderer libghostty-vtstill reportsghostty-web).
# Per-command selection agent-tty --renderer libghostty-vt snapshot <session-id> --json agent-tty --renderer libghostty-vt wait <session-id> --text "READY>" --json # Or as a default export AGENT_TTY_RENDERER=libghostty-vt
- Selection precedence: CLI flag → env var → config →
-
Skills-discoverability help footer (#38) by @ThomasK33. The top-level
--helpoutro now reads: "Coding agents: after loading the coreagent-ttyskill, runagent-tty skills listto discover other bundled skills andagent-tty skills get <name>to load one." -
Apache-2.0 LICENSE (#43) by @ThomasK33. The repository now ships an Apache-2.0
LICENSEfile at the root and declares"license": "Apache-2.0"inpackage.json, so consumers and automation can detect the package license from npm metadata.
Changed
- Documentation restructure (#41) by @ThomasK33. The root README is now a product-facing entry point (what agent-tty is, why it exists, quickstart, common usage, limitations, roadmap, license), with detailed material moved into focused docs for installation, usage, agent skills, and troubleshooting. As part of this pass, the
doctor --jsonhome-isolation diagnostic message was updated from the staleAgent-terminalname toagent-tty.
Notes
libghostty-vtis opt-in and its native addon is anoptionalDependency. Default users on any platform are unaffected and never load the native code.- PNG screenshots and WebM exports continue to require the
ghostty-web(Playwright) path even when--renderer libghostty-vtis selected.
Full Changelog: v0.1.1-beta.3...v0.1.1-beta.4
Install from npm once the trusted publish job for this workflow completes:
npm install -g "agent-tty@0.1.1-beta.4"
agent-tty version --jsonIf you need a registry-independent fallback, install the verified tarball asset from this release directly:
VERSION=0.1.1-beta.4
RELEASE_TAG=v0.1.1-beta.4
TARBALL_URL=https://github.com/coder/agent-tty/releases/download/v0.1.1-beta.4/agent-tty-0.1.1-beta.4.tgz
npm install -g "$TARBALL_URL"
agent-tty version --jsonFor private releases or environments that require authenticated downloads, fetch the asset first and then install locally:
gh release download "v0.1.1-beta.4" --repo "coder/agent-tty" --pattern "agent-tty-0.1.1-beta.4.tgz"
npm install -g "./agent-tty-0.1.1-beta.4.tgz"
agent-tty version --jsonSHA-256 checksum: d987cdf1b4bc6af0b97033eb23d229f37c08f36dc39bba9fe7ccec2f4bf99bf6 (see agent-tty-0.1.1-beta.4.tgz.sha256 for the portable checksum file).
This workflow prepares one verified tarball and reuses it across GitHub Release assets and npm publishing instead of rebuilding it.
v0.1.1-beta.3: agent-tty rename & runtime-served skills
This beta renames the public CLI to agent-tty across the board and replaces the singular bundled skill with a runtime-served multi-skill system. It also hardens several Darwin-specific runtime paths and fixes mux workspace bootstrap.
Highlights
- 📦 Public package, binary, env vars, and default home directory are now
agent-tty/AGENT_TTY_*/~/.agent-tty - 🧰 New
agent-tty skills list|get|pathCLI with a built-indogfood-tuiskill for TUI QA - 🍎 macOS session startup,
doctorcache checks, and PTY spawn are more robust - 🔧 Mux worktree workspaces no longer fail on
mise installbecause of untrusted configs
Added
-
Runtime-served multi-skill system (#28) by @ThomasK33. The CLI now serves canonical skills from a packaged
skill-data/directory whileskills/agent-tty/remains a thin TanStack-discoverable bootstrap that redirects agents to the CLI. A newdogfood-tuiskill ships alongside the coreagent-ttyskill for TUI QA/dogfooding discipline.agent-tty skills list [--json] # List all bundled skills agent-tty skills get <name> [--json] # Print a bundled skill's contents agent-tty skills path <name> [--json] # Print a bundled skill's directory
Changed
- Public CLI surface renamed to
agent-tty(#27) by @ThomasK33. This touches the npm package name, CLI binary, skill name, environment-variable prefix (AGENT_TTY_*), default home directory (~/.agent-tty), and all docs/release metadata. The repo is nowcoder/agent-tty. - Hardened Darwin runtime checks (#29) by @ThomasK33:
- RPC sockets are placed under a short hashed path in
/tmp/agent-ttyto avoid macOS Unix socket path-lengthEINVALerrors under long isolated temp homes. doctornow reuses the renderer's platform-aware Playwright browser-cache resolver, correctly reporting~/Library/Caches/ms-playwrighton macOS.runinjection writes executable shell input directly rather than relying on bracketed-paste control sequences, which could corrupt input in some bash configurations.
- RPC sockets are placed under a short hashed path in
Fixed
- Mux workspace hooks trust workspace-local
mise.toml(#26) by @ThomasK33. New worktrees under~/.mux/src/...no longer fail during.mux/initbecause the copiedmise.tomlis trusted beforemise install/mise run bootstrap, and.mux/tool_envtrusts the same config so bash commands that race ahead of the non-blocking init hook still work. - Darwin
node-ptyspawn-helper executable bit is now repaired at runtime before PTY spawn, resolving PTY startup failures on packaged macOS installs (#29).
Breaking Changes
- The singular
agent-tty skillcommand has been removed. Useagent-tty skills get agent-ttyinstead. - In skill result envelopes, the
sourcefield changed from'packaged-file'to'bundled', and results now include a newpathfield. - The npm package, CLI binary, env var prefix, and default home directory have all been renamed — see #27 for the full list.
v0.1.1-beta.0: Inaugural public beta of agent-terminal
This is the first public prerelease of agent-terminal — a terminal automation CLI for AI agents and humans. The release lands the complete v1 session/renderer/export pipeline and ships it as a verified GitHub Release tarball asset with a SHA-256 checksum.
Install from the verified tarball attached to this release instead of the npm registry or a git dependency build. The
.tgzand.tgz.sha256assets below are produced by the newprepare-releaseworkflow.
Highlights
- 🖥️ Full session control plane with per-session host, PTY, and append-only event log —
create,list,inspect,destroy,gc, plustype/paste/send-keys/resize/signal/run. - 🔍 Renderer-backed inspection: semantic
snapshot, deterministicscreenshot, and richwaitmodes (--text,--regex,--screen-stable-ms,--idle-ms,--exit). - 🎞️
record export --format asciicastand--format webmwith post-exit offline replay from persisted event logs. - 🤖 Public
agent-terminalskill with TanStack Intent integration and anagent-terminal skillcommand for just-in-time agent loading. - 📦 Verified GitHub Release tarball with checksum and packaging metadata, ready for private/prerelease installs.
Added
-
Session lifecycle and control plane (#3). Real per-session background host process with PTY ownership, validated Zod protocol schemas, RPC over a Unix domain socket, and an append-only JSONL event log. Ships
create,list,inspect,destroy,type,paste,send-keys,resize,signal, andwait --exit/--idle-ms. -
Renderer-backed inspection slice (#4). Lazy
ghostty-webrenderer boot with deterministic event-log replay, semanticsnapshot(structured and--format text), and renderer-backedwait --text/--regex/--screen-stable-ms.screenshotwith built-inreference-darkandreference-lightprofiles, plus artifact manifest plumbing and renderer smoke checks indoctor. -
Replay export and post-exit replay (#5).
record export --format asciicastand--format webmfor text and visual replay.snapshotandscreenshotnow fall back to offline replay from persisted event logs after a session exits, andgcsafely cleans up stale sessions with--dry-run/--stale-only/--older-than. The artifact manifest gainssha256, byte size, renderer profile, andrecording/videokinds. -
runcommand for in-session command execution (#14). New first-classagent-terminal run <session-id> [command]with--timeout,--no-wait,--file, and--json. Uses paste-mode injection with split-marker completion detection so multi-line setup scripts run reliably without fragile keystroke simulation. -
Doctor isolation diagnostics (#14).
doctor --jsonnow reportshome_isolationandbrowser_cache_accessible, and the renderer auto-resolvesPLAYWRIGHT_BROWSERS_PATHfrom the original hostHOMEso screenshots and WebM export work in isolated sessions out of the box. -
Capability reporting and contract locks (#9, #10, #12). Stable JSON envelope surface with introspection, proof-bundle validation, and renderer capability reporting.
-
Bundled Nerd Font fallback (#11) so glyph-heavy TUIs (LazyVim, etc.) render correctly in screenshots and WebM exports without a system font dependency.
-
Public
agent-terminalskill (#16). Distributable skill atskills/agent-terminal/SKILL.mdwith binary-first examples and a TanStack Intent keyword so agents can discover and activate it. Includes aprepublishOnlyverify guard and a build step that copies renderer assets intodist/. -
agent-terminal skillCLI command (#22). Prints the packaged skill markdown verbatim, or returns it inside the standard success envelope with--json. Top-level--helpnow steers coding agents to the preloaded-skill-or-fallback workflow.agent-terminal skill # Raw skill markdown agent-terminal skill --json # JSON envelope with skill content
-
Install smoke coverage and tarball install guidance (#19). New
pack:private,prepare, andsmoke:installscripts wired intonpm run verifyand CI, plus README and release-process documentation for the supported private/prerelease install paths. -
GitHub Release tarball workflow (#23). New
scripts/pack-release.mjsand.github/workflows/release.ymlwithprepare-releaseandpublish-github-releasejobs. Produces a verified.tgz, a SHA-256 checksum file, and machine-readable package metadata as GitHub Release assets, derived dynamically frompackage.jsonto stay package-name agnostic.
Changed
- Artifact manifest entries are richer and deterministic:
sha256, byte count, render profile, backend, capture dimensions, and — for exports — timing mode (#5). - Repository documentation reorganized and a new
AGENTS.mdcontributor guide landed (#6, #17).
Fixed
- Release workflow supports prerelease tags (#24). Version tests and tag validation now accept prerelease identifiers like
0.1.1-beta.0and0.1.1-rc.0, and the workflow fails fast if a release tag points to a commit that is not reachable from the default branch.
Install
Download the tarball asset attached to this release and install it locally:
npm install -g ./agent-terminal-0.1.1-beta.0.tgzVerify the download against the published SHA-256:
sha256sum -c agent-terminal-0.1.1-beta.0.tgz.sha256Npm publication is intentionally deferred; a future publish-npm job will reuse the same verified tarball produced by prepare-release.