はじめに
結論は この段落 にあります。
Cursor便利ですね! ただCursorを使う上で、思い通りにならないことがあったり、思い通りにさせるためにCursorRulesを書いても言うことを聞かなかったり、ということがありました。
また複数のプロジェクトで流用を続けていたのですが、良い管理方法はないものか、ということで思案していました。
Rulesの書き方を色々と工夫していたのですが、手作業をメインで書いているとCursorRulesが長くなり、管理がしづらかったり、インストラクションとして効果が薄まったりしてしまいました。
Cursor自身にRulesを整理させたときの問題
理想としてはCursor自身にRulesファイルを書かせることで、ComposerでCursorとやりとりをしてRulesに追記させたりしました。
例えば下記のような命令で追加していました。
ここまでの経緯を元に今後同じようなことが起こらないように @frontend.mdc にルールを整理して追加してください。
ただこれで追記は確かににしてくれるのですが、Rulesファイルとしてはあまり良くない形が多かったです。
例えば上記のようにCursorである程度書かせていたときのRulesファイルの内容です。
あなたは、明確で読みやすいReact、RefineとTypeScriptコードを作成することに特化した専門のAIプログラミングアシスタントです。
常に最新の安定版のTypeScript、JavaScript、React、Vite, Node.js, Ant, Refineを使用し、最新の機能とベストプラクティスに精通しています。
AI駆動のチャット、コードスタイルと構造、命名規則、TypeScriptの使用、UIとスタイリング、パフォーマンス最適化において正確で事実に基づいた思慮深い回答を提供します。
以下のルールに従う必要があります:
- Reactファイルはvite-app-ant/srcディレクトリに定義します。
- React v18を使用してReactDOM.createRootでルートを作成し、StrictModeでラップしてレンダリングします。
- 画像表示には必ずnext/imageの`Image`コンポーネントを使用し、width、height、altプロパティを適切に設定します。
- 日付のformatは2000年11月11日のようにYYYY年MM月DD日としてください。
- 時間のformatは11時11分のようにHH時MM分としてください。
- src/providers/data-provider/custom-data-provider.ts にカスタムロジックを変更してください。
## refineドキュメント
### 認証されたページを作成するには
認証されたページを作成するには、次のように<Authenticated>でコンテンツをラップします:
```tsx
import { Authenticated } from "@refinedev/core";
<Authenticated>
<div>This page is only accessible to authenticated users.</div>
</Authenticated>
\```
### 認証状態の確認
認証状態を確認するには、`useIsAuthenticated`フックを使用します:
```tsx
const { data: isAuthenticated } = useIsAuthenticated();
\```
`isAuthenticated`は以下のような形式のオブジェクトを返します:
```ts
{
authenticated: boolean; // 認証状態
redirectTo: string; // 未認証時のリダイレクト先
logout: boolean; // ログアウト状態
}
\```
### リアルタイム通信を実装する場合は?
リアルタイムの更新を実装する場合は、Refineの`useSubscription`フックを使用してください:
```tsx
import { useSubscription } from "@refinedev/core";
useSubscription({
channel: "resources/[resource-name]",
types: ["created", "updated", "deleted"],
onLiveEvent: (event) => {
// イベントに応じたデータ更新処理
},
});
\```
### ルーティングの追加
src/App.tsx にはルーティングを追加する。追加されているリソースのうちルーティングが不足しているものがあれば追記しておく。
上記を見るとわかりますが、リスト形式で書いている箇所もあればコードの実例を書いている箇所もあり大変見づらい状況でした。チーム管理のGitだったことも加わりルールの背景や経緯がわからず、見たとしても「この命令は消してもいいのだろうか…」となってしまいました。
Cursor公式
Cursor公式からは、Cursor Rulesファイルは下記のようにするとよい、と書かれています。
- 簡潔に:ルールは500行以内を目安に短くまとめる
- 分割する:大きな概念は小さく分解し、再利用可能なルールにする
- 具体例を提示:必要なら実例や参照ファイルを示してわかりやすく
- 明確に書く:曖昧な表現を避け、社内向けの内部ドキュメントのように書く
- 再利用する:チャットで繰り返すプロンプトは既存ルールを流用する
原文
> Best practices > Good rules are focused, actionable, and scoped. > - Keep rules concise. Under 500 lines is a good target > - Split large concepts into multiple, composable rules > Provide concrete examples or referenced files when helpful > Avoid vague guidance. Write rules the way you would write a clear internal doc > - Reuse rules when you find yourself repeating prompts in chat
公式のRulesの書き方からすると先のRulesでは「簡潔」とはほど遠いことが改めて良くわかります。
Bmad's のルールAgentGenerator
CursorRulesのメンテナンスをしていたところ、下記のリポジトリを見つけました。
このリポジトリはAgentルール自体の生成(Agent、Ask以外にもプリセットを追加できるらしい)リポジトリのようです。
その中に下記のようなコンセプトが示されていました。
- ルールは適切な YAML 形式 (説明、globs、alwaysApply) のフロントマターを使用します。
- ルールは、明示的にルールの作成を要求するか、エージェントに修正動作を求めることで暗黙的に生成されます。
- ルールは、有効な例と無効な例の両方を含めることで強化され、LLMをより良くトレーニングします。
- 短く焦点を絞ったルール(目標:25行、最大:50行)
- 自動的に整理されたサブフォルダ分類構造内の 4 つのルール タイプ
- ルールは、.cursor/rules/sub-folder の下の適切な場所に生成されます。サブフォルダーであるかどうかに関係なく、カーソル ルールは .cursor/rules またはサブフォルダー内に存在し、拡張子は .mdc である必要があります。
この例を元にある程度CursorでCursorRulesを作成できるようにRuleファイルを整理しました。
CursorRulesをCursor自身に書かせるRule
---
description: Editing Cursor rules
globs:
alwaysApply: false
---
1. Cursor Rulesの書き方は https://docs.cursor.com/context/rules を参考にしてください
2. Cursor Rulesのmdcファイルは25行程度、最大でも50行以内に収まるようにしてください。
3. ファイルが肥大化(50行を超える)場合、内容の分類によって分割が可能な場合にはファイルを分割してください。
4. .cursor/rules にある mdc ファイル(ruleファイル)と、 .cursor/rules_background にある md ファイル(背景ファイル)はそれぞれ rulesファイル、背景ファイルと呼びます。 ファイル名のうち、拡張子を除いたもの部分を同じものとして対応を明確化します。
5. ruleファイルにはComposerに適応させたいルールのみを記載し、背景ファイルにはそのルールを策定するに至った経緯、背景、実例などを記載してください。
6. ruleファイルでは番号付きリストのみで行を構成してください。その上で対応する背景ファイルではruleファイルの命令を同じ番号のついた見出しにし対応させてください。
7. 背景ファイルの見出しは、対応するruleファイルの命令の見出しへのリンクとしてください。 mdc から mdファイルへのリンクは不要で、mdファイルからmdcファイルへのリンクとしてください。
8. ruleファイルと背景ファイルの編集後には、それぞれのファイルの命令と見出しは1対1で対応し、不整合や矛盾が無いか確認してください。
9. ruleファイルのフロントマターについても適切な項目を設定してください。可能な限りAuto Attachedで適応されるようにし、その場合にはblobを明記してください。
このファイルの要点は下記です。
- 「Ruleファイル」と「背景ファイル」(ルールを制定するに至った経緯や詳細な実例)の定義
- Ruleファイルと背景ファイルは番号付きリスト形式で記載し、1対1で対応させること
- Ruleファイルは最大50行として積極的に分割すること
Ruleファイルは可能な限りシンプルかつ明確な命令として書く必要がありますが、そうすると後からのメンテナンスに苦労することとなりました。背景ファイルを置くことでルールの修正を行う際にどういった背景だったのか、どういうことを想定しているのかがわかるようにし、Ruleファイルで混乱しないようにしました。
こうすることで人が追記・メンテナンスするときも、CursorなどAIが追記・メンテナンスするときでも、プロンプトで背景ファイルごと読ませることで確実に理解してもらえるようにしました。
実際にこのファイルの背景ファイルは下記です。
# Cursor Rulesの編集ルール背景
このドキュメントは[cursorrules.mdc](./../rules/cursorrules.mdc)のルールの背景を説明するものです。
## 1. Cursor Rulesの書き方
- [公式ドキュメント](https://docs.cursor.com/context/rules)に従うことで、AIアシスタントが一貫した方法でルールを解釈できます
- 標準的な形式を守ることで、チーム内での管理や更新が容易になります
## 2. ファイルサイズの制限
- 25行程度を目標とし、最大でも50行以内に収めることで:
- ルールの簡潔さと明確さを保持
- AIアシスタントの理解と適用が容易に
- メンテナンス性の向上
## 3. ファイルの分割基準
- 50行を超えるファイルは、内容の分類に基づいて分割することで:
- 各ルールセットの独立性を確保
- 特定の目的や文脈に応じた参照が容易に
- 更新や管理が効率的に
## 4. ファイルの命名規則
- .cursor/rules/のmdcファイル(ruleファイル)と.cursor/rules_background/のmdファイル(背景ファイル)の対応を明確化:
- 拡張子を除いた部分を同一にすることで関連付けが容易に
- ファイルの役割が明確に
- 管理や更新時の混乱を防止
## 5. ファイルの役割分担
- ruleファイル:AIアシスタントに適用させたいルールのみを記載
- 背景ファイル:ルールの策定経緯、背景、実例を記載
- この分離により:
- AIアシスタントへの指示が明確に
- 人間のための参考情報が整理されて提供可能に
## 6. ruleファイルの構成
- 番号付きリストのみでの構成により:
- ルールの順序性が明確に
- 参照や引用が容易に
- 背景ファイルとの対応が明確に
## 7. 背景ファイルのリンク構造
- 背景ファイルからruleファイルへのリンク設定により:
- 関連するルールへの素早いアクセスが可能に
- ドキュメント間の関係性が明確に
- メンテナンス時の整合性チェックが容易に
## 8. ファイル間の整合性
- 命令と見出しの1対1対応により:
- 内容の不整合を防止
- 更新時の漏れを防止
- ドキュメントの信頼性を確保
## 9. フロントマターの設定
- 適切な項目設定とAuto Attachedの活用により:
- ルールの自動適用が可能に
- 適用範囲が明確に
- blobパターンによる効率的なファイル管理が可能に
この背景ファイル自体もCursorに生成させているのでちょっと人としては足りなく感じるところもありますが、チームメンバーや後で自分が見返したときの理解の助けにはなるかと思います。
ただそれでも無視されてしまうことはありますが…、「背景ファイル」を定義しておくだけで今後モデルなどがよくなっていってより正確に生成されることに期待しています。
うまくいかないこと
これぐらいRuleファイルをメンテナンスしてはいますが、それでもうまくいかないことは多々あります。特にRuleファイルを無視してしまうことが多いです。
そのたびに
@git.mdc を参考に、機能ブランチを作成し、これまでの変更をコミットし、PRを作成してください。
のように、インストラクションを指定すると一応いうことを聞いてはくれます。
フロントマターと呼ばれる、どの内容のときのどのRuleを適応するか、という設定が重要で、blobs で指定された場合には良く適応されるようですが、description だけではうまく適応されないようです。
あとはCursorRulesフロントマター自体を編集させようとしてもうまくいかないようです。
さいごに
このRuleファイルを使ったプロジェクトのリポジトリは下記で公開しています。
フロントはReactベースのRefineフレームワークを使い、Vite、Antを指定しています。
バックエンドとインフラはSupabaseです。
それぞれ専用のRuleファイルを用意していて背景ファイルもあります。(まだ無いものもありますが…)
よかったらご参考ください。(なおスターを付けてもらえると励みになります!)
よいCursorライフをお送り下さい。