This commit is contained in:
Deleted user 2026-05-27 11:16:53 +08:00 committed by GitHub
commit 663917bc59
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 266 additions and 11 deletions

View file

@ -102,6 +102,7 @@ export const modeConfigSchema = z.object({
customInstructions: z.string().optional(),
groups: groupEntryArraySchema,
source: z.enum(["global", "project"]).optional(),
disableDefaultRules: z.boolean().optional(),
})
export type ModeConfig = z.infer<typeof modeConfigSchema>

View file

@ -290,4 +290,60 @@ describe("CustomModeSchema", () => {
expect(result.success).toBe(false)
})
})
describe("disableDefaultRules", () => {
test("accepts mode with disableDefaultRules set to true", () => {
const mode = {
slug: "focused-mode",
name: "Focused Mode",
roleDefinition: "A focused mode",
groups: ["read"] as const,
disableDefaultRules: true,
} satisfies ModeConfig
expect(() => validateCustomMode(mode)).not.toThrow()
const parsed = modeConfigSchema.parse(mode)
expect(parsed.disableDefaultRules).toBe(true)
})
test("accepts mode with disableDefaultRules set to false", () => {
const mode = {
slug: "normal-mode",
name: "Normal Mode",
roleDefinition: "A normal mode",
groups: ["read"] as const,
disableDefaultRules: false,
} satisfies ModeConfig
expect(() => validateCustomMode(mode)).not.toThrow()
const parsed = modeConfigSchema.parse(mode)
expect(parsed.disableDefaultRules).toBe(false)
})
test("accepts mode without disableDefaultRules (optional field)", () => {
const mode = {
slug: "default-mode",
name: "Default Mode",
roleDefinition: "A default mode",
groups: ["read"] as const,
} satisfies ModeConfig
expect(() => validateCustomMode(mode)).not.toThrow()
const parsed = modeConfigSchema.parse(mode)
expect(parsed.disableDefaultRules).toBeUndefined()
})
test("rejects non-boolean disableDefaultRules", () => {
const mode = {
slug: "bad-mode",
name: "Bad Mode",
roleDefinition: "A bad mode",
groups: ["read"],
disableDefaultRules: "yes" as any,
}
const result = modeConfigSchema.safeParse(mode)
expect(result.success).toBe(false)
})
})
})

View file

@ -1719,4 +1719,97 @@ describe("Rules directory reading", () => {
expect(result).toContain("Base rules from AGENTS.md only")
expect(result).not.toContain("AGENTS.local.md")
})
it("should skip generic rules and AGENTS.md when disableDefaultRules is true", async () => {
// Simulate .roo/rules-test-mode directory exists with mode-specific rules
statMock.mockResolvedValueOnce({
isDirectory: () => true,
} as any)
readdirMock.mockResolvedValueOnce([
{
name: "mode-rule.md",
isFile: () => true,
isSymbolicLink: () => false,
parentPath: "/fake/path/.roo/rules-test-mode",
},
] as any)
statMock.mockResolvedValueOnce({
isFile: () => true,
} as any)
readFileMock.mockImplementation((filePath: PathLike) => {
const pathStr = filePath.toString().replace(/\\/g, "/")
if (pathStr === "/fake/path/.roo/rules-test-mode/mode-rule.md") {
return Promise.resolve("mode specific rule content")
}
if (pathStr.endsWith("AGENTS.md")) {
return Promise.resolve("Agent rules that should be skipped")
}
if (pathStr.endsWith(".roorules")) {
return Promise.resolve("Generic rules that should be skipped")
}
return Promise.reject({ code: "ENOENT" })
})
const result = await addCustomInstructions(
"mode instructions",
"global instructions",
"/fake/path",
"test-mode",
{
disableDefaultRules: true,
settings: {
todoListEnabled: true,
useAgentRules: true,
newTaskRequireTodos: false,
},
},
)
// Should contain mode-specific rules
expect(result).toContain("mode specific rule content")
// Should NOT contain AGENTS.md or generic rules
expect(result).not.toContain("Agent rules that should be skipped")
expect(result).not.toContain("Generic rules that should be skipped")
expect(result).not.toContain("# Agent Rules Standard")
expect(result).not.toContain("# Rules from .roo directories")
expect(result).not.toContain("# Rules from .roorules")
// Should still contain custom instructions
expect(result).toContain("Mode-specific Instructions:\nmode instructions")
expect(result).toContain("Global Instructions:\nglobal instructions")
})
it("should load generic rules when disableDefaultRules is false", async () => {
// Simulate no .roo/rules-test-mode directory
statMock.mockRejectedValueOnce({ code: "ENOENT" })
// Simulate no .roo/rules directory
statMock.mockRejectedValueOnce({ code: "ENOENT" })
readFileMock.mockImplementation((filePath: PathLike) => {
const pathStr = filePath.toString()
if (pathStr.endsWith(".roorules")) {
return Promise.resolve("Generic rules content")
}
return Promise.reject({ code: "ENOENT" })
})
lstatMock.mockImplementation(() => {
return Promise.reject({ code: "ENOENT" })
})
const result = await addCustomInstructions("", "", "/fake/path", "test-mode", {
disableDefaultRules: false,
settings: {
todoListEnabled: true,
useAgentRules: false,
newTaskRequireTodos: false,
},
})
// Should contain generic rules when disableDefaultRules is false
expect(result).toContain("Generic rules content")
expect(result).toContain("# Rules from .roorules")
})
})

View file

@ -388,6 +388,7 @@ export async function addCustomInstructions(
language?: string
rooIgnoreInstructions?: string
settings?: SystemPromptSettings
disableDefaultRules?: boolean
} = {},
): Promise<string> {
const sections = []
@ -472,19 +473,23 @@ export async function addCustomInstructions(
rules.push(options.rooIgnoreInstructions)
}
// Add AGENTS.md content if enabled (default: true)
// Load from root and optionally subdirectories with .roo folders based on enableSubfolderRules setting
if (options.settings?.useAgentRules !== false) {
const agentRulesContent = await loadAllAgentRulesFiles(cwd, enableSubfolderRules)
if (agentRulesContent && agentRulesContent.trim()) {
rules.push(agentRulesContent.trim())
// When disableDefaultRules is true, skip AGENTS.md and generic rules —
// only mode-specific rules (loaded above) are included.
if (!options.disableDefaultRules) {
// Add AGENTS.md content if enabled (default: true)
// Load from root and optionally subdirectories with .roo folders based on enableSubfolderRules setting
if (options.settings?.useAgentRules !== false) {
const agentRulesContent = await loadAllAgentRulesFiles(cwd, enableSubfolderRules)
if (agentRulesContent && agentRulesContent.trim()) {
rules.push(agentRulesContent.trim())
}
}
}
// Add generic rules
const genericRuleContent = await loadRuleFiles(cwd, enableSubfolderRules)
if (genericRuleContent && genericRuleContent.trim()) {
rules.push(genericRuleContent.trim())
// Add generic rules
const genericRuleContent = await loadRuleFiles(cwd, enableSubfolderRules)
if (genericRuleContent && genericRuleContent.trim()) {
rules.push(genericRuleContent.trim())
}
}
if (rules.length > 0) {

View file

@ -104,6 +104,7 @@ ${await addCustomInstructions(baseInstructions, globalCustomInstructions || "",
language: language ?? formatLanguage(vscode.env.language),
rooIgnoreInstructions,
settings,
disableDefaultRules: modeConfig.disableDefaultRules,
})}`
return basePrompt

View file

@ -1275,6 +1275,33 @@ const ModesView = () => {
</div>
</div>
{/* Disable default rules toggle - only for custom modes */}
{findModeBySlug(visualMode, customModes) && (
<div className="mb-2">
<VSCodeCheckbox
checked={findModeBySlug(visualMode, customModes)?.disableDefaultRules ?? false}
onChange={(e: Event | React.FormEvent<HTMLElement>) => {
const target = e.target as HTMLInputElement
const customMode = findModeBySlug(visualMode, customModes)
if (customMode) {
updateCustomMode(visualMode, {
...customMode,
disableDefaultRules: target.checked,
source: customMode.source || "global",
})
}
}}
data-testid="disable-default-rules-checkbox">
<span className="font-medium">{t("prompts:disableDefaultRules.label")}</span>
</VSCodeCheckbox>
<div className="text-xs text-vscode-descriptionForeground mt-1 ml-6">
{t("prompts:disableDefaultRules.description", {
slug: getCurrentMode()?.slug || "mode",
})}
</div>
</div>
)}
<div className="pb-4 border-b border-vscode-input-border">
<div className="flex gap-2 mb-4">
<Button

View file

@ -51,6 +51,10 @@
"description": "Afegiu directrius de comportament específiques per al mode {{modeName}}.",
"loadFromFile": "Les instruccions personalitzades específiques per al mode {{mode}} també es poden carregar des de la carpeta <span>.roo/rules-{{slug}}/</span> al vostre espai de treball o des del global <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} i .clinerules-{{slug}} estan obsolets i deixaran de funcionar aviat)."
},
"disableDefaultRules": {
"label": "Desactivar regles per defecte",
"description": "Quan està activat, només es carreguen les regles específiques del mode (.roo/rules-{{slug}}/). Les regles per defecte (.roo/rules/, AGENTS.md, .roorules) s'ometen."
},
"exportMode": {
"title": "Exportar mode",
"description": "Exporta aquest mode a un fitxer YAML amb totes les regles incloses per compartir fàcilment amb altres.",

View file

@ -51,6 +51,10 @@
"description": "Fügen Sie verhaltensspezifische Richtlinien für den Modus {{modeName}} hinzu.",
"loadFromFile": "Benutzerdefinierte Anweisungen für den Modus {{mode}} können auch aus dem Ordner <span>.roo/rules-{{slug}}/</span> in deinem Arbeitsbereich oder aus dem globalen <0>.roo/rules-{{slug}}/</0> geladen werden (.roorules-{{slug}} und .clinerules-{{slug}} sind veraltet und werden bald nicht mehr funktionieren)."
},
"disableDefaultRules": {
"label": "Standardregeln deaktivieren",
"description": "Wenn aktiviert, werden nur modusspezifische Regeln (.roo/rules-{{slug}}/) geladen. Standardregeln (.roo/rules/, AGENTS.md, .roorules) werden übersprungen."
},
"exportMode": {
"title": "Modus exportieren",
"description": "Exportiert diesen Modus in eine YAML-Datei mit allen enthaltenen Regeln zum einfachen Teilen mit anderen.",

View file

@ -51,6 +51,10 @@
"description": "Add behavioral guidelines specific to {{modeName}} mode.",
"loadFromFile": "Custom instructions specific to {{mode}} mode can also be loaded from the <span>.roo/rules-{{slug}}/</span> folder in your workspace or from the global <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} and .clinerules-{{slug}} are deprecated and will stop working soon)."
},
"disableDefaultRules": {
"label": "Disable default rules",
"description": "When enabled, only mode-specific rules (.roo/rules-{{slug}}/) are loaded. Default rules (.roo/rules/, AGENTS.md, .roorules) are skipped."
},
"exportMode": {
"title": "Export Mode",
"description": "Export this mode with rules from the .roo/rules-{{slug}}/ folder combined into a shareable YAML file. The original files remain unchanged.",

View file

@ -51,6 +51,10 @@
"description": "Agrega directrices de comportamiento específicas para el modo {{modeName}}.",
"loadFromFile": "Las instrucciones personalizadas para el modo {{mode}} también se pueden cargar desde la carpeta <span>.roo/rules-{{slug}}/</span> en tu espacio de trabajo o desde el global <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} y .clinerules-{{slug}} están obsoletos y dejarán de funcionar pronto)."
},
"disableDefaultRules": {
"label": "Desactivar reglas predeterminadas",
"description": "Cuando está activado, solo se cargan las reglas específicas del modo (.roo/rules-{{slug}}/). Las reglas predeterminadas (.roo/rules/, AGENTS.md, .roorules) se omiten."
},
"exportMode": {
"title": "Exportar modo",
"description": "Exporta este modo a un archivo YAML con todas las reglas incluidas para compartir fácilmente con otros.",

View file

@ -51,6 +51,10 @@
"description": "Ajoutez des directives comportementales spécifiques au mode {{modeName}}.",
"loadFromFile": "Les instructions personnalisées spécifiques au mode {{mode}} peuvent également être chargées depuis le dossier <span>.roo/rules-{{slug}}/</span> dans votre espace de travail ou depuis le global <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} et .clinerules-{{slug}} sont obsolètes et cesseront de fonctionner bientôt)."
},
"disableDefaultRules": {
"label": "Désactiver les règles par défaut",
"description": "Lorsqu'activé, seules les règles spécifiques au mode (.roo/rules-{{slug}}/) sont chargées. Les règles par défaut (.roo/rules/, AGENTS.md, .roorules) sont ignorées."
},
"exportMode": {
"title": "Exporter le mode",
"description": "Exporte ce mode vers un fichier YAML avec toutes les règles incluses pour un partage facile avec d'autres.",

View file

@ -51,6 +51,10 @@
"description": "{{modeName}} मोड के लिए विशिष्ट व्यवहार दिशानिर्देश जोड़ें।",
"loadFromFile": "{{mode}} मोड के लिए विशिष्ट कस्टम निर्देश आपके कार्यक्षेत्र में <span>.roo/rules-{{slug}}/</span> फ़ोल्डर से या वैश्विक <0>.roo/rules-{{slug}}/</0> से भी लोड किए जा सकते हैं (.roorules-{{slug}} और .clinerules-{{slug}} पुराने हैं और जल्द ही काम करना बंद कर देंगे)।"
},
"disableDefaultRules": {
"label": "डिफ़ॉल्ट नियम अक्षम करें",
"description": "सक्षम होने पर, केवल मोड-विशिष्ट नियम (.roo/rules-{{slug}}/) लोड किए जाते हैं। डिफ़ॉल्ट नियम (.roo/rules/, AGENTS.md, .roorules) छोड़ दिए जाते हैं।"
},
"exportMode": {
"title": "मोड निर्यात करें",
"description": "इस मोड को सभी नियमों के साथ एक YAML फ़ाइल में निर्यात करें ताकि दूसरों के साथ आसानी से साझा किया जा सके।",

View file

@ -51,6 +51,10 @@
"description": "Tambahkan panduan perilaku khusus untuk mode {{modeName}}.",
"loadFromFile": "Instruksi khusus untuk mode {{mode}} juga dapat dimuat dari folder <span>.roo/rules-{{slug}}/</span> di ruang kerja Anda atau dari global <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} dan .clinerules-{{slug}} sudah usang dan akan segera berhenti berfungsi)."
},
"disableDefaultRules": {
"label": "Nonaktifkan aturan default",
"description": "Saat diaktifkan, hanya aturan khusus mode (.roo/rules-{{slug}}/) yang dimuat. Aturan default (.roo/rules/, AGENTS.md, .roorules) dilewati."
},
"exportMode": {
"title": "Ekspor Mode",
"description": "Ekspor mode ini ke file YAML dengan semua aturan yang disertakan untuk berbagi dengan mudah dengan orang lain.",

View file

@ -51,6 +51,10 @@
"description": "Aggiungi linee guida comportamentali specifiche per la modalità {{modeName}}.",
"loadFromFile": "Le istruzioni personalizzate specifiche per la modalità {{mode}} possono anche essere caricate dalla cartella <span>.roo/rules-{{slug}}/</span> nel tuo spazio di lavoro o dal globale <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} e .clinerules-{{slug}} sono deprecati e smetteranno di funzionare presto)."
},
"disableDefaultRules": {
"label": "Disabilita regole predefinite",
"description": "Quando abilitato, vengono caricate solo le regole specifiche della modalità (.roo/rules-{{slug}}/). Le regole predefinite (.roo/rules/, AGENTS.md, .roorules) vengono ignorate."
},
"exportMode": {
"title": "Esporta modalità",
"description": "Esporta questa modalità in un file YAML con tutte le regole incluse per una facile condivisione con altri.",

View file

@ -51,6 +51,10 @@
"description": "{{modeName}}モードに特化した行動ガイドラインを追加します。",
"loadFromFile": "{{mode}}モード固有のカスタム指示は、ワークスペースの<span>.roo/rules-{{slug}}/</span>フォルダまたはグローバル<0>.roo/rules-{{slug}}/</0>からも読み込むことができます(.roorules-{{slug}}と.clinerules-{{slug}}は非推奨で、まもなく動作しなくなります)。"
},
"disableDefaultRules": {
"label": "デフォルトルールを無効化",
"description": "有効にすると、モード固有のルール(.roo/rules-{{slug}}/)のみが読み込まれます。デフォルトルール(.roo/rules/、AGENTS.md、.roorulesはスキップされます。"
},
"exportMode": {
"title": "モードをエクスポート",
"description": "このモードをすべてのルールを含むYAMLファイルにエクスポートして、他のユーザーと簡単に共有できます。",

View file

@ -51,6 +51,10 @@
"description": "{{modeName}} 모드에 대한 특정 행동 지침을 추가하세요.",
"loadFromFile": "{{mode}} 모드에 특정한 사용자 지정 지침은 작업 공간의 <span>.roo/rules-{{slug}}/</span> 폴더 또는 전역 <0>.roo/rules-{{slug}}/</0>에서도 로드할 수 있습니다 (.roorules-{{slug}} 및 .clinerules-{{slug}}는 더 이상 사용되지 않으며 곧 작동을 중지합니다)."
},
"disableDefaultRules": {
"label": "기본 규칙 비활성화",
"description": "활성화하면 모드별 규칙(.roo/rules-{{slug}}/)만 로드됩니다. 기본 규칙(.roo/rules/, AGENTS.md, .roorules)은 건너뜁니다."
},
"exportMode": {
"title": "모드 내보내기",
"description": "이 모드를 모든 규칙이 포함된 YAML 파일로 내보내어 다른 사람들과 쉽게 공유할 수 있습니다.",

View file

@ -51,6 +51,10 @@
"description": "Voeg gedragsrichtlijnen toe die specifiek zijn voor de modus {{modeName}}.",
"loadFromFile": "Aangepaste instructies specifiek voor de {{mode}} modus kunnen ook worden geladen vanuit de map <span>.roo/rules-{{slug}}/</span> in je werkruimte of vanuit de globale <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} en .clinerules-{{slug}} zijn verouderd en zullen binnenkort niet meer werken)."
},
"disableDefaultRules": {
"label": "Standaardregels uitschakelen",
"description": "Wanneer ingeschakeld worden alleen modusspecifieke regels (.roo/rules-{{slug}}/) geladen. Standaardregels (.roo/rules/, AGENTS.md, .roorules) worden overgeslagen."
},
"exportMode": {
"title": "Modus exporteren",
"description": "Exporteer deze modus naar een YAML-bestand met alle regels inbegrepen voor eenvoudig delen met anderen.",

View file

@ -51,6 +51,10 @@
"description": "Dodaj wytyczne dotyczące zachowania specyficzne dla trybu {{modeName}}.",
"loadFromFile": "Niestandardowe instrukcje specyficzne dla trybu {{mode}} można również załadować z folderu <span>.roo/rules-{{slug}}/</span> w twoim obszarze roboczym lub z globalnego <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} i .clinerules-{{slug}} są przestarzałe i wkrótce przestaną działać)."
},
"disableDefaultRules": {
"label": "Wyłącz domyślne reguły",
"description": "Po włączeniu ładowane są tylko reguły specyficzne dla trybu (.roo/rules-{{slug}}/). Domyślne reguły (.roo/rules/, AGENTS.md, .roorules) są pomijane."
},
"exportMode": {
"title": "Eksportuj tryb",
"description": "Eksportuj ten tryb do pliku YAML ze wszystkimi regułami w celu łatwego udostępniania innym.",

View file

@ -51,6 +51,10 @@
"description": "Adicione diretrizes comportamentais específicas para o modo {{modeName}}.",
"loadFromFile": "Instruções personalizadas específicas para o modo {{mode}} também podem ser carregadas da pasta <span>.roo/rules-{{slug}}/</span> no seu espaço de trabalho ou do global <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} e .clinerules-{{slug}} estão obsoletos e deixarão de funcionar em breve)."
},
"disableDefaultRules": {
"label": "Desativar regras padrão",
"description": "Quando ativado, apenas as regras específicas do modo (.roo/rules-{{slug}}/) são carregadas. As regras padrão (.roo/rules/, AGENTS.md, .roorules) são ignoradas."
},
"exportMode": {
"title": "Exportar modo",
"description": "Exporte este modo para um arquivo YAML com todas as regras incluídas para compartilhar facilmente com outros.",

View file

@ -51,6 +51,10 @@
"description": "Добавьте рекомендации по поведению, специфичные для режима {{modeName}}.",
"loadFromFile": "Пользовательские инструкции для режима {{mode}} также можно загрузить из папки <span>.roo/rules-{{slug}}/</span> в вашем рабочем пространстве или из глобальной <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} и .clinerules-{{slug}} устарели и скоро перестанут работать)."
},
"disableDefaultRules": {
"label": "Отключить правила по умолчанию",
"description": "При включении загружаются только правила для конкретного режима (.roo/rules-{{slug}}/). Правила по умолчанию (.roo/rules/, AGENTS.md, .roorules) пропускаются."
},
"exportMode": {
"title": "Экспортировать режим",
"description": "Экспортировать этот режим в файл YAML со всеми включенными правилами для удобного обмена с другими.",

View file

@ -51,6 +51,10 @@
"description": "{{modeName}} modu için özel davranış yönergeleri ekleyin.",
"loadFromFile": "{{mode}} moduna özgü özel talimatlar, çalışma alanınızdaki <span>.roo/rules-{{slug}}/</span> klasöründen veya global <0>.roo/rules-{{slug}}/</0> klasöründen de yüklenebilir (.roorules-{{slug}} ve .clinerules-{{slug}} kullanımdan kaldırılmıştır ve yakında çalışmayı durduracaktır)."
},
"disableDefaultRules": {
"label": "Varsayılan kuralları devre dışı bırak",
"description": "Etkinleştirildiğinde yalnızca moda özel kurallar (.roo/rules-{{slug}}/) yüklenir. Varsayılan kurallar (.roo/rules/, AGENTS.md, .roorules) atlanır."
},
"exportMode": {
"title": "Modu Dışa Aktar",
"description": "Bu modu tüm kurallar dahil olarak bir YAML dosyasına dışa aktararak başkalarıyla kolayca paylaşın.",

View file

@ -51,6 +51,10 @@
"description": "Thêm hướng dẫn hành vi dành riêng cho chế độ {{modeName}}.",
"loadFromFile": "Hướng dẫn tùy chỉnh cụ thể cho chế độ {{mode}} cũng có thể được tải từ thư mục <span>.roo/rules-{{slug}}/</span> trong không gian làm việc của bạn hoặc từ toàn cục <0>.roo/rules-{{slug}}/</0> (.roorules-{{slug}} và .clinerules-{{slug}} đã lỗi thời và sẽ ngừng hoạt động sớm)."
},
"disableDefaultRules": {
"label": "Tắt quy tắc mặc định",
"description": "Khi bật, chỉ các quy tắc dành riêng cho chế độ (.roo/rules-{{slug}}/) được tải. Các quy tắc mặc định (.roo/rules/, AGENTS.md, .roorules) bị bỏ qua."
},
"exportMode": {
"title": "Xuất chế độ",
"description": "Xuất chế độ này sang tệp YAML với tất cả các quy tắc được bao gồm để dễ dàng chia sẻ với người khác.",

View file

@ -51,6 +51,10 @@
"description": "{{modeName}}模式的专属规则",
"loadFromFile": "{{mode}}模式的特定自定义指令也可以从工作区中的<span>.roo/rules-{{slug}}/</span>文件夹或全局<0>.roo/rules-{{slug}}/</0>加载(.roorules-{{slug}}和.clinerules-{{slug}}已弃用,即将停止工作)。"
},
"disableDefaultRules": {
"label": "禁用默认规则",
"description": "启用后,仅加载模式特定规则(.roo/rules-{{slug}}/)。默认规则(.roo/rules/、AGENTS.md、.roorules将被跳过。"
},
"exportMode": {
"title": "导出模式",
"description": "将此模式导出为包含所有规则的 YAML 文件,以便与他人轻松共享。",

View file

@ -51,6 +51,10 @@
"description": "為 {{modeName}} 模式新增專屬的行為指南。",
"loadFromFile": "{{mode}}模式的特定自訂指令也可以從工作區中的<span>.roo/rules-{{slug}}/</span>資料夾或全域<0>.roo/rules-{{slug}}/</0>載入(.roorules-{{slug}}和.clinerules-{{slug}}已棄用,即將停止運作)。"
},
"disableDefaultRules": {
"label": "停用預設規則",
"description": "啟用後,僅載入模式專屬規則(.roo/rules-{{slug}}/)。預設規則(.roo/rules/、AGENTS.md、.roorules將被略過。"
},
"exportMode": {
"title": "匯出模式",
"description": "將此模式與 .roo/rules-{{slug}}/ 資料夾中的規則匯出,並合併成一個可分享的 YAML 檔案。原始檔案將維持不變。",