Releases: coder/agent-tty
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.