# Changelog

## v1.4.2 — 2026-05-20
- Watcher: remove per-turn divider lines; text sections are now separated by a single blank line

## v1.4.1 — 2026-05-20
- Remove backward-compat `agent-tester query` model discovery from REPL config loading — `models:` section is the only supported format
- Remove inline `api: anthropic` / `endpoint:` evaluator syntax — evaluators now require a named `provider:` reference
- Update error message shown when no models are found in config

## v1.2.2 — 2026-05-19
- Remove `/reply` command, `QuestionRegistry`, and `ask_user` tool — sending a targeted message with `@model <msg>` covers the same use cases; models that hit max turns now stop cleanly instead of blocking
- Remove `cost/` submodule and `agent-tester costs` CLI command — token-level usage is now tracked directly in providers and shown in `/report`
- Remove undocumented `agent-tester query` CLI command and `vllm.query` — superseded by the REPL; `check_connection` retained for endpoint health checks
- Remove private helper re-exports (`_to_anthropic_messages`, `_to_anthropic_tools`) from `providers/__init__.py`
- Update README to reflect current REPL slash commands, sessions format, tool use paths, and cleanup behavior

## v1.2.1 — 2026-05-19
- `/report` now shows input/output token counts per model (e.g. `tokens: 1,234 in / 567 out`) when tokens were used via the streaming path
- All three providers (`AnthropicProvider`, `OpenAICompatProvider`, `BedrockProvider`) now return `input_tokens` and `output_tokens` in `async_stream_raw` results; `Model` accumulates totals across turns

## v1.2.0 — 2026-05-19
- `/evaluate` now accepts an optional comma-separated reviewer list (e.g., `/evaluate claude,gpt4`) to limit which models act as reviewers
- Evaluation documents are saved as Markdown files to `<repo>/.agenttester/evaluations/<session_slug>/` (filenames: `<reviewed>-by-<reviewer>.md`) and review prompts now request Markdown-formatted output
- Add `/iterate <prompt>` command: shows a per-model plan of which peer evaluations will be included, requires `y`/`n` approval, then sends each model its own evaluations plus the iteration prompt
- Update `editing.md` skill: clarify the search step is about building context before implementing; add "Completing Work" section requiring a concise summary of changes after each task

## v1.1.11 — 2026-05-19
- Fix `sessions` YAML output: preserve key order (id, date, start, end, branches) via sort_keys=False; use plain print to avoid Rich markup interference

## v1.1.10 — 2026-05-19
- Add `agent-tester sessions` command: lists sessions newest-first, each showing `date  start  end  id` with branches indented 4 spaces and labeled `local`, `remote`, `local,remote`, or `unknown`; pass `--yaml` for machine-readable output

## v1.1.9 — 2026-05-19
- Session loader falls back to legacy `.json` files when no `.yaml` exists; YAML wins when both are present; `list_all` includes both formats without duplicates

## v1.1.8 — 2026-05-19
- Convert session files from JSON to YAML (`sessions/<id>.yaml`) for readability

## v1.1.7 — 2026-05-19
- Change branch manifest format from JSON to YAML (`branches.yaml`)

## v1.1.6 — 2026-05-19
- Add branch manifest (`~/.config/agenttester/branches.json`): records every branch with its remote URI and session ID when created; entries are removed when branches are deleted via cleanup

## v1.1.5 — 2026-05-19
- Cleanup now prompts to delete session records (history, reports, eval results) only after an explicit "delete entirely" selection, with a separate yes/no confirmation; records are preserved by default

## v1.1.4 — 2026-05-19
- Move agent working directories from `/tmp` to `.agenttester/worktrees/<session-id>/` so the user can inspect them; cleaned up aggressively on session exit
- Fix "Session was empty — not saved." message appearing incorrectly on resumed sessions with no new prompts

## v1.1.3 — 2026-05-19
- Update `testing.md` skill: check CI workflow files first for test/lint commands; note they are the source of truth for what must pass

## v1.1.2 — 2026-05-19
- Update `testing.md` skill: agents must write tests for new code, match existing conventions, test observable behaviour not internals, one behaviour per test

## v1.1.1 — 2026-05-19
- Add tests for `type: github` provider (default `GITHUB_TOKEN` and custom `api_key_env`)

## v1.1.0 — 2026-05-19
- Add `type: github` provider: routes to GitHub Models (`https://models.inference.ai.azure.com`) with `GITHUB_TOKEN` auth (overridable via `api_key_env`)

## v1.0.9 — 2026-05-18
- Persist `reports` and `eval_results` in the session file; on resume, `/report` data is reused and completed reviews are printed immediately (marked `(resumed)`) with only pending reviews re-running

## v1.0.8 — 2026-05-18
- Fix `/report` on resumed sessions when clones are gone: `--single-branch` clone set `origin/HEAD` to the agent's own branch, making `origin/HEAD..HEAD` always empty; now clone with `--depth 1` (correct `origin/HEAD`) then fetch and checkout the agent's branch

## v1.0.7 — 2026-05-18
- Bottom toolbar shows `evaluating (N/M)` while `/evaluate` is running
- `/status` prints a review-progress line during evaluation
- `/evaluate` now prints each reviewer's result as it completes (parallel reviews, `asyncio.as_completed`) rather than waiting for all before printing

## v1.0.6 — 2026-05-18
- On resume when clones are gone, `clone_for_model` clones the model's existing remote branch directly (`--branch --single-branch`) so agents land on their prior branch; if clone exists but is on the wrong branch, fetch and checkout the correct one

## v1.0.5 — 2026-05-18
- Fix session resume: reuse existing model clones instead of wiping and re-cloning
- Fix `/report` always returning empty: compare against `origin/HEAD` (remote default branch) instead of `FETCH_HEAD`, which was being set to the agent's own pushed branch after `git fetch origin`

## v1.0.4 — 2026-05-18
- Consolidate config dir: `LocalCostBackend` and `_get_global_skills_dir` now use `GLOBAL_CONFIG_DIR` instead of `~/.agenttester`; `cli.py` `watch` command uses `GLOBAL_CONFIG_DIR / "sessions"` instead of a hardcoded path
- Fix `_skills_from_configs`: resolve config file within `repo_path` using `CONFIG_CANDIDATES` instead of passing the directory to `get_config_paths`
- Add `async_stream_raw` as an abstract method to `Provider` base class
- Use `branch_name()` in `report.py` instead of hardcoded branch format string

## v1.0.3 — 2026-05-18
- Expand `editing.md` skill: add single-source-of-truth section and things-to-avoid list (magic values, deep nesting, dead code, inappropriate intimacy, speculative generality, god objects)

## v1.0.2 — 2026-05-18
- Add `scope.md` skill: stay in scope, minimal diffs, no unrelated edits

## v1.0.1 — 2026-05-18
- `git fetch origin` in each model's clone before collecting `/report` data

## v1.0.0 — 2026-05-18
- Promote to stable 1.0.0; remove experimental warning from README

## v0.20.7 — 2026-05-18
- Remove dead `get_or_create_worktree()` from `GitManager` (never called in app code)
- Add `_DEFAULT_REMOTE = "origin"` constant to `git_manager.py`; replace all internal hardcoded `"origin"` strings and function-signature defaults
- Rename `_DEFAULT_MAX_TURNS` in `repl.py` to `_REPL_MAX_TURNS` to distinguish it from `loop.py`'s `_DEFAULT_MAX_TURNS = 20` (different defaults, different purposes)
- Add `_API_CALL_TIMEOUT` and `_API_STREAM_TIMEOUT` constants to `providers/base.py`; replace five duplicated `aiohttp.ClientTimeout(...)` constructions across `anthropic.py`, `openai_compat.py`, and `vllm.py`
- Extract `_make_result()` factory to module level in `agent_runner.py`; both `_run_local` and `_run_remote` now delegate to the shared function

## v0.20.6 — 2026-05-18
- Add `workdir` property, `save_messages`, `restore_messages`, `add_message`, `pop_message` to `Model`; `_query_async` now uses these instead of reaching into `model.messages` directly; `_run_report` uses `model.workdir` instead of `model.tool_executor.workdir`
- Add `_CTRL_C_TIMEOUT` and `_BRANCH_SLUG_MAX_LEN` constants to `repl.py`; replace all magic `2.0` and `60` literals in the REPL loop
- Fix hardcoded `~/.config/agenttester/repl_history` path in `run_repl` — now uses `GLOBAL_CONFIG_DIR`
- Rename `session_obj` → `_prompt_session` for naming consistency with other `_*` locals in `run_repl`
- Add `_TOOL_ARGS_DISPLAY_LEN`, `_TOOL_CALL_DISPLAY_LEN`, `_TOOL_RESULT_PREVIEW_LINES` constants to `watcher.py`; replace inline magic literals in `_render_event`

## v0.20.5 — 2026-05-18
- Fix `datetime.utcnow()` (naive UTC) → `datetime.now(timezone.utc)` in `cost/tracker.py`
- Remove unused `_AT_PATTERN` regex from `repl.py`
- `session.py` and `events.py` now use `GLOBAL_CONFIG_DIR` from `config.py` instead of hardcoding the path; `session.py` reuses `_get_global_config_candidates()` for max-session lookup
- Extract `_split_system()` in `providers/anthropic.py` — eliminates duplicated system-message extraction in `async_call` and `async_stream_raw`
- Add `branch_name(agent, run)` and `_pem_ssh_command(pem)` to `git_manager.py`; all branch-name constructions across `git_manager`, `tools`, `orchestrator`, and `repl` now use the single function. Fixes unsanitized agent name in `orchestrator._build_prompt`
- Add `_DEFAULT_MAX_TURNS` / `_DEFAULT_MAX_TOKENS` / `_MAX_DIFF_CHARS` / `_DEFAULT_LOOP_TURNS` named constants to replace magic literals
- Add `set_event_handler()` to `ToolExecutor`; add `setup_executor()` and `wire_event_logger()` to `Model` so callers no longer reach into model internals
- Decompose `run_repl()` into `_load_and_check_models`, `_init_session`, `_setup_git_and_tools`, `_seed_histories`, `_attach_event_loggers`; extract `_handle_reply` and `_resolve_targets` from the loop; drop dead `_shutting_down` state

## v0.20.4 — 2026-05-18
- Split `/evaluate` into two commands: `/report` collects and displays each model's commit summary and diff stats; `/evaluate` runs peer reviews using the stored reports, auto-generating them first if not already done

## v0.20.3 — 2026-05-18
- Add `--skills` CLI option to `repl` command: accepts file or directory paths (repeatable); loaded after config-declared skills at highest priority
- Add `skills:` key support in config files: paths resolved relative to the config file
- Move all function-level imports to module level across `skills.py`, `session.py`, `repl.py`, `tools.py`, `cli.py`, and `providers/bedrock.py` (boto3/botocore remain function-level as an optional dependency guard)

## v0.20.2 — 2026-05-18
- Add `review.md` skill: agents are instructed on code review standards covering language/dependency discipline, single source of truth, code reuse, and a named list of code smells to flag

## v0.20.1 — 2026-05-18
- Fix `agent-tester cleanup` showing no sessions: remote branch listing now queries the remote live via `git ls-remote` instead of relying on cached tracking refs that were never populated by the clone-based workflow

## v0.20.0 — 2026-05-18
- `/evaluate` command: each model reviews every other model's work; collects git commits and diffs from each model's clone, sends a structured peer-review prompt to all other models in parallel, and displays results as they arrive

## v0.19.2 — 2026-05-18
- Do not use bash for git branch or push operations. Use the `git_commit` and `git_push` tools instead.

## v0.19.1 — 2026-05-18
- Empty sessions (no user input sent) are not saved and show "Session was empty — not saved." instead of the resume message

## v0.19.0 — 2026-05-18
- Each model now gets a shallow clone of the repo in a per-model temp directory at startup; agents can no longer read or write each other's files
- Branch creation (`git checkout -b agenttester/<model>/<slug>`) happens in the clone on first commit rather than lazily creating a worktree in the original repo
- Clone directories are removed when the REPL exits
- Removed `worktree_creator` from `ToolExecutor`; replaced `_ensure_worktree` with `_ensure_branch`

## v0.18.5 — 2026-05-18
- Ctrl-C shows "Press Ctrl-C to exit" in the toolbar instead of printing; message disappears automatically after 2s

## v0.18.4 — 2026-05-18
- Typing `/` in the REPL shows a completion dropdown for all slash commands with descriptions

## v0.18.3 — 2026-05-18
- Cleanup dialog skips sessions with no existing local or remote branches
- Sessions are pruned to the 5 most recent on save; configurable via `max_sessions` in global config

## v0.18.2 — 2026-05-18
- Toolbar shows separate running/waiting counts with color; `/status` lists every model as running, waiting, or idle

## v0.18.1 — 2026-05-18
- Prevent sending prompts to busy models; REPL now rejects `/send` to a model that is already running
- `/status` command shows running, waiting, and idle models

## v0.18.0 — 2026-05-18
- **Fix: streaming responses no longer cut off**: SSE parsing now uses line-based reading (`readline()`) instead of iterating over raw byte chunks, preventing data loss when chunk boundaries split SSE events mid-line; a JSON buffer accumulates partial payloads across lines
- **`ask_user` tool**: models can now pause execution and wait for user input; when a model calls `ask_user`, the main REPL displays a status line showing how many models are waiting and their names; use `/reply @model <response>` to send a response
- **Watcher shows waiting state**: `agent-tester watch` displays the full question text and reply instructions when a model is blocked on user input
- Pending questions are cancelled on session exit so models don't block forever

## v0.17.0 — 2026-05-15
- **Streaming responses**: all LLM calls in the agent loop now use SSE streaming (`stream: true`) for OpenAI-compatible endpoints and Anthropic's streaming Messages API; text arrives token-by-token rather than as a single block after full completion
- **Live watcher streaming**: `agent-tester watch` displays text chunks inline as they arrive during the live tail phase; historical events are replayed as panels on attach; tool calls and tool results interrupt and resume streaming display cleanly
- `chunk` event type added to the per-model JSONL event log; `response` event still logged at the end with the full accumulated text for history replay

## v0.16.1 — 2026-05-15
- Rename `agent-tester watcher` to `agent-tester watch`

## v0.16.0 — 2026-05-15
- **Fix: branch negotiation runs only once per session** — the branch name is negotiated on the first prompt and reused for all subsequent prompts; no more redundant LLM calls per message
- **`agent-tester watcher --session ID --model NAME`**: open a separate terminal window that tail-follows a model's full activity log — every prompt, tool call, tool result, and response rendered in real-time with Rich
- **Event logging**: each model's activity is written to `~/.config/agenttester/sessions/<session-id>/events/<model>.jsonl`; structured JSONL format with type, content, and timestamp
- **Main REPL status-only display**: instead of printing full response panels inline, the main REPL shows brief `✓ model: done` / `✗ model: error` status lines; the watcher is the rich per-model view

## v0.15.1 — 2026-05-15
- **`agent-tester --resume <SESSION_ID>`**: resume a session without the `repl` subcommand; the exit message now shows this form instead of `repl --session`

## v0.15.0 — 2026-05-15
- **`agent-tester cleanup`**: interactive branch cleanup command; iterates through sessions in two phases — (1) select sessions to delete entirely, (2) for remaining sessions select individual model branches to drop; then choose local-only / remote-only / both before a final confirmation
- Sessions now record the branch names they create in the session JSON (`branches` field), enabling accurate per-session cleanup; old session files without this field are handled gracefully
- `GitManager` gains `list_agenttester_branches`, `delete_local_branch` (with worktree removal), and `delete_remote_branch`

## v0.14.0 — 2026-05-15
- **Negotiated branch names**: before coding begins, all models vote on a branch name in up to 2 rounds; after round 2 the shortest descriptive proposal wins; the final slug is prefixed with the HEAD commit hash (`<8-char-hash>-<feature-name>`)
- Branch negotiation is skipped when there is no git repo or no commits (falls back to prompt slug)

## v0.13.5 — 2026-05-15
- Auto-generated session names use UUID4 instead of a datetime string

## v0.13.4 — 2026-05-15
- **Session ID always shown**: a session is always created on REPL start (auto-named `YYYYMMDD-HHMMSS` when `--session` is not passed); session name is printed at startup and the resume hint is always printed on exit, including via Ctrl-C

## v0.13.3 — 2026-05-15
- **Persistent prompt history**: REPL input history is saved across sessions to `~/.config/agenttester/repl_history`; up/down arrows scroll through previous prompts like a normal terminal

## v0.13.2 — 2026-05-15
- **Double Ctrl-C to exit**: first Ctrl-C prints `(press Ctrl-C again to exit)`; second Ctrl-C exits; EOF exits immediately; any other input resets the flag

## v0.13.1 — 2026-05-15
- On exit, always print `bye` from the finally block; with an active session it reads `bye  —  agent-tester repl --session <name>  to resume` on a single line

## v0.13.0 — 2026-05-15
- **Scrollable output**: replaced `rich.Live` with plain streaming output so all model responses and tool events land in the terminal scrollback buffer and can be scrolled freely while queries are in flight
- **Live tool event streaming**: agent tool calls and results are printed inline as they happen (`→ model: tool_name: args` / `← result`), giving real-time visibility into what each agent is doing without any blocking
- **Unified query path**: single/multi-model queries now share the same `asyncio.as_completed` path; a "still waiting: …" line after each response shows which models are still running

## v0.12.1 — 2026-05-15
- On REPL exit with an active session, print `agent-tester repl --session <name>  to resume` so the user always knows how to get back

## v0.12.0 — 2026-05-14
- **`agent-tester serve`**: new subcommand that opens an HTTP receiver (`POST /result`, `GET /health`) where external agents can POST completion results; rendered as Rich panels in real-time
- **`notify` tool**: when `--notify-url` is passed to `agent-tester repl`, models gain a `notify` tool they can call to POST their final result back to the server; the tool is absent from the tool list when no URL is configured
- **`agent-tester repl --notify-url`**: new flag that wires the notify tool to a running `agent-tester serve` instance

## v0.11.5 — 2026-05-14
- **Live multi-model display**: when querying multiple models the REPL now renders all response panels immediately (with animated spinners), then fills each in as its model completes — built with `rich.Live` + `rich.Spinner`

## v0.11.4 — 2026-05-14
- **Lazy branch creation**: branches are no longer created upfront at session start; a branch is created on the first `write_file` or `git_commit` call, named after the prompt that triggered it (`agenttester/<model>/<prompt-slug>`)
- **Streaming responses**: when querying multiple models the REPL now prints each response as it arrives rather than waiting for all models to finish
- **git.md skill**: updated branch format docs to reflect prompt-derived names; added a "Merge conflicts" section instructing agents to resolve conflicts automatically

## v0.11.3 — 2026-05-14
- **Cost package refactor**: `cost.py` split into `cost/` package (`base.py` — `CostEntry` + `CostBackend` ABC, `local.py` — `LocalCostBackend`, `tracker.py` — `CostTracker`); all existing imports unchanged

## v0.11.2 — 2026-05-14
- **Branch name sanitization**: all agent and run names are sanitized to valid git ref components before branch/worktree creation, preventing collisions from spaces, slashes, or other special characters
- **git.md skill update**: documents the `agenttester/<model-name>/<session-name>` branch format and instructs models not to create new branches
- **CWD default for workdir**: `agent-tester repl` now defaults to the current directory for tool use and branch creation; pass `--workdir` to override; branches always land in the repo the REPL is called from
- **Providers package refactor**: `providers.py` split into a `providers/` package (`base.py`, `anthropic.py`, `openai_compat.py`, `bedrock.py`) with a re-exporting `__init__.py`; all existing imports unchanged

## v0.11.1 — 2026-05-14
- **Anthropic tool use**: `AnthropicProvider` now supports tool use in the REPL agent loop; messages and tool definitions are automatically converted between OpenAI and Anthropic wire formats so the same agent loop drives all provider types
- Fix: `AnthropicProvider.call` now correctly separates system messages into Anthropic's top-level `system` field instead of passing them in the `messages` array (which the API rejects)

## v0.11.0 — 2026-05-14
- **Tool use in the REPL**: OpenAI-compatible models in the REPL now run a full agent loop with access to `bash`, `read_file`, `write_file`, `git_clone`, `git_commit`, and `git_push` tools; pass `--workdir` to activate tool use with a target directory
- **Automatic per-model branches**: when `--workdir` points to a git repo each model gets its own worktree on branch `agenttester/<model-name>/<session-name>`; all changes are automatically committed and can be pushed with `--push`
- **Session persistence**: pass `--session <name>` to save conversation history on exit and restore it on the next `repl` invocation; sessions are stored in `~/.config/agenttester/sessions/`
- **SSH PEM key support**: `--pem <path>` sets `GIT_SSH_COMMAND` for all git operations (clone, commit push) that need SSH auth
- **`git_push` and `git_commit` tools** added to `ToolExecutor`; `orchestrator run` now supports `--push`, `--remote`, and `--pem` flags for pushing agent branches after a run

## v0.10.1 — 2026-05-14
- Render REPL model responses as markdown so code blocks are syntax-highlighted and ``` fences are not shown as literal text

## v0.10.0 — 2026-05-14
- **Bedrock models in the REPL**: add a `models:` config section that lets you define REPL models using any named provider — including AWS Bedrock — by referencing a provider defined in the `providers:` block; inline `endpoint:` still works for OpenAI-compatible models without a named provider
- Provider instances are now built lazily per-reference, so legacy configs with provider entries that only specify `api_key_env` (no `endpoint`) continue to work in the backward-compat agent-command path

## v0.9.1 — 2026-05-14
- Fix Bedrock tests failing on CI when boto3 is not installed: use `patch.dict(sys.modules)` instead of `patch("boto3.Session")` so tests pass without the `[aws]` extras group

## v0.9.0 — 2026-05-14
- **Provider class hierarchy**: replace the flat `ProviderConfig` dataclass with an abstract `Provider` base class and three concrete implementations — `AnthropicProvider`, `OpenAICompatProvider`, and `BedrockProvider`; provider calling logic now lives with the provider class rather than in `evaluator.py`
- **AWS Bedrock support**: `BedrockProvider` calls the Bedrock Converse API via boto3 (install with `pip install agenttester[aws]`); supports three auth modes: named AWS CLI profile (`aws_profile`), explicit credential env vars (`aws_access_key_id_env` / `aws_secret_access_key_env` / `aws_session_token_env`), and the default boto3 credential chain
- **`type` field on provider config entries**: providers now declare their type explicitly (`type: anthropic`, `type: openai`, `type: bedrock`); inline evaluator forms (`api: anthropic`, bare `endpoint:`) remain supported for backward compatibility

## v0.8.0 — 2026-05-13
- **Provider-level credentials**: add a `providers` block to define shared endpoint and API key env vars for cloud LLM providers (AWS Bedrock, Azure AI Foundry, GCP Vertex, etc.); evaluators and REPL model agents can reference a provider by name and inherit its credentials
- **Model-level API key override**: model-level `api_key_env` and `endpoint` fields always take precedence over the provider-level defaults
- **OpenAI-compatible auth**: `Authorization: Bearer` header is now sent automatically when `api_key_env` is set on an evaluator or REPL model agent, enabling any authenticated OpenAI-compatible endpoint

## v0.7.0 — 2026-05-13
- **REPL `@`-autocomplete**: typing `@` in the REPL now autocompletes model names as you type; `@modelname message` routes a message to a single model instead of broadcasting to all
- **Skills injected into REPL context**: skill instructions are loaded at REPL startup and seeded as a system message for each model; `/reset` restores to this seeded state rather than fully empty history

## v0.6.0 — 2026-05-13
- **Descriptive branch names**: branches are now `agenttester/<agent-name>/<run-name>` instead of `agenttester/<run-id>/<agent-name>`; use `--name` to provide a human-readable run name, or a slug is derived from the prompt automatically
- **LLM-based code evaluation**: configure multiple independent LLM evaluators (Anthropic API or any OpenAI-compatible endpoint such as vllmd) to review each agent's diff for accuracy, readability, code smells, and correctness
- **Aggregate reports**: evaluator critiques are synthesized into a single aggregate assessment per agent; raw per-evaluator reports are preserved in the markdown report
- **Iterative refinement loop**: after evaluation the user selects which agents (1–all) to re-run; selected agents receive the aggregate feedback as context and commit each refinement to the same branch (tracked via `iter-N` commit messages)
- **Feedback summarization**: aggregate feedback is summarized before injection if it exceeds `max_aggregate_tokens`; set `inject_raw_reports: true` to send all raw evaluator reports instead
- Worktrees are now kept alive across iterations and only cleaned up when the user stops iterating

## v0.5.2 — 2026-05-12
- Fix test suite running real agent orchestrator: mock `Orchestrator` in CLI test to prevent worktree/branch/report side-effects and cut test time from 220s to 5s

## v0.5.1 — 2026-05-12
- Consolidate duplicated patterns across `agent_runner`, `repl`, and `skills`
- Consolidate config path resolution into `get_config_paths()`; fix REPL global config fallback
- Fix CI publish workflow: move `id-token: write` to workflow level for trusted publishing

## v0.5.0 — 2026-05-12
- Add interactive agent input routing and idle pause/resume

## v0.4.5 — 2026-05-12
- Include `skills.py` priority logic and lock file

## v0.4.4 — 2026-05-12
- Add git/bash built-in skills; prioritise user skills over built-ins

## v0.4.3 — 2026-05-12
- Remove agent count cap

## v0.4.2 — 2026-05-12
- Store reports in global config dir by default
- Support `.yml` and `.yaml` config file extensions

## v0.4.1 — 2026-05-12
- Update packages for wheel compatibility

## v0.4.0 — 2026-05-12
- Consolidate global config to `~/.config/agenttester/config.yml`

## v0.3.7 — 2026-05-11
- Add skills directory system and fix test path resolution

## v0.3.6 — 2026-05-11
- Add connection check on REPL startup with `--skip-checks` / `-S` flag

## v0.3.5 — 2026-05-11
- Add spinner while querying models in REPL

## v0.3.4 — 2026-05-11
- Open REPL by default when run with no subcommand

## v0.3.3 — 2026-05-11
- Fix `agent-tester` binary name in REPL, config example, and tests

## v0.3.2 — 2026-05-11
- Standardize on `agent-tester` binary and config filename

## v0.3.1 — 2026-05-11
- Read version from package metadata
- Replace `at` alias with `agent-tester` to avoid conflict with Unix job scheduler

## v0.3.0 — 2026-05-11
- Add branch name injection, auto-pull, and global config support

## v0.2.0 — 2026-05-11
- Add cost tracking system with local storage and CLI interface

## v0.1.1 — 2026-05-08
- Add README

## v0.1.0 — 2026-05-08
- Initial release
