# MiniCode **Repository Path**: whijc/minicode ## Basic Information - **Project Name**: MiniCode - **Description**: TypeScript + Node.js 本地 CLI Code Agent,支持工具调用、权限审批、会话恢复、上下文压缩、Skill、模型切换与 MCP。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-13 - **Last Updated**: 2026-09-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MiniCode 单用户、单进程、本地 CLI Code Agent,支持串行工具、权限审批、自动上下文压缩、本地 Skill 和线性 JSONL 恢复。使用 TypeScript + Node.js,默认 DeepSeek V4 Flash(非思考模式),支持 Run 边界切换模型。进度和证据见 [plan/README.md](plan/README.md)。 M7 权限审批、M8 检查点及有限回滚、M9 模型注册与切换已完成。M10 本地 stdio MCP 已实现,验收见 [MCP 计划](plan/10-mcp-client.md)。[能力路线设计](docs/07-capability-roadmap.md) 中的只读及 worktree 多 Agent、系统沙箱仍属 M11–M13 规划;历史证据分别保留。 学习入口:[MiniCode 完整教学手册](docs/handbook/README.md)。15 个专题直接讲解数据结构、核心代码、状态变化、上下文压缩、记忆恢复、Skill、权限与验证,源码链接用于复核。 后续设计:[多 Agent 专项设计](docs/08-multi-agent-design.md)。采用单层主子协作、独立 Session、统一预算与证据交付,先只读委派、再 worktree 修改和批准合并;属于 M11/M12 提案,尚未实现。 实施配套:[多 Agent 交接与验收指南](plan/multi-agent-handoff.md),包含启动门槛、S01 决策、逐场景证据、故障注入和阶段任务指令;不代表已获功能开发或真实调用授权。 ## 启动 需要 macOS/Linux、Node.js 24.8.x、npm、Bash、Git,以及 PATH 中的 `rg`(ripgrep)。当前真实验收环境是 macOS + Node 24.8.0;Windows 未验证。在 MiniCode 项目目录执行: ```sh npm ci npm run build npm link --ignore-scripts --no-audit --no-fund ``` 之后在任意允许修改的项目目录输入: ```sh cd /绝对路径/测试项目 minicode ``` 首次安装前用 `command -v minicode` 检查是否有其他同名程序;npm 的全局 bin 目录必须在 PATH 中。本地链接不会发布到 npm;不要移动/删除 MiniCode 安装目录。修改源码后执行 `npm run build` 并重启,链接会使用新构建。取消全局链接可运行 `npm uninstall -g minicode`,不删除项目源码。 本地 `.env` 按 [.env.example](.env.example) 填写 DEEPSEEK_API_KEY,默认模型为 `deepseek-v4-flash`。凭证文件应被 Git 忽略并设为 600;不要在任务或日志中复制密钥。全局命令、`npm start` 和构建产物统一读取 **MiniCode 安装目录** 的 `.env`,仅补齐 DEEPSEEK_API_KEY、DEEPSEEK_MODEL、DEEPSEEK_BASE_URL,已有环境变量优先。不会读取目标项目的 `.env`,不会从文件覆盖代理、PATH 或 NODE_OPTIONS。工作区始终是命令所在目录或 `--cwd` 指定目录,Session 保存到该工作区。 其他入口: ```sh minicode --help minicode --cwd /绝对路径/测试项目 --prompt "修复 Bug,保持公开 API,运行相关测试" # 不安装全局命令时,在 MiniCode 目录执行: npm start -- --cwd /绝对路径/测试项目 node dist/cli.js --cwd /绝对路径/测试项目 ``` 帮助与版本不需要凭证、不创建 Session;新 Session 要求默认模型可用,已结束会话可无凭证只读恢复。离线测试使用模拟模型。缺少凭证时会提示配置入口。 代理:支持 `HTTP_PROXY`/`HTTPS_PROXY` 及小写形式;同名小写优先,`NO_PROXY`/`no_proxy` 可排除指定主机。代理请求的 fetch 和 dispatcher 均来自锁定版本的 Undici;无代理保持默认直连,代理失败不会自动绕过代理。仅设置 `ALL_PROXY` 不会启用该 HTTP(S) 代理适配。升级后需退出仍在运行的旧 CLI 并重新启动;构建启动需先执行 `npm run build`。遇到代理故障,先核对代理是否运行,不要把认证信息或环境变量全集贴进日志。 ## 输入与停止 正常终端会显示欢迎页:项目、模型、Session、常用命令和权限提示。直接输入任务,Enter 发送;Tab 补全 `/help` 等命令名,↑↓ 浏览本次进程的输入历史。助手流式回复、工具名称/结果/退出码、压缩状态分开显示。结束后显示简短状态,完整修改与测试证据用 `/status` 查看。 新版欢迎页以青绿色品牌框、元信息和命令导航分区;恢复会话明确分开“默认模型(新任务)”与“原 Run(恢复快照)”。`/models` 按模型分组,工具进度显示成对开始/结束行;结束卡片显示真实停止原因、模型、用量及下一步,未知用量与副作用不会隐藏。保持终端默认背景与滚动历史,不添加闪烁动画。已安装用户退出旧进程后重新运行 `minicode` 即可看到当前构建。 这是保留滚动历史的轻量终端 UI,不是全屏编辑器。NO_COLOR 禁用颜色;TERM=dumb 降级为基本输入(Node readline 不提供 Tab/历史编辑);非交互管道没有欢迎页和 ANSI。输入是单行,不会把多行粘贴悄悄排队。 普通文本开始新任务;`--prompt` 单次运行后退出,不提供交互审批。忙碌时不排队接收新输入,只有审批提示期间接收审批答复和 `/permissions` 控制。Ctrl+C 取消,空闲时 Ctrl+C 或 `/exit` 退出。EOF 等待正在运行的任务保存;若正在等待审批,则取消并闭合调用。模型结束退出 0 只表示 `model_finished`,不是自动断言任务成功。 | 命令 | 含义 | | --- | --- | | `/help` | 显示命令和快捷键,不调用模型 | | `/status` | 查看 Run、用量、已确认修改、命令退出证据及 Session 路径 | | `/models` | 列出注册别名、模型、能力、价格与禁用原因,不请求模型 | | `/model ` | 空闲时选择下个新任务或 `/continue` 的模型,不创建 Run | | `/checkpoint` | 空闲时保存当前有界文件检查点,显示 ID、覆盖和排除项 | | `/diff ` | 只读预览文件存在性、hash、模式差异及冲突 | | `/rollback [path]` | 逐文件批准恢复,可只选一个相对路径;不调用模型 | | `/skill testing 修复这个 Bug 并测试` | 预检并固定 testing Skill;失败不启动空 Run | | `/resume ` | 沿用原任务、预算及快照恢复;已结束的 Run 只展示 | | `/resolve <核查说明>` | 保存人工核查结果,不覆盖 unknown,不自动重放工具 | | `/continue` | 同一任务开新 Run、新预算;保留任务和 Skill/项目快照 | | `/permissions` | 显示当前 Run 授予、可信项目规则、项目限制与配置位置 | | `/permissions revoke ` | 撤销当前项目的可信规则或当前 Run 授予;审批期间也可执行 | | `/exit` | 空闲时退出;运行中先 Ctrl+C 取消 | ## 模型注册与切换 未创建用户模型配置时,官方 DeepSeek 入口内置 `deepseek`(deepseek-v4-flash)和 `deepseek-pro`(deepseek-v4-pro),共用 DEEPSEEK_API_KEY。例如:`/models` → `/model deepseek-pro` → 输入新任务;或在任务结束后选择模型,再 `/continue` 保留原任务与项目/Skill 快照。选择本身不消耗模型请求。 活跃 Run、待核查副作用或回滚期间禁止切换。新 Run 提交前重新计量完整请求;小窗口容不下时拒绝,不截断任务。`/resume` 固定原提供商、端点、模型、能力与预算;配置漂移时拒绝,不能静默换服务。相同凭证引用可轮换密钥值,新的价格不会替换旧 Run 价格。 自定义注册仅从用户主目录 `.config/minicode/models.json` 读取;文件替代内置列表,修改后重启。禁止目标项目提供此文件来挪用凭证。以下是兼容 Chat Completions 服务的无密钥示例,必须先核实服务实际能力并替换端点/模型名,不能直接当作已验证配置: ```json { "version": 1, "defaultAlias": "custom", "models": [{ "identity": { "version": 1, "alias": "custom", "provider": "openai-compatible", "baseURL": "https://your-provider.example/v1", "model": "your-tool-capable-model", "credentialEnv": "CUSTOM_MODEL_KEY", "capabilities": { "text": true, "tools": true, "streaming": true, "contextWindow": 128000, "maxOutputTokens": 8000, "counting": "utf8-upper-bound-v1" }, "pricing": null } }] } ``` CUSTOM_MODEL_KEY 等自定义凭证需由进程环境提供,不会从安装 `.env` 自动加载;值不写进配置或 Session。可信配置最多 64 KiB/32 项,须当前用户所有且不可由组/其他用户写入(建议 600),拒绝链接和不安全祖先路径;非法配置失败关闭。可在每个模型项加入 `runtime` 数值预算覆盖,优先于项目数值预算;容量收紧后预算组合不合法需显式调整。 兼容范围为文本/function tools、SSE、`max_tokens` 和 `stream_options.include_usage`,不承诺所有 OpenAI 兼容模型。DeepSeek 专属 `thinking=disabled` 不发给兼容服务。无隐式跨模型降级或重定向。`pricing: null` 不视为免费,不能启用 `maxCostUsd`;官方 Flash/Pro 采用版本化峰值未命中价格保守估算,不是账单保证。配置字段与已验证价格见 [接口文档](docs/04-interfaces-and-validation.md#m9-模型配置与恢复身份)。 ## 本地 MCP 服务 仅支持本机已安装且受信任的 stdio/tools 服务。官方 `@modelcontextprotocol/client` 和 `core` 固定 **2.0.0**;本版本只协商 SDK 支持的 **2025-11-25** 协议(initialize),不声称兼容全部/最新 MCP 协议。无需额外模型或模型密钥;让模型选择 MCP 工具仍计入原 Run 的请求/费用预算。 用户手动创建主目录 `.config/minicode/mcp.json`(建议权限 600;拒绝符号链接、其他用户所有、组/其他用户可写或不安全祖先目录)。目标项目的 `.minicode/mcp.json` 不会生效。以下仅为配置模板,工具名必须替换为已审核服务的实际名称;MiniCode 不下载或安装该服务: ```json { "version": 1, "servers": [{ "id": "notes", "command": "/绝对规范路径/node", "args": ["/绝对路径/已审核服务/server.mjs"], "cwd": "/绝对规范路径/目标项目", "env": {"SERVICE_TOKEN": "MY_MCP_TOKEN"}, "tools": [ {"name": "read_note", "effect": "read"}, {"name": "write_note", "effect": "external"} ] }] } ``` command/cwd 必须是 `realpath` 后的绝对路径,cwd 必须位于当前工作区内;args 原样传递,不做 shell 替换。env 左边是子进程变量名,右边是宿主环境变量引用;没有凭证可使用 `{}`。不继承宿主 PATH、代理或模型密钥,不支持 NODE_OPTIONS/NODE_PATH/LD_*/DYLD_* 注入。若服务确实需要 PATH/代理,须显式引用并审核;不要在 args/config 中写密钥值。配置与工具 schema 会进入 Session,环境值不进入;服务响应按启动时环境值脱敏,但不保证识别编码或变形后的秘密。 在对应项目启动 MiniCode 后输入“连接 notes 服务,读取……”。模型先调用 `mcp_connect`(这是工具名,**不是 `/mcp` 命令**);核对启动配置并批准,发现的允许工具才会进入下一次模型请求。每次读/写调用也经过权限层,服务自报的 `readOnlyHint` 不授予权限。审批绑定服务配置、原始工具、schema 和完整参数;`/permissions` 可查看/撤销已授予规则。非交互终端无法确认时明确停止,不启动服务。 Run 结束/取消会关闭连接;恢复仅回放快照,不自动启动服务。重连需重新经过权限判定(用户已保存的精确 project 规则可生效);同 Run 的工具列表/schema 变化会失效,不能悄悄替换旧快照。改配置后新建 Run,再连接发现并重新计量。单服务有分页、工具数量、schema、stdout/stderr 和超时上限;不支持的 schema 禁用,资源链接不自动打开;详见 [运行限制](docs/03-agent-runtime.md#m10-预算与连接约定)。 启动服务和写调用可能产生外部副作用,**stdio 不是沙箱**:服务使用当前用户权限,cwd/只读分类不能阻止其越界读写或联网。M8 不负责回滚 MCP 副作用。写请求发出后失联/取消会标记 unknown,停止本批剩余工具及后续模型调用,不自动重发;先核查服务端状态和残留进程,再 `/resolve <核查说明>`,已结束 Run 使用 `/continue` 重新规划。初始化失败但进程曾启动也需核查。M10 不支持远程 HTTP/OAuth、sampling、resources/prompts、自动安装或多 Agent。 ## 默认权限与审批 升级变化:安全项目读取和 Skill 状态工具默认 allow;`apply_patch`、任何 `shell` 和 MCP 启动/调用默认 ask。命令看起来只读也不自动放行,解释器、脚本、组合命令、重定向均审批完整参数。路径保护和 deny 优先;项目规则只能收紧权限,模型输出、AGENTS.md 和 Skill 正文不能代替批准。 终端显示工具、规范工作区、调用 ID、资源和完整参数后,输入: - `once`:仅本次调用。 - `run`:本进程当前 Run 内的同一工具、资源和参数;不会跨 `/resume`、`/continue` 或重启继承。 - `project`:保存此项目的精确动作规则,后续启动仍可生效;不是整个项目任意命令通行证。 - `deny`:拒绝本次调用,将错误交回模型;Ctrl+C 取消整个 Run。 普通文本不会被当作批准,也不会排队成为下一项任务。参数、规范目标或策略变化会令旧审批失效。等待受 Run 剩余期限和 toolTimeoutMs 约束;超时产生 TIMEOUT 并停止,取消不执行尚未开始的调用。 非 TTY 或 `--prompt` 遇到 ask:生成 APPROVAL_REQUIRED 配对结果,以 `approval_required` 停止(单次模式退出 1),不挂起。请打开交互终端,用 `--resume ` 查看原会话,再 `/continue` 重新规划;旧调用不会自动重放。已有精确可信规则满足当前策略时,非交互仍可执行。 可信用户配置是用户主目录 `.config/minicode/permissions.json`;建议通过 `project` 审批生成参数 hash,使用 `/permissions` 核对或撤销。目标项目 `.minicode/permissions.json` 是独立限制配置,不是数值预算配置。例如禁止文件修改(把占位路径换成真实规范绝对路径): ```json { "version": 1, "rules": [{ "id": "deny-patch", "workspaceRoot": "/绝对路径/项目", "tool": "apply_patch", "resources": ["/绝对路径/项目"], "decision": "deny" }] } ``` 配置限 64 KiB/128 条规则;可信文件须由当前用户拥有且不可被组/其他用户写入,拒绝符号链接、硬链接或不安全路径。非法配置不会回退为允许。项目中的 allow 规则直接报错;ask/deny 优先于可信 allow。资源基于规范绝对路径;search 覆盖受限子文件时也会受限。 project 授予和 Session 记录不是跨文件事务:规则保存后取消或日志写入失败,不自动撤销已保存规则,但本次工具仍须通过日志屏障。撤销期间阻止新授权;撤销写盘失败要核查规则是否仍存在。遗留配置更新锁需人工核查,不能盲目删除。正在运行的 shell 用 Ctrl+C 取消,撤销规则不能撤销已经发生的副作用。 权限是应用层控制,不是系统沙箱。获准 shell 使用当前用户权限,可访问工作区外路径、网络及用户配置;文件工具的限制不能约束 shell 内部行为。M7 没有提供网络隔离开关,系统隔离留给 M13。 ## 文件检查点与有限回滚 新 Run 自动保存有界基线;受控补丁写入前保存原内容,备份或引用日志失败就停止写入。Git 和非 Git 工作区使用相同内容存储,不依赖 commit,不修改 Git index。支持普通文件(含空文件、二进制和模式位),补丁本身仍只支持 UTF-8 新增/修改。 空闲时用 `/checkpoint` 保存一个可识别的点,或从 `/status` 取基线 ID。需要恢复时先 `/diff `,再 `/rollback `。终端会展示当前/目标 hash、存在性、模式、冲突与排除项;必须复制该次提示的 `rollback <完整指纹>` 才批准,普通 `once` 无效。非 TTY 不自动确认回滚。指定单文件时把工作区相对路径放在 ID 后,路径中的空格可直接保留。 只有连续、已记录的变化可恢复。当前内容或模式已被用户改动、原基线与第一次写前状态存在用户变更间隔、受控写入收据与实际观测不一致,都会拒绝覆盖。shell 前后差异仅为 unknown 候选;必须先独立核查文件和残留进程,再输入带 `reviewed` 的完整确认行。它不保证文件由 shell 修改,也不撤销网络、数据库、其他工作区或已推送操作。 恢复前另存全部目标的当前内容,逐文件记录 started/restored。中断后 `/status` 显示部分进度及备份 ID;再次 `/rollback` 同一目标先只读核查已开始项,再对剩余文件重新预览批准。已恢复文件不重写,不能用重复整批执行代替核查。有未核查的工具副作用或 running 回滚时不能继续新 Run。恢复后 `/continue` 开新 Run,回滚事实独立进入模型上下文;历史修改和失败测试记录仍保留,不会被改写成成功。 覆盖报告会列出凭证命名、`.git`、内部状态、依赖/构建缓存、链接、目录元数据、特殊文件、过大或不可读路径。目录只遍历,不恢复目录模式或清理空目录;原有未跟踪文件不会被批量清理。凭证排除基于路径规则,不是通用内容秘密扫描;不要把密钥放进普通源码或 `.env.example`。 完整默认上限、排除规则与持久化顺序见 [运行机制](docs/03-agent-runtime.md#m8-检查点容量与覆盖s01s02)。存储位于 `.minicode/checkpoints/`,包含源文件原始内容,务必 Git 忽略并在分享前检查。容量耗尽时失败关闭,不自动删除历史、暂存或被 Session 引用的备份。若需要清理,先停止相关 CLI,将 Session 与检查点一起归档并验证;确认没有任何 Session 引用后再人工清理完整检查点,不能单独删 blob、改清单或盲目删锁。 ## 项目配置与 Skill 目标项目可创建 `.minicode/config.json`,仅填写需要覆盖的参数,例如: ```json { "maxSteps": 40, "maxModelRequests": 60, "runTimeoutMs": 1200000 } ``` 完整默认值和容量约束以 [运行机制](docs/03-agent-runtime.md#4-初始参数与计量) 为准。token 采用完整序列化请求的保守字节估算,并用实际 usage 向上校准,可能比提供商实际 token 更早触发压缩。达到预算不会额外请求模型总结;未完成任务用 `/continue` 明确开启新预算。费用限制默认关闭,可配置 `maxCostUsd`;计价是固定版本的保守估值,不是账单保证。 将以下内容保存为目标项目 `.minicode/skills/testing/SKILL.md`: ```markdown --- name: testing description: 修复 Bug 时选择测试、定位失败并复测。 --- 先阅读项目测试命令说明,再修改代码。不要删除测试。 运行测试时直接执行命令,不用 echo 或管道掩盖退出码。 失败后阅读真实输出,继续修复并复测;最后列出通过和未验证项。 ``` 每次新任务只发现名称和描述,模型调用 `load_skill` 才激活正文;也可用 `/skill` 显式固定。模型可以卸载自己加载的 Skill,不能卸载用户固定的 Skill。正文在每个请求只出现一次,跨压缩/恢复保留激活时 hash 和正文;磁盘变更会提示,不热更新。新普通任务重选。参考资料相对于该 Skill 的 baseDir,仍由普通文件工具读取当前磁盘;Skill 不会自动运行脚本。 ## 崩溃恢复 用状态卡中的 Session ID: ```sh minicode --cwd /绝对路径/测试项目 --resume ``` 若显示未知副作用:先检查当前文件、`git diff`、对应输出日志和残留子进程,确认命令是否已完成;再输入 `/resolve <真实核查说明>`,随后 `/resume `。不确定时不要编造“已成功”。已完成工具复用结果,未开始项补 skipped,开始但未提交结果的写入/命令标 unknown,旧命令不盲目重跑。取消不会撤销已发生修改。 预算耗尽的 Run 已结束,用 `/continue`,不是反复 resume。恢复模型必须与原 Run 相同。会话锁确认旧 PID 已不存在才回收;未知身份锁需人工核查,不强删。尾部半行隔离到新的有效副本并保留原件,中部损坏拒绝续写。不要随意移动 Session 目录:日志记录规范项目路径。 M10 新记录使用 schemaVersion=5,仍能读取旧 v1/v2/v3/v4 日志。仅查看完成日志不迁移;第一次续写时保留原件、创建并验证副本,再切换有效日志指针。缺完整模型端点身份的旧 Run 不猜测恢复配置;先只读核查,结束后明确选择模型开新 Run,或另开新 Session。旧 Run 不补造 MCP 配置、基线或文件归属。旧调用历史不等于授权,内存单次/Run 授予不从日志重建;未开始调用仍补 skipped,started 后缺少结果仍要求核查。 ## 验证 无凭证的离线验证: ```sh npm run check npm run build npm test npm run test:integration npm run verify ``` `npm run verify` 执行 check/build/单元/集成测试,保存 T01–T28 的名称、源码、命令、退出码和源码 hash。`npm run check:docs` 校验本地链接和接口契约;`npm run demo:clean` 在临时目录安装锁定依赖并验证启动/恢复,不调用真实模型。 M7 完整证据入口为 `node scripts/verify-permissions.mjs all `,实际命令见 [阶段记录](plan/07-permissions.md)。它额外核对 V07-01 至 V07-04 名称映射和真实 PTY 的产物/源码 hash;没有有效 PTY 证据会失败,不把离线 fixture 当作交互验收。源码变化后须重新做受影响的 PTY 验证。 M8 完整入口为 `node scripts/verify-checkpoints.mjs all `,具体已执行命令见 [阶段记录](plan/08-checkpoints.md)。它验证 V08-01 至 V08-04、真实 PTY 产物及执行时源码 hash、全量回归,并保留 Git/非 Git E08 工作区、Session、检查点、失败测试与独立复测结果。缺有效 PTY 或运行期间源码变化会失败;演示模型是确定性模拟,不冒充真实提供商 smoke。 `npm run test:smoke` 会真实请求模型并产生费用:含基础 smoke,以及自主/显式 Skill 两个完整 T29。只运行 T29 可用 `TEST_NAME=T29 npm run test:smoke`。T29 使用独立仓库和较小测试窗口,每次最多 40 请求/24 Step、费用保守预留上限 0.75 USD;不会改变生产默认预算。测试会在摘要持久化后故障退出 86,再用新进程恢复;最终另跑两个测试并检查测试文件 hash。缺凭证、未选择 Skill、测试未运行或恢复失败均记失败,不能跳过冒充成功。 真实和确定性证据保存在忽略的 `.minicode/evidence/`;普通会话在目标项目 `.minicode/sessions/`。建议在目标仓库 Git 忽略中加入 `.minicode/sessions/`、`.minicode/checkpoints/`、`.minicode/evidence/` 和 `.env`。日志和备份可能包含源代码、提示词和测试输出,分享前人工检查。 M7 验证未新增真实提供商调用;本地 HTTP/SSE 与模拟模型仅证明权限/CLI 集成。旧 Bug/故障回归及显式真实 smoke 使用测试专用批准入口,每次明确批准临时仓库动作,不改变生产默认 ask。 M9 门禁:`node scripts/verify-models.mjs all <双模型真实证据目录>`,缺真实证据或运行源码/helper hash 不符即失败。实际记录见 [M9 计划](plan/09-model-routing.md)。收费入口 `node scripts/run-model-real.mjs --accept-budget` 仅用于另行授权的验收,每模型全场景最多 4 请求/4 Step、每请求 60 秒、各 0.05 USD;失败后不得重跑重置累计预算。本轮真实验收为同一 DeepSeek 服务的 Flash/Pro;兼容服务只通过本地 HTTP/SSE 协议验收,不冒充另一家服务实测。既有 T29 的 Skill/压缩/测试修复实测证据保留,本轮不重复其更大的收费预算;其宿主行为仍参加全量离线回归。 M10 门禁:`node scripts/verify-mcp.mjs all `,核对 E10/V10-01 至 V10-04、真实进程 audit/Session/写计数、两次独立恢复、PTY 及运行源码 hash,并执行完整离线回归。详见 [M10 记录](plan/10-mcp-client.md)。模型为确定性脚本,但 MCP 子进程、JSON-RPC、读写、断连与恢复均真实执行;没有新增收费模型调用,也不代表未经配置的第三方服务已通过验收。 ## 边界 文件工具限制在项目根目录,拒绝凭证和内部状态写入。但 `shell` 使用当前用户权限,**不是沙箱**;只应在你信任、允许修改和执行测试的项目运行。取消不回滚已完成修改。命令退出码和日志才是验证证据,`model_finished` 只表示模型结束回复。 不包括多 Agent、长期记忆、向量检索、并行工具、插件安装器、Web UI、发布部署。补丁仅支持严格新增/修改,不支持删除/重命名或多文件事务。文件守卫不承诺防御恶意并发换链;shell 使用当前用户权限。真实模型的一次通过不保证每次选择和推理都相同。