diff --git a/.changeset/wise-icons-sort.md b/.changeset/wise-icons-sort.md new file mode 100644 index 0000000000..d0f4c38835 --- /dev/null +++ b/.changeset/wise-icons-sort.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Support mentioning binary files diff --git a/.github/workflows/marketplace-publish.yml b/.github/workflows/marketplace-publish.yml index f81ef30c30..0080b10687 100644 --- a/.github/workflows/marketplace-publish.yml +++ b/.github/workflows/marketplace-publish.yml @@ -65,15 +65,15 @@ jobs: current_package_version=$(node -p "require('./package.json').version") # Extract changelog for current version - changelog_content=$(awk -v ver="## [${current_package_version}]" ' - $0 ~ ver {flag=1; next} - /^## \[/ {if (flag) exit} - flag {print} - ' CHANGELOG.md) + echo "Extracting changelog for version ${current_package_version}" + changelog_content=$(sed -n "/## \\[${current_package_version}\\]/,/## \\[/p" CHANGELOG.md | sed '$d') # If changelog extraction failed, use a default message if [ -z "$changelog_content" ]; then + echo "Warning: No changelog section found for version ${current_package_version}" changelog_content="Release v${current_package_version}" + else + echo "Found changelog section for version ${current_package_version}" fi # Create release with changelog content diff --git a/.roomodes b/.roomodes index c6705199a5..9d1719fa31 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- 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- Adapt the formality level to match the original content (whether formal or informal)\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\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\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\n# 7. 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", + "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/CHANGELOG.md b/CHANGELOG.md index 06aa0ce0ae..1339300648 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # 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 + +## [3.10.0] - 2025-03-20 + +- Suggested responses to questions (thanks samhvw8!) +- Support for reading large files in chunks (thanks samhvw8!) +- More consistent @-mention lookups of files and folders +- Consolidate code actions into a submenu (thanks samhvw8!) +- Fix MCP error logging (thanks aheizi!) +- Improvements to search_files tool formatting and logic (thanks KJ7LNW!) +- Fix changelog formatting in GitHub Releases (thanks pdecat!) +- Add fake provider for integration tests (thanks franekp!) +- Reflect Cross-region inference option in ap-xx region (thanks Yoshino-Yukitaro!) +- Fix bug that was causing task history to be lost when using WSL + ## [3.9.2] - 2025-03-19 - Update GitHub Actions workflow to automatically create GitHub Releases (thanks @pdecat!) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ff31a9176a..4d9bf3789c 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/README.md b/README.md index 073c55e0fc..4d294faae0 100644 --- a/README.md +++ b/README.md @@ -48,15 +48,13 @@ Check out the [CHANGELOG](CHANGELOG.md) for detailed updates and fixes. --- -## 🎉 Roo Code 3.9 Released +## 🎉 Roo Code 3.10 Released -Roo Code has gone international in 3.9! +Roo Code 3.10 brings powerful productivity enhancements! -- Roo Code has been translated into 14 different languages! To see them all and change your settings, go to Settings -> Language. -- We now support both the stdio and SSE transports for MCP -- By popular demand, you can now batch delete history items -- Turn on text-to-speech in your settings to hear everything Roo has to say -- Want more control over your OpenRouter? Now you can pick a specific provider for your model. +- Suggested responses to questions to save you time typing +- Improved large file handling through mapping out the file structure and reading only the relevant content +- Rebuilt @-mention file lookup that respects .gitignore and doesn't have a limit on the number of files tracked --- @@ -182,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
| qdaxb
qdaxb
| feifei325
feifei325
| RaySinner
RaySinner
| -| wkordalski
wkordalski
| emshvac
emshvac
| afshawnlotfi
afshawnlotfi
| aitoroses
aitoroses
| dtrugman
dtrugman
| pdecat
pdecat
| -| sammcj
sammcj
| Lunchb0ne
Lunchb0ne
| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| pugazhendhi-m
pugazhendhi-m
| -| eonghk
eonghk
| arthurauffray
arthurauffray
| heyseth
heyseth
| anton-otee
anton-otee
| benzntech
benzntech
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| KJ7LNW
KJ7LNW
| mdp
mdp
| napter
napter
| philfung
philfung
| AMHesch
AMHesch
| -| 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
| 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
| -| aheizi
aheizi
| 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/CONTRIBUTING.md b/locales/ca/CONTRIBUTING.md index c65ce5bad1..5f2beefc79 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/ca/README.md b/locales/ca/README.md index 42681a43de..133bd1d760 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -47,15 +47,13 @@ Consulteu el [CHANGELOG](../CHANGELOG.md) per a actualitzacions i correccions de --- -## 🎉 Roo Code 3.9 Llançat +## 🎉 Roo Code 3.10 Llançat -Roo Code 3.9 s'ha tornat internacional! +Roo Code 3.10 aporta potents millores de productivitat! -- Roo Code s'ha traduït a 14 idiomes diferents! Aneu a Configuració → Idioma per veure tots els idiomes i canviar la vostra configuració. -- Ara suportem tant stdio com SSE com a transports per a MCP -- Per demanda popular, ara podeu eliminar elements de l'historial en lot -- Activeu la conversió de text a veu a la configuració per escoltar tot el que Roo té per dir -- Voleu més control sobre el vostre OpenRouter? Ara podeu triar un proveïdor específic per al vostre model. +- Respostes suggerides a les preguntes per estalviar temps d'escriptura +- Millora en la gestió de fitxers grans mitjançant el mapeig de l'estructura del fitxer i la lectura només del contingut rellevant +- Reconstrucció de la cerca de fitxers amb @-menció que respecta .gitignore i no té límit en el nombre de fitxers rastrejats --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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
| | | | ## Llicència diff --git a/locales/de/CONTRIBUTING.md b/locales/de/CONTRIBUTING.md index 7851e6103b..1aa7a5b6c2 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/de/README.md b/locales/de/README.md index b36ff7f79f..f519c508d0 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -47,15 +47,13 @@ Sehen Sie sich das [CHANGELOG](../CHANGELOG.md) für detaillierte Updates und Fe --- -## 🎉 Roo Code 3.9 veröffentlicht +## 🎉 Roo Code 3.10 veröffentlicht -Roo Code 3.9 wird international! +Roo Code 3.10 bringt leistungsstarke Produktivitätsverbesserungen! -- Roo Code wurde in 14 verschiedene Sprachen übersetzt! Gehe zu Einstellungen → Sprache, um alle Sprachen zu sehen und deine Einstellungen zu ändern. -- Wir unterstützen jetzt sowohl stdio als auch SSE als Transporte für MCP -- Auf vielfachen Wunsch kannst du jetzt Verlaufseinträge in Gruppen löschen -- Aktiviere Text-zu-Sprache in deinen Einstellungen, um alles zu hören, was Roo zu sagen hat -- Möchtest du mehr Kontrolle über deinen OpenRouter? Jetzt kannst du für dein Modell einen bestimmten Anbieter auswählen. +- Vorgeschlagene Antworten auf Fragen, um Zeit beim Tippen zu sparen +- Verbesserte Handhabung großer Dateien durch Kartierung der Dateistruktur und Lesen nur der relevanten Inhalte +- Überarbeitete @-Erwähnungs-Dateisuche, die .gitignore respektiert und keine Begrenzung der Anzahl der verfolgten Dateien hat --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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
| | | | ## Lizenz diff --git a/locales/es/CONTRIBUTING.md b/locales/es/CONTRIBUTING.md index bdab5f64a5..14cf3a96f3 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/es/README.md b/locales/es/README.md index f6c894809c..4dc42be6fb 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -47,15 +47,13 @@ Consulta el [CHANGELOG](../CHANGELOG.md) para ver actualizaciones detalladas y c --- -## 🎉 Roo Code 3.9 Lanzado +## 🎉 Roo Code 3.10 Lanzado -¡Roo Code 3.9 se vuelve internacional! +¡Roo Code 3.10 trae potentes mejoras de productividad! -- ¡Roo Code ha sido traducido a 14 idiomas diferentes! Ve a Configuración → Idioma para ver todos los idiomas y cambiar tu configuración. -- Ahora admitimos tanto stdio como SSE como transportes para MCP -- Por demanda popular, ahora puedes eliminar elementos del historial en lote -- Activa la conversión de texto a voz en tu configuración para escuchar todo lo que Roo tiene que decir -- ¿Quieres más control sobre tu OpenRouter? Ahora puedes elegir un proveedor específico para tu modelo. +- Respuestas sugeridas a preguntas para ahorrarte tiempo al escribir +- Mejor manejo de archivos grandes mediante el mapeo de la estructura del archivo y la lectura solo del contenido relevante +- Búsqueda de archivos con @-mención reconstruida que respeta .gitignore y no tiene límite en el número de archivos rastreados --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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
| | | | ## Licencia diff --git a/locales/fr/CONTRIBUTING.md b/locales/fr/CONTRIBUTING.md index eb9059f8fb..fdb4796a27 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/fr/README.md b/locales/fr/README.md index 6eef70a0a2..505ae5692e 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -47,15 +47,13 @@ Consultez le [CHANGELOG](../CHANGELOG.md) pour des mises à jour détaillées et --- -## 🎉 Roo Code 3.9 est sorti +## 🎉 Roo Code 3.10 est sorti -Roo Code 3.9 devient international ! +Roo Code 3.10 apporte de puissantes améliorations de productivité ! -- Roo Code a été traduit dans 14 langues différentes ! Allez dans Paramètres → Langue pour voir toutes les langues et modifier vos paramètres. -- Nous prenons désormais en charge les transports stdio et SSE pour MCP -- Suite à vos nombreuses demandes, vous pouvez maintenant supprimer des éléments d'historique en lot -- Activez la synthèse vocale dans vos paramètres pour écouter toutes les réponses de Roo -- Vous souhaitez plus de contrôle sur votre OpenRouter ? Vous pouvez maintenant choisir un fournisseur spécifique pour votre modèle. +- Réponses suggérées aux questions pour vous faire gagner du temps de frappe +- Gestion améliorée des fichiers volumineux grâce à la cartographie de la structure du fichier et à la lecture uniquement du contenu pertinent +- Recherche de fichiers par @-mention reconstruite qui respecte .gitignore et n'a pas de limite sur le nombre de fichiers suivis --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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
| | | | ## Licence diff --git a/locales/hi/CONTRIBUTING.md b/locales/hi/CONTRIBUTING.md index a1ffdafc1b..9f388c295f 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/hi/README.md b/locales/hi/README.md index ad819ddf8c..a8f0f07a4f 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -47,15 +47,13 @@ --- -## 🎉 Roo Code 3.9 जारी +## 🎉 Roo Code 3.10 जारी -Roo Code 3.9 अंतरराष्ट्रीय हो गया है! +Roo Code 3.10 शक्तिशाली उत्पादकता सुधार लाता है! -- Roo Code को 14 अलग-अलग भाषाओं में अनुवादित किया गया है! सभी भाषाएँ देखने और अपनी सेटिंग्स बदलने के लिए सेटिंग्स → भाषा पर जाएँ। -- अब हम MCP के लिए stdio और SSE दोनों ट्रांसपोर्ट को सपोर्ट करते हैं -- लोकप्रिय माँग पर, अब आप इतिहास आइटम्स को बैच में डिलीट कर सकते हैं -- Roo की सभी बातें सुनने के लिए अपनी सेटिंग्स में टेक्स्ट-टू-स्पीच को चालू करें -- अपने OpenRouter पर अधिक नियंत्रण चाहते हैं? अब आप अपने मॉडल के लिए एक विशिष्ट प्रोवाइडर चुन सकते हैं। +- प्रश्नों के लिए सुझाई गई प्रतिक्रियाएँ जो आपका टाइपिंग समय बचाती हैं +- फ़ाइल संरचना का मानचित्रण करके और केवल प्रासंगिक सामग्री पढ़कर बड़ी फ़ाइलों का बेहतर प्रबंधन +- पुनर्निर्मित @-मेंशन फ़ाइल लुकअप जो .gitignore का सम्मान करता है और ट्रैक की गई फ़ाइलों की संख्या पर कोई सीमा नहीं है --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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/it/CONTRIBUTING.md b/locales/it/CONTRIBUTING.md index 30cc4f6911..9e6ca15111 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/it/README.md b/locales/it/README.md index ee959c17b3..dce5ca0362 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -47,15 +47,13 @@ Consulta il [CHANGELOG](../CHANGELOG.md) per aggiornamenti dettagliati e correzi --- -## 🎉 Roo Code 3.9 Rilasciato +## 🎉 Roo Code 3.10 Rilasciato -Roo Code 3.9 diventa internazionale! +Roo Code 3.10 porta potenti miglioramenti di produttività! -- Roo Code è stato tradotto in 14 lingue diverse! Vai su Impostazioni → Lingua per vedere tutte le lingue e modificare le tue impostazioni. -- Ora supportiamo sia stdio che SSE come trasporti per MCP -- Su richiesta popolare, ora puoi eliminare elementi della cronologia in gruppo -- Attiva la sintesi vocale nelle impostazioni per ascoltare tutto ciò che Roo ha da dire -- Vuoi più controllo sul tuo OpenRouter? Ora puoi scegliere un provider specifico per il tuo modello. +- Risposte suggerite alle domande per farti risparmiare tempo nella digitazione +- Gestione migliorata dei file di grandi dimensioni tramite la mappatura della struttura del file e la lettura solo del contenuto rilevante +- Ricerca file tramite @-menzione ricostruita che rispetta .gitignore e non ha limiti sul numero di file tracciati --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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
| | | | ## Licenza diff --git a/locales/ja/CONTRIBUTING.md b/locales/ja/CONTRIBUTING.md index 54183588e5..42be40e33d 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/ja/README.md b/locales/ja/README.md index e914a0a7b8..58d8a5c831 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -47,15 +47,13 @@ --- -## 🎉 Roo Code 3.9リリース +## 🎉 Roo Code 3.10リリース -Roo Code 3.9がグローバル化しました! +Roo Code 3.10は強力な生産性向上機能をもたらします! -- Roo Codeが14の言語に対応!設定 → 言語メニューから、すべての言語を確認して設定を変更できます。 -- MCPでstdioとSSEの両方の転送方式に対応しました -- 多くのご要望にお応えして、履歴項目の一括削除が可能になりました -- 設定でテキスト読み上げ機能をオンにすると、Rooの応答をすべて音声で聞くことができます -- OpenRouterをより細かく制御したいですか?モデルごとに特定のプロバイダーを選択できるようになりました。 +- 質問への提案回答機能でタイピング時間を節約 +- ファイル構造のマッピングと関連コンテンツのみの読み取りによる大きなファイルの取り扱い改善 +- .gitignoreを尊重し、追跡ファイル数に制限のない@メンションによるファイル検索機能の再構築 --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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/ko/CONTRIBUTING.md b/locales/ko/CONTRIBUTING.md index 256399ca93..342fcbc451 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/ko/README.md b/locales/ko/README.md index 08a4864759..3905a68f78 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -47,15 +47,13 @@ --- -## 🎉 Roo Code 3.9 출시 +## 🎉 Roo Code 3.10 출시 -Roo Code 3.9이 국제화되었습니다! +Roo Code 3.10이 강력한 생산성 향상 기능을 제공합니다! -- Roo Code가 14개 언어로 번역되었습니다! 설정 → 언어에서 모든 언어를 확인하고 설정을 변경하실 수 있습니다. -- 이제 MCP에서 stdio와 SSE 전송 방식을 모두 지원합니다 -- 많은 요청에 따라 이제 기록 항목을 일괄 삭제할 수 있습니다 -- 설정에서 텍스트 음성 변환을 켜면 Roo가 하는 모든 말을 들을 수 있습니다 -- OpenRouter를 더 세밀하게 제어하고 싶으신가요? 이제 모델별로 특정 제공자를 선택할 수 있습니다. +- 질문에 대한 제안 응답으로 타이핑 시간 절약 +- 파일 구조 매핑과 관련 내용만 읽어 대용량 파일 처리 개선 +- .gitignore를 존중하고 추적 파일 수에 제한이 없는 @-언급 파일 검색 기능 재구축 --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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/pl/CONTRIBUTING.md b/locales/pl/CONTRIBUTING.md index 3d338d1ce0..b669cb2f2c 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/pl/README.md b/locales/pl/README.md index 553cb2ef13..a709fd90c3 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -47,15 +47,13 @@ Sprawdź [CHANGELOG](../CHANGELOG.md), aby uzyskać szczegółowe informacje o a --- -## 🎉 Roo Code 3.9 został wydany +## 🎉 Roo Code 3.10 został wydany -Roo Code 3.9 staje się międzynarodowy! +Roo Code 3.10 przynosi potężne usprawnienia produktywności! -- Roo Code został przetłumaczony na 14 różnych języków! Przejdź do Ustawienia → Język, aby zobaczyć wszystkie języki i zmienić swoje ustawienia. -- Teraz obsługujemy zarówno stdio, jak i SSE jako transporty dla MCP -- Na popularne żądanie, możesz teraz usuwać elementy historii grupowo -- Włącz syntezę mowy w ustawieniach, aby usłyszeć wszystko, co Roo ma do powiedzenia -- Chcesz mieć większą kontrolę nad swoim OpenRouterem? Teraz możesz wybrać konkretnego dostawcę dla swojego modelu. +- Sugerowane odpowiedzi na pytania, oszczędzające czas pisania +- Ulepszona obsługa dużych plików poprzez mapowanie struktury pliku i odczytywanie tylko istotnej zawartości +- Przebudowane wyszukiwanie plików przez @-wzmianki, które respektuje .gitignore i nie ma limitu liczby śledzonych plików --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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
| | | | ## Licencja diff --git a/locales/pt-BR/CONTRIBUTING.md b/locales/pt-BR/CONTRIBUTING.md index efd19ed9d1..a3e04811b3 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/pt-BR/README.md b/locales/pt-BR/README.md index 14ab1ab5f3..d2f51447af 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -47,15 +47,13 @@ Confira o [CHANGELOG](../CHANGELOG.md) para atualizações e correções detalha --- -## 🎉 Roo Code 3.9 Lançado +## 🎉 Roo Code 3.10 Lançado -O Roo Code 3.9 se tornou internacional! +O Roo Code 3.10 traz poderosas melhorias de produtividade! -- O Roo Code foi traduzido para 14 idiomas diferentes! Vá em Configurações → Idioma para ver todos os idiomas e alterar suas configurações. -- Agora suportamos tanto stdio quanto SSE como transportes para MCP -- Por demanda popular, agora você pode excluir itens do histórico em lote -- Ative a conversão de texto em fala nas configurações para ouvir tudo o que o Roo tem a dizer -- Quer mais controle sobre seu OpenRouter? Agora você pode escolher um provedor específico para seu modelo. +- Respostas sugeridas para perguntas, economizando seu tempo de digitação +- Manuseio aprimorado de arquivos grandes através do mapeamento da estrutura do arquivo e leitura apenas do conteúdo relevante +- Busca de arquivos por @-menção reconstruída que respeita o .gitignore e não tem limite no número de arquivos rastreados --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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
| | | | ## Licença diff --git a/locales/tr/CONTRIBUTING.md b/locales/tr/CONTRIBUTING.md index 2bad1c8088..39ddb8b1b7 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/tr/README.md b/locales/tr/README.md index c5c19f913a..e3beed92e0 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -47,15 +47,13 @@ Detaylı güncellemeler ve düzeltmeler için [CHANGELOG](../CHANGELOG.md) dosya --- -## 🎉 Roo Code 3.9 Yayınlandı +## 🎉 Roo Code 3.10 Yayınlandı -Roo Code 3.9 uluslararası oldu! +Roo Code 3.10 güçlü üretkenlik iyileştirmeleri getiriyor! -- Roo Code 14 farklı dile çevrildi! Tüm dilleri görmek ve ayarlarınızı değiştirmek için Ayarlar → Dil bölümüne gidin. -- Artık MCP için hem stdio hem de SSE taşıma protokollerini destekliyoruz -- Yoğun talep üzerine, artık geçmiş öğelerini toplu olarak silebilirsiniz -- Roo'nun söylediği her şeyi duymak için ayarlardan metin okuma özelliğini etkinleştirin -- OpenRouter'ınız üzerinde daha fazla kontrol mü istiyorsunuz? Artık modeliniz için belirli bir sağlayıcı seçebilirsiniz. +- Yazma sürenizi tasarruf etmenizi sağlayan sorulara önerilen yanıtlar +- Dosya yapısını haritalayarak ve yalnızca ilgili içeriği okuyarak geliştirilmiş büyük dosya işleme +- .gitignore'a saygı gösteren ve izlenen dosya sayısında sınır olmayan yeniden yapılandırılmış @-mention dosya araması --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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
| | | | ## Lisans diff --git a/locales/vi/CONTRIBUTING.md b/locales/vi/CONTRIBUTING.md index cdad58eaac..6f4c2c7470 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/vi/README.md b/locales/vi/README.md index ebd5c90e5d..3a23b9f85a 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -47,15 +47,13 @@ Kiểm tra [CHANGELOG](../CHANGELOG.md) để biết thông tin chi tiết về --- -## 🎉 Đã Phát Hành Roo Code 3.9 +## 🎉 Đã Phát Hành Roo Code 3.10 -Roo Code 3.9 đã trở nên toàn cầu! +Roo Code 3.10 mang đến những cải tiến năng suất mạnh mẽ! -- Roo Code đã được dịch sang 14 ngôn ngữ khác nhau! Truy cập Cài đặt → Ngôn ngữ để xem tất cả ngôn ngữ và thay đổi cài đặt của bạn. -- Giờ đây chúng tôi hỗ trợ cả stdio và SSE làm phương thức truyền tải cho MCP -- Theo yêu cầu phổ biến, bạn giờ đây có thể xóa nhiều mục lịch sử cùng lúc -- Bật tính năng chuyển văn bản thành giọng nói trong cài đặt để nghe mọi điều Roo nói -- Muốn kiểm soát OpenRouter của bạn tốt hơn? Giờ đây bạn có thể chọn nhà cung cấp cụ thể cho mô hình của mình. +- Gợi ý phản hồi cho câu hỏi giúp tiết kiệm thời gian nhập liệu +- Cải thiện xử lý tệp tin lớn thông qua việc lập bản đồ cấu trúc tệp và chỉ đọc nội dung liên quan +- Tính năng tìm kiếm tệp tin bằng @-mention được xây dựng lại, tôn trọng .gitignore và không giới hạn số lượng tệp tin được theo dõi --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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
| | | | ## Giấy Phép diff --git a/locales/zh-CN/CONTRIBUTING.md b/locales/zh-CN/CONTRIBUTING.md index 79673c57cc..b5c0429bd3 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-CN/README.md b/locales/zh-CN/README.md index 9fb47e8aae..017a44e98f 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -47,15 +47,13 @@ --- -## 🎉 Roo Code 3.9 已发布 +## 🎉 Roo Code 3.10 已发布 -Roo Code 3.9 实现了国际化! +Roo Code 3.10 带来强大的生产力提升! -- Roo Code 已被翻译成 14 种不同的语言!前往设置 → 语言查看所有语言并更改您的设置。 -- 现在我们同时支持 stdio 和 SSE 作为 MCP 的传输方式 -- 应广大用户要求,现在您可以批量删除历史记录项目 -- 在设置中开启文字转语音功能,即可听到 Roo 说的每一句话 -- 想要更好地控制您的 OpenRouter?现在您可以为您的模型选择特定的提供者。 +- 问题的建议回答,为您节省打字时间 +- 通过映射文件结构并只读取相关内容来改进大文件处理 +- 重建的 @-提及文件查找功能,它尊重 .gitignore 并且对跟踪的文件数量没有限制 --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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/zh-TW/CONTRIBUTING.md b/locales/zh-TW/CONTRIBUTING.md index 81d583c297..791df3f178 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 描述中提及。 ## 開發設置 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 4772af3031..bf03879898 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -47,15 +47,13 @@ --- -## 🎉 Roo Code 3.9 已發布 +## 🎉 Roo Code 3.10 已發布 -Roo Code 3.9 邁向國際化! +Roo Code 3.10 帶來強大的生產力提升! -- Roo Code 已翻譯成 14 種不同的語言!前往設定 → 語言查看所有語言並變更您的設定。 -- 現在我們同時支援 stdio 和 SSE 作為 MCP 的傳輸方式 -- 應廣大用戶要求,現在您可以批量刪除歷史記錄項目 -- 在設定中開啟文字轉語音功能,即可聽到 Roo 說的每一句話 -- 想要更好地控制您的 OpenRouter?現在您可以為您的模型選擇特定的提供者。 +- 問題的建議回答,為您節省打字時間 +- 透過映射檔案結構並只讀取相關內容來改進大檔案處理 +- 重建的 @-提及檔案查詢功能,它尊重 .gitignore 並且對追蹤的檔案數量沒有限制 --- @@ -182,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
|qdaxb
qdaxb
|feifei325
feifei325
|RaySinner
RaySinner
| -|wkordalski
wkordalski
|emshvac
emshvac
|afshawnlotfi
afshawnlotfi
|aitoroses
aitoroses
|dtrugman
dtrugman
|pdecat
pdecat
| -|sammcj
sammcj
|Lunchb0ne
Lunchb0ne
|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|pugazhendhi-m
pugazhendhi-m
| -|eonghk
eonghk
|arthurauffray
arthurauffray
|heyseth
heyseth
|anton-otee
anton-otee
|benzntech
benzntech
|GitlyHallows
GitlyHallows
| -|jcbdev
jcbdev
|KJ7LNW
KJ7LNW
|mdp
mdp
|napter
napter
|philfung
philfung
|AMHesch
AMHesch
| -|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
|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
| -|aheizi
aheizi
|ashktn
ashktn
| | | | | +|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/package-lock.json b/package-lock.json index 805b1a93e4..73153ad7d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.9.2", + "version": "3.10.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.9.2", + "version": "3.10.2", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", @@ -31,7 +31,9 @@ "diff": "^5.2.0", "diff-match-patch": "^1.0.5", "fast-deep-equal": "^3.1.3", + "fast-xml-parser": "^4.5.1", "fastest-levenshtein": "^1.0.16", + "fzf": "^0.5.2", "get-folder-size": "^5.0.0", "globby": "^14.0.2", "i18next": "^24.2.2", @@ -1457,6 +1459,28 @@ "node": ">=16.0.0" } }, + "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/@aws-sdk/core/node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -8956,9 +8980,9 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz", + "integrity": "sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==", "funding": [ { "type": "github", @@ -8969,6 +8993,7 @@ "url": "https://paypal.me/naturalintelligence" } ], + "license": "MIT", "dependencies": { "strnum": "^1.0.5" }, @@ -9326,6 +9351,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fzf": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fzf/-/fzf-0.5.2.tgz", + "integrity": "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==" + }, "node_modules/gauge": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.2.tgz", diff --git a/package.json b/package.json index 47f08e238e..03e666cabe 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.9.2", + "version": "3.10.2", "icon": "assets/icons/rocket.png", "galleryBanner": { "color": "#617A91", @@ -51,6 +51,16 @@ ], "main": "./dist/extension.js", "contributes": { + "submenus": [ + { + "id": "roo-code.contextMenu", + "label": "Roo Code" + }, + { + "id": "roo-code.terminalMenu", + "label": "Roo Code" + } + ], "viewsContainers": { "activitybar": [ { @@ -112,93 +122,101 @@ }, { "command": "roo-cline.explainCode", - "title": "Roo Code: Explain Code", + "title": "Explain Code", "category": "Roo Code" }, { "command": "roo-cline.fixCode", - "title": "Roo Code: Fix Code", + "title": "Fix Code", "category": "Roo Code" }, { "command": "roo-cline.improveCode", - "title": "Roo Code: Improve Code", + "title": "Improve Code", "category": "Roo Code" }, { "command": "roo-cline.addToContext", - "title": "Roo Code: Add To Context", + "title": "Add To Context", "category": "Roo Code" }, { "command": "roo-cline.terminalAddToContext", - "title": "Roo Code: Add Terminal Content to Context", + "title": "Add Terminal Content to Context", "category": "Terminal" }, { "command": "roo-cline.terminalFixCommand", - "title": "Roo Code: Fix This Command", + "title": "Fix This Command", "category": "Terminal" }, { "command": "roo-cline.terminalExplainCommand", - "title": "Roo Code: Explain This Command", + "title": "Explain This Command", "category": "Terminal" }, { "command": "roo-cline.terminalFixCommandInCurrentTask", - "title": "Roo Code: Fix This Command (Current Task)", + "title": "Fix This Command (Current Task)", "category": "Terminal" }, { "command": "roo-cline.terminalExplainCommandInCurrentTask", - "title": "Roo Code: Explain This Command (Current Task)", + "title": "Explain This Command (Current Task)", "category": "Terminal" } ], "menus": { "editor/context": [ + { + "submenu": "roo-code.contextMenu", + "group": "navigation" + } + ], + "roo-code.contextMenu": [ { "command": "roo-cline.explainCode", - "when": "editorHasSelection", - "group": "Roo Code@1" + "group": "1_actions@1" }, { "command": "roo-cline.fixCode", - "when": "editorHasSelection", - "group": "Roo Code@2" + "group": "1_actions@2" }, { "command": "roo-cline.improveCode", - "when": "editorHasSelection", - "group": "Roo Code@3" + "group": "1_actions@3" }, { "command": "roo-cline.addToContext", - "when": "editorHasSelection", - "group": "Roo Code@4" + "group": "1_actions@4" } ], "terminal/context": [ + { + "submenu": "roo-code.terminalMenu", + "group": "navigation" + } + ], + "roo-code.terminalMenu": [ { "command": "roo-cline.terminalAddToContext", - "group": "Roo Code@1" + "group": "1_actions@1" }, { "command": "roo-cline.terminalFixCommand", - "group": "Roo Code@2" + "group": "1_actions@2" }, { "command": "roo-cline.terminalExplainCommand", - "group": "Roo Code@3" + "group": "1_actions@3" }, { "command": "roo-cline.terminalFixCommandInCurrentTask", - "group": "Roo Code@5" + "group": "1_actions@5" }, { "command": "roo-cline.terminalExplainCommandInCurrentTask", - "group": "Roo Code@6" + "group": "1_actions@6" } ], "view/title": [ @@ -342,7 +360,9 @@ "diff": "^5.2.0", "diff-match-patch": "^1.0.5", "fast-deep-equal": "^3.1.3", + "fast-xml-parser": "^4.5.1", "fastest-levenshtein": "^1.0.16", + "fzf": "^0.5.2", "get-folder-size": "^5.0.0", "globby": "^14.0.2", "i18next": "^24.2.2", diff --git a/src/api/index.ts b/src/api/index.ts index cf8085e289..0880f42218 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -20,6 +20,7 @@ import { ApiStream } from "./transform/stream" import { UnboundHandler } from "./providers/unbound" import { RequestyHandler } from "./providers/requesty" import { HumanRelayHandler } from "./providers/human-relay" +import { FakeAIHandler } from "./providers/fake-ai" export interface SingleCompletionHandler { completePrompt(prompt: string): Promise @@ -75,6 +76,8 @@ export function buildApiHandler(configuration: ApiConfiguration): ApiHandler { return new RequestyHandler(options) case "human-relay": return new HumanRelayHandler(options) + case "fake-ai": + return new FakeAIHandler(options) default: return new AnthropicHandler(options) } diff --git a/src/api/providers/__tests__/anthropic.test.ts b/src/api/providers/__tests__/anthropic.test.ts index acea77f315..fe367ea674 100644 --- a/src/api/providers/__tests__/anthropic.test.ts +++ b/src/api/providers/__tests__/anthropic.test.ts @@ -218,7 +218,7 @@ describe("AnthropicHandler", () => { }) const result = handler.getModel() - expect(result.maxTokens).toBe(16_384) + expect(result.maxTokens).toBe(8192) expect(result.thinking).toBeUndefined() expect(result.temperature).toBe(0) }) diff --git a/src/api/providers/__tests__/bedrock.test.ts b/src/api/providers/__tests__/bedrock.test.ts index 0094c3f12b..e9ba74ac6b 100644 --- a/src/api/providers/__tests__/bedrock.test.ts +++ b/src/api/providers/__tests__/bedrock.test.ts @@ -165,6 +165,222 @@ describe("AwsBedrockHandler", () => { ) }) + it("should handle cross-region inference for us-xx region", async () => { + const handlerWithProfile = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", + awsAccessKey: "test-access-key", + awsSecretKey: "test-secret-key", + awsRegion: "us-east-1", + awsUseCrossRegionInference: true, + }) + + // Mock AWS SDK invoke + const mockStream = { + [Symbol.asyncIterator]: async function* () { + yield { + metadata: { + usage: { + inputTokens: 10, + outputTokens: 5, + }, + }, + } + }, + } + + const mockInvoke = jest.fn().mockResolvedValue({ + stream: mockStream, + }) + + handlerWithProfile["client"] = { + send: mockInvoke, + } as unknown as BedrockRuntimeClient + + const stream = handlerWithProfile.createMessage(systemPrompt, mockMessages) + const chunks = [] + + for await (const chunk of stream) { + chunks.push(chunk) + } + + expect(chunks.length).toBeGreaterThan(0) + expect(chunks[0]).toEqual({ + type: "usage", + inputTokens: 10, + outputTokens: 5, + }) + + expect(mockInvoke).toHaveBeenCalledWith( + expect.objectContaining({ + input: expect.objectContaining({ + modelId: "us.anthropic.claude-3-5-sonnet-20241022-v2:0", + }), + }), + ) + }) + + it("should handle cross-region inference for eu-xx region", async () => { + const handlerWithProfile = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-5-sonnet-20240620-v1:0", + awsAccessKey: "test-access-key", + awsSecretKey: "test-secret-key", + awsRegion: "eu-west-1", + awsUseCrossRegionInference: true, + }) + + // Mock AWS SDK invoke + const mockStream = { + [Symbol.asyncIterator]: async function* () { + yield { + metadata: { + usage: { + inputTokens: 10, + outputTokens: 5, + }, + }, + } + }, + } + + const mockInvoke = jest.fn().mockResolvedValue({ + stream: mockStream, + }) + + handlerWithProfile["client"] = { + send: mockInvoke, + } as unknown as BedrockRuntimeClient + + const stream = handlerWithProfile.createMessage(systemPrompt, mockMessages) + const chunks = [] + + for await (const chunk of stream) { + chunks.push(chunk) + } + + expect(chunks.length).toBeGreaterThan(0) + expect(chunks[0]).toEqual({ + type: "usage", + inputTokens: 10, + outputTokens: 5, + }) + + expect(mockInvoke).toHaveBeenCalledWith( + expect.objectContaining({ + input: expect.objectContaining({ + modelId: "eu.anthropic.claude-3-5-sonnet-20240620-v1:0", + }), + }), + ) + }) + + it("should handle cross-region inference for ap-xx region", async () => { + const handlerWithProfile = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", + awsAccessKey: "test-access-key", + awsSecretKey: "test-secret-key", + awsRegion: "ap-northeast-1", + awsUseCrossRegionInference: true, + }) + + // Mock AWS SDK invoke + const mockStream = { + [Symbol.asyncIterator]: async function* () { + yield { + metadata: { + usage: { + inputTokens: 10, + outputTokens: 5, + }, + }, + } + }, + } + + const mockInvoke = jest.fn().mockResolvedValue({ + stream: mockStream, + }) + + handlerWithProfile["client"] = { + send: mockInvoke, + } as unknown as BedrockRuntimeClient + + const stream = handlerWithProfile.createMessage(systemPrompt, mockMessages) + const chunks = [] + + for await (const chunk of stream) { + chunks.push(chunk) + } + + expect(chunks.length).toBeGreaterThan(0) + expect(chunks[0]).toEqual({ + type: "usage", + inputTokens: 10, + outputTokens: 5, + }) + + expect(mockInvoke).toHaveBeenCalledWith( + expect.objectContaining({ + input: expect.objectContaining({ + modelId: "apac.anthropic.claude-3-5-sonnet-20241022-v2:0", + }), + }), + ) + }) + + it("should handle cross-region inference for other region", async () => { + const handlerWithProfile = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-sonnet-20240229-v1:0", + awsAccessKey: "test-access-key", + awsSecretKey: "test-secret-key", + awsRegion: "ca-central-1", + awsUseCrossRegionInference: true, + }) + + // Mock AWS SDK invoke + const mockStream = { + [Symbol.asyncIterator]: async function* () { + yield { + metadata: { + usage: { + inputTokens: 10, + outputTokens: 5, + }, + }, + } + }, + } + + const mockInvoke = jest.fn().mockResolvedValue({ + stream: mockStream, + }) + + handlerWithProfile["client"] = { + send: mockInvoke, + } as unknown as BedrockRuntimeClient + + const stream = handlerWithProfile.createMessage(systemPrompt, mockMessages) + const chunks = [] + + for await (const chunk of stream) { + chunks.push(chunk) + } + + expect(chunks.length).toBeGreaterThan(0) + expect(chunks[0]).toEqual({ + type: "usage", + inputTokens: 10, + outputTokens: 5, + }) + + expect(mockInvoke).toHaveBeenCalledWith( + expect.objectContaining({ + input: expect.objectContaining({ + modelId: "anthropic.claude-3-sonnet-20240229-v1:0", + }), + }), + ) + }) + it("should handle API errors", async () => { // Mock AWS SDK invoke with error const mockInvoke = jest.fn().mockRejectedValue(new Error("AWS Bedrock error")) @@ -260,7 +476,7 @@ describe("AwsBedrockHandler", () => { expect(result).toBe("") }) - it("should handle cross-region inference", async () => { + it("should handle cross-region inference for us-xx region", async () => { handler = new AwsBedrockHandler({ apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", awsAccessKey: "test-access-key", @@ -292,6 +508,105 @@ describe("AwsBedrockHandler", () => { }), ) }) + + it("should handle cross-region inference for eu-xx region", async () => { + handler = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-5-sonnet-20240620-v1:0", + awsAccessKey: "test-access-key", + awsSecretKey: "test-secret-key", + awsRegion: "eu-west-1", + awsUseCrossRegionInference: true, + }) + + const mockResponse = { + output: new TextEncoder().encode( + JSON.stringify({ + content: "Test response", + }), + ), + } + + const mockSend = jest.fn().mockResolvedValue(mockResponse) + handler["client"] = { + send: mockSend, + } as unknown as BedrockRuntimeClient + + const result = await handler.completePrompt("Test prompt") + expect(result).toBe("Test response") + expect(mockSend).toHaveBeenCalledWith( + expect.objectContaining({ + input: expect.objectContaining({ + modelId: "eu.anthropic.claude-3-5-sonnet-20240620-v1:0", + }), + }), + ) + }) + + it("should handle cross-region inference for ap-xx region", async () => { + handler = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", + awsAccessKey: "test-access-key", + awsSecretKey: "test-secret-key", + awsRegion: "ap-northeast-1", + awsUseCrossRegionInference: true, + }) + + const mockResponse = { + output: new TextEncoder().encode( + JSON.stringify({ + content: "Test response", + }), + ), + } + + const mockSend = jest.fn().mockResolvedValue(mockResponse) + handler["client"] = { + send: mockSend, + } as unknown as BedrockRuntimeClient + + const result = await handler.completePrompt("Test prompt") + expect(result).toBe("Test response") + expect(mockSend).toHaveBeenCalledWith( + expect.objectContaining({ + input: expect.objectContaining({ + modelId: "apac.anthropic.claude-3-5-sonnet-20241022-v2:0", + }), + }), + ) + }) + + it("should handle cross-region inference for other regions", async () => { + handler = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-sonnet-20240229-v1:0", + awsAccessKey: "test-access-key", + awsSecretKey: "test-secret-key", + awsRegion: "ca-central-1", + awsUseCrossRegionInference: true, + }) + + const mockResponse = { + output: new TextEncoder().encode( + JSON.stringify({ + content: "Test response", + }), + ), + } + + const mockSend = jest.fn().mockResolvedValue(mockResponse) + handler["client"] = { + send: mockSend, + } as unknown as BedrockRuntimeClient + + const result = await handler.completePrompt("Test prompt") + expect(result).toBe("Test response") + expect(mockSend).toHaveBeenCalledWith( + expect.objectContaining({ + input: expect.objectContaining({ + modelId: "anthropic.claude-3-sonnet-20240229-v1:0", + }), + }), + ) + }) }) describe("getModel", () => { diff --git a/src/api/providers/__tests__/unbound.test.ts b/src/api/providers/__tests__/unbound.test.ts index e468555cc1..5c54c24e8d 100644 --- a/src/api/providers/__tests__/unbound.test.ts +++ b/src/api/providers/__tests__/unbound.test.ts @@ -246,6 +246,38 @@ describe("UnboundHandler", () => { ) expect(mockCreate.mock.calls[0][0]).not.toHaveProperty("max_tokens") }) + + it("should not set temperature for openai/o3-mini", async () => { + mockCreate.mockClear() + + const openaiOptions = { + apiModelId: "openai/o3-mini", + unboundApiKey: "test-key", + unboundModelId: "openai/o3-mini", + unboundModelInfo: { + maxTokens: undefined, + contextWindow: 128000, + supportsPromptCache: true, + inputPrice: 0.01, + outputPrice: 0.03, + }, + } + const openaiHandler = new UnboundHandler(openaiOptions) + + await openaiHandler.completePrompt("Test prompt") + expect(mockCreate).toHaveBeenCalledWith( + expect.objectContaining({ + model: "o3-mini", + messages: [{ role: "user", content: "Test prompt" }], + }), + expect.objectContaining({ + headers: expect.objectContaining({ + "X-Unbound-Metadata": expect.stringContaining("roo-code"), + }), + }), + ) + expect(mockCreate.mock.calls[0][0]).not.toHaveProperty("temperature") + }) }) describe("getModel", () => { diff --git a/src/api/providers/__tests__/vertex.test.ts b/src/api/providers/__tests__/vertex.test.ts index 7b74bd4cd7..6c4e891d0b 100644 --- a/src/api/providers/__tests__/vertex.test.ts +++ b/src/api/providers/__tests__/vertex.test.ts @@ -309,7 +309,7 @@ describe("VertexHandler", () => { }, ], generationConfig: { - maxOutputTokens: 16384, + maxOutputTokens: 8192, temperature: 0, }, }) @@ -914,7 +914,7 @@ describe("VertexHandler", () => { }) const result = handler.getModel() - expect(result.maxTokens).toBe(16_384) + expect(result.maxTokens).toBe(8192) expect(result.thinking).toBeUndefined() expect(result.temperature).toBe(0) }) diff --git a/src/api/providers/bedrock.ts b/src/api/providers/bedrock.ts index 1637fe29f3..4696c1dc91 100644 --- a/src/api/providers/bedrock.ts +++ b/src/api/providers/bedrock.ts @@ -211,6 +211,9 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH case "eu-": modelId = `eu.${modelConfig.id}` break + case "ap-": + modelId = `apac.${modelConfig.id}` + break default: modelId = modelConfig.id break @@ -610,6 +613,9 @@ Please check: case "eu-": modelId = `eu.${modelConfig.id}` break + case "ap-": + modelId = `apac.${modelConfig.id}` + break default: modelId = modelConfig.id break diff --git a/src/api/providers/fake-ai.ts b/src/api/providers/fake-ai.ts new file mode 100644 index 0000000000..f7509c8b06 --- /dev/null +++ b/src/api/providers/fake-ai.ts @@ -0,0 +1,39 @@ +import { Anthropic } from "@anthropic-ai/sdk" +import { ApiHandler, SingleCompletionHandler } from ".." +import { ApiHandlerOptions, ModelInfo } from "../../shared/api" +import { ApiStream } from "../transform/stream" + +interface FakeAI { + createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream + getModel(): { id: string; info: ModelInfo } + countTokens(content: Array): Promise + completePrompt(prompt: string): Promise +} + +export class FakeAIHandler implements ApiHandler, SingleCompletionHandler { + private ai: FakeAI + + constructor(options: ApiHandlerOptions) { + if (!options.fakeAi) { + throw new Error("Fake AI is not set") + } + + this.ai = options.fakeAi as FakeAI + } + + async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { + yield* this.ai.createMessage(systemPrompt, messages) + } + + getModel(): { id: string; info: ModelInfo } { + return this.ai.getModel() + } + + countTokens(content: Array): Promise { + return this.ai.countTokens(content) + } + + completePrompt(prompt: string): Promise { + return this.ai.completePrompt(prompt) + } +} diff --git a/src/api/providers/glama.ts b/src/api/providers/glama.ts index 6de435c4a2..cc0b06e611 100644 --- a/src/api/providers/glama.ts +++ b/src/api/providers/glama.ts @@ -217,9 +217,6 @@ export async function getGlamaModels() { } switch (rawModel.id) { - case rawModel.id.startsWith("anthropic/claude-3-7-sonnet"): - modelInfo.maxTokens = 16384 - break case rawModel.id.startsWith("anthropic/"): modelInfo.maxTokens = 8192 break diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index 3823400455..3f215bfc7c 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -261,7 +261,7 @@ export async function getOpenRouterModels(options?: ApiHandlerOptions) { modelInfo.supportsPromptCache = true modelInfo.cacheWritesPrice = 3.75 modelInfo.cacheReadsPrice = 0.3 - modelInfo.maxTokens = rawModel.id === "anthropic/claude-3.7-sonnet:thinking" ? 128_000 : 16_384 + modelInfo.maxTokens = rawModel.id === "anthropic/claude-3.7-sonnet:thinking" ? 128_000 : 8192 break case rawModel.id.startsWith("anthropic/claude-3.5-sonnet-20240620"): modelInfo.supportsPromptCache = true diff --git a/src/api/providers/unbound.ts b/src/api/providers/unbound.ts index 689bd45406..38cd494cdd 100644 --- a/src/api/providers/unbound.ts +++ b/src/api/providers/unbound.ts @@ -25,6 +25,10 @@ export class UnboundHandler extends BaseProvider implements SingleCompletionHand this.client = new OpenAI({ baseURL, apiKey }) } + private supportsTemperature(): boolean { + return !this.getModel().id.startsWith("openai/o3-mini") + } + override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { // Convert Anthropic messages to OpenAI format const openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ @@ -78,28 +82,30 @@ export class UnboundHandler extends BaseProvider implements SingleCompletionHand maxTokens = this.getModel().info.maxTokens } + const requestOptions: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming = { + model: this.getModel().id.split("/")[1], + max_tokens: maxTokens, + messages: openAiMessages, + stream: true, + } + + if (this.supportsTemperature()) { + requestOptions.temperature = this.options.modelTemperature ?? 0 + } + const { data: completion, response } = await this.client.chat.completions - .create( - { - model: this.getModel().id.split("/")[1], - max_tokens: maxTokens, - temperature: this.options.modelTemperature ?? 0, - messages: openAiMessages, - stream: true, + .create(requestOptions, { + headers: { + "X-Unbound-Metadata": JSON.stringify({ + labels: [ + { + key: "app", + value: "roo-code", + }, + ], + }), }, - { - headers: { - "X-Unbound-Metadata": JSON.stringify({ - labels: [ - { - key: "app", - value: "roo-code", - }, - ], - }), - }, - }, - ) + }) .withResponse() for await (const chunk of completion) { @@ -150,7 +156,10 @@ export class UnboundHandler extends BaseProvider implements SingleCompletionHand const requestOptions: OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming = { model: this.getModel().id.split("/")[1], messages: [{ role: "user", content: prompt }], - temperature: this.options.modelTemperature ?? 0, + } + + if (this.supportsTemperature()) { + requestOptions.temperature = this.options.modelTemperature ?? 0 } if (this.getModel().id.startsWith("anthropic/")) { @@ -202,9 +211,6 @@ export async function getUnboundModels() { } switch (true) { - case modelId.startsWith("anthropic/claude-3-7-sonnet"): - modelInfo.maxTokens = 16384 - break case modelId.startsWith("anthropic/"): modelInfo.maxTokens = 8192 break diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 525426ebeb..d1bfe38125 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -28,13 +28,14 @@ import { stripLineNumbers, everyLineHasLineNumbers, } from "../integrations/misc/extract-text" +import { countFileLines } from "../integrations/misc/line-counter" import { ExitCodeDetails } from "../integrations/terminal/TerminalProcess" import { Terminal } from "../integrations/terminal/Terminal" import { TerminalRegistry } from "../integrations/terminal/TerminalRegistry" import { UrlContentFetcher } from "../services/browser/UrlContentFetcher" import { listFiles } from "../services/glob/list-files" import { regexSearchFiles } from "../services/ripgrep" -import { parseSourceCodeForDefinitionsTopLevel } from "../services/tree-sitter" +import { parseSourceCodeDefinitionsForFile, parseSourceCodeForDefinitionsTopLevel } from "../services/tree-sitter" import { CheckpointStorage } from "../shared/checkpoints" import { ApiConfiguration } from "../shared/api" import { findLastIndex } from "../shared/array" @@ -78,7 +79,10 @@ import { DiffStrategy, getDiffStrategy } from "./diff/DiffStrategy" import { insertGroups } from "./diff/insert-groups" import { telemetryService } from "../services/telemetry/TelemetryService" import { validateToolUse, isToolAllowedForMode, ToolName } from "./mode-validator" +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 @@ -2225,6 +2229,8 @@ export class Cline extends EventEmitter { case "read_file": { const relPath: string | undefined = block.params.path + const startLineStr: string | undefined = block.params.start_line + const endLineStr: string | undefined = block.params.end_line const sharedMessageProps: ClineSayTool = { tool: "readFile", path: getReadablePath(this.cwd, removeClosingTag("path", relPath)), @@ -2244,6 +2250,45 @@ export class Cline extends EventEmitter { break } + // Check if we're doing a line range read + let isRangeRead = false + let startLine: number | undefined = undefined + let endLine: number | undefined = undefined + + // Check if we have either range parameter + if (startLineStr || endLineStr) { + isRangeRead = true + } + + // Parse start_line if provided + if (startLineStr) { + startLine = parseInt(startLineStr) + if (isNaN(startLine)) { + // Invalid start_line + this.consecutiveMistakeCount++ + await this.say("error", `Failed to parse start_line: ${startLineStr}`) + pushToolResult(formatResponse.toolError("Invalid start_line value")) + break + } + startLine -= 1 // Convert to 0-based index + } + + // Parse end_line if provided + if (endLineStr) { + endLine = parseInt(endLineStr) + + if (isNaN(endLine)) { + // Invalid end_line + this.consecutiveMistakeCount++ + await this.say("error", `Failed to parse end_line: ${endLineStr}`) + pushToolResult(formatResponse.toolError("Invalid end_line value")) + break + } + + // Convert to 0-based index + endLine -= 1 + } + const accessAllowed = this.rooIgnoreController?.validateAccess(relPath) if (!accessAllowed) { await this.say("rooignore_error", relPath) @@ -2258,12 +2303,63 @@ export class Cline extends EventEmitter { ...sharedMessageProps, content: absolutePath, } satisfies ClineSayTool) + const didApprove = await askApproval("tool", completeMessage) if (!didApprove) { break } + + // Get the maxReadFileLine setting + const { maxReadFileLine } = (await this.providerRef.deref()?.getState()) ?? {} + + // Count total lines in the file + let totalLines = 0 + try { + totalLines = await countFileLines(absolutePath) + } catch (error) { + console.error(`Error counting lines in file ${absolutePath}:`, error) + } + // now execute the tool like normal - const content = await extractTextFromFile(absolutePath) + let content: string + let isFileTruncated = false + let sourceCodeDef = "" + + const isBinary = await isBinaryFile(absolutePath).catch(() => false) + + if (isRangeRead) { + if (startLine === undefined) { + content = addLineNumbers(await readLines(absolutePath, endLine, startLine)) + } else { + content = addLineNumbers( + await readLines(absolutePath, endLine, startLine), + startLine, + ) + } + } else if (!isBinary && totalLines > maxReadFileLine) { + // If file is too large, only read the first maxReadFileLine lines + isFileTruncated = true + + const res = await Promise.all([ + readLines(absolutePath, maxReadFileLine - 1, 0), + parseSourceCodeDefinitionsForFile(absolutePath, this.rooIgnoreController), + ]) + + content = addLineNumbers(res[0]) + const result = res[1] + if (result) { + sourceCodeDef = `\n\n${result}` + } + } else { + // Read entire file + content = await extractTextFromFile(absolutePath) + } + + // Add truncation notice if applicable + if (isFileTruncated) { + content += `\n\n[File truncated: showing ${maxReadFileLine} of ${totalLines} total lines. Use start_line and end_line if you need to read more.].${sourceCodeDef}` + } + pushToolResult(content) break } @@ -2272,6 +2368,7 @@ export class Cline extends EventEmitter { break } } + case "list_files": { const relDirPath: string | undefined = block.params.path const recursiveRaw: string | undefined = block.params.recursive @@ -2773,6 +2870,7 @@ export class Cline extends EventEmitter { } case "ask_followup_question": { const question: string | undefined = block.params.question + const follow_up: string | undefined = block.params.follow_up try { if (block.partial) { await this.ask("followup", removeClosingTag("question", question), block.partial).catch( @@ -2787,8 +2885,46 @@ export class Cline extends EventEmitter { ) break } + + type Suggest = { + answer: string + } + + let follow_up_json = { + question, + suggest: [] as Suggest[], + } + + if (follow_up) { + let parsedSuggest: { + suggest: Suggest[] | Suggest + } + + try { + parsedSuggest = parseXml(follow_up, ["suggest"]) as { + suggest: Suggest[] | Suggest + } + } catch (error) { + this.consecutiveMistakeCount++ + await this.say("error", `Failed to parse operations: ${error.message}`) + pushToolResult(formatResponse.toolError("Invalid operations xml format")) + break + } + + const normalizedSuggest = Array.isArray(parsedSuggest?.suggest) + ? parsedSuggest.suggest + : [parsedSuggest?.suggest].filter((sug): sug is Suggest => sug !== undefined) + + follow_up_json.suggest = normalizedSuggest + } + this.consecutiveMistakeCount = 0 - const { text, images } = await this.ask("followup", question, false) + + const { text, images } = await this.ask( + "followup", + JSON.stringify(follow_up_json), + false, + ) await this.say("user_feedback", text ?? "", images) pushToolResult(formatResponse.toolResult(`\n${text}\n`, images)) break diff --git a/src/core/__tests__/read-file-tool.test.ts b/src/core/__tests__/read-file-tool.test.ts new file mode 100644 index 0000000000..c410159d4e --- /dev/null +++ b/src/core/__tests__/read-file-tool.test.ts @@ -0,0 +1,138 @@ +import * as path from "path" +import { countFileLines } from "../../integrations/misc/line-counter" +import { readLines } from "../../integrations/misc/read-lines" +import { extractTextFromFile, addLineNumbers } from "../../integrations/misc/extract-text" + +// Mock the required functions +jest.mock("../../integrations/misc/line-counter") +jest.mock("../../integrations/misc/read-lines") +jest.mock("../../integrations/misc/extract-text") + +describe("read_file tool with maxReadFileLine setting", () => { + // Mock original implementation first to use in tests + const originalCountFileLines = jest.requireActual("../../integrations/misc/line-counter").countFileLines + const originalReadLines = jest.requireActual("../../integrations/misc/read-lines").readLines + const originalExtractTextFromFile = jest.requireActual("../../integrations/misc/extract-text").extractTextFromFile + const originalAddLineNumbers = jest.requireActual("../../integrations/misc/extract-text").addLineNumbers + + beforeEach(() => { + jest.resetAllMocks() + // Reset mocks to simulate original behavior + ;(countFileLines as jest.Mock).mockImplementation(originalCountFileLines) + ;(readLines as jest.Mock).mockImplementation(originalReadLines) + ;(extractTextFromFile as jest.Mock).mockImplementation(originalExtractTextFromFile) + ;(addLineNumbers as jest.Mock).mockImplementation(originalAddLineNumbers) + }) + + // Test for the case when file size is smaller than maxReadFileLine + it("should read entire file when line count is less than maxReadFileLine", async () => { + // Mock necessary functions + ;(countFileLines as jest.Mock).mockResolvedValue(100) + ;(extractTextFromFile as jest.Mock).mockResolvedValue("Small file content") + + // Create mock implementation that would simulate the behavior + // Note: We're not testing the Cline class directly as it would be too complex + // We're testing the logic flow that would happen in the read_file implementation + + const filePath = path.resolve("/test", "smallFile.txt") + const maxReadFileLine = 500 + + // Check line count + const lineCount = await countFileLines(filePath) + expect(lineCount).toBeLessThan(maxReadFileLine) + + // Should use extractTextFromFile for small files + if (lineCount < maxReadFileLine) { + await extractTextFromFile(filePath) + } + + expect(extractTextFromFile).toHaveBeenCalledWith(filePath) + expect(readLines).not.toHaveBeenCalled() + }) + + // Test for the case when file size is larger than maxReadFileLine + it("should truncate file when line count exceeds maxReadFileLine", async () => { + // Mock necessary functions + ;(countFileLines as jest.Mock).mockResolvedValue(5000) + ;(readLines as jest.Mock).mockResolvedValue("First 500 lines of large file") + ;(addLineNumbers as jest.Mock).mockReturnValue("1 | First line\n2 | Second line\n...") + + const filePath = path.resolve("/test", "largeFile.txt") + const maxReadFileLine = 500 + + // Check line count + const lineCount = await countFileLines(filePath) + expect(lineCount).toBeGreaterThan(maxReadFileLine) + + // Should use readLines for large files + if (lineCount > maxReadFileLine) { + const content = await readLines(filePath, maxReadFileLine - 1, 0) + const numberedContent = addLineNumbers(content) + + // Verify the truncation message is shown (simulated) + const truncationMsg = `\n\n[File truncated: showing ${maxReadFileLine} of ${lineCount} total lines]` + const fullResult = numberedContent + truncationMsg + + expect(fullResult).toContain("File truncated") + } + + expect(readLines).toHaveBeenCalledWith(filePath, maxReadFileLine - 1, 0) + expect(addLineNumbers).toHaveBeenCalled() + expect(extractTextFromFile).not.toHaveBeenCalled() + }) + + // Test for the case when the file is a source code file + it("should add source code file type info for large source code files", async () => { + // Mock necessary functions + ;(countFileLines as jest.Mock).mockResolvedValue(5000) + ;(readLines as jest.Mock).mockResolvedValue("First 500 lines of large JavaScript file") + ;(addLineNumbers as jest.Mock).mockReturnValue('1 | const foo = "bar";\n2 | function test() {...') + + const filePath = path.resolve("/test", "largeFile.js") + const maxReadFileLine = 500 + + // Check line count + const lineCount = await countFileLines(filePath) + expect(lineCount).toBeGreaterThan(maxReadFileLine) + + // Check if the file is a source code file + const fileExt = path.extname(filePath).toLowerCase() + const isSourceCode = [ + ".js", + ".ts", + ".jsx", + ".tsx", + ".py", + ".java", + ".c", + ".cpp", + ".cs", + ".go", + ".rb", + ".php", + ".swift", + ".rs", + ].includes(fileExt) + expect(isSourceCode).toBeTruthy() + + // Should use readLines for large files + if (lineCount > maxReadFileLine) { + const content = await readLines(filePath, maxReadFileLine - 1, 0) + const numberedContent = addLineNumbers(content) + + // Verify the truncation message and source code message are shown (simulated) + let truncationMsg = `\n\n[File truncated: showing ${maxReadFileLine} of ${lineCount} total lines]` + if (isSourceCode) { + truncationMsg += + "\n\nThis appears to be a source code file. Consider using list_code_definition_names to understand its structure." + } + const fullResult = numberedContent + truncationMsg + + expect(fullResult).toContain("source code file") + expect(fullResult).toContain("list_code_definition_names") + } + + expect(readLines).toHaveBeenCalledWith(filePath, maxReadFileLine - 1, 0) + expect(addLineNumbers).toHaveBeenCalled() + }) +}) diff --git a/src/core/assistant-message/index.ts b/src/core/assistant-message/index.ts index 95c9612e24..81e6edb95b 100644 --- a/src/core/assistant-message/index.ts +++ b/src/core/assistant-message/index.ts @@ -57,6 +57,7 @@ export const toolParamNames = [ "mode", "message", "cwd", + "follow_up", ] as const export type ToolParamName = (typeof toolParamNames)[number] @@ -77,7 +78,7 @@ export interface ExecuteCommandToolUse extends ToolUse { export interface ReadFileToolUse extends ToolUse { name: "read_file" - params: Partial, "path">> + params: Partial, "path" | "start_line" | "end_line">> } export interface WriteToFileToolUse extends ToolUse { @@ -122,7 +123,7 @@ export interface AccessMcpResourceToolUse extends ToolUse { export interface AskFollowupQuestionToolUse extends ToolUse { name: "ask_followup_question" - params: Partial, "question">> + params: Partial, "question" | "follow_up">> } export interface AttemptCompletionToolUse extends ToolUse { diff --git a/src/core/mentions/index.ts b/src/core/mentions/index.ts index 57bb40811e..d32b1ec08d 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 = "" diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index 90e975570d..1bfc98ac0b 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -30,19 +30,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -157,14 +185,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -283,7 +325,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -365,19 +407,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -577,14 +647,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -707,7 +791,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -789,19 +873,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -966,14 +1078,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -1095,7 +1221,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -1177,19 +1303,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -1304,14 +1458,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -1430,7 +1598,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -1512,19 +1680,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -1639,14 +1835,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -1765,7 +1975,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -1847,19 +2057,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -1974,14 +2212,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -2100,7 +2352,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -2182,19 +2434,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -2355,14 +2635,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -2483,7 +2777,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -2566,19 +2860,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -2742,14 +3064,28 @@ Example: Requesting to access an MCP resource Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -3273,7 +3609,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -3355,19 +3691,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -3528,14 +3892,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -3656,7 +4034,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -3739,19 +4117,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -3926,14 +4332,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -4054,7 +4474,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -4136,19 +4556,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -4263,14 +4711,28 @@ Example: Requesting to execute ls in a specific directory if directed Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -4389,7 +4851,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -4513,19 +4975,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -4774,14 +5264,28 @@ Example: Requesting to access an MCP resource Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -4913,7 +5417,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -5010,19 +5514,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -5200,14 +5732,28 @@ Example: Replace all occurrences of "old" with "new" using regex Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -5326,7 +5872,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -5421,19 +5967,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -5489,14 +6063,28 @@ Example: Requesting to list all top level source code definitions in the current Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -5615,7 +6203,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. @@ -5730,19 +6318,47 @@ Always adhere to this format for the tool use to ensure proper parsing and execu # Tools ## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory /test/path) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. + ## 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: @@ -5991,14 +6607,28 @@ Example: Requesting to access an MCP resource Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ## attempt_completion @@ -6522,7 +7152,7 @@ RULES * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. diff --git a/src/core/prompts/sections/rules.ts b/src/core/prompts/sections/rules.ts index 02d8a25cdb..4772c9ed02 100644 --- a/src/core/prompts/sections/rules.ts +++ b/src/core/prompts/sections/rules.ts @@ -74,7 +74,7 @@ ${getEditingInstructions(diffStrategy, experiments)} * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" - When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. - Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. +- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. - When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. - The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. - Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation.${ diff --git a/src/core/prompts/tools/ask-followup-question.ts b/src/core/prompts/tools/ask-followup-question.ts index fbd805ee6f..7ece1e311d 100644 --- a/src/core/prompts/tools/ask-followup-question.ts +++ b/src/core/prompts/tools/ask-followup-question.ts @@ -3,13 +3,27 @@ export function getAskFollowupQuestionDescription(): string { Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: - question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. +- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: + 1. Be provided in its own tag + 2. Be specific, actionable, and directly related to the completed task + 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. Usage: Your question here + + +Your suggested answer here + + Example: Requesting to ask the user for the path to the frontend-config.json file What is the path to the frontend-config.json file? + +./src/frontend-config.json +./config/frontend-config.json +./frontend-config.json + ` } diff --git a/src/core/prompts/tools/read-file.ts b/src/core/prompts/tools/read-file.ts index ee522141ee..5586b90dc4 100644 --- a/src/core/prompts/tools/read-file.ts +++ b/src/core/prompts/tools/read-file.ts @@ -2,16 +2,44 @@ import { ToolArgs } from "./types" export function getReadFileDescription(args: ToolArgs): string { return `## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. +Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. Parameters: - path: (required) The path of the file to read (relative to the current working directory ${args.cwd}) +- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. +- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. Usage: File path here +Starting line number (optional) +Ending line number (optional) -Example: Requesting to read frontend-config.json +Examples: + +1. Reading an entire file: frontend-config.json -` + + +2. Reading the first 1000 lines of a large log file: + +logs/application.log +1000 + + +3. Reading lines 500-1000 of a CSV file: + +data/large-dataset.csv +500 +1000 + + +4. Reading a specific function in a source file: + +src/app.ts +46 +68 + + +Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues.` } diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 6f95eb2b2f..fc7d029cf8 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -39,6 +39,7 @@ import { McpServerManager } from "../../services/mcp/McpServerManager" import { ShadowCheckpointService } from "../../services/checkpoints/ShadowCheckpointService" import { BrowserSession } from "../../services/browser/BrowserSession" import { discoverChromeInstances } from "../../services/browser/browserDiscovery" +import { searchWorkspaceFiles } from "../../services/search/file-search" import { fileExistsAtPath } from "../../utils/fs" import { playSound, setSoundEnabled, setSoundVolume } from "../../utils/sound" import { playTts, setTtsEnabled, setTtsSpeed, stopTts } from "../../utils/tts" @@ -86,7 +87,7 @@ export class ClineProvider extends EventEmitter implements private clineStack: Cline[] = [] private workspaceTracker?: WorkspaceTracker protected mcpHub?: McpHub // Change from private to protected - private latestAnnouncementId = "mar-18-2025-3-9" // update to some unique identifier when we add a new announcement + private latestAnnouncementId = "mar-20-2025-3-10" // update to some unique identifier when we add a new announcement private contextProxy: ContextProxy configManager: ConfigManager customModesManager: CustomModesManager @@ -1641,6 +1642,10 @@ export class ClineProvider extends EventEmitter implements await this.updateGlobalState("showRooIgnoredFiles", message.bool ?? true) await this.postStateToWebview() break + case "maxReadFileLine": + await this.updateGlobalState("maxReadFileLine", message.value) + await this.postStateToWebview() + break case "enhancementApiConfigId": await this.updateGlobalState("enhancementApiConfigId", message.text) await this.postStateToWebview() @@ -1750,6 +1755,46 @@ export class ClineProvider extends EventEmitter implements } break } + case "searchFiles": { + const workspacePath = getWorkspacePath() + + if (!workspacePath) { + // Handle case where workspace path is not available + await this.postMessageToWebview({ + type: "fileSearchResults", + results: [], + requestId: message.requestId, + error: "No workspace path available", + }) + break + } + try { + // Call file search service with query from message + const results = await searchWorkspaceFiles( + message.query || "", + workspacePath, + 20, // Use default limit, as filtering is now done in the backend + ) + + // Send results back to webview + await this.postMessageToWebview({ + type: "fileSearchResults", + results, + requestId: message.requestId, + }) + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error) + + // Send error response to webview + await this.postMessageToWebview({ + type: "fileSearchResults", + results: [], + error: errorMessage, + requestId: message.requestId, + }) + } + break + } case "saveApiConfiguration": if (message.text && message.apiConfiguration) { try { @@ -2281,51 +2326,33 @@ export class ClineProvider extends EventEmitter implements }> { const history = ((await this.getGlobalState("taskHistory")) as HistoryItem[] | undefined) || [] const historyItem = history.find((item) => item.id === id) - if (!historyItem) { - throw new Error("Task not found in history") - } - - const taskDirPath = path.join(this.contextProxy.globalStorageUri.fsPath, "tasks", id) - const apiConversationHistoryFilePath = path.join(taskDirPath, GlobalFileNames.apiConversationHistory) - const uiMessagesFilePath = path.join(taskDirPath, GlobalFileNames.uiMessages) - - const fileExists = await fileExistsAtPath(apiConversationHistoryFilePath) - if (!fileExists) { - // Instead of silently deleting, throw a specific error - throw new Error("TASK_FILES_MISSING") - } - - const apiConversationHistory = JSON.parse(await fs.readFile(apiConversationHistoryFilePath, "utf8")) - return { - historyItem, - taskDirPath, - apiConversationHistoryFilePath, - uiMessagesFilePath, - apiConversationHistory, + if (historyItem) { + const taskDirPath = path.join(this.contextProxy.globalStorageUri.fsPath, "tasks", id) + const apiConversationHistoryFilePath = path.join(taskDirPath, GlobalFileNames.apiConversationHistory) + const uiMessagesFilePath = path.join(taskDirPath, GlobalFileNames.uiMessages) + const fileExists = await fileExistsAtPath(apiConversationHistoryFilePath) + if (fileExists) { + const apiConversationHistory = JSON.parse(await fs.readFile(apiConversationHistoryFilePath, "utf8")) + return { + historyItem, + taskDirPath, + apiConversationHistoryFilePath, + uiMessagesFilePath, + apiConversationHistory, + } + } } + // if we tried to get a task that doesn't exist, remove it from state + // FIXME: this seems to happen sometimes when the json file doesnt save to disk for some reason + await this.deleteTaskFromState(id) + throw new Error("Task not found") } async showTaskWithId(id: string) { if (id !== this.getCurrentCline()?.taskId) { - try { - const { historyItem } = await this.getTaskWithId(id) - await this.initClineWithHistoryItem(historyItem) - } catch (error) { - if (error.message === "TASK_FILES_MISSING") { - const response = await vscode.window.showWarningMessage( - t("common:warnings.missing_task_files"), - t("common:answers.remove"), - t("common:answers.keep"), - ) - - if (response === t("common:answers.remove")) { - await this.deleteTaskFromState(id) - await this.postStateToWebview() - } - return - } - throw error - } + // Non-current task. + const { historyItem } = await this.getTaskWithId(id) + await this.initClineWithHistoryItem(historyItem) // Clears existing task. } await this.postMessageToWebview({ type: "action", action: "chatButtonClicked" }) @@ -2446,6 +2473,7 @@ export class ClineProvider extends EventEmitter implements telemetrySetting, showRooIgnoredFiles, language, + maxReadFileLine, } = await this.getState() const telemetryKey = process.env.POSTHOG_API_KEY @@ -2515,6 +2543,7 @@ export class ClineProvider extends EventEmitter implements showRooIgnoredFiles: showRooIgnoredFiles ?? true, language, renderContext: this.renderContext, + maxReadFileLine: maxReadFileLine ?? 500, } } @@ -2673,6 +2702,7 @@ export class ClineProvider extends EventEmitter implements browserToolEnabled: stateValues.browserToolEnabled ?? true, telemetrySetting: stateValues.telemetrySetting || "unset", showRooIgnoredFiles: stateValues.showRooIgnoredFiles ?? true, + maxReadFileLine: stateValues.maxReadFileLine ?? 500, } } @@ -2809,28 +2839,4 @@ export class ClineProvider extends EventEmitter implements return properties } - - async validateTaskHistory() { - const history = ((await this.getGlobalState("taskHistory")) as HistoryItem[] | undefined) || [] - const validTasks: HistoryItem[] = [] - - for (const item of history) { - const taskDirPath = path.join(this.contextProxy.globalStorageUri.fsPath, "tasks", item.id) - const apiConversationHistoryFilePath = path.join(taskDirPath, GlobalFileNames.apiConversationHistory) - - if (await fileExistsAtPath(apiConversationHistoryFilePath)) { - validTasks.push(item) - } - } - - if (validTasks.length !== history.length) { - await this.updateGlobalState("taskHistory", validTasks) - await this.postStateToWebview() - - const removedCount = history.length - validTasks.length - if (removedCount > 0) { - await vscode.window.showInformationMessage(t("common:info.history_cleanup", { count: removedCount })) - } - } - } } diff --git a/src/core/webview/__tests__/ClineProvider.test.ts b/src/core/webview/__tests__/ClineProvider.test.ts index 3da5c877f4..6edeb7ac2c 100644 --- a/src/core/webview/__tests__/ClineProvider.test.ts +++ b/src/core/webview/__tests__/ClineProvider.test.ts @@ -55,78 +55,6 @@ jest.mock("../../contextProxy", () => { } }) -describe("validateTaskHistory", () => { - let provider: ClineProvider - let mockContext: vscode.ExtensionContext - let mockOutputChannel: vscode.OutputChannel - let mockUpdate: jest.Mock - - beforeEach(() => { - // Reset mocks - jest.clearAllMocks() - - mockUpdate = jest.fn() - - // Setup basic mocks - mockContext = { - globalState: { - get: jest.fn(), - update: mockUpdate, - keys: jest.fn().mockReturnValue([]), - }, - secrets: { get: jest.fn(), store: jest.fn(), delete: jest.fn() }, - extensionUri: {} as vscode.Uri, - globalStorageUri: { fsPath: "/test/path" }, - extension: { packageJSON: { version: "1.0.0" } }, - } as unknown as vscode.ExtensionContext - - mockOutputChannel = { appendLine: jest.fn() } as unknown as vscode.OutputChannel - provider = new ClineProvider(mockContext, mockOutputChannel) - }) - - test("should remove tasks with missing files", async () => { - // Mock the global state with some test data - const mockHistory = [ - { id: "task1", ts: Date.now() }, - { id: "task2", ts: Date.now() }, - ] - - // Setup mocks - jest.spyOn(mockContext.globalState, "get").mockReturnValue(mockHistory) - - // Mock fileExistsAtPath to only return true for task1 - const mockFs = require("../../../utils/fs") - mockFs.fileExistsAtPath = jest.fn().mockImplementation((path) => Promise.resolve(path.includes("task1"))) - - // Call validateTaskHistory - await provider.validateTaskHistory() - - // Verify the results - const expectedHistory = [expect.objectContaining({ id: "task1" })] - - expect(mockUpdate).toHaveBeenCalledWith("taskHistory", expect.arrayContaining(expectedHistory)) - expect(mockUpdate.mock.calls[0][1].length).toBe(1) - }) - - test("should handle empty history", async () => { - // Mock empty history - jest.spyOn(mockContext.globalState, "get").mockReturnValue([]) - - await provider.validateTaskHistory() - - expect(mockUpdate).toHaveBeenCalledWith("taskHistory", []) - }) - - test("should handle null history", async () => { - // Mock null history - jest.spyOn(mockContext.globalState, "get").mockReturnValue(null) - - await provider.validateTaskHistory() - - expect(mockUpdate).toHaveBeenCalledWith("taskHistory", []) - }) -}) - // Mock dependencies jest.mock("vscode") jest.mock("delay") @@ -532,6 +460,7 @@ describe("ClineProvider", () => { telemetrySetting: "unset", showRooIgnoredFiles: true, renderContext: "sidebar", + maxReadFileLine: 500, } const message: ExtensionMessage = { diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index daa147add4..886290d3d1 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -254,6 +254,8 @@ export type GlobalStateKey = | "showRooIgnoredFiles" | "remoteBrowserEnabled" | "language" + | "maxReadFileLine" + | "fakeAi" export type ConfigurationKey = GlobalStateKey | SecretKey diff --git a/src/extension.ts b/src/extension.ts index db2c5b378a..05f8afe969 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -64,11 +64,6 @@ export function activate(context: vscode.ExtensionContext) { const provider = new ClineProvider(context, outputChannel, "sidebar") telemetryService.setProvider(provider) - // Validate task history on extension activation - provider.validateTaskHistory().catch((error) => { - outputChannel.appendLine(`Failed to validate task history: ${error}`) - }) - context.subscriptions.push( vscode.window.registerWebviewViewProvider(ClineProvider.sideBarId, provider, { webviewOptions: { retainContextWhenHidden: true }, diff --git a/src/i18n/locales/de/common.json b/src/i18n/locales/de/common.json index eeea17a03f..7da6e0477d 100644 --- a/src/i18n/locales/de/common.json +++ b/src/i18n/locales/de/common.json @@ -15,23 +15,23 @@ "other": "{{count}} Elemente" }, "confirmation": { - "reset_state": "Möchten Sie wirklich alle Zustände und geheimen Speicher in der Erweiterung zurücksetzen? Dies kann nicht rückgängig gemacht werden.", - "delete_config_profile": "Möchten Sie dieses Konfigurationsprofil wirklich löschen?", - "delete_custom_mode": "Möchten Sie diesen benutzerdefinierten Modus wirklich löschen?", - "delete_message": "Was möchten Sie löschen?", + "reset_state": "Möchtest du wirklich alle Zustände und geheimen Speicher in der Erweiterung zurücksetzen? Dies kann nicht rückgängig gemacht werden.", + "delete_config_profile": "Möchtest du dieses Konfigurationsprofil wirklich löschen?", + "delete_custom_mode": "Möchtest du diesen benutzerdefinierten Modus wirklich löschen?", + "delete_message": "Was möchtest du löschen?", "just_this_message": "Nur diese Nachricht", "this_and_subsequent": "Diese und alle nachfolgenden Nachrichten" }, "errors": { "invalid_mcp_config": "Ungültiges MCP-Projekt-Konfigurationsformat", - "invalid_mcp_settings_format": "Ungültiges MCP-Einstellungen-JSON-Format. Bitte stellen Sie sicher, dass Ihre Einstellungen dem korrekten JSON-Format entsprechen.", - "invalid_mcp_settings_syntax": "Ungültiges MCP-Einstellungen-JSON-Format. Bitte überprüfen Sie Ihre Einstellungsdatei auf Syntaxfehler.", + "invalid_mcp_settings_format": "Ungültiges MCP-Einstellungen-JSON-Format. Bitte stelle sicher, dass deine Einstellungen dem korrekten JSON-Format entsprechen.", + "invalid_mcp_settings_syntax": "Ungültiges MCP-Einstellungen-JSON-Format. Bitte überprüfe deine Einstellungsdatei auf Syntaxfehler.", "invalid_mcp_settings_validation": "Ungültiges MCP-Einstellungen-Format: {{errorMessages}}", "failed_initialize_project_mcp": "Fehler beim Initialisieren des Projekt-MCP-Servers: {{error}}", "invalid_data_uri": "Ungültiges Daten-URI-Format", "checkpoint_timeout": "Zeitüberschreitung beim Versuch, den Checkpoint wiederherzustellen.", "checkpoint_failed": "Fehler beim Wiederherstellen des Checkpoints.", - "no_workspace": "Bitte öffnen Sie zuerst einen Projektordner", + "no_workspace": "Bitte öffne zuerst einen Projektordner", "update_support_prompt": "Fehler beim Aktualisieren der Support-Nachricht", "reset_support_prompt": "Fehler beim Zurücksetzen der Support-Nachricht", "enhance_prompt": "Fehler beim Verbessern der Nachricht", @@ -52,7 +52,7 @@ }, "warnings": { "no_terminal_content": "Kein Terminal-Inhalt ausgewählt", - "missing_task_files": "Die Dateien dieser Aufgabe fehlen. Möchten Sie sie aus der Aufgabenliste entfernen?" + "missing_task_files": "Die Dateien dieser Aufgabe fehlen. Möchtest du sie aus der Aufgabenliste entfernen?" }, "info": { "no_changes": "Keine Änderungen gefunden.", @@ -71,7 +71,7 @@ "keep": "Behalten" }, "tasks": { - "canceled": "Aufgabenfehler: Sie wurde vom Benutzer gestoppt und abgebrochen.", - "deleted": "Aufgabenfehler: Sie wurde vom Benutzer gestoppt und gelöscht." + "canceled": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und abgebrochen.", + "deleted": "Aufgabenfehler: Die Aufgabe wurde vom Benutzer gestoppt und gelöscht." } } diff --git a/src/integrations/misc/__tests__/line-counter.test.ts b/src/integrations/misc/__tests__/line-counter.test.ts new file mode 100644 index 0000000000..12df3e6e89 --- /dev/null +++ b/src/integrations/misc/__tests__/line-counter.test.ts @@ -0,0 +1,141 @@ +import fs from "fs" +import { countFileLines } from "../line-counter" + +// Mock the fs module +jest.mock("fs", () => { + const originalModule = jest.requireActual("fs") + return { + ...originalModule, + createReadStream: jest.fn(), + promises: { + access: jest.fn(), + }, + } +}) + +// Mock readline +jest.mock("readline", () => ({ + createInterface: jest.fn().mockReturnValue({ + on: jest.fn().mockImplementation(function (this: any, event, callback) { + if (event === "line" && this.mockLines) { + for (let i = 0; i < this.mockLines; i++) { + callback() + } + } + if (event === "close") { + callback() + } + return this + }), + mockLines: 0, + }), +})) + +describe("countFileLines", () => { + beforeEach(() => { + jest.clearAllMocks() + }) + + it("should throw error if file does not exist", async () => { + // Setup + ;(fs.promises.access as jest.Mock).mockRejectedValueOnce(new Error("File not found")) + + // Test & Assert + await expect(countFileLines("non-existent-file.txt")).rejects.toThrow("File not found") + }) + + it("should return the correct line count for a file", async () => { + // Setup + ;(fs.promises.access as jest.Mock).mockResolvedValueOnce(undefined) + + const mockEventEmitter = { + on: jest.fn().mockImplementation(function (this: any, event, callback) { + if (event === "line") { + // Simulate 10 lines + for (let i = 0; i < 10; i++) { + callback() + } + } + if (event === "close") { + callback() + } + return this + }), + } + + const mockReadStream = { + on: jest.fn().mockImplementation(function (this: any, event, callback) { + return this + }), + } + + ;(fs.createReadStream as jest.Mock).mockReturnValueOnce(mockReadStream) + const readline = require("readline") + readline.createInterface.mockReturnValueOnce(mockEventEmitter) + + // Test + const result = await countFileLines("test-file.txt") + + // Assert + expect(result).toBe(10) + expect(fs.promises.access).toHaveBeenCalledWith("test-file.txt", fs.constants.F_OK) + expect(fs.createReadStream).toHaveBeenCalledWith("test-file.txt") + }) + + it("should handle files with no lines", async () => { + // Setup + ;(fs.promises.access as jest.Mock).mockResolvedValueOnce(undefined) + + const mockEventEmitter = { + on: jest.fn().mockImplementation(function (this: any, event, callback) { + if (event === "close") { + callback() + } + return this + }), + } + + const mockReadStream = { + on: jest.fn().mockImplementation(function (this: any, event, callback) { + return this + }), + } + + ;(fs.createReadStream as jest.Mock).mockReturnValueOnce(mockReadStream) + const readline = require("readline") + readline.createInterface.mockReturnValueOnce(mockEventEmitter) + + // Test + const result = await countFileLines("empty-file.txt") + + // Assert + expect(result).toBe(0) + }) + + it("should handle errors during reading", async () => { + // Setup + ;(fs.promises.access as jest.Mock).mockResolvedValueOnce(undefined) + + const mockEventEmitter = { + on: jest.fn().mockImplementation(function (this: any, event, callback) { + if (event === "error" && callback) { + callback(new Error("Read error")) + } + return this + }), + } + + const mockReadStream = { + on: jest.fn().mockImplementation(function (this: any, event, callback) { + return this + }), + } + + ;(fs.createReadStream as jest.Mock).mockReturnValueOnce(mockReadStream) + const readline = require("readline") + readline.createInterface.mockReturnValueOnce(mockEventEmitter) + + // Test & Assert + await expect(countFileLines("error-file.txt")).rejects.toThrow("Read error") + }) +}) diff --git a/src/integrations/misc/__tests__/read-lines.test.ts b/src/integrations/misc/__tests__/read-lines.test.ts new file mode 100644 index 0000000000..5f5997e117 --- /dev/null +++ b/src/integrations/misc/__tests__/read-lines.test.ts @@ -0,0 +1,70 @@ +import { promises as fs } from "fs" +import path from "path" +import { readLines } from "../read-lines" + +describe("nthline", () => { + const testFile = path.join(__dirname, "test.txt") + + beforeAll(async () => { + // Create a test file with numbered lines + const content = Array.from({ length: 10 }, (_, i) => `Line ${i + 1}`).join("\n") + await fs.writeFile(testFile, content) + }) + + afterAll(async () => { + await fs.unlink(testFile) + }) + + describe("readLines function", () => { + it("should read lines from start when from_line is not provided", async () => { + const lines = await readLines(testFile, 2) + expect(lines).toEqual(["Line 1", "Line 2", "Line 3"].join("\n")) + }) + + it("should read a range of lines from a file", async () => { + const lines = await readLines(testFile, 3, 1) + expect(lines).toEqual(["Line 2", "Line 3", "Line 4"].join("\n")) + }) + + it("should read lines when to_line equals from_line", async () => { + const lines = await readLines(testFile, 2, 2) + expect(lines).toEqual("Line 3") + }) + + it("should throw error for negative to_line", async () => { + await expect(readLines(testFile, -3)).rejects.toThrow( + "Invalid endLine: -3. Line numbers must be non-negative integers.", + ) + }) + + it("should throw error for negative from_line", async () => { + await expect(readLines(testFile, 3, -1)).rejects.toThrow( + "Invalid startLine: -1. Line numbers must be non-negative integers.", + ) + }) + + it("should throw error for non-integer line numbers", async () => { + await expect(readLines(testFile, 3, 1.5)).rejects.toThrow( + "Invalid startLine: 1.5. Line numbers must be non-negative integers.", + ) + await expect(readLines(testFile, 3.5)).rejects.toThrow( + "Invalid endLine: 3.5. Line numbers must be non-negative integers.", + ) + }) + + it("should throw error when from_line > to_line", async () => { + await expect(readLines(testFile, 1, 3)).rejects.toThrow( + "startLine (3) must be less than or equal to endLine (1)", + ) + }) + + it("should return partial range if file ends before to_line", async () => { + const lines = await readLines(testFile, 15, 8) + expect(lines).toEqual(["Line 9", "Line 10"].join("\n")) + }) + + it("should throw error if from_line is beyond file length", async () => { + await expect(readLines(testFile, 20, 15)).rejects.toThrow("does not exist") + }) + }) +}) diff --git a/src/integrations/misc/line-counter.ts b/src/integrations/misc/line-counter.ts new file mode 100644 index 0000000000..9a3d765466 --- /dev/null +++ b/src/integrations/misc/line-counter.ts @@ -0,0 +1,44 @@ +import fs from "fs" +import { createReadStream } from "fs" +import { createInterface } from "readline" + +/** + * Efficiently counts lines in a file using streams without loading the entire file into memory + * + * @param filePath - Path to the file to count lines in + * @returns A promise that resolves to the number of lines in the file + */ +export async function countFileLines(filePath: string): Promise { + // Check if file exists + try { + await fs.promises.access(filePath, fs.constants.F_OK) + } catch (error) { + throw new Error(`File not found: ${filePath}`) + } + + return new Promise((resolve, reject) => { + let lineCount = 0 + + const readStream = createReadStream(filePath) + const rl = createInterface({ + input: readStream, + crlfDelay: Infinity, + }) + + rl.on("line", () => { + lineCount++ + }) + + rl.on("close", () => { + resolve(lineCount) + }) + + rl.on("error", (err) => { + reject(err) + }) + + readStream.on("error", (err) => { + reject(err) + }) + }) +} diff --git a/src/integrations/misc/read-lines.ts b/src/integrations/misc/read-lines.ts new file mode 100644 index 0000000000..173fdadbdd --- /dev/null +++ b/src/integrations/misc/read-lines.ts @@ -0,0 +1,81 @@ +/** + * credits @BorisChumichev + * + * https://github.com/BorisChumichev/node-nthline + * + * This module extend functionality of reading lines from a file + * Now you can read a range of lines from a file + */ +import { createReadStream } from "fs" +import { createInterface } from "readline" + +const outOfRangeError = (filepath: string, n: number) => { + return new RangeError(`Line with index ${n} does not exist in '${filepath}'. Note that line indexing is zero-based`) +} + +/** + * Reads a range of lines from a file. + * + * @param filepath - Path to the file to read + * @param endLine - Optional. The line number to stop reading at (inclusive). If undefined, reads to the end of file. + * @param startLine - Optional. The line number to start reading from (inclusive). If undefined, starts from line 0. + * @returns Promise resolving to a string containing the read lines joined with newlines + * @throws {RangeError} If line numbers are invalid or out of range + */ +export function readLines(filepath: string, endLine?: number, startLine?: number): Promise { + return new Promise((resolve, reject) => { + // Validate input parameters + // Check startLine validity if provided + if (startLine !== undefined && (startLine < 0 || startLine % 1 !== 0)) { + return reject( + new RangeError(`Invalid startLine: ${startLine}. Line numbers must be non-negative integers.`), + ) + } + + // Check endLine validity if provided + if (endLine !== undefined && (endLine < 0 || endLine % 1 !== 0)) { + return reject(new RangeError(`Invalid endLine: ${endLine}. Line numbers must be non-negative integers.`)) + } + + const effectiveStartLine = startLine === undefined ? 0 : startLine + + // Check startLine and endLine relationship + if (endLine !== undefined && effectiveStartLine > endLine) { + return reject( + new RangeError(`startLine (${effectiveStartLine}) must be less than or equal to endLine (${endLine})`), + ) + } + + let cursor = 0 + const lines: string[] = [] + const input = createReadStream(filepath) + const rl = createInterface({ input }) + + rl.on("line", (line) => { + // Only collect lines within the specified range + if (cursor >= effectiveStartLine && (endLine === undefined || cursor <= endLine)) { + lines.push(line) + } + + // Close stream after reaching to_line (if specified) + if (endLine !== undefined && cursor === endLine) { + rl.close() + input.close() + resolve(lines.join("\n")) + } + + cursor++ + }) + + rl.on("error", reject) + + input.on("end", () => { + // If we collected some lines but didn't reach to_line, return what we have + if (lines.length > 0) { + resolve(lines.join("\n")) + } else { + reject(outOfRangeError(filepath, effectiveStartLine)) + } + }) + }) +} diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index 2a99499a9d..8ca7429176 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -351,15 +351,22 @@ export class McpHub { const stderrStream = transport.stderr if (stderrStream) { stderrStream.on("data", async (data: Buffer) => { - const errorOutput = data.toString() - console.error(`Server "${name}" stderr:`, errorOutput) - const connection = this.connections.find((conn) => conn.server.name === name) - if (connection) { - // NOTE: we do not set server status to "disconnected" because stderr logs do not necessarily mean the server crashed or disconnected, it could just be informational. In fact when the server first starts up, it immediately logs " server running on stdio" to stderr. - this.appendErrorMessage(connection, errorOutput) - // Only need to update webview right away if it's already disconnected - if (connection.server.status === "disconnected") { - await this.notifyWebviewOfServerChanges() + const output = data.toString() + // Check if output contains INFO level log + const isInfoLog = /INFO/i.test(output) + + if (isInfoLog) { + // Log normal informational messages + console.log(`Server "${name}" info:`, output) + } else { + // Treat as error log + console.error(`Server "${name}" stderr:`, output) + const connection = this.connections.find((conn) => conn.server.name === name) + if (connection) { + this.appendErrorMessage(connection, output) + if (connection.server.status === "disconnected") { + await this.notifyWebviewOfServerChanges() + } } } }) diff --git a/src/services/ripgrep/index.ts b/src/services/ripgrep/index.ts index 639317d6f4..89e1da62f8 100644 --- a/src/services/ripgrep/index.ts +++ b/src/services/ripgrep/index.ts @@ -4,6 +4,7 @@ import * as path from "path" import * as fs from "fs" import * as readline from "readline" import { RooIgnoreController } from "../../core/ignore/RooIgnoreController" +import { fileExistsAtPath } from "../../utils/fs" /* This file provides functionality to perform regex searches on files using ripgrep. Inspired by: https://github.com/DiscreteTom/vscode-ripgrep-utils @@ -49,15 +50,21 @@ rel/path/to/helper.ts const isWindows = /^win/.test(process.platform) const binName = isWindows ? "rg.exe" : "rg" -interface SearchResult { +interface SearchFileResult { file: string - line: number - column: number - match: string - beforeContext: string[] - afterContext: string[] + searchResults: SearchResult[] } +interface SearchResult { + lines: SearchLineResult[] +} + +interface SearchLineResult { + line: number + text: string + isMatch: boolean + column?: number +} // Constants const MAX_RESULTS = 300 const MAX_LINE_LENGTH = 500 @@ -71,11 +78,13 @@ const MAX_LINE_LENGTH = 500 export function truncateLine(line: string, maxLength: number = MAX_LINE_LENGTH): string { return line.length > maxLength ? line.substring(0, maxLength) + " [truncated...]" : line } - -async function getBinPath(vscodeAppRoot: string): Promise { +/** + * Get the path to the ripgrep binary within the VSCode installation + */ +export async function getBinPath(vscodeAppRoot: string): Promise { const checkPath = async (pkgFolder: string) => { const fullPath = path.join(vscodeAppRoot, pkgFolder, binName) - return (await pathExists(fullPath)) ? fullPath : undefined + return (await fileExistsAtPath(fullPath)) ? fullPath : undefined } return ( @@ -86,14 +95,6 @@ async function getBinPath(vscodeAppRoot: string): Promise { ) } -async function pathExists(path: string): Promise { - return new Promise((resolve) => { - fs.access(path, (err) => { - resolve(err === null) - }) - }) -} - async function execRipgrep(bin: string, args: string[]): Promise { return new Promise((resolve, reject) => { const rgProcess = childProcess.spawn(bin, args) @@ -157,39 +158,50 @@ export async function regexSearchFiles( console.error("Error executing ripgrep:", error) return "No results found" } - const results: SearchResult[] = [] + + const results: SearchFileResult[] = [] let currentResult: Partial | null = null + let currentFile: SearchFileResult | null = null output.split("\n").forEach((line) => { if (line) { try { const parsed = JSON.parse(line) - if (parsed.type === "match") { - if (currentResult) { - results.push(currentResult as SearchResult) + if (parsed.type === "begin") { + currentFile = { + file: parsed.data.path.text.toString(), + searchResults: [], } - - // Safety check: truncate extremely long lines to prevent excessive output - const matchText = parsed.data.lines.text - const truncatedMatch = truncateLine(matchText) - - currentResult = { - file: parsed.data.path.text, + } else if (parsed.type === "end") { + // Reset the current result when a new file is encountered + results.push(currentFile as SearchFileResult) + currentFile = null + } else if ((parsed.type === "match" || parsed.type === "context") && currentFile) { + const line = { line: parsed.data.line_number, - column: parsed.data.submatches[0].start, - match: truncatedMatch, - beforeContext: [], - afterContext: [], + text: truncateLine(parsed.data.lines.text), + isMatch: parsed.type === "match", + ...(parsed.type === "match" && { column: parsed.data.absolute_offset }), } - } else if (parsed.type === "context" && currentResult) { - // Apply the same truncation logic to context lines - const contextText = parsed.data.lines.text - const truncatedContext = truncateLine(contextText) - if (parsed.data.line_number < currentResult.line!) { - currentResult.beforeContext!.push(truncatedContext) + const lastResult = currentFile.searchResults[currentFile.searchResults.length - 1] + if (lastResult?.lines.length > 0) { + const lastLine = lastResult.lines[lastResult.lines.length - 1] + + // If this line is contiguous with the last result, add to it + if (parsed.data.line_number <= lastLine.line + 1) { + lastResult.lines.push(line) + } else { + // Otherwise create a new result + currentFile.searchResults.push({ + lines: [line], + }) + } } else { - currentResult.afterContext!.push(truncatedContext) + // First line in file + currentFile.searchResults.push({ + lines: [line], + }) } } } catch (error) { @@ -198,9 +210,7 @@ export async function regexSearchFiles( } }) - if (currentResult) { - results.push(currentResult as SearchResult) - } + // console.log(results) // Filter results using RooIgnoreController if provided const filteredResults = rooIgnoreController @@ -210,40 +220,43 @@ export async function regexSearchFiles( return formatResults(filteredResults, cwd) } -function formatResults(results: SearchResult[], cwd: string): string { +function formatResults(fileResults: SearchFileResult[], cwd: string): string { const groupedResults: { [key: string]: SearchResult[] } = {} + let totalResults = fileResults.reduce((sum, file) => sum + file.searchResults.length, 0) let output = "" - if (results.length >= MAX_RESULTS) { + if (totalResults >= MAX_RESULTS) { output += `Showing first ${MAX_RESULTS} of ${MAX_RESULTS}+ results. Use a more specific search if necessary.\n\n` } else { - output += `Found ${results.length === 1 ? "1 result" : `${results.length.toLocaleString()} results`}.\n\n` + output += `Found ${totalResults === 1 ? "1 result" : `${totalResults.toLocaleString()} results`}.\n\n` } // Group results by file name - results.slice(0, MAX_RESULTS).forEach((result) => { - const relativeFilePath = path.relative(cwd, result.file) + fileResults.slice(0, MAX_RESULTS).forEach((file) => { + const relativeFilePath = path.relative(cwd, file.file) if (!groupedResults[relativeFilePath]) { groupedResults[relativeFilePath] = [] + + groupedResults[relativeFilePath].push(...file.searchResults) } - groupedResults[relativeFilePath].push(result) }) for (const [filePath, fileResults] of Object.entries(groupedResults)) { - output += `${filePath.toPosix()}\n│----\n` + output += `# ${filePath.toPosix()}\n` - fileResults.forEach((result, index) => { - const allLines = [...result.beforeContext, result.match, ...result.afterContext] - allLines.forEach((line) => { - output += `│${line?.trimEnd() ?? ""}\n` - }) - - if (index < fileResults.length - 1) { - output += "│----\n" + fileResults.forEach((result) => { + // Only show results with at least one line + if (result.lines.length > 0) { + // Show all lines in the result + result.lines.forEach((line) => { + const lineNumber = String(line.line).padStart(3, " ") + output += `${lineNumber} | ${line.text.trimEnd()}\n` + }) + output += "----\n" } }) - output += "│----\n\n" + output += "\n" } return output.trim() diff --git a/src/services/search/file-search.ts b/src/services/search/file-search.ts new file mode 100644 index 0000000000..b2f9992f49 --- /dev/null +++ b/src/services/search/file-search.ts @@ -0,0 +1,155 @@ +import * as vscode from "vscode" +import * as path from "path" +import * as fs from "fs" +import * as childProcess from "child_process" +import * as readline from "readline" +import { byLengthAsc, Fzf } from "fzf" +import { getBinPath } from "../ripgrep" + +async function executeRipgrepForFiles( + rgPath: string, + workspacePath: string, + limit: number = 5000, +): Promise<{ path: string; type: "file" | "folder"; label?: string }[]> { + return new Promise((resolve, reject) => { + const args = [ + "--files", + "--follow", + "--hidden", + "-g", + "!**/node_modules/**", + "-g", + "!**/.git/**", + "-g", + "!**/out/**", + "-g", + "!**/dist/**", + workspacePath, + ] + + const rgProcess = childProcess.spawn(rgPath, args) + const rl = readline.createInterface({ + input: rgProcess.stdout, + crlfDelay: Infinity, + }) + + const fileResults: { path: string; type: "file" | "folder"; label?: string }[] = [] + const dirSet = new Set() // Track unique directory paths + let count = 0 + + rl.on("line", (line) => { + if (count < limit) { + try { + const relativePath = path.relative(workspacePath, line) + + // Add the file itself + fileResults.push({ + path: relativePath, + type: "file", + label: path.basename(relativePath), + }) + + // Extract and store all parent directory paths + let dirPath = path.dirname(relativePath) + while (dirPath && dirPath !== "." && dirPath !== "/") { + dirSet.add(dirPath) + dirPath = path.dirname(dirPath) + } + + count++ + } catch (error) { + // Silently ignore errors processing individual paths + } + } else { + rl.close() + rgProcess.kill() + } + }) + + let errorOutput = "" + rgProcess.stderr.on("data", (data) => { + errorOutput += data.toString() + }) + + rl.on("close", () => { + if (errorOutput && fileResults.length === 0) { + reject(new Error(`ripgrep process error: ${errorOutput}`)) + } else { + // Convert directory set to array of directory objects + const dirResults = Array.from(dirSet).map((dirPath) => ({ + path: dirPath, + type: "folder" as const, + label: path.basename(dirPath), + })) + + // Combine files and directories and resolve + resolve([...fileResults, ...dirResults]) + } + }) + + rgProcess.on("error", (error) => { + reject(new Error(`ripgrep process error: ${error.message}`)) + }) + }) +} + +export async function searchWorkspaceFiles( + query: string, + workspacePath: string, + limit: number = 20, +): Promise<{ path: string; type: "file" | "folder"; label?: string }[]> { + try { + const vscodeAppRoot = vscode.env.appRoot + const rgPath = await getBinPath(vscodeAppRoot) + + if (!rgPath) { + throw new Error("Could not find ripgrep binary") + } + + // Get all files and directories (from our modified function) + const allItems = await executeRipgrepForFiles(rgPath, workspacePath, 5000) + + // If no query, just return the top items + if (!query.trim()) { + return allItems.slice(0, limit) + } + + // Create search items for all files AND directories + const searchItems = allItems.map((item) => ({ + original: item, + searchStr: `${item.path} ${item.label || ""}`, + })) + + // Run fzf search on all items + const fzf = new Fzf(searchItems, { + selector: (item) => item.searchStr, + tiebreakers: [byLengthAsc], + limit: limit, + }) + + // Get all matching results from fzf + const fzfResults = fzf.find(query).map((result) => result.item.original) + + // Verify types of the shortest results + const verifiedResults = await Promise.all( + fzfResults.map(async (result) => { + const fullPath = path.join(workspacePath, result.path) + // Verify if the path exists and is actually a directory + if (fs.existsSync(fullPath)) { + const isDirectory = fs.lstatSync(fullPath).isDirectory() + return { + ...result, + type: isDirectory ? ("folder" as const) : ("file" as const), + } + } + // If path doesn't exist, keep original type + return result + }), + ) + + return verifiedResults + } catch (error) { + console.error("Error in searchWorkspaceFiles:", error) + return [] + } +} diff --git a/src/services/tree-sitter/__tests__/index.test.ts b/src/services/tree-sitter/__tests__/index.test.ts index 8372e7e580..bc506c031d 100644 --- a/src/services/tree-sitter/__tests__/index.test.ts +++ b/src/services/tree-sitter/__tests__/index.test.ts @@ -49,6 +49,10 @@ describe("Tree-sitter Service", () => { node: { startPosition: { row: 0 }, endPosition: { row: 0 }, + parent: { + startPosition: { row: 0 }, + endPosition: { row: 0 }, + }, }, name: "name.definition", }, @@ -85,6 +89,10 @@ describe("Tree-sitter Service", () => { node: { startPosition: { row: 0 }, endPosition: { row: 0 }, + parent: { + startPosition: { row: 0 }, + endPosition: { row: 0 }, + }, }, name: "name.definition.class", }, @@ -92,6 +100,10 @@ describe("Tree-sitter Service", () => { node: { startPosition: { row: 2 }, endPosition: { row: 2 }, + parent: { + startPosition: { row: 0 }, + endPosition: { row: 0 }, + }, }, name: "name.definition.function", }, @@ -187,6 +199,10 @@ describe("Tree-sitter Service", () => { node: { startPosition: { row: 0 }, endPosition: { row: 0 }, + parent: { + startPosition: { row: 0 }, + endPosition: { row: 0 }, + }, }, name: "name", }, @@ -231,6 +247,10 @@ describe("Tree-sitter Service", () => { node: { startPosition: { row: 0 }, endPosition: { row: 0 }, + parent: { + startPosition: { row: 0 }, + endPosition: { row: 0 }, + }, }, name: "name", }, diff --git a/src/services/tree-sitter/index.ts b/src/services/tree-sitter/index.ts index 9aaa672ce2..138e41c2a9 100644 --- a/src/services/tree-sitter/index.ts +++ b/src/services/tree-sitter/index.ts @@ -5,6 +5,62 @@ import { LanguageParser, loadRequiredLanguageParsers } from "./languageParser" import { fileExistsAtPath } from "../../utils/fs" import { RooIgnoreController } from "../../core/ignore/RooIgnoreController" +const extensions = [ + "js", + "jsx", + "ts", + "tsx", + "py", + // Rust + "rs", + "go", + // C + "c", + "h", + // C++ + "cpp", + "hpp", + // C# + "cs", + // Ruby + "rb", + "java", + "php", + "swift", + // Kotlin + "kt", + "kts", +].map((e) => `.${e}`) + +export async function parseSourceCodeDefinitionsForFile( + filePath: string, + rooIgnoreController?: RooIgnoreController, +): Promise { + // check if the file exists + const fileExists = await fileExistsAtPath(path.resolve(filePath)) + if (!fileExists) { + return "This file does not exist or you do not have permission to access it." + } + + // Get file extension to determine parser + const ext = path.extname(filePath).toLowerCase() + // Check if the file extension is supported + if (!extensions.includes(ext)) { + return undefined + } + + // Load parser for this file type + const languageParsers = await loadRequiredLanguageParsers([filePath]) + + // Parse the file if we have a parser for it + const definitions = await parseFile(filePath, languageParsers, rooIgnoreController) + if (definitions) { + return `${path.basename(filePath)}\n${definitions}` + } + + return undefined +} + // TODO: implement caching behavior to avoid having to keep analyzing project for new tasks. export async function parseSourceCodeForDefinitionsTopLevel( dirPath: string, @@ -58,32 +114,6 @@ export async function parseSourceCodeForDefinitionsTopLevel( } function separateFiles(allFiles: string[]): { filesToParse: string[]; remainingFiles: string[] } { - const extensions = [ - "js", - "jsx", - "ts", - "tsx", - "py", - // Rust - "rs", - "go", - // C - "c", - "h", - // C++ - "cpp", - "hpp", - // C# - "cs", - // Ruby - "rb", - "java", - "php", - "swift", - // Kotlin - "kt", - "kts", - ].map((e) => `.${e}`) const filesToParse = allFiles.filter((file) => extensions.includes(path.extname(file))).slice(0, 50) // 50 files max const remainingFiles = allFiles.filter((file) => !filesToParse.includes(file)) return { filesToParse, remainingFiles } @@ -105,17 +135,29 @@ This approach allows us to focus on the most relevant parts of the code (defined - https://github.com/tree-sitter/tree-sitter/blob/master/lib/binding_web/test/helper.js - https://tree-sitter.github.io/tree-sitter/code-navigation-systems */ +/** + * Parse a file and extract code definitions using tree-sitter + * + * @param filePath - Path to the file to parse + * @param languageParsers - Map of language parsers + * @param rooIgnoreController - Optional controller to check file access permissions + * @returns A formatted string with code definitions or null if no definitions found + */ async function parseFile( filePath: string, languageParsers: LanguageParser, rooIgnoreController?: RooIgnoreController, ): Promise { + // Check if we have permission to access this file if (rooIgnoreController && !rooIgnoreController.validateAccess(filePath)) { return null } + + // Read file content const fileContent = await fs.readFile(filePath, "utf8") const ext = path.extname(filePath).toLowerCase().slice(1) + // Check if we have a parser for this file type const { parser, query } = languageParsers[ext] || {} if (!parser || !query) { return `Unsupported file type: ${filePath}` @@ -124,13 +166,21 @@ async function parseFile( let formattedOutput = "" try { - // Parse the file content into an Abstract Syntax Tree (AST), a tree-like representation of the code + // Parse the file content into an Abstract Syntax Tree (AST) const tree = parser.parse(fileContent) // Apply the query to the AST and get the captures - // Captures are specific parts of the AST that match our query patterns, each capture represents a node in the AST that we're interested in. const captures = query.captures(tree.rootNode) + // No definitions found + if (captures.length === 0) { + return null + } + + // Add a header with file information and definition count + // Make sure to normalize path separators to forward slashes for consistency + formattedOutput += `// File: ${path.basename(filePath).replace(/\\/g, "/")} (${captures.length} definitions)\n` + // Sort captures by their start position captures.sort((a, b) => a.node.startPosition.row - b.node.startPosition.row) @@ -140,38 +190,102 @@ async function parseFile( // Keep track of the last line we've processed let lastLine = -1 + // Track already processed lines to avoid duplicates + const processedLines = new Set() + + // Track definition types for better categorization + const definitions = { + classes: [], + functions: [], + methods: [], + variables: [], + other: [], + } + + // First pass - categorize captures by type captures.forEach((capture) => { const { node, name } = capture - // Get the start and end lines of the current AST node - const startLine = node.startPosition.row - const endLine = node.endPosition.row - // Once we've retrieved the nodes we care about through the language query, we filter for lines with definition names only. - // name.startsWith("name.reference.") > refs can be used for ranking purposes, but we don't need them for the output - // previously we did `name.startsWith("name.definition.")` but this was too strict and excluded some relevant definitions + + // Skip captures that don't represent definitions + if (!name.includes("definition") && !name.includes("name")) { + return + } + + // Get the parent node that contains the full definition + const definitionNode = name.includes("name") ? node.parent : node + if (!definitionNode) return + + // Get the start and end lines of the full definition and also the node's own line + const startLine = definitionNode.startPosition.row + const endLine = definitionNode.endPosition.row + const nodeLine = node.startPosition.row + + // Create unique keys for definition lines + const lineKey = `${startLine}-${lines[startLine]}` + const nodeLineKey = `${nodeLine}-${lines[nodeLine]}` // Add separator if there's a gap between captures if (lastLine !== -1 && startLine > lastLine + 1) { - formattedOutput += "|----\n" + formattedOutput += "|| ||----\n" } - // Only add the first line of the definition - // query captures includes the definition name and the definition implementation, but we only want the name (I found discrepencies in the naming structure for various languages, i.e. javascript names would be 'name' and typescript names would be 'name.definition) - if (name.includes("name") && lines[startLine]) { - formattedOutput += `│${lines[startLine]}\n` + + // Always show the class definition line + if (name.includes("class") || (name.includes("name") && name.includes("class"))) { + if (!processedLines.has(lineKey)) { + formattedOutput += `│| ${startLine} - ${endLine} ||${lines[startLine]}\n` + processedLines.add(lineKey) + } + } + + // Always show method/function definitions + // This is crucial for the test case that checks for "testMethod()" + if (name.includes("function") || name.includes("method")) { + // For function definitions, we need to show the actual line with the function/method name + // This handles the test case mocks where nodeLine is 2 (for "testMethod()") + if (!processedLines.has(nodeLineKey) && lines[nodeLine]) { + formattedOutput += `│| ${nodeLine} - ${node.endPosition.row} ||${lines[nodeLine]}\n` + processedLines.add(nodeLineKey) + } + } + + // Handle variable and other named definitions + if ( + name.includes("name") && + !name.includes("class") && + !name.includes("function") && + !name.includes("method") + ) { + if (!processedLines.has(lineKey)) { + formattedOutput += `│| ${startLine} - ${endLine} ||${lines[startLine]}\n` + processedLines.add(lineKey) + } } - // Adds all the captured lines - // for (let i = startLine; i <= endLine; i++) { - // formattedOutput += `│${lines[i]}\n` - // } - //} lastLine = endLine }) } catch (error) { console.log(`Error parsing file: ${error}\n`) + // Return null on parsing error to avoid showing error messages in the output + return null } if (formattedOutput.length > 0) { - return `|----\n${formattedOutput}|----\n` + // Create categorized summary of definitions + const classCount = formattedOutput.split("class").length - 1 + const functionCount = + formattedOutput.split("function").length - 1 + (formattedOutput.split("method").length - 1) + const variableCount = + formattedOutput.split("const").length - + 1 + + formattedOutput.split("let").length - + 1 + + formattedOutput.split("var").length - + 1 + + // Add a footer with a summary of definitions + const summary = `// Summary: ${classCount > 0 ? `${classCount} classes, ` : ""}${functionCount > 0 ? `${functionCount} functions/methods, ` : ""}${variableCount > 0 ? `${variableCount} variables` : ""}` + + return `|----\n${formattedOutput}|----\n${summary}\n` } return null } diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index f40eadb84c..b7219de2f8 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -56,6 +56,8 @@ export interface ExtensionMessage { | "remoteBrowserEnabled" | "ttsStart" | "ttsStop" + | "maxReadFileLine" + | "fileSearchResults" text?: string action?: | "chatButtonClicked" @@ -92,6 +94,12 @@ export interface ExtensionMessage { values?: Record requestId?: string promptText?: string + results?: Array<{ + path: string + type: "file" | "folder" + label?: string + }> + error?: string } export interface ApiConfigMeta { @@ -159,6 +167,7 @@ export interface ExtensionState { machineId?: string showRooIgnoredFiles: boolean // Whether to show .rooignore'd files in listings renderContext: "sidebar" | "editor" + maxReadFileLine: number // Maximum number of lines to read from a file before truncating } export type { ClineMessage, ClineAsk, ClineSay } diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 67272adc0f..d87be2a716 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -114,6 +114,8 @@ export interface WebviewMessage { | "browserConnectionResult" | "remoteBrowserEnabled" | "language" + | "maxReadFileLine" + | "searchFiles" text?: string disabled?: boolean askResponse?: ClineAskResponse diff --git a/src/shared/__tests__/context-mentions.test.ts b/src/shared/__tests__/context-mentions.test.ts deleted file mode 100644 index 99bad21ebb..0000000000 --- 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/api.ts b/src/shared/api.ts index 1bc432157b..498bb922b8 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -17,6 +17,7 @@ export type ApiProvider = | "unbound" | "requesty" | "human-relay" + | "fake-ai" export interface ApiHandlerOptions { apiModelId?: string @@ -76,6 +77,7 @@ export interface ApiHandlerOptions { modelTemperature?: number | null modelMaxTokens?: number modelMaxThinkingTokens?: number + fakeAi?: unknown } export type ApiConfiguration = ApiHandlerOptions & { @@ -134,6 +136,7 @@ export const API_CONFIG_KEYS: GlobalStateKey[] = [ "modelTemperature", "modelMaxTokens", "modelMaxThinkingTokens", + "fakeAi", ] // Models @@ -171,7 +174,7 @@ export const anthropicModels = { thinking: true, }, "claude-3-7-sonnet-20250219": { - maxTokens: 16_384, + maxTokens: 8192, contextWindow: 200_000, supportsImages: true, supportsComputerUse: true, @@ -664,7 +667,7 @@ export const vertexModels = { thinking: true, }, "claude-3-7-sonnet@20250219": { - maxTokens: 16_384, + maxTokens: 8192, contextWindow: 200_000, supportsImages: true, supportsComputerUse: true, diff --git a/src/shared/checkExistApiConfig.ts b/src/shared/checkExistApiConfig.ts index 77b58fa31f..5246e954ab 100644 --- a/src/shared/checkExistApiConfig.ts +++ b/src/shared/checkExistApiConfig.ts @@ -4,8 +4,8 @@ import { SECRET_KEYS } from "./globalState" export function checkExistKey(config: ApiConfiguration | undefined) { if (!config) return false - // Special case for human-relay provider which doesn't need any configuration - if (config.apiProvider === "human-relay") { + // Special case for human-relay and fake-ai providers which don't need any configuration + if (config.apiProvider === "human-relay" || config.apiProvider === "fake-ai") { return true } diff --git a/src/shared/context-mentions.ts b/src/shared/context-mentions.ts index ddfc6650f5..915114ab93 100644 --- a/src/shared/context-mentions.ts +++ b/src/shared/context-mentions.ts @@ -1,90 +1,57 @@ /* +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. + - **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. - 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) +- **Global Regex**: + - `mentionRegexGlobal`: Creates a global version of the `mentionRegex` to find all matches within a given string. - 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 - - 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 - - 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 - -- **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" diff --git a/src/shared/globalState.ts b/src/shared/globalState.ts index 4331effce9..5896bee9cd 100644 --- a/src/shared/globalState.ts +++ b/src/shared/globalState.ts @@ -122,6 +122,8 @@ export const GLOBAL_STATE_KEYS = [ "remoteBrowserEnabled", "language", "maxWorkspaceFiles", + "maxReadFileLine", + "fakeAi", ] as const export const PASS_THROUGH_STATE_KEYS = ["taskHistory"] as const diff --git a/src/utils/xml.ts b/src/utils/xml.ts new file mode 100644 index 0000000000..8ccd6e77ae --- /dev/null +++ b/src/utils/xml.ts @@ -0,0 +1,30 @@ +import { XMLParser } from "fast-xml-parser" + +/** + * Parses an XML string into a JavaScript object + * @param xmlString The XML string to parse + * @returns Parsed JavaScript object representation of the XML + * @throws Error if the XML is invalid or parsing fails + */ +export function parseXml(xmlString: string, stopNodes?: string[]): unknown { + const _stopNodes = stopNodes ?? [] + try { + const parser = new XMLParser({ + // Preserve attribute types (don't convert numbers/booleans) + ignoreAttributes: false, + attributeNamePrefix: "@_", + // Parse numbers and booleans in text nodes + parseAttributeValue: true, + parseTagValue: true, + // Trim whitespace from text nodes + trimValues: true, + stopNodes: _stopNodes, + }) + + return parser.parse(xmlString) + } catch (error) { + // Enhance error message for better debugging + const errorMessage = error instanceof Error ? error.message : "Unknown error" + throw new Error(`Failed to parse XML: ${errorMessage}`) + } +} diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx index 09e8d7f417..0653105399 100644 --- a/webview-ui/src/components/chat/Announcement.tsx +++ b/webview-ui/src/components/chat/Announcement.tsx @@ -65,11 +65,10 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {

{t("chat:announcement.whatsNew")}

    -
  • • {t("chat:announcement.feature1")}
  • -
  • • {t("chat:announcement.feature2")}
  • -
  • • {t("chat:announcement.feature3")}
  • -
  • • {t("chat:announcement.feature4")}
  • -
  • • {t("chat:announcement.feature5")}
  • + {[1, 2, 3, 4, 5].map((num) => { + const feature = t(`chat:announcement.feature${num}`) + return feature ?
  • • {feature}
  • : null + })}
diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index a0b5814376..3f7d174b49 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -23,6 +23,7 @@ import McpResourceRow from "../mcp/McpResourceRow" import McpToolRow from "../mcp/McpToolRow" import { highlightMentions } from "./TaskHeader" import { CheckpointSaved } from "./checkpoints/CheckpointSaved" +import FollowUpSuggest from "./FollowUpSuggest" interface ChatRowProps { message: ClineMessage @@ -32,6 +33,7 @@ interface ChatRowProps { isStreaming: boolean onToggleExpand: () => void onHeightChange: (isTaller: boolean) => void + onSuggestionClick?: (answer: string) => void } interface ChatRowContentProps extends Omit {} @@ -78,6 +80,7 @@ export const ChatRowContent = ({ isLast, isStreaming, onToggleExpand, + onSuggestionClick, }: ChatRowContentProps) => { const { t } = useTranslation() const { mcpServers, alwaysAllowMcp, currentCheckpoint } = useExtensionState() @@ -248,6 +251,13 @@ export const ChatRowContent = ({ return null }, [message.ask, message.say, message.text]) + const followUpData = useMemo(() => { + if (message.type === "ask" && message.ask === "followup" && message.partial === false) { + return JSON.parse(message.text || "{}") + } + return null + }, [message.type, message.ask, message.partial, message.text]) + if (tool) { const toolIcon = (name: string) => ( )} -
- +
+
+ ) default: diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 137d16cb00..b0b6362fce 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -16,6 +16,7 @@ import { insertMention, removeMention, shouldShowContextMenu, + SearchResult, } from "@/utils/context-mentions" import { convertToMentionPath } from "@/utils/path-mentions" import { SelectDropdown, DropdownOptionType, Button } from "@/components/ui" @@ -64,6 +65,9 @@ const ChatTextArea = forwardRef( const { filePaths, openedTabs, currentApiConfigName, listApiConfigMeta, customModes, cwd } = useExtensionState() const [gitCommits, setGitCommits] = useState([]) const [showDropdown, setShowDropdown] = useState(false) + const [fileSearchResults, setFileSearchResults] = useState([]) + const [searchLoading, setSearchLoading] = useState(false) + const [searchRequestId, setSearchRequestId] = useState("") // Close dropdown when clicking outside. useEffect(() => { @@ -76,7 +80,7 @@ const ChatTextArea = forwardRef( return () => document.removeEventListener("mousedown", handleClickOutside) }, [showDropdown]) - // Handle enhanced prompt response. + // Handle enhanced prompt response and search results. useEffect(() => { const messageHandler = (event: MessageEvent) => { const message = event.data @@ -97,12 +101,17 @@ const ChatTextArea = forwardRef( })) setGitCommits(commits) + } else if (message.type === "fileSearchResults") { + setSearchLoading(false) + if (message.requestId === searchRequestId) { + setFileSearchResults(message.results || []) + } } } window.addEventListener("message", messageHandler) return () => window.removeEventListener("message", messageHandler) - }, [setInputValue]) + }, [setInputValue, searchRequestId]) const [thumbnailsHeight, setThumbnailsHeight] = useState(0) const [textAreaBaseHeight, setTextAreaBaseHeight] = useState(undefined) @@ -275,6 +284,7 @@ const ChatTextArea = forwardRef( searchQuery, selectedType, queryItems, + fileSearchResults, getAllModes(customModes), ) const optionsLength = options.length @@ -310,6 +320,7 @@ const ChatTextArea = forwardRef( searchQuery, selectedType, queryItems, + fileSearchResults, getAllModes(customModes), )[selectedMenuIndex] if ( @@ -378,6 +389,7 @@ const ChatTextArea = forwardRef( justDeletedSpaceAfterMention, queryItems, customModes, + fileSearchResults, ], ) @@ -387,6 +399,8 @@ const ChatTextArea = forwardRef( setIntendedCursorPosition(null) // Reset the state. } }, [inputValue, intendedCursorPosition]) + // Ref to store the search timeout + const searchTimeoutRef = useRef(null) const handleInputChange = useCallback( (e: React.ChangeEvent) => { @@ -408,8 +422,32 @@ const ChatTextArea = forwardRef( const lastAtIndex = newValue.lastIndexOf("@", newCursorPosition - 1) const query = newValue.slice(lastAtIndex + 1, newCursorPosition) setSearchQuery(query) + + // Send file search request if query is not empty if (query.length > 0) { setSelectedMenuIndex(0) + // Don't clear results until we have new ones + // This prevents flickering + + // Clear any existing timeout + if (searchTimeoutRef.current) { + clearTimeout(searchTimeoutRef.current) + } + + // Set a timeout to debounce the search requests + searchTimeoutRef.current = setTimeout(() => { + // Generate a request ID for this search + const reqId = Math.random().toString(36).substring(2, 9) + setSearchRequestId(reqId) + setSearchLoading(true) + + // Send message to extension to search files + vscode.postMessage({ + type: "searchFiles", + query: query, + requestId: reqId, + }) + }, 200) // 200ms debounce } else { setSelectedMenuIndex(3) // Set to "File" option by default } @@ -417,9 +455,10 @@ const ChatTextArea = forwardRef( } else { setSearchQuery("") setSelectedMenuIndex(-1) + setFileSearchResults([]) // Clear file search results } }, - [setInputValue], + [setInputValue, setSearchRequestId, setFileSearchResults, setSearchLoading], ) useEffect(() => { @@ -675,6 +714,8 @@ const ChatTextArea = forwardRef( selectedType={selectedType} queryItems={queryItems} modes={getAllModes(customModes)} + loading={searchLoading} + dynamicSearchResults={fileSearchResults} />
)} diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 996c3cdf9e..554e8ac0e3 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -1013,6 +1013,9 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie isLast={index === groupedMessages.length - 1} onHeightChange={handleRowHeightChange} isStreaming={isStreaming} + onSuggestionClick={(answer: string) => { + handleSendMessage(answer, []) + }} /> ) }, @@ -1023,6 +1026,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie handleRowHeightChange, isStreaming, toggleRowExpansion, + handleSendMessage, ], ) diff --git a/webview-ui/src/components/chat/ContextMenu.tsx b/webview-ui/src/components/chat/ContextMenu.tsx index 20bd5222f6..5d2df631db 100644 --- a/webview-ui/src/components/chat/ContextMenu.tsx +++ b/webview-ui/src/components/chat/ContextMenu.tsx @@ -1,5 +1,10 @@ import React, { useEffect, useMemo, useRef } from "react" -import { ContextMenuOptionType, ContextMenuQueryItem, getContextMenuOptions } from "../../utils/context-mentions" +import { + ContextMenuOptionType, + ContextMenuQueryItem, + getContextMenuOptions, + SearchResult, +} from "../../utils/context-mentions" import { removeLeadingNonAlphanumeric } from "../common/CodeAccordian" import { ModeConfig } from "../../../../src/shared/modes" @@ -12,6 +17,8 @@ interface ContextMenuProps { selectedType: ContextMenuOptionType | null queryItems: ContextMenuQueryItem[] modes?: ModeConfig[] + loading?: boolean // New loading prop + dynamicSearchResults?: SearchResult[] // New dynamic search results prop } const ContextMenu: React.FC = ({ @@ -23,13 +30,14 @@ const ContextMenu: React.FC = ({ selectedType, queryItems, modes, + loading = false, + dynamicSearchResults = [], }) => { const menuRef = useRef(null) - const filteredOptions = useMemo( - () => getContextMenuOptions(searchQuery, selectedType, queryItems, modes), - [searchQuery, selectedType, queryItems, modes], - ) + const filteredOptions = useMemo(() => { + return getContextMenuOptions(searchQuery, selectedType, queryItems, dynamicSearchResults, modes) + }, [searchQuery, selectedType, queryItems, dynamicSearchResults, modes]) useEffect(() => { if (menuRef.current) { @@ -175,71 +183,85 @@ const ContextMenu: React.FC = ({ maxHeight: "200px", overflowY: "auto", }}> - {filteredOptions.map((option, index) => ( -
isOptionSelectable(option) && onSelect(option.type, option.value)} - style={{ - padding: "8px 12px", - cursor: isOptionSelectable(option) ? "pointer" : "default", - color: "var(--vscode-dropdown-foreground)", - borderBottom: "1px solid var(--vscode-editorGroup-border)", - display: "flex", - alignItems: "center", - justifyContent: "space-between", - ...(index === selectedIndex && isOptionSelectable(option) - ? { - backgroundColor: "var(--vscode-list-activeSelectionBackground)", - color: "var(--vscode-list-activeSelectionForeground)", - } - : {}), - }} - onMouseEnter={() => isOptionSelectable(option) && setSelectedIndex(index)}> + {filteredOptions && filteredOptions.length > 0 ? ( + filteredOptions.map((option, index) => (
isOptionSelectable(option) && onSelect(option.type, option.value)} style={{ + padding: "8px 12px", + cursor: isOptionSelectable(option) ? "pointer" : "default", + color: "var(--vscode-dropdown-foreground)", + borderBottom: "1px solid var(--vscode-editorGroup-border)", display: "flex", alignItems: "center", - flex: 1, - minWidth: 0, - overflow: "hidden", - paddingTop: 0, - }}> - {option.type !== ContextMenuOptionType.Mode && getIconForOption(option) && ( + justifyContent: "space-between", + ...(index === selectedIndex && isOptionSelectable(option) + ? { + backgroundColor: "var(--vscode-list-activeSelectionBackground)", + color: "var(--vscode-list-activeSelectionForeground)", + } + : {}), + }} + onMouseEnter={() => isOptionSelectable(option) && setSelectedIndex(index)}> +
+ {option.type !== ContextMenuOptionType.Mode && getIconForOption(option) && ( + + )} + {renderOptionContent(option)} +
+ {(option.type === ContextMenuOptionType.File || + option.type === ContextMenuOptionType.Folder || + option.type === ContextMenuOptionType.Git) && + !option.value && ( + + )} + {(option.type === ContextMenuOptionType.Problems || + option.type === ContextMenuOptionType.Terminal || + ((option.type === ContextMenuOptionType.File || + option.type === ContextMenuOptionType.Folder || + option.type === ContextMenuOptionType.OpenedFile || + option.type === ContextMenuOptionType.Git) && + option.value)) && ( - )} - {renderOptionContent(option)} -
- {(option.type === ContextMenuOptionType.File || - option.type === ContextMenuOptionType.Folder || - option.type === ContextMenuOptionType.Git) && - !option.value && ( - )} - {(option.type === ContextMenuOptionType.Problems || - option.type === ContextMenuOptionType.Terminal || - ((option.type === ContextMenuOptionType.File || - option.type === ContextMenuOptionType.Folder || - option.type === ContextMenuOptionType.OpenedFile || - option.type === ContextMenuOptionType.Git) && - option.value)) && ( - - )} +
+ )) + ) : ( +
+ No results found
- ))} + )} ) diff --git a/webview-ui/src/components/chat/FollowUpSuggest.tsx b/webview-ui/src/components/chat/FollowUpSuggest.tsx new file mode 100644 index 0000000000..76aa32c7fb --- /dev/null +++ b/webview-ui/src/components/chat/FollowUpSuggest.tsx @@ -0,0 +1,45 @@ +import { useCallback } from "react" +import { cn } from "../../lib/utils" +import { Button } from "../ui/button" + +interface FollowUpSuggestProps { + suggestions?: string[] + onSuggestionClick?: (answer: string) => void + ts: number +} + +const FollowUpSuggest = ({ suggestions = [], onSuggestionClick, ts = 1 }: FollowUpSuggestProps) => { + const handleSuggestionClick = useCallback( + (suggestion: string) => { + onSuggestionClick?.(suggestion) + }, + [onSuggestionClick], + ) + + // Don't render if there are no suggestions or no click handler + if (!suggestions?.length || !onSuggestionClick) { + return null + } + + return ( +
+
+
+ {suggestions.map((suggestion) => ( +
+ +
+ ))} +
+
+
+ ) +} + +export default FollowUpSuggest diff --git a/webview-ui/src/components/common/TelemetryBanner.tsx b/webview-ui/src/components/common/TelemetryBanner.tsx index ee3a993f34..8d96359aca 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/components/settings/ContextManagementSettings.tsx b/webview-ui/src/components/settings/ContextManagementSettings.tsx index 8493ea2627..947ba7382c 100644 --- a/webview-ui/src/components/settings/ContextManagementSettings.tsx +++ b/webview-ui/src/components/settings/ContextManagementSettings.tsx @@ -14,7 +14,10 @@ type ContextManagementSettingsProps = HTMLAttributes & { maxOpenTabsContext: number maxWorkspaceFiles: number showRooIgnoredFiles?: boolean - setCachedStateField: SetCachedStateField<"maxOpenTabsContext" | "maxWorkspaceFiles" | "showRooIgnoredFiles"> + maxReadFileLine?: number + setCachedStateField: SetCachedStateField< + "maxOpenTabsContext" | "maxWorkspaceFiles" | "showRooIgnoredFiles" | "maxReadFileLine" + > } export const ContextManagementSettings = ({ @@ -22,6 +25,7 @@ export const ContextManagementSettings = ({ maxWorkspaceFiles, showRooIgnoredFiles, setCachedStateField, + maxReadFileLine, className, ...props }: ContextManagementSettingsProps) => { @@ -87,6 +91,26 @@ export const ContextManagementSettings = ({ {t("settings:contextManagement.rooignore.description")} + +
+
+ {t("settings:contextManagement.maxReadFile.label")} +
+ setCachedStateField("maxReadFileLine", value)} + data-testid="max-read-file-line-slider" + /> + {maxReadFileLine ?? 450} +
+
+
+ {t("settings:contextManagement.maxReadFile.description")} +
+
) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 10112d8924..e2a5c6f25b 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -131,6 +131,7 @@ const SettingsView = forwardRef(({ onDone }, writeDelayMs, showRooIgnoredFiles, remoteBrowserEnabled, + maxReadFileLine, } = cachedState // Make sure apiConfiguration is initialized and managed by SettingsView. @@ -236,6 +237,7 @@ const SettingsView = forwardRef(({ onDone }, vscode.postMessage({ type: "maxOpenTabsContext", value: maxOpenTabsContext }) vscode.postMessage({ type: "maxWorkspaceFiles", value: maxWorkspaceFiles ?? 200 }) vscode.postMessage({ type: "showRooIgnoredFiles", bool: showRooIgnoredFiles }) + vscode.postMessage({ type: "maxReadFileLine", value: maxReadFileLine ?? 500 }) vscode.postMessage({ type: "currentApiConfigName", text: currentApiConfigName }) vscode.postMessage({ type: "updateExperimental", values: experiments }) vscode.postMessage({ type: "alwaysAllowModeSwitch", bool: alwaysAllowModeSwitch }) @@ -452,6 +454,7 @@ const SettingsView = forwardRef(({ onDone }, maxWorkspaceFiles={maxWorkspaceFiles ?? 200} showRooIgnoredFiles={showRooIgnoredFiles} setCachedStateField={setCachedStateField} + maxReadFileLine={maxReadFileLine} /> diff --git a/webview-ui/src/components/ui/command.tsx b/webview-ui/src/components/ui/command.tsx index 033ec38571..b69e8e53a9 100644 --- a/webview-ui/src/components/ui/command.tsx +++ b/webview-ui/src/components/ui/command.tsx @@ -108,9 +108,10 @@ const CommandItem = React.forwardRef< svg]:size-4 [&>svg]:shrink-0 active:opacity-90", + "relative flex select-none items-center gap-2 px-2 py-1.5 outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0", "focus:bg-vscode-list-activeSelectionBackground focus:text-vscode-list-activeSelectionForeground", + "text-vscode-dropdown-foreground text-sm", + "rounded-xs active:opacity-90 cursor-pointer", inset && "pl-8", className, )} diff --git a/webview-ui/src/components/ui/hooks/useOpenRouterModelProviders.ts b/webview-ui/src/components/ui/hooks/useOpenRouterModelProviders.ts index fefeaf7339..0a069a1102 100644 --- a/webview-ui/src/components/ui/hooks/useOpenRouterModelProviders.ts +++ b/webview-ui/src/components/ui/hooks/useOpenRouterModelProviders.ts @@ -75,7 +75,7 @@ async function getOpenRouterProvidersForModel(modelId: string) { modelInfo.supportsPromptCache = true modelInfo.cacheWritesPrice = 3.75 modelInfo.cacheReadsPrice = 0.3 - modelInfo.maxTokens = id === "anthropic/claude-3.7-sonnet:thinking" ? 64_000 : 16_384 + modelInfo.maxTokens = id === "anthropic/claude-3.7-sonnet:thinking" ? 64_000 : 8192 break case modelId.startsWith("anthropic/claude-3.5-sonnet-20240620"): modelInfo.supportsPromptCache = true diff --git a/webview-ui/src/components/ui/select.tsx b/webview-ui/src/components/ui/select.tsx index 56b9378a2e..6e8bcb612e 100644 --- a/webview-ui/src/components/ui/select.tsx +++ b/webview-ui/src/components/ui/select.tsx @@ -89,9 +89,10 @@ function SelectItem({ className, children, ...props }: React.ComponentProps diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 6d3ade317e..389592fa27 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -78,6 +78,8 @@ export interface ExtensionStateContextType extends ExtensionState { setTelemetrySetting: (value: TelemetrySetting) => void remoteBrowserEnabled?: boolean setRemoteBrowserEnabled: (value: boolean) => void + maxReadFileLine: number + setMaxReadFileLine: (value: number) => void machineId?: string } @@ -153,6 +155,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode telemetrySetting: "unset", showRooIgnoredFiles: true, // Default to showing .rooignore'd files with lock symbol (current behavior). renderContext: "sidebar", + maxReadFileLine: 500, // Default max read file line limit }) const [didHydrateState, setDidHydrateState] = useState(false) @@ -302,6 +305,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode setTelemetrySetting: (value) => setState((prevState) => ({ ...prevState, telemetrySetting: value })), setShowRooIgnoredFiles: (value) => setState((prevState) => ({ ...prevState, showRooIgnoredFiles: value })), setRemoteBrowserEnabled: (value) => setState((prevState) => ({ ...prevState, remoteBrowserEnabled: value })), + setMaxReadFileLine: (value) => setState((prevState) => ({ ...prevState, maxReadFileLine: value })), } return {children} diff --git a/webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx b/webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx index 34f69f4073..b98137fe99 100644 --- a/webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx +++ b/webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx @@ -203,6 +203,7 @@ describe("mergeExtensionState", () => { telemetrySetting: "unset", showRooIgnoredFiles: true, renderContext: "sidebar", + maxReadFileLine: 500, } const prevState: ExtensionState = { diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 3c345275d4..2c06a9a2d1 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}s" }, "announcement": { - "title": "🎉 Roo Code 3.9 publicat", - "description": "Roo Code s'ha tornat internacional a la versió 3.9!", + "title": "🎉 Roo Code 3.10 publicat", + "description": "Roo Code 3.10 aporta potents millores de productivitat!", "whatsNew": "Novetats", - "feature1": "Traduccions per a 14 idiomes", - "feature2": "MCP sobre SSE", - "feature3": "Eliminació en lot de l'historial de tasques", - "feature4": "Text a veu", - "feature5": "Selecció de proveïdor OpenRouter", + "feature1": "Respostes suggerides a les preguntes", + "feature2": "Millora en la gestió de fitxers grans", + "feature3": "Reconstrucció de les cerques de fitxers amb @-menció", + "feature4": "", + "feature5": "", "hideButton": "Amagar anunci", "detailsDiscussLinks": "Obté més detalls i participa a Discord i Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 70382c77b8..571da595eb 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "Mostrar fitxers .rooignore en llistes i cerques", "description": "Quan està habilitat, els fitxers que coincideixen amb els patrons a .rooignore es mostraran en llistes amb un símbol de cadenat. Quan està deshabilitat, aquests fitxers s'ocultaran completament de les llistes de fitxers i cerques." + }, + "maxReadFile": { + "label": "Nombre màxim de línies per llegir d'un fitxer", + "description": "Nombre màxim de línies per llegir d'un fitxer a la vegada. Valors més baixos redueixen l'ús de context/recursos però poden requerir més lectures per a fitxers grans." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/ca/welcome.json b/webview-ui/src/i18n/locales/ca/welcome.json index d17b0ca605..bd2ebea05a 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/chat.json b/webview-ui/src/i18n/locales/de/chat.json index e7bf5794c2..78db75b7f0 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -147,7 +147,7 @@ "troubleshooting": "Immer noch Probleme?" }, "powershell": { - "issues": "Es scheint, dass du Probleme mit Windows PowerShell hast, bitte sieh dir diesen" + "issues": "Es scheint, dass du Probleme mit Windows PowerShell hast, bitte sieh dir dies an" }, "autoApprove": { "title": "Automatische Genehmigung:", @@ -201,14 +201,14 @@ "seconds": "{{count}}s" }, "announcement": { - "title": "🎉 Roo Code 3.9 veröffentlicht", - "description": "Roo Code ist in Version 3.9 international geworden!", + "title": "🎉 Roo Code 3.10 veröffentlicht", + "description": "Roo Code 3.10 bringt leistungsstarke Produktivitätsverbesserungen!", "whatsNew": "Was ist neu", - "feature1": "Übersetzungen für 14 Sprachen", - "feature2": "MCP über SSE", - "feature3": "Stapellöschung des Aufgabenverlaufs", - "feature4": "Text-zu-Sprache", - "feature5": "OpenRouter-Anbieterauswahl", + "feature1": "Vorgeschlagene Antworten auf Fragen", + "feature2": "Verbesserte Handhabung großer Dateien", + "feature3": "Überarbeitete @-Erwähnungs-Dateisuche", + "feature4": "", + "feature5": "", "hideButton": "Ankündigung ausblenden", "detailsDiscussLinks": "Erhalte mehr Details und diskutiere auf Discord und Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/de/history.json b/webview-ui/src/i18n/locales/de/history.json index 426a964402..b879c3fb12 100644 --- a/webview-ui/src/i18n/locales/de/history.json +++ b/webview-ui/src/i18n/locales/de/history.json @@ -21,7 +21,7 @@ "copyPrompt": "Prompt kopieren", "exportTask": "Aufgabe exportieren", "deleteTask": "Aufgabe löschen", - "deleteTaskMessage": "Sind Sie sicher, dass Sie diese Aufgabe löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "deleteTaskMessage": "Bist du sicher, dass du diese Aufgabe löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden.", "cancel": "Abbrechen", "delete": "Löschen", "exitSelection": "Auswahl beenden", @@ -32,7 +32,7 @@ "clearSelection": "Auswahl aufheben", "deleteSelected": "Ausgewählte löschen", "deleteTasks": "Aufgaben löschen", - "confirmDeleteTasks": "Sind Sie sicher, dass Sie {{count}} Aufgaben löschen möchten?", - "deleteTasksWarning": "Gelöschte Aufgaben können nicht wiederhergestellt werden. Bitte vergewissern Sie sich, dass Sie fortfahren möchten.", + "confirmDeleteTasks": "Bist du sicher, dass du {{count}} Aufgaben löschen möchtest?", + "deleteTasksWarning": "Gelöschte Aufgaben können nicht wiederhergestellt werden. Bitte vergewissere dich, dass du fortfahren möchtest.", "deleteItems": "{{count}} Elemente löschen" } diff --git a/webview-ui/src/i18n/locales/de/humanRelay.json b/webview-ui/src/i18n/locales/de/humanRelay.json index 0d46b2db66..290cbe2613 100644 --- a/webview-ui/src/i18n/locales/de/humanRelay.json +++ b/webview-ui/src/i18n/locales/de/humanRelay.json @@ -1,9 +1,9 @@ { - "dialogTitle": "Menschliche Weiterleitung - Bitte helfen Sie beim Kopieren/Einfügen von Informationen", - "dialogDescription": "Bitte kopieren Sie den folgenden Prompt in die Web-KI und fügen Sie dann die Antwort der KI in das Eingabefeld unten ein.", + "dialogTitle": "Menschliche Weiterleitung - Bitte hilf beim Kopieren/Einfügen von Informationen", + "dialogDescription": "Bitte kopiere den folgenden Prompt in die Web-KI und füge dann die Antwort der KI in das Eingabefeld unten ein.", "copiedToClipboard": "In die Zwischenablage kopiert", "aiResponse": { - "label": "Bitte geben Sie die KI-Antwort ein:", + "label": "Bitte gib die KI-Antwort ein:", "placeholder": "KI-Antwort hier einfügen..." }, "actions": { diff --git a/webview-ui/src/i18n/locales/de/mcp.json b/webview-ui/src/i18n/locales/de/mcp.json index c7d11df051..2455f20cd0 100644 --- a/webview-ui/src/i18n/locales/de/mcp.json +++ b/webview-ui/src/i18n/locales/de/mcp.json @@ -1,14 +1,14 @@ { "title": "MCP-Server", "done": "Fertig", - "description": "Das <0>Model Context Protocol ermöglicht die Kommunikation mit lokal laufenden MCP-Servern, die zusätzliche Tools und Ressourcen zur Erweiterung der Fähigkeiten von Roo bereitstellen. Sie können <1>von der Community erstellte Server verwenden oder Roo bitten, neue Tools speziell für Ihren Workflow zu erstellen (z.B. \"ein Tool hinzufügen, das die neueste npm-Dokumentation abruft\").", + "description": "Das <0>Model Context Protocol ermöglicht die Kommunikation mit lokal laufenden MCP-Servern, die zusätzliche Tools und Ressourcen zur Erweiterung der Fähigkeiten von Roo bereitstellen. Du kannst <1>von der Community erstellte Server verwenden oder Roo bitten, neue Tools speziell für deinen Workflow zu erstellen (z.B. \"ein Tool hinzufügen, das die neueste npm-Dokumentation abruft\").", "enableToggle": { "title": "MCP-Server aktivieren", - "description": "Wenn aktiviert, kann Roo mit MCP-Servern für erweiterte Funktionen interagieren. Wenn Sie MCP nicht verwenden, können Sie dies deaktivieren, um den Token-Verbrauch von Roo zu reduzieren." + "description": "Wenn aktiviert, kann Roo mit MCP-Servern für erweiterte Funktionen interagieren. Wenn du MCP nicht verwendest, kannst du dies deaktivieren, um den Token-Verbrauch von Roo zu reduzieren." }, "enableServerCreation": { "title": "MCP-Server-Erstellung aktivieren", - "description": "Wenn aktiviert, kann Roo Ihnen helfen, neue MCP-Server über Befehle wie \"neues Tool hinzufügen zu...\" zu erstellen. Wenn Sie keine MCP-Server erstellen müssen, können Sie dies deaktivieren, um den Token-Verbrauch von Roo zu reduzieren." + "description": "Wenn aktiviert, kann Roo dir helfen, neue MCP-Server über Befehle wie \"neues Tool hinzufügen zu...\" zu erstellen. Wenn du keine MCP-Server erstellen musst, kannst du dies deaktivieren, um den Token-Verbrauch von Roo zu reduzieren." }, "editSettings": "MCP-Einstellungen bearbeiten", "tool": { @@ -40,7 +40,7 @@ }, "deleteDialog": { "title": "MCP-Server löschen", - "description": "Sind Sie sicher, dass Sie den MCP-Server \"{{serverName}}\" löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "description": "Bist du sicher, dass du den MCP-Server \"{{serverName}}\" löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden.", "cancel": "Abbrechen", "delete": "Löschen" }, diff --git a/webview-ui/src/i18n/locales/de/prompts.json b/webview-ui/src/i18n/locales/de/prompts.json index 293579d3f2..ee2517c3fc 100644 --- a/webview-ui/src/i18n/locales/de/prompts.json +++ b/webview-ui/src/i18n/locales/de/prompts.json @@ -7,11 +7,11 @@ "editModesConfig": "Moduskonfiguration bearbeiten", "editGlobalModes": "Globale Modi bearbeiten", "editProjectModes": "Projektmodi bearbeiten (.roomodes)", - "createModeHelpText": "Klicken Sie auf +, um einen neuen benutzerdefinierten Modus zu erstellen, oder bitten Sie Roo einfach im Chat, einen für Sie zu erstellen!" + "createModeHelpText": "Klicke auf +, um einen neuen benutzerdefinierten Modus zu erstellen, oder bitte Roo einfach im Chat, einen für dich zu erstellen!" }, "apiConfiguration": { "title": "API-Konfiguration", - "select": "Wählen Sie, welche API-Konfiguration für diesen Modus verwendet werden soll" + "select": "Wähle, welche API-Konfiguration für diesen Modus verwendet werden soll" }, "tools": { "title": "Verfügbare Werkzeuge", @@ -30,18 +30,18 @@ "roleDefinition": { "title": "Rollendefinition", "resetToDefault": "Auf Standardwerte zurücksetzen", - "description": "Definieren Sie Roos Expertise und Persönlichkeit für diesen Modus. Diese Beschreibung prägt, wie Roo sich präsentiert und an Aufgaben herangeht." + "description": "Definiere Roos Expertise und Persönlichkeit für diesen Modus. Diese Beschreibung prägt, wie Roo sich präsentiert und an Aufgaben herangeht." }, "customInstructions": { "title": "Modusspezifische benutzerdefinierte Anweisungen (optional)", "resetToDefault": "Auf Standardwerte zurücksetzen", "description": "Fügen Sie verhaltensspezifische Richtlinien für den Modus {{modeName}} hinzu.", - "loadFromFile": "Benutzerdefinierte Anweisungen für den Modus {{mode}} können auch aus .clinerules-{{slug}} in Ihrem Arbeitsbereich geladen werden." + "loadFromFile": "Benutzerdefinierte Anweisungen für den Modus {{mode}} können auch aus .clinerules-{{slug}} in deinem Arbeitsbereich geladen werden." }, "globalCustomInstructions": { "title": "Benutzerdefinierte Anweisungen für alle Modi", - "description": "Diese Anweisungen gelten für alle Modi. Sie bieten einen grundlegenden Satz von Verhaltensweisen, die durch modusspezifische Anweisungen unten erweitert werden können.\nWenn Sie möchten, dass Roo in einer anderen Sprache als Ihrer Editor-Anzeigesprache ({{language}}) denkt und spricht, können Sie das hier angeben.", - "loadFromFile": "Anweisungen können auch aus .clinerules in Ihrem Arbeitsbereich geladen werden." + "description": "Diese Anweisungen gelten für alle Modi. Sie bieten einen grundlegenden Satz von Verhaltensweisen, die durch modusspezifische Anweisungen unten erweitert werden können.\nWenn du möchtest, dass Roo in einer anderen Sprache als deiner Editor-Anzeigesprache ({{language}}) denkt und spricht, kannst du das hier angeben.", + "loadFromFile": "Anweisungen können auch aus .clinerules in deinem Arbeitsbereich geladen werden." }, "systemPrompt": { "preview": "System-Prompt Vorschau", @@ -54,9 +54,9 @@ "prompt": "Prompt", "enhance": { "apiConfiguration": "API-Konfiguration", - "apiConfigDescription": "Sie können eine API-Konfiguration auswählen, die immer zur Verbesserung von Prompts verwendet wird, oder einfach die aktuell ausgewählte verwenden", + "apiConfigDescription": "Du kannst eine API-Konfiguration auswählen, die immer zur Verbesserung von Prompts verwendet wird, oder einfach die aktuell ausgewählte verwenden", "useCurrentConfig": "Aktuell ausgewählte API-Konfiguration verwenden", - "testPromptPlaceholder": "Geben Sie einen Prompt ein, um die Verbesserung zu testen", + "testPromptPlaceholder": "Gib einen Prompt ein, um die Verbesserung zu testen", "previewButton": "Vorschau der Prompt-Verbesserung" }, "types": { @@ -96,11 +96,11 @@ }, "customModeCreation": { "enableTitle": "Erstellung benutzerdefinierter Modi über Prompts aktivieren", - "description": "Wenn aktiviert, ermöglicht Roo Ihnen, benutzerdefinierte Modi mit Prompts wie 'Erstelle mir einen benutzerdefinierten Modus, der...' zu erstellen. Die Deaktivierung reduziert Ihren System-Prompt um etwa 700 Tokens, wenn diese Funktion nicht benötigt wird. Bei Deaktivierung können Sie immer noch manuell benutzerdefinierte Modi mit der +-Schaltfläche oben erstellen oder durch Bearbeiten der zugehörigen Konfigurations-JSON." + "description": "Wenn aktiviert, ermöglicht Roo dir, benutzerdefinierte Modi mit Prompts wie 'Erstelle mir einen benutzerdefinierten Modus, der...' zu erstellen. Die Deaktivierung reduziert deinen System-Prompt um etwa 700 Tokens, wenn diese Funktion nicht benötigt wird. Bei Deaktivierung kannst du immer noch manuell benutzerdefinierte Modi mit der +-Schaltfläche oben erstellen oder durch Bearbeiten der zugehörigen Konfigurations-JSON." }, "advancedSystemPrompt": { "title": "Erweitert: System-Prompt überschreiben", - "description": "Sie können den System-Prompt für diesen Modus vollständig ersetzen (abgesehen von der Rollendefinition und benutzerdefinierten Anweisungen), indem Sie eine Datei unter .roo/system-prompt-{{slug}} in Ihrem Arbeitsbereich erstellen. Dies ist eine sehr fortgeschrittene Funktion, die eingebaute Schutzmaßnahmen und Konsistenzprüfungen umgeht (besonders bei der Werkzeugnutzung), also seien Sie vorsichtig!" + "description": "Du kannst den System-Prompt für diesen Modus vollständig ersetzen (abgesehen von der Rollendefinition und benutzerdefinierten Anweisungen), indem du eine Datei unter .roo/system-prompt-{{slug}} in deinem Arbeitsbereich erstellst. Dies ist eine sehr fortgeschrittene Funktion, die eingebaute Schutzmaßnahmen und Konsistenzprüfungen umgeht (besonders bei der Werkzeugnutzung), also sei vorsichtig!" }, "createModeDialog": { "title": "Neuen Modus erstellen", @@ -115,7 +115,7 @@ }, "saveLocation": { "label": "Speicherort", - "description": "Wählen Sie, wo dieser Modus gespeichert werden soll. Projektspezifische Modi haben Vorrang vor globalen Modi.", + "description": "Wähle, wo dieser Modus gespeichert werden soll. Projektspezifische Modi haben Vorrang vor globalen Modi.", "global": { "label": "Global", "description": "Verfügbar in allen Arbeitsbereichen" @@ -127,11 +127,11 @@ }, "roleDefinition": { "label": "Rollendefinition", - "description": "Definieren Sie Roos Expertise und Persönlichkeit für diesen Modus." + "description": "Definiere Roos Expertise und Persönlichkeit für diesen Modus." }, "tools": { "label": "Verfügbare Werkzeuge", - "description": "Wählen Sie, welche Werkzeuge dieser Modus verwenden kann." + "description": "Wähle, welche Werkzeuge dieser Modus verwenden kann." }, "customInstructions": { "label": "Benutzerdefinierte Anweisungen (optional)", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 72f8410e5a..277ab83982 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -14,7 +14,7 @@ }, "unsavedChangesDialog": { "title": "Ungespeicherte Änderungen", - "description": "Möchten Sie die Änderungen verwerfen und fortfahren?", + "description": "Möchtest du die Änderungen verwerfen und fortfahren?", "cancelButton": "Abbrechen", "discardButton": "Änderungen verwerfen" }, @@ -32,10 +32,10 @@ "about": "Über Roo Code" }, "autoApprove": { - "description": "Erlaubt Roo, Operationen automatisch ohne Genehmigung durchzuführen. Aktivieren Sie diese Einstellungen nur, wenn Sie der KI vollständig vertrauen und die damit verbundenen Sicherheitsrisiken verstehen.", + "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 Sie auf die Genehmigen-Schaltfläche klicken müssen." + "description": "Wenn aktiviert, wird Roo automatisch Verzeichnisinhalte anzeigen und Dateien lesen, ohne dass du auf die Genehmigen-Schaltfläche klicken musst." }, "write": { "label": "Schreiboperationen immer genehmigen", @@ -141,30 +141,30 @@ "draftModelId": "Entwurfsmodell-ID", "draftModelDesc": "Das Entwurfsmodell muss aus derselben Modellfamilie stammen, damit das spekulative Dekodieren korrekt funktioniert.", "selectDraftModel": "Entwurfsmodell auswählen", - "noModelsFound": "Keine Entwurfsmodelle gefunden. Bitte stellen Sie sicher, dass LM Studio mit aktiviertem Servermodus läuft.", - "description": "LM Studio ermöglicht es Ihnen, Modelle lokal auf Ihrem Computer auszuführen. Eine Anleitung zum Einstieg finden Sie in ihrem Schnellstart-Guide. Sie müssen auch die lokale Server-Funktion von LM Studio starten, um es mit dieser Erweiterung zu verwenden. Hinweis: Roo Code verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet." + "noModelsFound": "Keine Entwurfsmodelle gefunden. Bitte stelle sicher, dass LM Studio mit aktiviertem Servermodus läuft.", + "description": "LM Studio ermöglicht es dir, Modelle lokal auf deinem Computer auszuführen. Eine Anleitung zum Einstieg findest du in ihrem Schnellstart-Guide. Du musst auch die lokale Server-Funktion von LM Studio starten, um es mit dieser Erweiterung zu verwenden. Hinweis: Roo Code verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet." }, "ollama": { "baseUrl": "Basis-URL (optional)", "modelId": "Modell-ID", - "description": "Ollama ermöglicht es Ihnen, Modelle lokal auf Ihrem Computer auszuführen. Eine Anleitung zum Einstieg finden Sie im Schnellstart-Guide.", + "description": "Ollama ermöglicht es dir, Modelle lokal auf deinem Computer auszuführen. Eine Anleitung zum Einstieg findest du im Schnellstart-Guide.", "warning": "Hinweis: Roo Code verwendet komplexe Prompts und funktioniert am besten mit Claude-Modellen. Weniger leistungsfähige Modelle funktionieren möglicherweise nicht wie erwartet." }, "unboundApiKey": "Unbound API-Schlüssel", "getUnboundApiKey": "Unbound API-Schlüssel erhalten", "humanRelay": { "description": "Es ist kein API-Schlüssel erforderlich, aber der Benutzer muss beim Kopieren und Einfügen der Informationen in den Web-Chat-KI helfen.", - "instructions": "Während der Verwendung wird ein Dialogfeld angezeigt und die aktuelle Nachricht wird automatisch in die Zwischenablage kopiert. Sie müssen diese in Web-Versionen von KI (wie ChatGPT oder Claude) einfügen, dann die Antwort der KI zurück in das Dialogfeld kopieren und auf die Bestätigungsschaltfläche klicken." + "instructions": "Während der Verwendung wird ein Dialogfeld angezeigt und die aktuelle Nachricht wird automatisch in die Zwischenablage kopiert. Du musst diese in Web-Versionen von KI (wie ChatGPT oder Claude) einfügen, dann die Antwort der KI zurück in das Dialogfeld kopieren und auf die Bestätigungsschaltfläche klicken." }, "openRouter": { "providerRouting": { "title": "OpenRouter Anbieter-Routing", - "description": "OpenRouter leitet Anfragen an die besten verfügbaren Anbieter für Ihr Modell weiter. Standardmäßig werden Anfragen über die Top-Anbieter lastverteilt, um maximale Verfügbarkeit zu gewährleisten. Sie können jedoch einen bestimmten Anbieter für dieses Modell auswählen.", + "description": "OpenRouter leitet Anfragen an die besten verfügbaren Anbieter für dein Modell weiter. Standardmäßig werden Anfragen über die Top-Anbieter lastverteilt, um maximale Verfügbarkeit zu gewährleisten. Du kannst jedoch einen bestimmten Anbieter für dieses Modell auswählen.", "learnMore": "Mehr über Anbieter-Routing erfahren" } }, "customModel": { - "capabilities": "Konfigurieren Sie die Fähigkeiten und Preise für Ihr benutzerdefiniertes OpenAI-kompatibles Modell. Seien Sie vorsichtig bei der Angabe der Modellfähigkeiten, da diese beeinflussen können, wie Roo Code funktioniert.", + "capabilities": "Konfiguriere die Fähigkeiten und Preise für dein benutzerdefiniertes OpenAI-kompatibles Modell. Sei vorsichtig bei der Angabe der Modellfähigkeiten, da diese beeinflussen können, wie Roo Code funktioniert.", "maxTokens": { "label": "Maximale Ausgabe-Tokens", "description": "Maximale Anzahl von Tokens, die das Modell in einer Antwort generieren kann. (Geben Sie -1 an, damit der Server die maximalen Tokens festlegt.)" @@ -265,6 +265,10 @@ "rooignore": { "label": ".rooignore-Dateien in Listen und Suchen anzeigen", "description": "Wenn aktiviert, werden Dateien, die mit Mustern in .rooignore übereinstimmen, in Listen mit einem Schlosssymbol angezeigt. Wenn deaktiviert, werden diese Dateien vollständig aus Dateilisten und Suchen ausgeblendet." + }, + "maxReadFile": { + "label": "Maximale Anzahl an Zeilen, die aus einer Datei gelesen werden", + "description": "Maximale Anzahl an Zeilen, die auf einmal aus einer Datei gelesen werden. Niedrigere Werte reduzieren den Kontext-/Ressourcenverbrauch, können aber mehr Lesevorgänge für große Dateien erfordern." } }, "terminal": { @@ -300,7 +304,7 @@ }, "matchPrecision": { "label": "Übereinstimmungsgenauigkeit", - "description": "Dieser Schieberegler steuert, wie genau Codeabschnitte beim Anwenden von Diffs übereinstimmen müssen. Niedrigere Werte ermöglichen flexiblere Übereinstimmungen, erhöhen aber das Risiko falscher Ersetzungen. Verwenden Sie Werte unter 100% mit äußerster Vorsicht." + "description": "Dieser Schieberegler steuert, wie genau Codeabschnitte beim Anwenden von Diffs übereinstimmen müssen. Niedrigere Werte ermöglichen flexiblere Übereinstimmungen, erhöhen aber das Risiko falscher Ersetzungen. Verwende Werte unter 100% mit äußerster Vorsicht." } } }, @@ -308,7 +312,7 @@ "warning": "⚠️", "DIFF_STRATEGY": { "name": "Experimentelle einheitliche Diff-Strategie verwenden", - "description": "Aktiviert die experimentelle einheitliche Diff-Strategie. Diese Strategie könnte die Anzahl der durch Modellfehler verursachten Wiederholungen reduzieren, kann aber unerwartetes Verhalten oder falsche Bearbeitungen verursachen. Nur aktivieren, wenn Sie die Risiken verstehen und bereit sind, alle Änderungen sorgfältig zu überprüfen." + "description": "Aktiviert die experimentelle einheitliche Diff-Strategie. Diese Strategie könnte die Anzahl der durch Modellfehler verursachten Wiederholungen reduzieren, kann aber unerwartetes Verhalten oder falsche Bearbeitungen verursachen. Nur aktivieren, wenn du die Risiken verstehst und bereit bist, alle Änderungen sorgfältig zu überprüfen." }, "SEARCH_AND_REPLACE": { "name": "Experimentelles Such- und Ersetzungswerkzeug verwenden", @@ -353,21 +357,21 @@ } }, "modelPicker": { - "automaticFetch": "Die Erweiterung ruft automatisch die neueste Liste der verfügbaren Modelle von {{serviceName}} ab. Wenn Sie sich nicht sicher sind, welches Modell Sie wählen sollen, funktioniert Roo Code am besten mit {{defaultModelId}}. Sie können auch nach \"free\" suchen, um derzeit verfügbare kostenlose Optionen zu finden.", + "automaticFetch": "Die Erweiterung ruft automatisch die neueste Liste der verfügbaren Modelle von {{serviceName}} ab. Wenn du dir nicht sicher bist, welches Modell du wählen sollst, funktioniert Roo Code am besten mit {{defaultModelId}}. Du kannst auch nach \"free\" suchen, um derzeit verfügbare kostenlose Optionen zu finden.", "label": "Modell", "searchPlaceholder": "Suchen", "noMatchFound": "Keine Übereinstimmung gefunden", "useCustomModel": "Benutzerdefiniert verwenden: {{modelId}}" }, "footer": { - "feedback": "Wenn Sie Fragen oder Feedback haben, können Sie gerne ein Issue auf github.com/RooVetGit/Roo-Code öffnen oder reddit.com/r/RooCode oder discord.gg/roocode beitreten", + "feedback": "Wenn du Fragen oder Feedback hast, kannst du gerne ein Issue auf github.com/RooVetGit/Roo-Code öffnen oder reddit.com/r/RooCode oder discord.gg/roocode beitreten", "version": "Roo Code v{{version}}", "telemetry": { "label": "Anonyme Fehler- und Nutzungsberichte zulassen", "description": "Helfen Sie, Roo Code zu verbessern, indem Sie anonyme Nutzungsdaten und Fehlerberichte senden. Es werden niemals Code, Prompts oder persönliche Informationen gesendet. Weitere Details finden Sie in unserer Datenschutzrichtlinie." }, "reset": { - "description": "Setzen Sie alle globalen Zustände und geheimen Speicher in der Erweiterung zurück.", + "description": "Setze alle globalen Zustände und geheimen Speicher in der Erweiterung zurück.", "button": "Zurücksetzen" } }, @@ -376,17 +380,17 @@ "maxThinkingTokens": "Maximale Thinking-Tokens" }, "validation": { - "apiKey": "Sie müssen einen gültigen API-Schlüssel angeben.", - "awsRegion": "Sie müssen eine Region für AWS Bedrock auswählen.", - "googleCloud": "Sie müssen eine gültige Google Cloud Projekt-ID und Region angeben.", - "modelId": "Sie müssen eine gültige Modell-ID angeben.", - "modelSelector": "Sie müssen einen gültigen Modell-Selektor angeben.", - "openAi": "Sie müssen eine gültige Basis-URL, API-Schlüssel und Modell-ID angeben.", + "apiKey": "Du musst einen gültigen API-Schlüssel angeben.", + "awsRegion": "Du musst eine Region für AWS Bedrock auswählen.", + "googleCloud": "Du musst eine gültige Google Cloud Projekt-ID und Region angeben.", + "modelId": "Du musst eine gültige Modell-ID angeben.", + "modelSelector": "Du musst einen gültigen Modell-Selektor angeben.", + "openAi": "Du musst eine gültige Basis-URL, API-Schlüssel und Modell-ID angeben.", "arn": { "invalidFormat": "Ungültiges ARN-Format. Bitte überprüfen Sie die Formatanforderungen.", - "regionMismatch": "Warnung: Die Region in Ihrer ARN ({{arnRegion}}) stimmt nicht mit Ihrer ausgewählten Region ({{region}}) überein. Dies kann zu Zugriffsproblemen führen. Der Provider wird die Region aus der ARN verwenden." + "regionMismatch": "Warnung: Die Region in deiner ARN ({{arnRegion}}) stimmt nicht mit deiner ausgewählten Region ({{region}}) überein. Dies kann zu Zugriffsproblemen führen. Der Provider wird die Region aus der ARN verwenden." }, - "modelAvailability": "Die von Ihnen angegebene Modell-ID ({{modelId}}) ist nicht verfügbar. Bitte wählen Sie ein anderes Modell." + "modelAvailability": "Die von dir angegebene Modell-ID ({{modelId}}) ist nicht verfügbar. Bitte wähle ein anderes Modell." }, "placeholders": { "apiKey": "API-Schlüssel eingeben...", diff --git a/webview-ui/src/i18n/locales/de/welcome.json b/webview-ui/src/i18n/locales/de/welcome.json index cf5ec2687e..aded384886 100644 --- a/webview-ui/src/i18n/locales/de/welcome.json +++ b/webview-ui/src/i18n/locales/de/welcome.json @@ -1,12 +1,12 @@ { "greeting": "Hallo, ich bin Roo!", - "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 Ihrer Erlaubnis). Ich kann sogar MCP verwenden, um neue Tools zu erstellen und meine eigenen Fähigkeiten zu erweitern.", + "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!", "telemetry": { - "title": "Helfen Sie, Roo Code zu verbessern", - "anonymousTelemetry": "Senden Sie 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": "Sie können dies jederzeit unten in den Einstellungen ändern", + "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", "settings": "Einstellungen", "allow": "Erlauben", "deny": "Ablehnen" diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 2f31ffcc31..dbc5712d69 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -197,14 +197,14 @@ } }, "announcement": { - "title": "🎉 Roo Code 3.9 Released", - "description": "Roo Code has gone international in 3.9!", + "title": "🎉 Roo Code 3.10 Released", + "description": "Roo Code 3.10 brings powerful productivity enhancements!", "whatsNew": "What's New", - "feature1": "Translations for 14 languages", - "feature2": "MCP over SSE", - "feature3": "Batch delete task history", - "feature4": "Text-to-speech", - "feature5": "OpenRouter provider selection", + "feature1": "Suggested responses to questions", + "feature2": "Improved large file handling", + "feature3": "Rebuilt @-mention file lookups", + "feature4": "", + "feature5": "", "hideButton": "Hide announcement", "detailsDiscussLinks": "Get more details and discuss in Discord and Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 4ed928c40c..29b163512e 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "Show .rooignore'd files in lists and searches", "description": "When enabled, files matching patterns in .rooignore will be shown in lists with a lock symbol. When disabled, these files will be completely hidden from file lists and searches." + }, + "maxReadFile": { + "label": "Maximum lines to read from a file", + "description": "Maximum number of lines to read from a file at once. Lower values reduce context/resource usage but may require more reads for large files." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/en/welcome.json b/webview-ui/src/i18n/locales/en/welcome.json index 23174bd053..f02021b718 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/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 937924f186..bfb536d674 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}s" }, "announcement": { - "title": "🎉 Roo Code 3.9 publicado", - "description": "¡Roo Code se ha vuelto internacional en la versión 3.9!", + "title": "🎉 Roo Code 3.10 publicado", + "description": "¡Roo Code 3.10 trae potentes mejoras de productividad!", "whatsNew": "Novedades", - "feature1": "Traducciones para 14 idiomas", - "feature2": "MCP sobre SSE", - "feature3": "Eliminación en lote del historial de tareas", - "feature4": "Texto a voz", - "feature5": "Selección de proveedor OpenRouter", + "feature1": "Respuestas sugeridas a preguntas", + "feature2": "Mejor manejo de archivos grandes", + "feature3": "Búsquedas de archivos con @-mención reconstruidas", + "feature4": "", + "feature5": "", "hideButton": "Ocultar anuncio", "detailsDiscussLinks": "Obtén más detalles y participa en Discord y Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 00523ac834..ccc255e8a1 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "Mostrar archivos .rooignore en listas y búsquedas", "description": "Cuando está habilitado, los archivos que coinciden con los patrones en .rooignore se mostrarán en listas con un símbolo de candado. Cuando está deshabilitado, estos archivos se ocultarán completamente de las listas de archivos y búsquedas." + }, + "maxReadFile": { + "label": "Número máximo de líneas para leer de un archivo", + "description": "Número máximo de líneas para leer de un archivo a la vez. Valores más bajos reducen el uso de contexto/recursos pero pueden requerir más lecturas para archivos grandes." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/es/welcome.json b/webview-ui/src/i18n/locales/es/welcome.json index 02e36a2572..9482732d49 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/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 9df15f1b7e..da516362a7 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}s" }, "announcement": { - "title": "🎉 Roo Code 3.9 est sortie", - "description": "Roo Code est devenu international avec la version 3.9 !", + "title": "🎉 Roo Code 3.10 est sortie", + "description": "Roo Code 3.10 apporte de puissantes améliorations de productivité !", "whatsNew": "Quoi de neuf", - "feature1": "Traductions pour 14 langues", - "feature2": "MCP via SSE", - "feature3": "Suppression en lot de l'historique des tâches", - "feature4": "Synthèse vocale", - "feature5": "Sélection du fournisseur OpenRouter", + "feature1": "Réponses suggérées aux questions", + "feature2": "Gestion améliorée des fichiers volumineux", + "feature3": "Recherche de fichiers par @-mention reconstruite", + "feature4": "", + "feature5": "", "hideButton": "Masquer l'annonce", "detailsDiscussLinks": "Obtenez plus de détails et participez aux discussions sur Discord et Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index d083511449..63a3c4be71 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "Afficher les fichiers .rooignore dans les listes et recherches", "description": "Lorsque cette option est activée, les fichiers correspondant aux modèles dans .rooignore seront affichés dans les listes avec un symbole de cadenas. Lorsqu'elle est désactivée, ces fichiers seront complètement masqués des listes de fichiers et des recherches." + }, + "maxReadFile": { + "label": "Nombre maximum de lignes à lire depuis un fichier", + "description": "Nombre maximum de lignes à lire depuis un fichier à la fois. Des valeurs plus basses réduisent l'utilisation de contexte/ressources mais peuvent nécessiter plus de lectures pour les fichiers volumineux." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/fr/welcome.json b/webview-ui/src/i18n/locales/fr/welcome.json index 310c709fc9..7e34e61a0a 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/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 855ee4fbca..bcd1ca43ff 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}} सेकंड" }, "announcement": { - "title": "🎉 Roo Code 3.9 रिलीज़ हुआ", - "description": "Roo Code 3.9 में अंतरराष्ट्रीय हो गया है!", + "title": "🎉 Roo Code 3.10 रिलीज़ हुआ", + "description": "Roo Code 3.10 शक्तिशाली उत्पादकता सुधार लाता है!", "whatsNew": "नई सुविधाएँ", - "feature1": "14 भाषाओं के लिए अनुवाद", - "feature2": "SSE के माध्यम से MCP", - "feature3": "कार्य इतिहास का बैच डिलीट", - "feature4": "टेक्स्ट-टू-स्पीच", - "feature5": "OpenRouter प्रदाता चयन", + "feature1": "प्रश्नों के लिए सुझाई गई प्रतिक्रियाएँ", + "feature2": "बड़ी फ़ाइलों का बेहतर प्रबंधन", + "feature3": "@-मेंशन फ़ाइल लुकअप का पुनर्निर्माण", + "feature4": "", + "feature5": "", "hideButton": "घोषणा छिपाएँ", "detailsDiscussLinks": "Discord और Reddit पर अधिक जानकारी प्राप्त करें और चर्चा में भाग लें 🚀" }, diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 2b02f74285..ba0461071f 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "सूचियों और खोजों में .rooignore फाइलें दिखाएँ", "description": "जब सक्षम होता है, .rooignore में पैटर्न से मेल खाने वाली फाइलें लॉक प्रतीक के साथ सूचियों में दिखाई जाएंगी। जब अक्षम होता है, ये फाइलें फाइल सूचियों और खोजों से पूरी तरह छिपा दी जाएंगी।" + }, + "maxReadFile": { + "label": "फ़ाइल से पढ़ने के लिए अधिकतम लाइनें", + "description": "फ़ाइल से एक बार में पढ़ने के लिए अधिकतम लाइनों की संख्या। कम मान संदर्भ/संसाधन उपयोग को कम करते हैं लेकिन बड़ी फाइलों के लिए अधिक पठन की आवश्यकता हो सकती है।" } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/hi/welcome.json b/webview-ui/src/i18n/locales/hi/welcome.json index 1e78c71cc1..ef85bdc8bf 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/chat.json b/webview-ui/src/i18n/locales/it/chat.json index d860bd3c45..fea9861c85 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}s" }, "announcement": { - "title": "🎉 Rilasciato Roo Code 3.9", - "description": "Roo Code è diventato internazionale con la versione 3.9!", + "title": "🎉 Rilasciato Roo Code 3.10", + "description": "Roo Code 3.10 porta potenti miglioramenti di produttività!", "whatsNew": "Novità", - "feature1": "Traduzioni per 14 lingue", - "feature2": "MCP tramite SSE", - "feature3": "Eliminazione in batch della cronologia delle attività", - "feature4": "Sintesi vocale", - "feature5": "Selezione provider OpenRouter", + "feature1": "Risposte suggerite alle domande", + "feature2": "Gestione migliorata dei file di grandi dimensioni", + "feature3": "Ricerca file tramite @-menzione ricostruita", + "feature4": "", + "feature5": "", "hideButton": "Nascondi annuncio", "detailsDiscussLinks": "Ottieni maggiori dettagli e partecipa alle discussioni su Discord e Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 23b99811fd..4d5ea142a2 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "Mostra file .rooignore negli elenchi e nelle ricerche", "description": "Quando abilitato, i file che corrispondono ai pattern in .rooignore verranno mostrati negli elenchi con un simbolo di blocco. Quando disabilitato, questi file saranno completamente nascosti dagli elenchi di file e dalle ricerche." + }, + "maxReadFile": { + "label": "Numero massimo di righe da leggere da un file", + "description": "Numero massimo di righe da leggere da un file alla volta. Valori più bassi riducono l'utilizzo di contesto/risorse ma potrebbero richiedere più letture per file di grandi dimensioni." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/it/welcome.json b/webview-ui/src/i18n/locales/it/welcome.json index 5271886a24..e05fc1c43e 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/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 26b660da36..766d8797dd 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}秒" }, "announcement": { - "title": "🎉 Roo Code 3.9 リリース", - "description": "Roo Code 3.9で国際化が実現しました!", + "title": "🎉 Roo Code 3.10 リリース", + "description": "Roo Code 3.10は強力な生産性向上機能をもたらします!", "whatsNew": "新機能", - "feature1": "14言語対応の翻訳", - "feature2": "SSE経由のMCP", - "feature3": "タスク履歴の一括削除", - "feature4": "テキスト読み上げ", - "feature5": "OpenRouterプロバイダーの選択", + "feature1": "質問への提案回答機能", + "feature2": "大きなファイルの取り扱い改善", + "feature3": "@メンションによるファイル検索の再構築", + "feature4": "", + "feature5": "", "hideButton": "通知を非表示", "detailsDiscussLinks": "詳細はDiscordRedditでご確認・ディスカッションください 🚀" }, diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 3c7dc35108..21a2f5410e 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "リストと検索で.rooignoreファイルを表示", "description": "有効にすると、.rooignoreのパターンに一致するファイルがロックシンボル付きでリストに表示されます。無効にすると、これらのファイルはファイルリストや検索から完全に非表示になります。" + }, + "maxReadFile": { + "label": "ファイルから読み込む最大行数", + "description": "一度にファイルから読み込む最大行数。低い値はコンテキスト/リソース使用量を減らしますが、大きなファイルではより多くの読み込みが必要になる場合があります。" } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/ja/welcome.json b/webview-ui/src/i18n/locales/ja/welcome.json index 835d3e4de7..9e5b30e4c9 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/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 107f4ed07a..db49282dd9 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}초" }, "announcement": { - "title": "🎉 Roo Code 3.9 출시", - "description": "Roo Code가 3.9 버전에서 국제화되었습니다!", + "title": "🎉 Roo Code 3.10 출시", + "description": "Roo Code 3.10이 강력한 생산성 향상 기능을 제공합니다!", "whatsNew": "새로운 기능", - "feature1": "14개 언어로 번역", - "feature2": "SSE를 통한 MCP", - "feature3": "작업 기록 일괄 삭제", - "feature4": "텍스트 음성 변환", - "feature5": "OpenRouter 제공자 선택", + "feature1": "질문에 대한 제안 응답", + "feature2": "대용량 파일 처리 개선", + "feature3": "@-언급 파일 검색 기능 재구축", + "feature4": "", + "feature5": "", "hideButton": "공지 숨기기", "detailsDiscussLinks": "DiscordReddit에서 더 자세한 정보를 확인하고 논의하세요 🚀" }, diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 2087119d63..54debd390f 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "목록 및 검색에서 .rooignore 파일 표시", "description": "활성화되면 .rooignore의 패턴과 일치하는 파일이 잠금 기호와 함께 목록에 표시됩니다. 비활성화되면 이러한 파일은 파일 목록 및 검색에서 완전히 숨겨집니다." + }, + "maxReadFile": { + "label": "파일에서 읽을 최대 라인 수", + "description": "한 번에 파일에서 읽을 최대 라인 수. 낮은 값은 컨텍스트/리소스 사용량을 줄이지만 대용량 파일의 경우 더 많은 읽기가 필요할 수 있습니다." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/ko/welcome.json b/webview-ui/src/i18n/locales/ko/welcome.json index af9e1dc499..b8b8cbd252 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/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index bf96dc9438..96cd92f7c2 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}} s" }, "announcement": { - "title": "🎉 Roo Code 3.9 wydany", - "description": "Roo Code stał się międzynarodowy w wersji 3.9!", + "title": "🎉 Roo Code 3.10 wydany", + "description": "Roo Code 3.10 przynosi potężne usprawnienia produktywności!", "whatsNew": "Co nowego", - "feature1": "Tłumaczenia na 14 języków", - "feature2": "MCP przez SSE", - "feature3": "Grupowe usuwanie historii zadań", - "feature4": "Zamiana tekstu na mowę", - "feature5": "Wybór dostawcy OpenRouter", + "feature1": "Sugerowane odpowiedzi na pytania", + "feature2": "Ulepszenia obsługi dużych plików", + "feature3": "Przebudowane wyszukiwanie plików przez @-wzmianki", + "feature4": "", + "feature5": "", "hideButton": "Ukryj ogłoszenie", "detailsDiscussLinks": "Uzyskaj więcej szczegółów i dołącz do dyskusji na Discord i Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 574c4108ba..2b5938ddd7 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "Pokaż pliki .rooignore na listach i w wyszukiwaniach", "description": "Gdy włączone, pliki pasujące do wzorców w .rooignore będą pokazywane na listach z symbolem kłódki. Gdy wyłączone, te pliki będą całkowicie ukryte z list plików i wyszukiwań." + }, + "maxReadFile": { + "label": "Maksymalna liczba linii do odczytu z pliku", + "description": "Maksymalna liczba linii odczytywanych z pliku jednocześnie. Niższe wartości zmniejszają użycie kontekstu/zasobów, ale mogą wymagać więcej odczytów dla dużych plików." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/pl/welcome.json b/webview-ui/src/i18n/locales/pl/welcome.json index cc9907f3f8..0e6546bc21 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/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 2b0e74d5c8..97c13c3cfb 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}s" }, "announcement": { - "title": "🎉 Roo Code 3.9 Lançado", - "description": "Roo Code se tornou internacional na versão 3.9!", + "title": "🎉 Roo Code 3.10 Lançado", + "description": "Roo Code 3.10 traz poderosas melhorias de produtividade!", "whatsNew": "O que há de novo", - "feature1": "Traduções para 14 idiomas", - "feature2": "MCP via SSE", - "feature3": "Exclusão em lote do histórico de tarefas", - "feature4": "Conversão de texto em fala", - "feature5": "Seleção de provedor OpenRouter", + "feature1": "Respostas sugeridas para perguntas", + "feature2": "Manuseio aprimorado de arquivos grandes", + "feature3": "Busca de arquivos por @-menção reconstruída", + "feature4": "", + "feature5": "", "hideButton": "Ocultar anúncio", "detailsDiscussLinks": "Obtenha mais detalhes e participe da discussão no Discord e Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index b18be604a2..a7c4b7283e 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "Mostrar arquivos .rooignore em listas e pesquisas", "description": "Quando ativado, os arquivos que correspondem aos padrões em .rooignore serão mostrados em listas com um símbolo de cadeado. Quando desativado, esses arquivos serão completamente ocultos das listas de arquivos e pesquisas." + }, + "maxReadFile": { + "label": "Número máximo de linhas para ler de um arquivo", + "description": "Número máximo de linhas para ler de um arquivo de uma vez. Valores mais baixos reduzem o uso de contexto/recursos, mas podem exigir mais leituras para arquivos grandes." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/pt-BR/welcome.json b/webview-ui/src/i18n/locales/pt-BR/welcome.json index 7123772d67..c28386a613 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/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 0bf0ae0658..4fff9c2ad3 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}sn" }, "announcement": { - "title": "🎉 Roo Code 3.9 Yayınlandı", - "description": "Roo Code 3.9 sürümünde uluslararası oldu!", + "title": "🎉 Roo Code 3.10 Yayınlandı", + "description": "Roo Code 3.10 güçlü üretkenlik iyileştirmeleri getiriyor!", "whatsNew": "Yenilikler", - "feature1": "14 dil için çeviriler", - "feature2": "SSE üzerinden MCP", - "feature3": "Toplu görev geçmişi silme", - "feature4": "Metinden sese dönüştürme", - "feature5": "OpenRouter sağlayıcı seçimi", + "feature1": "Sorulara önerilen yanıtlar", + "feature2": "Geliştirilmiş büyük dosya işleme", + "feature3": "Yeniden yapılandırılmış @-mention dosya aramaları", + "feature4": "", + "feature5": "", "hideButton": "Duyuruyu gizle", "detailsDiscussLinks": "Discord ve Reddit üzerinde daha fazla ayrıntı edinin ve tartışmalara katılın 🚀" }, diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 9a95a578d3..078c495c46 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "Listelerde ve aramalarda .rooignore dosyalarını göster", "description": "Etkinleştirildiğinde, .rooignore'daki desenlerle eşleşen dosyalar kilit sembolü ile listelerde gösterilecektir. Devre dışı bırakıldığında, bu dosyalar dosya listelerinden ve aramalardan tamamen gizlenecektir." + }, + "maxReadFile": { + "label": "Bir dosyadan okunacak maksimum satır sayısı", + "description": "Bir dosyadan bir kerede okunacak maksimum satır sayısı. Daha düşük değerler bağlam/kaynak kullanımını azaltır ancak büyük dosyalar için daha fazla okuma gerektirebilir." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/tr/welcome.json b/webview-ui/src/i18n/locales/tr/welcome.json index f462c1dd3d..2f25a1e93d 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/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index b8c1871cfb..cbabb4634a 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}} giây" }, "announcement": { - "title": "🎉 Roo Code 3.9 Đã phát hành", - "description": "Roo Code đã trở nên quốc tế hóa trong phiên bản 3.9!", + "title": "🎉 Roo Code 3.10 Đã phát hành", + "description": "Roo Code 3.10 mang đến những cải tiến năng suất mạnh mẽ!", "whatsNew": "Có gì mới", - "feature1": "Bản dịch cho 14 ngôn ngữ", - "feature2": "MCP qua SSE", - "feature3": "Xóa hàng loạt lịch sử nhiệm vụ", - "feature4": "Chuyển văn bản thành giọng nói", - "feature5": "Lựa chọn nhà cung cấp OpenRouter", + "feature1": "Gợi ý phản hồi cho câu hỏi", + "feature2": "Cải thiện xử lý tệp tin lớn", + "feature3": "Xây dựng lại tìm kiếm tệp tin bằng @-mention", + "feature4": "", + "feature5": "", "hideButton": "Ẩn thông báo", "detailsDiscussLinks": "Nhận thêm chi tiết và thảo luận tại DiscordReddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index ac05321834..5344cc7330 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "Hiển thị tệp .rooignore trong danh sách và tìm kiếm", "description": "Khi được bật, các tệp khớp với mẫu trong .rooignore sẽ được hiển thị trong danh sách với biểu tượng khóa. Khi bị tắt, các tệp này sẽ hoàn toàn bị ẩn khỏi danh sách tệp và tìm kiếm." + }, + "maxReadFile": { + "label": "Số dòng tối đa để đọc từ một tệp", + "description": "Số dòng tối đa để đọc từ một tệp cùng một lúc. Giá trị thấp hơn giảm sử dụng ngữ cảnh/tài nguyên nhưng có thể yêu cầu đọc nhiều lần hơn cho các tệp lớn." } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/vi/welcome.json b/webview-ui/src/i18n/locales/vi/welcome.json index e2eae822da..4801b80b7f 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/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 9e26958a95..a0310a5919 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}秒" }, "announcement": { - "title": "🎉 Roo Code 3.9 已发布", - "description": "Roo Code在3.9版本中实现了国际化!", + "title": "🎉 Roo Code 3.10 已发布", + "description": "Roo Code 3.10带来强大的生产力提升!", "whatsNew": "新特性", - "feature1": "14种语言的翻译", - "feature2": "通过SSE的MCP", - "feature3": "批量删除任务历史", - "feature4": "文字转语音", - "feature5": "OpenRouter提供商选择", + "feature1": "问题的建议回答", + "feature2": "改进的大文件处理", + "feature3": "重建的@-提及文件查找", + "feature4": "", + "feature5": "", "hideButton": "隐藏公告", "detailsDiscussLinks": "在DiscordReddit获取更多详情并参与讨论 🚀" }, diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 6c590a053d..aec816d94a 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "在列表和搜索中显示 .rooignore 文件", "description": "启用后,与 .rooignore 中模式匹配的文件将在列表中显示锁定符号。禁用时,这些文件将从文件列表和搜索中完全隐藏。" + }, + "maxReadFile": { + "label": "文件读取的最大行数", + "description": "一次从文件读取的最大行数。较低的值会减少上下文/资源使用,但可能需要对大文件进行更多次读取。" } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/zh-CN/welcome.json b/webview-ui/src/i18n/locales/zh-CN/welcome.json index dfa80dc7c6..523e026f52 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/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index dc6a9a6d63..69804c0f8f 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -201,14 +201,14 @@ "seconds": "{{count}}秒" }, "announcement": { - "title": "🎉 Roo Code 3.9 已發布", - "description": "Roo Code在3.9版本中實現了國際化!", + "title": "🎉 Roo Code 3.10 已發布", + "description": "Roo Code 3.10帶來強大的生產力提升!", "whatsNew": "新功能", - "feature1": "14種語言的翻譯", - "feature2": "透過SSE的MCP", - "feature3": "批次刪除任務歷史", - "feature4": "文字轉語音", - "feature5": "OpenRouter提供者選擇", + "feature1": "問題的建議回答", + "feature2": "改進的大檔案處理", + "feature3": "重建的@-提及檔案查詢", + "feature4": "", + "feature5": "", "hideButton": "隱藏公告", "detailsDiscussLinks": "在DiscordReddit取得更多詳情並參與討論 🚀" }, diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 534cdd81e4..a2778f5bb8 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -265,6 +265,10 @@ "rooignore": { "label": "在列表和搜尋中顯示 .rooignore 檔案", "description": "啟用後,與 .rooignore 中模式匹配的檔案將在列表中顯示鎖定符號。禁用時,這些檔案將從檔案列表和搜尋中完全隱藏。" + }, + "maxReadFile": { + "label": "從檔案讀取的最大行數", + "description": "一次從檔案讀取的最大行數。較低的值會減少內容/資源使用,但可能需要對大型檔案進行更多次讀取。" } }, "terminal": { diff --git a/webview-ui/src/i18n/locales/zh-TW/welcome.json b/webview-ui/src/i18n/locales/zh-TW/welcome.json index d3b912215c..7eadb6deb3 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": "拒絕" diff --git a/webview-ui/src/utils/__tests__/context-mentions.test.ts b/webview-ui/src/utils/__tests__/context-mentions.test.ts index ee40a9f724..bd3696f191 100644 --- a/webview-ui/src/utils/__tests__/context-mentions.test.ts +++ b/webview-ui/src/utils/__tests__/context-mentions.test.ts @@ -131,8 +131,8 @@ describe("shouldShowContextMenu", () => { expect(shouldShowContextMenu("Hello @http://test.com", 17)).toBe(false) }) - it("should return false for @problems", () => { + it("should return true for @problems", () => { // Position cursor at the end to test the full word - expect(shouldShowContextMenu("@problems", 9)).toBe(false) + expect(shouldShowContextMenu("@problems", 9)).toBe(true) }) }) diff --git a/webview-ui/src/utils/__tests__/model-utils.test.ts b/webview-ui/src/utils/__tests__/model-utils.test.ts index 3f667dc961..93898b7468 100644 --- a/webview-ui/src/utils/__tests__/model-utils.test.ts +++ b/webview-ui/src/utils/__tests__/model-utils.test.ts @@ -15,7 +15,7 @@ describe("Model utility functions", () => { /** * Testing the specific fix in commit cc79178f: * For thinking models, use apiConfig.modelMaxTokens if available, - * otherwise fall back to 16_384 (not modelInfo.maxTokens) + * otherwise fall back to 8192 (not modelInfo.maxTokens) */ it("should return apiConfig.modelMaxTokens for thinking models when provided", () => { diff --git a/webview-ui/src/utils/context-mentions.ts b/webview-ui/src/utils/context-mentions.ts index 600a2f760e..463eedb04e 100644 --- a/webview-ui/src/utils/context-mentions.ts +++ b/webview-ui/src/utils/context-mentions.ts @@ -1,7 +1,13 @@ import { mentionRegex } from "../../../src/shared/context-mentions" import { Fzf } from "fzf" import { ModeConfig } from "../../../src/shared/modes" +import * as path from "path" +export interface SearchResult { + path: string + type: "file" | "folder" + label?: string +} export function insertMention( text: string, position: number, @@ -80,6 +86,7 @@ export function getContextMenuOptions( query: string, selectedType: ContextMenuOptionType | null = null, queryItems: ContextMenuQueryItem[], + dynamicSearchResults: SearchResult[] = [], modes?: ModeConfig[], ): ContextMenuQueryItem[] { // Handle slash commands for modes @@ -203,7 +210,34 @@ export function getContextMenuOptions( } } - // Create searchable strings array for fzf + if (dynamicSearchResults.length > 0) { + // Convert search results to queryItems format + const searchResultItems = dynamicSearchResults.map((result) => { + const formattedPath = result.path.startsWith("/") ? result.path : `/${result.path}` + + return { + type: result.type === "folder" ? ContextMenuOptionType.Folder : ContextMenuOptionType.File, + value: formattedPath, + label: result.label || path.basename(result.path), + description: formattedPath, + } + }) + + const allItems = [...suggestions, ...searchResultItems] + + // Remove duplicates + const seen = new Set() + const deduped = allItems.filter((item) => { + const key = `${item.type}-${item.value}` + if (seen.has(key)) return false + seen.add(key) + return true + }) + + return deduped + } + + // Fallback to original static filtering if no dynamic results const searchableItems = queryItems.map((item) => ({ original: item, searchStr: [item.value, item.label, item.description].filter(Boolean).join(" "), @@ -257,26 +291,23 @@ export function shouldShowContextMenu(text: string, position: number): boolean { if (text.startsWith("/")) { return position <= text.length && !text.includes(" ") } - const beforeCursor = text.slice(0, position) const atIndex = beforeCursor.lastIndexOf("@") - if (atIndex === -1) return false + if (atIndex === -1) { + return false + } const textAfterAt = beforeCursor.slice(atIndex + 1) // Check if there's any whitespace after the '@' if (/\s/.test(textAfterAt)) return false - // Don't show the menu if it's a URL - if (textAfterAt.toLowerCase().startsWith("http")) return false - - // Don't show the menu if it's a problems or terminal - if (textAfterAt.toLowerCase().startsWith("problems") || textAfterAt.toLowerCase().startsWith("terminal")) + // Don't show the menu if it's clearly a URL + if (textAfterAt.toLowerCase().startsWith("http")) { return false + } - // NOTE: it's okay that menu shows when there's trailing punctuation since user could be inputting a path with marks - - // Show the menu if there's just '@' or '@' followed by some text (but not a URL) + // Show menu in all other cases return true }