goframe-v2 — скилл для Claude Code: что делает и как установить
Держит агента в правилах GoFrame v2: DO-объекты вместо g.Map, бизнес-логика в service/, автоматический soft delete. Срабатывает только там, где в go.mod есть github.com/gogf/gf/v2.
npx skills add gogf/skills --skill goframe-v2 -a claude-codeЧто делает goframe-v2
Скилл подключается к агенту и держит его внутри соглашений GoFrame v2. Сначала проверка: есть ли в go.mod строка github.com/gogf/gf/v2 или импорты компонентов фреймворка в существующих Go-файлах. Правила включаются только при таком подтверждении. В обычном Go-проекте без этих признаков скилл молчит.
Внутри справочник по компонентам и два разобранных примера: HTTP-сервис и gRPC-сервис. Запись в БД идёт через DO-структуры из internal/model/do/, не через g.Map. Ошибки оборачиваются в gerror. Три и более связанных объявления переменных собираются в блок var. Бизнес-логику скилл кладёт в service/, а не в logic/.
Поля created_at, updated_at и deleted_at GoFrame v2 обновляет сам, поэтому скилл запрещает прописывать время вручную и добавлять WhereNull(cols.DeletedAt). Полный каркас проекта собирается через gf init, а для этого нужен установленный GoFrame CLI — без него шаг просто не выполнится. Сгенерированные файлы dao, do и entity агент править не станет, так что ручные правки в них придётся отстаивать отдельно.
Какие задачи решает
- собрать каркас HTTP-сервиса на GoFrame v2 через
gf init - перевести апдейты в БД с
g.Mapна DO-объекты - разложить бизнес-логику по
service/вместоlogic/ - убрать ручные
WhereNull(cols.DeletedAt)и доверить soft delete ORM - объяснить агенту, почему сгенерированные dao/do/entity не трогают руками
Примеры запросов агенту
- Создай HTTP-сервис на GoFrame v2 через
gf initи добавь контроллер заказов - Перепиши этот Update на
do.Userвместоg.Map - Положи новый метод в
service/, пакетlogic/не создавай
Как установить goframe-v2
1Через Skills CLI (Vercel)
npx skills add gogf/skills --skill goframe-v2 -a claude-code2Вручную: положить файлы
~/.claude/skills/goframe-v2/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/goframe-v2/
1Через Skills CLI (Vercel)
npx skills add gogf/skills --skill goframe-v2 -a codex2Вручную: положить файлы
.agents/skills/goframe-v2/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add gogf/skills --skill goframe-v2 -a cursor2Вручную: положить файлы
.cursor/skills/goframe-v2/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install gogf/skills goframe-v22Вручную: положить файлы
.github/skills/goframe-v2/SKILL.md1Через Skills CLI (Vercel)
npx skills add gogf/skills --skill goframe-v2 -a gemini-cli2Командой платформы
gemini skills install https://github.com/gogf/skills --path skills/goframe-v2Вручную: положить файлы
.devin/skills/goframe-v2/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add gogf/skills --skill goframe-v2 -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о goframe-v2
Как установить goframe-v2 в Claude Code?
Выполните npx skills add gogf/skills --skill goframe-v2 -a claude-code. Файл скилла окажется по пути ~/.claude/skills/goframe-v2/SKILL.md.
Что делает goframe-v2?
Задаёт агенту соглашения GoFrame v2: DO-объекты в запросах к БД, gerror для ошибок, бизнес-логика в service/, опора на автоматический soft delete и авто-поля времени.
Сработает ли скилл в обычном Go-проекте?
Нет. Ему нужны признаки GoFrame v2: зависимость в go.mod или импорты github.com/gogf/gf/v2/... в коде. Без них он не включается.
Исходный текст
SKILL.md · Apache-2.0
---
name: goframe-v2
description: "GoFrame v2 development skill. Use only when the target Go project uses or is explicitly adopting GoFrame v2: the nearest go.mod requires github.com/gogf/gf/v2, existing Go files import github.com/gogf/gf/v2 or any github.com/gogf/gf/v2/... component package, or the user asks to scaffold, migrate, or build with GoFrame. Trigger for GoFrame-backed Go work such as APIs/controllers/services, middleware, routing/config, ORM/DAO/DO/entity/database operations, gf CLI/codegen, HTTP/gRPC services, and microservice conventions. Do not trigger for generic Go projects without GoFrame evidence, frontend-only work, shell scripts, or unrelated infrastructure tasks."
license: Apache-2.0
---
# Critical Conventions
## Project Development Standards
- For complete projects (HTTP/microservices), install GoFrame CLI and use `gf init` to create project scaffolding. See [Project Creation - init](./references/开发工具/项目创建-init.md) for details.
- Auto-generated code files (dao, do, entity) MUST NOT be manually created or modified per GoFrame conventions.
- Unless explicitly requested, do NOT use the `logic/` directory for business logic. Implement business logic directly in the `service/` directory.
- Reference complete project examples:
- HTTP service best practice: [user-http-service](./examples/practices/user-http-service)
- gRPC service best practice: [user-grpc-service](./examples/practices/user-grpc-service)
## Component Usage Standards
- Before creating new methods or variables, check if they already exist elsewhere and reuse existing implementations.
- Use the `gerror` component for all error handling to ensure complete stack traces for traceability.
- When exploring new components, prioritize GoFrame built-in components and reference best practice code from examples.
- **Database Operations MUST use DO objects** (`internal/model/do/`), never `g.Map` or `map[string]interface{}`. DO struct fields are `interface{}`; unset fields remain `nil` and are automatically ignored by the ORM:
```go
// Good - use DO object
dao.Users.Ctx(ctx).Where(cols.Id, id).Data(do.User{Uid: uid}).Update()
// Good - conditional fields, unset fields are nil and ignored
data := do.User{}
if password != "" { data.PasswordHash = hash }
if isAdmin != nil { data.IsAdmin = *isAdmin }
dao.Users.Ctx(ctx).Where(cols.Id, id).Data(data).Update()
// Good - explicitly set a column to NULL using gdb.Raw
dao.Instances.Ctx(ctx).Where(cols.Id, id).Data(do.Instance{IdleSince: gdb.Raw("NULL")}).Update()
// Bad - never use g.Map for database operations
dao.Users.Ctx(ctx).Data(g.Map{cols.Uid: uid}).Update()
```
## Code Style Standards
- **Variable Declarations**: When defining multiple variables, use a `var` block to group them for better alignment and readability:
```go
// Good - aligned and clean
var (
authSvc *auth.Service
bizCtxSvc *bizctx.Service
k8sSvc *svcK8s.Service
notebookSvc *notebook.Service
middlewareSvc *middleware.Service
)
// Avoid - scattered declarations
authSvc := auth.New()
bizCtxSvc := bizctx.New()
k8sSvc := svcK8s.New()
```
- Apply this pattern when you have 3 or more related variable declarations in the same scope.
## Soft Delete & Time Maintenance
GoFrame provides **automatic** soft delete and time maintenance features. When a table contains `created_at`, `updated_at`, or `deleted_at` fields, the ORM handles these automatically.
### Automatic Time Fields
| Field | Auto Behavior |
|-------|---------------|
| `created_at` | Auto-written on `Insert/InsertAndGetId`, never modified afterward |
| `updated_at` | Auto-written on `Insert/Update/Save` |
| `deleted_at` | Auto-written on `Delete` (soft delete), auto-filtered on queries |
### Critical Rules
**1. NEVER manually set time fields** - GoFrame handles these automatically:
```go
// WRONG - redundant manual time setting
dao.User.Ctx(ctx).Data(do.User{
Name: "john",
CreatedAt: gtime.Now(), // REDUNDANT! Framework handles this
UpdatedAt: gtime.Now(), // REDUNDANT! Framework handles this
}).Insert()
// CORRECT - let framework handle time fields
dao.User.Ctx(ctx).Data(do.User{
Name: "john",
}).Insert()
```
**2. NEVER manually add `WhereNull(cols.DeletedAt)`** - GoFrame auto-adds soft delete filter:
```go
// WRONG - redundant soft delete condition
dao.User.Ctx(ctx).
Where(do.User{Status: 1}).
WhereNull(cols.DeletedAt). // REDUNDANT! Framework auto-adds this
Scan(&list)
// CORRECT - framework auto-adds deleted_at IS NULL
dao.User.Ctx(ctx).
Where(do.User{Status: 1}).
Scan(&list)
```
**3. Use `Delete()` for soft delete** - Framework converts to `UPDATE SET deleted_at = NOW()`:
```go
// CORRECT - use Delete(), framework handles soft delete
dao.User.Ctx(ctx).Where(do.User{Id: id}).Delete()
// Actual SQL: UPDATE `sys_user` SET `deleted_at`=NOW() WHERE `id`=?
// WRONG - manual Update with deleted_at
dao.User.Ctx(ctx).
Where(do.User{Id: id}).
Data(do.User{DeletedAt: gtime.Now()}). // REDUNDANT!
Update()
```
### Field Type Support
The `deleted_at` field supports multiple types:
- **DateTime/Timestamp**: Default, stores deletion time
- **Integer**: Stores Unix timestamp (seconds)
- **Boolean**: Stores 0/1 for deleted state
### Configuration (Optional)
Time field names can be customized in `config.yaml`:
```yaml
database:
default:
createdAt: "created_at" # Custom field name
updatedAt: "updated_at"
deletedAt: "deleted_at"
timeMaintainDisabled: false # Set true to disable this feature
```
# GoFrame Documentation
Complete GoFrame development resources covering component design, usage, best practices, and considerations: [GoFrame Documentation](./references/README.MD)
# GoFrame Code Examples
Rich practical code examples covering HTTP services, gRPC services, and various project types: [GoFrame Examples](./examples/README.MD)
© gogf · Apache-2.0 · gogf/skills