Reinventing the wheel, but only for those who prefer it non-circular.
A terminal-native AI coding agent with a FORGE-styled CLI, scoped subagents, approvals, sessions, MCP, skills, LSP, and a thin remote execution peer.
The CLI uses native terminal scrollback, Rich Markdown output and prompt_toolkit
line editing. The independent React + Ink TUI lives in reuleauxcoder-tui/.
Both frontends use the same JSON-RPC runtime for chat, slash commands and approvals.
Web tools use environment proxies by default; web.proxy can force a direct
connection or a fixed HTTP/SOCKS5 proxy. See web tool networking.
Inspired by and started as a complete rewrite of CoreCoder.
Download reuleauxcoder-0.11.6.vsix and run Extensions: Install from VSIX in VS Code. In a Remote window, install it on the workspace host. The extension provides a right-side conversation, native diff approvals, editor context and file/image uploads, with Chinese/English UI and a bundled compatible core installer. See the extension guide for setup and requirements.
Install pipx first, then install the release wheel globally:
pipx install https://github.com/RC-CHN/ReuleauxCoder/releases/download/v0.11.6/reuleauxcoder-0.11.6-py3-none-any.whlOr use uv:
uv tool install https://github.com/RC-CHN/ReuleauxCoder/releases/download/v0.11.6/reuleauxcoder-0.11.6-py3-none-any.whlThe wheel includes the React TUI and its JavaScript dependencies. Installation does not require Node or npm. Three commands are available globally:
rcoder --version
rcoder # TUI with Node >=22 in an interactive terminal; otherwise CLI
rcoder-cli # Always use the linear CLI
rcoder-tui # Require the TUI; report missing/old Node or non-terminal I/OAutomatic CLI fallback explains why Node is unavailable. --prompt, --server,
--rpc-stdio and redirected input/output always use CLI/backend mode. A missing
TUI bundle is an installation error with rebuild/reinstall instructions.
The TUI starts its backend with the Python interpreter from the tool's own environment.
uv run rcoder only works inside the project directory. This is intended for development, not for end users.
uv sync
uv run rcoder-cli
# For the TUI, build the bundled resources once (requires Node >=22 and npm):
npm ci --prefix reuleauxcoder-tui
npm run bundle --prefix reuleauxcoder-tui
uv run rcoderCreate ~/.rcoder/config.yaml on the host where the core runs and enter your model credentials:
app:
api_key: "your-api-key"
model: "your-provider-model-id"Then run rcoder config check and rcoder. Loading configuration does not create or rewrite files. The repository's config.yaml.example documents more settings.
For per-project overrides — such as different models, custom MCP servers, or approval rules — create .rcoder/config.yaml in your project root. This file is merged on top of the global config and is entirely optional.
# Only needed if you want project-specific overrides
mkdir -p .rcoder
cp config.yaml.example .rcoder/config.yaml # or write your ownUse rcoder config inspect to inspect redacted settings and rcoder config check to validate them without starting an Agent. The read-only configuration API describes fields, inspects layers and checks files or unsaved buffers even when normal startup fails. Edit YAML through your editor or file tools; model connection tests are optional. Persistent changes take effect on the next core start.
Paste a local image path into CLI or TUI to insert an [Image #1] attachment marker. /attach <path> remains available. Set support_modal: [text, image] on a vision model profile; the default is [text]. Images use compact 256 KiB previews and follow history; switching to a text model preserves saved references. See image input and retention for compression, user-turn retention and remote paths.
The independent React + Ink frontend lives in reuleauxcoder-tui/. It uses the Python runtime over JSON-RPC, with top-level slash menus, command panels, approvals and a persistent composer. Release-wheel users run rcoder or rcoder-tui with Node.js 22+. For frontend development:
npm --prefix reuleauxcoder-tui ci
npm --prefix reuleauxcoder-tui run build
node reuleauxcoder-tui/dist/cli.jsUse rcoder-tui --cwd /path/to/project to choose a workspace, or rcoder-cli for the linear CLI. See the frontend README for TUI keyboard controls and SSH backends.
The VS Code extension supports local and Remote workspaces with a right-side conversation, native editor diff approvals, editor context and clipboard/file uploads. It includes Chinese/English UI and can install a compatible core on the workspace host.
Configure remote relay in .rcoder/config.yaml on machine A:
remote_exec:
enabled: true
host_mode: true
relay_bind: 127.0.0.1:8765
bootstrap_access_secret: <long-random-secret>
bootstrap_token_ttl_sec: 120
peer_token_ttl_sec: 3600Then start host mode with:
rcoder --serverNote:
--serveris still required. It enables server mode, but the relay now listens exactly on the configuredrelay_bindaddress.
After that, you can bootstrap a peer on machine B with:
RC_HOST="https://<HOST>" \
RC_BOOTSTRAP_SECRET='<your-bootstrap-secret>' \
sh -c 'curl -fsSL -H "X-RC-Bootstrap-Secret: ${RC_BOOTSTRAP_SECRET}" "${RC_HOST}/remote/bootstrap.sh" | sh'The bootstrap access secret is checked over HTTPS before the server issues a short-lived one-time bootstrap token embedded into the returned script.
Note: the bootstrap script now includes TTY fallback handling. Even when executed via a pipe (
curl | sh), it will try to attach interactive mode via/dev/tty; if no TTY is available, it automatically falls back to non-interactive mode and keeps the peer online.
ReuleauxCoder integrates with real language servers for code intelligence: go-to-definition, find-references, document-symbols, and on-save diagnostics.
| Language | LSP Server | Install |
|---|---|---|
| Python | pyright-langserver (npx) |
auto-installed via npx |
| TypeScript / JavaScript | TypeScript 7 native LSP; TypeScript 6 legacy adapter | auto-selected (lsp.typescript_mode) |
| YAML | yaml-language-server (npx) |
auto-installed via npx |
| Bash | bash-language-server (npx) + shellcheck |
apt install shellcheck |
| Go | gopls |
go install golang.org/x/tools/gopls@latest |
| C / C++ | clangd |
apt install clangd |
| Rust | rust-analyzer |
rustup component add rust-analyzer |
npx-based servers (Python, TS/JS fallback, YAML, Bash) are installed on first
use with npx -y. TypeScript mode is auto, native, or legacy: native uses
TypeScript 7's tsc --lsp --stdio, while legacy uses
typescript-language-server for TypeScript 6 workspaces. Go, C/C++, and Rust
servers must be installed separately.
The lsp tool provides read-only code intelligence:
goToDefinition— find where a symbol is definedfindReferences— find all references to a symbol across the codebasedocumentSymbol— list all symbols (functions, classes, variables) in a file
The argument-free lsp_status tool reports configured languages, current
transport states, and bounded availability/diagnostic counters without probing
PATH or starting a server. Its single in-memory snapshot exposes only hashed
workspace identities and typed state; launcher commands, paths, and stderr
references are never included.
All LSP operations are read-only and do not require approval.
/help Show help
/reset Clear current in-memory conversation only
/new Start a new conversation (auto-save previous)
/model List model profiles and current active profile
/model <profile> Switch the session main model profile
/model set-main <profile> Persist the workspace main profile
/model set-sub <profile> Persist the workspace subagent profile
/mode Show available modes
/mode switch <n> Switch the current session mode
/shell Choose an execution shell by name, path and environment
/shell wsl <distribution> Discover shells inside a Windows WSL distribution
/shell use <id|name|path> Choose a discovered shell
/shell auto Restore automatic shell selection
/skills Show discovered skills
/skills reload Reload skills from disk
/skills enable <n> Enable one skill
/skills disable <n> Disable one skill
/tokens Show token usage
/goal Manage a persistent goal (TUI panel or CLI controls)
/goal create <objective> Start a goal with the configured budget (unlimited by default)
/goal pause Let the current turn finish; disable automatic continuation
/goal resume Resume the saved goal
/goal budget <tokens|none> Set or remove the cumulative token limit
/compact Compress conversation context
/save Save session to disk
/session List saved sessions (`/session <#|id|latest>` restores one)
/session all Include sessions from every fingerprint
/session <#|id|latest> Restore in the current process
/approval show Show approval rules
/approval set ... Update approval rules
/debug on|off Toggle LLM debug trace
/mcp show Show MCP server status
/mcp enable <s> Enable one MCP server
/mcp disable <s> Disable one MCP server
/agents List background subagent jobs (`/jobs` is an alias)
/agents get <id> Show one subagent job
/agents wait <id> Wait for one subagent job
/agents message <id> <text> Send input at the next safe child round
/agents resume <id> <text> Resume a completed child transcript
/agents cancel <id> Request cooperative cancellation
/agents stop <id> Stop a child, escalating to hard kill if required
/agents cleanup <id> Remove a retained isolated worktree
/config Show effective config values and sources
/thinking Show reasoning content from the last turn
/thinking inline Toggle inline streaming of reasoning content
/thinking effort Show current reasoning effort budget
/thinking effort <low|medium|high> Set reasoning effort (session-scoped)
/quit Exit
Mistyped slash commands (e.g. /thiking) are fuzzy-matched and suggest the closest
known command if within edit distance ≤ 2.
/resetonly clears the current in-memory conversation. It does not delete saved sessions./newstarts a fresh conversation and saves the previous one first whensession.auto_saveis enabled./modellists configured profiles and routing. Session switches do not rewrite global defaults; use/model set-mainor/model set-subfor persisted workspace defaults./shellselects the shell for new local commands in this runtime. Windows users can also choose a WSL distribution and its shell. Existing processes keep running with their original shell. See Shell selection./skillsshows bundled, user and workspace skills;/skills reloadrescans those sources;/skills enable|disable <name>persists skill state in workspace config. Workspace skills override user skills, which override bundled skills with the same name.- The core includes
rcoder-configfor configuring itself through ordinary file edits and read-only checks. Its field reference covers defaults, inheritance, reasoning/thinking, replay and provider limitations. No separate installation is needed in CLI, TUI or VS Code; disable it with/skills disable rcoder-config. Configuration file edits take effect on the next core start; skills reload is not configuration hot reload. - There are 17 bundled skills, including PowerPoint, Word, Excel, PDF, skill creation/installation, project guidance, review, simplification, tests, GitHub CI, UI acceptance, documentation, translation, prose editing and structured data. Instructions and resources are self-contained and written in English; replies follow the user's language. Office libraries and renderers are prepared only when needed, not installed as core dependencies.
/sessionshows a numbered, newest-first list for the current fingerprint. Its preview is the latest real user request, or the goal objective when no user message exists. Restore accepts the displayed number, a full ID, orlatest; it saves the session being left when auto-save is enabled and replays the latest three user turns in the CLI.rcoder -r <id>restores directly on startup./goalmanages one persistent objective per session. The backend continues it between turns, prioritizes user input, and preserves status and cumulative usage across compaction and restore. Budgets default to unlimited and count input minus cached input plus output. See Goal controls and accounting./approval setcurrently supports targets liketool:<name>,mcp,mcp:<server>, andmcp:<server>:<tool>with actionsallow,warn,require_approval, ordeny./mcp enable <server>and/mcp disable <server>update workspace config and try to apply the change at runtime./thinkingshows reasoning content retained from the most recent turn./thinking inlinetoggles inline streaming; the FORGE activity row advances as reasoning chunks arrive and remains in history./thinking effortviews or sets the session reasoning budget.- Subagents use bounded
minimal,recent, orfullparent-context projections and Codex-style asynchronous lifecycle controls: spawn returns immediately; the root can message, inspect, wait for activity, or interrupt a job. Children run in isolated processes, cannot recurse or edit the root Plan, and route scoped tools through the parent Tool Broker and approval path. Typed mailboxes, cumulative budgets, exact transcript checkpoints, cancellation epochs and late-result quarantine survive park/resume;request_guidancereleases the worker slot and resumes the same job after parent/human guidance, including after session restore. Execute jobs retain automatic verification in the live runtime and may use isolated worktrees.
Automatic context compression strategies can be controlled independently with
context.auto_snip, context.auto_summarize, and context.auto_collapse.
All default to true. A model profile may override any switch under
models.profiles.<name>.context; omitted profile fields inherit the global
policy. Disabling an automatic strategy does not disable its manual
/compact force <strategy> command.
The CLI uses terminal scrollback in every mode. Interactive line editing remains
available during execution: additional prompts and deferred commands enter the
backend queue, and approvals temporarily take over input while preserving the draft.
Tab completes slash commands; Alt+Enter inserts a newline. F2 / Ctrl+O prints session,
plan, job, startup and queued-input details; F4 prints retained tool arguments and full
output; /thinking displays reasoning. Ctrl+C clears a draft or interrupts execution;
with queued prompts, the first interrupt promotes them and a second requests a stop.
Press it twice while idle, or use Ctrl+D / /quit, to save and exit.
Live tool output is appended to scrollback; timeout/cancel preserves partial output.
Write/edit approval uses a framed diff and refreshes if the saved file changes.
Assistant output renders as Markdown, formatting complete blocks while streaming.
Sessions persist an append-only JSONL ledger, canonical replay state with
wire-affecting settings, exact hook-transformed request audits, usage observations,
Plan/Progress state, validated semantic checkpoints, and tool artifacts. Resume
preserves the committed prefix and appends environment/config changes at its tail.
The first message creates a discoverable snapshot immediately. During generation,
response text, visible reasoning, and tool output are checkpointed to the ledger
about once per second (or sooner at 64 Ki characters); completed tool results are
written immediately. After a crash, saved output reappears as Recovered … —
session interrupted, without becoming a completed model response or rerunning
tools. A crash can still lose the latest pending batch. Snapshot files are flushed
before atomic replacement, with directory syncing on POSIX. Use rcoder -r <id>
or /session <id> to restore a session. Unsent input drafts are not covered by
backend session persistence.
rcoder [-c CONFIG] [-m MODEL] [-p PROMPT] [-r ID] [--server]-c, --config: path toconfig.yaml-m, --model: override model from config-p, --prompt: one-shot prompt mode (non-interactive)-r, --resume: resume a saved session by ID--server: run as a dedicated remote relay host usingremote_exec.relay_bind-v, --version: show version
uv run ruff check .
uv run pytest -q
(cd reuleauxcoder-agent && go test ./...)The package supports Python 3.10 and newer; CI currently exercises Python 3.12. The real LSP matrix has its own opt-in integration suite.
AGPL-3.0-or-later