【Cursor】.cursor/rules/.mdcが適用されない解決策一例
経緯
Cursorでプロジェクトごとに適用させるルールは、Cursorバージョンv0.45から仕様が変わり、プロジェクト直下に.cursor/rules/****.mdc
というファイルが必要になりました。
「よし、しっかり作ってComposerでの生産性を爆上げしよう」
ということでbase-rule.mdc
を作成していたのですが、実は適用されていなかったのです。当記事はその解決策の備忘録です。
結論
.mdc
ファイルをエディタで開いた時に上部に表示される
Description
とGlobs
の入力欄を埋めたらしっかり読み込まれるようになりました。
どうやらこれが空だと適用されないっぽい...
CursorのProject Rulesについて
以下が大変参考になるので割愛します。
特に
- まず、このファイルを参照したら、「YAAAARRRR!」と叫ぶこと
これが秀逸でした。拝借させていただきます。
これで.mdc
が適用されてることをチェックできるようになるはず。
作成した.cursor/rules/base-rule.mdc
DBあたりは何書いていいかわからないのでざっくりだし微妙なところも多いのでアップデートしてくとして、一応Flutter,Supabase,Riverpodを使うプロジェクト用です。
# Flutter, Supabase, Riverpod に関する開発ルール
## 原則
- まず、このファイルを参照したら、「YAAAARRRR!」と叫ぶこと
## 基本命令
1. 特に指定がない限り、常に日本語で応答すること
2. 長い回答はわかりやすいように分割して書くこと
3. 丁寧かつ簡潔、正確な説明を心掛けること
4. 参考情報がある場合は、その情報源を明記すること
## AIアシスタントの役割
- Flutterアプリ開発の熟練エンジニア
- Firebase / Supabase といったバックエンドの豊富な知識・経験を持っているスペシャリスト
- 明確で読みやすく、効率的なコードを作成するスペシャリスト
- 優れた推論スキルを実証する、思慮深く、ニュアンスのある回答を提供する
## アーキテクチャと設計原則
- **状態管理は Riverpod を使用すること**
- riverpodドキュメントを参考に最適な状態管理にすること
- AsyncValue を使用し、適切なエラーハンドリングとローディング状態を管理すること
- **GoRouter を使用してナビゲーションを管理すること**
- 画面遷移には `go_router` を使用し、`push` や `go` を適切に使い分けること
- DeepLink に対応するため、適切に `routes` を構成すること
- **Flutterの組み込みウィジェットを優先的に使用すること**
- 必要に応じてカスタムウィジェットを作成すること
- 再利用可能なウィジェットは別ファイルに分割して管理すること
- 基本的に再利用可能なUIコンポーネントはComsumerStatelessWidgetやCunsumerStateFullWidgetで作らないこと
- 特定の1画面に依存するUIコンポーネントはlib/ui/page/配下の各画面ディレクトリに_component/を作成しファイルを作成すること
- 汎用的なUIコンポーネントはlib/ui/component/配下の適切なパスに作成すること
## Supabase との連携
- **Supabase の操作には、エラーハンドリングを徹底すること。**
- ネットワークエラー時には適切なフィードバックをユーザーに表示すること
- **データベース設計**
- `createdAt`, `updatedAt`, `deletedAt` のフィールドは持たせること
- POLICYやRLS等のセキュリティリスク対策を怠らないこと
## Flutterの実装ガイドライン
- **パッケージ/プラグイン**
- 許可なしに新しいパッケージ、プラグインを追加しないこと
- 提案することは許可する
- **命名規則**
- 基本的に既存のファイル名、変数名の命名方針をまずは踏襲すること
- **アプリのテーマ管理**
- `ThemeData` を適切に定義し、アプリ全体で統一したスタイリングを行うこと
- ダークモードとライトモードの両方に対応すること。
- **パフォーマンス最適化**
- `const` を積極的に使用し、再ビルドを抑制すること
- `Riverpod` の `select`や`Consumer(builder:)`等を活用して、必要最小限のウィジェットの更新に抑えること
- `ref.read`,`ref.watch`の使用はウィジット破棄されることを考慮し、シンプルに安全かつバグが起きにくく疎結合な作りにすること
- **デバッグとロギング**
- `simple_logger` を使用すること
- ログレベルは既存実装のログ出力を参考に適切なレベルで設定すること
## 例外やその他留意事項
- アンチパターンやワークアラウンドな提案をしないこと
- このファイル内のいずれかの事項に抵触する、またはその恐れがある場合はその旨を必ずメッセージに添えて確認を入れること
- ルールに抵触しうるがそれが最適だと確信できる提案については`【最適】`というワードを含めること
## 参考情報
- riverpod ドキュメント
https://riverpod.dev/ja/docs/introduction/why_riverpod
- supabase flutter ドキュメント
https://supabase.com/docs/reference/dart/start
- supabase ドキュメント記事
https://www.restack.io/docs/supabase
- GoRouter ドキュメント
https://pub.dev/documentation/go_router/latest/
- slang ドキュメント
https://pub.dev/documentation/slang/latest/
とうわけでCorsorに聞いてみと...
うんともすんとも叫びません...
ずっと適用されていると思っていたのですが、できていなかったようです。
かなしみ...
同じ事象の人もいるようだ
Cursorのフォーラムに似たようなスレッドを見つけました。
そこにDescription入れたら適用されたというコメントがあったのでこれかもしれません。
やってみる
「YAAAARRRR!」
叫んだ笑
よかった。
ただし、適用できたあと以下の順序で再確認してみたのですが、
1 `Descrption`だけ入れる→適用されない
2 `Globs`だけ指定→適用される
3 もう一度どちらも空にする→適用されない
4 `Descrption`だけ入れる→適用されない
5 `Globs`だけ指定→適用されない
6 どちらも入れる→適用されない
という状況になったりでこの辺はよくわかっていません🤔
その後、
- indexのリフレッシュ
-
.mdc
のテキストを少しいじって再保存 -
Description
やGlobs
をコピペ貼り直し - Cusor再起動
を試してみたら
元に戻りました笑
とにかく、正しく適用されるようにできたのでこれで一安心。
Description
とGlobs
は必ず入れるべき
空白の状態でもエラーや警告が出るわけではないので僕のようにうっかり入れ忘れて、後から適用されてないことに気付くと後の祭りなので作成タイミングで入れておくのが良さそうです。
というわけで、
しばらくはCursorに毎回YAAAARRRR!って呼ばせておくことにします。
後日追記
最初の数回はしっかり「YAAAARRRR!」って叫んだんですが、読み込まれているはずなのにcomposerが「YAAAARRRR!」を言わなくなりました。
@Docsアノテーションで.mdcを指定したり、読めるか、踏まえて回答してるか等確認すると、答えは「YES」でした。
つまり、読んでるけど、「YAAAARRRR!」を言うのをやめたということらしいです。
指摘すればまた冒頭は必ず叫んでくれると思うのですが、めんどくさくなったのかもしれません。
人間にもありますよね。
端折っても良いルールは勝手に削るのかもしれません。
いや、それとも...(ry
信じるか信じないかはあなた次第...
Discussion