- Default semantic actions (
wait,snapshot, screen hash, batch render-wait, host replay) now uselibghostty-vtwhen the optional native package is installed, with automaticghostty-webfallback otherwise. Visual artifacts (screenshot,record export --format webm) still default toghostty-web. Explicit--renderer,AGENT_TTY_RENDERER, andconfig.json.defaultRendereroverrides keep precedence. (#157) - The host now answers terminal capability queries on the live PTY: OSC 10 (foreground), OSC 11 (background), and DSR
ESC[5n(status). Eliminates the Neovim 0.12+E1568startup warning leaking into captures. Replies are written as child input and are not appended to the event log, so snapshots, screenshots, and recordings are unaffected. (#163) - Dashboard: pressing Enter in a maximized view now restores it, mirroring Esc. Footer hint updated to
esc/⏎ restore. (#153) - CLI exit-code contract documented in
docs/USAGE.md(full0–11mapping plusbatchfail-fast /--keep-goingsemantics), with a new top-of-README anchor nav and grouped command-surface table. (#150)
- Standalone
waitnow exits11(WAIT_TIMEOUT) on timeout while still emitting the existingok: trueenvelope withtimedOut: true/matched: false. Makes shell composition fail closed (agent-tty wait … && next-step). Closes #151. (#165) - Local-state hardening: the per-session RPC socket directory is now
0o700, the socket file0o600, and persisted state files (session manifests, Home Registry)0o600, regardless of umask. The Home and session directories are also locked to0o700andevents.jsonlto0o600, so the full terminal byte stream (which can contain secrets) is no longer world-readable. (#158, #161) - Snapshot/wait performance: dropped a redundant deep clone of the event log in the
libghostty-vtbackend and skipped per-event Zod re-validation on the trusted live-host replay path (seq ordering is still enforced). (#161) - Dependency audit gate:
aube audit --audit-level highnow runs in CI; transitiveesbuild,vite,ws, andbrace-expansionadvisories were cleared viapackage.jsonoverrides. (#158) - Pre-1.0 versioning:
feat:commits now bump the minor version (e.g.0.4.x → 0.5.0) instead of being flattened into patches. Breaking changes still bump minor;1.0.0remains an explicitRelease-As:decision. (#152)
- Dashboard redraws immediately on terminal/tmux pane resize. Previously, panes kept stale geometry for up to ~1.5s on idle sessions; now they track the new size on the first post-resize frame. Also removes a latent
NaN-width path on non-TTY stdout. (#162) - The standing release-please PR is now opened on
release-please--branches--main(the package-name component suffix is gone). (#147) - The README status-version badge is now wired into release-please
extra-filesand bumps with each release PR. (#156)
- README tagline mentions
agent-browseralongside Playwright. (#155) RELEASE.mdsupport contract reworded to be version-agnostic so release-please bumps no longer stale it. (#158)dogfood-tuiskill clarifies when to use live terminal evidence vs source/tests, and that text snapshots are not authoritative for CJK/emoji column-width questions. (#164)
- PR titles are validated as Conventional Commits via
amannn/action-semantic-pull-request, so the squash-merge subject that lands onmainalways parses cleanly for release-please. (#154)
- Dispatch the
release.ymlpipeline with--ref "$tag"so the run is attributed to the tag ref instead ofmain, restoring tag-pinned OIDC claims for npm trusted publishing and provenance (#145 by @ThomasK33).
- Releases are now driven by release-please with Communique authoring the changelog section. CHANGELOG headings for new releases drop the
vprefix (e.g.## [0.4.2] - ...); the historical## [v0.4.1]entry is left untouched. No CLI, JSON envelope, snapshot, recording, or export behavior changes (#143 by @ThomasK33).
agent-tty lsis now a short alias foragent-tty list. Like thed→dashboardalias, it is an explicit alias (not prefix matching), so it resolves unambiguously tolistand is unaffected by the other commands (#135).- Dashboard Live View can now be maximized: 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 mutatesfocus, soEscreturns to whatever was focused underneath. Panning (↑/↓ h/j/k/l) and thezOverview toggle keep working while maximized; the header, footer, and the same right edge are preserved across the toggle so the frame never shifts.Tab/H/aare inert in maximized mode so it reads as a distinct mode (#136).
record export --format webmnow defaults to--timing recorded, so exported videos play back at the recorded wall-clock pace instead of the previousaccelerateddefault that clamped every idle gap to 100ms and turned most interactive sessions into ~2s flash-by clips.acceleratedandmax-speedremain available as explicit opt-ins, andacceleratedhas been retuned for watchability: idle gaps now clamp to 400ms (was 100ms) and each frame holds at least 100ms (was 50ms). The CLI JSON envelope shape is unchanged — only the default value ofmetadata.timingModediffers when--timingis omitted (#139).
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).
- 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. gc never 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).
agent-tty dashboard: a read-only, interactive Session Dashboard that lists your sessions and shows a live view of the selected one — watch what your agents are doing in their shells, e.g. in a tmux split. The Live View is produced by Event Log Follow (file-tail ofevents.jsonl→libghostty-vtreplayTo/snapshot), so it reads the append-only Event Log as the source of truth and never queries the live host (ADR 0006). Master-detail UI with Tab-toggled focus (list select vs. Live View pan), 1:1 clip-top-left/letterbox plus a lossy block-glyph overview (z), an active/all scope toggle (a), and pin-on-exit (the watched session stays and freezes on its final screen with an exit badge). Requires the optionallibghostty-vtrenderer with no browser fallback, sodoctornow reports adashboardreadiness capability. Interactive-only (no--json; fails fast on a non-interactive terminal); machine-readable session listing remains vialist --json(#113, closes #109).inspect --jsonnow reportshost.cliVersion,host.rpcSocketPath,rendererRuntime.profile,rendererRuntime.booted,rendererRuntime.bootInFlight(live mode), andeventLogBytes(both 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.md(Session Dashboard, Live View, Event Log Follow) (#110).
- The README hero GIF (
assets/hero.tape) and thedogfood/agent-uses-agent-tty/Codex/Claude recordings now record inside a tmux two-pane split: the agent (or, in the hero, plainagent-ttyCLI calls) drives a session on the left whileagent-tty dashboardlive-mirrors it on the right — showing the dashboard reacting as sessions are created and modified. 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. The hero hides the tmux split plumbing and instead launches the dashboard on camera — typingagent-tty dashboardinto the right pane and hopping back with the tmux prefix — and its panes/session runbash --norcwith a minimal prompt so the live mirror stays free of personal shell-prompt clutter. It runs against this checkout's freshly-built CLI, sinceagent-tty dashboardis unreleased. A newmise run demo:herotask (whichdependsonbuild) regenerates the hero GIF, joiningmise run demo:agent-uses-agent-ttyfor the agent recordings.tmux(>= 3.1, pinned to3.6inmise) is now a recorder prerequisite alongsidevhs/ttyd/ffmpeg. The agent recordings now run concurrently via a bounded worker pool (--concurrency, default2) — each run is mostly an idle review-window sleep, so overlapping the two agents roughly halves wall-clock; raising the cap also overlaps an agent's own retry attempts at the cost of more CPU and shared-account load, while 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-tty strips a hidden completion-marker postamble after eachrun, which desynced the rendered cursor and left that%in snapshots, screenshots, and recordings; the 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).
- 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 to the 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).
- 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 pinnedrelease-itconfig for an opinionated release-prep workflow that updates package version files, creates a singlerelease/<version>commit, and tagsv${version}from a clean, syncedmainwithout ever 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 --cleanthroughagent-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-triage/ activeneeds-infoGitHub issues, each in its own per-issue Coder workspace ondev.coder.comwith a realcoder/agent-ttycheckout, governed bydocs/adr/0004-afk-triage-apply-policy.mdand the AFK comment marker policy (#86, #89).
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 now 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 instead of running to timeout. 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).
- 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. Without this fix, the documented release flow was broken after theaubemigration in #91.
protocolVersionin theversionenvelope intentionally stays at0.1.0. This release is additive over the0.1.xenvelope contract and does not change the public JSON shape; only the package version moves to0.2.0.
v0.1.1-beta.4 - 2026-04-25
- Selectable
libghostty-vtrenderer backend support with backend-selection plumbing for live commands, offline replay, screenshots, snapshots, waits, and WebM export, plus dogfood coverage for the fallback path (#42). - Skills eval authoring and reporting DX, including workspace presets, reporter lifecycle hooks, token usage snapshots, and stronger statistical guidance for measuring skill changes (#33, #35, #36, #37).
- Communique-powered release changelog and GitHub Release note automation, locked
misetooling, and GitHub Actions workflow linting withactionlintandzizmor(#32, #39). - Apache license and reorganized repository documentation for release, roadmap, design, dogfood, contributor, and maintainer workflows (#40, #41, #43).
- The package engine range now allows Node 25 in addition to Node 24 (#39).
- Development dependency maintenance updated PostCSS (#44).
agent-tty --helpnow points users atagent-tty skills listfor bundled skill discovery (#38).- Release workflows now authenticate protected branch fetches so private-repository release automation can read base/default branch refs (#45).
- Eval scoring, reporting, verifier calibration, and anti-pattern checks were hardened with additional unit coverage (#34, #36).
v0.1.1-beta.3 - 2026-04-24
- Multi-skill runtime system with new
agent-tty skills list|get|pathsubcommands, serving canonical skills from a packagedskill-data/directory, plus a new built-indogfood-tuiskill for TUI QA workflows (#28)
- Renamed the public CLI surface from
agent-terminaltoagent-tty: npm package, binary, skill name,AGENT_TTY_*environment variables, default home at~/.agent-tty, and the GitHub repo now live atcoder/agent-tty(#27) - RPC sockets now use a short hashed path under
/tmp/agent-ttyso isolated temp homes don't exceed macOS Unix socket path limits (#29) doctornow uses the shared Playwright browser-cache resolver, reporting the correct~/Library/Caches/ms-playwrightpath on macOS (#29)runnow writes executable shell input directly instead of using bracketed-paste control sequences (#29)
- Mux workspace hooks now trust the workspace-local
mise.tomlbefore runningmise install/bootstrap, preventing new worktree setups from failing (#26) - Darwin
node-ptyspawn-helperhas its executable bit repaired at runtime, fixing PTY spawn failures on packaged macOS installs (#29)
agent-tty skill(singular) has been removed — useagent-tty skills get agent-ttyinstead (#28)
v0.1.1-beta.0 - 2026-04-24
- Complete session control plane:
create,list,inspect,destroy,gc, with per-session background host, PTY lifecycle, and append-only event log (#3, #5). - Input commands:
type,paste,send-keys,resize,signal, and a first-classrunfor robust in-session command execution with completion detection (#3, #14). - Renderer-backed inspection: semantic
snapshot(structured and--format text), deterministicscreenshotwithreference-dark/reference-lightprofiles, andwait --text/--regex/--screen-stable-ms/--exit/--idle-ms(#4). record export --format asciicastand--format webmfor text and video replay artifacts, with post-exit offline replay ofsnapshot,screenshot, and exports from persisted event logs (#5).doctorhealth checks covering PTY spawn, home/socket/artifact writability, Playwright browser cache, home isolation, renderer/bundle assets, and capability reporting (#5, #12, #14).- Public
agent-terminalskill underskills/agent-terminal/SKILL.mdwith TanStack Intent integration, plus a top-levelagent-terminal skillcommand that emits the packaged skill markdown (raw or--json) for just-in-time agent loading (#16, #22). - Verified tarball install flow: new
pack:releasescript,smoke:installcoverage, and documented private/prerelease install guidance (#19). - GitHub Release workflow (
prepare-release+publish-github-release) that produces a validated.tgzwith SHA-256 checksum and metadata artifact, with prerelease tag support and an ancestry guard that requires tagged commits to be reachable from the default branch (#23, #24). - Bundled Nerd Font fallback so renderer-backed screenshots and WebM exports render glyph-heavy TUIs correctly out of the box (#11).
- Artifact manifest now records
sha256, byte size, render profile, andrecording/videokinds for reviewable, deterministic export artifacts (#5). - Renderer now resolves
PLAYWRIGHT_BROWSERS_PATHfrom the hostHOMEso screenshots and WebM export work in isolated sessions without manual env overrides (#14). - Repository documentation reorganized and an
AGENTS.mdcontributor guide added (#6, #17).
- Release workflow accepts prerelease versions like
0.1.1-beta.0/0.1.1-rc.0in version tests and tag validation (#24).