技术文档
Angles Code CLI 的完整技术参考:架构、安装、构建、配置、Provider、工具命令、系统提示与安全策略。
概述 #
Angles Code CLI 是一个基于终端的 agentic 编码助手,用 Rust 编写,作为单二进制分发。它把 LLM 变成一个能在你的文件系统、终端、Git 仓库里真正干活的 agent——通过一组 angles-* 工具命令操作环境,配合可配置的审批策略在自主与安全之间平衡。
| 属性 | 说明 |
|---|---|
| 语言 / 运行时 | Rust 2021,单二进制,无运行时依赖 |
| Rust 最低版本 | 1.75.0(install.sh 会校验并自动升级 rustup) |
| 分发 | 预编译二进制 (tar.gz) / 源码编译 / npm 安装器 (@angleschina/angles) |
| 平台 | Linux (x64 / arm64 / armv7 / riscv64) · macOS (Intel / Apple Silicon) · Windows · WSL2 · Alpine |
| Provider | 11 家预设 + 自定义(OpenAI / Anthropic / Gemini / DeepSeek / Grok / MiniMax / OpenRouter / Qwen / GLM / Kimi 等) |
| API 协议 | chat(OpenAI 兼容)/ anthropic(Messages)/ gemini(原生)三选一 |
| 工具 | 30+ 个 angles-* 内置工具,覆盖文件、目录、终端、网络、Git |
| 许可证 | GPL-3.0 |
架构 #
源码组织为 9 个 Rust 模块,职责清晰、单一:
| 模块 | 职责 |
|---|---|
main.rs | 入口点与命令路由,初始化 tokio 运行时 |
cli.rs | Clap CLI 定义、子命令与 help 文本 |
config.rs | ~/.angles/config.json 的加载 / 保存 / 展示 |
provider.rs | 11 家 Provider 注册表(从 providers.toml 构建),含 base_url 与默认模型 |
gateway.rs | TUI 设置向导(基于 dialoguer),五步交互式配置 |
instructions.rs | 系统提示模板渲染,Handlebars 模板 + {{variable}} 注入 |
api.rs | API 客户端(OpenAI / Anthropic / Gemini)+ 流式响应 + 工具调用循环 |
search.rs | 联网搜索引擎 URL 构造器 |
tools.rs | 30+ 个 angles-* 工具实现 + doctor 诊断 |
~/.angles/,二进制位于 ~/.local/bin/angles(Windows: %USERPROFILE%\.local\bin\angles.exe)。所有状态本地化,不上报任何服务器。
仓库结构:
angles-cli/
├── src/
│ ├── main.rs # 入口 & 命令路由
│ ├── cli.rs # Clap CLI 定义
│ ├── config.rs # 配置 load/save/display
│ ├── provider.rs # 11 provider 注册表
│ ├── gateway.rs # TUI 向导 (dialoguer)
│ ├── instructions.rs # 系统提示模板 (handlebars)
│ ├── api.rs # API client + 流式 + 工具循环
│ ├── search.rs # 搜索 URL 构造
│ └── tools.rs # 30+ 工具 + doctor
├── instructions.txt # 13K 系统提示模板
├── providers.toml # Provider 数据源
├── gateway-flow.md # TUI 向导流程规范
├── AGENTS.md # Agent 工具参考
├── Cargo.toml / Makefile / Cross.toml
└── install.sh / install.ps1
安装 #
四种官方安装方式,装到的二进制完全相同:
1. npm(全平台推荐)
npm i -g @angleschina/angles && angles install
npm 包内含 bin/angles.js 启动器与 install.sh / install.ps1。angles install 子命令根据平台调用对应脚本安装 Rust 二进制;其它子命令转发给已安装的二进制。postinstall 钩子只打印提示,不强制编译,不会破坏 npm install 体验。
2. curl 单行(Linux / macOS / WSL2)
curl -fsSL https://raw.githubusercontent.com/ZSJ305/angles-cli/main/install.sh | bash
3. wget 单行
wget -qO- https://raw.githubusercontent.com/ZSJ305/angles-cli/main/install.sh | bash
4. PowerShell 单行(原生 Windows)
irm https://raw.githubusercontent.com/ZSJ305/angles-cli/main/install.ps1 | iex
install.sh 当前要求 root 运行(sudo ... | sudo bash),因为它需要调用包管理器安装编译工具链。Windows 用户被自动引导到 install.ps1。
安装器内部流程
install.sh / install.ps1 共享同一套四步流程,带进度条与剩余时间估算:
- 准备环境 — 先探测预编译二进制 URL 是否可用:
- ✅ 可用 → 跳过编译工具 / Git / Rust 安装,直接进 Step 2 下二进制
- ❌ 不可用 → 装 apt / apk / dnf / yum / pacman / zypper / emerge / xbps / homebrew / winget / VS Build Tools + Git + Rust (≤ 1.75 则升级)
- 安装 Angles — 优先拉取预编译 tar.gz(
angles-<os>-<arch>.tar.gz),失败则 clone 仓库从源码cargo build --release - 配置 PATH — 写入
~/.bashrc/.zshrc/.fish/.nu,可选 symlink 到/usr/local/bin - 验证 & 初始配置 — 执行
angles --version确认,首次安装(无config.json)触发angles gateway向导
支持的环境变量:NO_PROMPT=1(跳过交互)、NO_GATEWAY=1(跳过向导)、DRY_RUN=1(只演示不改)、ANGLES_REPO(自定义仓库)、ANGLES_INSTALL_DIR(自定义安装目录)。
预编译支持矩阵
不是所有平台都有预编译二进制——没有的会 fallback 到源码编译(需要 Rust 工具链)。下表列出 Release v0.1.0 当前覆盖的情况:
| 平台 | 预编译二进制 | 安装方式 |
|---|---|---|
| Linux arm64 (musl 静态) | 有 | 只下载,无需 root / Rust |
| Linux x64 (musl 静态) | 有 | 只下载,无需 root / Rust |
| macOS arm64 (Apple Silicon) | 有 | 只下载,无需 Xcode CLT / Rust |
| macOS x64 (Intel) | 有 | 只下载,无需 Xcode CLT / Rust |
| Windows x64 | 无(规划中) | fallback 编译:需 VS Build Tools + Rust |
| Linux armv7 | 无 | fallback 编译:需 Rust 交叉编译 |
| Linux riscv64 | 无 | fallback 编译:需 Rust 交叉编译 |
源码构建 #
本地构建
# 装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# clone & build
git clone https://github.com/ZSJ305/angles-cli.git
cd angles-cli
cargo build --release
# 安装到 PATH
cp target/release/angles ~/.local/bin/
交叉编译(via Makefile)
| make 目标 | 目标三元组 | 说明 |
|---|---|---|
make setup-arm64 && make arm64 | aarch64-unknown-linux-musl | Linux ARM64 静态二进制 |
make setup-x64 && make x64 | x86_64-unknown-linux-musl | Linux x86_64 静态二进制 |
make macos-arm64 | aarch64-apple-darwin | macOS Apple Silicon(仅 macOS 上可构建) |
Release profile
Cargo.toml 的 release profile 已优化体积:opt-level = "s"、lto = true、strip = true。
快速开始 #
# 首次配置(交互式向导)
angles gateway
# 默认进入对话
angles
# 非交互模式,执行单条指令后退出
angles exec "写一个 Python HTTP 服务器"
# 查看当前配置
angles config
# 查看所有命令
angles help
# 诊断安装 / 配置 / 网络
angles doctor
config.json 字段参考 #
配置存储在 ~/.angles/config.json。完整 schema:
{
"language": "zh-CN", // 全局默认响应语言
"provider": "glm", // provider id,见 providers.toml
"base_url": "https://api.siliconflow.cn/v1",
"wire_api": "chat", // chat | anthropic | gemini
"model": "zai-org/GLM-5.2",
"api_key": "", // 空时读 ANGLES_API_KEY 环境变量
"max_tokens": 16384, // 单次回复 token 上限
"daily_token_budget": 1000000, // 每日 token 预算
"agent_persona": "你是一个专业、高效的编码助手。",
"search_engine": "bing", // bing | baidu | google | yahoo | custom | disabled
"search_engine_url": "", // custom 时使用,{q} 会被替换
"approval_policy": "untrusted", // never | untrusted | on-request
"daily_tokens_used": 0, // 当日已消耗 token(运行时维护)
"daily_reset_date": "2026-07-20" // 每日预算重置日期
}
| 字段 | 类型 | 说明 |
|---|---|---|
language | enum | zh-CN / en-US / ja-JP,决定 agent 默认响应语言 |
provider | string | Provider id,对应 providers.toml 中 [[providers]] id |
base_url | string | API 主机地址(含版本路径,如 /v1) |
wire_api | enum | chat OpenAI 兼容 · anthropic Messages API · gemini 原生 API |
model | string | 模型 ID(如 gpt-4.1、claude-sonnet-4-20250514) |
api_key | string | 留空时从环境变量 ANGLES_API_KEY 读取 |
max_tokens | int | 单次回复 token 上限,默认 16384 |
daily_token_budget | int | 每日总预算,默认 1000000;接近时 agent 会警告 |
agent_persona | text | 2-3 句话描述期望行为,注入系统提示 {{agent_persona}} |
search_engine | enum | 联网搜索引擎 |
search_engine_url | string | custom 时使用,{q} 占位符替换为查询词 |
approval_policy | enum | 工具调用审批策略 |
daily_tokens_used | int | 运行时维护,每日重置 |
daily_reset_date | date | 字符串日期,跨日时自动清零已用 |
Gateway 设置向导 #
angles gateway 启动五步 TUI 向导(基于 dialoguer),任何配置字段都可在向导中修改:
- 语言 — 中文 / English / 日本語,切换后续界面与 agent 默认语言
- 模型提供方 — 11 家预设 + 自定义;选预设自动填 base_url 进入 Key 输入,选自定义先填 URL/Key/Model/协议
- 模型选择 — 从
providers.toml读取每个 provider 的预设列表,最后一项允许手动输入任意 model ID - 偏好 — max_tokens、daily_token_budget、agent_persona 文本、approval_policy
- 联网搜索 — bing / baidu / google / yahoo / 自定义 URL / 关闭;自定义时填
https://.../?q={q}模板
完成后向导写入 ~/.angles/config.json,显示配置摘要,并提示运行 angles chat。
Provider 体系 #
11 家预置 + 自定义,全部从 providers.toml 加载到 provider.rs 注册表:
| id | 名称 | API Host | 协议 | 默认模型 |
|---|---|---|---|---|
openai | OpenAI | api.openai.com/v1 | chat | gpt-4.1 |
claude | Claude (Anthropic) | api.anthropic.com | anthropic | claude-sonnet-4-20250514 |
gemini | Gemini (Google) | generativelanguage.googleapis.com/v1beta | gemini | gemini-2.5-pro |
deepseek | DeepSeek | api.deepseek.com/v1 | chat | deepseek-chat |
grok | Grok (xAI) | api.x.ai/v1 | chat | grok-4 |
minimax | MiniMax | api.minimax.chat/v1 | chat | MiniMax-M1 |
openrouter | OpenRouter | openrouter.ai/api/v1 | chat | openrouter/auto |
qwen | 通义千问 Qwen | dashscope.aliyuncs.com/compatible-mode/v1 | chat | qwen3-235b-a22b |
glm | 智谱 GLM | api.siliconflow.cn/v1 | chat | zai-org/GLM-5.2 |
kimi | Kimi (Moonshot) | api.moonshot.cn/v1 | chat | moonshot-v1-auto |
custom | 自定义 | (手动) | 由用户填 | (手动) |
base_url / api_key / model / wire_api。OpenAI 兼容端点(DeepSeek / Qwen / 百川 / Mistral 等大多数)直接选 chat 协议即可接入,无需改代码。
API 协议适配 #
api.rs 同时支持三种协议:
| wire_api | 请求形态 | 适用 |
|---|---|---|
| chat | POST /chat/completions,OpenAI 格式 | OpenAI 及所有兼容端点(DeepSeek、Qwen、GLM、Kimi、Grok、MiniMax、OpenRouter,含兼容模式通义) |
| anthropic | POST /v1/messages,Anthropic Messages 格式 | Claude(Anthropic 原生协议) |
| gemini | POST /v1beta/models/<model>:generateContent | Gemini(Google 原生协议) |
所有协议都支持流式响应(SSE)。工具调用的循环逻辑统一在 api.rs 内处理:模型发出 angles-* 调用请求 → CLI 解析、根据审批策略决定是否询问 → 执行工具 → 把结果回灌给模型 → 直到模型不再发起新调用。
CLI 命令参考 #
用户可在终端直接调用的子命令:
| 命令 | 说明 |
|---|---|
angles help | 列出所有命令及含义 |
angles config | 显示当前配置(provider / 模型 / 偏好等) |
angles gateway | 启动 TUI 设置向导 |
angles chat | 开始交互对话(默认模式) |
angles exec <prompt> | 非交互模式,执行单条指令后退出 |
angles history | 查看历史会话列表 |
angles resume <id> | 恢复指定历史会话 |
angles plan | 显示 / 管理当前任务计划 |
angles update | 检查并更新 Angles CLI |
angles doctor | 诊断安装、配置、网络连通性 |
Agent 工具命令 #
Agent 通过 angles-* 前缀的工具调用操作环境。全部 30+ 内置工具分组:
文件创建与写入 4
文件读取与搜索 5
文件修改与删除 7
目录与项目 5
终端与执行 3
网络与搜索 2
Git 操作 5
angles-createfile;改文件优先用 angles-replace(精确替换)而非全量 writefile;搜索代码用 angles-grep,搜索文件名用 angles-searchfile;优先用专属 angles-* 命令而非 angles-run 调系统命令。
系统提示 & 模板 #
System prompt 模板存储在 instructions.txt(约 13KB),由 instructions.rs 用 Handlebars 渲染。模板中的 {{variable}} 占位符在运行时从 config 注入:
| 占位符 | 来源 | 作用 |
|---|---|---|
{{arch}} / {{os}} | 运行时检测 | 注入系统架构信息 |
{{language}} | config | agent 默认响应语言 |
{{provider}} / {{base_url}} / {{model}} | config | 当前模型与端点 |
{{max_tokens}} / {{daily_token_budget}} | config | 预算约束 |
{{agent_persona}} | config | 自由文本人设描述 |
{{search_engine}} / {{approval_policy}} | config | 运行时配置上下文 |
模板内置丰富指令:编码准则(修根因、避免复杂度、保持代码风格)、Preamble 消息原则、Planning(5-7 字步骤)、错误处理(重试 2 次、3 次后问用户)、Token 预算意识、危险操作的强制确认。
AGENTS.md 规范 #
仓库任何位置可放 AGENTS.md,为 agent 提供工作指令:
- 作用域 — 从包含该文件的目录起到整棵子树
- 对该子树内触碰的每个文件,必须遵从作用域覆盖它的
AGENTS.md指令 - 冲突优先级 — 更深层嵌套的
AGENTS.md胜出 - 最高优先级 — 直接的 system / developer / user 指令压过
AGENTS.md - 自动加载 — 根目录与从 CWD 到根路径上的
AGENTS.md已随 developer message 注入,无需重复读取;在子目录或 CWD 外工作时需主动检查
典型用法:编码规范、代码组织约定、运行 / 测试说明。
安全 & 审批策略 #
三档审批策略,配置在 approval_policy:
| 策略 | 行为 |
|---|---|
| never | 所有工具调用自动执行,最快但风险最高 |
| untrusted | 只自动执行只读、安全命令;任何破坏性操作都问用户(默认值) |
| on-request | agent 自行判断何时请示,靠 agent 的好判断力 |
angles-deletefile— 永久删除angles-run配合rm -rf/sudo/mkfs/dd等破坏性命令angles-run git push --force- 任何修改工作区外文件的操作
联网搜索引擎 #
angles-websearch 调用 search.rs 构造查询 URL 并返回摘要。
| 引擎 | 特点 |
|---|---|
bing | 通用 + AI 摘要,稳定(推荐) |
baidu | 中文内容丰富 |
google | 覆盖最广,可能需验证码处理 |
yahoo | 备用,覆盖中等 |
custom | 填 search_engine_url,{q} 替换为查询词 |
disabled | 禁用联网搜索 |
原则:准确性重要时优先搜索而非猜测;查询词要具体;搜索失败先简化查询再放弃。
Rust 依赖清单 #
来自 Cargo.toml:
| crate | 用途 |
|---|---|
clap v4 (derive) | CLI 定义与解析 |
serde / serde_json | 配置与 API JSON 序列化 |
toml v0.8 | 解析 providers.toml |
reqwest v0.12 (rustls) | HTTP 客户端 + 流式响应(纯 Rust TLS,无 OpenSSL 依赖) |
tokio v1 (full) | 异步运行时 |
ratatui v0.29 + crossterm | TUI 渲染(gateway 向导) |
dialoguer + console | 交互式提示与终端控制 |
futures v0.3 | 异步流处理 |
handlebars v6 | 系统提示模板渲染({{var}} 注入) |
chrono | 日期处理(预算重置) |
dirs / which | 家目录定位 / 命令查找 |
glob / regex / walkdir | 文件搜索与内容匹配 |
termimad + minimad | 终端 Markdown 渲染 |
colored / indicatif | 彩色输出 / 进度条 |
reqwest 使用 rustls-tls 特性而非原生 TLS——这意味着编译只需 Rust 工具链,不需要系统 OpenSSL 开发包,交叉编译尤其友好。释放默认特性以避免引入 reqwest 的默认 OpenSSL backend。
许可与贡献
GPL-3.0 许可。源码、问题反馈、PR 欢迎:github.com/ZSJ305/angles-cli。