--- version: 1.0 last-updated: 2026-03-04 status: stable --- # 初始化依赖版本固定与安装/升级行为 > 本文档留存「初始化依赖版本固定」「客户端升级后依赖同步」「安装/升级文案」「尊重用户已安装版本」等需求与实现约定。 --- ## 概述 以下四类 npm 包不随应用打包,在 `~/.qimingclaw` 下按配置版本进行初始化安装,并在客户端升级后按新版本同步;同时需尊重用户在「依赖」Tab 下的手动升级结果,不降级已安装的更高版本。 | 包名 | 用途 | |------|------| | qiming-file-server | 文件服务 | | qiming-mcp-stdio-proxy | MCP 聚合代理 | | qimingcode | 引擎 | | claude-code-acp-ts | 引擎 ACP | --- ## 需求与约束 ### 1. 初始化依赖版本固定(installVersion) - **目的**:保证首次安装/初始化时安装的版本稳定、可预期,避免「总是装最新」带来的兼容性风险。 - **实现**:在 `SETUP_REQUIRED_DEPENDENCIES` 中为上述四包配置 `installVersion`,初始化或补装时执行 `npm install @`。 - **范围**:仅影响「初始化/安装缺失依赖」和「依赖 Tab 内一键安装」使用的版本;依赖 Tab 下手动升级行为不受此限制(见下文)。 ### 2. 客户端升级后的依赖同步 - **目的**:应用发新版本时,若配置中的 `installVersion` 发生变化,用户环境中的依赖应被同步到新版本,无需用户手动操作。 - **实现**: - 持久化:`~/.qimingclaw/.init-deps-state.json` 记录当前应用版本及各包「上次同步时的目标版本」。 - 启动时:若检测到应用版本或某包的 `installVersion` 与持久化状态不一致,在后台调用 `syncInitDependencies()`,对需要更新的包执行安装/升级并写回状态。 - **注意**:同步逻辑必须结合「当前已安装的实际版本」判断是否需要升级,避免对用户已手动升级的更高版本做降级(见下节)。 ### 3. 安装与升级的文案区分 - **目的**:当既有「缺失需安装」又有「已装但需升级」时,文案明确区分「安装」与「升级」,避免一律显示「安装」造成误解。 - **约定**: - 初始化向导(SetupDependencies):若存在需升级的依赖,阶段文案使用「正在安装并升级依赖...」/「正在安装并升级 xxx...」;错误态标题/按钮使用「依赖安装与升级」「重试安装并升级」「安装/升级失败」等。 - 依赖页(DependenciesPage): - 批量:既有缺失又有过期时按钮为「安装并升级」;仅过期时为「全部升级」;仅缺失时为「全部安装」。 - 单项:状态为 `outdated` 时按钮为「升级」,否则为「安装」;进行中分别显示「升级中...」「安装中...」;成功/失败提示对应「升级成功/失败」「安装成功/失败」。 - 完成提示:按实际执行结果区分「依赖安装完成」「依赖升级完成」「依赖安装并升级完成」。 ### 4. 结合当前已安装的实际版本(不降级) - **背景**:用户可以在「依赖」Tab 下手动升级某个包到比应用配置的 `installVersion` 更高的版本。若仅以「是否等于 installVersion」判断,会把「已装更高版本」误判为需升级并执行安装,导致被降级。 - **约定**: - **判定需升级的条件**:仅当「未安装」或「当前已安装版本 < 配置的 installVersion」时,才标记为需安装/升级(`outdated` 或执行安装)。 - **判定已就绪的条件**:当前已安装版本 ≥ installVersion 时,视为已就绪,不再提示升级、不执行安装。 - **实现要点**: - `checkAllDependencies`:对上述四包,使用版本比较(如 `compareVersions(已装版本, installVersion)`),只有已装 < 目标时才置 `status === 'outdated'`。 - `syncInitDependencies`:仅当未安装或已装版本低于 `installVersion` 时才执行安装/升级;已装 ≥ 目标则跳过。 - 代码注释中注明:「用户可在依赖 Tab 下手动升级,故以当前已安装的实际版本为准,不降级。」 --- ## 涉及文件与入口 | 类型 | 路径/说明 | |------|-----------| | 配置与检测 | `src/main/services/system/dependencies.ts`:`SETUP_REQUIRED_DEPENDENCIES`、`checkAllDependencies`、`installMissingDependencies`、`syncInitDependencies`、`compareVersions` | | 持久化 | `~/.qimingclaw/.init-deps-state.json`,读写通过 `getInitDepsState` / `setInitDepsState` | | 启动触发 | `src/main/bootstrap/startup.ts`:应用启动后根据状态决定是否调用 `syncInitDependencies` | | 向导 UI | `src/renderer/components/setup/SetupDependencies.tsx`:阶段文案、错误态标题与按钮、安装时传入 `installVersion` | | 依赖页 UI | `src/renderer/components/pages/DependenciesPage.tsx`:批量/单项按钮文案、安装中/升级中文案、`installVersion` 传入 | | 类型与 API | `src/shared/types/electron.d.ts`:`LocalDependencyItem.installVersion`;preload 暴露 `dependencies.installPackage(name, options?)` 支持 `options.version` | --- ## 相关文档 - [Quick Init](./QUICK-INIT.md) — 快捷初始化中约定依赖步骤不可跳过,且上述四包通过 installVersion 初始化并参与 syncInitDependencies。 - 依赖检测与安装的详细逻辑见 `dependencies.ts` 内注释及导出接口。 --- *本文档用于留存需求与行为约定,便于后续维护与排查。*