5.5 KiB
MyBatis Output Layout Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 通过项目根目录推导 MyBatis 生成目录,并提供生成前风险摘要与生成后文件差异。
Architecture: OutputLayoutPolicy 只负责纯路径推导;GenerationPlanner 负责目录状态与已有文件统计;OutputSnapshot 负责前后文件差异;GenerateArtifactsUseCase 编排计划、快照和网关执行。JavaFX Window 只绑定根目录、自定义开关、摘要和结果。
Tech Stack: Java 17、Java NIO、JavaFX、JUnit 5、Maven
Global Constraints
- 默认 Model/Mapper 为
<root>/src/main/java,XML 为<root>/src/main/resources。 - 不改变
MyBatisGeneratorService的覆盖行为。 - 不连接数据库或在 UI 验收中执行生成。
- Git 评审不参与修改。
- 所有新增领域对象不可变且不依赖 JavaFX。
Task 1: 输出布局策略
Files:
- Create:
src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayout.java - Create:
src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicy.java - Test:
src/test/java/com/example/workutils/biz/mybatisgenerator/application/OutputLayoutPolicyTest.java
Interfaces:
-
Produces:
OutputLayout derive(Path projectRoot)、OutputLayout custom(Path root, Path model, Path xml, Path mapper) -
写测试:标准推导返回规范化绝对路径,空值和普通文件被拒绝,自定义目录保持明确映射。
-
运行
-Dtest=OutputLayoutPolicyTest并确认因类型不存在而失败。 -
实现不可变 record 和无状态策略。
-
重跑测试并确认通过。
Task 2: 生成前风险计划
Files:
- Create:
src/main/java/com/example/workutils/biz/mybatisgenerator/application/DirectoryRisk.java - Create:
src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerationPlan.java - Create:
src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerationPlanner.java - Test:
src/test/java/com/example/workutils/biz/mybatisgenerator/application/GenerationPlannerTest.java
Interfaces:
-
Consumes:
OutputLayout、表名列表 -
Produces:
GenerationPlan plan(List<String> tables, OutputLayout layout) -
写测试:待创建目录、可写目录、已有 Java/XML 文件数及不可写目录验证。
-
运行测试并确认失败。
-
用
Files.walk实现扩展名计数,去重相同的 Java 输出根目录。 -
重跑测试并确认通过。
Task 3: 输出文件快照与结果
Files:
- Create:
src/main/java/com/example/workutils/biz/mybatisgenerator/application/OutputSnapshot.java - Create:
src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerationResult.java - Test:
src/test/java/com/example/workutils/biz/mybatisgenerator/application/OutputSnapshotTest.java
Interfaces:
-
Produces:
OutputSnapshot capture(OutputLayout layout)、GenerationResult compare(OutputSnapshot after, String message) -
写测试:区分新增、更新和未变化文件,并保留 warning 与原始消息。
-
运行测试并确认失败。
-
以路径、大小、最后修改时间保存不可变指纹并实现差异比较。
-
重跑测试并确认通过。
Task 4: 生成用例编排
Files:
- Modify:
src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerateArtifactsRequest.java - Modify:
src/main/java/com/example/workutils/biz/mybatisgenerator/application/GenerateArtifactsUseCase.java - Modify:
src/test/java/com/example/workutils/biz/mybatisgenerator/application/GeneratorRequestTest.java - Modify:
src/test/java/com/example/workutils/biz/mybatisgenerator/application/GeneratorUseCaseTest.java
Interfaces:
-
Request consumes:
List<String> tables, OutputLayout layout -
UseCase produces:
GenerationResult execute(GenerateArtifactsRequest request) -
先更新测试,要求网关接收布局目录且用例返回文件差异。
-
运行两组测试并确认旧接口导致失败。
-
最小修改请求与用例,执行前后快照,网关仍接收三个字符串目录。
-
重跑测试并确认通过。
Task 5: JavaFX 表单与结果反馈
Files:
- Modify:
src/main/java/com/example/workutils/biz/mybatisgenerator/MyBatisGeneratorWindow.java - Create:
src/test/java/com/example/workutils/biz/mybatisgenerator/MyBatisGeneratorWindowArchitectureTest.java
Interfaces:
-
Consumes:
OutputLayoutPolicy、GenerationPlanner、GenerationResult -
Produces: 根目录输入、只读派生目录、自定义开关、生成前摘要和结构化结果文本
-
写源码结构测试:一个根目录字段、一个自定义开关、三字段只读切换、Window 不调用
Files.walk。 -
运行测试并确认失败。
-
改造目录区域,根目录变化时刷新预览;自定义模式才允许编辑。
-
生成前显示确认摘要;确认后提交请求;完成后显示新增/更新/未变化文件。
-
重置恢复标准推导模式。
-
重跑窗口结构测试和 MyBatis generator 全部测试。
Task 6: 完整验证
Files:
-
Verify only
-
运行
\.\mvnw.cmd -q test。 -
运行
\.\mvnw.cmd -q -DskipTests compile。 -
运行
git diff --check。 -
启动应用做只读 UI 验收,不查询数据库、不生成文件。
-
提交 P0 重构。