samber/golang-refactoring

Refactoring Golang — restructuration sécurisée et à grande échelle du code Go existant : un filet de sécurité adapté à la couverture, des transformations préservant le comportement (Renommage/Extraction gopls, `gofmt -r`, `gopatch`), le catalogue Fowler adapté à Go, la rupture des cycles d'importation, et de petites PR empilées. À appliquer lorsqu'une fonction ou un type devient trop gros, qu'un code smell bloque une fonctionnalité, ou que l'utilisateur demande une refactorisation de code Go — également pour renommer à grande échelle, extraire des fonctions ou interfaces, déplacer du code entre des paquets, ou planifier une refactorisation en plusieurs étapes. Pour les styles détenus ailleurs → Voir `samber/cc-skills-golang@golang-naming` (renommages), `samber/cc-skills-golang@golang-project-layout` (scissions), `samber/cc-skills-golang@golang-modernize` (idiomes), `samber/cc-skills-golang@golang-code-style` (flux de contrôle), `samber/cc-skills-golang@golang-design-patterns` (design patterns/DI).

Qu'est-ce que golang-refactoring ?

Ce skill est conçu pour les ingénieurs Go qui souhaitent effectuer des refactorisations sûres, à grande échelle, en préservant le comportement du code existant. Il fournit un cadre méthodologique complet pour planifier, exécuter et valider des refactorisations complexes, en s'appuyant sur des outils comme gopls pour des transformations mécaniques fiables (renommage, extraction, inline) et en évitant les modifications manuelles risquées. Le skill insiste sur la séparation stricte entre changements structurels et comportementaux, l'ajout d'un filet de sécurité de tests lorsque la couverture est insuffisante, et la décomposition du travail en petites PRs (100-500 lignes) facilement révisables. Il prend en charge différents modes opératoires : planification avec validation humaine, exécution incrémentale avec des sous-agents, balayage mécanique simple pour les transformations uniformes, et révision de PR. Une attention particulière est portée à la gestion des dépendances cycliques et à l'utilisation d'outils de réécriture comme `gofmt -r`, `eg`, `gopatch`, ou des correcteurs `go/analysis` pour les changements répétitifs. Le skill est compatible avec Claude Code et Cursor, et s'appuie sur le skill `samber/cc-skills-golang@golang-gopls` pour la configuration de gopls.

Compatible avec✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/samber/cc-skills-golang/tree/main/skills/golang-refactoring

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Par défaut de la communauté. Un skill d'entreprise qui remplace explicitement le skill samber/cc-skills-golang@golang-refactoring a priorité.

Persona : Vous êtes un ingénieur spécialisé dans la refactorisation Go. Vous ne modifiez jamais la structure et le comportement dans la même étape — vous maintenez un filet de tests vert, préférez les outils préservant le comportement aux modifications manuelles, et vous déposez les changements sous forme de petites PR facilement révisables.

Mode de réflexion : Raisonnez de la manière la plus approfondie possible pour l'étape de planification/ordonnancement — cartographier le rayon d'impact, séquencer les PR pour éviter les conflits de fusion, et décider où une refactorisation peut être parallélisée en toute sécurité punissent tous un raisonnement superficiel, car un mauvais ordre se manifeste par une construction cassée ou une fusion parsemée de conflits, et non par un plan clairement erroné. Sur Claude Code, utilisez ultrathink pour déclencher explicitement une réflexion étendue.

Mode d'orchestration : Utilisez ultracode/Workflows uniquement pour un balayage mécanique simple en une seule passe — un correcteur gofmt -r/eg/modernize appliqué à l'ensemble de l'arborescence, vérifié vert, sans qu'aucune étape ne dépende d'une autre. N'utilisez PAS pour une refactorisation en plusieurs étapes nécessitant une relecture humaine progressive entre les fusions : les Workflows s'exécutent d'agent à agent sans point de contrôle humain entre les étapes, ce qui est exactement ce qu'exige une refactorisation par étapes entre chaque fusion.

Modes :

  • Mode Planification (porte d'entrée obligatoire avant toute modification) — utilisez gopls pour cartographier la structure et le rayon d'impact, établir un inventaire de refactorisation, décider de l'ordre, et obtenir l'accord explicite de l'utilisateur avant de toucher au code. Voir workflow.md.
  • Mode Exécution (humain dans la boucle) — un sous-agent, un espace de travail, une branche, une PR par changement atomique, déposée sur une branche de refactorisation ; en parallèle lorsque les fichiers sont disjoints, en séquentiel lorsqu'ils se chevauchent. Déléguez chaque changement à un sous-agent et ne conservez que son résultat — le contexte de la session d'orchestration doit persister à travers chaque ligne de l'inventaire. Voir workflow.md.
  • Mode Balayage Simple — une transformation mécanique unique préservant le comportement, appliquée à l'ensemble de l'arborescence ; peut utiliser ultracode.
  • Mode Révision — révision d'une PR de refactorisation : vérifier la séparation structure/comportement et la préservation du comportement avant d'approuver.

Questions : Les points de validation dans ce skill (l'approbation initiale du mode Planification, et chaque point de contrôle à mi-refactorisation ci-dessous) sont demandés via l'outil de question de l'environnement, jamais sous forme de texte brut que le lecteur pourrait survoler — une refactorisation est exactement le type de flux de travail où un « supposé oui » non remarqué est coûteux à annuler. Il s'agit de points d'approbation sur des décisions irréversibles, non de questions de clarification informelles, donc le fait de répéter « demander via l'outil de question » à chacun d'eux ci-dessous est intentionnel, pas une formule toute faite.

Dépendances : gopls (actionneur principal) — go install golang.org/x/tools/gopls@latest. Optionnels : golangci-lint, benchstat, deadcode, eg, gopatch. Configuration complète de gopls et enregistrement MCP → Voir le skill samber/cc-skills-golang@golang-gopls — c'est le seul endroit où ce skill explique comment obtenir gopls ; toute autre référence à gopls dans ce skill suppose qu'il est déjà installé.

Refactorisation Go — Changement Sécurisé à Grande Échelle

  • La refactorisation (Fowler) consiste à modifier la structure interne du code pour le rendre plus facile à comprendre ou moins coûteux à modifier, sans changer le comportement observable.
  • Les outils Go peuvent prouver que plusieurs transformations préservent le comportement par construction — par exemple, gopls refuse un Renommage plutôt que de risquer une construction cassée.
  • Cette garantie ne couvre rien de ce qui est accessible par réflexion (tags de structure, références de champs text/template) — un filet de sécurité reste donc nécessaire.

La Boucle Principale

Comprendre → Filet de sécurité → Petite étape pilotée par un outil → Vérifier → Commit atomique d'une seule catégorie. Répéter.

  1. Comprendre — cartographiez le rayon d'impact du changement avec gopls (références, hiérarchie d'appels, API des paquets) avant de toucher quoi que ce soit.
  2. Filet de sécurité — avant de toucher du code avec une couverture insuffisante, ajoutez d'abord des tests.
    • Conditionnez la stratégie à la couverture de test du rayon d'impact, pas à la couverture globale.
    • Considérez l'écriture de ce test comme votre propre mécanisme de vérification du changement — pas comme une formalité laissée au relecteur. Une suite de tests verte que vous avez écrite vous-même est ce qui vous permet réellement de distinguer « ce changement préserve le comportement » de « j'espère que ce changement préserve le comportement ».
    • Voir safety-net.md pour les seuils HAUT/MOYEN/BAS et les recettes de tests de caractérisation pour le code non testé.
  3. Petite étape pilotée par un outil — préférez une transformation mécanique pilotée par un outil à une modification manuelle. Voir go-tooling.md et catalog.md.
  4. Vérifier — go build ./... && go vet ./... && go test ./... ; ajoutez -race pour les changements de concurrence et -bench avec benchstat pour les chemins chauds.
  5. Commit atomique d'une seule catégorie — le commit est purement structurel ou purement comportemental, jamais les deux.

Règles Strictes

  • Ne mélangez jamais des changements structurels et comportementaux dans un même commit ou une même PR.
    • Un relecteur qui examine un renommage pour sa correction et un relecteur qui examine une fonctionnalité pour ses effets de bord ont besoin de postures différentes.
    • Les mélanger force un seul relecteur à porter les deux casquettes à la fois, et la révision rapide et peu approfondie qu'un simple renommage mérite est perdue.
  • Séparez un déplacement de code d'une optimisation de code en deux PR séquentielles, même si les deux sont structurelles.
    • Elles nécessitent des vérifications différentes — le déplacement est prouvé sûr par gopls + construction/tests, l'optimisation a besoin de benchmarks et d'une lecture de correction plus approfondie.
    • Elles touchent le même code, donc exécutez-les l'une après l'autre plutôt qu'en parallèle dans des espaces de travail séparés ; la parallélisation ne fait que déplacer le conflit au moment de la fusion.
    • Visez 100 à 500 lignes par PR : assez petit pour être révisé en une seule séance, assez grand pour rester un changement cohérent.
  • Préférez gopls Rename/Inline aux modifications manuelles par LLM.
    • Les deux préservent le comportement par construction — Renommage refuse en cas d'ombrage, de rupture de satisfaction d'interface ou de code mal formé plutôt que de produire silencieusement un diff incorrect ; Inline substitue les arguments porteurs d'effets de bord dans des temporaires var plutôt que de les dupliquer.
    • Une modification manuelle sur des dizaines de sites d'appel n'offre pas une telle garantie et manque mesurablement des cas.
  • Lorsqu'un changement se répète sur de nombreux sites, générez un outil de réécriture plutôt que de modifier chaque site à la main.
    • Escaladez de gofmt -r → eg → gopatch → un correcteur go/analysis, par ordre de puissance croissante (voir go-tooling.md).

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

samber/golang-benchmark

Golang benchmarking, profiling, and performance measurement. Use when writing, running, or comparing Go benchmarks, profiling hot paths with pprof, interpreting CPU/memory/trace profiles, analyzing results with benchstat, setting up CI benchmark regression detection, or investigating production performance with Prometheus runtime metrics. Also use when the developer needs deep analysis on a specific performance indicator - this skill provides the measurement methodology, while `samber/cc-skills-golang@golang-performance` provides the optimization patterns.

samber/golang-cli

Golang CLI application development. Use when building, modifying, or reviewing a Go CLI tool — especially for command structure, flag handling, configuration layering, version embedding, exit codes, I/O patterns, signal handling, shell completion, argument validation, and CLI unit testing. Also triggers when code uses cobra, viper, or urfave/cli. For cobra-specific APIs → See `samber/cc-skills-golang@golang-spf13-cobra` skill; for viper configuration layering → See `samber/cc-skills-golang@golang-spf13-viper` skill.

samber/golang-code-style

Golang code style conventions — line length and breaking, variable declarations, control flow clarity, when comments help vs hurt. Use when writing or reviewing Go code, asking about style or clarity, or establishing project coding standards. Not for naming conventions (→ See `samber/cc-skills-golang@golang-naming` skill), linter configuration (→ See `samber/cc-skills-golang@golang-lint` skill), or doc comments (→ See `samber/cc-skills-golang@golang-documentation` skill).

samber/golang-concurrency

Golang concurrency patterns. Use when writing or reviewing concurrent Go code involving goroutines, channels, select, locks, sync primitives, errgroup, singleflight, worker pools, or fan-out/fan-in pipelines. Also triggers when you detect goroutine leaks, race conditions, channel ownership issues, or need to choose between channels and mutexes.

samber/golang-context

Idiomatic context.Context usage in Golang — propagation through API boundaries, cancellation, timeouts and deadlines, request-scoped values, context.WithoutCancel for background work outliving requests. Apply when designing context propagation across layers, debugging leaked or unexpired contexts, choosing between context.Background/TODO/WithoutCancel, or storing values in context. Not for code that merely accepts ctx as first parameter.

samber/golang-continuous-integration

CI/CD pipeline configuration using GitHub Actions for Golang projects — testing, linting, SAST, security scanning, code coverage, Dependabot, Renovate, GoReleaser, code review automation, and release pipelines. Use when setting up or improving Go project CI, configuring GitHub Actions workflows, adding linters or security scanners, automating dependency updates, or adding quality gates.

samber/golang-database

Comprehensive guide for Go database access — parameterized queries, struct scanning, NULLable columns, transactions, isolation levels, SELECT FOR UPDATE, connection pool, batch processing, context propagation, and migration tooling. Use when writing, reviewing, or debugging Golang code that interacts with PostgreSQL, MariaDB, MySQL, or SQLite; for database testing; or for questions about database/sql, sqlx, or pgx. Does NOT generate database schemas or migration SQL.

samber/golang-data-structures

Golang data structures — slices (internals, capacity growth, preallocation, slices package), maps (internals, hash buckets, maps package), arrays, container/list/heap/ring, strings.Builder vs bytes.Buffer, generic collections, pointers (unsafe.Pointer, weak.Pointer), and copy semantics. Use when choosing or optimizing Go data structures, implementing generic containers, using container/ packages, unsafe or weak pointers, or questioning slice/map internals.

samber/golang-dependency-injection

Comprehensive guide for dependency injection (DI) in Golang. Covers why DI matters (testability, loose coupling, separation of concerns, lifecycle management), manual constructor injection, and DI library comparison (google/wire, uber-go/dig, uber-go/fx, samber/do). Use this skill when designing service architecture, setting up dependency injection, refactoring tightly coupled code, managing singletons or service factories, or when the user asks about inversion of control, service containers, or wiring dependencies in Go. For a specific DI library, → See `samber/cc-skills-golang@golang-google-wire`, `samber/cc-skills-golang@golang-uber-dig`, `samber/cc-skills-golang@golang-uber-fx`, or `samber/cc-skills-golang@golang-samber-do` skills.

samber/golang-dependency-management

Dependency management strategies for Golang projects — go.mod management, installing/upgrading packages, Minimal Version Selection, vulnerability scanning, outdated dependency tracking, binary size analysis, Dependabot/Renovate setup, conflict resolution, and go.work workspaces. Use when adding, removing, or upgrading Go dependencies, auditing vulnerabilities, resolving version conflicts, or setting up automated dependency updates.

samber/golang-design-patterns

Idiomatic Golang design patterns — functional options, constructors, error flow and cascading, resource management and lifecycle, graceful shutdown, resilience, architecture, dependency injection, data handling, streaming, and more. Apply when explicitly choosing between architectural patterns, implementing functional options, designing constructor APIs, setting up graceful shutdown, applying resilience patterns, or asking which idiomatic Go pattern fits a specific problem.

samber/golang-documentation

Comprehensive documentation guide for Golang projects, covering godoc comments, README, CONTRIBUTING, CHANGELOG, Go Playground, Example tests, API docs, and llms.txt. Use when writing or reviewing doc comments, documentation, adding code examples, setting up doc sites, or discussing documentation best practices. Triggers for both libraries and applications/CLIs.

samber/golang-error-handling

Idiomatic Golang error handling — creation, wrapping with %w, errors.Is/As, errors.Join, custom error types, sentinel errors, panic/recover, the single handling rule, structured logging with slog, HTTP request logging middleware, and samber/oops for production errors. Built to make logs usable at scale with log aggregation 3rd-party tools. Apply when creating, wrapping, inspecting, or logging errors in Go code. For samber/oops specifics → See `samber/cc-skills-golang@golang-samber-oops` skill; for slog handler ecosystem → See `samber/cc-skills-golang@golang-samber-slog` skill.

samber/golang-google-wire

Compile-time dependency injection in Golang using google/wire — wire.NewSet, wire.Build, wire.Bind (interface→concrete), wire.Struct, wire.Value, wire.InterfaceValue, wire.FieldsOf, cleanup functions, //go:build wireinject injector files, and generated wire_gen.go. Apply when using or adopting google/wire, when the codebase imports `github.com/google/wire`, or when wiring an application graph at compile time via `wire.Build`. For runtime DI with reflection, see `samber/cc-skills-golang@golang-uber-dig` skill.

samber/golang-gopls

Golang semantic code intelligence via `gopls`, the official Go language server — go-to-definition, find references, call/implementation hierarchy, workspace symbol search, package API discovery, diagnostics, safe rename, refactors (extract/inline/fill/rewrite code actions), formatting, and generated tests. Reaches an agent via gopls's own MCP server (`go_*` tools), Claude Code's native `LSP` tool, or the `gopls` CLI. Use when navigating or refactoring Go code — jumping to a definition, finding call sites before a rename, understanding a file's or package's dependencies, running diagnostics after an edit, or extracting/inlining/renaming. Not for the published ecosystem — packages not in your `go.mod`, versions, licenses, importers — → See `samber/cc-skills-golang@golang-pkg-go-dev` skill (`godig`). Not for a whole-tree vulnerability audit → See `samber/cc-skills-golang@golang-security` skill (`govulncheck`).

samber/golang-graphql

Implements GraphQL APIs in Golang using gqlgen or graphql-go. Apply when building GraphQL servers, designing schemas, writing resolvers, handling subscriptions, or integrating GraphQL with existing Go HTTP services. Also apply when the codebase imports `github.com/99designs/gqlgen` or `github.com/graph-gophers/graphql-go`.

samber/golang-grpc

Provides gRPC usage guidelines, protobuf organization, and production-ready patterns for Golang microservices. Use when implementing, reviewing, or debugging gRPC servers/clients, writing proto files, setting up interceptors, handling gRPC errors with status codes, configuring TLS/mTLS, testing with bufconn, or working with streaming RPCs.

samber/golang-how-to

Golang skills orchestrator — always active on any Golang coding, review, debug, or setup task. Reads the task context and loads the most relevant skills from samber/cc-skills-golang, often multiple at once: writing a gRPC service loads golang-grpc + golang-testing + golang-error-handling; debugging a panic loads golang-troubleshooting + golang-safety; auditing security loads golang-security + golang-lint + golang-safety. Also: disambiguates competing clusters when two skills seem to overlap (performance vs benchmark vs troubleshooting, samber/lo vs mo vs ro, DI cluster, safety vs security), and configures the project's agent-config file (CLAUDE.md, AGENTS.md, GEMINI.md, Cursor rules, or Copilot instructions) to force-trigger skills in a project (/golang-how-to configure).

samber/golang-lint

Linting best practices and golangci-lint configuration for Golang projects — running linters, configuring .golangci.yml, suppressing warnings with nolint directives, interpreting lint output, and selecting linters. Use when configuring golangci-lint, asking about lint warnings or nolint suppressions, setting up code quality tooling, or choosing linters. Also use when the user mentions golangci-lint, go vet, staticcheck, or revive.

samber/golang-modernize

Modernize Golang code to use recent language features, standard library improvements, and idiomatic patterns. Trigger proactively when writing or reviewing Go code and old-style patterns are detected, or when encountering a deprecation warning. Also use when the user explicitly asks for modernization, a Go version upgrade, or a CI/tooling refresh.

Skills associés