Files
workutils/docs/superpowers/specs/2026-08-04-ai-unit-test-plugin-v1-design.md
T
2026-08-04 16:23:00 +08:00

130 lines
9.2 KiB
Markdown
Raw 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.
# WorkUtils AI 单测生成插件 V1 设计
## 目标
为 WorkUtils 项目列表中的 JDK 8、Maven、JUnit 5 项目提供增量单测生成闭环:以分支或 Commit 为基线分析变更,调用已登录的公司 `codefree-cli` 生成候选测试,在隔离 Git worktree 中自动编译、运行和修复测试,以 85% 增量行覆盖率为默认门禁;验证通过后由用户审核,并可把仅包含测试文件的提交集成到指定本地分支。
## V1 范围
- 项目来源复用 `data/project_paths.txt`。
- 目标项目固定为 JDK 8、Maven、JUnit 5;支持 Maven 多模块。
- AI 仅实现 `codefree-cli`,不实现 MixMax3;通过 Provider 接口保留扩展点。
- 基线支持本地/远程分支名称与 Commit ID,采用 merge-base 计算 `baseline...HEAD`。
- 默认只分析已提交变更,可选包含已暂存及未暂存修改。
- 默认增量行覆盖率目标为 85%;分支覆盖率只展示,不作为 V1 门禁。
- 最多进行三轮测试修复。
- 不修改生产代码、POM、Maven settings,不自动 Fetch、Pull、Push。
- 手机 UI 自动化、Gradle、JUnit 4、JDK 17/21 目标项目不在 V1 范围。
## 用户流程
1. 检查全局 JDK 8、Maven 和 CodeFree CLI。
2. 从现有项目列表选择项目。
3. 自动解析 Maven 模块;唯一 `artifactId` 以 `-start` 结尾时自动选中,零个或多个匹配时由用户选择,并按项目记忆选择。
4. 输入分支或 Commit 基线,选择是否包含工作区修改。
5. 分析整个项目的增量文件、类和可执行行。
6. 组合可编辑默认规范、项目专属规范和相关现有测试样例。
7. 在临时 worktree 中按生产类调用 CodeFree 生成或补充测试。
8. 自动执行测试编译、相关测试、模块测试与 JaCoCo 报告。
9. 对可修复的测试错误或未覆盖行最多调用 CodeFree 修复三轮。
10. 达到 85% 后展示测试 Diff;用户选择目标本地分支。
11. 创建只包含所选模块 `src/test/java/**/*.java` 的候选 Commit,在目标分支隔离环境 Cherry-pick 并二次验证。
12. 二次验证成功后更新本地目标分支;任何冲突或分支移动均停止集成。
## 工具链
全局配置保存 JDK 8 主目录、Maven 主目录、CodeFree CLI 命令、默认覆盖率目标和最大修复轮次。首次使用自动探测,允许用户覆盖。WorkUtils 自身继续运行在 Java 17;启动目标 Maven 子进程时显式注入目标 JDK 8 的 `JAVA_HOME` 和 `PATH`。
执行前必须验证:
- `java -version` 为 Java 8;
- `mvn -version` 的 Java Home 指向配置的 JDK 8;
- `codefree --version` 可执行;
- 一次 `CI + plan + JSON` 的非交互探测成功,或用户明确重试。
跨平台解析 Windows 的 `mvn.cmd`/`codefree.cmd` 与 macOS/Linux 的 `mvn`/`codefree`。路径以 `Path` 处理,不拼接平台分隔符。
## 单测规范
默认质量规范是可编辑模板,首次生成到 `data/ai-test/default-test-spec.md`,支持编辑、恢复默认、导入和导出。项目专属规范保存在 WorkUtils 数据目录 `data/ai-test/projects/<project-id>/test-spec.md`,不写入业务仓库。
最终提示词优先级为:项目专属规范、可编辑默认规范、现有测试样例风格。文件和仓库安全限制不属于可编辑规范,始终由程序强制:只允许所选模块 `src/test/java` 中的 Java 文件,拒绝绝对路径、路径逃逸、生产源码、POM、脚本和二进制内容。
相关样例从所选 `-start` 模块及其依赖模块中选取同包、同类后缀和依赖风格最接近的 3 至 5 个测试。
## 增量与覆盖率
使用 `git merge-base <baseline> HEAD` 获得共同祖先,再通过零上下文 diff 提取新增和修改行。可选工作区范围合并 staged 与 unstaged diff。删除行、注释和 JaCoCo 未标记的非执行行不进入分母。
增量行覆盖率为:
`已覆盖的增量可执行行 / 增量可执行行总数 * 100%`
JaCoCo 行记录满足 `mi + ci > 0` 时视为可执行,`ci > 0` 时视为覆盖。无增量可执行行显示“不适用”,不判失败。汇总所选模块及其依赖模块的 XML,并以模块、完整类名、源码文件和行号匹配,避免多模块同包同名冲突。
项目已有 JaCoCo 时复用;否则通过命令行临时调用固定兼容版本,不修改 POM。构建从项目根目录运行 `mvn -pl <module-path> -am ...`。
## CodeFree 协议
定义 `TestGenerationProvider`,V1 仅提供 `CodeFreeCliTestGenerationProvider`。调用固定使用:
```text
codefree <prompt> --channel CI --approval-mode plan \
--max-session-turns 1 --output-format json
```
不传 `--model`,使用公司 CLI 当前登录配置。解析外层 JSON 最后一个成功的 `type=result` 记录;其 `result` 必须是无 Markdown 围栏的结构化 JSON,包含测试路径、完整内容、目标类、计划覆盖行、场景、假设和警告。
每次按一个生产类生成,控制上下文大小。完整提示词和业务源码默认不落盘;任务记录只保存路径、行号、Hash、退出码、覆盖率和候选 Commit 等审计信息。
## Maven 失败与 AI 介入
WorkUtils 先根据退出码、编译器输出、Surefire XML 和 JaCoCo 结果分类:
- 测试编译、测试失败、Mockito/测试上下文问题、覆盖率不足:允许 CodeFree 修改候选测试。
- JDK/Maven 配置、仓库/网络/认证、POM、依赖下载、磁盘、超时:CodeFree 仅给结构化诊断,不自动执行修复。
- 生产代码编译或疑似生产行为缺陷:停止并要求用户审核,不修改生产代码。
修复轮依次携带精简错误、失败测试、相关源码、当前候选和未覆盖增量行。每轮先 `testCompile`,再运行相关测试、模块测试和 JaCoCo。连续相同输出、不可修复分类、用户取消或达到三轮时停止。
## 隔离与分支集成
生成任务在当前 HEAD 的临时 Git worktree 中执行;勾选工作区修改时复制受控 diff。候选测试可以创建新的 `XxxTest`,也可以修改匹配的现有测试,但只发生在临时 worktree。
验证通过后创建测试专用 Commit。所谓“合并到指定分支”实现为只 Cherry-pick 该测试 Commit,禁止普通 merge 带入来源分支生产代码。目标分支集成前后记录 HEAD;目标分支被其他 worktree 使用、存在未提交修改、验证期间移动或产生冲突时停止,不自动 stash 或选择冲突侧。
目标分支必须重新执行 Maven 和增量覆盖率验证。失败时目标分支保持原状并保留候选 Commit;成功时只更新本地分支,不推送远程。
## UI 与任务状态
插件作为现有 `Plugin + VisualPluginFactory` 的内嵌页面。配置区包含项目、自动/手选生成模块、基线、工作区修改开关、覆盖率目标和规范入口。结果区包含增量代码、生成计划、测试与覆盖率、文件 Diff 四个页签。
状态机覆盖环境检查、增量分析、等待确认、生成、Maven 验证、覆盖率检查、修复、等待审核、分支集成、二次验证、成功、失败和取消。长任务复用 WorkUtils 现有异步与 Loading 能力,不阻塞 JavaFX 线程。
任务历史保存到 `data/ai-test/runs/<run-id>/`,记录请求摘要、分析、前后覆盖率、生成文件清单、执行日志和集成结果。V1 不支持异常中断后的断点续跑;运行中退出记为异常中断。
## 组件边界
- `AiTestPlugin` / `AiTestWindow`:插件注册与页面交互。
- `AiTestWorkflow`:单一状态机编排,不包含命令解析细节。
- `ToolchainValidator` / `ProcessExecutor`:全局工具验证与受控进程执行。
- `MavenProjectAnalyzer` / `StartModuleSelector`:Maven 模块模型、依赖可达性和生成模块选择。
- `GitIncrementAnalyzer` / `TemporaryWorktreeManager` / `TargetBranchIntegrator`:增量、隔离与本地分支集成。
- `JacocoXmlParser` / `IncrementalCoverageCalculator`:报告解析和门禁。
- `TestGenerationProvider` / `CodeFreeCliTestGenerationProvider` / `CodeFreeResultParser`:AI 协议。
- `MavenRunner` / `MavenErrorClassifier` / `SurefireReportParser`:构建、错误分类和测试结果。
- `TestSpecificationService` / `GeneratedFileValidator`:规范持久化和生成内容安全边界。
外部进程依赖通过接口注入,自动化测试使用 Fake,不依赖真实 CodeFree 登录、网络或目标 JDK。Git 集成测试使用临时仓库,覆盖率测试使用固定 XML fixture,UI 测试覆盖可访问状态、按钮门禁、取消和结果展示。
## 验收标准
- 唯一 `*-start` 自动选中;无或多个匹配时用户可选并记忆。
- 分支/Commit 基线和可选工作区修改能准确生成项目级增量行。
- CodeFree 非交互调用只产生受控测试候选,非法 JSON 或路径不落盘。
- 可修复 Maven 错误触发最多三轮测试修复;基础设施和生产问题只诊断。
- 达到默认 85% 增量行覆盖率且测试通过后才能进入审核。
- 审核前原项目不产生修改;取消和失败不污染项目。
- 测试专用 Commit 可在指定本地分支二次验证并安全集成,且绝不包含生产代码或 POM。
- WorkUtils 全量测试、编译和跨平台路径测试通过,`git diff --check` 无错误。