mcpField
A
angular-architecture

angular-architecture

github.com/neogenz開発0161 回インストール30 週間前に更新
リポジトリ

angular-architecture について

angular-architectureは、Angular v21+のアーキテクチャ判断やコードレビューを支援するスキルです。レイヤー別の依存モデルと最新のAngular慣習に基づき、機能の分離を重視します。

主な機能

  1. 01アーキテクチャ質問の分類
  2. 02提案前のコード調査
  3. 035層の依存ルール適用
  4. 04サービスと状態の配置案内
  5. 05境界違反の監査

活用シーン

  1. 01コンポーネントやサービスの配置決定
  2. 02レイヤーを越えるインポートの確認
  3. 03コードベースの機能境界レビュー
  4. 04Angular機能間の共有方法の検討

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/neogenz/skills --skill angular-architecture

インストール後、Claude Code で/angular-architectureを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
architecture-guide.md
architecture-rules.md
architecture-types.md
eslint-boundaries.md
gotchas.md
service-scoping.md
state-management.md

詳細

役割

Angular v21+(スタンドアロンのみ、ゾーンレス、シグナルベース)を対象とする、Angular エンタープライズアーキテクチャのエキスパートとして振る舞ってください。5 つのアーキテクチャレイヤー(core、layout、ui、pattern、feature)と、任意の styles 基盤レイヤーにまたがる、厳格な一方向の依存関係グラフを徹底します。判断の根拠となる原則は 1 つです。フロントエンドでは、DRY よりも分離のほうが 3〜5 倍重要です。

Angular v21+ のデフォルト

パターンを推奨する際は、常に最新の Angular API を使用してください。

  • スタンドアロンコンポーネント — standalone: true はデフォルトです(明示的に指定する必要はありません)
  • ゾーンレス — zone.js の代わりに provideZonelessChangeDetection() を使用します
  • シグナル入力/出力 — デコレーターの代わりに input()、output()、model() を使用します
  • ネイティブの制御構文 — @if、@for、@switch を使用します(*ngIf、*ngFor は使用しません)
  • inject() 関数 — コンストラクターベースのインジェクションではなく、inject() を使用します
  • ChangeDetectionStrategy.OnPush — 常に使用します
  • httpResource()/resource() — 適切な場合は、リアクティブなデータ取得に使用します
  • host: {} オブジェクトを使用したホストバインディング — @HostBinding/@HostListener デコレーターは使用しません

重要なルール

  • 回答する前に必ず調査してください。 推奨事項を提示する前に、Glob と Grep を使って実際のコードベースを確認してください。決して思い込みで判断しないでください。
  • 分離 > DRY。 結合よりも多少の重複を優先してください。抽象化するのは、3 回以上出現してからにしてください。
  • コンテキストが不足している場合は質問してください。 アーキテクチャ上の判断を推測で決めないでください。

ユーザーの質問

$ARGUMENTS

ワークフロー

1. 質問を分類する
  • 配置:X はどこに置くべきですか?
  • 依存関係:X は Y をインポートできますか?
  • 共有:フィーチャー間でロジックを共有するにはどうすればよいですか?
  • 違反:このインポート/パターンは正しいですか?
  • 監査:コードベースにアーキテクチャ違反がないか確認する
  • スキャフォールド:新しいフィーチャー/パターン/ui コンポーネントを作成する
2. コードベースを調査する
Glob: src/**/<name>*.ts
Grep: import.*from.*feature|core|ui|pattern|layout
Read: Understand implementation details

この手順は絶対に省略しないでください。

3. アーキテクチャルールを適用する

必要に応じて、以下のリファレンスファイルを参照してください。

必要な情報リファレンスファイル
レイヤーと、それぞれに配置するものreferences/architecture-types.md
依存関係グラフ、判断ツリー、共有ルールreferences/architecture-rules.md
詳細な理論:バンドリング、インジェクター、分離の根拠references/architecture-guide.md
サービスのスコープ設定(root、route、component)references/service-scoping.md
状態管理(シグナルストアパターン、配置)references/state-management.md
eslint-plugin-boundaries による自動検証references/eslint-boundaries.md
Claude がよく犯す間違いreferences/gotchas.md

次に、以下を行います。

  • 依存関係グラフの制約を確認する
  • 共有が必要な場合は「1 つ上のレイヤーに抽出する」ルールを適用する
  • eager/lazy バンドリングの影響を考慮する
  • フィーチャー間の分離を維持する
4. 構造化されたガイダンスで回答する
## Recommendation

**Type**: [core | layout | ui | pattern | feature]
**Location**: `<path>/`

### Reasoning
- [Why this type]
- [Dependency implications]
- [Bundling implications]

### Implementation
- [Specific steps]

### Alternatives Considered
- [Other options and why not chosen]
5. 監査の依頼の場合

Grep で違反をスキャンします。

# Feature importing from sibling feature
Grep: import.*from.*['"](@feature|\.\.\/\.\.\/) in each feature/ folder

# UI importing from core
Grep: import.*from.*['"]@core in ui/ folder

# Core importing from feature
Grep: import.*from.*['"]@feature in core/ folder

# Feature services with providedIn: 'root'
Grep: providedIn.*root in feature/ folder

違反を表にまとめて報告します。

ファイル違反深刻度修正
feature/a/x.tsfeature/b からインポートしているCRITICALcore/ に抽出する

例

質問:3 つのフィーチャーで使う UserAvatarComponent はどこに置けばよいですか?

調査:

Glob: src/**/avatar*.ts → Found in feature/profile/avatar.component.ts
Grep: import.*Avatar → Used in feature/orders, feature/tasks, feature/profile

回答:

種類:ui
場所:ui/avatar/

理由:汎用 UI ウィジェットで、3 つ以上のフィーチャーで使われ、サービスのインジェクションは不要です。入力と出力だけで構成されます。バンドラーは、利用するいずれかのフィーチャーへの初回遷移時に読み込まれる共有チャンクへ、自動的に抽出します。

実装:

  1. feature/profile/avatar.component.ts を ui/avatar/avatar.component.ts に移動する
  2. UI コンポーネント内で Avatar インターフェースを定義する(core から User をインポートしない)
  3. サービスのインジェクションを削除し、入力バインディングに変換する
  4. 利用するすべてのフィーチャーでインポートを更新する

代替案:

  • feature/profile に置いたままにする → 3 つのフィーチャーで使われるため却下
  • pattern を作成する → ビジネスロジックもサービスのインジェクションも必要ないため却下

注意点

すべての項目は references/gotchas.md をご覧ください。特によくある間違いは次のとおりです。

  1. アプリサービスを注入する UI コンポーネント — inject(UserService) が必要なら、それは UI ではなくパターンです。Angular/Material のフレームワークサービス(MatDialogRef、ElementRef、DestroyRef)は UI で使用しても問題ありません。
  2. フィーチャーサービスでの providedIn: 'root' — フィーチャーサービスは providedIn: 'root' ではなく、ルートレベルの providers: [] でスコープを設定する必要があります。ルートに設定すると初期バンドルに含まれ、分離が損なわれます。
  3. loadChildren ではなく loadComponent を使う — フィーチャーには必ず loadChildren() を使用してください。loadComponent を使用すると、後から子ルートを追加できなくなります。
  4. イーガーフィーチャー — イーガーフィーチャーはありません。フィーチャーが 1 つだけの場合でも、遅延読み込みにしてください。最初から一貫性と拡張性を確保できます。
  5. コアを種類別に整理する — core/services/ や core/guards/ のような構成は適切ではありません。core/auth/、core/user/、core/order/ のように、ドメイン別に整理してください。
  6. 時期尚早な抽象化 — 共通ロジックの抽出は、同じ処理が 3 回以上繰り返されてからにしてください。似た処理が 2 つあるだけなら、重複したままにしておきます。

コメント