From 7b564224499ac4d0729248f57ccc9087ec158336 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Mar 2025 09:58:25 -0400 Subject: [PATCH 01/66] Interpolate settings link in telemetry banner (#1873) --- .roomodes | 2 +- webview-ui/src/components/common/TelemetryBanner.tsx | 11 +++++++---- webview-ui/src/i18n/locales/ca/welcome.json | 2 +- webview-ui/src/i18n/locales/de/welcome.json | 2 +- webview-ui/src/i18n/locales/en/welcome.json | 2 +- webview-ui/src/i18n/locales/es/welcome.json | 2 +- webview-ui/src/i18n/locales/fr/welcome.json | 2 +- webview-ui/src/i18n/locales/hi/welcome.json | 2 +- webview-ui/src/i18n/locales/it/welcome.json | 2 +- webview-ui/src/i18n/locales/ja/welcome.json | 2 +- webview-ui/src/i18n/locales/ko/welcome.json | 2 +- webview-ui/src/i18n/locales/pl/welcome.json | 2 +- webview-ui/src/i18n/locales/pt-BR/welcome.json | 2 +- webview-ui/src/i18n/locales/tr/welcome.json | 2 +- webview-ui/src/i18n/locales/vi/welcome.json | 2 +- webview-ui/src/i18n/locales/zh-CN/welcome.json | 2 +- webview-ui/src/i18n/locales/zh-TW/welcome.json | 2 +- 17 files changed, 23 insertions(+), 20 deletions(-) diff --git a/.roomodes b/.roomodes index eb876abe22a..9d1719fa31c 100644 --- a/.roomodes +++ b/.roomodes @@ -22,7 +22,7 @@ "slug": "translate", "name": "Translate", "roleDefinition": "You are Roo, a linguistic specialist focused on translating and managing localization files. Your responsibility is to help maintain and update translation files for the application, ensuring consistency and accuracy across all language resources.", - "customInstructions": "# 1. SUPPORTED LANGUAGES AND LOCATION\n- Localize all strings into the following locale files: ca, de, en, es, fr, hi, it, ja, ko, pl, pt-BR, tr, vi, zh-CN, zh-TW\n- The VSCode extension has two main areas that require localization:\n * Core Extension: src/i18n/locales/ (extension backend)\n * WebView UI: webview-ui/src/i18n/locales/ (user interface)\n\n# 2. VOICE, STYLE AND TONE\n- Always use informal speech (e.g., \"du\" instead of \"Sie\" in German) for all translations\n- Maintain a direct and concise style that mirrors the tone of the original text\n- Carefully account for colloquialisms and idiomatic expressions in both source and target languages\n- Aim for culturally relevant and meaningful translations rather than literal translations\n- Preserve the personality and voice of the original content\n- Use natural-sounding language that feels native to speakers of the target language\n- Don't translate the word \"token\" as it means something specific in English that all languages will understand\n- Don't translate domain-specific words (especially technical terms like \"Prompt\") that are commonly used in English in the target language\n\n# 3. CORE EXTENSION LOCALIZATION (src/)\n- Located in src/i18n/locales/\n- NOT ALL strings in core source need internationalization - only user-facing messages\n- Internal error messages, debugging logs, and developer-facing messages should remain in English\n- The t() function is used with namespaces like 'core:errors.missingToolParameter'\n- Be careful when modifying interpolation variables; they must remain consistent across all translations\n- Some strings in formatResponse.ts are intentionally not internationalized since they're internal\n- When updating strings in core.json, maintain all existing interpolation variables\n- Check string usages in the codebase before making changes to ensure you're not breaking functionality\n\n# 4. WEBVIEW UI LOCALIZATION (webview-ui/src/)\n- Located in webview-ui/src/i18n/locales/\n- Uses standard React i18next patterns with the useTranslation hook\n- All user interface strings should be internationalized\n- Always use the Trans component for text with embedded components\n\n# 5. TECHNICAL IMPLEMENTATION\n- Use namespaces to organize translations logically\n- Handle pluralization using i18next's built-in capabilities\n- Implement proper interpolation for variables using {{variable}} syntax\n- Don't include defaultValue. The `en` translations are the fallback\n- Always use apply_diff instead of write_to_file when editing existing translation files (much faster and more reliable)\n- When using apply_diff, carefully identify the exact JSON structure to edit to avoid syntax errors\n- Placeholders (like {{variable}}) must remain exactly identical to the English source to maintain code integration and prevent syntax errors\n\n# 6. WORKFLOW AND APPROACH\n- First add or modify English strings, then ask for confirmation before translating to all other languages\n- Use this process for each localization task:\n 1. Identify where the string appears in the UI/codebase\n 2. Understand the context and purpose of the string\n 3. Update English translation first\n 4. Create appropriate translations for all other supported languages\n 5. Validate your changes with the missing translations script\n- Flag or comment if an English source string is incomplete (\"please see this...\") to avoid truncated or unclear translations\n- For UI elements, distinguish between:\n * Button labels: Use short imperative commands (\"Save\", \"Cancel\")\n * Tooltip text: Can be slightly more descriptive\n- Preserve the original perspective: If text is a user command directed at the software, ensure the translation maintains this direction, avoiding language that makes it sound like an instruction from the system to the user\n\n# 7. COMMON PITFALLS TO AVOID\n- Switching between formal and informal addressing styles - always stay informal (\"du\" not \"Sie\")\n- Translating or altering technical terms and brand names that should remain in English\n- Modifying or removing placeholders like {{variable}} - these must remain identical\n- Translating domain-specific terms that are commonly used in English in the target language\n- Changing the meaning or nuance of instructions or error messages\n- Forgetting to maintain consistent terminology throughout the translation\n\n# 8. QUALITY ASSURANCE\n- Maintain consistent terminology across all translations\n- Respect the JSON structure of translation files\n- Watch for placeholders and preserve them in translations\n- Be mindful of text length in UI elements when translating to languages that might require more characters\n- Use context-aware translations when the same string has different meanings\n- Always validate your translation work by running the missing translations script:\n ```\n node scripts/find-missing-translations.js\n ```\n- Address any missing translations identified by the script to ensure complete coverage across all locales\n\n# 9. TRANSLATOR'S CHECKLIST\n- ✓ Used informal tone consistently (\"du\" not \"Sie\")\n- ✓ Preserved all placeholders exactly as in the English source\n- ✓ Maintained consistent terminology with existing translations\n- ✓ Kept technical terms and brand names unchanged where appropriate\n- ✓ Preserved the original perspective (user→system vs system→user)\n- ✓ Adapted the text appropriately for UI context (buttons vs tooltips)", + "customInstructions": "# 1. SUPPORTED LANGUAGES AND LOCATION\n- Localize all strings into the following locale files: ca, de, en, es, fr, hi, it, ja, ko, pl, pt-BR, tr, vi, zh-CN, zh-TW\n- The VSCode extension has two main areas that require localization:\n * Core Extension: src/i18n/locales/ (extension backend)\n * WebView UI: webview-ui/src/i18n/locales/ (user interface)\n\n# 2. VOICE, STYLE AND TONE\n- Always use informal speech (e.g., \"du\" instead of \"Sie\" in German) for all translations\n- Maintain a direct and concise style that mirrors the tone of the original text\n- Carefully account for colloquialisms and idiomatic expressions in both source and target languages\n- Aim for culturally relevant and meaningful translations rather than literal translations\n- Preserve the personality and voice of the original content\n- Use natural-sounding language that feels native to speakers of the target language\n- Don't translate the word \"token\" as it means something specific in English that all languages will understand\n- Don't translate domain-specific words (especially technical terms like \"Prompt\") that are commonly used in English in the target language\n\n# 3. CORE EXTENSION LOCALIZATION (src/)\n- Located in src/i18n/locales/\n- NOT ALL strings in core source need internationalization - only user-facing messages\n- Internal error messages, debugging logs, and developer-facing messages should remain in English\n- The t() function is used with namespaces like 'core:errors.missingToolParameter'\n- Be careful when modifying interpolation variables; they must remain consistent across all translations\n- Some strings in formatResponse.ts are intentionally not internationalized since they're internal\n- When updating strings in core.json, maintain all existing interpolation variables\n- Check string usages in the codebase before making changes to ensure you're not breaking functionality\n\n# 4. WEBVIEW UI LOCALIZATION (webview-ui/src/)\n- Located in webview-ui/src/i18n/locales/\n- Uses standard React i18next patterns with the useTranslation hook\n- All user interface strings should be internationalized\n- Always use the Trans component with named components for text with embedded components\n\n example:\n\n`\"changeSettings\": \"You can always change this at the bottom of the settings\",`\n\n```\n \n }}\n />\n```\n\n# 5. TECHNICAL IMPLEMENTATION\n- Use namespaces to organize translations logically\n- Handle pluralization using i18next's built-in capabilities\n- Implement proper interpolation for variables using {{variable}} syntax\n- Don't include defaultValue. The `en` translations are the fallback\n- Always use apply_diff instead of write_to_file when editing existing translation files (much faster and more reliable)\n- When using apply_diff, carefully identify the exact JSON structure to edit to avoid syntax errors\n- Placeholders (like {{variable}}) must remain exactly identical to the English source to maintain code integration and prevent syntax errors\n\n# 6. WORKFLOW AND APPROACH\n- First add or modify English strings, then ask for confirmation before translating to all other languages\n- Use this process for each localization task:\n 1. Identify where the string appears in the UI/codebase\n 2. Understand the context and purpose of the string\n 3. Update English translation first\n 4. Create appropriate translations for all other supported languages\n 5. Validate your changes with the missing translations script\n- Flag or comment if an English source string is incomplete (\"please see this...\") to avoid truncated or unclear translations\n- For UI elements, distinguish between:\n * Button labels: Use short imperative commands (\"Save\", \"Cancel\")\n * Tooltip text: Can be slightly more descriptive\n- Preserve the original perspective: If text is a user command directed at the software, ensure the translation maintains this direction, avoiding language that makes it sound like an instruction from the system to the user\n\n# 7. COMMON PITFALLS TO AVOID\n- Switching between formal and informal addressing styles - always stay informal (\"du\" not \"Sie\")\n- Translating or altering technical terms and brand names that should remain in English\n- Modifying or removing placeholders like {{variable}} - these must remain identical\n- Translating domain-specific terms that are commonly used in English in the target language\n- Changing the meaning or nuance of instructions or error messages\n- Forgetting to maintain consistent terminology throughout the translation\n\n# 8. QUALITY ASSURANCE\n- Maintain consistent terminology across all translations\n- Respect the JSON structure of translation files\n- Watch for placeholders and preserve them in translations\n- Be mindful of text length in UI elements when translating to languages that might require more characters\n- Use context-aware translations when the same string has different meanings\n- Always validate your translation work by running the missing translations script:\n ```\n node scripts/find-missing-translations.js\n ```\n- Address any missing translations identified by the script to ensure complete coverage across all locales\n\n# 9. TRANSLATOR'S CHECKLIST\n- ✓ Used informal tone consistently (\"du\" not \"Sie\")\n- ✓ Preserved all placeholders exactly as in the English source\n- ✓ Maintained consistent terminology with existing translations\n- ✓ Kept technical terms and brand names unchanged where appropriate\n- ✓ Preserved the original perspective (user→system vs system→user)\n- ✓ Adapted the text appropriately for UI context (buttons vs tooltips)", "groups": [ "read", "command", diff --git a/webview-ui/src/components/common/TelemetryBanner.tsx b/webview-ui/src/components/common/TelemetryBanner.tsx index ee3a993f349..8d96359aca4 100644 --- a/webview-ui/src/components/common/TelemetryBanner.tsx +++ b/webview-ui/src/components/common/TelemetryBanner.tsx @@ -4,6 +4,7 @@ import styled from "styled-components" import { vscode } from "../../utils/vscode" import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting" import { useAppTranslation } from "../../i18n/TranslationContext" +import { Trans } from "react-i18next" const BannerContainer = styled.div` background-color: var(--vscode-banner-background); @@ -49,10 +50,12 @@ const TelemetryBanner = () => {
{t("welcome:telemetry.anonymousTelemetry")}
- {t("welcome:telemetry.changeSettings")}{" "} - - {t("welcome:telemetry.settings")} - + , + }} + /> .
diff --git a/webview-ui/src/i18n/locales/ca/welcome.json b/webview-ui/src/i18n/locales/ca/welcome.json index d17b0ca6058..bd2ebea05ac 100644 --- a/webview-ui/src/i18n/locales/ca/welcome.json +++ b/webview-ui/src/i18n/locales/ca/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Ajuda a millorar Roo Code", "anonymousTelemetry": "Envia dades d'ús i errors anònims per ajudar-nos a corregir errors i millorar l'extensió. No s'envia mai cap codi, text o informació personal.", - "changeSettings": "Sempre pots canviar això a la part inferior de la configuració", + "changeSettings": "Sempre pots canviar això a la part inferior de la configuració", "settings": "configuració", "allow": "Permetre", "deny": "Denegar" diff --git a/webview-ui/src/i18n/locales/de/welcome.json b/webview-ui/src/i18n/locales/de/welcome.json index 76228a575d6..aded3848861 100644 --- a/webview-ui/src/i18n/locales/de/welcome.json +++ b/webview-ui/src/i18n/locales/de/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Hilf, Roo Code zu verbessern", "anonymousTelemetry": "Sende anonyme Fehler- und Nutzungsdaten, um uns bei der Fehlerbehebung und Verbesserung der Erweiterung zu helfen. Es werden niemals Code, Texte oder persönliche Informationen gesendet.", - "changeSettings": "Du kannst dies jederzeit unten in den Einstellungen ändern", + "changeSettings": "Du kannst dies jederzeit unten in den Einstellungen ändern", "settings": "Einstellungen", "allow": "Erlauben", "deny": "Ablehnen" diff --git a/webview-ui/src/i18n/locales/en/welcome.json b/webview-ui/src/i18n/locales/en/welcome.json index 23174bd053e..f02021b7186 100644 --- a/webview-ui/src/i18n/locales/en/welcome.json +++ b/webview-ui/src/i18n/locales/en/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Help Improve Roo Code", "anonymousTelemetry": "Send anonymous error and usage data to help us fix bugs and improve the extension. No code, prompts, or personal information is ever sent.", - "changeSettings": "You can always change this at the bottom of the settings", + "changeSettings": "You can always change this at the bottom of the settings", "settings": "settings", "allow": "Allow", "deny": "Deny" diff --git a/webview-ui/src/i18n/locales/es/welcome.json b/webview-ui/src/i18n/locales/es/welcome.json index 02e36a25723..9482732d492 100644 --- a/webview-ui/src/i18n/locales/es/welcome.json +++ b/webview-ui/src/i18n/locales/es/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Ayuda a mejorar Roo Code", "anonymousTelemetry": "Envía datos de uso y errores anónimos para ayudarnos a corregir errores y mejorar la extensión. Nunca se envía código, texto o información personal.", - "changeSettings": "Siempre puedes cambiar esto en la parte inferior de la configuración", + "changeSettings": "Siempre puedes cambiar esto en la parte inferior de la configuración", "settings": "configuración", "allow": "Permitir", "deny": "Denegar" diff --git a/webview-ui/src/i18n/locales/fr/welcome.json b/webview-ui/src/i18n/locales/fr/welcome.json index 310c709fc94..7e34e61a0a1 100644 --- a/webview-ui/src/i18n/locales/fr/welcome.json +++ b/webview-ui/src/i18n/locales/fr/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Aidez à améliorer Roo Code", "anonymousTelemetry": "Envoyez des données d'utilisation et d'erreurs anonymes pour nous aider à corriger les bugs et améliorer l'extension. Aucun code, texte ou information personnelle n'est jamais envoyé.", - "changeSettings": "Vous pouvez toujours modifier cela en bas des paramètres", + "changeSettings": "Vous pouvez toujours modifier cela en bas des paramètres", "settings": "paramètres", "allow": "Autoriser", "deny": "Refuser" diff --git a/webview-ui/src/i18n/locales/hi/welcome.json b/webview-ui/src/i18n/locales/hi/welcome.json index 1e78c71cc16..ef85bdc8bfc 100644 --- a/webview-ui/src/i18n/locales/hi/welcome.json +++ b/webview-ui/src/i18n/locales/hi/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Roo Code को बेहतर बनाने में मदद करें", "anonymousTelemetry": "बग ठीक करने और एक्सटेंशन को बेहतर बनाने में हमारी मदद करने के लिए गुमनाम त्रुटि और उपयोग डेटा भेजें। कोड, संकेत या व्यक्तिगत जानकारी कभी नहीं भेजी जाती है।", - "changeSettings": "आप इसे हमेशा सेटिंग्स के निचले भाग में बदल सकते हैं", + "changeSettings": "आप इसे हमेशा सेटिंग्स के निचले भाग में बदल सकते हैं", "settings": "सेटिंग्स", "allow": "अनुमति दें", "deny": "अस्वीकार करें" diff --git a/webview-ui/src/i18n/locales/it/welcome.json b/webview-ui/src/i18n/locales/it/welcome.json index 5271886a240..e05fc1c43e3 100644 --- a/webview-ui/src/i18n/locales/it/welcome.json +++ b/webview-ui/src/i18n/locales/it/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Aiuta a migliorare Roo Code", "anonymousTelemetry": "Invia dati di utilizzo ed errori anonimi per aiutarci a correggere bug e migliorare l'estensione. Non viene mai inviato codice, testo o informazioni personali.", - "changeSettings": "Puoi sempre cambiare questo in fondo alle impostazioni", + "changeSettings": "Puoi sempre cambiare questo in fondo alle impostazioni", "settings": "impostazioni", "allow": "Consenti", "deny": "Nega" diff --git a/webview-ui/src/i18n/locales/ja/welcome.json b/webview-ui/src/i18n/locales/ja/welcome.json index 835d3e4de7f..9e5b30e4c95 100644 --- a/webview-ui/src/i18n/locales/ja/welcome.json +++ b/webview-ui/src/i18n/locales/ja/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Roo Codeの改善にご協力ください", "anonymousTelemetry": "バグの修正と拡張機能の改善のため、匿名のエラーと使用データを送信してください。コード、プロンプト、個人情報は一切送信されません。", - "changeSettings": "設定の下部でいつでも変更できます", + "changeSettings": "設定の下部でいつでも変更できます", "settings": "設定", "allow": "許可", "deny": "拒否" diff --git a/webview-ui/src/i18n/locales/ko/welcome.json b/webview-ui/src/i18n/locales/ko/welcome.json index af9e1dc4994..b8b8cbd2527 100644 --- a/webview-ui/src/i18n/locales/ko/welcome.json +++ b/webview-ui/src/i18n/locales/ko/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Roo Code 개선에 도움 주세요", "anonymousTelemetry": "버그 수정 및 확장 기능 개선을 위해 익명의 오류 및 사용 데이터를 보내주세요. 코드, 프롬프트 또는 개인 정보는 절대 전송되지 않습니다.", - "changeSettings": "설정 하단에서 언제든지 변경할 수 있습니다", + "changeSettings": "설정 하단에서 언제든지 변경할 수 있습니다", "settings": "설정", "allow": "허용", "deny": "거부" diff --git a/webview-ui/src/i18n/locales/pl/welcome.json b/webview-ui/src/i18n/locales/pl/welcome.json index cc9907f3f82..0e6546bc21c 100644 --- a/webview-ui/src/i18n/locales/pl/welcome.json +++ b/webview-ui/src/i18n/locales/pl/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Pomóż ulepszyć Roo Code", "anonymousTelemetry": "Wyślij anonimowe dane o błędach i użyciu, aby pomóc nam w naprawianiu błędów i ulepszaniu rozszerzenia. Nigdy nie są wysyłane żadne kody, teksty ani informacje osobiste.", - "changeSettings": "Zawsze możesz to zmienić na dole ustawień", + "changeSettings": "Zawsze możesz to zmienić na dole ustawień", "settings": "ustawienia", "allow": "Zezwól", "deny": "Odmów" diff --git a/webview-ui/src/i18n/locales/pt-BR/welcome.json b/webview-ui/src/i18n/locales/pt-BR/welcome.json index 7123772d67a..c28386a6136 100644 --- a/webview-ui/src/i18n/locales/pt-BR/welcome.json +++ b/webview-ui/src/i18n/locales/pt-BR/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Ajude a melhorar o Roo Code", "anonymousTelemetry": "Envie dados de uso e erros anônimos para nos ajudar a corrigir bugs e melhorar a extensão. Nenhum código, texto ou informação pessoal é enviado.", - "changeSettings": "Você sempre pode mudar isso na parte inferior das configurações", + "changeSettings": "Você sempre pode mudar isso na parte inferior das configurações", "settings": "configurações", "allow": "Permitir", "deny": "Negar" diff --git a/webview-ui/src/i18n/locales/tr/welcome.json b/webview-ui/src/i18n/locales/tr/welcome.json index f462c1dd3d4..2f25a1e93d5 100644 --- a/webview-ui/src/i18n/locales/tr/welcome.json +++ b/webview-ui/src/i18n/locales/tr/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Roo Code'u Geliştirmeye Yardım Edin", "anonymousTelemetry": "Hataları düzeltmemize ve eklentiyi geliştirmemize yardımcı olmak için anonim hata ve kullanım verileri gönderin. Hiçbir zaman kod, metin veya kişisel bilgi gönderilmez.", - "changeSettings": "Bunu her zaman ayarların altından değiştirebilirsiniz", + "changeSettings": "Bunu her zaman ayarların altından değiştirebilirsiniz", "settings": "ayarlar", "allow": "İzin Ver", "deny": "Reddet" diff --git a/webview-ui/src/i18n/locales/vi/welcome.json b/webview-ui/src/i18n/locales/vi/welcome.json index e2eae822da8..4801b80b7f4 100644 --- a/webview-ui/src/i18n/locales/vi/welcome.json +++ b/webview-ui/src/i18n/locales/vi/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "Giúp cải thiện Roo Code", "anonymousTelemetry": "Gửi dữ liệu lỗi và sử dụng ẩn danh để giúp chúng tôi sửa lỗi và cải thiện tiện ích mở rộng. Không bao giờ gửi mã, lời nhắc hoặc thông tin cá nhân.", - "changeSettings": "Bạn luôn có thể thay đổi điều này ở cuối phần cài đặt", + "changeSettings": "Bạn luôn có thể thay đổi điều này ở cuối phần cài đặt", "settings": "cài đặt", "allow": "Cho phép", "deny": "Từ chối" diff --git a/webview-ui/src/i18n/locales/zh-CN/welcome.json b/webview-ui/src/i18n/locales/zh-CN/welcome.json index dfa80dc7c6b..523e026f526 100644 --- a/webview-ui/src/i18n/locales/zh-CN/welcome.json +++ b/webview-ui/src/i18n/locales/zh-CN/welcome.json @@ -5,7 +5,7 @@ "start": "开始吧!", "telemetry": { "title": "帮助改进 Roo 代码", - "changeSettings": "可以随时在设置页面底部更改此设置", + "changeSettings": "可以随时在设置页面底部更改此设置", "settings": "设置", "anonymousTelemetry": "发送匿名的错误和使用数据,以帮助我们修复错误并改进扩展程序。不会发送任何代码、提示或个人信息。", "allow": "允许", diff --git a/webview-ui/src/i18n/locales/zh-TW/welcome.json b/webview-ui/src/i18n/locales/zh-TW/welcome.json index d3b912215c7..7eadb6deb36 100644 --- a/webview-ui/src/i18n/locales/zh-TW/welcome.json +++ b/webview-ui/src/i18n/locales/zh-TW/welcome.json @@ -6,7 +6,7 @@ "telemetry": { "title": "幫助改進 Roo Code", "anonymousTelemetry": "發送匿名的錯誤和使用數據,以幫助我們修復錯誤並改進擴展功能。不會發送任何代碼、提示或個人信息。", - "changeSettings": "您隨時可以在設置底部更改此選項", + "changeSettings": "您隨時可以在設置底部更改此選項", "settings": "設置", "allow": "允許", "deny": "拒絕" From 02081dedf939b987f064a2beebe965706ec4c2d7 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Mar 2025 09:59:16 -0400 Subject: [PATCH 02/66] Revert "feat(mentions): improve path handling for Windows and escaped spaces" (#1875) --- src/shared/__tests__/context-mentions.test.ts | 325 ------------------ src/shared/context-mentions.ts | 131 +++---- 2 files changed, 49 insertions(+), 407 deletions(-) delete mode 100644 src/shared/__tests__/context-mentions.test.ts diff --git a/src/shared/__tests__/context-mentions.test.ts b/src/shared/__tests__/context-mentions.test.ts deleted file mode 100644 index 99bad21ebb4..00000000000 --- a/src/shared/__tests__/context-mentions.test.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { mentionRegex, mentionRegexGlobal } from "../context-mentions" - -interface TestResult { - actual: string | null - expected: string | null -} - -function testMention(input: string, expected: string | null): TestResult { - const match = mentionRegex.exec(input) - return { - actual: match ? match[0] : null, - expected, - } -} - -function expectMatch(result: TestResult) { - if (result.expected === null) { - return expect(result.actual).toBeNull() - } - if (result.actual !== result.expected) { - // Instead of console.log, use expect().toBe() with a descriptive message - expect(result.actual).toBe(result.expected) - } -} - -describe("Mention Regex", () => { - describe("Windows Path Support", () => { - it("matches simple Windows paths", () => { - const cases: Array<[string, string]> = [ - ["@C:\\folder\\file.txt", "@C:\\folder\\file.txt"], - ["@c:\\Program/ Files\\file.txt", "@c:\\Program/ Files\\file.txt"], - ["@C:\\file.txt", "@C:\\file.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - - it("matches Windows network shares", () => { - const cases: Array<[string, string]> = [ - ["@\\\\server\\share\\file.txt", "@\\\\server\\share\\file.txt"], - ["@\\\\127.0.0.1\\network-path\\file.txt", "@\\\\127.0.0.1\\network-path\\file.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - - it("matches mixed separators", () => { - const result = testMention("@C:\\folder\\file.txt", "@C:\\folder\\file.txt") - expectMatch(result) - }) - - it("matches Windows relative paths", () => { - const cases: Array<[string, string]> = [ - ["@folder\\file.txt", "@folder\\file.txt"], - ["@.\\folder\\file.txt", "@.\\folder\\file.txt"], - ["@..\\parent\\file.txt", "@..\\parent\\file.txt"], - ["@path\\to\\directory\\", "@path\\to\\directory\\"], - ["@.\\current\\path\\with/ space.txt", "@.\\current\\path\\with/ space.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - describe("Escaped Spaces Support", () => { - it("matches Unix paths with escaped spaces", () => { - const cases: Array<[string, string]> = [ - ["@/path/to/file\\ with\\ spaces.txt", "@/path/to/file\\ with\\ spaces.txt"], - ["@/path/with\\ \\ multiple\\ spaces.txt", "@/path/with\\ \\ multiple\\ spaces.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - - it("matches Windows paths with escaped spaces", () => { - const cases: Array<[string, string]> = [ - ["@C:\\path\\to\\file/ with/ spaces.txt", "@C:\\path\\to\\file/ with/ spaces.txt"], - ["@C:\\Program/ Files\\app\\file.txt", "@C:\\Program/ Files\\app\\file.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - describe("Combined Path Variations", () => { - it("matches complex path combinations", () => { - const cases: Array<[string, string]> = [ - [ - "@C:\\Users\\name\\Documents\\file/ with/ spaces.txt", - "@C:\\Users\\name\\Documents\\file/ with/ spaces.txt", - ], - [ - "@\\\\server\\share\\path/ with/ spaces\\file.txt", - "@\\\\server\\share\\path/ with/ spaces\\file.txt", - ], - ["@C:\\path/ with/ spaces\\file.txt", "@C:\\path/ with/ spaces\\file.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - describe("Edge Cases", () => { - it("handles edge cases correctly", () => { - const cases: Array<[string, string]> = [ - ["@C:\\", "@C:\\"], - ["@/path/to/folder", "@/path/to/folder"], - ["@C:\\folder\\file with spaces.txt", "@C:\\folder\\file"], - ["@C:\\Users\\name\\path\\to\\文件夹\\file.txt", "@C:\\Users\\name\\path\\to\\文件夹\\file.txt"], - ["@/path123/file-name_2.0.txt", "@/path123/file-name_2.0.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - describe("Existing Functionality", () => { - it("matches Unix paths", () => { - const cases: Array<[string, string]> = [ - ["@/usr/local/bin/file", "@/usr/local/bin/file"], - ["@/path/to/file.txt", "@/path/to/file.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - - it("matches URLs", () => { - const cases: Array<[string, string]> = [ - ["@http://example.com", "@http://example.com"], - ["@https://example.com/path/to/file.html", "@https://example.com/path/to/file.html"], - ["@ftp://server.example.com/file.zip", "@ftp://server.example.com/file.zip"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - - it("matches git hashes", () => { - const cases: Array<[string, string]> = [ - ["@a1b2c3d4e5f6g7h8i9j0", "@a1b2c3d4e5f6g7h8i9j0"], - ["@abcdef1234567890abcdef1234567890abcdef12", "@abcdef1234567890abcdef1234567890abcdef12"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - - it("matches special keywords", () => { - const cases: Array<[string, string]> = [ - ["@problems", "@problems"], - ["@git-changes", "@git-changes"], - ["@terminal", "@terminal"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - describe("Invalid Patterns", () => { - it("rejects invalid patterns", () => { - const cases: Array<[string, null]> = [ - ["C:\\folder\\file.txt", null], - ["@", null], - ["@ C:\\file.txt", null], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - - it("matches only until invalid characters", () => { - const result = testMention("@C:\\folder\\file.txt invalid suffix", "@C:\\folder\\file.txt") - expectMatch(result) - }) - }) - - describe("In Context", () => { - it("matches mentions within text", () => { - const cases: Array<[string, string]> = [ - ["Check the file at @C:\\folder\\file.txt for details.", "@C:\\folder\\file.txt"], - ["See @/path/to/file\\ with\\ spaces.txt for an example.", "@/path/to/file\\ with\\ spaces.txt"], - ["Review @problems and @git-changes.", "@problems"], - ["Multiple: @/file1.txt and @C:\\file2.txt and @terminal", "@/file1.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - describe("Multiple Mentions", () => { - it("finds all mentions in a string using global regex", () => { - const text = "Check @/path/file1.txt and @C:\\folder\\file2.txt and report any @problems to @git-changes" - const matches = text.match(mentionRegexGlobal) - expect(matches).toEqual(["@/path/file1.txt", "@C:\\folder\\file2.txt", "@problems", "@git-changes"]) - }) - }) - - describe("Special Characters in Paths", () => { - it("handles special characters in file paths", () => { - const cases: Array<[string, string]> = [ - ["@/path/with-dash/file_underscore.txt", "@/path/with-dash/file_underscore.txt"], - ["@C:\\folder+plus\\file(parens)[]brackets.txt", "@C:\\folder+plus\\file(parens)[]brackets.txt"], - ["@/path/with/file#hash%percent.txt", "@/path/with/file#hash%percent.txt"], - ["@/path/with/file@symbol$dollar.txt", "@/path/with/file@symbol$dollar.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - describe("Mixed Path Types in Single String", () => { - it("correctly identifies the first path in a string with multiple path types", () => { - const text = "Check both @/unix/path and @C:\\windows\\path for details." - const result = mentionRegex.exec(text) - expect(result?.[0]).toBe("@/unix/path") - - // Test starting from after the first match - const secondSearchStart = text.indexOf("@C:") - const secondResult = mentionRegex.exec(text.substring(secondSearchStart)) - expect(secondResult?.[0]).toBe("@C:\\windows\\path") - }) - }) - - describe("Non-Latin Character Support", () => { - it("handles international characters in paths", () => { - const cases: Array<[string, string]> = [ - ["@/path/to/你好/file.txt", "@/path/to/你好/file.txt"], - ["@C:\\用户\\документы\\файл.txt", "@C:\\用户\\документы\\файл.txt"], - ["@/путь/к/файлу.txt", "@/путь/к/файлу.txt"], - ["@C:\\folder\\file_äöü.txt", "@C:\\folder\\file_äöü.txt"], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - describe("Mixed Path Delimiters", () => { - // Modifying expectations to match current behavior - it("documents behavior with mixed forward and backward slashes in Windows paths", () => { - const cases: Array<[string, null]> = [ - // Current implementation doesn't support mixed slashes - ["@C:\\Users/Documents\\folder/file.txt", null], - ["@C:/Windows\\System32/drivers\\etc/hosts", null], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - describe("Extended Negative Tests", () => { - // Modifying expectations to match current behavior - it("documents behavior with potentially invalid characters", () => { - const cases: Array<[string, string]> = [ - // Current implementation actually matches these patterns - ["@/path/withchars.txt", "@/path/withchars.txt"], - ["@C:\\folder\\file|with|pipe.txt", "@C:\\folder\\file|with|pipe.txt"], - ['@/path/with"quotes".txt', '@/path/with"quotes".txt'], - ] - - cases.forEach(([input, expected]) => { - const result = testMention(input, expected) - expectMatch(result) - }) - }) - }) - - // // These are documented as "not implemented yet" - // describe("Future Enhancement Candidates", () => { - // it("identifies patterns that could be supported in future enhancements", () => { - // // These patterns aren't currently supported by the regex - // // but might be considered for future improvements - // console.log( - // "The following patterns are not currently supported but might be considered for future enhancements:", - // ) - // console.log("- Paths with double slashes: @/path//with/double/slash.txt") - // console.log("- Complex path traversals: @/very/./long/../../path/.././traversal.txt") - // console.log("- Environment variables in paths: @$HOME/file.txt, @C:\\Users\\%USERNAME%\\file.txt") - // }) - // }) -}) diff --git a/src/shared/context-mentions.ts b/src/shared/context-mentions.ts index ddfc6650f5f..915114ab932 100644 --- a/src/shared/context-mentions.ts +++ b/src/shared/context-mentions.ts @@ -1,90 +1,57 @@ /* -- **Regex Breakdown**: - - 1. **Pattern Components**: - - The regex is built from multiple patterns joined with OR (|) operators - - Each pattern handles a specific type of mention: - - Unix/Linux paths - - Windows paths with drive letters - - Windows relative paths - - Windows network shares - - URLs with protocols - - Git commit hashes - - Special keywords (problems, git-changes, terminal) - - 2. **Unix Path Pattern**: - - `(?:\\/|^)`: Starts with a forward slash or beginning of line - - `(?:[^\\/\\s\\\\]|\\\\[ \\t])+`: Path segment that can include escaped spaces - - `(?:\\/(?:[^\\/\\s\\\\]|\\\\[ \\t])+)*`: Additional path segments after slashes - - `\\/?`: Optional trailing slash - - 3. **Windows Path Pattern**: - - `[A-Za-z]:\\\\`: Drive letter followed by colon and double backslash - - `(?:(?:[^\\\\\\s/]+|\\/[ ])+`: Path segment that can include spaces escaped with forward slash - - `(?:\\\\(?:[^\\\\\\s/]+|\\/[ ])+)*)?`: Additional path segments after backslashes - - 4. **Windows Relative Path Pattern**: - - `(?:\\.{0,2}|[^\\\\\\s/]+)`: Path prefix that can be: - - Current directory (.) - - Parent directory (..) - - Any directory name not containing spaces, backslashes, or forward slashes - - `\\\\`: Backslash separator - - `(?:[^\\\\\\s/]+|\\\\[ \\t]|\\/[ ])+`: Path segment that can include spaces escaped with backslash or forward slash - - `(?:\\\\(?:[^\\\\\\s/]+|\\\\[ \\t]|\\/[ ])+)*`: Additional path segments after backslashes - - `\\\\?`: Optional trailing backslash +Mention regex: +- **Purpose**: + - To identify and highlight specific mentions in text that start with '@'. + - These mentions can be file paths, URLs, or the exact word 'problems'. + - Ensures that trailing punctuation marks (like commas, periods, etc.) are not included in the match, allowing punctuation to follow the mention without being part of it. - 5. **Network Share Pattern**: - - `\\\\\\\\`: Double backslash (escaped) to start network path - - `[^\\\\\\s]+`: Server name - - `(?:\\\\(?:[^\\\\\\s/]+|\\/[ ])+)*`: Share name and additional path components - - `(?:\\\\)?`: Optional trailing backslash - - 6. **URL Pattern**: - - `\\w+:\/\/`: Protocol (http://, https://, etc.) - - `[^\\s]+`: Rest of the URL (non-whitespace characters) - - 7. **Git Hash Pattern**: - - `[a-zA-Z0-9]{7,40}\\b`: 7-40 alphanumeric characters followed by word boundary - - 8. **Special Keywords Pattern**: - - `problems\\b`, `git-changes\\b`, `terminal\\b`: Exact word matches with word boundaries +- **Regex Breakdown**: + - `/@`: + - **@**: The mention must start with the '@' symbol. + + - `((?:\/|\w+:\/\/)[^\s]+?|problems\b|git-changes\b)`: + - **Capturing Group (`(...)`)**: Captures the part of the string that matches one of the specified patterns. + - `(?:\/|\w+:\/\/)`: + - **Non-Capturing Group (`(?:...)`)**: Groups the alternatives without capturing them for back-referencing. + - `\/`: + - **Slash (`/`)**: Indicates that the mention is a file or folder path starting with a '/'. + - `|`: Logical OR. + - `\w+:\/\/`: + - **Protocol (`\w+://`)**: Matches URLs that start with a word character sequence followed by '://', such as 'http://', 'https://', 'ftp://', etc. + - `[^\s]+?`: + - **Non-Whitespace Characters (`[^\s]+`)**: Matches one or more characters that are not whitespace. + - **Non-Greedy (`+?`)**: Ensures the smallest possible match, preventing the inclusion of trailing punctuation. + - `|`: Logical OR. + - `problems\b`: + - **Exact Word ('problems')**: Matches the exact word 'problems'. + - **Word Boundary (`\b`)**: Ensures that 'problems' is matched as a whole word and not as part of another word (e.g., 'problematic'). + - `|`: Logical OR. + - `terminal\b`: + - **Exact Word ('terminal')**: Matches the exact word 'terminal'. + - **Word Boundary (`\b`)**: Ensures that 'terminal' is matched as a whole word and not as part of another word (e.g., 'terminals'). + - `(?=[.,;:!?]?(?=[\s\r\n]|$))`: + - **Positive Lookahead (`(?=...)`)**: Ensures that the match is followed by specific patterns without including them in the match. + - `[.,;:!?]?`: + - **Optional Punctuation (`[.,;:!?]?`)**: Matches zero or one of the specified punctuation marks. + - `(?=[\s\r\n]|$)`: + - **Nested Positive Lookahead (`(?=[\s\r\n]|$)`)**: Ensures that the punctuation (if present) is followed by a whitespace character, a line break, or the end of the string. + +- **Summary**: + - The regex effectively matches: + - Mentions that are file or folder paths starting with '/' and containing any non-whitespace characters (including periods within the path). + - URLs that start with a protocol (like 'http://') followed by any non-whitespace characters (including query parameters). + - The exact word 'problems'. + - The exact word 'git-changes'. + - The exact word 'terminal'. + - It ensures that any trailing punctuation marks (such as ',', '.', '!', etc.) are not included in the matched mention, allowing the punctuation to follow the mention naturally in the text. - 9. **Termination Logic**: - - `(?=[.,;:!?]?(?=[\\s\\r\\n]|$))`: Positive lookahead that: - - Allows an optional punctuation mark after the mention - - Ensures the mention (and optional punctuation) is followed by whitespace or end of string +- **Global Regex**: + - `mentionRegexGlobal`: Creates a global version of the `mentionRegex` to find all matches within a given string. -- **Behavior Summary**: - - Matches @-prefixed mentions - - Handles different path formats across operating systems - - Supports escaped spaces in paths using OS-appropriate conventions - - Cleanly terminates at whitespace or end of string - - Excludes trailing punctuation from the match - - Creates both single-match and global-match regex objects */ - -const mentionPatterns = [ - // Unix paths with escaped spaces using backslash - "(?:\\/|^)(?:[^\\/\\s\\\\]|\\\\[ \\t])+(?:\\/(?:[^\\/\\s\\\\]|\\\\[ \\t])+)*\\/?", - // Windows paths with drive letters (C:\path) with support for escaped spaces using forward slash - "[A-Za-z]:\\\\(?:(?:[^\\\\\\s/]+|\\/[ ])+(?:\\\\(?:[^\\\\\\s/]+|\\/[ ])+)*)?", - // Windows relative paths (folder\file or .\folder\file) with support for escaped spaces - "(?:\\.{0,2}|[^\\\\\\s/]+)\\\\(?:[^\\\\\\s/]+|\\\\[ \\t]|\\/[ ])+(?:\\\\(?:[^\\\\\\s/]+|\\\\[ \\t]|\\/[ ])+)*\\\\?", - // Windows network shares (\\server\share) with support for escaped spaces using forward slash - "\\\\\\\\[^\\\\\\s]+(?:\\\\(?:[^\\\\\\s/]+|\\/[ ])+)*(?:\\\\)?", - // URLs with protocols (http://, https://, etc.) - "\\w+:\/\/[^\\s]+", - // Git hashes (7-40 alphanumeric characters) - "[a-zA-Z0-9]{7,40}\\b", - // Special keywords - "problems\\b", - "git-changes\\b", - "terminal\\b", -] -// Build the full regex pattern by joining the patterns with OR operator -const mentionRegexPattern = `@(${mentionPatterns.join("|")})(?=[.,;:!?]?(?=[\\s\\r\\n]|$))` -export const mentionRegex = new RegExp(mentionRegexPattern) -export const mentionRegexGlobal = new RegExp(mentionRegexPattern, "g") +export const mentionRegex = + /@((?:\/|\w+:\/\/)[^\s]+?|[a-f0-9]{7,40}\b|problems\b|git-changes\b|terminal\b)(?=[.,;:!?]?(?=[\s\r\n]|$))/ +export const mentionRegexGlobal = new RegExp(mentionRegex.source, "g") export interface MentionSuggestion { type: "file" | "folder" | "git" | "problems" From abf9bba8880b15a5d4f2e3275362d223f3d01adf Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Mar 2025 10:03:19 -0400 Subject: [PATCH 03/66] v3.10.2 (#1877) --- .changeset/hungry-ads-marry.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/hungry-ads-marry.md diff --git a/.changeset/hungry-ads-marry.md b/.changeset/hungry-ads-marry.md new file mode 100644 index 00000000000..aa157437721 --- /dev/null +++ b/.changeset/hungry-ads-marry.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +v3.10.2 From 8663e52e8d7195958af09ed06be92291c514c122 Mon Sep 17 00:00:00 2001 From: R00-B0T <110429663+R00-B0T@users.noreply.github.com> Date: Fri, 21 Mar 2025 07:12:04 -0700 Subject: [PATCH 04/66] Changeset version bump (#1878) * changeset version bump * Updating CHANGELOG.md format * Update CHANGELOG.md * Update CHANGELOG.md --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: R00-B0T Co-authored-by: Matt Rubens --- .changeset/hungry-ads-marry.md | 5 ----- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) delete mode 100644 .changeset/hungry-ads-marry.md diff --git a/.changeset/hungry-ads-marry.md b/.changeset/hungry-ads-marry.md deleted file mode 100644 index aa157437721..00000000000 --- a/.changeset/hungry-ads-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -v3.10.2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 149369e3452..1339300648d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Roo Code Changelog +## [3.10.2] - 2025-03-21 + +- Fixes to context mentions on Windows +- Fixes to German translations (thanks @cannuri!) +- Fixes to telemetry banner internationalization +- Sonnet 3.7 non-thinking now correctly uses 8192 max output tokens + ## [3.10.1] - 2025-03-20 - Make the suggested responses optional to not break overriden system prompts diff --git a/package-lock.json b/package-lock.json index 28d7402f753..73153ad7d70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.10.1", + "version": "3.10.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.10.1", + "version": "3.10.2", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", diff --git a/package.json b/package.json index d84b745e1b3..a67a5954bcd 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Roo Code (prev. Roo Cline)", "description": "A whole dev team of AI agents in your editor.", "publisher": "RooVeterinaryInc", - "version": "3.10.1", + "version": "3.10.2", "icon": "assets/icons/rocket.png", "galleryBanner": { "color": "#617A91", From f5628e573fc8e65243ac5cadc969aa85fa913aaf Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Mar 2025 10:51:44 -0400 Subject: [PATCH 05/66] Support mentioning binary files (#1880) --- .changeset/wise-icons-sort.md | 5 +++++ src/core/mentions/index.ts | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 .changeset/wise-icons-sort.md diff --git a/.changeset/wise-icons-sort.md b/.changeset/wise-icons-sort.md new file mode 100644 index 00000000000..d0f4c388350 --- /dev/null +++ b/.changeset/wise-icons-sort.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Support mentioning binary files diff --git a/src/core/mentions/index.ts b/src/core/mentions/index.ts index 57bb40811ec..d32b1ec08d5 100644 --- a/src/core/mentions/index.ts +++ b/src/core/mentions/index.ts @@ -152,12 +152,12 @@ async function getFileOrFolderContent(mentionPath: string, cwd: string): Promise const stats = await fs.stat(absPath) if (stats.isFile()) { - const isBinary = await isBinaryFile(absPath).catch(() => false) - if (isBinary) { - return "(Binary file, unable to display content)" + try { + const content = await extractTextFromFile(absPath) + return content + } catch (error) { + return `(Failed to read contents of ${mentionPath}): ${error.message}` } - const content = await extractTextFromFile(absPath) - return content } else if (stats.isDirectory()) { const entries = await fs.readdir(absPath, { withFileTypes: true }) let folderContent = "" From daaba1c19465250a075e3f9e4021e028c6e78f16 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 11:35:50 -0400 Subject: [PATCH 06/66] Update contributors list (#1851) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 34 +++++++++++++++++----------------- locales/ca/README.md | 20 ++++++++++---------- locales/de/README.md | 20 ++++++++++---------- locales/es/README.md | 20 ++++++++++---------- locales/fr/README.md | 20 ++++++++++---------- locales/hi/README.md | 20 ++++++++++---------- locales/it/README.md | 20 ++++++++++---------- locales/ja/README.md | 20 ++++++++++---------- locales/ko/README.md | 20 ++++++++++---------- locales/pl/README.md | 20 ++++++++++---------- locales/pt-BR/README.md | 20 ++++++++++---------- locales/tr/README.md | 20 ++++++++++---------- locales/vi/README.md | 20 ++++++++++---------- locales/zh-CN/README.md | 20 ++++++++++---------- locales/zh-TW/README.md | 20 ++++++++++---------- 15 files changed, 157 insertions(+), 157 deletions(-) diff --git a/README.md b/README.md index 38c7894c4d1..4d294faae03 100644 --- a/README.md +++ b/README.md @@ -180,23 +180,23 @@ Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| -| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| -| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| Szpadel
Szpadel
| psv2522
psv2522
| Premshay
Premshay
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| cannuri
cannuri
| lupuletic
lupuletic
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| -| RaySinner
RaySinner
| pdecat
pdecat
| emshvac
emshvac
| afshawnlotfi
afshawnlotfi
| aitoroses
aitoroses
| dtrugman
dtrugman
| -| KJ7LNW
KJ7LNW
| sammcj
sammcj
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| yt3trees
yt3trees
| yongjer
yongjer
| -| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| -| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| -| bannzai
bannzai
| dairui1
dairui1
| dqroid
dqroid
| im47cn
im47cn
| kinandan
kinandan
| kohii
kohii
| -| lightrabbit
lightrabbit
| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| -| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| teddyOOXX
teddyOOXX
| -| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| -| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| -| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| -| vladstudio
vladstudio
| ashktn
ashktn
| | | | | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| +| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| +| sammcj
sammcj
| KJ7LNW
KJ7LNW
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| yongjer
yongjer
| +| vincentsong
vincentsong
| eonghk
eonghk
| arthurauffray
arthurauffray
| aheizi
aheizi
| heyseth
heyseth
| philfung
philfung
| +| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| +| moqimoqidea
moqimoqidea
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| AMHesch
AMHesch
| mosleyit
mosleyit
| oprstchn
oprstchn
| +| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| +| teddyOOXX
teddyOOXX
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| dleen
dleen
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| +| eltociear
eltociear
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| tgfjt
tgfjt
| +| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index 7c009d9fa85..133bd1d7601 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -180,21 +180,21 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 50d587d541d..f519c508d01 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -180,21 +180,21 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 977175fae2d..4dc42be6fb5 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -180,21 +180,21 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 2a7d97407dc..505ae5692e2 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -180,21 +180,21 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index f08262496cb..a8f0f07a4fe 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -180,21 +180,21 @@ Roo Code को बेहतर बनाने में मदद करने |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index b1e0c78a025..dce5ca0362c 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -180,21 +180,21 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index fccfe1aa1f8..58d8a5c8313 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -180,21 +180,21 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 92d7c38bfcb..3905a68f78a 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -180,21 +180,21 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index 7b481402188..a709fd90c3b 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -180,21 +180,21 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 13b4d56934a..d2f51447af0 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -180,21 +180,21 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index 55faca7b50e..e3beed92e05 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -180,21 +180,21 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index 510135f8065..3a23b9f85ab 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -180,21 +180,21 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 308a5206457..017a44e98f1 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -180,21 +180,21 @@ code --install-extension bin/roo-cline-.vsix |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 1139d27c339..bf038798984 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -180,21 +180,21 @@ code --install-extension bin/roo-cline-.vsix |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| |NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|Szpadel
Szpadel
|psv2522
psv2522
|Premshay
Premshay
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -|cannuri
cannuri
|lupuletic
lupuletic
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| -|RaySinner
RaySinner
|pdecat
pdecat
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
| -|KJ7LNW
KJ7LNW
|sammcj
sammcj
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
| +|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| +|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| +|sammcj
sammcj
|KJ7LNW
KJ7LNW
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|yongjer
yongjer
| |vincentsong
vincentsong
|eonghk
eonghk
|arthurauffray
arthurauffray
|aheizi
aheizi
|heyseth
heyseth
|philfung
philfung
| |napter
napter
|mdp
mdp
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
| -|bannzai
bannzai
|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
| -|lightrabbit
lightrabbit
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|teddyOOXX
teddyOOXX
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|moqimoqidea
moqimoqidea
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|AMHesch
AMHesch
|mosleyit
mosleyit
|oprstchn
oprstchn
| +|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
| +|teddyOOXX
teddyOOXX
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| |dleen
dleen
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
| |eltociear
eltociear
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|tgfjt
tgfjt
| -|vladstudio
vladstudio
|ashktn
ashktn
| | | | | +|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
| | | | ## 許可證 From e075fbfa9039f686179c01152a087ed464fa44e8 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Mar 2025 12:27:48 -0400 Subject: [PATCH 07/66] Add roadmap to CONTRIBUTING (#1883) * Add roadmap to CONTRIBUTING * Update locales/zh-TW/CONTRIBUTING.md Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- CONTRIBUTING.md | 63 +++++++++++++++- locales/ca/CONTRIBUTING.md | 63 +++++++++++++++- locales/de/CONTRIBUTING.md | 131 +++++++++++++++++++++++++--------- locales/es/CONTRIBUTING.md | 63 +++++++++++++++- locales/fr/CONTRIBUTING.md | 63 +++++++++++++++- locales/hi/CONTRIBUTING.md | 63 +++++++++++++++- locales/it/CONTRIBUTING.md | 63 +++++++++++++++- locales/ja/CONTRIBUTING.md | 63 +++++++++++++++- locales/ko/CONTRIBUTING.md | 63 +++++++++++++++- locales/pl/CONTRIBUTING.md | 63 +++++++++++++++- locales/pt-BR/CONTRIBUTING.md | 63 +++++++++++++++- locales/tr/CONTRIBUTING.md | 63 +++++++++++++++- locales/vi/CONTRIBUTING.md | 63 +++++++++++++++- locales/zh-CN/CONTRIBUTING.md | 63 +++++++++++++++- locales/zh-TW/CONTRIBUTING.md | 63 +++++++++++++++- 15 files changed, 964 insertions(+), 49 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ff31a9176ac..4d9bf3789c2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,7 +26,68 @@ Looking for a good first contribution? Check out issues in the "Issue [Unassigne We also welcome contributions to our [documentation](https://docs.roocode.com/)! Whether it's fixing typos, improving existing guides, or creating new educational content - we'd love to build a community-driven repository of resources that helps everyone get the most out of Roo Code. You can click "Edit this page" on any page to quickly get to the right spot in Github to edit the file, or you can dive directly into https://github.com/RooVetGit/Roo-Code-Docs. -If you're planning to work on a bigger feature, please create a [feature request](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) first so we can discuss whether it aligns with Roo Code's vision. +If you're planning to work on a bigger feature, please create a [feature request](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) first so we can discuss whether it aligns with Roo Code's vision. You may also want to check our [Project Roadmap](#project-roadmap) below to see if your idea fits with our strategic direction. + +## Project Roadmap + +Roo Code has a clear development roadmap that guides our priorities and future direction. Understanding our roadmap can help you: + +- Align your contributions with project goals +- Identify areas where your expertise would be most valuable +- Understand the context behind certain design decisions +- Find inspiration for new features that support our vision + +Our current roadmap focuses on six key pillars: + +### Provider Support + +We aim to support as many providers well as we can: + +- More versatile "OpenAI Compatible" support +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Enhanced support for Ollama and LM Studio + +### Model Support + +We want Roo to work as well on as many models as possible, including local models: + +- Local model support through custom system prompting and workflows +- Benchmarking evals and test cases + +### System Support + +We want Roo to run well on everyone's computer: + +- Cross platform terminal integration +- Strong and consistent support for Mac, Windows, and Linux + +### Documentation + +We want comprehensive, accessible documentation for all users and contributors: + +- Expanded user guides and tutorials +- Clear API documentation +- Better contributor guidance +- Multilingual documentation resources +- Interactive examples and code samples + +### Stability + +We want to significantly decrease the number of bugs and increase automated testing: + +- Debug logging switch +- "Machine/Task Information" copy button for sending in with bug/support requests + +### Internationalization + +We want Roo to speak everyone's language: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +We especially welcome contributions that advance our roadmap goals. If you're working on something that aligns with these pillars, please mention it in your PR description. ## Development Setup diff --git a/locales/ca/CONTRIBUTING.md b/locales/ca/CONTRIBUTING.md index c65ce5bad14..5f2beefc79e 100644 --- a/locales/ca/CONTRIBUTING.md +++ b/locales/ca/CONTRIBUTING.md @@ -26,7 +26,68 @@ Buscant una bona primera contribució? Consulteu les incidències a la secció " També donem la benvinguda a contribucions a la nostra [documentació](https://docs.roocode.com/)! Ja sigui corregint errors tipogràfics, millorant guies existents o creant nou contingut educatiu - ens encantaria construir un repositori de recursos impulsat per la comunitat que ajudi a tothom a aprofitar al màxim Roo Code. Podeu fer clic a "Editar aquesta pàgina" a qualsevol pàgina per arribar ràpidament al lloc correcte a Github per editar el fitxer, o podeu anar directament a https://github.com/RooVetGit/Roo-Code-Docs. -Si esteu planejant treballar en una funcionalitat més gran, si us plau creeu primer una [sol·licitud de funcionalitat](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) perquè puguem discutir si s'alinea amb la visió de Roo Code. +Si esteu planejant treballar en una funcionalitat més gran, si us plau creeu primer una [sol·licitud de funcionalitat](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) perquè puguem discutir si s'alinea amb la visió de Roo Code. També podeu consultar el nostre [Full de Ruta del Projecte](#full-de-ruta-del-projecte) a continuació per veure si la vostra idea s'ajusta a la nostra direcció estratègica. + +## Full de Ruta del Projecte + +Roo Code té un full de ruta de desenvolupament clar que guia les nostres prioritats i direcció futura. Entendre el nostre full de ruta us pot ajudar a: + +- Alinear les vostres contribucions amb els objectius del projecte +- Identificar àrees on la vostra experiència seria més valuosa +- Entendre el context darrere de certes decisions de disseny +- Trobar inspiració per a noves funcionalitats que donin suport a la nostra visió + +El nostre full de ruta actual se centra en sis pilars clau: + +### Suport de Proveïdors + +Aspirem a donar suport a tants proveïdors com sigui possible: + +- Suport més versàtil per a "OpenAI Compatible" +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Suport millorat per a Ollama i LM Studio + +### Suport de Models + +Volem que Roo funcioni tan bé com sigui possible amb tants models com sigui possible, inclosos els models locals: + +- Suport de models locals a través de prompts de sistema personalitzats i fluxos de treball +- Avaluacions de rendiment i casos de prova + +### Suport de Sistemes + +Volem que Roo funcioni bé a l'ordinador de tothom: + +- Integració de terminal multiplataforma +- Suport sòlid i consistent per a Mac, Windows i Linux + +### Documentació + +Volem documentació completa i accessible per a tots els usuaris i col·laboradors: + +- Guies d'usuari i tutorials ampliats +- Documentació clara de l'API +- Millor orientació per als col·laboradors +- Recursos de documentació multilingües +- Exemples interactius i mostres de codi + +### Estabilitat + +Volem reduir significativament el nombre d'errors i augmentar les proves automatitzades: + +- Interruptor de registre de depuració +- Botó de còpia "Informació de Màquina/Tasca" per enviar amb sol·licituds d'error/suport + +### Internacionalització + +Volem que Roo parli l'idioma de tothom: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +Donem especialment la benvinguda a contribucions que avancin els nostres objectius del full de ruta. Si esteu treballant en alguna cosa que s'alinea amb aquests pilars, si us plau mencioneu-ho a la descripció del vostre PR. ## Configuració de desenvolupament diff --git a/locales/de/CONTRIBUTING.md b/locales/de/CONTRIBUTING.md index 7851e6103be..1aa7a5b6c2a 100644 --- a/locales/de/CONTRIBUTING.md +++ b/locales/de/CONTRIBUTING.md @@ -1,12 +1,12 @@ # Beitrag zu Roo Code -Wir freuen uns, dass Sie Interesse haben, zu Roo Code beizutragen. Ob Sie einen Fehler beheben, eine Funktion hinzufügen oder unsere Dokumentation verbessern, jeder Beitrag macht Roo Code intelligenter! Um unsere Community lebendig und einladend zu halten, müssen sich alle Mitglieder an unseren [Verhaltenskodex](CODE_OF_CONDUCT.md) halten. +Wir freuen uns, dass du Interesse hast, zu Roo Code beizutragen. Ob du einen Fehler behebst, eine Funktion hinzufügst oder unsere Dokumentation verbesserst, jeder Beitrag macht Roo Code intelligenter! Um unsere Community lebendig und einladend zu halten, müssen sich alle Mitglieder an unseren [Verhaltenskodex](CODE_OF_CONDUCT.md) halten. ## Treten Sie unserer Community bei -Wir ermutigen alle Mitwirkenden nachdrücklich, unserer [Discord-Community](https://discord.gg/roocode) beizutreten! Teil unseres Discord-Servers zu sein, hilft Ihnen: +Wir ermutigen alle Mitwirkenden nachdrücklich, unserer [Discord-Community](https://discord.gg/roocode) beizutreten! Teil unseres Discord-Servers zu sein, hilft dir: -- Echtzeit-Hilfe und Anleitung für Ihre Beiträge zu erhalten +- Echtzeit-Hilfe und Anleitung für deine Beiträge zu erhalten - Mit anderen Mitwirkenden und Kernteammitgliedern in Kontakt zu treten - Über Projektentwicklungen und Prioritäten auf dem Laufenden zu bleiben - An Diskussionen teilzunehmen, die die Zukunft von Roo Code gestalten @@ -14,46 +14,107 @@ Wir ermutigen alle Mitwirkenden nachdrücklich, unserer [Discord-Community](http ## Fehler oder Probleme melden -Fehlerberichte helfen, Roo Code für alle besser zu machen! Bevor Sie ein neues Issue erstellen, bitte [suchen Sie in bestehenden Issues](https://github.com/RooVetGit/Roo-Code/issues), um Duplikate zu vermeiden. Wenn Sie bereit sind, einen Fehler zu melden, gehen Sie zu unserer [Issues-Seite](https://github.com/RooVetGit/Roo-Code/issues/new/choose), wo Sie eine Vorlage finden, die Ihnen beim Ausfüllen der relevanten Informationen hilft. +Fehlerberichte helfen, Roo Code für alle besser zu machen! Bevor du ein neues Issue erstellst, bitte [suche in bestehenden Issues](https://github.com/RooVetGit/Roo-Code/issues), um Duplikate zu vermeiden. Wenn du bereit bist, einen Fehler zu melden, gehe zu unserer [Issues-Seite](https://github.com/RooVetGit/Roo-Code/issues/new/choose), wo du eine Vorlage findest, die dir beim Ausfüllen der relevanten Informationen hilft.
- 🔐 Wichtig: Wenn Sie eine Sicherheitslücke entdecken, nutzen Sie bitte das Github-Sicherheitstool, um sie privat zu melden. + 🔐 Wichtig: Wenn du eine Sicherheitslücke entdeckst, nutze bitte das Github-Sicherheitstool, um sie privat zu melden.
## Entscheiden, woran Sie arbeiten möchten -Suchen Sie nach einem guten ersten Beitrag? Schauen Sie sich Issues im Abschnitt "Issue [Unassigned]" unseres [Roo Code Issues](https://github.com/orgs/RooVetGit/projects/1) Github-Projekts an. Diese sind speziell für neue Mitwirkende und Bereiche ausgewählt, in denen wir Hilfe gebrauchen könnten! +Suchst du nach einem guten ersten Beitrag? Schau dir Issues im Abschnitt "Issue [Unassigned]" unseres [Roo Code Issues](https://github.com/orgs/RooVetGit/projects/1) Github-Projekts an. Diese sind speziell für neue Mitwirkende und Bereiche ausgewählt, in denen wir Hilfe gebrauchen könnten! -Wir begrüßen auch Beiträge zu unserer [Dokumentation](https://docs.roocode.com/)! Ob Sie Tippfehler korrigieren, bestehende Anleitungen verbessern oder neue Bildungsinhalte erstellen - wir würden gerne ein Community-geführtes Repository von Ressourcen aufbauen, das jedem hilft, das Beste aus Roo Code herauszuholen. Sie können auf jeder Seite auf "Edit this page" klicken, um schnell zur richtigen Stelle in Github zu gelangen, um die Datei zu bearbeiten, oder Sie können direkt zu https://github.com/RooVetGit/Roo-Code-Docs gehen. +Wir begrüßen auch Beiträge zu unserer [Dokumentation](https://docs.roocode.com/)! Ob du Tippfehler korrigierst, bestehende Anleitungen verbesserst oder neue Bildungsinhalte erstellst - wir würden gerne ein Community-geführtes Repository von Ressourcen aufbauen, das jedem hilft, das Beste aus Roo Code herauszuholen. Du kannst auf jeder Seite auf "Edit this page" klicken, um schnell zur richtigen Stelle in Github zu gelangen, um die Datei zu bearbeiten, oder du kannst direkt zu https://github.com/RooVetGit/Roo-Code-Docs gehen. -Wenn Sie an einer größeren Funktion arbeiten möchten, erstellen Sie bitte zuerst eine [Funktionsanfrage](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop), damit wir diskutieren können, ob sie mit der Vision von Roo Code übereinstimmt. +Wenn du an einer größeren Funktion arbeiten möchtest, erstelle bitte zuerst eine [Funktionsanfrage](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop), damit wir diskutieren können, ob sie mit der Vision von Roo Code übereinstimmt. Du kannst auch unseren [Projekt-Fahrplan](#projekt-fahrplan) unten überprüfen, um zu sehen, ob deine Idee mit unserer strategischen Ausrichtung übereinstimmt. + +## Projekt-Fahrplan + +Roo Code hat einen klaren Entwicklungsfahrplan, der unsere Prioritäten und zukünftige Richtung leitet. Das Verständnis unseres Fahrplans kann dir helfen: + +- Deine Beiträge mit den Projektzielen abzustimmen +- Bereiche zu identifizieren, in denen deine Expertise am wertvollsten wäre +- Den Kontext hinter bestimmten Designentscheidungen zu verstehen +- Inspiration für neue Funktionen zu finden, die unsere Vision unterstützen + +Unser aktueller Fahrplan konzentriert sich auf sechs Schlüsselsäulen: + +### Provider-Unterstützung + +Wir möchten so viele Provider wie möglich gut unterstützen: + +- Vielseitigere "OpenAI Compatible" Unterstützung +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Verbesserte Unterstützung für Ollama und LM Studio + +### Modell-Unterstützung + +Wir wollen, dass Roo mit so vielen Modellen wie möglich gut funktioniert, einschließlich lokaler Modelle: + +- Lokale Modellunterstützung durch benutzerdefiniertes System-Prompting und Workflows +- Benchmark-Evaluierungen und Testfälle + +### System-Unterstützung + +Wir wollen, dass Roo auf jedem Computer gut läuft: + +- Plattformübergreifende Terminal-Integration +- Starke und konsistente Unterstützung für Mac, Windows und Linux + +### Dokumentation + +Wir wollen umfassende, zugängliche Dokumentation für alle Benutzer und Mitwirkenden: + +- Erweiterte Benutzerhandbücher und Tutorials +- Klare API-Dokumentation +- Bessere Anleitung für Mitwirkende +- Mehrsprachige Dokumentationsressourcen +- Interaktive Beispiele und Codebeispiele + +### Stabilität + +Wir wollen die Anzahl der Fehler deutlich reduzieren und die automatisierte Testabdeckung erhöhen: + +- Debug-Logging-Schalter +- "Maschinen-/Aufgabeninformationen" Kopier-Button zum Einsenden mit Fehler-/Support-Anfragen + +### Internationalisierung + +Wir wollen, dass Roo die Sprache aller spricht: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +Wir begrüßen besonders Beiträge, die unsere Fahrplanziele voranbringen. Wenn du an etwas arbeitest, das mit diesen Säulen übereinstimmt, erwähne es bitte in deiner PR-Beschreibung. ## Entwicklungs-Setup -1. **Klonen** Sie das Repository: +1. **Klone** das Repository: ```sh git clone https://github.com/RooVetGit/Roo-Code.git ``` -2. **Installieren Sie Abhängigkeiten**: +2. **Installiere Abhängigkeiten**: ```sh npm run install:all ``` -3. **Starten Sie die Webansicht (Vite/React-App mit HMR)**: +3. **Starte die Webansicht (Vite/React-App mit HMR)**: ```sh npm run dev ``` 4. **Debugging**: - Drücken Sie `F5` (oder **Ausführen** → **Debugging starten**) in VSCode, um eine neue Sitzung mit geladenem Roo Code zu öffnen. + Drücke `F5` (oder **Ausführen** → **Debugging starten**) in VSCode, um eine neue Sitzung mit geladenem Roo Code zu öffnen. Änderungen an der Webansicht erscheinen sofort. Änderungen an der Kern-Erweiterung erfordern einen Neustart des Erweiterungs-Hosts. -Alternativ können Sie eine .vsix-Datei erstellen und direkt in VSCode installieren: +Alternativ kannst du eine .vsix-Datei erstellen und direkt in VSCode installieren: ```sh npm run build @@ -67,46 +128,46 @@ code --install-extension bin/roo-cline-.vsix ## Code schreiben und einreichen -Jeder kann Code zu Roo Code beitragen, aber wir bitten Sie, diese Richtlinien zu befolgen, um sicherzustellen, dass Ihre Beiträge reibungslos integriert werden können: +Jeder kann Code zu Roo Code beitragen, aber wir bitten dich, diese Richtlinien zu befolgen, um sicherzustellen, dass deine Beiträge reibungslos integriert werden können: 1. **Halten Sie Pull Requests fokussiert** - - Beschränken Sie PRs auf eine einzelne Funktion oder Fehlerbehebung - - Teilen Sie größere Änderungen in kleinere, zusammenhängende PRs auf - - Unterteilen Sie Änderungen in logische Commits, die unabhängig überprüft werden können + - Beschränke PRs auf eine einzelne Funktion oder Fehlerbehebung + - Teile größere Änderungen in kleinere, zusammenhängende PRs auf + - Unterteile Änderungen in logische Commits, die unabhängig überprüft werden können 2. **Codequalität** - Alle PRs müssen CI-Prüfungen bestehen, die sowohl Linting als auch Formatierung umfassen - - Beheben Sie alle ESLint-Warnungen oder -Fehler vor dem Einreichen - - Reagieren Sie auf alle Rückmeldungen von Ellipsis, unserem automatisierten Code-Review-Tool - - Folgen Sie TypeScript-Best-Practices und halten Sie die Typsicherheit aufrecht + - Behebe alle ESLint-Warnungen oder -Fehler vor dem Einreichen + - Reagiere auf alle Rückmeldungen von Ellipsis, unserem automatisierten Code-Review-Tool + - Folge TypeScript-Best-Practices und halte die Typsicherheit aufrecht 3. **Testen** - - Fügen Sie Tests für neue Funktionen hinzu - - Führen Sie `npm test` aus, um sicherzustellen, dass alle Tests bestanden werden - - Aktualisieren Sie bestehende Tests, wenn Ihre Änderungen diese beeinflussen - - Schließen Sie sowohl Unit-Tests als auch Integrationstests ein, wo angemessen + - Füge Tests für neue Funktionen hinzu + - Führe `npm test` aus, um sicherzustellen, dass alle Tests bestanden werden + - Aktualisiere bestehende Tests, wenn deine Änderungen diese beeinflussen + - Schließe sowohl Unit-Tests als auch Integrationstests ein, wo angemessen 4. **Commit-Richtlinien** - - Schreiben Sie klare, beschreibende Commit-Nachrichten - - Verweisen Sie auf relevante Issues in Commits mit #issue-nummer + - Schreibe klare, beschreibende Commit-Nachrichten + - Verweise auf relevante Issues in Commits mit #issue-nummer 5. **Vor dem Einreichen** - - Rebasen Sie Ihren Branch auf den neuesten main-Branch - - Stellen Sie sicher, dass Ihr Branch erfolgreich baut - - Überprüfen Sie erneut, dass alle Tests bestanden werden - - Prüfen Sie Ihre Änderungen auf Debug-Code oder Konsolenausgaben + - Rebase deinen Branch auf den neuesten main-Branch + - Stelle sicher, dass dein Branch erfolgreich baut + - Überprüfe erneut, dass alle Tests bestanden werden + - Prüfe deine Änderungen auf Debug-Code oder Konsolenausgaben 6. **Pull Request Beschreibung** - - Beschreiben Sie klar, was Ihre Änderungen bewirken - - Fügen Sie Schritte zum Testen der Änderungen hinzu - - Listen Sie alle Breaking Changes auf - - Fügen Sie Screenshots für UI-Änderungen hinzu + - Beschreibe klar, was deine Änderungen bewirken + - Füge Schritte zum Testen der Änderungen hinzu + - Liste alle Breaking Changes auf + - Füge Screenshots für UI-Änderungen hinzu ## Beitragsvereinbarung -Durch das Einreichen eines Pull Requests stimmen Sie zu, dass Ihre Beiträge unter derselben Lizenz wie das Projekt ([Apache 2.0](../LICENSE)) lizenziert werden. +Durch das Einreichen eines Pull Requests stimmst du zu, dass deine Beiträge unter derselben Lizenz wie das Projekt ([Apache 2.0](../LICENSE)) lizenziert werden. diff --git a/locales/es/CONTRIBUTING.md b/locales/es/CONTRIBUTING.md index bdab5f64a5a..14cf3a96f36 100644 --- a/locales/es/CONTRIBUTING.md +++ b/locales/es/CONTRIBUTING.md @@ -26,7 +26,68 @@ Estamos encantados de que estés interesado en contribuir a Roo Code. Ya sea que ¡También damos la bienvenida a contribuciones a nuestra [documentación](https://docs.roocode.com/)! Ya sea arreglando errores tipográficos, mejorando guías existentes o creando nuevo contenido educativo - nos encantaría construir un repositorio de recursos impulsado por la comunidad que ayude a todos a sacar el máximo provecho de Roo Code. Puedes hacer clic en "Edit this page" en cualquier página para llegar rápidamente al lugar correcto en Github para editar el archivo, o puedes ir directamente a https://github.com/RooVetGit/Roo-Code-Docs. -Si estás planeando trabajar en una función más grande, por favor crea una [solicitud de función](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) primero para que podamos discutir si se alinea con la visión de Roo Code. +Si estás planeando trabajar en una función más grande, por favor crea una [solicitud de función](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) primero para que podamos discutir si se alinea con la visión de Roo Code. También puedes consultar nuestra [Hoja de Ruta del Proyecto](#hoja-de-ruta-del-proyecto) a continuación para ver si tu idea encaja con nuestra dirección estratégica. + +## Hoja de Ruta del Proyecto + +Roo Code tiene una hoja de ruta de desarrollo clara que guía nuestras prioridades y dirección futura. Entender nuestra hoja de ruta puede ayudarte a: + +- Alinear tus contribuciones con los objetivos del proyecto +- Identificar áreas donde tu experiencia sería más valiosa +- Entender el contexto detrás de ciertas decisiones de diseño +- Encontrar inspiración para nuevas funciones que apoyen nuestra visión + +Nuestra hoja de ruta actual se centra en seis pilares clave: + +### Soporte de Proveedores + +Nuestro objetivo es dar soporte a tantos proveedores como sea posible: + +- Soporte más versátil para "OpenAI Compatible" +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Soporte mejorado para Ollama y LM Studio + +### Soporte de Modelos + +Queremos que Roo funcione bien con tantos modelos como sea posible, incluidos los modelos locales: + +- Soporte para modelos locales a través de system prompting personalizado y flujos de trabajo +- Evaluaciones de benchmarking y casos de prueba + +### Soporte de Sistemas + +Queremos que Roo funcione bien en el ordenador de todos: + +- Integración de terminal multiplataforma +- Soporte sólido y consistente para Mac, Windows y Linux + +### Documentación + +Queremos una documentación completa y accesible para todos los usuarios y colaboradores: + +- Guías de usuario y tutoriales ampliados +- Documentación clara de la API +- Mejor orientación para colaboradores +- Recursos de documentación multilingües +- Ejemplos interactivos y muestras de código + +### Estabilidad + +Queremos disminuir significativamente el número de errores y aumentar las pruebas automatizadas: + +- Interruptor de registro de depuración +- Botón de copia de "Información de Máquina/Tarea" para enviar con solicitudes de soporte/errores + +### Internacionalización + +Queremos que Roo hable el idioma de todos: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +Damos especialmente la bienvenida a contribuciones que avancen nuestros objetivos de la hoja de ruta. Si estás trabajando en algo que se alinea con estos pilares, por favor menciónalo en la descripción de tu PR. ## Configuración de desarrollo diff --git a/locales/fr/CONTRIBUTING.md b/locales/fr/CONTRIBUTING.md index eb9059f8fb9..fdb4796a272 100644 --- a/locales/fr/CONTRIBUTING.md +++ b/locales/fr/CONTRIBUTING.md @@ -26,7 +26,68 @@ Vous cherchez une bonne première contribution ? Consultez les issues dans la se Nous accueillons également les contributions à notre [documentation](https://docs.roocode.com/) ! Qu'il s'agisse de corriger des fautes de frappe, d'améliorer les guides existants ou de créer du nouveau contenu éducatif - nous aimerions construire un référentiel de ressources guidé par la communauté qui aide chacun à tirer le meilleur parti de Roo Code. Vous pouvez cliquer sur "Edit this page" sur n'importe quelle page pour accéder rapidement au bon endroit dans Github pour éditer le fichier, ou vous pouvez plonger directement dans https://github.com/RooVetGit/Roo-Code-Docs. -Si vous prévoyez de travailler sur une fonctionnalité plus importante, veuillez d'abord créer une [demande de fonctionnalité](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) afin que nous puissions discuter si elle s'aligne avec la vision de Roo Code. +Si vous prévoyez de travailler sur une fonctionnalité plus importante, veuillez d'abord créer une [demande de fonctionnalité](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) afin que nous puissions discuter si elle s'aligne avec la vision de Roo Code. Vous pouvez également consulter notre [Feuille de route du projet](#feuille-de-route-du-projet) ci-dessous pour voir si votre idée s'inscrit dans notre orientation stratégique. + +## Feuille de route du projet + +Roo Code dispose d'une feuille de route de développement claire qui guide nos priorités et notre orientation future. Comprendre notre feuille de route peut vous aider à : + +- Aligner vos contributions avec les objectifs du projet +- Identifier les domaines où votre expertise serait la plus précieuse +- Comprendre le contexte derrière certaines décisions de conception +- Trouver de l'inspiration pour de nouvelles fonctionnalités qui soutiennent notre vision + +Notre feuille de route actuelle se concentre sur six piliers clés : + +### Support des fournisseurs + +Nous visons à prendre en charge autant de fournisseurs que possible : + +- Support plus polyvalent pour "OpenAI Compatible" +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Support amélioré pour Ollama et LM Studio + +### Support des modèles + +Nous voulons que Roo fonctionne aussi bien que possible avec autant de modèles que possible, y compris les modèles locaux : + +- Support des modèles locaux via des prompts système personnalisés et des flux de travail +- Évaluations de benchmarking et cas de test + +### Support des systèmes + +Nous voulons que Roo fonctionne bien sur l'ordinateur de chacun : + +- Intégration de terminal multiplateforme +- Support solide et cohérent pour Mac, Windows et Linux + +### Documentation + +Nous voulons une documentation complète et accessible pour tous les utilisateurs et contributeurs : + +- Guides utilisateur et tutoriels étendus +- Documentation API claire +- Meilleure orientation pour les contributeurs +- Ressources de documentation multilingues +- Exemples interactifs et échantillons de code + +### Stabilité + +Nous voulons réduire considérablement le nombre de bugs et augmenter les tests automatisés : + +- Interrupteur de journalisation de débogage +- Bouton de copie "Informations machine/tâche" pour l'envoi avec les demandes de support/bug + +### Internationalisation + +Nous voulons que Roo parle la langue de tous : + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +Nous accueillons particulièrement les contributions qui font progresser nos objectifs de feuille de route. Si vous travaillez sur quelque chose qui s'aligne avec ces piliers, veuillez le mentionner dans la description de votre PR. ## Configuration de Développement diff --git a/locales/hi/CONTRIBUTING.md b/locales/hi/CONTRIBUTING.md index a1ffdafc1b6..9f388c295f8 100644 --- a/locales/hi/CONTRIBUTING.md +++ b/locales/hi/CONTRIBUTING.md @@ -26,7 +26,68 @@ हम अपने [दस्तावेज़ीकरण](https://docs.roocode.com/) में योगदान का भी स्वागत करते हैं! चाहे वह टाइपो ठीक करना हो, मौजूदा गाइड को सुधारना हो, या नई शैक्षिक सामग्री बनाना हो - हम संसाधनों का एक समुदाय-संचालित भंडार बनाना चाहते हैं जो हर किसी को Roo Code का अधिकतम उपयोग करने में मदद करे। आप फ़ाइल को संपादित करने के लिए किसी भी पृष्ठ पर "Edit this page" पर क्लिक कर सकते हैं या सीधे https://github.com/RooVetGit/Roo-Code-Docs में जा सकते हैं। -यदि आप एक बड़ी विशेषता पर काम करने की योजना बना रहे हैं, तो कृपया पहले एक [फीचर अनुरोध](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) बनाएं ताकि हम चर्चा कर सकें कि क्या यह Roo Code के दृष्टिकोण के अनुरूप है। +यदि आप एक बड़ी विशेषता पर काम करने की योजना बना रहे हैं, तो कृपया पहले एक [फीचर अनुरोध](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) बनाएं ताकि हम चर्चा कर सकें कि क्या यह Roo Code के दृष्टिकोण के अनुरूप है। आप नीचे दिए गए हमारे [प्रोजेक्ट रोडमैप](#प्रोजेक्ट-रोडमैप) को भी देख सकते हैं यह जानने के लिए कि क्या आपका विचार हमारी रणनीतिक दिशा के अनुरूप है। + +## प्रोजेक्ट रोडमैप + +Roo Code का एक स्पष्ट विकास रोडमैप है जो हमारी प्राथमिकताओं और भविष्य की दिशा का मार्गदर्शन करता है। हमारे रोडमैप को समझने से आपको मदद मिल सकती है: + +- अपने योगदान को प्रोजेक्ट के लक्ष्यों के साथ संरेखित करना +- ऐसे क्षेत्रों की पहचान करना जहां आपकी विशेषज्ञता सबसे मूल्यवान होगी +- कुछ डिज़ाइन निर्णयों के पीछे के संदर्भ को समझना +- नई विशेषताओं के लिए प्रेरणा पाना जो हमारे दृष्टिकोण का समर्थन करती हैं + +हमारा वर्तमान रोडमैप छह प्रमुख स्तंभों पर केंद्रित है: + +### प्रोवाइडर सपोर्ट + +हम जितने संभव हो सके उतने प्रोवाइडर्स को सपोर्ट करना चाहते हैं: + +- "OpenAI Compatible" के लिए अधिक बहुमुखी समर्थन +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Ollama और LM Studio के लिए बेहतर समर्थन + +### मॉडल सपोर्ट + +हम चाहते हैं कि Roo जितना संभव हो उतने मॉडल पर अच्छी तरह से काम करे, जिसमें लोकल मॉडल भी शामिल हैं: + +- कस्टम सिस्टम प्रॉम्प्टिंग और वर्कफ़्लोज़ के माध्यम से लोकल मॉडल सपोर्ट +- बेंचमार्किंग एवैल्युएशन और टेस्ट केस + +### सिस्टम सपोर्ट + +हम चाहते हैं कि Roo हर किसी के कंप्यूटर पर अच्छी तरह से चले: + +- क्रॉस प्लेटफॉर्म टर्मिनल इंटीग्रेशन +- Mac, Windows और Linux के लिए मजबूत और सुसंगत समर्थन + +### डॉक्युमेंटेशन + +हम सभी उपयोगकर्ताओं और योगदानकर्ताओं के लिए व्यापक, सुलभ दस्तावेज़ीकरण चाहते हैं: + +- विस्तारित उपयोगकर्ता गाइड और ट्यूटोरियल +- स्पष्ट API दस्तावेज़ीकरण +- योगदानकर्ताओं के लिए बेहतर मार्गदर्शन +- बहुभाषी दस्तावेज़ीकरण संसाधन +- इंटरैक्टिव उदाहरण और कोड सैंपल + +### स्थिरता + +हम बग की संख्या को काफी कम करना और स्वचालित परीक्षण को बढ़ाना चाहते हैं: + +- डीबग लॉगिंग स्विच +- बग/सपोर्ट अनुरोधों के साथ भेजने के लिए "मशीन/टास्क इन्फॉर्मेशन" कॉपी बटन + +### अंतर्राष्ट्रीयकरण + +हम चाहते हैं कि Roo हर किसी की भाषा बोले: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +हम विशेष रूप से उन योगदानों का स्वागत करते हैं जो हमारे रोडमैप लक्ष्यों को आगे बढ़ाते हैं। यदि आप कुछ ऐसा कर रहे हैं जो इन स्तंभों के अनुरूप है, तो कृपया अपने PR विवरण में इसका उल्लेख करें। ## डेवलपमेंट सेटअप diff --git a/locales/it/CONTRIBUTING.md b/locales/it/CONTRIBUTING.md index 30cc4f69114..9e6ca151113 100644 --- a/locales/it/CONTRIBUTING.md +++ b/locales/it/CONTRIBUTING.md @@ -26,7 +26,68 @@ Cerchi un buon primo contributo? Controlla i problemi nella sezione "Issue [Unas Accogliamo anche contributi alla nostra [documentazione](https://docs.roocode.com/)! Che si tratti di correggere errori di battitura, migliorare guide esistenti o creare nuovi contenuti educativi - ci piacerebbe costruire un repository di risorse guidato dalla comunità che aiuti tutti a ottenere il massimo da Roo Code. Puoi cliccare su "Edit this page" su qualsiasi pagina per arrivare rapidamente al punto giusto in Github per modificare il file, oppure puoi andare direttamente a https://github.com/RooVetGit/Roo-Code-Docs. -Se stai pianificando di lavorare su una funzionalità più grande, per favore crea prima una [richiesta di funzionalità](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) così possiamo discutere se si allinea con la visione di Roo Code. +Se stai pianificando di lavorare su una funzionalità più grande, per favore crea prima una [richiesta di funzionalità](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) così possiamo discutere se si allinea con la visione di Roo Code. Puoi anche consultare la nostra [Roadmap del Progetto](#roadmap-del-progetto) qui sotto per vedere se la tua idea si adatta alla nostra direzione strategica. + +## Roadmap del Progetto + +Roo Code ha una chiara roadmap di sviluppo che guida le nostre priorità e la direzione futura. Comprendere la nostra roadmap può aiutarti a: + +- Allineare i tuoi contributi con gli obiettivi del progetto +- Identificare aree in cui la tua esperienza sarebbe più preziosa +- Comprendere il contesto dietro certe decisioni di design +- Trovare ispirazione per nuove funzionalità che supportino la nostra visione + +La nostra roadmap attuale si concentra su sei pilastri chiave: + +### Supporto Provider + +Miriamo a supportare quanti più provider possibile: + +- Supporto più versatile per "OpenAI Compatible" +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Supporto migliorato per Ollama e LM Studio + +### Supporto Modelli + +Vogliamo che Roo funzioni al meglio su quanti più modelli possibile, inclusi i modelli locali: + +- Supporto per modelli locali attraverso prompt di sistema personalizzati e flussi di lavoro +- Valutazioni di benchmark e casi di test + +### Supporto Sistemi + +Vogliamo che Roo funzioni bene sul computer di tutti: + +- Integrazione del terminale multipiattaforma +- Supporto forte e coerente per Mac, Windows e Linux + +### Documentazione + +Vogliamo una documentazione completa e accessibile per tutti gli utenti e contributori: + +- Guide utente e tutorial ampliati +- Documentazione API chiara +- Migliore orientamento per i contributori +- Risorse di documentazione multilingue +- Esempi interattivi e campioni di codice + +### Stabilità + +Vogliamo ridurre significativamente il numero di bug e aumentare i test automatizzati: + +- Interruttore di registrazione debug +- Pulsante di copia "Informazioni Macchina/Attività" per l'invio con richieste di supporto/bug + +### Internazionalizzazione + +Vogliamo che Roo parli la lingua di tutti: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +Accogliamo particolarmente i contributi che fanno progredire gli obiettivi della nostra roadmap. Se stai lavorando su qualcosa che si allinea con questi pilastri, per favore menzionalo nella descrizione della tua PR. ## Configurazione per lo Sviluppo diff --git a/locales/ja/CONTRIBUTING.md b/locales/ja/CONTRIBUTING.md index 54183588e56..42be40e33d2 100644 --- a/locales/ja/CONTRIBUTING.md +++ b/locales/ja/CONTRIBUTING.md @@ -26,7 +26,68 @@ Roo Codeへの貢献に興味を持っていただき、ありがとうござい また、[ドキュメント](https://docs.roocode.com/)への貢献も歓迎します!タイプミスの修正、既存ガイドの改善、または新しい教育コンテンツの作成など、Roo Codeを最大限に活用するためのコミュニティ主導のリソースリポジトリの構築を目指しています。任意のページで「Edit this page」をクリックすると、ファイルを編集するためのGithubの適切な場所にすぐに移動できます。または、https://github.com/RooVetGit/Roo-Code-Docs に直接アクセスすることもできます。 -より大きな機能に取り組む予定がある場合は、Roo Codeのビジョンに合致するかどうかを議論するために、まず[機能リクエスト](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop)を作成してください。 +より大きな機能に取り組む予定がある場合は、Roo Codeのビジョンに合致するかどうかを議論するために、まず[機能リクエスト](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop)を作成してください。また、アイデアが私たちの戦略的方向性に合っているかどうかを確認するために、下記の[プロジェクトロードマップ](#プロジェクトロードマップ)をチェックすることもできます。 + +## プロジェクトロードマップ + +Roo Codeには、私たちの優先事項と将来の方向性を導く明確な開発ロードマップがあります。私たちのロードマップを理解することで、以下のような助けになります: + +- あなたの貢献をプロジェクトの目標に合わせる +- あなたの専門知識が最も価値がある領域を特定する +- 特定のデザイン決定の背景を理解する +- 私たちのビジョンをサポートする新機能のインスピレーションを得る + +現在のロードマップは、6つの主要な柱に焦点を当てています: + +### プロバイダーサポート + +できるだけ多くのプロバイダーをサポートすることを目指しています: + +- より汎用的な「OpenAI互換」サポート +- xAI、Microsoft Azure AI、Alibaba Cloud Qwen、IBM Watsonx、Together AI、DeepInfra、Fireworks AI、Cohere、Perplexity AI、FriendliAI、Replicate +- OllamaとLM Studioの強化されたサポート + +### モデルサポート + +ローカルモデルを含め、できるだけ多くのモデルでRooが良好に動作することを望んでいます: + +- カスタムシステムプロンプティングとワークフローを通じたローカルモデルサポート +- ベンチマーク評価とテストケース + +### システムサポート + +Rooが誰のコンピュータでも良好に動作することを望んでいます: + +- クロスプラットフォームターミナル統合 +- Mac、Windows、Linuxの強力で一貫したサポート + +### ドキュメンテーション + +すべてのユーザーと貢献者のための包括的でアクセスしやすいドキュメントを望んでいます: + +- 拡張されたユーザーガイドとチュートリアル +- 明確なAPIドキュメント +- 貢献者のためのより良いガイダンス +- 多言語ドキュメントリソース +- インタラクティブな例とコードサンプル + +### 安定性 + +バグの数を大幅に減らし、自動テストを増やすことを望んでいます: + +- デバッグロギングスイッチ +- バグ/サポートリクエストと一緒に送信するための「マシン/タスク情報」コピーボタン + +### 国際化 + +Rooが誰の言語も話すことを望んでいます: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +私たちは特に、ロードマップの目標を前進させる貢献を歓迎します。これらの柱に沿った何かに取り組んでいる場合は、PRの説明でそれについて言及してください。 ## 開発のセットアップ diff --git a/locales/ko/CONTRIBUTING.md b/locales/ko/CONTRIBUTING.md index 256399ca933..342fcbc4512 100644 --- a/locales/ko/CONTRIBUTING.md +++ b/locales/ko/CONTRIBUTING.md @@ -27,7 +27,68 @@ Roo Code에 기여하는 데 관심을 가져주셔서 기쁩니다. 버그를 우리는 [문서](https://docs.roocode.com/)에 대한 기여도 환영합니다! 오타 수정, 기존 가이드 개선 또는 새로운 교육 콘텐츠 생성 등 - 모든 사람이 Roo Code를 최대한 활용할 수 있도록 도와주는 커뮤니티 기반 리소스 저장소를 구축하고 싶습니다. 모든 페이지에서 "Edit this page"를 클릭하여 파일을 편집할 수 있는 Github의 적절한 위치로 빠르게 이동하거나, https://github.com/RooVetGit/Roo-Code-Docs에 직접 접근할 수 있습니다. -더 큰 기능 작업을 계획하고 있다면, Roo Code의 비전과 일치하는지 논의할 수 있도록 먼저 [기능 요청](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop)을 생성해주세요. +더 큰 기능 작업을 계획하고 있다면, Roo Code의 비전과 일치하는지 논의할 수 있도록 먼저 [기능 요청](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop)을 생성해주세요. 또한 아이디어가 우리의 전략적 방향과 일치하는지 확인하기 위해 아래의 [프로젝트 로드맵](#프로젝트-로드맵)을 확인할 수도 있습니다. + +## 프로젝트 로드맵 + +Roo Code는 우리의 우선순위와 미래 방향을 안내하는 명확한 개발 로드맵을 가지고 있습니다. 우리의 로드맵을 이해하면 다음과 같은 도움을 받을 수 있습니다: + +- 프로젝트 목표에 맞게 기여 조정 +- 당신의 전문 지식이 가장 가치 있는 영역 식별 +- 특정 디자인 결정 배경 이해 +- 우리의 비전을 지원하는 새로운 기능에 대한 영감 찾기 + +현재 로드맵은 여섯 가지 주요 기둥에 초점을 맞추고 있습니다: + +### 제공업체 지원 + +가능한 한 많은 제공업체를 지원하는 것을 목표로 합니다: + +- 더 다재다능한 "OpenAI 호환" 지원 +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Ollama와 LM Studio에 대한 향상된 지원 + +### 모델 지원 + +로컬 모델을 포함하여 가능한 한 많은 모델에서 Roo가 잘 작동하기를 원합니다: + +- 사용자 정의 시스템 프롬프팅 및 워크플로우를 통한 로컬 모델 지원 +- 벤치마킹 평가 및 테스트 케이스 + +### 시스템 지원 + +Roo가 모든 사람의 컴퓨터에서 잘 작동하기를 원합니다: + +- 크로스 플랫폼 터미널 통합 +- Mac, Windows 및 Linux에 대한 강력하고 일관된 지원 + +### 문서화 + +모든 사용자와 기여자를 위한 포괄적이고 접근 가능한 문서를 원합니다: + +- 확장된 사용자 가이드 및 튜토리얼 +- 명확한 API 문서 +- 기여자를 위한 더 나은 가이드 +- 다국어 문서 리소스 +- 대화형 예제 및 코드 샘플 + +### 안정성 + +버그 수를 크게 줄이고 자동화된 테스트를 증가시키고자 합니다: + +- 디버그 로깅 스위치 +- 버그/지원 요청과 함께 보낼 수 있는 "기기/작업 정보" 복사 버튼 + +### 국제화 + +Roo가 모든 사람의 언어를 말하기를 원합니다: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +우리는 특히 로드맵 목표를 발전시키는 기여를 환영합니다. 이러한 기둥에 맞는 작업을 하고 있다면, PR 설명에서 이를 언급해 주세요. ## 개발 설정 diff --git a/locales/pl/CONTRIBUTING.md b/locales/pl/CONTRIBUTING.md index 3d338d1ce0f..b669cb2f2ce 100644 --- a/locales/pl/CONTRIBUTING.md +++ b/locales/pl/CONTRIBUTING.md @@ -26,7 +26,68 @@ Szukasz dobrego pierwszego wkładu? Sprawdź problemy w sekcji "Issue [Unassigne Cieszymy się również z wkładu do naszej [dokumentacji](https://docs.roocode.com/)! Czy to poprawianie literówek, ulepszanie istniejących przewodników, czy tworzenie nowych treści edukacyjnych - chcielibyśmy zbudować repozytorium zasobów napędzane przez społeczność, które pomaga każdemu czerpać maksimum z Roo Code. Możesz kliknąć "Edit this page" na dowolnej stronie, aby szybko przejść do odpowiedniego miejsca w Github, aby edytować plik, lub możesz przejść bezpośrednio do https://github.com/RooVetGit/Roo-Code-Docs. -Jeśli planujesz pracować nad większą funkcją, proszę najpierw utwórz [prośbę o funkcję](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop), abyśmy mogli przedyskutować, czy jest ona zgodna z wizją Roo Code. +Jeśli planujesz pracować nad większą funkcją, proszę najpierw utwórz [prośbę o funkcję](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop), abyśmy mogli przedyskutować, czy jest ona zgodna z wizją Roo Code. Możesz również sprawdzić naszą [Mapę Drogową Projektu](#mapa-drogowa-projektu) poniżej, aby zobaczyć, czy Twój pomysł pasuje do naszego strategicznego kierunku. + +## Mapa Drogowa Projektu + +Roo Code posiada jasną mapę drogową rozwoju, która kieruje naszymi priorytetami i przyszłym kierunkiem. Zrozumienie naszej mapy drogowej może pomóc Ci: + +- Dostosować swoje wkłady do celów projektu +- Zidentyfikować obszary, w których Twoja wiedza byłaby najbardziej wartościowa +- Zrozumieć kontekst stojący za pewnymi decyzjami projektowymi +- Znaleźć inspirację dla nowych funkcji, które wspierają naszą wizję + +Nasza obecna mapa drogowa koncentruje się na sześciu kluczowych filarach: + +### Wsparcie dla Dostawców + +Dążymy do wspierania jak największej liczby dostawców: + +- Bardziej wszechstronne wsparcie dla "OpenAI Compatible" +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Ulepszone wsparcie dla Ollama i LM Studio + +### Wsparcie dla Modeli + +Chcemy, aby Roo działał jak najlepiej na jak największej liczbie modeli, w tym modeli lokalnych: + +- Wsparcie dla modeli lokalnych poprzez niestandardowe promptowanie systemowe i przepływy pracy +- Benchmarki ewaluacyjne i przypadki testowe + +### Wsparcie dla Systemów + +Chcemy, aby Roo działał dobrze na komputerze każdego: + +- Integracja terminala międzyplatformowego +- Silne i spójne wsparcie dla Mac, Windows i Linux + +### Dokumentacja + +Chcemy kompleksowej, dostępnej dokumentacji dla wszystkich użytkowników i współtwórców: + +- Rozszerzone przewodniki użytkownika i tutoriale +- Jasna dokumentacja API +- Lepsze wskazówki dla współtwórców +- Wielojęzyczne zasoby dokumentacji +- Interaktywne przykłady i próbki kodu + +### Stabilność + +Chcemy znacznie zmniejszyć liczbę błędów i zwiększyć zautomatyzowane testowanie: + +- Przełącznik rejestrowania debugowania +- Przycisk kopiowania "Informacji o Maszynie/Zadaniu" do wysyłania z prośbami o pomoc/zgłoszeniami błędów + +### Internacjonalizacja + +Chcemy, aby Roo mówił językiem każdego: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +Szczególnie witamy wkłady, które przyspieszają realizację celów naszej mapy drogowej. Jeśli pracujesz nad czymś, co jest zgodne z tymi filarami, proszę wspomnij o tym w opisie swojego PR. ## Konfiguracja rozwojowa diff --git a/locales/pt-BR/CONTRIBUTING.md b/locales/pt-BR/CONTRIBUTING.md index efd19ed9d18..a3e04811b3e 100644 --- a/locales/pt-BR/CONTRIBUTING.md +++ b/locales/pt-BR/CONTRIBUTING.md @@ -26,7 +26,68 @@ Procurando uma boa primeira contribuição? Verifique as issues na seção "Issu Também damos as boas-vindas a contribuições para nossa [documentação](https://docs.roocode.com/)! Seja corrigindo erros de digitação, melhorando guias existentes ou criando novo conteúdo educacional - adoraríamos construir um repositório de recursos impulsionado pela comunidade que ajude todos a obter o máximo do Roo Code. Você pode clicar em "Edit this page" em qualquer página para ir rapidamente ao local certo no Github para editar o arquivo, ou pode mergulhar diretamente em https://github.com/RooVetGit/Roo-Code-Docs. -Se você está planejando trabalhar em um recurso maior, por favor crie primeiro uma [solicitação de recurso](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) para que possamos discutir se está alinhado com a visão do Roo Code. +Se você está planejando trabalhar em um recurso maior, por favor crie primeiro uma [solicitação de recurso](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) para que possamos discutir se está alinhado com a visão do Roo Code. Você também pode verificar nosso [Roteiro do Projeto](#roteiro-do-projeto) abaixo para ver se sua ideia se encaixa em nossa direção estratégica. + +## Roteiro do Projeto + +O Roo Code possui um roteiro de desenvolvimento claro que orienta nossas prioridades e direção futura. Entender nosso roteiro pode ajudar você a: + +- Alinhar suas contribuições com os objetivos do projeto +- Identificar áreas onde sua expertise seria mais valiosa +- Entender o contexto por trás de certas decisões de design +- Encontrar inspiração para novos recursos que apoiem nossa visão + +Nosso roteiro atual se concentra em seis pilares principais: + +### Suporte a Provedores + +Nosso objetivo é oferecer suporte a tantos provedores quanto possível: + +- Suporte mais versátil para "OpenAI Compatible" +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Suporte aprimorado para Ollama e LM Studio + +### Suporte a Modelos + +Queremos que o Roo funcione bem em tantos modelos quanto possível, incluindo modelos locais: + +- Suporte a modelos locais através de prompts de sistema personalizados e fluxos de trabalho +- Avaliações de benchmark e casos de teste + +### Suporte a Sistemas + +Queremos que o Roo funcione bem no computador de todos: + +- Integração de terminal multiplataforma +- Suporte forte e consistente para Mac, Windows e Linux + +### Documentação + +Queremos documentação abrangente e acessível para todos os usuários e colaboradores: + +- Guias de usuário e tutoriais expandidos +- Documentação clara da API +- Melhor orientação para colaboradores +- Recursos de documentação multilíngues +- Exemplos interativos e amostras de código + +### Estabilidade + +Queremos diminuir significativamente o número de bugs e aumentar os testes automatizados: + +- Interruptor de registro de depuração +- Botão de cópia "Informações de Máquina/Tarefa" para enviar com solicitações de suporte/bug + +### Internacionalização + +Queremos que o Roo fale o idioma de todos: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +Damos especialmente as boas-vindas a contribuições que avançam os objetivos do nosso roteiro. Se você estiver trabalhando em algo que se alinha com esses pilares, por favor mencione isso na descrição do seu PR. ## Configuração de Desenvolvimento diff --git a/locales/tr/CONTRIBUTING.md b/locales/tr/CONTRIBUTING.md index 2bad1c80888..39ddb8b1b76 100644 --- a/locales/tr/CONTRIBUTING.md +++ b/locales/tr/CONTRIBUTING.md @@ -26,7 +26,68 @@ Hata raporları Roo Code'u herkes için daha iyi hale getirmeye yardımcı olur! [Belgelerimize](https://docs.roocode.com/) katkıları da memnuniyetle karşılıyoruz! İster yazım hatalarını düzeltmek, mevcut kılavuzları geliştirmek veya yeni eğitim içeriği oluşturmak olsun - herkesin Roo Code'dan en iyi şekilde yararlanmasına yardımcı olan topluluk odaklı bir kaynak deposu oluşturmak istiyoruz. Dosyayı düzenlemek için Github'daki doğru yere hızlıca gitmek için herhangi bir sayfada "Edit this page" düğmesine tıklayabilir veya doğrudan https://github.com/RooVetGit/Roo-Code-Docs adresine dalabilirsiniz. -Daha büyük bir özellik üzerinde çalışmayı planlıyorsanız, lütfen önce bir [özellik isteği](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) oluşturun, böylece Roo Code'un vizyonuyla uyumlu olup olmadığını tartışabiliriz. +Daha büyük bir özellik üzerinde çalışmayı planlıyorsanız, lütfen önce bir [özellik isteği](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) oluşturun, böylece Roo Code'un vizyonuyla uyumlu olup olmadığını tartışabiliriz. Ayrıca, fikrinizin stratejik yönümüze uyup uymadığını görmek için aşağıdaki [Proje Yol Haritası](#proje-yol-haritası)'nı kontrol edebilirsiniz. + +## Proje Yol Haritası + +Roo Code, önceliklerimizi ve gelecekteki yönümüzü yönlendiren net bir geliştirme yol haritasına sahiptir. Yol haritamızı anlamak size şu konularda yardımcı olabilir: + +- Katkılarınızı proje hedefleriyle uyumlu hale getirmek +- Uzmanlığınızın en değerli olacağı alanları belirlemek +- Belirli tasarım kararlarının arkasındaki bağlamı anlamak +- Vizyonumuzu destekleyen yeni özellikler için ilham bulmak + +Mevcut yol haritamız altı temel sütun üzerine odaklanmaktadır: + +### Sağlayıcı Desteği + +Mümkün olduğunca çok sağlayıcıyı desteklemeyi hedefliyoruz: + +- Daha çok yönlü "OpenAI Uyumlu" destek +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Ollama ve LM Studio için geliştirilmiş destek + +### Model Desteği + +Roo'nun yerel modeller de dahil olmak üzere mümkün olduğunca çok modelde iyi çalışmasını istiyoruz: + +- Özel sistem yönlendirmesi ve iş akışları aracılığıyla yerel model desteği +- Kıyaslama değerlendirmeleri ve test vakaları + +### Sistem Desteği + +Roo'nun herkesin bilgisayarında iyi çalışmasını istiyoruz: + +- Çapraz platform terminal entegrasyonu +- Mac, Windows ve Linux için güçlü ve tutarlı destek + +### Dokümantasyon + +Tüm kullanıcılar ve katkıda bulunanlar için kapsamlı, erişilebilir dokümantasyon istiyoruz: + +- Genişletilmiş kullanıcı kılavuzları ve öğreticiler +- Net API dokümantasyonu +- Katkıda bulunanlar için daha iyi rehberlik +- Çok dilli dokümantasyon kaynakları +- Etkileşimli örnekler ve kod örnekleri + +### Kararlılık + +Hata sayısını önemli ölçüde azaltmak ve otomatik testleri artırmak istiyoruz: + +- Hata ayıklama günlüğü anahtarı +- Hata/destek istekleriyle birlikte göndermek için "Makine/Görev Bilgisi" kopyalama düğmesi + +### Uluslararasılaştırma + +Roo'nun herkesin dilini konuşmasını istiyoruz: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +Özellikle yol haritamızın hedeflerini ileriye taşıyan katkıları memnuniyetle karşılıyoruz. Bu sütunlarla uyumlu bir şey üzerinde çalışıyorsanız, lütfen PR açıklamanızda bundan bahsedin. ## Geliştirme Kurulumu diff --git a/locales/vi/CONTRIBUTING.md b/locales/vi/CONTRIBUTING.md index cdad58eaac3..6f4c2c74709 100644 --- a/locales/vi/CONTRIBUTING.md +++ b/locales/vi/CONTRIBUTING.md @@ -26,7 +26,68 @@ Tìm kiếm đóng góp đầu tiên tốt? Kiểm tra các vấn đề trong ph Chúng tôi cũng hoan nghênh đóng góp cho [tài liệu](https://docs.roocode.com/) của chúng tôi! Dù là sửa lỗi chính tả, cải thiện hướng dẫn hiện có, hay tạo nội dung giáo dục mới - chúng tôi muốn xây dựng một kho tài nguyên do cộng đồng thúc đẩy giúp mọi người tận dụng tối đa Roo Code. Bạn có thể nhấp vào "Edit this page" trên bất kỳ trang nào để nhanh chóng đến đúng vị trí trong Github để chỉnh sửa tệp, hoặc bạn có thể đi trực tiếp vào https://github.com/RooVetGit/Roo-Code-Docs. -Nếu bạn đang lên kế hoạch làm việc trên một tính năng lớn hơn, vui lòng tạo [yêu cầu tính năng](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) trước để chúng tôi có thể thảo luận xem nó có phù hợp với tầm nhìn của Roo Code không. +Nếu bạn đang lên kế hoạch làm việc trên một tính năng lớn hơn, vui lòng tạo [yêu cầu tính năng](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) trước để chúng tôi có thể thảo luận xem nó có phù hợp với tầm nhìn của Roo Code không. Bạn cũng có thể kiểm tra [Lộ Trình Dự Án](#lộ-trình-dự-án) bên dưới để xem liệu ý tưởng của bạn có phù hợp với định hướng chiến lược của chúng tôi không. + +## Lộ Trình Dự Án + +Roo Code có một lộ trình phát triển rõ ràng hướng dẫn các ưu tiên và định hướng tương lai của chúng tôi. Hiểu lộ trình của chúng tôi có thể giúp bạn: + +- Điều chỉnh đóng góp của bạn với mục tiêu của dự án +- Xác định các lĩnh vực mà chuyên môn của bạn sẽ có giá trị nhất +- Hiểu bối cảnh đằng sau một số quyết định thiết kế +- Tìm cảm hứng cho các tính năng mới hỗ trợ tầm nhìn của chúng tôi + +Lộ trình hiện tại của chúng tôi tập trung vào sáu trụ cột chính: + +### Hỗ Trợ Nhà Cung Cấp + +Chúng tôi hướng đến việc hỗ trợ càng nhiều nhà cung cấp càng tốt: + +- Hỗ trợ "OpenAI Compatible" linh hoạt hơn +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- Hỗ trợ nâng cao cho Ollama và LM Studio + +### Hỗ Trợ Mô Hình + +Chúng tôi muốn Roo hoạt động tốt trên càng nhiều mô hình càng tốt, bao gồm cả mô hình cục bộ: + +- Hỗ trợ mô hình cục bộ thông qua prompting hệ thống tùy chỉnh và quy trình làm việc +- Đánh giá hiệu suất và các trường hợp thử nghiệm + +### Hỗ Trợ Hệ Thống + +Chúng tôi muốn Roo chạy tốt trên máy tính của mọi người: + +- Tích hợp terminal đa nền tảng +- Hỗ trợ mạnh mẽ và nhất quán cho Mac, Windows và Linux + +### Tài Liệu + +Chúng tôi muốn tài liệu toàn diện, dễ tiếp cận cho tất cả người dùng và người đóng góp: + +- Hướng dẫn người dùng và hướng dẫn mở rộng +- Tài liệu API rõ ràng +- Hướng dẫn tốt hơn cho người đóng góp +- Tài nguyên tài liệu đa ngôn ngữ +- Ví dụ tương tác và mẫu mã + +### Ổn Định + +Chúng tôi muốn giảm đáng kể số lượng lỗi và tăng kiểm tra tự động: + +- Công tắc ghi nhật ký gỡ lỗi +- Nút sao chép "Thông Tin Máy/Nhiệm Vụ" để gửi kèm với yêu cầu hỗ trợ/lỗi + +### Quốc Tế Hóa + +Chúng tôi muốn Roo nói ngôn ngữ của mọi người: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +Chúng tôi đặc biệt hoan nghênh những đóng góp thúc đẩy mục tiêu lộ trình của chúng tôi. Nếu bạn đang làm việc trên điều gì đó phù hợp với những trụ cột này, vui lòng đề cập đến điều đó trong mô tả PR của bạn. ## Thiết Lập Phát Triển diff --git a/locales/zh-CN/CONTRIBUTING.md b/locales/zh-CN/CONTRIBUTING.md index 79673c57cc2..b5c0429bd31 100644 --- a/locales/zh-CN/CONTRIBUTING.md +++ b/locales/zh-CN/CONTRIBUTING.md @@ -26,7 +26,68 @@ 我们也欢迎对我们的[文档](https://docs.roocode.com/)做贡献!无论是修复错别字、改进现有指南,还是创建新的教育内容 - 我们希望建立一个由社区驱动的资源库,帮助每个人充分利用 Roo Code。您可以点击任何页面上的"Edit this page"快速进入 Github 中编辑文件的正确位置,或者直接访问 https://github.com/RooVetGit/Roo-Code-Docs。 -如果您计划处理更大的功能,请先创建一个[功能请求](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop),以便我们讨论它是否符合 Roo Code 的愿景。 +如果您计划处理更大的功能,请先创建一个[功能请求](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop),以便我们讨论它是否符合 Roo Code 的愿景。您还可以查看下面的[项目路线图](#项目路线图),看看您的想法是否符合我们的战略方向。 + +## 项目路线图 + +Roo Code 有一个明确的开发路线图,指导我们的优先事项和未来方向。了解我们的路线图可以帮助您: + +- 使您的贡献与项目目标保持一致 +- 确定您的专业知识最有价值的领域 +- 理解某些设计决策背后的背景 +- 为支持我们愿景的新功能找到灵感 + +我们当前的路线图专注于六个关键支柱: + +### 提供商支持 + +我们的目标是尽可能支持更多的提供商: + +- 更加多功能的 "OpenAI Compatible" 支持 +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- 增强对 Ollama 和 LM Studio 的支持 + +### 模型支持 + +我们希望 Roo 在尽可能多的模型上运行良好,包括本地模型: + +- 通过自定义系统提示和工作流程支持本地模型 +- 基准评估和测试案例 + +### 系统支持 + +我们希望 Roo 在每个人的计算机上都能良好运行: + +- 跨平台终端集成 +- 对 Mac、Windows 和 Linux 的强大一致支持 + +### 文档 + +我们希望为所有用户和贡献者提供全面、易于访问的文档: + +- 扩展的用户指南和教程 +- 清晰的 API 文档 +- 更好的贡献者指导 +- 多语言文档资源 +- 交互式示例和代码示例 + +### 稳定性 + +我们希望显著减少错误数量并增加自动化测试: + +- 调试日志开关 +- 用于发送错误/支持请求的"机器/任务信息"复制按钮 + +### 国际化 + +我们希望 Roo 能说每个人的语言: + +- 我们希望 Roo Code 说每个人的语言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +我们特别欢迎推进我们路线图目标的贡献。如果您正在处理符合这些支柱的内容,请在您的 PR 描述中提及。 ## 开发设置 diff --git a/locales/zh-TW/CONTRIBUTING.md b/locales/zh-TW/CONTRIBUTING.md index 81d583c297d..791df3f1780 100644 --- a/locales/zh-TW/CONTRIBUTING.md +++ b/locales/zh-TW/CONTRIBUTING.md @@ -26,7 +26,68 @@ 我們也歡迎對我們的[文檔](https://docs.roocode.com/)進行貢獻!無論是修正錯別字、改進現有指南,還是創建新的教育內容 - 我們希望建立一個社區驅動的資源庫,幫助每個人充分利用 Roo Code。您可以點擊任何頁面上的 "Edit this page" 快速進入 Github 中編輯文件的正確位置,或者您可以直接進入 https://github.com/RooVetGit/Roo-Code-Docs。 -如果您計劃從事更大的功能開發,請先創建一個[功能請求](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop),這樣我們可以討論它是否符合 Roo Code 的願景。 +如果您計劃從事更大的功能開發,請先創建一個[功能請求](https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop),這樣我們可以討論它是否符合 Roo Code 的願景。您也可以查看下方的[專案路線圖](#專案路線圖),看看您的想法是否符合我們的策略方向。 + +## 專案路線圖 + +Roo Code 有一個明確的開發路線圖,指導我們的優先事項和未來方向。了解我們的路線圖可以幫助您: + +- 使您的貢獻與專案目標保持一致 +- 識別您的專業知識最有價值的領域 +- 理解某些設計決策背後的背景 +- 為支持我們願景的新功能找到靈感 + +我們當前的路線圖專注於六個關鍵支柱: + +### 提供商支援 + +我們的目標是支援儘可能多的提供商: + +- 更加多功能的 "OpenAI Compatible" 支援 +- xAI, Microsoft Azure AI, Alibaba Cloud Qwen, IBM Watsonx, Together AI, DeepInfra, Fireworks AI, Cohere, Perplexity AI, FriendliAI, Replicate +- 增強對 Ollama 和 LM Studio 的支援 + +### 模型支援 + +我們希望 Roo 在儘可能多的模型上運行良好,包括本地模型: + +- 透過自訂系統提示和工作流程支援本地模型 +- 基準評估和測試案例 + +### 系統支援 + +我們希望 Roo 在每個人的電腦上都能良好運行: + +- 跨平台終端整合 +- 對 Mac、Windows 和 Linux 的強大一致支援 + +### 文檔 + +我們希望為所有用戶和貢獻者提供全面、易於存取的文檔: + +- 擴展的用戶指南和教程 +- 清晰的 API 文檔 +- 更好的貢獻者指導 +- 多語言文檔資源 +- 互動式示例和代碼示例 + +### 穩定性 + +我們希望顯著減少錯誤數量並增加自動化測試: + +- 調試日誌開關 +- 用於發送錯誤/支援請求的「機器/任務資訊」複製按鈕 + +### 國際化 + +我們希望 Roo 能說每個人的語言: + +- 我們希望 Roo Code 說每個人的語言 +- Queremos que Roo Code hable el idioma de todos +- हम चाहते हैं कि Roo Code हर किसी की भाषा बोले +- نريد أن يتحدث Roo Code لغة الجميع + +我們特別歡迎推進我們路線圖目標的貢獻。如果您正在處理符合這些支柱的內容,請在您的 PR 描述中提及。 ## 開發設置 From def40180dcfb08bd5f5e3658b610995993a03a9a Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 21 Mar 2025 15:47:13 -0400 Subject: [PATCH 08/66] Don't do partial reads on binary files (#1886) --- src/core/Cline.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index b7bfc021183..20af9ee565c 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -82,6 +82,7 @@ import { validateToolUse, isToolAllowedForMode, ToolName } from "./mode-validato import { parseXml } from "../utils/xml" import { readLines } from "../integrations/misc/read-lines" import { getWorkspacePath } from "../utils/path" +import { isBinaryFile } from "isbinaryfile" type ToolResponse = string | Array type UserContent = Array @@ -2324,6 +2325,8 @@ export class Cline extends EventEmitter { let isFileTruncated = false let sourceCodeDef = "" + const isBinary = await isBinaryFile(absolutePath).catch(() => false) + if (isRangeRead) { if (startLine === undefined) { content = addLineNumbers(await readLines(absolutePath, endLine, startLine)) @@ -2333,7 +2336,7 @@ export class Cline extends EventEmitter { startLine, ) } - } else if (totalLines > maxReadFileLine) { + } else if (!isBinary && totalLines > maxReadFileLine) { // If file is too large, only read the first maxReadFileLine lines isFileTruncated = true From 81692a43c951f2795cfa860f7c0e5f2155044e51 Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Thu, 20 Mar 2025 21:10:54 -0700 Subject: [PATCH 09/66] fix: escape section markers in apply_diff Provide support for escaping section markers so that the model can add or remove lines like: ======= by escaping them in the search or replace string: \======= A state machine tracks apply_diff markers appear in correct sequence: SEARCH -> SEPARATOR -> REPLACE. Prevents syntax corruption from interleaved or malformed blocks by validating before processing matches. If a model tries to interleave diff markers, then the state machine will return a response to the model like this so it can correct. testing shows that this works on Claude 3.5, 3.7 and gemini-2.0-flash-thinking: ```xml ERROR: Special marker '=======' found in your diff content at line 7: When removing merge conflict markers like '=======' from files, you MUST escape them in your SEARCH section by prepending a backslash (\) at the beginning of the line: CORRECT FORMAT: <<<<<<< SEARCH content before \======= <-- Note the backslash here in this example content after ======= replacement content >>>>>>> REPLACE Without escaping, the system confuses your content with diff syntax markers. You may use multiple diff blocks in a single diff request, but ANY of ONLY the following separators that occur within SEARCH or REPLACE content must be must be escaped, as follows: \<<<<<<< SEARCH \======= \>>>>>>> REPLACE ``` Fixes: #1557 Fixes: #1408 Signed-off-by: Eric Wheeler --- .../diff/strategies/multi-search-replace.ts | 95 ++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/src/core/diff/strategies/multi-search-replace.ts b/src/core/diff/strategies/multi-search-replace.ts index ad12448d046..852d3dcfbce 100644 --- a/src/core/diff/strategies/multi-search-replace.ts +++ b/src/core/diff/strategies/multi-search-replace.ts @@ -73,6 +73,7 @@ Diff format: \`\`\` + Example: Original file: @@ -128,6 +129,7 @@ def calculate_sum(items): >>>>>>> REPLACE \`\`\` + Usage: File path here @@ -139,15 +141,102 @@ Only use a single line of '=======' between search and replacement content, beca ` } + private unescapeMarkers(content: string): string { + return content + .replace(/^\\<<<<<<< SEARCH/gm, "<<<<<<< SEARCH") + .replace(/^\\=======/gm, "=======") + .replace(/^\\>>>>>>> REPLACE/gm, ">>>>>>> REPLACE") + .replace(/^\\-------/gm, "-------") + .replace(/^\\:end_line:/gm, ":end_line:") + .replace(/^\\:start_line:/gm, ":start_line:") + } + + private validateMarkerSequencing(diffContent: string): { success: boolean; error?: string } { + enum State { + START, + AFTER_SEARCH, + AFTER_SEPARATOR, + } + const state = { current: State.START, line: 0 } + + const SEARCH = "<<<<<<< SEARCH" + const SEP = "=======" + const REPLACE = ">>>>>>> REPLACE" + + const reportError = (found: string, expected: string) => ({ + success: false, + error: + `ERROR: Special marker '${found}' found in your diff content at line ${state.line}:\n` + + "\n" + + `When removing merge conflict markers like '${found}' from files, you MUST escape them\n` + + "in your SEARCH section by prepending a backslash (\\) at the beginning of the line:\n" + + "\n" + + "CORRECT FORMAT:\n\n" + + "<<<<<<< SEARCH\n" + + "content before\n" + + `\\${found} <-- Note the backslash here in this example\n` + + "content after\n" + + "=======\n" + + "replacement content\n" + + ">>>>>>> REPLACE\n" + + "\n" + + "Without escaping, the system confuses your content with diff syntax markers.\n" + + "You may use multiple diff blocks in a single diff request, but ANY of ONLY the following separators that occur within SEARCH or REPLACE content must be escaped, as follows:\n" + + `\\${SEARCH}\n` + + `\\${SEP}\n` + + `\\${REPLACE}\n`, + }) + + for (const line of diffContent.split("\n")) { + state.line++ + const marker = line.trim() + + switch (state.current) { + case State.START: + if (marker === SEP) return reportError(SEP, SEARCH) + if (marker === REPLACE) return reportError(REPLACE, SEARCH) + if (marker === SEARCH) state.current = State.AFTER_SEARCH + break + + case State.AFTER_SEARCH: + if (marker === SEARCH) return reportError(SEARCH, SEP) + if (marker === REPLACE) return reportError(REPLACE, SEP) + if (marker === SEP) state.current = State.AFTER_SEPARATOR + break + + case State.AFTER_SEPARATOR: + if (marker === SEARCH) return reportError(SEARCH, REPLACE) + if (marker === SEP) return reportError(SEP, REPLACE) + if (marker === REPLACE) state.current = State.START + break + } + } + + return state.current === State.START + ? { success: true } + : { + success: false, + error: `ERROR: Unexpected end of sequence: Expected '${state.current === State.AFTER_SEARCH ? SEP : REPLACE}' was not found.`, + } + } + async applyDiff( originalContent: string, diffContent: string, _paramStartLine?: number, _paramEndLine?: number, ): Promise { + const validseq = this.validateMarkerSequencing(diffContent) + if (!validseq.success) { + return { + success: false, + error: validseq.error!, + } + } + let matches = [ ...diffContent.matchAll( - /<<<<<<< SEARCH\n(:start_line:\s*(\d+)\n){0,1}(:end_line:\s*(\d+)\n){0,1}(-------\n){0,1}([\s\S]*?)\n?=======\n([\s\S]*?)\n?>>>>>>> REPLACE/g, + /(?>>>>>> REPLACE/g, ), ] @@ -176,6 +265,10 @@ Only use a single line of '=======' between search and replacement content, beca startLine += startLine === 0 ? 0 : delta endLine += delta + // First unescape any escaped markers in the content + searchContent = this.unescapeMarkers(searchContent) + replaceContent = this.unescapeMarkers(replaceContent) + // Strip line numbers from search and replace content if every line starts with a line number if (everyLineHasLineNumbers(searchContent) && everyLineHasLineNumbers(replaceContent)) { searchContent = stripLineNumbers(searchContent) From 1b8bac66fdd5b72bbbe3564fde5194331dc97079 Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Thu, 20 Mar 2025 21:12:37 -0700 Subject: [PATCH 10/66] fix: pass multi-block flag to getDiffStrategy in system instructions When previewing system instructions, getDiffStrategy was not receiving the MULTI_SEARCH_AND_REPLACE flag, causing the instructions to show the wrong diff strategy description. Now correctly passing the flag to ensure the proper diff strategy description is shown in system instructions. Signed-off-by: Eric Wheeler --- src/core/webview/ClineProvider.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index fc7d029cf82..6777642c2e4 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -2046,6 +2046,7 @@ export class ClineProvider extends EventEmitter implements apiConfiguration.apiModelId || apiConfiguration.openRouterModelId || "", fuzzyMatchThreshold, Experiments.isEnabled(experiments, EXPERIMENT_IDS.DIFF_STRATEGY), + Experiments.isEnabled(experiments, EXPERIMENT_IDS.MULTI_SEARCH_AND_REPLACE), ) const cwd = this.cwd From c7321b010729873de9716b831c2c0d361f4acd72 Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Thu, 20 Mar 2025 22:08:23 -0700 Subject: [PATCH 11/66] fix: reject apply_diff when search matches replace content Prevents attempting to apply diffs where search and replace content are identical, which would result in no changes being made. Instead, provide a helpful error message explaining why the operation was rejected. Fixes: #1350 Signed-off-by: Eric Wheeler --- src/core/diff/strategies/multi-search-replace.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/core/diff/strategies/multi-search-replace.ts b/src/core/diff/strategies/multi-search-replace.ts index 852d3dcfbce..238d218e627 100644 --- a/src/core/diff/strategies/multi-search-replace.ts +++ b/src/core/diff/strategies/multi-search-replace.ts @@ -275,6 +275,19 @@ Only use a single line of '=======' between search and replacement content, beca replaceContent = stripLineNumbers(replaceContent) } + // Validate that search and replace content are not identical + if (searchContent === replaceContent) { + diffResults.push({ + success: false, + error: + `Search and replace content are identical - no changes would be made\n\n` + + `Debug Info:\n` + + `- Search and replace must be different to make changes\n` + + `- Use read_file to verify the content you want to change`, + }) + continue + } + // Split content into lines, handling both \n and \r\n const searchLines = searchContent === "" ? [] : searchContent.split(/\r?\n/) const replaceLines = replaceContent === "" ? [] : replaceContent.split(/\r?\n/) From 4b3f7117460f64ebe2e3d2337841aed89105c677 Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Fri, 21 Mar 2025 19:41:41 -0700 Subject: [PATCH 12/66] fix: enforce newlines between diff section separators Require newlines between diff section markers (SEARCH, ======, REPLACE) to prevent content confusion when searching input contains separator markers. Error message mentions required marker newlines. Signed-off-by: Eric Wheeler --- .../__tests__/multi-search-replace.test.ts | 2 -- .../diff/strategies/multi-search-replace.ts | 35 +++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts index 8fc16d2303e..20bb6e8f7e0 100644 --- a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts +++ b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts @@ -980,7 +980,6 @@ function test() { :end_line:4 ------- ======= - // End of file >>>>>>> REPLACE` @@ -990,7 +989,6 @@ function test() { expect(result.content).toBe(`function test() { return true; } - // End of file`) } }) diff --git a/src/core/diff/strategies/multi-search-replace.ts b/src/core/diff/strategies/multi-search-replace.ts index 238d218e627..bf80f090528 100644 --- a/src/core/diff/strategies/multi-search-replace.ts +++ b/src/core/diff/strategies/multi-search-replace.ts @@ -234,16 +234,47 @@ Only use a single line of '=======' between search and replacement content, beca } } + /* + Regex parts: + + 1. (?:^|\n) +   Ensures the first marker starts at the beginning of the file or right after a newline. + + 2. (?>>>>>> REPLACE)(?=\n|$) +   Matches the final “>>>>>>> REPLACE” marker on its own line (and requires a following newline or the end of file). + */ + let matches = [ ...diffContent.matchAll( - /(?>>>>>> REPLACE/g, + /(?:^|\n)(?>>>>>> REPLACE)(?=\n|$)/g, ), ] if (matches.length === 0) { return { success: false, - error: `Invalid diff format - missing required sections\n\nDebug Info:\n- Expected Format: <<<<<<< SEARCH\\n:start_line: start line\\n:end_line: end line\\n-------\\n[search content]\\n=======\\n[replace content]\\n>>>>>>> REPLACE\n- Tip: Make sure to include start_line/end_line/SEARCH/REPLACE sections with correct markers`, + error: `Invalid diff format - missing required sections\n\nDebug Info:\n- Expected Format: <<<<<<< SEARCH\\n:start_line: start line\\n:end_line: end line\\n-------\\n[search content]\\n=======\\n[replace content]\\n>>>>>>> REPLACE\n- Tip: Make sure to include start_line/end_line/SEARCH/=======/REPLACE sections with correct markers on new lines`, } } // Detect line ending from original content From 2032c9e45ff41480cb643f5bfbc2d1ee59741e5b Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Fri, 21 Mar 2025 19:51:20 -0700 Subject: [PATCH 13/66] test: add validateMarkerSequencing test cases Tests valid and invalid marker sequences: - validates single and multiple complete sequences - detects out-of-order markers (separator/replace before search) - detects incorrect sequence termination - validates state transitions between SEARCH/SEP/REPLACE markers Signed-off-by: Eric Wheeler --- .../__tests__/multi-search-replace.test.ts | 589 ++++++++++-------- 1 file changed, 326 insertions(+), 263 deletions(-) diff --git a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts index 20bb6e8f7e0..a53b179d982 100644 --- a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts +++ b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts @@ -1,16 +1,64 @@ import { MultiSearchReplaceDiffStrategy } from "../multi-search-replace" describe("MultiSearchReplaceDiffStrategy", () => { - describe("exact matching", () => { + describe("validateMarkerSequencing", () => { let strategy: MultiSearchReplaceDiffStrategy beforeEach(() => { - strategy = new MultiSearchReplaceDiffStrategy(1.0, 5) // Default 1.0 threshold for exact matching, 5 line buffer for tests + strategy = new MultiSearchReplaceDiffStrategy() }) - it("should replace matching content", async () => { - const originalContent = 'function hello() {\n console.log("hello")\n}\n' - const diffContent = `test.ts + it("validates correct marker sequence", () => { + const diff = "<<<<<<< SEARCH\n" + "some content\n" + "=======\n" + "new content\n" + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("validates multiple correct marker sequences", () => { + const diff = + "<<<<<<< SEARCH\n" + + "content1\n" + + "=======\n" + + "new1\n" + + ">>>>>>> REPLACE\n\n" + + "<<<<<<< SEARCH\n" + + "content2\n" + + "=======\n" + + "new2\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("detects separator before search", () => { + const diff = "=======\n" + "content\n" + ">>>>>>> REPLACE" + const result = strategy["validateMarkerSequencing"](diff) + expect(result.success).toBe(false) + expect(result.error).toContain("'=======' found in your diff content") + }) + + it("detects replace before separator", () => { + const diff = "<<<<<<< SEARCH\n" + "content\n" + ">>>>>>> REPLACE" + const result = strategy["validateMarkerSequencing"](diff) + expect(result.success).toBe(false) + expect(result.error).toContain("'>>>>>>> REPLACE' found in your diff content") + }) + + it("detects incomplete sequence", () => { + const diff = "<<<<<<< SEARCH\n" + "content\n" + "=======\n" + "new content" + const result = strategy["validateMarkerSequencing"](diff) + expect(result.success).toBe(false) + expect(result.error).toContain("Expected '>>>>>>> REPLACE' was not found") + }) + + describe("exact matching", () => { + let strategy: MultiSearchReplaceDiffStrategy + + beforeEach(() => { + strategy = new MultiSearchReplaceDiffStrategy(1.0, 5) // Default 1.0 threshold for exact matching, 5 line buffer for tests + }) + + it("should replace matching content", async () => { + const originalContent = 'function hello() {\n console.log("hello")\n}\n' + const diffContent = `test.ts <<<<<<< SEARCH function hello() { console.log("hello") @@ -21,16 +69,16 @@ function hello() { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe('function hello() {\n console.log("hello world")\n}\n') - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe('function hello() {\n console.log("hello world")\n}\n') + } + }) - it("should match content with different surrounding whitespace", async () => { - const originalContent = "\nfunction example() {\n return 42;\n}\n\n" - const diffContent = `test.ts + it("should match content with different surrounding whitespace", async () => { + const originalContent = "\nfunction example() {\n return 42;\n}\n\n" + const diffContent = `test.ts <<<<<<< SEARCH function example() { return 42; @@ -41,16 +89,16 @@ function example() { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("\nfunction example() {\n return 43;\n}\n\n") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("\nfunction example() {\n return 43;\n}\n\n") + } + }) - it("should match content with different indentation in search block", async () => { - const originalContent = " function test() {\n return true;\n }\n" - const diffContent = `test.ts + it("should match content with different indentation in search block", async () => { + const originalContent = " function test() {\n return true;\n }\n" + const diffContent = `test.ts <<<<<<< SEARCH function test() { return true; @@ -61,16 +109,16 @@ function test() { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(" function test() {\n return false;\n }\n") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(" function test() {\n return false;\n }\n") + } + }) - it("should handle tab-based indentation", async () => { - const originalContent = "function test() {\n\treturn true;\n}\n" - const diffContent = `test.ts + it("should handle tab-based indentation", async () => { + const originalContent = "function test() {\n\treturn true;\n}\n" + const diffContent = `test.ts <<<<<<< SEARCH function test() { \treturn true; @@ -81,16 +129,16 @@ function test() { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\n\treturn false;\n}\n") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("function test() {\n\treturn false;\n}\n") + } + }) - it("should preserve mixed tabs and spaces", async () => { - const originalContent = "\tclass Example {\n\t constructor() {\n\t\tthis.value = 0;\n\t }\n\t}" - const diffContent = `test.ts + it("should preserve mixed tabs and spaces", async () => { + const originalContent = "\tclass Example {\n\t constructor() {\n\t\tthis.value = 0;\n\t }\n\t}" + const diffContent = `test.ts <<<<<<< SEARCH \tclass Example { \t constructor() { @@ -105,18 +153,18 @@ function test() { \t} >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - "\tclass Example {\n\t constructor() {\n\t\tthis.value = 1;\n\t }\n\t}", - ) - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe( + "\tclass Example {\n\t constructor() {\n\t\tthis.value = 1;\n\t }\n\t}", + ) + } + }) - it("should handle additional indentation with tabs", async () => { - const originalContent = "\tfunction test() {\n\t\treturn true;\n\t}" - const diffContent = `test.ts + it("should handle additional indentation with tabs", async () => { + const originalContent = "\tfunction test() {\n\t\treturn true;\n\t}" + const diffContent = `test.ts <<<<<<< SEARCH function test() { \treturn true; @@ -128,16 +176,16 @@ function test() { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("\tfunction test() {\n\t\t// Add comment\n\t\treturn false;\n\t}") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("\tfunction test() {\n\t\t// Add comment\n\t\treturn false;\n\t}") + } + }) - it("should preserve exact indentation characters when adding lines", async () => { - const originalContent = "\tfunction test() {\n\t\treturn true;\n\t}" - const diffContent = `test.ts + it("should preserve exact indentation characters when adding lines", async () => { + const originalContent = "\tfunction test() {\n\t\treturn true;\n\t}" + const diffContent = `test.ts <<<<<<< SEARCH \tfunction test() { \t\treturn true; @@ -150,18 +198,18 @@ function test() { \t} >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - "\tfunction test() {\n\t\t// First comment\n\t\t// Second comment\n\t\treturn true;\n\t}", - ) - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe( + "\tfunction test() {\n\t\t// First comment\n\t\t// Second comment\n\t\treturn true;\n\t}", + ) + } + }) - it("should handle Windows-style CRLF line endings", async () => { - const originalContent = "function test() {\r\n return true;\r\n}\r\n" - const diffContent = `test.ts + it("should handle Windows-style CRLF line endings", async () => { + const originalContent = "function test() {\r\n return true;\r\n}\r\n" + const diffContent = `test.ts <<<<<<< SEARCH function test() { return true; @@ -172,16 +220,16 @@ function test() { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\r\n return false;\r\n}\r\n") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("function test() {\r\n return false;\r\n}\r\n") + } + }) - it("should return false if search content does not match", async () => { - const originalContent = 'function hello() {\n console.log("hello")\n}\n' - const diffContent = `test.ts + it("should return false if search content does not match", async () => { + const originalContent = 'function hello() {\n console.log("hello")\n}\n' + const diffContent = `test.ts <<<<<<< SEARCH function hello() { console.log("wrong") @@ -192,22 +240,22 @@ function hello() { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(false) - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(false) + }) - it("should return false if diff format is invalid", async () => { - const originalContent = 'function hello() {\n console.log("hello")\n}\n' - const diffContent = `test.ts\nInvalid diff format` + it("should return false if diff format is invalid", async () => { + const originalContent = 'function hello() {\n console.log("hello")\n}\n' + const diffContent = `test.ts\nInvalid diff format` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(false) - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(false) + }) - it("should handle multiple lines with proper indentation", async () => { - const originalContent = - "class Example {\n constructor() {\n this.value = 0\n }\n\n getValue() {\n return this.value\n }\n}\n" - const diffContent = `test.ts + it("should handle multiple lines with proper indentation", async () => { + const originalContent = + "class Example {\n constructor() {\n this.value = 0\n }\n\n getValue() {\n return this.value\n }\n}\n" + const diffContent = `test.ts <<<<<<< SEARCH getValue() { return this.value @@ -220,18 +268,18 @@ function hello() { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - 'class Example {\n constructor() {\n this.value = 0\n }\n\n getValue() {\n // Add logging\n console.log("Getting value")\n return this.value\n }\n}\n', - ) - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe( + 'class Example {\n constructor() {\n this.value = 0\n }\n\n getValue() {\n // Add logging\n console.log("Getting value")\n return this.value\n }\n}\n', + ) + } + }) - it("should preserve whitespace exactly in the output", async () => { - const originalContent = " indented\n more indented\n back\n" - const diffContent = `test.ts + it("should preserve whitespace exactly in the output", async () => { + const originalContent = " indented\n more indented\n back\n" + const diffContent = `test.ts <<<<<<< SEARCH indented more indented @@ -242,16 +290,16 @@ function hello() { end >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(" modified\n still indented\n end\n") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(" modified\n still indented\n end\n") + } + }) - it("should preserve indentation when adding new lines after existing content", async () => { - const originalContent = " onScroll={() => updateHighlights()}" - const diffContent = `test.ts + it("should preserve indentation when adding new lines after existing content", async () => { + const originalContent = " onScroll={() => updateHighlights()}" + const diffContent = `test.ts <<<<<<< SEARCH onScroll={() => updateHighlights()} ======= @@ -262,17 +310,17 @@ function hello() { }} >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - " onScroll={() => updateHighlights()}\n onDragOver={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}", - ) - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe( + " onScroll={() => updateHighlights()}\n onDragOver={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}", + ) + } + }) - it("should handle varying indentation levels correctly", async () => { - const originalContent = ` + it("should handle varying indentation levels correctly", async () => { + const originalContent = ` class Example { constructor() { this.value = 0; @@ -282,7 +330,7 @@ class Example { } }`.trim() - const diffContent = `test.ts + const diffContent = `test.ts <<<<<<< SEARCH class Example { constructor() { @@ -305,11 +353,11 @@ class Example { } >>>>>>> REPLACE`.trim() - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - ` + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe( + ` class Example { constructor() { this.value = 1; @@ -320,12 +368,12 @@ class Example { } } }`.trim(), - ) - } - }) + ) + } + }) - it("should handle mixed indentation styles in the same file", async () => { - const originalContent = `class Example { + it("should handle mixed indentation styles in the same file", async () => { + const originalContent = `class Example { constructor() { this.value = 0; if (true) { @@ -333,7 +381,7 @@ class Example { } } }`.trim() - const diffContent = `test.ts + const diffContent = `test.ts <<<<<<< SEARCH constructor() { this.value = 0; @@ -351,10 +399,10 @@ class Example { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Example { + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`class Example { constructor() { this.value = 1; if (true) { @@ -363,17 +411,17 @@ class Example { } } }`) - } - }) + } + }) - it("should handle Python-style significant whitespace", async () => { - const originalContent = `def example(): + it("should handle Python-style significant whitespace", async () => { + const originalContent = `def example(): if condition: do_something() for item in items: process(item) return True`.trim() - const diffContent = `test.ts + const diffContent = `test.ts <<<<<<< SEARCH if condition: do_something() @@ -387,28 +435,28 @@ class Example { process(item) >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`def example(): + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`def example(): if condition: do_something() while items: item = items.pop() process(item) return True`) - } - }) + } + }) - it("should preserve empty lines with indentation", async () => { - const originalContent = `function test() { + it("should preserve empty lines with indentation", async () => { + const originalContent = `function test() { const x = 1; if (x) { return true; } }`.trim() - const diffContent = `test.ts + const diffContent = `test.ts <<<<<<< SEARCH const x = 1; @@ -420,10 +468,10 @@ class Example { if (x) { >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function test() { + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`function test() { const x = 1; // Check x @@ -431,18 +479,18 @@ class Example { return true; } }`) - } - }) + } + }) - it("should handle indentation when replacing entire blocks", async () => { - const originalContent = `class Test { + it("should handle indentation when replacing entire blocks", async () => { + const originalContent = `class Test { method() { if (true) { console.log("test"); } } }`.trim() - const diffContent = `test.ts + const diffContent = `test.ts <<<<<<< SEARCH method() { if (true) { @@ -461,10 +509,10 @@ class Example { } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Test { + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`class Test { method() { try { if (true) { @@ -475,11 +523,11 @@ class Example { } } }`) - } - }) + } + }) - it("should handle negative indentation relative to search content", async () => { - const originalContent = `class Example { + it("should handle negative indentation relative to search content", async () => { + const originalContent = `class Example { constructor() { if (true) { this.init(); @@ -487,7 +535,7 @@ class Example { } } }`.trim() - const diffContent = `test.ts + const diffContent = `test.ts <<<<<<< SEARCH this.init(); this.setup(); @@ -496,10 +544,10 @@ class Example { this.setup(); >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Example { + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`class Example { constructor() { if (true) { this.init(); @@ -507,39 +555,39 @@ class Example { } } }`) - } - }) + } + }) - it("should handle extreme negative indentation (no indent)", async () => { - const originalContent = `class Example { + it("should handle extreme negative indentation (no indent)", async () => { + const originalContent = `class Example { constructor() { if (true) { this.init(); } } }`.trim() - const diffContent = `test.ts + const diffContent = `test.ts <<<<<<< SEARCH this.init(); ======= this.init(); >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Example { + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`class Example { constructor() { if (true) { this.init(); } } }`) - } - }) + } + }) - it("should handle mixed indentation changes in replace block", async () => { - const originalContent = `class Example { + it("should handle mixed indentation changes in replace block", async () => { + const originalContent = `class Example { constructor() { if (true) { this.init(); @@ -548,7 +596,7 @@ this.init(); } } }`.trim() - const diffContent = `test.ts + const diffContent = `test.ts <<<<<<< SEARCH this.init(); this.setup(); @@ -559,10 +607,10 @@ this.init(); this.validate(); >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Example { + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`class Example { constructor() { if (true) { this.init(); @@ -571,11 +619,11 @@ this.init(); } } }`) - } - }) + } + }) - it("should find matches from middle out", async () => { - const originalContent = ` + it("should find matches from middle out", async () => { + const originalContent = ` function one() { return "target"; } @@ -596,20 +644,20 @@ function five() { return "target"; }`.trim() - const diffContent = `test.ts + const diffContent = `test.ts <<<<<<< SEARCH return "target"; ======= return "updated"; >>>>>>> REPLACE` - // Search around the middle (function three) - // Even though all functions contain the target text, - // it should match the one closest to line 9 first - const result = await strategy.applyDiff(originalContent, diffContent, 9, 9) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function one() { + // Search around the middle (function three) + // Even though all functions contain the target text, + // it should match the one closest to line 9 first + const result = await strategy.applyDiff(originalContent, diffContent, 9, 9) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`function one() { return "target"; } @@ -628,21 +676,21 @@ function four() { function five() { return "target"; }`) - } + } + }) }) - }) - describe("line number stripping", () => { describe("line number stripping", () => { - let strategy: MultiSearchReplaceDiffStrategy + describe("line number stripping", () => { + let strategy: MultiSearchReplaceDiffStrategy - beforeEach(() => { - strategy = new MultiSearchReplaceDiffStrategy() - }) + beforeEach(() => { + strategy = new MultiSearchReplaceDiffStrategy() + }) - it("should strip line numbers from both search and replace sections", async () => { - const originalContent = "function test() {\n return true;\n}\n" - const diffContent = `test.ts + it("should strip line numbers from both search and replace sections", async () => { + const originalContent = "function test() {\n return true;\n}\n" + const diffContent = `test.ts <<<<<<< SEARCH 1 | function test() { 2 | return true; @@ -653,16 +701,16 @@ function five() { 3 | } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\n return false;\n}\n") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("function test() {\n return false;\n}\n") + } + }) - it("should strip line numbers with leading spaces", async () => { - const originalContent = "function test() {\n return true;\n}\n" - const diffContent = `test.ts + it("should strip line numbers with leading spaces", async () => { + const originalContent = "function test() {\n return true;\n}\n" + const diffContent = `test.ts <<<<<<< SEARCH 1 | function test() { 2 | return true; @@ -673,16 +721,16 @@ function five() { 3 | } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\n return false;\n}\n") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("function test() {\n return false;\n}\n") + } + }) - it("should not strip when not all lines have numbers in either section", async () => { - const originalContent = "function test() {\n return true;\n}\n" - const diffContent = `test.ts + it("should not strip when not all lines have numbers in either section", async () => { + const originalContent = "function test() {\n return true;\n}\n" + const diffContent = `test.ts <<<<<<< SEARCH 1 | function test() { 2 | return true; @@ -693,13 +741,13 @@ function five() { 3 | } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(false) - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(false) + }) - it("should preserve content that naturally starts with pipe", async () => { - const originalContent = "|header|another|\n|---|---|\n|data|more|\n" - const diffContent = `test.ts + it("should preserve content that naturally starts with pipe", async () => { + const originalContent = "|header|another|\n|---|---|\n|data|more|\n" + const diffContent = `test.ts <<<<<<< SEARCH 1 | |header|another| 2 | |---|---| @@ -710,16 +758,16 @@ function five() { 3 | |data|updated| >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("|header|another|\n|---|---|\n|data|updated|\n") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("|header|another|\n|---|---|\n|data|updated|\n") + } + }) - it("should preserve indentation when stripping line numbers", async () => { - const originalContent = " function test() {\n return true;\n }\n" - const diffContent = `test.ts + it("should preserve indentation when stripping line numbers", async () => { + const originalContent = " function test() {\n return true;\n }\n" + const diffContent = `test.ts <<<<<<< SEARCH 1 | function test() { 2 | return true; @@ -730,16 +778,16 @@ function five() { 3 | } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(" function test() {\n return false;\n }\n") - } - }) + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(" function test() {\n return false;\n }\n") + } + }) - it("should handle different line numbers between sections", async () => { - const originalContent = "function test() {\n return true;\n}\n" - const diffContent = `test.ts + it("should handle different line numbers between sections", async () => { + const originalContent = "function test() {\n return true;\n}\n" + const diffContent = `test.ts <<<<<<< SEARCH 10 | function test() { 11 | return true; @@ -750,11 +798,26 @@ function five() { 22 | } >>>>>>> REPLACE` - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\n return false;\n}\n") - } + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("function test() {\n return false;\n}\n") + } + }) + + it("detects search marker when expecting replace", () => { + const diff = "<<<<<<< SEARCH\n" + "content\n" + "=======\n" + "new content\n" + "<<<<<<< SEARCH" + const result = strategy["validateMarkerSequencing"](diff) + expect(result.success).toBe(false) + expect(result.error).toContain("'<<<<<<< SEARCH' found in your diff content") + }) + + it("detects separator when expecting replace", () => { + const diff = "<<<<<<< SEARCH\n" + "content\n" + "=======\n" + "new content\n" + "=======" + const result = strategy["validateMarkerSequencing"](diff) + expect(result.success).toBe(false) + expect(result.error).toContain("'=======' found in your diff content") + }) }) it("should not strip content that starts with pipe but no line number", async () => { From 04854ea0489d7f7f1d97854f338b4a401f67d5fd Mon Sep 17 00:00:00 2001 From: Eric Wheeler Date: Fri, 21 Mar 2025 20:30:33 -0700 Subject: [PATCH 14/66] test: add tests for escaped marker handling in multi-search-replace Add tests that validate: - Original content with unescaped markers - Search content with escaped markers to match unescaped markers in original content - Proper validation of escaped search, separator, and replace markers in diff content - Successful application of diffs with escaped markers in search content Signed-off-by: Eric Wheeler --- .../__tests__/multi-search-replace.test.ts | 537 ++++++++++++++++++ 1 file changed, 537 insertions(+) diff --git a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts index a53b179d982..e4a52af6d4b 100644 --- a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts +++ b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts @@ -812,6 +812,543 @@ function five() { expect(result.error).toContain("'<<<<<<< SEARCH' found in your diff content") }) + it("allows escaped search marker in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + const result = strategy["validateMarkerSequencing"](diff) + expect(result.success).toBe(true) + }) + + it("allows escaped separator in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + const result = strategy["validateMarkerSequencing"](diff) + expect(result.success).toBe(true) + }) + + it("processes escaped search marker in content", async () => { + const originalContent = "before\n<<<<<<< SEARCH\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped separator in content", async () => { + const originalContent = "before\n=======\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped search marker in content", async () => { + const originalContent = "before\n<<<<<<< SEARCH\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped separator in content", async () => { + const originalContent = "before\n=======\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped search marker in content", async () => { + const originalContent = "before\n<<<<<<< SEARCH\nafter\n" + const diffContent = + "test.ts\n" + + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped search marker in content", async () => { + const originalContent = "before\n<<<<<<< SEARCH\nafter\n" + const diffContent = + "test.ts\n" + + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped separator in content", async () => { + const originalContent = "before\n=======\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped search marker in content", async () => { + const originalContent = "before\n<<<<<<< SEARCH\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped search marker in content", async () => { + const originalContent = "before\n<<<<<<< SEARCH\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped search marker in content", async () => { + const originalContent = "before\n<<<<<<< SEARCH\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped separator in content", async () => { + const originalContent = "before\n=======\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("allows escaped search marker in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("allows escaped separator in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("allows escaped search marker in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("allows escaped search marker in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("allows escaped separator in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("allows escaped replace marker in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\>>>>>>> REPLACE\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("allows escaped separator in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("allows escaped replace marker in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\>>>>>>> REPLACE\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("allows escaped replace marker in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\>>>>>>> REPLACE\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + expect(strategy["validateMarkerSequencing"](diff).success).toBe(true) + }) + + it("processes escaped search marker in content", async () => { + const originalContent = "before\n<<<<<<< SEARCH\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "replaced content\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("replaced content\n") + } + }) + + it("processes escaped replace marker in content", async () => { + const originalContent = "before\n>>>>>>> REPLACE\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\>>>>>>> REPLACE\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes multiple escaped markers in content", async () => { + const originalContent = "<<<<<<< SEARCH\n=======\n>>>>>>> REPLACE\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "\\<<<<<<< SEARCH\n" + + "\\=======\n" + + "\\>>>>>>> REPLACE\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped separator in content", async () => { + const originalContent = "before\n=======\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped search marker in content", async () => { + const originalContent = "before\n<<<<<<< SEARCH\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\<<<<<<< SEARCH\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped replace marker in content", async () => { + const originalContent = "before\n>>>>>>> REPLACE\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\>>>>>>> REPLACE\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped separator in content", async () => { + const originalContent = "before\n=======\nafter\n" + const diffContent = + "test.ts\n" + + "<<<<<<< SEARCH\n" + + "before\n" + + "\\=======\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped replace marker in content", async () => { + const originalContent = "before\n>>>>>>> REPLACE\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\>>>>>>> REPLACE\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes multiple escaped markers in content", async () => { + const originalContent = "<<<<<<< SEARCH\n=======\n>>>>>>> REPLACE\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "\\<<<<<<< SEARCH\n" + + "\\=======\n" + + "\\>>>>>>> REPLACE\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes escaped replace marker in content", async () => { + const originalContent = "before\n>>>>>>> REPLACE\nafter\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\>>>>>>> REPLACE\n" + + "after\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("processes multiple escaped markers in content", async () => { + const originalContent = "<<<<<<< SEARCH\n=======\n>>>>>>> REPLACE\n" + const diffContent = + "<<<<<<< SEARCH\n" + + "\\<<<<<<< SEARCH\n" + + "\\=======\n" + + "\\>>>>>>> REPLACE\n" + + "=======\n" + + "unchanged\n" + + ">>>>>>> REPLACE" + const result = await strategy.applyDiff(originalContent, diffContent) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe("unchanged\n") + } + }) + + it("allows escaped replace marker in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "before\n" + + "\\>>>>>>> REPLACE\n" + + "after\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + const result = strategy["validateMarkerSequencing"](diff) + expect(result.success).toBe(true) + }) + + it("allows multiple escaped markers in content", () => { + const diff = + "<<<<<<< SEARCH\n" + + "\\<<<<<<< SEARCH\n" + + "\\=======\n" + + "\\>>>>>>> REPLACE\n" + + "=======\n" + + "new content\n" + + ">>>>>>> REPLACE" + const result = strategy["validateMarkerSequencing"](diff) + expect(result.success).toBe(true) + }) + it("detects separator when expecting replace", () => { const diff = "<<<<<<< SEARCH\n" + "content\n" + "=======\n" + "new content\n" + "=======" const result = strategy["validateMarkerSequencing"](diff) From 4338f64ed9b186cb6cfa7c70b6e77b7bb48a9424 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 09:56:01 -0400 Subject: [PATCH 15/66] Update contributors list (#1884) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 4 ++-- locales/ca/README.md | 4 ++-- locales/de/README.md | 4 ++-- locales/es/README.md | 4 ++-- locales/fr/README.md | 4 ++-- locales/hi/README.md | 4 ++-- locales/it/README.md | 4 ++-- locales/ja/README.md | 4 ++-- locales/ko/README.md | 4 ++-- locales/pl/README.md | 4 ++-- locales/pt-BR/README.md | 4 ++-- locales/tr/README.md | 4 ++-- locales/vi/README.md | 4 ++-- locales/zh-CN/README.md | 4 ++-- locales/zh-TW/README.md | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 4d294faae03..f1ba1762ab3 100644 --- a/README.md +++ b/README.md @@ -182,8 +182,8 @@ Thanks to all our contributors who have helped make Roo Code better! | mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| -| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| +| NyxJae
NyxJae
| MuriloFP
MuriloFP
| hannesrudolph
hannesrudolph
| d-oit
d-oit
| punkpeye
punkpeye
| monotykamary
monotykamary
| | lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| | Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| wkordalski
wkordalski
| qdaxb
qdaxb
| feifei325
feifei325
| | RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/ca/README.md b/locales/ca/README.md index 133bd1d7601..c4e61729798 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -180,8 +180,8 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/de/README.md b/locales/de/README.md index f519c508d01..9b92ef1d0a2 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -180,8 +180,8 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/es/README.md b/locales/es/README.md index 4dc42be6fb5..1ea3222b55a 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -180,8 +180,8 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/fr/README.md b/locales/fr/README.md index 505ae5692e2..97870b160f3 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -180,8 +180,8 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/hi/README.md b/locales/hi/README.md index a8f0f07a4fe..e130502d554 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -180,8 +180,8 @@ Roo Code को बेहतर बनाने में मदद करने |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/it/README.md b/locales/it/README.md index dce5ca0362c..837d7635dba 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -180,8 +180,8 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/ja/README.md b/locales/ja/README.md index 58d8a5c8313..4711610f915 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -180,8 +180,8 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/ko/README.md b/locales/ko/README.md index 3905a68f78a..bd7040a0a67 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -180,8 +180,8 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/pl/README.md b/locales/pl/README.md index a709fd90c3b..a367e6ff13d 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -180,8 +180,8 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index d2f51447af0..00d45750309 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -180,8 +180,8 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/tr/README.md b/locales/tr/README.md index e3beed92e05..dd2e298d088 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -180,8 +180,8 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/vi/README.md b/locales/vi/README.md index 3a23b9f85ab..69240c9d3e8 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -180,8 +180,8 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 017a44e98f1..db5210f033f 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -180,8 +180,8 @@ code --install-extension bin/roo-cline-.vsix |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index bf038798984..83c12271d7d 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -180,8 +180,8 @@ code --install-extension bin/roo-cline-.vsix |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
| -|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| +|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| |lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| |Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|wkordalski
wkordalski
|qdaxb
qdaxb
|feifei325
feifei325
| |RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|pugazhendhi-m
pugazhendhi-m
| From 92dee31634039d8a7826ec961eaba986ffd38645 Mon Sep 17 00:00:00 2001 From: KJ7LNW <93454819+KJ7LNW@users.noreply.github.com> Date: Sat, 22 Mar 2025 16:01:27 -0700 Subject: [PATCH 16/66] fix: make dropdown menu background fully opaque (#1907) --- webview-ui/src/components/ui/dropdown-menu.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/components/ui/dropdown-menu.tsx b/webview-ui/src/components/ui/dropdown-menu.tsx index bce7508dd9b..3a3812bf34a 100644 --- a/webview-ui/src/components/ui/dropdown-menu.tsx +++ b/webview-ui/src/components/ui/dropdown-menu.tsx @@ -27,7 +27,7 @@ const DropdownMenuContent = React.forwardRef< "z-50 min-w-[8rem] overflow-hidden rounded-xs p-1 shadow-xs", "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", "border border-vscode-focusBorder", - "bg-vscode-dropdown-background", + "bg-vscode-dropdown-background bg-opacity-100", "text-vscode-dropdown-foreground", className, )} From 2597347e918bb25ef7f80126a17e27fa4cac4be9 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 23 Mar 2025 01:52:43 -0400 Subject: [PATCH 17/66] Use openrouter stream_options include_usage (#1905) --- .../providers/__tests__/openrouter.test.ts | 22 +++---- src/api/providers/openrouter.ts | 61 +++++-------------- 2 files changed, 24 insertions(+), 59 deletions(-) diff --git a/src/api/providers/__tests__/openrouter.test.ts b/src/api/providers/__tests__/openrouter.test.ts index 981c9ad096f..996644b07f7 100644 --- a/src/api/providers/__tests__/openrouter.test.ts +++ b/src/api/providers/__tests__/openrouter.test.ts @@ -112,6 +112,16 @@ describe("OpenRouterHandler", () => { }, ], } + // Add usage information in the stream response + yield { + id: "test-id", + choices: [{ delta: {} }], + usage: { + prompt_tokens: 10, + completion_tokens: 20, + cost: 0.001, + }, + } }, } @@ -121,17 +131,6 @@ describe("OpenRouterHandler", () => { completions: { create: mockCreate }, } as any - // Mock axios.get for generation details - ;(axios.get as jest.Mock).mockResolvedValue({ - data: { - data: { - native_tokens_prompt: 10, - native_tokens_completion: 20, - total_cost: 0.001, - }, - }, - }) - const systemPrompt = "test system prompt" const messages: Anthropic.Messages.MessageParam[] = [{ role: "user" as const, content: "test message" }] @@ -153,7 +152,6 @@ describe("OpenRouterHandler", () => { inputTokens: 10, outputTokens: 20, totalCost: 0.001, - fullResponseText: "test response", }) // Verify OpenAI client was called with correct parameters diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index 3f215bfc7c3..6d93d0b180b 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -24,11 +24,6 @@ type OpenRouterChatCompletionParams = OpenAI.Chat.ChatCompletionCreateParams & { thinking?: BetaThinkingConfigParam } -// Add custom interface for OpenRouter usage chunk. -interface OpenRouterApiStreamUsageChunk extends ApiStreamUsageChunk { - fullResponseText: string -} - export class OpenRouterHandler extends BaseProvider implements SingleCompletionHandler { protected options: ApiHandlerOptions private client: OpenAI @@ -110,7 +105,7 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH top_p: topP, messages: openAiMessages, stream: true, - include_reasoning: true, + stream_options: { include_usage: true }, // Only include provider if openRouterSpecificProvider is not "[default]". ...(this.options.openRouterSpecificProvider && this.options.openRouterSpecificProvider !== OPENROUTER_DEFAULT_PROVIDER_NAME && { @@ -122,7 +117,7 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH const stream = await this.client.chat.completions.create(completionParams) - let genId: string | undefined + let lastUsage for await (const chunk of stream as unknown as AsyncIterable) { // OpenRouter returns an error object instead of the OpenAI SDK throwing an error. @@ -132,10 +127,6 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH throw new Error(`OpenRouter API Error ${error?.code}: ${error?.message}`) } - if (!genId && chunk.id) { - genId = chunk.id - } - const delta = chunk.choices[0]?.delta if ("reasoning" in delta && delta.reasoning) { @@ -146,47 +137,23 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH fullResponseText += delta.content yield { type: "text", text: delta.content } as ApiStreamChunk } - } - - const endpoint = `${this.client.baseURL}/generation?id=${genId}` - const config: AxiosRequestConfig = { - headers: { Authorization: `Bearer ${this.options.openRouterApiKey}` }, - timeout: 3_000, + if (chunk.usage) { + lastUsage = chunk.usage + } } - let attempt = 0 - let lastError: Error | undefined - const startTime = Date.now() - - while (attempt++ < 10) { - await delay(attempt * 100) // Give OpenRouter some time to produce the generation metadata. - - try { - const response = await axios.get(endpoint, config) - const generation = response.data?.data - - yield { - type: "usage", - inputTokens: generation?.native_tokens_prompt || 0, - outputTokens: generation?.native_tokens_completion || 0, - totalCost: generation?.total_cost || 0, - fullResponseText, - } as OpenRouterApiStreamUsageChunk - - break - } catch (error: unknown) { - if (error instanceof Error) { - lastError = error - } - } + if (lastUsage) { + yield this.processUsageMetrics(lastUsage) } + } - if (lastError) { - console.error( - `Failed to fetch OpenRouter generation details after attempt #${attempt} (${Date.now() - startTime}ms) [${genId}]`, - lastError, - ) + processUsageMetrics(usage: any): ApiStreamUsageChunk { + return { + type: "usage", + inputTokens: usage?.prompt_tokens || 0, + outputTokens: usage?.completion_tokens || 0, + totalCost: usage?.cost || 0, } } From b41dd739f3d4b49ce243ee307951d0d20590a524 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 23 Mar 2025 02:09:48 -0400 Subject: [PATCH 18/66] fix: prevent negative line index when maxReadFileLine is zero (#1915) When maxReadFileLine setting was set to zero, the code would attempt to read lines with a negative end index (maxReadFileLine - 1 = -1), causing the readLines function to reject the request. This change: - Checks if maxReadFileLine is greater than zero before calling readLines - Returns an empty string when maxReadFileLine is zero - Ensures content is only formatted with line numbers when it's not empty Signed-off-by: Eric Wheeler Co-authored-by: Eric Wheeler --- src/core/Cline.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 20af9ee565c..262c2233b45 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -2341,11 +2341,11 @@ export class Cline extends EventEmitter { isFileTruncated = true const res = await Promise.all([ - readLines(absolutePath, maxReadFileLine - 1, 0), + maxReadFileLine > 0 ? readLines(absolutePath, maxReadFileLine - 1, 0) : "", parseSourceCodeDefinitionsForFile(absolutePath, this.rooIgnoreController), ]) - content = addLineNumbers(res[0]) + content = res[0].length > 0 ? addLineNumbers(res[0]) : "" const result = res[1] if (result) { sourceCodeDef = `\n\n${result}` From 87b9b72b32fae946fc685ff7aa7f352ea79df395 Mon Sep 17 00:00:00 2001 From: Jason Owens <67338327+Jdo300@users.noreply.github.com> Date: Sun, 23 Mar 2025 02:12:53 -0400 Subject: [PATCH 19/66] Corrected bug in openrouter.ts and pre-commit and pre-push husky scripts (#1853) - Corrected error causing free models listed under openrouter to show pricing information - Updated pre-push and pre-commit scripts to work in Windows environments when pushing to branch (windows requires npm/npx to include the ".cmd" extension to recognize and compile. --- .husky/pre-commit | 9 ++++++++- .husky/pre-push | 9 ++++++++- src/api/providers/openrouter.ts | 3 ++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 111a1c0f915..8a87777657a 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -5,4 +5,11 @@ if [ "$branch" = "main" ]; then exit 1 fi -npx lint-staged +# Detect if running on Windows and use npx.cmd, otherwise use npx +if [ "$OS" = "Windows_NT" ]; then + npx_cmd="npx.cmd" +else + npx_cmd="npx" +fi + +"$npx_cmd" lint-staged \ No newline at end of file diff --git a/.husky/pre-push b/.husky/pre-push index a4fea4a34ae..79fe13835d1 100644 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -5,7 +5,14 @@ if [ "$branch" = "main" ]; then exit 1 fi -npm run compile +# Detect if running on Windows and use npm.cmd, otherwise use npm +if [ "$OS" = "Windows_NT" ]; then + npm_cmd="npm.cmd" +else + npm_cmd="npm" +fi + +"$npm_cmd" run compile # Check for new changesets. NEW_CHANGESETS=$(find .changeset -name "*.md" ! -name "README.md" | wc -l | tr -d ' ') diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index 6d93d0b180b..72e4fe576a9 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -256,12 +256,13 @@ export async function getOpenRouterModels(options?: ApiHandlerOptions) { modelInfo.maxTokens = 8192 break case rawModel.id.startsWith("anthropic/claude-3-haiku"): - default: modelInfo.supportsPromptCache = true modelInfo.cacheWritesPrice = 0.3 modelInfo.cacheReadsPrice = 0.03 modelInfo.maxTokens = 8192 break + default: + break } models[rawModel.id] = modelInfo From 2ab5aad1830f96e8a60cc09ad23a274805f9353f Mon Sep 17 00:00:00 2001 From: Diarmid Mackenzie Date: Sun, 23 Mar 2025 06:14:42 +0000 Subject: [PATCH 20/66] Fixes for prompts suite unit tests on windows (#1879) * Fixes for prompts suite unit tests on windows * unixLike -> toPosix Fix naming, and re-use code that already provides this function --- .../prompts/__tests__/custom-system-prompt.test.ts | 5 +++-- src/core/prompts/__tests__/responses-rooignore.test.ts | 10 +++++++--- src/core/prompts/__tests__/utils.ts | 7 +++++++ 3 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 src/core/prompts/__tests__/utils.ts diff --git a/src/core/prompts/__tests__/custom-system-prompt.test.ts b/src/core/prompts/__tests__/custom-system-prompt.test.ts index 812caffbafd..977ab051a00 100644 --- a/src/core/prompts/__tests__/custom-system-prompt.test.ts +++ b/src/core/prompts/__tests__/custom-system-prompt.test.ts @@ -2,6 +2,7 @@ import { SYSTEM_PROMPT } from "../system" import { defaultModeSlug, modes } from "../../../shared/modes" import * as vscode from "vscode" import * as fs from "fs/promises" +import { toPosix } from "./utils" // Mock the fs/promises module jest.mock("fs/promises", () => ({ @@ -89,7 +90,7 @@ describe("File-Based Custom System Prompt", () => { const fileCustomSystemPrompt = "Custom system prompt from file" // When called with utf-8 encoding, return a string mockedFs.readFile.mockImplementation((filePath, options) => { - if (filePath.toString().includes(`.roo/system-prompt-${defaultModeSlug}`) && options === "utf-8") { + if (toPosix(filePath).includes(`.roo/system-prompt-${defaultModeSlug}`) && options === "utf-8") { return Promise.resolve(fileCustomSystemPrompt) } return Promise.reject({ code: "ENOENT" }) @@ -124,7 +125,7 @@ describe("File-Based Custom System Prompt", () => { // Mock the readFile to return content from a file const fileCustomSystemPrompt = "Custom system prompt from file" mockedFs.readFile.mockImplementation((filePath, options) => { - if (filePath.toString().includes(`.roo/system-prompt-${defaultModeSlug}`) && options === "utf-8") { + if (toPosix(filePath).includes(`.roo/system-prompt-${defaultModeSlug}`) && options === "utf-8") { return Promise.resolve(fileCustomSystemPrompt) } return Promise.reject({ code: "ENOENT" }) diff --git a/src/core/prompts/__tests__/responses-rooignore.test.ts b/src/core/prompts/__tests__/responses-rooignore.test.ts index 37b3050dd05..46f1bec438a 100644 --- a/src/core/prompts/__tests__/responses-rooignore.test.ts +++ b/src/core/prompts/__tests__/responses-rooignore.test.ts @@ -2,9 +2,9 @@ import { formatResponse } from "../responses" import { RooIgnoreController, LOCK_TEXT_SYMBOL } from "../../ignore/RooIgnoreController" -import * as path from "path" import { fileExistsAtPath } from "../../../utils/fs" import * as fs from "fs/promises" +import { toPosix } from "./utils" // Mock dependencies jest.mock("../../../utils/fs") @@ -82,7 +82,9 @@ describe("RooIgnore Response Formatting", () => { controller.validateAccess = jest.fn().mockImplementation((filePath: string) => { // Only allow files not matching these patterns return ( - !filePath.includes("node_modules") && !filePath.includes(".git") && !filePath.includes("secrets/") + !filePath.includes("node_modules") && + !filePath.includes(".git") && + !toPosix(filePath).includes("secrets/") ) }) @@ -124,7 +126,9 @@ describe("RooIgnore Response Formatting", () => { controller.validateAccess = jest.fn().mockImplementation((filePath: string) => { // Only allow files not matching these patterns return ( - !filePath.includes("node_modules") && !filePath.includes(".git") && !filePath.includes("secrets/") + !filePath.includes("node_modules") && + !filePath.includes(".git") && + !toPosix(filePath).includes("secrets/") ) }) diff --git a/src/core/prompts/__tests__/utils.ts b/src/core/prompts/__tests__/utils.ts new file mode 100644 index 00000000000..f2ac4fec1e7 --- /dev/null +++ b/src/core/prompts/__tests__/utils.ts @@ -0,0 +1,7 @@ +import * as fs from "fs/promises" +import { PathLike } from "fs" + +// Make a path take a unix-like form. Useful for making path comparisons. +export function toPosix(filePath: PathLike | fs.FileHandle) { + return filePath.toString().toPosix() +} From 003388a5c45acf45789f5df5b1a596cd0fee41a4 Mon Sep 17 00:00:00 2001 From: pugazhendhi-m <132246623+pugazhendhi-m@users.noreply.github.com> Date: Sun, 23 Mar 2025 11:53:29 +0530 Subject: [PATCH 21/66] Fix maxTokens to 8192 only for compatible Anthropic models (#1862) Fix maxTokens to 8096 only for compatible Anthropic models Co-authored-by: Pugazhendhi --- .changeset/twelve-pumpkins-sit.md | 7 +++++++ src/api/providers/unbound.ts | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 .changeset/twelve-pumpkins-sit.md diff --git a/.changeset/twelve-pumpkins-sit.md b/.changeset/twelve-pumpkins-sit.md new file mode 100644 index 00000000000..57e50230bf8 --- /dev/null +++ b/.changeset/twelve-pumpkins-sit.md @@ -0,0 +1,7 @@ +--- +"roo-cline": patch +--- + +Changes maxTokens to 8192 for anthropic models that supports it +anthropic/claude-3-sonnet, claude-3-opus, claude-3-haiku supports maxTokens of 4096. +This change keeps the max tokens the same for those models diff --git a/src/api/providers/unbound.ts b/src/api/providers/unbound.ts index 38cd494cdd3..f83ecd457b9 100644 --- a/src/api/providers/unbound.ts +++ b/src/api/providers/unbound.ts @@ -212,7 +212,10 @@ export async function getUnboundModels() { switch (true) { case modelId.startsWith("anthropic/"): - modelInfo.maxTokens = 8192 + // Set max tokens to 8192 for supported Anthropic models + if (modelInfo.maxTokens !== 4096) { + modelInfo.maxTokens = 8192 + } break default: break From e810a886d2431b9b984bc4ea0d8fb7d5688bec29 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 23 Mar 2025 10:08:16 -0400 Subject: [PATCH 22/66] Welcome page OAuth (#1913) * Add Requesty OAuth flow * New 1-click onboarding flow * Requesty: Use correct default model info * When called from the onboard flow, created the default profile Glama OAuth handler changed for consistency. * Add router images * Shuffle the routers * Translate * Appease knip --------- Co-authored-by: Daniel Trugman --- .changeset/late-chefs-remember.md | 5 + .vscodeignore | 3 +- assets/images/openrouter.png | Bin 0 -> 6715 bytes assets/images/requesty.png | Bin 0 -> 13210 bytes src/activate/handleUri.ts | 8 +- src/api/providers/__tests__/requesty.test.ts | 64 +++++++-- src/api/providers/requesty.ts | 6 +- src/core/webview/ClineProvider.ts | 129 +++++++++++------- src/shared/api.ts | 9 -- webview-ui/package-lock.json | 14 ++ webview-ui/package.json | 1 + webview-ui/src/components/common/Alert.tsx | 15 -- .../src/components/settings/ApiOptions.tsx | 28 ++-- .../src/components/welcome/WelcomeView.tsx | 95 +++++++++++-- webview-ui/src/i18n/locales/ca/welcome.json | 15 +- webview-ui/src/i18n/locales/de/welcome.json | 15 +- webview-ui/src/i18n/locales/en/welcome.json | 15 +- webview-ui/src/i18n/locales/es/welcome.json | 15 +- webview-ui/src/i18n/locales/fr/welcome.json | 23 +++- webview-ui/src/i18n/locales/hi/welcome.json | 15 +- webview-ui/src/i18n/locales/it/welcome.json | 15 +- webview-ui/src/i18n/locales/ja/welcome.json | 15 +- webview-ui/src/i18n/locales/ko/welcome.json | 15 +- webview-ui/src/i18n/locales/pl/welcome.json | 15 +- .../src/i18n/locales/pt-BR/welcome.json | 15 +- webview-ui/src/i18n/locales/tr/welcome.json | 23 +++- webview-ui/src/i18n/locales/vi/welcome.json | 15 +- .../src/i18n/locales/zh-CN/welcome.json | 15 +- .../src/i18n/locales/zh-TW/welcome.json | 19 ++- webview-ui/src/oauth/urls.ts | 16 +++ webview-ui/src/types.d.ts | 5 + 31 files changed, 502 insertions(+), 141 deletions(-) create mode 100644 .changeset/late-chefs-remember.md create mode 100644 assets/images/openrouter.png create mode 100644 assets/images/requesty.png delete mode 100644 webview-ui/src/components/common/Alert.tsx create mode 100644 webview-ui/src/oauth/urls.ts create mode 100644 webview-ui/src/types.d.ts diff --git a/.changeset/late-chefs-remember.md b/.changeset/late-chefs-remember.md new file mode 100644 index 00000000000..92fcebab1bb --- /dev/null +++ b/.changeset/late-chefs-remember.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Update the welcome page to provide 1-click OAuth flows with LLM routers or more advanced configuration with custom providers. diff --git a/.vscodeignore b/.vscodeignore index a8cac01b118..560897b9677 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -48,8 +48,9 @@ webview-ui/node_modules/** # Include default themes JSON files used in getTheme !src/integrations/theme/default-themes/** -# Include icons +# Include icons and images !assets/icons/** +!assets/images/** # Include .env file for telemetry !.env diff --git a/assets/images/openrouter.png b/assets/images/openrouter.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2c18d1209c3b5f72683ba432cc4e93a921de59 GIT binary patch literal 6715 zcma)Bc{J3~-yR||+1C-7l2C(4$T|p>>|`f9A)>L3u?(_{$dY{zV=(r;Y@zH+!We7z zU3TXE_WS33&wI{$&iltK=bk%rKlgK=?{h!T^9k2fSD~h2rviaM)X$zi(FQ)d|Gg-$ z0`H{;*bESeo%Gogd0nrx4Ls5y!RAtKXCT@zAcy0Q9a~zUbwW1Cj_!e*@E z124Wq(o&GN83XHFWu~Fa-Xo7(w(Yj+GnZ>fg9lA5T)QhLjbw_(3}Yf7n_-@y=tf!zZ!80GL}N6&Egg!41=I^@$}OeGtbg>1EB zX6VGT%w^iBM$C5qJ}}r$IZhILLZ|9m5XK`527R4$;BdKIc!*y9Juzwax&_lR@e3J( z>$jscpv$W^rgBS<-sID-=n&Ut=gV}lvYPrmorkTe%9-V1X>g&5>BkN3D4BP>QSD_! z`s^Dl5AgzVaPM_YCVQ@%5soikdeUl8j5{2VfYAq=@}9J1h<~wgu;2X4wEo}-3`SoM zt_yjugko$I;MZY?9@(Ya)|ErMvo<)>Gff*L3;1kDVu;MDO{Ip*L(Kh_w@UG{k@?_8 z;X|Fmo@K$BnhMSpdq=_5tu>BOe}#*7dNN47>v+@7rf{lk5iND(bxTg=8xm+}DSm*` zEp^B;e0!TmR^)6Z)2EmH#v1a#^+gbn=hD>*s3L}gBb_UWoNxT8uQgWguPMKN$(q#P zcTUaURAC*HL0dP?%3y}fI?dL42bqSU^_(nZDG?Obff1gJ@d-S0aX&KcIRD&jlLQS5 zC0%30T)UH>ec6Gks8bgU-bU| z;)Ao2u$@K?av$#PG9phg54*Or-+WR1P4u4sp~t+0>XIPfU&;TB5`}M3f#PjQ+~|3r zq*My6UsuoNp$peycR{n#2W7(RX+Fb7+R3dv_qn~1xy6@Mkst#)MzND26|Q6nhX}&r z_nWCQZ-*0BnYu+uUkymIUWx7`EHziz8K2*>%47puDp-#cfblnXKU-~!s^8mB(jZsx zCHcD1f)b1MLnz|28BZSjOXd7L?l<7=L_ZKC*0bXCE+f9|3U0-LW_u(*K-j(%OH}Uv z7+??=EnbtljuL@|#qF8~bMwghQHj$&D~G{lDJWCgB;!*WyzcNiqkMY%%dUGfz{2Qv z$P}h{ZLbc*UF{{l+TPi50U#*^2(-r+?pgiohkyw$M`t8X{%TATkV5k71oG@P_ph9R zW$~tMNU%)3>k!U=P`-rMz)s%BQxDi{pSs4(znpj%vI2pkdFduEw~k6?7*&1EY|_ag z(__UExVno>6r1N+)dMrZ>8@`*;lPeBf8rhqn@h$l06Y*BWf>g*(51lg@ZkW-;MNV= zxtkykc|QT*xqQ+Bulk6f>0l7(J(c8FIMG`phjmkH^nv3;m0$!a_&E^AhE_n!K?3K# zz|#27GZ7)!>&uZjEeFsJbRE`Brs;F4dAcm*n;Ngxw~Cg&ogsbMneTsk-yCZ6ehChz zxQ~0NEzULY<0L1ybcwe-EAqd#ncMJV%s#Yc(l}N1!}3x`dbdo% z%+QR8>pI~r7HSz@`*%N5KY!0u$pTXe{o~WGpWuA{+GT!RHOa4Tp}p#{UTlcgk3Vt{ zjtmfd8i>`Yx>n52HgDtDeYYr=ef!4T3;9HBjM;5!%?;c1E5gdzviG?iDnz(>G*Xj{ zedVnKNASx61_y$)LPZkMqI=Oy%BcTRX06mOZP!3fQH0K9vHidtfn8TO>52s!4L7u?T=k(!3 zB_`|fCi2Um{Tuz0pCr?hn>sVI))t!k@h6xWtD2fLj_? ziR6Y2l0H2NpiUagf|H>gt$;xKpevazoG8@f_-yK0^4N_R0IO3|NBX2L-~0SQgL!D9 zYusTI?!e0P;6QneC&7d};qtX=rM!Yuz+g5pgWJWVc#}_S2^ooF(hJm*!>gnF*qSXUoTwl#?MjQ$&CMS zPi^$*ZS|nGQS#9|mUf|4_%K|p1*#DuxRU{C+VSV)NPkS!rKj4lQgPg`m|TmPp3gxu zWbL4OiqNWElKx}$dv7X|$|}?;nCx{NEH06T5dLt?A)n}P^mS&d&%QI}E-+Q`-)Zkf z-!Z%d|D;C-xgoC`pa{%eUc51M=o5P*QI~* z{~LSU@@*`%N-N;9;QeRkGubn~ng-nT>{L_=1C^-f_TfbLNMQ`b*?P3YnhHRD|6%-43UceUsovP_z+ z_1;}2+2dP>!88N9BJEUX&i5)me5`Z5hA7D%!sR_6en2uTc;Ncocwd0$x8@!Tzy96u ztE;h2$<6J8DZe^j$$Ohi%l6Ky+Xr+=oskaWFxSLp@(&Q%BOHyp_zS9eap%+H{1WjF z8k!h`pPdd<*|dZ)X1f}{6T^9Btm*S_1DOxm-G<|D<3zN<26pwVxy-@aw>ef<7g#w& zxvhl>dZM1LbY1N0(*te-gICbBW^Rqa`ltRO0;hJpK9w38n3m!=23k0zS0|X{$ zTscSGzkTq0?zN$X*&=YR)D2~|MGbky7ZRHz!DGw)D8hhbq~LXJI)?z0#jRV{61~p) z78)Zm$Yy8k-`-cCa39f@J^2BwzxU%)+aDQCoFOF9H7p+*Mtt?e8~k{pVptN;q`$Mw6*y*H(+=&(D8 zdaNOoJYQyT4PLM+o_L}oK5DZ`NIg!wHU1=}Zfm&hT;GGYD<4ObLuE?3`)%uKzv$dlK!E zU`sIAEwzj5^-Nf_Sw#qf#+tnxDqdA9#wC?fViNx;#ptIbScKDnE+AvR?R?@OL1U&F z#poSeXG-^6!zI$ZHLH03I&Y#H6#o_nP0&UdYMGtu7d3i#R8_lfzQ3DyWs5nuO&r*m z{|AC2)Y-KF%Jk))e#&KG)o6NM6PH6YBROyzm^U?BbUs&YU}l1ZcCzNx@yWSqplzh# zAV_AXi`8AQrV~J%zKK9|8L$>8Xvfw5IOiu&-=}Qd%)nyWq5EysQdG#%;>q-)M%l0u zpq{YhyqY2_7zM3m?_{kjMWPnQbAU?-K5h}ax?m*#2Kpx3A~L4AW%uGq27IMkl3K)+ zL!cYMJuTDpvZZ=89-M8V_0S+xzQEy$z1JwgAoSHwBiQbVfH`!-S$8abYiq6JtZ&Hw ztv6Zy7@tGd{6(^wR7Amx)U7tj>mr;I=yTG!9@52uE3w!=1*$fvX8k(R_RuYmO04-U zMuqlV53KJ(dRYg9i{rQhov}e|<7{ID3nu!~PRVN&r#Ws&CuKkv9X5rT4KWnnm7;le zWzh^X0$l(w5V(EsbK^V2PvLX7IAl3=vXYkC_?`Xg+DbHV6Lyu;1VsVBNUazKbrLLV zc`l4MR{N|tyORG1MJ4xlJ_EzL%VPtog|{#5dOlMNRjOOUXdCOA%f(Ld?sN1%^rxg^ z7Jkko7{t!Ge>@qONJ+-%?vW`V$1S3sNI04uA5J*;sMLv|W9*&2;9r{P#_AfQ4mDl2 zKW&c|H*k58&gm(<5(Ujo#}-S?XD7?}laPNY!oq4N`lRv$_cUAJOs)(55e58zuyM!T z96tVQ{Ekjvwk4}SlSULyIXDni=f@Y%AT%bV1~Kere=sQr?H;1Q1Ced((|G!0;je7vTn zlzFL>rJ|x}rUt%TABM3B+?yRN@752Dr9*N4Y8o1r34aTQ%?&F?(l4@(QX}}!$Rths!{3fk=A}Z_N)a7xAgdez^KwznO~NMF07!^9ni-JMNf_#BVJ$hI8Xp

JS@tAT=Fhgn_KjyHPsgVqW*z1m&_x3;iJv23?v$3?fOcU(75%{LV z47Q7UY;RlMT3za_vTyTONv9R5MN3}q5FEdMTomzpK-$IG(YTmt;B-BT zm9`hR#gGL^cS|P4MFYp4@%e7%nbBapJBkZegDP(&8ddT~-Mb1XjbL7|E-dkCFP{B% z$pFB-RX4UwCLbP)Zo59aC`1aGa>i2yOLs|vt@KIk{Z@<47n}U;^7Zu6EVL8P(*BI; znLpFI1UE9yw}=g&Z1q|z$4)&mD|WfZ51SYx_*ef{gI&8lZE7e@8X(=qSSLW4Fknc0 zXE3S&Fef*4LL}&ws5z8KC#z>(};sE_uH>k{0+unkf9HsM}(9!{@bLAMW%c z{TCi&^`Az~x2mnxe*Pl+8iZhB9HRh@G1(*H8?b8!J-G;YHhDmeCaD}LoON)$jO6}v zKeFc(tCS+2wNLl2J|}Y`nU&9arSksrjjdyPb)p!|4=GTZ#z z>f-)=cD=ux%5t?88WJYHtaIJob6RCTNSR$ozVeNG#}1ha^7j(lBzRGF&U!Y573#0W z$m^eNtZp`loo1%M!?=L@p4=!kJ?>oF!{>R1aK9}sQ+}(UG=KH`f_JDkCr6j*Qax2Z z$E8!7)~{A;6u-UgPQvH4i0$h#Q#Kytkl|m*rPo05+|>K9Fdi>0&AGX;!L=|mDfp(c z2C@VZeP~@Ts<}0EVYOVZtcQxc)ep#r`l8(CrSIr=iq=1kltMe?Id%cbN83T~4g>IP zXZ$#Lr&~n_^2tT#{`bEZ&P_^9+0WIP0TMV&i}gA?A-P3c2?*3T|5Kp;xr?wd-~L2` z;+WWw%_FG3JO3_aVuDYs><=`^Q8F~=RpM)X-t5|{f(xTxe7V%g`w7)7L!?KZUXQ*@ z1E@)suvZ@ow@VnfQXB!gD+h#UZ~2Ej!mENHUOLHE=2|N`gSZr+GAUrM9EmsU>wgLv z$1z9VkbeU(X_H&Siv34?a>b^vK0Sp#W$q2-NS+oUvcBsyRW;S6Ma6tX`6RBI3H0^V z)wMhxCGwC?rIXATbZYP1T-_2Y`hzFRYal!Tog~T1av$^GFrIq<=f|3)^Be8T74-Bd ze(X2$_VyqVK(~424M!r=x^x)ljVZ0$6&;>&9a95^#klizq>OV2BaqhFoo}RBqMp-U ztVMutYU@|Em+&`xtSh*NAI$-rO^6^K>y+OXD(^?XXoJ`& z56@!`5^z&Qv<`Q-nqvEF58LOTtE<&Mr5fDkg}Wji)JC%cVLolLiT7J;)Gl~AM)X9n z@~Xrdhw~zh%fe@J?!06w3>rd27f-f!ww$aH0!z5NODBy|Pc;^oIb1VW9F}Jnqf+0w zagejI)p=CUIi0NL0E{Wv{{dP{WlHzhYNqYW1(~Z1E2~x(fp~v&pKxLRr)Asa(%&F< zs!rqJU9^`sp14E)#vepVTMnQgKmp-kF_Tz!xcQ<1Wk|)cD42J-_g$f#J2Zmfy;6nd zyPdO*sL?(^FCBVTRiD2rOad$si`Cv0yZpcip}GrepC7sZ9JlzLey-7^wMTEB1(FYu zYCx+#nBcaAw&I)2u6)f&t~?z7qsZ(2Y1`VSfW>~_2Np*2kNWdVa*k%(H-6HR+czDf zdVUy-J9iH+Ed$=pd?Tfbtn5Px%a>1&pF=w`5jWq_G8sig?lHQ5atLP?N^>0h`@I5s zWYJT+LI9psE)eKVv~vWX%!Px(#`!;?MRP=F5PR0aNa-A88{8y%|IP*vht>-+PE2?I z)97EKfHDGnDgjf-#YO_W^Ly~@SkJXF+b! z1HP?$0O(hZ>#OW-ZN<&Nw1Y*p&cc{A#P@rE#NQ=TILm^3vtZaRYMpDOS_Wa+$7^pQ z6iq*h$T+A1-pJ7fS-jLYG+THkkuhe!jkRpKJ|b};)JG;uvsG$0-5WsmRr~@S*wPvx zp{L;=%wtnStz*msd|AlnLz65fbK!bCA>`NUd#gBs1Ux+U0KDcdY3b%oyM8~(X>r#- zkz}tV{dD|2U%rE$Y*ODJ2Xx_76ha*qcI|EE%Hvb|3cJ|ucE{r8+3;(G|MhY7!gGYR?Fa-vG)dkIW0hi0Wgp8jk zhhL$o$(wp%O3^*Z^T&%4~Dj zu_jDeNg$Ie0r$mgyxc(n74OeV{jzHh&wuyvBW1nJON+Nfh97TJg4=HWOF#=;l)+Ch z;BVjNZORZcP+g02fRUc(rn)%}VwGe}RkiP?xVhZZSbI?kH~`;bmxozqC_8Q`x||!& zoVWXBRo>EkuCetDa5vqGvmy|Q#z33En5iFd%~(?x>FBUD z&`!SF8n7p8Trbg-z7K9HtPm?LIYGB{-v3|Sk^e^n<-e!w5J^EGA~B!Gk&Hc*l^SRY Ofu1R;Kfx-zLjM<=DJyaS literal 0 HcmV?d00001 diff --git a/assets/images/requesty.png b/assets/images/requesty.png new file mode 100644 index 0000000000000000000000000000000000000000..1a250ccd95ded3f282b0b55fc1b9d5b26da32499 GIT binary patch literal 13210 zcmc(`^03g)VPgyDPtyt-JM8et%bwe*}Q6zw}+z z_31M!guknco42&T9P@uDr0?qgngy5<{~>wiEXQoBYk*L8_j-yD=NIG`WR}N6AP}-% zwsz7FRMh@^_}!Bnv%|Az9?}8=etv%Zej@ztUiJb)Qc_X^g2DpA!hClWeBJ?W&#e6U z+`L)-3*`Ues66$y@pANd=IHK*_=js{?e6nTj+yx%qyPE+mz>WW?f#dOoA-ZD>u!Pq z|9S+3_yq<22m5ZQ?7voNeJ{tScbxy>%L~c=hw}f`_TPMD1^zMre+ctmGyPBN-BjiA zWCi|5ZSr{3PnK~2Kqx~~MbXe7wDTN4o6f{%t^Ch!K#CfTquK}F*>qlor?j)eQ(1&r zVNeebg#S|%1lqZs?m{v^g7Ee26^4GO#kUm4)f9gpOnZ3={)j*1CXeY87jJSQpsE$3 z$hyi>{~-Fkol)+3w_@hDCO>`c+xVV|Pr+rmk=(>d%UO-|t=w6j_bBeA?d*q(`L5&VKmWg7QwoW%EqhT1EKvTnD zjg5)4R;z)}(ZqAy zc8JIeoCC+lQ`i(UHa1(&)6et06j)*X*YYV{>-PsA;V{moNtt{1kZJDAguMFfZpDG{ z?9HO?Pcn8Ug+cok zYK6}^0?$KW77}iKTgp#(o^Xz_5;?)<4&6iaSCmPll-a>vfK@7zPMsZz@IGhw+{r~J zks?wu6M639Yr~oT@*_O_2F% zaUfpe+*?E4eaiDma1u;g<97zp$v<5tj%#L1W2Jch9pEMkM_3I<(Am|#5f_FC=lHtN zB`gzQ^IGMR_H|MjWWS>z(a{9wY811ud4AOY#iD$!D@LNwPRn<{{{alMF@KbK;wrOv z=B&296!R6i&)q)OfqYLR*I~&3wq2Nz*Ff;c0aK#Bfw>xVmvTx)ecgK^=Q@g^IaprQ zNzherdfcNaY?nA`rZ^~XPIuIIrc{^ zTie>{3_1R+>7O1ZSi?yB;q2HSVPff$4VheH0Acx+ z%09|oY7SKNN$@5P(?avvASPE!a*W^6fo+h;fhA5t(* zgOJ5X?!gad*X9ev!s#b}J=tMf(APhr1piRdpi3Bxgr+llqUo3sMD7}--8X{KqQo<5 z<|(>;`_e>a8olhlXdY`a8^c%AQa!j4C%LN}Xp4_Z z&ds5oej9VNF^Q=4q%x}c05h^MYj~krPZ2>3^PCwX6&f4fOXKc98nveQ_0xp3M-Q(9 z3J)r>g}Eak>{NH~@Y!JzZBP=aQzju~{p@s4i`z-N?Va|6UKXmWZ5BtaG+;50jS)oU zyl^=twqtK`xvmy8%3vOM6U-Nntb(J53;3^g9a-`{GasKtQ08F&NPNkzEP8~t=pnZicE*AG zW52>%QJe9wtFTC?D1PKfiTlX<>?F>JkK`aX-|_qAZOrgZO8ZtD=0dy62|82#$?eC( ze{0%{IG{Cx(Fu{zH9n=4^y#v6pGS;jasZD>E-WI3DKh4PNI#Ku&D9?1_`T1>&%{4% zy)gRV1YA#^o>4jb%@HkkK}}4S1@Nuq9uZ3>0W#(x9|p;k*GFGORR>r_e2bzrrNBRR zW$@;|jNrHs$h&q6-u;@Q>L)A9t^9^mv8mRg#C5b_fz0gVNeX;M#{aF_g)XrH^iL#! z8}Zr)$JVQZ*yZD}%U*zX*?J|9%v%ACsGpX;+y_I=o4QpHw zi(w0O$yPkQ!Kcyao*aje-;MQ!QN?y{3q{bs%$a{xv)y*6`>uFIwb$z~Kin0fjf-*^ z*!B!Lc^x)#GdqSo969lCdrL||6AOa7`P9m`a!>8?S?*zzznbradocVg;mkUO&FlD2v{ROr$0E#`=ylrO0&?g_m`m*!apn`PpGq z*4U#GlliwfowE!xS$oOaFihg;6JTUx$S?h-`i?PS656rBXOGCO_0K(tn?EmK_EGY_ zKcxm!d4>1o)=MZk8>}n}rylF8Vq#zoSkgZ`1bmj=y|DKxl*7iMwNH(e!m8`VmzLf{ zD>62jzpuPQRKZNaVJFXBc0TU?c}$ox4ux-f+hk1E_!jP(K*>OhOemV75n9Olf|rO> zz7f8pF3_99m120C5YKu@&uV6+T9^qJOnf3TbrjO-!?`tfBMK7i<$cSwc0$`k;yYuk zT8IlTq^J$D=qFsacm6^R#?)w-U^bWzM`t|gtc`*N@3G3-2C14=YtLN5rg5oYJ!3aZZRqWSQuk9^$1s2mkL;|QA znK;V{qFN~PwKA~-7)n6xAw4ttcp?1`^Ha2WwH7W)O6#JTc_|2*SdE&TNyw70!39Af z!tsz7KvqdY@w7KibkM`=}I4lzhrsyPkc3uCm0J37z=#O z0#r6Hz{LXtjzAmOI($-Ew+45n(8Yp!_Yi9eARt}F^bJ9-7Xqugn8$v>RNCkyeuUx@ z@Q9+P+Dqxwi?x#vrx`U|!c`wWH+HP5W;W1;62z%o8tWZDRsAc3Zi1F?atj`pVR-!fD@+jE;b%h1Ive%Q6U)$^6F4hQ-v z@pG4z10u2RbWwz4IVpD<;fn$00*`thy}hVm1&}sVUUa@de7pepCYhNwc((0{?HB2^ zX2iWAD}N+o;FDF1HnV!#2_l(`nCj1++ReZq*x~SD9MZ+#7>xO~v=WkxrPCWnU4pI; zqgt)(Ka7=dqnwUn>b~@iyRtQ1?d)alitP2q8)tcebI$GHXbq);r23c^WCCL%$(J9t zEd9f|;K&yx^jfD%$_`}PPNc2283R}m%zG_{tAmp&49|%RUaIPi#It7Uym0w7src%r z7YzB<Hu8T%TB*WcLhte|v6oe{b1Re6@9kjL(#QOj+ZlVh+BR{q-kK`Gl zXr;n0xqbg$Sgm(2g1|wRF6Nt{CfQv8DX$Lf1^$#}e1r>FE5zRv;0e93yCui#l!0>A z{-I-QfW#eLsE&kv+y6=#FPozI?FWn@l&ysP6EST$LnIh9(Mv-JnypKq0+-qdyEc84 z@2ysI)?_*<@+p8~s_Y@0tFjCc%PG#HbGjwVt<)vUq`l1dFb@9kE%u~dhcXod&fGxr z2n0&8q+rPSWhD(VhAFO;sa~+S>Z|XAlD(3-acra_-$blpRUu?!4AtTa*~XGl4IwI7 zju?%*+AvC+L_O3+@+@`SO@%NSO(=yLx+Q1h0kK}NI(||F_G~q`HUNatTV=$EhYhBom@ZgiN zl&A^?Tud=zNqCf6F9Q{!fTbW!=cNy`KK&PXcS;d?;z&79UAV{A8}3Np$*ip?lfR5f zR^^?46Mkvw9jp+pY*(?_jZ>1V5e514u?aPSTKT9DuDhhu-eCjU8qFFe%wiGia389b zePlllgKb+C3)r9Voz-d|ZR-bH4uCFZ!3`=PXlZ514Q`n6h8gTAl~`HYvk&bbex){H zW+9Z4^`{Ysj3|^*5F34T4ZL1M0yP`Y+?Bphf4HvJ0#bt)XMpo5sx3==@ct8GqI(-! zb3%w+y2xghf!LzHXKXisS+}4|Z3Vf%!)8+!%mCv5_s38PBtb!lJ|q=L5MbaqBiO@o45iDVsjyXbXw6eYs2N$Oi|7`n< z1quWizu&5WrvAzDr(J_CsaQrsM0gBXoPcQt6~H*F(Syy)!Gka{y4mtIQ#gc*K{gJ_ zLPI!_nN27)ZvudWeTxtT$-CzJ$3S+0QCQC}@VAcawt;;>V5Va+&^80TuMpAc>f*=O7*kDes&4 z;@Kd>0-q>G{jC}^793+a?+Qyx(XhN)okqVp2qkF&u$ zd&W*XJc&r*?16m3*t16#5KKy~ZjxehuqII1u;>B=BcigzJlKSX_H(^e7j7?fS`HwH z2utP=Z{c(y8WIQ}Ukc{gfY(uw9TqbOXet{Xd3DhloZ`UQOQsQOEWcGU)S1x~?iwpx zDwCEAqD0=UmrN}r9U97FG;36Yr%7BN$WJ5V+am=|C8mwb(~I5V6vwM1HP#jPAm;oSzdMLW&z-XXhz13uIZD$#fX#HZu5IfbptDX9q)}~-x1_p zbBqM4{9t0x73?|oE5hnv{HD82?cRp4L4Ndq$o|=chk&^KoqCZ1mbLAG5F{~s>TbBi)W90p!*HK@ojEDpKm+)4M{;YnzVajtzKi;5kN)9@Q6rsHs{)&O)B9_To!7< zu{D>LNl6_C->+!feyoR!euP=-%5PVcIYi7z))@&{rZi%3-p9oYoXJq(t&~?k@ghM= zNJp1N*n*`_A}0hEV!Ot~?{@F<*5P59kuU4Nip=R_xesZZ;`37KyafoHzE)Cu_}3EA z5D%uP^@b8E6&fS&^(ayiu3P6eloBs4GH=%h+BkF9$U7sLsH*-OI=dxypU9v2P^Y$W+!?}&~ zd}I85y_waZft~2zcVS3#{F_*=Pi55my|N+pR;C!00y=h&8~NuuKL~O&2_$*a)Rd}2 zF;if6vEMW>v)}}Dl0)ZT^TyF~Pz#6I0HH&h8?>FF>Y*fse6&iwIVko$i15_T1>1ct zjR`ukY~NO6#|mlFngxHIZu%JzF`s2-=XGKZ$TBN{va5+}AE|=^7I9_>By|dD(-@O8 zZg=YvDVKG}2&m$bHsMbrdHk){15K7&`5F*{9I!Vb}Bmfyf$`K9lxKf77fZ3o6Y0k}ZVJ=G~f zw&9>{Cke-&*Q^mMRLuLz1s9JrE&{MLmh2p`-KTONIptxiEK)oL7UkQb;`Ir8b28o& z2Snwzf`qtWHEjwdAaAkG^sZKM2pr^!ea1LM1($m4J{py?+@t1zN5_7yDq=8QvpRdf z+1YB$j2(nY5sZ@rNYGhe_>yVdH(yrp3_&NpFlvn0`}$jz#z)Zlv50Wpx2Vc*TPBzl zhaF`C#lBc!T*N%zN_RHG%Urt-HijPfjmiF!5{Y^Cq=93VkI^_Qh<-OF!6{7*Dw^Ovf6gWZm#09uR}PB%m-)V1@KiZ-c4ZuSqJ2 z(f$!%ooUrY98{FJ$uBA7Qm*e6OQwEfQ6JO>`p2#BMGL+$(EbeH7lmL?3*Oww>~nhX z_e>xlfuvXPwg<6T12;}s%-=^)`eIm&tgfPv=>5{wU(SolVWuf0eGJaHo0+w*l(wkRf zBk$VZ-5;1H3k<}5qHlwki!|Z&$8K4q51;U$>w7%0?;C|F=_iXp(gX;+J$n5B4nm$= z<$LvpUDHkF-b-k^T8QSr&_PXJM<9ymb4pqB9H+*gtS>yFF67@+#&UO}X8HtL<%%Lk z^Ob1aBYND35^vA)f)|=&Eic%JGw`2%-azUJtz8AZJ*m#gRM2NJyg34XoGWk$TF_53 zdcO>ZVVp7sQ8R4lIg@cq6IHa0-x}TOMF^R{*=dfe179p!Nk4477-onEa@Y~+jXC_{ zq6md+p>p=os2oDR&j_T18DrpyH}P)J&d)^Jln(ibU?s8(?3Wj6HI_o7#S_V&-;43d zEQ`(*eEf|?jB!XQ#kSdfu)Z>E3)^XW3fYy^k_6uY1ai~&avelk9-41 z36IGh0sim9VL<;kEV=n5dgC{RJQvbr7ru#G5<+>DeeJY}B8|e2RU2Q#hH)?2 zY1i(PSrA9QV#(t@lLekMpup(9p{G3!ya;5``ilj{^RtZZmxUwhl*eV&sSFF@Q; zwpBGNOW(eEzicK`1C*nawlOPI_fsKe7mbBjp%CjMsjPQQ?v#On{2dec&GezpSv@gx z-|x*V-XoC;K8yj?$3+nXme`NgkURu9ZpD*%@Kpga7d%Opqw4wSN{oy!6!~7h5pBm~ z8{jvOH2QmW;o$mgf&;%ixEl%#-it6YTgxn*O|Fog_a*56-I8B%gWx@<+mk4X${T;t z>an3sB^QE^A0b$hc6a`Unzg$@Aet&sU`$;eJQ6ys`Z}Wb`XT2JonM+O^u3;&HTG{U z-|qjKyRst-l&3#E%`lb!HE3f>vmKDe*qQf8J#BNW@tg!S%Zp+F9vcgSmaYpv1$}>3 z1GQbS5Y8iYrAq!1aK3$zQ;|S%W%oK**@(X`wR-!&L|9XksNlO8h>J|ufLCRAjSyld zgU=3_M)rBglBp(hX0xz!6WKel&e5V8L*~e$7I0&tcN`H z*MKr+vEiH%)ZVG{;I$t!{IQuJs5D%dRO3=cMi8sOO@=>m@Z_d?7O$C}AV_pgEJ(5% z>tshPakIc*tiEt?v}ji!x%2L#=1nUcNO`xS7KK|V$2#sTZQ;Q_97)uT zm90q>_-Nt1_!KD5zn7saCyLRjz@uC^d7ZJpCI9DD1l78}s*lSes>WvGJ*27$0YUIQ zkOXb3!^d6^5D!aywU5HCem4GBK=@u*hG>t$Q9%q=fioc;dS4_3F^HT9F6b!Be7}33 zBw!>7@~{qDK|wbkplhN>p81Kr(tp+WF~eXhG*Gmjf~h$pE%9&jSWHd77zcRb8z5{d z)Smj>k@(a7(A08};8}Dg%8WF zbkaf%=zXu}%GzrTUq;z$lq?V=1}cQ=t}-R=+-rxHFqj8EJ9WAb&0<3KyD5r*0-oH5 zq7^ZkIpYL8u|7`#8W!?afN^F*q{sbl1w;vRN0kHP{Z{iaxqC9$YL6R!5P)b8 z_yw^jjpLbtQmj{zT=1GVU3mRpegIbn4nGo*Z`Rww%tiLCE_R6{rYqHS6l6&YCWxmo z?@K{bSvm-D`Arezr*LdcX27(!cm)`lo*VsTw_jbj<2t4G4Svd>uDit>2IZv!Rfs@6 z9taD#-uwWp2{j(GvJ&YgD_ND?Pm#Mh!dL5HW@urkfbps!u=qOgJb{+awgrjzRM?iA z9qYC&q(jB1pmD84&e{ndpoG_Tcwsz6x6^K zM>;4dnoi{9f(_N=BEHz|%k0$NgAlof6zlzOHm|Tj1j6_NpGnbNC2-dEwVOer;RA^n z;9071NeihLVs+G0i74_oo@f^tA^GHLbS?oy?oyS#;=W!X%?U0s+^>xJaE+VJ91CQ~ zoSUo#CG;Pz?B(ph8C&U!)sUMUF#S$Co8!W%*7A_T zmh|&fQCSnpS(DqJ7s=q~SS{P@v=*p&QWgxQ(tKb+i?*?zxUVkwD^u+EWV5fyk~#VT z4BZ?3uy(_*k$Cqiy+}xaZ+_Q&O=d9V%L*CoB}T~wDs=8GaIh^xp*C1YskPyGKBBF(mpJ`Fv67pC2 zgzA9!pU3;MKojIE|A#p@Qy4b$7Z-uU;Wh?6T8xtjSc++#ij2c<>}l+7y++uuP2;K> zN;zd9%LksX+VdNix|ytYJiG;wN+xeY)v?p#nU84e;5!ZIX|YZ?lI>;<;N|~vV}AAU zb65XZj;L8b`jkWHh&-#j2fvWNi0Ve0XsGV$S1H2qXp)@ znXCB;`(c6G;BmfGl&7MwGgsjRb~e3MNlutSK_qoq6LzX%6Q{CrBcmGAq`d=wkdK+B zUbo(bvgv^oX$thtAVVh~(1FcOqbfv#R*iXvKh1e4K8a=pm(#!jnvfoM7d=8Wzijee zj?NJ*G4KbBW|!$gBmL@>$dJUWx@O8_FPSAS%_DOjjgRP&-wgz7(JC1pYLfZ$u|xlU zi4jqw-Pys1@{L-3nYfXSk(d}Iq&YX*k4G-_a%u)Zj+kPSy3E7qYQEtY_Uy@B95(am z0viT2dJs-)Rm9%rOBEm%f*KLxoVfGtpDJjYr@h30{U3@)TFk(?k|T6@#Yo@-dtl2R zoOAQ{fdx;!$&@#j{cWRs&^MvUXkh8K6dRar&B{_MRINhO>4~HAU|GBGi9y+pEi_AB z4x2B#KGW(?yBpC0I~s1`IemdRE*}Rtk;YxDd~U~OI@VVat)6CP)L|4xz?|dnW3Z^H zCX3q3+<^OUSiz~+(O5EoUAMF2Q>d8{WC@CpsA#BTkf(%lNh51S!Khw(HgsR$jaW5d zTc{tE!OE<7&yEK0mpyBuD4!x<{eCN8+MkXKxIAoVyN_dVoMog^_*4v##85w)L9u}Z zkoQGEk8bY>)~!eKvW(RVpSl8L0FB3YQ@otE_|xG`x}k(uNnvu5juiFfjSbA;uazK= z3IWLT7K@wbU@2xA4;WmN70;4lF33`w9ngWk!V))(d;!RcK6aVqq`_E&e4;2uyXQZ= zd$LhAZ6m_Pd+XbLu4gGfA29d5te>k>hhBYoEyV1i^|$-N4Qr=&H)Zwe9Expvoa4Z{ zA7CRzJ45!ZyvDGD96GC$?>-H>!5f0+-K8FFj8{8&0!_zNLE)RYTuH81g7_j)FaFZD zyg>&t;&EVQIxDCh%#+*Rbb8RG_+imqJ~;Q--c9fBxo!`dI)C->Gv(yh_bb0#OXLL& z<%ET8$#k{ZNCAd9R`W1_Rx>kl5Z+JDHoAdi1ZfgaGWLHgVw8z~ZyS5HMkJCLFE z5$|^%#{p5vxJE5hcu_ydjWt%Rjb_OW@p!Pv`-3{38;AYoqhR&1sy}?&W^V*VKl*kT zX4iSa5ZnJ8w2eFbLiro4J-Rky<-80-L1-bS$0-eq&E%XWoXUJ5$gCLeD`QylJMilT zQ(=##!Zzh1^;@d74bHX~I)Fgvga-N|K}?#$LQzifE+2Zxj1gR#Apzb)PZjc;odW+| zr7@%p6D^}qWiWh~(PYHL|uw;y1DGO$4Q1jToUVW19u`zs3-t#t5)7mO)R zYLKnKHjv#7jAk|vg2GddoCc~R2r+sep@qvB@}L)iOsa*ZP`WP~{RL{d@|8x0!Ccx9 z%#4S592vfo^S^Xd8v-?ZRGwp_FQ{wDbtaGi2!bLjOK6Z>16xw@NH(~~wiS!GSM3k& zOjW>?F$6mrIRR*?T8=)14k=+YWsI+G%4-(Qy=3(sK|LG>G??$UAmBfOIzwH8KIO}w zhI-DX{|Gg1<^`KN)I>uBfFfGe!e|(BWBg2?D8=T1@8+9eFsGGN@%Q)d?YaMxYP0Eb z8r9#)fJnTwy*@MGEdZW{!S89$bAuZdF`mWg@!PNbccbiwI;{Remj*bwi@K4&<#FXK zi8%>Cv!0bW#UcWWNehgc<3l`8Nr4C9-(Y1>g9Y!gdh)PvxJTuu@$x}Rd5O@;2~w=r zsq2LwZ~k(c5)c)oM-`nYcmsEYo9Fy_!yR<2KrokpLUT1 zW*0(0X|FV8?zYmEZRk{!zb5ad3f4dc&Ys!RnJu5Xtz$0;J^N%+aLycAz;k1$dLHLG zh#$clA}FHHNVUn>@=Lzn{nAZnxcYO~rr(_%4%|5!E!SyPhMu&qe&FuFZLaje#<aI=WSYoOw)Gf7s1);_aTiZMDb_=c%fDBL5%MQs&q%SvGP&ts)mQY zUKiB8@d`Ar1DDGO1_gA6!XRReZ;TQFl~d?t=vj3N)@2h>QJVAq-K8{9d@z~y>5ql1 zF!$K*<`vU7qU>+OB&j&IW5t|HABtGBtqaB$h`88)uNya2kq~>G+}E3)97X?d?X|7{ zh+b5$_XQ7@`CkU4YBZ4ZicaIz;HJCe&$X>2c0zqZRYIA(Ebhf{5*{ z^}+P|!=gIU!Od?hnyn%34}5ohY#k0-af!@^~#N3_bZcP-z=aIME(Ac-hMb7n1InKrGHG7c(|3#j8)(#3pAWxkeVaiOcdj zkC=m`FL!Mt^P!byU$1WLC?i=+vuJl1$P8iDo z(Dg<}(M^-L0(|?=Z823?(nMLqlX^$EDV)2xdG$;uC6O<14!V}}Y0NL$Rfe8o6qRVQ#^u09k-qgFOzYPe| zUUNC`aa3MCQzi#6=Y|?xJRQi~yH+mgxE%*t1?&lr`|Xs`PU2Vr2QkqCFmC9S7E@@4 znETWznbHh9VSf*Yn9Uo~^Z7mw`Sns}D;{BD{1N?68N!(x*;~o_l~O!h>jX20%#xU` z9DV%yOPV0t?{_KOMmZxU;HUrmg8L~oWb(P}RQ=zSLfpzKC!XV96G$}EJ5k^JsU5B_ zC|vrZ;j^0oE!ATpEQ}pi`ZLCXL$y`ZbxZ@vgb-8VJS~;A%7JIRa4Bkiw&DZv-sCga zRzV@UFhos)6i?LOcXcSvh?Yg;N-*NV^WeOp0)L}VI z?skJ;>$hgj?@eZ_XyW{s!u)~plt-c?1Y)KB{h{wn{+l6P#VkWFz3$_s>J6?I97oqRX>zC5X>+!xII^!T%qoxQN_h*`hsxgj)te9_2H_)(I=N zAu|W%C>^Y7<5p{_tfN%&S2wFa7Ec+Cmuu*1zk0lx!Czc($HtDhrrqvzbr)+J>HG?d zuI|4AjWAdCk0DA<^NDTo#B6Gb;nw|2PvT{;nLBu)G1;cL(|TWNvcwWfUFaA`X{^6a zQ>oyz;oJ}oZ1-UYGx4gF%2|K?8tfIg(q{j302OrS&F_fI#M+*rsWDI48N~n+4Uq zQAOWg5bOgV7uCmNxJO%2F)_#MWJxtK!`uvrV2>iTovH^R#xb^2flDd5kyPvlcBEq7jJ&TBYZ__I7D}YTCdlrhC zlIXiWh(CpnN(70!OAMdB)>B`kIFFa;c`)xD8K{&@%hMC^-I(TfRJpcSyjPUEEl$#< z<;~juStYAgqgr93WL*Fqo>lalSr2AK4r={Krh(VxhO-)?V*F_h1aysQ-^Q{aF@@jv z-l54{8yC*IaoS$jFB~owg05yi>sB23HGB>v;VQkko|>t-QHkmr(Ju*eU!;Q8LJOH5 z`X)iep9DUB%@>Yv{CoG41APkC@c5csrhXN{Z7Z`iq}*+3rn)B zSQ2HIsN$0cQPwvtCo&cg%FZ2as-fV@?C}bJ-t&==89m()>#OrHMkAI49rCT}m(@bx z&t=nM6*Ptu?>;d+cVdjtUn-%9tM*!tHq8{3wd&PNb%3)+6|Y{Ac$>B9G@eqiKY5n9KR%xc3_Um7$Icei`;i7LZF}U$Tpy+M z=S!VmYw=PV@v{bYhQbZNoM(>+>AdJ>e+_Azi~&oH9#48Ir)2up&lJjfEO&cdI*ul= z4Z`d@3qgXXg-xG5lQq0fljAnhE}t&$jX6}P5_95#CV=>Go-f^(e#|2SR>!C+F|-Mr zkYB&)ac0odMKSKHM+`~3Ln&wyWJuy6olxXzwc|)m4I7BgJN?KnIVtZv880-yzeHhO z1&NE`kj1**m>SToP1aI(n?kN zvkYUW-I2ldkn`Ks&c~A5cV`1HqR>vj)9#m2(-a9kraKG%KQz^DO8x$<-&XcmhQ+*n z=|OBjSO^wSLKyjgvyl}Y3OhLge`tIC7Kh7}@2-EU!vA#(GOwtKiJ>)1J8uXgZ=JcX z$o)+NV+ET1X^rA#^OOz*>u>$KB*RzTlQ=oq$if?`WvWvSo79 zjfE!k2h0>C3b8I-!qzcz;NR!{72hcwvP~J9^yqn>O`$4r84b7sWC+aobHA{=>Bck1 z+Z_HCN*;I+6v}kz_kQ05Fz8TmgBn5xlJph3a_zn=?RA;`Dh{s>i|9#yeML(h^6LxB zVr%1^GkKuCT=nPwQV0^oA1#RbNLQo^9$#IQ%22rcetz?+&j0P*(VRG}4BG&d7eUhZ z;jx=>;e%=lMb?AcTD_ZJ3i{8l`=T|xO|@8#=|Y(cX^>d?v;M*PA|P$*di7O0B#z*;~i<|E6R2PmCcfLx^VhXOl$!PV99yvbLxfNF+nm?0FzhStLP z+e+`0l8m<)7U3s+sw;s`xV!2X^KEu>m yJgUWD0&nBt#q4)oBkqZjDy=S4nmxvus()I73E}E)(D%DD;@c#oOd!mT| literal 0 HcmV?d00001 diff --git a/src/activate/handleUri.ts b/src/activate/handleUri.ts index 05440c7683e..96a24fe6fac 100644 --- a/src/activate/handleUri.ts +++ b/src/activate/handleUri.ts @@ -6,7 +6,6 @@ export const handleUri = async (uri: vscode.Uri) => { const path = uri.path const query = new URLSearchParams(uri.query.replace(/\+/g, "%2B")) const visibleProvider = ClineProvider.getVisibleInstance() - if (!visibleProvider) { return } @@ -26,6 +25,13 @@ export const handleUri = async (uri: vscode.Uri) => { } break } + case "/requesty": { + const code = query.get("code") + if (code) { + await visibleProvider.handleRequestyCallback(code) + } + break + } default: break } diff --git a/src/api/providers/__tests__/requesty.test.ts b/src/api/providers/__tests__/requesty.test.ts index 47921a1c532..e761b4d765d 100644 --- a/src/api/providers/__tests__/requesty.test.ts +++ b/src/api/providers/__tests__/requesty.test.ts @@ -1,6 +1,6 @@ import { Anthropic } from "@anthropic-ai/sdk" import OpenAI from "openai" -import { ApiHandlerOptions, ModelInfo, requestyModelInfoSaneDefaults } from "../../../shared/api" +import { ApiHandlerOptions, ModelInfo, requestyDefaultModelInfo } from "../../../shared/api" import { RequestyHandler } from "../requesty" import { convertToOpenAiMessages } from "../../transform/openai-format" import { convertToR1Format } from "../../transform/r1-format" @@ -18,14 +18,17 @@ describe("RequestyHandler", () => { requestyApiKey: "test-key", requestyModelId: "test-model", requestyModelInfo: { - maxTokens: 1000, - contextWindow: 4000, - supportsPromptCache: false, + maxTokens: 8192, + contextWindow: 200_000, supportsImages: true, - inputPrice: 1, - outputPrice: 10, - cacheReadsPrice: 0.1, - cacheWritesPrice: 1.5, + supportsComputerUse: true, + supportsPromptCache: true, + inputPrice: 3.0, + outputPrice: 15.0, + cacheWritesPrice: 3.75, + cacheReadsPrice: 0.3, + description: + "Claude 3.7 Sonnet is an advanced large language model with improved reasoning, coding, and problem-solving capabilities. It introduces a hybrid reasoning approach, allowing users to choose between rapid responses and extended, step-by-step processing for complex tasks. The model demonstrates notable improvements in coding, particularly in front-end development and full-stack updates, and excels in agentic workflows, where it can autonomously navigate multi-step processes. Claude 3.7 Sonnet maintains performance parity with its predecessor in standard mode while offering an extended reasoning mode for enhanced accuracy in math, coding, and instruction-following tasks. Read more at the [blog post here](https://www.anthropic.com/news/claude-3-7-sonnet)", }, openAiStreamingEnabled: true, includeMaxTokens: true, // Add this to match the implementation @@ -115,7 +118,7 @@ describe("RequestyHandler", () => { outputTokens: 10, cacheWriteTokens: 5, cacheReadTokens: 15, - totalCost: 0.000119, // (10 * 1 / 1,000,000) + (5 * 1.5 / 1,000,000) + (15 * 0.1 / 1,000,000) + (10 * 10 / 1,000,000) + totalCost: 0.00020325000000000003, // (10 * 3 / 1,000,000) + (5 * 3.75 / 1,000,000) + (15 * 0.3 / 1,000,000) + (10 * 15 / 1,000,000) (the ...0 is a fp skew) }, ]) @@ -123,8 +126,30 @@ describe("RequestyHandler", () => { model: defaultOptions.requestyModelId, temperature: 0, messages: [ - { role: "system", content: systemPrompt }, - { role: "user", content: "Hello" }, + { + role: "system", + content: [ + { + cache_control: { + type: "ephemeral", + }, + text: systemPrompt, + type: "text", + }, + ], + }, + { + role: "user", + content: [ + { + cache_control: { + type: "ephemeral", + }, + text: "Hello", + type: "text", + }, + ], + }, ], stream: true, stream_options: { include_usage: true }, @@ -191,7 +216,7 @@ describe("RequestyHandler", () => { outputTokens: 5, cacheWriteTokens: 0, cacheReadTokens: 0, - totalCost: 0.00006, // (10 * 1 / 1,000,000) + (5 * 10 / 1,000,000) + totalCost: 0.000105, // (10 * 3 / 1,000,000) + (5 * 15 / 1,000,000) }, ]) @@ -199,7 +224,18 @@ describe("RequestyHandler", () => { model: defaultOptions.requestyModelId, messages: [ { role: "user", content: systemPrompt }, - { role: "user", content: "Hello" }, + { + role: "user", + content: [ + { + cache_control: { + type: "ephemeral", + }, + text: "Hello", + type: "text", + }, + ], + }, ], }) }) @@ -224,7 +260,7 @@ describe("RequestyHandler", () => { const result = handler.getModel() expect(result).toEqual({ id: defaultOptions.requestyModelId, - info: requestyModelInfoSaneDefaults, + info: defaultOptions.requestyModelInfo, }) }) }) diff --git a/src/api/providers/requesty.ts b/src/api/providers/requesty.ts index 434d6f43161..822db1a6b06 100644 --- a/src/api/providers/requesty.ts +++ b/src/api/providers/requesty.ts @@ -1,6 +1,6 @@ import axios from "axios" -import { ModelInfo, requestyModelInfoSaneDefaults, requestyDefaultModelId } from "../../shared/api" +import { ModelInfo, requestyDefaultModelInfo, requestyDefaultModelId } from "../../shared/api" import { calculateApiCostOpenAI, parseApiPrice } from "../../utils/cost" import { ApiStreamUsageChunk } from "../transform/stream" import { OpenAiHandler, OpenAiHandlerOptions } from "./openai" @@ -26,7 +26,7 @@ export class RequestyHandler extends OpenAiHandler { openAiApiKey: options.requestyApiKey, openAiModelId: options.requestyModelId ?? requestyDefaultModelId, openAiBaseUrl: "https://router.requesty.ai/v1", - openAiCustomModelInfo: options.requestyModelInfo ?? requestyModelInfoSaneDefaults, + openAiCustomModelInfo: options.requestyModelInfo ?? requestyDefaultModelInfo, }) } @@ -34,7 +34,7 @@ export class RequestyHandler extends OpenAiHandler { const modelId = this.options.requestyModelId ?? requestyDefaultModelId return { id: modelId, - info: this.options.requestyModelInfo ?? requestyModelInfoSaneDefaults, + info: this.options.requestyModelInfo ?? requestyDefaultModelInfo, } } diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 6777642c2e4..3d37c07fc84 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -10,7 +10,18 @@ import * as vscode from "vscode" import { changeLanguage, t } from "../../i18n" import { setPanel } from "../../activate/registerCommands" -import { ApiConfiguration, ApiProvider, ModelInfo, API_CONFIG_KEYS } from "../../shared/api" +import { + ApiConfiguration, + ApiProvider, + ModelInfo, + API_CONFIG_KEYS, + requestyDefaultModelId, + requestyDefaultModelInfo, + openRouterDefaultModelId, + openRouterDefaultModelInfo, + glamaDefaultModelId, + glamaDefaultModelInfo, +} from "../../shared/api" import { findLast } from "../../shared/array" import { supportPrompt } from "../../shared/support-prompt" import { GlobalFileNames } from "../../shared/globalFileNames" @@ -593,6 +604,8 @@ export class ClineProvider extends EventEmitter implements "codicon.css", ]) + const imagesUri = getUri(webview, this.contextProxy.extensionUri, ["assets", "images"]) + const file = "src/index.tsx" const scriptUri = `http://${localServerUrl}/${file}` @@ -611,7 +624,7 @@ export class ClineProvider extends EventEmitter implements `font-src ${webview.cspSource}`, `style-src ${webview.cspSource} 'unsafe-inline' https://* http://${localServerUrl} http://0.0.0.0:${localPort}`, `img-src ${webview.cspSource} data:`, - `script-src 'unsafe-eval' https://* https://*.posthog.com http://${localServerUrl} http://0.0.0.0:${localPort} 'nonce-${nonce}'`, + `script-src 'unsafe-eval' ${webview.cspSource} https://* https://*.posthog.com http://${localServerUrl} http://0.0.0.0:${localPort} 'nonce-${nonce}'`, `connect-src https://* https://*.posthog.com ws://${localServerUrl} ws://0.0.0.0:${localPort} http://${localServerUrl} http://0.0.0.0:${localPort}`, ] @@ -624,6 +637,9 @@ export class ClineProvider extends EventEmitter implements + Roo Code @@ -672,6 +688,8 @@ export class ClineProvider extends EventEmitter implements "codicon.css", ]) + const imagesUri = getUri(webview, this.contextProxy.extensionUri, ["assets", "images"]) + // const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, "assets", "main.js")) // const styleResetUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, "assets", "reset.css")) @@ -704,6 +722,9 @@ export class ClineProvider extends EventEmitter implements + Roo Code @@ -1811,23 +1832,7 @@ export class ClineProvider extends EventEmitter implements break case "upsertApiConfiguration": if (message.text && message.apiConfiguration) { - try { - await this.configManager.saveConfig(message.text, message.apiConfiguration) - const listApiConfig = await this.configManager.listConfig() - - await Promise.all([ - this.updateGlobalState("listApiConfigMeta", listApiConfig), - this.updateApiConfiguration(message.apiConfiguration), - this.updateGlobalState("currentApiConfigName", message.text), - ]) - - await this.postStateToWebview() - } catch (error) { - this.outputChannel.appendLine( - `Error create new api configuration: ${JSON.stringify(error, Object.getOwnPropertyNames(error), 2)}`, - ) - vscode.window.showErrorMessage(t("common:errors.create_api_config")) - } + await this.upsertApiConfiguration(message.text, message.apiConfiguration) } break case "renameApiConfiguration": @@ -2251,9 +2256,10 @@ export class ClineProvider extends EventEmitter implements // OpenRouter async handleOpenRouterCallback(code: string) { + let { apiConfiguration, currentApiConfigName } = await this.getState() + let apiKey: string try { - const { apiConfiguration } = await this.getState() const baseUrl = apiConfiguration.openRouterBaseUrl || "https://openrouter.ai/api/v1" // Extract the base domain for the auth endpoint const baseUrlDomain = baseUrl.match(/^(https?:\/\/[^\/]+)/)?.[1] || "https://openrouter.ai" @@ -2270,17 +2276,15 @@ export class ClineProvider extends EventEmitter implements throw error } - const openrouter: ApiProvider = "openrouter" - await this.contextProxy.setValues({ - apiProvider: openrouter, + const newConfiguration: ApiConfiguration = { + ...apiConfiguration, + apiProvider: "openrouter", openRouterApiKey: apiKey, - }) - - await this.postStateToWebview() - if (this.getCurrentCline()) { - this.getCurrentCline()!.api = buildApiHandler({ apiProvider: openrouter, openRouterApiKey: apiKey }) + openRouterModelId: apiConfiguration?.openRouterModelId || openRouterDefaultModelId, + openRouterModelInfo: apiConfiguration?.openRouterModelInfo || openRouterDefaultModelInfo, } - // await this.postMessageToWebview({ type: "action", action: "settingsButtonClicked" }) // bad ux if user is on welcome + + await this.upsertApiConfiguration(currentApiConfigName, newConfiguration) } // Glama @@ -2301,19 +2305,55 @@ export class ClineProvider extends EventEmitter implements throw error } - const glama: ApiProvider = "glama" - await this.contextProxy.setValues({ - apiProvider: glama, + const { apiConfiguration, currentApiConfigName } = await this.getState() + + const newConfiguration: ApiConfiguration = { + ...apiConfiguration, + apiProvider: "glama", glamaApiKey: apiKey, - }) - await this.postStateToWebview() - if (this.getCurrentCline()) { - this.getCurrentCline()!.api = buildApiHandler({ - apiProvider: glama, - glamaApiKey: apiKey, - }) + glamaModelId: apiConfiguration?.glamaModelId || glamaDefaultModelId, + glamaModelInfo: apiConfiguration?.glamaModelInfo || glamaDefaultModelInfo, + } + + await this.upsertApiConfiguration(currentApiConfigName, newConfiguration) + } + + // Requesty + + async handleRequestyCallback(code: string) { + let { apiConfiguration, currentApiConfigName } = await this.getState() + + const newConfiguration: ApiConfiguration = { + ...apiConfiguration, + apiProvider: "requesty", + requestyApiKey: code, + requestyModelId: apiConfiguration?.requestyModelId || requestyDefaultModelId, + requestyModelInfo: apiConfiguration?.requestyModelInfo || requestyDefaultModelInfo, + } + + await this.upsertApiConfiguration(currentApiConfigName, newConfiguration) + } + + // Save configuration + + async upsertApiConfiguration(configName: string, apiConfiguration: ApiConfiguration) { + try { + await this.configManager.saveConfig(configName, apiConfiguration) + const listApiConfig = await this.configManager.listConfig() + + await Promise.all([ + this.updateGlobalState("listApiConfigMeta", listApiConfig), + this.updateApiConfiguration(apiConfiguration), + this.updateGlobalState("currentApiConfigName", configName), + ]) + + await this.postStateToWebview() + } catch (error) { + this.outputChannel.appendLine( + `Error create new api configuration: ${JSON.stringify(error, Object.getOwnPropertyNames(error), 2)}`, + ) + vscode.window.showErrorMessage(t("common:errors.create_api_config")) } - // await this.postMessageToWebview({ type: "action", action: "settingsButtonClicked" }) // bad ux if user is on welcome } // Task history @@ -2627,14 +2667,7 @@ export class ClineProvider extends EventEmitter implements if (stateValues.apiProvider) { apiProvider = stateValues.apiProvider } else { - // Either new user or legacy user that doesn't have the apiProvider stored in state - // (If they're using OpenRouter or Bedrock, then apiProvider state will exist) - if (secretValues.apiKey) { - apiProvider = "anthropic" - } else { - // New users should default to openrouter - apiProvider = "openrouter" - } + apiProvider = "anthropic" } // Build the apiConfiguration object combining state values and secrets diff --git a/src/shared/api.ts b/src/shared/api.ts index 498bb922b84..ab672c6a110 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -740,15 +740,6 @@ export const openAiModelInfoSaneDefaults: ModelInfo = { outputPrice: 0, } -export const requestyModelInfoSaneDefaults: ModelInfo = { - maxTokens: -1, - contextWindow: 128_000, - supportsImages: true, - supportsPromptCache: false, - inputPrice: 0, - outputPrice: 0, -} - // Gemini // https://ai.google.dev/gemini-api/docs/models/gemini export type GeminiModelId = keyof typeof geminiModels diff --git a/webview-ui/package-lock.json b/webview-ui/package-lock.json index d6da7da4bf4..c884a5af8fd 100644 --- a/webview-ui/package-lock.json +++ b/webview-ui/package-lock.json @@ -31,6 +31,7 @@ "fzf": "^0.5.2", "i18next": "^24.2.2", "i18next-http-backend": "^3.0.2", + "knuth-shuffle-seeded": "^1.0.6", "lucide-react": "^0.475.0", "mermaid": "^11.4.1", "posthog-js": "^1.227.2", @@ -15017,6 +15018,14 @@ "node": ">=6" } }, + "node_modules/knuth-shuffle-seeded": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", + "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==", + "dependencies": { + "seed-random": "~2.2.0" + } + }, "node_modules/kolorist": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", @@ -19786,6 +19795,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", diff --git a/webview-ui/package.json b/webview-ui/package.json index a8d143b7d74..6c4c157176a 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -41,6 +41,7 @@ "fzf": "^0.5.2", "i18next": "^24.2.2", "i18next-http-backend": "^3.0.2", + "knuth-shuffle-seeded": "^1.0.6", "lucide-react": "^0.475.0", "mermaid": "^11.4.1", "posthog-js": "^1.227.2", diff --git a/webview-ui/src/components/common/Alert.tsx b/webview-ui/src/components/common/Alert.tsx deleted file mode 100644 index b16e799b910..00000000000 --- a/webview-ui/src/components/common/Alert.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { cn } from "@/lib/utils" -import { HTMLAttributes } from "react" - -type AlertProps = HTMLAttributes - -export const Alert = ({ className, children, ...props }: AlertProps) => ( -

- {children} -
-) diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index f202d518b13..f3e0f7822e0 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -1,6 +1,7 @@ import React, { memo, useCallback, useEffect, useMemo, useState } from "react" import { useAppTranslation } from "@/i18n/TranslationContext" import { Trans } from "react-i18next" +import { getRequestyAuthUrl, getOpenRouterAuthUrl, getGlamaAuthUrl } from "../../oauth/urls" import { useDebounce, useEvent } from "react-use" import { LanguageModelChatSelector } from "vscode" import { Checkbox } from "vscrui" @@ -279,7 +280,10 @@ const ApiOptions = ({ {t("settings:providers.apiKeyStorageNotice")} {!apiConfiguration?.openRouterApiKey && ( - + {t("settings:providers.getOpenRouterApiKey")} )} @@ -380,7 +384,10 @@ const ApiOptions = ({ {t("settings:providers.apiKeyStorageNotice")} {!apiConfiguration?.glamaApiKey && ( - + {t("settings:providers.getGlamaApiKey")} )} @@ -400,6 +407,14 @@ const ApiOptions = ({
{t("settings:providers.apiKeyStorageNotice")}
+ {!apiConfiguration?.requestyApiKey && ( + + {t("settings:providers.getRequestyApiKey")} + + )} )} @@ -1536,15 +1551,6 @@ const ApiOptions = ({ ) } -export function getGlamaAuthUrl(uriScheme?: string) { - const callbackUrl = `${uriScheme || "vscode"}://rooveterinaryinc.roo-cline/glama` - return `https://glama.ai/oauth/authorize?callback_url=${encodeURIComponent(callbackUrl)}` -} - -export function getOpenRouterAuthUrl(uriScheme?: string) { - return `https://openrouter.ai/auth?callback_url=${uriScheme || "vscode"}://rooveterinaryinc.roo-cline/openrouter` -} - export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration) { const provider = apiConfiguration?.apiProvider || "anthropic" const modelId = apiConfiguration?.apiModelId diff --git a/webview-ui/src/components/welcome/WelcomeView.tsx b/webview-ui/src/components/welcome/WelcomeView.tsx index 937c59a5f10..3b81f51b618 100644 --- a/webview-ui/src/components/welcome/WelcomeView.tsx +++ b/webview-ui/src/components/welcome/WelcomeView.tsx @@ -1,18 +1,17 @@ import { useCallback, useState } from "react" import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" - import { useExtensionState } from "../../context/ExtensionStateContext" import { validateApiConfiguration } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "../settings/ApiOptions" import { Tab, TabContent } from "../common/Tab" -import { Alert } from "../common/Alert" import { useAppTranslation } from "../../i18n/TranslationContext" +import { getRequestyAuthUrl, getOpenRouterAuthUrl } from "../../oauth/urls" +import knuthShuffle from "knuth-shuffle-seeded" const WelcomeView = () => { - const { apiConfiguration, currentApiConfigName, setApiConfiguration, uriScheme } = useExtensionState() + const { apiConfiguration, currentApiConfigName, setApiConfiguration, uriScheme, machineId } = useExtensionState() const { t } = useAppTranslation() - const [errorMessage, setErrorMessage] = useState(undefined) const handleSubmit = useCallback(() => { @@ -27,24 +26,92 @@ const WelcomeView = () => { vscode.postMessage({ type: "upsertApiConfiguration", text: currentApiConfigName, apiConfiguration }) }, [apiConfiguration, currentApiConfigName]) + // Using a lazy initializer so it reads once at mount + const [imagesBaseUri] = useState(() => { + const w = window as any + return w.IMAGES_BASE_URI || "" + }) + return (

{t("welcome:greeting")}

{t("welcome:introduction")}
- {t("welcome:notice")} - setApiConfiguration({ [field]: value })} - errorMessage={errorMessage} - setErrorMessage={setErrorMessage} - /> +
{t("welcome:chooseProvider")}
+ +
+

{t("welcome:startRouter")}

+ +
+ {/* Define the providers */} + {(() => { + // Provider card configuration + const providers = [ + { + slug: "requesty", + name: "Requesty", + description: t("welcome:routers.requesty.description"), + incentive: t("welcome:routers.requesty.incentive"), + authUrl: getRequestyAuthUrl(uriScheme), + }, + { + slug: "openrouter", + name: "OpenRouter", + description: t("welcome:routers.openrouter.description"), + authUrl: getOpenRouterAuthUrl(uriScheme), + }, + ] + + // Shuffle providers based on machine ID (will be consistent for the same machine) + const orderedProviders = [...providers] + knuthShuffle(orderedProviders, (machineId as any) || Date.now()) + + // Render the provider cards + return orderedProviders.map((provider, index) => ( + +
+ {provider.name} +
+
+
{provider.name}
+
+ {provider.description} +
+ {provider.incentive && ( +
{provider.incentive}
+ )} +
+
+ )) + })()} +
+ +
{t("welcome:or")}
+

{t("welcome:startCustom")}

+ setApiConfiguration({ [field]: value })} + errorMessage={errorMessage} + setErrorMessage={setErrorMessage} + /> +
- {t("welcome:start")} + + {t("welcome:start")} + {errorMessage &&
{errorMessage}
}
diff --git a/webview-ui/src/i18n/locales/ca/welcome.json b/webview-ui/src/i18n/locales/ca/welcome.json index bd2ebea05ac..89b1611881c 100644 --- a/webview-ui/src/i18n/locales/ca/welcome.json +++ b/webview-ui/src/i18n/locales/ca/welcome.json @@ -3,6 +3,18 @@ "introduction": "Puc fer tot tipus de tasques gràcies als últims avenços en capacitats de codificació agent i accés a eines que em permeten crear i editar fitxers, explorar projectes complexos, utilitzar el navegador i executar ordres de terminal (amb el teu permís, és clar). Fins i tot puc utilitzar MCP per crear noves eines i ampliar les meves pròpies capacitats.", "notice": "Per començar, aquesta extensió necessita un proveïdor d'API.", "start": "Som-hi!", + "chooseProvider": "Tria un proveïdor d'API per començar:", + "routers": { + "requesty": { + "description": "El teu router LLM optimitzat", + "incentive": "$1 de crèdit gratuït" + }, + "openrouter": { + "description": "Una interfície unificada per a LLMs" + } + }, + "startRouter": "Configuració ràpida a través d'un router", + "startCustom": "Utilitza la teva pròpia clau API", "telemetry": { "title": "Ajuda a millorar Roo Code", "anonymousTelemetry": "Envia dades d'ús i errors anònims per ajudar-nos a corregir errors i millorar l'extensió. No s'envia mai cap codi, text o informació personal.", @@ -10,5 +22,6 @@ "settings": "configuració", "allow": "Permetre", "deny": "Denegar" - } + }, + "or": "o" } diff --git a/webview-ui/src/i18n/locales/de/welcome.json b/webview-ui/src/i18n/locales/de/welcome.json index aded3848861..19fcb0eac34 100644 --- a/webview-ui/src/i18n/locales/de/welcome.json +++ b/webview-ui/src/i18n/locales/de/welcome.json @@ -3,6 +3,18 @@ "introduction": "Ich kann alle Arten von Aufgaben erledigen, dank der neuesten Durchbrüche in agentenbasierten Codierungsfähigkeiten und dem Zugang zu Tools, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (natürlich mit deiner Erlaubnis). Ich kann sogar MCP verwenden, um neue Tools zu erstellen und meine eigenen Fähigkeiten zu erweitern.", "notice": "Um loszulegen, benötigt diese Erweiterung einen API-Anbieter.", "start": "Los geht's!", + "chooseProvider": "Wähle einen API-Anbieter, um zu beginnen:", + "routers": { + "requesty": { + "description": "Dein optimierter LLM-Router", + "incentive": "$1 Guthaben gratis" + }, + "openrouter": { + "description": "Eine einheitliche Schnittstelle für LLMs" + } + }, + "startRouter": "Express-Einrichtung über einen Router", + "startCustom": "Eigenen API-Schlüssel verwenden", "telemetry": { "title": "Hilf, Roo Code zu verbessern", "anonymousTelemetry": "Sende anonyme Fehler- und Nutzungsdaten, um uns bei der Fehlerbehebung und Verbesserung der Erweiterung zu helfen. Es werden niemals Code, Texte oder persönliche Informationen gesendet.", @@ -10,5 +22,6 @@ "settings": "Einstellungen", "allow": "Erlauben", "deny": "Ablehnen" - } + }, + "or": "oder" } diff --git a/webview-ui/src/i18n/locales/en/welcome.json b/webview-ui/src/i18n/locales/en/welcome.json index f02021b7186..811d760c0f1 100644 --- a/webview-ui/src/i18n/locales/en/welcome.json +++ b/webview-ui/src/i18n/locales/en/welcome.json @@ -3,6 +3,18 @@ "introduction": "I can do all kinds of tasks thanks to the latest breakthroughs in agentic coding capabilities and access to tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own capabilities.", "notice": "To get started, this extension needs an API provider.", "start": "Let's go!", + "chooseProvider": "Choose an API provider to get started:", + "routers": { + "requesty": { + "description": "Your optimized LLM router", + "incentive": "$1 free credit" + }, + "openrouter": { + "description": "A unified interface for LLMs" + } + }, + "startRouter": "Express Setup Through a Router", + "startCustom": "Bring Your Own API Key", "telemetry": { "title": "Help Improve Roo Code", "anonymousTelemetry": "Send anonymous error and usage data to help us fix bugs and improve the extension. No code, prompts, or personal information is ever sent.", @@ -10,5 +22,6 @@ "settings": "settings", "allow": "Allow", "deny": "Deny" - } + }, + "or": "or" } diff --git a/webview-ui/src/i18n/locales/es/welcome.json b/webview-ui/src/i18n/locales/es/welcome.json index 9482732d492..b2289200a1c 100644 --- a/webview-ui/src/i18n/locales/es/welcome.json +++ b/webview-ui/src/i18n/locales/es/welcome.json @@ -3,6 +3,18 @@ "introduction": "Puedo realizar todo tipo de tareas gracias a los últimos avances en capacidades de codificación agentica y acceso a herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (con tu permiso, por supuesto). Incluso puedo usar MCP para crear nuevas herramientas y ampliar mis propias capacidades.", "notice": "Para comenzar, esta extensión necesita un proveedor de API.", "start": "¡Vamos!", + "chooseProvider": "Elige un proveedor de API para comenzar:", + "routers": { + "requesty": { + "description": "Tu router LLM optimizado", + "incentive": "$1 de crédito gratis" + }, + "openrouter": { + "description": "Una interfaz unificada para LLMs" + } + }, + "startRouter": "Configuración rápida a través de un router", + "startCustom": "Usa tu propia clave API", "telemetry": { "title": "Ayuda a mejorar Roo Code", "anonymousTelemetry": "Envía datos de uso y errores anónimos para ayudarnos a corregir errores y mejorar la extensión. Nunca se envía código, texto o información personal.", @@ -10,5 +22,6 @@ "settings": "configuración", "allow": "Permitir", "deny": "Denegar" - } + }, + "or": "o" } diff --git a/webview-ui/src/i18n/locales/fr/welcome.json b/webview-ui/src/i18n/locales/fr/welcome.json index 7e34e61a0a1..ca2038a4f5a 100644 --- a/webview-ui/src/i18n/locales/fr/welcome.json +++ b/webview-ui/src/i18n/locales/fr/welcome.json @@ -1,14 +1,27 @@ { "greeting": "Salut, je suis Roo !", - "introduction": "Je peux effectuer toutes sortes de tâches grâce aux dernières avancées en matière de capacités de codage agentique et à l'accès à des outils qui me permettent de créer et de modifier des fichiers, d'explorer des projets complexes, d'utiliser le navigateur et d'exécuter des commandes terminal (avec votre permission, bien sûr). Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.", + "introduction": "Je peux effectuer toutes sortes de tâches grâce aux dernières avancées en matière de capacités de codage agentique et à l'accès à des outils qui me permettent de créer et de modifier des fichiers, d'explorer des projets complexes, d'utiliser le navigateur et d'exécuter des commandes terminal (avec ta permission, bien sûr). Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.", "notice": "Pour commencer, cette extension a besoin d'un fournisseur d'API.", "start": "C'est parti !", + "chooseProvider": "Choisis un fournisseur d'API pour commencer :", + "routers": { + "requesty": { + "description": "Ton routeur LLM optimisé", + "incentive": "1$ de crédit gratuit" + }, + "openrouter": { + "description": "Une interface unifiée pour les LLMs" + } + }, + "startRouter": "Configuration rapide via un routeur", + "startCustom": "Utiliser ta propre clé API", "telemetry": { - "title": "Aidez à améliorer Roo Code", - "anonymousTelemetry": "Envoyez des données d'utilisation et d'erreurs anonymes pour nous aider à corriger les bugs et améliorer l'extension. Aucun code, texte ou information personnelle n'est jamais envoyé.", - "changeSettings": "Vous pouvez toujours modifier cela en bas des paramètres", + "title": "Aide à améliorer Roo Code", + "anonymousTelemetry": "Envoie des données d'utilisation et d'erreurs anonymes pour nous aider à corriger les bugs et améliorer l'extension. Aucun code, texte ou information personnelle n'est jamais envoyé.", + "changeSettings": "Tu peux toujours modifier cela en bas des paramètres", "settings": "paramètres", "allow": "Autoriser", "deny": "Refuser" - } + }, + "or": "ou" } diff --git a/webview-ui/src/i18n/locales/hi/welcome.json b/webview-ui/src/i18n/locales/hi/welcome.json index ef85bdc8bfc..6ec08c646b7 100644 --- a/webview-ui/src/i18n/locales/hi/welcome.json +++ b/webview-ui/src/i18n/locales/hi/welcome.json @@ -3,6 +3,18 @@ "introduction": "मैं सभी प्रकार के कार्य कर सकता हूँ, एजेंटिक कोडिंग क्षमताओं में नवीनतम सफलताओं और उन टूल्स तक पहुंच के लिए धन्यवाद जो मुझे फाइलें बनाने और संपादित करने, जटिल परियोजनाओं का पता लगाने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड निष्पादित करने की अनुमति देते हैं (आपकी अनुमति से, बिल्कुल)। मैं MCP का उपयोग करके नए टूल बना सकता हूँ और अपनी क्षमताओं का विस्तार कर सकता हूँ।", "notice": "शुरू करने के लिए, इस एक्सटेंशन को एक API प्रदाता की आवश्यकता है।", "start": "चलो शुरू करें!", + "chooseProvider": "शुरू करने के लिए एक API प्रदाता चुनें:", + "routers": { + "requesty": { + "description": "आपका अनुकूलित LLM राउटर", + "incentive": "$1 मुफ्त क्रेडिट" + }, + "openrouter": { + "description": "LLMs के लिए एक एकीकृत इंटरफेस" + } + }, + "startRouter": "राउटर के माध्यम से तेज़ सेटअप", + "startCustom": "अपनी खुद की API कुंजी का उपयोग करें", "telemetry": { "title": "Roo Code को बेहतर बनाने में मदद करें", "anonymousTelemetry": "बग ठीक करने और एक्सटेंशन को बेहतर बनाने में हमारी मदद करने के लिए गुमनाम त्रुटि और उपयोग डेटा भेजें। कोड, संकेत या व्यक्तिगत जानकारी कभी नहीं भेजी जाती है।", @@ -10,5 +22,6 @@ "settings": "सेटिंग्स", "allow": "अनुमति दें", "deny": "अस्वीकार करें" - } + }, + "or": "या" } diff --git a/webview-ui/src/i18n/locales/it/welcome.json b/webview-ui/src/i18n/locales/it/welcome.json index e05fc1c43e3..94dba7c2e90 100644 --- a/webview-ui/src/i18n/locales/it/welcome.json +++ b/webview-ui/src/i18n/locales/it/welcome.json @@ -3,6 +3,18 @@ "introduction": "Posso svolgere tutti i tipi di attività grazie ai più recenti progressi nelle capacità di codifica agentica e all'accesso a strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi terminal (con il tuo permesso, ovviamente). Posso persino utilizzare MCP per creare nuovi strumenti ed estendere le mie capacità.", "notice": "Per iniziare, questa estensione necessita di un fornitore di API.", "start": "Andiamo!", + "chooseProvider": "Scegli un fornitore di API per iniziare:", + "routers": { + "requesty": { + "description": "Il tuo router LLM ottimizzato", + "incentive": "$1 di credito gratuito" + }, + "openrouter": { + "description": "Un'interfaccia unificata per LLMs" + } + }, + "startRouter": "Configurazione rapida tramite router", + "startCustom": "Usa la tua chiave API", "telemetry": { "title": "Aiuta a migliorare Roo Code", "anonymousTelemetry": "Invia dati di utilizzo ed errori anonimi per aiutarci a correggere bug e migliorare l'estensione. Non viene mai inviato codice, testo o informazioni personali.", @@ -10,5 +22,6 @@ "settings": "impostazioni", "allow": "Consenti", "deny": "Nega" - } + }, + "or": "o" } diff --git a/webview-ui/src/i18n/locales/ja/welcome.json b/webview-ui/src/i18n/locales/ja/welcome.json index 9e5b30e4c95..6b614d3dd20 100644 --- a/webview-ui/src/i18n/locales/ja/welcome.json +++ b/webview-ui/src/i18n/locales/ja/welcome.json @@ -3,6 +3,18 @@ "introduction": "エージェント型コーディング能力の最新の進歩と、ファイルの作成・編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(もちろんあなたの許可を得て)を可能にするツールへのアクセスにより、あらゆる種類のタスクを実行できます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。", "notice": "開始するには、この拡張機能にはAPIプロバイダーが必要です。", "start": "さあ、始めましょう!", + "chooseProvider": "開始するにはAPIプロバイダーを選択してください:", + "routers": { + "requesty": { + "description": "最適化されたLLMルーター", + "incentive": "$1の無料クレジット" + }, + "openrouter": { + "description": "LLMsのための統一インターフェース" + } + }, + "startRouter": "ルーター経由の簡単セットアップ", + "startCustom": "自分のAPIキーを使用", "telemetry": { "title": "Roo Codeの改善にご協力ください", "anonymousTelemetry": "バグの修正と拡張機能の改善のため、匿名のエラーと使用データを送信してください。コード、プロンプト、個人情報は一切送信されません。", @@ -10,5 +22,6 @@ "settings": "設定", "allow": "許可", "deny": "拒否" - } + }, + "or": "または" } diff --git a/webview-ui/src/i18n/locales/ko/welcome.json b/webview-ui/src/i18n/locales/ko/welcome.json index b8b8cbd2527..83eb000af1b 100644 --- a/webview-ui/src/i18n/locales/ko/welcome.json +++ b/webview-ui/src/i18n/locales/ko/welcome.json @@ -3,6 +3,18 @@ "introduction": "에이전트 코딩 능력의 최신 발전과 파일 생성 및 편집, 복잡한 프로젝트 탐색, 브라우저 사용, 터미널 명령 실행(물론 사용자의 허락 하에)을 가능하게 하는 도구에 대한 접근 덕분에 모든 종류의 작업을 수행할 수 있습니다. MCP를 사용하여 새로운 도구를 만들고 제 능력을 확장할 수도 있습니다.", "notice": "시작하려면 이 확장 프로그램에 API 공급자가 필요합니다.", "start": "시작해 봅시다!", + "chooseProvider": "시작하려면 API 공급자를 선택하세요:", + "routers": { + "requesty": { + "description": "최적화된 LLM 라우터", + "incentive": "$1 무료 크레딧" + }, + "openrouter": { + "description": "LLM을 위한 통합 인터페이스" + } + }, + "startRouter": "라우터를 통한 빠른 설정", + "startCustom": "직접 API 키 사용하기", "telemetry": { "title": "Roo Code 개선에 도움 주세요", "anonymousTelemetry": "버그 수정 및 확장 기능 개선을 위해 익명의 오류 및 사용 데이터를 보내주세요. 코드, 프롬프트 또는 개인 정보는 절대 전송되지 않습니다.", @@ -10,5 +22,6 @@ "settings": "설정", "allow": "허용", "deny": "거부" - } + }, + "or": "또는" } diff --git a/webview-ui/src/i18n/locales/pl/welcome.json b/webview-ui/src/i18n/locales/pl/welcome.json index 0e6546bc21c..fb13723490b 100644 --- a/webview-ui/src/i18n/locales/pl/welcome.json +++ b/webview-ui/src/i18n/locales/pl/welcome.json @@ -3,6 +3,18 @@ "introduction": "Mogę wykonywać wszelkiego rodzaju zadania dzięki najnowszym osiągnięciom w zakresie możliwości kodowania agentowego i dostępu do narzędzi, które pozwalają mi tworzyć i edytować pliki, eksplorować złożone projekty, korzystać z przeglądarki i wykonywać polecenia terminalowe (oczywiście za Twoją zgodą). Mogę nawet używać MCP do tworzenia nowych narzędzi i rozszerzania własnych możliwości.", "notice": "Aby rozpocząć, to rozszerzenie potrzebuje dostawcy API.", "start": "Zaczynajmy!", + "chooseProvider": "Wybierz dostawcę API, aby rozpocząć:", + "routers": { + "requesty": { + "description": "Twój zoptymalizowany router LLM", + "incentive": "$1 darmowego kredytu" + }, + "openrouter": { + "description": "Ujednolicony interfejs dla LLMs" + } + }, + "startRouter": "Szybka konfiguracja przez router", + "startCustom": "Użyj własnego klucza API", "telemetry": { "title": "Pomóż ulepszyć Roo Code", "anonymousTelemetry": "Wyślij anonimowe dane o błędach i użyciu, aby pomóc nam w naprawianiu błędów i ulepszaniu rozszerzenia. Nigdy nie są wysyłane żadne kody, teksty ani informacje osobiste.", @@ -10,5 +22,6 @@ "settings": "ustawienia", "allow": "Zezwól", "deny": "Odmów" - } + }, + "or": "lub" } diff --git a/webview-ui/src/i18n/locales/pt-BR/welcome.json b/webview-ui/src/i18n/locales/pt-BR/welcome.json index c28386a6136..5f0fa0c193b 100644 --- a/webview-ui/src/i18n/locales/pt-BR/welcome.json +++ b/webview-ui/src/i18n/locales/pt-BR/welcome.json @@ -3,6 +3,18 @@ "introduction": "Posso realizar todos os tipos de tarefas graças aos últimos avanços nas capacidades de codificação agentica e ao acesso a ferramentas que me permitem criar e editar arquivos, explorar projetos complexos, usar o navegador e executar comandos de terminal (com sua permissão, é claro). Posso até usar o MCP para criar novas ferramentas e expandir minhas próprias capacidades.", "notice": "Para começar, esta extensão precisa de um provedor de API.", "start": "Vamos lá!", + "chooseProvider": "Escolha um provedor de API para começar:", + "routers": { + "requesty": { + "description": "Seu roteador LLM otimizado", + "incentive": "$1 de crédito grátis" + }, + "openrouter": { + "description": "Uma interface unificada para LLMs" + } + }, + "startRouter": "Configuração rápida através de um roteador", + "startCustom": "Use sua própria chave API", "telemetry": { "title": "Ajude a melhorar o Roo Code", "anonymousTelemetry": "Envie dados de uso e erros anônimos para nos ajudar a corrigir bugs e melhorar a extensão. Nenhum código, texto ou informação pessoal é enviado.", @@ -10,5 +22,6 @@ "settings": "configurações", "allow": "Permitir", "deny": "Negar" - } + }, + "or": "ou" } diff --git a/webview-ui/src/i18n/locales/tr/welcome.json b/webview-ui/src/i18n/locales/tr/welcome.json index 2f25a1e93d5..76bf97429e3 100644 --- a/webview-ui/src/i18n/locales/tr/welcome.json +++ b/webview-ui/src/i18n/locales/tr/welcome.json @@ -1,14 +1,27 @@ { "greeting": "Merhaba, ben Roo!", - "introduction": "Ajan tabanlı kodlama yeteneklerindeki son gelişmeler ve dosya oluşturma ve düzenleme, karmaşık projeleri keşfetme, tarayıcı kullanma ve terminal komutları çalıştırma (tabii ki sizin izninizle) gibi işlemleri yapmamı sağlayan araçlara erişim sayesinde her türlü görevi gerçekleştirebilirim. Hatta MCP'yi kullanarak yeni araçlar oluşturabilir ve kendi yeteneklerimi genişletebilirim.", + "introduction": "Ajan tabanlı kodlama yeteneklerindeki son gelişmeler ve dosya oluşturma ve düzenleme, karmaşık projeleri keşfetme, tarayıcı kullanma ve terminal komutları çalıştırma (tabii ki senin izninle) gibi işlemleri yapmamı sağlayan araçlara erişim sayesinde her türlü görevi gerçekleştirebilirim. Hatta MCP'yi kullanarak yeni araçlar oluşturabilir ve kendi yeteneklerimi genişletebilirim.", "notice": "Başlamak için bu eklentinin bir API sağlayıcısına ihtiyacı var.", "start": "Hadi başlayalım!", + "chooseProvider": "Başlamak için bir API sağlayıcısı seç:", + "routers": { + "requesty": { + "description": "Optimize edilmiş LLM yönlendiricin", + "incentive": "$1 ücretsiz kredi" + }, + "openrouter": { + "description": "LLM'ler için birleşik bir arayüz" + } + }, + "startRouter": "Yönlendirici Üzerinden Hızlı Kurulum", + "startCustom": "Kendi API Anahtarını Kullan", "telemetry": { - "title": "Roo Code'u Geliştirmeye Yardım Edin", - "anonymousTelemetry": "Hataları düzeltmemize ve eklentiyi geliştirmemize yardımcı olmak için anonim hata ve kullanım verileri gönderin. Hiçbir zaman kod, metin veya kişisel bilgi gönderilmez.", - "changeSettings": "Bunu her zaman ayarların altından değiştirebilirsiniz", + "title": "Roo Code'u Geliştirmeye Yardım Et", + "anonymousTelemetry": "Hataları düzeltmemize ve eklentiyi geliştirmemize yardımcı olmak için anonim hata ve kullanım verileri gönder. Hiçbir zaman kod, metin veya kişisel bilgi gönderilmez.", + "changeSettings": "Bunu her zaman ayarların altından değiştirebilirsin", "settings": "ayarlar", "allow": "İzin Ver", "deny": "Reddet" - } + }, + "or": "veya" } diff --git a/webview-ui/src/i18n/locales/vi/welcome.json b/webview-ui/src/i18n/locales/vi/welcome.json index 4801b80b7f4..91dcea70c67 100644 --- a/webview-ui/src/i18n/locales/vi/welcome.json +++ b/webview-ui/src/i18n/locales/vi/welcome.json @@ -3,6 +3,18 @@ "introduction": "Tôi có thể thực hiện nhiều loại nhiệm vụ nhờ vào những đột phá mới nhất trong khả năng lập trình dạng đại lý và quyền truy cập vào các công cụ cho phép tôi tạo & chỉnh sửa tệp, khám phá các dự án phức tạp, sử dụng trình duyệt và thực thi lệnh terminal (với sự cho phép của bạn, tất nhiên). Tôi thậm chí có thể sử dụng MCP để tạo công cụ mới và mở rộng khả năng của mình.", "notice": "Để bắt đầu, tiện ích mở rộng này cần một nhà cung cấp API.", "start": "Bắt đầu thôi!", + "chooseProvider": "Chọn một nhà cung cấp API để bắt đầu:", + "routers": { + "requesty": { + "description": "Bộ định tuyến LLM được tối ưu hóa của bạn", + "incentive": "$1 tín dụng miễn phí" + }, + "openrouter": { + "description": "Giao diện thống nhất cho các LLM" + } + }, + "startRouter": "Thiết lập nhanh qua bộ định tuyến", + "startCustom": "Sử dụng khóa API của riêng bạn", "telemetry": { "title": "Giúp cải thiện Roo Code", "anonymousTelemetry": "Gửi dữ liệu lỗi và sử dụng ẩn danh để giúp chúng tôi sửa lỗi và cải thiện tiện ích mở rộng. Không bao giờ gửi mã, lời nhắc hoặc thông tin cá nhân.", @@ -10,5 +22,6 @@ "settings": "cài đặt", "allow": "Cho phép", "deny": "Từ chối" - } + }, + "or": "hoặc" } diff --git a/webview-ui/src/i18n/locales/zh-CN/welcome.json b/webview-ui/src/i18n/locales/zh-CN/welcome.json index 523e026f526..27fc616cf67 100644 --- a/webview-ui/src/i18n/locales/zh-CN/welcome.json +++ b/webview-ui/src/i18n/locales/zh-CN/welcome.json @@ -3,6 +3,18 @@ "introduction": "得益于最新的代理编码能力突破和对各种工具的访问权限,我可以完成各种任务。我可以创建和编辑文件、探索复杂项目、使用浏览器,以及执行终端命令(当然,需要你的许可)。我甚至可以使用 MCP 创建新工具并扩展自己的能力。", "notice": "首先,请配置一个大模型 API 服务商。", "start": "开始吧!", + "chooseProvider": "选择一个 API 服务商开始:", + "routers": { + "requesty": { + "description": "你的优化 LLM 路由器", + "incentive": "$1 免费额度" + }, + "openrouter": { + "description": "LLM 的统一接口" + } + }, + "startRouter": "通过路由器快速设置", + "startCustom": "使用你自己的 API 密钥", "telemetry": { "title": "帮助改进 Roo 代码", "changeSettings": "可以随时在设置页面底部更改此设置", @@ -10,5 +22,6 @@ "anonymousTelemetry": "发送匿名的错误和使用数据,以帮助我们修复错误并改进扩展程序。不会发送任何代码、提示或个人信息。", "allow": "允许", "deny": "拒绝" - } + }, + "or": "或" } diff --git a/webview-ui/src/i18n/locales/zh-TW/welcome.json b/webview-ui/src/i18n/locales/zh-TW/welcome.json index 7eadb6deb36..4d987628072 100644 --- a/webview-ui/src/i18n/locales/zh-TW/welcome.json +++ b/webview-ui/src/i18n/locales/zh-TW/welcome.json @@ -1,14 +1,27 @@ { "greeting": "嗨,我是 Roo!", - "introduction": "由於最新的代理編碼能力突破,以及能夠讓我創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令的工具(當然是在您的許可下),我可以完成各種任務。我甚至可以使用 MCP 創建新工具並擴展自己的能力。", + "introduction": "由於最新的代理編碼能力突破,以及能夠讓我創建和編輯文件、探索複雜項目、使用瀏覽器和執行終端命令的工具(當然是在你的許可下),我可以完成各種任務。我甚至可以使用 MCP 創建新工具並擴展自己的能力。", "notice": "要開始使用,此擴展需要一個 API 提供者。", "start": "我們開始吧!", + "chooseProvider": "選擇一個 API 提供者開始:", + "routers": { + "requesty": { + "description": "你的優化 LLM 路由器", + "incentive": "$1 免費額度" + }, + "openrouter": { + "description": "LLM 的統一接口" + } + }, + "startRouter": "通過路由器快速設置", + "startCustom": "使用你自己的 API 密鑰", "telemetry": { "title": "幫助改進 Roo Code", "anonymousTelemetry": "發送匿名的錯誤和使用數據,以幫助我們修復錯誤並改進擴展功能。不會發送任何代碼、提示或個人信息。", - "changeSettings": "您隨時可以在設置底部更改此選項", + "changeSettings": "你隨時可以在設置底部更改此選項", "settings": "設置", "allow": "允許", "deny": "拒絕" - } + }, + "or": "或" } diff --git a/webview-ui/src/oauth/urls.ts b/webview-ui/src/oauth/urls.ts new file mode 100644 index 00000000000..46a1815377c --- /dev/null +++ b/webview-ui/src/oauth/urls.ts @@ -0,0 +1,16 @@ +export function getCallbackUrl(provider: string, uriScheme?: string) { + const callbackUrl = `${uriScheme || "vscode"}://rooveterinaryinc.roo-cline/${provider}` + return encodeURIComponent(callbackUrl) +} + +export function getGlamaAuthUrl(uriScheme?: string) { + return `https://glama.ai/oauth/authorize?callback_url=${getCallbackUrl("glama", uriScheme)}` +} + +export function getOpenRouterAuthUrl(uriScheme?: string) { + return `https://openrouter.ai/auth?callback_url=${getCallbackUrl("openrouter", uriScheme)}` +} + +export function getRequestyAuthUrl(uriScheme?: string) { + return `https://app.requesty.ai/oauth/authorize?callback_url=${getCallbackUrl("requesty", uriScheme)}` +} diff --git a/webview-ui/src/types.d.ts b/webview-ui/src/types.d.ts new file mode 100644 index 00000000000..ff5ef47841a --- /dev/null +++ b/webview-ui/src/types.d.ts @@ -0,0 +1,5 @@ +// Type declarations for third-party modules + +declare module "knuth-shuffle-seeded" { + export default function knuthShuffle(array: T[], seed: any): T[] +} From a866a1c2711a3a79efd065062b49d91f11e5afd3 Mon Sep 17 00:00:00 2001 From: Sam Hoang Van Date: Mon, 24 Mar 2025 01:31:15 +0700 Subject: [PATCH 23/66] fix add line wrong index (#1927) --- src/core/Cline.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 262c2233b45..cdc9b5d6ec4 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -2333,7 +2333,7 @@ export class Cline extends EventEmitter { } else { content = addLineNumbers( await readLines(absolutePath, endLine, startLine), - startLine, + startLine + 1, ) } } else if (!isBinary && totalLines > maxReadFileLine) { From f07c7e6f0c17fc7d05cec58dc8f958c1885b87a3 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 23 Mar 2025 22:37:56 -0400 Subject: [PATCH 24/66] Fix question display logic when not streaming (#1931) --- webview-ui/src/components/chat/ChatRow.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 3f7d174b494..99c773873f0 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -252,7 +252,7 @@ export const ChatRowContent = ({ }, [message.ask, message.say, message.text]) const followUpData = useMemo(() => { - if (message.type === "ask" && message.ask === "followup" && message.partial === false) { + if (message.type === "ask" && message.ask === "followup" && !message.partial) { return JSON.parse(message.text || "{}") } return null From 29d784670114092d3e019587f4df4aa6ee3d5577 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 23 Mar 2025 23:15:00 -0400 Subject: [PATCH 25/66] Update suggestion button variant to make it work in all themes (#1932) --- webview-ui/src/components/chat/FollowUpSuggest.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/FollowUpSuggest.tsx b/webview-ui/src/components/chat/FollowUpSuggest.tsx index 76aa32c7fb3..24dc42ca7de 100644 --- a/webview-ui/src/components/chat/FollowUpSuggest.tsx +++ b/webview-ui/src/components/chat/FollowUpSuggest.tsx @@ -28,7 +28,7 @@ const FollowUpSuggest = ({ suggestions = [], onSuggestionClick, ts = 1 }: Follow {suggestions.map((suggestion) => (
- )} + }}> + {showContextMenu && ( +
+ +
+ )} +
+
+ { + if (typeof ref === "function") { + ref(el) + } else if (ref) { + ref.current = el + } + textAreaRef.current = el + }} + value={inputValue} + disabled={textAreaDisabled} + onChange={(e) => { + handleInputChange(e) + updateHighlights() + }} + onFocus={() => setIsFocused(true)} + onKeyDown={handleKeyDown} + onKeyUp={handleKeyUp} + onBlur={handleBlur} + onPaste={handlePaste} + onSelect={updateCursorPosition} + onMouseUp={updateCursorPosition} + onHeightChange={(height) => { + if (textAreaBaseHeight === undefined || height < textAreaBaseHeight) { + setTextAreaBaseHeight(height) + } + onHeightChange?.(height) + }} + placeholder={placeholderText} + minRows={3} + maxRows={15} + autoFocus={true} + className={cn( + "w-full", + "text-vscode-input-foreground", + "font-vscode-font-family", + "text-vscode-editor-font-size", + "leading-vscode-editor-line-height", + textAreaDisabled ? "cursor-not-allowed" : "cursor-text", + "py-1.5 px-2", + isFocused + ? "border border-vscode-focusBorder outline outline-vscode-focusBorder" + : isDraggingOver + ? "border-2 border-dashed border-vscode-focusBorder" + : "border border-transparent", + textAreaDisabled ? "opacity-50" : "opacity-100", + isDraggingOver + ? "bg-[color-mix(in_srgb,var(--vscode-input-background)_95%,var(--vscode-focusBorder))]" + : "bg-vscode-input-background", + "transition-background-color duration-150 ease-in-out", + "will-change-background-color", + "h-[100px]", + "[@media(min-width:150px)]:min-h-[80px]", + "[@media(min-width:425px)]:min-h-[60px]", + "box-border", + "rounded", + "resize-none", + "overflow-x-hidden", + "overflow-y-auto", + "pr-2", + "flex-none flex-grow", + "z-[2]", + "scrollbar-none", + )} + onScroll={() => updateHighlights()} + /> + {isTtsPlaying && ( + + )} + {!inputValue && ( +
+ {placeholderBottomText} +
+ )} +
+
{selectedImages.length > 0 && ( )} -
- {/* Left side - dropdowns container */} -
+
+
{/* Mode selector - fixed width */} -
+
(
{/* API configuration selector - flexible width */} -
+
(
{/* Right side - action buttons */} -
-
- {isEnhancingPrompt ? ( - - ) : ( - !textAreaDisabled && handleEnhancePrompt()} - style={{ fontSize: 16.5 }} - /> - )} -
- + + !shouldDisableImages && onSelectImages()} - style={{ fontSize: 16.5 }} + disabled={shouldDisableImages} + onClick={onSelectImages} /> - !textAreaDisabled && onSend()} - style={{ fontSize: 15 }} + disabled={textAreaDisabled} + onClick={onSend} />
diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 554e8ac0e3a..2157738ea22 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -974,10 +974,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie [], ) - const baseText = task ? t("chat:typeMessage") : t("chat:typeTask") - const placeholderText = - baseText + - `\n(${t("chat:addContext")}${shouldDisableImages ? `, ${t("chat:dragFiles")}` : `, ${t("chat:dragFilesImages")}`})` + const placeholderText = task ? t("chat:typeMessage") : t("chat:typeTask") const itemContent = useCallback( (index: number, messageOrGroup: ClineMessage | ClineMessage[]) => { diff --git a/webview-ui/src/components/chat/IconButton.tsx b/webview-ui/src/components/chat/IconButton.tsx new file mode 100644 index 00000000000..80f59ee74b6 --- /dev/null +++ b/webview-ui/src/components/chat/IconButton.tsx @@ -0,0 +1,48 @@ +import { cn } from "@/lib/utils" + +interface IconButtonProps extends React.ButtonHTMLAttributes { + iconClass: string + title: string + disabled?: boolean + isLoading?: boolean + style?: React.CSSProperties +} + +export const IconButton: React.FC = ({ + iconClass, + title, + className, + disabled, + isLoading, + onClick, + style, + ...props +}) => { + const buttonClasses = cn( + "relative inline-flex items-center justify-center", + "bg-transparent border-none p-1.5", + "rounded-md min-w-[28px] min-h-[28px]", + "text-vscode-foreground opacity-85", + "transition-all duration-150", + "hover:opacity-100 hover:bg-[rgba(255,255,255,0.03)] hover:border-[rgba(255,255,255,0.15)]", + "focus:outline-none focus-visible:ring-1 focus-visible:ring-vscode-focusBorder", + "active:bg-[rgba(255,255,255,0.1)]", + disabled && + "opacity-40 cursor-not-allowed grayscale-[30%] hover:bg-transparent hover:border-[rgba(255,255,255,0.08)] active:bg-transparent", + className, + ) + + const iconClasses = cn("codicon", iconClass, isLoading && "codicon-modifier-spin") + + return ( + + ) +} diff --git a/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx b/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx index e7abb1f65e9..9baf2a7c3c2 100644 --- a/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx @@ -31,6 +31,16 @@ const mockConvertToMentionPath = pathMentions.convertToMentionPath as jest.Mock // Mock ExtensionStateContext jest.mock("../../../context/ExtensionStateContext") +// Custom query function to get the enhance prompt button +const getEnhancePromptButton = () => { + return screen.getByRole("button", { + name: (_, element) => { + // Find the button with the sparkle icon + return element.querySelector(".codicon-sparkle") !== null + }, + }) +} + describe("ChatTextArea", () => { const defaultProps = { inputValue: "", @@ -66,10 +76,9 @@ describe("ChatTextArea", () => { filePaths: [], openedTabs: [], }) - render() - const enhanceButton = screen.getByRole("button", { name: /enhance prompt/i }) - expect(enhanceButton).toHaveClass("disabled") + const enhanceButton = getEnhancePromptButton() + expect(enhanceButton).toHaveClass("cursor-not-allowed") }) }) @@ -88,7 +97,7 @@ describe("ChatTextArea", () => { render() - const enhanceButton = screen.getByRole("button", { name: /enhance prompt/i }) + const enhanceButton = getEnhancePromptButton() fireEvent.click(enhanceButton) expect(mockPostMessage).toHaveBeenCalledWith({ @@ -108,7 +117,7 @@ describe("ChatTextArea", () => { render() - const enhanceButton = screen.getByRole("button", { name: /enhance prompt/i }) + const enhanceButton = getEnhancePromptButton() fireEvent.click(enhanceButton) expect(mockPostMessage).not.toHaveBeenCalled() @@ -125,7 +134,7 @@ describe("ChatTextArea", () => { render() - const enhanceButton = screen.getByRole("button", { name: /enhance prompt/i }) + const enhanceButton = getEnhancePromptButton() fireEvent.click(enhanceButton) const loadingSpinner = screen.getByText("", { selector: ".codicon-loading" }) @@ -150,7 +159,7 @@ describe("ChatTextArea", () => { rerender() // Verify the enhance button appears after apiConfiguration changes - expect(screen.getByRole("button", { name: /enhance prompt/i })).toBeInTheDocument() + expect(getEnhancePromptButton()).toBeInTheDocument() }) }) diff --git a/webview-ui/src/components/ui/select-dropdown.tsx b/webview-ui/src/components/ui/select-dropdown.tsx index 892d30255f1..5360eba9d9a 100644 --- a/webview-ui/src/components/ui/select-dropdown.tsx +++ b/webview-ui/src/components/ui/select-dropdown.tsx @@ -82,9 +82,12 @@ export const SelectDropdown = React.forwardRef From fe4e73279c30d6261e4681ffca37589e4ccef915 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:43:29 -0400 Subject: [PATCH 47/66] Update contributors list (#1949) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 36 ++++++++++++++++++------------------ locales/ca/README.md | 18 +++++++++--------- locales/de/README.md | 18 +++++++++--------- locales/es/README.md | 18 +++++++++--------- locales/fr/README.md | 18 +++++++++--------- locales/hi/README.md | 18 +++++++++--------- locales/it/README.md | 18 +++++++++--------- locales/ja/README.md | 18 +++++++++--------- locales/ko/README.md | 18 +++++++++--------- locales/pl/README.md | 18 +++++++++--------- locales/pt-BR/README.md | 18 +++++++++--------- locales/tr/README.md | 18 +++++++++--------- locales/vi/README.md | 18 +++++++++--------- locales/zh-CN/README.md | 18 +++++++++--------- locales/zh-TW/README.md | 18 +++++++++--------- 15 files changed, 144 insertions(+), 144 deletions(-) diff --git a/README.md b/README.md index e0e040afa55..eb8289871f4 100644 --- a/README.md +++ b/README.md @@ -180,24 +180,24 @@ Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| -| NyxJae
NyxJae
| MuriloFP
MuriloFP
| hannesrudolph
hannesrudolph
| d-oit
d-oit
| punkpeye
punkpeye
| monotykamary
monotykamary
| -| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| cannuri
cannuri
| lupuletic
lupuletic
| feifei325
feifei325
| -| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| KJ7LNW
KJ7LNW
| olweraltuve
olweraltuve
| -| qdaxb
qdaxb
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| -| Lunchb0ne
Lunchb0ne
| aheizi
aheizi
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| -| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| heyseth
heyseth
| -| anton-otee
anton-otee
| benzntech
benzntech
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| mdp
mdp
| napter
napter
| -| philfung
philfung
| AMHesch
AMHesch
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| bannzai
bannzai
| dairui1
dairui1
| -| dqroid
dqroid
| im47cn
im47cn
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| -| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| -| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| -| andreastempsch
andreastempsch
| Atlogit
Atlogit
| dleen
dleen
| diarmidmackenzie
diarmidmackenzie
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| -| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| -| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| Sarke
Sarke
| StevenTCramer
StevenTCramer
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| -| vladstudio
vladstudio
| | | | | | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| +| NyxJae
NyxJae
| MuriloFP
MuriloFP
| hannesrudolph
hannesrudolph
| d-oit
d-oit
| punkpeye
punkpeye
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| feifei325
feifei325
| +| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| KJ7LNW
KJ7LNW
| olweraltuve
olweraltuve
| +| qdaxb
qdaxb
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| +| Lunchb0ne
Lunchb0ne
| aheizi
aheizi
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| heyseth
heyseth
| +| anton-otee
anton-otee
| benzntech
benzntech
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| mdp
mdp
| napter
napter
| +| philfung
philfung
| AMHesch
AMHesch
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| im47cn
im47cn
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| dleen
dleen
| diarmidmackenzie
diarmidmackenzie
| +| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| +| Jdo300
Jdo300
| Chenjiayuan195
Chenjiayuan195
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| +| Sarke
Sarke
| 01Rian
01Rian
| | | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index 0d000f8bff6..99981a1a48f 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -182,20 +182,20 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index f30c62ce91b..e4af163f406 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -182,20 +182,20 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 4248615154b..920653fc2fc 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -182,20 +182,20 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 06ff17de7f6..9e3821a1be5 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -182,20 +182,20 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 19832932244..24cb95ec7a7 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -182,20 +182,20 @@ Roo Code को बेहतर बनाने में मदद करने |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index 1a76f144059..eed13190d19 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -182,20 +182,20 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 9d057775164..7137499d1bf 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -182,20 +182,20 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 6027c387ce1..bd0bfbaf819 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -182,20 +182,20 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index 9af84261399..83bdd257fd2 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -182,20 +182,20 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 80be1150bde..c69261d017d 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -182,20 +182,20 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index bbf2b6ac407..0d5c142e062 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -182,20 +182,20 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index e5e0cd26b07..413aedb4885 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -182,20 +182,20 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 3e731241391..c24ecf58280 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -182,20 +182,20 @@ code --install-extension bin/roo-cline-.vsix |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index db80189ce9d..f46e71bd332 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -182,20 +182,20 @@ code --install-extension bin/roo-cline-.vsix |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| |NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| -|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|cannuri
cannuri
|lupuletic
lupuletic
|feifei325
feifei325
| +|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| |wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
|dairui1
dairui1
| -|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| -|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
| -|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
| -|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
| -|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
| -|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|Sarke
Sarke
|StevenTCramer
StevenTCramer
|maekawataiki
maekawataiki
|tgfjt
tgfjt
| -|vladstudio
vladstudio
| | | | | | +|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| +|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| +|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| +|Sarke
Sarke
|01Rian
01Rian
| | | | | ## 許可證 From 6d8e7bbfbd6191dde75f998275ef2ca8bfc3fd14 Mon Sep 17 00:00:00 2001 From: Jiayuan Chen Date: Tue, 25 Mar 2025 09:48:26 +0800 Subject: [PATCH 48/66] Internationalization support for custom storage path functionality (#1957) Co-authored-by: Your Name --- src/i18n/locales/ca/common.json | 14 ++++++++++++-- src/i18n/locales/de/common.json | 14 ++++++++++++-- src/i18n/locales/en/common.json | 14 ++++++++++++-- src/i18n/locales/es/common.json | 14 ++++++++++++-- src/i18n/locales/fr/common.json | 14 ++++++++++++-- src/i18n/locales/hi/common.json | 14 ++++++++++++-- src/i18n/locales/it/common.json | 14 ++++++++++++-- src/i18n/locales/ja/common.json | 14 ++++++++++++-- src/i18n/locales/ko/common.json | 14 ++++++++++++-- src/i18n/locales/pl/common.json | 14 ++++++++++++-- src/i18n/locales/pt-BR/common.json | 14 ++++++++++++-- src/i18n/locales/tr/common.json | 14 ++++++++++++-- src/i18n/locales/vi/common.json | 14 ++++++++++++-- src/i18n/locales/zh-CN/common.json | 14 ++++++++++++-- src/i18n/locales/zh-TW/common.json | 14 ++++++++++++-- src/shared/storagePathManager.ts | 22 ++++++++++++---------- 16 files changed, 192 insertions(+), 40 deletions(-) diff --git a/src/i18n/locales/ca/common.json b/src/i18n/locales/ca/common.json index 967daab3d0c..b85fb0eb327 100644 --- a/src/i18n/locales/ca/common.json +++ b/src/i18n/locales/ca/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "El servidor de desenvolupament local no està executant-se, l'HMR no funcionarà. Si us plau, executa 'npm run dev' abans de llançar l'extensió per habilitar l'HMR.", "retrieve_current_mode": "Error en recuperar el mode actual de l'estat.", "failed_delete_repo": "Ha fallat l'eliminació del repositori o branca associada: {{error}}", - "failed_remove_directory": "Ha fallat l'eliminació del directori de tasques: {{error}}" + "failed_remove_directory": "Ha fallat l'eliminació del directori de tasques: {{error}}", + "custom_storage_path_unusable": "La ruta d'emmagatzematge personalitzada \"{{path}}\" no és utilitzable, s'utilitzarà la ruta predeterminada", + "cannot_access_path": "No es pot accedir a la ruta {{path}}: {{error}}" }, "warnings": { "no_terminal_content": "No s'ha seleccionat contingut de terminal", @@ -61,7 +63,9 @@ "mcp_server_restarting": "Reiniciant el servidor MCP {{serverName}}...", "mcp_server_connected": "Servidor MCP {{serverName}} connectat", "mcp_server_deleted": "Servidor MCP eliminat: {{serverName}}", - "mcp_server_not_found": "Servidor \"{{serverName}}\" no trobat a la configuració" + "mcp_server_not_found": "Servidor \"{{serverName}}\" no trobat a la configuració", + "custom_storage_path_set": "Ruta d'emmagatzematge personalitzada establerta: {{path}}", + "default_storage_path": "S'ha reprès l'ús de la ruta d'emmagatzematge predeterminada" }, "answers": { "yes": "Sí", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Error de tasca: Ha estat aturada i cancel·lada per l'usuari.", "deleted": "Fallada de tasca: Ha estat aturada i eliminada per l'usuari." + }, + "storage": { + "prompt_custom_path": "Introdueix una ruta d'emmagatzematge personalitzada per a l'historial de converses o deixa-ho buit per utilitzar la ubicació predeterminada", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Introdueix una ruta completa (p. ex. D:\\RooCodeStorage o /home/user/storage)", + "enter_valid_path": "Introdueix una ruta vàlida" } } diff --git a/src/i18n/locales/de/common.json b/src/i18n/locales/de/common.json index 0c5ed0e75fc..556185ee920 100644 --- a/src/i18n/locales/de/common.json +++ b/src/i18n/locales/de/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "Der lokale Entwicklungsserver läuft nicht, HMR wird nicht funktionieren. Bitte führen Sie 'npm run dev' vor dem Start der Erweiterung aus, um HMR zu aktivieren.", "retrieve_current_mode": "Fehler beim Abrufen des aktuellen Modus aus dem Zustand.", "failed_delete_repo": "Fehler beim Löschen des zugehörigen Shadow-Repositorys oder -Zweigs: {{error}}", - "failed_remove_directory": "Fehler beim Entfernen des Aufgabenverzeichnisses: {{error}}" + "failed_remove_directory": "Fehler beim Entfernen des Aufgabenverzeichnisses: {{error}}", + "custom_storage_path_unusable": "Benutzerdefinierter Speicherpfad \"{{path}}\" ist nicht verwendbar, Standardpfad wird verwendet", + "cannot_access_path": "Zugriff auf Pfad {{path}} nicht möglich: {{error}}" }, "warnings": { "no_terminal_content": "Kein Terminal-Inhalt ausgewählt", @@ -61,7 +63,9 @@ "mcp_server_restarting": "MCP-Server {{serverName}} wird neu gestartet...", "mcp_server_connected": "MCP-Server {{serverName}} verbunden", "mcp_server_deleted": "MCP-Server gelöscht: {{serverName}}", - "mcp_server_not_found": "Server \"{{serverName}}\" nicht in der Konfiguration gefunden" + "mcp_server_not_found": "Server \"{{serverName}}\" nicht in der Konfiguration gefunden", + "custom_storage_path_set": "Benutzerdefinierter Speicherpfad festgelegt: {{path}}", + "default_storage_path": "Auf Standardspeicherpfad zurückgesetzt" }, "answers": { "yes": "Ja", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und abgebrochen.", "deleted": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und gelöscht." + }, + "storage": { + "prompt_custom_path": "Gib den benutzerdefinierten Speicherpfad für den Gesprächsverlauf ein, leer lassen für Standardspeicherort", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Bitte gib einen absoluten Pfad ein (z.B. D:\\RooCodeStorage oder /home/user/storage)", + "enter_valid_path": "Bitte gib einen gültigen Pfad ein" } } diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index f3a2e86a963..60554f23c71 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "Local development server is not running, HMR will not work. Please run 'npm run dev' before launching the extension to enable HMR.", "retrieve_current_mode": "Error: failed to retrieve current mode from state.", "failed_delete_repo": "Failed to delete associated shadow repository or branch: {{error}}", - "failed_remove_directory": "Failed to remove task directory: {{error}}" + "failed_remove_directory": "Failed to remove task directory: {{error}}", + "custom_storage_path_unusable": "Custom storage path \"{{path}}\" is unusable, will use default path", + "cannot_access_path": "Cannot access path {{path}}: {{error}}" }, "warnings": { "no_terminal_content": "No terminal content selected", @@ -61,7 +63,9 @@ "mcp_server_restarting": "Restarting {{serverName}} MCP server...", "mcp_server_connected": "{{serverName}} MCP server connected", "mcp_server_deleted": "Deleted MCP server: {{serverName}}", - "mcp_server_not_found": "Server \"{{serverName}}\" not found in configuration" + "mcp_server_not_found": "Server \"{{serverName}}\" not found in configuration", + "custom_storage_path_set": "Custom storage path set: {{path}}", + "default_storage_path": "Reverted to using default storage path" }, "answers": { "yes": "Yes", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Task error: It was stopped and canceled by the user.", "deleted": "Task failure: It was stopped and deleted by the user." + }, + "storage": { + "prompt_custom_path": "Enter custom conversation history storage path, leave empty to use default location", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Please enter an absolute path (e.g. D:\\RooCodeStorage or /home/user/storage)", + "enter_valid_path": "Please enter a valid path" } } diff --git a/src/i18n/locales/es/common.json b/src/i18n/locales/es/common.json index 53d35f97d6d..7faa80d7d67 100644 --- a/src/i18n/locales/es/common.json +++ b/src/i18n/locales/es/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "El servidor de desarrollo local no está en ejecución, HMR no funcionará. Por favor, ejecuta 'npm run dev' antes de lanzar la extensión para habilitar HMR.", "retrieve_current_mode": "Error al recuperar el modo actual del estado.", "failed_delete_repo": "Error al eliminar el repositorio o rama asociada: {{error}}", - "failed_remove_directory": "Error al eliminar el directorio de tareas: {{error}}" + "failed_remove_directory": "Error al eliminar el directorio de tareas: {{error}}", + "custom_storage_path_unusable": "La ruta de almacenamiento personalizada \"{{path}}\" no es utilizable, se usará la ruta predeterminada", + "cannot_access_path": "No se puede acceder a la ruta {{path}}: {{error}}" }, "warnings": { "no_terminal_content": "No hay contenido de terminal seleccionado", @@ -61,7 +63,9 @@ "mcp_server_restarting": "Reiniciando el servidor MCP {{serverName}}...", "mcp_server_connected": "Servidor MCP {{serverName}} conectado", "mcp_server_deleted": "Servidor MCP eliminado: {{serverName}}", - "mcp_server_not_found": "Servidor \"{{serverName}}\" no encontrado en la configuración" + "mcp_server_not_found": "Servidor \"{{serverName}}\" no encontrado en la configuración", + "custom_storage_path_set": "Ruta de almacenamiento personalizada establecida: {{path}}", + "default_storage_path": "Se ha vuelto a usar la ruta de almacenamiento predeterminada" }, "answers": { "yes": "Sí", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Error de tarea: Fue detenida y cancelada por el usuario.", "deleted": "Fallo de tarea: Fue detenida y eliminada por el usuario." + }, + "storage": { + "prompt_custom_path": "Ingresa la ruta de almacenamiento personalizada para el historial de conversaciones, déjala vacía para usar la ubicación predeterminada", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Por favor, ingresa una ruta absoluta (por ejemplo, D:\\RooCodeStorage o /home/user/storage)", + "enter_valid_path": "Por favor, ingresa una ruta válida" } } diff --git a/src/i18n/locales/fr/common.json b/src/i18n/locales/fr/common.json index 1091994db09..addadb4f805 100644 --- a/src/i18n/locales/fr/common.json +++ b/src/i18n/locales/fr/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "Le serveur de développement local n'est pas en cours d'exécution, HMR ne fonctionnera pas. Veuillez exécuter 'npm run dev' avant de lancer l'extension pour activer l'HMR.", "retrieve_current_mode": "Erreur lors de la récupération du mode actuel à partir du state.", "failed_delete_repo": "Échec de la suppression du repo fantôme ou de la branche associée : {{error}}", - "failed_remove_directory": "Échec de la suppression du répertoire de tâches : {{error}}" + "failed_remove_directory": "Échec de la suppression du répertoire de tâches : {{error}}", + "custom_storage_path_unusable": "Le chemin de stockage personnalisé \"{{path}}\" est inutilisable, le chemin par défaut sera utilisé", + "cannot_access_path": "Impossible d'accéder au chemin {{path}} : {{error}}" }, "warnings": { "no_terminal_content": "Aucun contenu de terminal sélectionné", @@ -61,7 +63,9 @@ "mcp_server_restarting": "Redémarrage du serveur MCP {{serverName}}...", "mcp_server_connected": "Serveur MCP {{serverName}} connecté", "mcp_server_deleted": "Serveur MCP supprimé : {{serverName}}", - "mcp_server_not_found": "Serveur \"{{serverName}}\" introuvable dans la configuration" + "mcp_server_not_found": "Serveur \"{{serverName}}\" introuvable dans la configuration", + "custom_storage_path_set": "Chemin de stockage personnalisé défini : {{path}}", + "default_storage_path": "Retour au chemin de stockage par défaut" }, "answers": { "yes": "Oui", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Erreur de tâche : Elle a été arrêtée et annulée par l'utilisateur.", "deleted": "Échec de la tâche : Elle a été arrêtée et supprimée par l'utilisateur." + }, + "storage": { + "prompt_custom_path": "Entrez le chemin de stockage personnalisé pour l'historique des conversations, laissez vide pour utiliser l'emplacement par défaut", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Veuillez entrer un chemin absolu (ex. D:\\RooCodeStorage ou /home/user/storage)", + "enter_valid_path": "Veuillez entrer un chemin valide" } } diff --git a/src/i18n/locales/hi/common.json b/src/i18n/locales/hi/common.json index ca1053d04e6..096ae98d073 100644 --- a/src/i18n/locales/hi/common.json +++ b/src/i18n/locales/hi/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "स्थानीय विकास सर्वर चल नहीं रहा है, HMR काम नहीं करेगा। कृपया HMR सक्षम करने के लिए एक्सटेंशन लॉन्च करने से पहले 'npm run dev' चलाएँ।", "retrieve_current_mode": "स्टेट से वर्तमान मोड प्राप्त करने में त्रुटि।", "failed_delete_repo": "संबंधित शैडो रिपॉजिटरी या ब्रांच हटाने में विफल: {{error}}", - "failed_remove_directory": "टास्क डायरेक्टरी हटाने में विफल: {{error}}" + "failed_remove_directory": "टास्क डायरेक्टरी हटाने में विफल: {{error}}", + "custom_storage_path_unusable": "कस्टम स्टोरेज पाथ \"{{path}}\" उपयोग योग्य नहीं है, डिफ़ॉल्ट पाथ का उपयोग किया जाएगा", + "cannot_access_path": "पाथ {{path}} तक पहुंच नहीं पा रहे हैं: {{error}}" }, "warnings": { "no_terminal_content": "कोई टर्मिनल सामग्री चयनित नहीं", @@ -61,7 +63,9 @@ "mcp_server_restarting": "{{serverName}} MCP सर्वर पुनः प्रारंभ हो रहा है...", "mcp_server_connected": "{{serverName}} MCP सर्वर कनेक्टेड", "mcp_server_deleted": "MCP सर्वर हटाया गया: {{serverName}}", - "mcp_server_not_found": "सर्वर \"{{serverName}}\" कॉन्फ़िगरेशन में नहीं मिला" + "mcp_server_not_found": "सर्वर \"{{serverName}}\" कॉन्फ़िगरेशन में नहीं मिला", + "custom_storage_path_set": "कस्टम स्टोरेज पाथ सेट किया गया: {{path}}", + "default_storage_path": "डिफ़ॉल्ट स्टोरेज पाथ का उपयोग पुनः शुरू किया गया" }, "answers": { "yes": "हां", @@ -73,5 +77,11 @@ "tasks": { "canceled": "टास्क त्रुटि: इसे उपयोगकर्ता द्वारा रोका और रद्द किया गया था।", "deleted": "टास्क विफलता: इसे उपयोगकर्ता द्वारा रोका और हटाया गया था।" + }, + "storage": { + "prompt_custom_path": "वार्तालाप इतिहास के लिए कस्टम स्टोरेज पाथ दर्ज करें, डिफ़ॉल्ट स्थान का उपयोग करने के लिए खाली छोड़ दें", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "कृपया एक पूर्ण पाथ दर्ज करें (उदाहरण: D:\\RooCodeStorage या /home/user/storage)", + "enter_valid_path": "कृपया एक वैध पाथ दर्ज करें" } } diff --git a/src/i18n/locales/it/common.json b/src/i18n/locales/it/common.json index 6104611f2b9..3fde39957f3 100644 --- a/src/i18n/locales/it/common.json +++ b/src/i18n/locales/it/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "Il server di sviluppo locale non è in esecuzione, l'HMR non funzionerà. Esegui 'npm run dev' prima di avviare l'estensione per abilitare l'HMR.", "retrieve_current_mode": "Errore durante il recupero della modalità corrente dallo stato.", "failed_delete_repo": "Impossibile eliminare il repository o il ramo associato: {{error}}", - "failed_remove_directory": "Impossibile rimuovere la directory delle attività: {{error}}" + "failed_remove_directory": "Impossibile rimuovere la directory delle attività: {{error}}", + "custom_storage_path_unusable": "Il percorso di archiviazione personalizzato \"{{path}}\" non è utilizzabile, verrà utilizzato il percorso predefinito", + "cannot_access_path": "Impossibile accedere al percorso {{path}}: {{error}}" }, "warnings": { "no_terminal_content": "Nessun contenuto del terminale selezionato", @@ -61,7 +63,9 @@ "mcp_server_restarting": "Riavvio del server MCP {{serverName}}...", "mcp_server_connected": "Server MCP {{serverName}} connesso", "mcp_server_deleted": "Server MCP eliminato: {{serverName}}", - "mcp_server_not_found": "Server \"{{serverName}}\" non trovato nella configurazione" + "mcp_server_not_found": "Server \"{{serverName}}\" non trovato nella configurazione", + "custom_storage_path_set": "Percorso di archiviazione personalizzato impostato: {{path}}", + "default_storage_path": "Tornato al percorso di archiviazione predefinito" }, "answers": { "yes": "Sì", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Errore attività: È stata interrotta e annullata dall'utente.", "deleted": "Fallimento attività: È stata interrotta ed eliminata dall'utente." + }, + "storage": { + "prompt_custom_path": "Inserisci il percorso di archiviazione personalizzato per la cronologia delle conversazioni, lascia vuoto per utilizzare la posizione predefinita", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Inserisci un percorso assoluto (ad esempio D:\\RooCodeStorage o /home/user/storage)", + "enter_valid_path": "Inserisci un percorso valido" } } diff --git a/src/i18n/locales/ja/common.json b/src/i18n/locales/ja/common.json index c507b0e46d6..b7a26604e07 100644 --- a/src/i18n/locales/ja/common.json +++ b/src/i18n/locales/ja/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "ローカル開発サーバーが実行されていないため、HMRは機能しません。HMRを有効にするには、拡張機能を起動する前に'npm run dev'を実行してください。", "retrieve_current_mode": "現在のモードを状態から取得する際にエラーが発生しました。", "failed_delete_repo": "関連するシャドウリポジトリまたはブランチの削除に失敗しました:{{error}}", - "failed_remove_directory": "タスクディレクトリの削除に失敗しました:{{error}}" + "failed_remove_directory": "タスクディレクトリの削除に失敗しました:{{error}}", + "custom_storage_path_unusable": "カスタムストレージパス \"{{path}}\" が使用できないため、デフォルトパスを使用します", + "cannot_access_path": "パス {{path}} にアクセスできません:{{error}}" }, "warnings": { "no_terminal_content": "選択されたターミナルコンテンツがありません", @@ -61,7 +63,9 @@ "mcp_server_restarting": "MCPサーバー{{serverName}}を再起動中...", "mcp_server_connected": "MCPサーバー{{serverName}}が接続されました", "mcp_server_deleted": "MCPサーバーが削除されました:{{serverName}}", - "mcp_server_not_found": "サーバー\"{{serverName}}\"が設定内に見つかりません" + "mcp_server_not_found": "サーバー\"{{serverName}}\"が設定内に見つかりません", + "custom_storage_path_set": "カスタムストレージパスが設定されました:{{path}}", + "default_storage_path": "デフォルトのストレージパスに戻りました" }, "answers": { "yes": "はい", @@ -73,5 +77,11 @@ "tasks": { "canceled": "タスクエラー:ユーザーによって停止およびキャンセルされました。", "deleted": "タスク失敗:ユーザーによって停止および削除されました。" + }, + "storage": { + "prompt_custom_path": "会話履歴のカスタムストレージパスを入力してください。デフォルトの場所を使用する場合は空のままにしてください", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "絶対パスを入力してください(例:D:\\RooCodeStorage または /home/user/storage)", + "enter_valid_path": "有効なパスを入力してください" } } diff --git a/src/i18n/locales/ko/common.json b/src/i18n/locales/ko/common.json index b7c9f0de24b..71636cffedb 100644 --- a/src/i18n/locales/ko/common.json +++ b/src/i18n/locales/ko/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "로컬 개발 서버가 실행되고 있지 않아 HMR이 작동하지 않습니다. HMR을 활성화하려면 확장 프로그램을 실행하기 전에 'npm run dev'를 실행하세요.", "retrieve_current_mode": "상태에서 현재 모드를 검색하는 데 오류가 발생했습니다.", "failed_delete_repo": "관련 shadow 저장소 또는 브랜치 삭제 실패: {{error}}", - "failed_remove_directory": "작업 디렉토리 제거 실패: {{error}}" + "failed_remove_directory": "작업 디렉토리 제거 실패: {{error}}", + "custom_storage_path_unusable": "사용자 지정 저장 경로 \"{{path}}\"를 사용할 수 없어 기본 경로를 사용합니다", + "cannot_access_path": "경로 {{path}}에 접근할 수 없습니다: {{error}}" }, "warnings": { "no_terminal_content": "선택된 터미널 내용이 없습니다", @@ -61,7 +63,9 @@ "mcp_server_restarting": "{{serverName}} MCP 서버를 재시작하는 중...", "mcp_server_connected": "{{serverName}} MCP 서버 연결됨", "mcp_server_deleted": "MCP 서버 삭제됨: {{serverName}}", - "mcp_server_not_found": "구성에서 서버 \"{{serverName}}\"을(를) 찾을 수 없습니다" + "mcp_server_not_found": "구성에서 서버 \"{{serverName}}\"을(를) 찾을 수 없습니다", + "custom_storage_path_set": "사용자 지정 저장 경로 설정됨: {{path}}", + "default_storage_path": "기본 저장 경로로 되돌아갔습니다" }, "answers": { "yes": "예", @@ -73,5 +77,11 @@ "tasks": { "canceled": "작업 오류: 사용자에 의해 중지 및 취소되었습니다.", "deleted": "작업 실패: 사용자에 의해 중지 및 삭제되었습니다." + }, + "storage": { + "prompt_custom_path": "대화 내역을 위한 사용자 지정 저장 경로를 입력하세요. 기본 위치를 사용하려면 비워두세요", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "절대 경로를 입력하세요 (예: D:\\RooCodeStorage 또는 /home/user/storage)", + "enter_valid_path": "유효한 경로를 입력하세요" } } diff --git a/src/i18n/locales/pl/common.json b/src/i18n/locales/pl/common.json index b23e771ad47..33231c5d85a 100644 --- a/src/i18n/locales/pl/common.json +++ b/src/i18n/locales/pl/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "Lokalny serwer deweloperski nie jest uruchomiony, HMR nie będzie działać. Uruchom 'npm run dev' przed uruchomieniem rozszerzenia, aby włączyć HMR.", "retrieve_current_mode": "Błąd podczas pobierania bieżącego trybu ze stanu.", "failed_delete_repo": "Nie udało się usunąć powiązanego repozytorium lub gałęzi pomocniczej: {{error}}", - "failed_remove_directory": "Nie udało się usunąć katalogu zadania: {{error}}" + "failed_remove_directory": "Nie udało się usunąć katalogu zadania: {{error}}", + "custom_storage_path_unusable": "Niestandardowa ścieżka przechowywania \"{{path}}\" nie jest użyteczna, zostanie użyta domyślna ścieżka", + "cannot_access_path": "Nie można uzyskać dostępu do ścieżki {{path}}: {{error}}" }, "warnings": { "no_terminal_content": "Nie wybrano zawartości terminala", @@ -61,7 +63,9 @@ "mcp_server_restarting": "Ponowne uruchamianie serwera MCP {{serverName}}...", "mcp_server_connected": "Serwer MCP {{serverName}} połączony", "mcp_server_deleted": "Usunięto serwer MCP: {{serverName}}", - "mcp_server_not_found": "Serwer \"{{serverName}}\" nie znaleziony w konfiguracji" + "mcp_server_not_found": "Serwer \"{{serverName}}\" nie znaleziony w konfiguracji", + "custom_storage_path_set": "Ustawiono niestandardową ścieżkę przechowywania: {{path}}", + "default_storage_path": "Wznowiono używanie domyślnej ścieżki przechowywania" }, "answers": { "yes": "Tak", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Błąd zadania: Zostało zatrzymane i anulowane przez użytkownika.", "deleted": "Niepowodzenie zadania: Zostało zatrzymane i usunięte przez użytkownika." + }, + "storage": { + "prompt_custom_path": "Wprowadź niestandardową ścieżkę przechowywania dla historii konwersacji lub pozostaw puste, aby użyć lokalizacji domyślnej", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Wprowadź pełną ścieżkę (np. D:\\RooCodeStorage lub /home/user/storage)", + "enter_valid_path": "Wprowadź prawidłową ścieżkę" } } diff --git a/src/i18n/locales/pt-BR/common.json b/src/i18n/locales/pt-BR/common.json index 6a3a0d7a2bd..17f36440654 100644 --- a/src/i18n/locales/pt-BR/common.json +++ b/src/i18n/locales/pt-BR/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "O servidor de desenvolvimento local não está em execução, o HMR não funcionará. Por favor, execute 'npm run dev' antes de iniciar a extensão para habilitar o HMR.", "retrieve_current_mode": "Erro ao recuperar o modo atual do estado.", "failed_delete_repo": "Falha ao excluir o repositório ou ramificação associada: {{error}}", - "failed_remove_directory": "Falha ao remover o diretório de tarefas: {{error}}" + "failed_remove_directory": "Falha ao remover o diretório de tarefas: {{error}}", + "custom_storage_path_unusable": "O caminho de armazenamento personalizado \"{{path}}\" não pode ser usado, será usado o caminho padrão", + "cannot_access_path": "Não é possível acessar o caminho {{path}}: {{error}}" }, "warnings": { "no_terminal_content": "Nenhum conteúdo do terminal selecionado", @@ -61,7 +63,9 @@ "mcp_server_restarting": "Reiniciando o servidor MCP {{serverName}}...", "mcp_server_connected": "Servidor MCP {{serverName}} conectado", "mcp_server_deleted": "Servidor MCP excluído: {{serverName}}", - "mcp_server_not_found": "Servidor \"{{serverName}}\" não encontrado na configuração" + "mcp_server_not_found": "Servidor \"{{serverName}}\" não encontrado na configuração", + "custom_storage_path_set": "Caminho de armazenamento personalizado definido: {{path}}", + "default_storage_path": "Retornado ao caminho de armazenamento padrão" }, "answers": { "yes": "Sim", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Erro na tarefa: Foi interrompida e cancelada pelo usuário.", "deleted": "Falha na tarefa: Foi interrompida e excluída pelo usuário." + }, + "storage": { + "prompt_custom_path": "Digite o caminho de armazenamento personalizado para o histórico de conversas, deixe em branco para usar o local padrão", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Por favor, digite um caminho absoluto (ex: D:\\RooCodeStorage ou /home/user/storage)", + "enter_valid_path": "Por favor, digite um caminho válido" } } diff --git a/src/i18n/locales/tr/common.json b/src/i18n/locales/tr/common.json index b8765b744a5..898deb47967 100644 --- a/src/i18n/locales/tr/common.json +++ b/src/i18n/locales/tr/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "Yerel geliştirme sunucusu çalışmıyor, HMR çalışmayacak. HMR'yi etkinleştirmek için uzantıyı başlatmadan önce lütfen 'npm run dev' komutunu çalıştırın.", "retrieve_current_mode": "Mevcut mod durumdan alınırken hata oluştu.", "failed_delete_repo": "İlişkili gölge depo veya dal silinemedi: {{error}}", - "failed_remove_directory": "Görev dizini kaldırılamadı: {{error}}" + "failed_remove_directory": "Görev dizini kaldırılamadı: {{error}}", + "custom_storage_path_unusable": "Özel depolama yolu \"{{path}}\" kullanılamıyor, varsayılan yol kullanılacak", + "cannot_access_path": "{{path}} yoluna erişilemiyor: {{error}}" }, "warnings": { "no_terminal_content": "Seçili terminal içeriği yok", @@ -61,7 +63,9 @@ "mcp_server_restarting": "{{serverName}} MCP sunucusu yeniden başlatılıyor...", "mcp_server_connected": "{{serverName}} MCP sunucusu bağlandı", "mcp_server_deleted": "MCP sunucusu silindi: {{serverName}}", - "mcp_server_not_found": "Yapılandırmada \"{{serverName}}\" sunucusu bulunamadı" + "mcp_server_not_found": "Yapılandırmada \"{{serverName}}\" sunucusu bulunamadı", + "custom_storage_path_set": "Özel depolama yolu ayarlandı: {{path}}", + "default_storage_path": "Varsayılan depolama yoluna geri dönüldü" }, "answers": { "yes": "Evet", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Görev hatası: Kullanıcı tarafından durduruldu ve iptal edildi.", "deleted": "Görev başarısız: Kullanıcı tarafından durduruldu ve silindi." + }, + "storage": { + "prompt_custom_path": "Konuşma geçmişi için özel depolama yolunu girin, varsayılan konumu kullanmak için boş bırakın", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Lütfen mutlak bir yol girin (örn. D:\\RooCodeStorage veya /home/user/storage)", + "enter_valid_path": "Lütfen geçerli bir yol girin" } } diff --git a/src/i18n/locales/vi/common.json b/src/i18n/locales/vi/common.json index 7cbea848cec..f07487989f0 100644 --- a/src/i18n/locales/vi/common.json +++ b/src/i18n/locales/vi/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "Máy chủ phát triển cục bộ không chạy, HMR sẽ không hoạt động. Vui lòng chạy 'npm run dev' trước khi khởi chạy tiện ích mở rộng để bật HMR.", "retrieve_current_mode": "Lỗi không thể truy xuất chế độ hiện tại từ trạng thái.", "failed_delete_repo": "Không thể xóa kho lưu trữ hoặc nhánh liên quan: {{error}}", - "failed_remove_directory": "Không thể xóa thư mục nhiệm vụ: {{error}}" + "failed_remove_directory": "Không thể xóa thư mục nhiệm vụ: {{error}}", + "custom_storage_path_unusable": "Đường dẫn lưu trữ tùy chỉnh \"{{path}}\" không thể sử dụng được, sẽ sử dụng đường dẫn mặc định", + "cannot_access_path": "Không thể truy cập đường dẫn {{path}}: {{error}}" }, "warnings": { "no_terminal_content": "Không có nội dung terminal được chọn", @@ -61,7 +63,9 @@ "mcp_server_restarting": "Đang khởi động lại máy chủ MCP {{serverName}}...", "mcp_server_connected": "Máy chủ MCP {{serverName}} đã kết nối", "mcp_server_deleted": "Đã xóa máy chủ MCP: {{serverName}}", - "mcp_server_not_found": "Không tìm thấy máy chủ \"{{serverName}}\" trong cấu hình" + "mcp_server_not_found": "Không tìm thấy máy chủ \"{{serverName}}\" trong cấu hình", + "custom_storage_path_set": "Đã thiết lập đường dẫn lưu trữ tùy chỉnh: {{path}}", + "default_storage_path": "Đã quay lại sử dụng đường dẫn lưu trữ mặc định" }, "answers": { "yes": "Có", @@ -73,5 +77,11 @@ "tasks": { "canceled": "Lỗi nhiệm vụ: Nó đã bị dừng và hủy bởi người dùng.", "deleted": "Nhiệm vụ thất bại: Nó đã bị dừng và xóa bởi người dùng." + }, + "storage": { + "prompt_custom_path": "Nhập đường dẫn lưu trữ tùy chỉnh cho lịch sử hội thoại, để trống để sử dụng vị trí mặc định", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "Vui lòng nhập đường dẫn tuyệt đối (ví dụ: D:\\RooCodeStorage hoặc /home/user/storage)", + "enter_valid_path": "Vui lòng nhập đường dẫn hợp lệ" } } diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index 591958aab31..ce6079d1d05 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "本地开发服务器未运行,HMR将不起作用。请在启动扩展前运行'npm run dev'以启用HMR。", "retrieve_current_mode": "从状态中检索当前模式失败。", "failed_delete_repo": "删除关联的影子仓库或分支失败:{{error}}", - "failed_remove_directory": "删除任务目录失败:{{error}}" + "failed_remove_directory": "删除任务目录失败:{{error}}", + "custom_storage_path_unusable": "自定义存储路径 \"{{path}}\" 不可用,将使用默认路径", + "cannot_access_path": "无法访问路径 {{path}}:{{error}}" }, "warnings": { "no_terminal_content": "没有选择终端内容", @@ -61,7 +63,9 @@ "mcp_server_restarting": "正在重启{{serverName}}MCP服务器...", "mcp_server_connected": "{{serverName}}MCP服务器已连接", "mcp_server_deleted": "已删除MCP服务器:{{serverName}}", - "mcp_server_not_found": "在配置中未找到服务器\"{{serverName}}\"" + "mcp_server_not_found": "在配置中未找到服务器\"{{serverName}}\"", + "custom_storage_path_set": "自定义存储路径已设置:{{path}}", + "default_storage_path": "已恢复使用默认存储路径" }, "answers": { "yes": "是", @@ -73,5 +77,11 @@ "tasks": { "canceled": "任务错误:它已被用户停止并取消。", "deleted": "任务失败:它已被用户停止并删除。" + }, + "storage": { + "prompt_custom_path": "输入自定义会话历史存储路径,留空以使用默认位置", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "请输入绝对路径(例如 D:\\RooCodeStorage 或 /home/user/storage)", + "enter_valid_path": "请输入有效的路径" } } diff --git a/src/i18n/locales/zh-TW/common.json b/src/i18n/locales/zh-TW/common.json index b2059d5547f..1b6bb92654e 100644 --- a/src/i18n/locales/zh-TW/common.json +++ b/src/i18n/locales/zh-TW/common.json @@ -48,7 +48,9 @@ "hmr_not_running": "本地開發服務器未運行,HMR將不起作用。請在啟動擴展前運行'npm run dev'以啟用HMR。", "retrieve_current_mode": "從狀態中檢索當前模式失敗。", "failed_delete_repo": "刪除關聯的影子倉庫或分支失敗:{{error}}", - "failed_remove_directory": "刪除任務目錄失敗:{{error}}" + "failed_remove_directory": "刪除任務目錄失敗:{{error}}", + "custom_storage_path_unusable": "自定義存儲路徑 \"{{path}}\" 不可用,將使用默認路徑", + "cannot_access_path": "無法訪問路徑 {{path}}:{{error}}" }, "warnings": { "no_terminal_content": "沒有選擇終端內容", @@ -61,7 +63,9 @@ "mcp_server_restarting": "正在重啟{{serverName}}MCP服務器...", "mcp_server_connected": "{{serverName}}MCP服務器已連接", "mcp_server_deleted": "已刪除MCP服務器:{{serverName}}", - "mcp_server_not_found": "在配置中未找到服務器\"{{serverName}}\"" + "mcp_server_not_found": "在配置中未找到服務器\"{{serverName}}\"", + "custom_storage_path_set": "自定義存儲路徑已設置:{{path}}", + "default_storage_path": "已恢復使用默認存儲路徑" }, "answers": { "yes": "是", @@ -73,5 +77,11 @@ "tasks": { "canceled": "任務錯誤:它已被用戶停止並取消。", "deleted": "任務失敗:它已被用戶停止並刪除。" + }, + "storage": { + "prompt_custom_path": "輸入自定義會話歷史存儲路徑,留空以使用默認位置", + "path_placeholder": "D:\\RooCodeStorage", + "enter_absolute_path": "請輸入絕對路徑(例如 D:\\RooCodeStorage 或 /home/user/storage)", + "enter_valid_path": "請輸入有效的路徑" } } diff --git a/src/shared/storagePathManager.ts b/src/shared/storagePathManager.ts index 29c79bd389f..1dde82623a6 100644 --- a/src/shared/storagePathManager.ts +++ b/src/shared/storagePathManager.ts @@ -1,6 +1,7 @@ import * as vscode from "vscode" import * as path from "path" import * as fs from "fs/promises" +import { t } from "../i18n" /** * Gets the base storage path for conversations @@ -39,9 +40,7 @@ export async function getStorageBasePath(defaultPath: string): Promise { // If path is unusable, report error and fall back to default path console.error(`Custom storage path is unusable: ${error instanceof Error ? error.message : String(error)}`) if (vscode.window) { - vscode.window.showErrorMessage( - `Custom storage path "${customStoragePath}" is unusable, will use default path`, - ) + vscode.window.showErrorMessage(t("common:errors.custom_storage_path_unusable", { path: customStoragePath })) } return defaultPath } @@ -98,8 +97,8 @@ export async function promptForCustomStoragePath(): Promise { const result = await vscode.window.showInputBox({ value: currentPath, - placeHolder: "D:\\RooCodeStorage", - prompt: "Enter custom conversation history storage path, leave empty to use default location", + placeHolder: t("common:storage.path_placeholder"), + prompt: t("common:storage.prompt_custom_path"), validateInput: (input) => { if (!input) { return null // Allow empty value (use default path) @@ -111,12 +110,12 @@ export async function promptForCustomStoragePath(): Promise { // Check if path is absolute if (!path.isAbsolute(input)) { - return "Please enter an absolute path (e.g. D:\\RooCodeStorage or /home/user/storage)" + return t("common:storage.enter_absolute_path") } return null // Path format is valid } catch (e) { - return "Please enter a valid path" + return t("common:storage.enter_valid_path") } }, }) @@ -131,14 +130,17 @@ export async function promptForCustomStoragePath(): Promise { try { // Test if path is accessible await fs.mkdir(result, { recursive: true }) - vscode.window.showInformationMessage(`Custom storage path set: ${result}`) + vscode.window.showInformationMessage(t("common:info.custom_storage_path_set", { path: result })) } catch (error) { vscode.window.showErrorMessage( - `Cannot access path ${result}: ${error instanceof Error ? error.message : String(error)}`, + t("common:errors.cannot_access_path", { + path: result, + error: error instanceof Error ? error.message : String(error), + }), ) } } else { - vscode.window.showInformationMessage("Reverted to using default storage path") + vscode.window.showInformationMessage(t("common:info.default_storage_path")) } } catch (error) { console.error("Failed to update configuration", error) From fbc31c3d992b7af2094b3f16ce2ce97b34e371c5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:54:20 -0400 Subject: [PATCH 49/66] Update contributors list (#1958) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 36 ++++++++++++++++++------------------ locales/ca/README.md | 10 +++++----- locales/de/README.md | 10 +++++----- locales/es/README.md | 10 +++++----- locales/fr/README.md | 10 +++++----- locales/hi/README.md | 10 +++++----- locales/it/README.md | 10 +++++----- locales/ja/README.md | 10 +++++----- locales/ko/README.md | 10 +++++----- locales/pl/README.md | 10 +++++----- locales/pt-BR/README.md | 10 +++++----- locales/tr/README.md | 10 +++++----- locales/vi/README.md | 10 +++++----- locales/zh-CN/README.md | 10 +++++----- locales/zh-TW/README.md | 10 +++++----- 15 files changed, 88 insertions(+), 88 deletions(-) diff --git a/README.md b/README.md index eb8289871f4..dbbbf4b7f37 100644 --- a/README.md +++ b/README.md @@ -180,24 +180,24 @@ Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| -| NyxJae
NyxJae
| MuriloFP
MuriloFP
| hannesrudolph
hannesrudolph
| d-oit
d-oit
| punkpeye
punkpeye
| monotykamary
monotykamary
| -| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| feifei325
feifei325
| -| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| KJ7LNW
KJ7LNW
| olweraltuve
olweraltuve
| -| qdaxb
qdaxb
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| -| Lunchb0ne
Lunchb0ne
| aheizi
aheizi
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| -| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| heyseth
heyseth
| -| anton-otee
anton-otee
| benzntech
benzntech
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| mdp
mdp
| napter
napter
| -| philfung
philfung
| AMHesch
AMHesch
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| bannzai
bannzai
| -| dairui1
dairui1
| dqroid
dqroid
| im47cn
im47cn
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| dleen
dleen
| diarmidmackenzie
diarmidmackenzie
| -| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| -| Jdo300
Jdo300
| Chenjiayuan195
Chenjiayuan195
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| -| Sarke
Sarke
| 01Rian
01Rian
| | | | | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| +| NyxJae
NyxJae
| MuriloFP
MuriloFP
| hannesrudolph
hannesrudolph
| d-oit
d-oit
| punkpeye
punkpeye
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| feifei325
feifei325
| +| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| KJ7LNW
KJ7LNW
| olweraltuve
olweraltuve
| +| qdaxb
qdaxb
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| +| Lunchb0ne
Lunchb0ne
| aheizi
aheizi
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| heyseth
heyseth
| +| anton-otee
anton-otee
| benzntech
benzntech
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| mdp
mdp
| napter
napter
| +| philfung
philfung
| tgfjt
tgfjt
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| im47cn
im47cn
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| chadgauth
chadgauth
| +| dleen
dleen
| diarmidmackenzie
diarmidmackenzie
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| Chenjiayuan195
Chenjiayuan195
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| | | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index 99981a1a48f..0a7bb701d36 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -188,14 +188,14 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index e4af163f406..33254d97276 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -188,14 +188,14 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 920653fc2fc..f4737a5e408 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -188,14 +188,14 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 9e3821a1be5..74c3b826cc3 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -188,14 +188,14 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 24cb95ec7a7..35f309d374a 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -188,14 +188,14 @@ Roo Code को बेहतर बनाने में मदद करने |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index eed13190d19..0db7b1b960b 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -188,14 +188,14 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 7137499d1bf..685ba476cf6 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -188,14 +188,14 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index bd0bfbaf819..56e6fd01a1e 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -188,14 +188,14 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index 83bdd257fd2..76b101b7fe3 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -188,14 +188,14 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index c69261d017d..a4fa85c0bbc 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -188,14 +188,14 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index 0d5c142e062..808255c13e4 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -188,14 +188,14 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index 413aedb4885..f0a6ede7f21 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -188,14 +188,14 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index c24ecf58280..3351788452f 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -188,14 +188,14 @@ code --install-extension bin/roo-cline-.vsix |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index f46e71bd332..298488570b7 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -188,14 +188,14 @@ code --install-extension bin/roo-cline-.vsix |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| |anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|AMHesch
AMHesch
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| |dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| |samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
| -|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
| -|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|Sarke
Sarke
|01Rian
01Rian
| | | | | +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## 許可證 From 4fa4943d5f6635ea73c4dc2389985b92cef5f6d4 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Mon, 24 Mar 2025 23:09:25 -0400 Subject: [PATCH 50/66] Revert "[clinerules] search clinerule in parent folders which make it easier to share within a github repo" (#1959) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revert "[clinerules] search clinerule in parent folders which make it easier …" This reverts commit 2953baef9760b1f98015bb9688c3388ef0430725. --- .../__tests__/custom-instructions.test.ts | 10 +---- .../prompts/sections/custom-instructions.ts | 45 +++---------------- src/integrations/misc/open-file.ts | 29 +----------- .../src/components/prompts/PromptsView.tsx | 8 ---- 4 files changed, 9 insertions(+), 83 deletions(-) diff --git a/src/core/prompts/sections/__tests__/custom-instructions.test.ts b/src/core/prompts/sections/__tests__/custom-instructions.test.ts index 5c47a48baa1..4dbb51c845b 100644 --- a/src/core/prompts/sections/__tests__/custom-instructions.test.ts +++ b/src/core/prompts/sections/__tests__/custom-instructions.test.ts @@ -106,15 +106,7 @@ describe("addCustomInstructions", () => { }) it("should combine all instruction types when provided", async () => { - // Mock implementation to return different values based on the file path - mockedFs.readFile.mockImplementation(((filePath: any) => { - // For .clinerules-test-mode, return mode-specific rules - if (filePath.toString().includes(".clinerules-test-mode")) { - return Promise.resolve("mode specific rules") - } - // For any other read operation, return empty - return Promise.reject({ code: "ENOENT" }) - }) as any) + mockedFs.readFile.mockResolvedValue("mode specific rules") const result = await addCustomInstructions( "mode instructions", diff --git a/src/core/prompts/sections/custom-instructions.ts b/src/core/prompts/sections/custom-instructions.ts index 823a87051ef..f076777585d 100644 --- a/src/core/prompts/sections/custom-instructions.ts +++ b/src/core/prompts/sections/custom-instructions.ts @@ -16,30 +16,12 @@ async function safeReadFile(filePath: string): Promise { } } -async function findRuleInDirectory(dir: string, ruleFile: string): Promise { - const filePath = path.join(dir, ruleFile) - const content = await safeReadFile(filePath) - - if (content) { - return content - } - - // Check if we've reached the root directory - const parentDir = path.dirname(dir) - if (parentDir === dir) { - return "" - } - - // Recursively check parent directory - return findRuleInDirectory(parentDir, ruleFile) -} - export async function loadRuleFiles(cwd: string): Promise { const ruleFiles = [".clinerules", ".cursorrules", ".windsurfrules"] let combinedRules = "" for (const file of ruleFiles) { - const content = await findRuleInDirectory(cwd, file) + const content = await safeReadFile(path.join(cwd, file)) if (content) { combinedRules += `\n# Rules from ${file}:\n${content}\n` } @@ -48,17 +30,6 @@ export async function loadRuleFiles(cwd: string): Promise { return combinedRules } -async function findCustomInstructionsFile(dir: string, filePattern: string): Promise { - // First try to find as a direct file - const content = await findRuleInDirectory(dir, filePattern) - if (content) { - return content - } - - // If not found as a file, check if it's raw content - return filePattern.trim() -} - export async function addCustomInstructions( modeCustomInstructions: string, globalCustomInstructions: string, @@ -83,16 +54,14 @@ export async function addCustomInstructions( ) } - // Add global instructions first - try to find as file or use raw content - const globalContent = await findCustomInstructionsFile(cwd, globalCustomInstructions) - if (globalContent) { - sections.push(`Global Instructions:\n${globalContent}`) + // Add global instructions first + if (typeof globalCustomInstructions === "string" && globalCustomInstructions.trim()) { + sections.push(`Global Instructions:\n${globalCustomInstructions.trim()}`) } - // Add mode-specific instructions - try to find as file or use raw content - const modeContent = await findCustomInstructionsFile(cwd, modeCustomInstructions) - if (modeContent) { - sections.push(`Mode-specific Instructions:\n${modeContent}`) + // Add mode-specific instructions after + if (typeof modeCustomInstructions === "string" && modeCustomInstructions.trim()) { + sections.push(`Mode-specific Instructions:\n${modeCustomInstructions.trim()}`) } // Add rules - include both mode-specific and generic rules if they exist diff --git a/src/integrations/misc/open-file.ts b/src/integrations/misc/open-file.ts index 572082c2512..5698e919de1 100644 --- a/src/integrations/misc/open-file.ts +++ b/src/integrations/misc/open-file.ts @@ -23,23 +23,6 @@ export async function openImage(dataUri: string) { interface OpenFileOptions { create?: boolean content?: string - searchParents?: boolean - startFromWorkspace?: boolean -} - -async function findFileInParentDirs(searchPath: string, fileName: string): Promise { - try { - const fullPath = path.join(searchPath, fileName) - await vscode.workspace.fs.stat(vscode.Uri.file(fullPath)) - return fullPath - } catch { - const parentDir = path.dirname(searchPath) - if (parentDir === searchPath) { - // Hit root - return null - } - return findFileInParentDirs(parentDir, fileName) - } } export async function openFile(filePath: string, options: OpenFileOptions = {}) { @@ -51,17 +34,7 @@ export async function openFile(filePath: string, options: OpenFileOptions = {}) } // If path starts with ./, resolve it relative to workspace root - let fullPath = filePath.startsWith("./") ? path.join(workspaceRoot, filePath.slice(2)) : filePath - - // Handle recursive search - if (options.searchParents) { - const startDir = options.startFromWorkspace ? workspaceRoot : path.dirname(fullPath) - const fileName = path.basename(filePath) - const foundPath = await findFileInParentDirs(startDir, fileName) - if (foundPath) { - fullPath = foundPath - } - } + const fullPath = filePath.startsWith("./") ? path.join(workspaceRoot, filePath.slice(2)) : filePath const uri = vscode.Uri.file(fullPath) diff --git a/webview-ui/src/components/prompts/PromptsView.tsx b/webview-ui/src/components/prompts/PromptsView.tsx index aaa291bc5af..4011e159508 100644 --- a/webview-ui/src/components/prompts/PromptsView.tsx +++ b/webview-ui/src/components/prompts/PromptsView.tsx @@ -462,8 +462,6 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { values: { create: true, content: JSON.stringify({ customModes: [] }, null, 2), - searchParents: true, - startFromWorkspace: true, }, }) setShowConfigMenu(false) @@ -810,8 +808,6 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { values: { create: true, content: "", - searchParents: true, - startFromWorkspace: true, }, }) }} @@ -919,8 +915,6 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { values: { create: true, content: "", - searchParents: true, - startFromWorkspace: true, }, }) }} @@ -976,8 +970,6 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { values: { create: true, content: "", - searchParents: true, - startFromWorkspace: true, }, }) } From 237ee329ee5c0297b859eb55f06e54ccd46225fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=BF=9C=E6=88=90?= <741096681@qq.com> Date: Tue, 25 Mar 2025 12:55:28 +0800 Subject: [PATCH 51/66] Support mcp image resource (#1962) handle mcp image resource --- src/core/Cline.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index bdf27981de2..f4074d263b2 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -2874,8 +2874,16 @@ export class Cline extends EventEmitter { }) .filter(Boolean) .join("\n\n") || "(Empty response)" - await this.say("mcp_server_response", resourceResultPretty) - pushToolResult(formatResponse.toolResult(resourceResultPretty)) + + // handle images (image must contain mimetype and blob) + let images: string[] = [] + resourceResult?.contents.forEach((item) => { + if (item.mimeType?.startsWith("image") && item.blob) { + images.push(item.blob) + } + }); + await this.say("mcp_server_response", resourceResultPretty, images) + pushToolResult(formatResponse.toolResult(resourceResultPretty, images)) break } } catch (error) { From 94421391121a12932a1e1de8a3763f15e46c27bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 00:58:18 -0400 Subject: [PATCH 52/66] Update contributors list (#1960) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 36 ++++++++++++++++++------------------ locales/ca/README.md | 16 ++++++++-------- locales/de/README.md | 16 ++++++++-------- locales/es/README.md | 16 ++++++++-------- locales/fr/README.md | 16 ++++++++-------- locales/hi/README.md | 16 ++++++++-------- locales/it/README.md | 16 ++++++++-------- locales/ja/README.md | 16 ++++++++-------- locales/ko/README.md | 16 ++++++++-------- locales/pl/README.md | 16 ++++++++-------- locales/pt-BR/README.md | 16 ++++++++-------- locales/tr/README.md | 16 ++++++++-------- locales/vi/README.md | 16 ++++++++-------- locales/zh-CN/README.md | 16 ++++++++-------- locales/zh-TW/README.md | 16 ++++++++-------- 15 files changed, 130 insertions(+), 130 deletions(-) diff --git a/README.md b/README.md index dbbbf4b7f37..136de9af483 100644 --- a/README.md +++ b/README.md @@ -180,24 +180,24 @@ Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| -| NyxJae
NyxJae
| MuriloFP
MuriloFP
| hannesrudolph
hannesrudolph
| d-oit
d-oit
| punkpeye
punkpeye
| monotykamary
monotykamary
| -| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| feifei325
feifei325
| -| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| KJ7LNW
KJ7LNW
| olweraltuve
olweraltuve
| -| qdaxb
qdaxb
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| -| Lunchb0ne
Lunchb0ne
| aheizi
aheizi
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| -| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| heyseth
heyseth
| -| anton-otee
anton-otee
| benzntech
benzntech
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| mdp
mdp
| napter
napter
| -| philfung
philfung
| tgfjt
tgfjt
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| bannzai
bannzai
| -| dairui1
dairui1
| dqroid
dqroid
| im47cn
im47cn
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| chadgauth
chadgauth
| -| dleen
dleen
| diarmidmackenzie
diarmidmackenzie
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| -| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| Chenjiayuan195
Chenjiayuan195
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| -| marvijo-code
marvijo-code
| kvokka
kvokka
| | | | | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| +| NyxJae
NyxJae
| MuriloFP
MuriloFP
| hannesrudolph
hannesrudolph
| d-oit
d-oit
| punkpeye
punkpeye
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| feifei325
feifei325
| +| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| KJ7LNW
KJ7LNW
| olweraltuve
olweraltuve
| +| qdaxb
qdaxb
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| +| Lunchb0ne
Lunchb0ne
| aheizi
aheizi
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| heyseth
heyseth
| +| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| +| benzntech
benzntech
| anton-otee
anton-otee
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| vladstudio
vladstudio
| +| AMHesch
AMHesch
| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| +| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| +| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| chadgauth
chadgauth
| +| dleen
dleen
| diarmidmackenzie
diarmidmackenzie
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| +| kvokka
kvokka
| Sarke
Sarke
| | | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index 0a7bb701d36..b7c0f9f5623 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -187,15 +187,15 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 33254d97276..4e213576534 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -187,15 +187,15 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index f4737a5e408..8aa10581410 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -187,15 +187,15 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 74c3b826cc3..878486e917a 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -187,15 +187,15 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 35f309d374a..e4be07bda5f 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -187,15 +187,15 @@ Roo Code को बेहतर बनाने में मदद करने |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index 0db7b1b960b..ad6b47891bc 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -187,15 +187,15 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 685ba476cf6..35294c8222d 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -187,15 +187,15 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 56e6fd01a1e..be85406f4c0 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -187,15 +187,15 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index 76b101b7fe3..8a715d3fd06 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -187,15 +187,15 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index a4fa85c0bbc..e50c12fcd3a 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -187,15 +187,15 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index 808255c13e4..de659590495 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -187,15 +187,15 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index f0a6ede7f21..3a26eb7ddb0 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -187,15 +187,15 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 3351788452f..5adaafffdce 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -187,15 +187,15 @@ code --install-extension bin/roo-cline-.vsix |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 298488570b7..0cfb790eb33 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -187,15 +187,15 @@ code --install-extension bin/roo-cline-.vsix |qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|mdp
mdp
|napter
napter
| -|philfung
philfung
|tgfjt
tgfjt
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| +|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| +|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| +|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| +|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| |dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|Chenjiayuan195
Chenjiayuan195
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| +|kvokka
kvokka
|Sarke
Sarke
| | | | | ## 許可證 From 1810efe496bab7c6d72a4468bb89d8c77479eb6a Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Tue, 25 Mar 2025 01:35:33 -0400 Subject: [PATCH 53/66] Additional checkbox for auto-approving reads and writes outside of the workspace (#1965) --- src/core/Cline.ts | 12 + src/core/webview/ClineProvider.ts | 14 + .../webview/__tests__/ClineProvider.test.ts | 2 + src/exports/roo-code.d.ts | 2 + src/shared/ExtensionMessage.ts | 3 + src/shared/WebviewMessage.ts | 2 + src/shared/globalState.ts | 2 + src/utils/pathUtils.ts | 24 ++ webview-ui/src/components/chat/ChatView.tsx | 64 +++- .../__tests__/ChatView.auto-approve.test.tsx | 280 ++++++++++++++++++ .../settings/AutoApproveSettings.tsx | 41 +++ .../src/components/settings/SettingsView.tsx | 9 + .../src/context/ExtensionStateContext.tsx | 6 + webview-ui/src/i18n/locales/ca/settings.json | 12 +- webview-ui/src/i18n/locales/de/settings.json | 12 +- webview-ui/src/i18n/locales/en/settings.json | 12 +- webview-ui/src/i18n/locales/es/settings.json | 12 +- webview-ui/src/i18n/locales/fr/settings.json | 12 +- webview-ui/src/i18n/locales/hi/settings.json | 12 +- webview-ui/src/i18n/locales/it/settings.json | 12 +- webview-ui/src/i18n/locales/ja/settings.json | 12 +- webview-ui/src/i18n/locales/ko/settings.json | 12 +- webview-ui/src/i18n/locales/pl/settings.json | 12 +- .../src/i18n/locales/pt-BR/settings.json | 12 +- webview-ui/src/i18n/locales/tr/settings.json | 12 +- webview-ui/src/i18n/locales/vi/settings.json | 12 +- .../src/i18n/locales/zh-CN/settings.json | 12 +- .../src/i18n/locales/zh-TW/settings.json | 12 +- 28 files changed, 598 insertions(+), 43 deletions(-) create mode 100644 src/utils/pathUtils.ts diff --git a/src/core/Cline.ts b/src/core/Cline.ts index f4074d263b2..5e306332979 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -11,6 +11,7 @@ import pWaitFor from "p-wait-for" import getFolderSize from "get-folder-size" import { serializeError } from "serialize-error" import * as vscode from "vscode" +import { isPathOutsideWorkspace } from "../utils/pathUtils" import { TokenUsage } from "../exports/roo-code" import { ApiHandler, buildApiHandler } from "../api" @@ -1606,9 +1607,14 @@ export class Cline extends EventEmitter { } } + // Determine if the path is outside the workspace + const fullPath = relPath ? path.resolve(this.cwd, removeClosingTag("path", relPath)) : "" + const isOutsideWorkspace = isPathOutsideWorkspace(fullPath) + const sharedMessageProps: ClineSayTool = { tool: fileExists ? "editedExistingFile" : "newFileCreated", path: getReadablePath(this.cwd, removeClosingTag("path", relPath)), + isOutsideWorkspace, } try { if (block.partial) { @@ -2245,9 +2251,15 @@ export class Cline extends EventEmitter { const relPath: string | undefined = block.params.path const startLineStr: string | undefined = block.params.start_line const endLineStr: string | undefined = block.params.end_line + + // Get the full path and determine if it's outside the workspace + const fullPath = relPath ? path.resolve(this.cwd, removeClosingTag("path", relPath)) : "" + const isOutsideWorkspace = isPathOutsideWorkspace(fullPath) + const sharedMessageProps: ClineSayTool = { tool: "readFile", path: getReadablePath(this.cwd, removeClosingTag("path", relPath)), + isOutsideWorkspace, } try { if (block.partial) { diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 1a1950959a7..b8d2c5d57e2 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -971,10 +971,18 @@ export class ClineProvider extends EventEmitter implements await this.updateGlobalState("alwaysAllowReadOnly", message.bool ?? undefined) await this.postStateToWebview() break + case "alwaysAllowReadOnlyOutsideWorkspace": + await this.updateGlobalState("alwaysAllowReadOnlyOutsideWorkspace", message.bool ?? undefined) + await this.postStateToWebview() + break case "alwaysAllowWrite": await this.updateGlobalState("alwaysAllowWrite", message.bool ?? undefined) await this.postStateToWebview() break + case "alwaysAllowWriteOutsideWorkspace": + await this.updateGlobalState("alwaysAllowWriteOutsideWorkspace", message.bool ?? undefined) + await this.postStateToWebview() + break case "alwaysAllowExecute": await this.updateGlobalState("alwaysAllowExecute", message.bool ?? undefined) await this.postStateToWebview() @@ -2490,7 +2498,9 @@ export class ClineProvider extends EventEmitter implements lastShownAnnouncementId, customInstructions, alwaysAllowReadOnly, + alwaysAllowReadOnlyOutsideWorkspace, alwaysAllowWrite, + alwaysAllowWriteOutsideWorkspace, alwaysAllowExecute, alwaysAllowBrowser, alwaysAllowMcp, @@ -2544,7 +2554,9 @@ export class ClineProvider extends EventEmitter implements apiConfiguration, customInstructions, alwaysAllowReadOnly: alwaysAllowReadOnly ?? false, + alwaysAllowReadOnlyOutsideWorkspace: alwaysAllowReadOnlyOutsideWorkspace ?? false, alwaysAllowWrite: alwaysAllowWrite ?? false, + alwaysAllowWriteOutsideWorkspace: alwaysAllowWriteOutsideWorkspace ?? false, alwaysAllowExecute: alwaysAllowExecute ?? false, alwaysAllowBrowser: alwaysAllowBrowser ?? false, alwaysAllowMcp: alwaysAllowMcp ?? false, @@ -2707,7 +2719,9 @@ export class ClineProvider extends EventEmitter implements lastShownAnnouncementId: stateValues.lastShownAnnouncementId, customInstructions: stateValues.customInstructions, alwaysAllowReadOnly: stateValues.alwaysAllowReadOnly ?? false, + alwaysAllowReadOnlyOutsideWorkspace: stateValues.alwaysAllowReadOnlyOutsideWorkspace ?? false, alwaysAllowWrite: stateValues.alwaysAllowWrite ?? false, + alwaysAllowWriteOutsideWorkspace: stateValues.alwaysAllowWriteOutsideWorkspace ?? false, alwaysAllowExecute: stateValues.alwaysAllowExecute ?? false, alwaysAllowBrowser: stateValues.alwaysAllowBrowser ?? false, alwaysAllowMcp: stateValues.alwaysAllowMcp ?? false, diff --git a/src/core/webview/__tests__/ClineProvider.test.ts b/src/core/webview/__tests__/ClineProvider.test.ts index 08f9b9f4b5d..1729831028a 100644 --- a/src/core/webview/__tests__/ClineProvider.test.ts +++ b/src/core/webview/__tests__/ClineProvider.test.ts @@ -434,7 +434,9 @@ describe("ClineProvider", () => { }, customInstructions: undefined, alwaysAllowReadOnly: false, + alwaysAllowReadOnlyOutsideWorkspace: false, alwaysAllowWrite: false, + alwaysAllowWriteOutsideWorkspace: false, alwaysAllowExecute: false, alwaysAllowBrowser: false, alwaysAllowMcp: false, diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 739ee93d142..fc02b51b736 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -182,7 +182,9 @@ export type GlobalStateKey = | "lastShownAnnouncementId" | "customInstructions" | "alwaysAllowReadOnly" + | "alwaysAllowReadOnlyOutsideWorkspace" | "alwaysAllowWrite" + | "alwaysAllowWriteOutsideWorkspace" | "alwaysAllowExecute" | "alwaysAllowBrowser" | "alwaysAllowMcp" diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index b7219de2f85..63e17ea365d 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -120,7 +120,9 @@ export interface ExtensionState { customModePrompts?: CustomModePrompts customSupportPrompts?: CustomSupportPrompts alwaysAllowReadOnly?: boolean + alwaysAllowReadOnlyOutsideWorkspace?: boolean alwaysAllowWrite?: boolean + alwaysAllowWriteOutsideWorkspace?: boolean alwaysAllowExecute?: boolean alwaysAllowBrowser?: boolean alwaysAllowMcp?: boolean @@ -192,6 +194,7 @@ export interface ClineSayTool { filePattern?: string mode?: string reason?: string + isOutsideWorkspace?: boolean } // Must keep in sync with system prompt. diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index d87be2a716d..52411bca6ff 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -22,7 +22,9 @@ export interface WebviewMessage { | "customInstructions" | "allowedCommands" | "alwaysAllowReadOnly" + | "alwaysAllowReadOnlyOutsideWorkspace" | "alwaysAllowWrite" + | "alwaysAllowWriteOutsideWorkspace" | "alwaysAllowExecute" | "webviewDidLaunch" | "newTask" diff --git a/src/shared/globalState.ts b/src/shared/globalState.ts index 5513fe71343..73b46eff589 100644 --- a/src/shared/globalState.ts +++ b/src/shared/globalState.ts @@ -49,7 +49,9 @@ export const GLOBAL_STATE_KEYS = [ "lastShownAnnouncementId", "customInstructions", "alwaysAllowReadOnly", + "alwaysAllowReadOnlyOutsideWorkspace", "alwaysAllowWrite", + "alwaysAllowWriteOutsideWorkspace", "alwaysAllowExecute", "alwaysAllowBrowser", "alwaysAllowMcp", diff --git a/src/utils/pathUtils.ts b/src/utils/pathUtils.ts new file mode 100644 index 00000000000..dae300f8f38 --- /dev/null +++ b/src/utils/pathUtils.ts @@ -0,0 +1,24 @@ +import * as vscode from "vscode" +import * as path from "path" + +/** + * Checks if a file path is outside all workspace folders + * @param filePath The file path to check + * @returns true if the path is outside all workspace folders, false otherwise + */ +export function isPathOutsideWorkspace(filePath: string): boolean { + // If there are no workspace folders, consider everything outside workspace for safety + if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { + return true + } + + // Normalize and resolve the path to handle .. and . components correctly + const absolutePath = path.resolve(filePath) + + // Check if the path is within any workspace folder + return !vscode.workspace.workspaceFolders.some((folder) => { + const folderPath = folder.uri.fsPath + // Path is inside a workspace if it equals the workspace path or is a subfolder + return absolutePath === folderPath || absolutePath.startsWith(folderPath + path.sep) + }) +} diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 2157738ea22..54e5e478da6 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -55,7 +55,9 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie mcpServers, alwaysAllowBrowser, alwaysAllowReadOnly, + alwaysAllowReadOnlyOutsideWorkspace, alwaysAllowWrite, + alwaysAllowWriteOutsideWorkspace, alwaysAllowExecute, alwaysAllowMcp, allowedCommands, @@ -649,26 +651,60 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie (message: ClineMessage | undefined) => { if (!autoApprovalEnabled || !message || message.type !== "ask") return false - return ( - (alwaysAllowBrowser && message.ask === "browser_action_launch") || - (alwaysAllowReadOnly && message.ask === "tool" && isReadOnlyToolAction(message)) || - (alwaysAllowWrite && message.ask === "tool" && isWriteToolAction(message)) || - (alwaysAllowExecute && message.ask === "command" && isAllowedCommand(message)) || - (alwaysAllowMcp && message.ask === "use_mcp_server" && isMcpToolAlwaysAllowed(message)) || - (alwaysAllowModeSwitch && - message.ask === "tool" && - JSON.parse(message.text || "{}")?.tool === "switchMode") || - (alwaysAllowSubtasks && - message.ask === "tool" && - ["newTask", "finishTask"].includes(JSON.parse(message.text || "{}")?.tool)) - ) + if (message.ask === "browser_action_launch") { + return alwaysAllowBrowser + } + + if (message.ask === "use_mcp_server") { + return alwaysAllowMcp && isMcpToolAlwaysAllowed(message) + } + + if (message.ask === "command") { + return alwaysAllowExecute && isAllowedCommand(message) + } + + // For read/write operations, check if it's outside workspace and if we have permission for that + if (message.ask === "tool") { + let tool: any = {} + try { + tool = JSON.parse(message.text || "{}") + } catch (error) { + console.error("Failed to parse tool:", error) + } + + if (!tool) { + return false + } + + if (tool?.tool === "switchMode") { + return alwaysAllowModeSwitch + } + + if (["newTask", "finishTask"].includes(tool?.tool)) { + return alwaysAllowSubtasks + } + + const isOutsideWorkspace = !!tool.isOutsideWorkspace + + if (isReadOnlyToolAction(message)) { + return alwaysAllowReadOnly && (!isOutsideWorkspace || alwaysAllowReadOnlyOutsideWorkspace) + } + + if (isWriteToolAction(message)) { + return alwaysAllowWrite && (!isOutsideWorkspace || alwaysAllowWriteOutsideWorkspace) + } + } + + return false }, [ autoApprovalEnabled, alwaysAllowBrowser, alwaysAllowReadOnly, + alwaysAllowReadOnlyOutsideWorkspace, isReadOnlyToolAction, alwaysAllowWrite, + alwaysAllowWriteOutsideWorkspace, isWriteToolAction, alwaysAllowExecute, isAllowedCommand, @@ -1047,7 +1083,9 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie handlePrimaryButtonClick, alwaysAllowBrowser, alwaysAllowReadOnly, + alwaysAllowReadOnlyOutsideWorkspace, alwaysAllowWrite, + alwaysAllowWriteOutsideWorkspace, alwaysAllowExecute, alwaysAllowMcp, messages, diff --git a/webview-ui/src/components/chat/__tests__/ChatView.auto-approve.test.tsx b/webview-ui/src/components/chat/__tests__/ChatView.auto-approve.test.tsx index f16e045383a..d188ddb8cfd 100644 --- a/webview-ui/src/components/chat/__tests__/ChatView.auto-approve.test.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatView.auto-approve.test.tsx @@ -146,6 +146,156 @@ describe("ChatView - Auto Approval Tests", () => { }) }) + it("auto-approves outside workspace read operations when enabled", async () => { + render( + + {}} + showHistoryView={() => {}} + /> + , + ) + + // First hydrate state with initial task + mockPostMessage({ + alwaysAllowReadOnly: true, + alwaysAllowReadOnlyOutsideWorkspace: true, + autoApprovalEnabled: true, + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now() - 2000, + text: "Initial task", + }, + ], + }) + + // Then send the read tool ask message with an absolute path (outside workspace) + mockPostMessage({ + alwaysAllowReadOnly: true, + alwaysAllowReadOnlyOutsideWorkspace: true, + autoApprovalEnabled: true, + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now() - 2000, + text: "Initial task", + }, + { + type: "ask", + ask: "tool", + ts: Date.now(), + text: JSON.stringify({ + tool: "readFile", + path: "/absolute/path/test.txt", + // Use an absolute path that's clearly outside workspace + }), + partial: false, + }, + ], + }) + + // Also mock the filePaths for workspace detection + mockPostMessage({ + alwaysAllowReadOnly: true, + alwaysAllowReadOnlyOutsideWorkspace: true, + autoApprovalEnabled: true, + filePaths: ["/workspace/root", "/another/workspace"], + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now() - 2000, + text: "Initial task", + }, + { + type: "ask", + ask: "tool", + ts: Date.now(), + text: JSON.stringify({ + tool: "readFile", + path: "/absolute/path/test.txt", + }), + partial: false, + }, + ], + }) + + // Wait for the auto-approval message + await waitFor(() => { + expect(vscode.postMessage).toHaveBeenCalledWith({ + type: "askResponse", + askResponse: "yesButtonClicked", + }) + }) + }) + + it("does not auto-approve outside workspace read operations without permission", async () => { + render( + + {}} + showHistoryView={() => {}} + /> + , + ) + + // First hydrate state with initial task + mockPostMessage({ + alwaysAllowReadOnly: true, + alwaysAllowReadOnlyOutsideWorkspace: false, // No permission for outside workspace + autoApprovalEnabled: true, + filePaths: ["/workspace/root", "/another/workspace"], // Same workspace paths as before + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now() - 2000, + text: "Initial task", + }, + ], + }) + + // Then send the read tool ask message with an absolute path (outside workspace) + mockPostMessage({ + alwaysAllowReadOnly: true, + alwaysAllowReadOnlyOutsideWorkspace: false, + autoApprovalEnabled: true, + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now() - 2000, + text: "Initial task", + }, + { + type: "ask", + ask: "tool", + ts: Date.now(), + text: JSON.stringify({ + tool: "readFile", + path: "/absolute/path/test.txt", + isOutsideWorkspace: true, // Explicitly indicate this is outside workspace + }), + partial: false, + }, + ], + }) + + // Wait a short time and verify no auto-approval message was sent + await new Promise((resolve) => setTimeout(resolve, 100)) + expect(vscode.postMessage).not.toHaveBeenCalledWith({ + type: "askResponse", + askResponse: "yesButtonClicked", + }) + }) + it("does not auto-approve when autoApprovalEnabled is false", async () => { render( @@ -258,6 +408,136 @@ describe("ChatView - Auto Approval Tests", () => { }) }) + it("auto-approves outside workspace write operations when enabled", async () => { + render( + + {}} + showHistoryView={() => {}} + /> + , + ) + + // First hydrate state with initial task + mockPostMessage({ + alwaysAllowWrite: true, + alwaysAllowWriteOutsideWorkspace: true, + autoApprovalEnabled: true, + writeDelayMs: 0, // Set to 0 for testing + filePaths: ["/workspace/root", "/another/workspace"], // Define workspace paths for testing + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now() - 2000, + text: "Initial task", + }, + ], + }) + + // Then send the write tool ask message with an absolute path (outside workspace) + mockPostMessage({ + alwaysAllowWrite: true, + alwaysAllowWriteOutsideWorkspace: true, + autoApprovalEnabled: true, + writeDelayMs: 0, + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now() - 2000, + text: "Initial task", + }, + { + type: "ask", + ask: "tool", + ts: Date.now(), + text: JSON.stringify({ + tool: "editedExistingFile", + path: "/absolute/path/test.txt", + content: "Test content", + }), + partial: false, + }, + ], + }) + + // Wait for the auto-approval message + await waitFor(() => { + expect(vscode.postMessage).toHaveBeenCalledWith({ + type: "askResponse", + askResponse: "yesButtonClicked", + }) + }) + }) + + it("does not auto-approve outside workspace write operations without permission", async () => { + render( + + {}} + showHistoryView={() => {}} + /> + , + ) + + // First hydrate state with initial task + mockPostMessage({ + alwaysAllowWrite: true, + alwaysAllowWriteOutsideWorkspace: false, // No permission for outside workspace + autoApprovalEnabled: true, + writeDelayMs: 0, + filePaths: ["/workspace/root", "/another/workspace"], // Define workspace paths for testing + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now() - 2000, + text: "Initial task", + }, + ], + }) + + // Then send the write tool ask message with an absolute path (outside workspace) + mockPostMessage({ + alwaysAllowWrite: true, + alwaysAllowWriteOutsideWorkspace: false, + autoApprovalEnabled: true, + writeDelayMs: 0, + clineMessages: [ + { + type: "say", + say: "task", + ts: Date.now() - 2000, + text: "Initial task", + }, + { + type: "ask", + ask: "tool", + ts: Date.now(), + text: JSON.stringify({ + tool: "editedExistingFile", + path: "/absolute/path/test.txt", + content: "Test content", + isOutsideWorkspace: true, // Explicitly indicate this is outside workspace + }), + partial: false, + }, + ], + }) + + // Wait a short time and verify no auto-approval message was sent + await new Promise((resolve) => setTimeout(resolve, 100)) + expect(vscode.postMessage).not.toHaveBeenCalledWith({ + type: "askResponse", + askResponse: "yesButtonClicked", + }) + }) + it("auto-approves browser actions when enabled", async () => { render( diff --git a/webview-ui/src/components/settings/AutoApproveSettings.tsx b/webview-ui/src/components/settings/AutoApproveSettings.tsx index a5f9e9c1c7d..94e18ffe71a 100644 --- a/webview-ui/src/components/settings/AutoApproveSettings.tsx +++ b/webview-ui/src/components/settings/AutoApproveSettings.tsx @@ -12,7 +12,9 @@ import { Section } from "./Section" type AutoApproveSettingsProps = HTMLAttributes & { alwaysAllowReadOnly?: boolean + alwaysAllowReadOnlyOutsideWorkspace?: boolean alwaysAllowWrite?: boolean + alwaysAllowWriteOutsideWorkspace?: boolean writeDelayMs: number alwaysAllowBrowser?: boolean alwaysApproveResubmit?: boolean @@ -24,7 +26,9 @@ type AutoApproveSettingsProps = HTMLAttributes & { allowedCommands?: string[] setCachedStateField: SetCachedStateField< | "alwaysAllowReadOnly" + | "alwaysAllowReadOnlyOutsideWorkspace" | "alwaysAllowWrite" + | "alwaysAllowWriteOutsideWorkspace" | "writeDelayMs" | "alwaysAllowBrowser" | "alwaysApproveResubmit" @@ -39,7 +43,9 @@ type AutoApproveSettingsProps = HTMLAttributes & { export const AutoApproveSettings = ({ alwaysAllowReadOnly, + alwaysAllowReadOnlyOutsideWorkspace, alwaysAllowWrite, + alwaysAllowWriteOutsideWorkspace, writeDelayMs, alwaysAllowBrowser, alwaysApproveResubmit, @@ -88,6 +94,26 @@ export const AutoApproveSettings = ({
+ {alwaysAllowReadOnly && ( +
+
+ + setCachedStateField("alwaysAllowReadOnlyOutsideWorkspace", e.target.checked) + } + data-testid="always-allow-readonly-outside-workspace-checkbox"> + + {t("settings:autoApprove.readOnly.outsideWorkspace.label")} + + +
+ {t("settings:autoApprove.readOnly.outsideWorkspace.description")} +
+
+
+ )} +
+
+ + setCachedStateField("alwaysAllowWriteOutsideWorkspace", e.target.checked) + } + data-testid="always-allow-write-outside-workspace-checkbox"> + + {t("settings:autoApprove.write.outsideWorkspace.label")} + + +
+ {t("settings:autoApprove.write.outsideWorkspace.description")} +
+
(({ onDone }, const { alwaysAllowReadOnly, + alwaysAllowReadOnlyOutsideWorkspace, allowedCommands, language, alwaysAllowBrowser, @@ -106,6 +107,7 @@ const SettingsView = forwardRef(({ onDone }, alwaysAllowModeSwitch, alwaysAllowSubtasks, alwaysAllowWrite, + alwaysAllowWriteOutsideWorkspace, alwaysApproveResubmit, browserToolEnabled, browserViewportSize, @@ -207,7 +209,12 @@ const SettingsView = forwardRef(({ onDone }, if (isSettingValid) { vscode.postMessage({ type: "language", text: language }) vscode.postMessage({ type: "alwaysAllowReadOnly", bool: alwaysAllowReadOnly }) + vscode.postMessage({ + type: "alwaysAllowReadOnlyOutsideWorkspace", + bool: alwaysAllowReadOnlyOutsideWorkspace, + }) vscode.postMessage({ type: "alwaysAllowWrite", bool: alwaysAllowWrite }) + vscode.postMessage({ type: "alwaysAllowWriteOutsideWorkspace", bool: alwaysAllowWriteOutsideWorkspace }) vscode.postMessage({ type: "alwaysAllowExecute", bool: alwaysAllowExecute }) vscode.postMessage({ type: "alwaysAllowBrowser", bool: alwaysAllowBrowser }) vscode.postMessage({ type: "alwaysAllowMcp", bool: alwaysAllowMcp }) @@ -403,7 +410,9 @@ const SettingsView = forwardRef(({ onDone },
void setCustomInstructions: (value?: string) => void setAlwaysAllowReadOnly: (value: boolean) => void + setAlwaysAllowReadOnlyOutsideWorkspace: (value: boolean) => void setAlwaysAllowWrite: (value: boolean) => void + setAlwaysAllowWriteOutsideWorkspace: (value: boolean) => void setAlwaysAllowExecute: (value: boolean) => void setAlwaysAllowBrowser: (value: boolean) => void setAlwaysAllowMcp: (value: boolean) => void @@ -259,7 +261,11 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode })), setCustomInstructions: (value) => setState((prevState) => ({ ...prevState, customInstructions: value })), setAlwaysAllowReadOnly: (value) => setState((prevState) => ({ ...prevState, alwaysAllowReadOnly: value })), + setAlwaysAllowReadOnlyOutsideWorkspace: (value) => + setState((prevState) => ({ ...prevState, alwaysAllowReadOnlyOutsideWorkspace: value })), setAlwaysAllowWrite: (value) => setState((prevState) => ({ ...prevState, alwaysAllowWrite: value })), + setAlwaysAllowWriteOutsideWorkspace: (value) => + setState((prevState) => ({ ...prevState, alwaysAllowWriteOutsideWorkspace: value })), setAlwaysAllowExecute: (value) => setState((prevState) => ({ ...prevState, alwaysAllowExecute: value })), setAlwaysAllowBrowser: (value) => setState((prevState) => ({ ...prevState, alwaysAllowBrowser: value })), setAlwaysAllowMcp: (value) => setState((prevState) => ({ ...prevState, alwaysAllowMcp: value })), diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 283bd49b4d9..b88860eedce 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -35,12 +35,20 @@ "description": "Permet que Roo realitzi operacions automàticament sense requerir aprovació. Activeu aquesta configuració només si confieu plenament en la IA i enteneu els riscos de seguretat associats.", "readOnly": { "label": "Aprovar sempre operacions de només lectura", - "description": "Quan està activat, Roo veurà automàticament el contingut del directori i llegirà fitxers sense que calgui fer clic al botó Aprovar." + "description": "Quan està activat, Roo veurà automàticament el contingut del directori i llegirà fitxers sense que calgui fer clic al botó Aprovar.", + "outsideWorkspace": { + "label": "Incloure fitxers fora de l'espai de treball", + "description": "Permetre a Roo llegir fitxers fora de l'espai de treball actual sense requerir aprovació." + } }, "write": { "label": "Aprovar sempre operacions d'escriptura", "description": "Crear i editar fitxers automàticament sense requerir aprovació", - "delayLabel": "Retard després d'escriptura per permetre que els diagnòstics detectin possibles problemes" + "delayLabel": "Retard després d'escriptura per permetre que els diagnòstics detectin possibles problemes", + "outsideWorkspace": { + "label": "Incloure fitxers fora de l'espai de treball", + "description": "Permetre a Roo crear i editar fitxers fora de l'espai de treball actual sense requerir aprovació." + } }, "browser": { "label": "Aprovar sempre accions del navegador", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 402bcc99e6a..d93d661473a 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -35,12 +35,20 @@ "description": "Erlaubt Roo, Operationen automatisch ohne Genehmigung durchzuführen. Aktiviere diese Einstellungen nur, wenn du der KI vollständig vertraust und die damit verbundenen Sicherheitsrisiken verstehst.", "readOnly": { "label": "Schreibgeschützte Operationen immer genehmigen", - "description": "Wenn aktiviert, wird Roo automatisch Verzeichnisinhalte anzeigen und Dateien lesen, ohne dass du auf die Genehmigen-Schaltfläche klicken musst." + "description": "Wenn aktiviert, wird Roo automatisch Verzeichnisinhalte anzeigen und Dateien lesen, ohne dass du auf die Genehmigen-Schaltfläche klicken musst.", + "outsideWorkspace": { + "label": "Dateien außerhalb des Arbeitsbereichs einbeziehen", + "description": "Roo erlauben, Dateien außerhalb des aktuellen Arbeitsbereichs ohne Genehmigung zu lesen." + } }, "write": { "label": "Schreiboperationen immer genehmigen", "description": "Dateien automatisch erstellen und bearbeiten ohne Genehmigung", - "delayLabel": "Verzögerung nach Schreibvorgängen, damit Diagnosefunktionen potenzielle Probleme erkennen können" + "delayLabel": "Verzögerung nach Schreibvorgängen, damit Diagnosefunktionen potenzielle Probleme erkennen können", + "outsideWorkspace": { + "label": "Dateien außerhalb des Arbeitsbereichs einbeziehen", + "description": "Roo erlauben, Dateien außerhalb des aktuellen Arbeitsbereichs ohne Genehmigung zu erstellen und zu bearbeiten." + } }, "browser": { "label": "Browser-Aktionen immer genehmigen", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 2cf9c163263..2ad31355a16 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -35,12 +35,20 @@ "description": "Allow Roo to automatically perform operations without requiring approval. Enable these settings only if you fully trust the AI and understand the associated security risks.", "readOnly": { "label": "Always approve read-only operations", - "description": "When enabled, Roo will automatically view directory contents and read files without requiring you to click the Approve button." + "description": "When enabled, Roo will automatically view directory contents and read files without requiring you to click the Approve button.", + "outsideWorkspace": { + "label": "Include files outside workspace", + "description": "Allow Roo to read files outside the current workspace without requiring approval." + } }, "write": { "label": "Always approve write operations", "description": "Automatically create and edit files without requiring approval", - "delayLabel": "Delay after writes to allow diagnostics to detect potential problems" + "delayLabel": "Delay after writes to allow diagnostics to detect potential problems", + "outsideWorkspace": { + "label": "Include files outside workspace", + "description": "Allow Roo to create and edit files outside the current workspace without requiring approval." + } }, "browser": { "label": "Always approve browser actions", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index de61e0fbd11..d98b59c63ac 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -35,12 +35,20 @@ "description": "Permitir que Roo realice operaciones automáticamente sin requerir aprobación. Habilite esta configuración solo si confía plenamente en la IA y comprende los riesgos de seguridad asociados.", "readOnly": { "label": "Aprobar siempre operaciones de solo lectura", - "description": "Cuando está habilitado, Roo verá automáticamente el contenido del directorio y leerá archivos sin que necesite hacer clic en el botón Aprobar." + "description": "Cuando está habilitado, Roo verá automáticamente el contenido del directorio y leerá archivos sin que necesite hacer clic en el botón Aprobar.", + "outsideWorkspace": { + "label": "Incluir archivos fuera del espacio de trabajo", + "description": "Permitir a Roo leer archivos fuera del espacio de trabajo actual sin requerir aprobación." + } }, "write": { "label": "Aprobar siempre operaciones de escritura", "description": "Crear y editar archivos automáticamente sin requerir aprobación", - "delayLabel": "Retraso después de escritura para permitir que los diagnósticos detecten posibles problemas" + "delayLabel": "Retraso después de escritura para permitir que los diagnósticos detecten posibles problemas", + "outsideWorkspace": { + "label": "Incluir archivos fuera del espacio de trabajo", + "description": "Permitir a Roo crear y editar archivos fuera del espacio de trabajo actual sin requerir aprobación." + } }, "browser": { "label": "Aprobar siempre acciones del navegador", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 42e11c74ede..ca4e6fc4945 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -35,12 +35,20 @@ "description": "Permettre à Roo d'effectuer automatiquement des opérations sans requérir d'approbation. Activez ces paramètres uniquement si vous faites entièrement confiance à l'IA et que vous comprenez les risques de sécurité associés.", "readOnly": { "label": "Toujours approuver les opérations en lecture seule", - "description": "Lorsque cette option est activée, Roo affichera automatiquement le contenu des répertoires et lira les fichiers sans que vous ayez à cliquer sur le bouton Approuver." + "description": "Lorsque cette option est activée, Roo affichera automatiquement le contenu des répertoires et lira les fichiers sans que vous ayez à cliquer sur le bouton Approuver.", + "outsideWorkspace": { + "label": "Inclure les fichiers en dehors de l'espace de travail", + "description": "Permettre à Roo de lire des fichiers en dehors de l'espace de travail actuel sans nécessiter d'approbation." + } }, "write": { "label": "Toujours approuver les opérations d'écriture", "description": "Créer et modifier automatiquement des fichiers sans nécessiter d'approbation", - "delayLabel": "Délai après les écritures pour permettre aux diagnostics de détecter les problèmes potentiels" + "delayLabel": "Délai après les écritures pour permettre aux diagnostics de détecter les problèmes potentiels", + "outsideWorkspace": { + "label": "Inclure les fichiers en dehors de l'espace de travail", + "description": "Permettre à Roo de créer et modifier des fichiers en dehors de l'espace de travail actuel sans nécessiter d'approbation." + } }, "browser": { "label": "Toujours approuver les actions du navigateur", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index ebb698726a8..b60bf6c72ee 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -35,12 +35,20 @@ "description": "Roo को अनुमोदन की आवश्यकता के बिना स्वचालित रूप से ऑपरेशन करने की अनुमति दें। इन सेटिंग्स को केवल तभी सक्षम करें जब आप AI पर पूरी तरह से भरोसा करते हों और संबंधित सुरक्षा जोखिमों को समझते हों।", "readOnly": { "label": "केवल पढ़ने वाले ऑपरेशन हमेशा अनुमोदित करें", - "description": "जब सक्षम होता है, तो Roo आपके अनुमोदित बटन पर क्लिक किए बिना स्वचालित रूप से निर्देशिका सामग्री देखेगा और फाइलें पढ़ेगा।" + "description": "जब सक्षम होता है, तो Roo आपके अनुमोदित बटन पर क्लिक किए बिना स्वचालित रूप से निर्देशिका सामग्री देखेगा और फाइलें पढ़ेगा।", + "outsideWorkspace": { + "label": "वर्कस्पेस के बाहर की फाइलें शामिल करें", + "description": "Roo को अनुमोदन की आवश्यकता के बिना वर्तमान वर्कस्पेस के बाहर की फाइलें पढ़ने की अनुमति दें।" + } }, "write": { "label": "लिखने वाले ऑपरेशन हमेशा अनुमोदित करें", "description": "अनुमोदन की आवश्यकता के बिना स्वचालित रूप से फाइलें बनाएँ और संपादित करें", - "delayLabel": "लिखने के बाद विलंब ताकि डायग्नोस्टिक संभावित समस्याओं का पता लगा सकें" + "delayLabel": "लिखने के बाद विलंब ताकि डायग्नोस्टिक संभावित समस्याओं का पता लगा सकें", + "outsideWorkspace": { + "label": "वर्कस्पेस के बाहर की फाइलें शामिल करें", + "description": "Roo को अनुमोदन की आवश्यकता के बिना वर्तमान वर्कस्पेस के बाहर फाइलें बनाने और संपादित करने की अनुमति दें।" + } }, "browser": { "label": "ब्राउज़र क्रियाएँ हमेशा अनुमोदित करें", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index f59380fffc7..fe849f4ea41 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -35,12 +35,20 @@ "description": "Permetti a Roo di eseguire automaticamente operazioni senza richiedere approvazione. Abilita queste impostazioni solo se ti fidi completamente dell'IA e comprendi i rischi di sicurezza associati.", "readOnly": { "label": "Approva sempre operazioni di sola lettura", - "description": "Quando abilitato, Roo visualizzerà automaticamente i contenuti della directory e leggerà i file senza richiedere di cliccare sul pulsante Approva." + "description": "Quando abilitato, Roo visualizzerà automaticamente i contenuti della directory e leggerà i file senza richiedere di cliccare sul pulsante Approva.", + "outsideWorkspace": { + "label": "Includi file al di fuori dell'area di lavoro", + "description": "Permetti a Roo di leggere file al di fuori dell'area di lavoro attuale senza richiedere approvazione." + } }, "write": { "label": "Approva sempre operazioni di scrittura", "description": "Crea e modifica automaticamente i file senza richiedere approvazione", - "delayLabel": "Ritardo dopo le scritture per consentire alla diagnostica di rilevare potenziali problemi" + "delayLabel": "Ritardo dopo le scritture per consentire alla diagnostica di rilevare potenziali problemi", + "outsideWorkspace": { + "label": "Includi file al di fuori dell'area di lavoro", + "description": "Permetti a Roo di creare e modificare file al di fuori dell'area di lavoro attuale senza richiedere approvazione." + } }, "browser": { "label": "Approva sempre azioni del browser", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 7673e95b26a..ec195a3ace3 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -35,12 +35,20 @@ "description": "Rooが承認なしで自動的に操作を実行できるようにします。AIを完全に信頼し、関連するセキュリティリスクを理解している場合にのみ、これらの設定を有効にしてください。", "readOnly": { "label": "読み取り専用操作を常に承認", - "description": "有効にすると、Rooは承認ボタンをクリックすることなく、自動的にディレクトリの内容を表示してファイルを読み取ります。" + "description": "有効にすると、Rooは承認ボタンをクリックすることなく、自動的にディレクトリの内容を表示してファイルを読み取ります。", + "outsideWorkspace": { + "label": "ワークスペース外のファイルを含める", + "description": "Rooが承認なしで現在のワークスペース外のファイルを読み取ることを許可します。" + } }, "write": { "label": "書き込み操作を常に承認", "description": "承認なしで自動的にファイルを作成・編集", - "delayLabel": "診断が潜在的な問題を検出できるよう、書き込み後に遅延を設ける" + "delayLabel": "診断が潜在的な問題を検出できるよう、書き込み後に遅延を設ける", + "outsideWorkspace": { + "label": "ワークスペース外のファイルを含める", + "description": "Rooが承認なしで現在のワークスペース外のファイルを作成・編集することを許可します。" + } }, "browser": { "label": "ブラウザアクションを常に承認", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 3bcab956d4e..d83111b89e8 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -35,12 +35,20 @@ "description": "Roo가 승인 없이 자동으로 작업을 수행할 수 있도록 허용합니다. AI를 완전히 신뢰하고 관련 보안 위험을 이해하는 경우에만 이러한 설정을 활성화하세요.", "readOnly": { "label": "읽기 전용 작업 항상 승인", - "description": "활성화되면 Roo는 승인 버튼을 클릭하지 않고도 자동으로 디렉토리 내용을 보고 파일을 읽습니다." + "description": "활성화되면 Roo는 승인 버튼을 클릭하지 않고도 자동으로 디렉토리 내용을 보고 파일을 읽습니다.", + "outsideWorkspace": { + "label": "워크스페이스 외부 파일 포함", + "description": "Roo가 승인 없이 현재 워크스페이스 외부의 파일을 읽을 수 있도록 허용합니다." + } }, "write": { "label": "쓰기 작업 항상 승인", "description": "승인 없이 자동으로 파일 생성 및 편집", - "delayLabel": "진단이 잠재적 문제를 감지할 수 있도록 쓰기 후 지연" + "delayLabel": "진단이 잠재적 문제를 감지할 수 있도록 쓰기 후 지연", + "outsideWorkspace": { + "label": "워크스페이스 외부 파일 포함", + "description": "Roo가 승인 없이 현재 워크스페이스 외부의 파일을 생성하고 편집할 수 있도록 허용합니다." + } }, "browser": { "label": "브라우저 작업 항상 승인", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 91f1826ce9b..8ea8a6b2507 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -35,12 +35,20 @@ "description": "Pozwól Roo na automatyczne wykonywanie operacji bez wymagania zatwierdzenia. Włącz te ustawienia tylko jeśli w pełni ufasz AI i rozumiesz związane z tym zagrożenia bezpieczeństwa.", "readOnly": { "label": "Zawsze zatwierdzaj operacje tylko do odczytu", - "description": "Gdy włączone, Roo automatycznie będzie wyświetlać zawartość katalogów i czytać pliki bez konieczności klikania przycisku Zatwierdź." + "description": "Gdy włączone, Roo automatycznie będzie wyświetlać zawartość katalogów i czytać pliki bez konieczności klikania przycisku Zatwierdź.", + "outsideWorkspace": { + "label": "Uwzględnij pliki poza obszarem roboczym", + "description": "Pozwól Roo na odczyt plików poza bieżącym obszarem roboczym bez konieczności zatwierdzania." + } }, "write": { "label": "Zawsze zatwierdzaj operacje zapisu", "description": "Automatycznie twórz i edytuj pliki bez konieczności zatwierdzania", - "delayLabel": "Opóźnienie po zapisach, aby umożliwić diagnostyce wykrycie potencjalnych problemów" + "delayLabel": "Opóźnienie po zapisach, aby umożliwić diagnostyce wykrycie potencjalnych problemów", + "outsideWorkspace": { + "label": "Uwzględnij pliki poza obszarem roboczym", + "description": "Pozwól Roo na tworzenie i edycję plików poza bieżącym obszarem roboczym bez konieczności zatwierdzania." + } }, "browser": { "label": "Zawsze zatwierdzaj akcje przeglądarki", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index d06c69ecb9e..017f5714d11 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -35,12 +35,20 @@ "description": "Permitir que o Roo realize operações automaticamente sem exigir aprovação. Ative essas configurações apenas se confiar totalmente na IA e compreender os riscos de segurança associados.", "readOnly": { "label": "Aprovar sempre operações somente de leitura", - "description": "Quando ativado, o Roo visualizará automaticamente o conteúdo do diretório e lerá arquivos sem que você precise clicar no botão Aprovar." + "description": "Quando ativado, o Roo visualizará automaticamente o conteúdo do diretório e lerá arquivos sem que você precise clicar no botão Aprovar.", + "outsideWorkspace": { + "label": "Incluir arquivos fora do espaço de trabalho", + "description": "Permitir que o Roo leia arquivos fora do espaço de trabalho atual sem exigir aprovação." + } }, "write": { "label": "Aprovar sempre operações de escrita", "description": "Criar e editar arquivos automaticamente sem exigir aprovação", - "delayLabel": "Atraso após escritas para permitir que diagnósticos detectem problemas potenciais" + "delayLabel": "Atraso após escritas para permitir que diagnósticos detectem problemas potenciais", + "outsideWorkspace": { + "label": "Incluir arquivos fora do espaço de trabalho", + "description": "Permitir que o Roo crie e edite arquivos fora do espaço de trabalho atual sem exigir aprovação." + } }, "browser": { "label": "Aprovar sempre ações do navegador", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index d49d784f791..7cc8cc06ac6 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -35,12 +35,20 @@ "description": "Roo'nun onay gerektirmeden otomatik olarak işlemler gerçekleştirmesine izin verin. Bu ayarları yalnızca yapay zekaya tamamen güveniyorsanız ve ilgili güvenlik risklerini anlıyorsanız etkinleştirin.", "readOnly": { "label": "Salt okunur işlemleri her zaman onayla", - "description": "Etkinleştirildiğinde, Roo otomatik olarak dizin içeriğini görüntüleyecek ve Onayla düğmesine tıklamanıza gerek kalmadan dosyaları okuyacaktır." + "description": "Etkinleştirildiğinde, Roo otomatik olarak dizin içeriğini görüntüleyecek ve Onayla düğmesine tıklamanıza gerek kalmadan dosyaları okuyacaktır.", + "outsideWorkspace": { + "label": "Çalışma alanı dışındaki dosyaları dahil et", + "description": "Roo'nun onay gerektirmeden mevcut çalışma alanı dışındaki dosyaları okumasına izin ver." + } }, "write": { "label": "Yazma işlemlerini her zaman onayla", "description": "Onay gerektirmeden otomatik olarak dosya oluştur ve düzenle", - "delayLabel": "Tanılamanın potansiyel sorunları tespit etmesine izin vermek için yazmalardan sonra gecikme" + "delayLabel": "Tanılamanın potansiyel sorunları tespit etmesine izin vermek için yazmalardan sonra gecikme", + "outsideWorkspace": { + "label": "Çalışma alanı dışındaki dosyaları dahil et", + "description": "Roo'nun onay gerektirmeden mevcut çalışma alanı dışında dosya oluşturmasına ve düzenlemesine izin ver." + } }, "browser": { "label": "Tarayıcı eylemlerini her zaman onayla", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index efbc5f0db25..b93b4617cd0 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -35,12 +35,20 @@ "description": "Cho phép Roo tự động thực hiện các hoạt động mà không cần phê duyệt. Chỉ bật những cài đặt này nếu bạn hoàn toàn tin tưởng AI và hiểu rõ các rủi ro bảo mật liên quan.", "readOnly": { "label": "Luôn phê duyệt các hoạt động chỉ đọc", - "description": "Khi được bật, Roo sẽ tự động xem nội dung thư mục và đọc tệp mà không yêu cầu bạn nhấp vào nút Phê duyệt." + "description": "Khi được bật, Roo sẽ tự động xem nội dung thư mục và đọc tệp mà không yêu cầu bạn nhấp vào nút Phê duyệt.", + "outsideWorkspace": { + "label": "Bao gồm các tệp ngoài không gian làm việc", + "description": "Cho phép Roo đọc các tệp bên ngoài không gian làm việc hiện tại mà không yêu cầu phê duyệt." + } }, "write": { "label": "Luôn phê duyệt các hoạt động ghi", "description": "Tự động tạo và chỉnh sửa tệp mà không cần phê duyệt", - "delayLabel": "Trì hoãn sau khi ghi để cho phép chẩn đoán phát hiện các vấn đề tiềm ẩn" + "delayLabel": "Trì hoãn sau khi ghi để cho phép chẩn đoán phát hiện các vấn đề tiềm ẩn", + "outsideWorkspace": { + "label": "Bao gồm các tệp ngoài không gian làm việc", + "description": "Cho phép Roo tạo và chỉnh sửa các tệp bên ngoài không gian làm việc hiện tại mà không yêu cầu phê duyệt." + } }, "browser": { "label": "Luôn phê duyệt các hành động trình duyệt", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index deef7addb92..8ab8055767a 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -35,12 +35,20 @@ "description": "允许 Roo 自动执行操作而无需批准。只有在您完全信任 AI 并了解相关安全风险的情况下才启用这些设置。", "readOnly": { "label": "始终批准只读操作", - "description": "启用后,Roo 将自动查看目录内容并读取文件,无需点击批准按钮。" + "description": "启用后,Roo 将自动查看目录内容并读取文件,无需点击批准按钮。", + "outsideWorkspace": { + "label": "包含工作区外的文件", + "description": "允许 Roo 读取当前工作区外的文件,无需批准。" + } }, "write": { "label": "始终批准写入操作", "description": "自动创建和编辑文件而无需批准", - "delayLabel": "写入后延迟以允许诊断检测潜在问题" + "delayLabel": "写入后延迟以允许诊断检测潜在问题", + "outsideWorkspace": { + "label": "包含工作区外的文件", + "description": "允许 Roo 创建和编辑当前工作区外的文件,无需批准。" + } }, "browser": { "label": "始终批准浏览器操作", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index e0f82854dfc..071d307def7 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -35,12 +35,20 @@ "description": "允許 Roo 無需批准即執行操作。僅在您完全信任 AI 並了解相關安全風險時啟用這些設定。", "readOnly": { "label": "始終批准只讀操作", - "description": "啟用後,Roo 將自動查看目錄內容和讀取文件,無需點擊批准按鈕。" + "description": "啟用後,Roo 將自動查看目錄內容和讀取文件,無需點擊批准按鈕。", + "outsideWorkspace": { + "label": "包含工作區外的檔案", + "description": "允許 Roo 讀取當前工作區外的檔案,無需批准。" + } }, "write": { "label": "始終批准寫入操作", "description": "自動建立和編輯文件而無需批准", - "delayLabel": "寫入後延遲以允許診斷檢測潛在問題" + "delayLabel": "寫入後延遲以允許診斷檢測潛在問題", + "outsideWorkspace": { + "label": "包含工作區外的檔案", + "description": "允許 Roo 在當前工作區外建立和編輯檔案,無需批准。" + } }, "browser": { "label": "始終批准瀏覽器操作", From 22d01ce67a8ef99ba13d03405b5acefb392bca11 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Tue, 25 Mar 2025 10:10:38 -0400 Subject: [PATCH 54/66] Add specific strings for read/edit outside of the workspace (#1970) --- webview-ui/src/components/chat/ChatRow.tsx | 10 ++++++++-- webview-ui/src/i18n/locales/ca/chat.json | 2 ++ webview-ui/src/i18n/locales/de/chat.json | 2 ++ webview-ui/src/i18n/locales/en/chat.json | 2 ++ webview-ui/src/i18n/locales/es/chat.json | 2 ++ webview-ui/src/i18n/locales/fr/chat.json | 2 ++ webview-ui/src/i18n/locales/hi/chat.json | 2 ++ webview-ui/src/i18n/locales/it/chat.json | 2 ++ webview-ui/src/i18n/locales/ja/chat.json | 2 ++ webview-ui/src/i18n/locales/ko/chat.json | 2 ++ webview-ui/src/i18n/locales/pl/chat.json | 2 ++ webview-ui/src/i18n/locales/pt-BR/chat.json | 2 ++ webview-ui/src/i18n/locales/tr/chat.json | 2 ++ webview-ui/src/i18n/locales/vi/chat.json | 2 ++ webview-ui/src/i18n/locales/zh-CN/chat.json | 2 ++ webview-ui/src/i18n/locales/zh-TW/chat.json | 2 ++ 16 files changed, 38 insertions(+), 2 deletions(-) diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 99c773873f0..4e0d4432f70 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -272,7 +272,11 @@ export const ChatRowContent = ({ <>
{toolIcon(tool.tool === "appliedDiff" ? "diff" : "edit")} - {t("chat:fileOperations.wantsToEdit")} + + {tool.isOutsideWorkspace + ? t("chat:fileOperations.wantsToEditOutsideWorkspace") + : t("chat:fileOperations.wantsToEdit")} +
{message.type === "ask" - ? t("chat:fileOperations.wantsToRead") + ? tool.isOutsideWorkspace + ? t("chat:fileOperations.wantsToReadOutsideWorkspace") + : t("chat:fileOperations.wantsToRead") : t("chat:fileOperations.didRead")}
diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 2c06a9a2d1b..e7080fd3267 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo vol llegir aquest fitxer:", + "wantsToReadOutsideWorkspace": "Roo vol llegir aquest fitxer fora de l'espai de treball:", "didRead": "Roo ha llegit aquest fitxer:", "wantsToEdit": "Roo vol editar aquest fitxer:", + "wantsToEditOutsideWorkspace": "Roo vol editar aquest fitxer fora de l'espai de treball:", "wantsToCreate": "Roo vol crear un nou fitxer:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 78db75b7f09..8c10441c598 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo möchte diese Datei lesen:", + "wantsToReadOutsideWorkspace": "Roo möchte diese Datei außerhalb des Arbeitsbereichs lesen:", "didRead": "Roo hat diese Datei gelesen:", "wantsToEdit": "Roo möchte diese Datei bearbeiten:", + "wantsToEditOutsideWorkspace": "Roo möchte diese Datei außerhalb des Arbeitsbereichs bearbeiten:", "wantsToCreate": "Roo möchte eine neue Datei erstellen:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index dbc5712d697..ec8d4c460ca 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -105,8 +105,10 @@ }, "fileOperations": { "wantsToRead": "Roo wants to read this file:", + "wantsToReadOutsideWorkspace": "Roo wants to read this file outside of the workspace:", "didRead": "Roo read this file:", "wantsToEdit": "Roo wants to edit this file:", + "wantsToEditOutsideWorkspace": "Roo wants to edit this file outside of the workspace:", "wantsToCreate": "Roo wants to create a new file:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index bfb536d6743..194f8e4e7b5 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo quiere leer este archivo:", + "wantsToReadOutsideWorkspace": "Roo quiere leer este archivo fuera del espacio de trabajo:", "didRead": "Roo leyó este archivo:", "wantsToEdit": "Roo quiere editar este archivo:", + "wantsToEditOutsideWorkspace": "Roo quiere editar este archivo fuera del espacio de trabajo:", "wantsToCreate": "Roo quiere crear un nuevo archivo:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index da516362a77..0656a116bcd 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo veut lire ce fichier :", + "wantsToReadOutsideWorkspace": "Roo veut lire ce fichier en dehors de l'espace de travail :", "didRead": "Roo a lu ce fichier :", "wantsToEdit": "Roo veut éditer ce fichier :", + "wantsToEditOutsideWorkspace": "Roo veut éditer ce fichier en dehors de l'espace de travail :", "wantsToCreate": "Roo veut créer un nouveau fichier :" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index bcd1ca43fff..f29f867c801 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo इस फ़ाइल को पढ़ना चाहता है:", + "wantsToReadOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर इस फ़ाइल को पढ़ना चाहता है:", "didRead": "Roo ने इस फ़ाइल को पढ़ा:", "wantsToEdit": "Roo इस फ़ाइल को संपादित करना चाहता है:", + "wantsToEditOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर इस फ़ाइल को संपादित करना चाहता है:", "wantsToCreate": "Roo एक नई फ़ाइल बनाना चाहता है:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index fea9861c85b..e82d258dbc2 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo vuole leggere questo file:", + "wantsToReadOutsideWorkspace": "Roo vuole leggere questo file al di fuori dell'area di lavoro:", "didRead": "Roo ha letto questo file:", "wantsToEdit": "Roo vuole modificare questo file:", + "wantsToEditOutsideWorkspace": "Roo vuole modificare questo file al di fuori dell'area di lavoro:", "wantsToCreate": "Roo vuole creare un nuovo file:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 766d8797ddb..847d099ef7c 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Rooはこのファイルを読みたい:", + "wantsToReadOutsideWorkspace": "Rooはワークスペース外のこのファイルを読みたい:", "didRead": "Rooはこのファイルを読みました:", "wantsToEdit": "Rooはこのファイルを編集したい:", + "wantsToEditOutsideWorkspace": "Rooはワークスペース外のこのファイルを編集したい:", "wantsToCreate": "Rooは新しいファイルを作成したい:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index db49282dd98..9c0b01a3f3c 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo가 이 파일을 읽고 싶어합니다:", + "wantsToReadOutsideWorkspace": "Roo가 워크스페이스 외부의 이 파일을 읽고 싶어합니다:", "didRead": "Roo가 이 파일을 읽었습니다:", "wantsToEdit": "Roo가 이 파일을 편집하고 싶어합니다:", + "wantsToEditOutsideWorkspace": "Roo가 워크스페이스 외부의 이 파일을 편집하고 싶어합니다:", "wantsToCreate": "Roo가 새 파일을 만들고 싶어합니다:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 96cd92f7c2f..ab83fd221b0 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo chce przeczytać ten plik:", + "wantsToReadOutsideWorkspace": "Roo chce przeczytać ten plik poza obszarem roboczym:", "didRead": "Roo przeczytał ten plik:", "wantsToEdit": "Roo chce edytować ten plik:", + "wantsToEditOutsideWorkspace": "Roo chce edytować ten plik poza obszarem roboczym:", "wantsToCreate": "Roo chce utworzyć nowy plik:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 97c13c3cfb1..96416f6f110 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo quer ler este arquivo:", + "wantsToReadOutsideWorkspace": "Roo quer ler este arquivo fora do espaço de trabalho:", "didRead": "Roo leu este arquivo:", "wantsToEdit": "Roo quer editar este arquivo:", + "wantsToEditOutsideWorkspace": "Roo quer editar este arquivo fora do espaço de trabalho:", "wantsToCreate": "Roo quer criar um novo arquivo:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 4fff9c2ad35..1eb358ad980 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo bu dosyayı okumak istiyor:", + "wantsToReadOutsideWorkspace": "Roo çalışma alanı dışındaki bu dosyayı okumak istiyor:", "didRead": "Roo bu dosyayı okudu:", "wantsToEdit": "Roo bu dosyayı düzenlemek istiyor:", + "wantsToEditOutsideWorkspace": "Roo çalışma alanı dışındaki bu dosyayı düzenlemek istiyor:", "wantsToCreate": "Roo yeni bir dosya oluşturmak istiyor:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index cbabb4634a3..fb1040bcf17 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo muốn đọc tệp này:", + "wantsToReadOutsideWorkspace": "Roo muốn đọc tệp này bên ngoài không gian làm việc:", "didRead": "Roo đã đọc tệp này:", "wantsToEdit": "Roo muốn chỉnh sửa tệp này:", + "wantsToEditOutsideWorkspace": "Roo muốn chỉnh sửa tệp này bên ngoài không gian làm việc:", "wantsToCreate": "Roo muốn tạo một tệp mới:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index a0310a5919c..a2f8119927f 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo想读取此文件:", + "wantsToReadOutsideWorkspace": "Roo想读取此工作区外的文件:", "didRead": "Roo已读取此文件:", "wantsToEdit": "Roo想编辑此文件:", + "wantsToEditOutsideWorkspace": "Roo想编辑此工作区外的文件:", "wantsToCreate": "Roo想创建新文件:" }, "directoryOperations": { diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 69804c0f8f4..1178ec39b83 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -107,8 +107,10 @@ }, "fileOperations": { "wantsToRead": "Roo想讀取此檔案:", + "wantsToReadOutsideWorkspace": "Roo想讀取此工作區外的檔案:", "didRead": "Roo已讀取此檔案:", "wantsToEdit": "Roo想編輯此檔案:", + "wantsToEditOutsideWorkspace": "Roo想編輯此工作區外的檔案:", "wantsToCreate": "Roo想創建新檔案:" }, "directoryOperations": { From 0bc4f30c23c288b81b76264bd9530a741d69cf12 Mon Sep 17 00:00:00 2001 From: axb Date: Tue, 25 Mar 2025 23:08:11 +0800 Subject: [PATCH 55/66] add new task command (#1648) * add new task command * Internationalize * Revert README changes * More i18n * Fix tests * Fix i18n * Missing translations --------- Co-authored-by: Matt Rubens --- package.json | 5 +++ src/activate/handleTask.ts | 22 +++++++++++ src/activate/registerCommands.ts | 2 + src/core/Cline.ts | 2 +- src/core/CodeActionProvider.ts | 2 + src/core/__tests__/Cline.test.ts | 4 ++ .../webview/__tests__/ClineProvider.test.ts | 4 ++ src/i18n/locales/ca/common.json | 4 ++ src/i18n/locales/de/common.json | 4 ++ src/i18n/locales/en/common.json | 4 ++ src/i18n/locales/es/common.json | 4 ++ src/i18n/locales/fr/common.json | 4 ++ src/i18n/locales/hi/common.json | 4 ++ src/i18n/locales/it/common.json | 4 ++ src/i18n/locales/ja/common.json | 4 ++ src/i18n/locales/ko/common.json | 4 ++ src/i18n/locales/pl/common.json | 4 ++ src/i18n/locales/pt-BR/common.json | 4 ++ src/i18n/locales/tr/common.json | 4 ++ src/i18n/locales/vi/common.json | 4 ++ src/i18n/locales/zh-CN/common.json | 4 ++ src/i18n/locales/zh-TW/common.json | 4 ++ src/shared/support-prompt.ts | 38 ++----------------- webview-ui/src/i18n/locales/ca/prompts.json | 4 ++ webview-ui/src/i18n/locales/de/prompts.json | 4 ++ webview-ui/src/i18n/locales/en/prompts.json | 4 ++ webview-ui/src/i18n/locales/es/prompts.json | 4 ++ webview-ui/src/i18n/locales/fr/prompts.json | 4 ++ webview-ui/src/i18n/locales/hi/prompts.json | 4 ++ webview-ui/src/i18n/locales/it/prompts.json | 4 ++ webview-ui/src/i18n/locales/ja/prompts.json | 4 ++ webview-ui/src/i18n/locales/ko/prompts.json | 4 ++ webview-ui/src/i18n/locales/pl/prompts.json | 4 ++ .../src/i18n/locales/pt-BR/prompts.json | 4 ++ webview-ui/src/i18n/locales/tr/prompts.json | 4 ++ webview-ui/src/i18n/locales/vi/prompts.json | 4 ++ .../src/i18n/locales/zh-CN/prompts.json | 4 ++ .../src/i18n/locales/zh-TW/prompts.json | 4 ++ 38 files changed, 163 insertions(+), 36 deletions(-) create mode 100644 src/activate/handleTask.ts diff --git a/package.json b/package.json index 7562c0022f8..519a7c13466 100644 --- a/package.json +++ b/package.json @@ -140,6 +140,11 @@ "title": "Add To Context", "category": "Roo Code" }, + { + "command": "roo-cline.newTask", + "title": "New Task", + "category": "Roo Code" + }, { "command": "roo-cline.terminalAddToContext", "title": "Add Terminal Content to Context", diff --git a/src/activate/handleTask.ts b/src/activate/handleTask.ts new file mode 100644 index 00000000000..7bce8c75beb --- /dev/null +++ b/src/activate/handleTask.ts @@ -0,0 +1,22 @@ +import * as vscode from "vscode" +import { COMMAND_IDS } from "../core/CodeActionProvider" +import { ClineProvider } from "../core/webview/ClineProvider" +import { t } from "../i18n" + +export const handleNewTask = async (params: { prompt?: string } | null | undefined) => { + let prompt = params?.prompt + if (!prompt) { + prompt = await vscode.window.showInputBox({ + prompt: t("common:input.task_prompt"), + placeHolder: t("common:input.task_placeholder"), + }) + } + if (!prompt) { + await vscode.commands.executeCommand("roo-cline.SidebarProvider.focus") + return + } + + await ClineProvider.handleCodeAction(COMMAND_IDS.NEW_TASK, "NEW_TASK", { + userInput: prompt, + }) +} diff --git a/src/activate/registerCommands.ts b/src/activate/registerCommands.ts index e17e71ad02a..2e1fac5e4b0 100644 --- a/src/activate/registerCommands.ts +++ b/src/activate/registerCommands.ts @@ -4,6 +4,7 @@ import delay from "delay" import { ClineProvider } from "../core/webview/ClineProvider" import { registerHumanRelayCallback, unregisterHumanRelayCallback, handleHumanRelayResponse } from "./humanRelay" +import { handleNewTask } from "./handleTask" // Store panel references in both modes let sidebarPanel: vscode.WebviewView | undefined = undefined @@ -85,6 +86,7 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt "roo-cline.registerHumanRelayCallback": registerHumanRelayCallback, "roo-cline.unregisterHumanRelayCallback": unregisterHumanRelayCallback, "roo-cline.handleHumanRelayResponse": handleHumanRelayResponse, + "roo-cline.newTask": handleNewTask, "roo-cline.setCustomStoragePath": async () => { const { promptForCustomStoragePath } = await import("../shared/storagePathManager") await promptForCustomStoragePath() diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 5e306332979..63bffed83f5 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -2893,7 +2893,7 @@ export class Cline extends EventEmitter { if (item.mimeType?.startsWith("image") && item.blob) { images.push(item.blob) } - }); + }) await this.say("mcp_server_response", resourceResultPretty, images) pushToolResult(formatResponse.toolResult(resourceResultPretty, images)) break diff --git a/src/core/CodeActionProvider.ts b/src/core/CodeActionProvider.ts index 285e6dac6cd..040021a51fa 100644 --- a/src/core/CodeActionProvider.ts +++ b/src/core/CodeActionProvider.ts @@ -7,6 +7,7 @@ export const ACTION_NAMES = { FIX_LOGIC: "Roo Code: Fix Logic", IMPROVE: "Roo Code: Improve Code", ADD_TO_CONTEXT: "Roo Code: Add to Context", + NEW_TASK: "Roo Code: New Task", } as const export const COMMAND_IDS = { @@ -14,6 +15,7 @@ export const COMMAND_IDS = { FIX: "roo-cline.fixCode", IMPROVE: "roo-cline.improveCode", ADD_TO_CONTEXT: "roo-cline.addToContext", + NEW_TASK: "roo-cline.newTask", } as const export class CodeActionProvider implements vscode.CodeActionProvider { diff --git a/src/core/__tests__/Cline.test.ts b/src/core/__tests__/Cline.test.ts index 5ae5f625fc3..a049d8efd2d 100644 --- a/src/core/__tests__/Cline.test.ts +++ b/src/core/__tests__/Cline.test.ts @@ -139,6 +139,10 @@ jest.mock("vscode", () => { } return { + CodeActionKind: { + QuickFix: { value: "quickfix" }, + RefactorRewrite: { value: "refactor.rewrite" }, + }, window: { createTextEditorDecorationType: jest.fn().mockReturnValue({ dispose: jest.fn(), diff --git a/src/core/webview/__tests__/ClineProvider.test.ts b/src/core/webview/__tests__/ClineProvider.test.ts index 1729831028a..c77e677f6fe 100644 --- a/src/core/webview/__tests__/ClineProvider.test.ts +++ b/src/core/webview/__tests__/ClineProvider.test.ts @@ -167,6 +167,10 @@ jest.mock("vscode", () => ({ joinPath: jest.fn(), file: jest.fn(), }, + CodeActionKind: { + QuickFix: { value: "quickfix" }, + RefactorRewrite: { value: "refactor.rewrite" }, + }, window: { showInformationMessage: jest.fn(), showErrorMessage: jest.fn(), diff --git a/src/i18n/locales/ca/common.json b/src/i18n/locales/ca/common.json index b85fb0eb327..cbedf48a224 100644 --- a/src/i18n/locales/ca/common.json +++ b/src/i18n/locales/ca/common.json @@ -1,4 +1,8 @@ { + "input": { + "task_prompt": "Què vols que faci Roo?", + "task_placeholder": "Escriu la teva tasca aquí" + }, "extension": { "name": "Roo Code", "description": "Tot un equip de desenvolupadors d'IA al teu editor." diff --git a/src/i18n/locales/de/common.json b/src/i18n/locales/de/common.json index 556185ee920..6e953dd9ab0 100644 --- a/src/i18n/locales/de/common.json +++ b/src/i18n/locales/de/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "Bitte gib einen absoluten Pfad ein (z.B. D:\\RooCodeStorage oder /home/user/storage)", "enter_valid_path": "Bitte gib einen gültigen Pfad ein" + }, + "input": { + "task_prompt": "Was soll Roo tun?", + "task_placeholder": "Gib deine Aufgabe hier ein" } } diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index 60554f23c71..6f1e496f644 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "Please enter an absolute path (e.g. D:\\RooCodeStorage or /home/user/storage)", "enter_valid_path": "Please enter a valid path" + }, + "input": { + "task_prompt": "What should Roo do?", + "task_placeholder": "Type your task here" } } diff --git a/src/i18n/locales/es/common.json b/src/i18n/locales/es/common.json index 7faa80d7d67..52c87275c9f 100644 --- a/src/i18n/locales/es/common.json +++ b/src/i18n/locales/es/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "Por favor, ingresa una ruta absoluta (por ejemplo, D:\\RooCodeStorage o /home/user/storage)", "enter_valid_path": "Por favor, ingresa una ruta válida" + }, + "input": { + "task_prompt": "¿Qué debe hacer Roo?", + "task_placeholder": "Escribe tu tarea aquí" } } diff --git a/src/i18n/locales/fr/common.json b/src/i18n/locales/fr/common.json index addadb4f805..cbbf692e4aa 100644 --- a/src/i18n/locales/fr/common.json +++ b/src/i18n/locales/fr/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "Veuillez entrer un chemin absolu (ex. D:\\RooCodeStorage ou /home/user/storage)", "enter_valid_path": "Veuillez entrer un chemin valide" + }, + "input": { + "task_prompt": "Que doit faire Roo ?", + "task_placeholder": "Écris ta tâche ici" } } diff --git a/src/i18n/locales/hi/common.json b/src/i18n/locales/hi/common.json index 096ae98d073..eef4c4b751b 100644 --- a/src/i18n/locales/hi/common.json +++ b/src/i18n/locales/hi/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "कृपया एक पूर्ण पाथ दर्ज करें (उदाहरण: D:\\RooCodeStorage या /home/user/storage)", "enter_valid_path": "कृपया एक वैध पाथ दर्ज करें" + }, + "input": { + "task_prompt": "Roo को क्या करना है?", + "task_placeholder": "अपना कार्य यहाँ लिखें" } } diff --git a/src/i18n/locales/it/common.json b/src/i18n/locales/it/common.json index 3fde39957f3..2212ee2ff87 100644 --- a/src/i18n/locales/it/common.json +++ b/src/i18n/locales/it/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "Inserisci un percorso assoluto (ad esempio D:\\RooCodeStorage o /home/user/storage)", "enter_valid_path": "Inserisci un percorso valido" + }, + "input": { + "task_prompt": "Cosa deve fare Roo?", + "task_placeholder": "Scrivi il tuo compito qui" } } diff --git a/src/i18n/locales/ja/common.json b/src/i18n/locales/ja/common.json index b7a26604e07..be37e832a15 100644 --- a/src/i18n/locales/ja/common.json +++ b/src/i18n/locales/ja/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "絶対パスを入力してください(例:D:\\RooCodeStorage または /home/user/storage)", "enter_valid_path": "有効なパスを入力してください" + }, + "input": { + "task_prompt": "Rooにどんなことをさせますか?", + "task_placeholder": "タスクをここに入力してください" } } diff --git a/src/i18n/locales/ko/common.json b/src/i18n/locales/ko/common.json index 71636cffedb..794aa8d59aa 100644 --- a/src/i18n/locales/ko/common.json +++ b/src/i18n/locales/ko/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "절대 경로를 입력하세요 (예: D:\\RooCodeStorage 또는 /home/user/storage)", "enter_valid_path": "유효한 경로를 입력하세요" + }, + "input": { + "task_prompt": "Roo에게 무엇을 시킬까요?", + "task_placeholder": "여기에 작업을 입력하세요" } } diff --git a/src/i18n/locales/pl/common.json b/src/i18n/locales/pl/common.json index 33231c5d85a..4218218c67e 100644 --- a/src/i18n/locales/pl/common.json +++ b/src/i18n/locales/pl/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "Wprowadź pełną ścieżkę (np. D:\\RooCodeStorage lub /home/user/storage)", "enter_valid_path": "Wprowadź prawidłową ścieżkę" + }, + "input": { + "task_prompt": "Co ma zrobić Roo?", + "task_placeholder": "Wpisz swoje zadanie tutaj" } } diff --git a/src/i18n/locales/pt-BR/common.json b/src/i18n/locales/pt-BR/common.json index 17f36440654..844970f2201 100644 --- a/src/i18n/locales/pt-BR/common.json +++ b/src/i18n/locales/pt-BR/common.json @@ -1,4 +1,8 @@ { + "input": { + "task_prompt": "O que você quer que o Roo faça?", + "task_placeholder": "Digite sua tarefa aqui" + }, "extension": { "name": "Roo Code", "description": "Uma equipe completa de desenvolvedores com IA em seu editor." diff --git a/src/i18n/locales/tr/common.json b/src/i18n/locales/tr/common.json index 898deb47967..82464b73425 100644 --- a/src/i18n/locales/tr/common.json +++ b/src/i18n/locales/tr/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "Lütfen mutlak bir yol girin (örn. D:\\RooCodeStorage veya /home/user/storage)", "enter_valid_path": "Lütfen geçerli bir yol girin" + }, + "input": { + "task_prompt": "Roo ne yapsın?", + "task_placeholder": "Görevini buraya yaz" } } diff --git a/src/i18n/locales/vi/common.json b/src/i18n/locales/vi/common.json index f07487989f0..a2824be1827 100644 --- a/src/i18n/locales/vi/common.json +++ b/src/i18n/locales/vi/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "Vui lòng nhập đường dẫn tuyệt đối (ví dụ: D:\\RooCodeStorage hoặc /home/user/storage)", "enter_valid_path": "Vui lòng nhập đường dẫn hợp lệ" + }, + "input": { + "task_prompt": "Bạn muốn Roo làm gì?", + "task_placeholder": "Nhập nhiệm vụ của bạn ở đây" } } diff --git a/src/i18n/locales/zh-CN/common.json b/src/i18n/locales/zh-CN/common.json index ce6079d1d05..b4c41db5e2d 100644 --- a/src/i18n/locales/zh-CN/common.json +++ b/src/i18n/locales/zh-CN/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "请输入绝对路径(例如 D:\\RooCodeStorage 或 /home/user/storage)", "enter_valid_path": "请输入有效的路径" + }, + "input": { + "task_prompt": "让Roo做什么?", + "task_placeholder": "在这里输入任务" } } diff --git a/src/i18n/locales/zh-TW/common.json b/src/i18n/locales/zh-TW/common.json index 1b6bb92654e..7b36be8145b 100644 --- a/src/i18n/locales/zh-TW/common.json +++ b/src/i18n/locales/zh-TW/common.json @@ -83,5 +83,9 @@ "path_placeholder": "D:\\RooCodeStorage", "enter_absolute_path": "請輸入絕對路徑(例如 D:\\RooCodeStorage 或 /home/user/storage)", "enter_valid_path": "請輸入有效的路徑" + }, + "input": { + "task_prompt": "讓Roo做什麼?", + "task_placeholder": "在這裡輸入任務" } } diff --git a/src/shared/support-prompt.ts b/src/shared/support-prompt.ts index ca22360632d..cc5e3e1d0df 100644 --- a/src/shared/support-prompt.ts +++ b/src/shared/support-prompt.ts @@ -25,24 +25,16 @@ export const createPrompt = (template: string, params: PromptParams): string => } interface SupportPromptConfig { - label: string - description: string template: string } const supportPromptConfigs: Record = { ENHANCE: { - label: "Enhance Prompt", - description: - "Use prompt enhancement to get tailored suggestions or improvements for your inputs. This ensures Roo understands your intent and provides the best possible responses. Available via the ✨ icon in chat.", template: `Generate an enhanced version of this prompt (reply with only the enhanced prompt - no conversation, explanations, lead-in, bullet points, placeholders, or surrounding quotes): \${userInput}`, }, EXPLAIN: { - label: "Explain Code", - description: - "Get detailed explanations of code snippets, functions, or entire files. Useful for understanding complex code or learning new patterns. Available in code actions (lightbulb icon in the editor) and the editor context menu (right-click on selected code).", template: `Explain the following code from file path @/\${filePath}: \${userInput} @@ -56,9 +48,6 @@ Please provide a clear and concise explanation of what this code does, including 3. Important patterns or techniques used`, }, FIX: { - label: "Fix Issues", - description: - "Get help identifying and resolving bugs, errors, or code quality issues. Provides step-by-step guidance for fixing problems. Available in code actions (lightbulb icon in the editor) and the editor context menu (right-click on selected code).", template: `Fix any issues in the following code from file path @/\${filePath} \${diagnosticText} \${userInput} @@ -74,9 +63,6 @@ Please: 4. Explain what was fixed and why`, }, IMPROVE: { - label: "Improve Code", - description: - "Receive suggestions for code optimization, better practices, and architectural improvements while maintaining functionality. Available in code actions (lightbulb icon in the editor) and the editor context menu (right-click on selected code).", template: `Improve the following code from file path @/\${filePath}: \${userInput} @@ -93,18 +79,12 @@ Please suggest improvements for: Provide the improved code along with explanations for each enhancement.`, }, ADD_TO_CONTEXT: { - label: "Add to Context", - description: - "Add context to your current task or conversation. Useful for providing additional information or clarifications. Available in code actions (lightbulb icon in the editor). and the editor context menu (right-click on selected code).", template: `\${filePath}: \`\`\` \${selectedText} \`\`\``, }, TERMINAL_ADD_TO_CONTEXT: { - label: "Add Terminal Content to Context", - description: - "Add terminal output to your current task or conversation. Useful for providing command outputs or logs. Available in the terminal context menu (right-click on selected terminal content).", template: `\${userInput} Terminal output: \`\`\` @@ -112,9 +92,6 @@ Terminal output: \`\`\``, }, TERMINAL_FIX: { - label: "Fix Terminal Command", - description: - "Get help fixing terminal commands that failed or need improvement. Available in the terminal context menu (right-click on selected terminal content).", template: `\${userInput} Fix this terminal command: \`\`\` @@ -127,9 +104,6 @@ Please: 3. Explain what was fixed and why`, }, TERMINAL_EXPLAIN: { - label: "Explain Terminal Command", - description: - "Get detailed explanations of terminal commands and their outputs. Available in the terminal context menu (right-click on selected terminal content).", template: `\${userInput} Explain this terminal command: \`\`\` @@ -141,6 +115,9 @@ Please provide: 2. Explanation of each part/flag 3. Expected output and behavior`, }, + NEW_TASK: { + template: `\${userInput}`, + }, } as const type SupportPromptType = keyof typeof supportPromptConfigs @@ -158,15 +135,6 @@ export const supportPrompt = { export type { SupportPromptType } -// Expose labels and descriptions for UI -export const supportPromptLabels = Object.fromEntries( - Object.entries(supportPromptConfigs).map(([key, config]) => [key, config.label]), -) as Record - -export const supportPromptDescriptions = Object.fromEntries( - Object.entries(supportPromptConfigs).map(([key, config]) => [key, config.description]), -) as Record - export type CustomSupportPrompts = { [key: string]: string | undefined } diff --git a/webview-ui/src/i18n/locales/ca/prompts.json b/webview-ui/src/i18n/locales/ca/prompts.json index f876bd1f7e0..f9fb0ec4ecd 100644 --- a/webview-ui/src/i18n/locales/ca/prompts.json +++ b/webview-ui/src/i18n/locales/ca/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Explicar comanda del terminal", "description": "Obtingueu explicacions detallades de les comandes del terminal i les seves sortides. Disponible al menú contextual del terminal (clic dret al contingut seleccionat del terminal)." + }, + "NEW_TASK": { + "label": "Iniciar nova tasca", + "description": "Inicieu una nova tasca amb l'entrada proporcionada. Disponible a la paleta de comandes." } } }, diff --git a/webview-ui/src/i18n/locales/de/prompts.json b/webview-ui/src/i18n/locales/de/prompts.json index ee2517c3fcb..a19a3496492 100644 --- a/webview-ui/src/i18n/locales/de/prompts.json +++ b/webview-ui/src/i18n/locales/de/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Terminal-Befehl erklären", "description": "Erhalten Sie detaillierte Erklärungen zu Terminal-Befehlen und deren Ausgaben. Verfügbar im Kontextmenü des Terminals (Rechtsklick auf ausgewählten Terminal-Inhalt)." + }, + "NEW_TASK": { + "label": "Neue Aufgabe starten", + "description": "Starte eine neue Aufgabe mit deiner Eingabe. Verfügbar in der Befehlspalette." } } }, diff --git a/webview-ui/src/i18n/locales/en/prompts.json b/webview-ui/src/i18n/locales/en/prompts.json index 4adc3ead4be..4fac1daf774 100644 --- a/webview-ui/src/i18n/locales/en/prompts.json +++ b/webview-ui/src/i18n/locales/en/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Explain Terminal Command", "description": "Get detailed explanations of terminal commands and their outputs. Available in the terminal context menu (right-click on selected terminal content)." + }, + "NEW_TASK": { + "label": "Start New Task", + "description": "Start a new task with user input. Available in the Command Palette." } } }, diff --git a/webview-ui/src/i18n/locales/es/prompts.json b/webview-ui/src/i18n/locales/es/prompts.json index ba0b2937ebc..c9da5aed4f8 100644 --- a/webview-ui/src/i18n/locales/es/prompts.json +++ b/webview-ui/src/i18n/locales/es/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Explicar comando de terminal", "description": "Obtén explicaciones detalladas de comandos de terminal y sus salidas. Disponible en el menú contextual de la terminal (clic derecho en el contenido seleccionado de la terminal)." + }, + "NEW_TASK": { + "label": "Iniciar nueva tarea", + "description": "Inicia una nueva tarea con entrada del usuario. Disponible en la Paleta de comandos." } } }, diff --git a/webview-ui/src/i18n/locales/fr/prompts.json b/webview-ui/src/i18n/locales/fr/prompts.json index c4ac745b812..1428c445a9d 100644 --- a/webview-ui/src/i18n/locales/fr/prompts.json +++ b/webview-ui/src/i18n/locales/fr/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Expliquer la commande du terminal", "description": "Obtenez des explications détaillées sur les commandes du terminal et leurs sorties. Disponible dans le menu contextuel du terminal (clic droit sur le contenu sélectionné du terminal)." + }, + "NEW_TASK": { + "label": "Démarrer une nouvelle tâche", + "description": "Démarre une nouvelle tâche avec ton entrée. Disponible dans la palette de commandes." } } }, diff --git a/webview-ui/src/i18n/locales/hi/prompts.json b/webview-ui/src/i18n/locales/hi/prompts.json index c0c83afc2f3..87eaf11e4ed 100644 --- a/webview-ui/src/i18n/locales/hi/prompts.json +++ b/webview-ui/src/i18n/locales/hi/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "टर्मिनल कमांड समझाएँ", "description": "टर्मिनल कमांड और उनके आउटपुट के विस्तृत स्पष्टीकरण प्राप्त करें। टर्मिनल के कंटेक्स्ट मेनू (चयनित टर्मिनल सामग्री पर राइट-क्लिक) में उपलब्ध है।" + }, + "NEW_TASK": { + "label": "नया कार्य शुरू करें", + "description": "इनपुट के साथ नया कार्य शुरू करें। कमांड पैलेट में उपलब्ध है।" } } }, diff --git a/webview-ui/src/i18n/locales/it/prompts.json b/webview-ui/src/i18n/locales/it/prompts.json index 15d52b65d89..94812f94226 100644 --- a/webview-ui/src/i18n/locales/it/prompts.json +++ b/webview-ui/src/i18n/locales/it/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Spiega comando del terminale", "description": "Ottieni spiegazioni dettagliate sui comandi del terminale e sui loro output. Disponibile nel menu contestuale del terminale (clic destro sul contenuto selezionato del terminale)." + }, + "NEW_TASK": { + "label": "Avvia nuova attività", + "description": "Avvia una nuova attività con il tuo input. Disponibile nella palette dei comandi." } } }, diff --git a/webview-ui/src/i18n/locales/ja/prompts.json b/webview-ui/src/i18n/locales/ja/prompts.json index 87059150d73..09d3a79cfba 100644 --- a/webview-ui/src/i18n/locales/ja/prompts.json +++ b/webview-ui/src/i18n/locales/ja/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "ターミナルコマンドを説明", "description": "ターミナルコマンドとその出力の詳細な説明を得ることができます。ターミナルのコンテキストメニュー(選択したターミナルの内容で右クリック)から利用できます。" + }, + "NEW_TASK": { + "label": "新しいタスクを開始", + "description": "入力内容で新しいタスクを開始できます。コマンドパレットから利用できます。" } } }, diff --git a/webview-ui/src/i18n/locales/ko/prompts.json b/webview-ui/src/i18n/locales/ko/prompts.json index d07a0de3c7d..c8d2deebd1a 100644 --- a/webview-ui/src/i18n/locales/ko/prompts.json +++ b/webview-ui/src/i18n/locales/ko/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "터미널 명령 설명", "description": "터미널 명령과 그 출력에 대한 상세한 설명을 얻을 수 있습니다. 터미널 컨텍스트 메뉴(선택한 터미널 콘텐츠에서 우클릭)에서 이용 가능합니다." + }, + "NEW_TASK": { + "label": "새 작업 시작", + "description": "입력한 내용으로 새 작업을 시작할 수 있습니다. 명령 팔레트에서 이용 가능합니다." } } }, diff --git a/webview-ui/src/i18n/locales/pl/prompts.json b/webview-ui/src/i18n/locales/pl/prompts.json index 1ea10ea1412..8b4320b3c31 100644 --- a/webview-ui/src/i18n/locales/pl/prompts.json +++ b/webview-ui/src/i18n/locales/pl/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Wyjaśnij polecenie terminala", "description": "Uzyskaj szczegółowe wyjaśnienia poleceń terminala i ich wyników. Dostępne w menu kontekstowym terminala (prawy przycisk myszy na wybranej zawartości terminala)." + }, + "NEW_TASK": { + "label": "Rozpocznij nowe zadanie", + "description": "Rozpocznij nowe zadanie z wprowadzonymi danymi. Dostępne w palecie poleceń." } } }, diff --git a/webview-ui/src/i18n/locales/pt-BR/prompts.json b/webview-ui/src/i18n/locales/pt-BR/prompts.json index b65f9930fd4..3956c299dab 100644 --- a/webview-ui/src/i18n/locales/pt-BR/prompts.json +++ b/webview-ui/src/i18n/locales/pt-BR/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Explicar Comando do Terminal", "description": "Obtenha explicações detalhadas de comandos de terminal e suas saídas. Available in the terminal context menu (right-click on selected terminal content)." + }, + "NEW_TASK": { + "label": "Iniciar Nova Tarefa", + "description": "Inicie uma nova tarefa com a entrada fornecida. Disponível na paleta de comandos." } } }, diff --git a/webview-ui/src/i18n/locales/tr/prompts.json b/webview-ui/src/i18n/locales/tr/prompts.json index b9a6a808cdf..bf1d7eb9ceb 100644 --- a/webview-ui/src/i18n/locales/tr/prompts.json +++ b/webview-ui/src/i18n/locales/tr/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Terminal Komutunu Açıkla", "description": "Terminal komutları ve çıktıları hakkında ayrıntılı açıklamalar alın. Terminal bağlam menüsünde (seçili terminal içeriğine sağ tıklayın) kullanılabilir." + }, + "NEW_TASK": { + "label": "Yeni Görev Başlat", + "description": "Girdiyle yeni bir görev başlat. Komut paletinde kullanılabilir." } } }, diff --git a/webview-ui/src/i18n/locales/vi/prompts.json b/webview-ui/src/i18n/locales/vi/prompts.json index e541a38bc2f..061550e21b1 100644 --- a/webview-ui/src/i18n/locales/vi/prompts.json +++ b/webview-ui/src/i18n/locales/vi/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "Giải thích lệnh terminal", "description": "Nhận giải thích chi tiết về lệnh terminal và đầu ra của chúng. Có sẵn trong menu ngữ cảnh terminal (nhấp chuột phải vào nội dung terminal đã chọn)." + }, + "NEW_TASK": { + "label": "Bắt đầu tác vụ mới", + "description": "Bắt đầu tác vụ mới với nội dung đã nhập. Có sẵn trong bảng lệnh." } } }, diff --git a/webview-ui/src/i18n/locales/zh-CN/prompts.json b/webview-ui/src/i18n/locales/zh-CN/prompts.json index 0b9af777ba0..e80f9c8c6c6 100644 --- a/webview-ui/src/i18n/locales/zh-CN/prompts.json +++ b/webview-ui/src/i18n/locales/zh-CN/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "解释终端命令", "description": "获取对终端命令及其输出的详细解释。可在终端上下文菜单(右键点击选中的终端内容)中使用。" + }, + "NEW_TASK": { + "label": "开始新任务", + "description": "使用输入内容开始新任务。可在命令面板中使用。" } } }, diff --git a/webview-ui/src/i18n/locales/zh-TW/prompts.json b/webview-ui/src/i18n/locales/zh-TW/prompts.json index 0eb5c58d925..23df04b1c44 100644 --- a/webview-ui/src/i18n/locales/zh-TW/prompts.json +++ b/webview-ui/src/i18n/locales/zh-TW/prompts.json @@ -91,6 +91,10 @@ "TERMINAL_EXPLAIN": { "label": "解釋終端命令", "description": "獲取對終端命令及其輸出的詳細解釋。可在終端右鍵選單(右鍵點擊選中的終端內容)中使用。" + }, + "NEW_TASK": { + "label": "開始新工作", + "description": "使用輸入內容開始新工作。可在命令選擇區中使用。" } } }, From 45299a9aea98933d864573c2cbfcb370869aeba4 Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Wed, 26 Mar 2025 01:07:10 +0800 Subject: [PATCH 56/66] Fix the supportsPromptCache value for OpenAI models (#1923) Reference: - https://platform.openai.com/docs/models --- .changeset/mighty-bikes-applaud.md | 5 +++++ src/shared/api.ts | 18 +++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 .changeset/mighty-bikes-applaud.md diff --git a/.changeset/mighty-bikes-applaud.md b/.changeset/mighty-bikes-applaud.md new file mode 100644 index 00000000000..e731f19ed62 --- /dev/null +++ b/.changeset/mighty-bikes-applaud.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Fix the supportsPromptCache value for OpenAI models diff --git a/src/shared/api.ts b/src/shared/api.ts index a4eb382ef79..fbadd46505e 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -855,7 +855,7 @@ export const openAiNativeModels = { maxTokens: 100_000, contextWindow: 200_000, supportsImages: false, - supportsPromptCache: false, + supportsPromptCache: true, inputPrice: 1.1, outputPrice: 4.4, reasoningEffort: "medium", @@ -864,7 +864,7 @@ export const openAiNativeModels = { maxTokens: 100_000, contextWindow: 200_000, supportsImages: false, - supportsPromptCache: false, + supportsPromptCache: true, inputPrice: 1.1, outputPrice: 4.4, reasoningEffort: "high", @@ -873,7 +873,7 @@ export const openAiNativeModels = { maxTokens: 100_000, contextWindow: 200_000, supportsImages: false, - supportsPromptCache: false, + supportsPromptCache: true, inputPrice: 1.1, outputPrice: 4.4, reasoningEffort: "low", @@ -882,7 +882,7 @@ export const openAiNativeModels = { maxTokens: 100_000, contextWindow: 200_000, supportsImages: true, - supportsPromptCache: false, + supportsPromptCache: true, inputPrice: 15, outputPrice: 60, }, @@ -890,7 +890,7 @@ export const openAiNativeModels = { maxTokens: 32_768, contextWindow: 128_000, supportsImages: true, - supportsPromptCache: false, + supportsPromptCache: true, inputPrice: 15, outputPrice: 60, }, @@ -898,7 +898,7 @@ export const openAiNativeModels = { maxTokens: 65_536, contextWindow: 128_000, supportsImages: true, - supportsPromptCache: false, + supportsPromptCache: true, inputPrice: 1.1, outputPrice: 4.4, }, @@ -906,7 +906,7 @@ export const openAiNativeModels = { maxTokens: 16_384, contextWindow: 128_000, supportsImages: true, - supportsPromptCache: false, + supportsPromptCache: true, inputPrice: 75, outputPrice: 150, }, @@ -914,7 +914,7 @@ export const openAiNativeModels = { maxTokens: 16_384, contextWindow: 128_000, supportsImages: true, - supportsPromptCache: false, + supportsPromptCache: true, inputPrice: 2.5, outputPrice: 10, }, @@ -922,7 +922,7 @@ export const openAiNativeModels = { maxTokens: 16_384, contextWindow: 128_000, supportsImages: true, - supportsPromptCache: false, + supportsPromptCache: true, inputPrice: 0.15, outputPrice: 0.6, }, From ec423a715cc4d4ce11ec5eb09491eb5dff41067a Mon Sep 17 00:00:00 2001 From: Diarmid Mackenzie Date: Tue, 25 Mar 2025 17:08:17 +0000 Subject: [PATCH 57/66] Fetch instructions (#1869) * Code for new fetch_instructions tool * Call parameter for fetch_instructions task, not text * Additional places that fetch_instructions needs to be added. * Pass necessary objects into create MCP server code * Update snapshots to reflect changes to prompts * Fixes from testing * Move guidance on creating project modes to fetchable instructions * i18n for new prompt Translations suggested by Roo. * Missing translation * Another missing i18n update * Missing Catalan translation * Re-use content parameter on ClineSayTool * Remove space from zh-TW translation This is consistent with other translations Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * PR review - suggested changes to prompts * Slightly more conservative in terms of text pruning from default prompt * Move additional detail about mode creation into fetch_instructions instructions --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- src/core/Cline.ts | 59 ++ src/core/assistant-message/index.ts | 7 + .../__snapshots__/system.test.ts.snap | 983 ++++-------------- .../prompts/instructions/create-mcp-server.ts | 404 +++++++ src/core/prompts/instructions/create-mode.ts | 52 + src/core/prompts/instructions/instructions.ts | 25 + src/core/prompts/sections/mcp-servers.ts | 401 +------ src/core/prompts/sections/modes.ts | 45 +- src/core/prompts/tools/fetch-instructions.ts | 14 + src/core/prompts/tools/index.ts | 3 + src/shared/ExtensionMessage.ts | 1 + src/shared/tool-groups.ts | 3 +- webview-ui/src/components/chat/ChatRow.tsx | 15 + webview-ui/src/i18n/locales/ca/chat.json | 3 + webview-ui/src/i18n/locales/de/chat.json | 3 + webview-ui/src/i18n/locales/en/chat.json | 3 + webview-ui/src/i18n/locales/es/chat.json | 3 + webview-ui/src/i18n/locales/fr/chat.json | 3 + webview-ui/src/i18n/locales/hi/chat.json | 3 + webview-ui/src/i18n/locales/it/chat.json | 3 + webview-ui/src/i18n/locales/ja/chat.json | 3 + webview-ui/src/i18n/locales/ko/chat.json | 3 + webview-ui/src/i18n/locales/pl/chat.json | 3 + webview-ui/src/i18n/locales/pt-BR/chat.json | 3 + webview-ui/src/i18n/locales/tr/chat.json | 3 + webview-ui/src/i18n/locales/vi/chat.json | 3 + webview-ui/src/i18n/locales/zh-CN/chat.json | 3 + webview-ui/src/i18n/locales/zh-TW/chat.json | 3 + 28 files changed, 843 insertions(+), 1214 deletions(-) create mode 100644 src/core/prompts/instructions/create-mcp-server.ts create mode 100644 src/core/prompts/instructions/create-mode.ts create mode 100644 src/core/prompts/instructions/instructions.ts create mode 100644 src/core/prompts/tools/fetch-instructions.ts diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 63bffed83f5..7bb4f4628b9 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -30,6 +30,7 @@ import { everyLineHasLineNumbers, } from "../integrations/misc/extract-text" import { countFileLines } from "../integrations/misc/line-counter" +import { fetchInstructions } from "./prompts/instructions/instructions" import { ExitCodeDetails } from "../integrations/terminal/TerminalProcess" import { Terminal } from "../integrations/terminal/Terminal" import { TerminalRegistry } from "../integrations/terminal/TerminalRegistry" @@ -1371,6 +1372,8 @@ export class Cline extends EventEmitter { return `[${block.name} for '${block.params.command}']` case "read_file": return `[${block.name} for '${block.params.path}']` + case "fetch_instructions": + return `[${block.name} for '${block.params.task}']` case "write_to_file": return `[${block.name} for '${block.params.path}']` case "apply_diff": @@ -2396,6 +2399,62 @@ export class Cline extends EventEmitter { } } + case "fetch_instructions": { + const task: string | undefined = block.params.task + const sharedMessageProps: ClineSayTool = { + tool: "fetchInstructions", + content: task, + } + try { + if (block.partial) { + const partialMessage = JSON.stringify({ + ...sharedMessageProps, + content: undefined, + } satisfies ClineSayTool) + await this.ask("tool", partialMessage, block.partial).catch(() => {}) + break + } else { + if (!task) { + this.consecutiveMistakeCount++ + pushToolResult( + await this.sayAndCreateMissingParamError("fetch_instructions", "task"), + ) + break + } + + this.consecutiveMistakeCount = 0 + const completeMessage = JSON.stringify({ + ...sharedMessageProps, + content: task, + } satisfies ClineSayTool) + + const didApprove = await askApproval("tool", completeMessage) + if (!didApprove) { + break + } + + // now fetch the content and provide it to the agent. + const provider = this.providerRef.deref() + const mcpHub = provider?.getMcpHub() + if (!mcpHub) { + throw new Error("MCP hub not available") + } + const diffStrategy = this.diffStrategy + const context = provider?.context + const content = await fetchInstructions(task, { mcpHub, diffStrategy, context }) + if (!content) { + pushToolResult(formatResponse.toolError(`Invalid instructions request: ${task}`)) + break + } + pushToolResult(content) + break + } + } catch (error) { + await handleError("fetch instructions", error) + break + } + } + case "list_files": { const relDirPath: string | undefined = block.params.path const recursiveRaw: string | undefined = block.params.recursive diff --git a/src/core/assistant-message/index.ts b/src/core/assistant-message/index.ts index 5409c4bbe22..e59622169e3 100644 --- a/src/core/assistant-message/index.ts +++ b/src/core/assistant-message/index.ts @@ -25,6 +25,7 @@ export const toolUseNames = [ "attempt_completion", "switch_mode", "new_task", + "fetch_instructions", ] as const // Converts array of tool call names into a union type ("execute_command" | "read_file" | ...) @@ -59,6 +60,7 @@ export const toolParamNames = [ "message", "cwd", "follow_up", + "task", ] as const export type ToolParamName = (typeof toolParamNames)[number] @@ -82,6 +84,11 @@ export interface ReadFileToolUse extends ToolUse { params: Partial, "path" | "start_line" | "end_line">> } +export interface FetchInstructionsToolUse extends ToolUse { + name: "fetch_instructions" + params: Partial, "task">> +} + export interface WriteToFileToolUse extends ToolUse { name: "write_to_file" params: Partial, "path" | "content" | "line_count">> diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index de3c920d19a..e7f5e5c3ab3 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -80,6 +80,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -466,6 +479,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -941,6 +967,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -1380,6 +1419,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -1766,6 +1818,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -2152,6 +2217,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -2538,6 +2616,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -2973,6 +3064,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -3252,398 +3356,14 @@ The Model Context Protocol (MCP) enables communication between the system and MC When a server is connected, you can use the server's tools via the \`use_mcp_tool\` tool, and access the server's resources via the \`access_mcp_resource\` tool. (No MCP servers currently connected) - ## Creating an MCP Server -The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. - -When creating MCP servers, it's important to understand that they operate in a non-interactive environment. The server cannot initiate OAuth flows, open browser windows, or prompt for user input during runtime. All credentials and authentication tokens must be provided upfront through environment variables in the MCP settings configuration. For example, Spotify's API uses OAuth to get a refresh token for the user, but the MCP server cannot initiate this flow. While you can walk the user through obtaining an application client ID and secret, you may have to create a separate one-time setup script (like get-refresh-token.js) that captures and logs the final piece of the puzzle: the user's refresh token (i.e. you might run the script using execute_command which would open a browser for authentication, and then log the refresh token so that you can see it in the command output for you to use in the MCP settings configuration). - -Unless the user specifies otherwise, new local MCP servers should be created in: /mock/mcp/path - -### MCP Server Types and Configuration - -MCP servers can be configured in two ways in the MCP settings file: - -1. Local (Stdio) Server Configuration: -\`\`\`json -{ - "mcpServers": { - "local-weather": { - "command": "node", - "args": ["/path/to/weather-server/build/index.js"], - "env": { - "OPENWEATHER_API_KEY": "your-api-key" - } - } - } -} -\`\`\` - -2. Remote (SSE) Server Configuration: -\`\`\`json -{ - "mcpServers": { - "remote-weather": { - "url": "https://api.example.com/mcp", - "headers": { - "Authorization": "Bearer your-api-key" - } - } - } -} -\`\`\` - -Common configuration options for both types: -- \`disabled\`: (optional) Set to true to temporarily disable the server -- \`timeout\`: (optional) Maximum time in seconds to wait for server responses (default: 60) -- \`alwaysAllow\`: (optional) Array of tool names that don't require user confirmation - -### Example Local MCP Server - -For example, if the user wanted to give you the ability to retrieve weather information, you could create an MCP server that uses the OpenWeather API to get weather information, add it to the MCP settings configuration file, and then notice that you now have access to new tools and resources in the system prompt that you might use to show the user your new capabilities. - -The following example demonstrates how to build a local MCP server that provides weather data functionality using the Stdio transport. While this example shows how to implement resources, resource templates, and tools, in practice you should prefer using tools since they are more flexible and can handle dynamic parameters. The resource and resource template implementations are included here mainly for demonstration purposes of the different MCP capabilities, but a real weather server would likely just expose tools for fetching weather data. (The following steps are for macOS) - -1. Use the \`create-typescript-server\` tool to bootstrap a new project in the default MCP servers directory: - -\`\`\`bash -cd /mock/mcp/path -npx @modelcontextprotocol/create-server weather-server -cd weather-server -# Install dependencies -npm install axios -\`\`\` - -This will create a new project with the following structure: - -\`\`\` -weather-server/ - ├── package.json - { - ... - "type": "module", // added by default, uses ES module syntax (import/export) rather than CommonJS (require/module.exports) (Important to know if you create additional scripts in this server repository like a get-refresh-token.js script) - "scripts": { - "build": "tsc && node -e "require('fs').chmodSync('build/index.js', '755')"", - ... - } - ... - } - ├── tsconfig.json - └── src/ - └── weather-server/ - └── index.ts # Main server implementation -\`\`\` - -2. Replace \`src/index.ts\` with the following: - -\`\`\`typescript -#!/usr/bin/env node -import { Server } from '@modelcontextprotocol/sdk/server/index.js'; -import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; -import { - CallToolRequestSchema, - ErrorCode, - ListResourcesRequestSchema, - ListResourceTemplatesRequestSchema, - ListToolsRequestSchema, - McpError, - ReadResourceRequestSchema, -} from '@modelcontextprotocol/sdk/types.js'; -import axios from 'axios'; - -const API_KEY = process.env.OPENWEATHER_API_KEY; // provided by MCP config -if (!API_KEY) { - throw new Error('OPENWEATHER_API_KEY environment variable is required'); -} - -interface OpenWeatherResponse { - main: { - temp: number; - humidity: number; - }; - weather: [{ description: string }]; - wind: { speed: number }; - dt_txt?: string; -} - -const isValidForecastArgs = ( - args: any -): args is { city: string; days?: number } => - typeof args === 'object' && - args !== null && - typeof args.city === 'string' && - (args.days === undefined || typeof args.days === 'number'); - -class WeatherServer { - private server: Server; - private axiosInstance; - - constructor() { - this.server = new Server( - { - name: 'example-weather-server', - version: '0.1.0', - }, - { - capabilities: { - resources: {}, - tools: {}, - }, - } - ); - - this.axiosInstance = axios.create({ - baseURL: 'http://api.openweathermap.org/data/2.5', - params: { - appid: API_KEY, - units: 'metric', - }, - }); - - this.setupResourceHandlers(); - this.setupToolHandlers(); - - // Error handling - this.server.onerror = (error) => console.error('[MCP Error]', error); - process.on('SIGINT', async () => { - await this.server.close(); - process.exit(0); - }); - } - - // MCP Resources represent any kind of UTF-8 encoded data that an MCP server wants to make available to clients, such as database records, API responses, log files, and more. Servers define direct resources with a static URI or dynamic resources with a URI template that follows the format \`[protocol]://[host]/[path]\`. - private setupResourceHandlers() { - // For static resources, servers can expose a list of resources: - this.server.setRequestHandler(ListResourcesRequestSchema, async () => ({ - resources: [ - // This is a poor example since you could use the resource template to get the same information but this demonstrates how to define a static resource - { - uri: \`weather://San Francisco/current\`, // Unique identifier for San Francisco weather resource - name: \`Current weather in San Francisco\`, // Human-readable name - mimeType: 'application/json', // Optional MIME type - // Optional description - description: - 'Real-time weather data for San Francisco including temperature, conditions, humidity, and wind speed', - }, - ], - })); - - // For dynamic resources, servers can expose resource templates: - this.server.setRequestHandler( - ListResourceTemplatesRequestSchema, - async () => ({ - resourceTemplates: [ - { - uriTemplate: 'weather://{city}/current', // URI template (RFC 6570) - name: 'Current weather for a given city', // Human-readable name - mimeType: 'application/json', // Optional MIME type - description: 'Real-time weather data for a specified city', // Optional description - }, - ], - }) - ); - - // ReadResourceRequestSchema is used for both static resources and dynamic resource templates - this.server.setRequestHandler( - ReadResourceRequestSchema, - async (request) => { - const match = request.params.uri.match( - /^weather://([^/]+)/current$/ - ); - if (!match) { - throw new McpError( - ErrorCode.InvalidRequest, - \`Invalid URI format: \${request.params.uri}\` - ); - } - const city = decodeURIComponent(match[1]); - - try { - const response = await this.axiosInstance.get( - 'weather', // current weather - { - params: { q: city }, - } - ); - - return { - contents: [ - { - uri: request.params.uri, - mimeType: 'application/json', - text: JSON.stringify( - { - temperature: response.data.main.temp, - conditions: response.data.weather[0].description, - humidity: response.data.main.humidity, - wind_speed: response.data.wind.speed, - timestamp: new Date().toISOString(), - }, - null, - 2 - ), - }, - ], - }; - } catch (error) { - if (axios.isAxiosError(error)) { - throw new McpError( - ErrorCode.InternalError, - \`Weather API error: \${ - error.response?.data.message ?? error.message - }\` - ); - } - throw error; - } - } - ); - } - - /* MCP Tools enable servers to expose executable functionality to the system. Through these tools, you can interact with external systems, perform computations, and take actions in the real world. - * - Like resources, tools are identified by unique names and can include descriptions to guide their usage. However, unlike resources, tools represent dynamic operations that can modify state or interact with external systems. - * - While resources and tools are similar, you should prefer to create tools over resources when possible as they provide more flexibility. - */ - private setupToolHandlers() { - this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ - tools: [ - { - name: 'get_forecast', // Unique identifier - description: 'Get weather forecast for a city', // Human-readable description - inputSchema: { - // JSON Schema for parameters - type: 'object', - properties: { - city: { - type: 'string', - description: 'City name', - }, - days: { - type: 'number', - description: 'Number of days (1-5)', - minimum: 1, - maximum: 5, - }, - }, - required: ['city'], // Array of required property names - }, - }, - ], - })); - - this.server.setRequestHandler(CallToolRequestSchema, async (request) => { - if (request.params.name !== 'get_forecast') { - throw new McpError( - ErrorCode.MethodNotFound, - \`Unknown tool: \${request.params.name}\` - ); - } - - if (!isValidForecastArgs(request.params.arguments)) { - throw new McpError( - ErrorCode.InvalidParams, - 'Invalid forecast arguments' - ); - } - - const city = request.params.arguments.city; - const days = Math.min(request.params.arguments.days || 3, 5); - - try { - const response = await this.axiosInstance.get<{ - list: OpenWeatherResponse[]; - }>('forecast', { - params: { - q: city, - cnt: days * 8, - }, - }); - - return { - content: [ - { - type: 'text', - text: JSON.stringify(response.data.list, null, 2), - }, - ], - }; - } catch (error) { - if (axios.isAxiosError(error)) { - return { - content: [ - { - type: 'text', - text: \`Weather API error: \${ - error.response?.data.message ?? error.message - }\`, - }, - ], - isError: true, - }; - } - throw error; - } - }); - } - - async run() { - const transport = new StdioServerTransport(); - await this.server.connect(transport); - console.error('Weather MCP server running on stdio'); - } -} - -const server = new WeatherServer(); -server.run().catch(console.error); -\`\`\` - -(Remember: This is just an example–you may use different dependencies, break the implementation up into multiple files, etc.) - -3. Build and compile the executable JavaScript file - -\`\`\`bash -npm run build -\`\`\` - -4. Whenever you need an environment variable such as an API key to configure the MCP server, walk the user through the process of getting the key. For example, they may need to create an account and go to a developer dashboard to generate the key. Provide step-by-step instructions and URLs to make it easy for the user to retrieve the necessary information. Then use the ask_followup_question tool to ask the user for the key, in this case the OpenWeather API key. - -5. Install the MCP Server by adding the MCP server configuration to the settings file located at '/mock/settings/path'. The settings file may have other MCP servers already configured, so you would read it first and then add your new server to the existing \`mcpServers\` object. - -IMPORTANT: Regardless of what else you see in the MCP settings file, you must default any new MCP servers you create to disabled=false and alwaysAllow=[]. - -\`\`\`json -{ - "mcpServers": { - ..., - "weather": { - "command": "node", - "args": ["/path/to/weather-server/build/index.js"], - "env": { - "OPENWEATHER_API_KEY": "user-provided-api-key" - } - }, - } -} -\`\`\` - -(Note: the user may also ask you to install the MCP server to the Claude desktop app, in which case you would read then modify \`~/Library/Application Support/Claude/claude_desktop_config.json\` on macOS for example. It follows the same format of a top level \`mcpServers\` object.) - -6. After you have edited the MCP settings configuration file, the system will automatically run all the servers and expose the available tools and resources in the 'Connected MCP Servers' section. - -7. Now that you have access to these new tools and resources, you may suggest ways the user can command you to invoke them - for example, with this new weather tool now available, you can invite the user to ask "what's the weather in San Francisco?" - -## Editing MCP Servers - -The user may ask to add tools or resources that may make sense to add to an existing MCP server (listed under 'Connected MCP Servers' above: (None running currently), e.g. if it would use the same API. This would be possible if you can locate the MCP server repository on the user's system by looking at the server arguments for a filepath. You might then use list_files and read_file to explore the files in the repository, and use write_to_file to make changes to the files. - -However some MCP servers may be running from installed packages rather than a local repository, in which case it may make more sense to create a new MCP server. +The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. -# MCP Servers Are Not Always Necessary - -The user may not always request the use or creation of MCP servers. Instead, they might provide tasks that can be completed with existing tools. While using the MCP SDK to extend your capabilities can be useful, it's important to understand that this is just one specialized type of task you can accomplish. You should only implement MCP servers when the user explicitly requests it (e.g., "add a tool that..."). - -Remember: The MCP documentation and example provided above are to help you understand and work with existing MCP servers or create new ones when requested by the user. You already have access to tools and capabilities that can be used to accomplish a wide range of tasks. +You can obtain detailed instructions on this topic using the fetch_instructions tool, like this: + +create_mcp_server + ==== @@ -3813,6 +3533,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -4248,6 +3981,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -4696,6 +4442,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -5124,6 +4883,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -5672,6 +5444,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -6134,6 +5919,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -6494,6 +6292,19 @@ Note: When both start_line and end_line are provided, this tool efficiently stre This will return a truncated version of the file with information about total line count and method definitions, helping to prevent context size issues with very large files. +## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server + + ## search_files Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. Parameters: @@ -6858,398 +6669,14 @@ The Model Context Protocol (MCP) enables communication between the system and MC When a server is connected, you can use the server's tools via the \`use_mcp_tool\` tool, and access the server's resources via the \`access_mcp_resource\` tool. (No MCP servers currently connected) - ## Creating an MCP Server -The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. - -When creating MCP servers, it's important to understand that they operate in a non-interactive environment. The server cannot initiate OAuth flows, open browser windows, or prompt for user input during runtime. All credentials and authentication tokens must be provided upfront through environment variables in the MCP settings configuration. For example, Spotify's API uses OAuth to get a refresh token for the user, but the MCP server cannot initiate this flow. While you can walk the user through obtaining an application client ID and secret, you may have to create a separate one-time setup script (like get-refresh-token.js) that captures and logs the final piece of the puzzle: the user's refresh token (i.e. you might run the script using execute_command which would open a browser for authentication, and then log the refresh token so that you can see it in the command output for you to use in the MCP settings configuration). - -Unless the user specifies otherwise, new local MCP servers should be created in: /mock/mcp/path - -### MCP Server Types and Configuration - -MCP servers can be configured in two ways in the MCP settings file: - -1. Local (Stdio) Server Configuration: -\`\`\`json -{ - "mcpServers": { - "local-weather": { - "command": "node", - "args": ["/path/to/weather-server/build/index.js"], - "env": { - "OPENWEATHER_API_KEY": "your-api-key" - } - } - } -} -\`\`\` - -2. Remote (SSE) Server Configuration: -\`\`\`json -{ - "mcpServers": { - "remote-weather": { - "url": "https://api.example.com/mcp", - "headers": { - "Authorization": "Bearer your-api-key" - } - } - } -} -\`\`\` - -Common configuration options for both types: -- \`disabled\`: (optional) Set to true to temporarily disable the server -- \`timeout\`: (optional) Maximum time in seconds to wait for server responses (default: 60) -- \`alwaysAllow\`: (optional) Array of tool names that don't require user confirmation - -### Example Local MCP Server - -For example, if the user wanted to give you the ability to retrieve weather information, you could create an MCP server that uses the OpenWeather API to get weather information, add it to the MCP settings configuration file, and then notice that you now have access to new tools and resources in the system prompt that you might use to show the user your new capabilities. - -The following example demonstrates how to build a local MCP server that provides weather data functionality using the Stdio transport. While this example shows how to implement resources, resource templates, and tools, in practice you should prefer using tools since they are more flexible and can handle dynamic parameters. The resource and resource template implementations are included here mainly for demonstration purposes of the different MCP capabilities, but a real weather server would likely just expose tools for fetching weather data. (The following steps are for macOS) - -1. Use the \`create-typescript-server\` tool to bootstrap a new project in the default MCP servers directory: - -\`\`\`bash -cd /mock/mcp/path -npx @modelcontextprotocol/create-server weather-server -cd weather-server -# Install dependencies -npm install axios -\`\`\` - -This will create a new project with the following structure: - -\`\`\` -weather-server/ - ├── package.json - { - ... - "type": "module", // added by default, uses ES module syntax (import/export) rather than CommonJS (require/module.exports) (Important to know if you create additional scripts in this server repository like a get-refresh-token.js script) - "scripts": { - "build": "tsc && node -e "require('fs').chmodSync('build/index.js', '755')"", - ... - } - ... - } - ├── tsconfig.json - └── src/ - └── weather-server/ - └── index.ts # Main server implementation -\`\`\` - -2. Replace \`src/index.ts\` with the following: - -\`\`\`typescript -#!/usr/bin/env node -import { Server } from '@modelcontextprotocol/sdk/server/index.js'; -import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; -import { - CallToolRequestSchema, - ErrorCode, - ListResourcesRequestSchema, - ListResourceTemplatesRequestSchema, - ListToolsRequestSchema, - McpError, - ReadResourceRequestSchema, -} from '@modelcontextprotocol/sdk/types.js'; -import axios from 'axios'; - -const API_KEY = process.env.OPENWEATHER_API_KEY; // provided by MCP config -if (!API_KEY) { - throw new Error('OPENWEATHER_API_KEY environment variable is required'); -} - -interface OpenWeatherResponse { - main: { - temp: number; - humidity: number; - }; - weather: [{ description: string }]; - wind: { speed: number }; - dt_txt?: string; -} - -const isValidForecastArgs = ( - args: any -): args is { city: string; days?: number } => - typeof args === 'object' && - args !== null && - typeof args.city === 'string' && - (args.days === undefined || typeof args.days === 'number'); - -class WeatherServer { - private server: Server; - private axiosInstance; - - constructor() { - this.server = new Server( - { - name: 'example-weather-server', - version: '0.1.0', - }, - { - capabilities: { - resources: {}, - tools: {}, - }, - } - ); - - this.axiosInstance = axios.create({ - baseURL: 'http://api.openweathermap.org/data/2.5', - params: { - appid: API_KEY, - units: 'metric', - }, - }); - - this.setupResourceHandlers(); - this.setupToolHandlers(); - - // Error handling - this.server.onerror = (error) => console.error('[MCP Error]', error); - process.on('SIGINT', async () => { - await this.server.close(); - process.exit(0); - }); - } - - // MCP Resources represent any kind of UTF-8 encoded data that an MCP server wants to make available to clients, such as database records, API responses, log files, and more. Servers define direct resources with a static URI or dynamic resources with a URI template that follows the format \`[protocol]://[host]/[path]\`. - private setupResourceHandlers() { - // For static resources, servers can expose a list of resources: - this.server.setRequestHandler(ListResourcesRequestSchema, async () => ({ - resources: [ - // This is a poor example since you could use the resource template to get the same information but this demonstrates how to define a static resource - { - uri: \`weather://San Francisco/current\`, // Unique identifier for San Francisco weather resource - name: \`Current weather in San Francisco\`, // Human-readable name - mimeType: 'application/json', // Optional MIME type - // Optional description - description: - 'Real-time weather data for San Francisco including temperature, conditions, humidity, and wind speed', - }, - ], - })); - - // For dynamic resources, servers can expose resource templates: - this.server.setRequestHandler( - ListResourceTemplatesRequestSchema, - async () => ({ - resourceTemplates: [ - { - uriTemplate: 'weather://{city}/current', // URI template (RFC 6570) - name: 'Current weather for a given city', // Human-readable name - mimeType: 'application/json', // Optional MIME type - description: 'Real-time weather data for a specified city', // Optional description - }, - ], - }) - ); - - // ReadResourceRequestSchema is used for both static resources and dynamic resource templates - this.server.setRequestHandler( - ReadResourceRequestSchema, - async (request) => { - const match = request.params.uri.match( - /^weather://([^/]+)/current$/ - ); - if (!match) { - throw new McpError( - ErrorCode.InvalidRequest, - \`Invalid URI format: \${request.params.uri}\` - ); - } - const city = decodeURIComponent(match[1]); - - try { - const response = await this.axiosInstance.get( - 'weather', // current weather - { - params: { q: city }, - } - ); - - return { - contents: [ - { - uri: request.params.uri, - mimeType: 'application/json', - text: JSON.stringify( - { - temperature: response.data.main.temp, - conditions: response.data.weather[0].description, - humidity: response.data.main.humidity, - wind_speed: response.data.wind.speed, - timestamp: new Date().toISOString(), - }, - null, - 2 - ), - }, - ], - }; - } catch (error) { - if (axios.isAxiosError(error)) { - throw new McpError( - ErrorCode.InternalError, - \`Weather API error: \${ - error.response?.data.message ?? error.message - }\` - ); - } - throw error; - } - } - ); - } - - /* MCP Tools enable servers to expose executable functionality to the system. Through these tools, you can interact with external systems, perform computations, and take actions in the real world. - * - Like resources, tools are identified by unique names and can include descriptions to guide their usage. However, unlike resources, tools represent dynamic operations that can modify state or interact with external systems. - * - While resources and tools are similar, you should prefer to create tools over resources when possible as they provide more flexibility. - */ - private setupToolHandlers() { - this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ - tools: [ - { - name: 'get_forecast', // Unique identifier - description: 'Get weather forecast for a city', // Human-readable description - inputSchema: { - // JSON Schema for parameters - type: 'object', - properties: { - city: { - type: 'string', - description: 'City name', - }, - days: { - type: 'number', - description: 'Number of days (1-5)', - minimum: 1, - maximum: 5, - }, - }, - required: ['city'], // Array of required property names - }, - }, - ], - })); - - this.server.setRequestHandler(CallToolRequestSchema, async (request) => { - if (request.params.name !== 'get_forecast') { - throw new McpError( - ErrorCode.MethodNotFound, - \`Unknown tool: \${request.params.name}\` - ); - } - - if (!isValidForecastArgs(request.params.arguments)) { - throw new McpError( - ErrorCode.InvalidParams, - 'Invalid forecast arguments' - ); - } - - const city = request.params.arguments.city; - const days = Math.min(request.params.arguments.days || 3, 5); - - try { - const response = await this.axiosInstance.get<{ - list: OpenWeatherResponse[]; - }>('forecast', { - params: { - q: city, - cnt: days * 8, - }, - }); - - return { - content: [ - { - type: 'text', - text: JSON.stringify(response.data.list, null, 2), - }, - ], - }; - } catch (error) { - if (axios.isAxiosError(error)) { - return { - content: [ - { - type: 'text', - text: \`Weather API error: \${ - error.response?.data.message ?? error.message - }\`, - }, - ], - isError: true, - }; - } - throw error; - } - }); - } - - async run() { - const transport = new StdioServerTransport(); - await this.server.connect(transport); - console.error('Weather MCP server running on stdio'); - } -} - -const server = new WeatherServer(); -server.run().catch(console.error); -\`\`\` - -(Remember: This is just an example–you may use different dependencies, break the implementation up into multiple files, etc.) - -3. Build and compile the executable JavaScript file - -\`\`\`bash -npm run build -\`\`\` - -4. Whenever you need an environment variable such as an API key to configure the MCP server, walk the user through the process of getting the key. For example, they may need to create an account and go to a developer dashboard to generate the key. Provide step-by-step instructions and URLs to make it easy for the user to retrieve the necessary information. Then use the ask_followup_question tool to ask the user for the key, in this case the OpenWeather API key. - -5. Install the MCP Server by adding the MCP server configuration to the settings file located at '/mock/settings/path'. The settings file may have other MCP servers already configured, so you would read it first and then add your new server to the existing \`mcpServers\` object. - -IMPORTANT: Regardless of what else you see in the MCP settings file, you must default any new MCP servers you create to disabled=false and alwaysAllow=[]. - -\`\`\`json -{ - "mcpServers": { - ..., - "weather": { - "command": "node", - "args": ["/path/to/weather-server/build/index.js"], - "env": { - "OPENWEATHER_API_KEY": "user-provided-api-key" - } - }, - } -} -\`\`\` - -(Note: the user may also ask you to install the MCP server to the Claude desktop app, in which case you would read then modify \`~/Library/Application Support/Claude/claude_desktop_config.json\` on macOS for example. It follows the same format of a top level \`mcpServers\` object.) - -6. After you have edited the MCP settings configuration file, the system will automatically run all the servers and expose the available tools and resources in the 'Connected MCP Servers' section. - -7. Now that you have access to these new tools and resources, you may suggest ways the user can command you to invoke them - for example, with this new weather tool now available, you can invite the user to ask "what's the weather in San Francisco?" - -## Editing MCP Servers - -The user may ask to add tools or resources that may make sense to add to an existing MCP server (listed under 'Connected MCP Servers' above: (None running currently), e.g. if it would use the same API. This would be possible if you can locate the MCP server repository on the user's system by looking at the server arguments for a filepath. You might then use list_files and read_file to explore the files in the repository, and use write_to_file to make changes to the files. - -However some MCP servers may be running from installed packages rather than a local repository, in which case it may make more sense to create a new MCP server. - -# MCP Servers Are Not Always Necessary - -The user may not always request the use or creation of MCP servers. Instead, they might provide tasks that can be completed with existing tools. While using the MCP SDK to extend your capabilities can be useful, it's important to understand that this is just one specialized type of task you can accomplish. You should only implement MCP servers when the user explicitly requests it (e.g., "add a tool that..."). +The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. -Remember: The MCP documentation and example provided above are to help you understand and work with existing MCP servers or create new ones when requested by the user. You already have access to tools and capabilities that can be used to accomplish a wide range of tasks. +You can obtain detailed instructions on this topic using the fetch_instructions tool, like this: + +create_mcp_server + ==== diff --git a/src/core/prompts/instructions/create-mcp-server.ts b/src/core/prompts/instructions/create-mcp-server.ts new file mode 100644 index 00000000000..917a94f47ad --- /dev/null +++ b/src/core/prompts/instructions/create-mcp-server.ts @@ -0,0 +1,404 @@ +import { McpHub } from "../../../services/mcp/McpHub" +import { DiffStrategy } from "../../diff/DiffStrategy" + +export async function createMCPServerInstructions( + mcpHub: McpHub | undefined, + diffStrategy: DiffStrategy | undefined, +): Promise { + if (!diffStrategy || !mcpHub) throw new Error("Missing MCP Hub or Diff Strategy") + + return `You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. + +When creating MCP servers, it's important to understand that they operate in a non-interactive environment. The server cannot initiate OAuth flows, open browser windows, or prompt for user input during runtime. All credentials and authentication tokens must be provided upfront through environment variables in the MCP settings configuration. For example, Spotify's API uses OAuth to get a refresh token for the user, but the MCP server cannot initiate this flow. While you can walk the user through obtaining an application client ID and secret, you may have to create a separate one-time setup script (like get-refresh-token.js) that captures and logs the final piece of the puzzle: the user's refresh token (i.e. you might run the script using execute_command which would open a browser for authentication, and then log the refresh token so that you can see it in the command output for you to use in the MCP settings configuration). + +Unless the user specifies otherwise, new local MCP servers should be created in: ${await mcpHub.getMcpServersPath()} + +### MCP Server Types and Configuration + +MCP servers can be configured in two ways in the MCP settings file: + +1. Local (Stdio) Server Configuration: +\`\`\`json +{ + "mcpServers": { + "local-weather": { + "command": "node", + "args": ["/path/to/weather-server/build/index.js"], + "env": { + "OPENWEATHER_API_KEY": "your-api-key" + } + } + } +} +\`\`\` + +2. Remote (SSE) Server Configuration: +\`\`\`json +{ + "mcpServers": { + "remote-weather": { + "url": "https://api.example.com/mcp", + "headers": { + "Authorization": "Bearer your-api-key" + } + } + } +} +\`\`\` + +Common configuration options for both types: +- \`disabled\`: (optional) Set to true to temporarily disable the server +- \`timeout\`: (optional) Maximum time in seconds to wait for server responses (default: 60) +- \`alwaysAllow\`: (optional) Array of tool names that don't require user confirmation + +### Example Local MCP Server + +For example, if the user wanted to give you the ability to retrieve weather information, you could create an MCP server that uses the OpenWeather API to get weather information, add it to the MCP settings configuration file, and then notice that you now have access to new tools and resources in the system prompt that you might use to show the user your new capabilities. + +The following example demonstrates how to build a local MCP server that provides weather data functionality using the Stdio transport. While this example shows how to implement resources, resource templates, and tools, in practice you should prefer using tools since they are more flexible and can handle dynamic parameters. The resource and resource template implementations are included here mainly for demonstration purposes of the different MCP capabilities, but a real weather server would likely just expose tools for fetching weather data. (The following steps are for macOS) + +1. Use the \`create-typescript-server\` tool to bootstrap a new project in the default MCP servers directory: + +\`\`\`bash +cd ${await mcpHub.getMcpServersPath()} +npx @modelcontextprotocol/create-server weather-server +cd weather-server +# Install dependencies +npm install axios +\`\`\` + +This will create a new project with the following structure: + +\`\`\` +weather-server/ + ├── package.json + { + ... + "type": "module", // added by default, uses ES module syntax (import/export) rather than CommonJS (require/module.exports) (Important to know if you create additional scripts in this server repository like a get-refresh-token.js script) + "scripts": { + "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", + ... + } + ... + } + ├── tsconfig.json + └── src/ + └── weather-server/ + └── index.ts # Main server implementation +\`\`\` + +2. Replace \`src/index.ts\` with the following: + +\`\`\`typescript +#!/usr/bin/env node +import { Server } from '@modelcontextprotocol/sdk/server/index.js'; +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; +import { + CallToolRequestSchema, + ErrorCode, + ListResourcesRequestSchema, + ListResourceTemplatesRequestSchema, + ListToolsRequestSchema, + McpError, + ReadResourceRequestSchema, +} from '@modelcontextprotocol/sdk/types.js'; +import axios from 'axios'; + +const API_KEY = process.env.OPENWEATHER_API_KEY; // provided by MCP config +if (!API_KEY) { + throw new Error('OPENWEATHER_API_KEY environment variable is required'); +} + +interface OpenWeatherResponse { + main: { + temp: number; + humidity: number; + }; + weather: [{ description: string }]; + wind: { speed: number }; + dt_txt?: string; +} + +const isValidForecastArgs = ( + args: any +): args is { city: string; days?: number } => + typeof args === 'object' && + args !== null && + typeof args.city === 'string' && + (args.days === undefined || typeof args.days === 'number'); + +class WeatherServer { + private server: Server; + private axiosInstance; + + constructor() { + this.server = new Server( + { + name: 'example-weather-server', + version: '0.1.0', + }, + { + capabilities: { + resources: {}, + tools: {}, + }, + } + ); + + this.axiosInstance = axios.create({ + baseURL: 'http://api.openweathermap.org/data/2.5', + params: { + appid: API_KEY, + units: 'metric', + }, + }); + + this.setupResourceHandlers(); + this.setupToolHandlers(); + + // Error handling + this.server.onerror = (error) => console.error('[MCP Error]', error); + process.on('SIGINT', async () => { + await this.server.close(); + process.exit(0); + }); + } + + // MCP Resources represent any kind of UTF-8 encoded data that an MCP server wants to make available to clients, such as database records, API responses, log files, and more. Servers define direct resources with a static URI or dynamic resources with a URI template that follows the format \`[protocol]://[host]/[path]\`. + private setupResourceHandlers() { + // For static resources, servers can expose a list of resources: + this.server.setRequestHandler(ListResourcesRequestSchema, async () => ({ + resources: [ + // This is a poor example since you could use the resource template to get the same information but this demonstrates how to define a static resource + { + uri: \`weather://San Francisco/current\`, // Unique identifier for San Francisco weather resource + name: \`Current weather in San Francisco\`, // Human-readable name + mimeType: 'application/json', // Optional MIME type + // Optional description + description: + 'Real-time weather data for San Francisco including temperature, conditions, humidity, and wind speed', + }, + ], + })); + + // For dynamic resources, servers can expose resource templates: + this.server.setRequestHandler( + ListResourceTemplatesRequestSchema, + async () => ({ + resourceTemplates: [ + { + uriTemplate: 'weather://{city}/current', // URI template (RFC 6570) + name: 'Current weather for a given city', // Human-readable name + mimeType: 'application/json', // Optional MIME type + description: 'Real-time weather data for a specified city', // Optional description + }, + ], + }) + ); + + // ReadResourceRequestSchema is used for both static resources and dynamic resource templates + this.server.setRequestHandler( + ReadResourceRequestSchema, + async (request) => { + const match = request.params.uri.match( + /^weather:\/\/([^/]+)\/current$/ + ); + if (!match) { + throw new McpError( + ErrorCode.InvalidRequest, + \`Invalid URI format: \${request.params.uri}\` + ); + } + const city = decodeURIComponent(match[1]); + + try { + const response = await this.axiosInstance.get( + 'weather', // current weather + { + params: { q: city }, + } + ); + + return { + contents: [ + { + uri: request.params.uri, + mimeType: 'application/json', + text: JSON.stringify( + { + temperature: response.data.main.temp, + conditions: response.data.weather[0].description, + humidity: response.data.main.humidity, + wind_speed: response.data.wind.speed, + timestamp: new Date().toISOString(), + }, + null, + 2 + ), + }, + ], + }; + } catch (error) { + if (axios.isAxiosError(error)) { + throw new McpError( + ErrorCode.InternalError, + \`Weather API error: \${ + error.response?.data.message ?? error.message + }\` + ); + } + throw error; + } + } + ); + } + + /* MCP Tools enable servers to expose executable functionality to the system. Through these tools, you can interact with external systems, perform computations, and take actions in the real world. + * - Like resources, tools are identified by unique names and can include descriptions to guide their usage. However, unlike resources, tools represent dynamic operations that can modify state or interact with external systems. + * - While resources and tools are similar, you should prefer to create tools over resources when possible as they provide more flexibility. + */ + private setupToolHandlers() { + this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ + tools: [ + { + name: 'get_forecast', // Unique identifier + description: 'Get weather forecast for a city', // Human-readable description + inputSchema: { + // JSON Schema for parameters + type: 'object', + properties: { + city: { + type: 'string', + description: 'City name', + }, + days: { + type: 'number', + description: 'Number of days (1-5)', + minimum: 1, + maximum: 5, + }, + }, + required: ['city'], // Array of required property names + }, + }, + ], + })); + + this.server.setRequestHandler(CallToolRequestSchema, async (request) => { + if (request.params.name !== 'get_forecast') { + throw new McpError( + ErrorCode.MethodNotFound, + \`Unknown tool: \${request.params.name}\` + ); + } + + if (!isValidForecastArgs(request.params.arguments)) { + throw new McpError( + ErrorCode.InvalidParams, + 'Invalid forecast arguments' + ); + } + + const city = request.params.arguments.city; + const days = Math.min(request.params.arguments.days || 3, 5); + + try { + const response = await this.axiosInstance.get<{ + list: OpenWeatherResponse[]; + }>('forecast', { + params: { + q: city, + cnt: days * 8, + }, + }); + + return { + content: [ + { + type: 'text', + text: JSON.stringify(response.data.list, null, 2), + }, + ], + }; + } catch (error) { + if (axios.isAxiosError(error)) { + return { + content: [ + { + type: 'text', + text: \`Weather API error: \${ + error.response?.data.message ?? error.message + }\`, + }, + ], + isError: true, + }; + } + throw error; + } + }); + } + + async run() { + const transport = new StdioServerTransport(); + await this.server.connect(transport); + console.error('Weather MCP server running on stdio'); + } +} + +const server = new WeatherServer(); +server.run().catch(console.error); +\`\`\` + +(Remember: This is just an example–you may use different dependencies, break the implementation up into multiple files, etc.) + +3. Build and compile the executable JavaScript file + +\`\`\`bash +npm run build +\`\`\` + +4. Whenever you need an environment variable such as an API key to configure the MCP server, walk the user through the process of getting the key. For example, they may need to create an account and go to a developer dashboard to generate the key. Provide step-by-step instructions and URLs to make it easy for the user to retrieve the necessary information. Then use the ask_followup_question tool to ask the user for the key, in this case the OpenWeather API key. + +5. Install the MCP Server by adding the MCP server configuration to the settings file located at '${await mcpHub.getMcpSettingsFilePath()}'. The settings file may have other MCP servers already configured, so you would read it first and then add your new server to the existing \`mcpServers\` object. + +IMPORTANT: Regardless of what else you see in the MCP settings file, you must default any new MCP servers you create to disabled=false and alwaysAllow=[]. + +\`\`\`json +{ + "mcpServers": { + ..., + "weather": { + "command": "node", + "args": ["/path/to/weather-server/build/index.js"], + "env": { + "OPENWEATHER_API_KEY": "user-provided-api-key" + } + }, + } +} +\`\`\` + +(Note: the user may also ask you to install the MCP server to the Claude desktop app, in which case you would read then modify \`~/Library/Application\ Support/Claude/claude_desktop_config.json\` on macOS for example. It follows the same format of a top level \`mcpServers\` object.) + +6. After you have edited the MCP settings configuration file, the system will automatically run all the servers and expose the available tools and resources in the 'Connected MCP Servers' section. + +7. Now that you have access to these new tools and resources, you may suggest ways the user can command you to invoke them - for example, with this new weather tool now available, you can invite the user to ask "what's the weather in San Francisco?" + +## Editing MCP Servers + +The user may ask to add tools or resources that may make sense to add to an existing MCP server (listed under 'Connected MCP Servers' above: ${ + mcpHub + .getServers() + .map((server) => server.name) + .join(", ") || "(None running currently)" + }, e.g. if it would use the same API. This would be possible if you can locate the MCP server repository on the user's system by looking at the server arguments for a filepath. You might then use list_files and read_file to explore the files in the repository, and use write_to_file${diffStrategy ? " or apply_diff" : ""} to make changes to the files. + +However some MCP servers may be running from installed packages rather than a local repository, in which case it may make more sense to create a new MCP server. + +# MCP Servers Are Not Always Necessary + +The user may not always request the use or creation of MCP servers. Instead, they might provide tasks that can be completed with existing tools. While using the MCP SDK to extend your capabilities can be useful, it's important to understand that this is just one specialized type of task you can accomplish. You should only implement MCP servers when the user explicitly requests it (e.g., "add a tool that..."). + +Remember: The MCP documentation and example provided above are to help you understand and work with existing MCP servers or create new ones when requested by the user. You already have access to tools and capabilities that can be used to accomplish a wide range of tasks.` +} diff --git a/src/core/prompts/instructions/create-mode.ts b/src/core/prompts/instructions/create-mode.ts new file mode 100644 index 00000000000..fd88dbfb596 --- /dev/null +++ b/src/core/prompts/instructions/create-mode.ts @@ -0,0 +1,52 @@ +import * as path from "path" +import * as vscode from "vscode" +import { promises as fs } from "fs" +import { GlobalFileNames } from "../../../shared/globalFileNames" + +export async function createModeInstructions(context: vscode.ExtensionContext | undefined): Promise { + if (!context) throw new Error("Missing VSCode Extension Context") + + const settingsDir = path.join(context.globalStorageUri.fsPath, "settings") + const customModesPath = path.join(settingsDir, GlobalFileNames.customModes) + + return ` +Custom modes can be configured in two ways: + 1. Globally via '${customModesPath}' (created automatically on startup) + 2. Per-workspace via '.roomodes' in the workspace root directory + +When modes with the same slug exist in both files, the workspace-specific .roomodes version takes precedence. This allows projects to override global modes or define project-specific modes. + + +If asked to create a project mode, create it in .roomodes in the workspace root. If asked to create a global mode, use the global custom modes file. + +- The following fields are required and must not be empty: + * slug: A valid slug (lowercase letters, numbers, and hyphens). Must be unique, and shorter is better. + * name: The display name for the mode + * roleDefinition: A detailed description of the mode's role and capabilities + * groups: Array of allowed tool groups (can be empty). Each group can be specified either as a string (e.g., "edit" to allow editing any file) or with file restrictions (e.g., ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }] to only allow editing markdown files) + +- The customInstructions field is optional. + +- For multi-line text, include newline characters in the string like "This is the first line.\\nThis is the next line.\\n\\nThis is a double line break." + +Both files should follow this structure: +{ + "customModes": [ + { + "slug": "designer", // Required: unique slug with lowercase letters, numbers, and hyphens + "name": "Designer", // Required: mode display name + "roleDefinition": "You are Roo, a UI/UX expert specializing in design systems and frontend development. Your expertise includes:\\n- Creating and maintaining design systems\\n- Implementing responsive and accessible web interfaces\\n- Working with CSS, HTML, and modern frontend frameworks\\n- Ensuring consistent user experiences across platforms", // Required: non-empty + "groups": [ // Required: array of tool groups (can be empty) + "read", // Read files group (read_file, fetch_instructions, search_files, list_files, list_code_definition_names) + "edit", // Edit files group (apply_diff, write_to_file) - allows editing any file + // Or with file restrictions: + // ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }], // Edit group that only allows editing markdown files + "browser", // Browser group (browser_action) + "command", // Command group (execute_command) + "mcp" // MCP group (use_mcp_tool, access_mcp_resource) + ], + "customInstructions": "Additional instructions for the Designer mode" // Optional + } + ] +}` +} diff --git a/src/core/prompts/instructions/instructions.ts b/src/core/prompts/instructions/instructions.ts new file mode 100644 index 00000000000..3abfaac0b90 --- /dev/null +++ b/src/core/prompts/instructions/instructions.ts @@ -0,0 +1,25 @@ +import { createMCPServerInstructions } from "./create-mcp-server" +import { createModeInstructions } from "./create-mode" +import { McpHub } from "../../../services/mcp/McpHub" +import { DiffStrategy } from "../../diff/DiffStrategy" +import * as vscode from "vscode" + +interface InstructionsDetail { + mcpHub?: McpHub + diffStrategy?: DiffStrategy + context?: vscode.ExtensionContext +} + +export async function fetchInstructions(text: string, detail: InstructionsDetail): Promise { + switch (text) { + case "create_mcp_server": { + return await createMCPServerInstructions(detail.mcpHub, detail.diffStrategy) + } + case "create_mode": { + return await createModeInstructions(detail.context) + } + default: { + return "" + } + } +} diff --git a/src/core/prompts/sections/mcp-servers.ts b/src/core/prompts/sections/mcp-servers.ts index 530bb374f7d..5603b0c3850 100644 --- a/src/core/prompts/sections/mcp-servers.ts +++ b/src/core/prompts/sections/mcp-servers.ts @@ -20,7 +20,7 @@ export async function getMcpServersSection( ?.map((tool) => { const schemaStr = tool.inputSchema ? ` Input Schema: - ${JSON.stringify(tool.inputSchema, null, 2).split("\n").join("\n ")}` + ${JSON.stringify(tool.inputSchema, null, 2).split("\n").join("\n ")}` : "" return `- ${tool.name}: ${tool.description}\n${schemaStr}` @@ -67,402 +67,13 @@ ${connectedServers}` return ( baseSection + ` - ## Creating an MCP Server -The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. - -When creating MCP servers, it's important to understand that they operate in a non-interactive environment. The server cannot initiate OAuth flows, open browser windows, or prompt for user input during runtime. All credentials and authentication tokens must be provided upfront through environment variables in the MCP settings configuration. For example, Spotify's API uses OAuth to get a refresh token for the user, but the MCP server cannot initiate this flow. While you can walk the user through obtaining an application client ID and secret, you may have to create a separate one-time setup script (like get-refresh-token.js) that captures and logs the final piece of the puzzle: the user's refresh token (i.e. you might run the script using execute_command which would open a browser for authentication, and then log the refresh token so that you can see it in the command output for you to use in the MCP settings configuration). - -Unless the user specifies otherwise, new local MCP servers should be created in: ${await mcpHub.getMcpServersPath()} - -### MCP Server Types and Configuration - -MCP servers can be configured in two ways in the MCP settings file: - -1. Local (Stdio) Server Configuration: -\`\`\`json -{ - "mcpServers": { - "local-weather": { - "command": "node", - "args": ["/path/to/weather-server/build/index.js"], - "env": { - "OPENWEATHER_API_KEY": "your-api-key" - } - } - } -} -\`\`\` - -2. Remote (SSE) Server Configuration: -\`\`\`json -{ - "mcpServers": { - "remote-weather": { - "url": "https://api.example.com/mcp", - "headers": { - "Authorization": "Bearer your-api-key" - } - } - } -} -\`\`\` - -Common configuration options for both types: -- \`disabled\`: (optional) Set to true to temporarily disable the server -- \`timeout\`: (optional) Maximum time in seconds to wait for server responses (default: 60) -- \`alwaysAllow\`: (optional) Array of tool names that don't require user confirmation - -### Example Local MCP Server - -For example, if the user wanted to give you the ability to retrieve weather information, you could create an MCP server that uses the OpenWeather API to get weather information, add it to the MCP settings configuration file, and then notice that you now have access to new tools and resources in the system prompt that you might use to show the user your new capabilities. - -The following example demonstrates how to build a local MCP server that provides weather data functionality using the Stdio transport. While this example shows how to implement resources, resource templates, and tools, in practice you should prefer using tools since they are more flexible and can handle dynamic parameters. The resource and resource template implementations are included here mainly for demonstration purposes of the different MCP capabilities, but a real weather server would likely just expose tools for fetching weather data. (The following steps are for macOS) - -1. Use the \`create-typescript-server\` tool to bootstrap a new project in the default MCP servers directory: - -\`\`\`bash -cd ${await mcpHub.getMcpServersPath()} -npx @modelcontextprotocol/create-server weather-server -cd weather-server -# Install dependencies -npm install axios -\`\`\` - -This will create a new project with the following structure: - -\`\`\` -weather-server/ - ├── package.json - { - ... - "type": "module", // added by default, uses ES module syntax (import/export) rather than CommonJS (require/module.exports) (Important to know if you create additional scripts in this server repository like a get-refresh-token.js script) - "scripts": { - "build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"", - ... - } - ... - } - ├── tsconfig.json - └── src/ - └── weather-server/ - └── index.ts # Main server implementation -\`\`\` - -2. Replace \`src/index.ts\` with the following: - -\`\`\`typescript -#!/usr/bin/env node -import { Server } from '@modelcontextprotocol/sdk/server/index.js'; -import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; -import { - CallToolRequestSchema, - ErrorCode, - ListResourcesRequestSchema, - ListResourceTemplatesRequestSchema, - ListToolsRequestSchema, - McpError, - ReadResourceRequestSchema, -} from '@modelcontextprotocol/sdk/types.js'; -import axios from 'axios'; - -const API_KEY = process.env.OPENWEATHER_API_KEY; // provided by MCP config -if (!API_KEY) { - throw new Error('OPENWEATHER_API_KEY environment variable is required'); -} - -interface OpenWeatherResponse { - main: { - temp: number; - humidity: number; - }; - weather: [{ description: string }]; - wind: { speed: number }; - dt_txt?: string; -} - -const isValidForecastArgs = ( - args: any -): args is { city: string; days?: number } => - typeof args === 'object' && - args !== null && - typeof args.city === 'string' && - (args.days === undefined || typeof args.days === 'number'); - -class WeatherServer { - private server: Server; - private axiosInstance; - - constructor() { - this.server = new Server( - { - name: 'example-weather-server', - version: '0.1.0', - }, - { - capabilities: { - resources: {}, - tools: {}, - }, - } - ); - - this.axiosInstance = axios.create({ - baseURL: 'http://api.openweathermap.org/data/2.5', - params: { - appid: API_KEY, - units: 'metric', - }, - }); - - this.setupResourceHandlers(); - this.setupToolHandlers(); - - // Error handling - this.server.onerror = (error) => console.error('[MCP Error]', error); - process.on('SIGINT', async () => { - await this.server.close(); - process.exit(0); - }); - } - - // MCP Resources represent any kind of UTF-8 encoded data that an MCP server wants to make available to clients, such as database records, API responses, log files, and more. Servers define direct resources with a static URI or dynamic resources with a URI template that follows the format \`[protocol]://[host]/[path]\`. - private setupResourceHandlers() { - // For static resources, servers can expose a list of resources: - this.server.setRequestHandler(ListResourcesRequestSchema, async () => ({ - resources: [ - // This is a poor example since you could use the resource template to get the same information but this demonstrates how to define a static resource - { - uri: \`weather://San Francisco/current\`, // Unique identifier for San Francisco weather resource - name: \`Current weather in San Francisco\`, // Human-readable name - mimeType: 'application/json', // Optional MIME type - // Optional description - description: - 'Real-time weather data for San Francisco including temperature, conditions, humidity, and wind speed', - }, - ], - })); - - // For dynamic resources, servers can expose resource templates: - this.server.setRequestHandler( - ListResourceTemplatesRequestSchema, - async () => ({ - resourceTemplates: [ - { - uriTemplate: 'weather://{city}/current', // URI template (RFC 6570) - name: 'Current weather for a given city', // Human-readable name - mimeType: 'application/json', // Optional MIME type - description: 'Real-time weather data for a specified city', // Optional description - }, - ], - }) - ); - - // ReadResourceRequestSchema is used for both static resources and dynamic resource templates - this.server.setRequestHandler( - ReadResourceRequestSchema, - async (request) => { - const match = request.params.uri.match( - /^weather:\/\/([^/]+)\/current$/ - ); - if (!match) { - throw new McpError( - ErrorCode.InvalidRequest, - \`Invalid URI format: \${request.params.uri}\` - ); - } - const city = decodeURIComponent(match[1]); - - try { - const response = await this.axiosInstance.get( - 'weather', // current weather - { - params: { q: city }, - } - ); - - return { - contents: [ - { - uri: request.params.uri, - mimeType: 'application/json', - text: JSON.stringify( - { - temperature: response.data.main.temp, - conditions: response.data.weather[0].description, - humidity: response.data.main.humidity, - wind_speed: response.data.wind.speed, - timestamp: new Date().toISOString(), - }, - null, - 2 - ), - }, - ], - }; - } catch (error) { - if (axios.isAxiosError(error)) { - throw new McpError( - ErrorCode.InternalError, - \`Weather API error: \${ - error.response?.data.message ?? error.message - }\` - ); - } - throw error; - } - } - ); - } - - /* MCP Tools enable servers to expose executable functionality to the system. Through these tools, you can interact with external systems, perform computations, and take actions in the real world. - * - Like resources, tools are identified by unique names and can include descriptions to guide their usage. However, unlike resources, tools represent dynamic operations that can modify state or interact with external systems. - * - While resources and tools are similar, you should prefer to create tools over resources when possible as they provide more flexibility. - */ - private setupToolHandlers() { - this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ - tools: [ - { - name: 'get_forecast', // Unique identifier - description: 'Get weather forecast for a city', // Human-readable description - inputSchema: { - // JSON Schema for parameters - type: 'object', - properties: { - city: { - type: 'string', - description: 'City name', - }, - days: { - type: 'number', - description: 'Number of days (1-5)', - minimum: 1, - maximum: 5, - }, - }, - required: ['city'], // Array of required property names - }, - }, - ], - })); - - this.server.setRequestHandler(CallToolRequestSchema, async (request) => { - if (request.params.name !== 'get_forecast') { - throw new McpError( - ErrorCode.MethodNotFound, - \`Unknown tool: \${request.params.name}\` - ); - } - - if (!isValidForecastArgs(request.params.arguments)) { - throw new McpError( - ErrorCode.InvalidParams, - 'Invalid forecast arguments' - ); - } - - const city = request.params.arguments.city; - const days = Math.min(request.params.arguments.days || 3, 5); - - try { - const response = await this.axiosInstance.get<{ - list: OpenWeatherResponse[]; - }>('forecast', { - params: { - q: city, - cnt: days * 8, - }, - }); - - return { - content: [ - { - type: 'text', - text: JSON.stringify(response.data.list, null, 2), - }, - ], - }; - } catch (error) { - if (axios.isAxiosError(error)) { - return { - content: [ - { - type: 'text', - text: \`Weather API error: \${ - error.response?.data.message ?? error.message - }\`, - }, - ], - isError: true, - }; - } - throw error; - } - }); - } - - async run() { - const transport = new StdioServerTransport(); - await this.server.connect(transport); - console.error('Weather MCP server running on stdio'); - } -} - -const server = new WeatherServer(); -server.run().catch(console.error); -\`\`\` - -(Remember: This is just an example–you may use different dependencies, break the implementation up into multiple files, etc.) - -3. Build and compile the executable JavaScript file - -\`\`\`bash -npm run build -\`\`\` - -4. Whenever you need an environment variable such as an API key to configure the MCP server, walk the user through the process of getting the key. For example, they may need to create an account and go to a developer dashboard to generate the key. Provide step-by-step instructions and URLs to make it easy for the user to retrieve the necessary information. Then use the ask_followup_question tool to ask the user for the key, in this case the OpenWeather API key. - -5. Install the MCP Server by adding the MCP server configuration to the settings file located at '${await mcpHub.getMcpSettingsFilePath()}'. The settings file may have other MCP servers already configured, so you would read it first and then add your new server to the existing \`mcpServers\` object. - -IMPORTANT: Regardless of what else you see in the MCP settings file, you must default any new MCP servers you create to disabled=false and alwaysAllow=[]. - -\`\`\`json -{ - "mcpServers": { - ..., - "weather": { - "command": "node", - "args": ["/path/to/weather-server/build/index.js"], - "env": { - "OPENWEATHER_API_KEY": "user-provided-api-key" - } - }, - } -} -\`\`\` - -(Note: the user may also ask you to install the MCP server to the Claude desktop app, in which case you would read then modify \`~/Library/Application\ Support/Claude/claude_desktop_config.json\` on macOS for example. It follows the same format of a top level \`mcpServers\` object.) - -6. After you have edited the MCP settings configuration file, the system will automatically run all the servers and expose the available tools and resources in the 'Connected MCP Servers' section. - -7. Now that you have access to these new tools and resources, you may suggest ways the user can command you to invoke them - for example, with this new weather tool now available, you can invite the user to ask "what's the weather in San Francisco?" - -## Editing MCP Servers - -The user may ask to add tools or resources that may make sense to add to an existing MCP server (listed under 'Connected MCP Servers' above: ${ - mcpHub - .getServers() - .map((server) => server.name) - .join(", ") || "(None running currently)" - }, e.g. if it would use the same API. This would be possible if you can locate the MCP server repository on the user's system by looking at the server arguments for a filepath. You might then use list_files and read_file to explore the files in the repository, and use write_to_file${diffStrategy ? " or apply_diff" : ""} to make changes to the files. - -However some MCP servers may be running from installed packages rather than a local repository, in which case it may make more sense to create a new MCP server. - -# MCP Servers Are Not Always Necessary - -The user may not always request the use or creation of MCP servers. Instead, they might provide tasks that can be completed with existing tools. While using the MCP SDK to extend your capabilities can be useful, it's important to understand that this is just one specialized type of task you can accomplish. You should only implement MCP servers when the user explicitly requests it (e.g., "add a tool that..."). +The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. -Remember: The MCP documentation and example provided above are to help you understand and work with existing MCP servers or create new ones when requested by the user. You already have access to tools and capabilities that can be used to accomplish a wide range of tasks.` +You can obtain detailed instructions on this topic using the fetch_instructions tool, like this: + +create_mcp_server +` ) } diff --git a/src/core/prompts/sections/modes.ts b/src/core/prompts/sections/modes.ts index 0015b8917c3..4f79d9dc9d9 100644 --- a/src/core/prompts/sections/modes.ts +++ b/src/core/prompts/sections/modes.ts @@ -7,7 +7,6 @@ import { GlobalFileNames } from "../../../shared/globalFileNames" export async function getModesSection(context: vscode.ExtensionContext): Promise { const settingsDir = path.join(context.globalStorageUri.fsPath, "settings") await fs.mkdir(settingsDir, { recursive: true }) - const customModesPath = path.join(settingsDir, GlobalFileNames.customModes) // Get all modes with their overrides from extension state const allModes = await getAllModesWithPrompts(context) @@ -25,45 +24,11 @@ ${allModes.map((mode: ModeConfig) => ` * "${mode.name}" mode (${mode.slug}) - $ // Only include custom modes documentation if the feature is enabled if (shouldEnableCustomModeCreation) { modesContent += ` - -- Custom modes can be configured in two ways: - 1. Globally via '${customModesPath}' (created automatically on startup) - 2. Per-workspace via '.roomodes' in the workspace root directory - - When modes with the same slug exist in both files, the workspace-specific .roomodes version takes precedence. This allows projects to override global modes or define project-specific modes. - - If asked to create a project mode, create it in .roomodes in the workspace root. If asked to create a global mode, use the global custom modes file. - -- The following fields are required and must not be empty: - * slug: A valid slug (lowercase letters, numbers, and hyphens). Must be unique, and shorter is better. - * name: The display name for the mode - * roleDefinition: A detailed description of the mode's role and capabilities - * groups: Array of allowed tool groups (can be empty). Each group can be specified either as a string (e.g., "edit" to allow editing any file) or with file restrictions (e.g., ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }] to only allow editing markdown files) - -- The customInstructions field is optional. - -- For multi-line text, include newline characters in the string like "This is the first line.\\nThis is the next line.\\n\\nThis is a double line break." - -Both files should follow this structure: -{ - "customModes": [ - { - "slug": "designer", // Required: unique slug with lowercase letters, numbers, and hyphens - "name": "Designer", // Required: mode display name - "roleDefinition": "You are Roo, a UI/UX expert specializing in design systems and frontend development. Your expertise includes:\\n- Creating and maintaining design systems\\n- Implementing responsive and accessible web interfaces\\n- Working with CSS, HTML, and modern frontend frameworks\\n- Ensuring consistent user experiences across platforms", // Required: non-empty - "groups": [ // Required: array of tool groups (can be empty) - "read", // Read files group (read_file, search_files, list_files, list_code_definition_names) - "edit", // Edit files group (apply_diff, write_to_file) - allows editing any file - // Or with file restrictions: - // ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }], // Edit group that only allows editing markdown files - "browser", // Browser group (browser_action) - "command", // Command group (execute_command) - "mcp" // MCP group (use_mcp_tool, access_mcp_resource) - ], - "customInstructions": "Additional instructions for the Designer mode" // Optional - } - ] -}` +If the user asks you to create or edit a new mode for this project, you can get instructions using the fetch_instructions tool, like this: + +create_mode + +` } return modesContent diff --git a/src/core/prompts/tools/fetch-instructions.ts b/src/core/prompts/tools/fetch-instructions.ts new file mode 100644 index 00000000000..eca231c5620 --- /dev/null +++ b/src/core/prompts/tools/fetch-instructions.ts @@ -0,0 +1,14 @@ +export function getFetchInstructionsDescription(): string { + return `## fetch_instructions +Description: Request to fetch instructions to perform a task +Parameters: +- task: (required) The task to get instructions for. This can take the following values: + create_mcp_server + create_mode + +Example: Requesting instructions to create an MCP Server + + +create_mcp_server +` +} diff --git a/src/core/prompts/tools/index.ts b/src/core/prompts/tools/index.ts index 1b9b9a43d9d..408385ec121 100644 --- a/src/core/prompts/tools/index.ts +++ b/src/core/prompts/tools/index.ts @@ -1,5 +1,6 @@ import { getExecuteCommandDescription } from "./execute-command" import { getReadFileDescription } from "./read-file" +import { getFetchInstructionsDescription } from "./fetch-instructions" import { getWriteToFileDescription } from "./write-to-file" import { getSearchFilesDescription } from "./search-files" import { getListFilesDescription } from "./list-files" @@ -23,6 +24,7 @@ import { ToolArgs } from "./types" const toolDescriptionMap: Record string | undefined> = { execute_command: (args) => getExecuteCommandDescription(args), read_file: (args) => getReadFileDescription(args), + fetch_instructions: () => getFetchInstructionsDescription(), write_to_file: (args) => getWriteToFileDescription(args), search_files: (args) => getSearchFilesDescription(args), list_files: (args) => getListFilesDescription(args), @@ -97,6 +99,7 @@ export function getToolDescriptionsForMode( export { getExecuteCommandDescription, getReadFileDescription, + getFetchInstructionsDescription, getWriteToFileDescription, getSearchFilesDescription, getListFilesDescription, diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 63e17ea365d..12553b7c615 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -180,6 +180,7 @@ export interface ClineSayTool { | "appliedDiff" | "newFileCreated" | "readFile" + | "fetchInstructions" | "listFilesTopLevel" | "listFilesRecursive" | "listCodeDefinitionNames" diff --git a/src/shared/tool-groups.ts b/src/shared/tool-groups.ts index 11d0513e47e..3cc4338394f 100644 --- a/src/shared/tool-groups.ts +++ b/src/shared/tool-groups.ts @@ -8,6 +8,7 @@ export type ToolGroupConfig = { export const TOOL_DISPLAY_NAMES = { execute_command: "run commands", read_file: "read files", + fetch_instructions: "fetch instructions", write_to_file: "write files", apply_diff: "apply changes", search_files: "search files", @@ -25,7 +26,7 @@ export const TOOL_DISPLAY_NAMES = { // Define available tool groups export const TOOL_GROUPS: Record = { read: { - tools: ["read_file", "search_files", "list_files", "list_code_definition_names"], + tools: ["read_file", "fetch_instructions", "search_files", "list_files", "list_code_definition_names"], }, edit: { tools: ["apply_diff", "write_to_file", "insert_content", "search_and_replace"], diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 4e0d4432f70..f1a7ed994b9 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -365,6 +365,21 @@ export const ChatRowContent = ({
) + case "fetchInstructions": + return ( + <> +
+ {toolIcon("file-code")} + {t("chat:instructions.wantsToFetch")} +
+ + + ) case "listFilesTopLevel": return ( <> diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index e7080fd3267..1d29d269fde 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -105,6 +105,9 @@ }, "current": "Actual" }, + "instructions": { + "wantsToFetch": "Roo vol obtenir instruccions detallades per ajudar amb la tasca actual." + }, "fileOperations": { "wantsToRead": "Roo vol llegir aquest fitxer:", "wantsToReadOutsideWorkspace": "Roo vol llegir aquest fitxer fora de l'espai de treball:", diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 8c10441c598..5dd572796d0 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -105,6 +105,9 @@ }, "current": "Aktuell" }, + "instructions": { + "wantsToFetch": "Roo möchte detaillierte Anweisungen abrufen, um bei der aktuellen Aufgabe zu helfen" + }, "fileOperations": { "wantsToRead": "Roo möchte diese Datei lesen:", "wantsToReadOutsideWorkspace": "Roo möchte diese Datei außerhalb des Arbeitsbereichs lesen:", diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index ec8d4c460ca..3e3e5ecfacf 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -103,6 +103,9 @@ }, "current": "Current" }, + "instructions": { + "wantsToFetch": "Roo wants to fetch detailed instructions to assist with the current task" + }, "fileOperations": { "wantsToRead": "Roo wants to read this file:", "wantsToReadOutsideWorkspace": "Roo wants to read this file outside of the workspace:", diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 194f8e4e7b5..fdaa5a69b00 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -105,6 +105,9 @@ }, "current": "Actual" }, + "instructions": { + "wantsToFetch": "Roo quiere obtener instrucciones detalladas para ayudar con la tarea actual" + }, "fileOperations": { "wantsToRead": "Roo quiere leer este archivo:", "wantsToReadOutsideWorkspace": "Roo quiere leer este archivo fuera del espacio de trabajo:", diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 0656a116bcd..5aa3490b9a6 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -113,6 +113,9 @@ "wantsToEditOutsideWorkspace": "Roo veut éditer ce fichier en dehors de l'espace de travail :", "wantsToCreate": "Roo veut créer un nouveau fichier :" }, + "instructions": { + "wantsToFetch": "Roo veut récupérer des instructions détaillées pour aider à la tâche actuelle" + }, "directoryOperations": { "wantsToViewTopLevel": "Roo veut voir les fichiers de premier niveau dans ce répertoire :", "didViewTopLevel": "Roo a vu les fichiers de premier niveau dans ce répertoire :", diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index f29f867c801..0d00d2fd8d8 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -105,6 +105,9 @@ }, "current": "वर्तमान" }, + "instructions": { + "wantsToFetch": "Roo को वर्तमान कार्य में सहायता के लिए विस्तृत निर्देश प्राप्त करना है" + }, "fileOperations": { "wantsToRead": "Roo इस फ़ाइल को पढ़ना चाहता है:", "wantsToReadOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर इस फ़ाइल को पढ़ना चाहता है:", diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index e82d258dbc2..e21a82da0d9 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -80,6 +80,9 @@ "separator": "Separatore", "edit": "Modifica...", "forNextMode": "per la prossima modalità", + "instructions": { + "wantsToFetch": "Roo vuole recuperare istruzioni dettagliate per aiutare con l'attività corrente" + }, "error": "Errore", "troubleMessage": "Roo sta avendo problemi...", "apiRequest": { diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 847d099ef7c..9b82e56001d 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -105,6 +105,9 @@ }, "current": "現在" }, + "instructions": { + "wantsToFetch": "Rooは現在のタスクを支援するための詳細な指示を取得したい" + }, "fileOperations": { "wantsToRead": "Rooはこのファイルを読みたい:", "wantsToReadOutsideWorkspace": "Rooはワークスペース外のこのファイルを読みたい:", diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 9c0b01a3f3c..c1b288e39b3 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -105,6 +105,9 @@ }, "current": "현재" }, + "instructions": { + "wantsToFetch": "Roo는 현재 작업을 지원하기 위해 자세한 지침을 가져오려고 합니다" + }, "fileOperations": { "wantsToRead": "Roo가 이 파일을 읽고 싶어합니다:", "wantsToReadOutsideWorkspace": "Roo가 워크스페이스 외부의 이 파일을 읽고 싶어합니다:", diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index ab83fd221b0..846534c5598 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -105,6 +105,9 @@ }, "current": "Bieżący" }, + "instructions": { + "wantsToFetch": "Roo chce pobrać szczegółowe instrukcje, aby pomóc w bieżącym zadaniu" + }, "fileOperations": { "wantsToRead": "Roo chce przeczytać ten plik:", "wantsToReadOutsideWorkspace": "Roo chce przeczytać ten plik poza obszarem roboczym:", diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 96416f6f110..560e9b9bff6 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -105,6 +105,9 @@ }, "current": "Atual" }, + "instructions": { + "wantsToFetch": "Roo quer buscar instruções detalhadas para ajudar com a tarefa atual" + }, "fileOperations": { "wantsToRead": "Roo quer ler este arquivo:", "wantsToReadOutsideWorkspace": "Roo quer ler este arquivo fora do espaço de trabalho:", diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 1eb358ad980..b415524f929 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -105,6 +105,9 @@ }, "current": "Mevcut" }, + "instructions": { + "wantsToFetch": "Roo mevcut göreve yardımcı olmak için ayrıntılı talimatlar almak istiyor" + }, "fileOperations": { "wantsToRead": "Roo bu dosyayı okumak istiyor:", "wantsToReadOutsideWorkspace": "Roo çalışma alanı dışındaki bu dosyayı okumak istiyor:", diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index fb1040bcf17..f0f32210693 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -105,6 +105,9 @@ }, "current": "Hiện tại" }, + "instructions": { + "wantsToFetch": "Roo muốn lấy hướng dẫn chi tiết để hỗ trợ nhiệm vụ hiện tại" + }, "fileOperations": { "wantsToRead": "Roo muốn đọc tệp này:", "wantsToReadOutsideWorkspace": "Roo muốn đọc tệp này bên ngoài không gian làm việc:", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index a2f8119927f..be20601e9bb 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -105,6 +105,9 @@ }, "current": "当前" }, + "instructions": { + "wantsToFetch": "Roo 想要获取详细指示以协助当前任务" + }, "fileOperations": { "wantsToRead": "Roo想读取此文件:", "wantsToReadOutsideWorkspace": "Roo想读取此工作区外的文件:", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 1178ec39b83..1e228773550 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -105,6 +105,9 @@ }, "current": "當前" }, + "instructions": { + "wantsToFetch": "Roo想要獲取詳細指示以協助目前任務" + }, "fileOperations": { "wantsToRead": "Roo想讀取此檔案:", "wantsToReadOutsideWorkspace": "Roo想讀取此工作區外的檔案:", From 8613daf515fbd5302666b82a8258f98c45ae62d9 Mon Sep 17 00:00:00 2001 From: Samuel <109295696+samsilveira@users.noreply.github.com> Date: Tue, 25 Mar 2025 14:23:27 -0300 Subject: [PATCH 58/66] Added Gemini 2.5 Pro model to Google Gemini Provider (#1974) * Added Gemini 2.5 Pro * Update src/shared/api.ts --------- Co-authored-by: Matt Rubens --- src/shared/api.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/shared/api.ts b/src/shared/api.ts index fbadd46505e..a6a03e785d4 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -747,6 +747,14 @@ export const openAiModelInfoSaneDefaults: ModelInfo = { export type GeminiModelId = keyof typeof geminiModels export const geminiDefaultModelId: GeminiModelId = "gemini-2.0-flash-001" export const geminiModels = { + "gemini-2.5-pro-exp-03-25": { + maxTokens: 8192, + contextWindow: 1_048_576, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + }, "gemini-2.0-flash-001": { maxTokens: 8192, contextWindow: 1_048_576, From 6258493f0d5b89f31f245230795a7bad29dcd3b8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 13:24:33 -0400 Subject: [PATCH 59/66] Update contributors list (#1967) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 36 ++++++++++++++++++------------------ locales/ca/README.md | 24 ++++++++++++------------ locales/de/README.md | 24 ++++++++++++------------ locales/es/README.md | 24 ++++++++++++------------ locales/fr/README.md | 24 ++++++++++++------------ locales/hi/README.md | 24 ++++++++++++------------ locales/it/README.md | 24 ++++++++++++------------ locales/ja/README.md | 24 ++++++++++++------------ locales/ko/README.md | 24 ++++++++++++------------ locales/pl/README.md | 24 ++++++++++++------------ locales/pt-BR/README.md | 24 ++++++++++++------------ locales/tr/README.md | 24 ++++++++++++------------ locales/vi/README.md | 24 ++++++++++++------------ locales/zh-CN/README.md | 24 ++++++++++++------------ locales/zh-TW/README.md | 24 ++++++++++++------------ 15 files changed, 186 insertions(+), 186 deletions(-) diff --git a/README.md b/README.md index 136de9af483..5394c414633 100644 --- a/README.md +++ b/README.md @@ -180,24 +180,24 @@ Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| -| NyxJae
NyxJae
| MuriloFP
MuriloFP
| hannesrudolph
hannesrudolph
| d-oit
d-oit
| punkpeye
punkpeye
| monotykamary
monotykamary
| -| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| feifei325
feifei325
| -| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| KJ7LNW
KJ7LNW
| olweraltuve
olweraltuve
| -| qdaxb
qdaxb
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| -| Lunchb0ne
Lunchb0ne
| aheizi
aheizi
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| -| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| heyseth
heyseth
| -| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| -| benzntech
benzntech
| anton-otee
anton-otee
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| im47cn
im47cn
| -| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| vladstudio
vladstudio
| -| AMHesch
AMHesch
| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| -| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| -| PretzelVector
PretzelVector
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| chadgauth
chadgauth
| -| dleen
dleen
| diarmidmackenzie
diarmidmackenzie
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| -| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| -| kvokka
kvokka
| Sarke
Sarke
| | | | | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| +| NyxJae
NyxJae
| hannesrudolph
hannesrudolph
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| feifei325
feifei325
| +| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| KJ7LNW
KJ7LNW
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| emshvac
emshvac
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| +| Lunchb0ne
Lunchb0ne
| aheizi
aheizi
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| heyseth
heyseth
| +| anton-otee
anton-otee
| benzntech
benzntech
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| mdp
mdp
| +| napter
napter
| philfung
philfung
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| ashktn
ashktn
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| im47cn
im47cn
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| +| chadgauth
chadgauth
| dleen
dleen
| diarmidmackenzie
diarmidmackenzie
| dbasclpy
dbasclpy
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| | | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index b7c0f9f5623..8ba555aacae 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -181,21 +181,21 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 4e213576534..2703d4c86db 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -181,21 +181,21 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 8aa10581410..62dc3ba3dfe 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -181,21 +181,21 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 878486e917a..eb24434695c 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -181,21 +181,21 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index e4be07bda5f..bf9e1c1e4b6 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -181,21 +181,21 @@ Roo Code को बेहतर बनाने में मदद करने |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index ad6b47891bc..73235cb8812 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -181,21 +181,21 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 35294c8222d..de182a03c5f 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -181,21 +181,21 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index be85406f4c0..63e1f721da3 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -181,21 +181,21 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index 8a715d3fd06..638d0ca70e1 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -181,21 +181,21 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index e50c12fcd3a..14d66e46d4e 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -181,21 +181,21 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index de659590495..f95780fbcdd 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -181,21 +181,21 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index 3a26eb7ddb0..4811da0baa2 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -181,21 +181,21 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 5adaafffdce..802d29587d3 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -181,21 +181,21 @@ code --install-extension bin/roo-cline-.vsix |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 0cfb790eb33..2cc53be078d 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -181,21 +181,21 @@ code --install-extension bin/roo-cline-.vsix |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|nissa-seru
nissa-seru
|jquanton
jquanton
| -|NyxJae
NyxJae
|MuriloFP
MuriloFP
|hannesrudolph
hannesrudolph
|d-oit
d-oit
|punkpeye
punkpeye
|monotykamary
monotykamary
| +|NyxJae
NyxJae
|hannesrudolph
hannesrudolph
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| |cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|feifei325
feifei325
| -|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
|olweraltuve
olweraltuve
| -|qdaxb
qdaxb
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| +|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
|KJ7LNW
KJ7LNW
| +|olweraltuve
olweraltuve
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
|emshvac
emshvac
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
| |Lunchb0ne
Lunchb0ne
|aheizi
aheizi
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
| |yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
| -|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
| -|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
|im47cn
im47cn
| -|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
| -|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
| -|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
| -|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
| -|kvokka
kvokka
|Sarke
Sarke
| | | | | +|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|mdp
mdp
| +|napter
napter
|philfung
philfung
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
|ashktn
ashktn
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
| +|chadgauth
chadgauth
|dleen
dleen
|diarmidmackenzie
diarmidmackenzie
|dbasclpy
dbasclpy
|celestial-vault
celestial-vault
|franekp
franekp
| +|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
| | | | | ## 許可證 From b8549f1f26a4fa553c78995d49faad36d4840b6e Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Tue, 25 Mar 2025 14:30:32 -0400 Subject: [PATCH 60/66] Auto-approval logic for fetch_instructions (#1976) --- .../prompts/__tests__/__snapshots__/system.test.ts.snap | 8 ++------ src/core/prompts/sections/mcp-servers.ts | 4 +--- src/core/prompts/sections/modes.ts | 2 +- webview-ui/src/components/chat/ChatView.tsx | 9 +++++++++ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index e7f5e5c3ab3..2b869ee26e0 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -3358,9 +3358,7 @@ When a server is connected, you can use the server's tools via the \`use_mcp_too (No MCP servers currently connected) ## Creating an MCP Server -The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. - -You can obtain detailed instructions on this topic using the fetch_instructions tool, like this: +The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. If they do, you should obtain detailed instructions on this topic using the fetch_instructions tool, like this: create_mcp_server @@ -6671,9 +6669,7 @@ When a server is connected, you can use the server's tools via the \`use_mcp_too (No MCP servers currently connected) ## Creating an MCP Server -The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. - -You can obtain detailed instructions on this topic using the fetch_instructions tool, like this: +The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. If they do, you should obtain detailed instructions on this topic using the fetch_instructions tool, like this: create_mcp_server diff --git a/src/core/prompts/sections/mcp-servers.ts b/src/core/prompts/sections/mcp-servers.ts index 5603b0c3850..70622766577 100644 --- a/src/core/prompts/sections/mcp-servers.ts +++ b/src/core/prompts/sections/mcp-servers.ts @@ -69,9 +69,7 @@ ${connectedServers}` ` ## Creating an MCP Server -The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. You have the ability to create an MCP server and add it to a configuration file that will then expose the tools and resources for you to use with \`use_mcp_tool\` and \`access_mcp_resource\`. - -You can obtain detailed instructions on this topic using the fetch_instructions tool, like this: +The user may ask you something along the lines of "add a tool" that does some function, in other words to create an MCP server that provides tools and resources that may connect to external APIs for example. If they do, you should obtain detailed instructions on this topic using the fetch_instructions tool, like this: create_mcp_server ` diff --git a/src/core/prompts/sections/modes.ts b/src/core/prompts/sections/modes.ts index 4f79d9dc9d9..12e90c4076d 100644 --- a/src/core/prompts/sections/modes.ts +++ b/src/core/prompts/sections/modes.ts @@ -24,7 +24,7 @@ ${allModes.map((mode: ModeConfig) => ` * "${mode.name}" mode (${mode.slug}) - $ // Only include custom modes documentation if the feature is enabled if (shouldEnableCustomModeCreation) { modesContent += ` -If the user asks you to create or edit a new mode for this project, you can get instructions using the fetch_instructions tool, like this: +If the user asks you to create or edit a new mode for this project, you should read the instructions by using the fetch_instructions tool, like this: create_mode diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 54e5e478da6..40754857321 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -676,6 +676,15 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie return false } + if (tool?.tool === "fetchInstructions") { + if (tool.content === "create_mode") { + return alwaysAllowModeSwitch + } + if (tool.content === "create_mcp_server") { + return alwaysAllowMcp + } + } + if (tool?.tool === "switchMode") { return alwaysAllowModeSwitch } From f773bc3024f1e086c955d723134d8d180f983b64 Mon Sep 17 00:00:00 2001 From: Diarmid Mackenzie Date: Tue, 25 Mar 2025 19:31:29 +0000 Subject: [PATCH 61/66] Remove "Enable Custom Mode Creation Through Prompts" toggle (#1980) * Remove custom mode creation option * Remove redundant code branch --- src/core/prompts/sections/modes.ts | 8 +--- src/core/webview/ClineProvider.ts | 4 -- src/exports/roo-code.d.ts | 1 - src/shared/ExtensionMessage.ts | 1 - src/shared/WebviewMessage.ts | 1 - src/shared/globalState.ts | 1 - .../src/components/prompts/PromptsView.tsx | 39 ------------------- .../src/context/ExtensionStateContext.tsx | 5 --- webview-ui/src/i18n/locales/ca/prompts.json | 4 -- webview-ui/src/i18n/locales/de/prompts.json | 4 -- webview-ui/src/i18n/locales/en/prompts.json | 4 -- webview-ui/src/i18n/locales/es/prompts.json | 4 -- webview-ui/src/i18n/locales/fr/prompts.json | 4 -- webview-ui/src/i18n/locales/hi/prompts.json | 4 -- webview-ui/src/i18n/locales/it/prompts.json | 4 -- webview-ui/src/i18n/locales/ja/prompts.json | 4 -- webview-ui/src/i18n/locales/ko/prompts.json | 4 -- webview-ui/src/i18n/locales/pl/prompts.json | 4 -- .../src/i18n/locales/pt-BR/prompts.json | 4 -- webview-ui/src/i18n/locales/tr/prompts.json | 4 -- webview-ui/src/i18n/locales/vi/prompts.json | 4 -- .../src/i18n/locales/zh-CN/prompts.json | 4 -- .../src/i18n/locales/zh-TW/prompts.json | 4 -- 23 files changed, 1 insertion(+), 119 deletions(-) diff --git a/src/core/prompts/sections/modes.ts b/src/core/prompts/sections/modes.ts index 12e90c4076d..50c805dd5dd 100644 --- a/src/core/prompts/sections/modes.ts +++ b/src/core/prompts/sections/modes.ts @@ -11,9 +11,6 @@ export async function getModesSection(context: vscode.ExtensionContext): Promise // Get all modes with their overrides from extension state const allModes = await getAllModesWithPrompts(context) - // Get enableCustomModeCreation setting from extension state - const shouldEnableCustomModeCreation = (await context.globalState.get("enableCustomModeCreation")) ?? true - let modesContent = `==== MODES @@ -21,15 +18,12 @@ MODES - These are the currently available modes: ${allModes.map((mode: ModeConfig) => ` * "${mode.name}" mode (${mode.slug}) - ${mode.roleDefinition.split(".")[0]}`).join("\n")}` - // Only include custom modes documentation if the feature is enabled - if (shouldEnableCustomModeCreation) { - modesContent += ` + modesContent += ` If the user asks you to create or edit a new mode for this project, you should read the instructions by using the fetch_instructions tool, like this: create_mode ` - } return modesContent } diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index b8d2c5d57e2..addd020da2e 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1679,10 +1679,6 @@ export class ClineProvider extends EventEmitter implements await this.updateGlobalState("enhancementApiConfigId", message.text) await this.postStateToWebview() break - case "enableCustomModeCreation": - await this.updateGlobalState("enableCustomModeCreation", message.bool ?? true) - await this.postStateToWebview() - break case "autoApprovalEnabled": await this.updateGlobalState("autoApprovalEnabled", message.bool ?? false) await this.postStateToWebview() diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index fc02b51b736..ddbd8b2d401 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -240,7 +240,6 @@ export type GlobalStateKey = | "enhancementApiConfigId" | "experiments" // Map of experiment IDs to their enabled state | "autoApprovalEnabled" - | "enableCustomModeCreation" // Enable the ability for Roo to create custom modes | "customModes" // Array of custom modes | "unboundModelId" | "requestyModelId" diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 12553b7c615..f42381701a4 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -153,7 +153,6 @@ export interface ExtensionState { terminalShellIntegrationTimeout?: number mcpEnabled: boolean enableMcpServerCreation: boolean - enableCustomModeCreation?: boolean mode: Mode modeApiConfigs?: Record enhancementApiConfigId?: string diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 52411bca6ff..7a4cb38c673 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -80,7 +80,6 @@ export interface WebviewMessage { | "terminalShellIntegrationTimeout" | "mcpEnabled" | "enableMcpServerCreation" - | "enableCustomModeCreation" | "searchCommits" | "alwaysApproveResubmit" | "requestDelaySeconds" diff --git a/src/shared/globalState.ts b/src/shared/globalState.ts index 73b46eff589..71d990906a5 100644 --- a/src/shared/globalState.ts +++ b/src/shared/globalState.ts @@ -107,7 +107,6 @@ export const GLOBAL_STATE_KEYS = [ "enhancementApiConfigId", "experiments", // Map of experiment IDs to their enabled state. "autoApprovalEnabled", - "enableCustomModeCreation", // Enable the ability for Roo to create custom modes. "customModes", // Array of custom modes. "unboundModelId", "requestyModelId", diff --git a/webview-ui/src/components/prompts/PromptsView.tsx b/webview-ui/src/components/prompts/PromptsView.tsx index 4011e159508..d1b0a9d7325 100644 --- a/webview-ui/src/components/prompts/PromptsView.tsx +++ b/webview-ui/src/components/prompts/PromptsView.tsx @@ -57,8 +57,6 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { customInstructions, setCustomInstructions, customModes, - enableCustomModeCreation, - setEnableCustomModeCreation, } = useExtensionState() // Memoize modes to preserve array order @@ -326,17 +324,6 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { return () => document.removeEventListener("click", handleClickOutside) }, [showConfigMenu]) - // Add effect to sync enableCustomModeCreation with backend - useEffect(() => { - if (enableCustomModeCreation !== undefined) { - // Send the value to the extension's global state - vscode.postMessage({ - type: "enableCustomModeCreation", // Using dedicated message type - bool: enableCustomModeCreation, - }) - } - }, [enableCustomModeCreation]) - useEffect(() => { const handler = (event: MessageEvent) => { const message = event.data @@ -857,32 +844,6 @@ const PromptsView = ({ onDone }: PromptsViewProps) => {
- {/* - NOTE: This setting is placed in PromptsView rather than SettingsView since it - directly affects the functionality related to modes and custom mode creation, - which are managed in this component. This is an intentional deviation from - the standard pattern described in cline_docs/settings.md. - */} -
- { - // Just update the local state through React context - // The React context will update the global state - setEnableCustomModeCreation(e.target.checked) - }}> - {t("prompts:customModeCreation.enableTitle")} - -

- {t("prompts:customModeCreation.description")} -

-
- {/* Custom System Prompt Disclosure */}