# RP++ - 你的编程副驾驶
**Repository Path**: mian-dev/rp--your-programming-co-pilot
## Basic Information
- **Project Name**: RP++ - 你的编程副驾驶
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-13
- **Last Updated**: 2026-08-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# rp++
[简体中文](https://github.com/rusin-dev/Rp-plus-plus/blob/master/.docs/README.zh.md)
## Introduction
This is a Python-based command-line AI coding assistant. It uses system prompts to constrain the model to play the role of Project Pilot (a senior project engineer), turning vague user intent into a clear execution blueprint. It supports streaming output, interactive conversation, live in-terminal Markdown rendering, multi-provider switching, session recovery, and sub-agent domain delegation.
## Quick Start
```bash
# Clone the repository
git clone git@gitee.com:mian-dev/rp--your-programming-co-pilot.git
cd rp--your-programming-co-pilot
# Create and activate a virtual environment
python -m venv .venv
# Windows
.venv\Scripts\activate
# Linux/macOS
# source .venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# (Optional) Install as an executable command
pip install -e .
# Configure the API key
cp .env.example .env
# Edit .env and fill in non-provider settings (logging, etc.)
# Provider configuration uses JSON: run rp, enter /connect to pick a preset and enter your API key
# (see "Multi-provider and Models" below)
```
Once installed, use the `rp` command (equivalent to `python -m src.main`).
## Usage
```bash
# Single question
python -m src.main -m "Help me design a user login module"
# Enter interactive mode (type exit/quit/q to quit)
python -m src.main
# Specify a different prompt file
python -m src.main -p SYSTEM_PROMPT.md -l general
# Start in a specific working mode (plan / build / auto)
python -m src.main -M plan -m "Help me design a user login module"
# List available prompt files
python -m src.main --list-prompts
```
### Working Modes
| Mode | Description |
| --- | --- |
| `plan` | Planning only, no file modification (defensively disables the `shell` / `write` / `edit` tools) |
| `build` | Implement the requirements directly |
| `auto` | Automatically plan and implement (default) |
- In interactive mode, enter `/mode` to view/switch, or press `Shift+Tab` to cycle;
- On the command line, use `-M/--mode ` to specify the startup mode.
### Sub-Agents (Domain Delegation)
Project Pilot has 5 built-in sub-agents, automatically delegated domain-specific tasks via the `delegate` tool:
| Sub-Agent | Responsibility |
| --- | --- |
| `librarian` | Knowledge retrieval and material organization |
| `frontend_builder` | Frontend code implementation |
| `backend_builder` | Backend code implementation |
| `ui_ux_designer` | UI/UX design |
| `reviewer` | Code review and quality assurance |
Each sub-agent has its own prompt (`src/data/agents/`, with frontmatter declaring the role description and tool allowlist) and an independent LLM invocation loop. Execution is displayed live in the terminal, with mouse-click collapsible panels. Sub-agents neither ask the user questions nor delegate again.
### Slash Commands (Interactive Mode)
When input starts with `/`, a command suggestion box appears automatically: use `↑/↓` or `Tab` to switch candidates, `Enter` to confirm, and `Esc` to close. You can also type the full command and press Enter to run it.
| Command | Description |
| --- | --- |
| `/help` | Show all available commands |
| `/variants` | View/switch thinking intensity (`low` / `medium` / `high` / `max`, passed to the API as `reasoning_effort`) |
| `/models` | List the current provider's available models; `/models ` switches |
| `/connect` | List configured providers; `/connect ` switches |
| `/mode` | View/switch working mode (`plan` / `build` / `auto`) |
| `/compact` | Compact the conversation context (keeps the last 20 messages; `/compact ` to specify) |
| `/usage` | View token usage and context window occupancy |
| `/init` | Generate `AGENTS.md` in the workspace root (`/init -f` overwrites an existing file) |
| `/session` | List saved sessions; `/session ` resumes the specified session and continues the conversation |
| `/clear` | Clear conversation history |
| `/exit` / `/quit` | Quit |
Conversations are automatically saved to `.rp/sessions/` (already added to `.gitignore`); on next launch, use `/session` to restore context.
### Bottom Status Bar & Todo List
The input area has a bottom status bar showing the current mode and model on the right. When the model creates a todo list via `create_todo_list`, it appears in the bottom bar too, separated from the input box by a horizontal rule:
```
────────────────────────────────────────────────────────────
1. [ ] 分析需求
2. [~] 设计接口
3. [x] 编写测试
⏸ auto mode on · /help 查看快捷键 deepseek-v4-flash · deepseek
```
Status markers: `[ ]` pending, `[~]` in progress, `[x]` completed. The todo list is session-scoped and shared with sub-agents; use `todos_update` to advance items as the task progresses. The picker (`/connect`, `/checkpoints`) and command display (`/help`, `/models`, etc.) take precedence over the todo list while they are open.
### Auto Git Repository & Commits
When a session starts, rp automatically initializes a git repository in the workspace root (`ROOT_DIR`) if it is not already one, and creates a commit after each completed round of conversation so every round's changes are snapshotted.
- On first initialization, a safe `.gitignore` is written (only when none exists) to keep secrets and runtime artifacts — such as `.env`, `.rp/`, `log/` — out of version control, followed by an initial baseline commit.
- After each round (including interrupted or errored ones), all workspace changes are staged and committed with a message like `rp: 第 N 轮对话 - `. Empty commits are never created.
- Commits only happen when something actually changed; if git is unavailable or a command fails, it is logged and silently skipped — the conversation is never affected.
- Set `RP_AUTO_GIT=0` in `.env` to disable this feature.
#### Checkpoints & Rollback
Every commit rp creates (initial baseline, per-round, task branches, merges) is recorded with its full hash into `.rp/checkpoints.json`:
- `/checkpoints` opens a visual checkpoint picker (or lists them in non-terminal mode); `/checkpoints ` or `/rollback ` targets a specific commit directly.
- After selecting a checkpoint, rp asks for confirmation, then executes `git reset --hard ` to roll the workspace back to that state. Confirm with `y`, cancel with any other key.
#### Task Branches (Sub-Agent Delegation)
Each task delegated to a sub-agent (via the `delegate` tool) runs on its own branch:
1. rp stashes any uncommitted changes and creates a branch `task/-` from the current HEAD.
2. The sub-agent executes on that branch; its work is committed there.
3. When it finishes, rp shows the change statistics and asks you to review: input `y` to merge the branch back to the main branch (`--no-ff`, then the branch is deleted), or `n` to discard the branch's changes. Any changes stashed before the delegation are restored afterwards.
### Multi-provider and Models (JSON)
Provider configuration is stored in JSON files rather than environment variables:
- **Preset templates**: `src/data/providers/preset/.json`, containing only `type` / `api_url` / `models` / `default_model` (no API key), distributed with the project.
- **Using a preset**: run `rp`, then enter `/connect`. The fixed bottom area shows the list of available providers; use `↑ ↓` to switch and `Enter` to confirm, then you are prompted to enter the API key. The program automatically generates `src/data/providers/.json` (preset metadata + `api_key`) and switches to it.
- **Current selection**: the provider/model selected via `/connect` and `/models` is persisted to `.rp/config.json` and restored automatically on next launch.
`type` selects the transport backend:
| `type` | Backend | Notes |
| --- | --- | --- |
| `openai` | OpenAI SDK → `chat.completions` | Default for OpenAI-compatible providers (DeepSeek, GLM, Kimi, Qwen, MiniMax, etc.) |
| `responses` | OpenAI SDK → `responses` | OpenAI Responses API; `system` becomes `instructions`, tool results become `function_call_output` items |
| `anthropic` | `anthropic` SDK → `messages.stream` | Anthropic Claude; `system` is a separate parameter, `max_tokens` is required (default 8192) |
Missing or invalid `type` causes the provider file to be rejected (and `Config.validate()` reports it explicitly).
Example of manually creating `src/data/providers/.json`:
```json
{
"name": "deepseek",
"type": "openai",
"api_url": "https://api.deepseek.com/v1",
"models": ["deepseek-v4-flash", "deepseek-v4-pro"],
"default_model": "deepseek-v4-flash",
"api_key": "sk-xxx"
}
```
For Anthropic:
```json
{
"name": "anthropic",
"type": "anthropic",
"api_url": "https://api.anthropic.com",
"models": ["claude-opus-4-1", "claude-sonnet-4-5", "claude-haiku-4-5"],
"default_model": "claude-sonnet-4-5",
"api_key": "sk-ant-xxx"
}
```
Other settings are still configured in `.env`:
| Variable | Description | Default |
| --- | --- | --- |
| `RP_VARIANT` | Thinking intensity (`low` / `medium` / `high` / `max`) | `medium` |
| `RP_MODE` | Working mode (`plan` / `build` / `auto`) | `auto` |
| `SEARCH_BACKEND` | Web search backend (`bing` / `ddg` / `auto`; `auto` falls back to bing when ddg fails) | `bing` |
| `LOG_LEVEL` | Log level | `INFO` |
| `LOG_DIR` | Log directory | `log/` |
| `LOG_ENCODING` | Log file encoding | `utf-8` |
| `SESSION_DIR` | Session storage directory | `.rp/sessions/` |
| `RP_AUTO_GIT` | Auto-initialize a git repo at session start and commit after each round (`1` / `0`) | `1` |
| `RICH_COLOR_SYSTEM` | Terminal color system (`auto` / `standard` / `256` / `truecolor` / `windows`) | `auto` |
| `RICH_THEME` | rich theme | none |
| `TAB_SIZE` | Tab width | `8` |
## Directory Structure
The project uses a three-layer architecture: `core` (infrastructure) → `api` (capabilities) → `ui` (presentation).
```
src/
├── main.py # Entry point: assembles the three layers and starts
├── config.py # Configuration and validation (JSON provider presets / mode / variant)
├── core/ # Infrastructure layer
│ ├── logger.py # Logging (file + console)
│ ├── event_bus.py # Event bus (inter-thread communication)
│ ├── prompt.py # Prompt loading
│ └── session.py # Session persistence (JSON save / load / restore)
├── api/ # Capability layer
│ ├── client.py # OpenAI client (background thread + tool invocation loop)
│ ├── agents.py # Sub-agent definition loading and independent run loop
│ └── tools.py # Tool definitions (schemas) and executors
├── ui/ # Presentation layer
│ ├── app.py # rich TUI (Live rendering + event consumption + session recovery)
│ ├── input.py # Input box (slash command completion / mode badge / key bindings)
│ ├── cancel_watcher.py# Background listener for double-ESC, triggers a CANCEL event to interrupt the current answer
│ ├── formatters.py # Compresses tool call arguments into readable name(args) display text
│ ├── mascot.py # Startup mascot
│ └── subagent_panel.py# Sub-agent execution panel (live display / collapsible)
├── data/general/ # System prompts
├── data/agents/ # Sub-agent prompts (frontmatter declares roles and tool permissions)
├── data/providers/preset/ # Provider preset templates (JSON, no API key)
└── data/providers/ # Provider configs generated after using presets (contains API key)
scripts/
├── build_exe.py # One-click Nuitka compilation of a single-file executable
└── launcher.py # Packaging entry point (forwards to src.main:main)
tests/ # pytest tests (core / api / ui / agents / session, etc.)
.github/workflows/ # GitHub Actions: CI / Format / Release / Snapshot / Auto Merge
pyproject.toml # Project metadata, ruff and pytest config, `rp` command entry point
cost_map.json # Reference pricing for mainstream models (CNY / 1M tokens)
```
### Layer Responsibilities
| Layer | Responsibility | Dependencies |
| --- | --- | --- |
| `core` | Logging, inter-thread communication (event bus), prompt loading, session persistence | Standard library + config only |
| `api` | OpenAI requests, streaming output, tool definition and execution, sub-agent running | core |
| `ui` | rich TUI: rendering messages, input interaction, sub-agent panels, consuming events | core + api |
Built-in tools: `ask` (ask the user a question, via the event bus), `read` (read a workspace file), `write` (write a workspace file, content previewed in a code box), `edit` (precise replacement in an existing file, changes shown as a git-style diff), `grep` (regular-expression search), `shell` (execute commands), `web_search` (web search, Bing by default, switchable via `SEARCH_BACKEND`), `web_fetch` (fetch web page content), `delegate` (delegate domain-specific tasks to a sub-agent), `create_todo_list` / `todos_read` / `todos_update` (track a multi-step task's progress). Tool call arguments are displayed in a readable form in the terminal instead of raw JSON. Read/write tools are anchored to the workspace root by default to prevent out-of-bounds access.
Communication model: the UI main thread handles rendering and input; API requests run on a background thread and publish token / tool call / sub-agent event / error events via the `EventBus`, which the UI consumes to update the interface in real time. The `ask` tool uses the bus to ask the UI a question and wait for the user's answer, forming a complete closed loop.
## Development
```bash
pip install -r requirements-dev.txt
ruff check . # Lint
ruff format . # Format
pytest # Run tests (CI covers Python 3.10 ~ 3.13)
```
## Packaging & Release
Use [Nuitka](https://nuitka.net/) to compile the project into a single-file executable (not cross-platform; build separately on each target system):
```bash
# Full build (output in dist/: Windows -> rp.exe, Linux/macOS -> rp)
python scripts/build_exe.py
# Preview the Nuitka command that would run
python scripts/build_exe.py --dry-run
```
GitHub Actions includes `Release` / `Snapshot` workflows:
- `Release`: triggered by pushing a `v*` tag. It runs tests first, then builds with Nuitka on Windows / Linux / macOS, packs the three platform binaries together with `src/data` into `rp-.zip`, generates a `SHA256SUMS` checksum file, and finally creates a GitHub Release. Tags with `-alpha` / `-beta` only publish a source snapshot pre-release and do not build binaries.
- `Snapshot`: automatically (or manually) creates a `snapshot-YYMMDD` source pre-release every Monday.
## Contributing
Issues and pull requests are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).
## License
This project is licensed under the [MIT License](LICENSE).