295 lines
11 KiB
Markdown
295 lines
11 KiB
Markdown
# agent-electron-client 重构执行计划(v3)
|
||
|
||
> 适用范围:`/Users/apple/workspace/qiming-agent/crates/agent-electron-client`
|
||
>
|
||
> 基线日期:2026-03-03
|
||
|
||
## 1. 重构目标
|
||
|
||
本次重构以“目录与职责对齐”为核心,不改业务行为,优先解决以下问题:
|
||
|
||
1. `main / preload / renderer` 边界不够清晰,`preload.ts` 仍位于 `src/main/`
|
||
2. `src/main/` 与 `src/renderer/` 顶层存在平铺文件过多的问题
|
||
3. `docs/` 与 `scripts/` 平铺,维护和检索成本高
|
||
4. 部分设置组件疑似死代码,需要在重构窗口期完成判定
|
||
|
||
同时,本轮重构明确以“开发/维护友好基座”为目标,要求后续新增需求可在不破坏边界的前提下快速接入。
|
||
|
||
## 2. 现状核对(与仓库一致)
|
||
|
||
已核对当前代码树,以下结论已确认:
|
||
|
||
1. `src/main/preload.ts` 仍在 `main` 目录
|
||
2. `src/main/startup.ts`、`logConfig.ts`、`serviceManager.ts`、`trayManager.ts`、`autoLaunchManager.ts` 均在顶层
|
||
3. `src/renderer/components/` 和 `src/renderer/services/` 仍为平铺结构
|
||
4. `docs/` 与 `scripts/` 仍为平铺结构
|
||
5. `src/**/*.js` 编译产物目前未发现,旧计划中的“清理 src 下 js 产物”从必做项降为巡检项
|
||
6. `AgentSettings`、`AgentRunnerSettings`、`LanproxySettings`、`SkillsSync`、`IMSettings`、`TaskSettings` 当前无引用;`MCPSettings` 被 `SettingsPage` 使用
|
||
|
||
## 3. 目标结构
|
||
|
||
### 3.1 src 重构目标
|
||
|
||
```text
|
||
src/
|
||
main/
|
||
main.ts
|
||
db.ts
|
||
processManager.ts
|
||
bootstrap/
|
||
startup.ts
|
||
logConfig.ts
|
||
startupPorts.ts
|
||
window/
|
||
serviceManager.ts
|
||
trayManager.ts
|
||
autoLaunchManager.ts
|
||
ipc/
|
||
services/
|
||
preload/
|
||
index.ts
|
||
renderer/
|
||
components/
|
||
pages/
|
||
settings/
|
||
setup/
|
||
modals/
|
||
dev/
|
||
services/
|
||
core/
|
||
agents/
|
||
integrations/
|
||
utils/
|
||
shared/
|
||
```
|
||
|
||
### 3.2 docs / scripts 重构目标
|
||
|
||
```text
|
||
docs/
|
||
architecture/
|
||
release/
|
||
operations/
|
||
reviews/
|
||
|
||
scripts/
|
||
prepare/
|
||
build/
|
||
tools/
|
||
```
|
||
|
||
## 4. 迁移策略(新增)
|
||
|
||
为降低大规模改路径风险,采用“兼容层迁移”:
|
||
|
||
1. 文件迁移到新目录后,在旧路径保留一个短期桥接文件(`export * from 'new-path'`)
|
||
2. 全量业务 import 更新完成后,再统一删除桥接文件
|
||
3. 每个 Phase 完成必须通过 `npm run build`,否则不进入下一阶段
|
||
4. 每个 Phase 一个提交,提交信息带 `refactor(phase-x): ...`
|
||
|
||
## 5. 执行阶段(按提交拆分)
|
||
|
||
### Phase 0:基线保护(先做)
|
||
|
||
1. 记录当前可用命令结果:`npm run build`、`npm run test:run`
|
||
2. 新增重构分支:`feature/electron-client-0.6`
|
||
3. 将本文件作为总入口,后续每个阶段回填“已完成/阻塞/风险”
|
||
4. 基线结果(2026-03-03):
|
||
- `npm run build`:通过
|
||
- `npm run test:run`:通过(147 tests)
|
||
- 已知告警:vite chunk size > 500k、测试阶段 `electron-log` 写系统日志路径出现 EPERM(不影响测试通过)
|
||
|
||
### Phase 1:main 顶层归类(中风险,优先)
|
||
|
||
1. 新建 `src/main/bootstrap`、`src/main/window`
|
||
2. 迁移并更新 import(先迁移再留桥接):
|
||
- `startup.ts`、`logConfig.ts`、`startupPorts.ts` -> `bootstrap/`
|
||
- `serviceManager.ts`、`trayManager.ts`、`autoLaunchManager.ts` -> `window/`
|
||
3. 回归验证:
|
||
- `npm run build:main`
|
||
- 主进程启动冒烟(`npm run dev:electron`)
|
||
4. 完成记录(2026-03-03):
|
||
- 已迁移到新目录:
|
||
- `src/main/bootstrap/{startup.ts,logConfig.ts}`
|
||
- `src/main/window/{serviceManager.ts,trayManager.ts,autoLaunchManager.ts}`
|
||
- 已更新直接引用到新路径:`main.ts`、`ipc/appHandlers.ts`
|
||
- 已添加旧路径桥接文件(短期兼容):
|
||
- `src/main/startup.ts`
|
||
- `src/main/logConfig.ts`
|
||
- `src/main/serviceManager.ts`
|
||
- `src/main/trayManager.ts`
|
||
- `src/main/autoLaunchManager.ts`
|
||
- 验证结果:`npm run build:main` 通过,`npm run build` 通过
|
||
|
||
### Phase 2:preload 提升为一级目录(中高风险)
|
||
|
||
1. 移动 `src/main/preload.ts` -> `src/preload/index.ts`
|
||
2. 更新 `main.ts` 的 preload 产物路径
|
||
3. 更新配置:
|
||
- `tsconfig.main.json` include `src/preload/**/*`
|
||
- `tsconfig.json` 增加 `@preload/*`
|
||
- `vite.config.ts` / `vitest.config.ts` 增加 `@preload`
|
||
4. 回归验证:
|
||
- `npm run build`
|
||
- `npm run dev` 并确认 IPC API 可用
|
||
5. 完成记录(2026-03-03):
|
||
- 已迁移:`src/main/preload.ts` -> `src/preload/index.ts`
|
||
- 已更新主进程路径:`main.ts` 使用 `../preload/index.js`
|
||
- 已更新配置:`tsconfig.main.json`、`tsconfig.json`、`vite.config.ts`、`vitest.config.ts`
|
||
- 已添加兼容桥接:`src/main/preload.ts`(转发到 `src/preload/index.ts`)
|
||
- 验证结果:`npm run build` 通过,`npm run test:run` 通过
|
||
|
||
### Phase 3:renderer/services 分组(中风险)
|
||
|
||
1. 新建 `core/agents/integrations/utils`
|
||
2. 迁移 service 文件并维护 `services/index.ts` barrel(旧路径保留桥接)
|
||
3. 批量修复组件中的服务 import
|
||
4. 回归验证:
|
||
- `npm run build`
|
||
- 关键功能冒烟:setup、auth、mcp、agent runner、lanproxy
|
||
5. 完成记录(2026-03-03):
|
||
- 已迁移到新目录:
|
||
- `core/{api,setup,auth,ai}.ts`
|
||
- `agents/{agentRunner,sandbox,permissions}.ts`
|
||
- `integrations/{fileServer,lanproxy,skills,im,scheduler}.ts`
|
||
- `utils/logService.ts`
|
||
- 已更新调用方路径:`App.tsx` 与相关组件均改为新分组路径
|
||
- 已更新 `services/index.ts` barrel 到新结构
|
||
- 已添加旧路径桥接文件(短期兼容)
|
||
- 验证结果:`npm run build` 通过,`npm run test:run` 通过
|
||
|
||
### Phase 4:renderer/components 分组(中风险)
|
||
|
||
1. 迁移 page 组件到 `components/pages`
|
||
2. 迁移 settings 组件到 `components/settings`
|
||
3. 迁移 setup 与 modal 组件到对应目录
|
||
4. 批量修复 import 路径,重点关注:
|
||
- `App.tsx`
|
||
- `SettingsPage.tsx`
|
||
- `ClientPage.tsx` 样式路径
|
||
5. 回归验证:
|
||
- `npm run build:renderer`
|
||
- `npm run test:run`
|
||
6. 完成记录(2026-03-03):
|
||
- 已迁移到新目录:
|
||
- `pages/{ClientPage,SettingsPage,DependenciesPage,AboutPage,PermissionsPage,LogViewer}.tsx`
|
||
- `settings/{MCPSettings,AgentSettings,AgentRunnerSettings,LanproxySettings,SkillsSync,IMSettings,TaskSettings}.tsx`
|
||
- `setup/{SetupWizard,SetupDependencies}.tsx`
|
||
- `modals/PermissionModal.tsx`
|
||
- 已更新调用方路径:`App.tsx` 与相关组件的相对路径已全部修正
|
||
- 已添加旧路径桥接文件(短期兼容)
|
||
- 验证结果:`npm run build` 通过,`npm run test:run` 通过
|
||
|
||
### Phase 5:文档与脚本目录重排(低风险,后置)
|
||
|
||
1. 按主题迁移 `docs/*` 到 `architecture/release/operations/reviews`
|
||
2. 按用途迁移 `scripts/*` 到 `prepare/build/tools`
|
||
3. 更新 `package.json` scripts 路径与 electron-builder 的 `afterSign`
|
||
4. 回归验证:
|
||
- `npm run check-ports`
|
||
- `npm run prepare:uv`
|
||
- `npm run build`
|
||
5. 完成记录(2026-03-03):
|
||
- 已迁移 docs:
|
||
- `docs/{architecture,release,operations,reviews}` 分组已落地
|
||
- 架构文档文件名已去掉 `ARCHITECTURE-` 前缀
|
||
- 已迁移 scripts:
|
||
- `scripts/{prepare,build,tools}` 分组已落地
|
||
- 已更新路径引用:
|
||
- `package.json` scripts
|
||
- `package.json` -> `build.afterSign`
|
||
- 相关 docs 与注释中的脚本路径
|
||
- 验证结果:
|
||
- `npm run check-ports` 通过
|
||
- `npm run build` 通过
|
||
- `npm run prepare:uv` 受当前环境网络限制失败(`ENOTFOUND github.com`),不属于代码回归
|
||
|
||
### Phase 6:死代码判定与清理(建议)
|
||
|
||
1. 对无引用组件进行逐项判定(保留/删除/后续接入)
|
||
2. 若删除,需同步更新文档与 release note
|
||
3. 回归验证:`npm run build && npm run test:run`
|
||
4. 完成记录(2026-03-03):
|
||
- 判定结果:
|
||
- `MCPSettings` 仍被 `SettingsPage` 使用
|
||
- `AgentSettings`、`AgentRunnerSettings`、`LanproxySettings`、`SkillsSync`、`IMSettings`、`TaskSettings` 目前无业务引用
|
||
- 处理决策:
|
||
- 本轮不做删除,仅完成目录重构和桥接兼容;死代码清理单独作为后续行为变更任务
|
||
- 验证结果:`npm run build` 通过,`npm run test:run` 通过
|
||
|
||
## 6. 风险与约束
|
||
|
||
1. `preload` 路径改动会直接影响 Electron 启动,必须在单独阶段完成
|
||
2. `services/index.ts` barrel 重排容易引入循环依赖,需要逐步迁移并即时编译
|
||
3. docs/scripts 重命名后可能影响 CI 或外部脚本,需全文检索 `docs/`、`scripts/` 引用
|
||
4. 本次不调整业务协议、不变更 IPC contract、不触发数据库 schema 变更
|
||
|
||
## 7. 验收标准
|
||
|
||
满足以下条件才可视为本轮重构完成:
|
||
|
||
1. `npm run build` 成功
|
||
2. `npm run test:run` 成功
|
||
3. `npm run dev` 可正常进入主界面,setup 和 settings 页面可访问
|
||
4. `dist/main/main.js` 启动后 preload 正常加载,`window.electronAPI` 可用
|
||
5. 文档路径、脚本路径引用无失效(`rg` 检查无旧路径残留)
|
||
6. 新增功能可按分层目录直接落位(`main/preload/renderer/services/components`),无需再进行目录级重排
|
||
|
||
## 8. 进度记录
|
||
|
||
- [x] Phase 0 基线保护
|
||
- [x] Phase 1 main 顶层归类
|
||
- [x] Phase 2 preload 提升
|
||
- [x] Phase 3 renderer/services 分组
|
||
- [x] Phase 4 renderer/components 分组
|
||
- [x] Phase 5 文档与脚本目录重排
|
||
- [x] Phase 6 死代码判定与清理
|
||
|
||
## 9. 本次版本说明
|
||
|
||
相较 v2,本版新增了“低风险迁移机制”:
|
||
|
||
1. 增加兼容层策略(迁移后短期桥接,最后统一删)
|
||
2. 阶段顺序调整为先核心边界(main/preload/services),后外围目录(docs/scripts)
|
||
3. 强化阶段门禁(每阶段必须可构建)
|
||
|
||
## 10. 基座约束(后续开发准入)
|
||
|
||
为保证后续新增需求和维护稳定性,后续提交应遵循以下约束:
|
||
|
||
1. 边界约束:
|
||
- renderer 不直接依赖 main 代码;进程间只通过 IPC(`src/main/ipc` + `window.electronAPI`)
|
||
- preload 只做安全桥接,不承载业务逻辑
|
||
2. 分层约束:
|
||
- renderer 新 service 必须落到 `core/agents/integrations/utils` 之一
|
||
- renderer 新页面组件落 `components/pages`,弹窗落 `components/modals`
|
||
3. 兼容桥接约束:
|
||
- 旧路径桥接文件仅短期存在,发布 `0.6.x` 后统一清理
|
||
- 新代码禁止继续引用桥接文件
|
||
4. 测试与门禁:
|
||
- 变更必须通过 `npm run build`、`npm run test:run`
|
||
- 影响 IPC、启动路径、权限模型的改动需补最小冒烟验证
|
||
5. 文档同步:
|
||
- 新增模块时同步更新 `docs/architecture/INDEX.md`(或对应主题文档)
|
||
|
||
## 11. 基座后续任务(建议)
|
||
|
||
建议在本轮重构后追加三项治理任务,进一步提升长期可维护性:
|
||
|
||
1. 增加 lint/import 规则,禁止跨层引用与旧桥接路径引用
|
||
2. 为关键 IPC handler 增加 contract tests(请求/响应 schema)
|
||
3. 清理无引用 settings 组件(单独评审,避免与结构重构混改)
|
||
|
||
### 11.1 已落地(2026-03-03)
|
||
|
||
1. 已新增 `scripts/tools/check-import-boundaries.js`
|
||
2. 已新增 `npm run check:boundaries`
|
||
3. 已新增 `tests/scripts/check-import-boundaries.test.ts`,覆盖:
|
||
- 合法 main/renderer 分层通过
|
||
- renderer 直接引用 main 失败
|
||
- bridge 文件引用失败
|
||
4. 规则覆盖:
|
||
- 禁止引用 bridge 文件(`src/main/*` 与 `src/renderer/*` 顶层桥接)
|
||
- 禁止 renderer 直接引用 main/preload
|
||
- 禁止 main 直接引用 renderer
|