Communitygithub.com

ben-eddy74/agent-skills

设计、搭建并实现基于Java Quarkus / Jakarta EE的后端功能,位于 backend/ 目录下,并严格遵守边界-控制-实体(BCE)模式。在进行后端领域逻辑、REST端点或数据库实体的构建或修改时触发此技能。

agent-skills 是什么?

该技能用于在 Quarkus 和 Jakarta EE 技术栈中,严格按照 Adam Bien 提出的边界-控制-实体(BCE)模式进行后端功能开发。它强制所有操作必须位于 backend/ 目录内,禁止操作 frontend/ 目录。工作流程分为两个阶段:第一阶段定义实体、边界接口和测试桩,并在实现控制层之前暂停等待人工审批;第二阶段实现控制层逻辑并执行 mvnw test 验证。该技能还强制使用 Java 25 LTS 语言特性,例如密封接口与记录模式穷尽匹配、灵活构造函数体(JEP 513)、未命名变量(_)、虚拟线程与作用域值(JEP 506)、序列化集合与流收集器(JEP 485),禁止使用已弃用的模式(如 javax.*、ThreadLocal 等)。此技能适用于 Cursor、Codex 等支持按目录触发工作流的 AI 编码代理,确保后端代码质量、一致性和可维护性。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ben-eddy74/agent-skills/tree/HEAD/quarkus-bce-backend

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Quarkus BCE 后端工作流

范围与目录边界

  • 严格边界: 仅操作 backend/ 内部。绝不触碰 frontend/ 中的文件。
  • 架构: 严格的 Adam Bien BCE 模式(com.app.<domain>.{boundary, control, entity})。
  • 技术栈: Quarkus,Jakarta EE(仅 jakarta.*——绝不使用 javax.* 或 org.springframework.*)。

两阶段执行门控

阶段一:契约与骨架(暂停等待人工审核)

  1. entity: 在 ..<domain>.entity 内创建/更新不可变的 Java record 负载(包含 @NotNull、@NotBlank、@Schema)以及 JPA/Panache 实体。零依赖 control 或 boundary。
  2. boundary: 在 ..<domain>.boundary 内创建/更新 JAX-RS @Path 资源签名(@Transactional、@RolesAllowed、@Operation)。
  3. 测试: 在 backend/src/test/java/..<domain>/boundary/ 内创建/更新失败的 JUnit @QuarkusTest 或单元测试桩。
  4. 暂停: 向用户展示 entity、boundary 和测试的差异。等待批准后再编写 control 实现。

阶段二:实现与架构导出

  1. control: 在 ..<domain>.control 内实现业务逻辑(@ApplicationScoped)。绝不能直接调用其他领域的 control;始终通过其 boundary 调用。
  2. 验证并导出契约: 在 backend/ 内运行:
    ./mvnw test
    

Java 25 LTS 语言与 JVM 规则(强制性)

目标为 Java 25 LTS 专属(<maven.compiler.release>25</maven.compiler.release>)。绝不编写遗留的 Java 8/11/17 样板代码:

  1. 穷尽 Switch 与记录解构(control 和 entity):
    • 使用 sealed interface + record 实现,在 entity 中建模领域结果和状态机。
    • 在 control 中,使用穷尽 switch 表达式,结合记录模式解构和带守卫的 when 子句(例如 case PaidOrder(var id, var total) when total > 1000 -> ...)。
    • 绝不能在 sealed interface 的 switch 中包含 default 分支,以便 Java 25 编译器在添加新状态时强制穷尽性。
  2. 灵活构造函数体(JEP 513):
    • 直接在构造函数内、在调用 super(...) 或 this(...) 之前执行快速失败验证和数据归一化,而不是创建膨胀的静态辅助方法。
  3. 未命名变量(_):
    • 对于未使用的 lambda 参数、被忽略的异常变量或未使用的解构记录组件,始终使用 _(例如 case Order(var id, _, _))。
  4. 虚拟线程与作用域值(JEP 506):
    • 对于 Quarkus boundary 中的阻塞 I/O 端点,除非需要流式处理,否则优先使用 @RunOnVirtualThread 而非响应式 Uni<T> 链。
    • 绝不使用 ThreadLocal;如果在线程作用域内传递上下文状态,始终使用 Java 25 的 ScopedValue<T>。
  5. 现代集合与流收集器(JEP 485):
    • 使用 SequencedCollection 方法(.getFirst()、.getLast()、.reversed())代替索引计算 list.get(list.size() - 1)。
    • 使用 Stream.gather(Gatherers.windowFixed(...)) 代替手动分块循环。
  6. 除非明确要求,否则不使用预览标志:
    • 坚持使用已最终确定的 Java 25 LTS 功能(除非明确要求,否则不要为 JEP 507 原始模式或 JEP 505 结构化并发启用 --enable-preview)。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相关技能