angular-architecture について
angular-architectureは、Angular v21+のアーキテクチャ判断やコードレビューを支援するスキルです。レイヤー別の依存モデルと最新のAngular慣習に基づき、機能の分離を重視します。
主な機能
- 01アーキテクチャ質問の分類
- 02提案前のコード調査
- 035層の依存ルール適用
- 04サービスと状態の配置案内
- 05境界違反の監査
活用シーン
- 01コンポーネントやサービスの配置決定
- 02レイヤーを越えるインポートの確認
- 03コードベースの機能境界レビュー
- 04Angular機能間の共有方法の検討
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ neogenz/ skills --skill angular-architectureインストール後、Claude Code で/angular-architectureを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/architecture-guide.mdarchitecture-rules.mdarchitecture-types.mdeslint-boundaries.mdgotchas.mdservice-scoping.mdstate-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.ts | feature/b からインポートしている | CRITICAL | core/ に抽出する |
例
質問: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 つ以上のフィーチャーで使われ、サービスのインジェクションは不要です。入力と出力だけで構成されます。バンドラーは、利用するいずれかのフィーチャーへの初回遷移時に読み込まれる共有チャンクへ、自動的に抽出します。
実装:
feature/profile/avatar.component.tsをui/avatar/avatar.component.tsに移動する- UI コンポーネント内で
Avatarインターフェースを定義する(core からUserをインポートしない) - サービスのインジェクションを削除し、入力バインディングに変換する
- 利用するすべてのフィーチャーでインポートを更新する
代替案:
- feature/profile に置いたままにする → 3 つのフィーチャーで使われるため却下
- pattern を作成する → ビジネスロジックもサービスのインジェクションも必要ないため却下
注意点
すべての項目は references/gotchas.md をご覧ください。特によくある間違いは次のとおりです。
- アプリサービスを注入する UI コンポーネント —
inject(UserService)が必要なら、それは UI ではなくパターンです。Angular/Material のフレームワークサービス(MatDialogRef、ElementRef、DestroyRef)は UI で使用しても問題ありません。 - フィーチャーサービスでの
providedIn: 'root'— フィーチャーサービスはprovidedIn: 'root'ではなく、ルートレベルのproviders: []でスコープを設定する必要があります。ルートに設定すると初期バンドルに含まれ、分離が損なわれます。 loadChildrenではなくloadComponentを使う — フィーチャーには必ずloadChildren()を使用してください。loadComponentを使用すると、後から子ルートを追加できなくなります。- イーガーフィーチャー — イーガーフィーチャーはありません。フィーチャーが 1 つだけの場合でも、遅延読み込みにしてください。最初から一貫性と拡張性を確保できます。
- コアを種類別に整理する —
core/services/やcore/guards/のような構成は適切ではありません。core/auth/、core/user/、core/order/のように、ドメイン別に整理してください。 - 時期尚早な抽象化 — 共通ロジックの抽出は、同じ処理が 3 回以上繰り返されてからにしてください。似た処理が 2 つあるだけなら、重複したままにしておきます。