- Home
- Documentation
- Estensioni
- Pipeline di corrispondenza del Rulebook
Pipeline di corrispondenza del Rulebook
Questo documento descrive come il coding-agent rileva le regole dai formati di configurazione supportati, le normalizza in un’unica struttura Rule, risolve i conflitti di precedenza e suddivide il risultato in:
- Regole del rulebook (disponibili per il modello tramite prompt di sistema + URL
rule://) - Regole TTSR (regole di interruzione del flusso time-travel)
Riflette l’implementazione corrente, incluse semantiche parziali e metadati analizzati ma non applicati.
File di implementazione
Sezione intitolata “File di implementazione”../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. Struttura canonica della regola
Sezione intitolata “1. Struttura canonica della regola”Tutti i provider normalizzano i file sorgente in Rule:
interface Rule { name: string; path: string; content: string; globs?: string[]; alwaysApply?: boolean; description?: string; ttsrTrigger?: string; _source: SourceMeta;}L’identità della capability è rule.name (ruleCapability.key = rule => rule.name).
Conseguenza: la precedenza e la deduplicazione si basano esclusivamente sul nome. Due file diversi con lo stesso name sono considerati la stessa regola logica.
2. Sorgenti di rilevamento e normalizzazione
Sezione intitolata “2. Sorgenti di rilevamento e normalizzazione”src/discovery/index.ts registra automaticamente i provider. Per rules, i provider correnti sono:
native(priorità100)cursor(priorità50)windsurf(priorità50)cline(priorità40)
Provider nativo (builtin.ts)
Sezione intitolata “Provider nativo (builtin.ts)”Carica le regole .xcsh da:
- progetto:
<cwd>/.xcsh/rules/*.{md,mdc} - utente:
~/.xcsh/agent/rules/*.{md,mdc}
Normalizzazione:
name= nome del file senza.md/.mdc- frontmatter analizzato tramite
parseFrontmatter content= corpo (frontmatter rimosso)globs,alwaysApply,description,ttsr_triggermappati direttamente
Nota importante: globs viene convertito come string[] | undefined senza filtraggio degli elementi in questo provider.
Provider Cursor (cursor.ts)
Sezione intitolata “Provider Cursor (cursor.ts)”Carica da:
- utente:
~/.cursor/rules/*.{mdc,md} - progetto:
<cwd>/.cursor/rules/*.{mdc,md}
Normalizzazione (transformMDCRule):
description: mantenuto solo se stringaalwaysApply: viene preservato solotrue(falsediventaundefined)globs: accetta array (solo elementi stringa) o singola stringattsr_trigger: solo stringanamedal nome del file senza estensione
Provider Windsurf (windsurf.ts)
Sezione intitolata “Provider Windsurf (windsurf.ts)”Carica da:
- utente:
~/.codeium/windsurf/memories/global_rules.md(nome regola fissoglobal_rules) - progetto:
<cwd>/.windsurf/rules/*.md
Normalizzazione:
globs: array di stringhe o singola stringaalwaysApply,descriptionconvertiti dal frontmatterttsr_trigger: solo stringanamedal nome del file per le regole di progetto
Provider Cline (cline.ts)
Sezione intitolata “Provider Cline (cline.ts)”Ricerca verso l’alto a partire da cwd per il .clinerules più vicino:
- se directory: carica i file
*.mdal suo interno - se file: carica il singolo file come regola denominata
clinerules
Normalizzazione:
globs: array di stringhe o singola stringaalwaysApply: solo se booleanodescription: solo stringattsr_trigger: solo stringa
3. Comportamento di analisi del frontmatter e ambiguità
Sezione intitolata “3. Comportamento di analisi del frontmatter e ambiguità”Tutti i provider utilizzano parseFrontmatter (utils/frontmatter.ts) con le seguenti semantiche:
- Il frontmatter viene analizzato solo quando il contenuto inizia con
---e ha una chiusura\n---. - Il corpo viene rimosso degli spazi dopo l’estrazione del frontmatter.
- Se l’analisi YAML fallisce:
- viene registrato un avviso,
- il parser ricorre all’analisi semplice per riga
key: value(^(\w+):\s*(.*)$).
Conseguenze dell’ambiguità:
- Il parser di fallback non supporta array, oggetti annidati, regole di quotatura o chiavi con trattino.
- I valori di fallback diventano stringhe (ad esempio
alwaysApply: truediventa la stringa"true"), pertanto i provider che richiedono tipi booleani/stringa potrebbero eliminare i metadati. ttsr_triggerfunziona nel fallback (chiave con underscore); chiavi comethinking-levelnon funzionerebbero.- I file senza frontmatter valido vengono comunque caricati come regole con metadati vuoti e corpo del contenuto completo.
4. Precedenza dei provider e deduplicazione
Sezione intitolata “4. Precedenza dei provider e deduplicazione”loadCapability("rules") (capability/index.ts) unisce gli output dei provider e poi deduplicata per rule.name.
Modello di precedenza
Sezione intitolata “Modello di precedenza”- I provider sono ordinati per priorità decrescente.
- A parità di priorità, viene mantenuto l’ordine di registrazione (
cursorprima diwindsurfdadiscovery/index.ts). - La deduplicazione segue il criterio “primo vince”: il primo nome di regola incontrato viene mantenuto; gli elementi successivi con lo stesso nome vengono contrassegnati come
_shadowedinalled esclusi daitems.
L’ordine effettivo dei provider di regole è attualmente:
native(100)cursor(50)windsurf(50)cline(40)
Avvertenza sull’ordinamento intra-provider
Sezione intitolata “Avvertenza sull’ordinamento intra-provider”All’interno di un provider, l’ordine degli elementi deriva dall’ordinamento dei risultati glob di loadFilesFromDir più l’ordine esplicito di inserimento. Questo è sufficientemente deterministico per l’uso normale, ma non è ordinato esplicitamente nel codice.
Differenze notevoli nell’ordine delle sorgenti:
nativeaggiunge prima la directory di configurazione del progetto, poi quella dell’utente.cursoraggiunge prima i risultati dell’utente, poi quelli del progetto.windsurfaggiunge primaglobal_rulesdell’utente, poi le regole del progetto.clinecarica solo la sorgente.clinerulespiù vicina.
5. Suddivisione nei bucket Rulebook, Always-Apply e TTSR
Sezione intitolata “5. Suddivisione nei bucket Rulebook, Always-Apply e TTSR”Dopo il rilevamento delle regole in createAgentSession (sdk.ts):
- Tutte le regole rilevate vengono analizzate.
- Le regole con
condition(chiave frontmatter;ttsr_trigger/ttsrTriggeraccettati come fallback) vengono registrate nelTtsrManager. - Una lista separata
rulebookRulesviene costruita con questo predicato:
!registeredTtsrRuleNames.has(rule.name) && !rule.alwaysApply && !!rule.description- Una lista
alwaysApplyRulesviene costruita:
!registeredTtsrRuleNames.has(rule.name) && rule.alwaysApply === trueComportamento dei bucket
Sezione intitolata “Comportamento dei bucket”- Bucket TTSR: qualsiasi regola con
condition(description non richiesta). Ha priorità sugli altri bucket. - Bucket always-apply:
alwaysApply === true, non TTSR. Il contenuto completo viene iniettato nel prompt di sistema. Accessibile tramiterule://. - Bucket rulebook: deve avere description, non deve essere TTSR, non deve essere
alwaysApply. Elencato nel prompt di sistema per nome + description; il contenuto viene letto su richiesta tramiterule://. - Una regola con sia
conditionchealwaysApplyva solo al TTSR (il TTSR ha la priorità). - Una regola con sia
alwaysApplychedescriptionva solo al bucket always-apply (non al rulebook).
6. Come i metadati influenzano le superfici di runtime
Sezione intitolata “6. Come i metadati influenzano le superfici di runtime”description
Sezione intitolata “description”- Obbligatoria per l’inclusione nel rulebook.
- Visualizzata nel blocco
<rules>del prompt di sistema. - L’assenza di description significa che la regola non è disponibile tramite
rule://e non è elencata nelle regole del prompt di sistema.
- Propagata attraverso
Rule. - Visualizzata come voci
<glob>...</glob>nel blocco delle regole del prompt di sistema. - Esposta nello stato UI delle regole (lista modalità
extensions). - Non applicata per la corrispondenza automatica in questa pipeline. Non esiste un matcher glob in fase di runtime che selezioni le regole in base al file corrente o al target dello strumento.
alwaysApply
Sezione intitolata “alwaysApply”- Analizzato e preservato dai provider.
- Utilizzato nella visualizzazione UI (etichetta trigger
"always"nel gestore dello stato extensions). - Utilizzato come condizione di esclusione da
rulebookRules. - Il contenuto completo della regola viene iniettato automaticamente nel prompt di sistema (prima della sezione delle regole del rulebook).
- La regola è anche indirizzabile tramite
rule://<name>per la rilettura.
ttsr_trigger
Sezione intitolata “ttsr_trigger”- Mappato a
rule.ttsrTrigger. - Se presente, la regola viene instradata al gestore TTSR, non al rulebook.
7. Percorso di inclusione nel prompt di sistema
Sezione intitolata “7. Percorso di inclusione nel prompt di sistema”buildSystemPromptInternal riceve sia rules (rulebook) che alwaysApplyRules.
Le regole always-apply vengono visualizzate per prime, iniettando il loro contenuto grezzo direttamente nel prompt.
Le regole del rulebook vengono visualizzate in una sezione # Rules con:
Read rule://<name> when working in matching domain- Per ogni regola:
name,descriptione lista<glob>opzionale
Questo è di natura consultiva/contestuale: il testo del prompt chiede al modello di leggere le regole applicabili, ma il codice non applica l’applicabilità dei glob.
8. Comportamento dell’URL interno rule://
Sezione intitolata “8. Comportamento dell’URL interno rule://”RuleProtocolHandler è registrato con:
new RuleProtocolHandler({ getRules: () => [...rulebookRules, ...alwaysApplyRules] })Implicazioni:
rule://<name>viene risolto rispetto a rulebookRules e alwaysApplyRules.- Le regole solo TTSR e le regole senza description e senza
alwaysApplynon sono indirizzabili tramiterule://. - La risoluzione avviene per corrispondenza esatta del nome.
- I nomi sconosciuti restituiscono un errore con l’elenco dei nomi di regole disponibili.
- Il contenuto restituito è il
rule.contentgrezzo (frontmatter rimosso), tipo di contenutotext/markdown.
9. Semantiche parziali / non applicate note
Sezione intitolata “9. Semantiche parziali / non applicate note”- Le descrizioni dei provider menzionano file legacy (
.cursorrules,.windsurfrules), ma i percorsi di caricamento del codice corrente non leggono effettivamente quei file. - I metadati
globsvengono esposti al prompt/UI ma non sono applicati dalla logica di selezione delle regole. - La selezione delle regole per
rule://include le regole del rulebook e quelle always-apply, ma non le regole solo TTSR. - Gli avvisi di rilevamento (
loadCapability("rules").warnings) vengono prodotti, macreateAgentSessionnon li espone/registra attualmente in questo percorso.