Browse Source

feat: Add support for .roorules configuration files (#2309)

* feat: Add support for .roorules configuration files

- Add .roorules to the list of supported rule files
- Improve mode-specific rule file handling to prioritize .roorules over .clinerules
- Update file loading logic to track which rule file was successfully loaded
- Add test cases for .roorules functionality

This change maintains backward compatibility with existing .clinerules while
introducing support for the new .roorules format as the preferred configuration
method.

* refactor: simplify rule file loading by removing unused rules

- Removed .cursorrules and .windsurfrules from the list of rule files in loadRuleFiles function.

* refactor: update loadRuleFiles to return single rule file content

- Modified loadRuleFiles function to return content from the first available rule file instead of combining multiple rule files.
- Updated tests to reflect the new behavior of loading only the .roorules file content when available, ensuring clarity in rule file handling.

* fix: update prompts for deprecated rule file references

- Updated prompts in the English locale to reflect the deprecation of .clinerules in favor of .roorules.
- Added notes in the prompts indicating that .clinerules will stop working soon, ensuring users are aware of the upcoming changes.

* Translations

* Update links

* Revert README changes

* Add missing spans around links

---------

Co-authored-by: Matt Rubens <[email protected]>
Yu SERIZAWA 11 months ago
parent
commit
d6d5670e38

+ 11 - 18
src/core/prompts/sections/__tests__/custom-instructions.test.ts

@@ -14,11 +14,7 @@ describe("loadRuleFiles", () => {
 		mockedFs.readFile.mockResolvedValue("  content with spaces  ")
 		const result = await loadRuleFiles("/fake/path")
 		expect(mockedFs.readFile).toHaveBeenCalled()
-		expect(result).toBe(
-			"\n# Rules from .clinerules:\ncontent with spaces\n" +
-				"\n# Rules from .cursorrules:\ncontent with spaces\n" +
-				"\n# Rules from .windsurfrules:\ncontent with spaces\n",
-		)
+		expect(result).toBe("\n# Rules from .roorules:\ncontent with spaces\n")
 	})
 
 	it("should handle ENOENT error", async () => {
@@ -49,22 +45,19 @@ describe("loadRuleFiles", () => {
 		jest.clearAllMocks()
 	})
 
-	it("should combine content from multiple rule files when they exist", async () => {
+	it("should not combine content from multiple rule files when they exist", async () => {
 		mockedFs.readFile.mockImplementation(((filePath: string | Buffer | URL | number) => {
+			if (filePath.toString().endsWith(".roorules")) {
+				return Promise.resolve("roo rules content")
+			}
 			if (filePath.toString().endsWith(".clinerules")) {
 				return Promise.resolve("cline rules content")
 			}
-			if (filePath.toString().endsWith(".cursorrules")) {
-				return Promise.resolve("cursor rules content")
-			}
 			return Promise.reject({ code: "ENOENT" })
 		}) as any)
 
 		const result = await loadRuleFiles("/fake/path")
-		expect(result).toBe(
-			"\n# Rules from .clinerules:\ncline rules content\n" +
-				"\n# Rules from .cursorrules:\ncursor rules content\n",
-		)
+		expect(result).toBe("\n# Rules from .roorules:\nroo rules content\n")
 	})
 
 	it("should handle when no rule files exist", async () => {
@@ -86,17 +79,17 @@ describe("loadRuleFiles", () => {
 
 	it("should skip directories with same name as rule files", async () => {
 		mockedFs.readFile.mockImplementation(((filePath: string | Buffer | URL | number) => {
-			if (filePath.toString().endsWith(".clinerules")) {
+			if (filePath.toString().endsWith(".roorules")) {
 				return Promise.reject({ code: "EISDIR" })
 			}
-			if (filePath.toString().endsWith(".cursorrules")) {
-				return Promise.resolve("cursor rules content")
+			if (filePath.toString().endsWith(".clinerules")) {
+				return Promise.reject({ code: "EISDIR" })
 			}
 			return Promise.reject({ code: "ENOENT" })
 		}) as any)
 
 		const result = await loadRuleFiles("/fake/path")
-		expect(result).toBe("\n# Rules from .cursorrules:\ncursor rules content\n")
+		expect(result).toBe("")
 	})
 })
 
@@ -121,7 +114,7 @@ describe("addCustomInstructions", () => {
 		expect(result).toContain("(es)") // Check for language code in parentheses
 		expect(result).toContain("Global Instructions:\nglobal instructions")
 		expect(result).toContain("Mode-specific Instructions:\nmode instructions")
-		expect(result).toContain("Rules from .clinerules-test-mode:\nmode specific rules")
+		expect(result).toContain("Rules from .roorules-test-mode:\nmode specific rules")
 	})
 
 	it("should return empty string when no instructions provided", async () => {

+ 16 - 8
src/core/prompts/sections/custom-instructions.ts

@@ -17,17 +17,16 @@ async function safeReadFile(filePath: string): Promise<string> {
 }
 
 export async function loadRuleFiles(cwd: string): Promise<string> {
-	const ruleFiles = [".clinerules", ".cursorrules", ".windsurfrules"]
-	let combinedRules = ""
+	const ruleFiles = [".roorules", ".clinerules"]
 
 	for (const file of ruleFiles) {
 		const content = await safeReadFile(path.join(cwd, file))
 		if (content) {
-			combinedRules += `\n# Rules from ${file}:\n${content}\n`
+			return `\n# Rules from ${file}:\n${content}\n`
 		}
 	}
 
-	return combinedRules
+	return ""
 }
 
 export async function addCustomInstructions(
@@ -41,9 +40,19 @@ export async function addCustomInstructions(
 
 	// Load mode-specific rules if mode is provided
 	let modeRuleContent = ""
+	let usedRuleFile = ""
 	if (mode) {
-		const modeRuleFile = `.clinerules-${mode}`
-		modeRuleContent = await safeReadFile(path.join(cwd, modeRuleFile))
+		const rooModeRuleFile = `.roorules-${mode}`
+		modeRuleContent = await safeReadFile(path.join(cwd, rooModeRuleFile))
+		if (modeRuleContent) {
+			usedRuleFile = rooModeRuleFile
+		} else {
+			const clineModeRuleFile = `.clinerules-${mode}`
+			modeRuleContent = await safeReadFile(path.join(cwd, clineModeRuleFile))
+			if (modeRuleContent) {
+				usedRuleFile = clineModeRuleFile
+			}
+		}
 	}
 
 	// Add language preference if provided
@@ -69,8 +78,7 @@ export async function addCustomInstructions(
 
 	// Add mode-specific rules first if they exist
 	if (modeRuleContent && modeRuleContent.trim()) {
-		const modeRuleFile = `.clinerules-${mode}`
-		rules.push(`# Rules from ${modeRuleFile}:\n${modeRuleContent}`)
+		rules.push(`# Rules from ${usedRuleFile}:\n${modeRuleContent}`)
 	}
 
 	if (options.rooIgnoreInstructions) {

+ 1 - 6
webview-ui/src/components/history/HistoryView.tsx

@@ -4,12 +4,7 @@ import { BatchDeleteTaskDialog } from "./BatchDeleteTaskDialog"
 import prettyBytes from "pretty-bytes"
 import { Virtuoso } from "react-virtuoso"
 
-import {
-	VSCodeTextField,
-	VSCodeRadioGroup,
-	VSCodeRadio,
-	VSCodeCheckbox,
-} from "@vscode/webview-ui-toolkit/react"
+import { VSCodeTextField, VSCodeRadioGroup, VSCodeRadio, VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react"
 
 import { vscode } from "@/utils/vscode"
 import { formatLargeNumber, formatDate } from "@/utils/format"

+ 6 - 6
webview-ui/src/components/prompts/PromptsView.tsx

@@ -618,10 +618,10 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
 								<div className="font-bold">{t("prompts:tools.title")}</div>
 								{findModeBySlug(mode, customModes) && (
 									<Button
-											variant="ghost"
-											size="icon"
-											onClick={() => setIsToolsEditMode(!isToolsEditMode)}
-											title={
+										variant="ghost"
+										size="icon"
+										onClick={() => setIsToolsEditMode(!isToolsEditMode)}
+										title={
 											isToolsEditMode
 												? t("prompts:tools.doneEditing")
 												: t("prompts:tools.editTools")
@@ -798,7 +798,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
 												// Open or create an empty file
 												vscode.postMessage({
 													type: "openFile",
-													text: `./.clinerules-${currentMode.slug}`,
+													text: `./.roorules-${currentMode.slug}`,
 													values: {
 														create: true,
 														content: "",
@@ -935,7 +935,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
 										onClick={() =>
 											vscode.postMessage({
 												type: "openFile",
-												text: "./.clinerules",
+												text: "./.roorules",
 												values: {
 													create: true,
 													content: "",

+ 5 - 7
webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx

@@ -246,18 +246,16 @@ describe("ApiConfigManager", () => {
 		// Click the select component to open the dropdown
 		const selectButton = screen.getByTestId("select-component")
 		fireEvent.click(selectButton)
-		
+
 		// Find all command items and click the one with "Another Config"
-		const commandItems = document.querySelectorAll('.command-item')
+		const commandItems = document.querySelectorAll(".command-item")
 		// Find the item with "Another Config" text
-		const anotherConfigItem = Array.from(commandItems).find(
-			item => item.textContent?.includes("Another Config")
-		)
-		
+		const anotherConfigItem = Array.from(commandItems).find((item) => item.textContent?.includes("Another Config"))
+
 		if (!anotherConfigItem) {
 			throw new Error("Could not find 'Another Config' option")
 		}
-		
+
 		fireEvent.click(anotherConfigItem)
 
 		expect(mockOnSelectConfig).toHaveBeenCalledWith("Another Config")

+ 2 - 2
webview-ui/src/i18n/locales/ca/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Instruccions personalitzades específiques del mode (opcional)",
 		"resetToDefault": "Restablir a valors predeterminats",
 		"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 <span>.clinerules-{{slug}}</span> al vostre espai de treball."
+		"loadFromFile": "Les instruccions personalitzades específiques per al mode {{mode}} també es poden carregar des de <span>.roorules-{{slug}}</span> al vostre espai de treball (.clinerules-{{slug}} està obsolet i deixarà de funcionar aviat)."
 	},
 	"globalCustomInstructions": {
 		"title": "Instruccions personalitzades per a tots els modes",
 		"description": "Aquestes instruccions s'apliquen a tots els modes. Proporcionen un conjunt bàsic de comportaments que es poden millorar amb instruccions específiques de cada mode a continuació.\nSi voleu que Roo pensi i parli en un idioma diferent al de la visualització del vostre editor ({{language}}), podeu especificar-ho aquí.",
-		"loadFromFile": "Les instruccions també es poden carregar des de <span>.clinerules</span> al vostre espai de treball."
+		"loadFromFile": "Les instruccions també es poden carregar des de <span>.roorules</span> al vostre espai de treball (.clinerules està obsolet i deixarà de funcionar aviat)."
 	},
 	"systemPrompt": {
 		"preview": "Previsualització del prompt del sistema",

+ 2 - 2
webview-ui/src/i18n/locales/de/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Modusspezifische benutzerdefinierte Anweisungen (optional)",
 		"resetToDefault": "Auf Standardwerte zurücksetzen",
 		"description": "Fügen Sie verhaltensspezifische Richtlinien für den Modus {{modeName}} hinzu.",
-		"loadFromFile": "Benutzerdefinierte Anweisungen für den Modus {{mode}} können auch aus <span>.clinerules-{{slug}}</span> in deinem Arbeitsbereich geladen werden."
+		"loadFromFile": "Benutzerdefinierte Anweisungen für den Modus {{mode}} können auch aus <span>.roorules-{{slug}}</span> in deinem Arbeitsbereich geladen werden (.clinerules-{{slug}} ist veraltet und wird bald nicht mehr funktionieren)."
 	},
 	"globalCustomInstructions": {
 		"title": "Benutzerdefinierte Anweisungen für alle Modi",
 		"description": "Diese Anweisungen gelten für alle Modi. Sie bieten einen grundlegenden Satz von Verhaltensweisen, die durch modusspezifische Anweisungen unten erweitert werden können.\nWenn du möchtest, dass Roo in einer anderen Sprache als deiner Editor-Anzeigesprache ({{language}}) denkt und spricht, kannst du das hier angeben.",
-		"loadFromFile": "Anweisungen können auch aus <span>.clinerules</span> in deinem Arbeitsbereich geladen werden."
+		"loadFromFile": "Anweisungen können auch aus <span>.roorules</span> in deinem Arbeitsbereich geladen werden (.clinerules ist veraltet und wird bald nicht mehr funktionieren)."
 	},
 	"systemPrompt": {
 		"preview": "System-Prompt Vorschau",

+ 2 - 2
webview-ui/src/i18n/locales/en/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Mode-specific Custom Instructions (optional)",
 		"resetToDefault": "Reset to default",
 		"description": "Add behavioral guidelines specific to {{modeName}} mode.",
-		"loadFromFile": "Custom instructions specific to {{mode}} mode can also be loaded from <span>.clinerules-{{slug}}</span> in your workspace."
+		"loadFromFile": "Custom instructions specific to {{mode}} mode can also be loaded from <span>.roorules-{{slug}}</span> in your workspace (.clinerules-{{slug}} is deprecated and will stop working soon)."
 	},
 	"globalCustomInstructions": {
 		"title": "Custom Instructions for All Modes",
 		"description": "These instructions apply to all modes. They provide a base set of behaviors that can be enhanced by mode-specific instructions below.\nIf you would like Roo to think and speak in a different language than your editor display language ({{language}}), you can specify it here.",
-		"loadFromFile": "Instructions can also be loaded from <span>.clinerules</span> in your workspace."
+		"loadFromFile": "Instructions can also be loaded from <span>.roorules</span> in your workspace (.clinerules is deprecated and will stop working soon)."
 	},
 	"systemPrompt": {
 		"preview": "Preview System Prompt",

+ 2 - 2
webview-ui/src/i18n/locales/es/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Instrucciones personalizadas para el modo (opcional)",
 		"resetToDefault": "Restablecer a valores predeterminados",
 		"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 <span>.clinerules-{{slug}}</span> en tu espacio de trabajo."
+		"loadFromFile": "Las instrucciones personalizadas para el modo {{mode}} también se pueden cargar desde <span>.roorules-{{slug}}</span> en tu espacio de trabajo (.clinerules-{{slug}} está obsoleto y dejará de funcionar pronto)."
 	},
 	"globalCustomInstructions": {
 		"title": "Instrucciones personalizadas para todos los modos",
 		"description": "Estas instrucciones se aplican a todos los modos. Proporcionan un conjunto base de comportamientos que pueden ser mejorados por instrucciones específicas de cada modo.\nSi quieres que Roo piense y hable en un idioma diferente al idioma de visualización de tu editor ({{language}}), puedes especificarlo aquí.",
-		"loadFromFile": "Las instrucciones también se pueden cargar desde <span>.clinerules</span> en tu espacio de trabajo."
+		"loadFromFile": "Las instrucciones también se pueden cargar desde <span>.roorules</span> en tu espacio de trabajo (.clinerules está obsoleto y dejará de funcionar pronto)."
 	},
 	"systemPrompt": {
 		"preview": "Vista previa de la solicitud del sistema",

+ 2 - 2
webview-ui/src/i18n/locales/fr/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Instructions personnalisées spécifiques au mode (optionnel)",
 		"resetToDefault": "Réinitialiser aux valeurs par défaut",
 		"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 <span>.clinerules-{{slug}}</span> dans votre espace de travail."
+		"loadFromFile": "Les instructions personnalisées spécifiques au mode {{mode}} peuvent également être chargées depuis <span>.roorules-{{slug}}</span> dans votre espace de travail (.clinerules-{{slug}} est obsolète et cessera de fonctionner bientôt)."
 	},
 	"globalCustomInstructions": {
 		"title": "Instructions personnalisées pour tous les modes",
 		"description": "Ces instructions s'appliquent à tous les modes. Elles fournissent un ensemble de comportements de base qui peuvent être améliorés par des instructions spécifiques au mode ci-dessous.\nSi vous souhaitez que Roo pense et parle dans une langue différente de celle de votre éditeur ({{language}}), vous pouvez le spécifier ici.",
-		"loadFromFile": "Les instructions peuvent également être chargées depuis <span>.clinerules</span> dans votre espace de travail."
+		"loadFromFile": "Les instructions peuvent également être chargées depuis <span>.roorules</span> dans votre espace de travail (.clinerules est obsolète et cessera de fonctionner bientôt)."
 	},
 	"systemPrompt": {
 		"preview": "Aperçu du prompt système",

+ 2 - 2
webview-ui/src/i18n/locales/hi/prompts.json

@@ -36,12 +36,12 @@
 		"title": "मोड-विशिष्ट कस्टम निर्देश (वैकल्पिक)",
 		"resetToDefault": "डिफ़ॉल्ट पर रीसेट करें",
 		"description": "{{modeName}} मोड के लिए विशिष्ट व्यवहार दिशानिर्देश जोड़ें।",
-		"loadFromFile": "{{mode}} मोड के लिए विशिष्ट कस्टम निर्देश आपके वर्कस्पेस में <span>.clinerules-{{slug}}</span> से भी लोड किए जा सकते हैं।"
+		"loadFromFile": "{{mode}} मोड के लिए विशिष्ट कस्टम निर्देश आपके वर्कस्पेस में <span>.roorules-{{slug}}</span> से भी लोड किए जा सकते हैं (.clinerules-{{slug}} पुराना हो गया है और जल्द ही काम करना बंद कर देगा)।"
 	},
 	"globalCustomInstructions": {
 		"title": "सभी मोड्स के लिए कस्टम निर्देश",
 		"description": "ये निर्देश सभी मोड्स पर लागू होते हैं। वे व्यवहारों का एक आधार सेट प्रदान करते हैं जिन्हें नीचे दिए गए मोड-विशिष्ट निर्देशों द्वारा बढ़ाया जा सकता है।\nयदि आप चाहते हैं कि Roo आपके एडिटर की प्रदर्शन भाषा ({{language}}) से अलग भाषा में सोचे और बोले, तो आप यहां इसे निर्दिष्ट कर सकते हैं।",
-		"loadFromFile": "निर्देश आपके वर्कस्पेस में <span>.clinerules</span> से भी लोड किए जा सकते हैं।"
+		"loadFromFile": "निर्देश आपके वर्कस्पेस में <span>.roorules</span> से भी लोड किए जा सकते हैं (.clinerules पुराना हो गया है और जल्द ही काम करना बंद कर देगा)।"
 	},
 	"systemPrompt": {
 		"preview": "सिस्टम प्रॉम्प्ट का पूर्वावलोकन",

+ 2 - 2
webview-ui/src/i18n/locales/it/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Istruzioni personalizzate specifiche per la modalità (opzionale)",
 		"resetToDefault": "Ripristina predefiniti",
 		"description": "Aggiungi linee guida comportamentali specifiche per la modalità {{modeName}}.",
-		"loadFromFile": "Le istruzioni personalizzate specifiche per la modalità {{mode}} possono essere caricate anche da <span>.clinerules-{{slug}}</span> nel tuo spazio di lavoro."
+		"loadFromFile": "Le istruzioni personalizzate specifiche per la modalità {{mode}} possono essere caricate anche da <span>.roorules-{{slug}}</span> nel tuo spazio di lavoro (.clinerules-{{slug}} è obsoleto e smetterà di funzionare presto)."
 	},
 	"globalCustomInstructions": {
 		"title": "Istruzioni personalizzate per tutte le modalità",
 		"description": "Queste istruzioni si applicano a tutte le modalità. Forniscono un insieme base di comportamenti che possono essere migliorati dalle istruzioni specifiche per modalità qui sotto.\nSe desideri che Roo pensi e parli in una lingua diversa dalla lingua di visualizzazione del tuo editor ({{language}}), puoi specificarlo qui.",
-		"loadFromFile": "Le istruzioni possono essere caricate anche da <span>.clinerules</span> nel tuo spazio di lavoro."
+		"loadFromFile": "Le istruzioni possono essere caricate anche da <span>.roorules</span> nel tuo spazio di lavoro (.clinerules è obsoleto e smetterà di funzionare presto)."
 	},
 	"systemPrompt": {
 		"preview": "Anteprima prompt di sistema",

+ 2 - 2
webview-ui/src/i18n/locales/ja/prompts.json

@@ -36,12 +36,12 @@
 		"title": "モード固有のカスタム指示(オプション)",
 		"resetToDefault": "デフォルトにリセット",
 		"description": "{{modeName}}モードに特化した行動ガイドラインを追加します。",
-		"loadFromFile": "{{mode}}モード固有のカスタム指示は、ワークスペースの<span>.clinerules-{{slug}}</span>からも読み込めます。"
+		"loadFromFile": "{{mode}}モード固有のカスタム指示は、ワークスペースの<span>.roorules-{{slug}}</span>からも読み込めます(.clinerules-{{slug}}は非推奨であり、まもなく機能しなくなります)。"
 	},
 	"globalCustomInstructions": {
 		"title": "すべてのモードのカスタム指示",
 		"description": "これらの指示はすべてのモードに適用されます。モード固有の指示で強化できる基本的な動作セットを提供します。\nRooにエディタの表示言語({{language}})とは異なる言語で考えたり話したりさせたい場合は、ここで指定できます。",
-		"loadFromFile": "指示はワークスペースの<span>.clinerules</span>からも読み込めます。"
+		"loadFromFile": "指示はワークスペースの<span>.roorules</span>からも読み込めます(.clinerules は非推奨であり、まもなく機能しなくなります)。"
 	},
 	"systemPrompt": {
 		"preview": "システムプロンプトのプレビュー",

+ 2 - 2
webview-ui/src/i18n/locales/ko/prompts.json

@@ -36,12 +36,12 @@
 		"title": "모드별 사용자 지정 지침 (선택 사항)",
 		"resetToDefault": "기본값으로 재설정",
 		"description": "{{modeName}} 모드에 대한 특정 행동 지침을 추가하세요.",
-		"loadFromFile": "{{mode}} 모드에 대한 사용자 지정 지침은 작업 공간의 <span>.clinerules-{{slug}}</span>에서도 로드할 수 있습니다."
+		"loadFromFile": "{{mode}} 모드에 대한 사용자 지정 지침은 작업 공간의 <span>.roorules-{{slug}}</span>에서도 로드할 수 있습니다(.clinerules-{{slug}}는 더 이상 사용되지 않으며 곧 작동을 중단합니다)."
 	},
 	"globalCustomInstructions": {
 		"title": "모든 모드에 대한 사용자 지정 지침",
 		"description": "이 지침은 모든 모드에 적용됩니다. 아래의 모드별 지침으로 향상될 수 있는 기본 동작 세트를 제공합니다.\nRoo가 에디터 표시 언어({{language}})와 다른 언어로 생각하고 말하기를 원하시면, 여기에 지정할 수 있습니다.",
-		"loadFromFile": "지침은 작업 공간의 <span>.clinerules</span>에서도 로드할 수 있습니다."
+		"loadFromFile": "지침은 작업 공간의 <span>.roorules</span>에서도 로드할 수 있습니다(.clinerules는 더 이상 사용되지 않으며 곧 작동을 중단합니다)."
 	},
 	"systemPrompt": {
 		"preview": "시스템 프롬프트 미리보기",

+ 2 - 2
webview-ui/src/i18n/locales/pl/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Niestandardowe instrukcje dla trybu (opcjonalne)",
 		"resetToDefault": "Przywróć domyślne",
 		"description": "Dodaj wytyczne dotyczące zachowania specyficzne dla trybu {{modeName}}.",
-		"loadFromFile": "Niestandardowe instrukcje dla trybu {{modeName}} mogą być również ładowane z .clinerules-{{modeSlug}} w Twoim obszarze roboczym."
+		"loadFromFile": "Niestandardowe instrukcje dla trybu {{modeName}} mogą być również ładowane z <span>.roorules-{{modeSlug}}</span> w Twoim obszarze roboczym (.clinerules-{{modeSlug}} jest przestarzały i wkrótce przestanie działać)."
 	},
 	"globalCustomInstructions": {
 		"title": "Niestandardowe instrukcje dla wszystkich trybów",
 		"description": "Te instrukcje dotyczą wszystkich trybów. Zapewniają podstawowy zestaw zachowań, które mogą być rozszerzone przez instrukcje specyficzne dla trybów poniżej.\nJeśli chcesz, aby Roo myślał i mówił w języku innym niż język wyświetlania Twojego edytora ({{language}}), możesz to określić tutaj.",
-		"loadFromFile": "Instrukcje mogą być również ładowane z .clinerules w Twoim obszarze roboczym."
+		"loadFromFile": "Instrukcje mogą być również ładowane z <span>.roorules</span> w Twoim obszarze roboczym (.clinerules jest przestarzały i wkrótce przestanie działać)."
 	},
 	"systemPrompt": {
 		"preview": "Podgląd podpowiedzi systemowej",

+ 2 - 2
webview-ui/src/i18n/locales/pt-BR/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Instruções personalizadas específicas do modo (opcional)",
 		"resetToDefault": "Restaurar para padrão",
 		"description": "Adicione diretrizes comportamentais específicas para o modo {{modeName}}.",
-		"loadFromFile": "Instruções personalizadas específicas para o modo {{modeName}} também podem ser carregadas de .clinerules-{{modeSlug}} no seu espaço de trabalho."
+		"loadFromFile": "Instruções personalizadas específicas para o modo {{modeName}} também podem ser carregadas de <span>.roorules-{{modeSlug}}</span> no seu espaço de trabalho (.clinerules-{{modeSlug}} está obsoleto e deixará de funcionar em breve)."
 	},
 	"globalCustomInstructions": {
 		"title": "Instruções personalizadas para todos os modos",
 		"description": "Estas instruções se aplicam a todos os modos. Elas fornecem um conjunto base de comportamentos que podem ser aprimorados por instruções específicas do modo abaixo.\nSe você desejar que o Roo pense e fale em um idioma diferente do idioma de exibição do seu editor ({{language}}), você pode especificá-lo aqui.",
-		"loadFromFile": "As instruções também podem ser carregadas de .clinerules no seu espaço de trabalho."
+		"loadFromFile": "As instruções também podem ser carregadas de <span>.roorules</span> no seu espaço de trabalho (.clinerules está obsoleto e deixará de funcionar em breve)."
 	},
 	"systemPrompt": {
 		"preview": "Visualizar prompt do sistema",

+ 2 - 2
webview-ui/src/i18n/locales/tr/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Moda özgü özel talimatlar (isteğe bağlı)",
 		"resetToDefault": "Varsayılana sıfırla",
 		"description": "{{modeName}} modu için özel davranış yönergeleri ekleyin.",
-		"loadFromFile": "{{mode}} moduna özgü özel talimatlar ayrıca çalışma alanınızdaki <span>.clinerules-{{slug}}</span> adresinden yüklenebilir."
+		"loadFromFile": "{{mode}} moduna özgü özel talimatlar ayrıca çalışma alanınızdaki <span>.roorules-{{slug}}</span> adresinden yüklenebilir (.clinerules-{{slug}} kullanımdan kaldırılmıştır ve yakında çalışmayı durduracaktır)."
 	},
 	"globalCustomInstructions": {
 		"title": "Tüm Modlar için Özel Talimatlar",
 		"description": "Bu talimatlar tüm modlara uygulanır. Aşağıdaki moda özgü talimatlarla geliştirilebilen temel davranış seti sağlarlar.\nRoo'nun editörünüzün görüntüleme dilinden ({{language}}) farklı bir dilde düşünmesini ve konuşmasını istiyorsanız, burada belirtebilirsiniz.",
-		"loadFromFile": "Talimatlar ayrıca çalışma alanınızdaki <span>.clinerules</span> adresinden de yüklenebilir."
+		"loadFromFile": "Talimatlar ayrıca çalışma alanınızdaki <span>.roorules</span> adresinden de yüklenebilir (.clinerules kullanımdan kaldırılmıştır ve yakında çalışmayı durduracaktır)."
 	},
 	"systemPrompt": {
 		"preview": "Sistem promptunu önizle",

+ 2 - 2
webview-ui/src/i18n/locales/vi/prompts.json

@@ -36,12 +36,12 @@
 		"title": "Hướng dẫn tùy chỉnh dành riêng cho chế độ (tùy chọn)",
 		"resetToDefault": "Đặt lại về mặc định",
 		"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 dành riêng cho chế độ {{modeName}} cũng có thể được tải từ .clinerules-{{modeSlug}} trong không gian làm việc của bạn."
+		"loadFromFile": "Hướng dẫn tùy chỉnh dành riêng cho chế độ {{modeName}} cũng có thể được tải từ <span>.roorules-{{modeSlug}}</span> trong không gian làm việc của bạn (.clinerules-{{modeSlug}} đã lỗi thời và sẽ sớm ngừng hoạt động)."
 	},
 	"globalCustomInstructions": {
 		"title": "Hướng dẫn tùy chỉnh cho tất cả các chế độ",
 		"description": "Những hướng dẫn này áp dụng cho tất cả các chế độ. Chúng cung cấp một bộ hành vi cơ bản có thể được nâng cao bởi hướng dẫn dành riêng cho chế độ bên dưới.\nNếu bạn muốn Roo suy nghĩ và nói bằng ngôn ngữ khác với ngôn ngữ hiển thị trình soạn thảo của bạn ({{language}}), bạn có thể chỉ định ở đây.",
-		"loadFromFile": "Hướng dẫn cũng có thể được tải từ .clinerules trong không gian làm việc của bạn."
+		"loadFromFile": "Hướng dẫn cũng có thể được tải từ <span>.roorules</span> trong không gian làm việc của bạn (.clinerules đã lỗi thời và sẽ sớm ngừng hoạt động)."
 	},
 	"systemPrompt": {
 		"preview": "Xem trước lời nhắc hệ thống",

+ 2 - 2
webview-ui/src/i18n/locales/zh-CN/prompts.json

@@ -36,12 +36,12 @@
 		"title": "模式专属规则(可选)",
 		"resetToDefault": "重置为默认值",
 		"description": "{{modeName}}模式的专属规则",
-		"loadFromFile": "支持从.clinerules文件读取配置"
+		"loadFromFile": "支持从<span>.roorules-{{slug}}</span>文件读取配置(.clinerules-{{slug}}已弃用并将很快停止工作)。"
 	},
 	"globalCustomInstructions": {
 		"title": "所有模式的自定义指令",
 		"description": "所有模式通用规则\n当前语言:{{language}}",
-		"loadFromFile": "支持从<span>.clinerules</span>文件读取全局配置"
+		"loadFromFile": "支持从<span>.roorules</span>文件读取全局配置(.clinerules已弃用并将很快停止工作)。"
 	},
 	"systemPrompt": {
 		"preview": "预览系统提示词",

+ 2 - 2
webview-ui/src/i18n/locales/zh-TW/prompts.json

@@ -36,12 +36,12 @@
 		"title": "模式專屬自訂指令(選用)",
 		"resetToDefault": "重設為預設值",
 		"description": "為 {{modeName}} 模式新增專屬的行為指南。",
-		"loadFromFile": "{{mode}} 模式的自訂指令也可以從工作區的 <span>.clinerules-{{slug}}</span> 載入。"
+		"loadFromFile": "{{mode}} 模式的自訂指令也可以從工作區的 <span>.roorules-{{slug}}</span> 載入(.clinerules-{{slug}} 已棄用並將很快停止運作)。"
 	},
 	"globalCustomInstructions": {
 		"title": "所有模式的自訂指令",
 		"description": "這些指令適用於所有模式。它們提供了一組基本行為,可以透過下方的模式專屬自訂指令來強化。\n如果您希望 Roo 使用與編輯器顯示語言 ({{language}}) 不同的語言來思考和對話,您可以在這裡指定。",
-		"loadFromFile": "指令也可以從工作區的 <span>.clinerules</span> 載入。"
+		"loadFromFile": "指令也可以從工作區的 <span>.roorules</span> 載入(.clinerules 已棄用並將很快停止運作)。"
 	},
 	"systemPrompt": {
 		"preview": "預覽系統提示詞",