- ホーム
- Documentation
- 拡張機能
- ルールブックマッチングパイプライン
ルールブックマッチングパイプライン
このドキュメントでは、coding-agent がサポートされている設定フォーマットからルールを検出し、単一の Rule 形式に正規化し、優先順位の競合を解決し、結果を以下に分割する方法について説明します:
- ルールブックルール(システムプロンプト +
rule://URL を介してモデルに利用可能) - TTSR ルール(タイムトラベルストリーム中断ルール)
これは現在の実装を反映しており、パースされるが強制されない部分的なセマンティクスやメタデータを含みます。
実装ファイル
Section titled “実装ファイル”../src/capability/rule.ts../src/capability/index.ts../src/discovery/index.ts../src/discovery/helpers.ts../src/discovery/builtin.ts../src/discovery/cursor.ts../src/discovery/windsurf.ts../src/discovery/cline.ts../src/sdk.ts../src/system-prompt.ts../src/internal-urls/rule-protocol.ts../src/utils/frontmatter.ts
1. 正規ルール形式
Section titled “1. 正規ルール形式”すべてのプロバイダーはソースファイルを Rule に正規化します:
interface Rule { name: string; path: string; content: string; globs?: string[]; alwaysApply?: boolean; description?: string; ttsrTrigger?: string; _source: SourceMeta;}ケイパビリティの識別子は rule.name です(ruleCapability.key = rule => rule.name)。
結果として、優先順位と重複排除は 名前ベースのみ で行われます。同じ name を持つ2つの異なるファイルは、同一の論理ルールとみなされます。
2. 検出ソースと正規化
Section titled “2. 検出ソースと正規化”src/discovery/index.ts はプロバイダーを自動登録します。rules の現在のプロバイダーは以下の通りです:
native(優先度100)cursor(優先度50)windsurf(優先度50)cline(優先度40)
Native プロバイダー(builtin.ts)
Section titled “Native プロバイダー(builtin.ts)”.xcsh ルールを以下から読み込みます:
- プロジェクト:
<cwd>/.xcsh/rules/*.{md,mdc} - ユーザー:
~/.xcsh/agent/rules/*.{md,mdc}
正規化:
name=.md/.mdcを除いたファイル名- フロントマターは
parseFrontmatterで解析 content= 本文(フロントマター除去後)globs、alwaysApply、description、ttsr_triggerは直接マッピング
重要な注意点: globs はこのプロバイダーでは要素のフィルタリングなしに string[] | undefined としてキャストされます。
Cursor プロバイダー(cursor.ts)
Section titled “Cursor プロバイダー(cursor.ts)”以下から読み込みます:
- ユーザー:
~/.cursor/rules/*.{mdc,md} - プロジェクト:
<cwd>/.cursor/rules/*.{mdc,md}
正規化(transformMDCRule):
description: 文字列の場合のみ保持alwaysApply:trueのみ保持(falseはundefinedになる)globs: 配列(文字列要素のみ)または単一文字列を受け付けるttsr_trigger: 文字列のみnameは拡張子を除いたファイル名
Windsurf プロバイダー(windsurf.ts)
Section titled “Windsurf プロバイダー(windsurf.ts)”以下から読み込みます:
- ユーザー:
~/.codeium/windsurf/memories/global_rules.md(固定ルール名global_rules) - プロジェクト:
<cwd>/.windsurf/rules/*.md
正規化:
globs: 文字列の配列または単一文字列alwaysApply、descriptionはフロントマターからキャストttsr_trigger: 文字列のみnameはプロジェクトルールの場合ファイル名から取得
Cline プロバイダー(cline.ts)
Section titled “Cline プロバイダー(cline.ts)”cwd から上方向に最も近い .clinerules を検索します:
- ディレクトリの場合: その中の
*.mdを読み込む - ファイルの場合:
clinerulesという名前のルールとして単一ファイルを読み込む
正規化:
globs: 文字列の配列または単一文字列alwaysApply: ブール値の場合のみdescription: 文字列のみttsr_trigger: 文字列のみ
3. フロントマター解析の動作と曖昧性
Section titled “3. フロントマター解析の動作と曖昧性”すべてのプロバイダーは以下のセマンティクスで parseFrontmatter(utils/frontmatter.ts)を使用します:
- フロントマターは、コンテンツが
---で始まり、閉じの\n---がある場合のみ解析されます。 - フロントマター抽出後、本文はトリミングされます。
- YAML 解析が失敗した場合:
- 警告がログに記録され、
- パーサーは単純な
key: value行解析(^(\w+):\s*(.*)$)にフォールバックします。
曖昧性の影響:
- フォールバックパーサーは、配列、ネストされたオブジェクト、クォーティングルール、ハイフン付きキーをサポートしません。
- フォールバック値は文字列になります(例えば
alwaysApply: trueは文字列"true"になる)ため、ブール値/文字列型を要求するプロバイダーではメタデータが失われる可能性があります。 ttsr_triggerはフォールバックで動作します(アンダースコアキー)。thinking-levelのようなキーは動作しません。- 有効なフロントマターのないファイルも、空のメタデータと完全なコンテンツ本文を持つルールとして読み込まれます。
4. プロバイダーの優先順位と重複排除
Section titled “4. プロバイダーの優先順位と重複排除”loadCapability("rules")(capability/index.ts)はプロバイダーの出力をマージし、rule.name で重複排除します。
優先順位モデル
Section titled “優先順位モデル”- プロバイダーは優先度の降順で順序付けられます。
- 同じ優先度の場合は登録順が維持されます(
discovery/index.tsからcursorがwindsurfより先)。 - 重複排除は先勝ち方式です:最初に見つかったルール名が保持され、後から同名のアイテムは
allで_shadowedとしてマークされ、itemsからは除外されます。
現在の実効的なルールプロバイダーの順序は以下の通りです:
native(100)cursor(50)windsurf(50)cline(40)
プロバイダー内の順序に関する注意点
Section titled “プロバイダー内の順序に関する注意点”プロバイダー内では、アイテムの順序は loadFilesFromDir の glob 結果の順序と明示的な push 順序に由来します。通常の使用では十分に決定論的ですが、コード上で明示的にソートされているわけではありません。
ソース順序の主な違い:
nativeはプロジェクトの後にユーザー設定ディレクトリを追加します。cursorはユーザーの後にプロジェクトの結果を追加します。windsurfはユーザーのglobal_rulesを最初に追加し、次にプロジェクトルールを追加します。clineは最も近い.clinerulesソースのみを読み込みます。
5. ルールブック、常時適用、TTSR バケットへの分割
Section titled “5. ルールブック、常時適用、TTSR バケットへの分割”createAgentSession(sdk.ts)でのルール検出後:
- 検出されたすべてのルールがスキャンされます。
condition(フロントマターキー、フォールバックとしてttsr_trigger/ttsrTriggerも受け付ける)を持つルールはTtsrManagerに登録されます。- 以下の述語で別途
rulebookRulesリストが構築されます:
!registeredTtsrRuleNames.has(rule.name) && !rule.alwaysApply && !!rule.descriptionalwaysApplyRulesリストが構築されます:
!registeredTtsrRuleNames.has(rule.name) && rule.alwaysApply === trueバケットの動作
Section titled “バケットの動作”- TTSR バケット:
conditionを持つ任意のルール(description は不要)。他のバケットより優先されます。 - 常時適用バケット:
alwaysApply === trueで、TTSR ではないもの。コンテンツ全体がシステムプロンプトに注入されます。rule://で解決可能です。 - ルールブックバケット: description が必須、TTSR でなく、
alwaysApplyでないもの。システムプロンプトに名前と説明で一覧表示され、コンテンツはrule://を介してオンデマンドで読み取られます。 conditionとalwaysApplyの両方を持つルールは TTSR のみに振り分けられます(TTSR が優先)。alwaysApplyとdescriptionの両方を持つルールは常時適用のみに振り分けられます(ルールブックには含まれません)。
6. メタデータがランタイムサーフェスに与える影響
Section titled “6. メタデータがランタイムサーフェスに与える影響”description
Section titled “description”- ルールブックへの包含に必須です。
- システムプロンプトの
<rules>ブロックにレンダリングされます。 - description がない場合、ルールは
rule://で利用できず、システムプロンプトのルール一覧にも表示されません。
Ruleに引き継がれます。- システムプロンプトのルールブロックに
<glob>...</glob>エントリとしてレンダリングされます。 - ルール UI 状態(
extensionsモードリスト)に公開されます。 - このパイプラインでは自動マッチングは強制されません。 現在のファイル/ツールターゲットによってルールを選択するランタイム glob マッチャーは存在しません。
alwaysApply
Section titled “alwaysApply”- プロバイダーによって解析・保持されます。
- UI 表示で使用されます(拡張機能状態マネージャーでの
"always"トリガーラベル)。 rulebookRulesからの除外条件として使用されます。- ルールのコンテンツ全体がシステムプロンプトに自動注入されます(ルールブックルールセクションの前に)。
- ルールは再読み取りのために
rule://<name>でもアドレス指定可能です。
ttsr_trigger
Section titled “ttsr_trigger”rule.ttsrTriggerにマッピングされます。- 存在する場合、ルールはルールブックではなく TTSR マネージャーにルーティングされます。
7. システムプロンプトへの組み込みパス
Section titled “7. システムプロンプトへの組み込みパス”buildSystemPromptInternal は rules(ルールブック)と alwaysApplyRules の両方を受け取ります。
常時適用ルールが最初にレンダリングされ、その生のコンテンツがプロンプトに直接注入されます。
ルールブックルールは # Rules セクションに以下の形式でレンダリングされます:
Read rule://<name> when working in matching domain- 各ルールの
name、description、およびオプションの<glob>リスト
これは助言的/コンテキスト的なものです:プロンプトテキストはモデルに適用可能なルールを読むよう求めますが、コードは glob の適用可能性を強制しません。
8. rule:// 内部 URL の動作
Section titled “8. rule:// 内部 URL の動作”RuleProtocolHandler は以下で登録されます:
new RuleProtocolHandler({ getRules: () => [...rulebookRules, ...alwaysApplyRules] })影響:
rule://<name>は rulebookRules と alwaysApplyRules の両方に対して解決されます。- TTSR のみのルール、および description も
alwaysApplyもないルールはrule://でアドレス指定できません。 - 解決は正確な名前一致です。
- 不明な名前の場合、利用可能なルール名のリストを含むエラーが返されます。
- 返されるコンテンツは生の
rule.content(フロントマター除去済み)で、コンテンツタイプはtext/markdownです。
9. 既知の部分的/未強制のセマンティクス
Section titled “9. 既知の部分的/未強制のセマンティクス”- プロバイダーの説明ではレガシーファイル(
.cursorrules、.windsurfrules)に言及していますが、現在のローダーコードパスでは実際にはそれらのファイルを読み取りません。 globsメタデータはプロンプト/UI に表示されますが、ルール選択ロジックでは強制されません。rule://のルール選択にはルールブックと常時適用ルールが含まれますが、TTSR のみのルールは含まれません。- 検出警告(
loadCapability("rules").warnings)は生成されますが、createAgentSessionは現在このパスでそれらを表示/ログ出力しません。