Changelog¶
0.9.11 - 2026-07-19¶
Fixed¶
Discover
auto_connectMCP servers in the background at startup, so an unreachable server no longer holds up the prompt for the discovery timeout.
Removed¶
Remove the undocumented
runtime.max_stepsconfiguration alias; setruntime.max_agent_stepsinstead.
0.9.10 - 2026-07-18¶
Added¶
Add
g/Gjumps to the top/bottom in the/diffviewer and interactive selectors, matching thelesspager convention.Add an interactive
/mcpconnection manager and per-serverauto_connectconfiguration for explicit startup connections.
Changed¶
Replace the in-flight model retry keybinding with
/resendin the running follow-up input, and show a/resendhint during long requests.Open the current input in
$VISUAL/$EDITORwithCtrl-X Ctrl-EorCtrl-G; a loneCtrl-Xno longer opens the editor.Make
Ctrl-Pmirror the Up arrow when recalling the latest queued message for editing.Connect MCP servers on demand through targeted mentions or
/mcp connect NAME, keeping disconnected servers entirely out of model context. Connecting handles OAuth authorization when required; disconnecting unloads the server and clears its saved OAuth authentication.Let
/mcp connectaccept multiple server names, connect them concurrently, and complete each successive server argument.Align
/mcpstatus columns and add compact connection-state markers for faster scanning.Render multi-server connection results as a compact vertical list instead of one wrapped paragraph.
Color a consistent solid-circle MCP status marker green when connected, yellow when disconnected, red on error, and dim when skipped.
Show the number of connected MCP servers in the
/statuscontext row.Make each selection in
/mcptoggle that server in place, showing connection progress without closing the selector, and limit/mcp toolslistings and completion to connected servers.
Removed¶
Remove the unreachable non-TUI
Ctrl-\model-request retry; interactive retries use/resend, while transient errors still retry automatically.Remove
/debugcache-prefix diagnostics and persisted prefix fingerprints; prompt caching and/statuscache-hit metrics remain unchanged.Remove startup tips and the built-in
nanocode-helpskill;/helpand project/user skills remain available.Remove the
--mcpper-run selector and per-serverenabledbehavior; comment out unwanted server sections instead. Legacyenabledkeys are ignored.
Fixed¶
Retry OpenAI and Anthropic connection/timeout failures, retryable client statuses, and every provider
5xxresponse.Bound MCP calls by timeout, recreate failed async loops, and close the MCP loop safely during shutdown.
Keep concurrent MCP discovery status accurate, serialize OAuth authorization in the manager, and expose resource-only servers through
@servermentions.Let explicit OAuth MCP connections validate cached credentials and reauthorize interactively when the server rejects them.
Treat redirects to paths that merely start with
/dev/nullas writes requiring confirmation; only the exact device remains auto-approved.Prevent the plain CLI Bash live preview from accessing a nonexistent command-loop reference.
0.9.9 - 2026-07-16¶
Added¶
Show a one-line notice at startup when a newer version is available on PyPI, pointing to
uv tool upgrade nanocode-cli. The update check stays cached and rate-limited to once per 24h, and never blocks startup.
Fixed¶
README pointed at a
nanocode upgradecommand that no longer exists; the upgrade instructions now useuv tool upgrade nanocode-cli.
0.9.8 - 2026-07-16¶
Added¶
Ctrl-Xat the input prompt opens the current input in$VISUAL/$EDITOR(falling back to vim) and loads the edited text back; a non-zero exit or a failed launch leaves the input untouched.
0.9.7 - 2026-07-16¶
Added¶
Resume this project’s latest session with
-c(also--last,--latest), matched by working directory. Mutually exclusive with--resume, which still takes a UID or resolves the most recent session across all projects.
Changed¶
Rebuild the interactive REPL around a single persistent prompt-toolkit application: live activity, input, approval prompts, selectors, the
/diffviewer, and the status bar now share one app, while completed output prints above it into native terminal scrollback.Define
Ctrl-Cuniformly across that app: cancel an approval prompt, clear the current input at an idle prompt, or interrupt a running turn. Exit stays onCtrl-Dat an empty prompt and/exit.
0.9.6 - 2026-07-14¶
Changed¶
Revert unified diff background fill: the live
/diffviewer spans the pane width, while scrollback output keeps its natural width.
0.9.5 - 2026-07-14¶
Changed¶
Disable Rich Markdown hyperlinks so OSC 8 terminal escape sequences don’t leak as visible text.
Strip Markdown link URLs from assistant output for cleaner scrollback; revert and re-apply with narrower scope.
Defensively strip unknown terminal escapes from assistant output and add a tip about hyperlink behavior.
Update the system prompt to note that Markdown links won’t render as hyperlinks in this terminal.
Fixed¶
Prevent OSC 8 payload from leaking as visible text in assistant Markdown output.
0.9.4 - 2026-07-14¶
Added¶
Auto-promote long-running Bash commands to background jobs after a configurable timeout.
Changed¶
Show sub-second precision in the Bash live-preview
running…label.Color the
·Nbatch counter gray viaLogLine.metainstead of syntax-highlighted arguments.Pad diff backgrounds to pane width everywhere for solid Edit previews and a full-width live
/diffviewer.Add breathing room to queued-message flushes so they match interactive echo spacing.
Fixed¶
Size diff background bands to the width after the outer log prefix so indented diffs render cleanly.
Preserve background-colored padding when stripping Rich’s line-fill whitespace on pane resize.
0.9.3 - 2026-07-13¶
Changed¶
Unify the live input prompt prefix to
>and historical/queued user message prefix to•, extracting both asUiPrinterconstants.Add a
Theme.user.logcolor key with a muted desert-orange palette and resolve it throughUiPrinter.user_log_style().Render resumed user messages with a
•prefix and theme-aware orange text, add a blank line above each user message, and drop theuser:role label.Render resumed assistant messages without a role label or prefix.
Keep nanocode’s interactive theme active when the parent environment exports
NO_COLOR; redirected and headless output remains plain.Add a separate
replay_prefixtoread_inputso the main user message is echoed with•while the live prompt stays>.Drop the gray
inflightstyling from queued follow-up messages so they keep a consistent user color while pending.Update the system prompt to first acknowledge or briefly answer follow-ups before carrying out the request.
0.9.2 - 2026-07-13¶
Added¶
Add
/diff, a read-only viewer for edits made by nanocode. It shows the latest user round and the overall net session diff inLatestandSessiontabs, supports keyboard navigation and paging, and persists edit snapshots across--resume.Add a standalone animated progress row for manual
/compactoperations while keeping the normal status line visible.Show a bounded Bash stdout/stderr preview in finished tool summaries when no live preview was already kept visible.
Add light-terminal theme support with automatic
COLORFGBGdetection and aruntime.themeoverride.
Changed¶
Use recursive internal layout boxes for turn hierarchy both live and after resume: user and final-assistant messages stay at column zero, intermediate-assistant messages and tool calls use two spaces, and tool details use four. Restored role labels share their message indentation, with a blank separator between turns.
Add two-level hierarchy to CLI tool logs: indented tool calls are root events, approvals/output/errors/stored results use dim tree guides, Bash commands use a background-neutral GitHub Dark syntax palette, commands are shown once, compact tools remain single-line leaves, and flushed follow-ups use a
nano+prompt.Replace the
--debug/runtime.debugmode and/debug on|offtoggle with an always-on, read-only/debugreport. It keeps only the latest three cache-prefix mismatch records in memory, including changed region hashes and sizes, without retaining raw prompt content.Replace blank Enter as the queued-input send-now shortcut with Ctrl-C. Enter queues a follow-up for the next model request; when follow-ups are queued, Ctrl-C interrupts the active request so they can be sent immediately. Queue guidance now appears as a contextual
+>placeholder and disappears while typing.Remove the synthesized FILE STATE context projection.
ReadandEditoutputs now remain as bounded, recallable conversation messages, and/contextshows only Environment and Memory.Show each Bash command once before execution, keep live output visible without repeating the command, and use a compact dimmed
stored tr.Nresult marker after live runs.Render changed diff code with equal-width saturated dark green/red backgrounds while leaving line-number gutters and context rows unfilled.
Keep multiline queue pastes as one message; Up recalls the newest queued follow-up for editing or deletion before the model claims it.
Render
/psas a Markdown table and print resume commands on their own line for easier copying.Show per-file addition/deletion counts in
/diff, restore the previous CLI view after closing it, and syntax-highlight non-Bash tool arguments as well as Bash and Job commands.Refine the agent prompt around read-first engineering judgment, concise progress updates, review behavior, follow-up responsiveness, and using background jobs for potentially long-running work.
Fixed¶
Keep transient approval state (
approval requiredand[Y/n or reason]) out of terminal scrollback after a tool decision.Follow edited files across unambiguous Bash moves so
/diffreports their final paths and logical net changes.Prevent transient working dividers from leaking into CLI history during Bash previews and approval handoffs.
Prioritize queued follow-ups when building the next model request.
Keep Bash preview colors consistent, preserve literal closing-tag text, show bounded output when no live frame is available, and avoid repeating commands or output around live runs and failures.
Coalesce capped fallback edits into one
/diffentry per file, count only real hunk changes, and reportNo changeswhen a round has no net effect.Reject directory paths passed to
Editwith a tool error instead of crashing during edit planning.Persist the safe prefix of an active turn before each model request so completed messages and tool calls survive interruption and
--resume.Drain background-job output continuously so pipe buffers cannot deadlock verbose commands, refresh completed job state before capacity and
/pschecks, and keep bounded output tails correct for small limits.Clip Bash previews and status lines by terminal display width, preventing CJK and emoji output from wrapping unexpectedly and desynchronizing live rendering.
Keep assistant tool-call messages together with their tool results when compacting context, preventing invalid orphaned
toolmessages from reaching model APIs.Correct dark-terminal detection for ANSI bright-black backgrounds and keep the status line stable during manual compaction.
Stop dropping files with oversized edit snapshots from the
/diffSession view; fall back to the recorded per-turn diffs so the file still appears.Raise
TurnDiff.SNAPSHOT_CHAR_LIMITfrom 200KB to 1MB so typical large source files (including nanocode.py itself) keep their before/after snapshots and render as one clean unified diff instead of the concatenated per-Edit fallback.Reconstruct legacy
/difffor oversized-snapshot files by reverse-applying stored per-Edit hunks against the on-disk content; produces one clean unified diff when disk still matches the last tracked edit, otherwise falls back to the raw hunks.Close the raw file descriptor if
os.fdopenfails insideMCPFileTokenStore.save, preventing a descriptor leak on token-store write errors.
0.9.1 - 2026-07-09¶
Added¶
Add immediate queued-input flushing while the agent is waiting on a model request. Pressing Enter in the
+>queue still records text for the next LLM request; pressing blank Enter with newly queued text interrupts the active model request and retries it with that queued input included.
Fixed¶
Harden queued-input flushing so stale SIGINT delivery cannot cancel the whole turn after a model request already returned.
Avoid needless duplicate retries when the active model request already contains the queued input, prevent repeated blank Enter from stacking retry counts, and clear whitespace-only queue input on Enter.
0.9.0 - 2026-07-07¶
Added¶
Syntax-highlight inline Edit diff previews with Pygments. Added and context lines (the “new” file version) are lexed together as one code block so multiline strings and indentation-sensitive languages highlight correctly; removed lines stay plain diff-red. Degrades gracefully to plain diff coloring when Pygments is unavailable, the file extension is unknown, or the lexer fails.
Add background jobs via a
Jobtool (start/status/wait/list/kill). Long-running or non-blocking work — dev servers, watchers, long builds and test suites — runs in its own process group without blocking the agent; output is buffered (capped per stream), drained non-blockingly onstatus, and returned as a tail. Concurrency is capped (MAX_JOBS), running jobs surface in the status bar (jobs N), the/statusrow, and a new read-only/pscommand;killsends SIGTERM then SIGKILL to the group. Jobs run until they exit or are killed (no foregroundshell_timeoutcap), andJob(action="wait")with no/zero timeout blocks until the process exits.
Changed¶
Rename the interactive
Questiontool toAsk; the oldQuestiontool name is no longer registered.Replace the status-bar
+Nqueued-message counter with a live queue region. While the agent works, messages you type sit below the +> input under a dim “── queued” divider with a left→right sweep animation, instead of being echoed into the scrollback log; when the turn flushes them they move up into the log as+ <text>lines and the region shrinks (the divider disappears once nothing is queued).Cache the Anthropic request’s stable
tools+systemprefix with acache_controlbreakpoint on the system block, so each turn no longer reprocesses the system prompt and tool schemas from scratch (Anthropic prompt caching only activates at an explicit breakpoint).Strengthen the system prompt for faster convergence: batch independent reads/searches into one parallel request by default, and drive each Bash call to complete in a single pass (chain known steps, split only on genuinely unpredictable dependencies).
Replace the dedicated
LineCount,List,Find, andGittools with Bash-driven equivalents. The model now sees available shell commands near the top of Environment, read-only Bash commands (including safegit status/diff/logstyle commands) auto-run without confirmation, and mutating shell/git commands still require approval.Bash output is no longer erased from the terminal after the command finishes; the live preview output stays in the scrollback history.
Edit diff previews and approve messages remain visible in the CLI history instead of being transiently cleared.
Remove the Ctrl-A expanded Edit preview and fixed-height transient preview window. Edit approvals still show the full inline diff preview in the CLI history, with Pygments highlighting preserved.
Git branch is no longer shown in the environment context sent to the model.
Removed branch-change detection protection that prevented
git commitafter an external branch switch.
Fixed¶
Close a hole in Bash read-only auto-approval:
&&/||were flattened to spaces and only the first command in a chain was validated, sogit log && rm -rf xauto-ran without confirmation. Every stage of a&& || | ; newlinechain is now validated independently, a lone background&is rejected, and acdprefix (a benign builtin the model routinely adds) no longer forces a prompt on an otherwise read-only command.Follow common sense in the Bash read-only classifier rather than blanket strictness:
sort,uniq,sed, andtreeauto-run (with guards only on their real file-writing forms —sort -o,uniq IN OUT,sed -i,tree -o), and the ubiquitous harmless redirections (2>/dev/null,>/dev/null,< /dev/null,2>&1,>&2) no longer trigger a prompt. Real writes to a file and command substitution still ask.Suppress prompt-toolkit’s CPR warning in terminals that do not answer cursor position requests by disabling CPR probing for nanocode’s prompt applications.
Stop closed stdin from escaping as an unhandled exception in the queue-input background thread.
Stable Edit anchors, eliminating spurious “stale anchor” errors.
line_hashno longer folds the trailing newline into the hash, so a line’s anchor stays valid when only its final newline changes (e.g. the last line gaining or losing its\n) and Read/Search/Edit anchors now agree with InspectCode’s. Edit also numbers lines exactly like Read — both split on\nonly via a sharedReadTool.split_lines, replacingstr.splitlines(True), which additionally breaks on\r,\v,\f,\x1c–\x1e,\x85,\u2028,\u2029and desynced line numbering (and thus anchors) for any file containing those characters.Bump
code-symbol-indexto>=0.3.5, fixing a tree-sitter range extraction crash that could terminatenanocode --resume lastwith SIGSEGV and leave a core dump during background index refresh, while using the package’s validated tree-sitter dependency floor.Render Ask choice previews with escaped
\nsequences expanded into real lines, allow the choice window to use available vertical space above the status bar, and stop repeating the full raw question text when switching to “Type freely…”.Render intermediate assistant markdown correctly while the
+>queue prompt is active; Rich ANSI output is now replayed through prompt-toolkit instead of leaking as?[90m-style text.Move the active-turn elapsed timer into the animated
workingdivider; the sweep now scans only the horizontal rule so the label stays readable.Show saved tool summaries on
--resumeeven when the compacted transcript no longer contains the original assistant tool-call messages.Add regression coverage for Ask preview/free-text rendering, whole-second working timers, and restored saved tool summaries.
0.8.2 - 2026-07-03¶
Fixed¶
Auto-submit queued input you already pressed Enter on. While the agent is working, typing in the
+>queue and pressing Enter records the line intopending_user_inputs; if the turn ended before a step consumed it, that already-entered text was pre-filled back into the prompt and sat there waiting for a second Enter (and could feel like a very delayed send). Now, in interactive mode, Enter-committed queue input auto-submits as the next turn with no second keypress, while text you were still typing (never Enter’d) is still pre-filled into the prompt for review. Mid-turn injection and the headless combined-submit path are unchanged.
0.8.1 - 2026-07-02¶
Added¶
Add a
nanocode update(aliasupgrade) command that upgrades nanocode to the latest PyPI release. It first checks the latest version, reports and exits when already current, then detects how nanocode was installed and runs the matching upgrade command:uv tool upgrade nanocode-clifor uv-tool installs,pipx upgrade nanocode-clifor pipx, andpython -m pip install --upgrade nanocode-cliotherwise. Editable/dev installs are detected (via the distribution’sdirect_url.json) and refused with a hint to update the source instead.
0.8.0 - 2026-07-01¶
Added¶
Add Skills: reusable instruction packs discovered from
.nanocode/skills/<name>/SKILL.md(project) and~/.nanocode/skills/<name>/SKILL.md(user; project wins on name clash). Each skill is a Markdown file withname/descriptionfrontmatter and may bundle helper scripts in its folder. A compactSKILLSindex (name + description) rides the cache-stable request prefix so the model knows what exists, and the full body is pulled into the conversation only on demand — either when the model calls the newSkill(name)tool or when the user references a skill inline with$name(Tab-completed). A{skill_dir}/${SKILL_DIR}placeholder in the body expands to the skill’s absolute folder path when loaded, so bundled scripts are runnable viaBashwithout hardcoded paths. RepeatedSkill(name)loads collapse to a one-line pointer (like MCPdescribe), keeping the first full body cached and not re-billing the instructions. A built-innanocode-helpskill ships by default (out of the box, no install) that answers questions about nanocode itself — how to use it, its features, and common problems — from a self-contained manual, so it does not read the source per question. The body is an authored manual (concepts, workflows, troubleshooting) plus lists assembled at load time from the same in-code constants the app uses (the/helptext, each tool’s description, the settable config keys), so the prose is rich while the lists cannot drift from the running version; the raw source is named only as a last-resort fallback. A project/user skill of the same name overrides it. Because a built-in is always present, theSKILLSsection andSkilltool ride every request; only a session with its skills explicitly cleared drops back to the prior byte-identical prefix. Installed skills are surfaced in the status bar (skills N), the/statuscontext row (skills N), a read-only/skillscommand, and/helpnow documents the$skillinline mention.Replace
/memorywith/context, a viewer for the model’s synthesized context frame — the Environment, Memory (goal, plan, known facts, check, code-index status), and File State sections that wrap the conversation on every request. At an interactive prompt, bare/contextopens a tabbed viewer (←/→orh/lswitch Environment/Memory/File State,↑/↓orj/kscroll,1–3jump,Esc/qclose) with the sections rendered as Markdown tables/headings and a scroll-position indicator; while the agent is working or without a TTY it prints the same content as a static Markdown dump./context <path>shows one in-context file’s current anchored lines (matched by exact path, basename, or suffix) inside a fenced block. Unlike the old/memory, the Memory section now renders exactly as the model receives it (so it includescheckand code-index status and omits the transcript-only summary).Detect prompt-prefix drift via fingerprinting. The cache-stable request prefix (system prompt + environment + MCP tool index + sorted tool schemas) is fingerprinted (SHA-256) each turn against a baseline pinned to the first one seen; a healthy session keeps a single fingerprint start to finish, while a second one means every token from the change onward is a cache miss that previously failed silently and only surfaced on the bill.
/statusshows a⚠ prefix churnwarning with the distinct-fingerprint count when more than one is seen,--debugwrites a unified diff of exactly what changed (cache-prefix-drift), and the fingerprints persist across--resume.
Changed¶
Track and show the context compaction count in
/status.AgentStategains a persistedcompaction_countincremented on every compaction path (history, turn, and their fallbacks), surfaced in the/statuscontext row and preserved across session save/load.
0.7.2 - 2026-06-26¶
Added¶
Show a short, context-aware tip on startup (a curated set covering sessions, context, model/reasoning, tools, and config). Tips whose feature is unavailable are filtered out (e.g.
/strictonly shows when the provider supports strict tools; MCP tips only when MCP is configured). The line is styled as a muted hint with highlightedcodespans and can be disabled withruntime.tips = false(or/set runtime.tips off).Add per-property
descriptionfields to every built-in tool’s JSON Schema (Read,LineCount,List,Find,Search,InspectCode,Edit,Bash,Git,Recall,Note). The argument contract now lives in the schema the model parses natively rather than only in the prose signature, improving tool-call argument accuracy across providers.Add a
/strictcommand to toggleprovider.strict_toolsfor the active provider, reporting when it is enabled but inactive (the provider does not support strict tool calling).Add a
provider.strict_toolsoption (defaultfalse, also settable via/set) that constrains tool-call arguments to each tool’s JSON Schema. When enabled it is only active on hosts whose profile supports strict mode (api.openai.com,api.deepseek.com) and on the chat path; every other provider is unaffected. Activating it emits a strict-compliant schema (all properties required, genuine optionals made nullable,additionalProperties: false, and the unsupportedminItems/maxItems/minLength/maxLengthkeywords dropped) withstrict: trueper function, and on DeepSeek it routes the client to the/betaendpoint where the feature lives. Because optionals become nullable, the model may send explicitnullfor an omitted argument; nanocode now stripsnullvalues (recursively) before dispatching to a tool, wherenullhas always meant “absent”.
Changed¶
Add a
provider.max_tokensoption (also settable via/set) capping chat-completion output. It defaults to0(unset) for generic OpenAI-compatible providers, so their requests are unchanged, and resolves to a profile default of32768onapi.deepseek.comso DeepSeek thinking mode has enough room forreasoning_contentplus the answer.Map
reasoning = "high"to DeepSeek’s agent-recommendedmaxeffort in the thinking effort table (washigh);xhighstill maps tomaxand the defaultmediumstill maps tohigh. Only the DeepSeek/Qwenthinkingstyle is affected.Skip the OpenAI-only
prompt_cache_keyparameter forapi.deepseek.com, which caches by prefix automatically and ignores the key. All other hosts keep emitting it as before.
Fixed¶
Keep the Bash live preview alive during blocking commands so the terminal no longer looks frozen. A command that buffers its output (e.g. a quiet long-runner, or
... | tailthat emits nothing until EOF) previously left the screen completely static — the status bar is stopped while a command runs and the preview only drew when output arrived. The preview now renders an immediate frame showing the command being executed ($ <command>) and a live elapsed timer (running… 12.3s), ticked by a daemon heartbeat so the timer advances even with no output, and switches tooutput · 12.3sonce output streams. On finish the frame is now erased (it previously lingered as dimmed ghost lines), and a full-width line can no longer auto-wrap and desync the redraw cursor math.Set an explicit output ceiling for DeepSeek thinking mode so long
reasoning_contentno longer exhausts the server-side default and truncates the response or drops the tool call.Stop sending
temperatureon the chat path when a native thinking style (thinking/enable_thinking) is enabled, since DeepSeek and Qwen reject or ignore it in that mode. Other reasoning styles and providers are untouched.Drain the MCP background event loop on exit. MCP work runs on a daemon loop thread; at interpreter shutdown the
concurrent.futuresatexit hook tore down the default executors before that thread was joined, so an in-flight client cleanup (HTTP session termination, DNS viarun_in_executor) raced the teardown and printedcannot schedule new futures after shutdown/Session termination failed.MCPManager.close()now cancels pending tasks, stops the loop, and joins the thread (5s timeout) frommain()’sfinallybefore the interpreter tears down its executors.
0.7.1 - 2026-06-25¶
Changed¶
Run the code-symbol-index working-tree check off the UI critical path.
/statuspreviously forced a synchronouscsi.status(check=True)full-tree scan (~1.5s on large repos) before rendering, and the same scan ran inline at the end of every turn, delaying the answer./statusnow reads the last-known status instantly (check=False) and triggers the scan asynchronously, and the per-turnupdate_pending()runs in a guarded one-shot daemon thread, so neither blocks the UI. A new transientcode_index_checkingguard prevents overlapping scans.
0.7.0 - 2026-06-24¶
Added¶
Execute a model’s batch of read-only tool calls concurrently. Within one assistant turn, maximal runs of auto-approved, non-interactive read tools (
Read,Search,Find,List,Recall,InspectCode, read-onlyGit, read-onlyMCP) now run in a bounded thread pool, while results are finalized on the main thread in the exact order the model issued them. Mutating tools,Editbatches, confirmations,Bash(live output), andQuestion(interactive) stay serial. Bounded by the newruntime.max_parallel_toolssetting (default4; set to1to disable and restore fully serial execution).Store
Noteplan items as explicit objects withstatus(todo,doing,done,blocked) andtext, while preserving old string plans astododuring load/compaction. Model-visible memory renders readable status text; CLI memory and Note previews keep compact[ ],[~],[x],[-]symbols.Added a concise system-prompt
GUIDEsection coveringTHINK BEFORE CODING,SIMPLICITY FIRST,SURGICAL CHANGES, andGOAL-DRIVEN EXECUTION.
Changed¶
Stop auto-approved (yolo) tool calls from logging two near-identical CLI lines. The pre-execution
auto …line duplicated the result line’s header for tools without a preview (MCP, Bash, Git); it is now suppressed in that case and the auto-approval is recorded by an[auto]tag on the single result line.Editstill shows itsauto …pre-line because it carries the diff preview the result line omits.Depend on
fastmcp-slim[client]instead of the fullfastmcpmeta-package, since only the MCP client is used. This drops the unused server/CLI stack (cyclopts, griffelib, uvicorn-side bits, openapi/jsonschema tooling, the keyring/py-key-value cluster, etc.) for a much smaller install.Switched Read/Search/Edit/InspectCode anchors to the explicit
anchor=line:hash | textformat and documented the hash ashash(line_content)in FILE STATE.Bumped the
code-symbol-indexdependency floor to>=0.3.1and use its upstream explicit InspectCode anchor formatter instead of local normalization.Reduced
nanocode.pyby removing dead code, thin wrappers, and over-complex helper paths without changing behavior.Render Note success output with user-facing
goal:,check:,plan:, andknown:labels, plus status-aware colors in the CLI, instead of exposing internal field names likeset_goalandreplace_plan.
Fixed¶
Keep every MCP server visible in the tools index. It previously built full per-tool schemas and then hard-truncated the whole block at the size cap, so one verbose server could consume the entire budget and silently drop every later server, leaving the model blind to them. The index now degrades by shedding detail rather than entities — inline schemas, then schemas-dropped, then name-only — keeping all servers and tool names visible (the model can re-fetch a schema via
describe); only at thousands of tools does it truncate, and that case now warns via a post-discovery notice and a!status-line marker.Declare
websocketsas a direct dependency. The MCP client transport imports it at runtime, butfastmcponly declared it under its server extra, so trimming that extra broke MCP connections (including OAuth login).Render structured plan items in
/memoryand Note previews as status symbols/text instead of leakingPlanItem(...)repr strings.Resume sessions whose transcript contains tool calls with multi-line argument strings (e.g. a multi-line
git commitmessage). Strictjson.loadsrejected the literal newlines and dropped the args to{}, which then failed the tool’s own validation (Git requires a non-empty 'argv' list) and aborted--resume. Tool-call arguments now parse withstrict=False, and a malformed historical call renders without args instead of crashing.Stop malformed live tool-call arguments from aborting the whole turn. Argument validation that ran while parsing a model response (e.g.
Gitwith an emptyargv) raised outside the tool-execution boundary, ending the turn with an error the model never saw. The error is now captured on the call and surfaced as a normal failed tool result, so the model can self-correct.Decode
Bashoutput with a per-stream incremental UTF-8 decoder. Each 4096-byte read was decoded independently, so a multibyte character split across a read boundary (common with CJK output) was mangled into replacement characters.
0.6.6 - 2026-06-23¶
Changed¶
Report the prompt-cache hit rate in
/statusagainst input/prompt tokens instead of total tokens (which folded in completion/reasoning output and structurally understated the rate), and show thecached/promptsplit for both the cumulative and last-call figures.Land MCP
describeresults inline in the conversation history (bounded and recallable like any tool output) instead of stripping them into a recomputedMCP TOOL DETAILStail block. The schema is now written once and cached as the conversation grows, rather than re-billed uncached on every request; the tools index tells the model not to describe a tool again once its schema is already shown.Collapse repeated MCP
describeresults for the same tool to a one-line pointer when building the request, keeping only the first full schema per(server, tool). This is a stateless send-time transform that never mutates stored history and only ever collapses the newer occurrence, so it reclaims duplicate-schema tokens without disturbing the cached prefix.Tighten the final-answer style guidance: default to a few lines, scale length to the task, lead with the result, and drop preamble / request-restatement / step-by-step recaps, replacing the soft “be concise” wording that models tended to ignore.
Add Tab/Shift-Tab completion (commands, paths, mentions) and a completion menu to the queue-input area, matching the main prompt.
Run read-only slash commands (
/help,/status,/memory, read-only/mcp) plus/yolotyped in the queue-input area while the agent is working, instead of sending them to the model as literal text./yolois allowed because it is a single atomic flag the agent reads at the next approval; other state-mutating or control commands are refused with a hint to interrupt first, since they would race the in-flight turn.Pre-fill leftover queued input into the prompt for review/edit when a turn finishes, instead of auto-submitting it as the next turn. Input typed while the agent is working is still injected into the running task; only input left over at the turn boundary now waits at an editable prompt (non-interactive/piped input keeps auto-submitting, since there is no one to confirm).
Collapse argument/usage tool-call rejections to a quiet dim one-liner (
tool X · rejected: <reason>) in non-debug mode, instead of the full red[failed]+ error block. These are usually self-corrected on retry; the full error still goes to the model and shows in debug, and real execution failures stay fully visible.
Fixed¶
Moved the volatile
code_indexstatus out of the earlyEnvironmentblock (which sits ahead of the conversation history) into the lateMemorysection, so itssynced ↔ stalechurn no longer invalidates the cached conversation prefix every time files change or the indexer runs.
0.6.5 - 2026-06-22¶
Added¶
Surface each MCP tool’s input JSON Schema to the model: the tools index now carries a compact (capped) schema per tool and
MCP(action="describe")emits the full schema, so the model can build nested arguments correctly instead of guessing.Added MCP resource support: discover resources alongside tools (concurrently, best-effort), list them in the tools index, and read them via
MCP(action="list_resources")andMCP(action="read_resource", uri=...). Resource reads flow through the normal tool-result path so they land in cached conversation history.Surface resource-like URIs referenced in MCP tool descriptions on the tool’s index line, so doc references survive description truncation and stay discoverable.
List a server’s resources in
@servermention blocks, matching the tools index.Auto-read a resource referenced by an MCP tool’s description on the first call to that tool (once per uri per session, best-effort, web links skipped), attaching it to the call result on success and to the error on failure so argument-grammar docs reach the model on the first attempt and land in cached history.
Changed¶
Default the
MCPtoolactionto"call"when omitted buttool/argumentsare present, and make the unknown-action error actionable (lists valid actions and shows how to invoke a remote tool by name).
Fixed¶
Render connected MCP servers that advertise resources but no tools in the tools index (previously gated on having ≥1 tool, so resource-only servers were mislabeled “not connected” and their resources hidden);
_pending_statusnow distinguishes a connected-but-empty server from a disconnected one.
0.6.4 - 2026-06-21¶
Added¶
Added JSONL session persistence with append-only deltas for the normal save path and
nanocode --resume [UID]for restoring saved sessions.Added a
latestsession pointer and a resume command hint printed when nanocode exits.Added
nanocode --resume lastas an alias for resuming the latest saved session.Render restored session history once on resume without re-running tools or commands.
Show the active session id in
/status.Added session persistence coverage for snapshot/delta save/load,
latest, usage/state/tool record roundtrips, missing snapshots, and exit resume hints.
Changed¶
Kept persisted session snapshots focused on necessary recovery data only, deriving runtime tool-result lookup state from saved tool records instead of storing config, settings, timestamps, git branch, or other rebuildable runtime data.
Skip first-save persistence for sessions with no recoverable content, avoiding empty snapshots and stale
latestpointers.Delete session files older than the configurable
runtime.session_retention_daysretention window on startup; the default is7days.Treat retention and update-check interval settings as config-file policy rather than
/setruntime mutations.Split session snapshot encoding/merging from JSONL file storage, keeping
Sessionas a thin owner of runtime state.Resume now applies the current config/runtime flags (
--config,--yolo,--debug,--mcp) while loading only conversation state from the snapshot.
Fixed¶
Fixed command dispatch so ordinary non-command input reaches the agent instead of being treated as an unknown slash command.
Changed the resume marker to an internal system message so it does not affect latest-user compaction behavior.
Report resume/load errors as CLI errors instead of uncaught exceptions.
Auto-submit queued input at round end:
queue_input_text(typed but not confirmed) and unconsumedpending_user_inputsboth get drained and submitted as the next user input; extracted asCommandLoop.drain_queued_input().Clear blank
queue_input_texteven when it contains only whitespace, preventing stale whitespace from lingering in the input area.Record auto-submitted queued input in CLI history via
FileHistory.append_string(), so previously-queued text appears in prompt history like any manually typed input.
0.6.3 - 2026-06-21¶
Added¶
Added
Questiontool that pauses the agent to ask the user one or more questions (asked in sequence) when intent is genuinely ambiguous, a design choice affects the external shape (module structure, public API, naming), or prioritization is needed. Each question supports structured choices with optional dynamic previews and an optionalrecommendedchoice index (pre-selected and marked).Wired
Questiontool into the shared interactive selector withj/knavigation, dynamic per-choice preview, Rich markdown rendering of the question text, and a free-text fallback.Echo the selected choice in the CLI after the interactive selector closes, giving clear feedback on what was chosen.
Prefix a position indicator (e.g.
(1/3)) onto each question when several are asked in oneQuestioncall.
Changed¶
Refined
Questiontool DESCRIPTION, SYSTEM_PROMPT usage guidance, and README with clear principles: question only when intent is truly ambiguous, design affects external shape, or prioritization is needed. Skip internal details, contextually-determinable items, and already-specified matters.
Fixed¶
GitTool: validate non-empty
argvinpayload_argswith a clear error message when the model sends an empty command list.Update the tracked commit-target branch (renamed
initial_git_branch→expected_git_branch) after a tool-driven branch switch so commits on a branch nanocode switched to are not rejected, while still guarding against unexpected external switches.
0.6.2 - 2026-06-21¶
Changed¶
Simplified the agent system prompt while preserving the main
TOOLS,FLOW,FILE STATE, andFINALsections.Simplified MCP command handling and server config parsing by sharing command metadata and config field parsing helpers.
Fixed¶
Reused one manager-owned MCP event loop for async MCP operations, including calls made while another event loop is already running.
Made MCP OAuth token storage reuse one store and shared path lock to avoid concurrent token file writes racing each other.
Allowed
env_http_headers.Authorizationwhen it is the only configured authorization source.Rejected extra
/mcpsubcommand arguments instead of silently ignoring them.
0.6.1 - 2026-06-19¶
Changed¶
Renamed
Notefields:goal→set_goal,plan→replace_plan,known→append_known,check→set_check; addedreplace_knownfor full replacement of known facts.Aligned
Noteschemas and prompt guidance soreplace_plan,append_known, andreplace_knownare always arrays and can be empty when replacing state.Split FILE STATE into its own prompt section and clarified it as the working view for visible file content and Edit anchors, while noting it may be partial.
MCP tool calls now confirm by default, auto-approving only tools explicitly marked read-only (
readOnlyHint) or non-destructive (destructiveHint: false); undiscovered tools also require confirmation.
Added¶
New Note field
replace_knownthat completely replaces the known list, with test coverage.
Fixed¶
Made
Noteupdates transactional, so invalid fields no longer partially mutate session notes before returning a tool error.Guarded MCP
login/discovery error paths with the manager lock so they no longer race background discovery while mutating server tool/error state.
0.6.0 - 2026-06-18¶
Added¶
Added MCP client router support through a single
MCPtool, with URL-based server configuration, bearer-token environment variable support, OAuth login/logout with persistent tokens, asynchronous tool discovery, compact model-visible MCP tool indexes, on-demand tool details, and/mcpinspection/refresh commands.Added local stdio MCP servers via
command/args/env, alongside the existing streamable-HTTP transport; each server isurlorcommand, and stdio servers reject the HTTP-only auth options.Added
@serverand@server.toolmentions in user input that inject a server’s tool list or a tool’s details into the turn, force discovery of undiscovered servers, report login/errors inline, and tab-complete server and tool names.Added MCP coverage for result normalization, successful tool calls, context pruning,
/mcp tools NAME, missing-server refresh handling, and stdio config parsing/validation.Added bounded MCP connection timeouts, concise MCP connection-failure logs, a
--debugflag for starting with debug mode enabled, and a--mcpselector for choosing MCP servers by name glob.
Changed¶
Refined the status bar with lowercase
mcp, right-side loading animation, and semantic per-section colors.Show MCP discovery progress in the status bar while servers are loading.
Render
/mcpserver and tool listings as Markdown tables for clearer terminal display.Load configured MCP servers in parallel during discovery.
Include the MCP endpoint URL when OAuth login fails before an authorization URL is available.
Suppress duplicate FastMCP OAuth URL logs and omit OAuth-login-required notices from startup MCP error logs.
Skip MCP server discovery without startup error logs when bearer-token environment variables are missing.
List all enabled MCP servers in the model-visible index, adding a “not yet available” section for servers that are still discovering, need login, or errored, so the model never assumes a configured server is absent.
Enriched MCP tool-call logging with compact
key=valuearguments in the header (also shown in the approval preview), a success result summary (shape and payload size), and round-trip latency.Steered the agent toward
InspectCodefor symbol navigation with aSEARCH/NAVprompt section, and surfaced the code-index status in the Environment context so it knows when the tool is usable.Separated each round with a blank line after the user input and a rule before the agent’s answer.
Clarified prompt guidance around FILE STATE snapshots, automatic Read/Edit refreshes, stale-anchor retries, and avoiding unchanged failed tool-call retries.
Tightened the system prompt’s tool-choice guidance to prefer
Editfor file changes,Readfor known file ranges,Searchfor text lookup, andInspectCodefor symbol navigation.Added current git branch to Environment context while keeping branch-specific data out of the stable system prompt.
Fixed¶
Expanded
Editno-op errors with current target-range content when anchored edits produce no changes, so agents can distinguish already-applied edits from wrong replacement content.Guarded git branch safety so yolo mode cannot auto-approve branch-changing commands, and git commits refuse to run after the branch changes from the session start.
0.5.12 - 2026-06-15¶
Fixed¶
Preserved queued input typed during a running turn and prefilled it into the next prompt instead of dropping it at turn completion.
0.5.11 - 2026-06-12¶
Added¶
InspectCodegainedrefs,impls,callers, andcalleesmodes, backed bycode-symbol-index0.3.0: behavior-classified references, implementor listing, and transitive call-chain walks (depth).refshides import/attribute noise by default, withref_kindto filter to an explicit subset orall_kindsto show everything;calleestakeslooseto include ambiguous cross-module matches;refs/implspage withoffset.
Changed¶
Bumped
code-symbol-indexfloor to>=0.3.0.
0.5.10 - 2026-06-02¶
Added¶
Cached gitignore patterns across tool calls with mtime-based invalidation.
Changed¶
Clarified Bash tool output limits in its description.
Strengthened assistant language prompt to reduce unnecessary
cdcommands.Clarified Git tool description so the model sees it defaults to the cwd from Environment.
0.5.9 - 2026-06-01¶
Changed¶
Colorized
Ctrl-Afull edit previews when shown throughless.
0.5.8 - 2026-06-01¶
Added¶
Added
Ctrl-Afull edit preview in an external pager during approval.
Changed¶
Compact oversized current turns instead of only prior history.
Removed thin internal wrappers without changing behavior.
Fixed¶
Rejected broad
git addcommands unless explicit file paths are supplied.Stopped exposing the output-language sentinel inside model-visible file state.
0.5.7 - 2026-05-30¶
Changed¶
Encouraged early
Noteusage for multi-step work with goal and plan updates.Added lightweight empty-memory guidance when goal or plan has not been set.
Ordered
FILE STATEfiles by most recent visible Read/Edit source before stable path fallback.
0.5.6 - 2026-05-30¶
Added¶
Added a visible purple approval wait indicator.
Expanded compact logic tests around latest-turn retention, recent-message windows, fallback trimming, and tool-result preservation.
Changed¶
Clarified prompt rules for user-visible interim output and final answers.
Simplified core flow by removing thin wrappers and duplicate tool-schema name extraction.
Fixed¶
Preserved raw tool results referenced from compact summaries so
tr.Nkeys remain recallable.Improved transient model error retry detection and final retry reporting.
0.5.5 - 2026-05-30¶
Changed¶
Tightened the system prompt around FILE STATE, anchored edits, and final-answer flow.
Fixed¶
Added limited automatic retries for transient model request failures such as 5xx, rate limits, and timeouts.
0.5.4 - 2026-05-29¶
Changed¶
Reworked running-turn context as a current turn conversation, preserving mid-turn assistant text and appended user input.
Made running-turn appended input visible through a
+>prompt and compact+Nstatus indicator.
Fixed¶
Started Bash live preview before command output so the
+>prompt cannot cover it.Avoided extra approval prompt line clearing after confirmation.
0.5.3 - 2026-05-29¶
Added¶
Added support for additional user input during running agent turns.
Added multiline approval input for pasted refusal reasons.
Changed¶
Simplified approval handling so direct non-yes input is treated as a refusal reason.
Fixed¶
Fixed CreateFile escaped-newline handling so preview and written content stay multiline.
Made CreateFile/Edit code-index updates use the tool call path as a fallback.
0.5.2 - 2026-05-29¶
Changed¶
Animated the statusbar code-index refresh indicator while keeping
/statussemantic.
Fixed¶
Switched startup code-index refresh to the
code-symbol-indexasync refresh API to avoid parser thread ownership errors.
0.5.1 - 2026-05-29¶
Added¶
Added the current date to context immediately before the current user request.
Fixed¶
Sanitized context/debug/model-request text so surrogate characters from terminal input cannot break UTF-8 encoding.
Made Search ignore hidden paths and
.gitignorepaths consistently across ripgrep and Python fallback paths.
0.5.0 - 2026-05-28¶
Added¶
Added cached system information to the top of model context: cwd, OS, arch, shell timeout, and detected commands.
Added configurable
runtime.max_context_tokens.Added key behavior tests for tools, agent loop, context management, provider adaptation, and code index integration.
Changed¶
Replaced the legacy implementation with the smaller v1 core in
nanocode.py.Rebuilt README around the current command set, context design, and screenshot.
Simplified tool schemas for broader OpenAI-compatible provider support.
Improved tool-call display for Search and Recall, and surfaced intermediate assistant progress before tool calls.
Fixed¶
Fixed Moonshot/Kimi-compatible tool schemas by avoiding unsupported schema forms.
Fixed repeated command probing in context rendering by caching system command detection per session.
0.4.11 - 2026-05-24¶
Changed¶
Bumped version from 0.4.10 to 0.4.11.
0.4.8 - 2026-05-23¶
Changed¶
Renamed the
EditFiletool toEditacross the codebase and tests.
0.4.5 - 2026-05-21¶
Changed¶
Updated the built-in code index integration for
code-symbol-index0.1.7.Added indexed symbol filters for kind, path, and exact matching.
Added file-local symbol outlines and bounded pending-index details in
/status.
0.4.4 - 2026-05-20¶
Added¶
Added built-in indexed code navigation backed by project data and
/indexfor manual init/sync.
Changed¶
Replaced the external code-navigation CLI integration with the bundled code index API.
Hid code navigation tools until an index exists, while lightly updating existing indexes at startup.
Updated status/docs to describe code index availability without exposing dependency-install wording.
0.4.3 - 2026-05-20¶
Changed¶
Removed stable knowledge state while keeping current-task known facts.
Extracted shared numbered-content and line-range helpers for tool output/range handling.
Trimmed thin helper wrappers in List and indexed code-inspection tools.
0.4.2 - 2026-05-19¶
Added¶
Added indexed code inspection tools for symbol lookup, symbol investigation, and file outlines when the local index is available.
Added queued user feedback during long-running turns.
Added
PatchFilefor multi-location file edits.
Changed¶
Moved model calls to the OpenAI SDK and function-tool protocol.
Reworked task-shape prompts for chat, one-shot tasks, and tracked tasks.
Prioritized indexed code inspection for structural lookup while keeping Search/Read for exact literals and edit ranges.
Improved terminal UX with persistent status, queued-input handling, Bash live preview, and terminal-friendly assistant output rules.
Renamed
ListDirtoList.Improved
Read,Edit,ReplaceRange,PatchFile,Bash, andGittool guidance.Simplified gate behavior so only deterministic, correctable model errors are refused.
Fixed¶
Fixed duplicate final replies for goal-only text answers.
Fixed repeated recall loops and several format/tool-name compatibility issues.
Fixed PatchFile diagnostics and empty-hunk handling.
Fixed queued feedback delivery, Ctrl-C/Ctrl-D handling, and Bash interrupt reporting.
0.3.35 - 2026-05-16¶
Added¶
Added batched
ReplaceRangeedits for multiple independent ranges in the same file.Added a design document covering agent state, context construction, tool-result storage, observe policy, and verification.
Changed¶
Aligned tool-result context layout with the design document.
Refined tool-result context reduction around unreduced raw results, retained results, and checkpoint-based pruning.
Compressed ACT and OBSERVE system prompts.
Reduced routine OBSERVE triggers by raising the pending-result threshold and keeping ordinary tool failures in ACT for repair.
Simplified agent gate and feedback handling, including single active plan item normalization.
Added soft feedback for state-update-only ACT turns so models continue with frontier tools, verification, or completion.
Highlighted recognized slash commands and reported unknown slash commands directly.
Fixed¶
Accepted harmless model output variants including trailing progress text, action type casing, and
messageaction aliases.Ignored pending verification requests instead of treating them as blocking model output.
0.3.34 - 2026-05-16¶
Changed¶
Trigger observe by unresolved pending tool-result count only, instead of consecutive tool batch count.
0.3.33 - 2026-05-16¶
Fixed¶
Keep unresolved pending tool results visible as raw ACT context until observe mode explicitly keeps or forgets them.
0.3.32 - 2026-05-16¶
Changed¶
Removed the pending tool-result character threshold for observe mode; observe now triggers from failures, pending result count, or consecutive tool turns.
0.3.31 - 2026-05-16¶
Changed¶
Require a new user turn with retained task context to align via
start,goal, orplanbefore running more tools.
Fixed¶
Removed an unused pytest import from bash tool tests.
0.3.30 - 2026-05-16¶
Changed¶
Status bar now shows compact token totals and model stream rate, including
turn:duration labeling.Stream rate uses live character-based estimation and completion-token usage when available.
0.3.29 - 2026-05-16¶
Fixed¶
Ignored code-fence-only text when converting interleaved model output into progress actions.
0.3.28 - 2026-05-16¶
Changed¶
Status bar now labels model calls as
working,observing, orcompacting.Removed the hard gate for multiple
doingplan items while keeping prompt guidance to prefer a single active item.
Fixed¶
Preserved specific retry notices such as
err:formatinstead of overwriting them with generic gate notices.Accepted unmarked action streams with interleaved progress text between JSON actions.
Normalized tool-name action types such as
SearchorListDirinto tool actions.
0.3.27 - 2026-05-16¶
Fixed¶
Added a nanocode
User-Agentheader to provider requests so OpenAI-compatible gateways that reject Python urllib defaults can accept chat and model-list requests.
0.3.26 - 2026-05-16¶
Changed¶
Generated configs now leave
reasoning_payloadunset by default for broader provider compatibility.Documented when to enable
reasoning_payload, including OpenRouter-style reasoning providers.
0.3.25 - 2026-05-16¶
Changed¶
Added Vim-style selector search with
/keyword,j/knavigation, and step-back Esc behavior.Made
/modelreasoning selection transactional so Esc returns to model selection instead of applying a partial change.
0.3.24 - 2026-05-16¶
Changed¶
/modelnow groups configuredavailable_modelsfirst and appends deduplicated models discovered from the provider.Default generated config now documents
available_modelswithout writing an empty setting.Split latest/recent and kept tool-result context budgets for steadier context growth.
Compacted tool-result CLI output while keeping result keys visible.
Removed
ApplyPatch; editing now usesEditfor tiny literal changes andReplaceRangefor read-backed focused ranges.Refined editing prompts to prefer minimal new-file skeletons followed by focused
ReplaceRangechunks.
Fixed¶
Stopped executing later tool calls after the first failed tool call in a batch.
Reported Ctrl-C interrupted Bash runs as explicit interrupted tool results.
0.3.23 - 2026-05-16¶
Changed¶
Reworked tool-result context around latest, recent, pending, and kept results.
Increased default provider and plan-mode response timeouts.
Simplified result keep/forget handling and removed stale evidence naming from agent context.
Fixed¶
Kept non-argument tool failures visible to observe mode while treating argument errors as immediate feedback.
Preserved Recall access to stored tool logs while allowing noisy context entries to be forgotten.
0.3.22 - 2026-05-16¶
Fixed¶
Preserved tool-result store entries referenced by Known, Hypotheses, and Evidence.
Aligned plan-mode verify guidance with the implemented verify action shape.
Changed¶
Generated hypothesis status prompt schema from the enum to avoid prompt drift.
0.3.21 - 2026-05-16¶
Added¶
Added investigation hypotheses, including
droppedfor branches that are no longer worth tracking.Added evidence forgetting so ruled-out or dropped branches can release old tool results from context.
Changed¶
Tightened completion gates, verification blockers, and compact state update grouping.
Simplified Search argument parsing and removed legacy knowledge-update behavior.
Made provider reasoning payload shape configurable.
0.3.20 - 2026-05-15¶
Changed¶
Clarified Search tool guidance so models use at most one
glob=per Search action and split multiple globs into multiple actions.
0.3.19 - 2026-05-15¶
Changed¶
Observe mode now requires every latest tool-result key to be covered by either
evidenceordiscard.Verification pass/fail/block tool results are treated as decision-changing evidence until verification is recorded.
Fixed¶
Prevented partial observe checkpoints from silently dropping unhandled tool results.
0.3.18 - 2026-05-15¶
Added¶
Added
provider.<name>.available_modelsand an interactive/modelselector.Added an interactive
/providerselector.Added reasoning effort selection after changing models.
Changed¶
Selection prompts now use a subtle selected-item background, support
j/k, and clear after completion.Removed the redundant
keep currentoption from selection prompts; current values are marked inline.Removed the startup status snapshot now that the persistent status bar is always shown.
Fixed¶
Disallowed no-value
/set provider.keyand/set provider.urlqueries.
0.3.17 - 2026-05-15¶
Added¶
Added plan mode with readonly tool limits, plan-specific timeouts, and stricter plan-mode completion formatting.
Added persistent prompt status display while keeping active status updates during agent work.
Added completion pressure gates so settled tasks finish by default unless the plan is reopened with context.
Added global runtime data storage under
~/.nanocode, with per-session debug/tool-result logs and per-project user rules.
Changed¶
Replaced project-local
[paths].nanocode_dirwith[paths].data_dir.Moved prompt history to global
~/.nanocode/history.Replaced
/clean-logswith/clean, which removes tool-result logs across all stored sessions.Compact observed tool-call results after they have been digested into agent state.
Fixed¶
Rejected chat actions in plan mode.
Tightened blocked verification completion so it requires explicit user/manual confirmation context.
Kept unbounded tool-result logs available on disk while bounded results stay in model context.