solid-go について
solid-goは、Goプロジェクトでモジュール型アーキテクチャとSOLID原則を適用するためのコーディングスキルです。コード配置、再利用の確認、インターフェース規約、実装手順を定めています。
主な機能
- 01機能別のinternalモジュール
- 02共有コード用のcore
- 03実装前の再利用チェック
- 04ports内の小さなインターフェース
- 05モジュールとテストのテンプレート
活用シーン
- 01新しいGo機能の構成
- 02実装前の再利用可能なサービス確認
- 03ハンドラー、サービス、テストのひな形作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ fusengine/ claude-plugins --skill solid-goインストール後、Claude Code で/solid-goを入力して読み込まれたか確認します。
詳細
SOLID Go では、Go 1.27 以降に向けたモジュール型アーキテクチャを徹底します。各機能は `internal/modules/[feature]/`(ハンドラー、サービス、リポジトリ、ポート、モデル)配下に配置し、共有コードは `internal/core/` に配置します。インターフェース(ポート)は `ports/` ディレクトリのみに置き、小規模(1~3 メソッド。Go の慣用的な形式)に保ちます。関数はインターフェースを受け取り、構造体を返します。また、エクスポートされるすべての関数に godoc コメントを付けます。
新しいコードを書く前に、internal/core/services と internal/core/ports を対象に DRY チェックを行う必要があります。概要については solid-principles.md を、各原則(SRP/OCP/LSP/ISP/DIP)の詳細については原則ごとのリファレンスを、ヘキサゴナル/モジュール型の構成については architecture-patterns.md を参照してください。また、モジュール/サービス/インターフェース/ハンドラー/エラー/テストのひな形にはテンプレートを参照してください。
SOLID Go - モジュール型アーキテクチャ
エージェントのワークフロー(必須)
実装を行う前に、3 つのエージェントを並行して起動してください。それぞれ name を指定した Agent 呼び出しを 1 回ずつ行います。
- fuse-ai-pilot:explore-codebase - 既存のアーキテクチャを分析します
- fuse-ai-pilot:research-expert - Context7 を使って Go のドキュメントを確認します
- fuse-ai-pilot:sniper - 実装後の検証を行います
DRY - 作成する前に再利用する(必須)
新しいコードを書く前に必ず行うこと:
- 類似したインターフェース、サービス、ロジックがないかコードベースを Grep で検索します
- 共有コードの配置場所を確認します:
internal/core/services/、internal/core/ports/ - 類似コードがある場合 -> 複製せず、拡張または再利用します
- 2 つ以上の機能で使用するコードの場合 ->
internal/core/に作成します
アーキテクチャ(モジュール必須)
| レイヤー | 配置場所 |
|---|---|
| ハンドラー | internal/modules/[feature]/handlers/ |
| サービス | internal/modules/[feature]/services/ |
| リポジトリ | internal/modules/[feature]/repositories/ |
| ポート(インターフェース) | internal/modules/[feature]/ports/ |
| モデル | internal/modules/[feature]/models/ |
| 共有 | internal/core/{services,ports,models}/ |
フラットな internal/ 構成は絶対に使わず、常に internal/modules/[feature]/ を使用してください
重要なルール(必須)
| ルール | 値 |
|---|---|
| ファイルの上限行数 | FUSE_SOLID_MAX_LINES |
| ハンドラー | 薄く保ち、サービスに処理を委譲します |
| インターフェース | ports/ ディレクトリのみに配置 |
| Godoc | エクスポートされるすべての関数にドキュメントを付けます |
| インターフェースを受け取る | 構造体を返す |
| 小規模なインターフェース | 最大 1~3 メソッド(Go の慣用的な形式) |
リファレンスガイド
概念
| トピック | リファレンス | 参照するタイミング |
|---|---|---|
| SOLID の概要 | solid-principles.md | クイックリファレンス |
| SRP | single-responsibility.md | 肥大化した構造体 |
| OCP | open-closed.md | プロバイダーの追加 |
| LSP | liskov-substitution.md | 契約 |
| ISP | interface-segregation.md | 肥大化したインターフェース |
| DIP | dependency-inversion.md | 依存性の注入 |
| アーキテクチャ | architecture-patterns.md | ヘキサゴナル/モジュール型 |
テンプレート
| テンプレート | 使用するタイミング |
|---|---|
| module.md | 機能モジュールの構成 |
| service.md | ビジネスロジックサービス |
| interface.md | ポートの定義 |
| handler.md | HTTP ハンドラー |
| error.md | カスタムエラー |
| test.md | テーブル駆動テスト |
禁止事項
| アンチパターン | 修正方法 |
|---|---|
FUSE_SOLID_MAX_LINES を超えるファイル | 責務ごとに分割します |
| 実装ファイル内のインターフェース | ports/ ディレクトリに移動します |
| 肥大化したインターフェース(4 つ以上のメソッド) | 小規模なインターフェースに分割します |
フラットな internal/ 構成 | internal/modules/[feature]/ を使用します |
依存関係の接続に init() を使う | コンストラクターインジェクションを使用します |
コメント
Markdown 対応