Files
qiming/qimingclaw/crates/agent-electron-client/docs/REFACTOR-PLAN.md

295 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 1main 顶层归类(中风险,优先)
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 2preload 提升为一级目录(中高风险)
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 3renderer/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 4renderer/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