Repository navigation
Releases: fuseraft/anchor
Release list
v0.10.0
anchor 0.10.0 is about how hard the model thinks, and what it thinks: set a reasoning effort once or per session, and watch the thinking stream in as the model works.
New
Reasoning effort. Set "effort" under provider in the config, pass --effort for one run, or type /effort to change it for the rest of a session. The levels are none, low, medium, high and xhigh, and /effort default leaves it to the model again. Each provider gets the parameter it takes. Claude gets adaptive thinking with the level as its effort, so the model decides how much to think, up to that level. OpenAI-compatible servers get reasoning_effort. The effort carries over /model, applies to sub-agents, and shows next to the model in the status line.
The model's thinking, as it streams. While the model thinks, the latest few lines show dimmed under a ∴. When it moves on to a tool call or its answer, they fold into one line, such as ∴ thought · 214 words · Ctrl+O, and Ctrl+O shows the whole of it. Claude's thinking is shown as the summary the API sends. grok's comes as it thinks, more at a higher effort and on harder tasks. --plain and -p show only the folded line, and --json sends thinking events.
Thinking in resumed sessions. --resume shows each replayed turn's thinking folded the same way, and Ctrl+O opens it.
Changed
- More room for Claude to think. With an effort set, Claude's output cap goes from 16,000 to 64,000 tokens, since thinking counts against it.
- Thinking survives tool calls and
--resume. Claude's signed thinking stays in the history and the session log, and goes back to the API exactly as it came. - Switching providers mid-session is safe with thinking. After
/modelfrom another provider to Claude, the other model's reasoning is left out of Claude's requests, which the API would otherwise refuse. anchor setupkeeps your effort when it replaces the rest of theprovidersection.--json: thereadyevent has aneffortfield.
Upgrade
brew upgrade anchor # Homebrew
scoop update anchor # Scoop
curl -fsSL https://raw.githubusercontent.com/fuseraft/anchor/main/install.sh | bash # install scriptDocs: Reasoning effort · Thinking · /effort · OpenRouter and other named providers
Full Changelog: v0.9.0...v0.10.0
v0.9.0
anchor 0.9.0 is about color: write your own themes, in any color your terminal can show, and share them as one small file.
New
Theme files. Put a JSON file in ~/.anchor/themes/ and its name works anywhere a built-in theme does: /theme ember, --theme ember, the setup wizard, or "theme": "ember" in the config. A file can start from a built-in theme with base, so it only lists what it changes. If part of a file can't be read, anchor says which file and what's wrong, and uses the rest.
Palettes. Name your colors once ("ember": "#ff6a1f") and use the names in every role ("accent": "bold ember"), so you can retune a theme in one place.
Hex and 256-colors. A color can be a hex color (#ff6a1f, or #f62) or a 256-color number (208), in theme files and in the config's colors. On a terminal that doesn't show 24-bit color, each hex color is drawn as the closest 256-color. anchor reads COLORTERM, and recognizes Windows Terminal, mintty, iTerm2, WezTerm, VS Code, Ghostty, kitty and Alacritty. If your terminal shows 24-bit color but anchor doesn't recognize it, set COLORTERM=truecolor.
Backgrounds. on makes the color after it a background, for any role: "code": "sand on #2a201b". Three new roles go further:
textsets plain text and paints the whole full screen:"#eadfd4 on #1c1512"puts light text on charcoal, so a theme looks the same whatever your terminal's colors are.codeblockshades code blocks in replies to the edge of the screen.selectioncolors the chosen suggestion and search matches.
text and codeblock show in the full-screen REPL only. Nothing changes your terminal's own settings, so everything goes back to normal when anchor exits.
/theme shows each theme's colors. Each name is drawn in its theme's accent, followed by a dot in each of its main colors. /theme reads theme files again each time, so you can edit a file and run /theme <name> to see the change without restarting.
/theme save <name> writes the current colors to ~/.anchor/themes/<name>.json as a starting point to change or share. It never overwrites a file that's already there.
A rust theme. Warm oranges and rust reds around your terminal's white text, for dark backgrounds.
Sample themes. The themes folder has six to use or start from: ember, tide, forest, neon and phosphor (256-colors only) with dark backgrounds, and paper with a light one. Each paints its own background, code block shade and selection. To use one, copy its file into ~/.anchor/themes/.
Changed
- In the full screen, text with no color of its own takes the theme's
textcolor. With the built-in themes, which don't set one, it's still the terminal's own.
All of this came in #15.
Upgrade
brew upgrade anchor # Homebrew
scoop update anchor # Scoop
curl -fsSL https://raw.githubusercontent.com/fuseraft/anchor/main/install.sh | bash # install scriptDocs: Making a theme · theme and colors
Full Changelog: v0.8.6...v0.9.0
v0.8.6
What's Changed
- Status-line update marker, robust self-update, and shared connection pools by @fuseraft in #14
- Once a new release has downloaded, the status line shows
↑ <version> on restartfor the rest of the session, so the one-time notice isn't the only sign that an update is waiting. - A downloaded release must start and report its version before it's kept, and again before it replaces the running one, so a release that can't run on this machine, or a download damaged on disk, never takes over a start. A damaged download used to crash the next start.
- Several anchor starts at the same moment no longer lose an update: one start's cleanup could delete the folder another had just claimed the update into, which crashed that start.
- Each session downloads into its own folder, so two sessions downloading at once never write the same file.
- On Windows, an update works while a session from the previous update is still running, and an install reached through a symbolic link has its file replaced instead of the link.
- Every HTTP client shares one connection pool for the process. MCP servers over HTTP made a new pool on every connect and reconnect, and setup,
/setupand the update check each had their own.
- Once a new release has downloaded, the status line shows
- test: the session-log retry test no longer races a timer, so it doesn't fail at random on Windows CI, and headless tests wait up to 10 seconds for events
Full Changelog: v0.8.5...v0.8.6
v0.8.5
What's Changed
- feat(tui): /dock moves the prompt to the top or bottom of the screen by @fuseraft in #11
/dock topputs the status line and prompt at the top of the screen, with the conversation under them and command suggestions opening below the prompt./dock bottomputs them back, and/docklists both with the current one marked.- The switch lasts for the session.
"dock": "top"inconfig.jsonkeeps it; an unknown value is reported at startup and the bottom is used. - Only the full screen has a prompt to move; in
--plain,/docksays so.
- docs:
/dockand thedockconfig key in the commands and config reference and the REPL guide
Full Changelog: v0.8.4...v0.8.5
v0.8.4
What's Changed
- Make skills frictionless, and follow symlinks in read-only checks by @fuseraft in #9
cdno longer needs its own approval: it doesn't count as a program for always/--allow, andcdinto a folder inside the directory counts as read-only. A skill script run ascd scripts && bash x.shnow needs onlybashapproved.- Read-only checks now resolve relative arguments through symlinks, so
cat docs/xasks first whendocslinks outside the directory. When the workspace has symlinks that lead outside, a command that could pass through one (aftercd, through a glob, or with a flag that follows links while recursing) asks first. - In
-pmode, a refused action is reported to the model as refused in a non-interactive run, not as declined by the user, so the model reports what it couldn't do.
- fix(repl): the context percentage in the status line updates after each model reply instead of staying frozen through tool calls, and
/clearresets it (105de39) - Split Repl and Tui by concern, and give each area its own line budget by @fuseraft in #10
- docs: the screenshot shows the anchor before model messages (31d18ab)
Full Changelog: v0.8.3...v0.8.4
v0.8.3
What's Changed
- fix: don't crash when the session file is held open by another process; show
/compactprogress by @fuseraft in #8- Session saves retry briefly, session reads no longer block writers, and a save that still fails shows a warning instead of crashing. Nothing is lost: the next save writes what was missed. Fixes #7.
/compactand automatic compaction show a⟳ compacting older turns…line that the result replaces, and the status line shows a spinner during/compact. JSON mode sends a newcompactingevent.
- feat(tui): each model message starts with
⚓︎, so the model's text is easy to tell apart from tool calls and status lines (65c7efc) - feat(prompt): updates between tool calls stay short and don't repeat what was already said in the turn (ce09406)
- docs: CI, release and license badges in the README (03a49a1)
Full Changelog: v0.8.2...v0.8.3
v0.8.2
What's Changed
- feat: anchor updates itself by @fuseraft in #4
- fix(edit): tolerate whitespace differences around lines in edit_file by @fuseraft in #5
Full Changelog: v0.8.1...v0.8.2
v0.8.1
v0.8.0
anchor 0.8.0 is about editing files safely: your own edits are never overwritten, each model edits in the format it was trained on, and a bug leaves a report you can send instead of a stack trace on your screen.
New
Your edits are never overwritten. If you change a file while anchor's diff is waiting for your answer, anchor no longer writes over your change. An edit_file replacement is made in your version of the file, as long as the text it replaces is still there exactly once. Any other change isn't written, and the model is told to read the file again.
apply_patch for OpenAI's models. GPT, Codex, the o-series and gpt-oss models now edit files with apply_patch, the format they're trained on. One patch can add, update, delete and move several files, and you see one diff and answer once. Every other model keeps write_file and edit_file. anchor picks the format from the model on every request, so /model and sub-agents with their own model follow it.
Several changes in one edit_file call. edit_file takes edits, a list of replacements made in order. You see one diff and answer once, and either every replacement is made or none is.
Crash logs. When anchor hits a bug, it says so in one line and writes the details to ~/.anchor/logs/crash-*.log. Only you can read the file, and the newest 10 are kept. Please attach it if you report the problem. Set ANCHOR_DEBUG=1 to see the stack trace on the terminal too. A rejected key, a rate limit or a provider that's down is reported as before, not recorded.
Changed
- Replacing a whole file needs a read first.
write_fileon an existing file now asks the model to read it first, or to read it again if it changed since. The model can't drop lines it never saw./clearand--resumestart with nothing read. - Writes are atomic. Each file is written to a temporary file and renamed over the original, so a failed write never leaves half a file. Files keep their encoding, byte-order mark and permissions. New files are UTF-8 without a byte-order mark.
/undorestores deleted and moved files, and puts back each file's original encoding.- Long command output is capped as it arrives. A command that prints without end keeps its first and last lines and says how much it left out, instead of filling memory until it times out.
--json: a turn that fails sends anerrorevent and thenready, so a client is never left waiting. The event carries a one-line message rather than a stack trace.
Fixed
git ls-filescould hang anchor when git printed a lot of warnings.- Looking up a saved API key blocked other sub-agents while the keychain answered.
- Each model client opened its own connection pool. They now share one.
- On a plain terminal, an approval prompt could be split by a sub-agent's output.
- Secret masking re-read every secret file for each tool result. It now re-reads a file only when it changes, so an edited
.envvalue is still masked straight away.
Upgrade
brew upgrade anchor # Homebrew
scoop update anchor # Scoop
curl -fsSL https://raw.githubusercontent.com/fuseraft/anchor/main/install.sh | bash # install scriptDocs: Tools · Safety and approvals
Full Changelog: v0.7.0...v0.8.0
v0.7.0
anchor 0.7.0 is about working in the full-screen terminal UI: pointing the model at files, seeing everything a tool did, getting text back out, and finding your way around a long session.
New
Attach files with @path. Mention a file or directory in a message, such as why does @src/parser.py reject @tests/bad.json?, and anchor hands its contents to the model with the message, so the model doesn't spend a step reading it. Files are read through the same gate as the model's own reads, so a secret file like .env is never attached. As you type after @, anchor suggests paths: the next level down from what you've typed, then files anywhere whose name starts with it. Ignored and secret files aren't suggested. Attachments also work in --plain, but not in -p.
See a tool's whole output with Ctrl+O. The conversation shows one line per tool call and at most 80 lines of a diff. Ctrl+O opens the latest tool result or approval diff in full, in place of the conversation. ←/→ step through the last 100, sub-agents included. It works while an approval is waiting, so you can read a long diff before you answer.
/copy a reply. /copy copies the last reply as the Markdown the model wrote. /copy code copies a code block from it, and lets you pick when there are several. It uses OSC 52, which works over SSH, and on your own machine also wl-copy, xclip, xsel, pbcopy or clip.exe.
Search. Ctrl+F finds text in the conversation and highlights every match; Enter steps back to older matches. Ctrl+R searches the messages you've sent and puts the chosen one back in the prompt. Ctrl+Home jumps to the top of the conversation.
Completion for command arguments. Suggestions now cover what commands take, such as /theme mono or /mcp login <server>, and every suggestion shows what it does.
A turn timer. The status line shows how long the running turn has taken: ⠼ working 1m12s.
The bell. If you haven't pressed a key or scrolled for 10 seconds, anchor rings the terminal bell when a turn ends or a question is waiting. Your terminal decides whether that's a sound, a flash or a mark on the tab. Set "bell": false in ~/.anchor/config.json to turn it off.
Changed
- Suggestions have their own list, above the prompt, in place of the editor's popup, which got clipped at the bottom of the screen. ↑/↓ choose, Tab or Enter takes the highlighted suggestion, and Esc hides the list. While the list is showing, Enter completes rather than sends; press Esc first to send what you typed as it is.
/helplists the new keys and@<path>.
Notes
- tmux: OSC 52 copying needs
set -g set-clipboard on. - Editing the draft in
$EDITOR(Ctrl+G) isn't in this release: Terminal.Gui has no public way to step aside for another program yet.
Upgrade
brew upgrade anchor # Homebrew
scoop update anchor # Scoop
curl -fsSL https://raw.githubusercontent.com/fuseraft/anchor/main/install.sh | bash # install scriptDocs: Using the REPL
Full Changelog: v0.6.0...v0.7.0