Skip to main content
skill CX Codex

goframe-v2 — Claude Code skill: what it does, how to install

Keeps the agent on GoFrame v2 rails: DO structs instead of g.Map, business logic in service/, automatic soft delete. Triggers only when go.mod pulls in github.com/gogf/gf/v2.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add gogf/skills --skill goframe-v2 -a claude-code
Open on GitHub

What goframe-v2 does

The skill loads into your coding agent and keeps it inside GoFrame v2 conventions. It checks go.mod for github.com/gogf/gf/v2 and looks at imports in existing Go files, then applies the rules only where that evidence exists. A plain Go repo gets nothing.

Inside are component references and two worked examples: an HTTP service and a gRPC service. Database writes go through DO structs from internal/model/do/, never g.Map. Errors get wrapped with gerror. Three or more related declarations go into one var block. Business logic sits in service/, not logic/.

GoFrame v2 maintains created_at, updated_at and deleted_at on its own, so the skill blocks manual timestamp writes and hand-written WhereNull(cols.DeletedAt) filters. Scaffolding a full project means running gf init, and that needs GoFrame CLI installed first — skip it and the step fails. Generated dao/do/entity files are off-limits to the agent, so expect to defend any hand edit there.

What it helps with

  • scaffold an HTTP service with gf init
  • switch database updates from g.Map to DO structs
  • keep business logic in service/ instead of logic/
  • drop manual WhereNull(cols.DeletedAt) filters and let the ORM soft-delete
  • stop the agent from editing generated dao/do/entity files

Example prompts for the agent

  • Scaffold a GoFrame v2 HTTP service with gf init and add an orders controller
  • Rewrite this Update call to use do.User instead of g.Map
  • Put the new method in service/, don't create a logic/ package

How to install goframe-v2

1Skills CLI (Vercel)

npx skills add gogf/skills --skill goframe-v2 -a claude-code

2Manually: put the files in place

~/.claude/skills/goframe-v2/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/goframe-v2/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about goframe-v2

How do I install goframe-v2 in Claude Code?

Run npx skills add gogf/skills --skill goframe-v2 -a claude-code. The skill file lands at ~/.claude/skills/goframe-v2/SKILL.md.

What does goframe-v2 do?

It feeds the agent GoFrame v2 conventions: DO structs for database writes, gerror for errors, business logic in service/, plus reliance on automatic soft delete and time fields.

Does it work on a plain Go project?

No. It needs GoFrame v2 evidence: the dependency in go.mod or github.com/gogf/gf/v2/... imports in the code. Without those it stays dormant.

Source text

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

Similar skills

All skills for Backend and APIs →

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor