Skip to main content

A small terminal coding agent written in Python

Project description

nanocode

A small terminal coding agent written in Python.

简体中文

Chinese blog

nanocode is pre-1.0 software. Commands, configuration, and tool behavior may change before a stable release.

nanocode screenshot

Features

  • Live turn control: Add follow-up input while the agent is still working, without losing the current tool flow.
  • File-state brain: Reads and edits build a current, line-numbered view of the files that matter now.
  • Stale-edit protection: line:hash anchors reject edits when the target code has drifted.
  • Project-aware navigation: Use the symbol index to jump through outlines, references, implementors, call chains, and changed files quickly.
  • Recoverable context: Tool output stays bounded in the prompt, while raw tr.N results remain recallable.
  • Cache-aware context: Stable sections stay early and noisy working state stays late to improve prompt-cache reuse.
  • Focused working memory: Note separates goal, plan, and known facts from noisy execution logs.
  • MCP integration: Connect to remote (HTTP) or local (stdio) Model Context Protocol servers and call their tools.
  • Terminal-first workflow: Model selection, history search, confirmations, live command output, appended input, and status all stay in one CLI.

Install

uv tool install nanocode-cli

Upgrade:

uv tool upgrade nanocode-cli

For local development:

uv sync --extra dev
uv run nanocode

Usage

Start the CLI:

nanocode

Useful arguments:

  • --config <path>: use a TOML config file.
  • --init-config: create a default config file.
  • --yolo: skip confirmations for mutating tools.
  • -v, --version: show the version.

During a running turn, the +> prompt accepts follow-up input for the next model request.

Commands

  • /help: show commands and tools.
  • /status: show runtime status.
  • /config: show active config.
  • /api [auto|chat|anthropic]: show or set provider API format.
  • /debug [on|off]: toggle model I/O debug traces.
  • /compact: compact context now.
  • /index [force]: sync or rebuild the code symbol index.
  • /mcp [tools|login|logout|refresh] ...: manage MCP servers and tools.
  • /provider [NAME]: show or set provider.
  • /model [MODEL]: show or set model.
  • /reason: choose reasoning effort.
  • /set KEY VALUE: set provider/runtime values.
  • /yolo: toggle tool confirmations.
  • /exit, /quit: exit.

Interactive selectors support j/k, arrows, / search, Enter, and Esc. Input supports history, completion, and Ctrl-R history search.

Tools

  • File: Read, LineCount, List, Find, Search.
  • Code index: InspectCode.
  • Edit: Edit creates or patches file content.
  • Shell: Bash, Git.
  • Tool results: Recall.
  • Working notes: Note.
  • MCP: MCP calls tools on configured MCP servers.

Read, Search, and InspectCode return line anchors where useful. Edit uses current line:hash anchors to reject stale edits.

Configuration

Run:

nanocode --init-config

Default config location is ~/.nanocode/config.toml.

Main fields:

  • [provider] active = "name"
  • [provider.<name>]: url, key, model, api, prompt_cache_key, available_models, reasoning, chat_reasoning, temperature, timeout
  • [paths] data_dir
  • [runtime] shell_timeout, max_agent_steps, max_context_tokens, yolo

api = "auto" chooses between Chat Completions and Anthropic Messages using provider/model profiles. prompt_cache_key = "auto" derives a stable key from provider, model, workspace, and tool schema names.

MCP

nanocode connects to Model Context Protocol servers and exposes their tools through the MCP tool. Configure each server under [mcp.<name>]. A server is either url (remote) or command (local), never both.

Remote server over streamable HTTP:

[mcp.example]
url = "https://example.com/mcp"
bearer_token_env_var = "EXAMPLE_MCP_TOKEN"  # optional; sends Authorization: Bearer
enabled = true

[mcp.oauth_example]
url = "https://example.com/mcp"
auth = "oauth"                              # browser login via /mcp login <server>
enabled = true

Local server over stdio (launched as a subprocess):

[mcp.filesystem]
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
env = { SOME_TOKEN = "value" }              # optional; merged over the inherited environment
enabled = true

The HTTP auth options (auth, bearer_token_env_var, env_http_headers) apply to url servers only. env_http_headers maps a header name to the environment variable holding its value.

Manage servers at runtime:

  • /mcp: list configured servers and connection status.
  • /mcp tools [server]: list discovered tools.
  • /mcp refresh [server]: rediscover servers.
  • /mcp login <server> / /mcp logout <server>: OAuth login and logout.

Tested Providers

The following providers have been tested with nanocode:

  • deepseek: DeepSeek API
  • opencode: OpenCode API
  • aliyun: Alibaba Cloud (Tongyi Qianwen) API via Chat Completions
  • llama.cpp: Local inference via llama.cpp server

Context Design

Each model request is built manually from explicit messages. Stable context comes first, conversation stays as messages, working memory follows, and the latest file state is appended at the end.

model request
+--------------------------------------------------+
| system                                           |
|   concise agent contract and tool rules          |
+--------------------------------------------------+
| user                                             |
|   Environment                                   |
+--------------------------------------------------+
| user/assistant                                  |
|   conversation, compacted summaries, tools      |
+--------------------------------------------------+
| user                                             |
|   Memory: goal, plan, known, date               |
+--------------------------------------------------+
| user                                             |
|   FILE STATE: latest Read/Edit file view        |
+--------------------------------------------------+

Core rules:

  • Mid-turn assistant text and appended user input are kept as conversation.
  • Earlier conversation is compacted into an explicit summary when the context grows too large.
  • FILE STATE is updated by successful Read and Edit tools and shows current listed file ranges, with recent files first.
  • Newer file lines overwrite older lines; edit invalidations clear stale ranges.
  • File lines are checked against current file stat or line hash before being shown.
  • Successful Read and Edit tool messages point to FILE STATE instead of repeating file bodies.
  • Other tool outputs are bounded in conversation messages and can be recalled by tr.N.

Safety

nanocode can edit files and run shell commands in the environment where it is started. It does not provide sandbox protection. Run it inside your own sandbox, container, VM, or other isolated environment when needed.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nanocode_cli-0.6.1.tar.gz (77.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nanocode_cli-0.6.1-py3-none-any.whl (71.7 kB view details)

Uploaded Python 3

File details

Details for the file nanocode_cli-0.6.1.tar.gz.

File metadata

  • Download URL: nanocode_cli-0.6.1.tar.gz
  • Upload date:
  • Size: 77.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for nanocode_cli-0.6.1.tar.gz
Algorithm Hash digest
SHA256 d88a1b599768a2fa5b675e5345c974c6db765946d9a48f19224165279f938bed
MD5 4f086c4a911b326103996bbaeba47fa9
BLAKE2b-256 af4675059e7d9c070c8026ff94e7471d0b58f00557da8d62cde709ec5b83afaa

See more details on using hashes here.

File details

Details for the file nanocode_cli-0.6.1-py3-none-any.whl.

File metadata

  • Download URL: nanocode_cli-0.6.1-py3-none-any.whl
  • Upload date:
  • Size: 71.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for nanocode_cli-0.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5d2ab51f70184b5c90b0d9387330073258fff3c30005f7c2903a0e9831ccd35d
MD5 b7525d699d1ec79840df070216ddaec5
BLAKE2b-256 f73e8895efaf0bcd18337356dcc3ce5e0c0ff7cda70b2b80db591dfaf415fe4c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page