个人本地 AI 编程工作台 —— 单机优先、数据全本地、自带 API Key 接入任意 OpenAI 兼容模型。
🤖 本项目为 vibecoding 产物:由 AI 编程助手(vibe coding 工作流)全程协作设计与开发,人类角色定位为需求提出、方案评审与验收。设计与实现过程见 PROGRESS.md 与 docs/。
| Web 会话工作台 | Windows 桌面端 |
|---|---|
![]() |
![]() |
视觉遵循 docs/03-ui-design v1.7「赤陶磷光」token 体系:三栏工作台(左侧栏可折叠图标态 · 会话流 · 右侧上下文面板 300px:记忆 / MCP / 子代理 / 后台四 Tab)、设置页七组导航(通用 / Provider 与模型 / 命令权限规则增删与决策审计 / MCP 服务器配置增删 / 快捷键 / 关于 / 工具目录)、后台任务面板(tool.background.list/kill/output:五态状态灯 + 等宽命令 + 终止 + 产出 tail + 2s 轮询)、工具目录(tool.tools.list 三源过滤 + JSON-Schema 参数展开,只读)、决策审计(permission.decisions.list 记录表 + 游标加载更多,只读)、异常态收口(回合失败结构化错误卡 + recoverable 重试重发 / 离线态徽章 / 重连通知条 / 骨架加载条)、键盘可达(会话/规则/MCP/记忆/工具目录 ↑↓·Enter·Delete + 弹窗焦点陷阱与焦点归还 + :focus-visible 焦点环)、会话操作与检索(搜索 / 重命名 / 分叉 / 归档 / 已归档与子会话过滤开关)、压缩可视化(compact 事件端层监听 + 手动压缩 + 「上下文已压缩」提示条)、扩展面板 Hooks 分区(hooks.list 投影 + 授信闭环)、记忆管理器深化(MEMORY.md Markdown 渲染 + memory.search 服务端检索 + 命中高亮)、输入区模型快切(config.providers.switch + 未配置 Provider 引导条)、键盘全局快捷键(Ctrl+N 新会话 / Ctrl+J 上下文面板)、思考块(✻ 思考过程 流式展开 / 完成折叠,随会话持久化)、子代理进度卡(violet 标识,完成折叠汇总)、工具卡五状态(glyph 语言 ◇✱←$ 与 CLI 同源 + 参数摘要按工具域提炼 + 状态底色 tint + diff 行着色)、代码围栏头行语言芯片与一键复制、kbd 快捷键芯片、取景框角标、context 用量条(>80% 琥珀 / >95% 红)、浅色主题(深色 / 浅色 / 跟随系统三态切换,同一套语义 token 重映射)。截图由 pnpm shots:web / pnpm shots:desktop 驱动真实产品入口自动生成(mock LLM + CDP,scripts/),非设计稿。
RainCode 的功能定位与 Claude Code / Codex 对齐:整合代码生成、工具调用、MCP 调用、子代理管理、沙箱执行环境、命令权限控制、项目记忆七大核心模块,提供 CLI 与 Windows 桌面应用双端形态,两端共享同一套后端服务(@raincode/server 唯一组装点)与同一套 RPC 协议(传输无关:进程内 in-memory / 子进程 stdio)。
M3(七模块全量对齐)验收完成 ✅(T3.1T3.9,NFR-17 全量重测与 4.2 对比矩阵核对见 docs/benchmarks/m3-2026-10-02.md;M2 基准见 docs/benchmarks/m2-2026-09-29.md)。M4(工程加固与遗留收口)全量完成 ✅:T4.1 CI(Actions windows-latest 六门禁与本地同集)· T4.2 内核收尾竞态修复 · T4.3 生成式协议目录(docs/generated/protocol-catalog.md,protocol:check 防漂移入 CI)· T4.4 技能模型侧可发现性 · T4.5 Web 端管理面板对齐 · T4.6 防御式模式文档 · T4.7 遗留收口批次 A(dist 安装包 + 双端真浏览器走查)· T4.8 遗留收口批次 B(SSH 真协议端到端 + 真实仓库 CVE 修复样例 + 真实 MCP 任务样例 + Provider 连通矩阵自动化;执行留存 docs/benchmarks/m4-2026-10-04.md)· T4.9 可视化测试缺陷修复批次。M5(扩展机制与上下文治理)进行中 🚧:T5.1 hooks 生命周期 v1 ✅(协议 v1.12 additive:hooks 域 3 方法 + hook.started/completed 事件——hooks.json 双源(user/project,CC 兼容 command 子集)+ project 源 workspace trust 授信(每 dispatch 前重验、绑定配置 digest、撤销立即失效)+ PreToolUse/UserPromptSubmit/PostToolUse/Stop 四生命周期接线(deny 拦截先于权限判定 / additionalContext provenance 注入下一轮 / failed·timed_out 告警不阻塞)+ log-only 审计事件对 hook.invoked/hook.result(stderr 截断落盘)+ 双端 hook 执行投影;pnpm smoke:hooks 五验收用例)· T5.2 沙箱 enforcement 上报 ✅(shared SandboxEnforcement + 四执行域自报:local=partial / docker=full / wsl=partial(偏差申报:02 §5.1 环境隔离非安全边界,dsh 纪律「绝对边界不得当作 full」)/ ssh 按远端探针注入(探针不可得报 partial);bash 结果 data.sandbox/enforcement 每次调用持续携带(后台路径同)+ 非 local 域内容首行 sandbox: <kind> (enforcement: <mode>) 标注;约束面拒绝(TOOL_PATH_ESCAPED)由 ToolExecutor 中央追加模型可见标记 [sandbox: path access denied under partial mode] + 同轮重试提示;协议零变更 58 方法/21 事件)· T5.3 记忆与历史检索增强 ✅(协议零变更:storage history FTS5 trigram part 级索引(消息文本块 + 工具名;tool_result/reasoning 不入)——004 迁移 history_parts/history_fts 派生索引 + versioned 增量迁移(history.idx.<sessionId> 字节偏移续扫、INDEX_VERSION 漂移/进度损坏重扫、UNIQUE+OR IGNORE 幂等、半行尾不推进偏移多字节安全)+ 检索 API 相对分数地板 top×0.15 + 3x 过取样 + LIKE 兜底(MiMo-Code 调研经验,不做 embeddings——01-PRD §1.6 定论)+ 排除当前会话(自指噪声防线);全局记忆 RAINCODE_HOME/MEMORY.md 双层注入 global 先 workspace 后(server memoryLoopEnhancements 唯一组装点);L2 条目 scope 列预留;session_search 模型工具(ctx.searchHistory 通道 server 装配注入、候选裁剪单行化+160 字符片段))· T5.4 compact 预剪枝(microcompact) ✅(协议零变更:full compact 触发前旧 tool result 预剪枝独立 pass——触发阈值 0.9×full compact 线(不做 ZCode 绝对 buffer 偏差申报)+ 白名单 read/bash/grep/glob/web_fetch + 保留最近 5 条 + 最小节省 256 tokens 整 pass 门槛;替换形态 head+marker+tail 按 code point 切分不劈代理对,head+marker+tail ≤ 单条阈值 8192 由配置校验静态保证=单过收敛不变量;compaction.pruned storage 级事件 sourceMessageId 回指原文 + prunedContent 内联——resume/回放与内存一致;不取压缩锁不 bump epoch 压缩锁括弧协议兼容;节省回落 usage 估算可使 full compact 让位;pnpm smoke:compact case D/E)· T5.5 可观测性:config dump + 事件矩阵 ✅(协议零变更:raincode config dump 配置静态归并投影——不 boot 服务逐层列「内置默认 → providers 配置文件 → env → CLI 参数」(Provider 域)/「内置默认 → config.json」(全局域),逐项标来源、permissions/compaction 未接线如实标注、--default-only 损坏诊断跳过文件读取、明文 key/ws token 值绝不入输出(04 §5.4);事件生产者/消费者矩阵 docs/generated/event-matrix.md——gen-event-matrix.mts 扫描源码生成 25 事件(协议 21 + 存储级 4,session.created 双栖)声明/派发/监听分布 + 登记式排除/覆盖/豁免 + 防漏登记守卫,event-matrix:check 与 protocol:check 双生成物同入门禁 6,手改变红实测留档)· T5.6 MCP 工具目录化 ✅(协议零变更:mcp 域启用后 MCP 工具参数 schema 不再全量进模型载荷——目录摘要(预算 10% 窗口封顶 20000 tokens,超预算降级仅名称列表,仍超确定性前缀+省略计数)+ 内置第 13 个工具 mcp_tool_search(BM25 K1=1.2 内存索引,语料=名+描述+递归参数名,相对分数地板 top×0.15,上限 32)按需检索激活,命中自下一轮可调用、新 turn 重置、单 turn 累计有界(32)+ 调度期守卫未加载直调 TOOL_MCP_NOT_LOADED 指引检索(先于 zod/hook/permission);目录 digest 热变更重发布(T4.4 同款);偏差申报:MiMo 上下文压力降级不做、子代理循环维持全量 schema)· T5.7 工程收尾(可裁)(07-dev-plan §11,01-PRD v1.1 已登记;参照 三仓调研报告(MiMo-Code / deepseek-harness / ZCode);遗留项全量登记于 docs/legacy-items.md 并原样保留)。
| 能力 | 状态 |
|---|---|
| Agent 内核(turn 状态机 / 会话生命周期 / checkpoint 恢复 / epoch 守卫 / 受限重试) | ✅ M1 |
| 工具调用(13 个内置工具 / 声明式权限元数据 / 只读并行 / 输出预算裁剪) | ✅ M1~M5 |
| 命令权限控制(五级判定链 / bash argv 求值 / grantId 审批闭环 / 三层规则 / 审计) | ✅ M1 |
| 控制面协议(55 方法 / 19 事件 / 密钥引用制 / capability 协商) | ✅ M2/M3 |
| 上下文压缩 compact(80% 阈值自动触发 / 异步不阻塞 / 记忆抽取钩子) | ✅ M2 |
MCP 接入(stdio / Streamable HTTP / SSE,mcp__<server>__<tool> 命名空间;运行时启停 / 健康检查 ping) |
✅ M2/M3 |
| 子代理管理(profile 双源解析 / 并发槽排队 / 级联取消 / 事件镜像合并) | ✅ M2 |
| 项目记忆(MEMORY.md 注入 / FTS5 检索 / 会话记忆抽取 / 晋升草案待确认区 / 桌面记忆管理器) | ✅ M2/M3 |
P1 工具(web_fetch SSRF 防护 / ask_user_question 交互提问) |
✅ M2 |
rpc stdio 绑定 + headless 宿主(raincode serve) |
✅ M2 |
| 桌面端 Alpha(Electron 三泳道 + React,三栏工作台 / 会话流 / 工具卡 / 审批弹窗 / Provider 设置 / 记忆管理器 / 扩展面板 / 斜杠命令面板 / 用量统计 / 右侧上下文面板(记忆·MCP·子代理三 Tab)/ 子代理进度卡 / 侧栏折叠图标态 / 会话时间分组 / ctx 用量条) | ✅ M2/M3 |
| 会话管理(rename / fork / usage 费用估算 / archive / mode) | ✅ M2 |
容器沙箱(Docker / WSL 执行域 + 不可用回退,config.json sandbox 节) |
✅ M3 |
| 远程执行(SSH 远程工作区,复用 Executor 抽象,本地审计保留) | ✅ M3 |
技能与斜杠命令(技能包双源加载 / $ARGUMENTS 模板展开 / 3 个官方示例技能) |
✅ M3 |
插件化(plugins/<name>/ 清单+ES module 契约 / activate-deactivate 生命周期 / 启停持久化 / plugin__<名>__<工具> 命名空间 / 故障隔离不拖垮内核 / 官方示例插件 hello) |
✅ M3 |
| 子代理编排增强(内置角色模板 researcher/reviewer/tester / 并行委派汇聚) | ✅ M3 |
Web 界面(raincode web 宿主 + WebSocket 绑定 / ws.auth 连接级鉴权 / 断线重连 + seq 缺口 resume 补偿 / 浏览器会话工作台) |
✅ M3 |
- Node.js ≥ 20
- pnpm 11(
packageManager已锁定,Corepack 可直接启用) - Windows 优先(开发 / 测试均在 Windows 上进行),理论兼容 macOS/Linux
- 桌面端额外依赖 Electron 33(
pnpm install自动拉取;国内网络建议设置ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/) - better-sqlite3 预编译二进制经 prebuild-install 下载,GitHub release 直连不可达时回退 node-gyp(需 VS C++ 工具链);国内网络建议同时设置
npm_config_better_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/better-sqlite3(prebuild-install 只认下划线形式的npm_config_*环境变量,.npmrc的短横线键不会被转换)
# 1. 安装依赖
pnpm install
# 2. 环境健康检查(可选)
pnpm typecheck && pnpm lint && pnpm architecture:check
# 3. 配置模型 Provider(OpenAI 兼容协议,详见下文「Provider 配置」)
# 最简方式:创建 config/providers.local.json(已被 .gitignore 隔离)
# { "baseURL": "https://your-endpoint/v1", "apiKey": "sk-...", "model": "your-model" }
# ⚠️ 位置注意:该文件按**进程启动 cwd** 解析(`<cwd>/config/providers.local.json`)。
# `pnpm --filter @raincode/cli raincode ...` 的 cwd 是 apps/cli——仓库根的配置不会被读到。
# 二选一:把配置放到 apps/cli/config/providers.local.json,或显式
# --provider-config <仓库根>/config/providers.local.json(也可设 RAINCODE_PROVIDER_CONFIG)。
# 4. 运行 CLI(从仓库根以 tsx 直跑,cwd = 仓库根,config/providers.local.json 直接生效)
node --import tsx apps/cli/src/index.ts ping # 握手:打印协议版本与 capability 列表
node --import tsx apps/cli/src/index.ts run "解释这个仓库的目录结构" # 非交互单轮
node --import tsx apps/cli/src/index.ts chat # 交互 REPL(推荐日常使用)
# 亦可 pnpm --filter @raincode/cli raincode <cmd>(注意上述 cwd 口径)
⚠️ 密钥安全约束:API Key 只存在于内存与本地配置文件,绝不写入任何被跟踪文件、日志、输出或审计(架构级约束,见 docs/04-architecture §5.3)。推荐apiKeyRef: "file:config/apikey.txt"引用制。
pnpm build:cli # apps/cli/scripts/build.mjs → apps/cli/dist/raincode.mjs 单文件 ESM bundle
node apps/cli/dist/raincode.mjs ping # 产物直跑(无需 tsx;migrations 随包分发至 dist/migrations/)
pnpm smoke:bundle # 产物冒烟:构建 + 命令集与协议断言 8 项(CI 独立 job 同款)构建三件套(ZCode build.mjs 参照):原生模块外置清单(better-sqlite3,经 apps/cli 声明依赖解析)、metafile 重复依赖校验(同一包多物理实例即失败,构建期拦截 zod 双实例类问题)、alias 逐条精确声明(@raincode/* 十包);banner 自举注入 migrations 目录 / appVersion / ESM-CJS require 绑定。
| 命令 | 说明 |
|---|---|
raincode ping |
进程内启动 Agent Service 并握手,打印协议版本(也作为冷启动基准打点) |
raincode run "<prompt>" |
非交互模式:创建会话 → 发送 → 流式打印 → 退出;--yes 自动允许工具审批(临时 session 规则,不落库) |
raincode chat |
交互 REPL(见下表),流式渲染 + 工具卡片 + 交互审批 |
raincode serve |
headless stdio 宿主:stdin/stdout 承载 JSONL 协议帧(桌面端 agent 子进程同形态,可人工 cat 调试) |
raincode web |
Web 会话工作台宿主:HTTP(+WS) 监听 ws://127.0.0.1:8787/ws(--port --host 可调);ws.auth 连接级鉴权(--token / RAINCODE_WEB_TOKEN / 自动生成打印到 stderr);--static <dir> 服务浏览器工作台资源(缺省探测 apps/web/dist) |
raincode config dump |
配置静态归并投影(T5.5,不启动服务):Provider 域按「内置默认 → providers 配置文件 → env → CLI 参数」、全局域按「内置默认 → config.json」逐层列并逐项标来源;--default-only 损坏诊断(跳过配置文件读取,只打印内置默认层与 env);明文 key / ws token 值绝不入输出(04 §5.4) |
raincode help |
帮助 |
通用选项(run / chat / serve 共用):--base-url --model --api-key --name --provider-config <path> --workspace <dir> --title <title> --yes。
| 命令 | 说明 |
|---|---|
/exit |
退出(归档提示) |
/sessions |
会话列表(Active / Archived) |
/resume <id> |
恢复会话并切换为当前活动会话(checkpoint + 增量重放 ≤ 1s) |
/rename <title> |
重命名当前会话 |
/fork [title] |
复制全量历史分叉新会话并切换(源会话不动,parent_session_id 回链) |
/usage |
当前会话累计 tokens / 轮次 / 费用估算(Provider 配置单价后显示) |
/mode <normal|plan|auto-accept> |
协作模式切换(plan 写类 deny / auto-accept workspace 内自动放行 / normal 询问) |
/archive [--force] |
归档会话(运行中后台任务未收束时需 --force) |
/compact |
手动触发上下文压缩(低于阈值报 INVALID_PARAMS;压缩期间对话不阻塞) |
/providers |
查看 config 域 Provider 列表与单价 |
/skills |
技能面板:列出可用技能(名称 / 参数提示 / 来源层 / 描述) |
写操作等敏感工具会触发交互式审批,四级数字决策:1 仅本次允许 / 2 本会话始终(写 session 规则)/ 3 项目始终(写 project 规则)/ 4 拒绝。
除上表内置命令外,chat REPL 中 /<技能名> [参数] 会路由到技能(可复用工作流的提示词模板):server 侧展开模板($ARGUMENTS 占位替换为参数;无占位符时参数追加到模板末尾)后按普通输入起 turn,流式渲染与审批闭环完全一致。内置命令名优先于技能名;未知名不是技能时报未知命令提示。
在 <workspace>/.raincode/skills/<name>.md(项目级)或 ~/.raincode/skills/<name>.md(全局,RAINCODE_HOME 数据目录)放置技能文件(markdown + frontmatter,正文 = 提示词模板,workspace 层同名优先):
---
name: review
description: 对指定文件或改动做一轮代码审查(风险分级 + 可执行修复建议)
argumentHint: "<文件或目录或关注点>"
---
你是一名严格的资深代码审查员。请对 $ARGUMENTS 执行代码审查,产出结构化审查报告。
...仓库 examples/skills/ 提供 3 个官方示例技能(review 代码审查 / test-gen 测试生成 / docs 文档生成),复制进上述任一技能目录即可使用;协议面为 skills.list / skills.invoke(06-api-spec §2.9)。
插件 = <RAINCODE_HOME>/plugins/<name>/ 目录(plugin.json 清单 + 入口 ES module),是注册进工具注册表的可执行代码扩展——工具以 plugin__<插件名>__<工具名> 全名注册(tool.tools.list 中 source=plugin),权限缺省从严(needsApproval=true,可用声明或权限规则放宽):
{ "name": "hello", "description": "示例插件", "version": "0.1.0", "entry": "index.mjs" }// index.mjs —— activate 返回工具描述符数组;deactivate 可选(停用时调用)
export function activate() {
return [{
name: "greet",
description: "问候语生成",
parametersJsonSchema: { type: "object", properties: { name: { type: "string" } } },
metadata: { readOnly: true, needsApproval: false, riskLevel: "low" },
async execute(args) { return `Hello, ${args?.name ?? "world"}!`; },
}];
}发布 = 把插件目录拷入 plugins 目录后点扩展面板「刷新」(plugins.rescan 运行时重扫描,免重启装载;CLI 可直接调用该方法)——已有插件不重载不触碰,重复刷新幂等。运行时启停经 plugins.setEnabled(停用名单持久化 plugins.json,目录即配置、停用 ≠ 卸载)。故障隔离:清单/入口/activate 失败 → 该插件 failed(其余插件与内核不受影响),工具执行错误 → 数据级错误回传模型自纠。仓库 examples/plugins/hello 为官方示例插件(greet + word_count 双工具)。
Electron 三泳道架构:main(窗口 + agent 子进程守护 + 帧转发,不解析业务帧)/ renderer(React 18 + Zustand + Tailwind)/ agent 子进程(与 CLI 完全同一 createAgentServiceNode 组装)。
# 开发模式(vite dev server + electron,窗口真实弹出)
pnpm --filter @raincode/desktop dev
# 构建产物(main/preload CJS + agent esbuild bundle + renderer vite bundle)
pnpm --filter @raincode/desktop build
# Windows 安装包(electron-builder nsis;dist 脚本自动完成 electron-ABI 原生模块暂存 + gh-proxy 镜像/winCodeSign 缓存兜底——T4.7 L-04 已自动化并经安装冒烟验证)
pnpm --filter @raincode/desktop distAlpha 功能范围:三栏主界面(可折叠侧栏 + 会话流 + 右侧上下文面板(记忆 / MCP / 子代理 / 后台四 Tab,300px 可折叠 / 竖条唤起) + 输入区)、思考块(✻ 思考过程 流式展开 / 完成后自动折叠,reducer 层 reasoning 独立累积)、子代理进度卡(violet 标识,运行中行级状态灯,完成折叠为单行汇总)、工具调用卡片(五状态:排队 / 运行中 / 成功 / 失败 / 已作废;glyph 语言与 CLI 同源 ◇✱←$;mcp__ 调用与子代理派发带模块徽标;参数摘要按工具域提炼;结果 diff 行着色)、权限审批弹窗(顶部琥珀色带 + 风险徽章 + kbd 快捷键芯片 + 1-4 直选 + Esc 拒绝,弹窗出现时自动接管焦点——消息输入框聚焦时快捷键同样生效)、Provider 设置(添加 / 切换 / 活跃徽章)、记忆管理器(MEMORY.md Markdown 渲染 / 晋升草案确认 / 条目检索与晋升,检索经服务端 memory.search + 命中高亮)、扩展面板(MCP 服务器启停 / 健康检查 / 重试 + 插件启停与状态 + 「刷新」重扫描免重启装载新插件,全局事件活更)、斜杠命令面板(/ 唤起技能清单,↑↓ + Tab 补全,Enter 经 skills.invoke 端到端执行)、会话用量统计(↑/↓ tokens / 回合数 / 费用估算)、会话列表时间分组(今天 / 昨天 / 更早)、侧栏折叠图标态(56px)、ctx 用量条(>80% 琥珀 / >95% 红)、设置页七组导航(通用:主题三态显式选择 / Provider 与模型 / 命令权限:规则增删真实数据 + 「决策审计」只读子区 / MCP 服务器:配置增删 / 快捷键 / 关于:system.version / 工具:只读工具目录三源过滤与 JSON-Schema 参数展开)、会话操作与检索(300ms 防抖搜索框服务端过滤 / 会话项「⋯」菜单:重命名·分叉·归档两段确认 / 「已归档」「子会话」过滤开关默认关 + localStorage 持久化,归档行灰态只读)、压缩可视化(ChatFlow 顶部「上下文已压缩」提示条 + 输入区「压缩」按钮触发 session.compact,用量条联动回落)、扩展面板 Hooks 分区(hooks.list 双源投影 + project 授信/撤销闭环)、后台任务 Tab(tool.background.list/kill/output:五态状态灯 + 终止 + 产出 tail + 2s 轮询 + registry 全量口径注记)、回合失败重试(结构化 error 卡 + recoverable 重试重发)与离线/重连条、骨架加载态、输入区模型快切(config.providers.switch + 未配置 Provider 引导条)、键盘可达(Ctrl+N 新会话 / Ctrl+J 上下文面板 + 列表 ↑↓·Enter·Delete 与弹窗焦点陷阱/焦点归还)、工作区目录选择、流式输出与光标、代码围栏一键复制、子进程崩溃自动重启提示、浅色主题(侧栏「◐」按钮循环 深/浅/跟随系统,localStorage 持久化,跟随系统经 prefers-color-scheme 实时重映射;设置页通用组同状态源显式选择)。视觉遵循 docs/03-ui-design v1.7「赤陶磷光」体系(取景框角标 / 模块标识色 / 减动效偏好全覆盖)。与 CLI 共享同一 RAINCODE_HOME 数据目录——CLI 里开始的会话,桌面端打开即续接。会话列表为数据根全量会话(跨工作区共享、跨端可见,不按工作区过滤——L-20 口径;状态与子会话维度经侧栏开关过滤)。GUI 回归走查:pnpm walkthrough:desktop(CDP 驱动构建产物,14 断言;RAINCODE_WALKTHROUGH_APP_PATH 指向静默安装后的 RainCode.exe 即对安装产物冒烟——T4.7 已验证 nsis 安装包全链路)。
| 工具卡(摘要 v2 + 展开态) | 权限审批弹窗 |
|---|---|
![]() |
![]() |
更多桌面端截图
| 记忆管理器 | 扩展面板(MCP / 插件 + Hooks 分区授信闭环) |
|---|---|
![]() |
![]() |
| 设置页 · 命令权限(规则增删真实数据) | 设置页 · 关于(system.version) |
|---|---|
![]() |
![]() |
| 压缩可视化(手动压缩 + 「上下文已压缩」提示条) | 浅色主题(侧栏「◐」/ 设置页通用组切换) |
|---|---|
![]() |
![]() |
| 侧栏折叠图标态(56px,悬停出 title 提示) |
|---|
![]() |
| 右栏 · 后台任务 Tab(五态状态灯 + 终止 + 产出 tail) | 设置页 · 工具目录(三源过滤 + JSON-Schema 展开) |
|---|---|
![]() |
![]() |
| 设置页 · 决策审计(permission.decisions.list 记录表) | 输入区模型快切(config.providers.switch) |
|---|---|
![]() |
![]() |
| 会话列表键盘高亮(↑↓ 移动行) | 回合失败重试卡(可重试 error) |
|---|---|
![]() |
![]() |
WebSocket 绑定(T3.8,协议 v1.9)——帧协议与方法表零改动,是「传输无关 RPC」设计的最终验证:
# 1) 构建(或 pnpm --filter @raincode/web dev 走 Vite dev server)
pnpm --filter @raincode/web build
# 2) 启动 Web 宿主(HTTP + WS 同端口;装配口径与 raincode serve 一致)
raincode web --port 8787
# stderr 输出:
# [raincode/web] auth token (auto-generated): <TOKEN>
# [raincode/web] rpc endpoint: ws://127.0.0.1:8787/ws
# [raincode/web] workbench: http://127.0.0.1:8787/?token=<TOKEN>&ws=ws://127.0.0.1:8787/ws
# 3) 浏览器打开 workbench URL;token 也可用 --token / RAINCODE_WEB_TOKEN 显式指定- 连接级鉴权(
ws.auth,capability 协商):websocket 绑定的首请求必须是ws.auth { token },成功前一切请求(含system.ping)回UNAUTHORIZED;token 服务端常数时间比较、绝不落盘落日志(04 §5.3)。stdio / in-memory 绑定同生共死,不设门也不暴露该方法。 - 断线恢复:浏览器端指数退避重连(1s ×2 封顶 10s),重连握手成功后对活跃会话
session.resume快照补推(全量重建 + 未决审批);会话事件 seq 跳变(真实丢帧)同样触发 resume 补偿(06 §6.3 第 4 条)。 - 多连接扇出:多个浏览器标签页可同时连接,会话事件投递到全部活跃连接;多标签审批弹窗互相同步(同一
pendingApprovals投影)。 - 心跳:宿主 30s 周期 WS ping 探活,空闲连接自动断开;
RAINCODE_WS_DELTA_WINDOW_MS可调大流式批量窗口(广域网)。
Alpha 功能范围:会话列表(今天/昨天/更早时间分组)/ 新建 / 切换、会话搜索(300ms 防抖服务端过滤)与会话操作(重命名 / 分叉 / 归档两段确认;「已归档」「子会话」过滤开关默认关)、工作区路径输入、三栏布局(右侧上下文面板:记忆 Tab 摘要卡与检索(服务端 memory.search + 命中高亮)/ MCP Tab 状态灯实时刷新与启停重试 / 子代理 Tab 运行中与历史 / 后台 Tab 任务五态与终止)、子代理进度卡(violet 标识 + 完成折叠汇总)、会话流式渲染(markdown 轻渲染、思考块流式展开 / 完成后自动折叠、工具卡五状态与模块徽标、代码围栏一键复制)、交互审批(四级决策 + kbd 快捷键芯片 + 键盘直选)、设置页七组导航(与桌面端同构:通用 / Provider 与模型 / 命令权限规则增删与决策审计 / MCP 服务器配置增删 / 工具目录 / 快捷键 / 关于)、压缩可视化(「上下文已压缩」提示条 + 「压缩」按钮)、扩展面板 Hooks 分区(授信/撤销闭环)、后台任务 Tab / 工具目录 / 决策审计 / 回合失败重试与离线·重连·骨架态 / 输入区模型快切、键盘可达(Ctrl+N / Ctrl+J + 列表 ↑↓·Enter·Delete 与弹窗焦点陷阱/焦点归还)、Provider 设置、连接状态条(重连可视化)、ctx 用量条(>80% 琥珀 / >95% 红)、管理面板四件套——记忆管理器(MEMORY.md Markdown 渲染 / 草案确认 / 条目检索晋升 + 服务端检索命中高亮)、扩展面板(MCP 状态启停与健康检查 + 插件启停)、斜杠命令面板(/ 唤起技能清单,↑↓/Tab 补全)、用量统计(侧栏 ↑/↓ token 与回合数)——与桌面端同构消费同一服务面(T4.5,L-08 核销)、浅色主题(与桌面端同语义:侧栏「◐」循环 深/浅/跟随系统,localStorage 持久化)。视觉与桌面端统一(docs/03-ui-design v1.7「赤陶磷光」token 体系,UI 重设计轮自 ink-* 简化盘迁移)。真浏览器回归走查:pnpm walkthrough:web(Edge/Chrome headless CDP 驱动真实 raincode web 入口,19 断言:鉴权 / 会话 / 审批落盘 / 宿主重启恢复 / 多标签扇出与标签冻结补偿——T4.7,L-05 核销)。
| 会话流(思考块 + 工具卡 + 语言芯片围栏) | 权限审批弹窗(kbd 快捷键直选) |
|---|---|
![]() |
![]() |
更多 Web 端截图
| 斜杠命令面板 | 记忆管理器 | 扩展面板(Hooks 分区) | 设置页 · 命令权限 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 压缩可视化(手动压缩 + 提示条) | 设置页 · 关于(system.version) |
|---|---|
![]() |
![]() |
| 浅色主题(与桌面端同语义三态切换) | 右侧上下文面板 · 子代理 Tab(历史派发 + 轮次) |
|---|---|
![]() |
![]() |
| 侧栏折叠图标态(56px,悬停出 title 提示) |
|---|
![]() |
| 右栏 · 后台任务 Tab(五态状态灯 + 终止 + 产出 tail) | 设置页 · 工具目录(三源过滤 + JSON-Schema 展开) |
|---|---|
![]() |
![]() |
| 设置页 · 决策审计(permission.decisions.list 记录表) | 输入区模型快切(config.providers.switch) |
|---|---|
![]() |
![]() |
| 会话列表键盘高亮(↑↓ 移动行) | 回合失败重试卡(可重试 error) |
|---|---|
![]() |
![]() |
优先级(低 → 高,字段级就近覆盖):① 配置文件 → ② 环境变量 → ③ CLI 参数。
// 形态二:多 Provider + 活跃项(运行时 /providers、config.providers.switch 切换)
{
"providers": [
{ "id": "p1", "name": "main", "baseURL": "https://a/v1", "model": "m1",
"apiKeyRef": "file:key1.txt",
"inputPricePerMtok": 0.14, "outputPricePerMtok": 0.28 },
{ "id": "p2", "name": "backup", "baseURL": "https://b/v1", "model": "m2", "apiKey": "sk-..." }
],
"activeProviderId": "p1"
}inputPricePerMtok / outputPricePerMtok(USD / 百万 token)配置后 /usage 与 session.usage 给出费用估算。
export RAINCODE_PROVIDER_BASE_URL="https://your-endpoint/v1"
export RAINCODE_PROVIDER_MODEL="your-model"
export RAINCODE_PROVIDER_API_KEY="sk-..."
export RAINCODE_PROVIDER_NAME="my-provider" # 可选
export RAINCODE_PROVIDER_MAX_CONTEXT_TOKENS=32768 # 可选,缺省 32768raincode chat --base-url https://your-endpoint/v1 --model your-model --api-key sk-...未配置 Provider 时 CLI 仍可启动(ping / sessions / resume 可用),run / chat 发送时报 CONFIG_PROVIDER_NOT_FOUND 引导配置。
全部本地状态落在 RAINCODE_HOME(缺省 ~/.raincode):
~/.raincode/
├── raincode.db # SQLite(WAL):sessions / permission_rules / permission_decisions /
│ # approvals / memory_entries(FTS5 trigram)/ schema_migrations
├── sessions/ # JSONL 会话事件流(按 workspace 分目录;checkpoint 恢复点内联)
├── config.json # 运行时配置(Provider 多项 / activeProviderId;apiKey 只存 file: 引用)
├── mcp.json # MCP 全局服务器配置
├── agents/ # 全局子代理 profiles(<name>.md)
└── skills/ # 全局技能(<name>.md;斜杠命令模板)
<workspace>/.raincode/ # 项目级(随仓库,可入库共享给团队)
├── MEMORY.md # 项目记忆(模板初始化;Agent 章节自动维护 / 用户章节手动)
├── plugins/ # 插件目录(T3.5:plugin.json + 入口 index.mjs;发布 = 目录拷入)
├── plugins.json # 插件停用名单(目录即配置,仅状态持久化)
├── mcp.json # 项目级 MCP 配置(与全局冲突键拒绝)
├── agents/<name>.md # 项目级子代理 profiles
└── skills/<name>.md # 项目级技能(同名 workspace 层优先)
与 Claude / Cursor 生态 mcpServers 约定兼容。三种 transport:
// ~/.raincode/mcp.json(全局)或 <workspace>/.raincode/mcp.json(项目级)
{
"mcpServers": {
"filesystem": {
"transport": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "D:\\workspace"],
"env": {}, // 可选;注入前经脱敏过滤
"timeoutMs": 60000,
"enabled": true
},
"remote-api": {
"transport": "http", // 或 "sse"
"url": "https://mcp.example.com/stream",
"headers": { "Authorization": "Bearer ..." }
}
}
}- MCP 工具以
mcp__<serverKey>__<toolName>命名空间注册进工具系统,权限元数据从严(needsApproval=true),与内置工具同走三态判定。 - serverKey 由 map 键承载(Claude/Cursor 生态 mcpServers 约定;条目内显式
serverKey字段可省,给出时须与键一致——T3.9 起两种形态均接受)。CLI /serve/web/ 桌面 agent 全入口默认装配 mcp 域:全局层~/.raincode/mcp.json总是生效;project 层<workspace>/.raincode/mcp.json在单工作区入口(run/chat --workspace)生效,多工作区入口(桌面 / web)仅全局层;损坏配置降级为 stderr 告警 + 域空转,不阻断 agent 启动。 - 连接状态机:Disconnected → Connecting → Connected,失败指数退避重连(1/2/4/8/16s,5 次耗尽 → Failed);单 server 故障仅影响自身命名空间(失败隔离)。
- 断连重连后工具清单自动刷新;
mcp.server_status_changed事件实时上报状态。 - 也可运行时经 RPC 管理:
mcp.servers.list/add/remove/retry/setEnabled/health(桌面端 MCP 面板同源)。 - 运行时启停:
setEnabled(false)停用(断连 + 工具注销 + mcp.jsonenabled持久化,配置保留可再启);setEnabled(true)受理即返重连。 - 健康检查:
mcp.servers.health对 Connected server 发 MCPping实测 RTT;其余状态只读投影(探测不建连、不改状态机,自动恢复仍由调用超时与重连链路承担)。
在 <workspace>/.raincode/agents/<name>.md 或 ~/.raincode/agents/<name>.md 放 markdown profile(frontmatter 手写解析,正文 = 子代理系统提示):
---
name: reviewer
description: 代码审查专家:只读分析,输出结构化审查意见
tools: read, glob, grep
maxTurns: 20
---
你是严格的代码审查员。逐文件检查传入范围,输出:问题清单(严重度/位置/建议)。- 主代理经
agent工具派发:{ profile: "reviewer", task: "审查 src/rpc" },阻塞等待子会话终态、结论回传主循环(子代理中间过程不污染主上下文)。 - 内置角色模板(M3 T3.6):未放置任何 profile 时也有开箱即用的
researcher(只读调研)/reviewer(代码审查)/tester(测试执行)——解析链 workspace → global → 内置,用户同名 profile 遮蔽内置;同轮多个agent调用经只读并行并发执行(上限 4),完成通知按批次合并回主循环。 - 并发槽缺省 4,超限 FIFO 排队(
queuePosition可见);subagent.stop级联取消。 - 子代理事件镜像(spawned / progress / completed)500ms 窗口合并,终态永不合并。
- profile 缺省
tools只读白名单,层级固定 2(子代理不可再派孙子代理)。
| 工具 | 说明 | 权限元数据 |
|---|---|---|
read |
读文件(行号窗口 / 图片) | 只读,自动放行 |
write |
写文件(workspace 路径守卫) | 写操作,需审批 |
edit |
精确文本替换(唯一性校验) | 写操作,需审批 |
bash |
受控 shell 执行(超时 / 输出预算 / 后台任务 / argv 级规则求值) | 按命令求值 |
glob / grep |
文件名模式 / 内容搜索(默认忽略 node_modules、.git) | 只读,自动放行 |
todo_write |
任务清单维护(会话内计划跟踪) | 无副作用 |
skill |
调用技能包(系统提示目录自主发现;展开模板回传同 turn 续答;modelInvocable 开关约束) |
无副作用,自动放行 |
web_fetch |
抓取 URL 转文本(SSRF 强制黑名单:私网/环回/DNS 解析校验/重定向逐跳防护) | network,从严审批 |
ask_user_question |
向用户提问并等待应答(复用审批闭环;CLI 提问卡 / 桌面弹窗) | 无副作用 |
session_search |
跨会话检索历史(part 级 FTS + 相对分数地板;T5.3) | 无副作用,自动放行 |
mcp_tool_search |
MCP 工具目录检索(BM25 K1=1.2 目录摘要 + 按需加载,命中自下一轮可调用;T5.6) | 无副作用,自动放行 |
MCP 工具(mcp__<server>__<tool>)与子代理派发(agent)在同一注册中心与权限体系内运行。MCP 工具目录化(T5.6):mcp 域启用后 MCP 工具参数 schema 不再全量进模型上下文——模型侧见目录摘要(预算 10% 窗口封顶 20000 tokens,超预算降级名称列表)+ mcp_tool_search 按需检索(BM25),命中工具自下一轮起可调用(未加载直调以 TOOL_MCP_NOT_LOADED 拒绝并指引,权限与审批链不变)。所有工具执行统一受并发上限(只读可并行,写串行)、单调用超时与 256KB 输出预算裁剪约束。
bash 与后台任务的执行环境经 Executor 抽象投递(02 §5.3 扩展点),在 RAINCODE_HOME/config.json 配置:
{
"sandbox": {
"executor": "docker", // local(缺省)| docker | wsl | ssh
"image": "node:20-bookworm-slim", // docker 专用,缺省如左
"network": "none", // docker 网络策略:none(缺省,断网隔离)| bridge
"wslDistro": "Ubuntu-22.04", // wsl 专用,缺省默认发行版
"ssh": { // ssh 专用(executor=ssh 时必填)
"host": "build.example.com",
"user": "deploy", // 可选,缺省当前用户
"port": 22, // 可选
"identityFile": "C:/keys/id_ed25519", // 可选;BatchMode 下密钥不通即回退
"remoteWorkspaceRoot": "/srv/work/ws" // 远端 workspace 根(与本地一一映射)
}
}
}- docker(ES-3):容器内仅挂载 workspace(文件系统隔离,主机其余路径不可见)+ 缺省断网;命令经
docker run --rm执行,workdir 自动映射(D:\ws\docs→/workspace/docs);CLI 进程退出后 best-effortdocker rm -f清理容器。 - wsl(ES-4):Linux 环境隔离(
wsl --cd自动翻译路径);发行版文件系统完整可见——环境隔离而非安全边界。 - ssh(ES-5 远程执行):命令经
ssh在远端主机执行,本地 cwd 前缀映射到remoteWorkspaceRoot(远端仓库修改 → 远程测试 → 结果回传);连接参数含-o BatchMode=yes(密钥不通即收敛,不挂交互提示);本地审计记录保留——JSONL 事件流、审批审计均落本地RAINCODE_HOME,与执行域无关。 - 回退与标记:执行域不可用(CLI 探测失败——本机未装 Docker/WSL 发行版、SSH 主机不可达或连接配置缺失)自动回退 local 并在 stderr 告警;bash 结果
data.sandbox与非 local 时的内容头行标注真实执行环境。local 模式保持 P0「约束非隔离」语义(路径守卫 / 审批前置 / 超时终止不变)。
- 五级判定链:显式 deny → 显式 allow(含通配)→ ask 规则 → 协作模式缺省(plan 写类 deny / auto-accept workspace 内 allow(机器级操作保守不放行)/ normal 询问)→ 默认 ask。
- 规则三层作用域:
session(内存,会话结束即弃)/project(SQLite,按 workspace 隔离)/global(SQLite 全局);层级内deny > ask > allow收敛,同键后写覆盖。 - bash 命令级求值:argv 语义拆解(非字符串前缀),高危根命令(
rm/del/format等)通配 allow 强制降级 ask——宁可误问不可漏拦。 - 审批闭环:ask →
grantId审批单(120s 超时按 deny 收敛)→ CLI 交互或桌面弹窗应答 →permission.resolved事件 + 审计落库;单消费(重复应答报PC_GRANT_CONSUMED)。 - 路径越界防护:workspace 外写操作强制升级 ask,获批后精确放行该绝对路径。
- 规则管理:
permission.rules.list/add/remove(scope + tool + pattern),决策审计permission.decisions.list可追溯。
- L1 项目记忆
<workspace>/.raincode/MEMORY.md:每次会话全文注入 systemPrompt;结构化章节(项目概览 / 技术栈 / 约定等)由 Agent 自动维护,<!-- user -->用户章节仅手动修改(越界写入被拒)。 - L2 会话记忆:会话归档 / compact 前由 LLM 抽取关键事实落
memory_entries(FTS5 trigram 检索),幂等去重、矛盾条目 supersede;memory.search关键词检索、memory.write手工写入、memory.promote将会话记忆晋升进 MEMORY.md 指定章节(需用户确认)。 - L3 晋升草案待确认区:抽取落盘的高置信(confidence ≥ 0.8)新条目自动生成晋升草案(kind → 章节预填,todo 与低置信排除),
memory.drafts.list/resolve待用户确认合入或忽略;直接管 promote 同条目自动收敛其 pending 草案。 - 桌面记忆管理器:左侧记忆源分桶 / 中部 MEMORY.md 只读预览 / 右侧待确认草案(章节可改、确认合入)+ 条目检索、kind 过滤、置信度与 superseded 标记、直管晋升(03 §6.3 稿件 03)。
| 变量 | 说明 |
|---|---|
RAINCODE_HOME |
数据根目录(缺省 ~/.raincode) |
RAINCODE_PROVIDER_BASE_URL / _MODEL / _API_KEY / _NAME / _MAX_CONTEXT_TOKENS |
Provider 环境变量层 |
RAINCODE_PROVIDER_CONFIG |
Provider 配置文件路径覆盖(缺省 <cwd>/config/providers.local.json) |
RAINCODE_MIGRATIONS_DIR |
迁移脚本目录(仅打包形态内部使用) |
RAINCODE_APP_VERSION |
应用版本注入(仅打包形态内部使用) |
RAINCODE_DESKTOP_VITE_URL / RAINCODE_DESKTOP_NODE |
桌面端 dev 脚本内部使用 |
RAINCODE_CLI_SHOW_REASONING |
CLI 思维链展示开关:1/true 时 reasoning delta 经 stderr 逐条输出(dim+斜体);缺省省略(每 turn 一次 stderr 提示),答案正文 stdout 保持纯净 |
# 工程门禁(四命令 + pinned 校验,提交前必须全绿)
pnpm check:manager # pinned 包管理器校验(packageManager 精确 pinned + lockfile 在位 + 实测版本一致;CI gates 前置步骤)
pnpm typecheck # 全仓类型检查(strict)
pnpm lint # oxlint
pnpm architecture:check # 架构门禁:依赖白名单 / 循环依赖 / 500 行上限 / 深导入 / managedOnly
pnpm test # 单元测试(node:test + tsx,零外呼)
# 冒烟测试(端到端链路,本机 mock,无外呼无真实密钥)
pnpm smoke:p0 # P0 全集(内部并复 compact/mcp/subagent/memory/migrations/kernel/p1tools 等全部 smoke)
pnpm smoke:stdio # stdio 绑定 + headless 六场景
pnpm smoke:e2e # 端到端主链路(单独运行)
pnpm smoke:bundle # CLI esbuild 产物冒烟(自跑 build:cli + 命令集与协议断言)
# NFR 基准(口径见 docs/benchmarks/)
pnpm bench:all # NFR-1/2/3/5/7(冷启动 / 发送开销 / 渲染延迟 / 会话恢复 / 崩溃恢复)
pnpm bench:mem:desktop # NFR-4 桌面端空载内存(先 pnpm --filter @raincode/desktop build;窗口会弹出)
# 产品截图再生(README picture/ 素材;真实入口 + mock LLM + CDP,先构建对应端)
pnpm shots:web # web 22 张(会话流深/浅 / 工具卡 / 斜杠面板 / 记忆 / 扩展+Hooks 分区 / 设置×4 / 压缩条 / 审批 / 右栏×2 / 侧栏折叠 / 工具目录 / 决策审计 / 模型快切 / 后台任务 / 会话键盘 / 回合失败)
pnpm shots:desktop # desktop 21 张(会话流深/浅 / 工具卡 / 审批 / 记忆 / 扩展+Hooks 分区 / 设置×4 / 压缩条 / 右栏×2 / 侧栏折叠 / 工具目录 / 决策审计 / 模型快切 / 后台任务 / 会话键盘 / 回合失败)测试体系与各脚本覆盖范围详见 docs/testing.md;基准留存见 docs/benchmarks/。
RainCode/
├── apps/
│ ├── cli/ # CLI:ping / run / chat / serve(readline REPL + ANSI 富文本渲染)
│ └── desktop/ # 桌面端:Electron main + preload + React renderer + agent 子进程宿主
├── packages/
│ ├── shared/ # 协议 schema(zod 单一事实源)+ 共享类型
│ ├── rpc/ # 传输无关 RPC(in-memory / stdio 绑定;请求-响应 + 事件订阅)
│ ├── llm/ # OpenAI 兼容流式客户端(SSE 归一化 / Provider 差异 fixture 消化)
│ ├── storage/ # SQLite(WAL)+ JSONL 会话流 + checkpoint 恢复
│ ├── agent-core/ # turn 状态机 + 会话生命周期 + 子代理 + 压缩(内核)
│ ├── tools/ # 工具注册中心 + 13 内置工具 + 执行器(并发/超时/输出预算/SSRF/路径守卫)
│ ├── permission/ # 五级判定链 + bash argv 求值 + 审批闭环 + 规则持久化 + 审计
│ ├── server/ # Agent Service 唯一组装点(双端共享;55 方法/19 事件装配)
│ ├── mcp/ # MCP 三 transport 接入 + 连接状态机 + 命名空间工具适配
│ └── memory/ # MEMORY.md 管理 + FTS5 记忆检索 + 会话记忆抽取
├── architecture/ # policy.yaml(架构治理策略,门禁依据)
├── docs/ # 设计文档全集(见 docs/README.md 索引)+ 基准报告 + UI 原型
├── scripts/ # smoke 冒烟 / NFR 基准 / 架构检查 / 打包产物验证
└── PROGRESS.md # 任务进度唯一事实来源
| 文档 | 内容 |
|---|---|
| docs/README.md | 文档索引(按阅读顺序) |
| docs/01-PRD.md | 产品定位 / 功能清单 / NFR 指标 / 竞品对比矩阵 |
| docs/02-module-design.md | 七大功能模块详细设计 |
| docs/03-ui-design.md | 设计 tokens / 桌面端逐界面规范 / 工具卡与审批交互 |
| docs/04-architecture.md | 包划分 / 进程模型 / RPC 抽象 / ADR 决策记录 |
| docs/05-database.md | SQLite 表结构 / JSONL 会话流 / 迁移策略 / 密钥引用制 |
| docs/06-api-spec.md | RPC 协议全集(方法 / 事件 / 错误码 / 版本策略) |
| docs/07-dev-plan.md | 里程碑排期(M1~M3 + §10 M4 增补)/ 任务分解 / 风险清单 |
| docs/legacy-items.md | 遗留项唯一台账(处置口径 / 收口路径 / 保留申报) |
| docs/research/2026-10-03-deepseek-harness.md | deepseek-harness 调研报告(能力对照 / 借鉴决策,M4 规划输入) |
| docs/testing.md | 测试体系:单测 / 冒烟 / 基准 / 门禁 |
| PROGRESS.md | 任务进度唯一事实来源(恢复开发第一步读它) |
欢迎 Issue 与 PR,见 CONTRIBUTING.md。开发前请务必阅读 docs/README.md 文档索引与 PROGRESS.md 当前进度;架构级改动需同步 architecture/policy.yaml 并通过 architecture:check。
MIT © 2026 rain

































