Gophers — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Gophers (Plugin) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
Aggregate score unchanged between these scans.
The primary manifest — the file an agent reads to learn what this artifact does.
<div align="center">
26 production-grade Go skills for Claude Code, Gemini CLI, and opencode. Battle-tested patterns from the Go community — codified as triggerable AI skills.
Quick Start • Skills Catalog • How It Works • Examples • FAQ
</div>
Most AI assistants write Go like a senior JavaScript engineer pretending to like semicolons. gophers plugs in 26 opinionated skills that teach Claude (and friends) to write Go the way the standard library does — small interfaces, errors as values, no magic.
"The bigger the interface, the weaker the abstraction." — Rob Pike Now your AI knows that, before it writes a 12-method UserManagerService.What you get:
SKILL.md is ≤ 200 lines; deep dives live in references/.# Add the marketplace
/plugin marketplace add muratmirgun/gophers
# Install the plugin
/plugin install gophers@gopherscd ~/.claude/plugins
git clone https://github.com/muratmirgun/gophersThen restart Claude Code. Skills auto-load from skills/.
gemini extensions install https://github.com/muratmirgun/gophersopencode plugin add github.com/muratmirgun/gophersgit clone https://github.com/muratmirgun/gophers ~/.config/ai/gophers
# Point your agent's CLAUDE.md / AGENTS.md / GEMINI.md at the skills/ directory.26 skills, grouped by intent. One is user-invokable (/go-code-review); the rest activate automatically when their trigger conditions match.
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-naming | 🏷️ | naming any identifier — packages, types, methods, errors |
| go-declarations | 📝 | declaring vars, consts, structs, maps, iota enums |
| go-control-flow | 🔀 | writing conditionals, loops, switches, type switches |
| go-functions | ƒ | organising functions in a file, designing signatures |
| go-data-structures | 📊 | choosing/operating on slices, maps, arrays, strings |
| go-packages | 📦 | creating packages, organising imports, structuring projects |
| go-error-handling | ⚠️ | writing, wrapping, inspecting, or logging errors |
| go-interfaces | 🔌 | defining/implementing interfaces, embedding, receivers |
| go-generics | 🧬 | deciding whether to introduce generics, writing constraints |
| go-functional-options | ⚙️ | designing constructors with 3+ optional parameters |
| go-defensive | 🛡️ | hardening API boundaries — copy, defer, time, panic discipline |
| go-code-style | ✨ | writing/reviewing for clarity, formatting, design priority |
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-context | 📦 | designing context.Context flow, deadlines, request values |
| go-concurrency | 🚦 | writing goroutines, channels, select, mutexes, errgroup |
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-clean-architecture | 🏛️ | scaffolding a service into Domain/Usecase/Repository/Delivery |
| go-grpc | 📡 | implementing or reviewing gRPC servers/clients |
| go-graphql | 🌐 | building a GraphQL API (gqlgen or graph-gophers) |
| go-swagger | 📋 | adding OpenAPI/Swagger annotations with swaggo/swag |
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-database | 🗄️ | writing SQL access code — sqlx/sqlc/pgx/GORM trade-offs |
| go-logging | 📝 | choosing a logger, configuring slog, request-scoped fields |
| go-observability | 📈 | instrumenting metrics, traces, exemplars, correlation |
| go-performance | ⚡ | profiling, benchmarking, optimising — pprof decision tree |
| Skill | Emoji | Triggers when… |
|---|---|---|
| go-testing | 🧪 | writing tests — table-driven, subtests, fuzz, synctest, goleak |
| go-linting | 🧹 | setting up golangci-lint, suppressing findings, CI gates |
| go-documentation | 📚 | writing godoc comments, Example tests, README/CHANGELOG |
| go-code-review | 👀 | user-invokable — /go-code-review walks a diff topic by topic |
Each skill is a single markdown file (SKILL.md) with structured frontmatter and a strict body shape:
---
name: go-interfaces
description: Use when defining or implementing Go interfaces... # ← trigger
user-invocable: false # auto-fires
license: MIT
metadata:
openclaw:
emoji: "🔌"
requires: { bins: [go] }
allowed-tools: Read Edit Write Glob Grep Bash(go:*)
---
# Title
1-2 sentence philosophy.
## Core Rules ← 5-7 numbered, non-negotiable invariants
## Decision Table ← when to apply / when not to
## Body sections ← code examples, contrasts (Good / Bad)
## Anti-Patterns ← table of common mistakes + fixes
## Verification Checklist← AI self-grades before claiming done
## References ← links to deeper references/*.mdWhen Claude (or Gemini / opencode) reads code that matches the trigger, the skill is injected into context — opinionated rules + code examples + a verification checklist. Your AI assistant goes from "knows Go" to "writes Go like a stdlib author".
type UserManagerInterface interface {
GetUser(id string) (*User, error)
SetUser(u *User) error
DeleteUser(id string) error
ListUsers() ([]*User, error)
CountUsers() (int, error)
}
func GetUser(id string) (*User, error) {
user, err := db.QueryUser(id)
if err != nil {
return nil, fmt.Errorf("db error: " + err.Error())
}
return user, nil
}go-interfaces + go-error-handling + go-naming fire)// Reader fetches a User by ID. Returns ErrNotFound when absent.
type Reader interface {
User(ctx context.Context, id string) (*User, error)
}
func (s *Store) User(ctx context.Context, id string) (*User, error) {
u, err := s.db.User(ctx, id)
if err != nil {
return nil, fmt.Errorf("store: user %s: %w", id, err)
}
return u, nil
}What changed:
Get prefix)errors.Is / errors.As)| Tenet | What it means in practice |
|---|---|
| Errors are values | No panic-as-exception, no swallowed errors, wrap with %w |
| Accept interfaces, return concrete types | Consumers state needs; producers expose what they have |
| The framework is a detail | Gin/Echo/Fiber lives in internal/delivery/, nothing else |
| The database is a detail | SQL lives in internal/repository/, nothing else |
| Tests fail usefully | Function(input) = got, want want — always |
| Documentation is part of the API | godoc renders in IDE tooltips; signature noise is wasted ink |
| Measure before optimising | pprof first, intuition last |
| Don't design with interfaces — discover them | Wait for the second implementation |
gophers/
├── .claude-plugin/
│ ├── plugin.json # Claude Code plugin manifest
│ └── marketplace.json # Claude Code marketplace listing
├── gemini-extension.json # Gemini CLI extension manifest
├── opencode.json # opencode plugin manifest
├── skills/ # 26 skills, each a folder
│ └── go-<name>/
│ ├── SKILL.md # ≤ 200 lines, opinionated rules
│ └── references/ # Deep dives, examples, cheat-sheets
├── agents/ # Subagent prompts (extensible)
├── scripts/ # Validation & packaging
├── CLAUDE.md # Project context for AI assistants
└── README.md # You are here<details> <summary><strong>Do I need to install all 26 skills?</strong></summary>
No. Each skill activates independently based on its trigger description. If you never write GraphQL, go-graphql never fires. The cost of an unused skill is zero tokens. </details>
<details> <summary><strong>Can I use these without Claude Code?</strong></summary>
Yes. The skills are plain markdown — usable as system prompts for any LLM. The plugin manifests just automate discovery for Claude Code, Gemini CLI, and opencode. </details>
<details> <summary><strong>Why "26 skills" and not "1 big style guide"?</strong></summary>
Token budget. A 5,000-line style guide poisons context. 26 focused skills with explicit triggers load only what's relevant to the current diff. </details>
<details> <summary><strong>Are these compatible with golangci-lint?</strong></summary>
Yes — go-linting ships an opinionated .golangci.yml and the other skills cite the same checks. No conflicts. </details>
<details> <summary><strong>What Go version do these target?</strong></summary>
Go 1.21+ baseline. A few skills reference Go 1.24+ (b.Loop) and Go 1.25+ (testing/synctest) — they call out the version explicitly. </details>
<details> <summary><strong>How do I propose a new skill?</strong></summary>
Open an issue with the skill name, the trigger conditions, and 2-3 concrete rules it would enforce. We reject vague "best practices" skills — every skill must have a verifiable checklist. </details>
PRs welcome — but the skill bar is high:
references/.go vet flag, an errors.Is call, a grep pattern).emoji: field is the only exception.See CLAUDE.md for the full authoring checklist.
MIT © muratmirgun
Influenced by:
<div align="center">
[⬆ back to top](#-gophers)
Built with Claude Code. Reviewed by Claude Code. Used by Claude Code.
</div>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.