はじめに

GitHub Copilotを使っていて、「毎回同じようなプロンプトを入力するのが面倒」「チームで共通のプロンプトを使いたい」と感じたことはないでしょうか。VS CodeのGitHub Copilotには、繰り返し使うプロンプトをファイルとして保存し、必要なときにすぐ呼び出せる**プロンプトファイル(Prompt Files)**機能があります。

プロンプトファイルは、.prompt.mdという拡張子のMarkdownファイルで定義します。コンポーネントの雛形生成、コードレビュー、テスト作成など、定型的な開発タスクをワンコマンドで実行できるようになります。

本記事では、GitHub Copilotプロンプトファイルの概要から作成方法、実践的な活用例まで詳しく解説します。この記事を読むことで、以下のことができるようになります:

  • プロンプトファイルの仕組みと用途を理解する
  • .prompt.mdファイルを作成してチャットから呼び出す
  • 変数やツール参照を使った高度なプロンプトを設計する
  • Custom InstructionsやCustom Agentsとの適切な使い分けを把握する

前提条件

プロンプトファイル機能を使用するには、以下の環境が必要です:

項目 要件
VS Code バージョン1.100以降
GitHub Copilot拡張機能 最新版をインストール
GitHub Copilotサブスクリプション Copilot Individual、Business、Enterprise、または無料プラン

プロンプトファイルとは

プロンプトファイルは、GitHub Copilot Chatで繰り返し使用するプロンプトをMarkdownファイルとして定義する機能です。チャット入力欄で/に続けてプロンプト名を入力するだけで、事前に定義したプロンプトを実行できます。

プロンプトファイルが解決する課題

日常の開発作業では、以下のような繰り返しパターンが発生します:

  • 新しいReactコンポーネントを作成するたびに同じ構造を指示する
  • コードレビューで毎回同じ観点(セキュリティ、パフォーマンス等)をチェックする
  • APIエンドポイントの実装時に共通のエラーハンドリングパターンを適用する
  • テストコードを生成する際に毎回テストフレームワークの使い方を説明する

プロンプトファイルを使えば、これらのパターンを一度定義しておくだけで、以降は数文字入力するだけで同じ品質のプロンプトを再利用できます。

Custom Instructionsとの違い

GitHub Copilotには「Custom Instructions(カスタム指示)」という類似機能がありますが、プロンプトファイルとは目的が異なります:

機能 Custom Instructions プロンプトファイル
適用タイミング 自動(すべてのリクエストに適用) 手動(/コマンドで呼び出し)
主な用途 コーディング規約、スタイルガイド 特定タスクの実行
ファイル形式 .instructions.md .prompt.md
保存場所 .github/instructions/ .github/prompts/

Custom Instructionsは「常に適用されるルール」、プロンプトファイルは「オンデマンドで実行するタスク」と捉えるとわかりやすいでしょう。

プロンプトファイルの構造

プロンプトファイルは、YAMLフロントマター(ヘッダー)とMarkdown本文(ボディ)で構成されます。

ヘッダー(YAMLフロントマター)

ファイル先頭のYAMLフロントマターでは、プロンプトのメタ情報を定義します:

1
2
3
4
5
6
7
8
---
name: create-react-component
description: Reactコンポーネントの雛形を生成します
argument-hint: コンポーネント名を入力してください(例:UserProfile)
agent: agent
model: claude-sonnet-4
tools: ['editFiles', 'codebase']
---

各プロパティの意味は以下の通りです:

プロパティ 説明 必須
name プロンプト名(/の後に入力する名前) 任意(未指定時はファイル名)
description プロンプトの説明 任意
argument-hint チャット入力欄に表示されるヒント 任意
agent 使用するエージェント(ask/edit/agent/カスタムエージェント名) 任意
model 使用する言語モデル 任意
tools 利用可能なツールのリスト 任意

ボディ(プロンプト本文)

ヘッダーの後に、実際のプロンプト内容をMarkdownで記述します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
---
name: create-react-component
description: Reactコンポーネントの雛形を生成します
---

# Reactコンポーネント作成

以下の要件に従って、Reactコンポーネントを作成してください:

## 必須要件
- 関数コンポーネントとして実装する
- TypeScriptで型定義を行う
- Propsはinterfaceで定義する
- 名前付きエクスポートを使用する

## ファイル構成
- コンポーネント本体: `${input:componentName}.tsx`
- スタイル: `${input:componentName}.module.css`
- テスト: `${input:componentName}.test.tsx`

## 参照
- プロジェクトのコーディング規約: [coding-standards.md](../../docs/coding-standards.md)

プロンプトファイルの作成方法

方法1:VS Codeのコマンドから作成

  1. コマンドパレットを開く(Ctrl+Shift+P / Cmd+Shift+P
  2. 「Chat: New Prompt File」を選択
  3. 保存場所を選択:
    • Workspace: .github/prompts/に保存(そのワークスペースでのみ使用可能)
    • User profile: ユーザープロファイルに保存(すべてのワークスペースで使用可能)
  4. ファイル名を入力
  5. Markdown形式でプロンプトを記述

方法2:Chatビューから作成

  1. Chatビューを開く(Ctrl+Alt+I / Cmd+Alt+I
  2. 歯車アイコン(Configure Chat)をクリック
  3. 「Prompt Files」を選択
  4. 「New prompt file」をクリック
  5. 保存場所とファイル名を指定して作成

方法3:手動でファイルを作成

.github/prompts/ディレクトリに直接.prompt.mdファイルを作成することもできます:

1
2
3
4
5
6
7
8
9
# ディレクトリ構造
your-project/
├── .github/
│   └── prompts/
│       ├── create-component.prompt.md
│       ├── code-review.prompt.md
│       └── generate-tests.prompt.md
├── src/
└── package.json

プロンプトファイルの呼び出し方

作成したプロンプトファイルは、以下の方法で呼び出せます:

方法1:スラッシュコマンド

Copilot Chatの入力欄に/を入力すると、利用可能なプロンプトの一覧が表示されます:

/create-component UserProfile

プロンプト名の後に追加のテキストを入力すると、そのテキストがプロンプトのコンテキストとして渡されます。

方法2:コマンドパレット

  1. コマンドパレットを開く
  2. 「Chat: Run Prompt」を選択
  3. プロンプトファイルを選択

方法3:エディタからの実行

プロンプトファイルをエディタで開いた状態で、タイトルバーの再生ボタンをクリックすると、そのプロンプトを実行できます。プロンプトのテストや調整を行う際に便利です。

変数の活用

プロンプトファイルでは、${variableName}形式で変数を参照できます。これにより、動的なプロンプトを作成できます。

ワークスペース変数

変数 説明
${workspaceFolder} ワークスペースのルートパス
${workspaceFolderBasename} ワークスペースフォルダ名

ファイルコンテキスト変数

変数 説明
${file} 現在開いているファイルのパス
${fileBasename} ファイル名(拡張子付き)
${fileDirname} ファイルのディレクトリパス
${fileBasenameNoExtension} ファイル名(拡張子なし)

選択テキスト変数

変数 説明
${selection} エディタで選択中のテキスト
${selectedText} ${selection}と同じ

入力変数

ユーザーからの入力を受け取る変数も定義できます:

1
2
3
## コンポーネント情報
- コンポーネント名: ${input:componentName}
- 配置ディレクトリ: ${input:directory:src/components}

${input:variableName:defaultValue}形式で、デフォルト値を指定することも可能です。

ツール参照の活用

プロンプト本文内で#tool:<tool-name>構文を使用すると、特定のツールを参照できます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# セキュリティレビュー

以下のコードのセキュリティレビューを行ってください。

#tool:codebase を使用して、関連するファイルを検索し、
#tool:githubRepo で同様のパターンがないか確認してください。

## チェック項目
- SQLインジェクションの脆弱性
- XSS攻撃の可能性
- 認証・認可の問題

実践的なプロンプトファイルの例

例1:Reactコンポーネント生成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
---
name: react-component
description: TypeScript + CSS Modulesを使用したReactコンポーネントを生成
argument-hint: コンポーネント名(例:UserCard)
agent: agent
tools: ['editFiles']
---

# Reactコンポーネント生成

以下の仕様でReactコンポーネントを作成してください。

## コンポーネント名
${input:componentName}

## 要件
- TypeScriptで実装する
- 関数コンポーネントとして作成する
- CSS Modulesでスタイリングする
- Propsはinterfaceで定義し、`${input:componentName}Props`という名前にする
- 名前付きエクスポートを使用する
- JSDOCコメントを付与する

## 出力ファイル
1. `src/components/${input:componentName}/${input:componentName}.tsx`
2. `src/components/${input:componentName}/${input:componentName}.module.css`
3. `src/components/${input:componentName}/index.ts`(re-export用)

## コード例
```tsx
import styles from './${input:componentName}.module.css';

interface ${input:componentName}Props {
  // Propsを定義
}

/**
 * ${input:componentName}コンポーネント
 */
export const ${input:componentName}: React.FC<${input:componentName}Props> = (props) => {
  return (
    <div className={styles.container}>
      {/* 実装 */}
    </div>
  );
};
```

例2:コードレビュープロンプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
---
name: security-review
description: セキュリティ観点でのコードレビューを実施
agent: ask
---

# セキュリティコードレビュー

選択されたコードまたは現在のファイルについて、セキュリティ観点でレビューを行ってください。

## レビュー対象
${selection}

## チェック項目

### 入力検証
- ユーザー入力が適切にサニタイズされているか
- SQLインジェクションの脆弱性がないか
- パストラバーサルの危険性がないか

### 認証・認可
- 認証チェックが適切に行われているか
- 認可(権限)チェックが漏れていないか
- セッション管理が適切か

### データ保護
- 機密情報がログに出力されていないか
- 暗号化が必要なデータが平文で保存されていないか
- APIキーやシークレットがハードコードされていないか

### XSS対策
- ユーザー入力がエスケープなしで出力されていないか
- dangerouslySetInnerHTML等の使用が適切か

## 出力形式
- 問題の深刻度(Critical / High / Medium / Low)
- 該当箇所(行番号)
- 問題の説明
- 推奨される修正方法

例3:APIエンドポイント生成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
---
name: create-api-endpoint
description: RESTful APIエンドポイントを生成
argument-hint: リソース名(例:users, products)
agent: agent
tools: ['editFiles', 'codebase']
---

# APIエンドポイント生成

以下のリソースに対するRESTful APIエンドポイントを作成してください。

## リソース名
${input:resourceName}

## 生成するエンドポイント
- GET /${input:resourceName} - 一覧取得
- GET /${input:resourceName}/:id - 個別取得
- POST /${input:resourceName} - 新規作成
- PUT /${input:resourceName}/:id - 更新
- DELETE /${input:resourceName}/:id - 削除

## 要件
- Express.jsのルーターとして実装する
- TypeScriptで型安全に実装する
- バリデーションにはzodを使用する
- エラーハンドリングを適切に行う
- 既存のプロジェクト構造に合わせる

## 参照ファイル
既存のAPIルーターを参考にしてください:
- [既存のルーター例](src/routes/)

## 出力ファイル
1. `src/routes/${input:resourceName}.ts` - ルーター定義
2. `src/controllers/${input:resourceName}Controller.ts` - コントローラー
3. `src/schemas/${input:resourceName}Schema.ts` - zodスキーマ

例4:テストコード生成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
---
name: generate-tests
description: 現在のファイルに対するテストコードを生成
agent: agent
tools: ['editFiles', 'codebase']
---

# テストコード生成

現在開いているファイルに対するテストコードを生成してください。

## 対象ファイル
${file}

## テストフレームワーク
- Jest
- React Testing Library(Reactコンポーネントの場合)

## 要件
- describeブロックでテスト対象を明確にする
- 各テストケースは「should」で始まる説明を付ける
- 正常系と異常系の両方をテストする
- エッジケースを考慮する
- モックは必要最小限にする

## 出力ファイル
`${fileDirname}/${fileBasenameNoExtension}.test.ts`

## テスト構成の例
```typescript
import { functionName } from './${fileBasenameNoExtension}';

describe('functionName', () => {
  describe('正常系', () => {
    it('should return expected result when given valid input', () => {
      // テスト実装
    });
  });

  describe('異常系', () => {
    it('should throw error when given invalid input', () => {
      // テスト実装
    });
  });
});
```

プロンプトファイルの保存場所

プロンプトファイルは2種類のスコープで保存できます:

ワークスペースプロンプト

.github/prompts/ディレクトリに保存すると、そのワークスペース内でのみ使用可能です。チームで共有したいプロンプトはこちらに保存し、バージョン管理に含めることをおすすめします。

追加の保存場所を指定するには、settings.jsonchat.promptFilesLocationsを設定します:

1
2
3
4
5
6
{
  "chat.promptFilesLocations": {
    "prompts": true,
    "custom-prompts": true
  }
}

ユーザープロンプト

VS Codeのユーザープロファイルに保存すると、すべてのワークスペースで使用できます。個人用の汎用プロンプトはこちらに保存すると便利です。

複数デバイス間での同期

Settings Syncを有効にすることで、ユーザープロンプトを複数デバイス間で同期できます:

  1. Settings Syncを有効にする
  2. コマンドパレットで「Settings Sync: Configure」を実行
  3. 「Prompts and Instructions」を同期対象に追加

プロンプトファイル設計のベストプラクティス

明確な目的を定義する

各プロンプトファイルは単一の目的に集中させます。「何でもできる」汎用プロンプトよりも、特定タスクに特化したプロンプトの方が効果的です。

具体的な例を含める

抽象的な指示だけでなく、期待する出力の具体例を示すことで、AIの応答精度が向上します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
## 出力例
以下のような形式で出力してください:

```typescript
export interface UserProps {
  id: string;
  name: string;
  email: string;
}
```

Custom Instructionsを参照する

プロンプトファイル内でCustom Instructionsファイルを参照することで、指示の重複を避けられます:

1
2
3
4
## コーディング規約
以下のガイドラインに従ってください:
- [コーディング規約](../../.github/copilot-instructions.md)
- [TypeScript規約](../../.github/instructions/typescript.instructions.md)

適切なエージェントを選択する

タスクの性質に応じて、適切なエージェントをagentプロパティで指定します:

  • ask: 質問や説明が主な目的の場合
  • edit: 既存コードの編集が目的の場合
  • agent: ファイル作成・編集を含む複合タスクの場合

Custom Agentsとの連携

複雑なワークフローには、プロンプトファイルとCustom Agentsを組み合わせることが効果的です。Custom Agentsは特定の役割(フロントエンド開発、セキュリティレビュー等)に特化したエージェントを定義でき、プロンプトファイルから参照できます。

1
2
3
4
5
6
7
8
9
---
name: frontend-review
description: フロントエンドコードのレビュー
agent: frontend-expert
---

# フロントエンドコードレビュー

フロントエンド専門家として、以下のコードをレビューしてください。

Custom Agentsの詳細については、VS Code公式ドキュメントを参照してください。

注意点と制限事項

インライン補完には適用されない

プロンプトファイルの内容は、Copilot Chatからの呼び出し時にのみ適用されます。エディタ上でのインライン補完(ゴーストテキスト)には影響しません。

ツールの可用性

toolsプロパティで指定したツールが利用できない環境では、そのツールは無視されます。重要なツールに依存するプロンプトの場合は、代替手段も記述しておくことをおすすめします。

ファイルサイズ

プロンプトファイルが大きすぎると、コンテキストウィンドウを圧迫し、AIの応答品質に影響する可能性があります。1つのプロンプトファイルは簡潔に保ち、必要に応じて複数のファイルに分割してください。

まとめ

GitHub Copilotのプロンプトファイルは、繰り返し行う開発タスクを効率化するための機能です。本記事で解説した内容を実践することで、以下のメリットが得られます:

  • 定型的なプロンプト入力の手間を削減できる
  • チーム全体で一貫性のあるプロンプトを共有できる
  • 複雑なタスクをワンコマンドで実行できる
  • プロンプトをバージョン管理し、継続的に改善できる

まずは日常的に繰り返しているタスク(コンポーネント生成、テスト作成など)から始めて、徐々にプロンプトライブラリを充実させていくことをおすすめします。

参考リンク