Skip to content

Releases: fuseraft/anchor

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 05:00
v0.10.0
6c6f3b9

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 /model from another provider to Claude, the other model's reasoning is left out of Claude's requests, which the API would otherwise refuse.
  • anchor setup keeps your effort when it replaces the rest of the provider section.
  • --json: the ready event has an effort field.

Upgrade

brew upgrade anchor                                                 # Homebrew
scoop update anchor                                                 # Scoop
curl -fsSL https://raw.githubusercontent.com/fuseraft/anchor/main/install.sh | bash   # install script

Docs: Reasoning effort · Thinking · /effort · OpenRouter and other named providers

Full Changelog: v0.9.0...v0.10.0

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 03:48
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:

  • text sets 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.
  • codeblock shades code blocks in replies to the edge of the screen.
  • selection colors 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 text color. 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 script

Docs: Making a theme · theme and colors

Full Changelog: v0.8.6...v0.9.0

v0.8.6

Choose a tag to compare

@github-actions github-actions released this 12 Oct 00:23
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 restart for 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, /setup and the update check each had their own.
  • 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

Choose a tag to compare

@github-actions github-actions released this 11 Oct 06:00
v0.8.5
6a1d0b5

What's Changed

  • feat(tui): /dock moves the prompt to the top or bottom of the screen by @fuseraft in #11
    • /dock top puts the status line and prompt at the top of the screen, with the conversation under them and command suggestions opening below the prompt. /dock bottom puts them back, and /dock lists both with the current one marked.
    • The switch lasts for the session. "dock": "top" in config.json keeps it; an unknown value is reported at startup and the bottom is used.
    • Only the full screen has a prompt to move; in --plain, /dock says so.
  • docs: /dock and the dock config key in the commands and config reference and the REPL guide

Full Changelog: v0.8.4...v0.8.5

v0.8.4

Choose a tag to compare

@github-actions github-actions released this 11 Oct 01:33
v0.8.4
af873a2

What's Changed

  • Make skills frictionless, and follow symlinks in read-only checks by @fuseraft in #9
    • cd no longer needs its own approval: it doesn't count as a program for always/--allow, and cd into a folder inside the directory counts as read-only. A skill script run as cd scripts && bash x.sh now needs only bash approved.
    • Read-only checks now resolve relative arguments through symlinks, so cat docs/x asks first when docs links outside the directory. When the workspace has symlinks that lead outside, a command that could pass through one (after cd, through a glob, or with a flag that follows links while recursing) asks first.
    • In -p mode, 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 /clear resets 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

Choose a tag to compare

@github-actions github-actions released this 10 Oct 07:04
v0.8.3
99a96d9

What's Changed

  • fix: don't crash when the session file is held open by another process; show /compact progress 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.
    • /compact and 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 new compacting event.
  • 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

Choose a tag to compare

@github-actions github-actions released this 10 Oct 04:51
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

Choose a tag to compare

@github-actions github-actions released this 10 Oct 04:09
v0.8.1

What's Changed

  • Fix Windows shell quoting and run Git's bash on Windows by @fuseraft in #2
  • Mark 0.8.1 as the current release by @fuseraft in #3

New Contributors

Full Changelog: v0.8.0...v0.8.1

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 01:05
v0.8.0
13eb461

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_file on 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. /clear and --resume start 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.
  • /undo restores 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 an error event and then ready, so a client is never left waiting. The event carries a one-line message rather than a stack trace.

Fixed

  • git ls-files could 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 .env value 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 script

Docs: Tools · Safety and approvals

Full Changelog: v0.7.0...v0.8.0

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 09 Oct 06:59
v0.7.0
3f445f2

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.
  • /help lists 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 script

Docs: Using the REPL

Full Changelog: v0.6.0...v0.7.0