Skip to content

Releases: coder/agent-tty

v0.4.3: Tag-attributed release pipeline dispatch

12 Jun 12:47
fc0680d

Choose a tag to compare

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 run attaches the workflow_dispatch event to the default branch, so the v0.4.2 release run was attributed to main rather than v0.4.2. With this change the run attaches to refs/tags/v<version> like the old push: tags flow, the Actions UI shows the tag, and the OIDC token claims behind npm trusted publishing and provenance reference the tag instead of whatever main's HEAD currently is.
    • No artifact-integrity impact for v0.4.2. release.yml resolves the tag from its input, checks out the tag explicitly, and validates the tag against package.json and main-ancestry before building, so the v0.4.2 run built the correct commit. This fix only affects run attribution and OIDC claims.

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

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

Install from npm once the trusted publish job for this workflow completes:

npm install -g "agent-tty@0.4.3"
agent-tty version --json

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

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

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

12 Jun 12:16
c5eca83

Choose a tag to compare

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, the release/* changelog workflow, and the local release:prep / release:finalize scripts are retired. A single standing chore(release): <version> PR is now maintained on every push to main; merging it tags v<version>, creates the GitHub Release, and dispatches the existing publish pipeline. Version selection follows Conventional Commits with bump-minor-pre-major + bump-patch-for-minor-pre-major to match the pre-1.0 cadence (breaking → minor, feat/fix → patch); Release-As: footers still override.
  • CHANGELOG headings drop the v prefix. 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 leading v would 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.md has been rewritten for the new flow.

Notes for maintainers

  • Requires the existing ANTHROPIC_API_KEY secret (or OPENAI_API_KEY + COMMUNIQUE_MODEL var) — same contract as the retired workflows.
  • Any leftover automation/update-unreleased-changelog PR 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 --json

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

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

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

12 Jun 08:52
ef331d2

Choose a tag to compare

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 ls alias for list (#135 by @ThomasK33). Mirrors the ddashboard alias from v0.4.0. Wired as an explicit Commander alias (not prefix matching), so it resolves unambiguously to list and is unaffected by other commands. agent-tty ls --help now reports Usage: agent-tty list|ls [options].
  • Dashboard Live View maximize (#136 by @ThomasK33). Press Enter from 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); Esc restores the split.
    • Maximize is a modal layer that never mutates focus, so Esc returns to whatever was focused underneath (list → list, pane → pane).
    • Panning (↑/↓ h/j/k/l) and the z Overview toggle keep working while maximized; the header and footer stay; Tab/H/a are 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.

Changed

  • WebM exports default to recorded wall-clock timing (#139 by @ThomasK33). record export --format webm now defaults to --timing recorded, so exports play back at the recorded pace instead of the previous accelerated default that clamped every idle gap to 100ms and rendered most interactive sessions as ~2s flash-by clips. accelerated and max-speed remain available as explicit opt-ins.

    • accelerated has 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.timingMode differs (recorded instead of accelerated) when --timing is 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; echo session, ~4s wall time):

    Export metadata.timingMode Video duration
    No flag (new default) recorded 7.20s — matches session wall time + 1s final hold
    --timing accelerated (new 400ms clamp) accelerated 4.00s
    --timing accelerated (old 100ms clamp) accelerated 2.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 --json

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

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

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

08 Jun 16:30
686776d

Choose a tag to compare

Added

  • agent-tty batch <session-id>: run an ordered sequence of input-and-wait steps against one session in a single invocation, supplied as a positional JSON array or --file. Each step is one verb (type, paste, sendKeys, run, or wait); every wait is 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-written run/wait/send-keys loop can (ADR 0007). Fail-fast by default with a non-zero exit and a per-step --json envelope; --keep-going attempts every step. SIGINT/SIGTERM flushes a partial envelope (in-flight step interrupted, later steps not-run). Adds a new WAIT_TIMEOUT error and exit code 11 for timed-out wait steps inside a batch (#126, closes #123).
  • Optional screenHash on snapshot and render-wait results (also on matched batch wait steps): a lowercase 64-char SHA-256 of the canonical visible-screen text (visibleLines[].text joined 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 offline matched:false fallback); absent only when no screen was observed (live timeout, consecutive-failure giveup, replay-error throw). Standalone wait adds an --after-seq flag, and type / paste results now return their Event Log seq so callers can anchor a following wait themselves (#127, closes #125).
  • agent-tty d is now a short alias for agent-tty dashboard. It is an explicit alias (not prefix matching), so it resolves unambiguously to the dashboard and never collides with the other d-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 on create and independent of AGENT_TTY_HOME. New agent-tty home list [--all] [--json] lists registered Homes — Active Homes by default, --all adds 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-only dashboard gains an additive Home picker (press H, Enter to 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 deleted mktemp -d Home never lingers in a listing (ADR 0008, #131, closes #130).

Changed

  • Both renderer backends (libghostty-vt and ghostty-web) now produce one canonical visible-screen form (exactly rows lines, 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 default ghostty-web stability/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.md is 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).
  • gc is now cross-Home by default (backward-incompatible): plain agent-tty gc sweeps 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-level homes[] of per-Home outcomes (removedSessions, skippedSessions, totalBytesFreed, existed, deregistered) plus aggregate removedSessionCount / totalBytesFreed / deregisteredHomes — replacing the former flat removedSessions / skippedSessions / totalBytesFreed. Pass --home <path> (or set AGENT_TTY_HOME) to scope collection to a single Home as before. gc never deletes a Home directory. Automation that relied on gc meaning the default Home, or on the old result shape, must pass --home and read homes[] (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 --json

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

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

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

03 Jun 18:23
a05d4e5

Choose a tag to compare

Added

  • agent-tty dashboard: a read-only, interactive Session Dashboard with a list of sessions and a live view of the selected one, sourced from events.jsonl via libghostty-vt replayTo/snapshot so it never queries the live host (ADR 0006). Tab toggles list vs. Live View focus, z switches to a block-glyph overview, a toggles active/all scope, and watched sessions pin-on-exit with a final-screen freeze and exit badge. Requires the optional libghostty-vt renderer (no ghostty-web fallback), so doctor now reports a dashboard readiness capability. Interactive-only — no --json, fails fast on non-interactive terminals; list --json remains the machine-readable path (#113, closes #109).
  • inspect --json now reports host.cliVersion, host.rpcSocketPath, rendererRuntime.profile, rendererRuntime.booted, rendererRuntime.bootInFlight (live mode), and eventLogBytes (live and offline replay). All fields are optional schema additions; existing consumers are unaffected (#104).
  • Canonical proof-bundle lock-down: a new CanonicalBundleManifestSchema requires sha256 and bytes on every artifact, npm run validate-bundle:canonical (also wired through mise run validate-bundles) runs eight drift-detection rules plus catalog parity across the four canonical bundles, and the linux-static CI 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 while agent-tty produces the inner Neovim proof artifacts. A new mise run demo:agent-uses-agent-tty task regenerates and promotes the demo with pinned vhs/ttyd/ffmpeg (#105).
  • Hero Demo video playback workflow: mise run demo:agent-uses-agent-tty:upload-assets prepares 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), and mise run demo:agent-uses-agent-tty:apply-video-urls rewrites the inline <video> srcs in the root and bundle READMEs and refreshes the manifest. Full guidance lives in dogfood/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. Adds assets/hero.{gif,tape} and a Playwright-rendered 1200×630 social card under assets/social-preview.* (#108).
  • Session Dashboard planning docs: ADR 0006 (Event Log Follow + libghostty-vt backend), docs/prd/session-dashboard/PRD.md, and new glossary terms in CONTEXT.md for 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 while agent-tty dashboard live-mirrors it on the right. Both panes share one AGENT_TTY_HOME so the dashboard auto-follows the newest session; the status bar is disabled so VHS's whole-screen Wait+Screen scrape stays unambiguous, and each run uses an isolated, reaped tmux server socket. Panes run bash --norc with a minimal prompt to keep the mirror free of personal shell clutter, and the hero launches the dashboard on camera (typing agent-tty dashboard into the right pane, hopping back with the tmux prefix). A new mise run demo:hero task (which depends on build) regenerates the hero GIF; tmux (>= 3.1, pinned to 3.6 in mise) joins vhs/ttyd/ffmpeg as a recorder prerequisite. Agent recordings now run via a bounded worker pool (--concurrency, default 2) — 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 that zsh prints when output lacks a trailing newline. agent-tty strips a hidden completion-marker postamble after each run, 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 with agent-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, so inspect, list, and create --json env maps are unchanged (#114).
  • inspect collects 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-vt backend's mapNativeCells packed one array entry per native cell record and discarded the native col/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 pins libghostty-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 the ghostty-web backend so snapshot --include-cells and the dashboard Live View stay aligned past wide glyphs. visibleLines text was already correct (#118, closes #112).
  • Restored the empty ## [Unreleased] heading on main after the v0.2.0 release-prep commit so the Update Unreleased Changelog workflow stops failing on every push. docs/RELEASE-PROCESS.md now 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 --json

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

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

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

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.