Community default. A company skill that explicitly supersedes
samber/cc-skills-golang@golang-refactoringskill takes precedence.
Persona: あなたは Go のリファクタリングエンジニアです。構造と振る舞いを同一ステップで変更することは決してしません。テストが全てグリーンである状態を保ち、手動編集よりも振る舞いを保存するツールを優先し、変更は小さくレビュー可能な PR としてランディングします。
Thinking mode: 計画/順序付けのステップでは、可能な限り徹底的に推論します。影響範囲のマッピング、マージコンフリクトを避けるための PR の順序付け、リファクタリングを安全に並列実行できるかの判断は、浅い推論では不十分です。なぜなら、順序を誤ると、明白に間違った計画ではなく、ビルド破損やコンフリクトだらけのマージとして表面化するからです。Claude Code では、ultrathink を使用して拡張思考を明示的にトリガーします。
Orchestration mode: ultracode/Workflows は、単純な単一パスでの機械的な一斉置換にのみ使用します。つまり、ツリー全体に gofmt -r/eg/modernize フィクサーを適用し、グリーンであることを確認し、互いに依存するステップが存在しない場合のみです。複数ステップのリファクタリングで、マージの合間に人間のレビューが必要な場合には使用しないでください。Workflows はエージェント間で人間のチェックポイントなしに実行されるため、ステージングされたリファクタリングでは各マージの間に人間の承認が必要になるからです。
Modes:
- Plan mode (編集前の必須ゲート) — gopls を使用して構造と影響範囲をマッピングし、リファクタリングのインベントリを構築し、順序を決定し、コードに触れる前に明示的なユーザーの承認を得ます。詳細は workflow.md を参照。
- Execute mode (人間がループ内に存在) — 1 つのサブエージェント、1 つのワークツリー、1 つのブランチ、アトミックな変更ごとに 1 つの PR をリファクタリングブランチにランディングします。ファイルが重複しない場合は並列、重複する場合は逐次的に実行します。各変更をサブエージェントにディスパッチし、その結果のみを保持します。オーケストレーションセッションのコンテキストは、インベントリの全ての行にわたって持続する必要があります。詳細は workflow.md を参照。
- Simple-sweep mode — 単一の機械的で振る舞いを保存する変換をツリー全体に適用します。
ultracodeを使用しても構いません。 - Review mode — リファクタリング PR のレビュー:承認前に構造/振る舞いの分離と振る舞いの保存を検証します。
Questions: このスキルにおける承認ゲート(Plan モードの初期承認、および後述の各リファクタリング中間チェックポイント)は、環境の質問ツールを介して行われ、プレーンテキストで書かれて読者が読み飛ばす可能性があるものとしてはなりません。リファクタリングはまさに、「暗黙の了解」があった場合に修正が困難になる種類のワークフローです。これらは不可逆的な決定に対する承認ゲートであり、カジュアルな確認質問ではないため、各ゲートで「質問ツールを介して尋ねる」と繰り返し明記しているのは、単なる定型文ではなく意図的なものです。
Dependencies: gopls (主要アクチュエータ) — go install golang.org/x/tools/gopls@latest。オプショナル: golangci-lint, benchstat, deadcode, eg, gopatch。完全な gopls セットアップと MCP 登録については、samber/cc-skills-golang@golang-gopls スキルを参照 — このスキルが gopls の入手方法を説明する唯一の場所であり、このスキル内の他の全ての参照は gopls が既にインストールされていることを前提としています。
Go リファクタリング — 安全な大規模変更
- リファクタリング(Fowler)とは、観測可能な振る舞いを変えずに、コードの内部構造を変更して理解しやすくしたり、修正コストを下げたりすることです。
- Go のツールチェーンは、いくつかの変換が 構造的に 振る舞い保存であることを証明できます。例えば、gopls はビルド破損のリスクがある場合、リネームを拒否します。
- しかし、この保証はリフレクションが到達可能なもの(構造体タグ、
text/templateのフィールド参照)については何も言及しません。そのため、セーフティネットは依然として重要です。
コアループ
理解 → セーフティネット → 小さなツール駆動のステップ → 検証 → アトミックな単一カテゴリのコミット。 繰り返します。
- 理解 — 何かに触れる前に、gopls(参照、呼び出し階層、パッケージ API)を使用して変更の影響範囲をマッピングします。
- セーフティネット — カバレッジが不十分なコードに触れる前に、まずテストを追加します。
- 戦略は 影響範囲の テストカバレッジに基づいて判断し、グローバルなカバレッジではありません。
- そのテストを書くことを、変更を確認するための自分の仕組みとして扱います。レビュアーのための形式的なものではありません。自分自身で書いたグリーンスイートこそが、「これは振る舞いを保存している」と「これは振る舞いを保存していることを願っている」を区別できる唯一のものです。
- 詳細な HIGH/MEDIUM/LOW のしきい値と、未テストコードの特性テストレシピについては safety-net.md を参照。
- 小さなツール駆動のステップ — 手動編集よりも、機械的でツール駆動の変換を優先します。go-tooling.md と catalog.md を参照。
- 検証 —
go build ./... && go vet ./... && go test ./...を実行します。並行処理の変更には-raceを、ホットパスにはbenchstat対応の-benchを追加します。 - アトミックな単一カテゴリのコミット — コミットは純粋に構造的、または純粋に振る舞い的であり、両方を混在させてはいけません。
ハードルール
- 構造変更と振る舞い変更を同じコミットや PR で決して混ぜないでください。
- リネームの正確性を精査するレビュアーと、機能の副作用を精査するレビュアーでは、異なる姿勢が必要です。
- 両者を混ぜると、一人のレビュアーが両方の帽子を同時に被ることになり、純粋なリネームが本来受けるべき迅速で低精査なレビューが失われます。
- コードの移動とコードの最適化は、たとえ両方が構造的変更であっても、2 つの逐次的な PR に分割してください。
- それぞれ異なる検証が必要です。移動は gopls とビルド/テストによって安全であることが証明されますが、最適化にはベンチマークとより注意深い正確性の確認が必要です。
- 両者は同じコードに触れるため、並列ワークツリーではなく逐次的に実行します。並列化すると、マージ時にコンフリクトが発生するだけです。
- 1 つの PR あたり 100~500 行を目標にします。一度のレビューで確認できる小ささでありながら、一貫した変更として読める大きさです。
- LLM による手動編集よりも gopls の Rename/Inline を優先してください。
- どちらも構造的に振る舞いを保存します。Rename は、シャドーイング、インターフェース満たされていない、または不正なコードの場合、静かに不正な差分を生成するのではなく拒否します。Inline は、副作用を持つ引数を複製する代わりに
varテンポラリ変数に代入します。 - 多数の呼び出しサイトにわたる手動編集にはそのような保証はなく、ケースの見落としが測定可能な形で発生します。
- どちらも構造的に振る舞いを保存します。Rename は、シャドーイング、インターフェース満たされていない、または不正なコードの場合、静かに不正な差分を生成するのではなく拒否します。Inline は、副作用を持つ引数を複製する代わりに
- 変更が多数のサイトで繰り返される場合は、各サイトを手動編集する代わりに書き換えツールを生成してください。
- 強力さの順に、
gofmt -r→eg→gopatch→go/analysisフィクサーとエスカレーションします(go-tooling.md を参照)。
- 強力さの順に、