diff --git a/.changeset/four-tools-pump.md b/.changeset/four-tools-pump.md deleted file mode 100644 index 6d5e50f35f..0000000000 --- a/.changeset/four-tools-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Show openrouter key balance on the settings screen diff --git a/.changeset/great-mice-turn.md b/.changeset/great-mice-turn.md deleted file mode 100644 index 0f8f9aea07..0000000000 --- a/.changeset/great-mice-turn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Remove redundant zod schemas diff --git a/.changeset/lazy-ducks-hang.md b/.changeset/lazy-ducks-hang.md deleted file mode 100644 index 6d580f0659..0000000000 --- a/.changeset/lazy-ducks-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Show requesty key balance on the settings screen diff --git a/.changeset/lucky-hairs-join.md b/.changeset/lucky-hairs-join.md deleted file mode 100644 index 095149b6a5..0000000000 --- a/.changeset/lucky-hairs-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Wrangle our settings-related types and add support for settings import / export diff --git a/.changeset/orange-items-remember.md b/.changeset/orange-items-remember.md deleted file mode 100644 index 180538a200..0000000000 --- a/.changeset/orange-items-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Consolidate logic that computes the current diff strategy diff --git a/.changeset/sweet-bugs-glow.md b/.changeset/sweet-bugs-glow.md deleted file mode 100644 index 5c4854d996..0000000000 --- a/.changeset/sweet-bugs-glow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Automatically generate .d.ts from zod schemas diff --git a/.changeset/two-months-drop.md b/.changeset/two-months-drop.md deleted file mode 100644 index 59c5cdfce6..0000000000 --- a/.changeset/two-months-drop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Add config getters to RooCodeAPI diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cf8d6473b..8cd2f60f64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Roo Code Changelog +## [3.11.1] - 2025-03-30 + +- Relax provider profiles schema and add telemetry + +## [3.11.0] - 2025-03-30 + +- Replace single-block-diff with multi-block-diff fast editing strategy +- Support project-level MCP config in .roo/mcp.json (thanks @aheizi!) +- Show OpenRouter and Requesty key balance on the settings screen +- Support import/export of settings +- Add pinning and sorting for API configuration dropdown (thanks @jwcraig!) +- Add Gemini 2.5 Pro to GCP Vertex AI provider (thanks @nbihan-mediware!) +- Smarter retry logic for Gemini +- Fix Gemini command escaping +- Support @-mentions of files with spaces in the name (thanks @samhvw8!) +- Improvements to partial file reads (thanks @KJ7LNW!) +- Fix list_code_definition_names to support files (thanks @KJ7LNW!) +- Refactor tool-calling logic to make the code a lot easier to work with (thanks @diarmidmackenzie, @bramburn, @KJ7LNW, and everyone else who helped!) +- Prioritize “Add to Context” in the code actions and include line numbers (thanks @samhvw8!) +- Add an activation command that other extensions can use to interface with Roo Code (thanks @gtaylor!) +- Preserve language characters in file @-mentions (thanks @aheizi!) +- Browser tool improvements (thanks @afshawnlotfi!) +- Display info about partial reads in the chat row +- Link to the settings page from the auto-approve toolbar +- Link to provider docs from the API options +- Fix switching profiles to ensure only the selected profile is switched (thanks @feifei325!) +- Allow custom o3-mini- model from OpenAI-compatible providers (thanks @snoyiatk!) +- Edit suggested answers before accepting them (thanks @samhvw8!) + ## [3.10.5] - 2025-03-25 - Updated value of max tokens for gemini-2.5-pro-03-25 to 65,536 (thanks @linegel!) diff --git a/README.md b/README.md index 47709fab60..eca761907a 100644 --- a/README.md +++ b/README.md @@ -48,13 +48,15 @@ Check out the [CHANGELOG](CHANGELOG.md) for detailed updates and fixes. --- -## 🎉 Roo Code 3.10 Released +## 🎉 Roo Code 3.11 Released -Roo Code 3.10 brings powerful productivity enhancements! +Roo Code 3.11 brings significant performance improvements and new features! -- 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 +- Fast Edits - Edits now apply way faster. Less waiting, more coding. +- API Key Balances - View your OpenRouter and Requesty balances in settings. +- Project-Level MCP Config - Now you can configure it per project/workspace. +- Improved Gemini Support - Smarter retries, fixed escaping, added to Vertex provider. +- Import/Export Settings - Easily back up or share your config across setups. --- @@ -180,26 +182,26 @@ 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
| -| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| -| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| feifei325
feifei325
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| -| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| -| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| -| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| -| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| -| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| -| jwcraig
jwcraig
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| vladstudio
vladstudio
| tgfjt
tgfjt
| AMHesch
AMHesch
| olup
olup
| moqimoqidea
moqimoqidea
| -| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| adamwlarson
adamwlarson
| -| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| -| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| -| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| -| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| -| maekawataiki
maekawataiki
| | | | | | +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index 1ae4abf0c4..f0532dbc68 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -47,13 +47,15 @@ Consulteu el [CHANGELOG](../CHANGELOG.md) per a actualitzacions i correccions de --- -## 🎉 Roo Code 3.10 Llançat +## 🎉 Roo Code 3.11 Llançat -Roo Code 3.10 aporta potents millores de productivitat! +Roo Code 3.11 aporta millores significatives de rendiment i noves funcionalitats! -- 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 +- Edicions ràpides - Les edicions ara s'apliquen molt més ràpid. Menys espera, més codificació. +- Saldos de claus d'API - Visualitza els teus saldos d'OpenRouter i Requesty a la configuració. +- Configuració MCP a nivell de projecte - Ara pots configurar-ho per projecte/espai de treball. +- Suport millorat per a Gemini - Reintents més intel·ligents, escapament corregit, afegit al proveïdor Vertex. +- Importació/Exportació de configuració - Fes còpies de seguretat o comparteix la teva configuració fàcilment entre diferents entorns. --- @@ -178,26 +180,28 @@ Ens encanten les contribucions de la comunitat! Comenceu llegint el nostre [CONT 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 277c9a7e83..8825d88de0 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -47,13 +47,15 @@ Sehen Sie sich das [CHANGELOG](../CHANGELOG.md) für detaillierte Updates und Fe --- -## 🎉 Roo Code 3.10 veröffentlicht +## 🎉 Roo Code 3.11 veröffentlicht -Roo Code 3.10 bringt leistungsstarke Produktivitätsverbesserungen! +Roo Code 3.11 bringt signifikante Leistungsverbesserungen und neue Funktionen! -- 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 +- Schnelle Bearbeitungen - Änderungen werden jetzt viel schneller angewendet. Weniger Wartezeit, mehr Coding. +- API-Schlüssel-Guthaben - Sieh dir deine OpenRouter- und Requesty-Guthaben in den Einstellungen an. +- Projekt-Level MCP-Konfiguration - Jetzt kannst du sie pro Projekt/Workspace konfigurieren. +- Verbesserte Gemini-Unterstützung - Intelligentere Wiederholungen, korrigiertes Escaping, zum Vertex-Provider hinzugefügt. +- Import/Export von Einstellungen - Sichere oder teile deine Konfiguration einfach über verschiedene Setups hinweg. --- @@ -178,26 +180,28 @@ Wir lieben Community-Beiträge! Beginnen Sie mit dem Lesen unserer [CONTRIBUTING 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index db368f1221..9e7c15b9bd 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -47,13 +47,15 @@ Consulta el [CHANGELOG](../CHANGELOG.md) para ver actualizaciones detalladas y c --- -## 🎉 Roo Code 3.10 Lanzado +## 🎉 Roo Code 3.11 Lanzado -¡Roo Code 3.10 trae potentes mejoras de productividad! +¡Roo Code 3.11 trae mejoras significativas de rendimiento y nuevas funcionalidades! -- 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 +- Ediciones rápidas - Las ediciones ahora se aplican mucho más rápido. Menos espera, más codificación. +- Saldos de claves API - Visualiza tus saldos de OpenRouter y Requesty en la configuración. +- Configuración MCP a nivel de proyecto - Ahora puedes configurarlo por proyecto/espacio de trabajo. +- Soporte mejorado para Gemini - Reintentos más inteligentes, escape corregido, añadido al proveedor Vertex. +- Importación/Exportación de configuración - Respalda o comparte fácilmente tu configuración entre diferentes entornos. --- @@ -178,26 +180,28 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p ¡Gracias a todos nuestros colaboradores que han ayudado a mejorar 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 16421964f0..27a9742e5d 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -47,13 +47,15 @@ Consultez le [CHANGELOG](../CHANGELOG.md) pour des mises à jour détaillées et --- -## 🎉 Roo Code 3.10 est sorti +## 🎉 Roo Code 3.11 est sorti -Roo Code 3.10 apporte de puissantes améliorations de productivité ! +Roo Code 3.11 apporte des améliorations significatives de performance et de nouvelles fonctionnalités ! -- 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 +- Éditions rapides - Les modifications s'appliquent maintenant beaucoup plus vite. Moins d'attente, plus de codage. +- Soldes des clés API - Visualisez vos soldes OpenRouter et Requesty dans les paramètres. +- Configuration MCP au niveau du projet - Vous pouvez maintenant la configurer par projet/espace de travail. +- Support Gemini amélioré - Nouvelles tentatives plus intelligentes, échappement corrigé, ajouté au fournisseur Vertex. +- Importation/Exportation des paramètres - Sauvegardez ou partagez facilement votre configuration entre différentes installations. --- @@ -178,26 +180,28 @@ Nous adorons les contributions de la communauté ! Commencez par lire notre [CON 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index fc2fb0b2c9..e2b01d74bb 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -47,13 +47,15 @@ --- -## 🎉 Roo Code 3.10 जारी +## 🎉 Roo Code 3.11 जारी -Roo Code 3.10 शक्तिशाली उत्पादकता सुधार लाता है! +Roo Code 3.11 महत्वपूर्ण प्रदर्शन सुधार और नई सुविधाएँ लाता है! -- प्रश्नों के लिए सुझाई गई प्रतिक्रियाएँ जो आपका टाइपिंग समय बचाती हैं -- फ़ाइल संरचना का मानचित्रण करके और केवल प्रासंगिक सामग्री पढ़कर बड़ी फ़ाइलों का बेहतर प्रबंधन -- पुनर्निर्मित @-मेंशन फ़ाइल लुकअप जो .gitignore का सम्मान करता है और ट्रैक की गई फ़ाइलों की संख्या पर कोई सीमा नहीं है +- तेज़ संपादन - संपादन अब बहुत तेज़ी से लागू होते हैं। कम प्रतीक्षा, अधिक कोडिंग। +- API कुंजी शेष - सेटिंग्स में अपने OpenRouter और Requesty शेष देखें। +- प्रोजेक्ट-स्तरीय MCP कॉन्फ़िगरेशन - अब आप इसे प्रति प्रोजेक्ट/वर्कस्पेस कॉन्फ़िगर कर सकते हैं। +- बेहतर Gemini सपोर्ट - स्मार्ट पुनर्प्रयास, ठीक किया गया एस्केपिंग, Vertex प्रदाता में जोड़ा गया। +- सेटिंग्स आयात/निर्यात - अपने कॉन्फ़िगरेशन को आसानी से बैकअप करें या विभिन्न सेटअप के बीच साझा करें। --- @@ -178,26 +180,28 @@ code --install-extension bin/roo-cline-.vsix 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index 6ec0af37b6..3deabba6f9 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -47,13 +47,15 @@ Consulta il [CHANGELOG](../CHANGELOG.md) per aggiornamenti dettagliati e correzi --- -## 🎉 Roo Code 3.10 Rilasciato +## 🎉 Roo Code 3.11 Rilasciato -Roo Code 3.10 porta potenti miglioramenti di produttività! +Roo Code 3.11 porta significativi miglioramenti di prestazioni e nuove funzionalità! -- 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 +- Modifiche veloci - Le modifiche ora vengono applicate molto più velocemente. Meno attesa, più codifica. +- Saldi delle chiavi API - Visualizza i tuoi saldi OpenRouter e Requesty nelle impostazioni. +- Configurazione MCP a livello di progetto - Ora puoi configurarla per progetto/area di lavoro. +- Supporto Gemini migliorato - Tentativi più intelligenti, escaping corretto, aggiunto al provider Vertex. +- Importazione/Esportazione impostazioni - Backup o condivisione facile della tua configurazione tra diverse installazioni. --- @@ -178,26 +180,28 @@ Amiamo i contributi della community! Inizia leggendo il nostro [CONTRIBUTING.md] 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index e8c24ceb9c..dda8710772 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -47,13 +47,15 @@ --- -## 🎉 Roo Code 3.10リリース +## 🎉 Roo Code 3.11リリース -Roo Code 3.10は強力な生産性向上機能をもたらします! +Roo Code 3.11は大幅なパフォーマンス向上と新機能をもたらします! -- 質問への提案回答機能でタイピング時間を節約 -- ファイル構造のマッピングと関連コンテンツのみの読み取りによる大きなファイルの取り扱い改善 -- .gitignoreを尊重し、追跡ファイル数に制限のない@メンションによるファイル検索機能の再構築 +- 高速編集 - 編集がより速く適用されるようになりました。待ち時間が少なく、コーディングがより効率的に。 +- APIキー残高 - OpenRouterとRequestyの残高を設定で確認できます。 +- プロジェクトレベルのMCP設定 - プロジェクト/ワークスペースごとに設定可能になりました。 +- Geminiサポートの改善 - より賢い再試行、エスケープの修正、Vertexプロバイダーへの追加。 +- 設定のインポート/エクスポート - 設定を簡単にバックアップしたり、異なる環境間で共有できます。 --- @@ -178,26 +180,28 @@ code --install-extension bin/roo-cline-.vsix 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 19c6c57fe5..905a929c4e 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -47,13 +47,15 @@ --- -## 🎉 Roo Code 3.10 출시 +## 🎉 Roo Code 3.11 출시 -Roo Code 3.10이 강력한 생산성 향상 기능을 제공합니다! +Roo Code 3.11이 중요한 성능 개선과 새로운 기능을 제공합니다! -- 질문에 대한 제안 응답으로 타이핑 시간 절약 -- 파일 구조 매핑과 관련 내용만 읽어 대용량 파일 처리 개선 -- .gitignore를 존중하고 추적 파일 수에 제한이 없는 @-언급 파일 검색 기능 재구축 +- 빠른 편집 - 편집이 이제 훨씬 더 빠르게 적용됩니다. 대기 시간은 적고, 코딩은 많이. +- API 키 잔액 - 설정에서 OpenRouter 및 Requesty 잔액을 확인할 수 있습니다. +- 프로젝트 수준 MCP 구성 - 이제 프로젝트/작업 공간별로 구성할 수 있습니다. +- 개선된 Gemini 지원 - 더 스마트한 재시도, 수정된 이스케이핑, Vertex 제공자에 추가됨. +- 설정 가져오기/내보내기 - 설정을 쉽게 백업하거나 다른 환경 간에 공유할 수 있습니다. --- @@ -178,26 +180,28 @@ code --install-extension bin/roo-cline-.vsix 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index 5afcf5a401..18196b00e5 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -47,13 +47,15 @@ Sprawdź [CHANGELOG](../CHANGELOG.md), aby uzyskać szczegółowe informacje o a --- -## 🎉 Roo Code 3.10 został wydany +## 🎉 Roo Code 3.11 został wydany -Roo Code 3.10 przynosi potężne usprawnienia produktywności! +Roo Code 3.11 przynosi znaczące usprawnienia wydajności i nowe funkcje! -- 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 +- Szybkie edycje - Zmiany są teraz stosowane znacznie szybciej. Mniej czekania, więcej kodowania. +- Salda kluczy API - Sprawdź stan swoich kont OpenRouter i Requesty w ustawieniach. +- Konfiguracja MCP na poziomie projektu - Teraz możesz skonfigurować ją dla każdego projektu/przestrzeni roboczej. +- Ulepszenia wsparcia dla Gemini - Inteligentniejsze ponawianie, poprawione escapowanie, dodano do dostawcy Vertex. +- Import/Export ustawień - Łatwo twórz kopie zapasowe lub udostępniaj swoją konfigurację między różnymi środowiskami. --- @@ -178,26 +180,28 @@ Kochamy wkład społeczności! Zacznij od przeczytania naszego [CONTRIBUTING.md] 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index eb8b164096..d9dd8fd4aa 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -47,13 +47,15 @@ Confira o [CHANGELOG](../CHANGELOG.md) para atualizações e correções detalha --- -## 🎉 Roo Code 3.10 Lançado +## 🎉 Roo Code 3.11 Lançado -O Roo Code 3.10 traz poderosas melhorias de produtividade! +O Roo Code 3.11 traz melhorias significativas de desempenho e novas funcionalidades! -- 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 +- Edições rápidas - As edições agora são aplicadas muito mais rápido. Menos espera, mais codificação. +- Saldos de chaves API - Visualize seus saldos OpenRouter e Requesty nas configurações. +- Configuração MCP em nível de projeto - Agora você pode configurá-la por projeto/espaço de trabalho. +- Suporte Gemini aprimorado - Repetições mais inteligentes, escape corrigido, adicionado ao provedor Vertex. +- Importação/Exportação de configurações - Faça backup ou compartilhe facilmente sua configuração entre diferentes ambientes. --- @@ -178,26 +180,28 @@ Adoramos contribuições da comunidade! Comece lendo nosso [CONTRIBUTING.md](CON Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melhor! -|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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index 24b5dd679e..be890a72fa 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -47,13 +47,15 @@ Detaylı güncellemeler ve düzeltmeler için [CHANGELOG](../CHANGELOG.md) dosya --- -## 🎉 Roo Code 3.10 Yayınlandı +## 🎉 Roo Code 3.11 Yayınlandı -Roo Code 3.10 güçlü üretkenlik iyileştirmeleri getiriyor! +Roo Code 3.11 önemli performans iyileştirmeleri ve yeni özellikler getiriyor! -- 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ı +- Hızlı Düzenlemeler - Düzenlemeler artık çok daha hızlı uygulanıyor. Daha az bekleme, daha çok kodlama. +- API Anahtar Bakiyeleri - OpenRouter ve Requesty bakiyelerinizi ayarlarda görüntüleyin. +- Proje Seviyesinde MCP Yapılandırması - Artık her proje/çalışma alanı için yapılandırabilirsiniz. +- Geliştirilmiş Gemini Desteği - Daha akıllı yeniden denemeler, düzeltilmiş kaçış karakterleri, Vertex sağlayıcısına eklendi. +- Ayarları İçe/Dışa Aktarma - Yapılandırmanızı farklı ortamlar arasında kolayca yedekleyin veya paylaşın. --- @@ -178,26 +180,28 @@ Topluluk katkılarını seviyoruz! [CONTRIBUTING.md](CONTRIBUTING.md) dosyasın Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara teşekkür ederiz! -|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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index e15a3063b8..46e00a3bc5 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -47,13 +47,15 @@ Kiểm tra [CHANGELOG](../CHANGELOG.md) để biết thông tin chi tiết về --- -## 🎉 Đã Phát Hành Roo Code 3.10 +## 🎉 Đã Phát Hành Roo Code 3.11 -Roo Code 3.10 mang đến những cải tiến năng suất mạnh mẽ! +Roo Code 3.11 mang đến những cải tiến hiệu suất đáng kể và các tính năng mới! -- 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 +- Chỉnh sửa nhanh - Các chỉnh sửa giờ đây được áp dụng nhanh hơn nhiều. Ít thời gian chờ đợi, nhiều thời gian lập trình. +- Số dư khóa API - Xem số dư OpenRouter và Requesty của bạn trong cài đặt. +- Cấu hình MCP cấp dự án - Giờ đây bạn có thể cấu hình theo từng dự án/không gian làm việc. +- Hỗ trợ Gemini được cải thiện - Thử lại thông minh hơn, sửa lỗi escape, thêm vào nhà cung cấp Vertex. +- Nhập/Xuất cài đặt - Dễ dàng sao lưu hoặc chia sẻ cấu hình của bạn giữa các môi trường khác nhau. --- @@ -178,26 +180,28 @@ Chúng tôi rất hoan nghênh đóng góp từ cộng đồng! Bắt đầu b Cảm ơn tất cả những người đóng góp đã giúp cải thiện 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index cad76e3ddf..d5addcab2e 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -47,13 +47,15 @@ --- -## 🎉 Roo Code 3.10 已发布 +## 🎉 Roo Code 3.11 已发布 -Roo Code 3.10 带来强大的生产力提升! +Roo Code 3.11 带来显著的性能改进和新功能! -- 问题的建议回答,为您节省打字时间 -- 通过映射文件结构并只读取相关内容来改进大文件处理 -- 重建的 @-提及文件查找功能,它尊重 .gitignore 并且对跟踪的文件数量没有限制 +- 快速编辑 - 编辑现在应用得更快。减少等待,增加编码。 +- API密钥余额 - 在设置中查看您的OpenRouter和Requesty余额。 +- 项目级MCP配置 - 现在您可以按项目/工作区进行配置。 +- 改进的Gemini支持 - 更智能的重试,修复了转义问题,添加到Vertex提供商。 +- 导入/导出设置 - 轻松备份或跨设置共享您的配置。 --- @@ -178,26 +180,28 @@ code --install-extension bin/roo-cline-.vsix 感谢所有帮助改进 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index bc34f94c8d..31e1d237c6 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -47,13 +47,15 @@ --- -## 🎉 Roo Code 3.10 已發布 +## 🎉 Roo Code 3.11 已發布 -Roo Code 3.10 帶來強大的生產力提升! +Roo Code 3.11 帶來顯著的效能改進和新功能! -- 問題的建議回答,為您節省打字時間 -- 透過映射檔案結構並只讀取相關內容來改進大檔案處理 -- 重建的 @-提及檔案查詢功能,它尊重 .gitignore 並且對追蹤的檔案數量沒有限制 +- 快速編輯 - 編輯現在套用得更快。減少等待,增加編碼。 +- API金鑰餘額 - 在設定中查看您的OpenRouter和Requesty餘額。 +- 專案級MCP設定 - 現在您可以依專案/工作區進行設定。 +- 改進的Gemini支援 - 更智慧的重試,修復了轉義問題,加入至Vertex提供者。 +- 匯入/匯出設定 - 輕鬆備份或跨設定共享您的配置。 --- @@ -178,26 +180,28 @@ code --install-extension bin/roo-cline-.vsix 感謝所有幫助改進 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
| -|hannesrudolph
hannesrudolph
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|punkpeye
punkpeye
|d-oit
d-oit
|monotykamary
monotykamary
| -|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
|KJ7LNW
KJ7LNW
|Szpadel
Szpadel
|lupuletic
lupuletic
| -|feifei325
feifei325
|qdaxb
qdaxb
|wkordalski
wkordalski
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|Premshay
Premshay
|psv2522
psv2522
| -|olweraltuve
olweraltuve
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|diarmidmackenzie
diarmidmackenzie
|emshvac
emshvac
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|sammcj
sammcj
|dtrugman
dtrugman
|aitoroses
aitoroses
| -|yt3trees
yt3trees
|yongjer
yongjer
|vincentsong
vincentsong
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|arthurauffray
arthurauffray
| -|heyseth
heyseth
|philfung
philfung
|napter
napter
|mdp
mdp
|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
| -|GitlyHallows
GitlyHallows
|benzntech
benzntech
|anton-otee
anton-otee
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| -|jwcraig
jwcraig
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|ashktn
ashktn
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
|vladstudio
vladstudio
|tgfjt
tgfjt
|AMHesch
AMHesch
|olup
olup
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|oprstchn
oprstchn
|philipnext
philipnext
|refactorthis
refactorthis
|samir-nimbly
samir-nimbly
|shaybc
shaybc
| -|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
|adamwlarson
adamwlarson
| -|alarno
alarno
|andreastempsch
andreastempsch
|Atlogit
Atlogit
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
| -|linegel
linegel
|celestial-vault
celestial-vault
|franekp
franekp
|DeXtroTip
DeXtroTip
|gtaylor
gtaylor
|hesara
hesara
| -|eltociear
eltociear
|Jdo300
Jdo300
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
| -|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|StevenTCramer
StevenTCramer
| -|maekawataiki
maekawataiki
| | | | | | + +| 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
| +| hannesrudolph
hannesrudolph
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| punkpeye
punkpeye
| d-oit
d-oit
| monotykamary
monotykamary
| +| cannuri
cannuri
| lloydchang
lloydchang
| feifei325
feifei325
| vigneshsubbiah16
vigneshsubbiah16
| KJ7LNW
KJ7LNW
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| qdaxb
qdaxb
| wkordalski
wkordalski
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| Premshay
Premshay
| psv2522
psv2522
| +| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| diarmidmackenzie
diarmidmackenzie
| emshvac
emshvac
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| sammcj
sammcj
| dtrugman
dtrugman
| aitoroses
aitoroses
| +| yt3trees
yt3trees
| yongjer
yongjer
| vincentsong
vincentsong
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| arthurauffray
arthurauffray
| +| heyseth
heyseth
| philfung
philfung
| napter
napter
| mdp
mdp
| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| +| GitlyHallows
GitlyHallows
| benzntech
benzntech
| anton-otee
anton-otee
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| +| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| ashktn
ashktn
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| vladstudio
vladstudio
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| AMHesch
AMHesch
| lightrabbit
lightrabbit
| olup
olup
| +| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| oprstchn
oprstchn
| philipnext
philipnext
| refactorthis
refactorthis
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| Atlogit
Atlogit
| bramburn
bramburn
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| franekp
franekp
| +| DeXtroTip
DeXtroTip
| gtaylor
gtaylor
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| libertyteeth
libertyteeth
| +| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| StevenTCramer
StevenTCramer
| | | | + ## 許可證 diff --git a/package-lock.json b/package-lock.json index c956d25f89..ff0804ba7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.10.5", + "version": "3.11.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.10.5", + "version": "3.11.1", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", diff --git a/package.json b/package.json index 122e08d77f..38319346b5 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Roo Code (prev. Roo Cline)", "description": "A whole dev team of AI agents in your editor.", "publisher": "RooVeterinaryInc", - "version": "3.10.5", + "version": "3.11.1", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", diff --git a/src/api/providers/glama.ts b/src/api/providers/glama.ts index cc0b06e611..43b6ebfb7a 100644 --- a/src/api/providers/glama.ts +++ b/src/api/providers/glama.ts @@ -88,7 +88,7 @@ export class GlamaHandler extends BaseProvider implements SingleCompletionHandle let maxTokens: number | undefined if (this.getModel().id.startsWith("anthropic/")) { - maxTokens = this.getModel().info.maxTokens + maxTokens = this.getModel().info.maxTokens ?? undefined } const requestOptions: OpenAI.Chat.ChatCompletionCreateParams = { diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index bc57591c01..fa71f67849 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -234,7 +234,7 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl ): ApiStream { if (this.options.openAiStreamingEnabled ?? true) { const stream = await this.client.chat.completions.create({ - model: "o3-mini", + model: modelId, messages: [ { role: "developer", diff --git a/src/api/providers/unbound.ts b/src/api/providers/unbound.ts index f83ecd457b..0413c96f29 100644 --- a/src/api/providers/unbound.ts +++ b/src/api/providers/unbound.ts @@ -79,7 +79,7 @@ export class UnboundHandler extends BaseProvider implements SingleCompletionHand let maxTokens: number | undefined if (this.getModel().id.startsWith("anthropic/")) { - maxTokens = this.getModel().info.maxTokens + maxTokens = this.getModel().info.maxTokens ?? undefined } const requestOptions: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming = { diff --git a/src/api/providers/vertex.ts b/src/api/providers/vertex.ts index bc888e0459..1f863c57cd 100644 --- a/src/api/providers/vertex.ts +++ b/src/api/providers/vertex.ts @@ -230,7 +230,7 @@ export class VertexHandler extends BaseProvider implements SingleCompletionHandl const result = await model.generateContentStream({ contents: messages.map(convertAnthropicMessageToVertexGemini), generationConfig: { - maxOutputTokens: this.getModel().info.maxTokens, + maxOutputTokens: this.getModel().info.maxTokens ?? undefined, temperature: this.options.modelTemperature ?? 0, }, }) diff --git a/src/core/config/ContextProxy.ts b/src/core/config/ContextProxy.ts index 835ca214f6..aa40477ad8 100644 --- a/src/core/config/ContextProxy.ts +++ b/src/core/config/ContextProxy.ts @@ -1,4 +1,5 @@ import * as vscode from "vscode" +import { ZodError } from "zod" import { PROVIDER_SETTINGS_KEYS, @@ -15,6 +16,7 @@ import { isSecretStateKey, } from "../../schemas" import { logger } from "../../utils/logging" +import { telemetryService } from "../../services/telemetry/TelemetryService" type GlobalStateKey = keyof GlobalState type SecretStateKey = keyof SecretState @@ -157,8 +159,10 @@ export class ContextProxy { try { return globalSettingsSchema.parse(values) } catch (error) { - // Log to Posthog? - // We'll want to know about bad type assumptions or bad ExtensionState data. + if (error instanceof ZodError) { + telemetryService.captureSchemaValidationError({ schemaName: "GlobalSettings", error }) + } + return GLOBAL_SETTINGS_KEYS.reduce((acc, key) => ({ ...acc, [key]: values[key] }), {} as GlobalSettings) } } @@ -173,8 +177,10 @@ export class ContextProxy { try { return providerSettingsSchema.parse(values) } catch (error) { - // Log to Posthog? - // We'll want to know about bad type assumptions or bad ExtensionState data. + if (error instanceof ZodError) { + telemetryService.captureSchemaValidationError({ schemaName: "ProviderSettings", error }) + } + return PROVIDER_SETTINGS_KEYS.reduce((acc, key) => ({ ...acc, [key]: values[key] }), {} as ProviderSettings) } } @@ -225,7 +231,10 @@ export class ContextProxy { const globalSettings = globalSettingsExportSchema.parse(this.getValues()) return Object.fromEntries(Object.entries(globalSettings).filter(([_, value]) => value !== undefined)) } catch (error) { - console.log(error.message) + if (error instanceof ZodError) { + telemetryService.captureSchemaValidationError({ schemaName: "GlobalSettings", error }) + } + return undefined } } diff --git a/src/core/config/ProviderSettingsManager.ts b/src/core/config/ProviderSettingsManager.ts index f4df9c0829..9729219a2d 100644 --- a/src/core/config/ProviderSettingsManager.ts +++ b/src/core/config/ProviderSettingsManager.ts @@ -1,8 +1,9 @@ import { ExtensionContext } from "vscode" -import { z } from "zod" +import { z, ZodError } from "zod" import { providerSettingsSchema, ApiConfigMeta } from "../../schemas" import { Mode, modes } from "../../shared/modes" +import { telemetryService } from "../../services/telemetry/TelemetryService" const providerSettingsWithIdSchema = providerSettingsSchema.extend({ id: z.string().optional() }) @@ -272,6 +273,10 @@ export class ProviderSettingsManager { const content = await this.context.secrets.get(this.secretsKey) return content ? providerProfilesSchema.parse(JSON.parse(content)) : this.defaultProviderProfiles } catch (error) { + if (error instanceof ZodError) { + telemetryService.captureSchemaValidationError({ schemaName: "ProviderProfiles", error }) + } + throw new Error(`Failed to read provider profiles from secrets: ${error}`) } } diff --git a/src/core/config/__tests__/importExport.test.ts b/src/core/config/__tests__/importExport.test.ts index 8df619f3bf..d472856975 100644 --- a/src/core/config/__tests__/importExport.test.ts +++ b/src/core/config/__tests__/importExport.test.ts @@ -2,7 +2,6 @@ import fs from "fs/promises" import * as path from "path" -import os from "os" import * as vscode from "vscode" @@ -37,6 +36,7 @@ jest.mock("os", () => ({ describe("importExport", () => { let mockProviderSettingsManager: jest.Mocked let mockContextProxy: jest.Mocked + let mockExtensionContext: jest.Mocked beforeEach(() => { // Reset all mocks @@ -55,6 +55,15 @@ describe("importExport", () => { setValue: jest.fn(), export: jest.fn().mockImplementation(() => Promise.resolve({})), } as unknown as jest.Mocked + + const map = new Map() + + mockExtensionContext = { + secrets: { + get: jest.fn().mockImplementation((key: string) => map.get(key)), + store: jest.fn().mockImplementation((key: string, value: string) => map.set(key, value)), + }, + } as unknown as jest.Mocked }) describe("importSettings", () => { @@ -161,9 +170,7 @@ describe("importExport", () => { // Invalid content (missing required fields) const mockInvalidContent = JSON.stringify({ - providerProfiles: { - apiConfigs: {}, - }, + providerProfiles: { apiConfigs: {} }, globalSettings: {}, }) @@ -219,6 +226,38 @@ describe("importExport", () => { expect(mockProviderSettingsManager.import).not.toHaveBeenCalled() expect(mockContextProxy.setValues).not.toHaveBeenCalled() }) + + it("should not clobber existing api configs", async () => { + const providerSettingsManager = new ProviderSettingsManager(mockExtensionContext) + await providerSettingsManager.saveConfig("openai", { apiProvider: "openai", id: "openai" }) + + const configs = await providerSettingsManager.listConfig() + expect(configs[0].name).toBe("default") + expect(configs[1].name).toBe("openai") + ;(vscode.window.showOpenDialog as jest.Mock).mockResolvedValue([{ fsPath: "/mock/path/settings.json" }]) + + const mockFileContent = JSON.stringify({ + globalSettings: { mode: "code" }, + providerProfiles: { + currentApiConfigName: "anthropic", + apiConfigs: { default: { apiProvider: "anthropic" as const, id: "anthropic" } }, + }, + }) + + ;(fs.readFile as jest.Mock).mockResolvedValue(mockFileContent) + + mockContextProxy.export.mockResolvedValue({ mode: "code" }) + + const result = await importSettings({ + providerSettingsManager, + contextProxy: mockContextProxy, + }) + + expect(result.success).toBe(true) + expect(result.providerProfiles?.apiConfigs["openai"]).toBeDefined() + expect(result.providerProfiles?.apiConfigs["default"]).toBeDefined() + expect(result.providerProfiles?.apiConfigs["default"].apiProvider).toBe("anthropic") + }) }) describe("exportSettings", () => { diff --git a/src/core/config/importExport.ts b/src/core/config/importExport.ts index 3bd2c2ede8..f8059160a2 100644 --- a/src/core/config/importExport.ts +++ b/src/core/config/importExport.ts @@ -30,15 +30,27 @@ export const importSettings = async ({ providerSettingsManager, contextProxy }: }) try { - const { providerProfiles, globalSettings } = schema.parse( + const previousProviderProfiles = await providerSettingsManager.export() + + const { providerProfiles: newProviderProfiles, globalSettings } = schema.parse( JSON.parse(await fs.readFile(uris[0].fsPath, "utf-8")), ) - const previousProviderProfiles = await providerSettingsManager.export() + const providerProfiles = { + currentApiConfigName: newProviderProfiles.currentApiConfigName, + apiConfigs: { + ...previousProviderProfiles.apiConfigs, + ...newProviderProfiles.apiConfigs, + }, + modeApiConfigs: { + ...previousProviderProfiles.modeApiConfigs, + ...newProviderProfiles.modeApiConfigs, + }, + } + + await providerSettingsManager.import(newProviderProfiles) await contextProxy.setValues(globalSettings) - await providerSettingsManager.import({ ...previousProviderProfiles, ...providerProfiles }) - contextProxy.setValue("currentApiConfigName", providerProfiles.currentApiConfigName) contextProxy.setValue("listApiConfigMeta", await providerSettingsManager.listConfig()) diff --git a/src/core/diff/DiffStrategy.ts b/src/core/diff/DiffStrategy.ts index fe354196c6..eacf0f1f22 100644 --- a/src/core/diff/DiffStrategy.ts +++ b/src/core/diff/DiffStrategy.ts @@ -1,5 +1,4 @@ import type { DiffStrategy } from "./types" -import { SearchReplaceDiffStrategy } from "./strategies/search-replace" import { NewUnifiedDiffStrategy } from "./strategies/new-unified" import { MultiSearchReplaceDiffStrategy } from "./strategies/multi-search-replace" import { EXPERIMENT_IDS, ExperimentId } from "../../shared/experiments" @@ -12,7 +11,7 @@ export type { DiffStrategy } * @returns The appropriate diff strategy for the model */ -export type DiffStrategyName = "unified" | "multi-search-and-replace" | "search-and-replace" +export type DiffStrategyName = "unified" | "multi-search-and-replace" type GetDiffStrategyOptions = { model: string @@ -23,6 +22,4 @@ type GetDiffStrategyOptions = { export const getDiffStrategy = ({ fuzzyMatchThreshold, experiments }: GetDiffStrategyOptions): DiffStrategy => experiments[EXPERIMENT_IDS.DIFF_STRATEGY_UNIFIED] ? new NewUnifiedDiffStrategy(fuzzyMatchThreshold) - : experiments[EXPERIMENT_IDS.DIFF_STRATEGY_MULTI_SEARCH_AND_REPLACE] - ? new MultiSearchReplaceDiffStrategy(fuzzyMatchThreshold) - : new SearchReplaceDiffStrategy(fuzzyMatchThreshold) + : new MultiSearchReplaceDiffStrategy(fuzzyMatchThreshold) diff --git a/src/core/diff/strategies/__tests__/search-replace.test.ts b/src/core/diff/strategies/__tests__/search-replace.test.ts deleted file mode 100644 index cd71edac47..0000000000 --- a/src/core/diff/strategies/__tests__/search-replace.test.ts +++ /dev/null @@ -1,1557 +0,0 @@ -import { SearchReplaceDiffStrategy } from "../search-replace" - -describe("SearchReplaceDiffStrategy", () => { - describe("exact matching", () => { - let strategy: SearchReplaceDiffStrategy - - beforeEach(() => { - strategy = new SearchReplaceDiffStrategy(1.0, 5) // Default 1.0 threshold for exact matching, 5 line buffer for tests - }) - - it("should replace matching content", async () => { - const originalContent = 'function hello() {\n console.log("hello")\n}\n' - const diffContent = `test.ts -<<<<<<< SEARCH -function hello() { - console.log("hello") -} -======= -function hello() { - console.log("hello world") -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe('function hello() {\n console.log("hello world")\n}\n') - } - }) - - it("should match content with different surrounding whitespace", async () => { - const originalContent = "\nfunction example() {\n return 42;\n}\n\n" - const diffContent = `test.ts -<<<<<<< SEARCH -function example() { - return 42; -} -======= -function example() { - return 43; -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("\nfunction example() {\n return 43;\n}\n\n") - } - }) - - it("should match content with different indentation in search block", async () => { - const originalContent = " function test() {\n return true;\n }\n" - const diffContent = `test.ts -<<<<<<< SEARCH -function test() { - return true; -} -======= -function test() { - return false; -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(" function test() {\n return false;\n }\n") - } - }) - - it("should handle tab-based indentation", async () => { - const originalContent = "function test() {\n\treturn true;\n}\n" - const diffContent = `test.ts -<<<<<<< SEARCH -function test() { -\treturn true; -} -======= -function test() { -\treturn false; -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\n\treturn false;\n}\n") - } - }) - - it("should preserve mixed tabs and spaces", async () => { - const originalContent = "\tclass Example {\n\t constructor() {\n\t\tthis.value = 0;\n\t }\n\t}" - const diffContent = `test.ts -<<<<<<< SEARCH -\tclass Example { -\t constructor() { -\t\tthis.value = 0; -\t } -\t} -======= -\tclass Example { -\t constructor() { -\t\tthis.value = 1; -\t } -\t} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - "\tclass Example {\n\t constructor() {\n\t\tthis.value = 1;\n\t }\n\t}", - ) - } - }) - - it("should handle additional indentation with tabs", async () => { - const originalContent = "\tfunction test() {\n\t\treturn true;\n\t}" - const diffContent = `test.ts -<<<<<<< SEARCH -function test() { -\treturn true; -} -======= -function test() { -\t// Add comment -\treturn false; -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("\tfunction test() {\n\t\t// Add comment\n\t\treturn false;\n\t}") - } - }) - - it("should preserve exact indentation characters when adding lines", async () => { - const originalContent = "\tfunction test() {\n\t\treturn true;\n\t}" - const diffContent = `test.ts -<<<<<<< SEARCH -\tfunction test() { -\t\treturn true; -\t} -======= -\tfunction test() { -\t\t// First comment -\t\t// Second comment -\t\treturn true; -\t} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - "\tfunction test() {\n\t\t// First comment\n\t\t// Second comment\n\t\treturn true;\n\t}", - ) - } - }) - - it("should handle Windows-style CRLF line endings", async () => { - const originalContent = "function test() {\r\n return true;\r\n}\r\n" - const diffContent = `test.ts -<<<<<<< SEARCH -function test() { - return true; -} -======= -function test() { - return false; -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\r\n return false;\r\n}\r\n") - } - }) - - it("should return false if search content does not match", async () => { - const originalContent = 'function hello() {\n console.log("hello")\n}\n' - const diffContent = `test.ts -<<<<<<< SEARCH -function hello() { - console.log("wrong") -} -======= -function hello() { - console.log("hello world") -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(false) - }) - - it("should return false if diff format is invalid", async () => { - const originalContent = 'function hello() {\n console.log("hello")\n}\n' - const diffContent = `test.ts\nInvalid diff format` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(false) - }) - - it("should handle multiple lines with proper indentation", async () => { - const originalContent = - "class Example {\n constructor() {\n this.value = 0\n }\n\n getValue() {\n return this.value\n }\n}\n" - const diffContent = `test.ts -<<<<<<< SEARCH - getValue() { - return this.value - } -======= - getValue() { - // Add logging - console.log("Getting value") - return this.value - } ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - 'class Example {\n constructor() {\n this.value = 0\n }\n\n getValue() {\n // Add logging\n console.log("Getting value")\n return this.value\n }\n}\n', - ) - } - }) - - it("should preserve whitespace exactly in the output", async () => { - const originalContent = " indented\n more indented\n back\n" - const diffContent = `test.ts -<<<<<<< SEARCH - indented - more indented - back -======= - modified - still indented - end ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(" modified\n still indented\n end\n") - } - }) - - it("should preserve indentation when adding new lines after existing content", async () => { - const originalContent = " onScroll={() => updateHighlights()}" - const diffContent = `test.ts -<<<<<<< SEARCH - onScroll={() => updateHighlights()} -======= - onScroll={() => updateHighlights()} - onDragOver={(e) => { - e.preventDefault() - e.stopPropagation() - }} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - " onScroll={() => updateHighlights()}\n onDragOver={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}", - ) - } - }) - - it("should handle varying indentation levels correctly", async () => { - const originalContent = ` -class Example { - constructor() { - this.value = 0; - if (true) { - this.init(); - } - } -}`.trim() - - const diffContent = `test.ts -<<<<<<< SEARCH - class Example { - constructor() { - this.value = 0; - if (true) { - this.init(); - } - } - } -======= - class Example { - constructor() { - this.value = 1; - if (true) { - this.init(); - this.setup(); - this.validate(); - } - } - } ->>>>>>> REPLACE`.trim() - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - ` -class Example { - constructor() { - this.value = 1; - if (true) { - this.init(); - this.setup(); - this.validate(); - } - } -}`.trim(), - ) - } - }) - - it("should handle mixed indentation styles in the same file", async () => { - const originalContent = `class Example { - constructor() { - this.value = 0; - if (true) { - this.init(); - } - } -}`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH - constructor() { - this.value = 0; - if (true) { - this.init(); - } - } -======= - constructor() { - this.value = 1; - if (true) { - this.init(); - this.validate(); - } - } ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Example { - constructor() { - this.value = 1; - if (true) { - this.init(); - this.validate(); - } - } -}`) - } - }) - - it("should handle Python-style significant whitespace", async () => { - const originalContent = `def example(): - if condition: - do_something() - for item in items: - process(item) - return True`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH - if condition: - do_something() - for item in items: - process(item) -======= - if condition: - do_something() - while items: - item = items.pop() - process(item) ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`def example(): - if condition: - do_something() - while items: - item = items.pop() - process(item) - return True`) - } - }) - - it("should preserve empty lines with indentation", async () => { - const originalContent = `function test() { - const x = 1; - - if (x) { - return true; - } -}`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH - const x = 1; - - if (x) { -======= - const x = 1; - - // Check x - if (x) { ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function test() { - const x = 1; - - // Check x - if (x) { - return true; - } -}`) - } - }) - - it("should handle indentation when replacing entire blocks", async () => { - const originalContent = `class Test { - method() { - if (true) { - console.log("test"); - } - } -}`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH - method() { - if (true) { - console.log("test"); - } - } -======= - method() { - try { - if (true) { - console.log("test"); - } - } catch (e) { - console.error(e); - } - } ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Test { - method() { - try { - if (true) { - console.log("test"); - } - } catch (e) { - console.error(e); - } - } -}`) - } - }) - - it("should handle negative indentation relative to search content", async () => { - const originalContent = `class Example { - constructor() { - if (true) { - this.init(); - this.setup(); - } - } -}`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH - this.init(); - this.setup(); -======= - this.init(); - this.setup(); ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Example { - constructor() { - if (true) { - this.init(); - this.setup(); - } - } -}`) - } - }) - - it("should handle extreme negative indentation (no indent)", async () => { - const originalContent = `class Example { - constructor() { - if (true) { - this.init(); - } - } -}`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH - this.init(); -======= -this.init(); ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Example { - constructor() { - if (true) { -this.init(); - } - } -}`) - } - }) - - it("should handle mixed indentation changes in replace block", async () => { - const originalContent = `class Example { - constructor() { - if (true) { - this.init(); - this.setup(); - this.validate(); - } - } -}`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH - this.init(); - this.setup(); - this.validate(); -======= - this.init(); - this.setup(); - this.validate(); ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Example { - constructor() { - if (true) { - this.init(); - this.setup(); - this.validate(); - } - } -}`) - } - }) - - it("should find matches from middle out", async () => { - const originalContent = ` -function one() { - return "target"; -} - -function two() { - return "target"; -} - -function three() { - return "target"; -} - -function four() { - return "target"; -} - -function five() { - return "target"; -}`.trim() - - const diffContent = `test.ts -<<<<<<< SEARCH - return "target"; -======= - return "updated"; ->>>>>>> REPLACE` - - // Search around the middle (function three) - // Even though all functions contain the target text, - // it should match the one closest to line 9 first - const result = await strategy.applyDiff(originalContent, diffContent, 9, 9) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function one() { - return "target"; -} - -function two() { - return "target"; -} - -function three() { - return "updated"; -} - -function four() { - return "target"; -} - -function five() { - return "target"; -}`) - } - }) - }) - - describe("line number stripping", () => { - describe("line number stripping", () => { - let strategy: SearchReplaceDiffStrategy - - beforeEach(() => { - strategy = new SearchReplaceDiffStrategy() - }) - - it("should strip line numbers from both search and replace sections", async () => { - const originalContent = "function test() {\n return true;\n}\n" - const diffContent = `test.ts -<<<<<<< SEARCH -1 | function test() { -2 | return true; -3 | } -======= -1 | function test() { -2 | return false; -3 | } ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\n return false;\n}\n") - } - }) - - it("should strip line numbers with leading spaces", async () => { - const originalContent = "function test() {\n return true;\n}\n" - const diffContent = `test.ts -<<<<<<< SEARCH - 1 | function test() { - 2 | return true; - 3 | } -======= - 1 | function test() { - 2 | return false; - 3 | } ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\n return false;\n}\n") - } - }) - - it("should not strip when not all lines have numbers in either section", async () => { - const originalContent = "function test() {\n return true;\n}\n" - const diffContent = `test.ts -<<<<<<< SEARCH -1 | function test() { -2 | return true; -3 | } -======= -1 | function test() { - return false; -3 | } ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(false) - }) - - it("should preserve content that naturally starts with pipe", async () => { - const originalContent = "|header|another|\n|---|---|\n|data|more|\n" - const diffContent = `test.ts -<<<<<<< SEARCH -1 | |header|another| -2 | |---|---| -3 | |data|more| -======= -1 | |header|another| -2 | |---|---| -3 | |data|updated| ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("|header|another|\n|---|---|\n|data|updated|\n") - } - }) - - it("should preserve indentation when stripping line numbers", async () => { - const originalContent = " function test() {\n return true;\n }\n" - const diffContent = `test.ts -<<<<<<< SEARCH -1 | function test() { -2 | return true; -3 | } -======= -1 | function test() { -2 | return false; -3 | } ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(" function test() {\n return false;\n }\n") - } - }) - - it("should handle different line numbers between sections", async () => { - const originalContent = "function test() {\n return true;\n}\n" - const diffContent = `test.ts -<<<<<<< SEARCH -10 | function test() { -11 | return true; -12 | } -======= -20 | function test() { -21 | return false; -22 | } ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function test() {\n return false;\n}\n") - } - }) - - it("should not strip content that starts with pipe but no line number", async () => { - const originalContent = "| Pipe\n|---|\n| Data\n" - const diffContent = `test.ts -<<<<<<< SEARCH -| Pipe -|---| -| Data -======= -| Pipe -|---| -| Updated ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("| Pipe\n|---|\n| Updated\n") - } - }) - - it("should handle mix of line-numbered and pipe-only content", async () => { - const originalContent = "| Pipe\n|---|\n| Data\n" - const diffContent = `test.ts -<<<<<<< SEARCH -| Pipe -|---| -| Data -======= -1 | | Pipe -2 | |---| -3 | | NewData ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("1 | | Pipe\n2 | |---|\n3 | | NewData\n") - } - }) - }) - }) - - describe("insertion/deletion", () => { - let strategy: SearchReplaceDiffStrategy - - beforeEach(() => { - strategy = new SearchReplaceDiffStrategy() - }) - - describe("deletion", () => { - it("should delete code when replace block is empty", async () => { - const originalContent = `function test() { - console.log("hello"); - // Comment to remove - console.log("world"); -}` - const diffContent = `test.ts -<<<<<<< SEARCH - // Comment to remove -======= ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function test() { - console.log("hello"); - console.log("world"); -}`) - } - }) - - it("should delete multiple lines when replace block is empty", async () => { - const originalContent = `class Example { - constructor() { - // Initialize - this.value = 0; - // Set defaults - this.name = ""; - // End init - } -}` - const diffContent = `test.ts -<<<<<<< SEARCH - // Initialize - this.value = 0; - // Set defaults - this.name = ""; - // End init -======= ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`class Example { - constructor() { - } -}`) - } - }) - - it("should preserve indentation when deleting nested code", async () => { - const originalContent = `function outer() { - if (true) { - // Remove this - console.log("test"); - // And this - } - return true; -}` - const diffContent = `test.ts -<<<<<<< SEARCH - // Remove this - console.log("test"); - // And this -======= ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function outer() { - if (true) { - } - return true; -}`) - } - }) - }) - - describe("insertion", () => { - it("should insert code at specified line when search block is empty", async () => { - const originalContent = `function test() { - const x = 1; - return x; -}` - const diffContent = `test.ts -<<<<<<< SEARCH -======= - console.log("Adding log"); ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent, 2, 2) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function test() { - console.log("Adding log"); - const x = 1; - return x; -}`) - } - }) - - it("should preserve indentation when inserting at nested location", async () => { - const originalContent = `function test() { - if (true) { - const x = 1; - } -}` - const diffContent = `test.ts -<<<<<<< SEARCH -======= - console.log("Before"); - console.log("After"); ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent, 3, 3) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function test() { - if (true) { - console.log("Before"); - console.log("After"); - const x = 1; - } -}`) - } - }) - - it("should handle insertion at start of file", async () => { - const originalContent = `function test() { - return true; -}` - const diffContent = `test.ts -<<<<<<< SEARCH -======= -// Copyright 2024 -// License: MIT - ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent, 1, 1) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`// Copyright 2024 -// License: MIT - -function test() { - return true; -}`) - } - }) - - it("should handle insertion at end of file", async () => { - const originalContent = `function test() { - return true; -}` - const diffContent = `test.ts -<<<<<<< SEARCH -======= - -// End of file ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent, 4, 4) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function test() { - return true; -} - -// End of file`) - } - }) - - it("should error if no start_line is provided for insertion", async () => { - const originalContent = `function test() { - return true; -}` - const diffContent = `test.ts -<<<<<<< SEARCH -======= -console.log("test"); ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(false) - }) - }) - }) - - describe("fuzzy matching", () => { - let strategy: SearchReplaceDiffStrategy - beforeEach(() => { - strategy = new SearchReplaceDiffStrategy(0.9, 5) // 90% similarity threshold, 5 line buffer for tests - }) - - it("should match content with small differences (>90% similar)", async () => { - const originalContent = - "function getData() {\n const results = fetchData();\n return results.filter(Boolean);\n}\n" - const diffContent = `test.ts -<<<<<<< SEARCH -function getData() { - const result = fetchData(); - return results.filter(Boolean); -} -======= -function getData() { - const data = fetchData(); - return data.filter(Boolean); -} ->>>>>>> REPLACE` - - strategy = new SearchReplaceDiffStrategy(0.9, 5) // Use 5 line buffer for tests - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe( - "function getData() {\n const data = fetchData();\n return data.filter(Boolean);\n}\n", - ) - } - }) - - it("should not match when content is too different (<90% similar)", async () => { - const originalContent = "function processUsers(data) {\n return data.map(user => user.name);\n}\n" - const diffContent = `test.ts -<<<<<<< SEARCH -function handleItems(items) { - return items.map(item => item.username); -} -======= -function processData(data) { - return data.map(d => d.value); -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(false) - }) - - it("should match content with extra whitespace", async () => { - const originalContent = "function sum(a, b) {\n return a + b;\n}" - const diffContent = `test.ts -<<<<<<< SEARCH -function sum(a, b) { - return a + b; -} -======= -function sum(a, b) { - return a + b + 1; -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe("function sum(a, b) {\n return a + b + 1;\n}") - } - }) - - it("should not exact match empty lines", async () => { - const originalContent = "function sum(a, b) {\n\n return a + b;\n}" - const diffContent = `test.ts -<<<<<<< SEARCH -function sum(a, b) { -======= -import { a } from "a"; -function sum(a, b) { ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe('import { a } from "a";\nfunction sum(a, b) {\n\n return a + b;\n}') - } - }) - }) - - describe("line-constrained search", () => { - let strategy: SearchReplaceDiffStrategy - - beforeEach(() => { - strategy = new SearchReplaceDiffStrategy(0.9, 5) - }) - - it("should find and replace within specified line range", async () => { - const originalContent = ` -function one() { - return 1; -} - -function two() { - return 2; -} - -function three() { - return 3; -} -`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH -function two() { - return 2; -} -======= -function two() { - return "two"; -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent, 5, 7) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function one() { - return 1; -} - -function two() { - return "two"; -} - -function three() { - return 3; -}`) - } - }) - - it("should find and replace within buffer zone (5 lines before/after)", async () => { - const originalContent = ` -function one() { - return 1; -} - -function two() { - return 2; -} - -function three() { - return 3; -} -`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH -function three() { - return 3; -} -======= -function three() { - return "three"; -} ->>>>>>> REPLACE` - - // Even though we specify lines 5-7, it should still find the match at lines 9-11 - // because it's within the 5-line buffer zone - const result = await strategy.applyDiff(originalContent, diffContent, 5, 7) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function one() { - return 1; -} - -function two() { - return 2; -} - -function three() { - return "three"; -}`) - } - }) - - it("should not find matches outside search range and buffer zone", async () => { - const originalContent = ` -function one() { - return 1; -} - -function two() { - return 2; -} - -function three() { - return 3; -} - -function four() { - return 4; -} - -function five() { - return 5; -} -`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH -function five() { - return 5; -} -======= -function five() { - return "five"; -} ->>>>>>> REPLACE` - - // Searching around function two() (lines 5-7) - // function five() is more than 5 lines away, so it shouldn't match - const result = await strategy.applyDiff(originalContent, diffContent, 5, 7) - expect(result.success).toBe(false) - }) - - it("should handle search range at start of file", async () => { - const originalContent = ` -function one() { - return 1; -} - -function two() { - return 2; -} -`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH -function one() { - return 1; -} -======= -function one() { - return "one"; -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent, 1, 3) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function one() { - return "one"; -} - -function two() { - return 2; -}`) - } - }) - - it("should handle search range at end of file", async () => { - const originalContent = ` -function one() { - return 1; -} - -function two() { - return 2; -} -`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH -function two() { - return 2; -} -======= -function two() { - return "two"; -} ->>>>>>> REPLACE` - - const result = await strategy.applyDiff(originalContent, diffContent, 5, 7) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function one() { - return 1; -} - -function two() { - return "two"; -}`) - } - }) - - it("should match specific instance of duplicate code using line numbers", async () => { - const originalContent = ` -function processData(data) { - return data.map(x => x * 2); -} - -function unrelatedStuff() { - console.log("hello"); -} - -// Another data processor -function processData(data) { - return data.map(x => x * 2); -} - -function moreStuff() { - console.log("world"); -} -`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH -function processData(data) { - return data.map(x => x * 2); -} -======= -function processData(data) { - // Add logging - console.log("Processing data..."); - return data.map(x => x * 2); -} ->>>>>>> REPLACE` - - // Target the second instance of processData - const result = await strategy.applyDiff(originalContent, diffContent, 10, 12) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function processData(data) { - return data.map(x => x * 2); -} - -function unrelatedStuff() { - console.log("hello"); -} - -// Another data processor -function processData(data) { - // Add logging - console.log("Processing data..."); - return data.map(x => x * 2); -} - -function moreStuff() { - console.log("world"); -}`) - } - }) - - it("should search from start line to end of file when only start_line is provided", async () => { - const originalContent = ` -function one() { - return 1; -} - -function two() { - return 2; -} - -function three() { - return 3; -} -`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH -function three() { - return 3; -} -======= -function three() { - return "three"; -} ->>>>>>> REPLACE` - - // Only provide start_line, should search from there to end of file - const result = await strategy.applyDiff(originalContent, diffContent, 8) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function one() { - return 1; -} - -function two() { - return 2; -} - -function three() { - return "three"; -}`) - } - }) - - it("should search from start of file to end line when only end_line is provided", async () => { - const originalContent = ` -function one() { - return 1; -} - -function two() { - return 2; -} - -function three() { - return 3; -} -`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH -function one() { - return 1; -} -======= -function one() { - return "one"; -} ->>>>>>> REPLACE` - - // Only provide end_line, should search from start of file to there - const result = await strategy.applyDiff(originalContent, diffContent, undefined, 4) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function one() { - return "one"; -} - -function two() { - return 2; -} - -function three() { - return 3; -}`) - } - }) - - it("should prioritize exact line match over expanded search", async () => { - const originalContent = ` -function one() { - return 1; -} - -function process() { - return "old"; -} - -function process() { - return "old"; -} - -function two() { - return 2; -}` - const diffContent = `test.ts -<<<<<<< SEARCH -function process() { - return "old"; -} -======= -function process() { - return "new"; -} ->>>>>>> REPLACE` - - // Should match the second instance exactly at lines 10-12 - // even though the first instance at 6-8 is within the expanded search range - const result = await strategy.applyDiff(originalContent, diffContent, 10, 12) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(` -function one() { - return 1; -} - -function process() { - return "old"; -} - -function process() { - return "new"; -} - -function two() { - return 2; -}`) - } - }) - - it("should fall back to expanded search only if exact match fails", async () => { - const originalContent = ` -function one() { - return 1; -} - -function process() { - return "target"; -} - -function two() { - return 2; -}`.trim() - const diffContent = `test.ts -<<<<<<< SEARCH -function process() { - return "target"; -} -======= -function process() { - return "updated"; -} ->>>>>>> REPLACE` - - // Specify wrong line numbers (3-5), but content exists at 6-8 - // Should still find and replace it since it's within the expanded range - const result = await strategy.applyDiff(originalContent, diffContent, 3, 5) - expect(result.success).toBe(true) - if (result.success) { - expect(result.content).toBe(`function one() { - return 1; -} - -function process() { - return "updated"; -} - -function two() { - return 2; -}`) - } - }) - }) - - describe("getToolDescription", () => { - let strategy: SearchReplaceDiffStrategy - - beforeEach(() => { - strategy = new SearchReplaceDiffStrategy() - }) - - it("should include the current working directory", async () => { - const cwd = "/test/dir" - const description = await strategy.getToolDescription({ cwd }) - expect(description).toContain(`relative to the current working directory ${cwd}`) - }) - - it("should include required format elements", async () => { - const description = await strategy.getToolDescription({ cwd: "/test" }) - expect(description).toContain("<<<<<<< SEARCH") - expect(description).toContain("=======") - expect(description).toContain(">>>>>>> REPLACE") - expect(description).toContain("") - expect(description).toContain("") - }) - - it("should document start_line and end_line parameters", async () => { - const description = await strategy.getToolDescription({ cwd: "/test" }) - expect(description).toContain("start_line: (required) The line number where the search block starts.") - expect(description).toContain("end_line: (required) The line number where the search block ends.") - }) - }) -}) diff --git a/src/core/diff/strategies/search-replace.ts b/src/core/diff/strategies/search-replace.ts deleted file mode 100644 index 0f1ad1d1e8..0000000000 --- a/src/core/diff/strategies/search-replace.ts +++ /dev/null @@ -1,306 +0,0 @@ -import { DiffStrategy, DiffResult } from "../types" -import { addLineNumbers, everyLineHasLineNumbers, stripLineNumbers } from "../../../integrations/misc/extract-text" -import { distance } from "fastest-levenshtein" - -const BUFFER_LINES = 20 // Number of extra context lines to show before and after matches - -function getSimilarity(original: string, search: string): number { - if (search === "") { - return 1 - } - - // Normalize strings by removing extra whitespace but preserve case - const normalizeStr = (str: string) => str.replace(/\s+/g, " ").trim() - - const normalizedOriginal = normalizeStr(original) - const normalizedSearch = normalizeStr(search) - - if (normalizedOriginal === normalizedSearch) { - return 1 - } - - // Calculate Levenshtein distance using fastest-levenshtein's distance function - const dist = distance(normalizedOriginal, normalizedSearch) - - // Calculate similarity ratio (0 to 1, where 1 is an exact match) - const maxLength = Math.max(normalizedOriginal.length, normalizedSearch.length) - return 1 - dist / maxLength -} - -export class SearchReplaceDiffStrategy implements DiffStrategy { - private fuzzyThreshold: number - private bufferLines: number - - getName(): string { - return "SearchReplace" - } - - constructor(fuzzyThreshold?: number, bufferLines?: number) { - // Use provided threshold or default to exact matching (1.0) - // Note: fuzzyThreshold is inverted in UI (0% = 1.0, 10% = 0.9) - // so we use it directly here - this.fuzzyThreshold = fuzzyThreshold ?? 1.0 - this.bufferLines = bufferLines ?? BUFFER_LINES - } - - getToolDescription(args: { cwd: string; toolOptions?: { [key: string]: string } }): string { - return `## apply_diff -Description: Request to replace existing code using a search and replace block. -This tool allows for precise, surgical replaces to files by specifying exactly what content to search for and what to replace it with. -The tool will maintain proper indentation and formatting while making changes. -Only a single operation is allowed per tool use. -The SEARCH section must exactly match existing content including whitespace and indentation. -If you're not confident in the exact content to search for, use the read_file tool first to get the exact content. -When applying the diffs, be extra careful to remember to change any closing brackets or other syntax that may be affected by the diff farther down in the file. - -Parameters: -- path: (required) The path of the file to modify (relative to the current working directory ${args.cwd}) -- diff: (required) The search/replace block defining the changes. -- start_line: (required) The line number where the search block starts. -- end_line: (required) The line number where the search block ends. - -Diff format: -\`\`\` -<<<<<<< SEARCH -[exact content to find including whitespace] -======= -[new content to replace with] ->>>>>>> REPLACE -\`\`\` - -Example: - -Original file: -\`\`\` -1 | def calculate_total(items): -2 | total = 0 -3 | for item in items: -4 | total += item -5 | return total -\`\`\` - -Search/Replace content: -\`\`\` -<<<<<<< SEARCH -def calculate_total(items): - total = 0 - for item in items: - total += item - return total -======= -def calculate_total(items): - """Calculate total with 10% markup""" - return sum(item * 1.1 for item in items) ->>>>>>> REPLACE -\`\`\` - -Usage: - -File path here - -Your search/replace content here - -1 -5 -` - } - - async applyDiff( - originalContent: string, - diffContent: string, - startLine?: number, - endLine?: number, - ): Promise { - // Extract the search and replace blocks - const match = diffContent.match(/<<<<<<< SEARCH\n([\s\S]*?)\n?=======\n([\s\S]*?)\n?>>>>>>> REPLACE/) - if (!match) { - return { - success: false, - error: `Invalid diff format - missing required SEARCH/REPLACE sections\n\nDebug Info:\n- Expected Format: <<<<<<< SEARCH\\n[search content]\\n=======\\n[replace content]\\n>>>>>>> REPLACE\n- Tip: Make sure to include both SEARCH and REPLACE sections with correct markers`, - } - } - - let [_, searchContent, replaceContent] = match - - // Detect line ending from original content - const lineEnding = originalContent.includes("\r\n") ? "\r\n" : "\n" - - // Strip line numbers from search and replace content if every line starts with a line number - if (everyLineHasLineNumbers(searchContent) && everyLineHasLineNumbers(replaceContent)) { - searchContent = stripLineNumbers(searchContent) - replaceContent = stripLineNumbers(replaceContent) - } - - // Split content into lines, handling both \n and \r\n - const searchLines = searchContent === "" ? [] : searchContent.split(/\r?\n/) - const replaceLines = replaceContent === "" ? [] : replaceContent.split(/\r?\n/) - const originalLines = originalContent.split(/\r?\n/) - - // Validate that empty search requires start line - if (searchLines.length === 0 && !startLine) { - return { - success: false, - error: `Empty search content requires start_line to be specified\n\nDebug Info:\n- Empty search content is only valid for insertions at a specific line\n- For insertions, specify the line number where content should be inserted`, - } - } - - // Validate that empty search requires same start and end line - if (searchLines.length === 0 && startLine && endLine && startLine !== endLine) { - return { - success: false, - error: `Empty search content requires start_line and end_line to be the same (got ${startLine}-${endLine})\n\nDebug Info:\n- Empty search content is only valid for insertions at a specific line\n- For insertions, use the same line number for both start_line and end_line`, - } - } - - // Initialize search variables - let matchIndex = -1 - let bestMatchScore = 0 - let bestMatchContent = "" - const searchChunk = searchLines.join("\n") - - // Determine search bounds - let searchStartIndex = 0 - let searchEndIndex = originalLines.length - - // Validate and handle line range if provided - if (startLine && endLine) { - // Convert to 0-based index - const exactStartIndex = startLine - 1 - const exactEndIndex = endLine - 1 - - if (exactStartIndex < 0 || exactEndIndex > originalLines.length || exactStartIndex > exactEndIndex) { - return { - success: false, - error: `Line range ${startLine}-${endLine} is invalid (file has ${originalLines.length} lines)\n\nDebug Info:\n- Requested Range: lines ${startLine}-${endLine}\n- File Bounds: lines 1-${originalLines.length}`, - } - } - - // Try exact match first - const originalChunk = originalLines.slice(exactStartIndex, exactEndIndex + 1).join("\n") - const similarity = getSimilarity(originalChunk, searchChunk) - if (similarity >= this.fuzzyThreshold) { - matchIndex = exactStartIndex - bestMatchScore = similarity - bestMatchContent = originalChunk - } else { - // Set bounds for buffered search - searchStartIndex = Math.max(0, startLine - (this.bufferLines + 1)) - searchEndIndex = Math.min(originalLines.length, endLine + this.bufferLines) - } - } - - // If no match found yet, try middle-out search within bounds - if (matchIndex === -1) { - const midPoint = Math.floor((searchStartIndex + searchEndIndex) / 2) - let leftIndex = midPoint - let rightIndex = midPoint + 1 - - // Search outward from the middle within bounds - while (leftIndex >= searchStartIndex || rightIndex <= searchEndIndex - searchLines.length) { - // Check left side if still in range - if (leftIndex >= searchStartIndex) { - const originalChunk = originalLines.slice(leftIndex, leftIndex + searchLines.length).join("\n") - const similarity = getSimilarity(originalChunk, searchChunk) - if (similarity > bestMatchScore) { - bestMatchScore = similarity - matchIndex = leftIndex - bestMatchContent = originalChunk - } - leftIndex-- - } - - // Check right side if still in range - if (rightIndex <= searchEndIndex - searchLines.length) { - const originalChunk = originalLines.slice(rightIndex, rightIndex + searchLines.length).join("\n") - const similarity = getSimilarity(originalChunk, searchChunk) - if (similarity > bestMatchScore) { - bestMatchScore = similarity - matchIndex = rightIndex - bestMatchContent = originalChunk - } - rightIndex++ - } - } - } - - // Require similarity to meet threshold - if (matchIndex === -1 || bestMatchScore < this.fuzzyThreshold) { - const searchChunk = searchLines.join("\n") - const originalContentSection = - startLine !== undefined && endLine !== undefined - ? `\n\nOriginal Content:\n${addLineNumbers( - originalLines - .slice( - Math.max(0, startLine - 1 - this.bufferLines), - Math.min(originalLines.length, endLine + this.bufferLines), - ) - .join("\n"), - Math.max(1, startLine - this.bufferLines), - )}` - : `\n\nOriginal Content:\n${addLineNumbers(originalLines.join("\n"))}` - - const bestMatchSection = bestMatchContent - ? `\n\nBest Match Found:\n${addLineNumbers(bestMatchContent, matchIndex + 1)}` - : `\n\nBest Match Found:\n(no match)` - - const lineRange = - startLine || endLine - ? ` at ${startLine ? `start: ${startLine}` : "start"} to ${endLine ? `end: ${endLine}` : "end"}` - : "" - return { - success: false, - error: `No sufficiently similar match found${lineRange} (${Math.floor(bestMatchScore * 100)}% similar, needs ${Math.floor(this.fuzzyThreshold * 100)}%)\n\nDebug Info:\n- Similarity Score: ${Math.floor(bestMatchScore * 100)}%\n- Required Threshold: ${Math.floor(this.fuzzyThreshold * 100)}%\n- Search Range: ${startLine && endLine ? `lines ${startLine}-${endLine}` : "start to end"}\n- Tip: Use read_file to get the latest content of the file before attempting the diff again, as the file content may have changed\n\nSearch Content:\n${searchChunk}${bestMatchSection}${originalContentSection}`, - } - } - - // Get the matched lines from the original content - const matchedLines = originalLines.slice(matchIndex, matchIndex + searchLines.length) - - // Get the exact indentation (preserving tabs/spaces) of each line - const originalIndents = matchedLines.map((line) => { - const match = line.match(/^[\t ]*/) - return match ? match[0] : "" - }) - - // Get the exact indentation of each line in the search block - const searchIndents = searchLines.map((line) => { - const match = line.match(/^[\t ]*/) - return match ? match[0] : "" - }) - - // Apply the replacement while preserving exact indentation - const indentedReplaceLines = replaceLines.map((line, i) => { - // Get the matched line's exact indentation - const matchedIndent = originalIndents[0] || "" - - // Get the current line's indentation relative to the search content - const currentIndentMatch = line.match(/^[\t ]*/) - const currentIndent = currentIndentMatch ? currentIndentMatch[0] : "" - const searchBaseIndent = searchIndents[0] || "" - - // Calculate the relative indentation level - const searchBaseLevel = searchBaseIndent.length - const currentLevel = currentIndent.length - const relativeLevel = currentLevel - searchBaseLevel - - // If relative level is negative, remove indentation from matched indent - // If positive, add to matched indent - const finalIndent = - relativeLevel < 0 - ? matchedIndent.slice(0, Math.max(0, matchedIndent.length + relativeLevel)) - : matchedIndent + currentIndent.slice(searchBaseLevel) - - return finalIndent + line.trim() - }) - - // Construct the final content - const beforeMatch = originalLines.slice(0, matchIndex) - const afterMatch = originalLines.slice(matchIndex + searchLines.length) - - const finalContent = [...beforeMatch, ...indentedReplaceLines, ...afterMatch].join(lineEnding) - return { - success: true, - content: finalContent, - } - } -} diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index dcf7f3ab33..e9538bc308 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -4031,22 +4031,26 @@ Only a single operation is allowed per tool use. The SEARCH section must exactly match existing content including whitespace and indentation. If you're not confident in the exact content to search for, use the read_file tool first to get the exact content. When applying the diffs, be extra careful to remember to change any closing brackets or other syntax that may be affected by the diff farther down in the file. +ALWAYS make as many changes in a single 'apply_diff' request as possible using multiple SEARCH/REPLACE blocks Parameters: - path: (required) The path of the file to modify (relative to the current working directory /test/path) - diff: (required) The search/replace block defining the changes. -- start_line: (required) The line number where the search block starts. -- end_line: (required) The line number where the search block ends. Diff format: \`\`\` <<<<<<< SEARCH +:start_line: (required) The line number of original content where the search block starts. +:end_line: (required) The line number of original content where the search block ends. +------- [exact content to find including whitespace] ======= [new content to replace with] >>>>>>> REPLACE + \`\`\` + Example: Original file: @@ -4061,6 +4065,9 @@ Original file: Search/Replace content: \`\`\` <<<<<<< SEARCH +:start_line:1 +:end_line:5 +------- def calculate_total(items): total = 0 for item in items: @@ -4071,16 +4078,43 @@ def calculate_total(items): """Calculate total with 10% markup""" return sum(item * 1.1 for item in items) >>>>>>> REPLACE + \`\`\` +Search/Replace content with multi edits: +\`\`\` +<<<<<<< SEARCH +:start_line:1 +:end_line:2 +------- +def calculate_sum(items): + sum = 0 +======= +def calculate_sum(items): + sum = 0 +>>>>>>> REPLACE + +<<<<<<< SEARCH +:start_line:4 +:end_line:5 +------- + total += item + return total +======= + sum += item + return sum +>>>>>>> REPLACE +\`\`\` + + Usage: File path here Your search/replace content here +You can use multi search/replace block in one diff block, but make sure to include the line numbers for each block. +Only use a single line of '=======' between search and replacement content, because multiple '=======' will corrupt the file. -1 -5 ## write_to_file diff --git a/src/core/prompts/__tests__/system.test.ts b/src/core/prompts/__tests__/system.test.ts index 8fd0046501..4a29b2f4d8 100644 --- a/src/core/prompts/__tests__/system.test.ts +++ b/src/core/prompts/__tests__/system.test.ts @@ -3,11 +3,11 @@ import * as vscode from "vscode" import { SYSTEM_PROMPT } from "../system" import { McpHub } from "../../../services/mcp/McpHub" import { ClineProvider } from "../../../core/webview/ClineProvider" -import { SearchReplaceDiffStrategy } from "../../../core/diff/strategies/search-replace" import { defaultModeSlug, modes, Mode, ModeConfig } from "../../../shared/modes" import "../../../utils/path" // Import path utils to get access to toPosix string extension. import { addCustomInstructions } from "../sections/custom-instructions" import { EXPERIMENT_IDS } from "../../../shared/experiments" +import { MultiSearchReplaceDiffStrategy } from "../../diff/strategies/multi-search-replace" // Mock the sections jest.mock("../sections/modes", () => ({ @@ -171,7 +171,7 @@ describe("SYSTEM_PROMPT", () => { beforeEach(() => { // Reset experiments before each test to ensure they're disabled by default experiments = { - [EXPERIMENT_IDS.DIFF_STRATEGY_SEARCH_AND_REPLACE]: false, + [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: false, [EXPERIMENT_IDS.INSERT_BLOCK]: false, } }) @@ -295,7 +295,7 @@ describe("SYSTEM_PROMPT", () => { "/test/path", false, // supportsComputerUse undefined, // mcpHub - new SearchReplaceDiffStrategy(), // Use actual diff strategy from the codebase + new MultiSearchReplaceDiffStrategy(), // Use actual diff strategy from the codebase undefined, // browserViewportSize defaultModeSlug, // mode undefined, // customModePrompts @@ -316,7 +316,7 @@ describe("SYSTEM_PROMPT", () => { "/test/path", false, // supportsComputerUse undefined, // mcpHub - new SearchReplaceDiffStrategy(), // Use actual diff strategy from the codebase + new MultiSearchReplaceDiffStrategy(), // Use actual diff strategy from the codebase undefined, // browserViewportSize defaultModeSlug, // mode undefined, // customModePrompts @@ -337,7 +337,7 @@ describe("SYSTEM_PROMPT", () => { "/test/path", false, // supportsComputerUse undefined, // mcpHub - new SearchReplaceDiffStrategy(), // Use actual diff strategy from the codebase + new MultiSearchReplaceDiffStrategy(), // Use actual diff strategy from the codebase undefined, // browserViewportSize defaultModeSlug, // mode undefined, // customModePrompts @@ -482,7 +482,7 @@ describe("SYSTEM_PROMPT", () => { it("should disable experimental tools by default", async () => { // Set experiments to explicitly disable experimental tools const experimentsConfig = { - [EXPERIMENT_IDS.DIFF_STRATEGY_SEARCH_AND_REPLACE]: false, + [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: false, [EXPERIMENT_IDS.INSERT_BLOCK]: false, } @@ -516,7 +516,7 @@ describe("SYSTEM_PROMPT", () => { it("should enable experimental tools when explicitly enabled", async () => { // Set experiments for testing experimental features const experimentsEnabled = { - [EXPERIMENT_IDS.DIFF_STRATEGY_SEARCH_AND_REPLACE]: true, + [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: true, [EXPERIMENT_IDS.INSERT_BLOCK]: true, } @@ -552,7 +552,7 @@ describe("SYSTEM_PROMPT", () => { it("should selectively enable experimental tools", async () => { // Set experiments for testing selective enabling const experimentsSelective = { - [EXPERIMENT_IDS.DIFF_STRATEGY_SEARCH_AND_REPLACE]: true, + [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: true, [EXPERIMENT_IDS.INSERT_BLOCK]: false, } @@ -587,7 +587,7 @@ describe("SYSTEM_PROMPT", () => { it("should list all available editing tools in base instruction", async () => { const experiments = { - [EXPERIMENT_IDS.DIFF_STRATEGY_SEARCH_AND_REPLACE]: true, + [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: true, [EXPERIMENT_IDS.INSERT_BLOCK]: true, } @@ -596,7 +596,7 @@ describe("SYSTEM_PROMPT", () => { "/test/path", false, undefined, - new SearchReplaceDiffStrategy(), + new MultiSearchReplaceDiffStrategy(), undefined, defaultModeSlug, undefined, @@ -615,7 +615,7 @@ describe("SYSTEM_PROMPT", () => { }) it("should provide detailed instructions for each enabled tool", async () => { const experiments = { - [EXPERIMENT_IDS.DIFF_STRATEGY_SEARCH_AND_REPLACE]: true, + [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: true, [EXPERIMENT_IDS.INSERT_BLOCK]: true, } @@ -624,7 +624,7 @@ describe("SYSTEM_PROMPT", () => { "/test/path", false, undefined, - new SearchReplaceDiffStrategy(), + new MultiSearchReplaceDiffStrategy(), undefined, defaultModeSlug, undefined, diff --git a/src/core/sliding-window/index.ts b/src/core/sliding-window/index.ts index 67c0028fab..75395ecd75 100644 --- a/src/core/sliding-window/index.ts +++ b/src/core/sliding-window/index.ts @@ -60,7 +60,7 @@ type TruncateOptions = { messages: Anthropic.Messages.MessageParam[] totalTokens: number contextWindow: number - maxTokens?: number + maxTokens?: number | null apiHandler: ApiHandler } diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index f0027b322a..f4e25f298d 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -100,7 +100,7 @@ export class ClineProvider extends EventEmitter implements private clineStack: Cline[] = [] private workspaceTracker?: WorkspaceTracker protected mcpHub?: McpHub // Change from private to protected - private latestAnnouncementId = "mar-20-2025-3-10" // update to some unique identifier when we add a new announcement + private latestAnnouncementId = "mar-30-2025-3-11" // update for v3.11.0 announcement private settingsImportedAt?: number public readonly contextProxy: ContextProxy public readonly providerSettingsManager: ProviderSettingsManager diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 4554813a9c..3149a0b1b3 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -28,7 +28,7 @@ type ProviderSettings = { glamaModelId?: string | undefined glamaModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -47,7 +47,7 @@ type ProviderSettings = { openRouterModelId?: string | undefined openRouterModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -84,7 +84,7 @@ type ProviderSettings = { openAiModelId?: string | undefined openAiCustomModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -126,7 +126,7 @@ type ProviderSettings = { unboundModelId?: string | undefined unboundModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -144,7 +144,7 @@ type ProviderSettings = { requestyModelId?: string | undefined requestyModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -254,7 +254,6 @@ type GlobalSettings = { | { search_and_replace: boolean experimentalDiffStrategy: boolean - multi_search_and_replace: boolean insert_content: boolean powerSteering: boolean } diff --git a/src/exports/types.ts b/src/exports/types.ts index b12806f4a0..20f583fb60 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -29,7 +29,7 @@ type ProviderSettings = { glamaModelId?: string | undefined glamaModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -48,7 +48,7 @@ type ProviderSettings = { openRouterModelId?: string | undefined openRouterModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -85,7 +85,7 @@ type ProviderSettings = { openAiModelId?: string | undefined openAiCustomModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -127,7 +127,7 @@ type ProviderSettings = { unboundModelId?: string | undefined unboundModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -145,7 +145,7 @@ type ProviderSettings = { requestyModelId?: string | undefined requestyModelInfo?: | ({ - maxTokens?: number | undefined + maxTokens?: (number | null) | undefined contextWindow: number supportsImages?: boolean | undefined supportsComputerUse?: boolean | undefined @@ -257,7 +257,6 @@ type GlobalSettings = { | { search_and_replace: boolean experimentalDiffStrategy: boolean - multi_search_and_replace: boolean insert_content: boolean powerSteering: boolean } diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 89797758a5..e397635d41 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -100,7 +100,7 @@ export type TelemetrySetting = z.infer */ export const modelInfoSchema = z.object({ - maxTokens: z.number().optional(), + maxTokens: z.number().nullish(), contextWindow: z.number(), supportsImages: z.boolean().optional(), supportsComputerUse: z.boolean().optional(), @@ -277,7 +277,6 @@ export type CustomSupportPrompts = z.infer export const experimentIds = [ "search_and_replace", "experimentalDiffStrategy", - "multi_search_and_replace", "insert_content", "powerSteering", ] as const @@ -293,7 +292,6 @@ export type ExperimentId = z.infer const experimentsSchema = z.object({ search_and_replace: z.boolean(), experimentalDiffStrategy: z.boolean(), - multi_search_and_replace: z.boolean(), insert_content: z.boolean(), powerSteering: z.boolean(), }) diff --git a/src/services/telemetry/TelemetryService.ts b/src/services/telemetry/TelemetryService.ts index d3ea8bfb5f..30145c6b98 100644 --- a/src/services/telemetry/TelemetryService.ts +++ b/src/services/telemetry/TelemetryService.ts @@ -1,5 +1,7 @@ import { PostHog } from "posthog-node" import * as vscode from "vscode" +import { ZodError } from "zod" + import { logger } from "../../utils/logging" // This forward declaration is needed to avoid circular dependencies @@ -26,6 +28,9 @@ class PostHogClient { CHECKPOINT_RESTORED: "Checkpoint Restored", CHECKPOINT_DIFFED: "Checkpoint Diffed", }, + ERRORS: { + SCHEMA_VALIDATION_ERROR: "Schema Validation Error", + }, } private static instance: PostHogClient @@ -261,6 +266,14 @@ class TelemetryService { this.captureEvent(PostHogClient.EVENTS.TASK.CHECKPOINT_RESTORED, { taskId }) } + public captureSchemaValidationError({ schemaName, error }: { schemaName: string; error: ZodError }): void { + this.captureEvent(PostHogClient.EVENTS.ERRORS.SCHEMA_VALIDATION_ERROR, { + schemaName, + // https://zod.dev/ERROR_HANDLING?id=formatting-errors + error: error.format(), + }) + } + /** * Checks if telemetry is currently enabled * @returns Whether telemetry is enabled diff --git a/src/shared/__tests__/experiments.test.ts b/src/shared/__tests__/experiments.test.ts index a192b260cf..4214f8e390 100644 --- a/src/shared/__tests__/experiments.test.ts +++ b/src/shared/__tests__/experiments.test.ts @@ -17,7 +17,6 @@ describe("experiments", () => { experimentalDiffStrategy: false, search_and_replace: false, insert_content: false, - multi_search_and_replace: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(false) }) @@ -28,7 +27,6 @@ describe("experiments", () => { experimentalDiffStrategy: false, search_and_replace: false, insert_content: false, - multi_search_and_replace: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(true) }) @@ -39,7 +37,6 @@ describe("experiments", () => { search_and_replace: false, insert_content: false, powerSteering: false, - multi_search_and_replace: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(false) }) diff --git a/src/shared/experiments.ts b/src/shared/experiments.ts index 9d931d5a07..c6f28551c3 100644 --- a/src/shared/experiments.ts +++ b/src/shared/experiments.ts @@ -4,10 +4,9 @@ import { AssertEqual, Equals, Keys, Values } from "../utils/type-fu" export type { ExperimentId } export const EXPERIMENT_IDS = { - DIFF_STRATEGY_SEARCH_AND_REPLACE: "search_and_replace", DIFF_STRATEGY_UNIFIED: "experimentalDiffStrategy", - DIFF_STRATEGY_MULTI_SEARCH_AND_REPLACE: "multi_search_and_replace", INSERT_BLOCK: "insert_content", + SEARCH_AND_REPLACE: "search_and_replace", POWER_STEERING: "powerSteering", } as const satisfies Record @@ -20,10 +19,9 @@ interface ExperimentConfig { } export const experimentConfigsMap: Record = { - DIFF_STRATEGY_SEARCH_AND_REPLACE: { enabled: false }, DIFF_STRATEGY_UNIFIED: { enabled: false }, - DIFF_STRATEGY_MULTI_SEARCH_AND_REPLACE: { enabled: false }, INSERT_BLOCK: { enabled: false }, + SEARCH_AND_REPLACE: { enabled: false }, POWER_STEERING: { enabled: false }, } diff --git a/webview-ui/src/__mocks__/lucide-react.ts b/webview-ui/src/__mocks__/lucide-react.ts index 64ab05eb34..e22005eff3 100644 --- a/webview-ui/src/__mocks__/lucide-react.ts +++ b/webview-ui/src/__mocks__/lucide-react.ts @@ -4,4 +4,5 @@ export const Check = () => React.createElement("div") export const ChevronsUpDown = () => React.createElement("div") export const Loader = () => React.createElement("div") export const X = () => React.createElement("div") +export const Edit = () => React.createElement("div") export const Database = (props: any) => React.createElement("span", { "data-testid": "database-icon", ...props }) diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx index 0653105399..4960a6b64b 100644 --- a/webview-ui/src/components/chat/Announcement.tsx +++ b/webview-ui/src/components/chat/Announcement.tsx @@ -64,7 +64,7 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {

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

-
    +
      {[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 7fe200c3e9..c09ae23783 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -33,7 +33,7 @@ interface ChatRowProps { isStreaming: boolean onToggleExpand: () => void onHeightChange: (isTaller: boolean) => void - onSuggestionClick?: (answer: string) => void + onSuggestionClick?: (answer: string, event?: React.MouseEvent) => void } interface ChatRowContentProps extends Omit {} diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 4075485732..5f913c82f4 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -1055,8 +1055,15 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie isLast={index === groupedMessages.length - 1} onHeightChange={handleRowHeightChange} isStreaming={isStreaming} - onSuggestionClick={(answer: string) => { - handleSendMessage(answer, []) + onSuggestionClick={(answer: string, event?: React.MouseEvent) => { + if (event?.shiftKey) { + // Always append to existing text, don't overwrite + setInputValue((currentValue) => { + return currentValue !== "" ? `${currentValue} \n${answer}` : answer + }) + } else { + handleSendMessage(answer, []) + } }} /> ) diff --git a/webview-ui/src/components/chat/FollowUpSuggest.tsx b/webview-ui/src/components/chat/FollowUpSuggest.tsx index 24dc42ca7d..25371dc502 100644 --- a/webview-ui/src/components/chat/FollowUpSuggest.tsx +++ b/webview-ui/src/components/chat/FollowUpSuggest.tsx @@ -1,17 +1,20 @@ import { useCallback } from "react" import { cn } from "../../lib/utils" import { Button } from "../ui/button" +import { Edit } from "lucide-react" +import { useAppTranslation } from "../../i18n/TranslationContext" interface FollowUpSuggestProps { suggestions?: string[] - onSuggestionClick?: (answer: string) => void + onSuggestionClick?: (answer: string, event?: React.MouseEvent) => void ts: number } const FollowUpSuggest = ({ suggestions = [], onSuggestionClick, ts = 1 }: FollowUpSuggestProps) => { + const { t } = useAppTranslation() const handleSuggestionClick = useCallback( - (suggestion: string) => { - onSuggestionClick?.(suggestion) + (suggestion: string, event: React.MouseEvent) => { + onSuggestionClick?.(suggestion, event) }, [onSuggestionClick], ) @@ -26,14 +29,29 @@ const FollowUpSuggest = ({ suggestions = [], onSuggestionClick, ts = 1 }: Follow
      {suggestions.map((suggestion) => ( -
      +
      +
      { + e.stopPropagation() + // Simulate shift-click by directly calling the handler with shiftKey=true + onSuggestionClick?.(suggestion, { ...e, shiftKey: true }) + }} + title={t("chat:followUpSuggest.copyToInput")}> + +
      ))}
      diff --git a/webview-ui/src/components/settings/AdvancedSettings.tsx b/webview-ui/src/components/settings/AdvancedSettings.tsx index a54386ad30..36e0a8f380 100644 --- a/webview-ui/src/components/settings/AdvancedSettings.tsx +++ b/webview-ui/src/components/settings/AdvancedSettings.tsx @@ -6,7 +6,7 @@ import { Cog } from "lucide-react" import { EXPERIMENT_IDS, ExperimentId } from "../../../../src/shared/experiments" import { cn } from "@/lib/utils" -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Slider } from "@/components/ui" +import { Slider } from "@/components/ui" import { SetCachedStateField, SetExperimentEnabled } from "./types" import { SectionHeader } from "./SectionHeader" @@ -67,9 +67,8 @@ export const AdvancedSettings = ({ onChange={(e: any) => { setCachedStateField("diffEnabled", e.target.checked) if (!e.target.checked) { - // Reset both experimental strategies when diffs are disabled. + // Reset experimental strategies when diffs are disabled. setExperimentEnabled(EXPERIMENT_IDS.DIFF_STRATEGY_UNIFIED, false) - setExperimentEnabled(EXPERIMENT_IDS.DIFF_STRATEGY_MULTI_SEARCH_AND_REPLACE, false) } }}> {t("settings:advanced.diff.label")} @@ -81,63 +80,6 @@ export const AdvancedSettings = ({ {diffEnabled && (
      -
      - - -
      - {experiments[EXPERIMENT_IDS.DIFF_STRATEGY_UNIFIED] - ? t("settings:advanced.diff.strategy.descriptions.unified") - : experiments[EXPERIMENT_IDS.DIFF_STRATEGY_MULTI_SEARCH_AND_REPLACE] - ? t("settings:advanced.diff.strategy.descriptions.multiBlock") - : t("settings:advanced.diff.strategy.descriptions.standard")} -
      -
      -