copilot-instructions.md を分割したい?applyTo パターンで解決

はじめに

ども!GitHub Copilotの設定ファイルの設計にいそしんでいる龍ちゃんです。

前回の記事では、GitHub Copilotの設定ファイル5種類を整理しました。今回はその中でも特に重要な「Instructions ファイル」の設計にフォーカスします。

まだInstructionsを使っていない方へ:いきなり設計から入る必要はありません。まずは copilot-instructions.md に思いつくルールをどんどん書いていけばOKです。使っていくうちに「あれも追加したい、これも追加したい」となって、気づいたら肥大化している…というのは自然な流れです。

本記事は、その肥大化に直面したときに読む記事です。現在筆者が検証中の分割パターンを共有しますので、参考にしてみてください。「もっとこうしたほうが良いよ」というフィードバックも大歓迎です!

検証環境

  • 検証日: 2026年1月30日
  • 環境: VS Code + Dev Container
  • GitHub Copilot: 2026年1月時点の機能

*.instructions.md とは

copilot-instructions.md が肥大化してきたとき、救世主となるのが *.instructions.md です。

配置場所: .github/instructions/

このディレクトリに配置したMarkdownファイルは、applyTo で指定したパターンにマッチするファイルを編集するときだけ自動適用されます。

観点copilot-instructions.md*.instructions.md
適用範囲全ファイル特定ファイルのみ
条件指定なしapplyTo で指定
用途全体ルール言語・ディレクトリ別ルール

「全員に適用するルール」と「特定のファイルにだけ適用するルール」を分けられるわけです。


押さえておくべきポイント

*.instructions.md を使う前に、知っておくべき挙動が3つあります。

applyTo の基本

ファイルの先頭にYAML形式で applyTo を指定します。

---
applyTo:
  - "**/*.ts"
  - "**/*.tsx"
---

# TypeScript コーディング規約

- strict mode を使用
- any 型の使用禁止
- ...

グロブパターンで指定するので、**/*.py(全ディレクトリのPythonファイル)や src/frontend/**/*(特定ディレクトリ配下すべて)といった柔軟な指定が可能です。複数パターンを指定した場合は、いずれかにマッチすれば適用されます。

複数ファイルはマージされる

ここが重要なポイントです。複数の Instructions がマッチした場合、競合ではなく結合されます。

編集対象: src/components/ui/Button.tsx

マッチする Instructions:
├── frontend-common.instructions.md   (applyTo: src/**/*.tsx)
├── frontend-ui.instructions.md       (applyTo: src/components/ui/**/*.tsx)
└── frontend-types.instructions.md    (applyTo: **/*.ts, **/*.tsx)

→ 3つすべてマージされて適用

「上書き」ではなく「結合」です。つまり、3つのファイルに書かれたルールがすべて有効になります。

矛盾を避ける設計が必須

マージされるなら、矛盾するルールを書いたらどうなるの?という疑問が浮かびます。

調べたところ「わかりません」、でした。公式ドキュメントにルールが記載されていませんでした。(もし見つけたら教えてください)

GitHubのコミュニティでも議論されていますが、現時点で優先順位のルールは公開されていません。

結論: 矛盾しない設計が唯一の解決策です。

具体的には:

  • 各 Instructions は独立した関心事を扱う(UIルール、APIルール、テストルールなど)
  • 重複するルールを書かない(同じことを複数ファイルに書かない)

「優先順位でなんとかする」という発想は捨てて、そもそも矛盾が起きない設計を心がけましょう。


分割パターン

では、実際にどう分割すればいいのか。2つのパターンを紹介します。

基本形: 言語別

最もシンプルで始めやすいパターンです。

.github/instructions/
├── python.instructions.md      # applyTo: **/*.py
├── typescript.instructions.md  # applyTo: **/*.ts, **/*.tsx
└── markdown.instructions.md    # applyTo: **/*.md

言語ごとに固有のルール(命名規則、型ヒントの書き方、フォーマットなど)を分離できます。複数言語を扱うプロジェクトでは、この基本形から始めるのがおすすめです。

筆者が採用しているパターン(ミックス系)

筆者は現在、モノレポ構成のプロジェクトで「ディレクトリ別 + 関心事別」のミックスパターンを検証しています。

設計のポイント:

  1. ディレクトリ単位で大まかな責務分担(frontend / tools など)
  2. 関心事別にさらに細かくルールを分割(UI / API / 状態管理など)
  3. 別ディレクトリではノイズとなる情報を分離

copilot-instructions.md(おおもと)

おおもとの copilot-instructions.mdルーター役に徹します。

# Project Overview

Monorepo with multiple applications.

| Path                  | Stack        |
|-----------------------|--------------|
| application/tools/    | Python 3.12+ |
| application/frontend/ | Next.js 15   |

## Path-scoped Instructions

アプリケーション固有のルールは `.github/instructions/` で定義。

モノレポ構成であることを伝え、詳細は分割ファイルに任せます。共通禁止事項(.env をコミットしないなど)もここに書きますが、それ以外は軽量に保ちます。

Instructions ファイル(application 単位 + 関心事別)

.github/instructions/
├── python-tools.instructions.md      # application/tools/**/*
├── frontend-common.instructions.md   # application/frontend/**/*
├── frontend-ui.instructions.md       # .../components/ui/**/*
├── frontend-api.instructions.md      # .../generated/**/*
├── frontend-store.instructions.md    # .../store/**/*
└── frontend-feature.instructions.md  # .../features/**/*

frontend-common.instructions.md にはフロントエンド全体のルール(技術スタック、コードスタイル、命名規則)を書き、frontend-ui.instructions.md には shadcn/ui 専用のルール(npx shadcn@latest add で追加、CVA でバリアント定義など)を書く、という具合です。

このパターンのメリット

メリット説明
おおもとが軽量肥大化問題を根本解決
独立したルールセットapplication ごとに分離
精度向上必要な指示だけが適用される
チーム分担しやすいFEチーム / Python チームで管理を分けられる

Python を触っているときに Next.js のルールがノイズになる、といった問題も解消します。


まとめ

*.instructions.md を活用した分割設計のポイントをまとめます。

ポイント内容
条件付き適用applyTo でマッチしたファイル編集時のみ自動適用
マージ動作複数マッチ時は結合される(矛盾に注意)
優先順位公式には未定義 → 矛盾しない設計が必須
分割の始め方言語別から始めて、必要に応じてミックスへ
おおもとの役割ルーターに徹し、軽量に保つ

まずは使ってみて、肥大化を感じたら分割を検討する。そのときに本記事を思い出していただければ幸いです。


参考リンク

公式ドキュメント

GitHub Issues / Discussions

関連記事


ここまで読んでいただき、ありがとうございました!

Instructions も設計対象です。肥大化を感じたら、ぜひ分割設計を試してみてください。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です