Cursor の Agent Skills は、手順が長い・段階がある・チームで共有したいワークフローをファイル化する仕組み。.cursor/skills/<name>/SKILL.md に置く。
この記事では、書き方のベストプラクティスと、C# / ASP.NET Core 想定の具体例をまとめる。例として AGENTS.md 記事と同じ架空プロダクト OrderNest(受注 API + バックグラウンド処理)を使う。
関連: Agent 設定フォルダ構成 / ローカル vs クラウドエージェント
AGENTS.md や .cursor/rules へSKILL.md の frontmatter に name と description(いつ使うか)を書くWhen to Use と Instructions を中心に、実行可能なステップで書くreferences/、実行物は scripts/ に逃がして本体を短く保つ~/.cursor/skills/ は使えない。リポジトリの .cursor/skills/ にコミットするAgent Skills は、エージェントに「このタスクではこう進めて」と教えるポータブルな手順パッケージ。Open 標準として SKILL.md + 任意の scripts/ / references/ / assets/ で構成される。
Cursor 起動時に .cursor/skills/(ほか .agents/skills/ 等)から自動検出され、Agent が文脈に応じて読み込む。チャットで /skill-name と打てば明示的に呼び出せる。
目安: 「何のリポジトリ?」→ AGENTS.md。「このファイル種別の書き方」→ rules。「障害調査の 1〜5 手順」→ Skills。
---
name: my-skill
description: 何をする Skill か。Agent が「いつ使うか」を判断する短文。
paths: # 任意。glob でファイルにスコープ
- "src/Infrastructure/**"
---
# My Skill
## When to Use
- ユーザーが ○○ と言ったとき
- マイグレーション追加・ロールバックを依頼されたとき
## Instructions
1. まず ○○ を確認
2. 次に △△ を実行
3. 完了前に □□ で検証
description に「何をするか」と「いつ使うか」を両方入れる(Agent の自動選択に効く)dotnet test ... など)references/ に分離し、必要時だけ読ませるdisable-model-invocation を付け忘れるname … フォルダ名と一致。小文字・ハイフンのみdescription … 必須。自動選択のキーpaths … 特定ディレクトリだけで効かせたいとき(例: Infrastructure 専用 Skill)disable-model-invocation: true … 明示的 /skill-name 呼び出し専用(旧 slash command 相当)以降の例で使う架空プロダクト(AGENTS.md 記事と同じ)。
OrderNest/
├── AGENTS.md
├── .cursor/
│ └── skills/
│ ├── ef-migration/
│ │ ├── SKILL.md
│ │ └── references/
│ │ └── rollback-checklist.md
│ ├── api-integration-test/
│ │ ├── SKILL.md
│ │ └── scripts/
│ │ └── run-api-tests.sh
│ └── cloud-verify/
│ └── SKILL.md
└── src/ ...
スキーマ変更依頼が来たとき、Agent が毎回迷わないようにする例。
---
name: ef-migration
description: OrderNest で EF Core マイグレーションを追加・更新・ロールバックするとき。スキーマ変更、Migration 追加、dotnet ef 操作の依頼で使う。
paths:
- "src/Infrastructure/**"
- "src/Domain/**"
---
# EF Core Migration (OrderNest)
## When to Use
- エンティティ変更に伴うマイグレーション追加
- マイグレーション失敗後の切り分け
- ロールバック方針の確認
## Instructions
1. **変更の意図を確認**
- 破壊的変更(列削除・型変更)かどうか
- 本番データ量・ダウンタイム許容
2. **エンティティと設定を先に直す**
- 変更は `src/Domain` と `src/Infrastructure/Persistence/Configurations`
- Domain に EF 依存を入れない
3. **マイグレーション生成**
- `dotnet ef migrations add <Name> --project src/Infrastructure --startup-project src/Api`
- 生成された Up/Down を目視。意図しない Drop がないか
4. **ローカル適用**
- `dotnet ef database update --project src/Infrastructure --startup-project src/Api`
- 失敗したらログを読み、接続先が開発 DB か確認
5. **テスト**
- `dotnet test tests/Application.Tests`
- 統合テスト利用可なら `dotnet test tests/Api.Tests`
6. **PR に書くこと**
- 変更理由、ロールバック手順(`dotnet ef database update <PreviousMigration>`)
- 本番適用時の注意(ロック・時間帯)
## References
- 詳細チェックリスト: `references/rollback-checklist.md`
## Do not
- 手動で Migration ファイルだけ編集して整合を崩す
- 接続文字列を Skill やログに書かない
Testcontainers を使う統合テストは手順が長いので Skill 向き。
---
name: api-integration-test
description: OrderNest の API 統合テストを追加・実行・デバッグするとき。Testcontainers、Api.Tests、HTTP エンドポイント検証の依頼で使う。
paths:
- "tests/Api.Tests/**"
- "src/Api/**"
---
# API Integration Test (OrderNest)
## When to Use
- 新規エンドポイントの統合テスト追加
- CI / ローカルで Api.Tests が落ちたとき
- Docker 前提のテスト環境の確認
## Instructions
1. **前提確認**
- Docker が起動していること
- `dotnet --version` が .NET 8 系
2. **既存パターンをコピー**
- `tests/Api.Tests/Orders/` 配下の Factory + WebApplicationFactory 構成を真似る
- 認証は既存の `TestAuthHandler` を使う
3. **テスト追加の型**
- Arrange: DB シードは `Infrastructure` のテスト用拡張を利用
- Act: `HttpClient` で実 HTTP
- Assert: ステータス + ProblemDetails + 必要なら DB 状態
4. **実行**
- 全体: `dotnet test tests/Api.Tests`
- 単体: `dotnet test tests/Api.Tests --filter "FullyQualifiedName~OrdersCreate"`
- または `scripts/run-api-tests.sh`
5. **失敗時**
- コンテナ起動ログ → ポート競合 → マイグレーション未適用の順で見る
- Application.Tests は通るが Api.Tests だけ落ちるなら Docker / 起動順を疑う
## Scripts
- `scripts/run-api-tests.sh` … ログ付きで Api.Tests を実行
## Do not
- 本番 DB 接続文字列でテストを書かない
- テスト内で `Thread.Sleep` で待たない(Eventually / リトライヘルパーを使う)
Cloud では VM ごとに環境が異なる。完了前に何を実行するかを Skill に固定する例。
---
name: cloud-verify
description: OrderNest を Cloud Agent で変更したあと、マージ前に実行する検証手順。Cloud、PR 完了前、environment.json があるリポジトリで使う。
disable-model-invocation: false
---
# Cloud Verify (OrderNest)
## When to Use
- Cloud Agent がコード変更を終えた直後
- ユーザーが「動くか確認して」と言ったとき
- `.cursor/environment.json` があるプロジェクト
## Instructions
1. **環境を読む**
- ルート `AGENTS.md` の `Cursor Cloud specific instructions`
- `.cursor/environment.json` の install / start / terminals
2. **依存関係**
- `dotnet restore OrderNest.sln`
- 失敗したら package 源・SDK バージョンを報告
3. **ビルド**
- `dotnet build OrderNest.sln -c Release --no-restore`
- 警告は既存分と新規分を分けて報告
4. **テスト(段階的)**
- 必須: `dotnet test tests/Application.Tests --no-build`
- Docker 利用可: `dotnet test tests/Api.Tests --no-build`
- Docker 不可: Application.Tests のみ実行し、Api.Tests スキップ理由を明記
5. **報告フォーマット**
- 実行したコマンド一覧
- 成功 / 失敗
- スキップした検証と理由
- 未実行の手動確認(あれば)
## Notes
- VPN / 社内専用リソースには触れない
- 秘密情報をログや PR コメントに出さない
- 長いリリース手順は別 Skill に分離し、ここは「マージ前の最低限」に留める
.cursor/skills/ または .agents/skills/(チーム共有・Cloud 向け)~/.cursor/skills/(ローカル専用。Cloud では基本不可)apps/web/.cursor/skills/ のようにサブツリーに置ける(その配下の作業時だけ効く)paths frontmatter … 同じ Skill フォルダを glob でファイル種別に限定.cursor/skills/ … そのディレクトリ配下の作業時だけ自動スコープscripts/ … Agent が実行するシェル・スクリプト(自己完結・エラーメッセージ付き)references/ … 長いチェックリスト・Runbook(必要時だけ読み込み)assets/ … テンプレ JSON など静的ファイル/migrate-to-skills で変換可能)逆に、常に効かせたい 1〜2 行の規約は rules のまま。Skills にすると自動選択が外れることがある。
description が曖昧で Agent が Skill を選ばない → 「いつ使うか」を具体語でSKILL.md)name / description、本文の When to Use と Instructions.cursor/skills/ にコミットまずは「毎回同じ口癖で Agent に頼んでいる手順」を 1 つ Skill にするのがおすすめ。OrderNest なら ef-migration か cloud-verify からで十分。