Skip to content

Releases: coder/agent-tty

v0.2.0: First stable release

13 May 11:24
28665dc

Choose a tag to compare

Added

  • New non-rendered run_complete event in the canonical event log carrying { marker, inputRunSeq }, so automation consumers can correlate input_run with completion without scanning rendered output (#55, tracking #21).
  • release:prep and release:finalize npm scripts plus a pinned release-it config that update version files, create a single release/<version> commit, and tag v${version} from a clean, synced main without 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 driving nvim --clean through agent-tty, with outer/inner WebMs, asciicasts, transcripts, thumbnails, and a reproduce.sh script (#54).
  • dogfood/issue-21-run-completion-clean/ verification bundle proving snapshots, screenshots, asciicasts, WebM, and the output event stream contain no completion-marker bytes while the public run envelope still exposes marker, completed, and durationMs (#55).
  • AFK Triage maintainer flow under .sandcastle/ that fans out Claude Code triage agents across needs-triage and active needs-info GitHub issues, each in its own per-issue Coder workspace on dev.coder.com, governed by docs/adr/0004-afk-triage-apply-policy.md and the AFK comment marker policy (#86, #89).

Changed

  • run --wait no longer leaks its internal completion marker into rendered artifacts. Completion is signaled via an APC sentinel consumed by the host PTY ingestion path before output events are appended, with a defensive scrub for any echoed printf postamble. Waits resolve on the new run_complete event instead of polling rendered snapshots for marker text. The public run JSON 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 contain o, r, and m frames (#55).
  • wait --text / --regex / --screen-stable-ms / --cursor-row / --cursor-col validation 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 with INVALID_INPUT before any RPC or offline replay snapshot work. Public wait JSON shapes and human output are unchanged (#76).
  • Renderer dispose now uses a per-lifecycle ResourceScope for deterministic LIFO release of page, browser context, browser, and local server. Public dispose() remains best-effort and resolves successfully; individual cleanup failures are surfaced through the logger as warn entries with { name, error } instead of being silently swallowed. Concurrent artifact-manifest appends route through a generic KeyedSerializer<string> while preserving existing serialization semantics (#83).
  • AbortSignal is now threaded through host-side wait, waitForRender, run completion, lifecycle polling, and sendRpc, with timers, sockets, and listeners registered against ResourceScope. 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 <27 and the project toolchain is pinned to Node 26.1.0. Playwright is bumped to 1.60.0, which ships the upstream fix for the Node 26 playwright install chromium extraction 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 bootstrap runs aube exec playwright install chromium and mise run bootstrap-ci runs aube ci. The mise-pinned aube was bumped to 1.10.4 (migrating from pnpm / npm lockfiles to aube-lock.yaml), and pnpm.allowBuilds permits native builds for @coder/libghostty-vt-node, esbuild, fsevents, node-pty, @parcel/watcher, and msgpackr-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 rendererBackend reporting changes (#67, #68, #69, #70, #75, #78, #93).
  • Repository tooling switched from ESLint / Prettier to Oxc: npm run format / format:check now invoke oxfmt, and npm run lint / lint:fix invoke oxlint plus oxlint-tsgolint for type-aware checks. CI and mise task names are unchanged (#71).

Fixed

  • Default-location screenshot PNGs, snapshot JSON files, and record export artifacts 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's artifacts/ directory. Explicit --out paths supplied by the caller are preserved on failure because they belong to the user, not the session manifest (#95, fixes #79).
  • EventLog.open now 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:prep and npm run release:finalize now work on aube-only checkouts where package-lock.json does not exist. readPackageVersions / assertPackageVersionsMatch skip the lockfile-coherence assertions when package-lock.json is absent, and release-prep.mjs stages only package.json in that case. The npm-lockfile path is still fully supported when a package-lock.json is 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 --json

If 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 --json

For 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 --json

SHA-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

25 Apr 09:29
704ae9d

Choose a tag to compare

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 (plus AGENT_TTY_RENDERER env var and defaultRenderer config key) for per-command renderer selection.
  • Optional @coder/libghostty-vt-node native addon, loaded lazily and only when explicitly selected.
  • Apache-2.0 license is now declared in the repo and in package.json metadata.

Added

  • Selectable libghostty-vt renderer backend (#42) by @ThomasK33. Adds @coder/libghostty-vt-node@0.1.0-beta.0 as an optionalDependency and 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-web as recovery.
    • libghostty-vt is semantic-only in v1: screenshot and record export --format webm transparently fall back to ghostty-web, and rendererBackend in artifact metadata reports the actual producer (so a screenshot requested with --renderer libghostty-vt still reports ghostty-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
  • Skills-discoverability help footer (#38) by @ThomasK33. The top-level --help outro now reads: "Coding agents: after loading the core agent-tty skill, run agent-tty skills list to discover other bundled skills and agent-tty skills get <name> to load one."

  • Apache-2.0 LICENSE (#43) by @ThomasK33. The repository now ships an Apache-2.0 LICENSE file at the root and declares "license": "Apache-2.0" in package.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 --json home-isolation diagnostic message was updated from the stale Agent-terminal name to agent-tty.

Notes

  • libghostty-vt is opt-in and its native addon is an optionalDependency. 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-vt is 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 --json

If 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 --json

For 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 --json

SHA-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

13 Apr 17:28
15bbcf1

Choose a tag to compare

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|path CLI with a built-in dogfood-tui skill for TUI QA
  • 🍎 macOS session startup, doctor cache checks, and PTY spawn are more robust
  • 🔧 Mux worktree workspaces no longer fail on mise install because of untrusted configs

Added

  • Runtime-served multi-skill system (#28) by @ThomasK33. The CLI now serves canonical skills from a packaged skill-data/ directory while skills/agent-tty/ remains a thin TanStack-discoverable bootstrap that redirects agents to the CLI. A new dogfood-tui skill ships alongside the core agent-tty skill 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 now coder/agent-tty.
  • Hardened Darwin runtime checks (#29) by @ThomasK33:
    • RPC sockets are placed under a short hashed path in /tmp/agent-tty to avoid macOS Unix socket path-length EINVAL errors under long isolated temp homes.
    • doctor now reuses the renderer's platform-aware Playwright browser-cache resolver, correctly reporting ~/Library/Caches/ms-playwright on macOS.
    • run injection writes executable shell input directly rather than relying on bracketed-paste control sequences, which could corrupt input in some bash configurations.

Fixed

  • Mux workspace hooks trust workspace-local mise.toml (#26) by @ThomasK33. New worktrees under ~/.mux/src/... no longer fail during .mux/init because the copied mise.toml is trusted before mise install/mise run bootstrap, and .mux/tool_env trusts the same config so bash commands that race ahead of the non-blocking init hook still work.
  • Darwin node-pty spawn-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 skill command has been removed. Use agent-tty skills get agent-tty instead.
  • In skill result envelopes, the source field changed from 'packaged-file' to 'bundled', and results now include a new path field.
  • 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

10 Apr 16:23
14609b9

Choose a tag to compare

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 .tgz and .tgz.sha256 assets below are produced by the new prepare-release workflow.

Highlights

  • 🖥️ Full session control plane with per-session host, PTY, and append-only event log — create, list, inspect, destroy, gc, plus type / paste / send-keys / resize / signal / run.
  • 🔍 Renderer-backed inspection: semantic snapshot, deterministic screenshot, and rich wait modes (--text, --regex, --screen-stable-ms, --idle-ms, --exit).
  • 🎞️ record export --format asciicast and --format webm with post-exit offline replay from persisted event logs.
  • 🤖 Public agent-terminal skill with TanStack Intent integration and an agent-terminal skill command 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, and wait --exit / --idle-ms.

  • Renderer-backed inspection slice (#4). Lazy ghostty-web renderer boot with deterministic event-log replay, semantic snapshot (structured and --format text), and renderer-backed wait --text / --regex / --screen-stable-ms. screenshot with built-in reference-dark and reference-light profiles, plus artifact manifest plumbing and renderer smoke checks in doctor.

  • Replay export and post-exit replay (#5). record export --format asciicast and --format webm for text and visual replay. snapshot and screenshot now fall back to offline replay from persisted event logs after a session exits, and gc safely cleans up stale sessions with --dry-run / --stale-only / --older-than. The artifact manifest gains sha256, byte size, renderer profile, and recording / video kinds.

  • run command for in-session command execution (#14). New first-class agent-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 --json now reports home_isolation and browser_cache_accessible, and the renderer auto-resolves PLAYWRIGHT_BROWSERS_PATH from the original host HOME so 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-terminal skill (#16). Distributable skill at skills/agent-terminal/SKILL.md with binary-first examples and a TanStack Intent keyword so agents can discover and activate it. Includes a prepublishOnly verify guard and a build step that copies renderer assets into dist/.

  • agent-terminal skill CLI command (#22). Prints the packaged skill markdown verbatim, or returns it inside the standard success envelope with --json. Top-level --help now 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, and smoke:install scripts wired into npm run verify and CI, plus README and release-process documentation for the supported private/prerelease install paths.

  • GitHub Release tarball workflow (#23). New scripts/pack-release.mjs and .github/workflows/release.yml with prepare-release and publish-github-release jobs. Produces a verified .tgz, a SHA-256 checksum file, and machine-readable package metadata as GitHub Release assets, derived dynamically from package.json to 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.md contributor 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.0 and 0.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.tgz

Verify the download against the published SHA-256:

sha256sum -c agent-terminal-0.1.1-beta.0.tgz.sha256

Npm publication is intentionally deferred; a future publish-npm job will reuse the same verified tarball produced by prepare-release.