README
¶
A terminal-native AI coding assistant that audits every change before it touches your repo.
Built with TypeScript/Bun, governed by the ECHO Protocol, and designed for local-first use with Ollama.
v0.0.9 — Local-first Ollama support, privacy-first BYOK defaults, sandbox engine network gating,
/healthcommand, and full launch-ready artifacts.
Get Started in 30 Seconds
# Install the CLI
npm install -g @savant-code/cli
# Run it. If Ollama is running, it will auto-detect and use it.
savant-code

No Ollama yet?
# macOS / Linux
curl -fsSL https://ollama.com/install.sh | sh
ollama serve
# Windows: https://ollama.com/download/windows
Then run savant-code again, or type /health inside the chat to verify the connection.
Overview
Savant-Code is a TypeScript monorepo that builds and ships the terminal-native AI coding assistant Savant Code and the public @savant-code/sdk. The CLI provides multi-agent orchestration, custom skills, MCP tool discovery, mode switching (EDIT / ANALYZE / SCAFFOLD), and local-first Ollama support. The SDK, agent runtime, multi-agent orchestration engine, tool layer, and LLM provider shims are shared so both surfaces ship from one codebase.
The whole project ships under ECHO Protocol v0.2.0 — the same 15-law agent discipline that governs the Savant ecosystem. Every change goes through the RED → GREEN → AUDIT → SELF-CORRECT → COMPLETE Perfection Loop FSM, with a hard 10-iteration cap and a 10% Levenshtein change-cap per pass.
Key Technologies
| Layer | Tech | Version |
|---|---|---|
| Runtime | Bun | 1.3.14 (engines >=1.3.11) |
| Language | TypeScript | 5.5.4 (strict: true, noImplicitReturns: true) |
| TUI | OpenTUI + React 19 | @opentui/core 0.2.2, react ^19.0.0 |
| State | Zustand + Immer | zustand ^5.0.8, immer ^10.1.3 |
| Validation | Zod | ^4.2.1 |
| LLM SDK | Vercel AI SDK | ai ^5.0.52 + @ai-sdk/anthropic 2.0.50 |
| MCP | Model Context Protocol | @modelcontextprotocol/sdk ^1.18.2 |
| Code parsing | tree-sitter (WASM) | @vscode/tree-sitter-wasm 0.1.4 |
| HTTP / WS | ws, node-fetch, custom SDK client | ws ^8.18.0 |
| Package manager | Bun workspaces (hoisted) | bunfig.toml [install] linker = "hoisted" |
Features
CLI (@savant-code/cli)
- Multi-agent orchestration — 9 specialized agents coordinate via ECHO Protocol: Detective finds issues, Forge implements, Verifier audits, Recorder manages FIDs, Thinker reasons, Scout explores, Researcher investigates, Scribe documents.
/initcommand — scaffolds.agents/types/{agent-definition,tools,util-types}.tsand a starterknowledge.md.- Slash commands —
/new,/history,/bash,/goal,/loop,/feedback,/theme:toggle,/login,/logout,/exit, plus agent-specific commands. @filenameand@AgentNamementions — file and agent mentions with inline autocomplete.- Bash mode —
!commandor/bashto run shell commands inline (with confirmation). - Goal loop —
/goalsets a goal condition;/loop <cadence>schedules recurring prompt execution (e.g.,/loop 5m check build status). The loop scheduler manages cadence, run counts, and convergence detection. - Mode switching —
EDIT/ANALYZE/SCAFFOLDexecution-scope modes, togglable at runtime via UI. - Streaming & cancellation — token-by-token SSE streaming with mid-stream cancellation, retry-with-backoff, and subagent streaming for parallel work.
- Knowledge files — project-level
knowledge.mdplus per-user home-dir knowledge, auto-loaded into agent context. - Skills — OpenClaw-format
SKILL.mdfiles discovered at startup, schemas sent to the LLM, available as native tools. - MCP tools — Model Context Protocol servers discovered at startup, schemas published to the LLM API.
- Context compaction — 4-layer progressive auto-compaction: L0 (summarize old turns), L1 (compress tool results), L2 (prune stale context), L3 (aggressive reduction). Preserves critical context while reducing token usage.
- Universal copy buttons — hover-to-copy on code blocks, tool outputs, and file diffs throughout the TUI.
- Gateway providers — TokenRouter, NVIDIA NIM, OpenCode Go, and Cloudflare Workers AI via
@savant-code/llm-providers. - Theming — light/dark toggle (
/theme:toggle), Neon Slate aesthetic.
SDK (@savant-code/sdk)
SavantCodeClientclass — single entry point for running agents from any Node.js / Bun / browser app.- Streaming events —
handleEventcallback receivesRunStateupdates, tool calls, file diffs, and final output. - Custom agents — pass
agentDefinitions: AgentDefinition[]to override defaults. - Custom tools — pass
customToolDefinitionsto extend the tool registry. - Cancellation —
AbortSignalpropagates through subagent streams.
Agent Runtime (@savant-code/agent-runtime)
- LLM-agnostic — calls any provider registered with
@savant-code/llm-providers(OpenAI-compatible chat, Anthropic, etc.). - Multi-step loop — model decides tool → tool executes → result fed back → repeat until
end_turnor budget exhausted. - Tool registry — built-in (
read_files,write_file,run_terminal_command,code_search,web_search,spawn_agents_inline, …) + custom + MCP. - Cost aggregation — per-call token counts and USD cost estimates surfaced in
RunState.
ECHO Protocol Integration
- 9 specialized agents — Orchestrator, Detective, Forge, Verifier, Recorder, Thinker, Scout, Researcher, Scribe
- FID-Bound Execution — Code is never written until the FID converges
- Perfection Loop FSM — RED → GREEN → AUDIT → SELF-CORRECT → COMPLETE
- Separation of Duties — The agent that writes code cannot verify it
- 15 Laws — 4 immutable process + 11 extended code laws
Repo Map
| Workspace | Package | Purpose |
|---|---|---|
agents/ |
@savant-code/agents |
Public agent definitions shipped with the CLI |
cli/ |
@savant-code/cli |
CLI source — UI, commands, state, hooks, OpenTUI/React components |
common/ |
@savant-code/common |
Shared types, tool definitions, utilities |
evals/ |
@savant-code/evals |
ECHO-native benchmark v2 runner + legacy eval fixtures |
packages/agent-runtime/ |
@savant-code/agent-runtime |
Agent loop, tool executor, LLM API integration |
packages/code-map/ |
@savant-code/code-map |
tree-sitter code indexing, language detection |
packages/database/ |
@savant-code/database |
Database abstraction layer |
packages/llm-providers/ |
@savant-code/llm-providers |
Public LLM provider shims |
sdk/ |
@savant-code/sdk |
Public SDK — SavantCodeClient, types, build + verify scripts |
scripts/tmux/ |
@savant-code/tmux |
tmux CLI helpers used in interactive test runs |
Quick Start
1. Clone and Install
git clone https://github.com/savant0x/savant-code.git
cd savant-code
bun install
2. Run the CLI (development)
# Run the CLI in dev mode
bun run dev
# Or run with a specific permission mode
bun run dev -- --permission-mode safe
3. Build for Release
# Build the SDK
bun run build:sdk
# Build the CLI binary
bun run build:binary
4. Use the SDK
import { SavantCodeClient } from '@savant-code/sdk'
const client = new SavantCodeClient({
apiKey: process.env.SAVANT_CODE_API_KEY,
cwd: '/path/to/your/project',
onError: (err) => console.error('Savant-Code error:', err.message),
})
const result = await client.run({
agent: 'savant',
prompt: 'Add error handling to all API endpoints',
handleEvent: (event) => console.log('Progress', event),
})
5. End-User Install
# npm
npm install -g @savant-code/cli
6. Use with local Ollama (zero API key)
If you have Ollama installed and running, Savant Code auto-detects it on first launch and routes inference to your local daemon — no API key, no account, no prompts.
# Start Ollama in the background, then run the CLI
ollama serve
savant-code
Run /health inside the chat to verify the Ollama connection, available local
models, and current permission mode.
CLI Commands
| Command | What it does |
|---|---|
bun run dev |
Launch CLI in dev mode |
| bun run build:sdk | Build the SDK for npm publish |
| bun run build:binary | Build the CLI binary |
| bun run ci | CI gate — build SDK and release artifacts |
| bun test | Run test suite |
| bun x tsc --noEmit | Type check |
| bun x eslint . --max-warnings 0 | Lint |
ECHO Protocol
This project ships with ECHO Protocol v0.2.0 — the single bootstrap file for agent behavior.
Core Principles
- FID-Bound Execution — Code is never written until the FID converges
- Perfection Loop — RED → GREEN → AUDIT → SELF-CORRECT → COMPLETE
- Separation of Duties — The agent that writes code cannot verify it
- No Deferrals — Every approved work item must be completed
15 Laws
4 immutable process laws (Read 0-EOF, Present Before Act, Verify Before Proceed, Call-Graph Reachability) + 11 extended code laws. strict: true in TypeScript.
Key Files
| File | Purpose |
|---|---|
ECHO.md |
The 15 Laws + Perfection Loop FSM + FID lifecycle |
ARCHITECTURE.md |
Agent roster and tool restrictions |
protocol.config.yaml |
Build commands, quality bar, paths |
dev/fids/ |
Feature Implementation Documents |
dev/session-summaries/ |
Session audit trail |
dev/LEARNINGS.md |
Cross-session lessons |
Configuration
| What | Where | Format |
|---|---|---|
| ECHO Protocol runtime config | protocol.config.yaml |
YAML — language, commands, quality limits |
| TypeScript base config | tsconfig.json |
JSON — strict: true |
| ESLint config | eslint.config.js |
Flat config |
| Bun config | bunfig.toml |
TOML — linker: "hoisted" |
Validation
# Build
bun run build:sdk && bun run ci
# Test
bun test
# Type check
bun x tsc --noEmit
# Lint
bun x eslint . --max-warnings 0
# Format
bun x prettier --write .
Documentation
ECHO.md— The 15 Laws + Perfection Loop FSMARCHITECTURE.md— Agent roster and tool restrictionsprotocol.config.yaml— Build commands, quality barCHANGELOG.md— Release historydocs/launch/landing/index.html— Public landing pagedev/LEARNINGS.md— Cross-session lessonsdev/session-summaries/— Session audit trail
License
Apache-2.0 — see LICENSE for full text.
Savant-Code is the public TypeScript monorepo for the Savant-Code agent framework.
Savant • 2026