最近在 GitHub 上看到 sivaprasadreddy/agentic-expense-manager。README 写得很直白:这是一个 Expense Manager 脚手架,用来对比 OpenSpecBMADsdd-skillsAI Unified Processmattpocock/skillsAgentic / SDD 工作流——而不是一个功能齐全的记账产品。

我按「逐文件能学什么」把仓库翻了一遍,再按架构、工程、Agent 协作等维度做了归类。若你正在用 Claude Code、Cursor 或 Copilot 做 Spec-Driven 的 Java 项目,这篇可以当作导读。

一句话定性

不是「抄一个 FinTech 成品」,而是「带需求清单 + 模块化骨架 + Agent 操作手册」的练功房。

  • 已完成:UC-001~004(注册、登录、登出、基本资料)
  • 进行中:UC-027(Dashboard)
  • 未实现:UC-005~026、028~029(账户、分类、交易、预算、报表等)

需求状态都写在 docs/requirements.md 里,这是仓库最有价值的非代码资产。

全局结构

docs/(需求与愿景)
↓ 驱动实现顺序
src/main/java/dev.sivalabs.expman/
├── Application + config/ # 启动与横切
├── common/ # 开放模块:事件、分页、异常
└── users/ # 第一个业务模块(Modulith 边界)
├── UsersAPI # 模块对外门面
├── domain/ # 实体、服务、仓储
└── web/ # Thymeleaf 控制器
src/main/resources/ # 配置、Flyway、模板
src/test/ # 模块化测试 + Testcontainers
AGENTS.md / CLAUDE.md # 给 AI 的操作手册
pom.xml + compose.yaml + Taskfile.yml

建议阅读顺序:README → requirements.md → ModularityTest → users 模块 → 测试与 CI → AGENTS.md

按目录拆解:每个文件能学什么

仓库根:愿景、Agent 入口、运行编排

文件可学什么
README.md项目定位、可试的 SDD 工具链、前置条件、技术栈与如何运行
AGENTS.mdAI Agent 操作手册:构建、测试、格式化;Agent 应先读再改代码
CLAUDE.md指向 AGENTS.md;多 Agent 工具共用说明的薄封装写法
compose.yaml本地 Postgres 18 + Mailpit(SMTP / Web UI)
Taskfile.ymlformat → verify → build_image;跨平台 mvnw
.sdkmanrc锁定 Java 25-tem、Maven 3.9.15
renovate.json依赖自动升级样板
mvnw / .mvn/wrapper/无全局 Maven 也能构建,与 CI 一致

文档层:Spec-Driven 的单一事实来源

文件可学什么
docs/project.md产品愿景:目标用户、Transaction / Account / Category / Budget 等概念
docs/requirements.md29 条 UC,含 Status 与验收标准;Agent 按编号认领,避免 scope 漂移

构建与质量:pom.xml

  • Spring Boot 4.0.6 + Java 25 + Spring Modulith 2.0.6
  • 栈:WebMVC、Validation、Mail、Thymeleaf、JPA、Flyway、Security
  • spring-boot-docker-compose:开发时自动拉起 compose
  • 测试:Testcontainers(Postgres + Mailpit)、Modulith Test
  • JaCoCoverify 阶段行覆盖率 ≥ 50%
  • Spotless:Palantir Java Format(./mvnw spotless:apply
  • build-image:可构建容器镜像

CI:.github/workflows/maven.yml

  • 分支:mainfeat/*fix/*
  • paths-ignore:改 md/docs 不跑构建,文档与代码流水线分离
  • ./mvnw -ntp verify:与本地一致

应用入口与 config

文件可学什么
Application.java@EnableAsync@EnableScheduling@EnableResilientMethods 等扩展点
AppProperties.java类型安全的 app.* 配置
SecurityConfig.javaBCrypt、DaoAuthenticationProvider、角色层级 ADMIN > USER
WebSecurityConfig.java表单登录;/login/register 公开;/admin/** 需 ADMIN
GlobalExceptionHandler.java异常映射到 Thymeleaf 错误页(403/404/500)
FlywayConfig.java@Profile("local"):迁移失败时 clean 再 migrate(勿用于生产)

common 模块(Modulith OPEN)

文件可学什么
package-info.java@ApplicationModule(type = OPEN):开放模块,供其他模块依赖
DomainEvent.java领域事件标记接口
AppEventPublisher.java统一事件发布入口
PagedResult.java将 Spring Data Page 转为 1-based 页码 的 record,供列表页复用
ResourceNotFoundException应用层异常与全局处理配合

application.properties 里还有 Modulith JDBC 事件配置,为跨模块事件持久化预留。

users 模块:第一个完整垂直切片

文件可学什么
UsersAPI.java模块对外 API;其他模块只通过它查用户,不直接碰 Repository
User.javaJPA 实体、序列主键、角色枚举
UserService.javaCreateUserCmd、密码编码、事务、ResourceNotFoundException
UserMapper.java对外 DTO 不含 password;登录场景单独 toUserDtoWithPassword
UserAuthController.java@Valid + BindingResultRedirectAttributes flash 消息
domain/models/package-info.java@NamedInterface("user-models"):控制 Modulith 暴露面
SecurityUserDetailsService.java接入 Spring Security 的适配

Web 层是 Thymeleaf SSR,不是前后端分离;适合 Agent 一次改完一条 UC 的闭环。

资源与模板

文件可学什么
application.propertiesddl-auto=validateopen-in-view=false、Docker Compose 生命周期
db/migration/V001__create_users_table.sqlFlyway 权威 schema;种子用户与 BCrypt 哈希
templates/auth/*.html登录、注册表单
templates/dashboard/*.html登录后布局(Dashboard 进行中)
templates/error/*.htmlGlobalExceptionHandler 对应

测试层

文件可学什么
ModularityTest.javaApplicationModules.verify():校验模块边界,防随意跨包 import
TestcontainersConfiguration.java@ServiceConnection 注入 Postgres + Mailpit
BaseIT.java@SpringBootTest + MockMvcTester(Boot 4 测试 API)
UserAuthControllerTestsWeb 集成测试样板

八类学习维度(系统归纳)

1. Agentic / SDD 工作流

需求即 backlog(requirements.md 的 UC + Status)、Agent 操作手册(AGENTS.md)、刻意留白的大量 NOT_IMPLEMENTED——逼你选一种 SDD 工具把下一条 UC 做起来。

2. 模块化架构(Spring Modulith)

users / common(OPEN) / config;对外门面 UsersAPIModularityTest + @ApplicationModule / @NamedInterfaceDomainEvent 与 JDBC 事件表为跨模块解耦预留。

3. 分层与 DDD 轻量实践

Controller + Request DTO → UserService + Cmd → 实体 + 异常 → Repository;命令与查询模型分离。

4. Spring Security 与会话型 Web

表单登录、角色层级、路径授权;与 Thymeleaf、flash 结合的注册流。

5. 数据与迁移

Flyway 单一真相;JPA validate;Postgres 序列主键、乐观锁字段(表结构已预留 version)。

6. 可验证性与工程纪律

Testcontainers、JaCoCo 门禁、Spotless、CI 与本地命令一致。

7. 可运行性与 DevEx

Docker Compose、Taskfile、Mailpit 本地验邮件。

8. 产品域知识

docs/project.md 里 Account / Category / Budget / Dashboard 等概念已定义,适合练「先读需求再写代码」的 Agent 任务。

按角色怎么读

你是谁建议重点可暂时跳过
Java 后端Modulith、UsersAPI、Security、Flyway、ITThymeleaf 细节
AI 工程 / SDDrequirements.mdAGENTS.md、UC 状态、JaCoCo已完成的 UC-001~004 逐行读
全栈 SSRtemplates + Controller + flashModulith 事件 JDBC
想抄成品记账系统不适合本仓库

用 Agent 继续开发:推荐切片

  1. 打开 docs/requirements.md,认领 UC-005(创建财务账户)
  2. 新建 accounts 模块(仿 usersAccountsAPI、domain、web、Flyway V002__...
  3. ./mvnw clean verify,满足 JaCoCo
  4. 把 requirements 里对应 Status 改为 COMPLETED

仓库教的是 「在约束下用 Agent 交付下一条 UC」,不是复制一个 FinTech。

局限

  • 业务完成度低,29 条 UC 绝大多数未实现
  • Java 25Spring Boot 4,环境要对齐
  • SSR 为主;若团队是 React + REST,参考价值在架构与 SDD
  • FlywayConfig 的 clean 仅 local profile,切勿照搬生产

小结

sivaprasadreddy/agentic-expense-manager需求文档、模块边界、测试门禁、Agent 命令 捆在一起,是一个很干净的 Agentic Java 练功房。若你已经在博客或 second-brain 里折腾 Hermes / SDD,不妨 fork 一份,从 UC-005 开始让 Agent 交第一份「真业务」PR。


参考链接