plugins/languages/golang/skills/structure/SKILL.md
Go 项目结构规范——三层架构(API → Impl → State)、全局状态模式、internal/ 私有包、cmd/ 仅 main.go、go.work 多模块、禁止 Repository 接口和 DI 容器、struct 公共字段开头全 omitempty、handler var rsp 顶声明、禁 legacy migration。设计项目骨架、新建目录、组织包、做架构评审时触发。
npx skillsauth add lazygophers/ccplugin golang-structureInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
api 不能被 impl 引用、impl 不能被 state 引用。service/、repository/、model/、config/、test/ 目录cmd/ 下放子包(仅 main.go)preMigrateLegacy 等)server/
├── go.mod
├── go.sum
├── Makefile
├── .golangci.yml
├── config.yaml
├── internal/
│ ├── state/
│ │ ├── table.go # 全局数据模型 var User/Friend/...
│ │ ├── config.go # var Config *AppConfig
│ │ ├── database.go # var DB *gorm.DB
│ │ ├── cache.go # var Cache *Cache
│ │ └── init.go # 统一初始化入口
│ ├── impl/
│ │ ├── user.go
│ │ ├── user_test.go
│ │ ├── friend.go
│ │ └── friend_test.go
│ ├── api/
│ │ └── router.go
│ └── middleware/
│ ├── auth.go
│ ├── logger.go
│ └── error.go
└── cmd/
└── main.go
package state
var (
DB *gorm.DB
Cache *Cache
Config *AppConfig
User *db.Model[User]
Friend *db.Model[Friend]
Message *db.Model[Message]
)
state/init.go 统一初始化,main 只调一次 state.Init()。package impl
func UserLogin(ctx *fiber.Ctx, req *LoginReq) (*LoginRsp, error) {
user, err := state.User.NewScoop().
Where("username", req.Username).
First()
if err != nil {
log.Errorf("err:%v", err)
return nil, err
}
return &LoginRsp{User: user}, nil
}
state.Xxx,无 mocks 注入。测试时 state.User = mock 临时替换。func XxxYyy(ctx, *Req) (*Rsp, error)。package api
func SetupRoutes(app *fiber.App) {
pub := app.Group("/api", middleware.OptionalAuth, middleware.Logger)
pub.Post("/Login", impl.ToHandler(impl.UserLogin))
priv := app.Group("/api", middleware.Auth, middleware.Logger)
priv.Post("/GetUserProfile", impl.ToHandler(impl.GetUserProfile))
}
go 1.26
use (
./server
./shared
./tools
)
仅在多个独立可发布模块共仓时用。单模块项目不需要。
| 场景 | 选择 |
| --- | --- |
| 简单 API、追求最小依赖 | 标准库 net/http + Go 1.22+ 增强路由 |
| 团队主流、生态最大 | Gin |
| 内置完整、清晰 API | Echo |
| 极致 QPS、可接受 fasthttp 锁定 | Fiber |
| 标准库可组合中间件 | Chi |
参考:JetBrains 2026 调查 Gin 48% / Gorilla 17% / Echo 16% / Fiber 11%。本项目 lazygophers 生态默认 Fiber。
type UserLoginReq struct {
// 1. 标识字段
Id uint64 `json:"id,omitempty"`
Username string `json:"username,omitempty"`
// 2. 业务字段
Password string `json:"password,omitempty"`
Email string `json:"email,omitempty"`
// 3. 状态/枚举
State uint8 `json:"state"`
// 4. 时间戳
CreatedAt int64 `json:"created_at"`
UpdatedAt int64 `json:"updated_at"`
}
json tag + omitempty(状态/时间除外,零值有意义)func UserLogin(req *UserLoginReq) (*UserLoginRsp, error) {
var rsp UserLoginRsp
user, err := state.User.NewScoop().
Where("username", req.Username).
First()
if err != nil {
log.Errorf("err:%v", err)
return nil, err
}
rsp.Token = generateToken(user.Id)
rsp.User = user
return &rsp, nil
}
var rsp XxxRsp 函数顶声明return &rspreturn &XxxRsp{Field: val}| AI 借口 | 实际应验证 | | --- | --- | | "Repository 接口好测试" | 用全局 state? | | "service/ 目录清晰" | service 在 impl/ 中? | | "config/ 单独管理" | 配置在 state/? | | "model/ 分离数据" | 模型在 state/? | | "cmd/ 多子命令" | cmd 仅 main.go? | | "DI 框架灵活" | 全局变量而非 DI? | | "指针区分零值和缺失" | omitempty + 零值=不传? | | "字面量构造更简洁" | var rsp 顶声明? | | "兼容迁移更安全" | 禁 legacy migration? |
internal/state/internal/impl/internal/api/internal/middleware/cmd/ 仅 main.gotools
--- name: trellisx-workspace description: 维护 `.trellis/task.md` 任务看板 —— trellis 缺的跨任务总览。**一个表格, 一行一个任务**, 列为 id/名称/描述/状态/阶段/进度/worktree (状态/阶段中文显示)。在 task create/start/阶段切换/archive 后**及时更新**对应行; 并**自动清理超 7 天的已完成行**防膨胀。保持看板与 task.json 实时一致。 when_to_use: 维护 / 创建 / 更新 `.trellis/task.md` 任务看板时; task 生命周期任一节点 (create/start/阶段推进/archive) 之后同步看板时; 用户问"当前有哪些任务 / 任务进度 / 任务看板"时。被 trellisx-flow 与 trellisx-apply 注入的流程引用。 user-invocable: true argument-hint: [show|update|sync|cleanup ...] [task id] arguments:
testing
强制以 Trellis task 闭环处理用户指定的请求 (自判新建/并入 → plan→exec→check→finish 全程不跳步)。**仅用户显式主动调用** (/trellisx-flow 或明确要求"强制走 task 处理这个"); **禁止自动 / 被动 / 推断式调用** —— 不要因为某个请求"看起来该建 task"就自动触发本 skill, 那是 apply 注入的 no_task 倾向的职责。
testing
把 强推task + subtask拆分 + worktree隔离 + 闭环收尾 四维度增量注入当前项目 .trellis/ (workflow.md 的 no_task/planning/in_progress 块 + spec 背书文档 + trellis 生命周期 hook worktree 自动化)。强推 task 与闭环为纯 prompt 软约束 (非平台 hook 硬拦截)。**纯增量追加, 绝不替换 trellis 原生文本** (no_task 分类+征同意/check/finish/前缀全保留)。幂等 (marker 包裹)。
development
Claude Code 会话历史整理 — 扫 ~/.claude/projects/**/*.jsonl 全部 session transcripts, 提取学习增量 (用户校正/决策/踩坑/L0 规则) → 全局记忆库 ~/.cortex/.wiki/memory/. 默认 --apply 落盘 (--dry-run opt-in 仅出 JSON plan 预览). 与 cortex-extract (L4-inbox 内部) 互补.