From bb-spec-backend
Whole-lifecycle constraints for Go backend projects — spanning coding, docs, PRD, planning, design, and review; a unified three-layer architecture, no over-abstraction, no transitional schemes, tests subordinate to production design (no wrapping production vars or adding interfaces just for tests — when a mock is needed, prefer an existing low-level injection point). | Go 后端项目全生命周期规范约束:贯穿编码、文档、PRD、规划、设计、review;统一三层架构、禁过度抽象、禁过渡方案、测试服从生产设计(禁为测试包装 var 或新增 interface,需要 mock 时优先用已有低层注入点)。
How this skill is triggered — by the user, by Claude, or both
Slash command
/bb-spec-backend:golang-constraintsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
适用于:Go 后端项目从需求到上线全生命周期内 AI 产出的**所有产出物**(代码 / 文档 / PRD / 规划 / 设计 / review)。
适用于:Go 后端项目从需求到上线全生命周期内 AI 产出的所有产出物(代码 / 文档 / PRD / 规划 / 设计 / review)。
TRIGGER:编辑 .go / go.mod / go.sum;编写 Go 项目相关文档 / PRD / 规划 / 设计 / review。
SKIP:vendor/、代码生成物(*_gen.go、protobuf)、非 Go 项目。
通用禁止:擅自发明新分层 / 接口抽象 / 第三方依赖;为"优雅""通用性""未来扩展"提前抽象;顺手做未被要求的事。
默认策略:最简单直接的实现 / 当前仓库已有模式 / 最少抽象层 / 最少文件改动。
业务分层(受 §2.3 职责约束,构成 handler → service → repository 调用链):handler / service / repository / model(或 entity)/ dto
支撑包(不参与分层调用链,任何层可用):config / pkg
禁止擅自引入:manager / facade / adapter / domain / application / controller。usecase 一律禁止。
| 形态 | 定位 | 持有的依赖 | 命名倾向 |
|---|---|---|---|
| 领域 service | 单一领域业务规则 | 只持有本领域 repository | 名词:User / Order |
| 编排 service | 跨领域流程编排 + 事务一致性 | 多个领域 service + TxManager;不持有 repository | 动词:Checkout / Refund |
硬性规则:
TxManager.InTx(ctx, fn) 闭包;事务句柄通过 ctx 传递,不通过方法参数*sql.Tx 等事务句柄;从 ctx 取何时抽编排 service:修改 ≥ 2 个领域数据 / 需跨领域事务一致性 / 语义本身是动词流程。
| 层 | 允许 | 禁止 |
|---|---|---|
| handler | 参数绑定、调用 service、响应转换 | 写业务逻辑、直接访问 repository |
| service(领域) | 本领域业务规则、调用本领域 repository | 持有别领域依赖、写 SQL、依赖框架对象 |
| service(编排) | 持有多个领域 service + TxManager、编排跨领域事务 | 持有 repository、写业务规则 |
| repository | 数据存取、从 ctx 取事务句柄 | 承载业务规则、返回 map[string]any |
优先遵守现有结构;若无则用扁平分层包:/internal/{handler,service,repository,config,dto,model,pkg},同包按领域拆文件(user.go / order.go)。不强制拆子包。
命名贯彻 avoid stuttering——包名已表达的语义不在标识符里重复:
| 包形态 | 类型名 | 构造函数 | 方法名 |
|---|---|---|---|
| 扁平分层包(多领域共存) | User / Checkout(不加 Handler/Service 后缀) | NewUser / NewCheckout | 保留领域词:CreateUser / DoCheckout |
独立单领域包(config 等) | Config | New(...) | 省略领域词:Load()(不是 LoadConfig) |
禁止:UserHandler / NewUserService / config.LoadConfig() / user_handler.go。
默认不创建。 仅允许:已有代码依赖 interface 注入 / 需要 mock 且已有低层注入点无法满足 / 仓库内已有 ≥ 2 个落地实现。新增前必须列出 ≥ 2 个已落地实现的文件路径。
New(...);扁平分层包 → NewXxx(...)(只写领域名)请求链路方法必须以 context.Context 作为第一参数。禁止用 context.Background() 替代上游 ctx、把 Web 框架专属 context 传入 repository、把 ctx 存入 struct。
必须显式处理;仅在补上下文时用 fmt.Errorf("...: %w", err)。禁止 _ 忽略、无意义包装、panic 处理业务错误、多层重复包装。
只记录:关键业务节点 / 外部依赖失败 / 非预期错误。禁止每函数入口打印、正常流程刷屏、记录敏感信息、既返回错误又每层重复打印。
没有明确性能需求时默认不用。优先级:errgroup > sync.Mutex > channel。禁止 handler 中裸起 goroutine。
所有 DB 访问收敛到 repository 层。禁止混入第二套访问风格、service 直接写 SQL。
默认:标准库 → 项目已有依赖 → 不新增。官方库优先(database/sql、net/http 等);禁止第三方封装替代。确需新增第三方库时,必须先向用户说明理由(标准库 / 已有依赖为何不满足、候选库是什么)并获明确同意,才能写入 import 或 go.mod;用户主动点名的库视为已同意。涉及版本号遵循 version-policy skill。
TestUser_CreateUserhttp.Client、外部 SDK 接口)var timeNow = time.Now)/ 无断言测试 / 只覆盖 happy pathgofmt / 命名简洁明确 / 缩小作用域 / 提前 return 减少嵌套 / 单函数单职责。统一用 any 替代 interface{}。禁止过长函数、过深嵌套、魔法数字。
每次改 import 后立即运行 go mod tidy。禁止手动编辑 go.mod 的 require 块。
应用层生成 UUIDv7:Go 层 uuid.UUID / 接口层 string。handler 层做双向转换,service/repository 只接受 uuid.UUID。
软删除标记用 time.Now().UTC().UnixMicro() 写入 deleted 列。常规查询必须带 WHERE deleted = 0。
created_at / updated_at 由 DB 自动管理。禁止 INSERT/UPDATE 显式写、Service 层手动赋值。写入后必须回读获取 DB 生成值。
MySQL DSN 固定 ?parseTime=true&loc=UTC&time_zone=%27%2B00:00%27。Go 用 time.Now().UTC(),SQL 用 UTC_TIMESTAMP(6)。
以下规则不仅适用于编码,也适用于文档 / PRD / 规划 / 设计 / review:
Provides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.
npx claudepluginhub 0xbb2b/bb-spec --plugin bb-spec-backend