本文へ移動
cccskills
無料GitHub で公開

package-design

乱雑なコードベースを、明確なパッケージ/モジュール構造に再設計するための指針。対象は (1) 乱雑なコードの再整理、(2) 単一巨大モジュールの分割、 (3) パッケージ境界のレビュー、(4) 新規プロジェクトのモジュール階層設計。

トリガー:「パッケージ構造を見直したい」「モジュールの依存関係が複雑」 「ファイル配置を整理したい」「循環依存を解消したい」といった構造改善リクエストで起動。

インストール方法を見る

含まれるファイル(3)

  • SKILL.md10.6 KB
  • references/principles.md17.2 KB
  • references/rust-patterns.md7.3 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

パッケージ設計スキル

乱雑なコードを、体系立てた分析で整理されたパッケージへ再構成する。

核心: パッケージ設計は「ソースコードの配置」ではなく「変更の波をどこで止めるか」「依存の向きをどう制御するか」の設計問題である。

コアワークフロー

フェーズ1: 変更理由の分析 - 分割の起点を見つける

分割の出発点は「処理手順」ではなく「変化しそうな設計決定」である。

Parnas の情報隠蔽に基づき、まず以下を問う:

  • 「何が変わるか?」(変更理由・変更源の列挙)
  • 「変わったとき、どこまでを巻き込んでよいか?」(リリース単位・責務境界)
  1. 対象コードの変更履歴(git log)を分析し、一緒に変更されるファイル群を特定する
  2. 外部要因(UI変更、DB変更、API変更、ビジネスルール変更)ごとに影響範囲を整理する
  3. 各変更理由に対して「この変更は、ここで閉じるべき」という境界候補を仮置きする

出力: 変更理由と影響範囲の対応表

フェーズ2: Chunk Down(分解) - 責務を洗い出す

対象コードから原子的な責務を抽出する:

  1. 公開されている型・関数・トレイトをすべて列挙する
  2. 各要素に対して「一文の責務説明」を書く
  3. 暗黙的な責務(エラー処理、ログ、設定など)を洗い出す
  4. 複数責務を持つ要素(SRP違反)をフラグする

出力: 10〜50件の原子的な責務一覧

フェーズ3: グルーピング - 候補パッケージを作る

責務を分割する際の軸を選択し、グルーピングする。

分割軸の選択

分割軸凝集の性質適するケースリスク
機能(feature/vertical)変更が縦に閉じるチーム独立、マイクロサービス候補共通化地獄
ドメイン(業務概念)情報的凝集ドメインモデルの一貫性重視コンテキスト間翻訳コスト
レイヤ(技術層)技術責務の分離小規模、導入初期1変更が全層に散る
責務(変更理由)CCP準拠変更頻度が明確初期分析コスト
API境界(公開IF)表面積最小化ライブラリ設計内部柔軟性とのバランス

グルーピングのヒューリスティクス

  • 一緒に変更される要素 → 同一パッケージ(CCP)
  • 一緒に再利用される要素 → 同一パッケージ(CRP)
  • ドメイン概念の境界 → 自然なパッケージ境界

出力: 3〜7個の候補パッケージ(認知負荷の観点から7±2が目安)

MECEによる検証(設計目標ではなくチェック観点として)

MECEは「設計の目的」ではなく「網羅性チェックの補助」として使う。 厳密MECEにこだわりすぎると、横断的関心(ログ、認可、トランザクション等)の扱いで境界が薄くなる危険がある。8〜9割の網羅で十分。

  • 各責務は1つのパッケージに割り当てられているか(重複なし)
  • 未割り当ての責務が残っていないか(漏れなし)
  • 「Xはどこに置く?」に対して答えが1つだけあるか

詳細は references/principles.md#mece-分割 を参照。

フェーズ4: Chunk Up - 抽象化と命名

各グループを一段抽象化して命名する:

  1. 各グループを貫く概念を見つける
  2. 技術的な役割ではなく、ドメイン概念で命名する
  3. そのパッケージの目的を一文で言えることを確認する
  4. 命名が難しい場合はグルーピングが誤っている可能性が高い → フェーズ3に戻る

良い例: authentication, billing, inventory 避ける例: utils, helpers, common, misc

フェーズ5: 依存関係設計と原則検証

依存の向きを設計する

依存は「より安定・より抽象」な側へ向ける。

  1. パッケージ間の依存グラフを描く
  2. 循環依存がないか確認(ADP)
  3. 安定側(多くから依存される)→ 不安定側(多くに依存する)の向きに依存が逆転していないか確認(SDP)
  4. 安定なパッケージが十分抽象的か確認(SAP)

循環依存の解消手順

循環が見つかった場合:

  1. 依存性逆転: 依存される側の抽象(Interface/Trait)を依存する側へ移し、実装は逆向きに差し込む
  2. 共有抽出: 相互参照している共通型/ロジックを第三のパッケージへ移動し、循環辺を切る
  3. 統合: 本当に同一責務ならパッケージを統合する

原則チェック

原則確認観点
高凝集パッケージ内の要素が単一目的に収束しているか
低結合パッケージ間の依存が最小か
ADP循環依存がないか
SDP依存が安定側に向かっているか
SAP安定なパッケージが十分抽象的か
CCP同じ変更理由のものが同一パッケージに閉じているか

詳細は references/principles.md を参照。

フェーズ6: 公開インターフェースとテスト境界の定義

公開インターフェース

各パッケージについて:

  1. pub にすべき要素(外部契約)を特定する
  2. それ以外は pub(crate) か private にする
  3. インターフェースが複雑ならファサード型/関数を用意する
  4. モジュールドキュメントで契約を説明する

テスト境界の対応付け

テストを「境界」に対応させる:

テスト種別対象目的
ユニットテストパッケージ内部内部の凝集を守る
統合テストパッケージ間境界横断の依存が設計どおりか
契約テスト公開API境界互換性(結合点)を守る

評価チェックリスト

提案した構造が以下を満たしているか確認する(Yesが多いほど高凝集・低結合):

  • 各パッケージの目的が一文で言える(何を提供し、何を隠すか)
  • 境界を越える依存は、公開API(ファサード/ポート)を経由している
  • パッケージ依存グラフが非循環である
  • 安定度の高い領域が十分抽象化されている
  • 変更理由がパッケージ境界で止まる
  • 境界のテストが公開APIの範囲と一致している

メトリクスによる定量評価

メトリクス対象意味
Ca(求心結合)パッケージ外部から依存される数
Ce(遠心結合)パッケージ外部へ依存する数
I = Ce/(Ca+Ce)パッケージ不安定性(0=最安定, 1=最不安定)
D(Main Sequenceからの距離)パッケージA + I = 1 からの乖離

詳細は references/principles.md#パッケージメトリクス を参照。

リファクタリングトリガー

以下が観測されたら分割/境界の見直しを検討する:

  • 変更が複数パッケージに散る(CCP違反の兆候)
  • Ce増大(外部依存が増え続ける)
  • パッケージサイクル(循環依存)が発生する
  • パッケージ内の複雑度が上昇し続ける

Rust固有のパターン

references/rust-patterns.md を参照:

  • mod 階層設計
  • ワークスペースと単一クレートの選択
  • featureフラグ戦略
  • 再エクスポートの指針

※ このプロジェクトでは mod.rs を使わない。2018モジュール方式で package_name.rs と package_name/ 配下のファイルで構成する。

代表パターン比較

パターン凝集軸利点リスク
レイヤード技術責務導入容易1変更が全層に散る
機能別(vertical slicing)ユースケース変更が閉じやすい共通化地獄
コンポーネント別機能集合境界が明確公開API設計コスト
Bounded Contextドメイン境界モデル整合性コンテキスト間翻訳コスト
Ports & Adapters / Clean依存方向テスト容易構造の形式主義

アンチパターン

  • God module: 1ファイルに500行以上の責務が集中している
  • 循環依存: A → B → C → A(境界が実質的に崩壊したシグナル)
  • 不安定依存: 中核モジュールが変化の激しいモジュールに依存(SDP違反)
  • 抽象の漏れ: 内部型が公開APIに漏れ出る
  • 雑多な util/common: 関連性の低い要素が「その他」で集約される(共通結合の温床)
  • レイヤだけで境界なし: 見た目がレイヤでも相互参照や内部参照が放置されている
  • cargo cult パッケージング: パターンを理由理解なしに適用し、構造は整って見えるが意図が失われている

出力フォーマット

再構成提案は以下の形式で示す:

## 提案パッケージ構成

package_name.rs (目的: 1文で説明)
package_name/
├── submodule_a.rs
└── submodule_b.rs

### 依存関係
package_a → package_b (reason)

### メトリクス概算
package_a: Ca=3, Ce=1, I=0.25 (安定)
package_b: Ca=1, Ce=2, I=0.67 (不安定)

### 移行手順
1. 新しいモジュール構造を作成する
2. 型や関数を最小変更で移動する
3. import を更新する
4. テストが通ることを確認する
5. 循環依存がないことを静的解析で確認する

関連スキル(併読推奨)

このスキルを使用する際は、以下のスキルも併せて参照すること:

  • ddd-module-pattern: DDD文脈でのドメイン語彙ベースのモジュール設計
  • refactoring-packages: 既存パッケージ構造のリファクタリング実行
  • clean-architecture: パッケージ設計の基盤となる4層アーキテクチャ

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

aggregate-design

無料日本語概要

DDDの集約(Aggregate)設計ルールに基づくコードレビュー・設計支援・リファクタリングを行う。 Evans Rules、Vernon's 4 Rules、Design by Contractに基づき、集約の境界定義、不変条件の検証、 不変(Immutable)設計、ID参照、結果整合性、ドメインイベント連携を包括的にガイドする。 以下のいずれかに該当する場合は必ずこのスキルを使用すること: - 集約(Aggregate)の新規設計・実装・リファクタリング(どの言語でも) - 既存の集約やエンティティクラスのDDD観点でのコードレビュー - 集約の境界決定(「AとBは同じ集約にすべきか?」「この集約は大きすぎるか?」) - 集約内の不変条件・整合性境界の設計 - 集約間の連携方式の判断(ドメインイベント、結果整合性、Sagaパターン) - 可変(Mutable)な集約コードを不変(Immutable)設計にリファクタリングする - publicフィールド、直接参照、push/appendなどカプセル化違反の検出・修正 キーワード例:集約、Aggregate、aggregate boundary、集約ルート、AggregateRoot、 エンティティ設計、DDD実装、Vernon Rules、Evans Rules、集約の分割、真の不変条件

j5ik2o/okite-ai802026年4月25日 更新

aggregate-transaction-boundary

無料日本語概要

集約とトランザクション境界の関係を明確化し、複数集約を単一トランザクションに含めるアンチパターンを 検出・是正する。集約は強い整合性境界であり、ユースケースで複数集約を更新する場合は結果整合性を 使うべきという原則を適用する。コードレビュー、ユースケース設計、リファクタリング時に トランザクション境界の問題を検出する場合に使用。 対象言語: 言語非依存(Java, Kotlin, Scala, TypeScript, Go, Rust, Python等すべて)。 トリガー:「複数集約を同じトランザクションで更新している」「ユースケースに@Transactionalがある」 「集約間の整合性をどう取るか」「Sagaパターンを使うべきか」「トランザクション境界の設計」 「1トランザクション1集約」「結果整合性の実装」「集約をまたぐトランザクション」 といったトランザクション境界関連リクエストで起動。

j5ik2o/okite-ai802026年4月25日 更新

backward-compat-governance

無料日本語概要

後方互換性がゴミコードを量産する構造を検出し、互換性を「契約と撤去計画」として管理する ガバナンスを支援するスキル。公開API境界の明確化、非推奨化サイクル(deprecation cycle)の 制度化、互換層の局所化(Adapter/Strangler Fig)、契約テスト(CDC)による互換性検証、 AI生成コードの互換性ゲート設計を含む。コードレビュー、API設計、リファクタリング、 レガシー移行時に互換性起因の技術的負債を防ぐために使用。 対象言語: 言語非依存(Java, TypeScript, Go, Python, Rust等すべて)。 トリガー:「後方互換性を保ちたい」「非推奨APIをどうする」「互換層が増えてきた」 「レガシー移行の戦略」「API設計レビュー」「互換性のためのコードが多い」 「deprecation policyを作りたい」「破壊的変更の管理」といった互換性管理関連リクエストで起動。

j5ik2o/okite-ai802026年4月25日 更新

breach-encapsulation-naming

無料日本語概要

getterの濫用を防ぐための命名規約スキル。ドメインモデルでgetterが必要な場合(永続化、JSON変換など)に `breachEncapsulationOf` プレフィックスを付与することで、カプセル化を破っていることを明示する。 これにより、Tell Don't Ask原則の違反を未然に防ぎ、getterの意図しない使用を抑制する。 コードレビュー、新規実装、リファクタリング時にgetter設計が必要な場合に使用。 対象言語: Java, Kotlin, Scala, TypeScript, Python, Go, Rust。 トリガー:「getterの命名規約」「カプセル化を破るgetter」「永続化用のgetter」 「breachEncapsulation」「getterを作りたいが濫用を防ぎたい」といったgetter命名関連リクエストで起動。

j5ik2o/okite-ai802026年4月25日 更新

clean-architecture

無料日本語概要

クリーンアーキテクチャを採用しているプロジェクト向けの設計・レビュー支援。4層構造(ドメイン層、 ユースケース層、インターフェースアダプタ層、インフラストラクチャ層)に基づく。特にインフラ層は 横断的関心事(ロギング、設定管理)のみ、永続化やRPCはインターフェースアダプタ層に配置すべき という原則を適用する。トリガー:「クリーンアーキテクチャで」「クリーンアーキテクチャに従って」 「クリーンアーキテクチャのレビュー」など、クリーンアーキテクチャを明示的に指定した場合のみ起動。 一般的な「設計レビュー」「アーキテクチャ相談」では起動しない。

j5ik2o/okite-ai802026年4月25日 更新

cqrs-aggregate-modeling

無料日本語概要

CQRS/ESが集約の境界定義とモデリングに与える影響を解説する。CQRSを導入すると集約は コマンド実行に必要な最小限の状態のみ保持すればよくなり、読み取り責務はリードモデルに 委譲できる。大きすぎる集約の軽量化、集約境界の再定義、イベントによる状態管理を支援する。 集約設計、CQRS導入時のモデリング見直し、パフォーマンス問題の解決時に使用。 対象言語: 言語非依存。 トリガー:「CQRSで集約が変わる」「集約が大きすぎる」「集約にメッセージ1000件」 「集約の更新が重い」「CQRS導入で集約を見直す」「集約を軽量化したい」 「集約にクエリ用データが混ざっている」「集約の境界を再定義」 といったCQRS/モデリング関連リクエストで起動。

j5ik2o/okite-ai802026年4月25日 更新

j5ik2o のスキルをすべて見る

このスキルの問題を報告する