About Anvil
Anvil is the AI coding assistant built for developers who demand control. Multi-provider, full-screen TUI, 1M token context, and intelligent context management β all in a 15MB binary.
What is Anvil?
Anvil is a terminal-native AI coding assistant that runs entirely in your terminal. Unlike web-based tools, Anvil lives where you work β in your shell, with direct access to your filesystem, build tools, and development environment.
Built by Culpur Defense and distributed as a single binary, Anvil connects to multiple AI providers and intelligently routes your requests. When Claude hits a rate limit, Anvil can automatically fall back to OpenAI or a local Ollama model without interrupting your flow.
The QMD (Query-Memory-Dispatch) system gives Anvil persistent memory across sessions. Your codebase knowledge, conversation history, and pinned context are always available, even when the context window fills up.
Features
18 Languages
Anvil ships in 18 locales β Tier-1 (en/es/zh-CN/fr/pt-BR/ru/ja/de) and Tier-2 (ko/it/tr/vi/pl/id/nl/sv/nb/uk). First-run wizard opens with a language picker, OS locale is auto-detected, and a soft drift gate keeps every translation in lockstep with the English seed.
Memory Cohesion Complete
All seven memory layers are GREEN end-to-end: Working / Episodic / Semantic / Procedural / Reflective / Long-term / Cache. /memory promote actually writes to disk, /memory prune episodic gets TTL retention with a trash-bin safety net, and the file-cache path-discovery bug is fixed.
Web MCP Builder
The /mcp builder TUI wizard now has a web counterpart on AnvilHub. The new /build page drives a three-step Prompt β Spec β Generate flow against anvil-mcp-builder, with vault-loaded operator OAuth tokens and publisher-gated sandbox detonation.
15 CC Parity Fixes
A complete CC parity sweep against v2.1.144βv2.1.146 lands as 15 concrete fixes β 3 P0 (MCP pagination, spinner/elapsed-time freeze on refocus, MCP permissions.allow honored at dispatch), 4 P1, and 7 P2 β each with regression tests.
anvild Process
The OAuth-refresh + routines daemon now runs as a separate process named anvild across all 7 platforms (macOS LaunchAgent, Linux user-systemd, FreeBSD/NetBSD rc.d, Windows Task Scheduler). ps -ef no longer masquerades the daemon as the foreground TUI binary.
Release Pipeline Step-Gates
scripts/release.sh wraps every phase in START / OK / FAIL markers backed by JSON status persistence and an EXIT-trap silent-exit detector. Closes the v2.2.18 Phase 6 silent-exit class of bugs; scripts/test-release-gates.sh is the regression harness.
Live Remote Control
Type /remote-control and hand your session to any browser. A live, bidirectional terminal-to-browser bridge with real-time streaming, 98 commands, secure pairing, and full feature parity.
Multi-Provider Failover
Switch between Claude, OpenAI, Ollama, xAI, and Gemini instantly. Smart failover keeps you coding when rate limits hit β Anvil switches providers automatically without dropping context.
Encrypted Credential Vault
AES-256-GCM encrypted vault with Argon2id key derivation. Auto-detects API keys, SSH keys, and TLS certs. Credentials never touch disk unencrypted.
Full-Screen TUI
Live streaming responses, tabs, tool call visualization, focus view (Ctrl+O), thinking mode, and context-low warnings. Vim mode, mouse support, and customizable keybindings.
90+ Commands & 45 Tools
Bash execution, file operations, web search, MCP protocol, LSP integration, image generation, conversation branching, and more. Everything you need without configuration.
AnvilHub Marketplace
Install community-built skills, plugins, agents, and themes with a single command. Publish your own and extend Anvil for your workflow.
How It Works
Install
Run the installer or download the binary. Anvil is a single 15MB binary β no runtime dependencies.
Login
Run `anvil login` to authenticate with your AI provider. Supports OAuth for Anthropic and API keys for all providers.
Code
Run `anvil` in any project directory. Anvil reads your codebase context and you're ready to go.
Extend
Browse AnvilHub for skills and plugins that match your workflow. Install with `anvil install <package-name>`.
Built by Culpur Defense
Anvil is developed and maintained by Culpur Defense Inc. β a cybersecurity and defense technology company building tools for professionals who operate in high-stakes environments.
culpur.net βChangelog
- βchore: regenerate Cargo.lock + man/anvil.1 for v2.2.19
- βrelease: v2.2.19 β bump version + finalize release notes
- βfeat(wizard): #768 move anvild install prompt into wizard alt-screen
- βfeat(wizard): #767b Ctrl+B Back keybind on Choice + Confirm modals
- βfix(tui/vs): #769 add β₯/Alt+drag selection hint to vertical-split rail
- βfix(modal): #767a ConfirmModal adaptive height β long body no longer hides buttons
- βfix(daemon): #766 follow-up β spawn_detached execs anvild not anvil
- βfeat(daemon): #766 anvild as separate process name across 7 platforms
- βfeat(install): #751 locale-aware installers (sh + ps1)
- βtask #764 (v2.2.20): extend OAuth keepalive to Gemini (refresh) + Copilot (monitor+alert)
- βfeat(daemon): #763 OAuth keepalive observability + Heartbeat events
- βfix(tui): #757 wrap-aware scroll prevents text from disappearing under input
- βfeat(daemon): #761 anvild as single source-of-truth for OAuth refresh
- βfix(startup): #762 share startup hooks across --resume, --continue, run_repl
- βfix(health): #745 self-heal false-positives on OAuth + completions
- βfix(resume): #760 enter REPL after --resume instead of exiting to shell
- βfix(session): #758 use $ANVIL_CONFIG_HOME/sessions/ instead of CWD-relative
- βv2.2.19 #750: detect system locale at startup
- βman(anvil.1): regenerate from clap_mangen + tail on every release (task #752)
- βi18n: wire 42 new locales into SUPPORTED_LANGUAGES
- βi18n: add 42 new locales (EU official + non-EU European + major world)
- βi18n(v2.2.19): wire top-10 slash command output through t!() (task #754)
- βrefactor(tui/clipboard): factor osc52_encode out of write_clipboard (#748)
- βfeat(tui/clipboard): copy/paste/select always work alongside mouse capture (#748)
- βi18n: translate 12 fallback locales for v2.2.19 TUI chrome (ru/ko/id/it/nb/nl/pl/pt-BR/sv/tr/uk/vi)
- βi18n: add TUI layout keys to 12 remaining locale YAMLs (English fallback)
- βi18n: wire TUI layouts (classic, vertical_split, three_pane, journal) through t!()
- βfeat(memory/L6): /reflect emits pattern recap + appends to daily summary (#735 RED)
- βfix(runtime/routines): switch proposal tests to tempfile to kill flake (#741)
- βfeat(release): wire step-gates into release.sh + Phase 6 SSH hardening (#730)
- βfeat(memory/L4): /memory show procedural consolidates goals + skills + cron (#734)
- βdocs(anvilhub): Apache flushpackets=on spec for SSE token stream (#740)
- βdocs(anvilhub): publisher-standing pre-check + ANVILHUB_BACKEND_URL (#738)
- βfix(memory/L3): /memory promote gains --target + nominated_at/source provenance (#733)
- βtest(memory/L2): regression tests for /memory prune episodic trash-bin (#732)
- βfix(memory/L2): wire /memory prune episodic dispatch arm (#732 follow-up)
- βfix(memory/L7): drop stray #732 episodic match arm referencing missing fn (#736 follow-up)
- βfix(memory/L7): file-cache path discovery + /memory show cache + dry-run prune (#736)
- βi18n(v2.2.19): wire Tier-2 NATIVE_NAMES rows in wizard + Configure picker (#710)
- βfeat(memory/L1): /memory layer 1 renders live working snapshot (#731)
- βfeat(prompt-section): iter_by_kind() extension method (#731 prep)
- βi18n(v2.2.19): Tier-2 finisher β nl/sv/nb/uk + SUPPORTED extend (#710)
- βdocs(v2.2.19): AnvilHub /build page spec + BuildClient component (#674 #675)
- βdocs(parity): file-path corrections appendix from implementing agents (#713)
- βdocs(memory): I.1 audit β 7-layer architecture status (#712)
- βi18n(v2.2.19): Tier-2 part 2 β id + pl + vi locales (#710)
- βfix(worktree): preserve original-CWD MCP config across EnterWorktree (#728)
- βi18n(v2.2.19): Tier-2 partial β it + ko + tr locales (#710 partial)
- βfix(branch): preserve session origin across EnterWorktree boundary (#724)
- βfeat(worktree): capture original_dir + original_sessions_dir at EnterWorktree (#728 prep)
- βfix(plugins/watcher): skip non-.md changes + exclude build dirs to prevent FD exhaustion (#726)
- βtest(security/mcp): regression tests for permissions.allow gate (#717 part 4)
- βfix(mcp): disk-bind unsupported image MIME types instead of aborting (#725)
- βfix(security/mcp): consult permissions.allow before prompter (#717 part 3)
- βfix(theme): don't reset theme on first /rename invocation (#727)
- βfix(security/mcp): parse permissions.allow into PermissionsConfig (#717 part 2)
- βfix(tools/read): fall back to text/image alternate path on mime-mismatch (#723)
- βfix(security/mcp): add PermissionAllowList matcher for permissions.allow (#717 part 1)
- βfix(tui): self-heal glyph corruption in long sessions via periodic full-redraw (#718)
- βfix(api): 15s timeout on side-channel calls to prevent 75s startup hang (#722)
- βfix(tui): spinner/elapsed-time wake independently of input events (#716)
- βfix(session): preserve model field on --resume (#721)
- βfix(skills): recursion guard for context:fork invocations (#720)
- βfix(mcp): pagination for tools/list + resources/list + prompts/list (#715)
- βfix(security/bash): enforce permission rules on bare env-var assignments (#719)
- βdocs(parity): CC v2.1.144-146 audit + 15 FILE-AS-TASK specs (#713)
- βfeat(i18n/A6): wizard language picker + Configure menu picker (#645)
- βdocs(v2.2.19): no-deferrals β fold all stretch items into hero arcs (#704)
- βfeat(i18n/A5): --lang CLI flag + boot-time set_locale + pt-BR in SUPPORTED + drift gate test (#645)
- βdocs(v2.2.19): master tracker + 6 supporting design docs (#704)
- βtest(ssh-webui): end-to-end integration tests for /ssh relay round-trip (#706 phase 3)
- βi18n(v2.2.19): translate Tier-1 locales (es, zh-CN, fr, pt-BR, ru, ja, de) from en.yml seed (#645)
- βfeat(/ssh webui phase 1): backend relay events + anvil-cli dispatch (#706)
- βi18n(v2.2.19): extract wizard + TUI core + cmd_static + cmd_ai strings β en.yml (#645)
- βrelease(scripts): add Phase 7 X announcement, renumber verify to Phase 9 (#659)
Web Viewer Parity + Mouse Capture Default-OFF + Autocompact Hardening:
- βAutocompact threshold now uses the context window (64Kβ200K+), not the output cap β sessions on long-context models run far longer before compaction (#697)
- βMouse capture default-OFF on all platforms β restores terminal copy-paste for users who hadn't opted in (#696 P4)
- β
/tab new/rename/switch+Ctrl+Tin TUI + relay; per-tab routing for concurrent sessions (#696) - βWeb viewer default layout = vertical_split + tabs, matching TUI default
- βRelay: default-allow forwarding, slash completion, cost_type chip, collapsible tool cards, MemorySnapshot broadcast
- βBracketed paste in textarea modals β multi-line paste works in
/mcp builderand wizard fields (#685) - βAlt-screen raw-mode restore fix β keyboard no longer stops working after inline-op cancel (#688)
- βMemorySnapshot uses layouts::common helpers for rail parity (#695)
- βPermissionPrompt end-to-end round-trip regression test (#677)
- βRelease pipeline Phase 6 hardened against
set -esilent-exit (#654)
Setup Wizard Rewrite, Autonomous Reflection, Sandbox Detonation, Source Viewer:
- βSetup wizard rewritten as a single continuous in-TUI alt-screen session β 9 modal steps from Welcome through to first prompt, no stdin prompts, no screen flicker (#642)
- βAutonomous reflection loop: StuckDetector catches ToolLoop / Thrashing / InferenceStall / Oscillation patterns and injects strategy-switch reminders before the next inference call (#636)
- β
anvil-sandbox-runnerbinary ships with every release β detonates hub packageinstallCmdin an OS sandbox and shows you the diff before anything touches your machine (#570) - βAnvilHub source viewer end-to-end: all 558 packages have synthesized source archives + GitHub-style file browser with Shiki syntax highlighting and IndexedDB cache (#528)
- βSkill-chain builder β
/builderReact Flow canvas +/my-chains+anvil://deep-link install;SKILL.mdextended withinputs:/outputs:slots (#529) - βTUI region-targeted partial repaints β DirtyRegions extended with per-area bits; photosensitivity gate preserved (no full-screen Clear without DirtyRegions::ALL) (#622/#629)
- βReactive compaction: providers detect context-overflow errors, compact to half remaining, and retry the same turn without losing user input (#564)
- β
HookEvent::Stopfires at end-of-turn when no tool_use; block decisions inject reason as synthetic user-text message (#566) - β
/rewindslash command with TUI picker and βSummarize up to hereβ force-compaction action (#557) - βRail keybinds wired (g/d/s/a/Ctrl+R) + drift test that asserts every advertised key has a handler (#634)
- βSession auto-titling:
derive_title_from_first_messagenow actually fires on first user message (#580) - βTests: runtime 1106, anvil-cli 717, commands 235, api 330 β all green. Slash-command spec count 119; rail-keybinds drift gate added.
- βrelease: Anvil v2.2.16
- βchore: drop stale .claude/worktrees agent dirs from index
- βrelease(v2.2.16): hand-written release notes
- βtest(v2.2.16): update layout_live_switch baselines for new default
- βprep(v2.2.16): bump version + flip default layout + wizard highlight
- βtui(classic): inline 7-layer MEMORY block above input (#607)
- βtui(paste): keystroke-burst detection for drag-and-drop (#604 Part C)
- βcli(cancel): wiremock integration test for Ctrl+C stream abort (#606)
- βcli(cancel): tokio::select! aborts blocking HTTP read on Ctrl+C (#605)
- βtui(paste): submit-time path detection + long-paste placeholder (#604)
- βruntime+cli(cancel): DefaultRuntimeClient honors set_cancel_token across all 7 providers
- βtui(vertical-split): close tool-call boxes, gate banner, style markdown, 2-decimal cost (#602)
- βruntime+tui(paste): first-class ContentBlock::Document for PDF + Office docs (#601)
- βtui(paste): consolidated handler + file-path detection, mouse capture OFF (#599)
- βfeat(runtime): prefer anvilhub /api/version, fall back to GitHub
- βdocs: clarify commit attribution for d219e18 / ccde10b
- βtui(vertical-split): commit #596 deliverables that the linter stripped from prior commit
- βtui(vertical-split): split-anchor rail, fold QMD into MEMORY, update banner (#596)
- βoauth: strict RFC 6749 token-exchange parser + startup validator (#595, BUG-14)
- βtui(vertical-split): rail owns all chrome, deck has input only (#594, BUG-13)
- βtui(vertical-split): rail sections β uppercase headers, cross-tab status aggregates, agent tab-binding (#588 polish)
- βtui(layouts): wizard + slugs + /layout --global + live preview page bumped to 8 variants (#588)
- βtui(three-pane): delete vim modal β always-on input, standard handler (#588, BUG-8)
- βtui(layouts): build real rail+deck vertical_split renderer matching mockup (#588)
- βtui(layouts): rename vertical_split renderer to classic + add TuiLayoutKind::Classic (#588)
- βtui(layouts): move layout from AnvilTui to Tab (per-tab layout state) (#588)
- βfix(model): async fetch_all_configured_models with timeout + Ctrl+C cancel (#BUG-7)
- βfix(tui): wire slash command completion popup into all 6 layouts (#BUG-6)
- βfix(tui): request redraw on every keystroke so input renders live across all layouts (#BUG-5)
- βfeat(tui): make three-pane Insert mode discoverable with framed hint + ghost input (#BUG-4)
- βfix(tui): three-pane uses Constraint::Fill for CONTEXT band (#BUG-4)
- βfix(oauth): poll background callback channel each frame so login completes without requiring a keypress
- βfix(journal): clear header/input rows before draw to prevent stale-cell ghosting and add bg_primary to header
- βfix(api): 5xx errors name configured provider/gateway, not hardcoded Anthropic URL (#568, CC-143-B)
- βfix(session): title heuristic skips bare URL as first message (#563, CC-142-B)
- βfix(tui): welcome banner names active provider, not hardcoded Anthropic (#562, CC-141-B)
- βfeat(mcp): ANVIL_MCP_TOOL_TIMEOUT env to override per-request fetch timeout (#559, CC-141-B)
- βfeat(tui): spinner color warm greenβamberβred on elapsed time (#558, CC-141-F)
- βfix(tools): Read offset accepts string forms with whitespace/+ prefix (#555, CC-140-B)
- βchore(docs): file task #579 β migrate wizard.rs prompts to in-TUI modal
- βfeat(tui): intercept /login and /provider login to open TUI modal (#578)
- βfeat(tui): wire ProviderLoginModal key handler and OAuth listener (#578)
- βfeat(tui): add ProviderLoginModal for in-TUI OAuth/API-key flows (#578)
- βfix(tui): clear terminal on /layout switch to drop stale cells (#bug-3)
- βfix(tui): force full repaint after inline OAuth/setup flows (#bug-2)
- βfix(vault): retry up to 3 times + pre-fill /vault unlock on failure (#bug-1)
- βtui(layouts): wire /layout command, set_layout(), intro toast + live-switch tests (v2.2.16 Step 3E)
- βtui(layouts): land Step 3 β layout renderers, dispatch, DirtyRegions widening (v2.2.16)
- βtui(layouts): land LayoutSnapshot extraction + golden baseline (v2.2.16 step 1)
- βtui(layouts): config schema + /layout slash command (8 axes) + wizard step (v2.2.16 step 2)
- βsecurity(oauth): lenient scopes deserializer prevents auth lockout (#565, CC-143-B)
- βv2.2.16: verification gate, /hub status (all 8 axes), /plugin update REVOKED guard
- βv2.2.16: HubPackage verified-badge structs + require_verified config (AnvilHub F3)
- βrelease: prepend ~/.cargo/bin to PATH (brew-Rust shadowing fix, #534)
- βdocs(v2.2.15): clear public README narrative β 35 providers, /cursor, /model
- βdocs(v2.2.15): clear public README narrative β 35 providers, /cursor, /model
- βrelease(v2.2.15): bump workspace + release notes
- βv2.2.15: /model handler β atomic cross-provider switch + ambiguous-name guard
- βv2.2.15: /model TAB completion β provider-prefixed unified list
- βv2.2.15: cross-provider unified model list (fetch_all_configured_models)
- βv2.2.15: /cursor handler β all 6 subcommands end-to-end
- βv2.2.15: /cursor spec registration with full subcommand tree
- βv2.2.15: SlashCommand::Cursor variant + 6 subcommand enum
- βRelease notes for v2.2.14
- βfix(bedrock): add crate_env_lock to three env-touching tests to prevent parallel flake
- βtest(bedrock): SigV4 compliance tests against Python-verified vectors
- βfeat(gemini-oauth): Google Code Assist OAuth provider replacing Antigravity OpenAI-compat stub
- βfeat(cursor): Cursor Cloud Agents provider β real API replacing broken OpenAI-compat stub
- βExpand provider catalog from 5 to 35 providers across the open-source ecosystem
- βPhase 6.5g: OTel events verified, ProviderRewriter Debug derive, cleanup
- βPhase 6.5b-f: /memory clean slash command + dispatch + integration tests
- βPhase 6.5a: MemoryRewriter trait + MockRewriter + RewriteResult schema
- βPhase 6.3 follow-up: --include-sessions fails loud on missing provider
- βPhase 6.3e: --include-sessions flag + integration tests
- βPhase 6.3b-d: sessions composer wiring + nominations subdir + OTel
- βPhase 6.3a: SessionSummarizer trait + MockSummarizer + SummarizedSession schema
- βPhase 6 follow-up: return real conflict_count from run_settings_import
- βPhase 6 integration: orchestrate all 5 pipelines in run_import_pipeline_headless
- βPhase 6.4c: full report generator + OTel event wiring
- βPhase 6.4a: wizard migration step + skip flag
- βPhase 6.1c: dispatch handler wiring + serial test isolation fixes
- βPhase 6.1b: instructions discovery + ANVIL.md merge semantics
- βPhase 6.1a: memory entry discovery + translation
- βPhase 6.2c: plugin manifest translation (with Phase 5.1 skills/agents fields)
- βPhase 6.2b: skills import (disabled by default, collision handling)
- βPhase 6.2a: settings.json schema translation + conflict staging
- βPhase 6.0: Migration foundation (ImportArtifact, manifest, staging machinery)
- βPhase 5.4g: Rewrite parallel-tab dispatch test to use Barrier
- βPhase 5.4f: Inherit SandboxConfig through subagent spawn
- βPhase 5.4e: serialize auto_tune cache-mutation tests to fix workspace race
- βPhase 5.4d: pin defect #11 resolution in fetch_ollama_models_for_cache doc
- βPhase 5.4a/b: HOOKS.md + SANDBOX-MODES.md research documentation
- βfeat(#8): wire CommandCacheManager into glob_search and grep_search
- βfeat(#9): wire CommandCacheManager into WebFetch/WebSearch (5-min/1-hr TTL)
- βfix(#514): serialize TRACEPARENT env tests to eliminate workspace-parallel race
- βfix(#4,#5): plugin manifest skills/agents fields + skill root discovery
- βPhase 5.2a/b/c: ResultBlock schema, 45-tool formatter, subcommand vocab consts
- βPhase 5.1a CC-BUG-3/4: Thread parent permission_mode into spawned subagents
- βPhase 5.3 #19: wire mcp_tool hook entries from settings.json (Stream B)
- βPhase 5.3 #21: propagate TRACEPARENT to plugin tool subprocesses
- βPhase 5.3 #16: document permission decision chain and pin order invariant
- βPhase 5.3 #15: extend Gate 3 sync-LLM lint with 4 new blocked patterns
- βPhase 5.1a #20 #22: TeamDelegate delegations in agents-live + parent_agent_id
- βPhase 5.1a #1: Wire EgressPolicy::is_allowed into web_ops + automation_ops
- βPhase 5.0.5: Unify slash command dispatch (4 sites β 1)
- βPhase 5.0: Bidirectional drift, menu-handler smoke, sync-LLM lint
- βFix Anvil OAuth Max-plan 429: missing claude-code beta header + identity preamble
- βWire DailyStore L2 episodic summaries into SystemPromptBuilder
- βWire egress allowlist into settings.json + /memory show policy view
- βSerialize all ANVIL_CONFIG_HOME-mutating tests via #[serial(anvil_config_home)]
- βdocs: overnight session summary for 2026-05-13
- βPhase 4.4 follow-up: update memory_show_nominations test for new banner phrasing
- βPhase 4.5: L1 β SYSTEM_PROMPT_DYNAMIC_BOUNDARY consumer for prompt-cache split
- βPhase 4.4: alias deprecations (file-cache, cmd-cache, history-archive, nominations)
- βPhase 4.3: L4 β /goal web_available audit (decision documented)
- βPhase 4.2: L7 β file-cache + cmd-cache size caps + LRU eviction
- βPhase 4.1: L2 β 90-day history retention with trash-bin + dry-run
- βPhase 3.7: L2 β fix /memory why daily-reconciliation help text
- βPhase 3.6: L5 β zero-injection integration test [SECURITY]
- βPhase 3.5: L7 β is_l5_path sentinel gates cache store/lookup [SECURITY]
- βPhase 3.4: L6 β PermissionEffect {Allow,Deny,Prompt} enum
- βPhase 3.3: L5 β wire classify_learning into nomination-emit (ANVIL_L5_AUTOROUTE) [SECURITY]
- βPhase 3.2: L3 β anvil-semantic QMD collection + nominated_from frontmatter
- βPhase 3.1: L3 β /memory promote writes ANVIL.md + atomic rename
- βPhase 2.8: spec + subcommand updates for /memory tier vocabulary
- βPhase 2.7: L7 β unified cache tier (file/cmd/qmd sub-views)
- βPhase 2.6: L6 β policy tier (grants + auto-deny + reviewer + egress)
- βPhase 2.5: L5 β identity tier (labels/keys + locked-state counts)
- βPhase 2.4: L4 β procedural tier (goals + skills + cron + routines stub)
- βPhase 2.3: L3 β semantic --pending recast (nominations alias)
- βPhase 2.2: L2 β episodic tier + daily sub-view
- βPhase 2.1: L1 β /memory why + show working introspects WorkingMemorySnapshot
- β/model picker reads live provider /models APIs, not static registry
- βFix /model switch to atomically swap routing + prompt identity + chrome
- βPopulate missing /cmd subcommand pickers + add drift-prevention test
- βFix /model autocomplete regression β live provider-aware completions
- βAdd missing /ollama spec + strengthen variant<->spec drift test
- βWire /file-cache and /cmd-cache slash commands to real handlers (#490, L7)
- βWire env::current_dir() into PermissionMemory load (#489 follow-up)
- βWire PermissionMemory into the permission gate (#489, L6)
- βUpdate remaining test fixtures for Vec<PromptSection> migration
- βFlip system_prompt storage to Vec<PromptSection> end-to-end (Phase C+D of #486)
- βSystemPromptBuilder::build() returns Vec<PromptSection> (Phase B of #486)
- βAdd PromptSection and WorkingMemorySnapshot types (Phase A of #486)
- βFix /changelog freezing the TUI
- βEmbed release notes into the binary
- βv2.2.14 Phase 1: retrieval-order block + 3 synthesis defect fixes + TUI placeholder
- βdocs(research): seven-layer memory architecture + v2.2.14 arc plan
- βrelease(v2.2.14): bump workspace + release notes + README catchup
- βv2.2.14 BUG-fix: tab-2 missing Thinking + lost prompt + Apple Terminal Enter
- βv2.2.14 BUG-fix-real: render arbitration + instrumentation
- βv2.2.14 BUG-fix: tab-2 input echo missing while tab-1 streams
- βv2.2.14 TUI-2 (deep): true per-tab non-blocking turn waits
- βchore: fix anvil-cli test-target build + cross-module env-var test race
- βv2.2.14 TUI-3: queue user messages typed while a turn is streaming
- βv2.2.14 CC-DRIFT bundle: B4 agent panic, B6 compact usage, B8 mcp test
- βv2.2.14 TUI-2: cut in-flight wait latency from 80ms to 20ms
- βv2.2.14 CC-DRIFT-B5: OTEL TRACEPARENT propagation
- βv2.2.14 TUI-1: Ctrl+C cancels mid-flight streaming
- βv2.2.14 #474: rewire /ollama slash commands (W4-merge regression)
- βdocs: record v2.2.14 audit verdicts for 4 VERIFY items
- βdocs: mark CC-136-F2 SHIPPED in parity table
- βv2.2.14 CC-136-F2: autoMode.hard_deny short-circuit (#465)
- βv2.2.14 CC-139-F1: cross-session agent view via anvil agents subcommand (#462)
- βv2.2.14 CC-139-F5: transcript view nav keys (?, {, }, v) (#460)
- βv2.2.14 CC-136-B6 SECURITY: ReadOnly cannot be bypassed by env or Edit (#467)
- βv2.2.14 CC-139-B5 SECURITY: safe wildcard match primitive for tool allow-rules (#469)
- βv2.2.14 CC-136-B5 VERIFY: --resume/--continue on underscore paths (#466)
- βv2.2.14 CC-139-F16: subagent OTel headers (#461)
- βv2.2.14 CC-139-F4: /plugin details <name> with inventory + token cost (#459)
- βv2.2.14 CC-139-F3: /scroll-speed slash command + live mouse-wheel tuning (#458)
- βv2.2.14 CC-139-F2: unify /goal β auto-link active session on /goal new (#457)
- βv2.2.14 CC-133-F1: worktree.baseRef setting + apply at worktree-create (#463)
- βv2.2.14 W15b: wire auto-promote engine into read/bash + main.rs install (#394)
- βv2.2.14 W11: wire file-fingerprint cache into read/write/edit + system prompt (#390)
- βv2.2.14: hook args[] exec form + continueOnBlock for PostToolUse (#453, #454)
- βv2.2.14 CC-132-F1/CC-133-F4/CC-139-F8: per-session env propagation
- βv2.2.14 CC-132-F2: ANVIL_DISABLE_ALTERNATE_SCREEN env opt-out
- β.anvil-release.toml: fix WP path + pm2 process name drift
- βFreeBSD x86_64 + NetBSD x86_64 binaries β first-ever BSD support. Every binary SHA256-verified and signed by the release pipeline; paired
.sha256manifests served atanvilhub.culpur.net/sha256/. - βWindows x86_64 is back. The v2.2.12 hold is fixed: ssh-agent auth is now
#[cfg(unix)]-gated with a clean Windows stub. The rest of the SSH driver (key-file, password, kbd-interactive) works on Windows exactly as on Unix. - βSeven platforms total β macOS ARM64, macOS Intel, Linux x86_64, Linux ARM64, Windows x86_64, FreeBSD x86_64, NetBSD x86_64.
- βRelease pipeline hardening. Removed the
| tail -1mask that hid the v2.2.12 Windows build failure. Build errors now hard-fail instead of silently producing partial releases. - βRoutines foundation on disk. New
crates/runtime/src/routines/module with schedule grammar (duration, interval, cron, ISO timestamp), output archive with[SILENT]early-stop, and SHA-256 input-hash packet schema. 63 new tests. v2.2.14 daemon ships on top. - βFreeBSD ARM64 and OpenBSD x86_64 are not in this release β the Rust toolchain does not publish a precompiled standard library for either target. Both are queued for v2.2.14.
- βv2.2.12: parallel inference, tool-call cards, SSH tabs, scrollback fix
- βv2.2.12 Bug3-C3: per-tab parallel inference via JoinHandle spawn
- βT5-Ssh-F: wire /ssh end-to-end + add integration test with in-process russh server
- βv2.2.12 T5-Ssh-E: modal SSH connection form overlay
- βv2.2.12 T5-Ssh-D: render vt100 SSH tab + forward keys + Ctrl+B escape
- βv2.2.12 T5-Ssh-D-checkpoint: SshTabState + async/sync bridge + key encoder
- βv2.2.12 T5-Ssh-C: vault HostCredential schema for SSH aliases
- βv2.2.12 T5-Ssh-B: russh driver + 4-method auth chain
- βv2.2.12 T5-Ssh-A: SlashCommand::Ssh β parser for embedded SSH client
- βv2.2.12 T4-O: hot-reload ANVIL.md / MEMORY.md when they change on disk
- βv2.2.12 T4-M: /doctor release β pre-flight self-check for the release pipeline
- βv2.2.12 T4-L: mark interrupted turns visibly when partial response preserved
- βfix(release): require RELEASE-NOTES-<TAG>.md or hard-fail; never ship empty body
- βv2.2.12 T4-K: auto-show diff summary after file-modifying turns
- βv2.2.12 T4-N: /clear wipes the TUI's visible state, adds --all for workspace
- βv2.2.12 T3-I: /fork uses Arc-shared snapshots when log unchanged
- βv2.2.12 T3-H/T3-Exit-UX/T3-J: session friendly names + resume-by-name + exit banner
- βv2.2.12 T1-#400: TUI accepts live typing while a turn is in flight
- βv2.2.12 T1-A/B/C/D: harden release pipeline against the v2.2.11 incidents
- βv2.2.12 T2-G: introduce RedrawScheduler for the TUI
- βfix(release): stop globally rewriting every version mention in public README
The release where the agent learned to know itself, the operator learned to shape it, and ten core surfaces landed in one cut.
- βrelease(v2.2.11): self-awareness β agent knows its own version, model, and provider in every turn
- βfeat(prompt): system prompt now references current Anvil version + loaded model + provider
- βW1 hook events: full catch-up with CC parity β PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, SessionEnd, PreCompact, Notification
- βW2 effort slider: /effort low|medium|high β tune reasoning depth per turn, persisted per session
- βW3 goal persistence: per-session goals survive /clear and reconnect, surfaced in status line
- βW4 named profiles: save and switch (provider, model, effort, output style) tuples by name
- βW5 published JSON schema: settings.json fully typed, IDE-completable, anvilhub.culpur.net/schema/settings.json
- βW6 OpenTelemetry events: OTEL_EXPORTER_OTLP_ENDPOINT support, permission_decision + tool_call + token_usage spans
- βW7 custom output styles: define your own /output-style names in settings, ship them as plugins
- βW8 reviewer-agent approval gate: optional second-agent review before file writes β configurable threshold
- βW9 anvil mcp-server mode: run Anvil itself as an MCP server β expose agents and tools to any MCP client
- βW10 requirements.toml admin policy floor: enforce minimum versions, required plugins, denied domains org-wide
- βfeat(skills): rename CLAUDE.md β ANVIL.md across user-facing strings + anvil-md-curator skill
- βfix(build): rerun build.rs when current branch ref changes (GIT_SHA stayed stale on rebuild)
- βfix(w3): goals slash command implementation, not stub β persistence, completion tracking, status line
- βfix(w1): hook events were declared but unwired; tests added covering all 7 event types end-to-end
- βfix(w6): OTel permission_decision span unwired; W5 schema tightening for required fields
- βrelease(v2.2.10): TUI usability patch β wrap, native-select, tool-result summaries
- βfix(tui): wrap long lines, restore native selection, give tool results meaning
- βfix(release): regenerate sha256 manifests every build + verify-before-release
- βfix(release): correct repo target on gh release calls
- βrelease(v2.2.9): wave 2 β OAuth paste-code, alwaysLoad MCP, plugin zip/URL + version bump
- βfeat(v2.2.9): CC parity catch-up v2.1.118 β v2.1.131
- βSee commit history for details
- βdocs(v2.2.8): release notes + rollback runbook
- βfix(cli): remove unused format_suggestions import; bump workspace to v2.2.8
- βfeat(v2.2.8): integrate F1 /agent compose + F3 skill-eval CLI + F5 loader forward-compat + F6 embed bundled plugins
- βfeat(config): add output_style axis β /output-style precise|condensed (v2.2.8)
- βfeat(skills): bundle terse skill β token-economy mode with Auto-Clarity
- βfeat(commands): trait-based agent composition engine (Anvil v2.2.8)
- βAdd three-arm skill evaluation harness (skill_evals module)
- βfeat(commands): add YAML front-matter trigger keywords to skill system
- βfeat(cli): /model warning + Ctrl+U/Ctrl+Y readline kill-yank + PAI survey
- βfix(agents): correct module path in Bug #83 Part B subagent inheritance test
- βfix(api): make HTTP request timeout configurable via ANVIL_API_TIMEOUT_MS (Bug #84)
- βtest(permissions,file_ops,agents): document DangerFullAccess stability invariants (Bug #83)
- βfix(api): add 5-minute dead-air timeout to OpenAI-compat stream (Bug #82)
- βfix(api): use max(Retry-After, backoff) on 429 retries (Bug #81)
- βfeat(sandbox): Claude-Code-style permission modes with on-the-fly switching
- βfeat(ollama): honor ANVIL_OLLAMA_NUM_CTX / ANVIL_CONTEXT_SIZE for context window
- βfix(runtime): don't fail turn when Ollama returns empty stream after tool result
- βdocs(readme): update for v2.2.8 β badges, Windows binary name, new commands
- βdocs: Anvil v2.2.8 release-complete report
- βrelease: Anvil v2.2.7
- βtest(runtime): fix parallel-test races for v2.2.7 release gate
- βfix(installer): close e2e test blockers B-1/B-2 + shell completion T9
- βfix(hub): use CARGO_PKG_VERSION for install-telemetry client string
- βsecurity: fix 3 pre-release blockers in v2.2.7 installers
- βdocs: add v2.2.7 release notes
- βfeat(setup): curated Ollama model menu with explicit per-model confirmation
- βfeat(installer): add cross-OS installers + anvil check/upgrade/uninstall for v2.2.7
- βfeat(tui): add in-TUI scrollback ring buffer + compile fix for share command
- βfix(cross-platform): replace Unix-only env lookups with portable alternatives
- βfix(ollama): add multi-format tool-call parser and fail-loud warnings
Web Config, AnvilHub Installer, Deep Autocomplete β full browser parity with TUI:
- β17 web config panels: providers, vault, notifications, SSH, Docker/K8s, memory, and more
- βFull Status Line editor in browser: 36 widgets, 16 presets, drag-and-drop, live preview
- βAnvilHub installer: search, install, restart prompt β vault-gated, telemetry-tracked
- βDeep hierarchical autocomplete: /vault store <Tab> β 21 credential types
- β8 previously-broken TUI handlers now working: /mcp, /plugins, /session, /daily, and more
- βNew commands: /tab, /fork, /share, /audit, /restart
- βSelf-respawn on macOS/Linux after plugin installs
Intelligent Memory System β 6-tier architecture, self-improving knowledge base:
- βSensitivity classifier: auto-routes credentials to vault, infra to encrypted memory
- βKnowledge nominations: AI discovers patterns, users review and promote to CLAUDE.md
- βPrivate project memory: AES-256-GCM encrypted infrastructure details
- βDaily summaries: auto-generated task reconciliation, flags forgotten items
- β558 AnvilHub packages: 512 skills across 30 categories
Security Hardening + Optimization β 17 audit findings fixed, zero warnings:
- βConstant-time HMAC verification, plugin command injection prevention
- βPath traversal protection, cryptographic session IDs
- β110 functions made const fn, redundant clones eliminated
- βmain.rs modularized into 3 focused modules
- βRC widget: live client count with connect/disconnect signals
- βZero compiler warnings, 428 tests, 0 failures
Six Major Features β interactive editor, productivity, MCP, history, plugins, agents:
- βInteractive Status Line Editor β full TUI editor with 6 sub-screens + WebUI drag-and-drop visual editor
- β37 widgets, 16 presets (8 emoji-rich themes), per-widget category colors
- βCode Productivity Dashboard β live git diff tracking,
/productivitycommand - βMCP Server Manager β
/mcpcommand, live McpStatus widget - βSession History Browser β
/history-archive statswith model breakdown - βPlugin System UI β web viewer management panel with config toggles
- βAgent Panel Expansion β web viewer agent management buttons
Customizable Widget-Based Status Line β 8 presets for different workflows:
- βWidget-based status line system β 28 widget types, dynamic rendering
- β8 presets: default, minimal, developer, token-heavy, git-heavy, compact, cost-focused, streamer
- β
/configure statuslinecommand with full tab completion - βWeb viewer config panel gains Status Line preset selector
- βDynamic footer height β 2-line presets maximize content area
URL rendering fix, context-aware vault, CI/CD automation:
- βURL rendering fix β terminal hyperlinks render correctly across all providers
- βContext-aware vault β vault auto-selects credentials based on active project context
- βCI/CD automation β
/cicdcommand scaffolds pipelines for GitHub Actions and GitLab CI
Typed Credential Vault β the vault is now the single source of truth for ALL sensitive data:
- βTyped credential entries β
name,type,value,tags,created_at,rotated_at - βVault covers API keys, SSH keys, TLS certs, tokens, and environment secrets in one place
- β
/vault addβ interactive typed credential entry with category selection - β
/vault rotateβ rotate any credential in-place, preserving audit history - β
/vault exportβ encrypted vault export for backup and migration - β
/vault injectβ load vault secrets into shell env for any subprocess - βAudit trail v2 β every vault access logged with timestamp, operation, and credential type
Browser configuration panel, Gemini provider, slash command execution in web viewer:
- βBrowser-based visual configuration panel
- βGoogle Gemini as 5th provider
- βSlash commands execute from web viewer
- β30+ commands with subcommand completions
Focus view, context warnings, stalled stream recovery β 6 improvements:
- βEdition 2024 mode β optimized session defaults and provider routing for 2024-era models
- βFocus view β
/focushides sidebars and agent panels for distraction-free single-pane mode - βContext-low warning β proactive alert before auto-compaction fires when context nears capacity
- βStalled stream handling β detects and recovers from stuck token streams without losing the response
- βWebFetch cleanup β improved HTML-to-text extraction, strips nav, footer, and cookie banners automatically
- β
/loopand/proactiveβ new slash commands for recurring prompt loops and proactive agent nudges
Credential scanner, egress control, conversation branching β 16 new features:
- βCredential auto-detection β scans env vars, dotfiles, SSH keys, TLS certs, auto-vaults provider keys
- βNetwork egress control β configurable domain allowlist, default: AI provider APIs only
- βSigned session transcripts β HMAC-SHA256 audit trail in
~/.anvil/audit/ - βConversation branching β
/forkto snapshot and branch conversations - βMarkdown session export β
/export mdwith code blocks and token summary - βClickable URLs β OSC 8 hyperlinks in system messages
- βRemote control browser auto-open β
/remote-controllaunches browser automatically - βExpanded cost tracking β OpenAI, xAI, Ollama pricing alongside Anthropic
- βInline image rendering β iTerm2/Kitty graphics protocol support
- βSmart context compaction β preserves 6 recent messages, code blocks, file paths
- βTool output redaction logging β secrets redacted and logged to audit trail
- βSSH key and TLS certificate vault storage β
/vault sshand/vault certs
8 commits: 827d941..fb33055
Live streaming, remote control, and thinking mode:
- βLive streaming responses β real-time token-by-token rendering in the TUI
- βRemote control β type
/remote-controlto share your session via browser WebSocket - βWeb viewer at
passage.culpur.net/viewerfor real-time session observation - βThinking mode β visible reasoning indicator with
/thinktoggle - βBackground turn execution β TUI stays responsive during API calls via scoped threads
- βWebSocket relay infrastructure β secure pairing with 6-digit codes, multi-client support
- βCross-platform release pipeline β automated builds for macOS, Linux, and Windows
5 commits: 30bf569..2108c93
Security-first release β encrypted vault, file sandbox, modular architecture:
- βAES-256-GCM encrypted credential vault with Argon2id KDF β all API keys encrypted at rest
- βSetup wizard vault password step β credentials encrypted before touching disk
- βSession-based vault unlock β one password prompt per session, KEK zeroed on exit
- βAutomatic migration from plaintext credentials.json to encrypted vault
- βFile write sandbox β writes blocked outside project root (PermissionDenied)
- βProject root detection via .git, Cargo.toml, package.json markers
- βNative Ollama
/api/chatwith NDJSON streaming andthink: true/false - βMulti-line input β footer expands 1-5 lines dynamically with word-wrap
- βCtrl+C clear input / double-tap exit (CC parity)
- βCodebase modularized β main.rs 15,756 β 4,770 lines, 134 module files
- βContent filter: modern OpenAI key formats (sk-proj-*, sk-svcacct-*)
- βClippy warnings: 470 β 0, strict compilation mode
- β394 tests passing, zero unsafe code
11 commits: aeeeff2..4bb283f
Full CC 2.1.94 parity β 3 commits:
- βPermission memory β persistent tool approval decisions per project
- βContent filtering / prompt injection defense
- βConfigurable keybindings via ~/.anvil/keybindings.json
- βAgent SendMessage / Continue for multi-turn agent conversations
- βWorktree isolation for agents β git worktree per agent
- β
/fastmode toggle β lower token budget for quick responses - βRich slash command help with examples
- βClipboard image paste support
- βBackground agent desktop notifications
- β
/review-prβ AI-powered pull request review - βFirst-run setup wizard with 5-step provider configuration
3 commits: dc1d81a..6ce5d4d