diff --git a/.github/workflows/validate-skills.yml b/.github/workflows/validate-skills.yml new file mode 100644 index 0000000..34227fc --- /dev/null +++ b/.github/workflows/validate-skills.yml @@ -0,0 +1,37 @@ +name: Validate skills + +on: + workflow_dispatch: + pull_request: + paths: + - 'skills/**' + - 'package.json' + - '.github/workflows/validate-skills.yml' + push: + branches: + - main + paths: + - 'skills/**' + - 'package.json' + - '.github/workflows/validate-skills.yml' + +concurrency: + group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + validate-skills: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Check out repository + uses: actions/checkout@v6 + + - name: Set up mise + uses: jdx/mise-action@v3 + + - name: Validate TanStack Intent skills + run: npx @tanstack/intent@latest validate diff --git a/AGENTS.md b/AGENTS.md index 28a7cef..9bfa1e7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -116,6 +116,9 @@ Development server: **none**. This is a CLI project, so iterative development us - **Do update coupled limits together.** `src/host/eventLog.ts` and `src/host/replay.ts` both enforce the 50 MB event-log limit. **Do not** change one without the other. - **Do add tests at the right layer.** Small parser/validation changes usually belong in `test/unit`; CLI wiring and temp-home behavior fit `test/integration`; renderer/artifact flows belong in `test/e2e`. +- **Do keep the public `skills/agent-terminal/` artifact binary-first.** The committed public skill and public-facing skill docs must use `agent-terminal ...`, not repo-local `npx`, `tsx`, or `src/cli/main.ts` invocations. When you execute those examples from this source tree, translate them locally to `npx tsx src/cli/main.ts ...`, but do not commit that substitution back into the public skill or README skill-install guidance. +- **Do teach the terminal workflow the public skill is supposed to reinforce.** Prefer `--home`, `--json`, `run`, `wait`, `snapshot`, `screenshot`, and `record export` when writing or maintaining public skill examples. **Do not** teach `tmux`, blind `sleep`, or out-of-band screenshots as the primary workflow. + ## Testing patterns - Unit tests often mock command dependencies and assert exact envelopes or manifest writes. diff --git a/README.md b/README.md index a100905..efce60c 100644 --- a/README.md +++ b/README.md @@ -3,18 +3,31 @@ `agent-terminal` is a Node/TypeScript CLI for launching, controlling, inspecting, and exporting reviewable terminal sessions. It is built for agent workflows that need both semantic state and visual artifacts from live or exited TUIs. -## Quick start +## Installation + +### Global installation ```bash -mise install -npm ci -npx playwright install chromium -npm run build +npm install -g agent-terminal +agent-terminal version --json +``` + +### Project installation + +```bash +npm install agent-terminal +./node_modules/.bin/agent-terminal version --json +``` + +## Quick start -SESSION_ID=$(node dist/cli/main.js create --json --name demo | jq -r '.result.sessionId') -node dist/cli/main.js run "$SESSION_ID" 'echo hello from agent-terminal' -node dist/cli/main.js inspect "$SESSION_ID" --json -node dist/cli/main.js destroy "$SESSION_ID" +```bash +AGENT_HOME="$(mktemp -d)" +agent-terminal --home "$AGENT_HOME" doctor --json +SESSION_ID=$(agent-terminal --home "$AGENT_HOME" create --json --name demo -- /bin/bash | jq -r '.result.sessionId') +agent-terminal --home "$AGENT_HOME" run "$SESSION_ID" 'echo hello from agent-terminal' --json +agent-terminal --home "$AGENT_HOME" snapshot "$SESSION_ID" --format text --json +agent-terminal --home "$AGENT_HOME" destroy "$SESSION_ID" --json ``` ## Feature highlights @@ -53,6 +66,67 @@ Recommended sequence: 3. Use `wait` for render-visible readiness conditions. 4. Capture screenshots for point-in-time review. 5. Export WebM recordings when reviewers need motion proof. +6. Destroy the session when done. + +## AI agent skill + +The public skill lives under `skills/agent-terminal/` and ships in the npm package. +You can install it directly for Mux-style skill loaders, or let TanStack Intent discover and map it for compatible coding agents. + +### TanStack Intent integration + +If your agent supports Intent-compatible skill mappings, install `agent-terminal` in the project and let Intent wire the mapping into `AGENTS.md`, `CLAUDE.md`, or another supported agent config file. + +```bash +npm install agent-terminal +npx @tanstack/intent@latest list +npx @tanstack/intent@latest install +``` + +That workflow keeps the skill version aligned with the installed `agent-terminal` package and avoids writing one-off instructions for each individual coding agent. + +### Mux skill installation + +```bash +npm install -g agent-terminal + +mkdir -p ~/.mux/skills/agent-terminal +cp -R "$(npm root -g)/agent-terminal/skills/agent-terminal/." ~/.mux/skills/agent-terminal/ +``` + +### Direct skill copy for other skill loaders + +```bash +npm install -g agent-terminal + +mkdir -p ~/.claude/skills/agent-terminal +cp -R "$(npm root -g)/agent-terminal/skills/agent-terminal/." ~/.claude/skills/agent-terminal/ +``` + +If your assistant supports repository-backed skills, point it at `coder/agent-terminal` and select the `agent-terminal` skill directory. + +### Suggested `AGENTS.md` / `CLAUDE.md` snippet + +```markdown +## Terminal Automation + +Use `agent-terminal` for terminal and TUI automation instead of `tmux`, ad hoc PTY wrappers, or external screenshot tools. + +Preferred workflow: + +1. Create an isolated home and session with `agent-terminal --home "$AGENT_HOME" create --json -- /bin/bash`. +2. Use `agent-terminal run` for setup and bootstrap commands. +3. Use `agent-terminal wait` for observable readiness instead of blind sleeps. +4. Use `agent-terminal snapshot` to inspect the current terminal state. +5. Use `agent-terminal screenshot` or `agent-terminal record export` for reviewer-facing artifacts. +6. Destroy the session when the task is done. +``` + +Maintainers can validate the shipped skill locally with: + +```bash +npm run intent:validate +``` ## Isolation diff --git a/dogfood/20260327-public-skill/agent-terminal-0.1.0.tgz b/dogfood/20260327-public-skill/agent-terminal-0.1.0.tgz new file mode 100644 index 0000000..9397375 Binary files /dev/null and b/dogfood/20260327-public-skill/agent-terminal-0.1.0.tgz differ diff --git a/dogfood/20260327-public-skill/create.json b/dogfood/20260327-public-skill/create.json new file mode 100644 index 0000000..debc8c9 --- /dev/null +++ b/dogfood/20260327-public-skill/create.json @@ -0,0 +1,12 @@ +{ + "ok": true, + "command": "create", + "timestamp": "2026-03-27T17:01:28.898Z", + "result": { + "sessionId": "01KMR3WRXSP97ZBVWXN0YQ3VG2", + "createdAt": "2026-03-27T17:01:28.378Z", + "cols": 80, + "rows": 24, + "shell": "/bin/bash" + } +} diff --git a/dogfood/20260327-public-skill/destroy.json b/dogfood/20260327-public-skill/destroy.json new file mode 100644 index 0000000..dd16c5c --- /dev/null +++ b/dogfood/20260327-public-skill/destroy.json @@ -0,0 +1,9 @@ +{ + "ok": true, + "command": "destroy", + "timestamp": "2026-03-27T17:01:34.791Z", + "result": { + "sessionId": "01KMR3WRXSP97ZBVWXN0YQ3VG2", + "destroyed": true + } +} diff --git a/dogfood/20260327-public-skill/doctor.json b/dogfood/20260327-public-skill/doctor.json new file mode 100644 index 0000000..f9a6e18 --- /dev/null +++ b/dogfood/20260327-public-skill/doctor.json @@ -0,0 +1,130 @@ +{ + "ok": true, + "command": "doctor", + "timestamp": "2026-03-27T17:01:27.838Z", + "result": { + "ok": true, + "checks": { + "environment": [ + { + "name": "node-runtime", + "status": "pass", + "message": "Node 24.14.0 ok", + "durationMs": 0 + }, + { + "name": "cwd-access", + "status": "pass", + "message": "cwd read/write: /home/coder/.mux/src/agent-terminal/agent-terminal-ejrg", + "durationMs": 0 + }, + { + "name": "temp-dir", + "status": "pass", + "message": "temp dir ok: /tmp", + "durationMs": 1 + }, + { + "name": "home_isolation", + "status": "pass", + "message": "Agent-terminal home is isolated from system home: /tmp/tmp.JSj3HFOAzD", + "durationMs": 0 + }, + { + "name": "home-writable", + "status": "pass", + "message": "home writable: /tmp/tmp.JSj3HFOAzD", + "durationMs": 1 + }, + { + "name": "pty-spawn", + "status": "pass", + "message": "spawned /home/coder/.npm/_npx/387698761821791d/node_modules/node/bin/node", + "durationMs": 29 + }, + { + "name": "socket-viable", + "status": "pass", + "message": "socket ok: /tmp/tmp.JSj3HFOAzD/sessions/doctor-785178-mn95esfe-2/host.sock", + "durationMs": 4 + }, + { + "name": "artifact-atomicity", + "status": "pass", + "message": "atomic rename ok: /tmp/tmp.JSj3HFOAzD/sessions/doctor-785178-mn95esfi-3/artifacts", + "durationMs": 2 + }, + { + "name": "event-log-writable", + "status": "pass", + "message": "append ok: /tmp/tmp.JSj3HFOAzD/sessions/doctor-785178-mn95esfk-5/events.jsonl", + "durationMs": 1 + } + ], + "renderer": [ + { + "name": "playwright_available", + "status": "pass", + "message": "available", + "durationMs": 0 + }, + { + "name": "browser_cache_accessible", + "status": "pass", + "message": "browser cache accessible: /home/coder/.cache/ms-playwright", + "durationMs": 1 + }, + { + "name": "browser_launch", + "status": "pass", + "message": "chromium launches", + "durationMs": 130 + }, + { + "name": "ghostty_web_available", + "status": "pass", + "message": "WASM available", + "durationMs": 10 + }, + { + "name": "screenshot_viable", + "status": "pass", + "message": "viable", + "durationMs": 159 + } + ] + }, + "capabilities": [ + { + "name": "snapshot", + "status": "available", + "reason": "built-in capability", + "detail": "available without external renderer dependencies" + }, + { + "name": "wait", + "status": "available", + "reason": "built-in capability", + "detail": "available without external renderer dependencies" + }, + { + "name": "screenshot", + "status": "available", + "reason": "renderer smoke checks passed", + "detail": "playwright_available: available; browser_launch: chromium launches; ghostty_web_available: WASM available; screenshot_viable: viable" + }, + { + "name": "record-export-asciicast", + "status": "available", + "reason": "built-in capability", + "detail": "available without external renderer dependencies" + }, + { + "name": "record-export-webm", + "status": "available", + "reason": "browser-backed export dependencies available", + "detail": "playwright_available: available; browser_launch: chromium launches; ghostty_web_available: WASM available" + } + ] + } +} diff --git a/dogfood/20260327-public-skill/installed-skill/SKILL.md b/dogfood/20260327-public-skill/installed-skill/SKILL.md new file mode 100644 index 0000000..bbb5a0f --- /dev/null +++ b/dogfood/20260327-public-skill/installed-skill/SKILL.md @@ -0,0 +1,101 @@ +--- +name: agent-terminal +description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate an interactive CLI or TUI, wait for terminal output, capture a TUI screenshot, export a terminal recording, or test a CLI workflow with reviewable artifacts. +advertise: true +--- + +# Terminal Automation with agent-terminal + +Install the CLI with `npm install -g agent-terminal`, then use `agent-terminal` directly. +Prefer isolated homes, JSON envelopes, and renderer-backed artifacts so terminal workflows stay reviewable and reproducible. + +## Core Workflow + +Every terminal or TUI automation task should follow this pattern: + +1. **Create an isolated home** with `--home`. +2. **Check prerequisites** with `doctor --json` before screenshot or recording work. +3. **Create a session** with `create --json`. +4. **Run setup commands** with `run` instead of simulating long shell typing. +5. **Wait on observable terminal state** with `wait` instead of blind sleeps. +6. **Inspect the current screen** with `snapshot`. +7. **Capture proof artifacts** with `screenshot` or `record export`. +8. **Destroy the session** when finished. + +```bash +AGENT_HOME="$(mktemp -d)" +agent-terminal --home "$AGENT_HOME" doctor --json +SESSION_ID=$(agent-terminal --home "$AGENT_HOME" create --json -- /bin/bash | jq -r '.result.sessionId') +agent-terminal --home "$AGENT_HOME" run "$SESSION_ID" 'printf "ready\n"' +agent-terminal --home "$AGENT_HOME" wait "$SESSION_ID" --text 'ready' --json +agent-terminal --home "$AGENT_HOME" snapshot "$SESSION_ID" --format text --json +agent-terminal --home "$AGENT_HOME" screenshot "$SESSION_ID" --json +agent-terminal --home "$AGENT_HOME" record export "$SESSION_ID" --format webm --json +agent-terminal --home "$AGENT_HOME" destroy "$SESSION_ID" --json +``` + +## Essential Commands + +```bash +# Environment and lifecycle +agent-terminal --home doctor --json +agent-terminal --home create --json -- /bin/bash +agent-terminal --home inspect --json +agent-terminal --home destroy --json + +# In-session control +agent-terminal --home run 'command here' --json +agent-terminal --home type 'literal text' --json +agent-terminal --home paste 'multiline payload' --json +agent-terminal --home send-keys Enter Ctrl+C --json + +# Observation and proof +agent-terminal --home wait --text 'ready' --json +agent-terminal --home wait --screen-stable-ms 1000 --json +agent-terminal --home snapshot --format text --json +agent-terminal --home screenshot --json +agent-terminal --home record export --format webm --json +``` + +## Common Patterns + +### Bootstrap a shell session + +```bash +AGENT_HOME="$(mktemp -d)" +SESSION_ID=$(agent-terminal --home "$AGENT_HOME" create --json -- /bin/bash | jq -r '.result.sessionId') +agent-terminal --home "$AGENT_HOME" run "$SESSION_ID" 'pwd && ls -la' --json +agent-terminal --home "$AGENT_HOME" snapshot "$SESSION_ID" --format text --json +``` + +### Drive an interactive CLI or TUI + +```bash +AGENT_HOME="$(mktemp -d)" +SESSION_ID=$(agent-terminal --home "$AGENT_HOME" create --json -- /bin/bash | jq -r '.result.sessionId') +agent-terminal --home "$AGENT_HOME" run "$SESSION_ID" '' --no-wait --json +agent-terminal --home "$AGENT_HOME" wait "$SESSION_ID" --screen-stable-ms 1000 --json +agent-terminal --home "$AGENT_HOME" send-keys "$SESSION_ID" Down Down Enter --json +agent-terminal --home "$AGENT_HOME" screenshot "$SESSION_ID" --json +``` + +### Export reviewer-facing artifacts + +```bash +AGENT_HOME="$(mktemp -d)" +SESSION_ID=$(agent-terminal --home "$AGENT_HOME" create --json -- /bin/bash | jq -r '.result.sessionId') +agent-terminal --home "$AGENT_HOME" run "$SESSION_ID" 'printf "artifact proof\n"' --json +agent-terminal --home "$AGENT_HOME" wait "$SESSION_ID" --text 'artifact proof' --json +agent-terminal --home "$AGENT_HOME" screenshot "$SESSION_ID" --json +agent-terminal --home "$AGENT_HOME" record export "$SESSION_ID" --format asciicast --json +agent-terminal --home "$AGENT_HOME" record export "$SESSION_ID" --format webm --json +``` + +## Anti-Patterns + +- **Do not reach for `tmux`, `screen`, or ad hoc PTY wrappers first** when `agent-terminal` can provide an isolated, inspectable session. +- **Do not rely on blind `sleep` calls** when `wait --text`, `wait --idle-ms`, or `wait --screen-stable-ms` can observe terminal readiness directly. +- **Do not bypass `--json`** when another tool or agent needs machine-readable results. +- **Do not use external screenshot tools as the primary proof path** when `agent-terminal screenshot` and `agent-terminal record export` can produce renderer-backed artifacts tied to the session timeline. +- **Do not leave sessions running after the task ends**; destroy them explicitly. +- **Do not rewrite public examples into repo-local development invocations**; the public workflow should stay `agent-terminal ...`. diff --git a/dogfood/20260327-public-skill/notes.md b/dogfood/20260327-public-skill/notes.md new file mode 100644 index 0000000..ad57f63 --- /dev/null +++ b/dogfood/20260327-public-skill/notes.md @@ -0,0 +1,19 @@ +# Public skill packaging smoke + +- Node: v24.14.0 +- npm: 10.9.3 +- Tarball: agent-terminal-0.1.0.tgz +- Installed prefix: /tmp/tmp.tgxMDfYxl6 +- Isolated home: /tmp/tmp.JSj3HFOAzD +- Smoke token: public-skill smoke +- Installed skill copy: /home/coder/.mux/src/agent-terminal/agent-terminal-ejrg/dogfood/20260327-public-skill/installed-skill/SKILL.md +- Screenshot proof: /home/coder/.mux/src/agent-terminal/agent-terminal-ejrg/dogfood/20260327-public-skill/packaged-smoke.png +- WebM proof: /home/coder/.mux/src/agent-terminal/agent-terminal-ejrg/dogfood/20260327-public-skill/packaged-smoke.webm +- Asciicast proof: /home/coder/.mux/src/agent-terminal/agent-terminal-ejrg/dogfood/20260327-public-skill/packaged-smoke.cast + +Commands executed: + +1. npm pack --json --dry-run +2. npm pack --json +3. npm install -g --prefix ./ +4. agent-terminal --home doctor/create/run/wait/snapshot/screenshot/record export/destroy diff --git a/dogfood/20260327-public-skill/npm-pack-dry-run.json b/dogfood/20260327-public-skill/npm-pack-dry-run.json new file mode 100644 index 0000000..6d822e8 --- /dev/null +++ b/dogfood/20260327-public-skill/npm-pack-dry-run.json @@ -0,0 +1,1366 @@ +[ + { + "id": "agent-terminal@0.1.0", + "name": "agent-terminal", + "version": "0.1.0", + "size": 1768969, + "unpackedSize": 3524005, + "shasum": "2445cbeb1b8a32140ef9956a12b7ff4e2899190a", + "integrity": "sha512-efTD1PCD26vrkdMG3XvXxKXng++oYxw2YjlGSEdRm04lHRx5m2axnJ3n7phRJQY3TaOqy1aJFzmDk+i5FFQAAw==", + "filename": "agent-terminal-0.1.0.tgz", + "files": [ + { + "path": "README.md", + "size": 9473, + "mode": 384 + }, + { + "path": "dist/cli/commands/create.d.ts", + "size": 646, + "mode": 384 + }, + { + "path": "dist/cli/commands/create.d.ts.map", + "size": 804, + "mode": 384 + }, + { + "path": "dist/cli/commands/create.js", + "size": 6337, + "mode": 384 + }, + { + "path": "dist/cli/commands/create.js.map", + "size": 5514, + "mode": 384 + }, + { + "path": "dist/cli/commands/destroy.d.ts", + "size": 222, + "mode": 384 + }, + { + "path": "dist/cli/commands/destroy.d.ts.map", + "size": 295, + "mode": 384 + }, + { + "path": "dist/cli/commands/destroy.js", + "size": 499, + "mode": 384 + }, + { + "path": "dist/cli/commands/destroy.js.map", + "size": 558, + "mode": 384 + }, + { + "path": "dist/cli/commands/doctor.d.ts", + "size": 2864, + "mode": 384 + }, + { + "path": "dist/cli/commands/doctor.d.ts.map", + "size": 2606, + "mode": 384 + }, + { + "path": "dist/cli/commands/doctor.js", + "size": 21496, + "mode": 384 + }, + { + "path": "dist/cli/commands/doctor.js.map", + "size": 19752, + "mode": 384 + }, + { + "path": "dist/cli/commands/gc.d.ts", + "size": 1370, + "mode": 384 + }, + { + "path": "dist/cli/commands/gc.d.ts.map", + "size": 1464, + "mode": 384 + }, + { + "path": "dist/cli/commands/gc.js", + "size": 11141, + "mode": 384 + }, + { + "path": "dist/cli/commands/gc.js.map", + "size": 9620, + "mode": 384 + }, + { + "path": "dist/cli/commands/inputSource.d.ts", + "size": 360, + "mode": 384 + }, + { + "path": "dist/cli/commands/inputSource.d.ts.map", + "size": 384, + "mode": 384 + }, + { + "path": "dist/cli/commands/inputSource.js", + "size": 4844, + "mode": 384 + }, + { + "path": "dist/cli/commands/inputSource.js.map", + "size": 4199, + "mode": 384 + }, + { + "path": "dist/cli/commands/inspect.d.ts", + "size": 284, + "mode": 384 + }, + { + "path": "dist/cli/commands/inspect.d.ts.map", + "size": 344, + "mode": 384 + }, + { + "path": "dist/cli/commands/inspect.js", + "size": 6953, + "mode": 384 + }, + { + "path": "dist/cli/commands/inspect.js.map", + "size": 6299, + "mode": 384 + }, + { + "path": "dist/cli/commands/list.d.ts", + "size": 400, + "mode": 384 + }, + { + "path": "dist/cli/commands/list.d.ts.map", + "size": 437, + "mode": 384 + }, + { + "path": "dist/cli/commands/list.js", + "size": 523, + "mode": 384 + }, + { + "path": "dist/cli/commands/list.js.map", + "size": 666, + "mode": 384 + }, + { + "path": "dist/cli/commands/mark.d.ts", + "size": 348, + "mode": 384 + }, + { + "path": "dist/cli/commands/mark.d.ts.map", + "size": 401, + "mode": 384 + }, + { + "path": "dist/cli/commands/mark.js", + "size": 2249, + "mode": 384 + }, + { + "path": "dist/cli/commands/mark.js.map", + "size": 1982, + "mode": 384 + }, + { + "path": "dist/cli/commands/paste.d.ts", + "size": 388, + "mode": 384 + }, + { + "path": "dist/cli/commands/paste.d.ts.map", + "size": 468, + "mode": 384 + }, + { + "path": "dist/cli/commands/paste.js", + "size": 2241, + "mode": 384 + }, + { + "path": "dist/cli/commands/paste.js.map", + "size": 1927, + "mode": 384 + }, + { + "path": "dist/cli/commands/record-export.d.ts", + "size": 377, + "mode": 384 + }, + { + "path": "dist/cli/commands/record-export.d.ts.map", + "size": 479, + "mode": 384 + }, + { + "path": "dist/cli/commands/record-export.js", + "size": 12960, + "mode": 384 + }, + { + "path": "dist/cli/commands/record-export.js.map", + "size": 9891, + "mode": 384 + }, + { + "path": "dist/cli/commands/resize.d.ts", + "size": 388, + "mode": 384 + }, + { + "path": "dist/cli/commands/resize.d.ts.map", + "size": 465, + "mode": 384 + }, + { + "path": "dist/cli/commands/resize.js", + "size": 2401, + "mode": 384 + }, + { + "path": "dist/cli/commands/resize.js.map", + "size": 2122, + "mode": 384 + }, + { + "path": "dist/cli/commands/run.d.ts", + "size": 365, + "mode": 384 + }, + { + "path": "dist/cli/commands/run.d.ts.map", + "size": 448, + "mode": 384 + }, + { + "path": "dist/cli/commands/run.js", + "size": 3624, + "mode": 384 + }, + { + "path": "dist/cli/commands/run.js.map", + "size": 3231, + "mode": 384 + }, + { + "path": "dist/cli/commands/screenshot.d.ts", + "size": 338, + "mode": 384 + }, + { + "path": "dist/cli/commands/screenshot.d.ts.map", + "size": 412, + "mode": 384 + }, + { + "path": "dist/cli/commands/screenshot.js", + "size": 8439, + "mode": 384 + }, + { + "path": "dist/cli/commands/screenshot.js.map", + "size": 6884, + "mode": 384 + }, + { + "path": "dist/cli/commands/send-keys.d.ts", + "size": 362, + "mode": 384 + }, + { + "path": "dist/cli/commands/send-keys.d.ts.map", + "size": 420, + "mode": 384 + }, + { + "path": "dist/cli/commands/send-keys.js", + "size": 2483, + "mode": 384 + }, + { + "path": "dist/cli/commands/send-keys.js.map", + "size": 2160, + "mode": 384 + }, + { + "path": "dist/cli/commands/signal.d.ts", + "size": 380, + "mode": 384 + }, + { + "path": "dist/cli/commands/signal.d.ts.map", + "size": 443, + "mode": 384 + }, + { + "path": "dist/cli/commands/signal.js", + "size": 2333, + "mode": 384 + }, + { + "path": "dist/cli/commands/signal.js.map", + "size": 2012, + "mode": 384 + }, + { + "path": "dist/cli/commands/snapshot.d.ts", + "size": 368, + "mode": 384 + }, + { + "path": "dist/cli/commands/snapshot.d.ts.map", + "size": 441, + "mode": 384 + }, + { + "path": "dist/cli/commands/snapshot.js", + "size": 8746, + "mode": 384 + }, + { + "path": "dist/cli/commands/snapshot.js.map", + "size": 7554, + "mode": 384 + }, + { + "path": "dist/cli/commands/type.d.ts", + "size": 414, + "mode": 384 + }, + { + "path": "dist/cli/commands/type.d.ts.map", + "size": 497, + "mode": 384 + }, + { + "path": "dist/cli/commands/type.js", + "size": 2329, + "mode": 384 + }, + { + "path": "dist/cli/commands/type.js.map", + "size": 2024, + "mode": 384 + }, + { + "path": "dist/cli/commands/version.d.ts", + "size": 729, + "mode": 384 + }, + { + "path": "dist/cli/commands/version.d.ts.map", + "size": 761, + "mode": 384 + }, + { + "path": "dist/cli/commands/version.js", + "size": 2346, + "mode": 384 + }, + { + "path": "dist/cli/commands/version.js.map", + "size": 2077, + "mode": 384 + }, + { + "path": "dist/cli/commands/wait.d.ts", + "size": 540, + "mode": 384 + }, + { + "path": "dist/cli/commands/wait.d.ts.map", + "size": 613, + "mode": 384 + }, + { + "path": "dist/cli/commands/wait.js", + "size": 12009, + "mode": 384 + }, + { + "path": "dist/cli/commands/wait.js.map", + "size": 10091, + "mode": 384 + }, + { + "path": "dist/cli/context.d.ts", + "size": 1151, + "mode": 384 + }, + { + "path": "dist/cli/context.d.ts.map", + "size": 1179, + "mode": 384 + }, + { + "path": "dist/cli/context.js", + "size": 3625, + "mode": 384 + }, + { + "path": "dist/cli/context.js.map", + "size": 3263, + "mode": 384 + }, + { + "path": "dist/cli/errors.d.ts", + "size": 355, + "mode": 384 + }, + { + "path": "dist/cli/errors.d.ts.map", + "size": 449, + "mode": 384 + }, + { + "path": "dist/cli/errors.js", + "size": 370, + "mode": 384 + }, + { + "path": "dist/cli/errors.js.map", + "size": 494, + "mode": 384 + }, + { + "path": "dist/cli/exitCodes.d.ts", + "size": 103, + "mode": 384 + }, + { + "path": "dist/cli/exitCodes.d.ts.map", + "size": 174, + "mode": 384 + }, + { + "path": "dist/cli/exitCodes.js", + "size": 973, + "mode": 384 + }, + { + "path": "dist/cli/exitCodes.js.map", + "size": 1108, + "mode": 384 + }, + { + "path": "dist/cli/main.d.ts", + "size": 65, + "mode": 384 + }, + { + "path": "dist/cli/main.d.ts.map", + "size": 109, + "mode": 384 + }, + { + "path": "dist/cli/main.js", + "size": 18019, + "mode": 384 + }, + { + "path": "dist/cli/main.js.map", + "size": 14572, + "mode": 384 + }, + { + "path": "dist/cli/output.d.ts", + "size": 616, + "mode": 384 + }, + { + "path": "dist/cli/output.d.ts.map", + "size": 664, + "mode": 384 + }, + { + "path": "dist/cli/output.js", + "size": 1293, + "mode": 384 + }, + { + "path": "dist/cli/output.js.map", + "size": 1417, + "mode": 384 + }, + { + "path": "dist/config/defaults.d.ts", + "size": 487, + "mode": 384 + }, + { + "path": "dist/config/defaults.d.ts.map", + "size": 429, + "mode": 384 + }, + { + "path": "dist/config/defaults.js", + "size": 483, + "mode": 384 + }, + { + "path": "dist/config/defaults.js.map", + "size": 558, + "mode": 384 + }, + { + "path": "dist/config/resolveConfig.d.ts", + "size": 1036, + "mode": 384 + }, + { + "path": "dist/config/resolveConfig.d.ts.map", + "size": 698, + "mode": 384 + }, + { + "path": "dist/config/resolveConfig.js", + "size": 2613, + "mode": 384 + }, + { + "path": "dist/config/resolveConfig.js.map", + "size": 2788, + "mode": 384 + }, + { + "path": "dist/export/asciicast.d.ts", + "size": 710, + "mode": 384 + }, + { + "path": "dist/export/asciicast.d.ts.map", + "size": 787, + "mode": 384 + }, + { + "path": "dist/export/asciicast.js", + "size": 3590, + "mode": 384 + }, + { + "path": "dist/export/asciicast.js.map", + "size": 3262, + "mode": 384 + }, + { + "path": "dist/export/webm.d.ts", + "size": 1122, + "mode": 384 + }, + { + "path": "dist/export/webm.d.ts.map", + "size": 1073, + "mode": 384 + }, + { + "path": "dist/export/webm.js", + "size": 5696, + "mode": 384 + }, + { + "path": "dist/export/webm.js.map", + "size": 5122, + "mode": 384 + }, + { + "path": "dist/host/eventLog.d.ts", + "size": 2899, + "mode": 384 + }, + { + "path": "dist/host/eventLog.d.ts.map", + "size": 2164, + "mode": 384 + }, + { + "path": "dist/host/eventLog.js", + "size": 10623, + "mode": 384 + }, + { + "path": "dist/host/eventLog.js.map", + "size": 9860, + "mode": 384 + }, + { + "path": "dist/host/hostMain.d.ts", + "size": 680, + "mode": 384 + }, + { + "path": "dist/host/hostMain.d.ts.map", + "size": 411, + "mode": 384 + }, + { + "path": "dist/host/hostMain.js", + "size": 42048, + "mode": 384 + }, + { + "path": "dist/host/hostMain.js.map", + "size": 31769, + "mode": 384 + }, + { + "path": "dist/host/lifecycle.d.ts", + "size": 1105, + "mode": 384 + }, + { + "path": "dist/host/lifecycle.d.ts.map", + "size": 1272, + "mode": 384 + }, + { + "path": "dist/host/lifecycle.js", + "size": 16626, + "mode": 384 + }, + { + "path": "dist/host/lifecycle.js.map", + "size": 15418, + "mode": 384 + }, + { + "path": "dist/host/renderer.d.ts", + "size": 1124, + "mode": 384 + }, + { + "path": "dist/host/renderer.d.ts.map", + "size": 980, + "mode": 384 + }, + { + "path": "dist/host/renderer.js", + "size": 5911, + "mode": 384 + }, + { + "path": "dist/host/renderer.js.map", + "size": 5082, + "mode": 384 + }, + { + "path": "dist/host/replay.d.ts", + "size": 450, + "mode": 384 + }, + { + "path": "dist/host/replay.d.ts.map", + "size": 468, + "mode": 384 + }, + { + "path": "dist/host/replay.js", + "size": 3887, + "mode": 384 + }, + { + "path": "dist/host/replay.js.map", + "size": 3723, + "mode": 384 + }, + { + "path": "dist/host/rpcClient.d.ts", + "size": 180, + "mode": 384 + }, + { + "path": "dist/host/rpcClient.d.ts.map", + "size": 288, + "mode": 384 + }, + { + "path": "dist/host/rpcClient.js", + "size": 7860, + "mode": 384 + }, + { + "path": "dist/host/rpcClient.js.map", + "size": 6159, + "mode": 384 + }, + { + "path": "dist/host/rpcServer.d.ts", + "size": 513, + "mode": 384 + }, + { + "path": "dist/host/rpcServer.d.ts.map", + "size": 559, + "mode": 384 + }, + { + "path": "dist/host/rpcServer.js", + "size": 9355, + "mode": 384 + }, + { + "path": "dist/host/rpcServer.js.map", + "size": 8933, + "mode": 384 + }, + { + "path": "dist/host/sessionState.d.ts", + "size": 659, + "mode": 384 + }, + { + "path": "dist/host/sessionState.d.ts.map", + "size": 678, + "mode": 384 + }, + { + "path": "dist/host/sessionState.js", + "size": 4175, + "mode": 384 + }, + { + "path": "dist/host/sessionState.js.map", + "size": 3577, + "mode": 384 + }, + { + "path": "dist/index.d.ts", + "size": 745, + "mode": 384 + }, + { + "path": "dist/index.d.ts.map", + "size": 603, + "mode": 384 + }, + { + "path": "dist/index.js", + "size": 44, + "mode": 384 + }, + { + "path": "dist/index.js.map", + "size": 102, + "mode": 384 + }, + { + "path": "dist/protocol/envelope.d.ts", + "size": 754, + "mode": 384 + }, + { + "path": "dist/protocol/envelope.d.ts.map", + "size": 806, + "mode": 384 + }, + { + "path": "dist/protocol/envelope.js", + "size": 383, + "mode": 384 + }, + { + "path": "dist/protocol/envelope.js.map", + "size": 440, + "mode": 384 + }, + { + "path": "dist/protocol/errors.d.ts", + "size": 1506, + "mode": 384 + }, + { + "path": "dist/protocol/errors.d.ts.map", + "size": 616, + "mode": 384 + }, + { + "path": "dist/protocol/errors.js", + "size": 2751, + "mode": 384 + }, + { + "path": "dist/protocol/errors.js.map", + "size": 2115, + "mode": 384 + }, + { + "path": "dist/protocol/messages.d.ts", + "size": 20763, + "mode": 384 + }, + { + "path": "dist/protocol/messages.d.ts.map", + "size": 4751, + "mode": 384 + }, + { + "path": "dist/protocol/messages.js", + "size": 6897, + "mode": 384 + }, + { + "path": "dist/protocol/messages.js.map", + "size": 7119, + "mode": 384 + }, + { + "path": "dist/protocol/schemas.d.ts", + "size": 15897, + "mode": 384 + }, + { + "path": "dist/protocol/schemas.d.ts.map", + "size": 3902, + "mode": 384 + }, + { + "path": "dist/protocol/schemas.js", + "size": 10742, + "mode": 384 + }, + { + "path": "dist/protocol/schemas.js.map", + "size": 10562, + "mode": 384 + }, + { + "path": "dist/protocol/terminationCategory.d.ts", + "size": 254, + "mode": 384 + }, + { + "path": "dist/protocol/terminationCategory.d.ts.map", + "size": 297, + "mode": 384 + }, + { + "path": "dist/protocol/terminationCategory.js", + "size": 1060, + "mode": 384 + }, + { + "path": "dist/protocol/terminationCategory.js.map", + "size": 827, + "mode": 384 + }, + { + "path": "dist/pty/createPty.d.ts", + "size": 298, + "mode": 384 + }, + { + "path": "dist/pty/createPty.d.ts.map", + "size": 426, + "mode": 384 + }, + { + "path": "dist/pty/createPty.js", + "size": 1086, + "mode": 384 + }, + { + "path": "dist/pty/createPty.js.map", + "size": 1175, + "mode": 384 + }, + { + "path": "dist/pty/keyEncoder.d.ts", + "size": 100, + "mode": 384 + }, + { + "path": "dist/pty/keyEncoder.d.ts.map", + "size": 175, + "mode": 384 + }, + { + "path": "dist/pty/keyEncoder.js", + "size": 6648, + "mode": 384 + }, + { + "path": "dist/pty/keyEncoder.js.map", + "size": 6721, + "mode": 384 + }, + { + "path": "dist/pty/pasteEncoder.d.ts", + "size": 101, + "mode": 384 + }, + { + "path": "dist/pty/pasteEncoder.d.ts.map", + "size": 177, + "mode": 384 + }, + { + "path": "dist/pty/pasteEncoder.js", + "size": 301, + "mode": 384 + }, + { + "path": "dist/pty/pasteEncoder.js.map", + "size": 358, + "mode": 384 + }, + { + "path": "dist/renderer/backend.d.ts", + "size": 2120, + "mode": 384 + }, + { + "path": "dist/renderer/backend.d.ts.map", + "size": 1629, + "mode": 384 + }, + { + "path": "dist/renderer/backend.js", + "size": 46, + "mode": 384 + }, + { + "path": "dist/renderer/backend.js.map", + "size": 118, + "mode": 384 + }, + { + "path": "dist/renderer/browserPath.d.ts", + "size": 1394, + "mode": 384 + }, + { + "path": "dist/renderer/browserPath.d.ts.map", + "size": 583, + "mode": 384 + }, + { + "path": "dist/renderer/browserPath.js", + "size": 2997, + "mode": 384 + }, + { + "path": "dist/renderer/browserPath.js.map", + "size": 2117, + "mode": 384 + }, + { + "path": "dist/renderer/bundledFont.d.ts", + "size": 1253, + "mode": 384 + }, + { + "path": "dist/renderer/bundledFont.d.ts.map", + "size": 900, + "mode": 384 + }, + { + "path": "dist/renderer/bundledFont.js", + "size": 3412, + "mode": 384 + }, + { + "path": "dist/renderer/bundledFont.js.map", + "size": 2700, + "mode": 384 + }, + { + "path": "dist/renderer/capabilities.d.ts", + "size": 2962, + "mode": 384 + }, + { + "path": "dist/renderer/capabilities.d.ts.map", + "size": 1401, + "mode": 384 + }, + { + "path": "dist/renderer/capabilities.js", + "size": 10072, + "mode": 384 + }, + { + "path": "dist/renderer/capabilities.js.map", + "size": 7611, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/assets/FONT-LICENSE.txt", + "size": 398, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/assets/JetBrainsMono-Regular-latin.woff2", + "size": 21168, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/assets/SymbolsNerdFontMono-Regular.ttf", + "size": 2507556, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/backend.d.ts", + "size": 2108, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/backend.d.ts.map", + "size": 1797, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/backend.js", + "size": 73829, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/backend.js.map", + "size": 40446, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/index.d.ts", + "size": 85, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/index.d.ts.map", + "size": 171, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/index.js", + "size": 83, + "mode": 384 + }, + { + "path": "dist/renderer/ghosttyWeb/index.js.map", + "size": 169, + "mode": 384 + }, + { + "path": "dist/renderer/index.d.ts", + "size": 714, + "mode": 384 + }, + { + "path": "dist/renderer/index.d.ts.map", + "size": 607, + "mode": 384 + }, + { + "path": "dist/renderer/index.js", + "size": 438, + "mode": 384 + }, + { + "path": "dist/renderer/index.js.map", + "size": 401, + "mode": 384 + }, + { + "path": "dist/renderer/profiles.d.ts", + "size": 567, + "mode": 384 + }, + { + "path": "dist/renderer/profiles.d.ts.map", + "size": 434, + "mode": 384 + }, + { + "path": "dist/renderer/profiles.js", + "size": 6091, + "mode": 384 + }, + { + "path": "dist/renderer/profiles.js.map", + "size": 5051, + "mode": 384 + }, + { + "path": "dist/renderer/types.d.ts", + "size": 8390, + "mode": 384 + }, + { + "path": "dist/renderer/types.d.ts.map", + "size": 1335, + "mode": 384 + }, + { + "path": "dist/renderer/types.js", + "size": 7545, + "mode": 384 + }, + { + "path": "dist/renderer/types.js.map", + "size": 7452, + "mode": 384 + }, + { + "path": "dist/replay/offlineReplay.d.ts", + "size": 742, + "mode": 384 + }, + { + "path": "dist/replay/offlineReplay.d.ts.map", + "size": 755, + "mode": 384 + }, + { + "path": "dist/replay/offlineReplay.js", + "size": 3757, + "mode": 384 + }, + { + "path": "dist/replay/offlineReplay.js.map", + "size": 3303, + "mode": 384 + }, + { + "path": "dist/storage/artifactHealth.d.ts", + "size": 213, + "mode": 384 + }, + { + "path": "dist/storage/artifactHealth.d.ts.map", + "size": 259, + "mode": 384 + }, + { + "path": "dist/storage/artifactHealth.js", + "size": 2852, + "mode": 384 + }, + { + "path": "dist/storage/artifactHealth.js.map", + "size": 2517, + "mode": 384 + }, + { + "path": "dist/storage/artifactManifest.d.ts", + "size": 1797, + "mode": 384 + }, + { + "path": "dist/storage/artifactManifest.d.ts.map", + "size": 768, + "mode": 384 + }, + { + "path": "dist/storage/artifactManifest.js", + "size": 5955, + "mode": 384 + }, + { + "path": "dist/storage/artifactManifest.js.map", + "size": 5090, + "mode": 384 + }, + { + "path": "dist/storage/artifactPaths.d.ts", + "size": 549, + "mode": 384 + }, + { + "path": "dist/storage/artifactPaths.d.ts.map", + "size": 583, + "mode": 384 + }, + { + "path": "dist/storage/artifactPaths.js", + "size": 3418, + "mode": 384 + }, + { + "path": "dist/storage/artifactPaths.js.map", + "size": 3114, + "mode": 384 + }, + { + "path": "dist/storage/home.d.ts", + "size": 206, + "mode": 384 + }, + { + "path": "dist/storage/home.d.ts.map", + "size": 232, + "mode": 384 + }, + { + "path": "dist/storage/home.js", + "size": 1380, + "mode": 384 + }, + { + "path": "dist/storage/home.js.map", + "size": 1379, + "mode": 384 + }, + { + "path": "dist/storage/manifests.d.ts", + "size": 1239, + "mode": 384 + }, + { + "path": "dist/storage/manifests.d.ts.map", + "size": 1280, + "mode": 384 + }, + { + "path": "dist/storage/manifests.js", + "size": 4240, + "mode": 384 + }, + { + "path": "dist/storage/manifests.js.map", + "size": 3962, + "mode": 384 + }, + { + "path": "dist/storage/sessionPaths.d.ts", + "size": 333, + "mode": 384 + }, + { + "path": "dist/storage/sessionPaths.d.ts.map", + "size": 368, + "mode": 384 + }, + { + "path": "dist/storage/sessionPaths.js", + "size": 1965, + "mode": 384 + }, + { + "path": "dist/storage/sessionPaths.js.map", + "size": 1795, + "mode": 384 + }, + { + "path": "dist/tools/index.d.ts", + "size": 213, + "mode": 384 + }, + { + "path": "dist/tools/index.d.ts.map", + "size": 145, + "mode": 384 + }, + { + "path": "dist/tools/index.js", + "size": 211, + "mode": 384 + }, + { + "path": "dist/tools/index.js.map", + "size": 143, + "mode": 384 + }, + { + "path": "dist/tools/review-bundle.d.ts", + "size": 3863, + "mode": 384 + }, + { + "path": "dist/tools/review-bundle.d.ts.map", + "size": 2210, + "mode": 384 + }, + { + "path": "dist/tools/review-bundle.js", + "size": 34347, + "mode": 384 + }, + { + "path": "dist/tools/review-bundle.js.map", + "size": 29580, + "mode": 384 + }, + { + "path": "dist/tools/validate-bundle.d.ts", + "size": 1021, + "mode": 384 + }, + { + "path": "dist/tools/validate-bundle.d.ts.map", + "size": 824, + "mode": 384 + }, + { + "path": "dist/tools/validate-bundle.js", + "size": 8286, + "mode": 384 + }, + { + "path": "dist/tools/validate-bundle.js.map", + "size": 7747, + "mode": 384 + }, + { + "path": "dist/util/assert.d.ts", + "size": 298, + "mode": 384 + }, + { + "path": "dist/util/assert.d.ts.map", + "size": 365, + "mode": 384 + }, + { + "path": "dist/util/assert.js", + "size": 361, + "mode": 384 + }, + { + "path": "dist/util/assert.js.map", + "size": 492, + "mode": 384 + }, + { + "path": "dist/util/logger.d.ts", + "size": 1168, + "mode": 384 + }, + { + "path": "dist/util/logger.d.ts.map", + "size": 1221, + "mode": 384 + }, + { + "path": "dist/util/logger.js", + "size": 2765, + "mode": 384 + }, + { + "path": "dist/util/logger.js.map", + "size": 3055, + "mode": 384 + }, + { + "path": "package.json", + "size": 1705, + "mode": 384 + }, + { + "path": "skills/agent-terminal/SKILL.md", + "size": 5079, + "mode": 384 + } + ], + "entryCount": 270, + "bundled": [] + } +] diff --git a/dogfood/20260327-public-skill/npm-pack-files.txt b/dogfood/20260327-public-skill/npm-pack-files.txt new file mode 100644 index 0000000..0abf87d --- /dev/null +++ b/dogfood/20260327-public-skill/npm-pack-files.txt @@ -0,0 +1,270 @@ +README.md +dist/cli/commands/create.d.ts +dist/cli/commands/create.d.ts.map +dist/cli/commands/create.js +dist/cli/commands/create.js.map +dist/cli/commands/destroy.d.ts +dist/cli/commands/destroy.d.ts.map +dist/cli/commands/destroy.js +dist/cli/commands/destroy.js.map +dist/cli/commands/doctor.d.ts +dist/cli/commands/doctor.d.ts.map +dist/cli/commands/doctor.js +dist/cli/commands/doctor.js.map +dist/cli/commands/gc.d.ts +dist/cli/commands/gc.d.ts.map +dist/cli/commands/gc.js +dist/cli/commands/gc.js.map +dist/cli/commands/inputSource.d.ts +dist/cli/commands/inputSource.d.ts.map +dist/cli/commands/inputSource.js +dist/cli/commands/inputSource.js.map +dist/cli/commands/inspect.d.ts +dist/cli/commands/inspect.d.ts.map +dist/cli/commands/inspect.js +dist/cli/commands/inspect.js.map +dist/cli/commands/list.d.ts +dist/cli/commands/list.d.ts.map +dist/cli/commands/list.js +dist/cli/commands/list.js.map +dist/cli/commands/mark.d.ts +dist/cli/commands/mark.d.ts.map +dist/cli/commands/mark.js +dist/cli/commands/mark.js.map +dist/cli/commands/paste.d.ts +dist/cli/commands/paste.d.ts.map +dist/cli/commands/paste.js +dist/cli/commands/paste.js.map +dist/cli/commands/record-export.d.ts +dist/cli/commands/record-export.d.ts.map +dist/cli/commands/record-export.js +dist/cli/commands/record-export.js.map +dist/cli/commands/resize.d.ts +dist/cli/commands/resize.d.ts.map +dist/cli/commands/resize.js +dist/cli/commands/resize.js.map +dist/cli/commands/run.d.ts +dist/cli/commands/run.d.ts.map +dist/cli/commands/run.js +dist/cli/commands/run.js.map +dist/cli/commands/screenshot.d.ts +dist/cli/commands/screenshot.d.ts.map +dist/cli/commands/screenshot.js +dist/cli/commands/screenshot.js.map +dist/cli/commands/send-keys.d.ts +dist/cli/commands/send-keys.d.ts.map +dist/cli/commands/send-keys.js +dist/cli/commands/send-keys.js.map +dist/cli/commands/signal.d.ts +dist/cli/commands/signal.d.ts.map +dist/cli/commands/signal.js +dist/cli/commands/signal.js.map +dist/cli/commands/snapshot.d.ts +dist/cli/commands/snapshot.d.ts.map +dist/cli/commands/snapshot.js +dist/cli/commands/snapshot.js.map +dist/cli/commands/type.d.ts +dist/cli/commands/type.d.ts.map +dist/cli/commands/type.js +dist/cli/commands/type.js.map +dist/cli/commands/version.d.ts +dist/cli/commands/version.d.ts.map +dist/cli/commands/version.js +dist/cli/commands/version.js.map +dist/cli/commands/wait.d.ts +dist/cli/commands/wait.d.ts.map +dist/cli/commands/wait.js +dist/cli/commands/wait.js.map +dist/cli/context.d.ts +dist/cli/context.d.ts.map +dist/cli/context.js +dist/cli/context.js.map +dist/cli/errors.d.ts +dist/cli/errors.d.ts.map +dist/cli/errors.js +dist/cli/errors.js.map +dist/cli/exitCodes.d.ts +dist/cli/exitCodes.d.ts.map +dist/cli/exitCodes.js +dist/cli/exitCodes.js.map +dist/cli/main.d.ts +dist/cli/main.d.ts.map +dist/cli/main.js +dist/cli/main.js.map +dist/cli/output.d.ts +dist/cli/output.d.ts.map +dist/cli/output.js +dist/cli/output.js.map +dist/config/defaults.d.ts +dist/config/defaults.d.ts.map +dist/config/defaults.js +dist/config/defaults.js.map +dist/config/resolveConfig.d.ts +dist/config/resolveConfig.d.ts.map +dist/config/resolveConfig.js +dist/config/resolveConfig.js.map +dist/export/asciicast.d.ts +dist/export/asciicast.d.ts.map +dist/export/asciicast.js +dist/export/asciicast.js.map +dist/export/webm.d.ts +dist/export/webm.d.ts.map +dist/export/webm.js +dist/export/webm.js.map +dist/host/eventLog.d.ts +dist/host/eventLog.d.ts.map +dist/host/eventLog.js +dist/host/eventLog.js.map +dist/host/hostMain.d.ts +dist/host/hostMain.d.ts.map +dist/host/hostMain.js +dist/host/hostMain.js.map +dist/host/lifecycle.d.ts +dist/host/lifecycle.d.ts.map +dist/host/lifecycle.js +dist/host/lifecycle.js.map +dist/host/renderer.d.ts +dist/host/renderer.d.ts.map +dist/host/renderer.js +dist/host/renderer.js.map +dist/host/replay.d.ts +dist/host/replay.d.ts.map +dist/host/replay.js +dist/host/replay.js.map +dist/host/rpcClient.d.ts +dist/host/rpcClient.d.ts.map +dist/host/rpcClient.js +dist/host/rpcClient.js.map +dist/host/rpcServer.d.ts +dist/host/rpcServer.d.ts.map +dist/host/rpcServer.js +dist/host/rpcServer.js.map +dist/host/sessionState.d.ts +dist/host/sessionState.d.ts.map +dist/host/sessionState.js +dist/host/sessionState.js.map +dist/index.d.ts +dist/index.d.ts.map +dist/index.js +dist/index.js.map +dist/protocol/envelope.d.ts +dist/protocol/envelope.d.ts.map +dist/protocol/envelope.js +dist/protocol/envelope.js.map +dist/protocol/errors.d.ts +dist/protocol/errors.d.ts.map +dist/protocol/errors.js +dist/protocol/errors.js.map +dist/protocol/messages.d.ts +dist/protocol/messages.d.ts.map +dist/protocol/messages.js +dist/protocol/messages.js.map +dist/protocol/schemas.d.ts +dist/protocol/schemas.d.ts.map +dist/protocol/schemas.js +dist/protocol/schemas.js.map +dist/protocol/terminationCategory.d.ts +dist/protocol/terminationCategory.d.ts.map +dist/protocol/terminationCategory.js +dist/protocol/terminationCategory.js.map +dist/pty/createPty.d.ts +dist/pty/createPty.d.ts.map +dist/pty/createPty.js +dist/pty/createPty.js.map +dist/pty/keyEncoder.d.ts +dist/pty/keyEncoder.d.ts.map +dist/pty/keyEncoder.js +dist/pty/keyEncoder.js.map +dist/pty/pasteEncoder.d.ts +dist/pty/pasteEncoder.d.ts.map +dist/pty/pasteEncoder.js +dist/pty/pasteEncoder.js.map +dist/renderer/backend.d.ts +dist/renderer/backend.d.ts.map +dist/renderer/backend.js +dist/renderer/backend.js.map +dist/renderer/browserPath.d.ts +dist/renderer/browserPath.d.ts.map +dist/renderer/browserPath.js +dist/renderer/browserPath.js.map +dist/renderer/bundledFont.d.ts +dist/renderer/bundledFont.d.ts.map +dist/renderer/bundledFont.js +dist/renderer/bundledFont.js.map +dist/renderer/capabilities.d.ts +dist/renderer/capabilities.d.ts.map +dist/renderer/capabilities.js +dist/renderer/capabilities.js.map +dist/renderer/ghosttyWeb/assets/FONT-LICENSE.txt +dist/renderer/ghosttyWeb/assets/JetBrainsMono-Regular-latin.woff2 +dist/renderer/ghosttyWeb/assets/SymbolsNerdFontMono-Regular.ttf +dist/renderer/ghosttyWeb/backend.d.ts +dist/renderer/ghosttyWeb/backend.d.ts.map +dist/renderer/ghosttyWeb/backend.js +dist/renderer/ghosttyWeb/backend.js.map +dist/renderer/ghosttyWeb/index.d.ts +dist/renderer/ghosttyWeb/index.d.ts.map +dist/renderer/ghosttyWeb/index.js +dist/renderer/ghosttyWeb/index.js.map +dist/renderer/index.d.ts +dist/renderer/index.d.ts.map +dist/renderer/index.js +dist/renderer/index.js.map +dist/renderer/profiles.d.ts +dist/renderer/profiles.d.ts.map +dist/renderer/profiles.js +dist/renderer/profiles.js.map +dist/renderer/types.d.ts +dist/renderer/types.d.ts.map +dist/renderer/types.js +dist/renderer/types.js.map +dist/replay/offlineReplay.d.ts +dist/replay/offlineReplay.d.ts.map +dist/replay/offlineReplay.js +dist/replay/offlineReplay.js.map +dist/storage/artifactHealth.d.ts +dist/storage/artifactHealth.d.ts.map +dist/storage/artifactHealth.js +dist/storage/artifactHealth.js.map +dist/storage/artifactManifest.d.ts +dist/storage/artifactManifest.d.ts.map +dist/storage/artifactManifest.js +dist/storage/artifactManifest.js.map +dist/storage/artifactPaths.d.ts +dist/storage/artifactPaths.d.ts.map +dist/storage/artifactPaths.js +dist/storage/artifactPaths.js.map +dist/storage/home.d.ts +dist/storage/home.d.ts.map +dist/storage/home.js +dist/storage/home.js.map +dist/storage/manifests.d.ts +dist/storage/manifests.d.ts.map +dist/storage/manifests.js +dist/storage/manifests.js.map +dist/storage/sessionPaths.d.ts +dist/storage/sessionPaths.d.ts.map +dist/storage/sessionPaths.js +dist/storage/sessionPaths.js.map +dist/tools/index.d.ts +dist/tools/index.d.ts.map +dist/tools/index.js +dist/tools/index.js.map +dist/tools/review-bundle.d.ts +dist/tools/review-bundle.d.ts.map +dist/tools/review-bundle.js +dist/tools/review-bundle.js.map +dist/tools/validate-bundle.d.ts +dist/tools/validate-bundle.d.ts.map +dist/tools/validate-bundle.js +dist/tools/validate-bundle.js.map +dist/util/assert.d.ts +dist/util/assert.d.ts.map +dist/util/assert.js +dist/util/assert.js.map +dist/util/logger.d.ts +dist/util/logger.d.ts.map +dist/util/logger.js +dist/util/logger.js.map +package.json +skills/agent-terminal/SKILL.md diff --git a/dogfood/20260327-public-skill/packaged-smoke.cast b/dogfood/20260327-public-skill/packaged-smoke.cast new file mode 100644 index 0000000..91061db --- /dev/null +++ b/dogfood/20260327-public-skill/packaged-smoke.cast @@ -0,0 +1,6 @@ +{"version":2,"width":80,"height":24,"timestamp":1774630888,"title":"01KMR3WRXSP97ZBVWXN0YQ3VG2","sessionId":"01KMR3WRXSP97ZBVWXN0YQ3VG2","env":{"TERM":"xterm-256color"},"toolVersion":"0.1.0"} +[0,"o","bash: command not found: starship\r\n"] +[0.001,"o","bash: /home/linuxbrew/.linuxbrew/bin/brew: No such file or directory\r\n"] +[0.109,"o","\u001b[?2004h\u001b]0;coder@aaaaaaa: ~/.mux/src/agent-terminal/agent-terminal-ejrg\u0007\u001b[01;32mcoder@aaaaaaa\u001b[00m:\u001b[01;34m~/.mux/src/agent-terminal/agent-terminal-ejrg\u001b[00m$ "] +[0.375,"o","\u001b[7mprintf \"public-skil\u001b[27m\u001b[7ml\u001b[27m\r\u001b[7ml smoke\\n\"\u001b[27m\r\n\r\u001b[7mprintf '%s%s\\n' '__AT_MARKER_0019af22a43' '542748c91caa3b31cdc5e__'\u001b[27m\r\n\r\u001b[A\u001b[A\u001b[A\r\u001b]0;coder@aaaaaaa: ~/.mux/src/agent-terminal/agent-terminal-ejrg\u0007\u001b[01;32mcoder@aaaaaaa\u001b[00m:\u001b[01;34m~/.mux/src/agent-terminal/agent-terminal-ejrg\u001b[00m$ printf \"public-skill smoke\\n\"\r\n\rprintf '%s%s\\n' '__AT_MARKER_0019af22a43' '542748c91caa3b31cdc5e__'\r\n\r\u001b[A\r\n\u001b[?2004l\rpublic-skill smoke\r\n__AT_MARKER_0019af22a43542748c91caa3b31cdc5e__\r\n"] +[0.414,"o","\u001b[?2004h\u001b]0;coder@aaaaaaa: ~/.mux/src/agent-terminal/agent-terminal-ejrg\u0007\u001b[01;32mcoder@aaaaaaa\u001b[00m:\u001b[01;34m~/.mux/src/agent-terminal/agent-terminal-ejrg\u001b[00m$ \u001b[K"] diff --git a/dogfood/20260327-public-skill/packaged-smoke.png b/dogfood/20260327-public-skill/packaged-smoke.png new file mode 100644 index 0000000..ad5b53f Binary files /dev/null and b/dogfood/20260327-public-skill/packaged-smoke.png differ diff --git a/dogfood/20260327-public-skill/packaged-smoke.webm b/dogfood/20260327-public-skill/packaged-smoke.webm new file mode 100644 index 0000000..ae83665 Binary files /dev/null and b/dogfood/20260327-public-skill/packaged-smoke.webm differ diff --git a/dogfood/20260327-public-skill/record-asciicast.json b/dogfood/20260327-public-skill/record-asciicast.json new file mode 100644 index 0000000..39799b5 --- /dev/null +++ b/dogfood/20260327-public-skill/record-asciicast.json @@ -0,0 +1,23 @@ +{ + "ok": true, + "command": "record export", + "timestamp": "2026-03-27T17:01:34.278Z", + "result": { + "sessionId": "01KMR3WRXSP97ZBVWXN0YQ3VG2", + "format": "asciicast", + "artifactPath": "/home/coder/.mux/src/agent-terminal/agent-terminal-ejrg/dogfood/20260327-public-skill/packaged-smoke.cast", + "bytes": 1380, + "sha256": "cf072d6efc3a43982f0ff1b19a1fd383021343209228f48df35c946a4ff1dd7e", + "capturedAtSeq": 5, + "durationMs": 414, + "metadata": { + "width": 80, + "height": 24, + "title": "01KMR3WRXSP97ZBVWXN0YQ3VG2", + "timestamp": 1774630888, + "outputEventCount": 5, + "resizeEventCount": 0, + "markerCount": 0 + } + } +} diff --git a/dogfood/20260327-public-skill/record-webm.json b/dogfood/20260327-public-skill/record-webm.json new file mode 100644 index 0000000..55275c8 --- /dev/null +++ b/dogfood/20260327-public-skill/record-webm.json @@ -0,0 +1,23 @@ +{ + "ok": true, + "command": "record export", + "timestamp": "2026-03-27T17:01:33.848Z", + "result": { + "sessionId": "01KMR3WRXSP97ZBVWXN0YQ3VG2", + "format": "webm", + "artifactPath": "/home/coder/.mux/src/agent-terminal/agent-terminal-ejrg/dogfood/20260327-public-skill/packaged-smoke.webm", + "bytes": 48610, + "sha256": "9e9f7c8e2bf06ac4a3f5dc8889b5100cfea6b5cd68411680a56ab720dc6aaa37", + "capturedAtSeq": 5, + "durationMs": 414, + "metadata": { + "width": 80, + "height": 24, + "profileName": "reference-dark", + "renderProfileHash": "8ffed6af301ec7c0e6b69599c3be0d1d12096f9fcdfc59d0bbb4cc474d64c53d", + "timingMode": "accelerated", + "outputEventCount": 5, + "resizeEventCount": 0 + } + } +} diff --git a/dogfood/20260327-public-skill/run.json b/dogfood/20260327-public-skill/run.json new file mode 100644 index 0000000..3260426 --- /dev/null +++ b/dogfood/20260327-public-skill/run.json @@ -0,0 +1,13 @@ +{ + "ok": true, + "command": "run", + "timestamp": "2026-03-27T17:01:29.889Z", + "result": { + "accepted": true, + "completed": true, + "timedOut": false, + "seq": 3, + "durationMs": 572, + "marker": "__AT_MARKER_0019af22a43542748c91caa3b31cdc5e__" + } +} diff --git a/dogfood/20260327-public-skill/screenshot.json b/dogfood/20260327-public-skill/screenshot.json new file mode 100644 index 0000000..ed57512 --- /dev/null +++ b/dogfood/20260327-public-skill/screenshot.json @@ -0,0 +1,20 @@ +{ + "ok": true, + "command": "screenshot", + "timestamp": "2026-03-27T17:01:31.570Z", + "result": { + "sessionId": "01KMR3WRXSP97ZBVWXN0YQ3VG2", + "capturedAtSeq": 5, + "profileName": "reference-dark", + "cols": 80, + "rows": 24, + "artifactPath": "/tmp/tmp.JSj3HFOAzD/sessions/01KMR3WRXSP97ZBVWXN0YQ3VG2/artifacts/screenshot-5-reference-dark.png", + "pngSizeBytes": 25313, + "cursorVisible": false, + "rendererBackend": "ghostty-web", + "pixelWidth": 640, + "pixelHeight": 384, + "sha256": "6f09c951da1d3f69439256f8eff9e0426b8fcd7292e23b23cbd5b4d9d8b37f70", + "renderProfileHash": "8ffed6af301ec7c0e6b69599c3be0d1d12096f9fcdfc59d0bbb4cc474d64c53d" + } +} diff --git a/dogfood/20260327-public-skill/snapshot.json b/dogfood/20260327-public-skill/snapshot.json new file mode 100644 index 0000000..3995c14 --- /dev/null +++ b/dogfood/20260327-public-skill/snapshot.json @@ -0,0 +1,15 @@ +{ + "ok": true, + "command": "snapshot", + "timestamp": "2026-03-27T17:01:30.995Z", + "result": { + "format": "text", + "sessionId": "01KMR3WRXSP97ZBVWXN0YQ3VG2", + "capturedAtSeq": 5, + "cols": 80, + "rows": 24, + "cursorRow": 7, + "cursorCol": 61, + "text": "bash: command not found: starship\nbash: /home/linuxbrew/.linuxbrew/bin/brew: No such file or directory\ncoder@aaaaaaa:~/.mux/src/agent-terminal/agent-terminal-ejrg$ printf \"public-skil\nl smoke\\n\"\nprintf '%s%s\\n' '__AT_MARKER_0019af22a43' '542748c91caa3b31cdc5e__'\npublic-skill smoke\n__AT_MARKER_0019af22a43542748c91caa3b31cdc5e__\ncoder@aaaaaaa:~/.mux/src/agent-terminal/agent-terminal-ejrg$\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + } +} diff --git a/dogfood/20260327-public-skill/version.json b/dogfood/20260327-public-skill/version.json new file mode 100644 index 0000000..0c47cbd --- /dev/null +++ b/dogfood/20260327-public-skill/version.json @@ -0,0 +1,37 @@ +{ + "ok": true, + "command": "version", + "timestamp": "2026-03-27T17:01:27.066Z", + "result": { + "cliVersion": "0.1.0", + "protocolVersion": "0.1.0", + "rendererBackends": ["ghostty-web"], + "runtime": { + "node": "v24.14.0", + "platform": "linux", + "arch": "x64" + }, + "capabilities": [ + { + "name": "snapshot", + "status": "available" + }, + { + "name": "wait", + "status": "available" + }, + { + "name": "screenshot", + "status": "available" + }, + { + "name": "record-export-asciicast", + "status": "available" + }, + { + "name": "record-export-webm", + "status": "available" + } + ] + } +} diff --git a/dogfood/20260327-public-skill/wait.json b/dogfood/20260327-public-skill/wait.json new file mode 100644 index 0000000..14463eb --- /dev/null +++ b/dogfood/20260327-public-skill/wait.json @@ -0,0 +1,13 @@ +{ + "ok": true, + "command": "wait", + "timestamp": "2026-03-27T17:01:30.558Z", + "result": { + "matched": true, + "timedOut": false, + "matchedText": "public-skill smoke", + "cursorRow": 7, + "cursorCol": 61, + "capturedAtSeq": 5 + } +} diff --git a/package.json b/package.json index 9101ccc..8f96aab 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,14 @@ { "name": "agent-terminal", "version": "0.1.0", - "private": true, - "description": "Terminal CLI scaffold", + "description": "Terminal automation CLI for AI agents and humans", + "keywords": [ + "terminal", + "tui", + "automation", + "ai", + "tanstack-intent" + ], "type": "module", "packageManager": "npm@11.9.0", "engines": { @@ -12,20 +18,24 @@ "agent-terminal": "./dist/cli/main.js" }, "files": [ - "dist" + "dist", + "skills", + "!skills/_artifacts" ], "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "build": "tsc -p tsconfig.build.json", + "build": "tsc -p tsconfig.build.json && node ./scripts/copy-renderer-assets.mjs", "clean": "rimraf coverage dist *.tsbuildinfo", "cli": "tsx src/cli/main.ts", "doctor": "tsx src/cli/main.ts doctor", "format": "prettier . --write", - "review-bundle": "tsx src/tools/review-bundle.ts", "format:check": "prettier . --check", + "intent:validate": "npx @tanstack/intent@latest validate", "lint": "eslint src test vitest.config.ts --max-warnings=0", "lint:fix": "eslint src test vitest.config.ts --fix", + "prepublishOnly": "npm run verify", + "review-bundle": "tsx src/tools/review-bundle.ts", "test": "vitest run", "test:watch": "vitest", "typecheck": "tsc -p tsconfig.json --noEmit", diff --git a/scripts/copy-renderer-assets.mjs b/scripts/copy-renderer-assets.mjs new file mode 100644 index 0000000..33faad5 --- /dev/null +++ b/scripts/copy-renderer-assets.mjs @@ -0,0 +1,37 @@ +// Post-tsc build step: copies bundled renderer assets (fonts, license) from +// src/renderer/ghosttyWeb/assets into dist/renderer/ghosttyWeb/assets so that +// the published npm package includes them alongside the compiled JS. +// +// This is a plain .mjs file (not TypeScript in src/tools/) because it runs +// after tsc as part of `npm run build` and must not depend on the compilation +// output it is completing. +import { cp, mkdir, stat } from 'node:fs/promises'; +import { dirname, resolve } from 'node:path'; +import process from 'node:process'; +import { fileURLToPath } from 'node:url'; + +const projectRoot = resolve(fileURLToPath(new URL('..', import.meta.url))); +const sourceDir = resolve(projectRoot, 'src/renderer/ghosttyWeb/assets'); +const destDir = resolve(projectRoot, 'dist/renderer/ghosttyWeb/assets'); + +async function main() { + const sourceStats = await stat(sourceDir); + if (!sourceStats.isDirectory()) { + throw new Error(`renderer asset source must be a directory: ${sourceDir}`); + } + + await mkdir(dirname(destDir), { recursive: true }); + await cp(sourceDir, destDir, { recursive: true, force: true }); + + const destStats = await stat(destDir); + if (!destStats.isDirectory()) { + throw new Error( + `renderer asset destination must be a directory: ${destDir}`, + ); + } +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/skills/agent-terminal/SKILL.md b/skills/agent-terminal/SKILL.md new file mode 100644 index 0000000..7620b38 --- /dev/null +++ b/skills/agent-terminal/SKILL.md @@ -0,0 +1,102 @@ +--- +name: agent-terminal +description: Terminal and TUI automation CLI for AI agents. Use when the user needs to create a terminal session, run a command in a terminal, automate an interactive CLI or TUI, wait for terminal output, capture a TUI screenshot, export a terminal recording, or test a CLI workflow with reviewable artifacts. +advertise: true +--- + +# Terminal Automation with agent-terminal + +Install the CLI with `npm install -g agent-terminal`, then use `agent-terminal` directly. +Examples use `jq` for JSON parsing; any JSON-processing tool works. +Prefer isolated homes, JSON envelopes, and renderer-backed artifacts so terminal workflows stay reviewable and reproducible. + +## Core Workflow + +Every terminal or TUI automation task should follow this pattern: + +1. **Create an isolated home** with `--home`. +2. **Check prerequisites** with `doctor --json` before screenshot or recording work. +3. **Create a session** with `create --json`. +4. **Run setup commands** with `run` instead of simulating long shell typing. +5. **Wait on observable terminal state** with `wait` instead of blind sleeps. +6. **Inspect the current screen** with `snapshot`. +7. **Capture proof artifacts** with `screenshot` or `record export`. +8. **Destroy the session** when finished. + +```bash +AGENT_HOME="$(mktemp -d)" +agent-terminal --home "$AGENT_HOME" doctor --json +SESSION_ID=$(agent-terminal --home "$AGENT_HOME" create --json -- /bin/bash | jq -r '.result.sessionId') +agent-terminal --home "$AGENT_HOME" run "$SESSION_ID" 'printf "ready\n"' +agent-terminal --home "$AGENT_HOME" wait "$SESSION_ID" --text 'ready' --json +agent-terminal --home "$AGENT_HOME" snapshot "$SESSION_ID" --format text --json +agent-terminal --home "$AGENT_HOME" screenshot "$SESSION_ID" --json +agent-terminal --home "$AGENT_HOME" record export "$SESSION_ID" --format webm --json +agent-terminal --home "$AGENT_HOME" destroy "$SESSION_ID" --json +``` + +## Essential Commands + +```bash +# Environment and lifecycle +agent-terminal --home doctor --json +agent-terminal --home create --json -- /bin/bash +agent-terminal --home inspect --json +agent-terminal --home destroy --json + +# In-session control +agent-terminal --home run 'command here' --json +agent-terminal --home type 'literal text' --json +agent-terminal --home paste 'multiline payload' --json +agent-terminal --home send-keys Enter Ctrl+C --json + +# Observation and proof +agent-terminal --home wait --text 'ready' --json +agent-terminal --home wait --screen-stable-ms 1000 --json +agent-terminal --home snapshot --format text --json +agent-terminal --home screenshot --json +agent-terminal --home record export --format webm --json +``` + +## Common Patterns + +### Bootstrap a shell session + +```bash +AGENT_HOME="$(mktemp -d)" +SESSION_ID=$(agent-terminal --home "$AGENT_HOME" create --json -- /bin/bash | jq -r '.result.sessionId') +agent-terminal --home "$AGENT_HOME" run "$SESSION_ID" 'pwd && ls -la' --json +agent-terminal --home "$AGENT_HOME" snapshot "$SESSION_ID" --format text --json +``` + +### Drive an interactive CLI or TUI + +```bash +AGENT_HOME="$(mktemp -d)" +SESSION_ID=$(agent-terminal --home "$AGENT_HOME" create --json -- /bin/bash | jq -r '.result.sessionId') +agent-terminal --home "$AGENT_HOME" run "$SESSION_ID" '' --no-wait --json +agent-terminal --home "$AGENT_HOME" wait "$SESSION_ID" --screen-stable-ms 1000 --json +agent-terminal --home "$AGENT_HOME" send-keys "$SESSION_ID" Down Down Enter --json +agent-terminal --home "$AGENT_HOME" screenshot "$SESSION_ID" --json +``` + +### Export reviewer-facing artifacts + +```bash +AGENT_HOME="$(mktemp -d)" +SESSION_ID=$(agent-terminal --home "$AGENT_HOME" create --json -- /bin/bash | jq -r '.result.sessionId') +agent-terminal --home "$AGENT_HOME" run "$SESSION_ID" 'printf "artifact proof\n"' --json +agent-terminal --home "$AGENT_HOME" wait "$SESSION_ID" --text 'artifact proof' --json +agent-terminal --home "$AGENT_HOME" screenshot "$SESSION_ID" --json +agent-terminal --home "$AGENT_HOME" record export "$SESSION_ID" --format asciicast --json +agent-terminal --home "$AGENT_HOME" record export "$SESSION_ID" --format webm --json +``` + +## Anti-Patterns + +- **Do not reach for `tmux`, `screen`, or ad hoc PTY wrappers first** when `agent-terminal` can provide an isolated, inspectable session. +- **Do not rely on blind `sleep` calls** when `wait --text`, `wait --idle-ms`, or `wait --screen-stable-ms` can observe terminal readiness directly. +- **Do not bypass `--json`** when another tool or agent needs machine-readable results. +- **Do not use external screenshot tools as the primary proof path** when `agent-terminal screenshot` and `agent-terminal record export` can produce renderer-backed artifacts tied to the session timeline. +- **Do not leave sessions running after the task ends**; destroy them explicitly. +- **Do not rewrite public examples into repo-local development invocations**; the public workflow should stay `agent-terminal ...`.