From d5fe876c9bdae660cd3cb2645773f051b7876b77 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 18 Apr 2025 14:56:01 -0700 Subject: [PATCH 01/89] v3.13.1 (#2774) --- .changeset/wet-knives-call.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/wet-knives-call.md diff --git a/.changeset/wet-knives-call.md b/.changeset/wet-knives-call.md new file mode 100644 index 0000000000..cbf2bc91c4 --- /dev/null +++ b/.changeset/wet-knives-call.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +v3.13.1 From 2a5d472f0d6da33db69e12e4835c06bf61461b2c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 18 Apr 2025 15:14:38 -0700 Subject: [PATCH 02/89] Update contributors list (#2770) docs: update contributors list [skip ci] Co-authored-by: cte --- README.md | 8 ++++---- locales/ca/README.md | 8 ++++---- locales/de/README.md | 8 ++++---- locales/es/README.md | 8 ++++---- locales/fr/README.md | 8 ++++---- locales/hi/README.md | 8 ++++---- locales/it/README.md | 8 ++++---- locales/ja/README.md | 8 ++++---- locales/ko/README.md | 8 ++++---- locales/pl/README.md | 8 ++++---- locales/pt-BR/README.md | 8 ++++---- locales/tr/README.md | 8 ++++---- locales/vi/README.md | 8 ++++---- locales/zh-CN/README.md | 8 ++++---- locales/zh-TW/README.md | 8 ++++---- 15 files changed, 60 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 71bc66bdf8..ee3cb0ef38 100644 --- a/README.md +++ b/README.md @@ -189,10 +189,10 @@ Thanks to all our contributors who have helped make Roo Code better! | wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| | lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| | emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| -| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| -| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| -| sachasayan
sachasayan
| ross
ross
| philfung
philfung
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| | Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| | anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| | olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| diff --git a/locales/ca/README.md b/locales/ca/README.md index 82c36ad8ea..b46d018c99 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -186,10 +186,10 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/de/README.md b/locales/de/README.md index 3cb474f80f..c5299cfce7 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -186,10 +186,10 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/es/README.md b/locales/es/README.md index 5f3d825e05..b31d035add 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -186,10 +186,10 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/fr/README.md b/locales/fr/README.md index 56cd0b4d93..4447abe755 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -186,10 +186,10 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/hi/README.md b/locales/hi/README.md index 6f0512179e..914eaa0033 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -186,10 +186,10 @@ Roo Code को बेहतर बनाने में मदद करने |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/it/README.md b/locales/it/README.md index c5f925180d..8a7c63f67b 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -186,10 +186,10 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/ja/README.md b/locales/ja/README.md index b83c23f91b..6746bb6d6b 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -186,10 +186,10 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/ko/README.md b/locales/ko/README.md index fde14a4f91..fd567dbb58 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -186,10 +186,10 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/pl/README.md b/locales/pl/README.md index de7aea7c03..c398714a50 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -186,10 +186,10 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index d71df8eff8..22b4856b70 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -186,10 +186,10 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/tr/README.md b/locales/tr/README.md index 0ec8114ffc..2c57d3d8d1 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -186,10 +186,10 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/vi/README.md b/locales/vi/README.md index 070eaeb563..c84830a62e 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -186,10 +186,10 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index a7e716bcc5..f61833e6e4 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -186,10 +186,10 @@ code --install-extension bin/roo-cline-.vsix |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 8336eeb139..a0482aecff 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -187,10 +187,10 @@ code --install-extension bin/roo-cline-.vsix |wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| |lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| |emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
| -|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
| -|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
| -|sachasayan
sachasayan
|ross
ross
|philfung
philfung
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| |Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| |anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| |olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| From b8b90737fa707eaf4f0512fbf1a3d5a6320571be Mon Sep 17 00:00:00 2001 From: R00-B0T <110429663+R00-B0T@users.noreply.github.com> Date: Fri, 18 Apr 2025 17:39:24 -0700 Subject: [PATCH 03/89] Changeset version bump (#2768) * changeset version bump * Update CHANGELOG.md * Update CHANGELOG.md * Update CHANGELOG.md * Update CHANGELOG.md --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Chris Estreich --- .changeset/four-trainers-move.md | 5 ----- .changeset/shiny-poems-search.md | 5 ----- .changeset/wet-knives-call.md | 5 ----- CHANGELOG.md | 9 ++++++++- package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 11 insertions(+), 19 deletions(-) delete mode 100644 .changeset/four-trainers-move.md delete mode 100644 .changeset/shiny-poems-search.md delete mode 100644 .changeset/wet-knives-call.md diff --git a/.changeset/four-trainers-move.md b/.changeset/four-trainers-move.md deleted file mode 100644 index b6aaf84160..0000000000 --- a/.changeset/four-trainers-move.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Move executeCommand out of Cline and add telemetry for shell integration errors diff --git a/.changeset/shiny-poems-search.md b/.changeset/shiny-poems-search.md deleted file mode 100644 index 699843060e..0000000000 --- a/.changeset/shiny-poems-search.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Support Gemini 2.5 Flash thinking mode diff --git a/.changeset/wet-knives-call.md b/.changeset/wet-knives-call.md deleted file mode 100644 index cbf2bc91c4..0000000000 --- a/.changeset/wet-knives-call.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -v3.13.1 diff --git a/CHANGELOG.md b/CHANGELOG.md index bc344d0b44..a7bd81d204 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,19 @@ # Roo Code Changelog +## [3.13.1] - 2025-04-18 + +- Support Gemini 2.5 Flash thinking mode (thanks @monotykamary) +- Make auto-approval toggle on/off states more obvious (thanks @sachasayan) +- Add telemetry for shell integration errors +- Fix the path of files dragging into the chat textarea on Windows (thanks @NyxJae) + ## [3.13.0] - 2025-04-17 - UI improvements to task header, chat view, history preview, and welcome view (thanks @sachasayan!) - Add append_to_file tool for appending content to files (thanks @samhvw8!) - Add Gemini 2.5 Flash Preview to Gemini and Vertex providers (thanks @nbihan-mediware!) - Fix image support in Bedrock (thanks @Smartsheet-JB-Brown!) -- Make diff edits more resilient to models passing in incorrect parameters +- Make diff edits more resilient to models passing in incorrect parameters ## [3.12.3] - 2025-04-17 diff --git a/package-lock.json b/package-lock.json index fa1a5a7c13..251cf7f2d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.13.0", + "version": "3.13.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.13.0", + "version": "3.13.1", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", diff --git a/package.json b/package.json index ff026fa5cc..a267a9b790 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.13.0", + "version": "3.13.1", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From c10600e35445e048c9b8302be51df502b5e886da Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 18 Apr 2025 19:25:42 -0700 Subject: [PATCH 04/89] Pass baseURL to Gemini API if googleGeminiBaseUrl is set (#2776) --- .changeset/stale-bikes-jam.md | 5 +++++ src/api/providers/gemini.ts | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 .changeset/stale-bikes-jam.md diff --git a/.changeset/stale-bikes-jam.md b/.changeset/stale-bikes-jam.md new file mode 100644 index 0000000000..095e3ccc37 --- /dev/null +++ b/.changeset/stale-bikes-jam.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Allow custom URLs for Gemini provider diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index 7389611300..4bf3b293bb 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -30,6 +30,9 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl model, contents: messages.map(convertAnthropicMessageToGemini), config: { + httpOptions: this.options.googleGeminiBaseUrl + ? { baseUrl: this.options.googleGeminiBaseUrl } + : undefined, thinkingConfig, maxOutputTokens, temperature: this.options.modelTemperature ?? 0, From e74b69dfbc29e258c9ea41676cf7fa6350e63b4c Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 18 Apr 2025 21:01:21 -0700 Subject: [PATCH 05/89] v3.13 announcement (#2778) * v3.13 announcement * Update README.md * Update lastShownAnnouncementId * Tweak copy --- .changeset/neat-dodos-serve.md | 5 ++ README.md | 10 ++-- locales/ca/README.md | 60 +++++++++++---------- locales/de/README.md | 60 +++++++++++---------- locales/es/README.md | 60 +++++++++++---------- locales/fr/README.md | 60 +++++++++++---------- locales/hi/README.md | 60 +++++++++++---------- locales/it/README.md | 60 +++++++++++---------- locales/ja/README.md | 60 +++++++++++---------- locales/ko/README.md | 60 +++++++++++---------- locales/pl/README.md | 60 +++++++++++---------- locales/pt-BR/README.md | 60 +++++++++++---------- locales/tr/README.md | 60 +++++++++++---------- locales/vi/README.md | 60 +++++++++++---------- locales/zh-CN/README.md | 60 +++++++++++---------- locales/zh-TW/README.md | 60 +++++++++++---------- src/core/webview/ClineProvider.ts | 2 +- webview-ui/src/i18n/locales/ca/chat.json | 10 ++-- webview-ui/src/i18n/locales/de/chat.json | 10 ++-- webview-ui/src/i18n/locales/en/chat.json | 10 ++-- webview-ui/src/i18n/locales/es/chat.json | 10 ++-- webview-ui/src/i18n/locales/fr/chat.json | 10 ++-- webview-ui/src/i18n/locales/hi/chat.json | 10 ++-- webview-ui/src/i18n/locales/it/chat.json | 10 ++-- webview-ui/src/i18n/locales/ja/chat.json | 10 ++-- webview-ui/src/i18n/locales/ko/chat.json | 10 ++-- webview-ui/src/i18n/locales/pl/chat.json | 10 ++-- webview-ui/src/i18n/locales/pt-BR/chat.json | 10 ++-- webview-ui/src/i18n/locales/tr/chat.json | 10 ++-- webview-ui/src/i18n/locales/vi/chat.json | 10 ++-- webview-ui/src/i18n/locales/zh-CN/chat.json | 10 ++-- webview-ui/src/i18n/locales/zh-TW/chat.json | 10 ++-- 32 files changed, 520 insertions(+), 487 deletions(-) create mode 100644 .changeset/neat-dodos-serve.md diff --git a/.changeset/neat-dodos-serve.md b/.changeset/neat-dodos-serve.md new file mode 100644 index 0000000000..5b3910d211 --- /dev/null +++ b/.changeset/neat-dodos-serve.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Roo Code v3.13 announcement diff --git a/README.md b/README.md index ee3cb0ef38..77cfda4b3f 100644 --- a/README.md +++ b/README.md @@ -49,13 +49,13 @@ Check out the [CHANGELOG](CHANGELOG.md) for detailed updates and fixes. --- -## 🎉 Roo Code 3.12 Released +## 🎉 Roo Code 3.13 Released -Roo Code 3.12 brings new features and improvements based on your feedback! +Roo Code 3.13 brings new features and improvements based on your feedback! -- **Grok Support** - Added the xAI provider and Grok reasoning effort options on OpenRouter. -- **Diff Editing Improvements** - Per-profile configuration and better string normalization for fewer errors. -- **Checkpoint Enhancements** - Faster and more reliable checkpoints. +- **Gemini 2.5 Flash Thinking** - You can now use the thinking variant of Gemini 2.5 Flash and specify a thinking token budget. +- **UI Improvements** - The task header, chat view, history preview, and welcome view have been visually upgraded. +- **Bug Fixes** - More reliable diff edits & more. --- diff --git a/locales/ca/README.md b/locales/ca/README.md index b46d018c99..f93b31abc3 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -47,13 +47,13 @@ Consulteu el [CHANGELOG](../CHANGELOG.md) per a actualitzacions i correccions de --- -## 🎉 Roo Code 3.12 Llançat +## 🎉 Roo Code 3.13 Llançat -Roo Code 3.12 aporta noves funcionalitats i millores basades en els vostres comentaris! +Roo Code 3.13 aporta noves funcionalitats i millores basades en els vostres comentaris! -- **Suport per a Grok** - S'ha afegit el proveïdor xAI i opcions d'esforç de raonament per als models Grok a OpenRouter. -- **Millores en l'edició de diferències** - Configuració per perfil i millor normalització de cadenes per reduir errors. -- **Punts de control més ràpids** - Punts de control més ràpids i fiables. +- **Gemini 2.5 Flash Thinking** - Ara podeu utilitzar la variant de pensament de Gemini 2.5 Flash i especificar un pressupost de tokens de pensament. +- **Millores d'interfície d'usuari** - La capçalera de tasques, la vista de xat, la previsualització de l'historial i la vista de benvinguda han estat visualment millorades. +- **Correccions d'errors** - Edicions de diferències més fiables i més. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index c5299cfce7..11ca9f6b9c 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -47,13 +47,13 @@ Sehen Sie sich das [CHANGELOG](../CHANGELOG.md) für detaillierte Updates und Fe --- -## 🎉 Roo Code 3.12 veröffentlicht +## 🎉 Roo Code 3.13 veröffentlicht -Roo Code 3.12 bringt neue Funktionen und Verbesserungen basierend auf deinem Feedback! +Roo Code 3.13 bringt neue Funktionen und Verbesserungen basierend auf deinem Feedback! -- **Grok-Unterstützung** - Der xAI-Provider wurde hinzugefügt und Grok-Reasoning-Effort-Optionen auf OpenRouter. -- **Verbesserungen bei Diff-Bearbeitungen** - Konfiguration pro Profil und bessere String-Normalisierung für weniger Fehler. -- **Verbesserungen bei Checkpoints** - Schnellere und zuverlässigere Checkpoints. +- **Gemini 2.5 Flash Thinking** - Du kannst jetzt die Thinking-Variante von Gemini 2.5 Flash verwenden und ein Thinking-Token-Budget festlegen. +- **UI-Verbesserungen** - Der Aufgaben-Header, die Chat-Ansicht, die Verlaufsvorschau und die Willkommensansicht wurden visuell verbessert. +- **Fehlerbehebungen** - Zuverlässigere Diff-Bearbeitungen und mehr. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index b31d035add..fa3b5183d8 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -47,13 +47,13 @@ Consulta el [CHANGELOG](../CHANGELOG.md) para ver actualizaciones detalladas y c --- -## 🎉 Roo Code 3.12 Lanzado +## 🎉 Roo Code 3.13 Lanzado -¡Roo Code 3.12 trae nuevas funcionalidades y mejoras basadas en tus comentarios! +¡Roo Code 3.13 trae nuevas funcionalidades y mejoras basadas en tus comentarios! -- **Soporte Grok** - Añadido el proveedor xAI y opciones de esfuerzo de razonamiento para Grok en OpenRouter. -- **Mejoras en edición de diferencias** - Configuración por perfil y mejor normalización de cadenas para menos errores. -- **Mejoras en puntos de control** - Puntos de control más rápidos y confiables. +- **Gemini 2.5 Flash Thinking** - Ahora puedes usar la variante de pensamiento de Gemini 2.5 Flash y especificar un presupuesto de tokens de pensamiento. +- **Mejoras de UI** - La cabecera de tareas, la vista de chat, la vista previa del historial y la vista de bienvenida han sido mejoradas visualmente. +- **Correcciones de errores** - Ediciones de diferencias más confiables y más. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 4447abe755..fc93c19d5e 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -47,13 +47,13 @@ Consultez le [CHANGELOG](../CHANGELOG.md) pour des mises à jour détaillées et --- -## 🎉 Roo Code 3.12 est sorti +## 🎉 Roo Code 3.13 est sorti -Roo Code 3.12 apporte de nouvelles fonctionnalités et améliorations basées sur vos commentaires ! +Roo Code 3.13 apporte de nouvelles fonctionnalités et améliorations basées sur vos commentaires ! -- **Support Grok** - Ajout du fournisseur xAI et des options d'effort de raisonnement pour les modèles Grok sur OpenRouter. -- **Améliorations de l'édition de diff** - Configuration par profil et meilleure normalisation des chaînes pour moins d'erreurs. -- **Points de contrôle améliorés** - Des points de contrôle plus rapides et plus fiables. +- **Gemini 2.5 Flash Thinking** - Vous pouvez maintenant utiliser la variante de réflexion de Gemini 2.5 Flash et spécifier un budget de tokens de réflexion. +- **Améliorations de l'interface utilisateur** - L'en-tête des tâches, la vue de chat, l'aperçu de l'historique et la vue d'accueil ont été visuellement améliorés. +- **Corrections de bugs** - Éditions de diff plus fiables et plus. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 914eaa0033..d7d565d6b1 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -47,13 +47,13 @@ --- -## 🎉 Roo Code 3.12 जारी +## 🎉 Roo Code 3.13 जारी -Roo Code 3.12 आपकी प्रतिक्रियाओं के आधार पर नई सुविधाएँ और सुधार लाता है! +Roo Code 3.13 आपकी प्रतिक्रियाओं के आधार पर नई सुविधाएँ और सुधार लाता है! -- **Grok सपोर्ट** - xAI प्रदाता जोड़ा गया और OpenRouter पर Grok मॉडल के लिए रीज़निंग एफर्ट विकल्प उपलब्ध कराया गया। -- **डिफ एडिटिंग में सुधार** - प्रोफाइल-स्तरीय कॉन्फ़िगरेशन और बेहतर स्ट्रिंग नॉर्मलाइजेशन जिससे त्रुटियां कम होती हैं। -- **तेज़ और अधिक विश्वसनीय चेकपॉइंट्स** - चेकपॉइंट प्रक्रिया को बेहतर बनाया गया है। +- **Gemini 2.5 Flash Thinking** - अब आप Gemini 2.5 Flash के थिंकिंग वेरिएंट का उपयोग कर सकते हैं और थिंकिंग टोकन बजट निर्धारित कर सकते हैं। +- **UI सुधार** - टास्क हेडर, चैट व्यू, हिस्ट्री प्रीव्यू और वेलकम व्यू को विज़ुअली अपग्रेड किया गया है। +- **बग फिक्स** - अधिक विश्वसनीय डिफ एडिट्स और अन्य सुधार। --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index 8a7c63f67b..4ee0c35336 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -47,13 +47,13 @@ Consulta il [CHANGELOG](../CHANGELOG.md) per aggiornamenti dettagliati e correzi --- -## 🎉 Roo Code 3.12 Rilasciato +## 🎉 Roo Code 3.13 Rilasciato -Roo Code 3.12 porta nuove funzionalità e miglioramenti basati sui tuoi feedback! +Roo Code 3.13 porta nuove funzionalità e miglioramenti basati sui tuoi feedback! -- **Supporto Grok** - Aggiunto il provider xAI e opzioni di sforzo di ragionamento per i modelli Grok su OpenRouter. -- **Miglioramenti all'editing delle differenze** - Configurazione per profilo e migliore normalizzazione delle stringhe per meno errori. -- **Checkpoint più veloci** - Checkpoint più rapidi e affidabili. +- **Gemini 2.5 Flash Thinking** - Ora puoi utilizzare la variante thinking di Gemini 2.5 Flash e specificare un budget di token per il thinking. +- **Miglioramenti UI** - L'intestazione delle attività, la vista chat, l'anteprima della cronologia e la vista di benvenuto sono state visivamente migliorate. +- **Correzioni di bug** - Editing delle differenze più affidabile e altro ancora. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 6746bb6d6b..fcd12b93d8 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -47,13 +47,13 @@ --- -## 🎉 Roo Code 3.12リリース +## 🎉 Roo Code 3.13リリース -Roo Code 3.12はユーザーのフィードバックに基づく新機能と改善を提供します! +Roo Code 3.13はユーザーのフィードバックに基づく新機能と改善を提供します! -- **Grokサポート** - xAIプロバイダーを追加し、OpenRouter上でGrokの推論努力オプションを公開 -- **差分編集の改善** - プロファイルごとの設定とエラー削減のための文字列正規化の改善 -- **高速化されたチェックポイント** - より速く信頼性の高いチェックポイント機能 +- **Gemini 2.5 Flash Thinking** - Gemini 2.5 Flashの思考バリアントを使用し、思考トークンの予算を指定できるようになりました +- **UI改善** - タスクヘッダー、チャットビュー、履歴プレビュー、ウェルカムビューが視覚的にアップグレードされました +- **バグ修正** - より信頼性の高い差分編集など多数の改善 --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index fd567dbb58..92d6aee6a6 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -47,13 +47,13 @@ --- -## 🎉 Roo Code 3.12 출시 +## 🎉 Roo Code 3.13 출시 -Roo Code 3.12가 사용자 피드백을 바탕으로 새로운 기능과 개선 사항을 제공합니다! +Roo Code 3.13이 사용자 피드백을 바탕으로 새로운 기능과 개선 사항을 제공합니다! -- **Grok 지원** - xAI 제공자 추가 및 OpenRouter의 Grok 모델에 대한 추론 노력 옵션 제공 -- **차이 편집 개선** - 프로필별 구성 옵션과 오류 감소를 위한 더 나은 문자열 정규화 -- **더 빠른 체크포인트** - 더 빠르고 안정적인 체크포인트 +- **Gemini 2.5 Flash Thinking** - 이제 Gemini 2.5 Flash의 사고 변형을 사용하고 사고 토큰 예산을 지정할 수 있습니다. +- **UI 개선** - 작업 헤더, 채팅 뷰, 히스토리 미리보기 및 환영 뷰가 시각적으로 업그레이드되었습니다. +- **버그 수정** - 더 안정적인 차이 편집 등 다양한 개선 사항. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index c398714a50..3563036852 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -47,13 +47,13 @@ Sprawdź [CHANGELOG](../CHANGELOG.md), aby uzyskać szczegółowe informacje o a --- -## 🎉 Roo Code 3.12 został wydany +## 🎉 Roo Code 3.13 został wydany -Roo Code 3.12 wprowadza nowe funkcje i usprawnienia na podstawie opinii użytkowników! +Roo Code 3.13 wprowadza nowe funkcje i usprawnienia na podstawie opinii użytkowników! -- **Wsparcie dla Grok** - Dodano dostawcę xAI oraz opcje intensywności rozumowania dla modeli Grok na OpenRouter -- **Ulepszenia edycji diff** - Opcje konfiguracyjne na poziomie profilu i lepsza normalizacja ciągów znaków redukująca błędy -- **Szybsze punkty kontrolne** - Szybsze i bardziej niezawodne punkty kontrolne +- **Gemini 2.5 Flash Thinking** - Teraz możesz korzystać z wariantu thinking Gemini 2.5 Flash i określać budżet tokenów dla myślenia. +- **Ulepszenia UI** - Wizualnie ulepszono nagłówek zadań, widok czatu, podgląd historii i widok powitalny. +- **Poprawki błędów** - Bardziej niezawodna edycja diff i wiele więcej. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 22b4856b70..2e515bcd00 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -47,13 +47,13 @@ Confira o [CHANGELOG](../CHANGELOG.md) para atualizações e correções detalha --- -## 🎉 Roo Code 3.12 Lançado +## 🎉 Roo Code 3.13 Lançado -O Roo Code 3.12 traz novas funcionalidades e melhorias baseadas no seu feedback! +O Roo Code 3.13 traz novas funcionalidades e melhorias baseadas no seu feedback! -- **Suporte ao Grok** - Adicionado o provedor xAI e opções de esforço de raciocínio para modelos Grok no OpenRouter -- **Melhorias na edição de diferenças** - Opções de configuração por perfil e melhor normalização de strings para reduzir erros -- **Pontos de verificação mais rápidos** - Pontos de verificação mais rápidos e confiáveis +- **Gemini 2.5 Flash Thinking** - Agora você pode usar a variante thinking do Gemini 2.5 Flash e especificar um orçamento de tokens para thinking. +- **Melhorias na UI** - O cabeçalho de tarefas, visualização de chat, pré-visualização do histórico e tela de boas-vindas foram visualmente aprimorados. +- **Correções de bugs** - Edição de diferenças mais confiável e muito mais. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index 2c57d3d8d1..ce15b5350d 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -47,13 +47,13 @@ Detaylı güncellemeler ve düzeltmeler için [CHANGELOG](../CHANGELOG.md) dosya --- -## 🎉 Roo Code 3.12 Yayınlandı +## 🎉 Roo Code 3.13 Yayınlandı -Roo Code 3.12 geri bildirimlerinize dayanarak yeni özellikler ve iyileştirmeler getiriyor! +Roo Code 3.13 geri bildirimlerinize dayanarak yeni özellikler ve iyileştirmeler getiriyor! -- **Grok Desteği** - xAI sağlayıcısı eklendi ve OpenRouter'daki Grok modelleri için akıl yürütme çabası seçenekleri sunuldu -- **Diff Düzenleme İyileştirmeleri** - Profil başına yapılandırma seçenekleri ve daha az hata için geliştirilmiş dize normalleştirme -- **Daha Hızlı Kontrol Noktaları** - Daha hızlı ve daha güvenilir kontrol noktaları +- **Gemini 2.5 Flash Thinking** - Artık Gemini 2.5 Flash'ın düşünme varyantını kullanabilir ve düşünme token bütçesini belirleyebilirsiniz. +- **UI İyileştirmeleri** - Görev başlığı, sohbet görünümü, geçmiş önizlemesi ve karşılama görünümü görsel olarak yükseltildi. +- **Hata Düzeltmeleri** - Daha güvenilir diff düzenlemeleri ve daha fazlası. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index c84830a62e..379510a13f 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -47,13 +47,13 @@ Kiểm tra [CHANGELOG](../CHANGELOG.md) để biết thông tin chi tiết về --- -## 🎉 Đã Phát Hành Roo Code 3.12 +## 🎉 Đã Phát Hành Roo Code 3.13 -Roo Code 3.12 mang đến những tính năng mới và cải tiến dựa trên phản hồi của bạn! +Roo Code 3.13 mang đến những tính năng mới và cải tiến dựa trên phản hồi của bạn! -- **Hỗ trợ Grok** - Thêm nhà cung cấp xAI và tùy chọn về mức độ lý luận cho các mô hình Grok trên OpenRouter -- **Cải tiến chỉnh sửa khác biệt** - Tùy chọn cấu hình theo hồ sơ và chuẩn hóa chuỗi tốt hơn để giảm lỗi -- **Điểm kiểm tra nhanh hơn** - Điểm kiểm tra nhanh hơn và đáng tin cậy hơn +- **Gemini 2.5 Flash Thinking** - Bây giờ bạn có thể sử dụng biến thể thinking của Gemini 2.5 Flash và chỉ định ngân sách token cho quá trình suy nghĩ. +- **Cải tiến giao diện người dùng** - Tiêu đề nhiệm vụ, giao diện trò chuyện, xem trước lịch sử và màn hình chào mừng đã được nâng cấp về mặt hình ảnh. +- **Sửa lỗi** - Chỉnh sửa khác biệt đáng tin cậy hơn và nhiều cải tiến khác. --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index f61833e6e4..66327ff7a0 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -47,13 +47,13 @@ --- -## 🎉 Roo Code 3.12 已发布 +## 🎉 Roo Code 3.13 已发布 -Roo Code 3.12 基于您的反馈带来新功能和改进! +Roo Code 3.13 基于您的反馈带来新功能和改进! -- **Grok 支持** - 添加 xAI 提供商并在 OpenRouter 上提供 Grok 模型的推理努力选项 -- **差异编辑改进** - 每个配置文件的配置选项和更好的字符串规范化以减少错误 -- **更快的检查点** - 更快速、更可靠的检查点功能 +- **Gemini 2.5 Flash Thinking** - 现在您可以使用 Gemini 2.5 Flash 的思考变体,并指定思考令牌预算。 +- **UI 改进** - 任务标题、聊天视图、历史预览和欢迎视图已在视觉上进行了升级。 +- **错误修复** - 更可靠的差异编辑等多项改进。 --- @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index a0482aecff..81c1136b73 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -48,13 +48,13 @@ --- -## 🎉 Roo Code 3.12 已發布 +## 🎉 Roo Code 3.13 已發布 -Roo Code 3.12 根據您的回饋帶來新功能和改進! +Roo Code 3.13 根據您的回饋帶來新功能和改進! -- **Grok 支援** - 新增 xAI 提供者並為 OpenRouter 上的 Grok 模型提供推理強度選項 -- **差異編輯改進** - 提供每個設定檔的配置選項與更好的字串正規化以減少錯誤 -- **更快的檢查點** - 更快速、更可靠的檢查點功能 +- **Gemini 2.5 Flash Thinking** - 現在您可以使用 Gemini 2.5 Flash 的思考變體,並指定思考令牌預算。 +- **UI 改進** - 任務標題、聊天視圖、歷史預覽和歡迎視圖已在視覺上進行了升級。 +- **錯誤修復** - 更可靠的差異編輯和更多改進。 --- @@ -179,30 +179,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| +| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| +| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| +| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| +| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| +| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| +| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| +| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| +| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| +| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| +| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | + ## 授權 diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index f2b4391051..f4c26c3dfc 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -78,7 +78,7 @@ export class ClineProvider extends EventEmitter implements public isViewLaunched = false public settingsImportedAt?: number - public readonly latestAnnouncementId = "apr-16-2025-3-12" // update for v3.12.0 announcement + public readonly latestAnnouncementId = "apr-18-2025-3-13" // Update for v3.13.0 announcement public readonly contextProxy: ContextProxy public readonly providerSettingsManager: ProviderSettingsManager public readonly customModesManager: CustomModesManager diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 6beabc0ea0..702a86fc1f 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -181,12 +181,12 @@ "copyToInput": "Copiar a l'entrada (o Shift + clic)" }, "announcement": { - "title": "🎉 Roo Code 3.12 publicat", - "description": "Roo Code 3.12 porta noves funcionalitats i millores basades en els teus comentaris.", + "title": "🎉 Roo Code 3.13 publicat", + "description": "Roo Code 3.13 porta noves funcionalitats i millores basades en els teus comentaris.", "whatsNew": "Novetats", - "feature1": "Suport per a Grok: Afegit el proveïdor xAI i opcions d'esforç de raonament per a Grok a OpenRouter", - "feature2": "Millores en l'edició de diferències: Configuració per perfil i millor normalització de cadenes per reduir errors", - "feature3": "Millores en els punts de control: Punts de control més ràpids i fiables", + "feature1": "Gemini 2.5 Flash Thinking: Ara pots utilitzar la variant thinking de Gemini 2.5 Flash i especificar un pressupost de tokens per a thinking", + "feature2": "Millores d'interfície: La capçalera de tasques, la vista de xat, la previsualització d'historial i la vista de benvinguda han estat visualment millorades", + "feature3": "Correccions d'errors: Edicions de diferències més fiables i més", "hideButton": "Amagar anunci", "detailsDiscussLinks": "Obtingues més detalls i participa a Discord i Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 456680016a..e416423f98 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -181,12 +181,12 @@ "copyToInput": "In Eingabefeld kopieren (oder Shift + Klick)" }, "announcement": { - "title": "🎉 Roo Code 3.12 veröffentlicht", - "description": "Roo Code 3.12 bringt neue Funktionen und Verbesserungen basierend auf deinem Feedback.", + "title": "🎉 Roo Code 3.13 veröffentlicht", + "description": "Roo Code 3.13 bringt neue Funktionen und Verbesserungen basierend auf deinem Feedback.", "whatsNew": "Was ist neu", - "feature1": "Grok Unterstützung: Der xAI-Anbieter wurde hinzugefügt, mit Reasoning-Effort-Optionen für Grok auf OpenRouter", - "feature2": "Diff-Bearbeitungsverbesserungen: Profilspezifische Konfiguration und bessere String-Normalisierung für weniger Fehler", - "feature3": "Checkpoint-Verbesserungen: Schnellere und zuverlässigere Checkpoints", + "feature1": "Gemini 2.5 Flash Thinking: Du kannst jetzt die Thinking-Variante von Gemini 2.5 Flash verwenden und ein Thinking-Token-Budget festlegen", + "feature2": "UI-Verbesserungen: Die Aufgabenüberschrift, Chat-Ansicht, Verlaufsvorschau und Willkommensansicht wurden visuell verbessert", + "feature3": "Fehlerbehebungen: Zuverlässigere Diff-Bearbeitungen & mehr", "hideButton": "Ankündigung ausblenden", "detailsDiscussLinks": "Erhalte mehr Details und diskutiere auf Discord und Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 03bc1d7b04..6f4a0a1e54 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -174,12 +174,12 @@ "description": "Auto-approve allows Roo Code to perform actions without asking for permission. Only enable for actions you fully trust. More detailed configuration available in Settings." }, "announcement": { - "title": "🎉 Roo Code 3.12 Released", - "description": "Roo Code 3.12 brings new features and improvements based on your feedback.", + "title": "🎉 Roo Code 3.13 Released", + "description": "Roo Code 3.13 brings new features and improvements based on your feedback.", "whatsNew": "What's New", - "feature1": "Grok Support: Added the xAI provider and Grok reasoning effort options on OpenRouter", - "feature2": "Diff Editing Improvements: Per-profile configuration and better string normalization for fewer errors", - "feature3": "Checkpoint Enhancements: Faster and more reliable checkpoints", + "feature1": "Gemini 2.5 Flash Thinking: You can now use the thinking variant of Gemini 2.5 Flash and specify a thinking token budget", + "feature2": "UI Improvements: The task header, chat view, history preview, and welcome view have been visually upgraded", + "feature3": "Bug Fixes: More reliable diff edits & more", "hideButton": "Hide announcement", "detailsDiscussLinks": "Get more details and discuss in Discord and Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 9ba996ef28..9743ed85f5 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -181,12 +181,12 @@ "copyToInput": "Copiar a la entrada (o Shift + clic)" }, "announcement": { - "title": "🎉 Roo Code 3.12 publicado", - "description": "Roo Code 3.12 trae nuevas funcionalidades y mejoras basadas en tus comentarios.", + "title": "🎉 Roo Code 3.13 publicado", + "description": "Roo Code 3.13 trae nuevas funcionalidades y mejoras basadas en tus comentarios.", "whatsNew": "Novedades", - "feature1": "Soporte Grok: Añadido el proveedor xAI y opciones de esfuerzo de razonamiento para Grok en OpenRouter", - "feature2": "Mejoras en edición de diferencias: Configuración por perfil y mejor normalización de cadenas para menos errores", - "feature3": "Mejoras en puntos de control: Puntos de control más rápidos y confiables", + "feature1": "Gemini 2.5 Flash Thinking: Ahora puedes usar la variante thinking de Gemini 2.5 Flash y especificar un presupuesto de tokens para thinking", + "feature2": "Mejoras en la interfaz: El encabezado de tareas, la vista de chat, la vista previa del historial y la vista de bienvenida han sido mejorados visualmente", + "feature3": "Correcciones de errores: Ediciones de diferencias más confiables y más", "hideButton": "Ocultar anuncio", "detailsDiscussLinks": "Obtén más detalles y participa en Discord y Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index f9fc4ca3e4..0025d82889 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -181,12 +181,12 @@ "copyToInput": "Copier vers l'entrée (ou Shift + clic)" }, "announcement": { - "title": "🎉 Roo Code 3.12 est sortie", - "description": "Roo Code 3.12 apporte de nouvelles fonctionnalités et améliorations basées sur vos retours.", + "title": "🎉 Roo Code 3.13 est sortie", + "description": "Roo Code 3.13 apporte de nouvelles fonctionnalités et améliorations basées sur vos retours.", "whatsNew": "Quoi de neuf", - "feature1": "Support Grok : Ajout du fournisseur xAI et des options d'effort de raisonnement pour Grok sur OpenRouter", - "feature2": "Améliorations de l'édition des différences : Configuration par profil et meilleure normalisation des chaînes pour moins d'erreurs", - "feature3": "Améliorations des points de contrôle : Points de contrôle plus rapides et plus fiables", + "feature1": "Gemini 2.5 Flash Thinking : Tu peux maintenant utiliser la variante thinking de Gemini 2.5 Flash et spécifier un budget de tokens pour thinking", + "feature2": "Améliorations de l'interface : L'en-tête des tâches, la vue de chat, l'aperçu de l'historique et la vue d'accueil ont été visuellement améliorés", + "feature3": "Corrections de bugs : Éditions de différences plus fiables et plus", "hideButton": "Masquer l'annonce", "detailsDiscussLinks": "Obtenez plus de détails et participez aux discussions sur Discord et Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index d57cb09e5e..f4391e624f 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -181,12 +181,12 @@ "copyToInput": "इनपुट में कॉपी करें (या Shift + क्लिक)" }, "announcement": { - "title": "🎉 Roo Code 3.12 रिलीज़ हुआ", - "description": "Roo Code 3.12 आपके फीडबैक के आधार पर नई सुविधाएँ और सुधार लाता है।", + "title": "🎉 Roo Code 3.13 रिलीज़ हुआ", + "description": "Roo Code 3.13 आपके फीडबैक के आधार पर नई सुविधाएँ और सुधार लाता है।", "whatsNew": "नई सुविधाएँ", - "feature1": "Grok सपोर्ट: xAI प्रदाता और OpenRouter पर Grok के लिए रीज़निंग एफर्ट विकल्प जोड़े गए", - "feature2": "डिफ एडिटिंग सुधार: प्रोफाइल-स्तरीय कॉन्फिगरेशन और कम त्रुटियों के लिए बेहतर स्ट्रिंग नॉर्मलाइजेशन", - "feature3": "चेकपॉइंट एनहांसमेंट: तेज़ और अधिक विश्वसनीय चेकपॉइंट", + "feature1": "Gemini 2.5 Flash Thinking: अब आप Gemini 2.5 Flash के thinking वेरिएंट का उपयोग कर सकते हैं और thinking टोकन बजट निर्दिष्ट कर सकते हैं", + "feature2": "UI सुधार: कार्य हेडर, चैट व्यू, इतिहास प्रीव्यू और स्वागत व्यू को दृश्य रूप से अपग्रेड किया गया है", + "feature3": "बग फिक्स: अधिक विश्वसनीय डिफ एडिट्स और अधिक", "hideButton": "घोषणा छिपाएँ", "detailsDiscussLinks": "Discord और Reddit पर अधिक जानकारी प्राप्त करें और चर्चा में भाग लें 🚀" }, diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index c4456c437e..62921786d1 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -181,12 +181,12 @@ "copyToInput": "Copia nell'input (o Shift + clic)" }, "announcement": { - "title": "🎉 Rilasciato Roo Code 3.12", - "description": "Roo Code 3.12 porta nuove funzionalità e miglioramenti basati sui tuoi feedback.", + "title": "🎉 Rilasciato Roo Code 3.13", + "description": "Roo Code 3.13 porta nuove funzionalità e miglioramenti basati sui tuoi feedback.", "whatsNew": "Novità", - "feature1": "Supporto Grok: Aggiunto il provider xAI e opzioni di impegno ragionato per Grok su OpenRouter", - "feature2": "Miglioramenti nell'editing delle differenze: Configurazione per profilo e migliore normalizzazione delle stringhe per meno errori", - "feature3": "Miglioramenti dei checkpoint: Checkpoint più veloci e affidabili", + "feature1": "Gemini 2.5 Flash Thinking: Ora puoi utilizzare la variante thinking di Gemini 2.5 Flash e specificare un budget di token per thinking", + "feature2": "Miglioramenti dell'interfaccia: L'intestazione delle attività, la vista chat, l'anteprima della cronologia e la vista di benvenuto sono stati migliorati visivamente", + "feature3": "Correzioni di bug: Editing delle differenze più affidabile e altro", "hideButton": "Nascondi annuncio", "detailsDiscussLinks": "Ottieni maggiori dettagli e partecipa alle discussioni su Discord e Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index bda35e1ef9..4d0b2d6413 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -181,12 +181,12 @@ "copyToInput": "入力欄にコピー(またはShift + クリック)" }, "announcement": { - "title": "🎉 Roo Code 3.12 リリース", - "description": "Roo Code 3.12は新機能とあなたのフィードバックに基づく改善をもたらします。", + "title": "🎉 Roo Code 3.13 リリース", + "description": "Roo Code 3.13は新機能とあなたのフィードバックに基づく改善をもたらします。", "whatsNew": "新機能", - "feature1": "Grokサポート: xAIプロバイダーが追加され、OpenRouterでGrokの推論努力オプションが利用可能に", - "feature2": "差分編集の改善: プロファイルごとの設定と、エラー削減のための文字列正規化の改善", - "feature3": "チェックポイントの強化: より高速で信頼性の高いチェックポイント", + "feature1": "Gemini 2.5 Flash Thinking: Gemini 2.5 Flashのthinkingバリアントを使用し、thinking用のトークン予算を指定できるようになりました", + "feature2": "UI改善: タスクヘッダー、チャットビュー、履歴プレビュー、ウェルカムビューが視覚的に強化されました", + "feature3": "バグ修正: より信頼性の高い差分編集など", "hideButton": "通知を非表示", "detailsDiscussLinks": "詳細はDiscordとRedditでご確認・ディスカッションください 🚀" }, diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 8fad15321a..40c3c580d7 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -181,12 +181,12 @@ "copyToInput": "입력창에 복사 (또는 Shift + 클릭)" }, "announcement": { - "title": "🎉 Roo Code 3.12 출시", - "description": "Roo Code 3.12는 사용자 피드백을 기반으로 새로운 기능과 개선사항을 제공합니다.", + "title": "🎉 Roo Code 3.13 출시", + "description": "Roo Code 3.13는 사용자 피드백을 기반으로 새로운 기능과 개선사항을 제공합니다.", "whatsNew": "새로운 기능", - "feature1": "Grok 지원: xAI 제공업체 추가 및 OpenRouter에서 Grok 추론 노력 옵션 제공", - "feature2": "차이점 편집 개선: 프로필별 구성 및 오류 감소를 위한 문자열 정규화 개선", - "feature3": "체크포인트 향상: 더 빠르고 안정적인 체크포인트", + "feature1": "Gemini 2.5 Flash Thinking: 이제 Gemini 2.5 Flash의 thinking 변형을 사용하고 thinking 토큰 예산을 지정할 수 있습니다", + "feature2": "UI 개선: 작업 헤더, 채팅 뷰, 기록 미리보기 및 환영 뷰가 시각적으로 업그레이드되었습니다", + "feature3": "버그 수정: 더 안정적인 차이점 편집 등", "hideButton": "공지 숨기기", "detailsDiscussLinks": "Discord와 Reddit에서 더 자세한 정보를 확인하고 논의하세요 🚀" }, diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 56ee50a5fe..db17efd24f 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -181,12 +181,12 @@ "copyToInput": "Kopiuj do pola wprowadzania (lub Shift + kliknięcie)" }, "announcement": { - "title": "🎉 Roo Code 3.12 wydany", - "description": "Roo Code 3.12 przynosi nowe funkcje i ulepszenia na podstawie Twoich opinii.", + "title": "🎉 Roo Code 3.13 wydany", + "description": "Roo Code 3.13 przynosi nowe funkcje i ulepszenia na podstawie Twoich opinii.", "whatsNew": "Co nowego", - "feature1": "Wsparcie dla Grok: Dodano dostawcę xAI i opcje wysiłku rozumowania Grok na OpenRouter", - "feature2": "Ulepszenia edycji różnic: Konfiguracja dla poszczególnych profili i lepsza normalizacja ciągów znaków dla mniejszej liczby błędów", - "feature3": "Ulepszenia punktów kontrolnych: Szybsze i bardziej niezawodne punkty kontrolne", + "feature1": "Gemini 2.5 Flash Thinking: Teraz możesz używać wariantu thinking Gemini 2.5 Flash i określać budżet tokenów dla thinking", + "feature2": "Ulepszenia UI: Nagłówek zadania, widok czatu, podgląd historii i widok powitalny zostały wizualnie ulepszone", + "feature3": "Poprawki błędów: Bardziej niezawodne edycje różnic i więcej", "hideButton": "Ukryj ogłoszenie", "detailsDiscussLinks": "Uzyskaj więcej szczegółów i dołącz do dyskusji na Discord i Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 178ef8662e..8d6c420236 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -181,12 +181,12 @@ "copyToInput": "Copiar para entrada (ou Shift + clique)" }, "announcement": { - "title": "🎉 Roo Code 3.12 Lançado", - "description": "Roo Code 3.12 traz novos recursos e melhorias baseados no seu feedback.", + "title": "🎉 Roo Code 3.13 Lançado", + "description": "Roo Code 3.13 traz novos recursos e melhorias baseados no seu feedback.", "whatsNew": "O que há de novo", - "feature1": "Suporte ao Grok: Adicionado o provedor xAI e opções de esforço de raciocínio para Grok no OpenRouter", - "feature2": "Melhorias na edição de diferenças: Configuração por perfil e melhor normalização de strings para menos erros", - "feature3": "Melhorias nos pontos de verificação: Pontos de verificação mais rápidos e confiáveis", + "feature1": "Gemini 2.5 Flash Thinking: Agora você pode usar a variante thinking do Gemini 2.5 Flash e especificar um orçamento de tokens para thinking", + "feature2": "Melhorias na UI: O cabeçalho de tarefas, visualização de chat, pré-visualização do histórico e tela de boas-vindas foram visualmente aprimorados", + "feature3": "Correções de bugs: Edições de diferenças mais confiáveis e mais", "hideButton": "Ocultar anúncio", "detailsDiscussLinks": "Obtenha mais detalhes e participe da discussão no Discord e Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 652ecb331b..1f46537a31 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -181,12 +181,12 @@ "copyToInput": "Giriş alanına kopyala (veya Shift + tıklama)" }, "announcement": { - "title": "🎉 Roo Code 3.12 Yayınlandı", - "description": "Roo Code 3.12 geri bildirimlerinize dayalı yeni özellikler ve iyileştirmeler getiriyor.", + "title": "🎉 Roo Code 3.13 Yayınlandı", + "description": "Roo Code 3.13 geri bildirimlerinize dayalı yeni özellikler ve iyileştirmeler getiriyor.", "whatsNew": "Yenilikler", - "feature1": "Grok Desteği: xAI sağlayıcısı eklendi ve OpenRouter'da Grok için akıl yürütme çaba seçenekleri sunuldu", - "feature2": "Fark Düzenleme İyileştirmeleri: Profil bazlı yapılandırma ve daha az hata için geliştirilmiş dize normalleştirme", - "feature3": "Kontrol Noktası Geliştirmeleri: Daha hızlı ve güvenilir kontrol noktaları", + "feature1": "Gemini 2.5 Flash Thinking: Artık Gemini 2.5 Flash'ın thinking varyantını kullanabilir ve thinking için token bütçesi belirleyebilirsiniz", + "feature2": "UI İyileştirmeleri: Görev başlığı, sohbet görünümü, geçmiş önizlemesi ve karşılama ekranı görsel olarak yükseltildi", + "feature3": "Hata Düzeltmeleri: Daha güvenilir fark düzenlemeleri ve daha fazlası", "hideButton": "Duyuruyu gizle", "detailsDiscussLinks": "Discord ve Reddit üzerinde daha fazla ayrıntı edinin ve tartışmalara katılın 🚀" }, diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 736b80fb08..08e5ef4fe8 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -181,12 +181,12 @@ "copyToInput": "Sao chép vào ô nhập liệu (hoặc Shift + nhấp chuột)" }, "announcement": { - "title": "🎉 Roo Code 3.12 Đã phát hành", - "description": "Roo Code 3.12 mang đến các tính năng và cải tiến mới dựa trên phản hồi của bạn.", + "title": "🎉 Roo Code 3.13 Đã phát hành", + "description": "Roo Code 3.13 mang đến các tính năng và cải tiến mới dựa trên phản hồi của bạn.", "whatsNew": "Có gì mới", - "feature1": "Hỗ trợ Grok: Đã thêm nhà cung cấp xAI và các tùy chọn nỗ lực suy luận Grok trên OpenRouter", - "feature2": "Cải tiến chỉnh sửa khác biệt: Cấu hình theo hồ sơ và chuẩn hóa chuỗi tốt hơn để giảm lỗi", - "feature3": "Nâng cao điểm kiểm tra: Điểm kiểm tra nhanh hơn và đáng tin cậy hơn", + "feature1": "Gemini 2.5 Flash Thinking: Bây giờ bạn có thể sử dụng biến thể thinking của Gemini 2.5 Flash và chỉ định ngân sách token cho thinking", + "feature2": "Cải tiến giao diện người dùng: Tiêu đề nhiệm vụ, giao diện trò chuyện, xem trước lịch sử và màn hình chào mừng đã được nâng cấp về mặt hình ảnh", + "feature3": "Sửa lỗi: Chỉnh sửa khác biệt đáng tin cậy hơn và nhiều cải tiến khác", "hideButton": "Ẩn thông báo", "detailsDiscussLinks": "Nhận thêm chi tiết và thảo luận tại Discord và Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index bae6183e0c..569c80be9f 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -181,12 +181,12 @@ "copyToInput": "复制到输入框(或按住Shift点击)" }, "announcement": { - "title": "🎉 Roo Code 3.12 已发布", - "description": "Roo Code 3.12 带来基于您反馈的新功能和改进。", + "title": "🎉 Roo Code 3.13 已发布", + "description": "Roo Code 3.13 带来基于您反馈的新功能和改进。", "whatsNew": "新特性", - "feature1": "Grok 支持: 添加 xAI 提供商并在 OpenRouter 上提供 Grok 推理强度选项", - "feature2": "差异编辑改进: 支持按配置文件设置和改进字符串规范化以减少错误", - "feature3": "检查点增强: 更快速可靠的检查点功能", + "feature1": "Gemini 2.5 Flash Thinking: 现在可以使用 Gemini 2.5 Flash 的 thinking 变体并指定 thinking Token 预算", + "feature2": "UI 改进: 任务标题、聊天视图、历史预览和欢迎视图已进行视觉升级", + "feature3": "错误修复: 更可靠的差异编辑等功能", "hideButton": "隐藏公告", "detailsDiscussLinks": "在 Discord 和 Reddit 获取更多详情并参与讨论 🚀" }, diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index fac403b84d..e7d239e930 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -181,12 +181,12 @@ "copyToInput": "複製到輸入框(或按住 Shift 並點選)" }, "announcement": { - "title": "🎉 Roo Code 3.12 已發布", - "description": "Roo Code 3.12 帶來基於您意見回饋的新功能與改進。", + "title": "🎉 Roo Code 3.13 已發布", + "description": "Roo Code 3.13 帶來基於您意見回饋的新功能與改進。", "whatsNew": "新功能", - "feature1": "Grok 支援: 新增 xAI 提供者並在 OpenRouter 上提供 Grok 推理強度選項", - "feature2": "差異編輯改進: 依設定檔配置及改進字串正規化以減少錯誤", - "feature3": "檢查點強化: 更快速且更可靠的檢查點功能", + "feature1": "Gemini 2.5 Flash Thinking: 現在可以使用 Gemini 2.5 Flash 的 thinking 變體並指定 thinking Token 預算", + "feature2": "UI 改進: 工作標題、對話視圖、歷史預覽和歡迎視圖已進行視覺升級", + "feature3": "錯誤修復: 更可靠的差異編輯等功能", "hideButton": "隱藏公告", "detailsDiscussLinks": "在 Discord 和 Reddit 取得更多詳細資訊並參與討論 🚀" }, From 8c18727f9a16f42799f6bb83e42b61382f1d9280 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 18 Apr 2025 21:13:43 -0700 Subject: [PATCH 06/89] Update contributors list (#2779) docs: update contributors list [skip ci] Co-authored-by: cte --- locales/ca/README.md | 50 ++++++++++++++++++++--------------------- locales/de/README.md | 50 ++++++++++++++++++++--------------------- locales/es/README.md | 50 ++++++++++++++++++++--------------------- locales/fr/README.md | 50 ++++++++++++++++++++--------------------- locales/hi/README.md | 50 ++++++++++++++++++++--------------------- locales/it/README.md | 50 ++++++++++++++++++++--------------------- locales/ja/README.md | 50 ++++++++++++++++++++--------------------- locales/ko/README.md | 50 ++++++++++++++++++++--------------------- locales/pl/README.md | 50 ++++++++++++++++++++--------------------- locales/pt-BR/README.md | 50 ++++++++++++++++++++--------------------- locales/tr/README.md | 50 ++++++++++++++++++++--------------------- locales/vi/README.md | 50 ++++++++++++++++++++--------------------- locales/zh-CN/README.md | 50 ++++++++++++++++++++--------------------- locales/zh-TW/README.md | 50 ++++++++++++++++++++--------------------- 14 files changed, 336 insertions(+), 364 deletions(-) diff --git a/locales/ca/README.md b/locales/ca/README.md index f93b31abc3..9827c558f9 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 11ca9f6b9c..241dea6cd3 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index fa3b5183d8..4a58eb508b 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index fc93c19d5e..25debb7549 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index d7d565d6b1..6ca2459b25 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index 4ee0c35336..df8d8be7b0 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index fcd12b93d8..1a8cf752ad 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 92d6aee6a6..5431a8fbd1 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index 3563036852..d85762dc96 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 2e515bcd00..3886cb1e22 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index ce15b5350d..ba992b501c 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index 379510a13f..57ef27202a 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 66327ff7a0..f933ba3775 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -178,32 +178,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 81c1136b73..40f5535840 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -179,32 +179,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| +|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| +|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| +|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| +|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| +|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| +|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| +|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| +|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| +|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| +|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| +|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| +|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| +|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | ## 授權 From c5f48a8bc68a67fbe01e82bf9a8b04449eb5c69e Mon Sep 17 00:00:00 2001 From: R00-B0T <110429663+R00-B0T@users.noreply.github.com> Date: Fri, 18 Apr 2025 21:14:30 -0700 Subject: [PATCH 07/89] Changeset version bump (#2777) * changeset version bump * Update CHANGELOG.md --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Chris Estreich --- .changeset/neat-dodos-serve.md | 5 ----- .changeset/stale-bikes-jam.md | 5 ----- CHANGELOG.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 7 insertions(+), 13 deletions(-) delete mode 100644 .changeset/neat-dodos-serve.md delete mode 100644 .changeset/stale-bikes-jam.md diff --git a/.changeset/neat-dodos-serve.md b/.changeset/neat-dodos-serve.md deleted file mode 100644 index 5b3910d211..0000000000 --- a/.changeset/neat-dodos-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Roo Code v3.13 announcement diff --git a/.changeset/stale-bikes-jam.md b/.changeset/stale-bikes-jam.md deleted file mode 100644 index 095e3ccc37..0000000000 --- a/.changeset/stale-bikes-jam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Allow custom URLs for Gemini provider diff --git a/CHANGELOG.md b/CHANGELOG.md index a7bd81d204..38cec69f5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Roo Code Changelog +## [3.13.2] - 2025-04-18 + +- Allow custom URLs for Gemini provider + ## [3.13.1] - 2025-04-18 - Support Gemini 2.5 Flash thinking mode (thanks @monotykamary) diff --git a/package-lock.json b/package-lock.json index 251cf7f2d1..afe45be4a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.13.1", + "version": "3.13.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.13.1", + "version": "3.13.2", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", diff --git a/package.json b/package.json index a267a9b790..bc599afdf4 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.13.1", + "version": "3.13.2", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 5d0aa20f9744c5943e2e207e4b77c6c3bdb00030 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 19 Apr 2025 14:13:45 -0400 Subject: [PATCH 08/89] Switch list files from globby to ripgrep (#2689) * Switch list files from globby to ripgrep * PR feedback * PR fix --- src/__mocks__/services/ripgrep/index.ts | 48 +++ src/core/__mocks__/mock-setup.ts | 39 ++ src/core/__tests__/Cline.test.ts | 24 ++ src/services/glob/__mocks__/list-files.ts | 70 ++++ src/services/glob/list-files.ts | 453 ++++++++++++++++++---- 5 files changed, 565 insertions(+), 69 deletions(-) create mode 100644 src/__mocks__/services/ripgrep/index.ts create mode 100644 src/core/__mocks__/mock-setup.ts create mode 100644 src/services/glob/__mocks__/list-files.ts diff --git a/src/__mocks__/services/ripgrep/index.ts b/src/__mocks__/services/ripgrep/index.ts new file mode 100644 index 0000000000..f24adcb18d --- /dev/null +++ b/src/__mocks__/services/ripgrep/index.ts @@ -0,0 +1,48 @@ +/** + * Mock implementation for the ripgrep service + * + * This mock provides stable implementations of all ripgrep service functions, + * making sure to handle undefined values safely to prevent test failures. + * Each function is documented with its purpose and behavior in tests. + */ + +/** + * Mock implementation of getBinPath + * Always returns a valid path to avoid path resolution errors in tests + * + * @param vscodeAppRoot - Optional VSCode app root path (can be undefined) + * @returns Promise resolving to a mock path to the ripgrep binary + */ +export const getBinPath = jest.fn().mockImplementation(async (vscodeAppRoot?: string): Promise => { + return "/mock/path/to/rg" +}) + +/** + * Mock implementation of regexSearchFiles + * Always returns a static search result string to avoid executing real searches + * + * @param cwd - Optional working directory (can be undefined) + * @param directoryPath - Optional directory to search (can be undefined) + * @param regex - Optional regex pattern (can be undefined) + * @param filePattern - Optional file pattern (can be undefined) + * @returns Promise resolving to a mock search result + */ +export const regexSearchFiles = jest + .fn() + .mockImplementation( + async (cwd?: string, directoryPath?: string, regex?: string, filePattern?: string): Promise => { + return "Mock search results" + }, + ) + +/** + * Mock implementation of truncateLine + * Returns the input line or empty string if undefined + * + * @param line - The line to truncate (can be undefined) + * @param maxLength - Optional maximum length (can be undefined) + * @returns The original line or empty string if undefined + */ +export const truncateLine = jest.fn().mockImplementation((line?: string, maxLength?: number): string => { + return line || "" +}) diff --git a/src/core/__mocks__/mock-setup.ts b/src/core/__mocks__/mock-setup.ts new file mode 100644 index 0000000000..3d77f9fee9 --- /dev/null +++ b/src/core/__mocks__/mock-setup.ts @@ -0,0 +1,39 @@ +/** + * Mock setup for Cline tests + * + * This file contains centralized mock configurations for services + * that require special handling in tests. It prevents test failures + * related to undefined values, missing dependencies, or filesystem access. + * + * Services mocked here: + * - ripgrep: Prevents path.join issues with undefined parameters + * - list-files: Prevents dependency on actual ripgrep binary + */ + +/** + * Mock the ripgrep service + * This prevents issues with path.join and undefined parameters in tests + */ +jest.mock("../../services/ripgrep", () => ({ + // Always returns a valid path to the ripgrep binary + getBinPath: jest.fn().mockResolvedValue("/mock/path/to/rg"), + + // Returns static search results + regexSearchFiles: jest.fn().mockResolvedValue("Mock search results"), + + // Safe implementation of truncateLine that handles edge cases + truncateLine: jest.fn().mockImplementation((line: string) => line || ""), +})) + +/** + * Mock the list-files module + * This prevents dependency on the ripgrep binary and filesystem access + */ +jest.mock("../../services/glob/list-files", () => ({ + // Returns empty file list with boolean flag indicating if limit was reached + listFiles: jest.fn().mockImplementation(() => { + return Promise.resolve([[], false]) + }), +})) + +export {} diff --git a/src/core/__tests__/Cline.test.ts b/src/core/__tests__/Cline.test.ts index 099d112019..cbad4b1f95 100644 --- a/src/core/__tests__/Cline.test.ts +++ b/src/core/__tests__/Cline.test.ts @@ -367,7 +367,31 @@ describe("Cline", () => { }) describe("API conversation handling", () => { + /** + * Mock environment details retrieval to avoid filesystem access in tests + * + * This setup: + * 1. Prevents file listing operations that might cause test instability + * 2. Preserves test-specific mocks when they exist (via _mockGetEnvironmentDetails) + * 3. Provides a stable, empty environment by default + */ + beforeEach(() => { + // Mock the method with a stable implementation + jest.spyOn(Cline.prototype, "getEnvironmentDetails").mockImplementation( + // Use 'any' type to allow for dynamic test properties + async function (this: any, verbose: boolean = false): Promise { + // Use test-specific mock if available + if (this._mockGetEnvironmentDetails) { + return this._mockGetEnvironmentDetails() + } + // Default to empty environment details for stability + return "" + }, + ) + }) + it("should clean conversation history before sending to API", async () => { + // Cline.create will now use our mocked getEnvironmentDetails const [cline, task] = Cline.create({ provider: mockProvider, apiConfiguration: mockApiConfig, diff --git a/src/services/glob/__mocks__/list-files.ts b/src/services/glob/__mocks__/list-files.ts new file mode 100644 index 0000000000..68bc60e730 --- /dev/null +++ b/src/services/glob/__mocks__/list-files.ts @@ -0,0 +1,70 @@ +/** + * Mock implementation of list-files module + * + * IMPORTANT NOTES: + * 1. This file must be placed in src/services/glob/__mocks__/ to properly mock the module + * 2. DO NOT IMPORT any modules from the application code to avoid circular dependencies + * 3. All dependencies are mocked/stubbed locally for isolation + * + * This implementation provides predictable behavior for tests without requiring + * actual filesystem access or ripgrep binary. + */ + +/** + * Mock function for path resolving without importing path module + * Provides basic path resolution for testing + * + * @param dirPath - Directory path to resolve + * @returns Absolute mock path + */ +const mockResolve = (dirPath: string): string => { + return dirPath.startsWith("/") ? dirPath : `/mock/path/${dirPath}` +} + +/** + * Mock function to check if paths are equal without importing path module + * Provides simple equality comparison for testing + * + * @param path1 - First path to compare + * @param path2 - Second path to compare + * @returns Whether paths are equal + */ +const mockArePathsEqual = (path1: string, path2: string): boolean => { + return path1 === path2 +} + +/** + * Mock implementation of listFiles function + * Returns different results based on input path for testing different scenarios + * + * @param dirPath - Directory path to list files from + * @param recursive - Whether to list files recursively + * @param limit - Maximum number of files to return + * @returns Promise resolving to [file paths, limit reached flag] + */ +export const listFiles = jest.fn((dirPath: string, recursive: boolean, limit: number) => { + // Special case: Root or home directories + // Prevents tests from trying to list all files in these directories + if (dirPath === "/" || dirPath === "/root" || dirPath === "/home/user") { + return Promise.resolve([[dirPath], false]) + } + + // Special case: Tree-sitter tests + // Some tests expect the second value to be a Set instead of a boolean + if (dirPath.includes("test/path")) { + return Promise.resolve([[], new Set()]) + } + + // Special case: For testing directories with actual content + if (dirPath.includes("mock/content")) { + const mockFiles = [ + `${mockResolve(dirPath)}/file1.txt`, + `${mockResolve(dirPath)}/file2.js`, + `${mockResolve(dirPath)}/folder1/`, + ] + return Promise.resolve([mockFiles, false]) + } + + // Default case: Return empty list for most tests + return Promise.resolve([[], false]) +}) diff --git a/src/services/glob/list-files.ts b/src/services/glob/list-files.ts index c7e3d41cf0..6d30930ecb 100644 --- a/src/services/glob/list-files.ts +++ b/src/services/glob/list-files.ts @@ -1,97 +1,412 @@ -import { globby, Options } from "globby" import os from "os" import * as path from "path" +import * as fs from "fs" +import * as childProcess from "child_process" +import * as vscode from "vscode" import { arePathsEqual } from "../../utils/path" +import { getBinPath } from "../../services/ripgrep" +/** + * List of directories that are typically large and should be ignored + * when showing recursive file listings + */ +const DIRS_TO_IGNORE = [ + "node_modules", + "__pycache__", + "env", + "venv", + "target/dependency", + "build/dependencies", + "dist", + "out", + "bundle", + "vendor", + "tmp", + "temp", + "deps", + "pkg", + "Pods", + ".*", +] + +/** + * List files in a directory, with optional recursive traversal + * + * @param dirPath - Directory path to list files from + * @param recursive - Whether to recursively list files in subdirectories + * @param limit - Maximum number of files to return + * @returns Tuple of [file paths array, whether the limit was reached] + */ export async function listFiles(dirPath: string, recursive: boolean, limit: number): Promise<[string[], boolean]> { + // Handle special directories + const specialResult = await handleSpecialDirectories(dirPath) + if (specialResult) { + return specialResult + } + + // Get ripgrep path + const rgPath = await getRipgrepPath() + + // Get files using ripgrep + const files = await listFilesWithRipgrep(rgPath, dirPath, recursive, limit) + + // Get directories with proper filtering + const gitignorePatterns = await parseGitignoreFile(dirPath, recursive) + const directories = await listFilteredDirectories(dirPath, recursive, gitignorePatterns) + + // Combine and format the results + return formatAndCombineResults(files, directories, limit) +} + +/** + * Handle special directories (root, home) that should not be fully listed + */ +async function handleSpecialDirectories(dirPath: string): Promise<[string[], boolean] | null> { const absolutePath = path.resolve(dirPath) - // Do not allow listing files in root or home directory, which cline tends to want to do when the user's prompt is vague. + + // Do not allow listing files in root directory const root = process.platform === "win32" ? path.parse(absolutePath).root : "/" const isRoot = arePathsEqual(absolutePath, root) if (isRoot) { return [[root], false] } + + // Do not allow listing files in home directory const homeDir = os.homedir() const isHomeDir = arePathsEqual(absolutePath, homeDir) if (isHomeDir) { return [[homeDir], false] } - const dirsToIgnore = [ - "node_modules", - "__pycache__", - "env", - "venv", - "target/dependency", - "build/dependencies", - "dist", - "out", - "bundle", - "vendor", - "tmp", - "temp", - "deps", - "pkg", - "Pods", - ".*", // '!**/.*' excludes hidden directories, while '!**/.*/**' excludes only their contents. This way we are at least aware of the existence of hidden directories. - ].map((dir) => `${dirPath}/**/${dir}/**`) - - const options = { - cwd: dirPath, - dot: true, // do not ignore hidden files/directories - absolute: true, - markDirectories: true, // Append a / on any directories matched (/ is used on windows as well, so dont use path.sep) - gitignore: recursive, // globby ignores any files that are gitignored - ignore: recursive ? dirsToIgnore : undefined, // just in case there is no gitignore, we ignore sensible defaults - onlyFiles: false, // true by default, false means it will list directories on their own too - } - // * globs all files in one dir, ** globs files in nested directories - const files = recursive ? await globbyLevelByLevel(limit, options) : (await globby("*", options)).slice(0, limit) - return [files, files.length >= limit] + return null } -/* -Breadth-first traversal of directory structure level by level up to a limit: - - Queue-based approach ensures proper breadth-first traversal - - Processes directory patterns level by level - - Captures a representative sample of the directory structure up to the limit - - Minimizes risk of missing deeply nested files +/** + * Get the path to the ripgrep binary + */ +async function getRipgrepPath(): Promise { + const vscodeAppRoot = vscode.env.appRoot + const rgPath = await getBinPath(vscodeAppRoot) -- Notes: - - Relies on globby to mark directories with / - - Potential for loops if symbolic links reference back to parent (we could use followSymlinks: false but that may not be ideal for some projects and it's pointless if they're not using symlinks wrong) - - Timeout mechanism prevents infinite loops -*/ -async function globbyLevelByLevel(limit: number, options?: Options) { - let results: Set = new Set() - let queue: string[] = ["*"] + if (!rgPath) { + throw new Error("Could not find ripgrep binary") + } - const globbingProcess = async () => { - while (queue.length > 0 && results.size < limit) { - const pattern = queue.shift()! - const filesAtLevel = await globby(pattern, options) + return rgPath +} - for (const file of filesAtLevel) { - if (results.size >= limit) { +/** + * List files using ripgrep with appropriate arguments + */ +async function listFilesWithRipgrep( + rgPath: string, + dirPath: string, + recursive: boolean, + limit: number, +): Promise { + const absolutePath = path.resolve(dirPath) + const rgArgs = buildRipgrepArgs(absolutePath, recursive) + return execRipgrep(rgPath, rgArgs, limit) +} + +/** + * Build appropriate ripgrep arguments based on whether we're doing a recursive search + */ +function buildRipgrepArgs(dirPath: string, recursive: boolean): string[] { + // Base arguments to list files + const args = ["--files", "--hidden"] + + if (recursive) { + return [...args, ...buildRecursiveArgs(), dirPath] + } else { + return [...args, ...buildNonRecursiveArgs(), dirPath] + } +} + +/** + * Build ripgrep arguments for recursive directory traversal + */ +function buildRecursiveArgs(): string[] { + const args: string[] = [] + + // In recursive mode, respect .gitignore by default + // (ripgrep does this automatically) + + // Apply directory exclusions for recursive searches + for (const dir of DIRS_TO_IGNORE) { + args.push("-g", `!**/${dir}/**`) + } + + return args +} + +/** + * Build ripgrep arguments for non-recursive directory listing + */ +function buildNonRecursiveArgs(): string[] { + const args: string[] = [] + + // For non-recursive, limit to the current directory level + args.push("-g", "*") + args.push("--maxdepth", "1") // ripgrep uses maxdepth, not max-depth + + // Don't respect .gitignore in non-recursive mode (consistent with original behavior) + args.push("--no-ignore-vcs") + + // Apply directory exclusions for non-recursive searches + for (const dir of DIRS_TO_IGNORE) { + if (dir === ".*") { + // For hidden files/dirs in non-recursive mode + args.push("-g", "!.*") + } else { + // Direct children only + args.push("-g", `!${dir}`) + args.push("-g", `!${dir}/**`) + } + } + + return args +} + +/** + * Parse the .gitignore file if it exists and is relevant + */ +async function parseGitignoreFile(dirPath: string, recursive: boolean): Promise { + if (!recursive) { + return [] // Only needed for recursive mode + } + + const absolutePath = path.resolve(dirPath) + const gitignorePath = path.join(absolutePath, ".gitignore") + + try { + // Check if .gitignore exists + const exists = await fs.promises + .access(gitignorePath) + .then(() => true) + .catch(() => false) + + if (!exists) { + return [] + } + + // Read and parse .gitignore file + const content = await fs.promises.readFile(gitignorePath, "utf8") + return content + .split("\n") + .map((line) => line.trim()) + .filter((line) => line && !line.startsWith("#")) + } catch (err) { + console.warn(`Error reading .gitignore: ${err}`) + return [] // Continue without gitignore patterns on error + } +} + +/** + * List directories with appropriate filtering + */ +async function listFilteredDirectories( + dirPath: string, + recursive: boolean, + gitignorePatterns: string[], +): Promise { + const absolutePath = path.resolve(dirPath) + + try { + // List all entries in the directory + const entries = await fs.promises.readdir(absolutePath, { withFileTypes: true }) + + // Filter for directories only + const directories = entries + .filter((entry) => entry.isDirectory()) + .filter((entry) => { + return shouldIncludeDirectory(entry.name, recursive, gitignorePatterns) + }) + .map((entry) => path.join(absolutePath, entry.name)) + + // Format directory paths with trailing slash + return directories.map((dir) => (dir.endsWith("/") ? dir : `${dir}/`)) + } catch (err) { + console.error(`Error listing directories: ${err}`) + return [] // Return empty array on error + } +} + +/** + * Determine if a directory should be included in results based on filters + */ +function shouldIncludeDirectory(dirName: string, recursive: boolean, gitignorePatterns: string[]): boolean { + // Skip hidden directories if configured to ignore them + if (dirName.startsWith(".") && DIRS_TO_IGNORE.includes(".*")) { + return false + } + + // Check against explicit ignore patterns + if (isDirectoryExplicitlyIgnored(dirName)) { + return false + } + + // Check against gitignore patterns in recursive mode + if (recursive && gitignorePatterns.length > 0 && isIgnoredByGitignore(dirName, gitignorePatterns)) { + return false + } + + return true +} + +/** + * Check if a directory is in our explicit ignore list + */ +function isDirectoryExplicitlyIgnored(dirName: string): boolean { + for (const pattern of DIRS_TO_IGNORE) { + // Exact name matching + if (pattern === dirName) { + return true + } + + // Path patterns that contain / + if (pattern.includes("/")) { + const pathParts = pattern.split("/") + if (pathParts[0] === dirName) { + return true + } + } + } + + return false +} + +/** + * Check if a directory matches any gitignore patterns + */ +function isIgnoredByGitignore(dirName: string, gitignorePatterns: string[]): boolean { + for (const pattern of gitignorePatterns) { + // Directory patterns (ending with /) + if (pattern.endsWith("/")) { + const dirPattern = pattern.slice(0, -1) + if (dirName === dirPattern) { + return true + } + if (pattern.startsWith("**/") && dirName === dirPattern.slice(3)) { + return true + } + } + // Simple name patterns + else if (dirName === pattern) { + return true + } + // Wildcard patterns + else if (pattern.includes("*")) { + const regexPattern = pattern.replace(/\\/g, "\\\\").replace(/\./g, "\\.").replace(/\*/g, ".*") + const regex = new RegExp(`^${regexPattern}$`) + if (regex.test(dirName)) { + return true + } + } + } + + return false +} + +/** + * Combine file and directory results and format them properly + */ +function formatAndCombineResults(files: string[], directories: string[], limit: number): [string[], boolean] { + // Combine file paths with directory paths + const allPaths = [...directories, ...files] + + // Deduplicate paths (a directory might appear in both lists) + const uniquePaths = [...new Set(allPaths)] + + // Sort to ensure directories come first, followed by files + uniquePaths.sort((a: string, b: string) => { + const aIsDir = a.endsWith("/") + const bIsDir = b.endsWith("/") + + if (aIsDir && !bIsDir) return -1 + if (!aIsDir && bIsDir) return 1 + return a.localeCompare(b) + }) + + const trimmedPaths = uniquePaths.slice(0, limit) + return [trimmedPaths, trimmedPaths.length >= limit] +} + +/** + * Execute ripgrep command and return list of files + */ +async function execRipgrep(rgPath: string, args: string[], limit: number): Promise { + return new Promise((resolve, reject) => { + const rgProcess = childProcess.spawn(rgPath, args) + let output = "" + let results: string[] = [] + + // Set timeout to avoid hanging + const timeoutId = setTimeout(() => { + rgProcess.kill() + console.warn("ripgrep timed out, returning partial results") + resolve(results.slice(0, limit)) + }, 10_000) + + // Process stdout data as it comes in + rgProcess.stdout.on("data", (data) => { + output += data.toString() + processRipgrepOutput() + + // Kill the process if we've reached the limit + if (results.length >= limit) { + rgProcess.kill() + clearTimeout(timeoutId) // Clear the timeout when we kill the process due to reaching the limit + } + }) + + // Process stderr but don't fail on non-zero exit codes + rgProcess.stderr.on("data", (data) => { + console.error(`ripgrep stderr: ${data}`) + }) + + // Handle process completion + rgProcess.on("close", (code) => { + // Clear the timeout to avoid memory leaks + clearTimeout(timeoutId) + + // Process any remaining output + processRipgrepOutput(true) + + // Log non-zero exit codes but don't fail + if (code !== 0 && code !== null && code !== 143 /* SIGTERM */) { + console.warn(`ripgrep process exited with code ${code}, returning partial results`) + } + + resolve(results.slice(0, limit)) + }) + + // Handle process errors + rgProcess.on("error", (error) => { + // Clear the timeout to avoid memory leaks + clearTimeout(timeoutId) + reject(new Error(`ripgrep process error: ${error.message}`)) + }) + + // Helper function to process output buffer + function processRipgrepOutput(isFinal = false) { + const lines = output.split("\n") + + // Keep the last incomplete line unless this is the final processing + if (!isFinal) { + output = lines.pop() || "" + } else { + output = "" + } + + // Process each complete line + for (const line of lines) { + if (line.trim() && results.length < limit) { + results.push(line) + } else if (results.length >= limit) { break } - results.add(file) - if (file.endsWith("/")) { - queue.push(`${file}*`) - } } } - return Array.from(results).slice(0, limit) - } - - // Timeout after 10 seconds and return partial results - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => reject(new Error("Globbing timeout")), 10_000) }) - try { - return await Promise.race([globbingProcess(), timeoutPromise]) - } catch (error) { - console.warn("Globbing timed out, returning partial results") - return Array.from(results) - } } From 2205606118a624998885049779f9dd5c9b8c8fd3 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 19 Apr 2025 14:26:35 -0400 Subject: [PATCH 09/89] Remove globby as it's no longer used (#2788) --- jest.config.js | 3 +- package-lock.json | 84 ++++++++++------------------------------- package.json | 1 - src/__mocks__/globby.js | 10 ----- src/core/Cline.ts | 2 +- 5 files changed, 21 insertions(+), 79 deletions(-) delete mode 100644 src/__mocks__/globby.js diff --git a/jest.config.js b/jest.config.js index 5172373b55..c8a2d28935 100644 --- a/jest.config.js +++ b/jest.config.js @@ -31,7 +31,6 @@ module.exports = { "@modelcontextprotocol/sdk/(.*)": "/src/__mocks__/@modelcontextprotocol/sdk/$1", "^delay$": "/src/__mocks__/delay.js", "^p-wait-for$": "/src/__mocks__/p-wait-for.js", - "^globby$": "/src/__mocks__/globby.js", "^serialize-error$": "/src/__mocks__/serialize-error.js", "^strip-ansi$": "/src/__mocks__/strip-ansi.js", "^default-shell$": "/src/__mocks__/default-shell.js", @@ -39,7 +38,7 @@ module.exports = { "^strip-bom$": "/src/__mocks__/strip-bom.js", }, transformIgnorePatterns: [ - "node_modules/(?!(@modelcontextprotocol|delay|p-wait-for|globby|serialize-error|strip-ansi|default-shell|os-name|strip-bom)/)", + "node_modules/(?!(@modelcontextprotocol|delay|p-wait-for|serialize-error|strip-ansi|default-shell|os-name|strip-bom)/)", ], roots: ["/src", "/webview-ui/src"], modulePathIgnorePatterns: [".vscode-test"], diff --git a/package-lock.json b/package-lock.json index afe45be4a6..365b0785dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,6 @@ "fastest-levenshtein": "^1.0.16", "fzf": "^0.5.2", "get-folder-size": "^5.0.0", - "globby": "^14.0.2", "i18next": "^24.2.2", "isbinaryfile": "^5.0.2", "js-tiktoken": "^1.0.19", @@ -6718,6 +6717,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -6730,6 +6730,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } @@ -6738,6 +6739,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -7071,17 +7073,6 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -10357,6 +10348,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -12754,6 +12746,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -12812,6 +12805,7 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -12886,6 +12880,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -13456,6 +13451,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -13510,25 +13506,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/google-auth-library": { "version": "9.15.0", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.0.tgz", @@ -13839,6 +13816,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "engines": { "node": ">= 4" } @@ -14104,6 +14082,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -14159,6 +14138,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -14226,6 +14206,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -16531,6 +16512,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { "node": ">= 8" } @@ -16548,6 +16530,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -16938,7 +16921,6 @@ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", @@ -17726,17 +17708,6 @@ "node": ">=16" } }, - "node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pdf-parse": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.1.tgz", @@ -17772,6 +17743,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -18259,6 +18231,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -18633,6 +18606,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -18734,6 +18708,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -19156,17 +19131,6 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", @@ -20034,6 +19998,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -21448,17 +21413,6 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", diff --git a/package.json b/package.json index bc599afdf4..8129f53eda 100644 --- a/package.json +++ b/package.json @@ -427,7 +427,6 @@ "fastest-levenshtein": "^1.0.16", "fzf": "^0.5.2", "get-folder-size": "^5.0.0", - "globby": "^14.0.2", "i18next": "^24.2.2", "isbinaryfile": "^5.0.2", "js-tiktoken": "^1.0.19", diff --git a/src/__mocks__/globby.js b/src/__mocks__/globby.js deleted file mode 100644 index 493487ec44..0000000000 --- a/src/__mocks__/globby.js +++ /dev/null @@ -1,10 +0,0 @@ -function globby(patterns, options) { - return Promise.resolve([]) -} - -globby.sync = function (patterns, options) { - return [] -} - -module.exports = globby -module.exports.default = globby diff --git a/src/core/Cline.ts b/src/core/Cline.ts index cde87ebc85..0000e3ae78 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -1642,7 +1642,7 @@ export class Cline extends EventEmitter { } } - // Getting verbose details is an expensive operation, it uses globby to + // Getting verbose details is an expensive operation, it uses ripgrep to // top-down build file structure of project which for large projects can // take a few seconds. For the best UX we show a placeholder api_req_started // message with a loading spinner as this happens. From ed102d1850d5948f75e497dd154a8197e7ff7ccb Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 19 Apr 2025 15:43:27 -0400 Subject: [PATCH 10/89] Remove the strict line bounds check from the diff (#2790) --- .../__tests__/multi-search-replace.test.ts | 79 +++++++++++++++++++ .../diff/strategies/multi-search-replace.ts | 8 -- 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts index 365a36bc7d..37edcccb62 100644 --- a/src/core/diff/strategies/__tests__/multi-search-replace.test.ts +++ b/src/core/diff/strategies/__tests__/multi-search-replace.test.ts @@ -2253,6 +2253,85 @@ function process() { function two() { return 2; +}`) + } + }) + + it("should fail when line range is far outside file bounds", async () => { + const originalContent = ` +function one() { + return 1; +} + +function two() { + return 2; +} + +function three() { + return 3; +} +`.trim() + const diffContent = `test.ts +<<<<<<< SEARCH +:start_line:1000 +------- +function three() { + return 3; +} +======= +function three() { + return "three"; +} +>>>>>>> REPLACE` + + // Line 1000 is way outside the bounds of the file (10 lines) + // and outside of any reasonable buffer range, so it should fail + const result = await strategy.applyDiff(originalContent, diffContent, 1000) + expect(result.success).toBe(false) + }) + + it("should find match when line range is slightly out of bounds but within buffer zone", async () => { + const originalContent = ` +function one() { + return 1; +} + +function two() { + return 2; +} + +function three() { + return 3; +} +`.trim() + const diffContent = `test.ts +<<<<<<< SEARCH +:start_line:11 +------- +function three() { + return 3; +} +======= +function three() { + return "three"; +} +>>>>>>> REPLACE` + + // File only has 10 lines, but we specify line 11 + // It should still find the match since it's within the buffer zone (5 lines) + const result = await strategy.applyDiff(originalContent, diffContent, 11) + expect(result.success).toBe(true) + if (result.success) { + expect(result.content).toBe(`function one() { + return 1; +} + +function two() { + return 2; +} + +function three() { + return "three"; }`) } }) diff --git a/src/core/diff/strategies/multi-search-replace.ts b/src/core/diff/strategies/multi-search-replace.ts index 36de3c58ad..b7c2dffe8a 100644 --- a/src/core/diff/strategies/multi-search-replace.ts +++ b/src/core/diff/strategies/multi-search-replace.ts @@ -430,14 +430,6 @@ Only use a single line of '=======' between search and replacement content, beca const searchLen = searchLines.length const exactEndIndex = exactStartIndex + searchLen - 1 - if (exactStartIndex < 0 || exactEndIndex >= resultLines.length) { - diffResults.push({ - success: false, - error: `Line range ${startLine}-${startLine + searchLen - 1} is invalid (file has ${resultLines.length} lines)\n\nDebug Info:\n- Requested Range: lines ${startLine}-${startLine + searchLen - 1}\n- File Bounds: lines 1-${resultLines.length}`, - }) - continue - } - // Try exact match first const originalChunk = resultLines.slice(exactStartIndex, exactEndIndex + 1).join("\n") const similarity = getSimilarity(originalChunk, searchChunk) From eeb73c3c0663d3535d6c1f80ba823770bd9c1f9b Mon Sep 17 00:00:00 2001 From: Nico Bihan Date: Sat, 19 Apr 2025 23:30:20 -0500 Subject: [PATCH 11/89] Adds Gemini 2.5 Flash "thinking" model to Vertex AI Provider (#2794) --- src/shared/api.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/shared/api.ts b/src/shared/api.ts index 346268de44..825a95bc76 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -477,6 +477,16 @@ export const openRouterDefaultModelInfo: ModelInfo = { export type VertexModelId = keyof typeof vertexModels export const vertexDefaultModelId: VertexModelId = "claude-3-7-sonnet@20250219" export const vertexModels = { + "gemini-2.5-flash-preview-04-17:thinking": { + maxTokens: 65_535, + contextWindow: 1_048_576, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0.15, + outputPrice: 3.5, + thinking: true, + maxThinkingTokens: 24_576, + }, "gemini-2.5-flash-preview-04-17": { maxTokens: 65_535, contextWindow: 1_048_576, @@ -484,6 +494,7 @@ export const vertexModels = { supportsPromptCache: false, inputPrice: 0.15, outputPrice: 0.6, + thinking: false, }, "gemini-2.5-pro-preview-03-25": { maxTokens: 65_535, From cf54c7d82001ba1a1d358211385295fa29cce0a2 Mon Sep 17 00:00:00 2001 From: Sacha Sayan Date: Sun, 20 Apr 2025 21:19:42 -0400 Subject: [PATCH 12/89] Quickfix: Change cloud-download icon to more appropriate desktop-download icon. (#2802) --- webview-ui/src/components/chat/TaskHeader.tsx | 2 +- webview-ui/src/components/history/ExportButton.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 982b76bc0d..59e263bbae 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -212,7 +212,7 @@ const TaskActions = ({ item }: { item: HistoryItem | undefined }) => { size="sm" title={t("chat:task.export")} onClick={() => vscode.postMessage({ type: "exportCurrentTask" })}> - + {!!item?.size && item.size > 0 && ( <> diff --git a/webview-ui/src/components/history/ExportButton.tsx b/webview-ui/src/components/history/ExportButton.tsx index 14b312470b..2089c3dcfb 100644 --- a/webview-ui/src/components/history/ExportButton.tsx +++ b/webview-ui/src/components/history/ExportButton.tsx @@ -15,7 +15,7 @@ export const ExportButton = ({ itemId }: { itemId: string }) => { e.stopPropagation() vscode.postMessage({ type: "exportTaskWithId", text: itemId }) }}> - + ) } From 612b9481932311175da81208e3ab86b9901499a5 Mon Sep 17 00:00:00 2001 From: Sacha Sayan Date: Sun, 20 Apr 2025 21:38:08 -0400 Subject: [PATCH 13/89] Refactor: Use path aliases in webview source files. (#2801) * Refactor: Use path aliases in webview source files. * Add module resolution to root jest config. * Add tests. Broken import. Another broken import. Broken test. --- jest.config.js | 2 ++ webview-ui/jest.config.cjs | 2 ++ webview-ui/src/App.tsx | 2 +- webview-ui/src/__tests__/App.test.tsx | 14 ++++++------ .../__tests__/ContextWindowProgress.test.tsx | 8 +++---- .../ContextWindowProgressLogic.test.ts | 2 +- .../src/__tests__/TelemetryClient.test.ts | 2 +- .../common/CommandOutputViewer.test.tsx | 4 ++-- .../src/components/chat/AutoApproveMenu.tsx | 6 ++--- .../src/components/chat/BrowserSessionRow.tsx | 11 +++------- webview-ui/src/components/chat/ChatRow.tsx | 19 ++++++---------- .../src/components/chat/ChatTextArea.tsx | 10 ++++----- webview-ui/src/components/chat/ChatView.tsx | 22 +++++++++---------- .../src/components/chat/ContextMenu.tsx | 4 ++-- .../src/components/chat/FollowUpSuggest.tsx | 2 +- webview-ui/src/components/chat/TaskHeader.tsx | 8 +++---- .../chat/__tests__/ChatTextArea.test.tsx | 18 +++++++-------- .../__tests__/ChatView.auto-approve.test.tsx | 12 +++++----- .../chat/__tests__/ChatView.test.tsx | 6 ++--- .../chat/__tests__/TaskHeader.test.tsx | 4 ++-- .../chat/checkpoints/CheckpointMenu.tsx | 2 +- .../src/components/common/CodeAccordian.tsx | 4 ++-- .../src/components/common/CodeBlock.tsx | 2 +- .../components/common/CommandOutputViewer.tsx | 2 +- .../src/components/common/MarkdownBlock.tsx | 2 +- .../src/components/common/MermaidBlock.tsx | 4 ++-- .../src/components/common/TelemetryBanner.tsx | 6 ++--- .../src/components/common/Thumbnails.tsx | 2 +- .../src/components/history/HistoryPreview.tsx | 2 +- .../history/__tests__/HistoryView.test.tsx | 10 ++++----- .../src/components/mcp/McpEnabledToggle.tsx | 6 ++--- .../src/components/mcp/McpResourceRow.tsx | 2 +- webview-ui/src/components/mcp/McpToolRow.tsx | 6 ++--- webview-ui/src/components/mcp/McpView.tsx | 6 ++--- .../mcp/__tests__/McpToolRow.test.tsx | 6 ++--- .../src/components/prompts/PromptsView.tsx | 14 ++++++------ .../prompts/__tests__/PromptsView.test.tsx | 6 ++--- webview-ui/src/components/settings/About.tsx | 2 +- .../components/settings/ApiConfigManager.tsx | 2 +- .../src/components/settings/ApiOptions.tsx | 8 +++---- .../components/settings/AutoApproveToggle.tsx | 2 +- .../settings/ExperimentalSettings.tsx | 2 +- .../components/settings/LanguageSettings.tsx | 2 +- .../src/components/settings/ModelInfoView.tsx | 2 +- .../src/components/settings/ModelPicker.tsx | 2 +- .../components/settings/ReasoningEffort.tsx | 4 ++-- .../src/components/settings/SettingsView.tsx | 6 ++--- .../components/settings/ThinkingBudget.tsx | 2 +- .../ContextManagementSettings.test.tsx | 2 +- .../settings/__tests__/ModelPicker.test.tsx | 2 +- .../settings/__tests__/SettingsView.test.tsx | 2 +- .../__tests__/ThinkingBudget.test.tsx | 2 +- .../src/components/settings/constants.ts | 2 +- webview-ui/src/components/settings/types.ts | 2 +- .../ui/hooks/useOpenRouterModelProviders.ts | 4 ++-- webview-ui/src/components/welcome/RooHero.tsx | 2 +- .../src/components/welcome/WelcomeView.tsx | 10 ++++----- .../src/context/ExtensionStateContext.tsx | 22 +++++++++---------- .../__tests__/ExtensionStateContext.test.tsx | 6 ++--- .../src/stories/AutosizeTextarea.stories.tsx | 2 +- .../src/stories/Collapsible.stories.tsx | 4 ++-- webview-ui/src/utils/TelemetryClient.ts | 2 +- .../utils/__tests__/context-mentions.test.ts | 2 +- webview-ui/src/utils/context-mentions.ts | 4 ++-- webview-ui/src/utils/mcp.ts | 2 +- webview-ui/src/utils/validate.ts | 2 +- webview-ui/src/utils/vscode.ts | 2 +- webview-ui/tsconfig.json | 4 +++- webview-ui/vite.config.ts | 8 ++++--- 69 files changed, 180 insertions(+), 182 deletions(-) diff --git a/jest.config.js b/jest.config.js index c8a2d28935..cd4944c547 100644 --- a/jest.config.js +++ b/jest.config.js @@ -36,6 +36,8 @@ module.exports = { "^default-shell$": "/src/__mocks__/default-shell.js", "^os-name$": "/src/__mocks__/os-name.js", "^strip-bom$": "/src/__mocks__/strip-bom.js", + "^@roo/(.*)$": "/src/$1", + "^@src/(.*)$": "/webview-ui/src/$1", }, transformIgnorePatterns: [ "node_modules/(?!(@modelcontextprotocol|delay|p-wait-for|serialize-error|strip-ansi|default-shell|os-name|strip-bom)/)", diff --git a/webview-ui/jest.config.cjs b/webview-ui/jest.config.cjs index be5b6aa1be..2d683ebab3 100644 --- a/webview-ui/jest.config.cjs +++ b/webview-ui/jest.config.cjs @@ -12,6 +12,8 @@ module.exports = { "^vscrui$": "/src/__mocks__/vscrui.ts", "^@vscode/webview-ui-toolkit/react$": "/src/__mocks__/@vscode/webview-ui-toolkit/react.ts", "^@/(.*)$": "/src/$1", + '^@roo/(.*)$': '/../src/$1', + '^@src/(.*)$': '/src/$1', "^src/i18n/setup$": "/src/__mocks__/i18n/setup.ts", "^\\.\\./setup$": "/src/__mocks__/i18n/setup.ts", "^\\./setup$": "/src/__mocks__/i18n/setup.ts", diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index b3ac36775c..2b9d15d19e 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -2,7 +2,7 @@ import { useCallback, useEffect, useRef, useState } from "react" import { useEvent } from "react-use" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" -import { ExtensionMessage } from "../../src/shared/ExtensionMessage" +import { ExtensionMessage } from "@roo/shared/ExtensionMessage" import TranslationProvider from "./i18n/TranslationContext" import { vscode } from "./utils/vscode" diff --git a/webview-ui/src/__tests__/App.test.tsx b/webview-ui/src/__tests__/App.test.tsx index 163e745c8c..3262cef69c 100644 --- a/webview-ui/src/__tests__/App.test.tsx +++ b/webview-ui/src/__tests__/App.test.tsx @@ -6,13 +6,13 @@ import "@testing-library/jest-dom" import AppWithProviders from "../App" -jest.mock("../utils/vscode", () => ({ +jest.mock("@src/utils/vscode", () => ({ vscode: { postMessage: jest.fn(), }, })) -jest.mock("../components/chat/ChatView", () => ({ +jest.mock("@src/components/chat/ChatView", () => ({ __esModule: true, default: function ChatView({ isHidden }: { isHidden: boolean }) { return ( @@ -23,7 +23,7 @@ jest.mock("../components/chat/ChatView", () => ({ }, })) -jest.mock("../components/settings/SettingsView", () => ({ +jest.mock("@src/components/settings/SettingsView", () => ({ __esModule: true, default: function SettingsView({ onDone }: { onDone: () => void }) { return ( @@ -34,7 +34,7 @@ jest.mock("../components/settings/SettingsView", () => ({ }, })) -jest.mock("../components/history/HistoryView", () => ({ +jest.mock("@src/components/history/HistoryView", () => ({ __esModule: true, default: function HistoryView({ onDone }: { onDone: () => void }) { return ( @@ -45,7 +45,7 @@ jest.mock("../components/history/HistoryView", () => ({ }, })) -jest.mock("../components/mcp/McpView", () => ({ +jest.mock("@src/components/mcp/McpView", () => ({ __esModule: true, default: function McpView({ onDone }: { onDone: () => void }) { return ( @@ -56,7 +56,7 @@ jest.mock("../components/mcp/McpView", () => ({ }, })) -jest.mock("../components/prompts/PromptsView", () => ({ +jest.mock("@src/components/prompts/PromptsView", () => ({ __esModule: true, default: function PromptsView({ onDone }: { onDone: () => void }) { return ( @@ -67,7 +67,7 @@ jest.mock("../components/prompts/PromptsView", () => ({ }, })) -jest.mock("../context/ExtensionStateContext", () => ({ +jest.mock("@src/context/ExtensionStateContext", () => ({ useExtensionState: () => ({ didHydrateState: true, showWelcome: false, diff --git a/webview-ui/src/__tests__/ContextWindowProgress.test.tsx b/webview-ui/src/__tests__/ContextWindowProgress.test.tsx index 431cb6136e..bd26767db1 100644 --- a/webview-ui/src/__tests__/ContextWindowProgress.test.tsx +++ b/webview-ui/src/__tests__/ContextWindowProgress.test.tsx @@ -2,7 +2,7 @@ import { render, screen } from "@testing-library/react" import "@testing-library/jest-dom" -import TaskHeader from "../components/chat/TaskHeader" +import TaskHeader from "@src/components/chat/TaskHeader" // Mock formatLargeNumber function jest.mock("@/utils/format", () => ({ @@ -15,7 +15,7 @@ jest.mock("@vscode/webview-ui-toolkit/react", () => ({ })) // Mock ExtensionStateContext since we use useExtensionState -jest.mock("../context/ExtensionStateContext", () => ({ +jest.mock("@src/context/ExtensionStateContext", () => ({ useExtensionState: jest.fn(() => ({ apiConfiguration: { apiProvider: "openai", @@ -30,8 +30,8 @@ jest.mock("../context/ExtensionStateContext", () => ({ })) // Mock highlighting function to avoid JSX parsing issues in tests -jest.mock("../components/chat/TaskHeader", () => { - const originalModule = jest.requireActual("../components/chat/TaskHeader") +jest.mock("@src/components/chat/TaskHeader", () => { + const originalModule = jest.requireActual("@src/components/chat/TaskHeader") return { __esModule: true, ...originalModule, diff --git a/webview-ui/src/__tests__/ContextWindowProgressLogic.test.ts b/webview-ui/src/__tests__/ContextWindowProgressLogic.test.ts index 48ffc7c7e2..c905d79aa4 100644 --- a/webview-ui/src/__tests__/ContextWindowProgressLogic.test.ts +++ b/webview-ui/src/__tests__/ContextWindowProgressLogic.test.ts @@ -1,7 +1,7 @@ // This test directly tests the logic of the ContextWindowProgress component calculations // without needing to render the full component import { describe, test, expect } from "@jest/globals" -import { calculateTokenDistribution } from "../utils/model-utils" +import { calculateTokenDistribution } from "@src/utils/model-utils" export {} // This makes the file a proper TypeScript module diff --git a/webview-ui/src/__tests__/TelemetryClient.test.ts b/webview-ui/src/__tests__/TelemetryClient.test.ts index 5ded6b2d15..e417dac466 100644 --- a/webview-ui/src/__tests__/TelemetryClient.test.ts +++ b/webview-ui/src/__tests__/TelemetryClient.test.ts @@ -1,7 +1,7 @@ /** * Tests for TelemetryClient */ -import { telemetryClient } from "../utils/TelemetryClient" +import { telemetryClient } from "@src/utils/TelemetryClient" import posthog from "posthog-js" describe("TelemetryClient", () => { diff --git a/webview-ui/src/__tests__/components/common/CommandOutputViewer.test.tsx b/webview-ui/src/__tests__/components/common/CommandOutputViewer.test.tsx index 03562c51b6..15315d2807 100644 --- a/webview-ui/src/__tests__/components/common/CommandOutputViewer.test.tsx +++ b/webview-ui/src/__tests__/components/common/CommandOutputViewer.test.tsx @@ -1,9 +1,9 @@ import React from "react" import { render, screen } from "@testing-library/react" -import CommandOutputViewer from "../../../components/common/CommandOutputViewer" +import CommandOutputViewer from "@src/components/common/CommandOutputViewer" // Mock the cn utility function -jest.mock("../../../lib/utils", () => ({ +jest.mock("@src/lib/utils", () => ({ cn: (...inputs: any[]) => inputs.filter(Boolean).join(" "), })) diff --git a/webview-ui/src/components/chat/AutoApproveMenu.tsx b/webview-ui/src/components/chat/AutoApproveMenu.tsx index bcd5342197..aaa30a0153 100644 --- a/webview-ui/src/components/chat/AutoApproveMenu.tsx +++ b/webview-ui/src/components/chat/AutoApproveMenu.tsx @@ -2,9 +2,9 @@ import { useCallback, useMemo, useState } from "react" import { Trans } from "react-i18next" import { VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react" -import { vscode } from "../../utils/vscode" -import { useExtensionState } from "../../context/ExtensionStateContext" -import { useAppTranslation } from "../../i18n/TranslationContext" +import { vscode } from "@src/utils/vscode" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { useAppTranslation } from "@src/i18n/TranslationContext" import { AutoApproveToggle, AutoApproveSetting, autoApproveSettingsConfig } from "../settings/AutoApproveToggle" interface AutoApproveMenuProps { diff --git a/webview-ui/src/components/chat/BrowserSessionRow.tsx b/webview-ui/src/components/chat/BrowserSessionRow.tsx index 7138f74596..a52d944abc 100644 --- a/webview-ui/src/components/chat/BrowserSessionRow.tsx +++ b/webview-ui/src/components/chat/BrowserSessionRow.tsx @@ -1,14 +1,9 @@ import deepEqual from "fast-deep-equal" import React, { memo, useEffect, useMemo, useRef, useState } from "react" import { useSize } from "react-use" -import { useExtensionState } from "../../context/ExtensionStateContext" -import { - BrowserAction, - BrowserActionResult, - ClineMessage, - ClineSayBrowserAction, -} from "../../../../src/shared/ExtensionMessage" -import { vscode } from "../../utils/vscode" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { BrowserAction, BrowserActionResult, ClineMessage, ClineSayBrowserAction } from "@roo/shared/ExtensionMessage" +import { vscode } from "@src/utils/vscode" import CodeBlock, { CODE_BLOCK_BG_COLOR } from "../common/CodeBlock" import { ChatRowContent, ProgressIndicator } from "./ChatRow" import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 60526e11d1..96ba3ef3ec 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -6,18 +6,13 @@ import { VSCodeBadge, VSCodeButton, VSCodeProgressRing } from "@vscode/webview-u import { Button } from "@/components/ui" -import { useCopyToClipboard } from "../../utils/clipboard" -import { safeJsonParse } from "../../utils/json" -import { - ClineApiReqInfo, - ClineAskUseMcpServer, - ClineMessage, - ClineSayTool, -} from "../../../../src/shared/ExtensionMessage" -import { COMMAND_OUTPUT_STRING } from "../../../../src/shared/combineCommandSequences" -import { useExtensionState } from "../../context/ExtensionStateContext" -import { findMatchingResourceOrTemplate } from "../../utils/mcp" -import { vscode } from "../../utils/vscode" +import { useCopyToClipboard } from "@src/utils/clipboard" +import { safeJsonParse } from "@src/utils/json" +import { ClineApiReqInfo, ClineAskUseMcpServer, ClineMessage, ClineSayTool } from "@roo/shared/ExtensionMessage" +import { COMMAND_OUTPUT_STRING } from "@roo/shared/combineCommandSequences" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { findMatchingResourceOrTemplate } from "@src/utils/mcp" +import { vscode } from "@src/utils/vscode" import CodeAccordian, { removeLeadingNonAlphanumeric } from "../common/CodeAccordian" import CodeBlock, { CODE_BLOCK_BG_COLOR } from "../common/CodeBlock" import CommandOutputViewer from "../common/CommandOutputViewer" diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 3ce6155dc0..369ae5e721 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -2,10 +2,10 @@ import React, { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, us import { useEvent } from "react-use" import DynamicTextArea from "react-textarea-autosize" -import { mentionRegex, mentionRegexGlobal } from "../../../../src/shared/context-mentions" -import { WebviewMessage } from "../../../../src/shared/WebviewMessage" -import { Mode, getAllModes } from "../../../../src/shared/modes" -import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage" +import { mentionRegex, mentionRegexGlobal } from "@roo/shared/context-mentions" +import { WebviewMessage } from "@roo/shared/WebviewMessage" +import { Mode, getAllModes } from "@roo/shared/modes" +import { ExtensionMessage } from "@roo/shared/ExtensionMessage" import { vscode } from "@/utils/vscode" import { useExtensionState } from "@/context/ExtensionStateContext" @@ -17,7 +17,7 @@ import { removeMention, shouldShowContextMenu, SearchResult, -} from "@/utils/context-mentions" +} from "@src/utils/context-mentions" import { convertToMentionPath } from "@/utils/path-mentions" import { SelectDropdown, DropdownOptionType, Button } from "@/components/ui" diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index a3bca8d03b..23072e7b9c 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -10,14 +10,14 @@ import { ClineSayBrowserAction, ClineSayTool, ExtensionMessage, -} from "../../../../src/shared/ExtensionMessage" -import { McpServer, McpTool } from "../../../../src/shared/mcp" -import { findLast } from "../../../../src/shared/array" -import { combineApiRequests } from "../../../../src/shared/combineApiRequests" -import { combineCommandSequences } from "../../../../src/shared/combineCommandSequences" -import { getApiMetrics } from "../../../../src/shared/getApiMetrics" -import { useExtensionState } from "../../context/ExtensionStateContext" -import { vscode } from "../../utils/vscode" +} from "@roo/shared/ExtensionMessage" +import { McpServer, McpTool } from "@roo/shared/mcp" +import { findLast } from "@roo/shared/array" +import { combineApiRequests } from "@roo/shared/combineApiRequests" +import { combineCommandSequences } from "@roo/shared/combineCommandSequences" +import { getApiMetrics } from "@roo/shared/getApiMetrics" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { vscode } from "@src/utils/vscode" import HistoryPreview from "../history/HistoryPreview" import RooHero from "../welcome/RooHero" import { normalizeApiConfiguration } from "../settings/ApiOptions" @@ -27,9 +27,9 @@ import ChatRow from "./ChatRow" import ChatTextArea from "./ChatTextArea" import TaskHeader from "./TaskHeader" import AutoApproveMenu from "./AutoApproveMenu" -import { AudioType } from "../../../../src/shared/WebviewMessage" -import { validateCommand } from "../../utils/command-validation" -import { getAllModes } from "../../../../src/shared/modes" +import { AudioType } from "@roo/shared/WebviewMessage" +import { validateCommand } from "@src/utils/command-validation" +import { getAllModes } from "@roo/shared/modes" import TelemetryBanner from "../common/TelemetryBanner" import { useAppTranslation } from "@/i18n/TranslationContext" import removeMd from "remove-markdown" diff --git a/webview-ui/src/components/chat/ContextMenu.tsx b/webview-ui/src/components/chat/ContextMenu.tsx index a28eb10059..85b499e523 100644 --- a/webview-ui/src/components/chat/ContextMenu.tsx +++ b/webview-ui/src/components/chat/ContextMenu.tsx @@ -4,9 +4,9 @@ import { ContextMenuQueryItem, getContextMenuOptions, SearchResult, -} from "../../utils/context-mentions" +} from "@src/utils/context-mentions" import { removeLeadingNonAlphanumeric } from "../common/CodeAccordian" -import { ModeConfig } from "../../../../src/shared/modes" +import { ModeConfig } from "@roo/shared/modes" interface ContextMenuProps { onSelect: (type: ContextMenuOptionType, value?: string) => void diff --git a/webview-ui/src/components/chat/FollowUpSuggest.tsx b/webview-ui/src/components/chat/FollowUpSuggest.tsx index 5f1402bf44..44a30ca803 100644 --- a/webview-ui/src/components/chat/FollowUpSuggest.tsx +++ b/webview-ui/src/components/chat/FollowUpSuggest.tsx @@ -3,7 +3,7 @@ import { Edit } from "lucide-react" import { Button } from "@/components/ui" -import { useAppTranslation } from "../../i18n/TranslationContext" +import { useAppTranslation } from "@src/i18n/TranslationContext" interface FollowUpSuggestProps { suggestions?: string[] diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 59e263bbae..0dc2aa1a5f 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -8,11 +8,11 @@ import { formatLargeNumber } from "@/utils/format" import { calculateTokenDistribution, getMaxTokensForModel } from "@/utils/model-utils" import { Button } from "@/components/ui" -import { ClineMessage } from "../../../../src/shared/ExtensionMessage" -import { mentionRegexGlobal } from "../../../../src/shared/context-mentions" -import { HistoryItem } from "../../../../src/shared/HistoryItem" +import { ClineMessage } from "@roo/shared/ExtensionMessage" +import { mentionRegexGlobal } from "@roo/shared/context-mentions" +import { HistoryItem } from "@roo/shared/HistoryItem" -import { useExtensionState } from "../../context/ExtensionStateContext" +import { useExtensionState } from "@src/context/ExtensionStateContext" import Thumbnails from "../common/Thumbnails" import { normalizeApiConfiguration } from "../settings/ApiOptions" import { DeleteTaskDialog } from "../history/DeleteTaskDialog" diff --git a/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx b/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx index 31f9cf7d75..2262f1494d 100644 --- a/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx @@ -1,19 +1,19 @@ import { render, fireEvent, screen } from "@testing-library/react" import ChatTextArea from "../ChatTextArea" -import { useExtensionState } from "../../../context/ExtensionStateContext" -import { vscode } from "../../../utils/vscode" -import { defaultModeSlug } from "../../../../../src/shared/modes" -import * as pathMentions from "../../../utils/path-mentions" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { vscode } from "@src/utils/vscode" +import { defaultModeSlug } from "@roo/shared/modes" +import * as pathMentions from "@src/utils/path-mentions" // Mock modules -jest.mock("../../../utils/vscode", () => ({ +jest.mock("@src/utils/vscode", () => ({ vscode: { postMessage: jest.fn(), }, })) -jest.mock("../../../components/common/CodeBlock") -jest.mock("../../../components/common/MarkdownBlock") -jest.mock("../../../utils/path-mentions", () => ({ +jest.mock("@src/components/common/CodeBlock") +jest.mock("@src/components/common/MarkdownBlock") +jest.mock("@src/utils/path-mentions", () => ({ convertToMentionPath: jest.fn((path, cwd) => { // Simple mock implementation that mimics the real function's behavior if (cwd && path.toLowerCase().startsWith(cwd.toLowerCase())) { @@ -29,7 +29,7 @@ const mockPostMessage = vscode.postMessage as jest.Mock const mockConvertToMentionPath = pathMentions.convertToMentionPath as jest.Mock // Mock ExtensionStateContext -jest.mock("../../../context/ExtensionStateContext") +jest.mock("@src/context/ExtensionStateContext") // Custom query function to get the enhance prompt button const getEnhancePromptButton = () => { diff --git a/webview-ui/src/components/chat/__tests__/ChatView.auto-approve.test.tsx b/webview-ui/src/components/chat/__tests__/ChatView.auto-approve.test.tsx index d188ddb8cf..f1afd66b26 100644 --- a/webview-ui/src/components/chat/__tests__/ChatView.auto-approve.test.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatView.auto-approve.test.tsx @@ -1,11 +1,11 @@ import React from "react" import { render, waitFor } from "@testing-library/react" import ChatView from "../ChatView" -import { ExtensionStateContextProvider } from "../../../context/ExtensionStateContext" -import { vscode } from "../../../utils/vscode" +import { ExtensionStateContextProvider } from "@src/context/ExtensionStateContext" +import { vscode } from "@src/utils/vscode" // Mock vscode API -jest.mock("../../../utils/vscode", () => ({ +jest.mock("@src/utils/vscode", () => ({ vscode: { postMessage: jest.fn(), }, @@ -49,18 +49,18 @@ jest.mock("../AutoApproveMenu", () => ({ default: () => null, })) -jest.mock("../../common/CodeBlock", () => ({ +jest.mock("@src/components/common/CodeBlock", () => ({ __esModule: true, default: () => null, CODE_BLOCK_BG_COLOR: "rgb(30, 30, 30)", })) -jest.mock("../../common/CodeAccordian", () => ({ +jest.mock("@src/components/common/CodeAccordian", () => ({ __esModule: true, default: () => null, })) -jest.mock("../ContextMenu", () => ({ +jest.mock("@src/components/chat/ContextMenu", () => ({ __esModule: true, default: () => null, })) diff --git a/webview-ui/src/components/chat/__tests__/ChatView.test.tsx b/webview-ui/src/components/chat/__tests__/ChatView.test.tsx index 146450a928..adc19ca0bb 100644 --- a/webview-ui/src/components/chat/__tests__/ChatView.test.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatView.test.tsx @@ -1,8 +1,8 @@ import React from "react" import { render, waitFor, act } from "@testing-library/react" import ChatView from "../ChatView" -import { ExtensionStateContextProvider } from "../../../context/ExtensionStateContext" -import { vscode } from "../../../utils/vscode" +import { ExtensionStateContextProvider } from "@src/context/ExtensionStateContext" +import { vscode } from "@src/utils/vscode" // Define minimal types needed for testing interface ClineMessage { @@ -25,7 +25,7 @@ interface ExtensionState { } // Mock vscode API -jest.mock("../../../utils/vscode", () => ({ +jest.mock("@src/utils/vscode", () => ({ vscode: { postMessage: jest.fn(), }, diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.test.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.test.tsx index 6880de29d7..dfd82a260f 100644 --- a/webview-ui/src/components/chat/__tests__/TaskHeader.test.tsx +++ b/webview-ui/src/components/chat/__tests__/TaskHeader.test.tsx @@ -3,7 +3,7 @@ import React from "react" import { render, screen } from "@testing-library/react" import TaskHeader from "../TaskHeader" -import { ApiConfiguration } from "../../../../../src/shared/api" +import { ApiConfiguration } from "@roo/shared/api" // Mock the vscode API jest.mock("@/utils/vscode", () => ({ @@ -18,7 +18,7 @@ jest.mock("@vscode/webview-ui-toolkit/react", () => ({ })) // Mock the ExtensionStateContext -jest.mock("../../../context/ExtensionStateContext", () => ({ +jest.mock("@src/context/ExtensionStateContext", () => ({ useExtensionState: () => ({ apiConfiguration: { apiProvider: "anthropic", diff --git a/webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx b/webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx index f0f8545b6e..348e230619 100644 --- a/webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx +++ b/webview-ui/src/components/chat/checkpoints/CheckpointMenu.tsx @@ -5,7 +5,7 @@ import { useTranslation } from "react-i18next" import { Button, Popover, PopoverContent, PopoverTrigger } from "@/components/ui" import { useRooPortal } from "@/components/ui/hooks" -import { vscode } from "../../../utils/vscode" +import { vscode } from "@src/utils/vscode" import { Checkpoint } from "./schema" type CheckpointMenuProps = { diff --git a/webview-ui/src/components/common/CodeAccordian.tsx b/webview-ui/src/components/common/CodeAccordian.tsx index 468eade72f..7d803e65af 100644 --- a/webview-ui/src/components/common/CodeAccordian.tsx +++ b/webview-ui/src/components/common/CodeAccordian.tsx @@ -1,7 +1,7 @@ import { memo, useMemo } from "react" -import { getLanguageFromPath } from "../../utils/getLanguageFromPath" +import { getLanguageFromPath } from "@src/utils/getLanguageFromPath" import CodeBlock, { CODE_BLOCK_BG_COLOR } from "./CodeBlock" -import { ToolProgressStatus } from "../../../../src/shared/ExtensionMessage" +import { ToolProgressStatus } from "@roo/shared/ExtensionMessage" interface CodeAccordianProps { code?: string diff --git a/webview-ui/src/components/common/CodeBlock.tsx b/webview-ui/src/components/common/CodeBlock.tsx index bc5c1fcbcf..04da931bd1 100644 --- a/webview-ui/src/components/common/CodeBlock.tsx +++ b/webview-ui/src/components/common/CodeBlock.tsx @@ -3,7 +3,7 @@ import { useRemark } from "react-remark" import rehypeHighlight, { Options } from "rehype-highlight" import styled from "styled-components" import { visit } from "unist-util-visit" -import { useExtensionState } from "../../context/ExtensionStateContext" +import { useExtensionState } from "@src/context/ExtensionStateContext" export const CODE_BLOCK_BG_COLOR = "var(--vscode-editor-background, --vscode-sideBar-background, rgb(30 30 30))" diff --git a/webview-ui/src/components/common/CommandOutputViewer.tsx b/webview-ui/src/components/common/CommandOutputViewer.tsx index 443f3bc9e8..6460384037 100644 --- a/webview-ui/src/components/common/CommandOutputViewer.tsx +++ b/webview-ui/src/components/common/CommandOutputViewer.tsx @@ -1,6 +1,6 @@ import { forwardRef, useEffect, useRef } from "react" import { Virtuoso, VirtuosoHandle } from "react-virtuoso" -import { cn } from "../../lib/utils" +import { cn } from "@src/lib/utils" interface CommandOutputViewerProps { output: string diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index bedd291d67..e8ff706713 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -3,7 +3,7 @@ import { useRemark } from "react-remark" import rehypeHighlight, { Options } from "rehype-highlight" import styled from "styled-components" import { visit } from "unist-util-visit" -import { useExtensionState } from "../../context/ExtensionStateContext" +import { useExtensionState } from "@src/context/ExtensionStateContext" import { CODE_BLOCK_BG_COLOR } from "./CodeBlock" import MermaidBlock from "./MermaidBlock" diff --git a/webview-ui/src/components/common/MermaidBlock.tsx b/webview-ui/src/components/common/MermaidBlock.tsx index 6153570cf2..59132e4239 100644 --- a/webview-ui/src/components/common/MermaidBlock.tsx +++ b/webview-ui/src/components/common/MermaidBlock.tsx @@ -1,8 +1,8 @@ import { useEffect, useRef, useState } from "react" import mermaid from "mermaid" -import { useDebounceEffect } from "../../utils/useDebounceEffect" +import { useDebounceEffect } from "@src/utils/useDebounceEffect" import styled from "styled-components" -import { vscode } from "../../utils/vscode" +import { vscode } from "@src/utils/vscode" const MERMAID_THEME = { background: "#1e1e1e", // VS Code dark theme background diff --git a/webview-ui/src/components/common/TelemetryBanner.tsx b/webview-ui/src/components/common/TelemetryBanner.tsx index b27c6a1efb..dac980489c 100644 --- a/webview-ui/src/components/common/TelemetryBanner.tsx +++ b/webview-ui/src/components/common/TelemetryBanner.tsx @@ -1,9 +1,9 @@ import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react" import { memo, useState } from "react" import styled from "styled-components" -import { vscode } from "../../utils/vscode" -import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting" -import { useAppTranslation } from "../../i18n/TranslationContext" +import { vscode } from "@src/utils/vscode" +import { TelemetrySetting } from "@roo/shared/TelemetrySetting" +import { useAppTranslation } from "@src/i18n/TranslationContext" import { Trans } from "react-i18next" const BannerContainer = styled.div` diff --git a/webview-ui/src/components/common/Thumbnails.tsx b/webview-ui/src/components/common/Thumbnails.tsx index 63f326ecbc..acdf5f4295 100644 --- a/webview-ui/src/components/common/Thumbnails.tsx +++ b/webview-ui/src/components/common/Thumbnails.tsx @@ -1,6 +1,6 @@ import React, { useState, useRef, useLayoutEffect, memo } from "react" import { useWindowSize } from "react-use" -import { vscode } from "../../utils/vscode" +import { vscode } from "@src/utils/vscode" interface ThumbnailsProps { images: string[] diff --git a/webview-ui/src/components/history/HistoryPreview.tsx b/webview-ui/src/components/history/HistoryPreview.tsx index a49eda9998..3d3a5f0a13 100644 --- a/webview-ui/src/components/history/HistoryPreview.tsx +++ b/webview-ui/src/components/history/HistoryPreview.tsx @@ -4,7 +4,7 @@ import { vscode } from "@/utils/vscode" import { formatLargeNumber, formatDate } from "@/utils/format" import { Button } from "@/components/ui" -import { useAppTranslation } from "../../i18n/TranslationContext" +import { useAppTranslation } from "@src/i18n/TranslationContext" import { CopyButton } from "./CopyButton" import { useTaskSearch } from "./useTaskSearch" diff --git a/webview-ui/src/components/history/__tests__/HistoryView.test.tsx b/webview-ui/src/components/history/__tests__/HistoryView.test.tsx index 379f7ccda7..488632489a 100644 --- a/webview-ui/src/components/history/__tests__/HistoryView.test.tsx +++ b/webview-ui/src/components/history/__tests__/HistoryView.test.tsx @@ -2,12 +2,12 @@ import { render, screen, fireEvent, within, act } from "@testing-library/react" import HistoryView from "../HistoryView" -import { useExtensionState } from "../../../context/ExtensionStateContext" -import { vscode } from "../../../utils/vscode" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { vscode } from "@src/utils/vscode" -jest.mock("../../../context/ExtensionStateContext") -jest.mock("../../../utils/vscode") -jest.mock("../../../i18n/TranslationContext") +jest.mock("@src/context/ExtensionStateContext") +jest.mock("@src/utils/vscode") +jest.mock("@src/i18n/TranslationContext") jest.mock("react-virtuoso", () => ({ Virtuoso: ({ data, itemContent }: any) => (
diff --git a/webview-ui/src/components/mcp/McpEnabledToggle.tsx b/webview-ui/src/components/mcp/McpEnabledToggle.tsx index 967c06e829..648cb77142 100644 --- a/webview-ui/src/components/mcp/McpEnabledToggle.tsx +++ b/webview-ui/src/components/mcp/McpEnabledToggle.tsx @@ -1,8 +1,8 @@ import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" import { FormEvent } from "react" -import { useExtensionState } from "../../context/ExtensionStateContext" -import { useAppTranslation } from "../../i18n/TranslationContext" -import { vscode } from "../../utils/vscode" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { useAppTranslation } from "@src/i18n/TranslationContext" +import { vscode } from "@src/utils/vscode" const McpEnabledToggle = () => { const { mcpEnabled, setMcpEnabled } = useExtensionState() diff --git a/webview-ui/src/components/mcp/McpResourceRow.tsx b/webview-ui/src/components/mcp/McpResourceRow.tsx index 766c78e56a..b31082dafb 100644 --- a/webview-ui/src/components/mcp/McpResourceRow.tsx +++ b/webview-ui/src/components/mcp/McpResourceRow.tsx @@ -1,4 +1,4 @@ -import { McpResource, McpResourceTemplate } from "../../../../src/shared/mcp" +import { McpResource, McpResourceTemplate } from "@roo/shared/mcp" type McpResourceRowProps = { item: McpResource | McpResourceTemplate diff --git a/webview-ui/src/components/mcp/McpToolRow.tsx b/webview-ui/src/components/mcp/McpToolRow.tsx index 177ff8d223..2cab9b31ee 100644 --- a/webview-ui/src/components/mcp/McpToolRow.tsx +++ b/webview-ui/src/components/mcp/McpToolRow.tsx @@ -1,7 +1,7 @@ import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" -import { McpTool } from "../../../../src/shared/mcp" -import { useAppTranslation } from "../../i18n/TranslationContext" -import { vscode } from "../../utils/vscode" +import { McpTool } from "@roo/shared/mcp" +import { useAppTranslation } from "@src/i18n/TranslationContext" +import { vscode } from "@src/utils/vscode" type McpToolRowProps = { tool: McpTool diff --git a/webview-ui/src/components/mcp/McpView.tsx b/webview-ui/src/components/mcp/McpView.tsx index 48c6ee8099..b21a479730 100644 --- a/webview-ui/src/components/mcp/McpView.tsx +++ b/webview-ui/src/components/mcp/McpView.tsx @@ -8,13 +8,13 @@ import { VSCodePanelView, } from "@vscode/webview-ui-toolkit/react" -import { McpServer } from "../../../../src/shared/mcp" +import { McpServer } from "@roo/shared/mcp" import { vscode } from "@/utils/vscode" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui" -import { useExtensionState } from "../../context/ExtensionStateContext" -import { useAppTranslation } from "../../i18n/TranslationContext" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { useAppTranslation } from "@src/i18n/TranslationContext" import { Trans } from "react-i18next" import { Tab, TabContent, TabHeader } from "../common/Tab" import McpToolRow from "./McpToolRow" diff --git a/webview-ui/src/components/mcp/__tests__/McpToolRow.test.tsx b/webview-ui/src/components/mcp/__tests__/McpToolRow.test.tsx index 0b0192ace2..87323d1e91 100644 --- a/webview-ui/src/components/mcp/__tests__/McpToolRow.test.tsx +++ b/webview-ui/src/components/mcp/__tests__/McpToolRow.test.tsx @@ -1,10 +1,10 @@ import React from "react" import { render, fireEvent, screen } from "@testing-library/react" import McpToolRow from "../McpToolRow" -import { vscode } from "../../../utils/vscode" +import { vscode } from "@src/utils/vscode" // Mock the translation hook -jest.mock("../../../i18n/TranslationContext", () => ({ +jest.mock("@src/i18n/TranslationContext", () => ({ useAppTranslation: () => ({ t: (key: string) => { const translations: Record = { @@ -17,7 +17,7 @@ jest.mock("../../../i18n/TranslationContext", () => ({ }), })) -jest.mock("../../../utils/vscode", () => ({ +jest.mock("@src/utils/vscode", () => ({ vscode: { postMessage: jest.fn(), }, diff --git a/webview-ui/src/components/prompts/PromptsView.tsx b/webview-ui/src/components/prompts/PromptsView.tsx index b3ea68a3dd..e53bea2460 100644 --- a/webview-ui/src/components/prompts/PromptsView.tsx +++ b/webview-ui/src/components/prompts/PromptsView.tsx @@ -10,7 +10,7 @@ import { VSCodeRadio, } from "@vscode/webview-ui-toolkit/react" -import { useExtensionState } from "../../context/ExtensionStateContext" +import { useExtensionState } from "@src/context/ExtensionStateContext" import { Mode, PromptComponent, @@ -19,15 +19,15 @@ import { getAllModes, ModeConfig, GroupEntry, -} from "../../../../src/shared/modes" -import { modeConfigSchema } from "../../../../src/schemas" -import { supportPrompt, SupportPromptType } from "../../../../src/shared/support-prompt" +} from "@roo/shared/modes" +import { modeConfigSchema } from "@roo/schemas" +import { supportPrompt, SupportPromptType } from "@roo/shared/support-prompt" -import { TOOL_GROUPS, ToolGroup } from "../../../../src/shared/tools" -import { vscode } from "../../utils/vscode" +import { TOOL_GROUPS, ToolGroup } from "@roo/shared/tools" +import { vscode } from "@src/utils/vscode" import { Tab, TabContent, TabHeader } from "../common/Tab" import i18next from "i18next" -import { useAppTranslation } from "../../i18n/TranslationContext" +import { useAppTranslation } from "@src/i18n/TranslationContext" import { Trans } from "react-i18next" // Get all available groups that should show in prompts view diff --git a/webview-ui/src/components/prompts/__tests__/PromptsView.test.tsx b/webview-ui/src/components/prompts/__tests__/PromptsView.test.tsx index d3827a24c0..72695a6920 100644 --- a/webview-ui/src/components/prompts/__tests__/PromptsView.test.tsx +++ b/webview-ui/src/components/prompts/__tests__/PromptsView.test.tsx @@ -1,10 +1,10 @@ import { render, screen, fireEvent, waitFor } from "@testing-library/react" import PromptsView from "../PromptsView" -import { ExtensionStateContext } from "../../../context/ExtensionStateContext" -import { vscode } from "../../../utils/vscode" +import { ExtensionStateContext } from "@src/context/ExtensionStateContext" +import { vscode } from "@src/utils/vscode" // Mock vscode API -jest.mock("../../../utils/vscode", () => ({ +jest.mock("@src/utils/vscode", () => ({ vscode: { postMessage: jest.fn(), }, diff --git a/webview-ui/src/components/settings/About.tsx b/webview-ui/src/components/settings/About.tsx index 93857832fe..9508dab60f 100644 --- a/webview-ui/src/components/settings/About.tsx +++ b/webview-ui/src/components/settings/About.tsx @@ -5,7 +5,7 @@ import { Info, Download, Upload, TriangleAlert } from "lucide-react" import { VSCodeCheckbox, VSCodeLink } from "@vscode/webview-ui-toolkit/react" -import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting" +import { TelemetrySetting } from "@roo/shared/TelemetrySetting" import { vscode } from "@/utils/vscode" import { cn } from "@/lib/utils" diff --git a/webview-ui/src/components/settings/ApiConfigManager.tsx b/webview-ui/src/components/settings/ApiConfigManager.tsx index 149de829e7..841de5d8a2 100644 --- a/webview-ui/src/components/settings/ApiConfigManager.tsx +++ b/webview-ui/src/components/settings/ApiConfigManager.tsx @@ -2,7 +2,7 @@ import { memo, useEffect, useRef, useState } from "react" import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { ChevronsUpDown, Check, X } from "lucide-react" -import { ApiConfigMeta } from "../../../../src/shared/ExtensionMessage" +import { ApiConfigMeta } from "@roo/shared/ExtensionMessage" import { useAppTranslation } from "@/i18n/TranslationContext" import { cn } from "@/lib/utils" diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 9eca64e862..9381690b30 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -1,7 +1,7 @@ import React, { memo, useCallback, useEffect, useMemo, useState } from "react" import { useAppTranslation } from "@/i18n/TranslationContext" import { Trans } from "react-i18next" -import { getRequestyAuthUrl, getOpenRouterAuthUrl, getGlamaAuthUrl } from "../../oauth/urls" +import { getRequestyAuthUrl, getOpenRouterAuthUrl, getGlamaAuthUrl } from "@src/oauth/urls" import { useDebounce, useEvent } from "react-use" import { LanguageModelChatSelector } from "vscode" import { Checkbox } from "vscrui" @@ -38,8 +38,8 @@ import { xaiDefaultModelId, xaiModels, ApiProvider, -} from "../../../../src/shared/api" -import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage" +} from "@roo/shared/api" +import { ExtensionMessage } from "@roo/shared/ExtensionMessage" import { vscode } from "@/utils/vscode" import { validateApiConfiguration, validateModelId, validateBedrockArn } from "@/utils/validate" @@ -49,7 +49,7 @@ import { } from "@/components/ui/hooks/useOpenRouterModelProviders" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, SelectSeparator, Button } from "@/components/ui" import { MODELS_BY_PROVIDER, PROVIDERS, VERTEX_REGIONS, REASONING_MODELS } from "./constants" -import { AWS_REGIONS } from "../../../../src/shared/aws_regions" +import { AWS_REGIONS } from "@roo/shared/aws_regions" import { VSCodeButtonLink } from "../common/VSCodeButtonLink" import { ModelInfoView } from "./ModelInfoView" import { ModelPicker } from "./ModelPicker" diff --git a/webview-ui/src/components/settings/AutoApproveToggle.tsx b/webview-ui/src/components/settings/AutoApproveToggle.tsx index f46ed06838..e2cff3fea7 100644 --- a/webview-ui/src/components/settings/AutoApproveToggle.tsx +++ b/webview-ui/src/components/settings/AutoApproveToggle.tsx @@ -2,7 +2,7 @@ import { useAppTranslation } from "@/i18n/TranslationContext" import { cn } from "@/lib/utils" import { Button } from "@/components/ui" -import { GlobalSettings } from "../../../../src/schemas" +import { GlobalSettings } from "@roo/schemas" type AutoApproveToggles = Pick< GlobalSettings, diff --git a/webview-ui/src/components/settings/ExperimentalSettings.tsx b/webview-ui/src/components/settings/ExperimentalSettings.tsx index 51ce36b408..7b962ccfed 100644 --- a/webview-ui/src/components/settings/ExperimentalSettings.tsx +++ b/webview-ui/src/components/settings/ExperimentalSettings.tsx @@ -2,7 +2,7 @@ import { HTMLAttributes } from "react" import { useAppTranslation } from "@/i18n/TranslationContext" import { FlaskConical } from "lucide-react" -import { EXPERIMENT_IDS, experimentConfigsMap, ExperimentId } from "../../../../src/shared/experiments" +import { EXPERIMENT_IDS, experimentConfigsMap, ExperimentId } from "@roo/shared/experiments" import { cn } from "@/lib/utils" diff --git a/webview-ui/src/components/settings/LanguageSettings.tsx b/webview-ui/src/components/settings/LanguageSettings.tsx index 2fe6bcc347..b7dd141fbf 100644 --- a/webview-ui/src/components/settings/LanguageSettings.tsx +++ b/webview-ui/src/components/settings/LanguageSettings.tsx @@ -4,7 +4,7 @@ import { Globe } from "lucide-react" import { cn } from "@/lib/utils" import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "@/components/ui" -import { Language, LANGUAGES } from "../../../../src/shared/language" +import { Language, LANGUAGES } from "@roo/shared/language" import { SetCachedStateField } from "./types" import { SectionHeader } from "./SectionHeader" diff --git a/webview-ui/src/components/settings/ModelInfoView.tsx b/webview-ui/src/components/settings/ModelInfoView.tsx index b692903a9b..4f8e6b1d6f 100644 --- a/webview-ui/src/components/settings/ModelInfoView.tsx +++ b/webview-ui/src/components/settings/ModelInfoView.tsx @@ -5,7 +5,7 @@ import { useAppTranslation } from "@/i18n/TranslationContext" import { formatPrice } from "@/utils/formatPrice" import { cn } from "@/lib/utils" -import { ModelInfo, geminiModels } from "../../../../src/shared/api" +import { ModelInfo, geminiModels } from "@roo/shared/api" import { ModelDescriptionMarkdown } from "./ModelDescriptionMarkdown" diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx index c8d8ed7a44..5aa3f1b314 100644 --- a/webview-ui/src/components/settings/ModelPicker.tsx +++ b/webview-ui/src/components/settings/ModelPicker.tsx @@ -3,7 +3,7 @@ import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" import { Trans } from "react-i18next" import { ChevronsUpDown, Check, X } from "lucide-react" -import { ProviderSettings, ModelInfo } from "../../../../src/schemas" +import { ProviderSettings, ModelInfo } from "@roo/schemas" import { useAppTranslation } from "@/i18n/TranslationContext" import { cn } from "@/lib/utils" diff --git a/webview-ui/src/components/settings/ReasoningEffort.tsx b/webview-ui/src/components/settings/ReasoningEffort.tsx index 7c8ee3a385..8e3c399ae9 100644 --- a/webview-ui/src/components/settings/ReasoningEffort.tsx +++ b/webview-ui/src/components/settings/ReasoningEffort.tsx @@ -2,8 +2,8 @@ import { useAppTranslation } from "@/i18n/TranslationContext" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui" -import { ApiConfiguration } from "../../../../src/shared/api" -import { reasoningEfforts, ReasoningEffort as ReasoningEffortType } from "../../../../src/schemas" +import { ApiConfiguration } from "@roo/shared/api" +import { reasoningEfforts, ReasoningEffort as ReasoningEffortType } from "@roo/schemas" interface ReasoningEffortProps { apiConfiguration: ApiConfiguration diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 485d63ec9d..c2aff35391 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -16,9 +16,9 @@ import { } from "lucide-react" import { CaretSortIcon } from "@radix-ui/react-icons" -import { ExperimentId } from "../../../../src/shared/experiments" -import { TelemetrySetting } from "../../../../src/shared/TelemetrySetting" -import { ApiConfiguration } from "../../../../src/shared/api" +import { ExperimentId } from "@roo/shared/experiments" +import { TelemetrySetting } from "@roo/shared/TelemetrySetting" +import { ApiConfiguration } from "@roo/shared/api" import { vscode } from "@/utils/vscode" import { ExtensionStateContextType, useExtensionState } from "@/context/ExtensionStateContext" diff --git a/webview-ui/src/components/settings/ThinkingBudget.tsx b/webview-ui/src/components/settings/ThinkingBudget.tsx index 5123d571b3..8b80efafed 100644 --- a/webview-ui/src/components/settings/ThinkingBudget.tsx +++ b/webview-ui/src/components/settings/ThinkingBudget.tsx @@ -3,7 +3,7 @@ import { useAppTranslation } from "@/i18n/TranslationContext" import { Slider } from "@/components/ui" -import { ApiConfiguration, ModelInfo } from "../../../../src/shared/api" +import { ApiConfiguration, ModelInfo } from "@roo/shared/api" const DEFAULT_MAX_OUTPUT_TOKENS = 16_384 const DEFAULT_MAX_THINKING_TOKENS = 8_192 diff --git a/webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx b/webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx index f7219abea4..955ce61936 100644 --- a/webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx +++ b/webview-ui/src/components/settings/__tests__/ContextManagementSettings.test.tsx @@ -2,7 +2,7 @@ import { render, screen, fireEvent } from "@testing-library/react" -import { ContextManagementSettings } from "../ContextManagementSettings" +import { ContextManagementSettings } from "@src/components/settings/ContextManagementSettings" class MockResizeObserver { observe() {} diff --git a/webview-ui/src/components/settings/__tests__/ModelPicker.test.tsx b/webview-ui/src/components/settings/__tests__/ModelPicker.test.tsx index 010f26a930..7c415e1ec4 100644 --- a/webview-ui/src/components/settings/__tests__/ModelPicker.test.tsx +++ b/webview-ui/src/components/settings/__tests__/ModelPicker.test.tsx @@ -5,7 +5,7 @@ import { act } from "react" import { ModelPicker } from "../ModelPicker" -jest.mock("../../../context/ExtensionStateContext", () => ({ +jest.mock("@src/context/ExtensionStateContext", () => ({ useExtensionState: jest.fn(), })) diff --git a/webview-ui/src/components/settings/__tests__/SettingsView.test.tsx b/webview-ui/src/components/settings/__tests__/SettingsView.test.tsx index 94b9057c1e..9b2fc37d25 100644 --- a/webview-ui/src/components/settings/__tests__/SettingsView.test.tsx +++ b/webview-ui/src/components/settings/__tests__/SettingsView.test.tsx @@ -9,7 +9,7 @@ import { ExtensionStateContextProvider } from "@/context/ExtensionStateContext" import SettingsView from "../SettingsView" // Mock vscode API -jest.mock("../../../utils/vscode", () => ({ +jest.mock("@src/utils/vscode", () => ({ vscode: { postMessage: jest.fn(), }, diff --git a/webview-ui/src/components/settings/__tests__/ThinkingBudget.test.tsx b/webview-ui/src/components/settings/__tests__/ThinkingBudget.test.tsx index 79b1013602..9c03b4a0a0 100644 --- a/webview-ui/src/components/settings/__tests__/ThinkingBudget.test.tsx +++ b/webview-ui/src/components/settings/__tests__/ThinkingBudget.test.tsx @@ -1,6 +1,6 @@ import { render, screen, fireEvent } from "@testing-library/react" import { ThinkingBudget } from "../ThinkingBudget" -import { ModelInfo } from "../../../../../src/shared/api" +import { ModelInfo } from "@roo/shared/api" jest.mock("@/components/ui", () => ({ Slider: ({ value, onValueChange, min, max }: any) => ( diff --git a/webview-ui/src/components/settings/constants.ts b/webview-ui/src/components/settings/constants.ts index a7e1774fc5..fac2b63844 100644 --- a/webview-ui/src/components/settings/constants.ts +++ b/webview-ui/src/components/settings/constants.ts @@ -10,7 +10,7 @@ import { vertexModels, xaiModels, REASONING_MODELS, -} from "../../../../src/shared/api" +} from "@roo/shared/api" export { REASONING_MODELS } diff --git a/webview-ui/src/components/settings/types.ts b/webview-ui/src/components/settings/types.ts index 234b382be5..9eb22b7694 100644 --- a/webview-ui/src/components/settings/types.ts +++ b/webview-ui/src/components/settings/types.ts @@ -1,4 +1,4 @@ -import { ExperimentId } from "../../../../src/shared/experiments" +import { ExperimentId } from "@roo/shared/experiments" import { ExtensionStateContextType } from "@/context/ExtensionStateContext" diff --git a/webview-ui/src/components/ui/hooks/useOpenRouterModelProviders.ts b/webview-ui/src/components/ui/hooks/useOpenRouterModelProviders.ts index 0a069a1102..8a881acd59 100644 --- a/webview-ui/src/components/ui/hooks/useOpenRouterModelProviders.ts +++ b/webview-ui/src/components/ui/hooks/useOpenRouterModelProviders.ts @@ -2,8 +2,8 @@ import axios from "axios" import { z } from "zod" import { useQuery, UseQueryOptions } from "@tanstack/react-query" -import { ModelInfo } from "../../../../../src/shared/api" -import { parseApiPrice } from "../../../../../src/utils/cost" +import { ModelInfo } from "@roo/shared/api" +import { parseApiPrice } from "@roo/utils/cost" export const OPENROUTER_DEFAULT_PROVIDER_NAME = "[default]" diff --git a/webview-ui/src/components/welcome/RooHero.tsx b/webview-ui/src/components/welcome/RooHero.tsx index 1381fb5d8f..f4be0b6c07 100644 --- a/webview-ui/src/components/welcome/RooHero.tsx +++ b/webview-ui/src/components/welcome/RooHero.tsx @@ -1,5 +1,5 @@ import { useState } from "react" -import { useAppTranslation } from "../../i18n/TranslationContext" +import { useAppTranslation } from "@src/i18n/TranslationContext" const WelcomeView = () => { const { t } = useAppTranslation() diff --git a/webview-ui/src/components/welcome/WelcomeView.tsx b/webview-ui/src/components/welcome/WelcomeView.tsx index 83f1670466..07871496a4 100644 --- a/webview-ui/src/components/welcome/WelcomeView.tsx +++ b/webview-ui/src/components/welcome/WelcomeView.tsx @@ -1,13 +1,13 @@ import { useCallback, useState } from "react" import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" -import { useExtensionState } from "../../context/ExtensionStateContext" -import { validateApiConfiguration } from "../../utils/validate" -import { vscode } from "../../utils/vscode" +import { useExtensionState } from "@src/context/ExtensionStateContext" +import { validateApiConfiguration } from "@src/utils/validate" +import { vscode } from "@src/utils/vscode" import ApiOptions from "../settings/ApiOptions" import { Tab, TabContent } from "../common/Tab" import { Trans } from "react-i18next" -import { useAppTranslation } from "../../i18n/TranslationContext" -import { getRequestyAuthUrl, getOpenRouterAuthUrl } from "../../oauth/urls" +import { useAppTranslation } from "@src/i18n/TranslationContext" +import { getRequestyAuthUrl, getOpenRouterAuthUrl } from "@src/oauth/urls" import RooHero from "./RooHero" import knuthShuffle from "knuth-shuffle-seeded" diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index cfc241f1a3..26f43db81a 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -1,16 +1,16 @@ import React, { createContext, useCallback, useContext, useEffect, useState } from "react" import { useEvent } from "react-use" -import { ApiConfigMeta, ExtensionMessage, ExtensionState } from "../../../src/shared/ExtensionMessage" -import { ApiConfiguration } from "../../../src/shared/api" -import { vscode } from "../utils/vscode" -import { convertTextMateToHljs } from "../utils/textMateToHljs" -import { findLastIndex } from "../../../src/shared/array" -import { McpServer } from "../../../src/shared/mcp" -import { checkExistKey } from "../../../src/shared/checkExistApiConfig" -import { Mode, CustomModePrompts, defaultModeSlug, defaultPrompts, ModeConfig } from "../../../src/shared/modes" -import { CustomSupportPrompts } from "../../../src/shared/support-prompt" -import { experimentDefault, ExperimentId } from "../../../src/shared/experiments" -import { TelemetrySetting } from "../../../src/shared/TelemetrySetting" +import { ApiConfigMeta, ExtensionMessage, ExtensionState } from "@roo/shared/ExtensionMessage" +import { ApiConfiguration } from "@roo/shared/api" +import { vscode } from "@src/utils/vscode" +import { convertTextMateToHljs } from "@src/utils/textMateToHljs" +import { findLastIndex } from "@roo/shared/array" +import { McpServer } from "@roo/shared/mcp" +import { checkExistKey } from "@roo/shared/checkExistApiConfig" +import { Mode, CustomModePrompts, defaultModeSlug, defaultPrompts, ModeConfig } from "@roo/shared/modes" +import { CustomSupportPrompts } from "@roo/shared/support-prompt" +import { experimentDefault, ExperimentId } from "@roo/shared/experiments" +import { TelemetrySetting } from "@roo/shared/TelemetrySetting" export interface ExtensionStateContextType extends ExtensionState { didHydrateState: boolean diff --git a/webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx b/webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx index 39a5ad34db..d2fb886a6c 100644 --- a/webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx +++ b/webview-ui/src/context/__tests__/ExtensionStateContext.test.tsx @@ -2,10 +2,10 @@ import { render, screen, act } from "@testing-library/react" -import { ExtensionState } from "../../../../src/shared/ExtensionMessage" +import { ExtensionState } from "@roo/shared/ExtensionMessage" import { ExtensionStateContextProvider, useExtensionState, mergeExtensionState } from "../ExtensionStateContext" -import { ExperimentId } from "../../../../src/shared/experiments" -import { ApiConfiguration } from "../../../../src/shared/api" +import { ExperimentId } from "@roo/shared/experiments" +import { ApiConfiguration } from "@roo/shared/api" // Test component that consumes the context const TestComponent = () => { diff --git a/webview-ui/src/stories/AutosizeTextarea.stories.tsx b/webview-ui/src/stories/AutosizeTextarea.stories.tsx index 16a26fcea0..5cf0d81efa 100644 --- a/webview-ui/src/stories/AutosizeTextarea.stories.tsx +++ b/webview-ui/src/stories/AutosizeTextarea.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from "@storybook/react" -import { AutosizeTextarea } from "../components/ui/autosize-textarea" +import { AutosizeTextarea } from "@src/components/ui/autosize-textarea" const meta: Meta = { title: "Primitives/AutosizeTextarea", diff --git a/webview-ui/src/stories/Collapsible.stories.tsx b/webview-ui/src/stories/Collapsible.stories.tsx index df39a808ab..aad5ff5665 100644 --- a/webview-ui/src/stories/Collapsible.stories.tsx +++ b/webview-ui/src/stories/Collapsible.stories.tsx @@ -1,8 +1,8 @@ import type { Meta, StoryObj } from "@storybook/react" import { useState } from "react" -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../components/ui/collapsible" -import { Button } from "../components/ui/button" +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@src/components/ui/collapsible" +import { Button } from "@src/components/ui/button" import { ChevronsUpDown } from "lucide-react" const meta: Meta = { diff --git a/webview-ui/src/utils/TelemetryClient.ts b/webview-ui/src/utils/TelemetryClient.ts index fe8b1ec0cb..450f4da73d 100644 --- a/webview-ui/src/utils/TelemetryClient.ts +++ b/webview-ui/src/utils/TelemetryClient.ts @@ -1,5 +1,5 @@ import posthog from "posthog-js" -import { TelemetrySetting } from "../../../src/shared/TelemetrySetting" +import { TelemetrySetting } from "@roo/shared/TelemetrySetting" class TelemetryClient { private static instance: TelemetryClient diff --git a/webview-ui/src/utils/__tests__/context-mentions.test.ts b/webview-ui/src/utils/__tests__/context-mentions.test.ts index 1e69964a94..d28f2de640 100644 --- a/webview-ui/src/utils/__tests__/context-mentions.test.ts +++ b/webview-ui/src/utils/__tests__/context-mentions.test.ts @@ -5,7 +5,7 @@ import { shouldShowContextMenu, ContextMenuOptionType, ContextMenuQueryItem, -} from "../context-mentions" +} from "@src/utils/context-mentions" describe("insertMention", () => { it("should insert mention at cursor position when no @ symbol exists", () => { diff --git a/webview-ui/src/utils/context-mentions.ts b/webview-ui/src/utils/context-mentions.ts index 12478864f6..9302598bc0 100644 --- a/webview-ui/src/utils/context-mentions.ts +++ b/webview-ui/src/utils/context-mentions.ts @@ -1,6 +1,6 @@ -import { mentionRegex } from "../../../src/shared/context-mentions" +import { mentionRegex } from "@roo/shared/context-mentions" import { Fzf } from "fzf" -import { ModeConfig } from "../../../src/shared/modes" +import { ModeConfig } from "@roo/shared/modes" import * as path from "path" export interface SearchResult { diff --git a/webview-ui/src/utils/mcp.ts b/webview-ui/src/utils/mcp.ts index 5df5df3a61..c3bce68f0a 100644 --- a/webview-ui/src/utils/mcp.ts +++ b/webview-ui/src/utils/mcp.ts @@ -1,4 +1,4 @@ -import { McpResource, McpResourceTemplate } from "../../../src/shared/mcp" +import { McpResource, McpResourceTemplate } from "@roo/shared/mcp" /** * Matches a URI against an array of URI templates and returns the matching template diff --git a/webview-ui/src/utils/validate.ts b/webview-ui/src/utils/validate.ts index c96f64fd7f..82fda92626 100644 --- a/webview-ui/src/utils/validate.ts +++ b/webview-ui/src/utils/validate.ts @@ -1,4 +1,4 @@ -import { ApiConfiguration, ModelInfo } from "../../../src/shared/api" +import { ApiConfiguration, ModelInfo } from "@roo/shared/api" import i18next from "i18next" export function validateApiConfiguration(apiConfiguration?: ApiConfiguration): string | undefined { diff --git a/webview-ui/src/utils/vscode.ts b/webview-ui/src/utils/vscode.ts index f3883fd462..238eed22fd 100644 --- a/webview-ui/src/utils/vscode.ts +++ b/webview-ui/src/utils/vscode.ts @@ -1,4 +1,4 @@ -import { WebviewMessage } from "../../../src/shared/WebviewMessage" +import { WebviewMessage } from "@roo/shared/WebviewMessage" import type { WebviewApi } from "vscode-webview" /** diff --git a/webview-ui/tsconfig.json b/webview-ui/tsconfig.json index c725fcff3e..a90b0848db 100644 --- a/webview-ui/tsconfig.json +++ b/webview-ui/tsconfig.json @@ -17,7 +17,9 @@ "jsx": "react-jsx", "baseUrl": ".", "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "@src/*": ["./src/*"], + "@roo/*": ["../src/*"] } }, "include": ["src", "../src/shared"] diff --git a/webview-ui/vite.config.ts b/webview-ui/vite.config.ts index 243bb658ec..936c094e26 100644 --- a/webview-ui/vite.config.ts +++ b/webview-ui/vite.config.ts @@ -1,4 +1,4 @@ -import path from "path" +import { resolve } from "path" import fs from "fs" import { defineConfig } from "vite" @@ -17,7 +17,7 @@ const writePortToFile = () => { if (port) { // Write to a file in the project root - const portFilePath = path.resolve(__dirname, "../.vite-port") + const portFilePath = resolve(__dirname, "../.vite-port") fs.writeFileSync(portFilePath, port.toString()) console.log(`[Vite Plugin] Server started on port ${port}`) console.log(`[Vite Plugin] Port information written to ${portFilePath}`) @@ -34,7 +34,9 @@ export default defineConfig({ plugins: [react(), tailwindcss(), writePortToFile()], resolve: { alias: { - "@": path.resolve(__dirname, "./src"), + "@": resolve(__dirname, "./src"), + "@src": resolve(__dirname, "./src"), + "@roo": resolve(__dirname, "../src"), }, }, build: { From 47230d5a5c5acca6f13e16078db80cc28c7fc1bb Mon Sep 17 00:00:00 2001 From: Dicha Zelianivan Arkana <51877647+elianiva@users.noreply.github.com> Date: Mon, 21 Apr 2025 08:46:01 +0700 Subject: [PATCH 14/89] fix(action): handle edge case for add to context action (#2780) --- src/shared/__tests__/support-prompts.test.ts | 117 +++++++++++++++++++ src/shared/support-prompt.ts | 26 +++-- 2 files changed, 132 insertions(+), 11 deletions(-) diff --git a/src/shared/__tests__/support-prompts.test.ts b/src/shared/__tests__/support-prompts.test.ts index 3d286d0230..ea6a193d5a 100644 --- a/src/shared/__tests__/support-prompts.test.ts +++ b/src/shared/__tests__/support-prompts.test.ts @@ -86,6 +86,123 @@ describe("Code Action Prompts", () => { }) }) + describe("ADD_TO_CONTEXT action", () => { + it("should format ADD_TO_CONTEXT prompt correctly with all parameters", () => { + const prompt = supportPrompt.create("ADD_TO_CONTEXT", { + name: "Roo", + place: "Workspace", + filePath: testFilePath, + selectedText: testCode, + startLine: "1", + endLine: "1", + diagnostics: [], + }) + const expected = `${testFilePath}:1-1\n\`\`\`\n${testCode}\n\`\`\`` + expect(prompt).toBe(expected) + }) + + it("should format ADD_TO_CONTEXT prompt with diagnostics", () => { + const diagnostics = [{ message: "Error 1" }, { source: "Linter", message: "Warning 2" }] + const prompt = supportPrompt.create("ADD_TO_CONTEXT", { + filePath: testFilePath, + selectedText: testCode, + startLine: "10", + endLine: "20", + diagnostics, + }) + const expected = `${testFilePath}:10-20\n\`\`\`\n${testCode}\n\`\`\`` + expect(prompt).toBe(expected) + }) + + it("should not replace placeholders within parameter values", () => { + const prompt = supportPrompt.create("ADD_TO_CONTEXT", { + value1: "This is ${value2}", + value2: "Actual Value 2", + filePath: testFilePath, + selectedText: testCode, + startLine: "5", + endLine: "15", + }) + const expected = `${testFilePath}:5-15\n\`\`\`\n${testCode}\n\`\`\`` + expect(prompt).toBe(expected) + }) + + it("should replace remaining placeholders (not in params) with empty strings", () => { + const prompt = supportPrompt.create("ADD_TO_CONTEXT", { + name: "Roo", + filePath: testFilePath, + selectedText: testCode, + startLine: "1", + endLine: "1", + }) // 'status' is missing + const expected = `${testFilePath}:1-1\n\`\`\`\n${testCode}\n\`\`\`` + expect(prompt).toBe(expected) + }) + + it("should handle placeholders in values that are not in the template", () => { + const prompt = supportPrompt.create("ADD_TO_CONTEXT", { + data: "Some data with ${extraInfo}", + filePath: testFilePath, + selectedText: testCode, + startLine: "1", + endLine: "1", + }) + const expected = `${testFilePath}:1-1\n\`\`\`\n${testCode}\n\`\`\`` + expect(prompt).toBe(expected) + }) + + it("should handle minimal params object", () => { + const prompt = supportPrompt.create("ADD_TO_CONTEXT", { + filePath: testFilePath, + selectedText: testCode, + startLine: "1", + endLine: "1", + }) + const expected = `${testFilePath}:1-1\n\`\`\`\n${testCode}\n\`\`\`` + expect(prompt).toBe(expected) + }) + + it("should handle params with non-string values", () => { + const prompt = supportPrompt.create("ADD_TO_CONTEXT", { + count: "5", + isActive: "true", + filePath: testFilePath, + selectedText: testCode, + startLine: "1", + endLine: "1", + }) // Convert to strings + const expected = `${testFilePath}:1-1\n\`\`\`\n${testCode}\n\`\`\`` + expect(prompt).toBe(expected) + }) + + it("should handle keys with special regex characters", () => { + const prompt = supportPrompt.create("ADD_TO_CONTEXT", { + "key.with.dots": "Dotty", + value: "Simple", + filePath: testFilePath, + selectedText: testCode, + startLine: "1", + endLine: "1", + }) + const expected = `${testFilePath}:1-1\n\`\`\`\n${testCode}\n\`\`\`` + expect(prompt).toBe(expected) + }) + + it("should handle bash script selection", () => { + const bashText = + 'if [ "${#usecase_deployments[@]}" -gt 0 ] && [ ${{ parameters.single_deployment_per_environment }} = true ]; then' + const prompt = supportPrompt.create("ADD_TO_CONTEXT", { + selectedText: bashText, + filePath: testFilePath, + startLine: "1", + endLine: "1", + diagnostics: [], + }) + const expected = `${testFilePath}:1-1\n\`\`\`\n${bashText}\n\`\`\`` + expect(prompt).toBe(expected) + }) + }) + describe("get template", () => { it("should return default template when no custom prompts provided", () => { const template = supportPrompt.get(undefined, "EXPLAIN") diff --git a/src/shared/support-prompt.ts b/src/shared/support-prompt.ts index ee8c4fa3e8..2dfa478e15 100644 --- a/src/shared/support-prompt.ts +++ b/src/shared/support-prompt.ts @@ -9,19 +9,23 @@ const generateDiagnosticText = (diagnostics?: any[]) => { } export const createPrompt = (template: string, params: PromptParams): string => { - let result = template - for (const [key, value] of Object.entries(params)) { - if (key === "diagnostics") { - result = result.replaceAll("${diagnosticText}", generateDiagnosticText(value as any[])) + return template.replace(/\${(.*?)}/g, (_, key) => { + if (key === "diagnosticText") { + return generateDiagnosticText(params["diagnostics"] as any[]) + } else if (params.hasOwnProperty(key)) { + // Ensure the value is treated as a string for replacement + const value = params[key] + if (typeof value === "string") { + return value + } else { + // Convert non-string values to string for replacement + return String(value) + } } else { - result = result.replaceAll(`\${${key}}`, value as string) + // If the placeholder key is not in params, replace with empty string + return "" } - } - - // Replace any remaining placeholders with empty strings - result = result.replaceAll(/\${[^}]*}/g, "") - - return result + }) } interface SupportPromptConfig { From d2e5019f885bedad900146daad757ee3c268bdcb Mon Sep 17 00:00:00 2001 From: Dicha Zelianivan Arkana <51877647+elianiva@users.noreply.github.com> Date: Mon, 21 Apr 2025 09:04:23 +0700 Subject: [PATCH 15/89] fix(icons): use geometricPrecision to avoid blurriness (#2756) --- webview-ui/src/index.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/webview-ui/src/index.css b/webview-ui/src/index.css index 6e1a2bb5e5..21421c66ac 100644 --- a/webview-ui/src/index.css +++ b/webview-ui/src/index.css @@ -392,3 +392,11 @@ input[cmdk-input]:focus { .custom-markdown > pre { background-color: transparent !important; } + +/* + * Use geometric precision for codicons to avoid blurriness + */ + +.codicon[class*="codicon-"] { + text-rendering: geometricPrecision !important; +} From 19df13c760d8ee8bd5b9b6020127420b9f300b46 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sun, 20 Apr 2025 23:28:19 -0400 Subject: [PATCH 16/89] Add a warning display when a system prompt override is active (#2804) --- src/core/webview/ClineProvider.ts | 14 ++++++++++++++ src/shared/WebviewMessage.ts | 1 + webview-ui/src/components/chat/ChatView.tsx | 9 +++++++++ .../src/components/chat/SystemPromptWarning.tsx | 17 +++++++++++++++++ .../src/context/ExtensionStateContext.tsx | 1 + webview-ui/src/i18n/locales/ca/chat.json | 3 ++- webview-ui/src/i18n/locales/de/chat.json | 3 ++- webview-ui/src/i18n/locales/en/chat.json | 3 ++- webview-ui/src/i18n/locales/es/chat.json | 3 ++- webview-ui/src/i18n/locales/fr/chat.json | 3 ++- webview-ui/src/i18n/locales/hi/chat.json | 3 ++- webview-ui/src/i18n/locales/it/chat.json | 3 ++- webview-ui/src/i18n/locales/ja/chat.json | 3 ++- webview-ui/src/i18n/locales/ko/chat.json | 3 ++- webview-ui/src/i18n/locales/pl/chat.json | 3 ++- webview-ui/src/i18n/locales/pt-BR/chat.json | 3 ++- webview-ui/src/i18n/locales/tr/chat.json | 3 ++- webview-ui/src/i18n/locales/vi/chat.json | 3 ++- webview-ui/src/i18n/locales/zh-CN/chat.json | 3 ++- webview-ui/src/i18n/locales/zh-TW/chat.json | 3 ++- webview-ui/src/index.css | 3 +++ 21 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 webview-ui/src/components/chat/SystemPromptWarning.tsx diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index f4c26c3dfc..432ac6420b 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -49,6 +49,7 @@ import { ACTION_NAMES } from "../CodeActionProvider" import { Cline, ClineOptions } from "../Cline" import { getNonce } from "./getNonce" import { getUri } from "./getUri" +import { getSystemPromptFilePath } from "../prompts/sections/custom-system-prompt" import { telemetryService } from "../../services/telemetry/TelemetryService" import { getWorkspacePath } from "../../utils/path" import { webviewMessageHandler } from "./webviewMessageHandler" @@ -1161,6 +1162,14 @@ export class ClineProvider extends EventEmitter implements this.postMessageToWebview({ type: "state", state }) } + /** + * Checks if there is a file-based system prompt override for the given mode + */ + async hasFileBasedSystemPromptOverride(mode: Mode): Promise { + const promptFilePath = getSystemPromptFilePath(this.cwd, mode) + return await fileExistsAtPath(promptFilePath) + } + async getStateToPostToWebview() { const { apiConfiguration, @@ -1224,6 +1233,10 @@ export class ClineProvider extends EventEmitter implements const allowedCommands = vscode.workspace.getConfiguration("roo-cline").get("allowedCommands") || [] const cwd = this.cwd + // Check if there's a system prompt override for the current mode + const currentMode = mode ?? defaultModeSlug + const hasSystemPromptOverride = await this.hasFileBasedSystemPromptOverride(currentMode) + return { version: this.context.extension?.packageJSON?.version ?? "", apiConfiguration, @@ -1296,6 +1309,7 @@ export class ClineProvider extends EventEmitter implements renderContext: this.renderContext, maxReadFileLine: maxReadFileLine ?? 500, settingsImportedAt: this.settingsImportedAt, + hasSystemPromptOverride, } } diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index f1ab993679..83725bc5c3 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -150,6 +150,7 @@ export interface WebviewMessage { source?: "global" | "project" requestId?: string ids?: string[] + hasSystemPromptOverride?: boolean } export const checkoutDiffPayloadSchema = z.object({ diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 23072e7b9c..7b84b81ab9 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -27,6 +27,7 @@ import ChatRow from "./ChatRow" import ChatTextArea from "./ChatTextArea" import TaskHeader from "./TaskHeader" import AutoApproveMenu from "./AutoApproveMenu" +import SystemPromptWarning from "./SystemPromptWarning" import { AudioType } from "@roo/shared/WebviewMessage" import { validateCommand } from "@src/utils/command-validation" import { getAllModes } from "@roo/shared/modes" @@ -77,6 +78,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction 0 ? (messages[0].say === "task" ? messages[0] : undefined) : undefined) : undefined @@ -1205,6 +1207,13 @@ const ChatViewComponent: React.ForwardRefRenderFunction + {/* System prompt override warning */} + {hasSystemPromptOverride && ( +
+ +
+ )} + {/* Checkpoint warning message */} {showCheckpointWarning && (
diff --git a/webview-ui/src/components/chat/SystemPromptWarning.tsx b/webview-ui/src/components/chat/SystemPromptWarning.tsx new file mode 100644 index 0000000000..0ed7a72733 --- /dev/null +++ b/webview-ui/src/components/chat/SystemPromptWarning.tsx @@ -0,0 +1,17 @@ +import React from "react" +import { useAppTranslation } from "@/i18n/TranslationContext" + +export const SystemPromptWarning: React.FC = () => { + const { t } = useAppTranslation() + + return ( +
+
+ +
+ {t("chat:systemPromptWarning")} +
+ ) +} + +export default SystemPromptWarning diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 26f43db81a..90629edfb1 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -17,6 +17,7 @@ export interface ExtensionStateContextType extends ExtensionState { showWelcome: boolean theme: any mcpServers: McpServer[] + hasSystemPromptOverride?: boolean currentCheckpoint?: string filePaths: string[] openedTabs: Array<{ label: string; isActive: boolean; path?: string }> diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 702a86fc1f..fcad714a7e 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Desplaçar amunt", "close": "Tancar navegador" } - } + }, + "systemPromptWarning": "ADVERTÈNCIA: S'ha activat una substitució personalitzada d'instruccions del sistema. Això pot trencar greument la funcionalitat i causar un comportament impredictible." } diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index e416423f98..ef92900bac 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Nach oben scrollen", "close": "Browser schließen" } - } + }, + "systemPromptWarning": "WARNUNG: Benutzerdefinierte Systemaufforderung aktiv. Dies kann die Funktionalität erheblich beeinträchtigen und zu unvorhersehbarem Verhalten führen." } diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 6f4a0a1e54..1c077b1761 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Scroll up", "close": "Close browser" } - } + }, + "systemPromptWarning": "WARNING: Custom system prompt override active. This can severely break functionality and cause unpredictable behavior." } diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 9743ed85f5..ac46118723 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Desplazar hacia arriba", "close": "Cerrar navegador" } - } + }, + "systemPromptWarning": "ADVERTENCIA: Anulación de instrucciones del sistema personalizada activa. Esto puede romper gravemente la funcionalidad y causar un comportamiento impredecible." } diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 0025d82889..f5b6a6135e 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Défiler vers le haut", "close": "Fermer le navigateur" } - } + }, + "systemPromptWarning": "AVERTISSEMENT : Remplacement d'instructions système personnalisées actif. Cela peut gravement perturber la fonctionnalité et provoquer un comportement imprévisible." } diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index f4391e624f..91491cf3e6 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -211,5 +211,6 @@ "scrollUp": "ऊपर स्क्रॉल करें", "close": "ब्राउज़र बंद करें" } - } + }, + "systemPromptWarning": "चेतावनी: कस्टम सिस्टम प्रॉम्प्ट ओवरराइड सक्रिय है। यह कार्यक्षमता को गंभीर रूप से बाधित कर सकता है और अनियमित व्यवहार का कारण बन सकता है।" } diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 62921786d1..d54dd9a95c 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Scorri verso l'alto", "close": "Chiudi browser" } - } + }, + "systemPromptWarning": "ATTENZIONE: Sovrascrittura personalizzata delle istruzioni di sistema attiva. Questo può compromettere gravemente le funzionalità e causare comportamenti imprevedibili." } diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 4d0b2d6413..31094a763c 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -211,5 +211,6 @@ "scrollUp": "上にスクロール", "close": "ブラウザを閉じる" } - } + }, + "systemPromptWarning": "警告:カスタムシステムプロンプトの上書きが有効です。これにより機能が深刻に損なわれ、予測不可能な動作が発生する可能性があります。" } diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 40c3c580d7..938bdca76b 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -211,5 +211,6 @@ "scrollUp": "위로 스크롤", "close": "브라우저 닫기" } - } + }, + "systemPromptWarning": "경고: 사용자 정의 시스템 프롬프트 재정의가 활성화되었습니다. 이로 인해 기능이 심각하게 손상되고 예측할 수 없는 동작이 발생할 수 있습니다." } diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index db17efd24f..10884b102a 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Przewiń w górę", "close": "Zamknij przeglądarkę" } - } + }, + "systemPromptWarning": "OSTRZEŻENIE: Aktywne niestandardowe zastąpienie instrukcji systemowych. Może to poważnie zakłócić funkcjonalność i powodować nieprzewidywalne zachowanie." } diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 8d6c420236..fe6ef1bdef 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Rolar para cima", "close": "Fechar navegador" } - } + }, + "systemPromptWarning": "AVISO: Substituição personalizada de instrução do sistema ativa. Isso pode comprometer gravemente a funcionalidade e causar comportamento imprevisível." } diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 1f46537a31..34c5fd2911 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Yukarı kaydır", "close": "Tarayıcıyı kapat" } - } + }, + "systemPromptWarning": "UYARI: Özel sistem komut geçersiz kılma aktif. Bu işlevselliği ciddi şekilde bozabilir ve öngörülemeyen davranışlara neden olabilir." } diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 08e5ef4fe8..3fe66b54ba 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -211,5 +211,6 @@ "scrollUp": "Cuộn lên", "close": "Đóng trình duyệt" } - } + }, + "systemPromptWarning": "CẢNH BÁO: Đã kích hoạt ghi đè lệnh nhắc hệ thống tùy chỉnh. Điều này có thể phá vỡ nghiêm trọng chức năng và gây ra hành vi không thể dự đoán." } diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 569c80be9f..3772e10884 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -211,5 +211,6 @@ "scrollUp": "向上滚动", "close": "关闭浏览器" } - } + }, + "systemPromptWarning": "警告:自定义系统提示词覆盖已激活。这可能严重破坏功能并导致不可预测的行为。" } diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index e7d239e930..d9c745ebf3 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -211,5 +211,6 @@ "scrollUp": "向上捲動", "close": "關閉瀏覽器" } - } + }, + "systemPromptWarning": "警告:自訂系統提示詞覆蓋已啟用。這可能嚴重破壞功能並導致不可預測的行為。" } diff --git a/webview-ui/src/index.css b/webview-ui/src/index.css index 21421c66ac..efc7e8c11e 100644 --- a/webview-ui/src/index.css +++ b/webview-ui/src/index.css @@ -68,6 +68,9 @@ --color-vscode-editorGroup-border: var(--vscode-editorGroup-border); + --color-vscode-editorWarning-foreground: var(--vscode-editorWarning-foreground); + --color-vscode-editorWarning-background: var(--vscode-editorWarning-background); + --color-vscode-button-foreground: var(--vscode-button-foreground); --color-vscode-button-background: var(--vscode-button-background); --color-vscode-button-secondaryForeground: var(--vscode-button-secondaryForeground); From 29137fbfec190005e31b704f00b98e6640e7e2e3 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Mon, 21 Apr 2025 00:24:52 -0400 Subject: [PATCH 17/89] Revert changes on omitted line count in write_to_file (#2807) --- src/core/tools/writeToFileTool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/tools/writeToFileTool.ts b/src/core/tools/writeToFileTool.ts index 2fe39c3511..e8ce6a9455 100644 --- a/src/core/tools/writeToFileTool.ts +++ b/src/core/tools/writeToFileTool.ts @@ -115,7 +115,7 @@ export async function writeToFileTool( cline.consecutiveMistakeCount++ cline.recordToolError("write_to_file") pushToolResult(await cline.sayAndCreateMissingParamError("write_to_file", "line_count")) - await cline.diffViewProvider.reset() + await cline.diffViewProvider.revertChanges() return } From f1c3edeb75a31e69a4f23bde0fb3ccf2cdbb09b4 Mon Sep 17 00:00:00 2001 From: Felix NyxJae <52313587+NyxJae@users.noreply.github.com> Date: Mon, 21 Apr 2025 21:27:24 +0800 Subject: [PATCH 18/89] Fix: Improve drag-and-drop and SSH path handling (#2808) * Fix: Correct path handling for dragged files on Windows * Fix: Improve drag-and-drop and SSH path handling --- webview-ui/src/components/chat/ChatTextArea.tsx | 5 ++++- webview-ui/src/utils/path-mentions.ts | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 369ae5e721..9cfeddd5ea 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -614,7 +614,10 @@ const ChatTextArea = forwardRef( e.preventDefault() setIsDraggingOver(false) - const text = e.dataTransfer.getData("application/vnd.code.uri-list") + const textFieldList = e.dataTransfer.getData("text") + const textUriList = e.dataTransfer.getData("application/vnd.code.uri-list") + // When textFieldList is empty, it may attempt to use textUriList obtained from drag-and-drop tabs; if not empty, it will use textFieldList. + const text = textFieldList || textUriList if (text) { // Split text on newlines to handle multiple files const lines = text.split(/\r?\n/).filter((line) => line.trim() !== "") diff --git a/webview-ui/src/utils/path-mentions.ts b/webview-ui/src/utils/path-mentions.ts index 1afa76156a..3a499688d6 100644 --- a/webview-ui/src/utils/path-mentions.ts +++ b/webview-ui/src/utils/path-mentions.ts @@ -12,8 +12,20 @@ * @returns A mention-friendly path */ export function convertToMentionPath(path: string, cwd?: string): string { - // Strip file:// protocol if present - let pathWithoutProtocol = path.startsWith("file://") ? path.substring(7) : path + // Strip file:// or vscode-remote:// protocol if present + let pathWithoutProtocol = path + + if (path.startsWith("file://")) { + pathWithoutProtocol = path.substring(7) + } else if (path.startsWith("vscode-remote://")) { + const protocolStripped = path.substring("vscode-remote://".length) + const firstSlashIndex = protocolStripped.indexOf("/") + if (firstSlashIndex !== -1) { + pathWithoutProtocol = protocolStripped.substring(firstSlashIndex + 1) + } else { + pathWithoutProtocol = "" + } + } try { pathWithoutProtocol = decodeURIComponent(pathWithoutProtocol) From b955dbc1fcb2cd11a52f8d8968248441acd967a2 Mon Sep 17 00:00:00 2001 From: Daniel Trugman Date: Mon, 21 Apr 2025 16:56:02 +0100 Subject: [PATCH 19/89] Requesty models behind api key (#2813) * Don't fetch Requesty models on startup, only when opening settings * Provide api key when fetching models --- src/api/providers/requesty.ts | 10 ++++++++-- src/core/webview/webviewMessageHandler.ts | 16 +--------------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/api/providers/requesty.ts b/src/api/providers/requesty.ts index 822db1a6b0..680b6e7179 100644 --- a/src/api/providers/requesty.ts +++ b/src/api/providers/requesty.ts @@ -58,11 +58,17 @@ export class RequestyHandler extends OpenAiHandler { } } -export async function getRequestyModels() { +export async function getRequestyModels(apiKey?: string) { const models: Record = {} try { - const response = await axios.get("https://router.requesty.ai/v1/models") + const headers: Record = {} + if (apiKey) { + headers["Authorization"] = `Bearer ${apiKey}` + } + + const url = "https://router.requesty.ai/v1/models" + const response = await axios.get(url, { headers }) const rawModels = response.data.data for (const rawModel of rawModels) { diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index b542fdb166..639c3b477f 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -152,20 +152,6 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We } }) - getRequestyModels().then(async (requestyModels) => { - if (Object.keys(requestyModels).length > 0) { - await provider.writeModelsToCache(GlobalFileNames.requestyModels, requestyModels) - await provider.postMessageToWebview({ type: "requestyModels", requestyModels }) - - const { apiConfiguration } = await provider.getState() - - if (apiConfiguration.requestyModelId) { - await updateGlobalState("requestyModelInfo", requestyModels[apiConfiguration.requestyModelId]) - await provider.postStateToWebview() - } - } - }) - provider.providerSettingsManager .listConfig() .then(async (listApiConfig) => { @@ -413,7 +399,7 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We break case "refreshRequestyModels": - const requestyModels = await getRequestyModels() + const requestyModels = await getRequestyModels(message.values?.apiKey) if (Object.keys(requestyModels).length > 0) { await provider.writeModelsToCache(GlobalFileNames.requestyModels, requestyModels) From a244a9dc2156f79bb22eb7cd19e4a3edc2c74ff5 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Mon, 21 Apr 2025 13:54:02 -0400 Subject: [PATCH 20/89] Fix a bad search/replace when moving tools into their own files (#2815) --- src/core/tools/applyDiffTool.ts | 2 +- src/core/tools/insertContentTool.ts | 2 +- src/core/tools/searchAndReplaceTool.ts | 2 +- src/core/tools/writeToFileTool.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/tools/applyDiffTool.ts b/src/core/tools/applyDiffTool.ts index 2538844683..7830378ae3 100644 --- a/src/core/tools/applyDiffTool.ts +++ b/src/core/tools/applyDiffTool.ts @@ -193,7 +193,7 @@ export async function applyDiffTool( )}\n\n\n` + `Please note:\n` + `1. You do not need to re-write the file with these changes, as they have already been applied.\n` + - `2. Proceed with the task using cline updated file content as the new baseline.\n` + + `2. Proceed with the task using this updated file content as the new baseline.\n` + `3. If the user's edits have addressed part of the task or changed the requirements, adjust your approach accordingly.` + `${newProblemsMessage}`, ) diff --git a/src/core/tools/insertContentTool.ts b/src/core/tools/insertContentTool.ts index 7f81d292b2..d43e4a72ca 100644 --- a/src/core/tools/insertContentTool.ts +++ b/src/core/tools/insertContentTool.ts @@ -158,7 +158,7 @@ export async function insertContentTool( `\n${finalContent}\n\n\n` + `Please note:\n` + `1. You do not need to re-write the file with these changes, as they have already been applied.\n` + - `2. Proceed with the task using cline updated file content as the new baseline.\n` + + `2. Proceed with the task using this updated file content as the new baseline.\n` + `3. If the user's edits have addressed part of the task or changed the requirements, adjust your approach accordingly.` + `${newProblemsMessage}`, ) diff --git a/src/core/tools/searchAndReplaceTool.ts b/src/core/tools/searchAndReplaceTool.ts index ba7760133a..7ed1a71f8d 100644 --- a/src/core/tools/searchAndReplaceTool.ts +++ b/src/core/tools/searchAndReplaceTool.ts @@ -170,7 +170,7 @@ export async function searchAndReplaceTool( `\n${addLineNumbers(finalContent || "")}\n\n\n` + `Please note:\n` + `1. You do not need to re-write the file with these changes, as they have already been applied.\n` + - `2. Proceed with the task using cline updated file content as the new baseline.\n` + + `2. Proceed with the task using this updated file content as the new baseline.\n` + `3. If the user's edits have addressed part of the task or changed the requirements, adjust your approach accordingly.` + `${newProblemsMessage}`, ) diff --git a/src/core/tools/writeToFileTool.ts b/src/core/tools/writeToFileTool.ts index e8ce6a9455..d20691610f 100644 --- a/src/core/tools/writeToFileTool.ts +++ b/src/core/tools/writeToFileTool.ts @@ -212,7 +212,7 @@ export async function writeToFileTool( )}\n\n\n` + `Please note:\n` + `1. You do not need to re-write the file with these changes, as they have already been applied.\n` + - `2. Proceed with the task using cline updated file content as the new baseline.\n` + + `2. Proceed with the task using this updated file content as the new baseline.\n` + `3. If the user's edits have addressed part of the task or changed the requirements, adjust your approach accordingly.` + `${newProblemsMessage}`, ) From 61e23cccb6f2c8160a2ec42c79cf05466b125542 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Mon, 21 Apr 2025 11:04:35 -0700 Subject: [PATCH 21/89] Record tool use errors encountered during eval runs (#2816) --- evals/apps/cli/src/index.ts | 7 + .../db/drizzle/0004_absent_slapstick.sql | 10 + .../db/drizzle/meta/0004_snapshot.json | 367 ++++++++++++++++++ evals/packages/db/drizzle/meta/_journal.json | 7 + evals/packages/db/src/index.ts | 1 + evals/packages/db/src/queries/runs.ts | 11 +- evals/packages/db/src/queries/taskMetrics.ts | 27 +- evals/packages/db/src/queries/tasks.ts | 12 +- evals/packages/db/src/queries/toolErrors.ts | 22 ++ evals/packages/db/src/schema.ts | 37 +- evals/packages/types/src/ipc.ts | 5 + evals/packages/types/src/roo-code-defaults.ts | 3 +- evals/packages/types/src/roo-code.ts | 5 +- package-lock.json | 1 + src/core/Cline.ts | 9 +- src/core/tools/applyDiffTool.ts | 3 +- src/exports/api.ts | 12 +- src/exports/roo-code.d.ts | 25 ++ src/exports/types.ts | 24 ++ src/schemas/index.ts | 2 + 20 files changed, 544 insertions(+), 46 deletions(-) create mode 100644 evals/packages/db/drizzle/0004_absent_slapstick.sql create mode 100644 evals/packages/db/drizzle/meta/0004_snapshot.json create mode 100644 evals/packages/db/src/queries/toolErrors.ts diff --git a/evals/apps/cli/src/index.ts b/evals/apps/cli/src/index.ts index d552092fa5..6b287042b0 100644 --- a/evals/apps/cli/src/index.ts +++ b/evals/apps/cli/src/index.ts @@ -29,6 +29,7 @@ import { updateTask, createTaskMetrics, updateTaskMetrics, + createToolError, } from "@evals/db" import { IpcServer, IpcClient } from "@evals/ipc" @@ -255,6 +256,12 @@ const runExercise = async ({ run, task, server }: { run: Run; task: Task; server rooTaskId = payload[0] } + if (eventName === RooCodeEventName.TaskToolFailed) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [_taskId, toolName, error] = payload + await createToolError({ taskId: task.id, toolName, error }) + } + if ( (eventName === RooCodeEventName.TaskTokenUsageUpdated || eventName === RooCodeEventName.TaskCompleted) && taskMetricsId diff --git a/evals/packages/db/drizzle/0004_absent_slapstick.sql b/evals/packages/db/drizzle/0004_absent_slapstick.sql new file mode 100644 index 0000000000..49700388d7 --- /dev/null +++ b/evals/packages/db/drizzle/0004_absent_slapstick.sql @@ -0,0 +1,10 @@ +CREATE TABLE `toolErrors` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `runId` integer, + `taskId` integer, + `toolName` text NOT NULL, + `error` text NOT NULL, + `createdAt` integer NOT NULL, + FOREIGN KEY (`runId`) REFERENCES `runs`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`taskId`) REFERENCES `tasks`(`id`) ON UPDATE no action ON DELETE no action +); diff --git a/evals/packages/db/drizzle/meta/0004_snapshot.json b/evals/packages/db/drizzle/meta/0004_snapshot.json new file mode 100644 index 0000000000..6987eba2e4 --- /dev/null +++ b/evals/packages/db/drizzle/meta/0004_snapshot.json @@ -0,0 +1,367 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "ae766c54-aff4-4ce6-b492-24813790c279", + "prevId": "61d48d20-f662-445d-9962-cf9cb165cbe7", + "tables": { + "runs": { + "name": "runs", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "taskMetricsId": { + "name": "taskMetricsId", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "settings": { + "name": "settings", + "type": "blob", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "pid": { + "name": "pid", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "socketPath": { + "name": "socketPath", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "concurrency": { + "name": "concurrency", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 2 + }, + "passed": { + "name": "passed", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "failed": { + "name": "failed", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "createdAt": { + "name": "createdAt", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "runs_taskMetricsId_taskMetrics_id_fk": { + "name": "runs_taskMetricsId_taskMetrics_id_fk", + "tableFrom": "runs", + "tableTo": "taskMetrics", + "columnsFrom": ["taskMetricsId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "taskMetrics": { + "name": "taskMetrics", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "tokensIn": { + "name": "tokensIn", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tokensOut": { + "name": "tokensOut", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "tokensContext": { + "name": "tokensContext", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "cacheWrites": { + "name": "cacheWrites", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "cacheReads": { + "name": "cacheReads", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "cost": { + "name": "cost", + "type": "real", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "duration": { + "name": "duration", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "toolUsage": { + "name": "toolUsage", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "tasks": { + "name": "tasks", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "runId": { + "name": "runId", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "taskMetricsId": { + "name": "taskMetricsId", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "exercise": { + "name": "exercise", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "passed": { + "name": "passed", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "startedAt": { + "name": "startedAt", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "finishedAt": { + "name": "finishedAt", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "tasks_language_exercise_idx": { + "name": "tasks_language_exercise_idx", + "columns": ["runId", "language", "exercise"], + "isUnique": true + } + }, + "foreignKeys": { + "tasks_runId_runs_id_fk": { + "name": "tasks_runId_runs_id_fk", + "tableFrom": "tasks", + "tableTo": "runs", + "columnsFrom": ["runId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tasks_taskMetricsId_taskMetrics_id_fk": { + "name": "tasks_taskMetricsId_taskMetrics_id_fk", + "tableFrom": "tasks", + "tableTo": "taskMetrics", + "columnsFrom": ["taskMetricsId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "toolErrors": { + "name": "toolErrors", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "runId": { + "name": "runId", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "taskId": { + "name": "taskId", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "toolName": { + "name": "toolName", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "toolErrors_runId_runs_id_fk": { + "name": "toolErrors_runId_runs_id_fk", + "tableFrom": "toolErrors", + "tableTo": "runs", + "columnsFrom": ["runId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "toolErrors_taskId_tasks_id_fk": { + "name": "toolErrors_taskId_tasks_id_fk", + "tableFrom": "toolErrors", + "tableTo": "tasks", + "columnsFrom": ["taskId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} diff --git a/evals/packages/db/drizzle/meta/_journal.json b/evals/packages/db/drizzle/meta/_journal.json index d40254559a..fba0e94f14 100644 --- a/evals/packages/db/drizzle/meta/_journal.json +++ b/evals/packages/db/drizzle/meta/_journal.json @@ -29,6 +29,13 @@ "when": 1744950664129, "tag": "0003_sweet_chimera", "breakpoints": true + }, + { + "idx": 4, + "version": "6", + "when": 1745256393286, + "tag": "0004_absent_slapstick", + "breakpoints": true } ] } diff --git a/evals/packages/db/src/index.ts b/evals/packages/db/src/index.ts index 5539a72831..02f08bd154 100644 --- a/evals/packages/db/src/index.ts +++ b/evals/packages/db/src/index.ts @@ -3,3 +3,4 @@ export * from "./schema.js" export * from "./queries/runs.js" export * from "./queries/tasks.js" export * from "./queries/taskMetrics.js" +export * from "./queries/toolErrors.js" diff --git a/evals/packages/db/src/queries/runs.ts b/evals/packages/db/src/queries/runs.ts index 1a4f6d4c57..85f080f871 100644 --- a/evals/packages/db/src/queries/runs.ts +++ b/evals/packages/db/src/queries/runs.ts @@ -9,10 +9,8 @@ import { db } from "../db.js" import { createTaskMetrics } from "./taskMetrics.js" import { getTasks } from "./tasks.js" -const table = schema.runs - export const findRun = async (id: number) => { - const run = await db.query.runs.findFirst({ where: eq(table.id, id) }) + const run = await db.query.runs.findFirst({ where: eq(schema.runs.id, id) }) if (!run) { throw new RecordNotFoundError() @@ -23,7 +21,7 @@ export const findRun = async (id: number) => { export const createRun = async (args: InsertRun) => { const records = await db - .insert(table) + .insert(schema.runs) .values({ ...insertRunSchema.parse(args), createdAt: new Date(), @@ -40,7 +38,7 @@ export const createRun = async (args: InsertRun) => { } export const updateRun = async (id: number, values: UpdateRun) => { - const records = await db.update(table).set(values).where(eq(table.id, id)).returning() + const records = await db.update(schema.runs).set(values).where(eq(schema.runs.id, id)).returning() const record = records[0] if (!record) { @@ -50,7 +48,8 @@ export const updateRun = async (id: number, values: UpdateRun) => { return record } -export const getRuns = async () => db.query.runs.findMany({ orderBy: desc(table.id), with: { taskMetrics: true } }) +export const getRuns = async () => + db.query.runs.findMany({ orderBy: desc(schema.runs.id), with: { taskMetrics: true } }) export const finishRun = async (runId: number) => { const [values] = await db diff --git a/evals/packages/db/src/queries/taskMetrics.ts b/evals/packages/db/src/queries/taskMetrics.ts index 244e98da80..d0400453ce 100644 --- a/evals/packages/db/src/queries/taskMetrics.ts +++ b/evals/packages/db/src/queries/taskMetrics.ts @@ -1,14 +1,12 @@ -import { eq, avg, min, max, and, isNotNull } from "drizzle-orm" +import { eq } from "drizzle-orm" import { RecordNotFoundError, RecordNotCreatedError } from "./errors.js" import type { InsertTaskMetrics, UpdateTaskMetrics } from "../schema.js" -import { insertTaskMetricsSchema, taskMetrics, tasks, runs } from "../schema.js" +import { insertTaskMetricsSchema, taskMetrics } from "../schema.js" import { db } from "../db.js" -const table = taskMetrics - export const findTaskMetrics = async (id: number) => { - const run = await db.query.taskMetrics.findFirst({ where: eq(table.id, id) }) + const run = await db.query.taskMetrics.findFirst({ where: eq(taskMetrics.id, id) }) if (!run) { throw new RecordNotFoundError() @@ -19,7 +17,7 @@ export const findTaskMetrics = async (id: number) => { export const createTaskMetrics = async (args: InsertTaskMetrics) => { const records = await db - .insert(table) + .insert(taskMetrics) .values({ ...insertTaskMetricsSchema.parse(args), createdAt: new Date(), @@ -36,7 +34,7 @@ export const createTaskMetrics = async (args: InsertTaskMetrics) => { } export const updateTaskMetrics = async (id: number, values: UpdateTaskMetrics) => { - const records = await db.update(table).set(values).where(eq(table.id, id)).returning() + const records = await db.update(taskMetrics).set(values).where(eq(taskMetrics.id, id)).returning() const record = records[0] if (!record) { @@ -45,18 +43,3 @@ export const updateTaskMetrics = async (id: number, values: UpdateTaskMetrics) = return record } - -export const successfulTaskDurations = async () => { - return db - .select({ - runId: tasks.runId, - avgDuration: avg(taskMetrics.duration).mapWith(Number), - minDuration: min(taskMetrics.duration).mapWith(Number), - maxDuration: max(taskMetrics.duration).mapWith(Number), - }) - .from(tasks) - .innerJoin(taskMetrics, eq(tasks.taskMetricsId, taskMetrics.id)) - .innerJoin(runs, eq(tasks.runId, runs.id)) - .where(and(eq(tasks.passed, true), isNotNull(runs.taskMetricsId))) - .groupBy(tasks.runId) -} diff --git a/evals/packages/db/src/queries/tasks.ts b/evals/packages/db/src/queries/tasks.ts index 085eeeb612..c8cca874db 100644 --- a/evals/packages/db/src/queries/tasks.ts +++ b/evals/packages/db/src/queries/tasks.ts @@ -7,10 +7,8 @@ import type { InsertTask, UpdateTask } from "../schema.js" import { insertTaskSchema, tasks } from "../schema.js" import { db } from "../db.js" -const table = tasks - export const findTask = async (id: number) => { - const run = await db.query.tasks.findFirst({ where: eq(table.id, id) }) + const run = await db.query.tasks.findFirst({ where: eq(tasks.id, id) }) if (!run) { throw new RecordNotFoundError() @@ -21,7 +19,7 @@ export const findTask = async (id: number) => { export const createTask = async (args: InsertTask) => { const records = await db - .insert(table) + .insert(tasks) .values({ ...insertTaskSchema.parse(args), createdAt: new Date(), @@ -38,7 +36,7 @@ export const createTask = async (args: InsertTask) => { } export const updateTask = async (id: number, values: UpdateTask) => { - const records = await db.update(table).set(values).where(eq(table.id, id)).returning() + const records = await db.update(tasks).set(values).where(eq(tasks.id, id)).returning() const record = records[0] if (!record) { @@ -56,8 +54,8 @@ type GetTask = { export const getTask = async ({ runId, language, exercise }: GetTask) => db.query.tasks.findFirst({ - where: and(eq(table.runId, runId), eq(table.language, language), eq(table.exercise, exercise)), + where: and(eq(tasks.runId, runId), eq(tasks.language, language), eq(tasks.exercise, exercise)), }) export const getTasks = async (runId: number) => - db.query.tasks.findMany({ where: eq(table.runId, runId), with: { taskMetrics: true } }) + db.query.tasks.findMany({ where: eq(tasks.runId, runId), with: { taskMetrics: true } }) diff --git a/evals/packages/db/src/queries/toolErrors.ts b/evals/packages/db/src/queries/toolErrors.ts new file mode 100644 index 0000000000..b2b2163a24 --- /dev/null +++ b/evals/packages/db/src/queries/toolErrors.ts @@ -0,0 +1,22 @@ +import { RecordNotCreatedError } from "./errors.js" +import type { InsertToolError } from "../schema.js" +import { insertToolErrorSchema, toolErrors } from "../schema.js" +import { db } from "../db.js" + +export const createToolError = async (args: InsertToolError) => { + const records = await db + .insert(toolErrors) + .values({ + ...insertToolErrorSchema.parse(args), + createdAt: new Date(), + }) + .returning() + + const record = records[0] + + if (!record) { + throw new RecordNotCreatedError() + } + + return record +} diff --git a/evals/packages/db/src/schema.ts b/evals/packages/db/src/schema.ts index 902bb91a42..4473296895 100644 --- a/evals/packages/db/src/schema.ts +++ b/evals/packages/db/src/schema.ts @@ -2,7 +2,14 @@ import { sqliteTable, text, real, integer, blob, uniqueIndex } from "drizzle-orm import { relations } from "drizzle-orm" import { createInsertSchema } from "drizzle-zod" -import { RooCodeSettings, ToolUsage, exerciseLanguages, rooCodeSettingsSchema, toolUsageSchema } from "@evals/types" +import { + RooCodeSettings, + ToolUsage, + exerciseLanguages, + rooCodeSettingsSchema, + toolNames, + toolUsageSchema, +} from "@evals/types" /** * runs @@ -98,6 +105,34 @@ export type InsertTaskMetrics = Omit> +/** + * toolErrors + */ + +export const toolErrors = sqliteTable("toolErrors", { + id: integer({ mode: "number" }).primaryKey({ autoIncrement: true }), + runId: integer({ mode: "number" }).references(() => runs.id), + taskId: integer({ mode: "number" }).references(() => tasks.id), + toolName: text({ enum: toolNames }).notNull(), + error: text().notNull(), + createdAt: integer({ mode: "timestamp" }).notNull(), +}) + +export const toolErrorsRelations = relations(toolErrors, ({ one }) => ({ + run: one(runs, { fields: [toolErrors.runId], references: [runs.id] }), + task: one(tasks, { fields: [toolErrors.taskId], references: [tasks.id] }), +})) + +export type ToolError = typeof toolErrors.$inferSelect + +export const insertToolErrorSchema = createInsertSchema(toolErrors) + .omit({ id: true, createdAt: true }) + .extend({ toolUsage: toolUsageSchema.optional() }) + +export type InsertToolError = Omit + +export type UpdateToolError = Partial> + /** * schema */ diff --git a/evals/packages/types/src/ipc.ts b/evals/packages/types/src/ipc.ts index c8eb59d591..1a6556e043 100644 --- a/evals/packages/types/src/ipc.ts +++ b/evals/packages/types/src/ipc.ts @@ -111,6 +111,11 @@ export const taskEventSchema = z.discriminatedUnion("eventName", [ payload: rooCodeEventsSchema.shape[RooCodeEventName.TaskTokenUsageUpdated], taskId: z.number().optional(), }), + z.object({ + eventName: z.literal(RooCodeEventName.TaskToolFailed), + payload: rooCodeEventsSchema.shape[RooCodeEventName.TaskToolFailed], + taskId: z.number().optional(), + }), z.object({ eventName: z.literal(EvalEventName.Pass), payload: z.undefined(), diff --git a/evals/packages/types/src/roo-code-defaults.ts b/evals/packages/types/src/roo-code-defaults.ts index 596a5810ae..ba1ef0e445 100644 --- a/evals/packages/types/src/roo-code-defaults.ts +++ b/evals/packages/types/src/roo-code-defaults.ts @@ -9,7 +9,7 @@ export const rooCodeDefaults: RooCodeSettings = { rateLimitSeconds: 0, pinnedApiConfigs: {}, - lastShownAnnouncementId: "apr-16-2025-3-12", + lastShownAnnouncementId: "apr-18-2025-3-13", autoApprovalEnabled: true, alwaysAllowReadOnly: true, @@ -59,7 +59,6 @@ export const rooCodeDefaults: RooCodeSettings = { search_and_replace: false, insert_content: false, powerSteering: false, - append_to_file: false, }, language: "en", diff --git a/evals/packages/types/src/roo-code.ts b/evals/packages/types/src/roo-code.ts index bb525f71b4..d068b29991 100644 --- a/evals/packages/types/src/roo-code.ts +++ b/evals/packages/types/src/roo-code.ts @@ -271,7 +271,7 @@ export type CustomSupportPrompts = z.infer * ExperimentId */ -export const experimentIds = ["search_and_replace", "insert_content", "powerSteering", "append_to_file"] as const +export const experimentIds = ["search_and_replace", "insert_content", "powerSteering"] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -285,7 +285,6 @@ const experimentsSchema = z.object({ search_and_replace: z.boolean(), insert_content: z.boolean(), powerSteering: z.boolean(), - append_to_file: z.boolean(), }) export type Experiments = z.infer @@ -863,6 +862,7 @@ export enum RooCodeEventName { TaskSpawned = "taskSpawned", TaskCompleted = "taskCompleted", TaskTokenUsageUpdated = "taskTokenUsageUpdated", + TaskToolFailed = "taskToolFailed", } export const rooCodeEventsSchema = z.object({ @@ -883,6 +883,7 @@ export const rooCodeEventsSchema = z.object({ [RooCodeEventName.TaskSpawned]: z.tuple([z.string(), z.string()]), [RooCodeEventName.TaskCompleted]: z.tuple([z.string(), tokenUsageSchema, toolUsageSchema]), [RooCodeEventName.TaskTokenUsageUpdated]: z.tuple([z.string(), tokenUsageSchema]), + [RooCodeEventName.TaskToolFailed]: z.tuple([z.string(), toolNamesSchema, z.string()]), }) export type RooCodeEvents = z.infer diff --git a/package-lock.json b/package-lock.json index 365b0785dc..268e4cc4a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16921,6 +16921,7 @@ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 0000e3ae78..451b13aee9 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -107,6 +107,7 @@ export type ClineEvents = { taskSpawned: [taskId: string] taskCompleted: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage] taskTokenUsageUpdated: [taskId: string, tokenUsage: TokenUsage] + taskToolFailed: [taskId: string, tool: ToolName, error: string] } export type ClineOptions = { @@ -340,6 +341,7 @@ export class Cline extends EventEmitter { return data } } + return [] } @@ -2541,12 +2543,17 @@ export class Cline extends EventEmitter { this.toolUsage[toolName].attempts++ } - public recordToolError(toolName: ToolName) { + + public recordToolError(toolName: ToolName, error?: string) { if (!this.toolUsage[toolName]) { this.toolUsage[toolName] = { attempts: 0, failures: 0 } } this.toolUsage[toolName].failures++ + + if (error) { + this.emit("taskToolFailed", this.taskId, toolName, error) + } } public getToolUsage() { diff --git a/src/core/tools/applyDiffTool.ts b/src/core/tools/applyDiffTool.ts index 7830378ae3..f8fd5944b8 100644 --- a/src/core/tools/applyDiffTool.ts +++ b/src/core/tools/applyDiffTool.ts @@ -96,7 +96,6 @@ export async function applyDiffTool( if (!diffResult.success) { cline.consecutiveMistakeCount++ - cline.recordToolError("apply_diff") const currentCount = (cline.consecutiveMistakeCountForApplyDiff.get(relPath) || 0) + 1 cline.consecutiveMistakeCountForApplyDiff.set(relPath, currentCount) let formattedError = "" @@ -128,6 +127,8 @@ export async function applyDiffTool( await cline.say("diff_error", formattedError) } + cline.recordToolError("apply_diff", formattedError) + pushToolResult(formattedError) return } diff --git a/src/exports/api.ts b/src/exports/api.ts index 47464ff00f..46eee5dc59 100644 --- a/src/exports/api.ts +++ b/src/exports/api.ts @@ -285,10 +285,6 @@ export class API extends EventEmitter implements RooCodeAPI { cline.on("taskModeSwitched", (taskId, mode) => this.emit(RooCodeEventName.TaskModeSwitched, taskId, mode)) - cline.on("taskTokenUsageUpdated", (_, usage) => - this.emit(RooCodeEventName.TaskTokenUsageUpdated, cline.taskId, usage), - ) - cline.on("taskAskResponded", () => this.emit(RooCodeEventName.TaskAskResponded, cline.taskId)) cline.on("taskAborted", () => { @@ -309,6 +305,14 @@ export class API extends EventEmitter implements RooCodeAPI { cline.on("taskPaused", () => this.emit(RooCodeEventName.TaskPaused, cline.taskId)) cline.on("taskUnpaused", () => this.emit(RooCodeEventName.TaskUnpaused, cline.taskId)) + cline.on("taskTokenUsageUpdated", (_, usage) => + this.emit(RooCodeEventName.TaskTokenUsageUpdated, cline.taskId, usage), + ) + + cline.on("taskToolFailed", (taskId, tool, error) => + this.emit(RooCodeEventName.TaskToolFailed, taskId, tool, error), + ) + this.emit(RooCodeEventName.TaskCreated, cline.taskId) }) } diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index d2a28a8273..94ff89cdff 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -543,6 +543,30 @@ type RooCodeEvents = { contextTokens: number }, ] + taskToolFailed: [ + string, + ( + | "execute_command" + | "read_file" + | "write_to_file" + | "append_to_file" + | "apply_diff" + | "insert_content" + | "search_and_replace" + | "search_files" + | "list_files" + | "list_code_definition_names" + | "browser_action" + | "use_mcp_tool" + | "access_mcp_resource" + | "ask_followup_question" + | "attempt_completion" + | "switch_mode" + | "new_task" + | "fetch_instructions" + ), + string, + ] } /** @@ -560,6 +584,7 @@ declare enum RooCodeEventName { TaskSpawned = "taskSpawned", TaskCompleted = "taskCompleted", TaskTokenUsageUpdated = "taskTokenUsageUpdated", + TaskToolFailed = "taskToolFailed", } type RooCodeSettings = GlobalSettings & ProviderSettings diff --git a/src/exports/types.ts b/src/exports/types.ts index 4280511a8d..3bd3bce16c 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -552,6 +552,30 @@ type RooCodeEvents = { contextTokens: number }, ] + taskToolFailed: [ + string, + ( + | "execute_command" + | "read_file" + | "write_to_file" + | "append_to_file" + | "apply_diff" + | "insert_content" + | "search_and_replace" + | "search_files" + | "list_files" + | "list_code_definition_names" + | "browser_action" + | "use_mcp_tool" + | "access_mcp_resource" + | "ask_followup_question" + | "attempt_completion" + | "switch_mode" + | "new_task" + | "fetch_instructions" + ), + string, + ] } export type { RooCodeEvents } diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 24b224c08b..3eb1b75a4b 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -873,6 +873,7 @@ export enum RooCodeEventName { TaskSpawned = "taskSpawned", TaskCompleted = "taskCompleted", TaskTokenUsageUpdated = "taskTokenUsageUpdated", + TaskToolFailed = "taskToolFailed", } export const rooCodeEventsSchema = z.object({ @@ -893,6 +894,7 @@ export const rooCodeEventsSchema = z.object({ [RooCodeEventName.TaskSpawned]: z.tuple([z.string(), z.string()]), [RooCodeEventName.TaskCompleted]: z.tuple([z.string(), tokenUsageSchema, toolUsageSchema]), [RooCodeEventName.TaskTokenUsageUpdated]: z.tuple([z.string(), tokenUsageSchema]), + [RooCodeEventName.TaskToolFailed]: z.tuple([z.string(), toolNamesSchema, z.string()]), }) export type RooCodeEvents = z.infer From 80b298492cf2a755deb027583bc291d9b00b83fb Mon Sep 17 00:00:00 2001 From: Sam Hoang Van Date: Tue, 22 Apr 2025 02:25:03 +0700 Subject: [PATCH 22/89] improve search and replace tool (#2764) * Refactor search and replace tool * feat(search-replace): enhance search/replace tool UI and messaging Refactor search/replace tool message structure for better consistency Add dedicated UI component for displaying search/replace operations Add i18n support for search/replace operations in all supported languages Improve partial tool handling in searchAndReplaceTool * Remove search_and_replace experiment and related references --- evals/packages/types/src/roo-code-defaults.ts | 1 - evals/packages/types/src/roo-code.ts | 3 +- .../__snapshots__/system.test.ts.snap | 611 +++++++++++++++--- src/core/prompts/__tests__/system.test.ts | 10 - src/core/prompts/sections/rules.ts | 13 +- src/core/prompts/tools/search-and-replace.ts | 69 +- src/core/tools/searchAndReplaceTool.ts | 403 +++++++----- src/exports/roo-code.d.ts | 1 - src/exports/types.ts | 1 - src/schemas/index.ts | 3 +- src/shared/ExtensionMessage.ts | 7 + src/shared/__tests__/experiments.test.ts | 3 - src/shared/__tests__/modes.test.ts | 25 - src/shared/experiments.ts | 2 - src/shared/tools.ts | 12 + webview-ui/src/components/chat/ChatRow.tsx | 43 ++ webview-ui/src/components/chat/ChatView.tsx | 2 +- .../__tests__/ExtensionStateContext.test.tsx | 2 - webview-ui/src/i18n/locales/ca/chat.json | 4 +- webview-ui/src/i18n/locales/de/chat.json | 4 +- webview-ui/src/i18n/locales/en/chat.json | 4 +- webview-ui/src/i18n/locales/es/chat.json | 4 +- webview-ui/src/i18n/locales/fr/chat.json | 4 +- webview-ui/src/i18n/locales/hi/chat.json | 4 +- webview-ui/src/i18n/locales/it/chat.json | 4 +- webview-ui/src/i18n/locales/ja/chat.json | 4 +- webview-ui/src/i18n/locales/ko/chat.json | 4 +- webview-ui/src/i18n/locales/pl/chat.json | 4 +- webview-ui/src/i18n/locales/pt-BR/chat.json | 4 +- webview-ui/src/i18n/locales/tr/chat.json | 4 +- webview-ui/src/i18n/locales/vi/chat.json | 4 +- webview-ui/src/i18n/locales/zh-CN/chat.json | 4 +- webview-ui/src/i18n/locales/zh-TW/chat.json | 4 +- 33 files changed, 895 insertions(+), 376 deletions(-) diff --git a/evals/packages/types/src/roo-code-defaults.ts b/evals/packages/types/src/roo-code-defaults.ts index ba1ef0e445..4893487768 100644 --- a/evals/packages/types/src/roo-code-defaults.ts +++ b/evals/packages/types/src/roo-code-defaults.ts @@ -56,7 +56,6 @@ export const rooCodeDefaults: RooCodeSettings = { diffEnabled: true, fuzzyMatchThreshold: 1.0, experiments: { - search_and_replace: false, insert_content: false, powerSteering: false, }, diff --git a/evals/packages/types/src/roo-code.ts b/evals/packages/types/src/roo-code.ts index d068b29991..a6b6240a55 100644 --- a/evals/packages/types/src/roo-code.ts +++ b/evals/packages/types/src/roo-code.ts @@ -271,7 +271,7 @@ export type CustomSupportPrompts = z.infer * ExperimentId */ -export const experimentIds = ["search_and_replace", "insert_content", "powerSteering"] as const +export const experimentIds = ["insert_content", "powerSteering"] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -282,7 +282,6 @@ export type ExperimentId = z.infer */ const experimentsSchema = z.object({ - search_and_replace: z.boolean(), insert_content: z.boolean(), powerSteering: z.boolean(), }) diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index 70fa15d5be..5f09015166 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -201,6 +201,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -361,8 +397,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -659,53 +696,39 @@ Example: Insert a new function and its import statement ## search_and_replace -Description: Request to perform search and replace operations on a file. Each operation can specify a search pattern (string or regex) and replacement text, with optional line range restrictions and regex flags. Shows a diff preview before applying changes. -Parameters: -- path: (required) The path of the file to modify (relative to the current workspace directory /test/path) -- operations: (required) A JSON array of search/replace operations. Each operation is an object with: - * search: (required) The text or pattern to search for - * replace: (required) The text to replace matches with. If multiple lines need to be replaced, use " -" for newlines - * start_line: (optional) Starting line number for restricted replacement - * end_line: (optional) Ending line number for restricted replacement - * use_regex: (optional) Whether to treat search as a regex pattern - * ignore_case: (optional) Whether to ignore case when matching - * regex_flags: (optional) Additional regex flags when use_regex is true -Usage: - -File path here -[ - { - "search": "text to find", - "replace": "replacement text", - "start_line": 1, - "end_line": 10 - } -] - -Example: Replace "foo" with "bar" in lines 1-10 of example.ts +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: example.ts -[ - { - "search": "foo", - "replace": "bar", - "start_line": 1, - "end_line": 10 - } -] +oldText +newText -Example: Replace all occurrences of "old" with "new" using regex + +2. Case-insensitive regex pattern: example.ts -[ - { - "search": "old\\w+", - "replace": "new$&", - "use_regex": true, - "ignore_case": true - } -] +oldw+ +new$& +true +true ## execute_command @@ -1133,53 +1156,39 @@ Example: Requesting to append to a log file ## search_and_replace -Description: Request to perform search and replace operations on a file. Each operation can specify a search pattern (string or regex) and replacement text, with optional line range restrictions and regex flags. Shows a diff preview before applying changes. -Parameters: -- path: (required) The path of the file to modify (relative to the current workspace directory /test/path) -- operations: (required) A JSON array of search/replace operations. Each operation is an object with: - * search: (required) The text or pattern to search for - * replace: (required) The text to replace matches with. If multiple lines need to be replaced, use " -" for newlines - * start_line: (optional) Starting line number for restricted replacement - * end_line: (optional) Ending line number for restricted replacement - * use_regex: (optional) Whether to treat search as a regex pattern - * ignore_case: (optional) Whether to ignore case when matching - * regex_flags: (optional) Additional regex flags when use_regex is true -Usage: - -File path here -[ - { - "search": "text to find", - "replace": "replacement text", - "start_line": 1, - "end_line": 10 - } -] - -Example: Replace "foo" with "bar" in lines 1-10 of example.ts +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: example.ts -[ - { - "search": "foo", - "replace": "bar", - "start_line": 1, - "end_line": 10 - } -] +oldText +newText -Example: Replace all occurrences of "old" with "new" using regex + +2. Case-insensitive regex pattern: example.ts -[ - { - "search": "old\\w+", - "replace": "new$&", - "use_regex": true, - "ignore_case": true - } -] +oldw+ +new$& +true +true ## execute_command @@ -1605,6 +1614,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -1765,8 +1810,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -2027,6 +2073,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -2187,8 +2269,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -2449,6 +2532,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -2609,8 +2728,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -2871,6 +2991,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## browser_action Description: Request to interact with a Puppeteer-controlled browser. Every action, except \`close\`, will be responded to with a screenshot of the browser's current state, along with any new console logs. You may only perform one browser action per message, and wait for the user's response including a screenshot and logs to determine the next action. - The sequence of actions **must always start with** launching the browser at a URL, and **must always end with** closing the browser. If you need to visit a new URL that is not possible to navigate to from the current webpage, you must first close the browser, then launch again at the new URL. @@ -3086,8 +3242,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -3349,6 +3506,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -3577,8 +3770,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -3839,6 +4033,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## browser_action Description: Request to interact with a Puppeteer-controlled browser. Every action, except \`close\`, will be responded to with a screenshot of the browser's current state, along with any new console logs. You may only perform one browser action per message, and wait for the user's response including a screenshot and logs to determine the next action. - The sequence of actions **must always start with** launching the browser at a URL, and **must always end with** closing the browser. If you need to visit a new URL that is not possible to navigate to from the current webpage, you must first close the browser, then launch again at the new URL. @@ -4054,8 +4284,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -4407,6 +4638,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -4567,8 +4834,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using apply_diff or write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: apply_diff (for replacing lines in existing files), write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: apply_diff (for replacing lines in existing files), write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -4829,6 +5097,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -4989,8 +5293,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -5293,6 +5598,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -5515,8 +5856,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -5792,6 +6134,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## ask_followup_question Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. Parameters: @@ -5930,8 +6308,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -6284,8 +6663,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. @@ -6579,6 +6959,42 @@ Example: Requesting to append to a log file +## search_and_replace +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory /test/path) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: + +example.ts +oldText +newText + + +2. Case-insensitive regex pattern: + +example.ts +oldw+ +new$& +true +true + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -6807,8 +7223,9 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files). +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). - The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. - Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. diff --git a/src/core/prompts/__tests__/system.test.ts b/src/core/prompts/__tests__/system.test.ts index 4a29b2f4d8..494439c190 100644 --- a/src/core/prompts/__tests__/system.test.ts +++ b/src/core/prompts/__tests__/system.test.ts @@ -171,7 +171,6 @@ describe("SYSTEM_PROMPT", () => { beforeEach(() => { // Reset experiments before each test to ensure they're disabled by default experiments = { - [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: false, [EXPERIMENT_IDS.INSERT_BLOCK]: false, } }) @@ -482,7 +481,6 @@ describe("SYSTEM_PROMPT", () => { it("should disable experimental tools by default", async () => { // Set experiments to explicitly disable experimental tools const experimentsConfig = { - [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: false, [EXPERIMENT_IDS.INSERT_BLOCK]: false, } @@ -508,7 +506,6 @@ describe("SYSTEM_PROMPT", () => { // Check that experimental tool sections are not included const toolSections = prompt.split("\n## ").slice(1) const toolNames = toolSections.map((section) => section.split("\n")[0].trim()) - expect(toolNames).not.toContain("search_and_replace") expect(toolNames).not.toContain("insert_content") expect(prompt).toMatchSnapshot() }) @@ -516,7 +513,6 @@ describe("SYSTEM_PROMPT", () => { it("should enable experimental tools when explicitly enabled", async () => { // Set experiments for testing experimental features const experimentsEnabled = { - [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: true, [EXPERIMENT_IDS.INSERT_BLOCK]: true, } @@ -544,7 +540,6 @@ describe("SYSTEM_PROMPT", () => { const toolNames = toolSections.map((section) => section.split("\n")[0].trim()) // Verify experimental tools are included in the prompt when enabled - expect(toolNames).toContain("search_and_replace") expect(toolNames).toContain("insert_content") expect(prompt).toMatchSnapshot() }) @@ -552,7 +547,6 @@ describe("SYSTEM_PROMPT", () => { it("should selectively enable experimental tools", async () => { // Set experiments for testing selective enabling const experimentsSelective = { - [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: true, [EXPERIMENT_IDS.INSERT_BLOCK]: false, } @@ -580,14 +574,12 @@ describe("SYSTEM_PROMPT", () => { const toolNames = toolSections.map((section) => section.split("\n")[0].trim()) // Verify only enabled experimental tools are included - expect(toolNames).toContain("search_and_replace") expect(toolNames).not.toContain("insert_content") expect(prompt).toMatchSnapshot() }) it("should list all available editing tools in base instruction", async () => { const experiments = { - [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: true, [EXPERIMENT_IDS.INSERT_BLOCK]: true, } @@ -615,7 +607,6 @@ describe("SYSTEM_PROMPT", () => { }) it("should provide detailed instructions for each enabled tool", async () => { const experiments = { - [EXPERIMENT_IDS.SEARCH_AND_REPLACE]: true, [EXPERIMENT_IDS.INSERT_BLOCK]: true, } @@ -640,7 +631,6 @@ describe("SYSTEM_PROMPT", () => { "You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files.", ) expect(prompt).toContain("The insert_content tool adds lines of text to files") - expect(prompt).toContain("The search_and_replace tool finds and replaces text or regex in files") }) }) diff --git a/src/core/prompts/sections/rules.ts b/src/core/prompts/sections/rules.ts index c4f4557965..d379897063 100644 --- a/src/core/prompts/sections/rules.ts +++ b/src/core/prompts/sections/rules.ts @@ -19,9 +19,8 @@ function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Recor if (experiments?.["insert_content"]) { availableTools.push("insert_content (for adding lines to existing files)") } - if (experiments?.["search_and_replace"]) { - availableTools.push("search_and_replace (for finding and replacing individual pieces of text)") - } + + availableTools.push("search_and_replace (for finding and replacing individual pieces of text)") // Base editing instruction mentioning all available tools if (availableTools.length > 1) { @@ -38,11 +37,9 @@ function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Recor ) } - if (experiments?.["search_and_replace"]) { - instructions.push( - "- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once.", - ) - } + instructions.push( + "- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once.", + ) if (availableTools.length > 1) { instructions.push( diff --git a/src/core/prompts/tools/search-and-replace.ts b/src/core/prompts/tools/search-and-replace.ts index 6074172603..9b068a6279 100644 --- a/src/core/prompts/tools/search-and-replace.ts +++ b/src/core/prompts/tools/search-and-replace.ts @@ -2,51 +2,38 @@ import { ToolArgs } from "./types" export function getSearchAndReplaceDescription(args: ToolArgs): string { return `## search_and_replace -Description: Request to perform search and replace operations on a file. Each operation can specify a search pattern (string or regex) and replacement text, with optional line range restrictions and regex flags. Shows a diff preview before applying changes. -Parameters: -- path: (required) The path of the file to modify (relative to the current workspace directory ${args.cwd.toPosix()}) -- operations: (required) A JSON array of search/replace operations. Each operation is an object with: - * search: (required) The text or pattern to search for - * replace: (required) The text to replace matches with. If multiple lines need to be replaced, use "\n" for newlines - * start_line: (optional) Starting line number for restricted replacement - * end_line: (optional) Ending line number for restricted replacement - * use_regex: (optional) Whether to treat search as a regex pattern - * ignore_case: (optional) Whether to ignore case when matching - * regex_flags: (optional) Additional regex flags when use_regex is true -Usage: - -File path here -[ - { - "search": "text to find", - "replace": "replacement text", - "start_line": 1, - "end_line": 10 - } -] - -Example: Replace "foo" with "bar" in lines 1-10 of example.ts +Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. + +Required Parameters: +- path: The path of the file to modify (relative to the current workspace directory ${args.cwd.toPosix()}) +- search: The text or pattern to search for +- replace: The text to replace matches with + +Optional Parameters: +- start_line: Starting line number for restricted replacement (1-based) +- end_line: Ending line number for restricted replacement (1-based) +- use_regex: Set to "true" to treat search as a regex pattern (default: false) +- ignore_case: Set to "true" to ignore case when matching (default: false) + +Notes: +- When use_regex is true, the search parameter is treated as a regular expression pattern +- When ignore_case is true, the search is case-insensitive regardless of regex mode + +Examples: + +1. Simple text replacement: example.ts -[ - { - "search": "foo", - "replace": "bar", - "start_line": 1, - "end_line": 10 - } -] +oldText +newText -Example: Replace all occurrences of "old" with "new" using regex + +2. Case-insensitive regex pattern: example.ts -[ - { - "search": "old\\w+", - "replace": "new$&", - "use_regex": true, - "ignore_case": true - } -] +old\w+ +new$& +true +true ` } diff --git a/src/core/tools/searchAndReplaceTool.ts b/src/core/tools/searchAndReplaceTool.ts index 7ed1a71f8d..f371901e5f 100644 --- a/src/core/tools/searchAndReplaceTool.ts +++ b/src/core/tools/searchAndReplaceTool.ts @@ -1,15 +1,65 @@ +// Core Node.js imports import path from "path" import fs from "fs/promises" +import delay from "delay" +// Internal imports import { Cline } from "../Cline" -import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" +import { AskApproval, HandleError, PushToolResult, RemoveClosingTag, ToolUse } from "../../shared/tools" import { formatResponse } from "../prompts/responses" import { ClineSayTool } from "../../shared/ExtensionMessage" import { getReadablePath } from "../../utils/path" import { fileExistsAtPath } from "../../utils/fs" -import { addLineNumbers } from "../../integrations/misc/extract-text" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" +/** + * Tool for performing search and replace operations on files + * Supports regex and case-sensitive/insensitive matching + */ + +/** + * Validates required parameters for search and replace operation + */ +async function validateParams( + cline: Cline, + relPath: string | undefined, + search: string | undefined, + replace: string | undefined, + pushToolResult: PushToolResult, +): Promise { + if (!relPath) { + cline.consecutiveMistakeCount++ + cline.recordToolError("search_and_replace") + pushToolResult(await cline.sayAndCreateMissingParamError("search_and_replace", "path")) + return false + } + + if (!search) { + cline.consecutiveMistakeCount++ + cline.recordToolError("search_and_replace") + pushToolResult(await cline.sayAndCreateMissingParamError("search_and_replace", "search")) + return false + } + + if (!replace) { + cline.consecutiveMistakeCount++ + cline.recordToolError("search_and_replace") + pushToolResult(await cline.sayAndCreateMissingParamError("search_and_replace", "replace")) + return false + } + + return true +} + +/** + * Performs search and replace operations on a file + * @param cline - Cline instance + * @param block - Tool use parameters + * @param askApproval - Function to request user approval + * @param handleError - Function to handle errors + * @param pushToolResult - Function to push tool results + * @param removeClosingTag - Function to remove closing tags + */ export async function searchAndReplaceTool( cline: Cline, block: ToolUse, @@ -17,178 +67,201 @@ export async function searchAndReplaceTool( handleError: HandleError, pushToolResult: PushToolResult, removeClosingTag: RemoveClosingTag, -) { +): Promise { + // Extract and validate parameters const relPath: string | undefined = block.params.path - const operations: string | undefined = block.params.operations - - const sharedMessageProps: ClineSayTool = { - tool: "appliedDiff", - path: getReadablePath(cline.cwd, removeClosingTag("path", relPath)), - } + const search: string | undefined = block.params.search + const replace: string | undefined = block.params.replace + const useRegex: boolean = block.params.use_regex === "true" + const ignoreCase: boolean = block.params.ignore_case === "true" + const startLine: number | undefined = block.params.start_line ? parseInt(block.params.start_line, 10) : undefined + const endLine: number | undefined = block.params.end_line ? parseInt(block.params.end_line, 10) : undefined try { + // Handle partial tool use if (block.partial) { - const partialMessage = JSON.stringify({ - path: removeClosingTag("path", relPath), - operations: removeClosingTag("operations", operations), - }) - - await cline.ask("tool", partialMessage, block.partial).catch(() => {}) - return - } else { - if (!relPath) { - cline.consecutiveMistakeCount++ - cline.recordToolError("search_and_replace") - pushToolResult(await cline.sayAndCreateMissingParamError("search_and_replace", "path")) - return + const partialMessageProps = { + tool: "searchAndReplace" as const, + path: getReadablePath(cline.cwd, removeClosingTag("path", relPath)), + search: removeClosingTag("search", search), + replace: removeClosingTag("replace", replace), + useRegex: block.params.use_regex === "true", + ignoreCase: block.params.ignore_case === "true", + startLine, + endLine, } - - if (!operations) { - cline.consecutiveMistakeCount++ - cline.recordToolError("search_and_replace") - pushToolResult(await cline.sayAndCreateMissingParamError("search_and_replace", "operations")) - return - } - - const absolutePath = path.resolve(cline.cwd, relPath) - const fileExists = await fileExistsAtPath(absolutePath) - - if (!fileExists) { - cline.consecutiveMistakeCount++ - cline.recordToolError("search_and_replace") - const formattedError = `File does not exist at path: ${absolutePath}\n\n\nThe specified file could not be found. Please verify the file path and try again.\n` - await cline.say("error", formattedError) - pushToolResult(formattedError) - return - } - - let parsedOperations: Array<{ - search: string - replace: string - start_line?: number - end_line?: number - use_regex?: boolean - ignore_case?: boolean - regex_flags?: string - }> - - try { - parsedOperations = JSON.parse(operations) - - if (!Array.isArray(parsedOperations)) { - throw new Error("Operations must be an array") - } - } catch (error) { - cline.consecutiveMistakeCount++ - cline.recordToolError("search_and_replace") - await cline.say("error", `Failed to parse operations JSON: ${error.message}`) - pushToolResult(formatResponse.toolError("Invalid operations JSON format")) - return - } - - // Read the original file content - const fileContent = await fs.readFile(absolutePath, "utf-8") - cline.diffViewProvider.editType = "modify" - cline.diffViewProvider.originalContent = fileContent - let lines = fileContent.split("\n") - - for (const op of parsedOperations) { - const flags = op.regex_flags ?? (op.ignore_case ? "gi" : "g") - const multilineFlags = flags.includes("m") ? flags : flags + "m" - - const searchPattern = op.use_regex - ? new RegExp(op.search, multilineFlags) - : new RegExp(escapeRegExp(op.search), multilineFlags) - - if (op.start_line || op.end_line) { - const startLine = Math.max((op.start_line ?? 1) - 1, 0) - const endLine = Math.min((op.end_line ?? lines.length) - 1, lines.length - 1) - - // Get the content before and after the target section - const beforeLines = lines.slice(0, startLine) - const afterLines = lines.slice(endLine + 1) - - // Get the target section and perform replacement - const targetContent = lines.slice(startLine, endLine + 1).join("\n") - const modifiedContent = targetContent.replace(searchPattern, op.replace) - const modifiedLines = modifiedContent.split("\n") - - // Reconstruct the full content with the modified section - lines = [...beforeLines, ...modifiedLines, ...afterLines] - } else { - // Global replacement - const fullContent = lines.join("\n") - const modifiedContent = fullContent.replace(searchPattern, op.replace) - lines = modifiedContent.split("\n") - } - } - - const newContent = lines.join("\n") - - cline.consecutiveMistakeCount = 0 - - // Show diff preview - const diff = formatResponse.createPrettyPatch(relPath, fileContent, newContent) - - if (!diff) { - pushToolResult(`No changes needed for '${relPath}'`) - return - } - - await cline.diffViewProvider.open(relPath) - await cline.diffViewProvider.update(newContent, true) - cline.diffViewProvider.scrollToFirstDiff() - - const completeMessage = JSON.stringify({ ...sharedMessageProps, diff: diff } satisfies ClineSayTool) - const didApprove = await askApproval("tool", completeMessage) - - if (!didApprove) { - await cline.diffViewProvider.revertChanges() // cline likely handles closing the diff view - return - } - - const { newProblemsMessage, userEdits, finalContent } = await cline.diffViewProvider.saveChanges() - - if (relPath) { - await cline.getFileContextTracker().trackFileContext(relPath, "roo_edited" as RecordSource) - } - - cline.didEditFile = true // used to determine if we should wait for busy terminal to update before sending api request - if (userEdits) { - await cline.say( - "user_feedback_diff", - JSON.stringify({ - tool: fileExists ? "editedExistingFile" : "newFileCreated", - path: getReadablePath(cline.cwd, relPath), - diff: userEdits, - } satisfies ClineSayTool), - ) - - pushToolResult( - `The user made the following updates to your content:\n\n${userEdits}\n\n` + - `The updated content, which includes both your original modifications and the user's edits, has been successfully saved to ${relPath.toPosix()}. Here is the full, updated content of the file, including line numbers:\n\n` + - `\n${addLineNumbers(finalContent || "")}\n\n\n` + - `Please note:\n` + - `1. You do not need to re-write the file with these changes, as they have already been applied.\n` + - `2. Proceed with the task using this updated file content as the new baseline.\n` + - `3. If the user's edits have addressed part of the task or changed the requirements, adjust your approach accordingly.` + - `${newProblemsMessage}`, - ) - } else { - pushToolResult(`Changes successfully applied to ${relPath.toPosix()}:\n\n${newProblemsMessage}`) - } - - await cline.diffViewProvider.reset() - + await cline.ask("tool", JSON.stringify(partialMessageProps), block.partial).catch(() => {}) return } - } catch (error) { - await handleError("applying search and replace", error) + + // Validate required parameters + if (!(await validateParams(cline, relPath, search, replace, pushToolResult))) { + return + } + + // At this point we know relPath, search and replace are defined + const validRelPath = relPath as string + const validSearch = search as string + const validReplace = replace as string + + const sharedMessageProps: ClineSayTool = { + tool: "searchAndReplace", + path: getReadablePath(cline.cwd, validRelPath), + search: validSearch, + replace: validReplace, + useRegex: useRegex, + ignoreCase: ignoreCase, + startLine: startLine, + endLine: endLine, + } + + const absolutePath = path.resolve(cline.cwd, validRelPath) + const fileExists = await fileExistsAtPath(absolutePath) + + if (!fileExists) { + cline.consecutiveMistakeCount++ + cline.recordToolError("search_and_replace") + const formattedError = formatResponse.toolError( + `File does not exist at path: ${absolutePath}\nThe specified file could not be found. Please verify the file path and try again.`, + ) + await cline.say("error", formattedError) + pushToolResult(formattedError) + return + } + + // Reset consecutive mistakes since all validations passed + cline.consecutiveMistakeCount = 0 + + // Read and process file content + let fileContent: string + try { + fileContent = await fs.readFile(absolutePath, "utf-8") + } catch (error) { + cline.consecutiveMistakeCount++ + cline.recordToolError("search_and_replace") + const errorMessage = `Error reading file: ${absolutePath}\nFailed to read the file content: ${ + error instanceof Error ? error.message : String(error) + }\nPlease verify file permissions and try again.` + const formattedError = formatResponse.toolError(errorMessage) + await cline.say("error", formattedError) + pushToolResult(formattedError) + return + } + + // Create search pattern and perform replacement + const flags = ignoreCase ? "gi" : "g" + const searchPattern = useRegex ? new RegExp(validSearch, flags) : new RegExp(escapeRegExp(validSearch), flags) + + let newContent: string + if (startLine !== undefined || endLine !== undefined) { + // Handle line-specific replacement + const lines = fileContent.split("\n") + const start = Math.max((startLine ?? 1) - 1, 0) + const end = Math.min((endLine ?? lines.length) - 1, lines.length - 1) + + // Get content before and after target section + const beforeLines = lines.slice(0, start) + const afterLines = lines.slice(end + 1) + + // Get and modify target section + const targetContent = lines.slice(start, end + 1).join("\n") + const modifiedContent = targetContent.replace(searchPattern, validReplace) + const modifiedLines = modifiedContent.split("\n") + + // Reconstruct full content + newContent = [...beforeLines, ...modifiedLines, ...afterLines].join("\n") + } else { + // Global replacement + newContent = fileContent.replace(searchPattern, validReplace) + } + + // Initialize diff view + cline.diffViewProvider.editType = "modify" + cline.diffViewProvider.originalContent = fileContent + + // Generate and validate diff + const diff = formatResponse.createPrettyPatch(validRelPath, fileContent, newContent) + if (!diff) { + pushToolResult(`No changes needed for '${relPath}'`) + await cline.diffViewProvider.reset() + return + } + + // Show changes in diff view + if (!cline.diffViewProvider.isEditing) { + await cline.ask("tool", JSON.stringify(sharedMessageProps), true).catch(() => {}) + await cline.diffViewProvider.open(validRelPath) + await cline.diffViewProvider.update(fileContent, false) + cline.diffViewProvider.scrollToFirstDiff() + await delay(200) + } + + await cline.diffViewProvider.update(newContent, true) + + // Request user approval for changes + const completeMessage = JSON.stringify({ ...sharedMessageProps, diff } satisfies ClineSayTool) + const didApprove = await cline + .ask("tool", completeMessage, false) + .then((response) => response.response === "yesButtonClicked") + + if (!didApprove) { + await cline.diffViewProvider.revertChanges() + pushToolResult("Changes were rejected by the user.") + await cline.diffViewProvider.reset() + return + } + + const { newProblemsMessage, userEdits, finalContent } = await cline.diffViewProvider.saveChanges() + + // Track file edit operation + if (relPath) { + await cline.getFileContextTracker().trackFileContext(relPath, "roo_edited" as RecordSource) + } + + cline.didEditFile = true + + if (!userEdits) { + pushToolResult(`The content was successfully replaced in ${relPath}.${newProblemsMessage}`) + await cline.diffViewProvider.reset() + return + } + + const userFeedbackDiff = JSON.stringify({ + tool: "appliedDiff", + path: getReadablePath(cline.cwd, relPath), + diff: userEdits, + } satisfies ClineSayTool) + + await cline.say("user_feedback_diff", userFeedbackDiff) + + // Format and send response with user's updates + const resultMessage = [ + `The user made the following updates to your content:\n\n${userEdits}\n\n`, + `The updated content has been successfully saved to ${validRelPath.toPosix()}. Here is the full, updated content of the file:\n\n`, + `\n${finalContent}\n\n\n`, + `Please note:\n`, + `1. You do not need to re-write the file with these changes, as they have already been applied.\n`, + `2. Proceed with the task using the updated file content as the new baseline.\n`, + `3. If the user's edits have addressed part of the task or changed the requirements, adjust your approach accordingly.`, + newProblemsMessage, + ].join("") + + pushToolResult(resultMessage) + + // Record successful tool usage and cleanup + cline.recordToolUsage("search_and_replace") + await cline.diffViewProvider.reset() + } catch (error) { + handleError("search and replace", error) await cline.diffViewProvider.reset() - return } } -function escapeRegExp(string: string): string { - return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") +/** + * Escapes special regex characters in a string + * @param input String to escape regex characters in + * @returns Escaped string safe for regex pattern matching + */ +function escapeRegExp(input: string): string { + return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") } diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 94ff89cdff..14e864d767 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -288,7 +288,6 @@ type GlobalSettings = { fuzzyMatchThreshold?: number | undefined experiments?: | { - search_and_replace: boolean insert_content: boolean powerSteering: boolean } diff --git a/src/exports/types.ts b/src/exports/types.ts index 3bd3bce16c..934f6f1596 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -291,7 +291,6 @@ type GlobalSettings = { fuzzyMatchThreshold?: number | undefined experiments?: | { - search_and_replace: boolean insert_content: boolean powerSteering: boolean } diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 3eb1b75a4b..96a08ceb82 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -277,7 +277,7 @@ export type CustomSupportPrompts = z.infer * ExperimentId */ -export const experimentIds = ["search_and_replace", "insert_content", "powerSteering"] as const +export const experimentIds = ["insert_content", "powerSteering"] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -288,7 +288,6 @@ export type ExperimentId = z.infer */ const experimentsSchema = z.object({ - search_and_replace: z.boolean(), insert_content: z.boolean(), powerSteering: z.boolean(), }) diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index a568e9d8ba..7e6bb48911 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -224,6 +224,7 @@ export interface ClineSayTool { | "switchMode" | "newTask" | "finishTask" + | "searchAndReplace" path?: string diff?: string content?: string @@ -232,6 +233,12 @@ export interface ClineSayTool { mode?: string reason?: string isOutsideWorkspace?: boolean + search?: string + replace?: string + useRegex?: boolean + ignoreCase?: boolean + startLine?: number + endLine?: number } // Must keep in sync with system prompt. diff --git a/src/shared/__tests__/experiments.test.ts b/src/shared/__tests__/experiments.test.ts index ff2f4fd040..2b88237b19 100644 --- a/src/shared/__tests__/experiments.test.ts +++ b/src/shared/__tests__/experiments.test.ts @@ -14,7 +14,6 @@ describe("experiments", () => { it("returns false when experiment is not enabled", () => { const experiments: Record = { powerSteering: false, - search_and_replace: false, insert_content: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(false) @@ -23,7 +22,6 @@ describe("experiments", () => { it("returns true when experiment is enabled", () => { const experiments: Record = { powerSteering: true, - search_and_replace: false, insert_content: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(true) @@ -31,7 +29,6 @@ describe("experiments", () => { it("returns false when experiment is not present", () => { const experiments: Record = { - search_and_replace: false, insert_content: false, powerSteering: false, } diff --git a/src/shared/__tests__/modes.test.ts b/src/shared/__tests__/modes.test.ts index 53b17c0385..a1cd0c88f2 100644 --- a/src/shared/__tests__/modes.test.ts +++ b/src/shared/__tests__/modes.test.ts @@ -258,21 +258,9 @@ describe("isToolAllowedForMode", () => { describe("experimental tools", () => { it("disables tools when experiment is disabled", () => { const experiments = { - search_and_replace: false, insert_content: false, } - expect( - isToolAllowedForMode( - "search_and_replace", - "test-exp-mode", - customModes, - undefined, - undefined, - experiments, - ), - ).toBe(false) - expect( isToolAllowedForMode("insert_content", "test-exp-mode", customModes, undefined, undefined, experiments), ).toBe(false) @@ -280,21 +268,9 @@ describe("isToolAllowedForMode", () => { it("allows tools when experiment is enabled", () => { const experiments = { - search_and_replace: true, insert_content: true, } - expect( - isToolAllowedForMode( - "search_and_replace", - "test-exp-mode", - customModes, - undefined, - undefined, - experiments, - ), - ).toBe(true) - expect( isToolAllowedForMode("insert_content", "test-exp-mode", customModes, undefined, undefined, experiments), ).toBe(true) @@ -302,7 +278,6 @@ describe("isToolAllowedForMode", () => { it("allows non-experimental tools when experiments are disabled", () => { const experiments = { - search_and_replace: false, insert_content: false, } diff --git a/src/shared/experiments.ts b/src/shared/experiments.ts index aeaefa2c94..bed89f4001 100644 --- a/src/shared/experiments.ts +++ b/src/shared/experiments.ts @@ -5,7 +5,6 @@ export type { ExperimentId } export const EXPERIMENT_IDS = { INSERT_BLOCK: "insert_content", - SEARCH_AND_REPLACE: "search_and_replace", POWER_STEERING: "powerSteering", } as const satisfies Record @@ -19,7 +18,6 @@ interface ExperimentConfig { export const experimentConfigsMap: Record = { INSERT_BLOCK: { enabled: false }, - SEARCH_AND_REPLACE: { enabled: false }, POWER_STEERING: { enabled: false }, } diff --git a/src/shared/tools.ts b/src/shared/tools.ts index ece22c7fed..97136ba3aa 100644 --- a/src/shared/tools.ts +++ b/src/shared/tools.ts @@ -56,6 +56,12 @@ export const toolParamNames = [ "follow_up", "task", "size", + "search", + "replace", + "use_regex", + "ignore_case", + "start_line", + "end_line", ] as const export type ToolParamName = (typeof toolParamNames)[number] @@ -144,6 +150,12 @@ export interface NewTaskToolUse extends ToolUse { params: Partial, "mode" | "message">> } +export interface SearchAndReplaceToolUse extends ToolUse { + name: "search_and_replace" + params: Required, "path" | "search" | "replace">> & + Partial, "use_regex" | "ignore_case" | "start_line" | "end_line">> +} + // Define tool group configuration export type ToolGroupConfig = { tools: readonly string[] diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 96ba3ef3ec..87da6a996e 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -295,6 +295,49 @@ export const ChatRowContent = ({ /> ) + case "searchAndReplace": + return ( + <> +
+ {toolIcon("replace")} + + {message.type === "ask" + ? t("chat:fileOperations.wantsToSearchReplace") + : t("chat:fileOperations.didSearchReplace")} + +
+
+
+ Search: + {tool.search} + {tool.useRegex && (regex)} + {tool.ignoreCase && ( + (case-insensitive) + )} +
+
+ Replace: + {tool.replace} +
+ {(tool.startLine !== undefined || tool.endLine !== undefined) && ( +
+ Lines: + + {tool.startLine ?? 1} - {tool.endLine ?? "end"} + +
+ )} +
+ + + ) case "newFileCreated": return ( <> diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 7b84b81ab9..e522539074 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -629,7 +629,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction { ...baseState, apiConfiguration: { modelMaxTokens: 1234, modelMaxThinkingTokens: 123 }, experiments: { - search_and_replace: true, insert_content: true, } as Record, } @@ -229,7 +228,6 @@ describe("mergeExtensionState", () => { }) expect(result.experiments).toEqual({ - search_and_replace: true, insert_content: true, powerSteering: true, }) diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index fcad714a7e..b355384c10 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo ha llegit aquest fitxer:", "wantsToEdit": "Roo vol editar aquest fitxer:", "wantsToEditOutsideWorkspace": "Roo vol editar aquest fitxer fora de l'espai de treball:", - "wantsToCreate": "Roo vol crear un nou fitxer:" + "wantsToCreate": "Roo vol crear un nou fitxer:", + "wantsToSearchReplace": "Roo vol realitzar cerca i substitució en aquest fitxer:", + "didSearchReplace": "Roo ha realitzat cerca i substitució en aquest fitxer:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo vol veure els fitxers de nivell superior en aquest directori:", diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index ef92900bac..94e7e0c270 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo hat diese Datei gelesen:", "wantsToEdit": "Roo möchte diese Datei bearbeiten:", "wantsToEditOutsideWorkspace": "Roo möchte diese Datei außerhalb des Arbeitsbereichs bearbeiten:", - "wantsToCreate": "Roo möchte eine neue Datei erstellen:" + "wantsToCreate": "Roo möchte eine neue Datei erstellen:", + "wantsToSearchReplace": "Roo möchte Suchen und Ersetzen in dieser Datei durchführen:", + "didSearchReplace": "Roo hat Suchen und Ersetzen in dieser Datei durchgeführt:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo möchte die Dateien auf oberster Ebene in diesem Verzeichnis anzeigen:", diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 1c077b1761..2264423047 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -115,7 +115,9 @@ "didRead": "Roo read this file:", "wantsToEdit": "Roo wants to edit this file:", "wantsToEditOutsideWorkspace": "Roo wants to edit this file outside of the workspace:", - "wantsToCreate": "Roo wants to create a new file:" + "wantsToCreate": "Roo wants to create a new file:", + "wantsToSearchReplace": "Roo wants to perform search and replace on this file:", + "didSearchReplace": "Roo performed search and replace on this file:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo wants to view the top level files in this directory:", diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index ac46118723..1b0b762b71 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo leyó este archivo:", "wantsToEdit": "Roo quiere editar este archivo:", "wantsToEditOutsideWorkspace": "Roo quiere editar este archivo fuera del espacio de trabajo:", - "wantsToCreate": "Roo quiere crear un nuevo archivo:" + "wantsToCreate": "Roo quiere crear un nuevo archivo:", + "wantsToSearchReplace": "Roo quiere realizar búsqueda y reemplazo en este archivo:", + "didSearchReplace": "Roo realizó búsqueda y reemplazo en este archivo:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo quiere ver los archivos de nivel superior en este directorio:", diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index f5b6a6135e..788ac5555b 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -117,7 +117,9 @@ "didRead": "Roo a lu ce fichier :", "wantsToEdit": "Roo veut éditer ce fichier :", "wantsToEditOutsideWorkspace": "Roo veut éditer ce fichier en dehors de l'espace de travail :", - "wantsToCreate": "Roo veut créer un nouveau fichier :" + "wantsToCreate": "Roo veut créer un nouveau fichier :", + "wantsToSearchReplace": "Roo veut effectuer une recherche et remplacement sur ce fichier :", + "didSearchReplace": "Roo a effectué une recherche et remplacement sur ce fichier :" }, "instructions": { "wantsToFetch": "Roo veut récupérer des instructions détaillées pour aider à la tâche actuelle" diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 91491cf3e6..58237fab40 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo ने इस फ़ाइल को पढ़ा:", "wantsToEdit": "Roo इस फ़ाइल को संपादित करना चाहता है:", "wantsToEditOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर इस फ़ाइल को संपादित करना चाहता है:", - "wantsToCreate": "Roo एक नई फ़ाइल बनाना चाहता है:" + "wantsToCreate": "Roo एक नई फ़ाइल बनाना चाहता है:", + "wantsToSearchReplace": "Roo इस फ़ाइल में खोज और प्रतिस्थापन करना चाहता है:", + "didSearchReplace": "Roo ने इस फ़ाइल में खोज और प्रतिस्थापन किया:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo इस निर्देशिका में शीर्ष स्तर की फ़ाइलें देखना चाहता है:", diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index d54dd9a95c..98e161dd16 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo ha letto questo file:", "wantsToEdit": "Roo vuole modificare questo file:", "wantsToEditOutsideWorkspace": "Roo vuole modificare questo file al di fuori dell'area di lavoro:", - "wantsToCreate": "Roo vuole creare un nuovo file:" + "wantsToCreate": "Roo vuole creare un nuovo file:", + "wantsToSearchReplace": "Roo vuole eseguire ricerca e sostituzione in questo file:", + "didSearchReplace": "Roo ha eseguito ricerca e sostituzione in questo file:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo vuole visualizzare i file di primo livello in questa directory:", diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 31094a763c..56d1a5a425 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -120,7 +120,9 @@ "didRead": "Rooはこのファイルを読みました:", "wantsToEdit": "Rooはこのファイルを編集したい:", "wantsToEditOutsideWorkspace": "Rooはワークスペース外のこのファイルを編集したい:", - "wantsToCreate": "Rooは新しいファイルを作成したい:" + "wantsToCreate": "Rooは新しいファイルを作成したい:", + "wantsToSearchReplace": "Rooはこのファイルで検索と置換を実行したい:", + "didSearchReplace": "Rooはこのファイルで検索と置換を実行しました:" }, "directoryOperations": { "wantsToViewTopLevel": "Rooはこのディレクトリのトップレベルファイルを表示したい:", diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 938bdca76b..b4605d4832 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo가 이 파일을 읽었습니다:", "wantsToEdit": "Roo가 이 파일을 편집하고 싶어합니다:", "wantsToEditOutsideWorkspace": "Roo가 워크스페이스 외부의 이 파일을 편집하고 싶어합니다:", - "wantsToCreate": "Roo가 새 파일을 만들고 싶어합니다:" + "wantsToCreate": "Roo가 새 파일을 만들고 싶어합니다:", + "wantsToSearchReplace": "Roo가 이 파일에서 검색 및 바꾸기를 수행하고 싶어합니다:", + "didSearchReplace": "Roo가 이 파일에서 검색 및 바꾸기를 수행했습니다:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo가 이 디렉토리의 최상위 파일을 보고 싶어합니다:", diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 10884b102a..c760200623 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo przeczytał ten plik:", "wantsToEdit": "Roo chce edytować ten plik:", "wantsToEditOutsideWorkspace": "Roo chce edytować ten plik poza obszarem roboczym:", - "wantsToCreate": "Roo chce utworzyć nowy plik:" + "wantsToCreate": "Roo chce utworzyć nowy plik:", + "wantsToSearchReplace": "Roo chce wykonać wyszukiwanie i zamianę w tym pliku:", + "didSearchReplace": "Roo wykonał wyszukiwanie i zamianę w tym pliku:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo chce zobaczyć pliki najwyższego poziomu w tym katalogu:", diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index fe6ef1bdef..883d46d767 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo leu este arquivo:", "wantsToEdit": "Roo quer editar este arquivo:", "wantsToEditOutsideWorkspace": "Roo quer editar este arquivo fora do espaço de trabalho:", - "wantsToCreate": "Roo quer criar um novo arquivo:" + "wantsToCreate": "Roo quer criar um novo arquivo:", + "wantsToSearchReplace": "Roo quer realizar busca e substituição neste arquivo:", + "didSearchReplace": "Roo realizou busca e substituição neste arquivo:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo quer visualizar os arquivos de nível superior neste diretório:", diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 34c5fd2911..63abda020a 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo bu dosyayı okudu:", "wantsToEdit": "Roo bu dosyayı düzenlemek istiyor:", "wantsToEditOutsideWorkspace": "Roo çalışma alanı dışındaki bu dosyayı düzenlemek istiyor:", - "wantsToCreate": "Roo yeni bir dosya oluşturmak istiyor:" + "wantsToCreate": "Roo yeni bir dosya oluşturmak istiyor:", + "wantsToSearchReplace": "Roo bu dosyada arama ve değiştirme yapmak istiyor:", + "didSearchReplace": "Roo bu dosyada arama ve değiştirme yaptı:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo bu dizindeki üst düzey dosyaları görüntülemek istiyor:", diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 3fe66b54ba..9d7f7fb8a6 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo đã đọc tệp này:", "wantsToEdit": "Roo muốn chỉnh sửa tệp này:", "wantsToEditOutsideWorkspace": "Roo muốn chỉnh sửa tệp này bên ngoài không gian làm việc:", - "wantsToCreate": "Roo muốn tạo một tệp mới:" + "wantsToCreate": "Roo muốn tạo một tệp mới:", + "wantsToSearchReplace": "Roo muốn thực hiện tìm kiếm và thay thế trong tệp này:", + "didSearchReplace": "Roo đã thực hiện tìm kiếm và thay thế trong tệp này:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo muốn xem các tệp cấp cao nhất trong thư mục này:", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 3772e10884..7fe8609665 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -120,7 +120,9 @@ "didRead": "已读取文件:", "wantsToEdit": "需要编辑文件:", "wantsToEditOutsideWorkspace": "需要编辑外部文件:", - "wantsToCreate": "需要新建文件:" + "wantsToCreate": "需要新建文件:", + "wantsToSearchReplace": "需要执行搜索和替换:", + "didSearchReplace": "已完成搜索和替换:" }, "directoryOperations": { "wantsToViewTopLevel": "需要查看目录文件列表:", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index d9c745ebf3..c444ff2166 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -120,7 +120,9 @@ "didRead": "Roo 已讀取此檔案:", "wantsToEdit": "Roo 想要編輯此檔案:", "wantsToEditOutsideWorkspace": "Roo 想要編輯此工作區外的檔案:", - "wantsToCreate": "Roo 想要建立新檔案:" + "wantsToCreate": "Roo 想要建立新檔案:", + "wantsToSearchReplace": "Roo 想要在此檔案執行搜尋和取代:", + "didSearchReplace": "Roo 已在此檔案執行搜尋和取代:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo 想要檢視此目錄中最上層的檔案:", From f06567d579cf180d8d9ccefd349f3225e3589605 Mon Sep 17 00:00:00 2001 From: Sam Hoang Van Date: Tue, 22 Apr 2025 03:49:27 +0700 Subject: [PATCH 23/89] Feat/improve insert block content (#2510) * refactor: enhance insertGroups and insertContentTool for better handling of insertion operations * refactor: simplify insert_content tool - Remove operations-based implementation in favor of single line insertion - Update parameters from operations to line and content - Simplify insertion logic and error handling - Update tool description and documentation - Remove XML parsing for operations - Clean up code and improve error messages * refactor: remove insert_content experiment and related tests * Remove the append_to_file tool * Improvements to chat row and instructions --------- Co-authored-by: Matt Rubens --- evals/packages/types/src/roo-code-defaults.ts | 1 - evals/packages/types/src/roo-code.ts | 3 +- src/core/Cline.ts | 6 - src/core/diff/insert-groups.ts | 15 +- .../__snapshots__/system.test.ts.snap | 1945 +++-------------- src/core/prompts/__tests__/system.test.ts | 161 +- src/core/prompts/sections/rules.ts | 20 +- src/core/prompts/tools/append-to-file.ts | 25 - src/core/prompts/tools/index.ts | 3 - src/core/prompts/tools/insert-content.ts | 50 +- .../tools/__tests__/appendToFileTool.test.ts | 330 --- src/core/tools/appendToFileTool.ts | 191 -- src/core/tools/insertContentTool.ts | 66 +- src/exports/roo-code.d.ts | 2 - src/exports/types.ts | 2 - src/schemas/index.ts | 4 +- src/shared/ExtensionMessage.ts | 2 + src/shared/__tests__/experiments.test.ts | 3 - src/shared/__tests__/modes.test.ts | 42 - src/shared/experiments.ts | 2 - src/shared/tools.ts | 6 +- webview-ui/src/components/chat/ChatRow.tsx | 25 + webview-ui/src/components/chat/ChatView.tsx | 9 +- .../__tests__/ExtensionStateContext.test.tsx | 5 +- webview-ui/src/i18n/locales/ca/chat.json | 5 +- webview-ui/src/i18n/locales/de/chat.json | 5 +- webview-ui/src/i18n/locales/en/chat.json | 5 +- webview-ui/src/i18n/locales/es/chat.json | 5 +- webview-ui/src/i18n/locales/fr/chat.json | 5 +- webview-ui/src/i18n/locales/hi/chat.json | 5 +- webview-ui/src/i18n/locales/it/chat.json | 5 +- webview-ui/src/i18n/locales/ja/chat.json | 5 +- webview-ui/src/i18n/locales/ko/chat.json | 5 +- webview-ui/src/i18n/locales/pl/chat.json | 5 +- webview-ui/src/i18n/locales/pt-BR/chat.json | 5 +- webview-ui/src/i18n/locales/tr/chat.json | 5 +- webview-ui/src/i18n/locales/vi/chat.json | 5 +- webview-ui/src/i18n/locales/zh-CN/chat.json | 5 +- webview-ui/src/i18n/locales/zh-TW/chat.json | 5 +- 39 files changed, 486 insertions(+), 2507 deletions(-) delete mode 100644 src/core/prompts/tools/append-to-file.ts delete mode 100644 src/core/tools/__tests__/appendToFileTool.test.ts delete mode 100644 src/core/tools/appendToFileTool.ts diff --git a/evals/packages/types/src/roo-code-defaults.ts b/evals/packages/types/src/roo-code-defaults.ts index 4893487768..ae46786042 100644 --- a/evals/packages/types/src/roo-code-defaults.ts +++ b/evals/packages/types/src/roo-code-defaults.ts @@ -56,7 +56,6 @@ export const rooCodeDefaults: RooCodeSettings = { diffEnabled: true, fuzzyMatchThreshold: 1.0, experiments: { - insert_content: false, powerSteering: false, }, diff --git a/evals/packages/types/src/roo-code.ts b/evals/packages/types/src/roo-code.ts index a6b6240a55..6282df4a57 100644 --- a/evals/packages/types/src/roo-code.ts +++ b/evals/packages/types/src/roo-code.ts @@ -271,7 +271,7 @@ export type CustomSupportPrompts = z.infer * ExperimentId */ -export const experimentIds = ["insert_content", "powerSteering"] as const +export const experimentIds = ["powerSteering"] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -282,7 +282,6 @@ export type ExperimentId = z.infer */ const experimentsSchema = z.object({ - insert_content: z.boolean(), powerSteering: z.boolean(), }) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 451b13aee9..4e5ee7f882 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -78,7 +78,6 @@ import { askFollowupQuestionTool } from "./tools/askFollowupQuestionTool" import { switchModeTool } from "./tools/switchModeTool" import { attemptCompletionTool } from "./tools/attemptCompletionTool" import { newTaskTool } from "./tools/newTaskTool" -import { appendToFileTool } from "./tools/appendToFileTool" // prompts import { formatResponse } from "./prompts/responses" @@ -1242,8 +1241,6 @@ export class Cline extends EventEmitter { return `[${block.name} for '${block.params.task}']` case "write_to_file": return `[${block.name} for '${block.params.path}']` - case "append_to_file": - return `[${block.name} for '${block.params.path}']` case "apply_diff": return `[${block.name} for '${block.params.path}']` case "search_files": @@ -1428,9 +1425,6 @@ export class Cline extends EventEmitter { case "write_to_file": await writeToFileTool(this, block, askApproval, handleError, pushToolResult, removeClosingTag) break - case "append_to_file": - await appendToFileTool(this, block, askApproval, handleError, pushToolResult, removeClosingTag) - break case "apply_diff": await applyDiffTool(this, block, askApproval, handleError, pushToolResult, removeClosingTag) break diff --git a/src/core/diff/insert-groups.ts b/src/core/diff/insert-groups.ts index 805f65892d..5bd7238b06 100644 --- a/src/core/diff/insert-groups.ts +++ b/src/core/diff/insert-groups.ts @@ -1,7 +1,8 @@ /** * Inserts multiple groups of elements at specified indices in an array * @param original Array to insert into, split by lines - * @param insertGroups Array of groups to insert, each with an index and elements to insert + * @param insertGroups Array of groups to insert, each with an index and elements to insert. + * If index is -1, the elements will be appended to the end of the array. * @returns New array with all insertions applied */ export interface InsertGroup { @@ -10,13 +11,14 @@ export interface InsertGroup { } export function insertGroups(original: string[], insertGroups: InsertGroup[]): string[] { - // Sort groups by index to maintain order - insertGroups.sort((a, b) => a.index - b.index) + // Handle groups with index -1 separately and sort remaining groups by index + const appendGroups = insertGroups.filter((group) => group.index === -1) + const normalGroups = insertGroups.filter((group) => group.index !== -1).sort((a, b) => a.index - b.index) let result: string[] = [] let lastIndex = 0 - insertGroups.forEach(({ index, elements }) => { + normalGroups.forEach(({ index, elements }) => { // Add elements from original array up to insertion point result.push(...original.slice(lastIndex, index)) // Add the group of elements @@ -27,5 +29,10 @@ export function insertGroups(original: string[], insertGroups: InsertGroup[]): s // Add remaining elements from original array result.push(...original.slice(lastIndex)) + // Append elements from groups with index -1 at the end + appendGroups.forEach(({ elements }) => { + result.push(...elements) + }) + return result } diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index 5f09015166..3ddf52858d 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -1,1418 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SYSTEM_PROMPT experimental tools should disable experimental tools by default 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. - -==== - -TOOL USE - -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. - -# Tool Use Formatting - -Tool use is formatted using XML-style tags. The tool name is enclosed in opening and closing tags, and each parameter is similarly enclosed within its own set of tags. Here's the structure: - - -value1 -value2 -... - - -For example: - - -src/main.js - - -Always adhere to this format for the tool use to ensure proper parsing and execution. - -# Tools - -## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. -Parameters: -- path: (required) The path of the file to read (relative to the current workspace directory /test/path) -- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. -- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. -Usage: - -File path here -Starting line number (optional) -Ending line number (optional) - - -Examples: - -1. Reading an entire file: - -frontend-config.json - - -2. Reading the first 1000 lines of a large log file: - -logs/application.log -1000 - - -3. Reading lines 500-1000 of a CSV file: - -data/large-dataset.csv -500 -1000 - - -4. Reading a specific function in a source file: - -src/app.ts -46 -68 - - -Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. - -## fetch_instructions -Description: Request to fetch instructions to perform a task -Parameters: -- task: (required) The task to get instructions for. This can take the following values: - create_mcp_server - create_mode - -Example: Requesting instructions to create an MCP Server - - -create_mcp_server - - -## search_files -Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. -Parameters: -- path: (required) The path of the directory to search in (relative to the current workspace directory /test/path). This directory will be recursively searched. -- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax. -- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*). -Usage: - -Directory path here -Your regex pattern here -file pattern here (optional) - - -Example: Requesting to search for all .ts files in the current directory - -. -.* -*.ts - - -## list_files -Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not. -Parameters: -- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path) -- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only. -Usage: - -Directory path here -true or false (optional) - - -Example: Requesting to list all files in the current directory - -. -false - - -## list_code_definition_names -Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture. -Parameters: -- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files. -Usage: - -Directory path here - - -Examples: - -1. List definitions from a specific file: - -src/main.ts - - -2. List definitions from all files in a directory: - -src/ - - -## write_to_file -Description: Request to write full content to a file at the specified path. If the file exists, it will be overwritten with the provided content. If the file doesn't exist, it will be created. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to write to (relative to the current workspace directory /test/path) -- content: (required) The content to write to the file. ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file. -- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing. -Usage: - -File path here - -Your file content here - -total number of lines in the file, including empty lines - - -Example: Requesting to write to frontend-config.json - -frontend-config.json - -{ - "apiEndpoint": "https://api.example.com", - "theme": { - "primaryColor": "#007bff", - "secondaryColor": "#6c757d", - "fontFamily": "Arial, sans-serif" - }, - "features": { - "darkMode": true, - "notifications": true, - "analytics": false - }, - "version": "1.0.0" -} - -14 - - -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - - -Example: Requesting to append to a log file - -logs/app.log - -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry - - - -## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. - -Required Parameters: -- path: The path of the file to modify (relative to the current workspace directory /test/path) -- search: The text or pattern to search for -- replace: The text to replace matches with - -Optional Parameters: -- start_line: Starting line number for restricted replacement (1-based) -- end_line: Ending line number for restricted replacement (1-based) -- use_regex: Set to "true" to treat search as a regex pattern (default: false) -- ignore_case: Set to "true" to ignore case when matching (default: false) - -Notes: -- When use_regex is true, the search parameter is treated as a regular expression pattern -- When ignore_case is true, the search is case-insensitive regardless of regex mode - -Examples: - -1. Simple text replacement: - -example.ts -oldText -newText - - -2. Case-insensitive regex pattern: - -example.ts -oldw+ -new$& -true -true - - -## execute_command -Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. -Parameters: -- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions. -- cwd: (optional) The working directory to execute the command in (default: /test/path) -Usage: - -Your command here -Working directory path (optional) - - -Example: Requesting to execute npm run dev - -npm run dev - - -Example: Requesting to execute ls in a specific directory if directed - -ls -la -/home/user/projects - - -## ask_followup_question -Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. -Parameters: -- question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. -- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: - 1. Be provided in its own tag - 2. Be specific, actionable, and directly related to the completed task - 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. -Usage: - -Your question here - - -Your suggested answer here - - - - -Example: Requesting to ask the user for the path to the frontend-config.json file - -What is the path to the frontend-config.json file? - -./src/frontend-config.json -./config/frontend-config.json -./frontend-config.json - - - -## attempt_completion -Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. Optionally you may provide a CLI command to showcase the result of your work. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again. -IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user that any previous tool uses were successful. Failure to do so will result in code corruption and system failure. Before using this tool, you must ask yourself in tags if you've confirmed from the user that any previous tool uses were successful. If not, then DO NOT use this tool. -Parameters: -- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance. -- command: (optional) A CLI command to execute to show a live demo of the result to the user. For example, use \`open index.html\` to display a created html website, or \`open localhost:3000\` to display a locally running development server. But DO NOT use commands like \`echo\` or \`cat\` that merely print text. This command should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions. -Usage: - - -Your final result description here - -Command to demonstrate result (optional) - - -Example: Requesting to attempt completion with a result and command - - -I've updated the CSS - -open index.html - - -## switch_mode -Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch. -Parameters: -- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect") -- reason: (optional) The reason for switching modes -Usage: - -Mode slug here -Reason for switching here - - -Example: Requesting to switch to code mode - -code -Need to make code changes - - -## new_task -Description: Create a new task with a specified starting mode and initial message. This tool instructs the system to create a new Cline instance in the given mode with the provided message. - -Parameters: -- mode: (required) The slug of the mode to start the new task in (e.g., "code", "ask", "architect"). -- message: (required) The initial user message or instructions for this new task. - -Usage: - -your-mode-slug-here -Your initial instructions here - - -Example: - -code -Implement a new feature for the application. - - - -# Tool Use Guidelines - -1. In tags, assess what information you already have and what information you need to proceed with the task. -2. Choose the most appropriate tool based on the task and the tool descriptions provided. Assess if you need additional information to proceed, and which of the available tools would be most effective for gathering this information. For example using the list_files tool is more effective than running a command like \`ls\` in the terminal. It's critical that you think about each available tool and use the one that best fits the current step in the task. -3. If multiple actions are needed, use one tool at a time per message to accomplish the task iteratively, with each tool use being informed by the result of the previous tool use. Do not assume the outcome of any tool use. Each step must be informed by the previous step's result. -4. Formulate your tool use using the XML format specified for each tool. -5. After each tool use, the user will respond with the result of that tool use. This result will provide you with the necessary information to continue your task or make further decisions. This response may include: - - Information about whether the tool succeeded or failed, along with any reasons for failure. - - Linter errors that may have arisen due to the changes you made, which you'll need to address. - - New terminal output in reaction to the changes, which you may need to consider or act upon. - - Any other relevant feedback or information related to the tool use. -6. ALWAYS wait for user confirmation after each tool use before proceeding. Never assume the success of a tool use without explicit confirmation of the result from the user. - -It is crucial to proceed step-by-step, waiting for the user's message after each tool use before moving forward with the task. This approach allows you to: -1. Confirm the success of each step before proceeding. -2. Address any issues or errors that arise immediately. -3. Adapt your approach based on new information or unexpected results. -4. Ensure that each action builds correctly on the previous ones. - -By waiting for and carefully considering the user's response after each tool use, you can react accordingly and make informed decisions about how to proceed with the task. This iterative process helps ensure the overall success and accuracy of your work. - - - -==== - -CAPABILITIES - -- You have access to tools that let you execute CLI commands on the user's computer, list files, view source code definitions, regex search, read and write files, and ask follow-up questions. These tools help you effectively accomplish a wide range of tasks, such as writing code, making edits or improvements to existing files, understanding the current state of a project, performing system operations, and much more. -- When the user initially gives you a task, a recursive list of all filepaths in the current workspace directory ('/test/path') will be included in environment_details. This provides an overview of the project's file structure, offering key insights into the project from directory/file names (how developers conceptualize and organize their code) and file extensions (the language used). This can also guide decision-making on which files to explore further. If you need to further explore directories such as outside the current workspace directory, you can use the list_files tool. If you pass 'true' for the recursive parameter, it will list files recursively. Otherwise, it will list files at the top level, which is better suited for generic directories where you don't necessarily need the nested structure, like the Desktop. -- You can use search_files to perform regex searches across files in a specified directory, outputting context-rich results that include surrounding lines. This is particularly useful for understanding code patterns, finding specific implementations, or identifying areas that need refactoring. -- You can use the list_code_definition_names tool to get an overview of source code definitions for all files at the top level of a specified directory. This can be particularly useful when you need to understand the broader context and relationships between certain parts of the code. You may need to call this tool multiple times to understand various parts of the codebase related to the task. - - For example, when asked to make edits or improvements you might analyze the file structure in the initial environment_details to get an overview of the project, then use list_code_definition_names to get further insight using source code definitions for files located in relevant directories, then read_file to examine the contents of relevant files, analyze the code and suggest improvements or make necessary edits, then use the write_to_file tool to apply the changes. If you refactored code that could affect other parts of the codebase, you could use search_files to ensure you update other files as needed. -- You can use the execute_command tool to run commands on the user's computer whenever you feel it can help accomplish the user's task. When you need to execute a CLI command, you must provide a clear explanation of what the command does. Prefer to execute complex CLI commands over creating executable scripts, since they are more flexible and easier to run. Interactive and long-running commands are allowed, since the commands are run in the user's VSCode terminal. The user may keep commands running in the background and you will be kept updated on their status along the way. Each command you execute is run in a new terminal instance. - -==== - -MODES - -- Test modes section - -==== - -RULES - -- The project base directory is: /test/path -- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . -- You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. -- Do not use the ~ character or $HOME to refer to the home directory. -- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. -- When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. -- When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. -- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. -- You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. -- When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. -- Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. -- Be sure to consider the type of project (e.g. Python, JavaScript, web application) when determining the appropriate structure and files to include. Also consider what files may be most relevant to accomplishing the task, for example looking at a project's manifest file would help you understand the project's dependencies, which you could incorporate into any code you write. - * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" -- When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. -- Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. -- When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. -- The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. -- Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. -- NEVER end attempt_completion result with a question or request to engage in further conversation! Formulate the end of your result in a way that is final and does not require further input from the user. -- You are STRICTLY FORBIDDEN from starting your messages with "Great", "Certainly", "Okay", "Sure". You should NOT be conversational in your responses, but rather direct and to the point. For example you should NOT say "Great, I've updated the CSS" but instead something like "I've updated the CSS". It is important you be clear and technical in your messages. -- When presented with images, utilize your vision capabilities to thoroughly examine them and extract meaningful information. Incorporate these insights into your thought process as you accomplish the user's task. -- At the end of each user message, you will automatically receive environment_details. This information is not written by the user themselves, but is auto-generated to provide potentially relevant context about the project structure and environment. While this information can be valuable for understanding the project context, do not treat it as a direct part of the user's request or response. Use it to inform your actions and decisions, but don't assume the user is explicitly asking about or referring to this information unless they clearly do so in their message. When using environment_details, explain your actions clearly to ensure the user understands, as they may not be aware of these details. -- Before executing commands, check the "Actively Running Terminals" section in environment_details. If present, consider how these active processes might impact your task. For example, if a local development server is already running, you wouldn't need to start it again. If no active terminals are listed, proceed with command execution as normal. -- MCP operations should be used one at a time, similar to other tool usage. Wait for confirmation of success before proceeding with additional operations. -- It is critical you wait for the user's response after each tool use, in order to confirm the success of the tool use. For example, if asked to make a todo app, you would create a file, wait for the user's response it was created successfully, then create another file if needed, wait for the user's response it was created successfully, etc. - -==== - -SYSTEM INFORMATION - -Operating System: Linux -Default Shell: /bin/zsh -Home Directory: /home/user -Current Workspace Directory: /test/path - -The Current Workspace Directory is the active VS Code project directory, and is therefore the default directory for all tool operations. New terminals will be created in the current workspace directory, however if you change directories in a terminal it will then have a different working directory; changing directories in a terminal does not modify the workspace directory, because you do not have access to change the workspace directory. When the user initially gives you a task, a recursive list of all filepaths in the current workspace directory ('/test/path') will be included in environment_details. This provides an overview of the project's file structure, offering key insights into the project from directory/file names (how developers conceptualize and organize their code) and file extensions (the language used). This can also guide decision-making on which files to explore further. If you need to further explore directories such as outside the current workspace directory, you can use the list_files tool. If you pass 'true' for the recursive parameter, it will list files recursively. Otherwise, it will list files at the top level, which is better suited for generic directories where you don't necessarily need the nested structure, like the Desktop. - -==== - -OBJECTIVE - -You accomplish a given task iteratively, breaking it down into clear steps and working through them methodically. - -1. Analyze the user's task and set clear, achievable goals to accomplish it. Prioritize these goals in a logical order. -2. Work through these goals sequentially, utilizing available tools one at a time as necessary. Each goal should correspond to a distinct step in your problem-solving process. You will be informed on the work completed and what's remaining as you go. -3. Remember, you have extensive capabilities with access to a wide range of tools that can be used in powerful and clever ways as necessary to accomplish each goal. Before calling a tool, do some analysis within tags. First, analyze the file structure provided in environment_details to gain context and insights for proceeding effectively. Then, think about which of the provided tools is the most relevant tool to accomplish the user's task. Next, go through each of the required parameters of the relevant tool and determine if the user has directly provided or given enough information to infer a value. When deciding if the parameter can be inferred, carefully consider all the context to see if it supports a specific value. If all of the required parameters are present or can be reasonably inferred, close the thinking tag and proceed with the tool use. BUT, if one of the values for a required parameter is missing, DO NOT invoke the tool (not even with fillers for the missing params) and instead, ask the user to provide the missing parameters using the ask_followup_question tool. DO NOT ask for more information on optional parameters if it is not provided. -4. Once you've completed the user's task, you must use the attempt_completion tool to present the result of the task to the user. You may also provide a CLI command to showcase the result of your task; this can be particularly useful for web development tasks, where you can run e.g. \`open index.html\` to show the website you've built. -5. The user may provide feedback, which you can use to make improvements and try again. But DO NOT continue in pointless back and forth conversations, i.e. don't end your responses with questions or offers for further assistance. - - -==== - -USER'S CUSTOM INSTRUCTIONS - -The following additional instructions are provided by the user, and should be followed to the best of your ability without interfering with the TOOL USE guidelines. - -Language Preference: -You should always speak and think in the "en" language. - -Rules: -# Rules from .clinerules-code: -Mock mode-specific rules -# Rules from .clinerules: -Mock generic rules" -`; - -exports[`SYSTEM_PROMPT experimental tools should enable experimental tools when explicitly enabled 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. - -==== - -TOOL USE - -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. - -# Tool Use Formatting - -Tool use is formatted using XML-style tags. The tool name is enclosed in opening and closing tags, and each parameter is similarly enclosed within its own set of tags. Here's the structure: - - -value1 -value2 -... - - -For example: - - -src/main.js - - -Always adhere to this format for the tool use to ensure proper parsing and execution. - -# Tools - -## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. -Parameters: -- path: (required) The path of the file to read (relative to the current workspace directory /test/path) -- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. -- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. -Usage: - -File path here -Starting line number (optional) -Ending line number (optional) - - -Examples: - -1. Reading an entire file: - -frontend-config.json - - -2. Reading the first 1000 lines of a large log file: - -logs/application.log -1000 - - -3. Reading lines 500-1000 of a CSV file: - -data/large-dataset.csv -500 -1000 - - -4. Reading a specific function in a source file: - -src/app.ts -46 -68 - - -Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. - -## fetch_instructions -Description: Request to fetch instructions to perform a task -Parameters: -- task: (required) The task to get instructions for. This can take the following values: - create_mcp_server - create_mode - -Example: Requesting instructions to create an MCP Server - - -create_mcp_server - - -## search_files -Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. -Parameters: -- path: (required) The path of the directory to search in (relative to the current workspace directory /test/path). This directory will be recursively searched. -- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax. -- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*). -Usage: - -Directory path here -Your regex pattern here -file pattern here (optional) - - -Example: Requesting to search for all .ts files in the current directory - -. -.* -*.ts - - -## list_files -Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not. -Parameters: -- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path) -- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only. -Usage: - -Directory path here -true or false (optional) - - -Example: Requesting to list all files in the current directory - -. -false - - -## list_code_definition_names -Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture. -Parameters: -- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files. -Usage: - -Directory path here - - -Examples: - -1. List definitions from a specific file: - -src/main.ts - - -2. List definitions from all files in a directory: - -src/ - - -## write_to_file -Description: Request to write full content to a file at the specified path. If the file exists, it will be overwritten with the provided content. If the file doesn't exist, it will be created. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to write to (relative to the current workspace directory /test/path) -- content: (required) The content to write to the file. ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file. -- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing. -Usage: - -File path here - -Your file content here - -total number of lines in the file, including empty lines - - -Example: Requesting to write to frontend-config.json - -frontend-config.json - -{ - "apiEndpoint": "https://api.example.com", - "theme": { - "primaryColor": "#007bff", - "secondaryColor": "#6c757d", - "fontFamily": "Arial, sans-serif" - }, - "features": { - "darkMode": true, - "notifications": true, - "analytics": false - }, - "version": "1.0.0" -} - -14 - - -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - - -Example: Requesting to append to a log file - -logs/app.log - -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry - - - -## insert_content -Description: Inserts content at specific line positions in a file. This is the primary tool for adding new content and code (functions/methods/classes, imports, attributes etc.) as it allows for precise insertions without overwriting existing content. The tool uses an efficient line-based insertion system that maintains file integrity and proper ordering of multiple insertions. Beware to use the proper indentation. This tool is the preferred way to add new content and code to files. -Parameters: -- path: (required) The path of the file to insert content into (relative to the current workspace directory /test/path) -- operations: (required) A JSON array of insertion operations. Each operation is an object with: - * start_line: (required) The line number where the content should be inserted. The content currently at that line will end up below the inserted content. - * content: (required) The content to insert at the specified position. IMPORTANT NOTE: If the content is a single line, it can be a string. If it's a multi-line content, it should be a string with newline characters ( -) for line breaks. Make sure to include the correct indentation for the content. -Usage: - -File path here -[ - { - "start_line": 10, - "content": "Your content here" - } -] - -Example: Insert a new function and its import statement - -File path here -[ - { - "start_line": 1, - "content": "import { sum } from './utils';" - }, - { - "start_line": 10, - "content": "function calculateTotal(items: number[]): number { - return items.reduce((sum, item) => sum + item, 0); -}" - } -] - - -## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. - -Required Parameters: -- path: The path of the file to modify (relative to the current workspace directory /test/path) -- search: The text or pattern to search for -- replace: The text to replace matches with - -Optional Parameters: -- start_line: Starting line number for restricted replacement (1-based) -- end_line: Ending line number for restricted replacement (1-based) -- use_regex: Set to "true" to treat search as a regex pattern (default: false) -- ignore_case: Set to "true" to ignore case when matching (default: false) - -Notes: -- When use_regex is true, the search parameter is treated as a regular expression pattern -- When ignore_case is true, the search is case-insensitive regardless of regex mode - -Examples: - -1. Simple text replacement: - -example.ts -oldText -newText - - -2. Case-insensitive regex pattern: - -example.ts -oldw+ -new$& -true -true - - -## execute_command -Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. -Parameters: -- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions. -- cwd: (optional) The working directory to execute the command in (default: /test/path) -Usage: - -Your command here -Working directory path (optional) - - -Example: Requesting to execute npm run dev - -npm run dev - - -Example: Requesting to execute ls in a specific directory if directed - -ls -la -/home/user/projects - - -## ask_followup_question -Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. -Parameters: -- question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. -- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: - 1. Be provided in its own tag - 2. Be specific, actionable, and directly related to the completed task - 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. -Usage: - -Your question here - - -Your suggested answer here - - - - -Example: Requesting to ask the user for the path to the frontend-config.json file - -What is the path to the frontend-config.json file? - -./src/frontend-config.json -./config/frontend-config.json -./frontend-config.json - - - -## attempt_completion -Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. Optionally you may provide a CLI command to showcase the result of your work. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again. -IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user that any previous tool uses were successful. Failure to do so will result in code corruption and system failure. Before using this tool, you must ask yourself in tags if you've confirmed from the user that any previous tool uses were successful. If not, then DO NOT use this tool. -Parameters: -- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance. -- command: (optional) A CLI command to execute to show a live demo of the result to the user. For example, use \`open index.html\` to display a created html website, or \`open localhost:3000\` to display a locally running development server. But DO NOT use commands like \`echo\` or \`cat\` that merely print text. This command should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions. -Usage: - - -Your final result description here - -Command to demonstrate result (optional) - - -Example: Requesting to attempt completion with a result and command - - -I've updated the CSS - -open index.html - - -## switch_mode -Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch. -Parameters: -- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect") -- reason: (optional) The reason for switching modes -Usage: - -Mode slug here -Reason for switching here - - -Example: Requesting to switch to code mode - -code -Need to make code changes - - -## new_task -Description: Create a new task with a specified starting mode and initial message. This tool instructs the system to create a new Cline instance in the given mode with the provided message. - -Parameters: -- mode: (required) The slug of the mode to start the new task in (e.g., "code", "ask", "architect"). -- message: (required) The initial user message or instructions for this new task. - -Usage: - -your-mode-slug-here -Your initial instructions here - - -Example: - -code -Implement a new feature for the application. - - - -# Tool Use Guidelines - -1. In tags, assess what information you already have and what information you need to proceed with the task. -2. Choose the most appropriate tool based on the task and the tool descriptions provided. Assess if you need additional information to proceed, and which of the available tools would be most effective for gathering this information. For example using the list_files tool is more effective than running a command like \`ls\` in the terminal. It's critical that you think about each available tool and use the one that best fits the current step in the task. -3. If multiple actions are needed, use one tool at a time per message to accomplish the task iteratively, with each tool use being informed by the result of the previous tool use. Do not assume the outcome of any tool use. Each step must be informed by the previous step's result. -4. Formulate your tool use using the XML format specified for each tool. -5. After each tool use, the user will respond with the result of that tool use. This result will provide you with the necessary information to continue your task or make further decisions. This response may include: - - Information about whether the tool succeeded or failed, along with any reasons for failure. - - Linter errors that may have arisen due to the changes you made, which you'll need to address. - - New terminal output in reaction to the changes, which you may need to consider or act upon. - - Any other relevant feedback or information related to the tool use. -6. ALWAYS wait for user confirmation after each tool use before proceeding. Never assume the success of a tool use without explicit confirmation of the result from the user. - -It is crucial to proceed step-by-step, waiting for the user's message after each tool use before moving forward with the task. This approach allows you to: -1. Confirm the success of each step before proceeding. -2. Address any issues or errors that arise immediately. -3. Adapt your approach based on new information or unexpected results. -4. Ensure that each action builds correctly on the previous ones. - -By waiting for and carefully considering the user's response after each tool use, you can react accordingly and make informed decisions about how to proceed with the task. This iterative process helps ensure the overall success and accuracy of your work. - - - -==== - -CAPABILITIES - -- You have access to tools that let you execute CLI commands on the user's computer, list files, view source code definitions, regex search, read and write files, and ask follow-up questions. These tools help you effectively accomplish a wide range of tasks, such as writing code, making edits or improvements to existing files, understanding the current state of a project, performing system operations, and much more. -- When the user initially gives you a task, a recursive list of all filepaths in the current workspace directory ('/test/path') will be included in environment_details. This provides an overview of the project's file structure, offering key insights into the project from directory/file names (how developers conceptualize and organize their code) and file extensions (the language used). This can also guide decision-making on which files to explore further. If you need to further explore directories such as outside the current workspace directory, you can use the list_files tool. If you pass 'true' for the recursive parameter, it will list files recursively. Otherwise, it will list files at the top level, which is better suited for generic directories where you don't necessarily need the nested structure, like the Desktop. -- You can use search_files to perform regex searches across files in a specified directory, outputting context-rich results that include surrounding lines. This is particularly useful for understanding code patterns, finding specific implementations, or identifying areas that need refactoring. -- You can use the list_code_definition_names tool to get an overview of source code definitions for all files at the top level of a specified directory. This can be particularly useful when you need to understand the broader context and relationships between certain parts of the code. You may need to call this tool multiple times to understand various parts of the codebase related to the task. - - For example, when asked to make edits or improvements you might analyze the file structure in the initial environment_details to get an overview of the project, then use list_code_definition_names to get further insight using source code definitions for files located in relevant directories, then read_file to examine the contents of relevant files, analyze the code and suggest improvements or make necessary edits, then use the write_to_file tool to apply the changes. If you refactored code that could affect other parts of the codebase, you could use search_files to ensure you update other files as needed. -- You can use the execute_command tool to run commands on the user's computer whenever you feel it can help accomplish the user's task. When you need to execute a CLI command, you must provide a clear explanation of what the command does. Prefer to execute complex CLI commands over creating executable scripts, since they are more flexible and easier to run. Interactive and long-running commands are allowed, since the commands are run in the user's VSCode terminal. The user may keep commands running in the background and you will be kept updated on their status along the way. Each command you execute is run in a new terminal instance. - -==== - -MODES - -- Test modes section - -==== - -RULES - -- The project base directory is: /test/path -- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . -- You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. -- Do not use the ~ character or $HOME to refer to the home directory. -- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. -- When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. -- When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. -- The insert_content tool adds lines of text to files, such as adding a new function to a JavaScript file or inserting a new route in a Python file. This tool will insert it at the specified line location. It can support multiple operations at once. -- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. -- You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. -- When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. -- Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. -- Be sure to consider the type of project (e.g. Python, JavaScript, web application) when determining the appropriate structure and files to include. Also consider what files may be most relevant to accomplishing the task, for example looking at a project's manifest file would help you understand the project's dependencies, which you could incorporate into any code you write. - * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" -- When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. -- Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. -- When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. -- The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. -- Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. -- NEVER end attempt_completion result with a question or request to engage in further conversation! Formulate the end of your result in a way that is final and does not require further input from the user. -- You are STRICTLY FORBIDDEN from starting your messages with "Great", "Certainly", "Okay", "Sure". You should NOT be conversational in your responses, but rather direct and to the point. For example you should NOT say "Great, I've updated the CSS" but instead something like "I've updated the CSS". It is important you be clear and technical in your messages. -- When presented with images, utilize your vision capabilities to thoroughly examine them and extract meaningful information. Incorporate these insights into your thought process as you accomplish the user's task. -- At the end of each user message, you will automatically receive environment_details. This information is not written by the user themselves, but is auto-generated to provide potentially relevant context about the project structure and environment. While this information can be valuable for understanding the project context, do not treat it as a direct part of the user's request or response. Use it to inform your actions and decisions, but don't assume the user is explicitly asking about or referring to this information unless they clearly do so in their message. When using environment_details, explain your actions clearly to ensure the user understands, as they may not be aware of these details. -- Before executing commands, check the "Actively Running Terminals" section in environment_details. If present, consider how these active processes might impact your task. For example, if a local development server is already running, you wouldn't need to start it again. If no active terminals are listed, proceed with command execution as normal. -- MCP operations should be used one at a time, similar to other tool usage. Wait for confirmation of success before proceeding with additional operations. -- It is critical you wait for the user's response after each tool use, in order to confirm the success of the tool use. For example, if asked to make a todo app, you would create a file, wait for the user's response it was created successfully, then create another file if needed, wait for the user's response it was created successfully, etc. - -==== - -SYSTEM INFORMATION - -Operating System: Linux -Default Shell: /bin/zsh -Home Directory: /home/user -Current Workspace Directory: /test/path - -The Current Workspace Directory is the active VS Code project directory, and is therefore the default directory for all tool operations. New terminals will be created in the current workspace directory, however if you change directories in a terminal it will then have a different working directory; changing directories in a terminal does not modify the workspace directory, because you do not have access to change the workspace directory. When the user initially gives you a task, a recursive list of all filepaths in the current workspace directory ('/test/path') will be included in environment_details. This provides an overview of the project's file structure, offering key insights into the project from directory/file names (how developers conceptualize and organize their code) and file extensions (the language used). This can also guide decision-making on which files to explore further. If you need to further explore directories such as outside the current workspace directory, you can use the list_files tool. If you pass 'true' for the recursive parameter, it will list files recursively. Otherwise, it will list files at the top level, which is better suited for generic directories where you don't necessarily need the nested structure, like the Desktop. - -==== - -OBJECTIVE - -You accomplish a given task iteratively, breaking it down into clear steps and working through them methodically. - -1. Analyze the user's task and set clear, achievable goals to accomplish it. Prioritize these goals in a logical order. -2. Work through these goals sequentially, utilizing available tools one at a time as necessary. Each goal should correspond to a distinct step in your problem-solving process. You will be informed on the work completed and what's remaining as you go. -3. Remember, you have extensive capabilities with access to a wide range of tools that can be used in powerful and clever ways as necessary to accomplish each goal. Before calling a tool, do some analysis within tags. First, analyze the file structure provided in environment_details to gain context and insights for proceeding effectively. Then, think about which of the provided tools is the most relevant tool to accomplish the user's task. Next, go through each of the required parameters of the relevant tool and determine if the user has directly provided or given enough information to infer a value. When deciding if the parameter can be inferred, carefully consider all the context to see if it supports a specific value. If all of the required parameters are present or can be reasonably inferred, close the thinking tag and proceed with the tool use. BUT, if one of the values for a required parameter is missing, DO NOT invoke the tool (not even with fillers for the missing params) and instead, ask the user to provide the missing parameters using the ask_followup_question tool. DO NOT ask for more information on optional parameters if it is not provided. -4. Once you've completed the user's task, you must use the attempt_completion tool to present the result of the task to the user. You may also provide a CLI command to showcase the result of your task; this can be particularly useful for web development tasks, where you can run e.g. \`open index.html\` to show the website you've built. -5. The user may provide feedback, which you can use to make improvements and try again. But DO NOT continue in pointless back and forth conversations, i.e. don't end your responses with questions or offers for further assistance. - - -==== - -USER'S CUSTOM INSTRUCTIONS - -The following additional instructions are provided by the user, and should be followed to the best of your ability without interfering with the TOOL USE guidelines. - -Language Preference: -You should always speak and think in the "en" language. - -Rules: -# Rules from .clinerules-code: -Mock mode-specific rules -# Rules from .clinerules: -Mock generic rules" -`; - -exports[`SYSTEM_PROMPT experimental tools should selectively enable experimental tools 1`] = ` -"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. - -==== - -TOOL USE - -You have access to a set of tools that are executed upon the user's approval. You can use one tool per message, and will receive the result of that tool use in the user's response. You use tools step-by-step to accomplish a given task, with each tool use informed by the result of the previous tool use. - -# Tool Use Formatting - -Tool use is formatted using XML-style tags. The tool name is enclosed in opening and closing tags, and each parameter is similarly enclosed within its own set of tags. Here's the structure: - - -value1 -value2 -... - - -For example: - - -src/main.js - - -Always adhere to this format for the tool use to ensure proper parsing and execution. - -# Tools - -## read_file -Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. The output includes line numbers prefixed to each line (e.g. "1 | const x = 1"), making it easier to reference specific lines when creating diffs or discussing code. By specifying start_line and end_line parameters, you can efficiently read specific portions of large files without loading the entire file into memory. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string. -Parameters: -- path: (required) The path of the file to read (relative to the current workspace directory /test/path) -- start_line: (optional) The starting line number to read from (1-based). If not provided, it starts from the beginning of the file. -- end_line: (optional) The ending line number to read to (1-based, inclusive). If not provided, it reads to the end of the file. -Usage: - -File path here -Starting line number (optional) -Ending line number (optional) - - -Examples: - -1. Reading an entire file: - -frontend-config.json - - -2. Reading the first 1000 lines of a large log file: - -logs/application.log -1000 - - -3. Reading lines 500-1000 of a CSV file: - -data/large-dataset.csv -500 -1000 - - -4. Reading a specific function in a source file: - -src/app.ts -46 -68 - - -Note: When both start_line and end_line are provided, this tool efficiently streams only the requested lines, making it suitable for processing large files like logs, CSV files, and other large datasets without memory issues. - -## fetch_instructions -Description: Request to fetch instructions to perform a task -Parameters: -- task: (required) The task to get instructions for. This can take the following values: - create_mcp_server - create_mode - -Example: Requesting instructions to create an MCP Server - - -create_mcp_server - - -## search_files -Description: Request to perform a regex search across files in a specified directory, providing context-rich results. This tool searches for patterns or specific content across multiple files, displaying each match with encapsulating context. -Parameters: -- path: (required) The path of the directory to search in (relative to the current workspace directory /test/path). This directory will be recursively searched. -- regex: (required) The regular expression pattern to search for. Uses Rust regex syntax. -- file_pattern: (optional) Glob pattern to filter files (e.g., '*.ts' for TypeScript files). If not provided, it will search all files (*). -Usage: - -Directory path here -Your regex pattern here -file pattern here (optional) - - -Example: Requesting to search for all .ts files in the current directory - -. -.* -*.ts - - -## list_files -Description: Request to list files and directories within the specified directory. If recursive is true, it will list all files and directories recursively. If recursive is false or not provided, it will only list the top-level contents. Do not use this tool to confirm the existence of files you may have created, as the user will let you know if the files were created successfully or not. -Parameters: -- path: (required) The path of the directory to list contents for (relative to the current workspace directory /test/path) -- recursive: (optional) Whether to list files recursively. Use true for recursive listing, false or omit for top-level only. -Usage: - -Directory path here -true or false (optional) - - -Example: Requesting to list all files in the current directory - -. -false - - -## list_code_definition_names -Description: Request to list definition names (classes, functions, methods, etc.) from source code. This tool can analyze either a single file or all files at the top level of a specified directory. It provides insights into the codebase structure and important constructs, encapsulating high-level concepts and relationships that are crucial for understanding the overall architecture. -Parameters: -- path: (required) The path of the file or directory (relative to the current working directory /test/path) to analyze. When given a directory, it lists definitions from all top-level source files. -Usage: - -Directory path here - - -Examples: - -1. List definitions from a specific file: - -src/main.ts - - -2. List definitions from all files in a directory: - -src/ - - -## write_to_file -Description: Request to write full content to a file at the specified path. If the file exists, it will be overwritten with the provided content. If the file doesn't exist, it will be created. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to write to (relative to the current workspace directory /test/path) -- content: (required) The content to write to the file. ALWAYS provide the COMPLETE intended content of the file, without any truncation or omissions. You MUST include ALL parts of the file, even if they haven't been modified. Do NOT include the line numbers in the content though, just the actual content of the file. -- line_count: (required) The number of lines in the file. Make sure to compute this based on the actual content of the file, not the number of lines in the content you're providing. -Usage: - -File path here - -Your file content here - -total number of lines in the file, including empty lines - - -Example: Requesting to write to frontend-config.json - -frontend-config.json - -{ - "apiEndpoint": "https://api.example.com", - "theme": { - "primaryColor": "#007bff", - "secondaryColor": "#6c757d", - "fontFamily": "Arial, sans-serif" - }, - "features": { - "darkMode": true, - "notifications": true, - "analytics": false - }, - "version": "1.0.0" -} - -14 - - -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - - -Example: Requesting to append to a log file - -logs/app.log - -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry - - - -## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. - -Required Parameters: -- path: The path of the file to modify (relative to the current workspace directory /test/path) -- search: The text or pattern to search for -- replace: The text to replace matches with - -Optional Parameters: -- start_line: Starting line number for restricted replacement (1-based) -- end_line: Ending line number for restricted replacement (1-based) -- use_regex: Set to "true" to treat search as a regex pattern (default: false) -- ignore_case: Set to "true" to ignore case when matching (default: false) - -Notes: -- When use_regex is true, the search parameter is treated as a regular expression pattern -- When ignore_case is true, the search is case-insensitive regardless of regex mode - -Examples: - -1. Simple text replacement: - -example.ts -oldText -newText - - -2. Case-insensitive regex pattern: - -example.ts -oldw+ -new$& -true -true - - -## execute_command -Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. -Parameters: -- command: (required) The CLI command to execute. This should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions. -- cwd: (optional) The working directory to execute the command in (default: /test/path) -Usage: - -Your command here -Working directory path (optional) - - -Example: Requesting to execute npm run dev - -npm run dev - - -Example: Requesting to execute ls in a specific directory if directed - -ls -la -/home/user/projects - - -## ask_followup_question -Description: Ask the user a question to gather additional information needed to complete the task. This tool should be used when you encounter ambiguities, need clarification, or require more details to proceed effectively. It allows for interactive problem-solving by enabling direct communication with the user. Use this tool judiciously to maintain a balance between gathering necessary information and avoiding excessive back-and-forth. -Parameters: -- question: (required) The question to ask the user. This should be a clear, specific question that addresses the information you need. -- follow_up: (required) A list of 2-4 suggested answers that logically follow from the question, ordered by priority or logical sequence. Each suggestion must: - 1. Be provided in its own tag - 2. Be specific, actionable, and directly related to the completed task - 3. Be a complete answer to the question - the user should not need to provide additional information or fill in any missing details. DO NOT include placeholders with brackets or parentheses. -Usage: - -Your question here - - -Your suggested answer here - - - - -Example: Requesting to ask the user for the path to the frontend-config.json file - -What is the path to the frontend-config.json file? - -./src/frontend-config.json -./config/frontend-config.json -./frontend-config.json - - - -## attempt_completion -Description: After each tool use, the user will respond with the result of that tool use, i.e. if it succeeded or failed, along with any reasons for failure. Once you've received the results of tool uses and can confirm that the task is complete, use this tool to present the result of your work to the user. Optionally you may provide a CLI command to showcase the result of your work. The user may respond with feedback if they are not satisfied with the result, which you can use to make improvements and try again. -IMPORTANT NOTE: This tool CANNOT be used until you've confirmed from the user that any previous tool uses were successful. Failure to do so will result in code corruption and system failure. Before using this tool, you must ask yourself in tags if you've confirmed from the user that any previous tool uses were successful. If not, then DO NOT use this tool. -Parameters: -- result: (required) The result of the task. Formulate this result in a way that is final and does not require further input from the user. Don't end your result with questions or offers for further assistance. -- command: (optional) A CLI command to execute to show a live demo of the result to the user. For example, use \`open index.html\` to display a created html website, or \`open localhost:3000\` to display a locally running development server. But DO NOT use commands like \`echo\` or \`cat\` that merely print text. This command should be valid for the current operating system. Ensure the command is properly formatted and does not contain any harmful instructions. -Usage: - - -Your final result description here - -Command to demonstrate result (optional) - - -Example: Requesting to attempt completion with a result and command - - -I've updated the CSS - -open index.html - - -## switch_mode -Description: Request to switch to a different mode. This tool allows modes to request switching to another mode when needed, such as switching to Code mode to make code changes. The user must approve the mode switch. -Parameters: -- mode_slug: (required) The slug of the mode to switch to (e.g., "code", "ask", "architect") -- reason: (optional) The reason for switching modes -Usage: - -Mode slug here -Reason for switching here - - -Example: Requesting to switch to code mode - -code -Need to make code changes - - -## new_task -Description: Create a new task with a specified starting mode and initial message. This tool instructs the system to create a new Cline instance in the given mode with the provided message. - -Parameters: -- mode: (required) The slug of the mode to start the new task in (e.g., "code", "ask", "architect"). -- message: (required) The initial user message or instructions for this new task. - -Usage: - -your-mode-slug-here -Your initial instructions here - - -Example: - -code -Implement a new feature for the application. - - - -# Tool Use Guidelines - -1. In tags, assess what information you already have and what information you need to proceed with the task. -2. Choose the most appropriate tool based on the task and the tool descriptions provided. Assess if you need additional information to proceed, and which of the available tools would be most effective for gathering this information. For example using the list_files tool is more effective than running a command like \`ls\` in the terminal. It's critical that you think about each available tool and use the one that best fits the current step in the task. -3. If multiple actions are needed, use one tool at a time per message to accomplish the task iteratively, with each tool use being informed by the result of the previous tool use. Do not assume the outcome of any tool use. Each step must be informed by the previous step's result. -4. Formulate your tool use using the XML format specified for each tool. -5. After each tool use, the user will respond with the result of that tool use. This result will provide you with the necessary information to continue your task or make further decisions. This response may include: - - Information about whether the tool succeeded or failed, along with any reasons for failure. - - Linter errors that may have arisen due to the changes you made, which you'll need to address. - - New terminal output in reaction to the changes, which you may need to consider or act upon. - - Any other relevant feedback or information related to the tool use. -6. ALWAYS wait for user confirmation after each tool use before proceeding. Never assume the success of a tool use without explicit confirmation of the result from the user. - -It is crucial to proceed step-by-step, waiting for the user's message after each tool use before moving forward with the task. This approach allows you to: -1. Confirm the success of each step before proceeding. -2. Address any issues or errors that arise immediately. -3. Adapt your approach based on new information or unexpected results. -4. Ensure that each action builds correctly on the previous ones. - -By waiting for and carefully considering the user's response after each tool use, you can react accordingly and make informed decisions about how to proceed with the task. This iterative process helps ensure the overall success and accuracy of your work. - - - -==== - -CAPABILITIES - -- You have access to tools that let you execute CLI commands on the user's computer, list files, view source code definitions, regex search, read and write files, and ask follow-up questions. These tools help you effectively accomplish a wide range of tasks, such as writing code, making edits or improvements to existing files, understanding the current state of a project, performing system operations, and much more. -- When the user initially gives you a task, a recursive list of all filepaths in the current workspace directory ('/test/path') will be included in environment_details. This provides an overview of the project's file structure, offering key insights into the project from directory/file names (how developers conceptualize and organize their code) and file extensions (the language used). This can also guide decision-making on which files to explore further. If you need to further explore directories such as outside the current workspace directory, you can use the list_files tool. If you pass 'true' for the recursive parameter, it will list files recursively. Otherwise, it will list files at the top level, which is better suited for generic directories where you don't necessarily need the nested structure, like the Desktop. -- You can use search_files to perform regex searches across files in a specified directory, outputting context-rich results that include surrounding lines. This is particularly useful for understanding code patterns, finding specific implementations, or identifying areas that need refactoring. -- You can use the list_code_definition_names tool to get an overview of source code definitions for all files at the top level of a specified directory. This can be particularly useful when you need to understand the broader context and relationships between certain parts of the code. You may need to call this tool multiple times to understand various parts of the codebase related to the task. - - For example, when asked to make edits or improvements you might analyze the file structure in the initial environment_details to get an overview of the project, then use list_code_definition_names to get further insight using source code definitions for files located in relevant directories, then read_file to examine the contents of relevant files, analyze the code and suggest improvements or make necessary edits, then use the write_to_file tool to apply the changes. If you refactored code that could affect other parts of the codebase, you could use search_files to ensure you update other files as needed. -- You can use the execute_command tool to run commands on the user's computer whenever you feel it can help accomplish the user's task. When you need to execute a CLI command, you must provide a clear explanation of what the command does. Prefer to execute complex CLI commands over creating executable scripts, since they are more flexible and easier to run. Interactive and long-running commands are allowed, since the commands are run in the user's VSCode terminal. The user may keep commands running in the background and you will be kept updated on their status along the way. Each command you execute is run in a new terminal instance. - -==== - -MODES - -- Test modes section - -==== - -RULES - -- The project base directory is: /test/path -- All file paths must be relative to this directory. However, commands may change directories in terminals, so respect working directory specified by the response to . -- You cannot \`cd\` into a different directory to complete a task. You are stuck operating from '/test/path', so be sure to pass in the correct 'path' parameter when using tools that require a path. -- Do not use the ~ character or $HOME to refer to the home directory. -- Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. -- When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. -- When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. -- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. -- You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. -- When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. -- Some modes have restrictions on which files they can edit. If you attempt to edit a restricted file, the operation will be rejected with a FileRestrictionError that will specify which file patterns are allowed for the current mode. -- Be sure to consider the type of project (e.g. Python, JavaScript, web application) when determining the appropriate structure and files to include. Also consider what files may be most relevant to accomplishing the task, for example looking at a project's manifest file would help you understand the project's dependencies, which you could incorporate into any code you write. - * For example, in architect mode trying to edit app.js would be rejected because architect mode can only edit files matching "\\.md$" -- When making changes to code, always consider the context in which the code is being used. Ensure that your changes are compatible with the existing codebase and that they follow the project's coding standards and best practices. -- Do not ask for more information than necessary. Use the tools provided to accomplish the user's request efficiently and effectively. When you've completed your task, you must use the attempt_completion tool to present the result to the user. The user may provide feedback, which you can use to make improvements and try again. -- You are only allowed to ask the user questions using the ask_followup_question tool. Use this tool only when you need additional details to complete a task, and be sure to use a clear and concise question that will help you move forward with the task. When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing. The suggestions should be specific, actionable, and directly related to the completed task. They should be ordered by priority or logical sequence. However if you can use the available tools to avoid having to ask the user questions, you should do so. For example, if the user mentions a file that may be in an outside directory like the Desktop, you should use the list_files tool to list the files in the Desktop and check if the file they are talking about is there, rather than asking the user to provide the file path themselves. -- When executing commands, if you don't see the expected output, assume the terminal executed the command successfully and proceed with the task. The user's terminal may be unable to stream the output back properly. If you absolutely need to see the actual terminal output, use the ask_followup_question tool to request the user to copy and paste it back to you. -- The user may provide a file's contents directly in their message, in which case you shouldn't use the read_file tool to get the file contents again since you already have it. -- Your goal is to try to accomplish the user's task, NOT engage in a back and forth conversation. -- NEVER end attempt_completion result with a question or request to engage in further conversation! Formulate the end of your result in a way that is final and does not require further input from the user. -- You are STRICTLY FORBIDDEN from starting your messages with "Great", "Certainly", "Okay", "Sure". You should NOT be conversational in your responses, but rather direct and to the point. For example you should NOT say "Great, I've updated the CSS" but instead something like "I've updated the CSS". It is important you be clear and technical in your messages. -- When presented with images, utilize your vision capabilities to thoroughly examine them and extract meaningful information. Incorporate these insights into your thought process as you accomplish the user's task. -- At the end of each user message, you will automatically receive environment_details. This information is not written by the user themselves, but is auto-generated to provide potentially relevant context about the project structure and environment. While this information can be valuable for understanding the project context, do not treat it as a direct part of the user's request or response. Use it to inform your actions and decisions, but don't assume the user is explicitly asking about or referring to this information unless they clearly do so in their message. When using environment_details, explain your actions clearly to ensure the user understands, as they may not be aware of these details. -- Before executing commands, check the "Actively Running Terminals" section in environment_details. If present, consider how these active processes might impact your task. For example, if a local development server is already running, you wouldn't need to start it again. If no active terminals are listed, proceed with command execution as normal. -- MCP operations should be used one at a time, similar to other tool usage. Wait for confirmation of success before proceeding with additional operations. -- It is critical you wait for the user's response after each tool use, in order to confirm the success of the tool use. For example, if asked to make a todo app, you would create a file, wait for the user's response it was created successfully, then create another file if needed, wait for the user's response it was created successfully, etc. - -==== - -SYSTEM INFORMATION - -Operating System: Linux -Default Shell: /bin/zsh -Home Directory: /home/user -Current Workspace Directory: /test/path - -The Current Workspace Directory is the active VS Code project directory, and is therefore the default directory for all tool operations. New terminals will be created in the current workspace directory, however if you change directories in a terminal it will then have a different working directory; changing directories in a terminal does not modify the workspace directory, because you do not have access to change the workspace directory. When the user initially gives you a task, a recursive list of all filepaths in the current workspace directory ('/test/path') will be included in environment_details. This provides an overview of the project's file structure, offering key insights into the project from directory/file names (how developers conceptualize and organize their code) and file extensions (the language used). This can also guide decision-making on which files to explore further. If you need to further explore directories such as outside the current workspace directory, you can use the list_files tool. If you pass 'true' for the recursive parameter, it will list files recursively. Otherwise, it will list files at the top level, which is better suited for generic directories where you don't necessarily need the nested structure, like the Desktop. - -==== - -OBJECTIVE - -You accomplish a given task iteratively, breaking it down into clear steps and working through them methodically. - -1. Analyze the user's task and set clear, achievable goals to accomplish it. Prioritize these goals in a logical order. -2. Work through these goals sequentially, utilizing available tools one at a time as necessary. Each goal should correspond to a distinct step in your problem-solving process. You will be informed on the work completed and what's remaining as you go. -3. Remember, you have extensive capabilities with access to a wide range of tools that can be used in powerful and clever ways as necessary to accomplish each goal. Before calling a tool, do some analysis within tags. First, analyze the file structure provided in environment_details to gain context and insights for proceeding effectively. Then, think about which of the provided tools is the most relevant tool to accomplish the user's task. Next, go through each of the required parameters of the relevant tool and determine if the user has directly provided or given enough information to infer a value. When deciding if the parameter can be inferred, carefully consider all the context to see if it supports a specific value. If all of the required parameters are present or can be reasonably inferred, close the thinking tag and proceed with the tool use. BUT, if one of the values for a required parameter is missing, DO NOT invoke the tool (not even with fillers for the missing params) and instead, ask the user to provide the missing parameters using the ask_followup_question tool. DO NOT ask for more information on optional parameters if it is not provided. -4. Once you've completed the user's task, you must use the attempt_completion tool to present the result of the task to the user. You may also provide a CLI command to showcase the result of your task; this can be particularly useful for web development tasks, where you can run e.g. \`open index.html\` to show the website you've built. -5. The user may provide feedback, which you can use to make improvements and try again. But DO NOT continue in pointless back and forth conversations, i.e. don't end your responses with questions or offers for further assistance. - - -==== - -USER'S CUSTOM INSTRUCTIONS - -The following additional instructions are provided by the user, and should be followed to the best of your ability without interfering with the TOOL USE guidelines. - -Language Preference: -You should always speak and think in the "en" language. - -Rules: -# Rules from .clinerules-code: -Mock mode-specific rules -# Rules from .clinerules: -Mock generic rules" -`; - exports[`SYSTEM_PROMPT should exclude diff strategy tool description when diffEnabled is false 1`] = ` "You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. @@ -1592,27 +179,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -1810,8 +405,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -2051,27 +646,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -2269,8 +872,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -2510,27 +1113,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -2728,8 +1339,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -2969,27 +1580,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -3242,8 +1861,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -3484,27 +2103,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -3770,8 +2397,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -4011,27 +2638,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -4284,8 +2919,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -4616,27 +3251,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -4834,8 +3477,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using apply_diff or write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: apply_diff (for replacing lines in existing files), write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: apply_diff (for replacing lines in existing files), write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -5075,27 +3718,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -5293,8 +3944,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -5576,27 +4227,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -5856,8 +4515,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -6112,27 +4771,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -6308,8 +4975,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -6663,8 +5330,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. @@ -6937,27 +5604,35 @@ Example: Requesting to write to frontend-config.json 14 -## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - +## insert_content +Description: Insert new content at a specific line position in a file. -Example: Requesting to append to a log file - -logs/app.log +Parameters: +- path: (required) File path relative to workspace directory /test/path +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: + +src/utils.ts +1 -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry +// Add imports at start of file +import { sum } from './math'; - + + +Example for appending to the end of file: + +src/utils.ts +0 + +// This is the end of the file + + + ## search_and_replace Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. @@ -7223,8 +5898,8 @@ RULES - Before using the execute_command tool, you must first think about the SYSTEM INFORMATION context provided to understand the user's environment and tailor your commands to ensure they are compatible with their system. You must also consider if the command you need to run should be executed in a specific directory outside of the current working directory '/test/path', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '/test/path'). For example, if you needed to run \`npm install\` in a project outside of '/test/path', you would need to prepend with a \`cd\` i.e. pseudocode for this would be \`cd (path to project) && (command, in this case npm install)\`. - When using the search_files tool, craft your regex patterns carefully to balance specificity and flexibility. Based on the user's task you may use it to find code patterns, TODO comments, function definitions, or any text-based information across the project. The results include context, so analyze the surrounding code to better understand the matches. Leverage the search_files tool in combination with other tools for more comprehensive analysis. For example, use it to find specific code patterns, then use read_file to examine the full context of interesting matches before using write_to_file to make informed changes. - When creating a new project (such as an app, website, or any software project), organize all new files within a dedicated project directory unless the user specifies otherwise. Use appropriate file paths when writing files, as the write_to_file tool will automatically create any necessary directories. Structure the project logically, adhering to best practices for the specific type of project being created. Unless otherwise specified, new projects should be easily run without additional setup, for example most projects can be built in HTML, CSS, and JavaScript - which you can open in a browser. -- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), append_to_file (for appending content to the end of files), search_and_replace (for finding and replacing individual pieces of text). -- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file. +- For editing files, you have access to these tools: write_to_file (for creating new files or complete file rewrites), insert_content (for adding lines to existing files), search_and_replace (for finding and replacing individual pieces of text). +- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line. - The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once. - You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files. - When using the write_to_file tool to modify a file, use the tool directly with the desired content. You do not need to display the content before using the tool. ALWAYS provide the COMPLETE file content in your response. This is NON-NEGOTIABLE. Partial updates or placeholders like '// rest of code unchanged' are STRICTLY FORBIDDEN. You MUST include ALL parts of the file, even if they haven't been modified. Failure to do so will result in incomplete or broken code, severely impacting the user's project. diff --git a/src/core/prompts/__tests__/system.test.ts b/src/core/prompts/__tests__/system.test.ts index 494439c190..d0dda37e2d 100644 --- a/src/core/prompts/__tests__/system.test.ts +++ b/src/core/prompts/__tests__/system.test.ts @@ -170,9 +170,7 @@ describe("SYSTEM_PROMPT", () => { beforeEach(() => { // Reset experiments before each test to ensure they're disabled by default - experiments = { - [EXPERIMENT_IDS.INSERT_BLOCK]: false, - } + experiments = {} }) beforeEach(() => { @@ -477,163 +475,6 @@ describe("SYSTEM_PROMPT", () => { expect(prompt.indexOf(modes[0].roleDefinition)).toBeLessThan(prompt.indexOf("TOOL USE")) }) - describe("experimental tools", () => { - it("should disable experimental tools by default", async () => { - // Set experiments to explicitly disable experimental tools - const experimentsConfig = { - [EXPERIMENT_IDS.INSERT_BLOCK]: false, - } - - // Reset experiments - experiments = experimentsConfig - - const prompt = await SYSTEM_PROMPT( - mockContext, - "/test/path", - false, // supportsComputerUse - undefined, // mcpHub - undefined, // diffStrategy - undefined, // browserViewportSize - defaultModeSlug, // mode - undefined, // customModePrompts - undefined, // customModes - undefined, // globalCustomInstructions - undefined, // diffEnabled - experimentsConfig, // Explicitly disable experimental tools - true, // enableMcpServerCreation - ) - - // Check that experimental tool sections are not included - const toolSections = prompt.split("\n## ").slice(1) - const toolNames = toolSections.map((section) => section.split("\n")[0].trim()) - expect(toolNames).not.toContain("insert_content") - expect(prompt).toMatchSnapshot() - }) - - it("should enable experimental tools when explicitly enabled", async () => { - // Set experiments for testing experimental features - const experimentsEnabled = { - [EXPERIMENT_IDS.INSERT_BLOCK]: true, - } - - // Reset default experiments - experiments = undefined - - const prompt = await SYSTEM_PROMPT( - mockContext, - "/test/path", - false, // supportsComputerUse - undefined, // mcpHub - undefined, // diffStrategy - undefined, // browserViewportSize - defaultModeSlug, // mode - undefined, // customModePrompts - undefined, // customModes - undefined, // globalCustomInstructions - undefined, // diffEnabled - experimentsEnabled, // Use the enabled experiments - true, // enableMcpServerCreation - ) - - // Get all tool sections - const toolSections = prompt.split("## ").slice(1) // Split by section headers and remove first non-tool part - const toolNames = toolSections.map((section) => section.split("\n")[0].trim()) - - // Verify experimental tools are included in the prompt when enabled - expect(toolNames).toContain("insert_content") - expect(prompt).toMatchSnapshot() - }) - - it("should selectively enable experimental tools", async () => { - // Set experiments for testing selective enabling - const experimentsSelective = { - [EXPERIMENT_IDS.INSERT_BLOCK]: false, - } - - // Reset default experiments - experiments = undefined - - const prompt = await SYSTEM_PROMPT( - mockContext, - "/test/path", - false, // supportsComputerUse - undefined, // mcpHub - undefined, // diffStrategy - undefined, // browserViewportSize - defaultModeSlug, // mode - undefined, // customModePrompts - undefined, // customModes - undefined, // globalCustomInstructions - undefined, // diffEnabled - experimentsSelective, // Use the selective experiments - true, // enableMcpServerCreation - ) - - // Get all tool sections - const toolSections = prompt.split("## ").slice(1) // Split by section headers and remove first non-tool part - const toolNames = toolSections.map((section) => section.split("\n")[0].trim()) - - // Verify only enabled experimental tools are included - expect(toolNames).not.toContain("insert_content") - expect(prompt).toMatchSnapshot() - }) - - it("should list all available editing tools in base instruction", async () => { - const experiments = { - [EXPERIMENT_IDS.INSERT_BLOCK]: true, - } - - const prompt = await SYSTEM_PROMPT( - mockContext, - "/test/path", - false, - undefined, - new MultiSearchReplaceDiffStrategy(), - undefined, - defaultModeSlug, - undefined, - undefined, - undefined, - true, // diffEnabled - experiments, // experiments - true, // enableMcpServerCreation - ) - - // Verify base instruction lists all available tools - expect(prompt).toContain("apply_diff (for replacing lines in existing files)") - expect(prompt).toContain("write_to_file (for creating new files or complete file rewrites)") - expect(prompt).toContain("insert_content (for adding lines to existing files)") - expect(prompt).toContain("search_and_replace (for finding and replacing individual pieces of text)") - }) - it("should provide detailed instructions for each enabled tool", async () => { - const experiments = { - [EXPERIMENT_IDS.INSERT_BLOCK]: true, - } - - const prompt = await SYSTEM_PROMPT( - mockContext, - "/test/path", - false, - undefined, - new MultiSearchReplaceDiffStrategy(), - undefined, - defaultModeSlug, - undefined, - undefined, - undefined, - true, // diffEnabled - experiments, - true, // enableMcpServerCreation - ) - - // Verify detailed instructions for each tool - expect(prompt).toContain( - "You should always prefer using other editing tools over write_to_file when making changes to existing files since write_to_file is much slower and cannot handle large files.", - ) - expect(prompt).toContain("The insert_content tool adds lines of text to files") - }) - }) - afterAll(() => { jest.restoreAllMocks() }) diff --git a/src/core/prompts/sections/rules.ts b/src/core/prompts/sections/rules.ts index d379897063..f7a6855889 100644 --- a/src/core/prompts/sections/rules.ts +++ b/src/core/prompts/sections/rules.ts @@ -14,28 +14,18 @@ function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Recor availableTools.push("write_to_file (for creating new files or complete file rewrites)") } - availableTools.push("append_to_file (for appending content to the end of files)") - - if (experiments?.["insert_content"]) { - availableTools.push("insert_content (for adding lines to existing files)") - } - + availableTools.push("insert_content (for adding lines to existing files)") availableTools.push("search_and_replace (for finding and replacing individual pieces of text)") // Base editing instruction mentioning all available tools if (availableTools.length > 1) { - instructions.push( - `- For editing files, you have access to these tools: ${availableTools.join(", ")}.`, - "- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file.", - ) + instructions.push(`- For editing files, you have access to these tools: ${availableTools.join(", ")}.`) } // Additional details for experimental features - if (experiments?.["insert_content"]) { - instructions.push( - "- The insert_content tool adds lines of text to files, such as adding a new function to a JavaScript file or inserting a new route in a Python file. This tool will insert it at the specified line location. It can support multiple operations at once.", - ) - } + instructions.push( + "- The insert_content tool adds lines of text to files at a specific line number, such as adding a new function to a JavaScript file or inserting a new route in a Python file. Use line number 0 to append at the end of the file, or any positive number to insert before that line.", + ) instructions.push( "- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once.", diff --git a/src/core/prompts/tools/append-to-file.ts b/src/core/prompts/tools/append-to-file.ts deleted file mode 100644 index ae24c83dc9..0000000000 --- a/src/core/prompts/tools/append-to-file.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ToolArgs } from "./types" - -export function getAppendToFileDescription(args: ToolArgs): string { - return `## append_to_file -Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. -Parameters: -- path: (required) The path of the file to append to (relative to the current workspace directory ${args.cwd}) -- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. -Usage: - -File path here - -Your content to append here - - - -Example: Requesting to append to a log file - -logs/app.log - -[2024-04-17 15:20:30] New log entry -[2024-04-17 15:20:31] Another log entry - -` -} diff --git a/src/core/prompts/tools/index.ts b/src/core/prompts/tools/index.ts index bd285ff3c8..d3e75d7b09 100644 --- a/src/core/prompts/tools/index.ts +++ b/src/core/prompts/tools/index.ts @@ -8,7 +8,6 @@ import { getExecuteCommandDescription } from "./execute-command" import { getReadFileDescription } from "./read-file" import { getFetchInstructionsDescription } from "./fetch-instructions" import { getWriteToFileDescription } from "./write-to-file" -import { getAppendToFileDescription } from "./append-to-file" import { getSearchFilesDescription } from "./search-files" import { getListFilesDescription } from "./list-files" import { getInsertContentDescription } from "./insert-content" @@ -28,7 +27,6 @@ const toolDescriptionMap: Record string | undefined> read_file: (args) => getReadFileDescription(args), fetch_instructions: () => getFetchInstructionsDescription(), write_to_file: (args) => getWriteToFileDescription(args), - append_to_file: (args) => getAppendToFileDescription(args), search_files: (args) => getSearchFilesDescription(args), list_files: (args) => getListFilesDescription(args), list_code_definition_names: (args) => getListCodeDefinitionNamesDescription(args), @@ -113,7 +111,6 @@ export { getReadFileDescription, getFetchInstructionsDescription, getWriteToFileDescription, - getAppendToFileDescription, getSearchFilesDescription, getListFilesDescription, getListCodeDefinitionNamesDescription, diff --git a/src/core/prompts/tools/insert-content.ts b/src/core/prompts/tools/insert-content.ts index c586c8ba90..27d97fab51 100644 --- a/src/core/prompts/tools/insert-content.ts +++ b/src/core/prompts/tools/insert-content.ts @@ -2,34 +2,32 @@ import { ToolArgs } from "./types" export function getInsertContentDescription(args: ToolArgs): string { return `## insert_content -Description: Inserts content at specific line positions in a file. This is the primary tool for adding new content and code (functions/methods/classes, imports, attributes etc.) as it allows for precise insertions without overwriting existing content. The tool uses an efficient line-based insertion system that maintains file integrity and proper ordering of multiple insertions. Beware to use the proper indentation. This tool is the preferred way to add new content and code to files. +Description: Insert new content at a specific line position in a file. + Parameters: -- path: (required) The path of the file to insert content into (relative to the current workspace directory ${args.cwd.toPosix()}) -- operations: (required) A JSON array of insertion operations. Each operation is an object with: - * start_line: (required) The line number where the content should be inserted. The content currently at that line will end up below the inserted content. - * content: (required) The content to insert at the specified position. IMPORTANT NOTE: If the content is a single line, it can be a string. If it's a multi-line content, it should be a string with newline characters (\n) for line breaks. Make sure to include the correct indentation for the content. -Usage: +- path: (required) File path relative to workspace directory ${args.cwd.toPosix()} +- line: (required) Line number where content will be inserted (1-based) + Use 0 to append at end of file + Use any positive number to insert before that line +- content: (required) The content to insert at the specified line + +Example for inserting imports at start of file: -File path here -[ - { - "start_line": 10, - "content": "Your content here" - } -] +src/utils.ts +1 + +// Add imports at start of file +import { sum } from './math'; + -Example: Insert a new function and its import statement + +Example for appending to the end of file: -File path here -[ - { - "start_line": 1, - "content": "import { sum } from './utils';" - }, - { - "start_line": 10, - "content": "function calculateTotal(items: number[]): number {\n return items.reduce((sum, item) => sum + item, 0);\n}" - } -] -` +src/utils.ts +0 + +// This is the end of the file + + +` } diff --git a/src/core/tools/__tests__/appendToFileTool.test.ts b/src/core/tools/__tests__/appendToFileTool.test.ts deleted file mode 100644 index b16921abdb..0000000000 --- a/src/core/tools/__tests__/appendToFileTool.test.ts +++ /dev/null @@ -1,330 +0,0 @@ -// npx jest src/core/tools/__tests__/appendToFileTool.test.ts - -import { describe, expect, it, jest, beforeEach } from "@jest/globals" - -import { appendToFileTool } from "../appendToFileTool" -import { Cline } from "../../Cline" -import { formatResponse } from "../../prompts/responses" -import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../../shared/tools" -import { ClineAsk } from "../../../shared/ExtensionMessage" -import { FileContextTracker } from "../../context-tracking/FileContextTracker" -import { DiffViewProvider } from "../../../integrations/editor/DiffViewProvider" -import { RooIgnoreController } from "../../ignore/RooIgnoreController" - -// Mock dependencies -jest.mock("../../Cline") -jest.mock("../../prompts/responses") -jest.mock("delay") - -describe("appendToFileTool", () => { - // Setup common test variables - let mockCline: jest.Mocked> & { - consecutiveMistakeCount: number - didEditFile: boolean - cwd: string - } - let mockAskApproval: jest.Mock - let mockHandleError: jest.Mock - let mockPushToolResult: jest.Mock - let mockRemoveClosingTag: jest.Mock - let mockToolUse: ToolUse - let mockDiffViewProvider: jest.Mocked> - let mockFileContextTracker: jest.Mocked> - - beforeEach(() => { - // Reset mocks - jest.clearAllMocks() - - mockDiffViewProvider = { - editType: undefined, - isEditing: false, - originalContent: "", - open: jest.fn().mockReturnValue(Promise.resolve()), - update: jest.fn().mockReturnValue(Promise.resolve()), - reset: jest.fn().mockReturnValue(Promise.resolve()), - revertChanges: jest.fn().mockReturnValue(Promise.resolve()), - saveChanges: jest.fn().mockReturnValue( - Promise.resolve({ - newProblemsMessage: "", - userEdits: undefined, - finalContent: "", - }), - ), - scrollToFirstDiff: jest.fn(), - createdDirs: [], - documentWasOpen: false, - streamedLines: [], - preDiagnostics: [], - postDiagnostics: [], - isEditorOpen: false, - hasChanges: false, - } as unknown as jest.Mocked - - mockFileContextTracker = { - trackFileContext: jest.fn().mockReturnValue(Promise.resolve()), - } as unknown as jest.Mocked - - // Create mock implementations - const mockClineBase = { - ask: jest.fn().mockReturnValue( - Promise.resolve({ - response: { type: "text" as ClineAsk }, - text: "", - }), - ), - say: jest.fn().mockReturnValue(Promise.resolve()), - sayAndCreateMissingParamError: jest.fn().mockReturnValue(Promise.resolve("Missing parameter error")), - consecutiveMistakeCount: 0, - didEditFile: false, - cwd: "/test/path", - diffViewProvider: mockDiffViewProvider, - getFileContextTracker: jest.fn().mockReturnValue(mockFileContextTracker), - rooIgnoreController: { - validateAccess: jest.fn().mockReturnValue(true), - } as unknown as RooIgnoreController, - api: { - getModel: jest.fn().mockReturnValue({ - id: "gpt-4", - info: { - contextWindow: 8000, - supportsPromptCache: true, - maxTokens: null, - supportsImages: false, - supportsComputerUse: true, - supportsFunctionCalling: true, - supportsVision: false, - isMultiModal: false, - isChatBased: true, - isCompletionBased: false, - cachableFields: [], - }, - }), - createMessage: jest.fn(), - countTokens: jest.fn(), - }, - } - - // Create a properly typed mock - mockCline = { - ...mockClineBase, - consecutiveMistakeCount: 0, - didEditFile: false, - cwd: "/test/path", - } as unknown as jest.Mocked> & { - consecutiveMistakeCount: number - didEditFile: boolean - cwd: string - } - - mockAskApproval = jest.fn().mockReturnValue(Promise.resolve(true)) - mockHandleError = jest.fn().mockReturnValue(Promise.resolve()) - mockPushToolResult = jest.fn() - mockRemoveClosingTag = jest.fn().mockImplementation((tag, value) => value) - - // Create a mock tool use object - mockToolUse = { - type: "tool_use", - name: "append_to_file", - params: { - path: "test.txt", - content: "test content", - }, - partial: false, - } - }) - - describe("Basic functionality", () => { - it("should append content to a new file", async () => { - // Setup - mockDiffViewProvider.editType = "create" - - // Execute - await appendToFileTool( - mockCline as unknown as Cline, - mockToolUse, - mockAskApproval as unknown as AskApproval, - mockHandleError as unknown as HandleError, - mockPushToolResult as unknown as PushToolResult, - mockRemoveClosingTag as unknown as RemoveClosingTag, - ) - - // Verify - expect(mockDiffViewProvider.open).toHaveBeenCalledWith("test.txt") - expect(mockDiffViewProvider.update).toHaveBeenCalledWith("test content", true) - expect(mockAskApproval).toHaveBeenCalled() - expect(mockFileContextTracker.trackFileContext).toHaveBeenCalledWith("test.txt", "roo_edited") - expect(mockCline.didEditFile).toBe(true) - }) - - it("should append content to an existing file", async () => { - // Setup - mockDiffViewProvider.editType = "modify" - mockDiffViewProvider.originalContent = "existing content" - - // Execute - await appendToFileTool( - mockCline as unknown as Cline, - mockToolUse, - mockAskApproval as unknown as AskApproval, - mockHandleError as unknown as HandleError, - mockPushToolResult as unknown as PushToolResult, - mockRemoveClosingTag as unknown as RemoveClosingTag, - ) - - // Verify - expect(mockDiffViewProvider.open).toHaveBeenCalledWith("test.txt") - expect(mockDiffViewProvider.update).toHaveBeenCalledWith("existing content\ntest content", true) - // The tool adds its own newline between existing and new content - expect(mockAskApproval).toHaveBeenCalled() - expect(mockFileContextTracker.trackFileContext).toHaveBeenCalledWith("test.txt", "roo_edited") - }) - }) - - describe("Content preprocessing", () => { - it("should remove code block markers", async () => { - // Setup - mockToolUse.params.content = "```\ntest content\n```" - - // Execute - await appendToFileTool( - mockCline as unknown as Cline, - mockToolUse, - mockAskApproval as unknown as AskApproval, - mockHandleError as unknown as HandleError, - mockPushToolResult as unknown as PushToolResult, - mockRemoveClosingTag as unknown as RemoveClosingTag, - ) - - // Verify - expect(mockDiffViewProvider.update).toHaveBeenCalledWith("test content", true) - }) - - it("should unescape HTML entities for non-Claude models", async () => { - // Setup - mockToolUse.params.content = "test & content" - - // Execute - await appendToFileTool( - mockCline as unknown as Cline, - mockToolUse, - mockAskApproval as unknown as AskApproval, - mockHandleError as unknown as HandleError, - mockPushToolResult as unknown as PushToolResult, - mockRemoveClosingTag as unknown as RemoveClosingTag, - ) - - // Verify - expect(mockDiffViewProvider.update).toHaveBeenCalledWith("test & content", true) - }) - }) - - describe("Error handling", () => { - it("should handle missing path parameter", async () => { - // Setup - mockToolUse.params.path = undefined - - // Execute - await appendToFileTool( - mockCline as unknown as Cline, - mockToolUse, - mockAskApproval as unknown as AskApproval, - mockHandleError as unknown as HandleError, - mockPushToolResult as unknown as PushToolResult, - mockRemoveClosingTag as unknown as RemoveClosingTag, - ) - - // Verify - expect(mockCline.consecutiveMistakeCount).toBe(0) - expect(mockDiffViewProvider.open).not.toHaveBeenCalled() - }) - - it("should handle missing content parameter", async () => { - // Setup - mockToolUse.params.content = undefined - - // Execute - await appendToFileTool( - mockCline as unknown as Cline, - mockToolUse, - mockAskApproval as unknown as AskApproval, - mockHandleError as unknown as HandleError, - mockPushToolResult as unknown as PushToolResult, - mockRemoveClosingTag as unknown as RemoveClosingTag, - ) - - // Verify - expect(mockCline.consecutiveMistakeCount).toBe(0) - expect(mockDiffViewProvider.open).not.toHaveBeenCalled() - }) - - it("should handle rooignore validation failures", async () => { - // Setup - const validateAccessMock = jest.fn().mockReturnValue(false) as jest.MockedFunction< - (filePath: string) => boolean - > - mockCline.rooIgnoreController = { - validateAccess: validateAccessMock, - } as unknown as RooIgnoreController - const mockRooIgnoreError = "RooIgnore error" - ;(formatResponse.rooIgnoreError as jest.Mock).mockReturnValue(mockRooIgnoreError) - ;(formatResponse.toolError as jest.Mock).mockReturnValue("Tool error") - - // Execute - await appendToFileTool( - mockCline as unknown as Cline, - mockToolUse, - mockAskApproval as unknown as AskApproval, - mockHandleError as unknown as HandleError, - mockPushToolResult as unknown as PushToolResult, - mockRemoveClosingTag as unknown as RemoveClosingTag, - ) - - // Verify - expect(mockCline.say).toHaveBeenCalledWith("rooignore_error", "test.txt") - expect(formatResponse.rooIgnoreError).toHaveBeenCalledWith("test.txt") - expect(mockPushToolResult).toHaveBeenCalled() - expect(mockDiffViewProvider.open).not.toHaveBeenCalled() - }) - - it("should handle user rejection", async () => { - // Setup - mockAskApproval.mockReturnValue(Promise.resolve(false)) - - // Execute - await appendToFileTool( - mockCline as unknown as Cline, - mockToolUse, - mockAskApproval as unknown as AskApproval, - mockHandleError as unknown as HandleError, - mockPushToolResult as unknown as PushToolResult, - mockRemoveClosingTag as unknown as RemoveClosingTag, - ) - - // Verify - expect(mockDiffViewProvider.revertChanges).toHaveBeenCalled() - expect(mockFileContextTracker.trackFileContext).not.toHaveBeenCalled() - }) - }) - - describe("Partial updates", () => { - it("should handle partial updates", async () => { - // Setup - mockToolUse.partial = true - - // Execute - await appendToFileTool( - mockCline as unknown as Cline, - mockToolUse, - mockAskApproval as unknown as AskApproval, - mockHandleError as unknown as HandleError, - mockPushToolResult as unknown as PushToolResult, - mockRemoveClosingTag as unknown as RemoveClosingTag, - ) - - // Verify - expect(mockCline.ask).toHaveBeenCalledWith("tool", expect.any(String), true) - expect(mockDiffViewProvider.update).toHaveBeenCalledWith("test content", false) - expect(mockAskApproval).not.toHaveBeenCalled() - }) - }) -}) diff --git a/src/core/tools/appendToFileTool.ts b/src/core/tools/appendToFileTool.ts deleted file mode 100644 index d50834665f..0000000000 --- a/src/core/tools/appendToFileTool.ts +++ /dev/null @@ -1,191 +0,0 @@ -import path from "path" -import delay from "delay" - -import { Cline } from "../Cline" -import { ClineSayTool } from "../../shared/ExtensionMessage" -import { formatResponse } from "../prompts/responses" -import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" -import { RecordSource } from "../context-tracking/FileContextTrackerTypes" -import { fileExistsAtPath } from "../../utils/fs" -import { addLineNumbers, stripLineNumbers } from "../../integrations/misc/extract-text" -import { getReadablePath } from "../../utils/path" -import { isPathOutsideWorkspace } from "../../utils/pathUtils" -import { everyLineHasLineNumbers } from "../../integrations/misc/extract-text" -import { unescapeHtmlEntities } from "../../utils/text-normalization" - -export async function appendToFileTool( - cline: Cline, - block: ToolUse, - askApproval: AskApproval, - handleError: HandleError, - pushToolResult: PushToolResult, - removeClosingTag: RemoveClosingTag, -) { - const relPath: string | undefined = block.params.path - let newContent: string | undefined = block.params.content - - if (!relPath || !newContent) { - return - } - - const accessAllowed = cline.rooIgnoreController?.validateAccess(relPath) - - if (!accessAllowed) { - await cline.say("rooignore_error", relPath) - pushToolResult(formatResponse.toolError(formatResponse.rooIgnoreError(relPath))) - return - } - - // Check if file exists using cached map or fs.access - let fileExists: boolean - if (cline.diffViewProvider.editType !== undefined) { - fileExists = cline.diffViewProvider.editType === "modify" - } else { - const absolutePath = path.resolve(cline.cwd, relPath) - fileExists = await fileExistsAtPath(absolutePath) - cline.diffViewProvider.editType = fileExists ? "modify" : "create" - } - - // pre-processing newContent for cases where weaker models might add artifacts - if (newContent.startsWith("```")) { - newContent = newContent.split("\n").slice(1).join("\n").trim() - } - - if (newContent.endsWith("```")) { - newContent = newContent.split("\n").slice(0, -1).join("\n").trim() - } - - if (!cline.api.getModel().id.includes("claude")) { - newContent = unescapeHtmlEntities(newContent) - } - - // Determine if the path is outside the workspace - const fullPath = relPath ? path.resolve(cline.cwd, removeClosingTag("path", relPath)) : "" - const isOutsideWorkspace = isPathOutsideWorkspace(fullPath) - - const sharedMessageProps: ClineSayTool = { - tool: fileExists ? "appliedDiff" : "newFileCreated", - path: getReadablePath(cline.cwd, removeClosingTag("path", relPath)), - isOutsideWorkspace, - } - - try { - if (block.partial) { - // Update GUI message - const partialMessage = JSON.stringify(sharedMessageProps) - await cline.ask("tool", partialMessage, block.partial).catch(() => {}) - - // Update editor - if (!cline.diffViewProvider.isEditing) { - await cline.diffViewProvider.open(relPath) - } - - // If file exists, append newContent to existing content - if (fileExists && cline.diffViewProvider.originalContent) { - newContent = cline.diffViewProvider.originalContent + "\n" + newContent - } - - // Editor is open, stream content in - await cline.diffViewProvider.update( - everyLineHasLineNumbers(newContent) ? stripLineNumbers(newContent) : newContent, - false, - ) - - return - } else { - if (!relPath) { - cline.consecutiveMistakeCount++ - cline.recordToolError("append_to_file") - pushToolResult(await cline.sayAndCreateMissingParamError("append_to_file", "path")) - await cline.diffViewProvider.reset() - return - } - - if (!newContent) { - cline.consecutiveMistakeCount++ - cline.recordToolError("append_to_file") - pushToolResult(await cline.sayAndCreateMissingParamError("append_to_file", "content")) - await cline.diffViewProvider.reset() - return - } - - cline.consecutiveMistakeCount = 0 - - if (!cline.diffViewProvider.isEditing) { - const partialMessage = JSON.stringify(sharedMessageProps) - await cline.ask("tool", partialMessage, true).catch(() => {}) - await cline.diffViewProvider.open(relPath) - } - - // If file exists, append newContent to existing content - if (fileExists && cline.diffViewProvider.originalContent) { - newContent = cline.diffViewProvider.originalContent + "\n" + newContent - } - - await cline.diffViewProvider.update( - everyLineHasLineNumbers(newContent) ? stripLineNumbers(newContent) : newContent, - true, - ) - await delay(300) // wait for diff view to update - cline.diffViewProvider.scrollToFirstDiff() - - const completeMessage = JSON.stringify({ - ...sharedMessageProps, - content: fileExists ? undefined : newContent, - diff: fileExists - ? formatResponse.createPrettyPatch(relPath, cline.diffViewProvider.originalContent, newContent) - : undefined, - } satisfies ClineSayTool) - - const didApprove = await askApproval("tool", completeMessage) - - if (!didApprove) { - await cline.diffViewProvider.revertChanges() - return - } - - const { newProblemsMessage, userEdits, finalContent } = await cline.diffViewProvider.saveChanges() - - // Track file edit operation - if (relPath) { - await cline.getFileContextTracker().trackFileContext(relPath, "roo_edited" as RecordSource) - } - - cline.didEditFile = true - - if (userEdits) { - await cline.say( - "user_feedback_diff", - JSON.stringify({ - tool: fileExists ? "appliedDiff" : "newFileCreated", - path: getReadablePath(cline.cwd, relPath), - diff: userEdits, - } satisfies ClineSayTool), - ) - - pushToolResult( - `The user made the following updates to your content:\n\n${userEdits}\n\n` + - `The updated content, which includes both your original modifications and the user's edits, has been successfully saved to ${relPath.toPosix()}. Here is the full, updated content of the file, including line numbers:\n\n` + - `\n${addLineNumbers( - finalContent || "", - )}\n\n\n` + - `Please note:\n` + - `1. You do not need to re-write the file with these changes, as they have already been applied.\n` + - `2. Proceed with the task using this updated file content as the new baseline.\n` + - `3. If the user's edits have addressed part of the task or changed the requirements, adjust your approach accordingly.` + - `${newProblemsMessage}`, - ) - } else { - pushToolResult(`The content was successfully appended to ${relPath.toPosix()}.${newProblemsMessage}`) - } - - await cline.diffViewProvider.reset() - - return - } - } catch (error) { - await handleError("appending to file", error) - await cline.diffViewProvider.reset() - return - } -} diff --git a/src/core/tools/insertContentTool.ts b/src/core/tools/insertContentTool.ts index d43e4a72ca..8e6c5fc89e 100644 --- a/src/core/tools/insertContentTool.ts +++ b/src/core/tools/insertContentTool.ts @@ -1,12 +1,12 @@ import delay from "delay" import fs from "fs/promises" +import path from "path" import { getReadablePath } from "../../utils/path" import { Cline } from "../Cline" import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { formatResponse } from "../prompts/responses" import { ClineSayTool } from "../../shared/ExtensionMessage" -import path from "path" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" import { fileExistsAtPath } from "../../utils/fs" import { insertGroups } from "../diff/insert-groups" @@ -20,11 +20,13 @@ export async function insertContentTool( removeClosingTag: RemoveClosingTag, ) { const relPath: string | undefined = block.params.path - const operations: string | undefined = block.params.operations + const line: string | undefined = block.params.line + const content: string | undefined = block.params.content const sharedMessageProps: ClineSayTool = { - tool: "appliedDiff", + tool: "insertContent", path: getReadablePath(cline.cwd, removeClosingTag("path", relPath)), + lineNumber: line ? parseInt(line, 10) : undefined, } try { @@ -42,10 +44,17 @@ export async function insertContentTool( return } - if (!operations) { + if (!line) { cline.consecutiveMistakeCount++ cline.recordToolError("insert_content") - pushToolResult(await cline.sayAndCreateMissingParamError("insert_content", "operations")) + pushToolResult(await cline.sayAndCreateMissingParamError("insert_content", "line")) + return + } + + if (!content) { + cline.consecutiveMistakeCount++ + cline.recordToolError("insert_content") + pushToolResult(await cline.sayAndCreateMissingParamError("insert_content", "content")) return } @@ -61,21 +70,11 @@ export async function insertContentTool( return } - let parsedOperations: Array<{ - start_line: number - content: string - }> - - try { - parsedOperations = JSON.parse(operations) - if (!Array.isArray(parsedOperations)) { - throw new Error("Operations must be an array") - } - } catch (error) { + const lineNumber = parseInt(line, 10) + if (isNaN(lineNumber) || lineNumber < 0) { cline.consecutiveMistakeCount++ cline.recordToolError("insert_content") - await cline.say("error", `Failed to parse operations JSON: ${error.message}`) - pushToolResult(formatResponse.toolError("Invalid operations JSON format")) + pushToolResult(formatResponse.toolError("Invalid line number. Must be a non-negative integer.")) return } @@ -87,15 +86,12 @@ export async function insertContentTool( cline.diffViewProvider.originalContent = fileContent const lines = fileContent.split("\n") - const updatedContent = insertGroups( - lines, - parsedOperations.map((elem) => { - return { - index: elem.start_line - 1, - elements: elem.content.split("\n"), - } - }), - ).join("\n") + const updatedContent = insertGroups(lines, [ + { + index: lineNumber - 1, + elements: content.split("\n"), + }, + ]).join("\n") // Show changes in diff view if (!cline.diffViewProvider.isEditing) { @@ -116,7 +112,11 @@ export async function insertContentTool( await cline.diffViewProvider.update(updatedContent, true) - const completeMessage = JSON.stringify({ ...sharedMessageProps, diff } satisfies ClineSayTool) + const completeMessage = JSON.stringify({ + ...sharedMessageProps, + diff, + lineNumber: lineNumber, + } satisfies ClineSayTool) const didApprove = await cline .ask("tool", completeMessage, false) @@ -138,23 +138,25 @@ export async function insertContentTool( cline.didEditFile = true if (!userEdits) { - pushToolResult(`The content was successfully inserted in ${relPath.toPosix()}.${newProblemsMessage}`) + pushToolResult( + `The content was successfully inserted in ${relPath.toPosix()} at line ${lineNumber}.${newProblemsMessage}`, + ) await cline.diffViewProvider.reset() return } const userFeedbackDiff = JSON.stringify({ - tool: "appliedDiff", + tool: "insertContent", path: getReadablePath(cline.cwd, relPath), + lineNumber: lineNumber, diff: userEdits, } satisfies ClineSayTool) - console.debug("[DEBUG] User made edits, sending feedback diff:", userFeedbackDiff) await cline.say("user_feedback_diff", userFeedbackDiff) pushToolResult( `The user made the following updates to your content:\n\n${userEdits}\n\n` + - `The updated content, which includes both your original modifications and the user's edits, has been successfully saved to ${relPath.toPosix()}. Here is the full, updated content of the file:\n\n` + + `The updated content has been successfully saved to ${relPath.toPosix()}. Here is the full, updated content of the file:\n\n` + `\n${finalContent}\n\n\n` + `Please note:\n` + `1. You do not need to re-write the file with these changes, as they have already been applied.\n` + diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 14e864d767..5883cb8641 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -288,7 +288,6 @@ type GlobalSettings = { fuzzyMatchThreshold?: number | undefined experiments?: | { - insert_content: boolean powerSteering: boolean } | undefined @@ -548,7 +547,6 @@ type RooCodeEvents = { | "execute_command" | "read_file" | "write_to_file" - | "append_to_file" | "apply_diff" | "insert_content" | "search_and_replace" diff --git a/src/exports/types.ts b/src/exports/types.ts index 934f6f1596..134f4fd066 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -291,7 +291,6 @@ type GlobalSettings = { fuzzyMatchThreshold?: number | undefined experiments?: | { - insert_content: boolean powerSteering: boolean } | undefined @@ -557,7 +556,6 @@ type RooCodeEvents = { | "execute_command" | "read_file" | "write_to_file" - | "append_to_file" | "apply_diff" | "insert_content" | "search_and_replace" diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 96a08ceb82..8ebcdfc63a 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -277,7 +277,7 @@ export type CustomSupportPrompts = z.infer * ExperimentId */ -export const experimentIds = ["insert_content", "powerSteering"] as const +export const experimentIds = ["powerSteering"] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -288,7 +288,6 @@ export type ExperimentId = z.infer */ const experimentsSchema = z.object({ - insert_content: z.boolean(), powerSteering: z.boolean(), }) @@ -821,7 +820,6 @@ export const toolNames = [ "execute_command", "read_file", "write_to_file", - "append_to_file", "apply_diff", "insert_content", "search_and_replace", diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 7e6bb48911..25a3133e30 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -225,6 +225,7 @@ export interface ClineSayTool { | "newTask" | "finishTask" | "searchAndReplace" + | "insertContent" path?: string diff?: string content?: string @@ -239,6 +240,7 @@ export interface ClineSayTool { ignoreCase?: boolean startLine?: number endLine?: number + lineNumber?: number } // Must keep in sync with system prompt. diff --git a/src/shared/__tests__/experiments.test.ts b/src/shared/__tests__/experiments.test.ts index 2b88237b19..b68de1ced1 100644 --- a/src/shared/__tests__/experiments.test.ts +++ b/src/shared/__tests__/experiments.test.ts @@ -14,7 +14,6 @@ describe("experiments", () => { it("returns false when experiment is not enabled", () => { const experiments: Record = { powerSteering: false, - insert_content: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(false) }) @@ -22,14 +21,12 @@ describe("experiments", () => { it("returns true when experiment is enabled", () => { const experiments: Record = { powerSteering: true, - insert_content: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(true) }) it("returns false when experiment is not present", () => { const experiments: Record = { - insert_content: false, powerSteering: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(false) diff --git a/src/shared/__tests__/modes.test.ts b/src/shared/__tests__/modes.test.ts index a1cd0c88f2..d655123df8 100644 --- a/src/shared/__tests__/modes.test.ts +++ b/src/shared/__tests__/modes.test.ts @@ -254,48 +254,6 @@ describe("isToolAllowedForMode", () => { expect(isToolAllowedForMode("write_to_file", "markdown-editor", customModes, toolRequirements)).toBe(false) }) - - describe("experimental tools", () => { - it("disables tools when experiment is disabled", () => { - const experiments = { - insert_content: false, - } - - expect( - isToolAllowedForMode("insert_content", "test-exp-mode", customModes, undefined, undefined, experiments), - ).toBe(false) - }) - - it("allows tools when experiment is enabled", () => { - const experiments = { - insert_content: true, - } - - expect( - isToolAllowedForMode("insert_content", "test-exp-mode", customModes, undefined, undefined, experiments), - ).toBe(true) - }) - - it("allows non-experimental tools when experiments are disabled", () => { - const experiments = { - insert_content: false, - } - - expect( - isToolAllowedForMode("read_file", "markdown-editor", customModes, undefined, undefined, experiments), - ).toBe(true) - expect( - isToolAllowedForMode( - "write_to_file", - "markdown-editor", - customModes, - undefined, - { path: "test.md" }, - experiments, - ), - ).toBe(true) - }) - }) }) describe("FileRestrictionError", () => { diff --git a/src/shared/experiments.ts b/src/shared/experiments.ts index bed89f4001..b8917d8b10 100644 --- a/src/shared/experiments.ts +++ b/src/shared/experiments.ts @@ -4,7 +4,6 @@ import { AssertEqual, Equals, Keys, Values } from "../utils/type-fu" export type { ExperimentId } export const EXPERIMENT_IDS = { - INSERT_BLOCK: "insert_content", POWER_STEERING: "powerSteering", } as const satisfies Record @@ -17,7 +16,6 @@ interface ExperimentConfig { } export const experimentConfigsMap: Record = { - INSERT_BLOCK: { enabled: false }, POWER_STEERING: { enabled: false }, } diff --git a/src/shared/tools.ts b/src/shared/tools.ts index 97136ba3aa..1a6eb84ad7 100644 --- a/src/shared/tools.ts +++ b/src/shared/tools.ts @@ -50,6 +50,7 @@ export const toolParamNames = [ "mode_slug", "reason", "operations", + "line", "mode", "message", "cwd", @@ -97,7 +98,7 @@ export interface WriteToFileToolUse extends ToolUse { export interface InsertCodeBlockToolUse extends ToolUse { name: "insert_content" - params: Partial, "path" | "operations">> + params: Partial, "path" | "line" | "content">> } export interface SearchFilesToolUse extends ToolUse { @@ -167,7 +168,6 @@ export const TOOL_DISPLAY_NAMES: Record = { read_file: "read files", fetch_instructions: "fetch instructions", write_to_file: "write files", - append_to_file: "append to files", apply_diff: "apply changes", search_files: "search files", list_files: "list files", @@ -191,7 +191,7 @@ export const TOOL_GROUPS: Record = { tools: ["read_file", "fetch_instructions", "search_files", "list_files", "list_code_definition_names"], }, edit: { - tools: ["apply_diff", "write_to_file", "append_to_file", "insert_content", "search_and_replace"], + tools: ["apply_diff", "write_to_file", "insert_content", "search_and_replace"], }, browser: { tools: ["browser_action"], diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 87da6a996e..486183c150 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -295,6 +295,31 @@ export const ChatRowContent = ({ /> ) + case "insertContent": + return ( + <> +
+ {toolIcon("insert")} + + {tool.isOutsideWorkspace + ? t("chat:fileOperations.wantsToEditOutsideWorkspace") + : tool.lineNumber === 0 + ? t("chat:fileOperations.wantsToInsertAtEnd") + : t("chat:fileOperations.wantsToInsertWithLineNumber", { + lineNumber: tool.lineNumber, + })} + +
+ + + ) case "searchAndReplace": return ( <> diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index e522539074..0a32f6daa1 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -169,6 +169,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction { const prevState: ExtensionState = { ...baseState, apiConfiguration: { modelMaxTokens: 1234, modelMaxThinkingTokens: 123 }, - experiments: { - insert_content: true, - } as Record, + experiments: {} as Record, } const newState: ExtensionState = { @@ -228,7 +226,6 @@ describe("mergeExtensionState", () => { }) expect(result.experiments).toEqual({ - insert_content: true, powerSteering: true, }) }) diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index b355384c10..2ec4dfe8ea 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo vol editar aquest fitxer fora de l'espai de treball:", "wantsToCreate": "Roo vol crear un nou fitxer:", "wantsToSearchReplace": "Roo vol realitzar cerca i substitució en aquest fitxer:", - "didSearchReplace": "Roo ha realitzat cerca i substitució en aquest fitxer:" + "didSearchReplace": "Roo ha realitzat cerca i substitució en aquest fitxer:", + "wantsToInsert": "Roo vol inserir contingut en aquest fitxer:", + "wantsToInsertWithLineNumber": "Roo vol inserir contingut a la línia {{lineNumber}} d'aquest fitxer:", + "wantsToInsertAtEnd": "Roo vol afegir contingut al final d'aquest fitxer:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo vol veure els fitxers de nivell superior en aquest directori:", diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 94e7e0c270..372c6c728a 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo möchte diese Datei außerhalb des Arbeitsbereichs bearbeiten:", "wantsToCreate": "Roo möchte eine neue Datei erstellen:", "wantsToSearchReplace": "Roo möchte Suchen und Ersetzen in dieser Datei durchführen:", - "didSearchReplace": "Roo hat Suchen und Ersetzen in dieser Datei durchgeführt:" + "didSearchReplace": "Roo hat Suchen und Ersetzen in dieser Datei durchgeführt:", + "wantsToInsert": "Roo möchte Inhalte in diese Datei einfügen:", + "wantsToInsertWithLineNumber": "Roo möchte Inhalte in diese Datei in Zeile {{lineNumber}} einfügen:", + "wantsToInsertAtEnd": "Roo möchte Inhalte am Ende dieser Datei anhängen:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo möchte die Dateien auf oberster Ebene in diesem Verzeichnis anzeigen:", diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 2264423047..b6c957a45d 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -117,7 +117,10 @@ "wantsToEditOutsideWorkspace": "Roo wants to edit this file outside of the workspace:", "wantsToCreate": "Roo wants to create a new file:", "wantsToSearchReplace": "Roo wants to perform search and replace on this file:", - "didSearchReplace": "Roo performed search and replace on this file:" + "didSearchReplace": "Roo performed search and replace on this file:", + "wantsToInsert": "Roo wants to insert content into this file:", + "wantsToInsertWithLineNumber": "Roo wants to insert content into this file at line {{lineNumber}}:", + "wantsToInsertAtEnd": "Roo wants to append content to the end of this file:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo wants to view the top level files in this directory:", diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 1b0b762b71..32cde2799b 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo quiere editar este archivo fuera del espacio de trabajo:", "wantsToCreate": "Roo quiere crear un nuevo archivo:", "wantsToSearchReplace": "Roo quiere realizar búsqueda y reemplazo en este archivo:", - "didSearchReplace": "Roo realizó búsqueda y reemplazo en este archivo:" + "didSearchReplace": "Roo realizó búsqueda y reemplazo en este archivo:", + "wantsToInsert": "Roo quiere insertar contenido en este archivo:", + "wantsToInsertWithLineNumber": "Roo quiere insertar contenido en este archivo en la línea {{lineNumber}}:", + "wantsToInsertAtEnd": "Roo quiere añadir contenido al final de este archivo:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo quiere ver los archivos de nivel superior en este directorio:", diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 788ac5555b..315538215f 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -119,7 +119,10 @@ "wantsToEditOutsideWorkspace": "Roo veut éditer ce fichier en dehors de l'espace de travail :", "wantsToCreate": "Roo veut créer un nouveau fichier :", "wantsToSearchReplace": "Roo veut effectuer une recherche et remplacement sur ce fichier :", - "didSearchReplace": "Roo a effectué une recherche et remplacement sur ce fichier :" + "didSearchReplace": "Roo a effectué une recherche et remplacement sur ce fichier :", + "wantsToInsert": "Roo veut insérer du contenu dans ce fichier :", + "wantsToInsertWithLineNumber": "Roo veut insérer du contenu dans ce fichier à la ligne {{lineNumber}} :", + "wantsToInsertAtEnd": "Roo veut ajouter du contenu à la fin de ce fichier :" }, "instructions": { "wantsToFetch": "Roo veut récupérer des instructions détaillées pour aider à la tâche actuelle" diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 58237fab40..09df88212d 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo कार्यक्षेत्र के बाहर इस फ़ाइल को संपादित करना चाहता है:", "wantsToCreate": "Roo एक नई फ़ाइल बनाना चाहता है:", "wantsToSearchReplace": "Roo इस फ़ाइल में खोज और प्रतिस्थापन करना चाहता है:", - "didSearchReplace": "Roo ने इस फ़ाइल में खोज और प्रतिस्थापन किया:" + "didSearchReplace": "Roo ने इस फ़ाइल में खोज और प्रतिस्थापन किया:", + "wantsToInsert": "Roo इस फ़ाइल में सामग्री डालना चाहता है:", + "wantsToInsertWithLineNumber": "Roo इस फ़ाइल की {{lineNumber}} लाइन पर सामग्री डालना चाहता है:", + "wantsToInsertAtEnd": "Roo इस फ़ाइल के अंत में सामग्री जोड़ना चाहता है:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo इस निर्देशिका में शीर्ष स्तर की फ़ाइलें देखना चाहता है:", diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 98e161dd16..38dd7d4951 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo vuole modificare questo file al di fuori dell'area di lavoro:", "wantsToCreate": "Roo vuole creare un nuovo file:", "wantsToSearchReplace": "Roo vuole eseguire ricerca e sostituzione in questo file:", - "didSearchReplace": "Roo ha eseguito ricerca e sostituzione in questo file:" + "didSearchReplace": "Roo ha eseguito ricerca e sostituzione in questo file:", + "wantsToInsert": "Roo vuole inserire contenuto in questo file:", + "wantsToInsertWithLineNumber": "Roo vuole inserire contenuto in questo file alla riga {{lineNumber}}:", + "wantsToInsertAtEnd": "Roo vuole aggiungere contenuto alla fine di questo file:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo vuole visualizzare i file di primo livello in questa directory:", diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 56d1a5a425..8a68068c30 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Rooはワークスペース外のこのファイルを編集したい:", "wantsToCreate": "Rooは新しいファイルを作成したい:", "wantsToSearchReplace": "Rooはこのファイルで検索と置換を実行したい:", - "didSearchReplace": "Rooはこのファイルで検索と置換を実行しました:" + "didSearchReplace": "Rooはこのファイルで検索と置換を実行しました:", + "wantsToInsert": "Rooはこのファイルにコンテンツを挿入したい:", + "wantsToInsertWithLineNumber": "Rooはこのファイルの{{lineNumber}}行目にコンテンツを挿入したい:", + "wantsToInsertAtEnd": "Rooはこのファイルの末尾にコンテンツを追加したい:" }, "directoryOperations": { "wantsToViewTopLevel": "Rooはこのディレクトリのトップレベルファイルを表示したい:", diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index b4605d4832..d37fff02d1 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo가 워크스페이스 외부의 이 파일을 편집하고 싶어합니다:", "wantsToCreate": "Roo가 새 파일을 만들고 싶어합니다:", "wantsToSearchReplace": "Roo가 이 파일에서 검색 및 바꾸기를 수행하고 싶어합니다:", - "didSearchReplace": "Roo가 이 파일에서 검색 및 바꾸기를 수행했습니다:" + "didSearchReplace": "Roo가 이 파일에서 검색 및 바꾸기를 수행했습니다:", + "wantsToInsert": "Roo가 이 파일에 내용을 삽입하고 싶어합니다:", + "wantsToInsertWithLineNumber": "Roo가 이 파일의 {{lineNumber}}번 줄에 내용을 삽입하고 싶어합니다:", + "wantsToInsertAtEnd": "Roo가 이 파일의 끝에 내용을 추가하고 싶어합니다:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo가 이 디렉토리의 최상위 파일을 보고 싶어합니다:", diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index c760200623..239c1f09c1 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo chce edytować ten plik poza obszarem roboczym:", "wantsToCreate": "Roo chce utworzyć nowy plik:", "wantsToSearchReplace": "Roo chce wykonać wyszukiwanie i zamianę w tym pliku:", - "didSearchReplace": "Roo wykonał wyszukiwanie i zamianę w tym pliku:" + "didSearchReplace": "Roo wykonał wyszukiwanie i zamianę w tym pliku:", + "wantsToInsert": "Roo chce wstawić zawartość do tego pliku:", + "wantsToInsertWithLineNumber": "Roo chce wstawić zawartość do tego pliku w linii {{lineNumber}}:", + "wantsToInsertAtEnd": "Roo chce dodać zawartość na końcu tego pliku:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo chce zobaczyć pliki najwyższego poziomu w tym katalogu:", diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 883d46d767..1f1d620f2c 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo quer editar este arquivo fora do espaço de trabalho:", "wantsToCreate": "Roo quer criar um novo arquivo:", "wantsToSearchReplace": "Roo quer realizar busca e substituição neste arquivo:", - "didSearchReplace": "Roo realizou busca e substituição neste arquivo:" + "didSearchReplace": "Roo realizou busca e substituição neste arquivo:", + "wantsToInsert": "Roo quer inserir conteúdo neste arquivo:", + "wantsToInsertWithLineNumber": "Roo quer inserir conteúdo neste arquivo na linha {{lineNumber}}:", + "wantsToInsertAtEnd": "Roo quer adicionar conteúdo ao final deste arquivo:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo quer visualizar os arquivos de nível superior neste diretório:", diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 63abda020a..c02620ea25 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo çalışma alanı dışındaki bu dosyayı düzenlemek istiyor:", "wantsToCreate": "Roo yeni bir dosya oluşturmak istiyor:", "wantsToSearchReplace": "Roo bu dosyada arama ve değiştirme yapmak istiyor:", - "didSearchReplace": "Roo bu dosyada arama ve değiştirme yaptı:" + "didSearchReplace": "Roo bu dosyada arama ve değiştirme yaptı:", + "wantsToInsert": "Roo bu dosyaya içerik eklemek istiyor:", + "wantsToInsertWithLineNumber": "Roo bu dosyanın {{lineNumber}}. satırına içerik eklemek istiyor:", + "wantsToInsertAtEnd": "Roo bu dosyanın sonuna içerik eklemek istiyor:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo bu dizindeki üst düzey dosyaları görüntülemek istiyor:", diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 9d7f7fb8a6..cdf77f48f5 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo muốn chỉnh sửa tệp này bên ngoài không gian làm việc:", "wantsToCreate": "Roo muốn tạo một tệp mới:", "wantsToSearchReplace": "Roo muốn thực hiện tìm kiếm và thay thế trong tệp này:", - "didSearchReplace": "Roo đã thực hiện tìm kiếm và thay thế trong tệp này:" + "didSearchReplace": "Roo đã thực hiện tìm kiếm và thay thế trong tệp này:", + "wantsToInsert": "Roo muốn chèn nội dung vào tệp này:", + "wantsToInsertWithLineNumber": "Roo muốn chèn nội dung vào dòng {{lineNumber}} của tệp này:", + "wantsToInsertAtEnd": "Roo muốn thêm nội dung vào cuối tệp này:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo muốn xem các tệp cấp cao nhất trong thư mục này:", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 7fe8609665..8d0a78572a 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "需要编辑外部文件:", "wantsToCreate": "需要新建文件:", "wantsToSearchReplace": "需要执行搜索和替换:", - "didSearchReplace": "已完成搜索和替换:" + "didSearchReplace": "已完成搜索和替换:", + "wantsToInsert": "需要在此文件中插入内容:", + "wantsToInsertWithLineNumber": "需要在第 {{lineNumber}} 行插入内容:", + "wantsToInsertAtEnd": "需要在文件末尾添加内容:" }, "directoryOperations": { "wantsToViewTopLevel": "需要查看目录文件列表:", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index c444ff2166..4c3f2be8f3 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -122,7 +122,10 @@ "wantsToEditOutsideWorkspace": "Roo 想要編輯此工作區外的檔案:", "wantsToCreate": "Roo 想要建立新檔案:", "wantsToSearchReplace": "Roo 想要在此檔案執行搜尋和取代:", - "didSearchReplace": "Roo 已在此檔案執行搜尋和取代:" + "didSearchReplace": "Roo 已在此檔案執行搜尋和取代:", + "wantsToInsert": "Roo 想要在此檔案中插入內容:", + "wantsToInsertWithLineNumber": "Roo 想要在此檔案第 {{lineNumber}} 行插入內容:", + "wantsToInsertAtEnd": "Roo 想要在此檔案末尾新增內容:" }, "directoryOperations": { "wantsToViewTopLevel": "Roo 想要檢視此目錄中最上層的檔案:", From ff5430a95c5d86fa1c51cd351ced390a7e55586c Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Mon, 21 Apr 2025 21:18:25 -0400 Subject: [PATCH 24/89] Try adding better errors for write_to_file truncated output (#2821) --- src/core/prompts/responses.ts | 33 +++++++++++++++++++++++++++++++ src/core/tools/writeToFileTool.ts | 24 +++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/core/prompts/responses.ts b/src/core/prompts/responses.ts index 3a1eb92a2e..314387171a 100644 --- a/src/core/prompts/responses.ts +++ b/src/core/prompts/responses.ts @@ -35,6 +35,39 @@ Otherwise, if you have not completed the task and do not need additional informa missingToolParameterError: (paramName: string) => `Missing value for required parameter '${paramName}'. Please retry with complete response.\n\n${toolUseInstructionsReminder}`, + lineCountTruncationError: (actualLineCount: number, isNewFile: boolean, diffStrategyEnabled: boolean = false) => { + const truncationMessage = `Note: Your response may have been truncated because it exceeded your output limit. You wrote ${actualLineCount} lines of content, but the line_count parameter was either missing or not included in your response.` + + const newFileGuidance = + `This appears to be a new file.\n` + + `${truncationMessage}\n\n` + + `RECOMMENDED APPROACH:\n` + + `1. Try again with the line_count parameter in your response if you forgot to include it\n` + + `2. Or break your content into smaller chunks - first use write_to_file with the initial chunk\n` + + `3. Then use insert_content to append additional chunks\n` + + let existingFileApproaches = [ + `1. Try again with the line_count parameter in your response if you forgot to include it`, + ] + + if (diffStrategyEnabled) { + existingFileApproaches.push(`2. Or try using apply_diff instead of write_to_file for targeted changes`) + } + + existingFileApproaches.push( + `${diffStrategyEnabled ? "3" : "2"}. Or use search_and_replace for specific text replacements`, + `${diffStrategyEnabled ? "4" : "3"}. Or use insert_content to add specific content at particular lines`, + ) + + const existingFileGuidance = + `This appears to be content for an existing file.\n` + + `${truncationMessage}\n\n` + + `RECOMMENDED APPROACH:\n` + + `${existingFileApproaches.join("\n")}\n` + + return `${isNewFile ? newFileGuidance : existingFileGuidance}\n${toolUseInstructionsReminder}` + }, + invalidMcpToolArgumentError: (serverName: string, toolName: string) => `Invalid JSON argument used with ${serverName} for ${toolName}. Please retry with a properly formatted JSON argument.`, diff --git a/src/core/tools/writeToFileTool.ts b/src/core/tools/writeToFileTool.ts index d20691610f..a23aea9714 100644 --- a/src/core/tools/writeToFileTool.ts +++ b/src/core/tools/writeToFileTool.ts @@ -114,7 +114,29 @@ export async function writeToFileTool( if (!predictedLineCount) { cline.consecutiveMistakeCount++ cline.recordToolError("write_to_file") - pushToolResult(await cline.sayAndCreateMissingParamError("write_to_file", "line_count")) + + // Calculate the actual number of lines in the content + const actualLineCount = newContent.split("\n").length + + // Check if this is a new file or existing file + const isNewFile = !fileExists + + // Check if diffStrategy is enabled + const diffStrategyEnabled = !!cline.diffStrategy + + // Use more specific error message for line_count that provides guidance based on the situation + await cline.say( + "error", + `Roo tried to use write_to_file${ + relPath ? ` for '${relPath.toPosix()}'` : "" + } but the required parameter 'line_count' was missing or truncated after ${actualLineCount} lines of content were written. Retrying...`, + ) + + pushToolResult( + formatResponse.toolError( + formatResponse.lineCountTruncationError(actualLineCount, isNewFile, diffStrategyEnabled), + ), + ) await cline.diffViewProvider.revertChanges() return } From b6ea9d14655d27ce9a92dd5ecce275bb291600cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 21:22:54 -0400 Subject: [PATCH 25/89] Update contributors list (#2803) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 48 ++++++++++++++++++++--------------------- locales/ca/README.md | 32 +++++++++++++-------------- locales/de/README.md | 32 +++++++++++++-------------- locales/es/README.md | 32 +++++++++++++-------------- locales/fr/README.md | 32 +++++++++++++-------------- locales/hi/README.md | 32 +++++++++++++-------------- locales/it/README.md | 32 +++++++++++++-------------- locales/ja/README.md | 32 +++++++++++++-------------- locales/ko/README.md | 32 +++++++++++++-------------- locales/pl/README.md | 32 +++++++++++++-------------- locales/pt-BR/README.md | 32 +++++++++++++-------------- locales/tr/README.md | 32 +++++++++++++-------------- locales/vi/README.md | 32 +++++++++++++-------------- locales/zh-CN/README.md | 32 +++++++++++++-------------- locales/zh-TW/README.md | 32 +++++++++++++-------------- 15 files changed, 248 insertions(+), 248 deletions(-) diff --git a/README.md b/README.md index 77cfda4b3f..81fc0781de 100644 --- a/README.md +++ b/README.md @@ -181,30 +181,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| vigneshsubbiah16
vigneshsubbiah16
| -| wkordalski
wkordalski
| Szpadel
Szpadel
| diarmidmackenzie
diarmidmackenzie
| psv2522
psv2522
| Premshay
Premshay
| qdaxb
qdaxb
| -| lupuletic
lupuletic
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| -| emshvac
emshvac
| kyle-apex
kyle-apex
| nbihan-mediware
nbihan-mediware
| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| -| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| sachasayan
sachasayan
| -| p12tic
p12tic
| gtaylor
gtaylor
| dtrugman
dtrugman
| aitoroses
aitoroses
| philfung
philfung
| ross
ross
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| vincentsong
vincentsong
| -| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| -| Chenjiayuan195
Chenjiayuan195
| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| -| olup
olup
| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| -| axmo
axmo
| ashktn
ashktn
| amittell
amittell
| AMHesch
AMHesch
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| -| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| RaySinner
RaySinner
| sachasayan
sachasayan
| +| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| dtrugman
dtrugman
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| +| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| elianiva
elianiva
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| +| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| +| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| +| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| +| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index 9827c558f9..89b7b23fe1 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -182,22 +182,22 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/de/README.md b/locales/de/README.md index 241dea6cd3..6f29b9a1d9 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -182,22 +182,22 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/es/README.md b/locales/es/README.md index 4a58eb508b..eb23013fac 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -182,22 +182,22 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/fr/README.md b/locales/fr/README.md index 25debb7549..563b45126a 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -182,22 +182,22 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/hi/README.md b/locales/hi/README.md index 6ca2459b25..25c9ddbb1c 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -182,22 +182,22 @@ Roo Code को बेहतर बनाने में मदद करने |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/it/README.md b/locales/it/README.md index df8d8be7b0..ee75eabcc3 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -182,22 +182,22 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/ja/README.md b/locales/ja/README.md index 1a8cf752ad..67eb93e6cf 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -182,22 +182,22 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/ko/README.md b/locales/ko/README.md index 5431a8fbd1..4a62a139bf 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -182,22 +182,22 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/pl/README.md b/locales/pl/README.md index d85762dc96..a45d971bfc 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -182,22 +182,22 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 3886cb1e22..97ff191778 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -182,22 +182,22 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/tr/README.md b/locales/tr/README.md index ba992b501c..ef52cb6305 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -182,22 +182,22 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/vi/README.md b/locales/vi/README.md index 57ef27202a..b8d3305741 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -182,22 +182,22 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index f933ba3775..7007478c2f 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -182,22 +182,22 @@ code --install-extension bin/roo-cline-.vsix |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 40f5535840..fbd7f7b143 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -183,22 +183,22 @@ code --install-extension bin/roo-cline-.vsix |:---:|:---:|:---:|:---:|:---:|:---:| |ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
|vigneshsubbiah16
vigneshsubbiah16
| -|wkordalski
wkordalski
|Szpadel
Szpadel
|diarmidmackenzie
diarmidmackenzie
|psv2522
psv2522
|Premshay
Premshay
|qdaxb
qdaxb
| -|lupuletic
lupuletic
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
| -|emshvac
emshvac
|kyle-apex
kyle-apex
|nbihan-mediware
nbihan-mediware
|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
| -|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|sachasayan
sachasayan
| -|p12tic
p12tic
|gtaylor
gtaylor
|dtrugman
dtrugman
|aitoroses
aitoroses
|philfung
philfung
|ross
ross
| -|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
|vincentsong
vincentsong
| -|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
| -|Chenjiayuan195
Chenjiayuan195
|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
| -|anton-otee
anton-otee
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
| -|olup
olup
|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
| -|axmo
axmo
|ashktn
ashktn
|amittell
amittell
|AMHesch
AMHesch
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
| -|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
| -|nevermorec
nevermorec
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| -|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| +|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| +|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| +|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| +|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| +|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| +|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| +|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| +|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| +|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| +|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| +|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| |linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| |shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| |01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| From 8b5d48013e0724bed5b0cc0acb663af50b8aa2bf Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Mon, 21 Apr 2025 22:39:39 -0400 Subject: [PATCH 26/89] Fix MCP hub lookup during view transition (#2829) --- src/core/Cline.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 4e5ee7f882..9a936f9698 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -46,6 +46,7 @@ import { UrlContentFetcher } from "../services/browser/UrlContentFetcher" import { listFiles } from "../services/glob/list-files" import { BrowserSession } from "../services/browser/BrowserSession" import { McpHub } from "../services/mcp/McpHub" +import { McpServerManager } from "../services/mcp/McpServerManager" import { telemetryService } from "../services/telemetry/TelemetryService" import { CheckpointServiceOptions, RepoPerTaskCheckpointService } from "../services/checkpoints" @@ -969,12 +970,19 @@ export class Cline extends EventEmitter { this.lastApiRequestTime = Date.now() if (mcpEnabled ?? true) { - mcpHub = this.providerRef.deref()?.getMcpHub() - if (!mcpHub) { - throw new Error("MCP hub not available") + const provider = this.providerRef.deref() + if (!provider) { + throw new Error("Provider reference lost during view transition") } + + // Wait for MCP hub initialization through McpServerManager + mcpHub = await McpServerManager.getInstance(provider.context, provider) + if (!mcpHub) { + throw new Error("Failed to get MCP hub from server manager") + } + // Wait for MCP servers to be connected before generating system prompt - await pWaitFor(() => mcpHub!.isConnecting !== true, { timeout: 10_000 }).catch(() => { + await pWaitFor(() => !mcpHub!.isConnecting, { timeout: 10_000 }).catch(() => { console.error("MCP servers failed to connect in time") }) } From 3e2d20f37c47cd0a9ba53d15db97aa0207d40908 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Mon, 21 Apr 2025 22:57:58 -0400 Subject: [PATCH 27/89] Search and replace fixes (#2830) * Allow replacing with an empty string * Visual cleanup --- src/core/tools/searchAndReplaceTool.ts | 2 +- webview-ui/src/components/chat/ChatRow.tsx | 26 ++------------------- webview-ui/src/i18n/locales/de/chat.json | 2 +- webview-ui/src/i18n/locales/en/chat.json | 2 +- webview-ui/src/i18n/locales/ja/chat.json | 2 +- webview-ui/src/i18n/locales/zh-CN/chat.json | 2 +- webview-ui/src/i18n/locales/zh-TW/chat.json | 2 +- 7 files changed, 8 insertions(+), 30 deletions(-) diff --git a/src/core/tools/searchAndReplaceTool.ts b/src/core/tools/searchAndReplaceTool.ts index f371901e5f..7a503b5f1e 100644 --- a/src/core/tools/searchAndReplaceTool.ts +++ b/src/core/tools/searchAndReplaceTool.ts @@ -41,7 +41,7 @@ async function validateParams( return false } - if (!replace) { + if (replace === undefined) { cline.consecutiveMistakeCount++ cline.recordToolError("search_and_replace") pushToolResult(await cline.sayAndCreateMissingParamError("search_and_replace", "replace")) diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 486183c150..8c09b101b1 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -323,36 +323,14 @@ export const ChatRowContent = ({ case "searchAndReplace": return ( <> -
+
{toolIcon("replace")} - + {message.type === "ask" ? t("chat:fileOperations.wantsToSearchReplace") : t("chat:fileOperations.didSearchReplace")}
-
-
- Search: - {tool.search} - {tool.useRegex && (regex)} - {tool.ignoreCase && ( - (case-insensitive) - )} -
-
- Replace: - {tool.replace} -
- {(tool.startLine !== undefined || tool.endLine !== undefined) && ( -
- Lines: - - {tool.startLine ?? 1} - {tool.endLine ?? "end"} - -
- )} -
Date: Tue, 22 Apr 2025 00:15:46 -0400 Subject: [PATCH 28/89] Add line wrapping to MCP arguments (#2831) --- webview-ui/src/components/chat/ChatRow.tsx | 1 + webview-ui/src/components/common/CodeAccordian.tsx | 3 +++ 2 files changed, 4 insertions(+) diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 8c09b101b1..ebcd59e1ee 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -1174,6 +1174,7 @@ export const ChatRowContent = ({ language="json" isExpanded={true} onToggleExpand={onToggleExpand} + forceWrap={true} />
)} diff --git a/webview-ui/src/components/common/CodeAccordian.tsx b/webview-ui/src/components/common/CodeAccordian.tsx index 7d803e65af..2f0cffd862 100644 --- a/webview-ui/src/components/common/CodeAccordian.tsx +++ b/webview-ui/src/components/common/CodeAccordian.tsx @@ -14,6 +14,7 @@ interface CodeAccordianProps { onToggleExpand: () => void isLoading?: boolean progressStatus?: ToolProgressStatus + forceWrap?: boolean } /* @@ -38,6 +39,7 @@ const CodeAccordian = ({ onToggleExpand, isLoading, progressStatus, + forceWrap, }: CodeAccordianProps) => { const inferredLanguage = useMemo( () => code && (language ?? (path ? getLanguageFromPath(path) : undefined)), @@ -126,6 +128,7 @@ const CodeAccordian = ({ diff ?? "" ).trim()}\n${"```"}`} + forceWrap={forceWrap} />
)} From 8ac911244c6b0446fc14059b1444ecaa78d44136 Mon Sep 17 00:00:00 2001 From: System233 Date: Tue, 22 Apr 2025 22:10:34 +0800 Subject: [PATCH 29/89] Fix user feedback not being added to conversation history in API error state (#2844) Fix user feedback not being added to conversation history in the API error state --- src/core/Cline.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 9a936f9698..c78674c73f 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -1613,6 +1613,8 @@ export class Cline extends EventEmitter { ], ) + await this.say("user_feedback", text, images) + // Track consecutive mistake errors in telemetry telemetryService.captureConsecutiveMistakeError(this.taskId) } From 0d561f8a27e592c9ef917649dc47822a86dd637b Mon Sep 17 00:00:00 2001 From: System233 Date: Tue, 22 Apr 2025 22:12:29 +0800 Subject: [PATCH 30/89] Fix redundant 'TASK RESUMPTION' prompts (#2842) --- src/core/Cline.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index c78674c73f..6e47bd5067 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -845,8 +845,15 @@ export class Cline extends EventEmitter { return "just now" })() - const wasRecent = lastClineMessage?.ts && Date.now() - lastClineMessage.ts < 30_000 + const lastTaskResumptionIndex = newUserContent.findIndex( + (x) => x.type === "text" && x.text.startsWith("[TASK RESUMPTION]"), + ) + if (lastTaskResumptionIndex !== -1) { + newUserContent.splice(lastTaskResumptionIndex, newUserContent.length - lastTaskResumptionIndex) + } + const wasRecent = lastClineMessage?.ts && Date.now() - lastClineMessage.ts < 30_000 + newUserContent.push({ type: "text", text: From 1a376c262ef20b694f84093119b5c50b8eb1762e Mon Sep 17 00:00:00 2001 From: Dicha Zelianivan Arkana <51877647+elianiva@users.noreply.github.com> Date: Wed, 23 Apr 2025 02:39:45 +0700 Subject: [PATCH 31/89] [DRAFT] feat(menu): use material icons for files and folders (#2739) feat(menu): use material icons for files and folders --- package-lock.json | 7 +++ package.json | 1 + src/core/webview/ClineProvider.ts | 19 +++++- .../src/components/chat/ContextMenu.tsx | 59 +++++++++++++------ 4 files changed, 67 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 268e4cc4a4..e86085b7d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,6 +61,7 @@ "tmp": "^0.2.3", "tree-sitter-wasms": "^0.1.11", "turndown": "^7.2.0", + "vscode-material-icons": "^0.1.1", "web-tree-sitter": "^0.22.6", "zod": "^3.23.8" }, @@ -21550,6 +21551,12 @@ "node": ">= 0.8" } }, + "node_modules/vscode-material-icons": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/vscode-material-icons/-/vscode-material-icons-0.1.1.tgz", + "integrity": "sha512-GsoEEF8Tbb0yUFQ6N6FPvh11kFkL9F95x0FkKlbbfRQN9eFms67h+L3t6b9cUv58dSn2gu8kEhNfoESVCrz4ag==", + "license": "MIT" + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", diff --git a/package.json b/package.json index 8129f53eda..70b53db3bc 100644 --- a/package.json +++ b/package.json @@ -453,6 +453,7 @@ "tmp": "^0.2.3", "tree-sitter-wasms": "^0.1.11", "turndown": "^7.2.0", + "vscode-material-icons": "^0.1.1", "web-tree-sitter": "^0.22.6", "zod": "^3.23.8" }, diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 432ac6420b..16984a4a49 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -622,6 +622,13 @@ export class ClineProvider extends EventEmitter implements "codicon.css", ]) + const materialIconsUri = getUri(webview, this.contextProxy.extensionUri, [ + "node_modules", + "vscode-material-icons", + "generated", + "icons", + ]) + const imagesUri = getUri(webview, this.contextProxy.extensionUri, ["assets", "images"]) const file = "src/index.tsx" @@ -656,7 +663,8 @@ export class ClineProvider extends EventEmitter implements Roo Code @@ -706,6 +714,14 @@ export class ClineProvider extends EventEmitter implements "codicon.css", ]) + // The material icons from the React build output + const materialIconsUri = getUri(webview, this.contextProxy.extensionUri, [ + "node_modules", + "vscode-material-icons", + "generated", + "icons", + ]) + const imagesUri = getUri(webview, this.contextProxy.extensionUri, ["assets", "images"]) // const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, "assets", "main.js")) @@ -742,6 +758,7 @@ export class ClineProvider extends EventEmitter implements Roo Code diff --git a/webview-ui/src/components/chat/ContextMenu.tsx b/webview-ui/src/components/chat/ContextMenu.tsx index 85b499e523..f6fe6d9e83 100644 --- a/webview-ui/src/components/chat/ContextMenu.tsx +++ b/webview-ui/src/components/chat/ContextMenu.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useMemo, useRef } from "react" +import React, { useEffect, useMemo, useRef, useState } from "react" +import { getIconForFilePath, getIconUrlByName, getIconForDirectoryPath } from "vscode-material-icons" import { ContextMenuOptionType, ContextMenuQueryItem, @@ -35,6 +36,7 @@ const ContextMenu: React.FC = ({ loading = false, dynamicSearchResults = [], }) => { + const [materialIconsBaseUri, setMaterialIconsBaseUri] = useState("") const menuRef = useRef(null) const filteredOptions = useMemo(() => { @@ -57,6 +59,12 @@ const ContextMenu: React.FC = ({ } }, [selectedIndex]) + // get the icons base uri on mount + useEffect(() => { + const w = window as any + setMaterialIconsBaseUri(w.MATERIAL_ICONS_BASE_URI) + }, []) + const renderOptionContent = (option: ContextMenuQueryItem) => { switch (option.type) { case ContextMenuOptionType.Mode: @@ -175,6 +183,15 @@ const ContextMenu: React.FC = ({ } } + const getMaterialIconForOption = (option: ContextMenuQueryItem): string => { + // only take the last part of the path to handle both file and folder icons + // since material-icons have specific folder icons, we use them if available + const name = option.value?.split("/").filter(Boolean).at(-1) ?? "" + const iconName = + option.type === ContextMenuOptionType.Folder ? getIconForDirectoryPath(name) : getIconForFilePath(name) + return getIconUrlByName(iconName, materialIconsBaseUri) + } + const isOptionSelectable = (option: ContextMenuQueryItem): boolean => { return option.type !== ContextMenuOptionType.NoResults && option.type !== ContextMenuOptionType.URL } @@ -231,17 +248,35 @@ const ContextMenu: React.FC = ({ overflow: "hidden", paddingTop: 0, }}> - {option.type !== ContextMenuOptionType.Mode && getIconForOption(option) && ( - )} + {option.type !== ContextMenuOptionType.Mode && + option.type !== ContextMenuOptionType.File && + option.type !== ContextMenuOptionType.Folder && + option.type !== ContextMenuOptionType.OpenedFile && + getIconForOption(option) && ( + + )} {renderOptionContent(option)}
{(option.type === ContextMenuOptionType.File || @@ -253,18 +288,6 @@ const ContextMenu: React.FC = ({ style={{ fontSize: "10px", flexShrink: 0, marginLeft: 8 }} /> )} - {(option.type === ContextMenuOptionType.Problems || - option.type === ContextMenuOptionType.Terminal || - ((option.type === ContextMenuOptionType.File || - option.type === ContextMenuOptionType.Folder || - option.type === ContextMenuOptionType.OpenedFile || - option.type === ContextMenuOptionType.Git) && - option.value)) && ( - - )} )) ) : ( From c6f91a3b2f8f70373e3a3a478fb06f9a99611946 Mon Sep 17 00:00:00 2001 From: System233 Date: Wed, 23 Apr 2025 03:40:33 +0800 Subject: [PATCH 32/89] Fix error message not showing after canceling API request (#2845) --- src/core/Cline.ts | 2 ++ webview-ui/src/components/chat/ChatView.tsx | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 6e47bd5067..7c60ba1282 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -943,6 +943,8 @@ export class Cline extends EventEmitter { if (this.isStreaming && this.diffViewProvider.isEditing) { await this.diffViewProvider.revertChanges() } + // Save the countdown message in the automatic retry or other content + await this.saveClineMessages() } // Tools diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 0a32f6daa1..c287a99cbb 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -591,8 +591,13 @@ const ChatViewComponent: React.ForwardRefRenderFunction Date: Wed, 23 Apr 2025 00:09:14 -0500 Subject: [PATCH 33/89] feat: allow variable interpolation into the custom system prompt (#2863) * feat: allow variable interpolation into the custom system prompt * fix: allow the test to pass on windows by using the path module --- .../__tests__/custom-system-prompt.test.ts | 131 ++++++++++++++++++ .../prompts/sections/custom-system-prompt.ts | 27 +++- src/core/prompts/system.ts | 7 +- 3 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 src/core/prompts/sections/__tests__/custom-system-prompt.test.ts diff --git a/src/core/prompts/sections/__tests__/custom-system-prompt.test.ts b/src/core/prompts/sections/__tests__/custom-system-prompt.test.ts new file mode 100644 index 0000000000..9fc538860a --- /dev/null +++ b/src/core/prompts/sections/__tests__/custom-system-prompt.test.ts @@ -0,0 +1,131 @@ +import path from "path" +import { readFile } from "fs/promises" +import { Mode } from "../../../../shared/modes" // Adjusted import path +import { loadSystemPromptFile, PromptVariables } from "../custom-system-prompt" + +// Mock the fs/promises module +jest.mock("fs/promises") + +// Cast the mocked readFile to the correct Jest mock type +const mockedReadFile = readFile as jest.MockedFunction + +describe("loadSystemPromptFile", () => { + // Corrected PromptVariables type and added mockMode + const mockVariables: PromptVariables = { + workspace: "/path/to/workspace", + } + const mockCwd = "/mock/cwd" + const mockMode: Mode = "test" // Use Mode type, e.g., 'test' + // Corrected expected file path format + const expectedFilePath = path.join(mockCwd, ".roo", `system-prompt-${mockMode}`) + + beforeEach(() => { + // Clear mocks before each test + mockedReadFile.mockClear() + }) + + it("should return an empty string if the file does not exist (ENOENT)", async () => { + const error: NodeJS.ErrnoException = new Error("File not found") + error.code = "ENOENT" + mockedReadFile.mockRejectedValue(error) + + // Added mockMode argument + const result = await loadSystemPromptFile(mockCwd, mockMode, mockVariables) + + expect(result).toBe("") + expect(mockedReadFile).toHaveBeenCalledTimes(1) + expect(mockedReadFile).toHaveBeenCalledWith(expectedFilePath, "utf-8") + }) + + // Updated test: should re-throw unexpected errors + it("should re-throw unexpected errors from readFile", async () => { + const expectedError = new Error("Some other error") + mockedReadFile.mockRejectedValue(expectedError) + + // Assert that the promise rejects with the specific error + await expect(loadSystemPromptFile(mockCwd, mockMode, mockVariables)).rejects.toThrow(expectedError) + + // Verify readFile was still called correctly + expect(mockedReadFile).toHaveBeenCalledTimes(1) + expect(mockedReadFile).toHaveBeenCalledWith(expectedFilePath, "utf-8") + }) + + it("should return an empty string if the file content is empty", async () => { + mockedReadFile.mockResolvedValue("") + + // Added mockMode argument + const result = await loadSystemPromptFile(mockCwd, mockMode, mockVariables) + + expect(result).toBe("") + expect(mockedReadFile).toHaveBeenCalledTimes(1) + expect(mockedReadFile).toHaveBeenCalledWith(expectedFilePath, "utf-8") + }) + + // Updated test to only check workspace interpolation + it("should correctly interpolate workspace variable", async () => { + const template = "Workspace is: {{workspace}}" + mockedReadFile.mockResolvedValue(template) + + // Added mockMode argument + const result = await loadSystemPromptFile(mockCwd, mockMode, mockVariables) + + expect(result).toBe("Workspace is: /path/to/workspace") + expect(mockedReadFile).toHaveBeenCalledTimes(1) + expect(mockedReadFile).toHaveBeenCalledWith(expectedFilePath, "utf-8") + }) + + // Updated test for multiple occurrences of workspace + it("should handle multiple occurrences of the workspace variable", async () => { + const template = "Path: {{workspace}}/{{workspace}}" + mockedReadFile.mockResolvedValue(template) + + // Added mockMode argument + const result = await loadSystemPromptFile(mockCwd, mockMode, mockVariables) + + expect(result).toBe("Path: /path/to/workspace//path/to/workspace") + expect(mockedReadFile).toHaveBeenCalledTimes(1) + expect(mockedReadFile).toHaveBeenCalledWith(expectedFilePath, "utf-8") + }) + + // Updated test for mixed used/unused + it("should handle mixed used workspace and unused variables", async () => { + const template = "Workspace: {{workspace}}, Unused: {{unusedVar}}, Another: {{another}}" + mockedReadFile.mockResolvedValue(template) + + // Added mockMode argument + const result = await loadSystemPromptFile(mockCwd, mockMode, mockVariables) + + // Unused variables should remain untouched + expect(result).toBe("Workspace: /path/to/workspace, Unused: {{unusedVar}}, Another: {{another}}") + expect(mockedReadFile).toHaveBeenCalledTimes(1) + expect(mockedReadFile).toHaveBeenCalledWith(expectedFilePath, "utf-8") + }) + + // Test remains valid, just needs the mode argument and updated template + it("should handle templates with placeholders not present in variables", async () => { + const template = "Workspace: {{workspace}}, Missing: {{missingPlaceholder}}" + mockedReadFile.mockResolvedValue(template) + + // Added mockMode argument + const result = await loadSystemPromptFile(mockCwd, mockMode, mockVariables) + + expect(result).toBe("Workspace: /path/to/workspace, Missing: {{missingPlaceholder}}") + expect(mockedReadFile).toHaveBeenCalledTimes(1) + expect(mockedReadFile).toHaveBeenCalledWith(expectedFilePath, "utf-8") + }) + + // Removed the test for extra keys as PromptVariables is simple now + + // Test remains valid, just needs the mode argument + it("should handle template with no variables", async () => { + const template = "This is a static prompt." + mockedReadFile.mockResolvedValue(template) + + // Added mockMode argument + const result = await loadSystemPromptFile(mockCwd, mockMode, mockVariables) + + expect(result).toBe("This is a static prompt.") + expect(mockedReadFile).toHaveBeenCalledTimes(1) + expect(mockedReadFile).toHaveBeenCalledWith(expectedFilePath, "utf-8") + }) +}) diff --git a/src/core/prompts/sections/custom-system-prompt.ts b/src/core/prompts/sections/custom-system-prompt.ts index eca2b98b8d..b8353e2fd8 100644 --- a/src/core/prompts/sections/custom-system-prompt.ts +++ b/src/core/prompts/sections/custom-system-prompt.ts @@ -3,6 +3,24 @@ import path from "path" import { Mode } from "../../../shared/modes" import { fileExistsAtPath } from "../../../utils/fs" +export type PromptVariables = { + workspace?: string +} + +function interpolatePromptContent(content: string, variables: PromptVariables): string { + let interpolatedContent = content + for (const key in variables) { + if ( + Object.prototype.hasOwnProperty.call(variables, key) && + variables[key as keyof PromptVariables] !== undefined + ) { + const placeholder = new RegExp(`\\{\\{${key}\\}\\}`, "g") + interpolatedContent = interpolatedContent.replace(placeholder, variables[key as keyof PromptVariables]!) + } + } + return interpolatedContent +} + /** * Safely reads a file, returning an empty string if the file doesn't exist */ @@ -31,9 +49,14 @@ export function getSystemPromptFilePath(cwd: string, mode: Mode): string { * Loads custom system prompt from a file at .roo/system-prompt-[mode slug] * If the file doesn't exist, returns an empty string */ -export async function loadSystemPromptFile(cwd: string, mode: Mode): Promise { +export async function loadSystemPromptFile(cwd: string, mode: Mode, variables: PromptVariables): Promise { const filePath = getSystemPromptFilePath(cwd, mode) - return safeReadFile(filePath) + const rawContent = await safeReadFile(filePath) + if (!rawContent) { + return "" + } + const interpolatedContent = interpolatePromptContent(rawContent, variables) + return interpolatedContent } /** diff --git a/src/core/prompts/system.ts b/src/core/prompts/system.ts index 22b406e835..077016fd55 100644 --- a/src/core/prompts/system.ts +++ b/src/core/prompts/system.ts @@ -9,6 +9,7 @@ import { getModeBySlug, getGroupName, } from "../../shared/modes" +import { PromptVariables } from "./sections/custom-system-prompt" import { DiffStrategy } from "../../shared/tools" import { McpHub } from "../../services/mcp/McpHub" import { getToolDescriptionsForMode } from "./tools" @@ -125,7 +126,10 @@ export const SYSTEM_PROMPT = async ( } // Try to load custom system prompt from file - const fileCustomSystemPrompt = await loadSystemPromptFile(cwd, mode) + const variablesForPrompt: PromptVariables = { + workspace: cwd, + } + const fileCustomSystemPrompt = await loadSystemPromptFile(cwd, mode, variablesForPrompt) // Check if it's a custom mode const promptComponent = getPromptComponent(customModePrompts?.[mode]) @@ -143,6 +147,7 @@ export const SYSTEM_PROMPT = async ( mode, { language: language ?? formatLanguage(vscode.env.language), rooIgnoreInstructions }, ) + // For file-based prompts, don't include the tool sections return `${roleDefinition} From 3d129e8a8900954a1155756f3f948f9d267b4341 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Wed, 23 Apr 2025 00:35:10 -0600 Subject: [PATCH 34/89] fix: allow opening files without workspace root (#1054) * fix: allow opening files without workspace root The openFile function in open-file.ts was requiring a workspace root to be present, which prevented opening global files (like MCP settings) when no workspace was open. Modified the function to handle absolute paths without this requirement. Previously, trying to open MCP settings in a new window without a workspace would error with "Could not open file: No workspace root found". Now the function properly handles both workspace-relative and absolute paths, allowing global settings files to be accessed in any context. Changes: - Removed workspace root requirement in openFile - Added fallback for relative paths when no workspace is present * fix: update openFile function to use provided path without modification --------- Co-authored-by: Roo Code Co-authored-by: Matt Rubens --- src/integrations/misc/open-file.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/integrations/misc/open-file.ts b/src/integrations/misc/open-file.ts index 5698e919de..b3724068b6 100644 --- a/src/integrations/misc/open-file.ts +++ b/src/integrations/misc/open-file.ts @@ -29,12 +29,14 @@ export async function openFile(filePath: string, options: OpenFileOptions = {}) try { // Get workspace root const workspaceRoot = getWorkspacePath() - if (!workspaceRoot) { - throw new Error("No workspace root found") - } - // If path starts with ./, resolve it relative to workspace root - const fullPath = filePath.startsWith("./") ? path.join(workspaceRoot, filePath.slice(2)) : filePath + // If path starts with ./, resolve it relative to workspace root if available + // Otherwise, use the path as provided without modification + const fullPath = filePath.startsWith("./") + ? workspaceRoot + ? path.join(workspaceRoot, filePath.slice(2)) + : filePath + : filePath const uri = vscode.Uri.file(fullPath) From c2dd743aeb2c8e22818e7a5880ce61d26c6ea1fb Mon Sep 17 00:00:00 2001 From: seedlord Date: Wed, 23 Apr 2025 08:45:35 +0200 Subject: [PATCH 35/89] Fix: Preserve editor state and prevent tab unpinning during diffs (#2857) - Maintains editor view column state when closing and reopening files during diff operations, ensuring tabs stay opened in their original position. - Prevents closing the original editor tab when opening the diff view, preserving pinned status when applying changes via write_to_file or apply_diff. - Updates VSCode workspace launch flag from -n to -W for compatibility. --- evals/apps/cli/src/index.ts | 2 +- src/integrations/editor/DiffViewProvider.ts | 69 ++++++++++++++++++--- 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/evals/apps/cli/src/index.ts b/evals/apps/cli/src/index.ts index 6b287042b0..c221314076 100644 --- a/evals/apps/cli/src/index.ts +++ b/evals/apps/cli/src/index.ts @@ -190,7 +190,7 @@ const runExercise = async ({ run, task, server }: { run: Run; task: Task; server ROO_CODE_IPC_SOCKET_PATH: taskSocketPath, }, shell: "/bin/bash", - })`code --disable-workspace-trust -n ${workspacePath}` + })`code --disable-workspace-trust -W ${workspacePath}` // Give VSCode some time to spawn before connecting to its unix socket. await new Promise((resolve) => setTimeout(resolve, 3_000)) diff --git a/src/integrations/editor/DiffViewProvider.ts b/src/integrations/editor/DiffViewProvider.ts index 0bf494854a..e225230e0b 100644 --- a/src/integrations/editor/DiffViewProvider.ts +++ b/src/integrations/editor/DiffViewProvider.ts @@ -17,6 +17,7 @@ export class DiffViewProvider { originalContent: string | undefined private createdDirs: string[] = [] private documentWasOpen = false + private originalViewColumn?: vscode.ViewColumn // Store the original view column private relPath?: string private newContent?: string private activeDiffEditor?: vscode.TextEditor @@ -65,11 +66,22 @@ export class DiffViewProvider { .filter( (tab) => tab.input instanceof vscode.TabInputText && arePathsEqual(tab.input.uri.fsPath, absolutePath), ) + // Check if the document is already open and store its state + // DO NOT close the original tab to preserve pin status for (const tab of tabs) { - if (!tab.isDirty) { - await vscode.window.tabGroups.close(tab) + if (tab.input instanceof vscode.TabInputText && arePathsEqual(tab.input.uri.fsPath, absolutePath)) { + this.originalViewColumn = tab.group.viewColumn + this.documentWasOpen = true + // Ensure the tab is not dirty before proceeding, but don't close it + if (tab.isDirty) { + // Find the document associated with the tab and save it + const doc = vscode.workspace.textDocuments.find((d) => arePathsEqual(d.uri.fsPath, absolutePath)) + if (doc) { + await doc.save() + } + } + break // Found the relevant tab, no need to check others } - this.documentWasOpen = true } this.activeDiffEditor = await this.openDiffEditor() this.fadedOverlayController = new DecorationController("fadedOverlay", this.activeDiffEditor) @@ -156,9 +168,31 @@ export class DiffViewProvider { await updatedDocument.save() } - await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), { preview: false }) + // Close the diff view first await this.closeAllDiffViews() + // If the original document was open, try to focus it. + // VS Code should handle showing the updated content automatically since the file was saved. + if (this.documentWasOpen && this.originalViewColumn) { + // Find the editor for the original document and reveal it + const originalEditor = vscode.window.visibleTextEditors.find( + (editor) => + arePathsEqual(editor.document.uri.fsPath, absolutePath) && + editor.viewColumn === this.originalViewColumn, + ) + if (originalEditor) { + // Reveal a range (e.g., the start) to ensure focus + const position = new vscode.Position(0, 0) + originalEditor.revealRange(new vscode.Range(position, position), vscode.TextEditorRevealType.AtTop) + } else { + // Fallback if editor not found (shouldn't happen often if documentWasOpen is true) + await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), { + preview: false, + viewColumn: this.originalViewColumn, + }) + } + } + /* Getting diagnostics before and after the file edit is a better approach than automatically tracking problems in real-time. This method ensures we only @@ -237,12 +271,28 @@ export class DiffViewProvider { await vscode.workspace.applyEdit(edit) await updatedDocument.save() console.log(`File ${absolutePath} has been reverted to its original content.`) - if (this.documentWasOpen) { - await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), { - preview: false, - }) - } + // Close the diff view first await this.closeAllDiffViews() + + // If the document was originally open, ensure it's focused. + // The revert logic already applied the original content and saved. + if (this.documentWasOpen && this.originalViewColumn) { + const originalEditor = vscode.window.visibleTextEditors.find( + (editor) => + arePathsEqual(editor.document.uri.fsPath, absolutePath) && + editor.viewColumn === this.originalViewColumn, + ) + if (originalEditor) { + const position = new vscode.Position(0, 0) + originalEditor.revealRange(new vscode.Range(position, position), vscode.TextEditorRevealType.AtTop) + } else { + // Fallback + await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), { + preview: false, + viewColumn: this.originalViewColumn, + }) + } + } } // edit is done @@ -358,6 +408,7 @@ export class DiffViewProvider { this.originalContent = undefined this.createdDirs = [] this.documentWasOpen = false + this.originalViewColumn = undefined // Reset stored view column this.activeDiffEditor = undefined this.fadedOverlayController = undefined this.activeLineController = undefined From 3a5913ffca4db48f3abb60920ff292690eec4ff8 Mon Sep 17 00:00:00 2001 From: Alfredo Medrano Date: Wed, 23 Apr 2025 01:05:47 -0600 Subject: [PATCH 36/89] Bugfix/fix vscodellm model information (#2832) * feat: initialize VS Code Language Model client in constructor * feat: add VS Code LLM models and configuration * feat: integrate VS Code LLM models into API configuration normalization * Fix tests --------- Co-authored-by: Matt Rubens --- src/api/providers/__tests__/vscode-lm.test.ts | 24 ++- src/api/providers/vscode-lm.ts | 26 ++- src/shared/api.ts | 183 ++++++++++++++++++ .../src/components/settings/ApiOptions.tsx | 14 +- 4 files changed, 232 insertions(+), 15 deletions(-) diff --git a/src/api/providers/__tests__/vscode-lm.test.ts b/src/api/providers/__tests__/vscode-lm.test.ts index 34e0d60b1d..d7e674d045 100644 --- a/src/api/providers/__tests__/vscode-lm.test.ts +++ b/src/api/providers/__tests__/vscode-lm.test.ts @@ -134,6 +134,9 @@ describe("VsCodeLmHandler", () => { const mockModel = { ...mockLanguageModelChat } ;(vscode.lm.selectChatModels as jest.Mock).mockResolvedValueOnce([mockModel]) mockLanguageModelChat.countTokens.mockResolvedValue(10) + + // Override the default client with our test client + handler["client"] = mockLanguageModelChat }) it("should stream text responses", async () => { @@ -229,12 +232,7 @@ describe("VsCodeLmHandler", () => { mockLanguageModelChat.sendRequest.mockRejectedValueOnce(new Error("API Error")) - await expect(async () => { - const stream = handler.createMessage(systemPrompt, messages) - for await (const _ of stream) { - // consume stream - } - }).rejects.toThrow("API Error") + await expect(handler.createMessage(systemPrompt, messages).next()).rejects.toThrow("API Error") }) }) @@ -253,6 +251,8 @@ describe("VsCodeLmHandler", () => { }) it("should return fallback model info when no client exists", () => { + // Clear the client first + handler["client"] = null const model = handler.getModel() expect(model.id).toBe("test-vendor/test-family") expect(model.info).toBeDefined() @@ -276,6 +276,10 @@ describe("VsCodeLmHandler", () => { })(), }) + // Override the default client with our test client to ensure it uses + // the mock implementation rather than the default fallback + handler["client"] = mockLanguageModelChat + const result = await handler.completePrompt("Test prompt") expect(result).toBe(responseText) expect(mockLanguageModelChat.sendRequest).toHaveBeenCalled() @@ -287,9 +291,11 @@ describe("VsCodeLmHandler", () => { mockLanguageModelChat.sendRequest.mockRejectedValueOnce(new Error("Completion failed")) - await expect(handler.completePrompt("Test prompt")).rejects.toThrow( - "VSCode LM completion error: Completion failed", - ) + // Make sure we're using the mock client + handler["client"] = mockLanguageModelChat + + const promise = handler.completePrompt("Test prompt") + await expect(promise).rejects.toThrow("VSCode LM completion error: Completion failed") }) }) }) diff --git a/src/api/providers/vscode-lm.ts b/src/api/providers/vscode-lm.ts index 1b5f573637..af998389c2 100644 --- a/src/api/providers/vscode-lm.ts +++ b/src/api/providers/vscode-lm.ts @@ -61,6 +61,7 @@ export class VsCodeLmHandler extends BaseProvider implements SingleCompletionHan } } }) + this.initializeClient() } catch (error) { // Ensure cleanup if constructor fails this.dispose() @@ -70,7 +71,30 @@ export class VsCodeLmHandler extends BaseProvider implements SingleCompletionHan ) } } - + /** + * Initializes the VS Code Language Model client. + * This method is called during the constructor to set up the client. + * This useful when the client is not created yet and call getModel() before the client is created. + * @returns Promise + * @throws Error when client initialization fails + */ + async initializeClient(): Promise { + try { + // Check if the client is already initialized + if (this.client) { + console.debug("Roo Code : Client already initialized") + return + } + // Create a new client instance + this.client = await this.createClient(this.options.vsCodeLmModelSelector || {}) + console.debug("Roo Code : Client initialized successfully") + } catch (error) { + // Handle errors during client initialization + const errorMessage = error instanceof Error ? error.message : "Unknown error" + console.error("Roo Code : Client initialization failed:", errorMessage) + throw new Error(`Roo Code : Failed to initialize client: ${errorMessage}`) + } + } /** * Creates a language model chat client based on the provided selector. * diff --git a/src/shared/api.ts b/src/shared/api.ts index 825a95bc76..34ec801187 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -1179,3 +1179,186 @@ export const xaiModels = { description: "xAI's Grok Beta model (legacy) with 131K context window", }, } as const satisfies Record + +export type VscodeLlmModelId = keyof typeof vscodeLlmModels +export const vscodeLlmDefaultModelId: VscodeLlmModelId = "claude-3.5-sonnet" +export const vscodeLlmModels = { + "gpt-3.5-turbo": { + contextWindow: 12114, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "gpt-3.5-turbo", + version: "gpt-3.5-turbo-0613", + name: "GPT 3.5 Turbo", + supportsToolCalling: true, + maxInputTokens: 12114, + }, + "gpt-4o-mini": { + contextWindow: 12115, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "gpt-4o-mini", + version: "gpt-4o-mini-2024-07-18", + name: "GPT-4o mini", + supportsToolCalling: true, + maxInputTokens: 12115, + }, + "gpt-4": { + contextWindow: 28501, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "gpt-4", + version: "gpt-4-0613", + name: "GPT 4", + supportsToolCalling: true, + maxInputTokens: 28501, + }, + "gpt-4-0125-preview": { + contextWindow: 63826, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "gpt-4-turbo", + version: "gpt-4-0125-preview", + name: "GPT 4 Turbo", + supportsToolCalling: true, + maxInputTokens: 63826, + }, + "gpt-4o": { + contextWindow: 63827, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "gpt-4o", + version: "gpt-4o-2024-11-20", + name: "GPT-4o", + supportsToolCalling: true, + maxInputTokens: 63827, + }, + o1: { + contextWindow: 19827, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "o1-ga", + version: "o1-2024-12-17", + name: "o1 (Preview)", + supportsToolCalling: true, + maxInputTokens: 19827, + }, + "o3-mini": { + contextWindow: 63827, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "o3-mini", + version: "o3-mini-2025-01-31", + name: "o3-mini", + supportsToolCalling: true, + maxInputTokens: 63827, + }, + "claude-3.5-sonnet": { + contextWindow: 81638, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "claude-3.5-sonnet", + version: "claude-3.5-sonnet", + name: "Claude 3.5 Sonnet", + supportsToolCalling: true, + maxInputTokens: 81638, + }, + "claude-3.7-sonnet": { + contextWindow: 89827, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "claude-3.7-sonnet", + version: "claude-3.7-sonnet", + name: "Claude 3.7 Sonnet", + supportsToolCalling: true, + maxInputTokens: 89827, + }, + "claude-3.7-sonnet-thought": { + contextWindow: 89827, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "claude-3.7-sonnet-thought", + version: "claude-3.7-sonnet-thought", + name: "Claude 3.7 Sonnet Thinking", + supportsToolCalling: false, + maxInputTokens: 89827, + thinking: true, + }, + "gemini-2.0-flash-001": { + contextWindow: 127827, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "gemini-2.0-flash", + version: "gemini-2.0-flash-001", + name: "Gemini 2.0 Flash", + supportsToolCalling: false, + maxInputTokens: 127827, + }, + "gemini-2.5-pro": { + contextWindow: 63830, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "gemini-2.5-pro", + version: "gemini-2.5-pro-preview-03-25", + name: "Gemini 2.5 Pro (Preview)", + supportsToolCalling: true, + maxInputTokens: 63830, + }, + "o4-mini": { + contextWindow: 111446, + supportsImages: false, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "o4-mini", + version: "o4-mini-2025-04-16", + name: "o4-mini (Preview)", + supportsToolCalling: true, + maxInputTokens: 111446, + }, + "gpt-4.1": { + contextWindow: 111446, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0, + outputPrice: 0, + family: "gpt-4.1", + version: "gpt-4.1-2025-04-14", + name: "GPT-4.1 (Preview)", + supportsToolCalling: true, + maxInputTokens: 111446, + }, +} as const satisfies Record< + string, + ModelInfo & { + family: string + version: string + name: string + supportsToolCalling: boolean + maxInputTokens: number + } +> diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 9381690b30..156b24c697 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -38,6 +38,8 @@ import { xaiDefaultModelId, xaiModels, ApiProvider, + vscodeLlmModels, + vscodeLlmDefaultModelId, } from "@roo/shared/api" import { ExtensionMessage } from "@roo/shared/ExtensionMessage" @@ -1738,7 +1740,6 @@ const ApiOptions = ({ export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration) { const provider = apiConfiguration?.apiProvider || "anthropic" const modelId = apiConfiguration?.apiModelId - const getProviderData = (models: Record, defaultId: string) => { let selectedModelId: string let selectedModelInfo: ModelInfo @@ -1827,15 +1828,18 @@ export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration) { selectedModelInfo: openAiModelInfoSaneDefaults, } case "vscode-lm": + const modelFamily = apiConfiguration?.vsCodeLmModelSelector?.family ?? vscodeLlmDefaultModelId + const modelInfo = { + ...openAiModelInfoSaneDefaults, + ...vscodeLlmModels[modelFamily as keyof typeof vscodeLlmModels], + supportsImages: false, // VSCode LM API currently doesn't support images. + } return { selectedProvider: provider, selectedModelId: apiConfiguration?.vsCodeLmModelSelector ? `${apiConfiguration.vsCodeLmModelSelector.vendor}/${apiConfiguration.vsCodeLmModelSelector.family}` : "", - selectedModelInfo: { - ...openAiModelInfoSaneDefaults, - supportsImages: false, // VSCode LM API currently doesn't support images. - }, + selectedModelInfo: modelInfo, } default: return getProviderData(anthropicModels, anthropicDefaultModelId) From 33ee5d6c34ce324441beecafa55dfea98eaa829b Mon Sep 17 00:00:00 2001 From: hongzio <11085613+hongzio@users.noreply.github.com> Date: Wed, 23 Apr 2025 16:06:48 +0900 Subject: [PATCH 37/89] Fix: focusInput open roo code panel (#2626) (#2817) * Fix: focusInput open roo code panel (#2626) * Fix: `roo-cline.focusInput` open roo code panel * fixup! Fix: focusInput open roo code panel (#2626) --- src/activate/registerCommands.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/activate/registerCommands.ts b/src/activate/registerCommands.ts index 486566357b..1883083b6e 100644 --- a/src/activate/registerCommands.ts +++ b/src/activate/registerCommands.ts @@ -114,8 +114,20 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt const { promptForCustomStoragePath } = await import("../shared/storagePathManager") await promptForCustomStoragePath() }, - "roo-cline.focusInput": () => { - provider.postMessageToWebview({ type: "action", action: "focusInput" }) + "roo-cline.focusInput": async () => { + try { + const panel = getPanel() + if (!panel) { + await vscode.commands.executeCommand("workbench.view.extension.roo-cline-ActivityBar") + } else if (panel === tabPanel) { + panel.reveal(vscode.ViewColumn.Active, false) + } else if (panel === sidebarPanel) { + await vscode.commands.executeCommand(`${ClineProvider.sideBarId}.focus`) + provider.postMessageToWebview({ type: "action", action: "focusInput" }) + } + } catch (error) { + outputChannel.appendLine(`Error focusing input: ${error}`) + } }, "roo.acceptInput": () => { const visibleProvider = getVisibleProviderOrLog(outputChannel) From 3df9eac5b7798fe6426a79ccceff9034d1406240 Mon Sep 17 00:00:00 2001 From: Dicha Zelianivan Arkana <51877647+elianiva@users.noreply.github.com> Date: Wed, 23 Apr 2025 14:09:29 +0700 Subject: [PATCH 38/89] fix(mention): conditionally remove aftercursor content (#2732) --- webview-ui/src/utils/context-mentions.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/utils/context-mentions.ts b/webview-ui/src/utils/context-mentions.ts index 9302598bc0..293aa8f74b 100644 --- a/webview-ui/src/utils/context-mentions.ts +++ b/webview-ui/src/utils/context-mentions.ts @@ -33,7 +33,12 @@ export function insertMention( if (lastAtIndex !== -1) { // If there's an '@' symbol, replace everything after it with the new mention const beforeMention = text.slice(0, lastAtIndex) - newValue = beforeMention + "@" + value + " " + afterCursor.replace(/^[^\s]*/, "") + // Only replace if afterCursor is all alphanumerical + // This is required to handle languages that don't use space as a word separator (chinese, japanese, korean, etc) + const afterCursorContent = /^[a-zA-Z0-9\s]*$/.test(afterCursor) + ? afterCursor.replace(/^[^\s]*/, "") + : afterCursor + newValue = beforeMention + "@" + value + " " + afterCursorContent mentionIndex = lastAtIndex } else { // If there's no '@' symbol, insert the mention at the cursor position From 01a7a66ca0d82acf2843f942713edb2551920f0f Mon Sep 17 00:00:00 2001 From: Trung Dang Date: Wed, 23 Apr 2025 14:13:04 +0700 Subject: [PATCH 39/89] feat: add `injectEnv` util, support env ref in mcp config (#2679) * feat: support environment variables reference in mcp `env` config * tests(src/utils/config): add test for `injectEnv` * fix(injectEnv): use `env == null` and `??` check instead of `!env`, `||` * refactor: remove unnecessary type declare * chore!: simplify regexp, remove replacement for env vars with dots --- src/services/mcp/McpHub.ts | 3 +- src/utils/__tests__/config.test.ts | 100 +++++++++++++++++++++++++++++ src/utils/config.ts | 25 ++++++++ 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/utils/__tests__/config.test.ts create mode 100644 src/utils/config.ts diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index 31d0dd8020..59349ffdbc 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -30,6 +30,7 @@ import { } from "../../shared/mcp" import { fileExistsAtPath } from "../../utils/fs" import { arePathsEqual } from "../../utils/path" +import { injectEnv } from "../../utils/config" export type McpConnection = { server: McpServer @@ -452,7 +453,7 @@ export class McpHub { args: config.args, cwd: config.cwd, env: { - ...config.env, + ...(config.env ? await injectEnv(config.env) : {}), ...(process.env.PATH ? { PATH: process.env.PATH } : {}), }, stderr: "pipe", diff --git a/src/utils/__tests__/config.test.ts b/src/utils/__tests__/config.test.ts new file mode 100644 index 0000000000..c5e9e2ba88 --- /dev/null +++ b/src/utils/__tests__/config.test.ts @@ -0,0 +1,100 @@ +import { injectEnv } from "../config" + +describe("injectEnv", () => { + const originalEnv = process.env + + beforeEach(() => { + // Assign a new / reset process.env before each test + jest.resetModules() + process.env = { ...originalEnv } + }) + + afterAll(() => { + // Restore original process.env after all tests + process.env = originalEnv + }) + + it("should replace env variables in a string", async () => { + process.env.TEST_VAR = "testValue" + const configString = "Hello ${env:TEST_VAR}" + const expectedString = "Hello testValue" + const result = await injectEnv(configString) + expect(result).toBe(expectedString) + }) + + it("should replace env variables in an object", async () => { + process.env.API_KEY = "12345" + process.env.ENDPOINT = "https://example.com" + const configObject = { + key: "${env:API_KEY}", + url: "${env:ENDPOINT}", + nested: { + value: "Keep this ${env:API_KEY}", + }, + } + const expectedObject = { + key: "12345", + url: "https://example.com", + nested: { + value: "Keep this 12345", + }, + } + const result = await injectEnv(configObject) + expect(result).toEqual(expectedObject) + }) + + it("should use notFoundValue for missing env variables", async () => { + const consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation() + process.env.EXISTING_VAR = "exists" + const configString = "Value: ${env:EXISTING_VAR}, Missing: ${env:MISSING_VAR}" + const expectedString = "Value: exists, Missing: NOT_FOUND" + const result = await injectEnv(configString, "NOT_FOUND") + expect(result).toBe(expectedString) + expect(consoleWarnSpy).toHaveBeenCalledWith( + "[injectEnv] env variable MISSING_VAR referenced but not found in process.env", + ) + consoleWarnSpy.mockRestore() + }) + + it("should use default empty string for missing env variables if notFoundValue is not provided", async () => { + const consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation() + const configString = "Missing: ${env:ANOTHER_MISSING}" + const expectedString = "Missing: " + const result = await injectEnv(configString) + expect(result).toBe(expectedString) + expect(consoleWarnSpy).toHaveBeenCalledWith( + "[injectEnv] env variable ANOTHER_MISSING referenced but not found in process.env", + ) + consoleWarnSpy.mockRestore() + }) + + it("should handle strings without env variables", async () => { + const configString = "Just a regular string" + const result = await injectEnv(configString) + expect(result).toBe(configString) + }) + + it("should handle objects without env variables", async () => { + const configObject = { key: "value", number: 123 } + const result = await injectEnv(configObject) + expect(result).toEqual(configObject) + }) + + it("should not mutate the original object", async () => { + process.env.MUTATE_TEST = "mutated" + const originalObject = { value: "${env:MUTATE_TEST}" } + const copyOfOriginal = { ...originalObject } // Shallow copy for comparison + await injectEnv(originalObject) + expect(originalObject).toEqual(copyOfOriginal) // Check if the original object remains unchanged + }) + + it("should handle empty string input", async () => { + const result = await injectEnv("") + expect(result).toBe("") + }) + + it("should handle empty object input", async () => { + const result = await injectEnv({}) + expect(result).toEqual({}) + }) +}) diff --git a/src/utils/config.ts b/src/utils/config.ts new file mode 100644 index 0000000000..24bf9cbdec --- /dev/null +++ b/src/utils/config.ts @@ -0,0 +1,25 @@ +/** + * Deeply injects environment variables into a configuration object/string/json + * + * Uses VSCode env:name pattern: https://code.visualstudio.com/docs/reference/variables-reference#_environment-variables + * + * Does not mutate original object + */ +export async function injectEnv(config: string | Record, notFoundValue: any = "") { + // Use simple regex replace for now, will see if object traversal and recursion is needed here (e.g: for non-serializable objects) + + const isObject = typeof config === "object" + let _config = isObject ? JSON.stringify(config) : config + + _config = _config.replace(/\$\{env:([\w]+)\}/g, (_, name) => { + // Check if null or undefined + // intentionally using == to match null | undefined + // eslint-disable-next-line eqeqeq + if (process.env[name] == null) + console.warn(`[injectEnv] env variable ${name} referenced but not found in process.env`) + + return process.env[name] ?? notFoundValue + }) + + return isObject ? JSON.parse(_config) : _config +} From e403a96e668da8962e5d0ef03ad328f153e279a6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 23 Apr 2025 03:14:08 -0400 Subject: [PATCH 40/89] Update contributors list (#2867) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 48 ++++++++++++++++++++--------------------- locales/ca/README.md | 28 ++++++++++++------------ locales/de/README.md | 28 ++++++++++++------------ locales/es/README.md | 28 ++++++++++++------------ locales/fr/README.md | 28 ++++++++++++------------ locales/hi/README.md | 28 ++++++++++++------------ locales/it/README.md | 28 ++++++++++++------------ locales/ja/README.md | 28 ++++++++++++------------ locales/ko/README.md | 28 ++++++++++++------------ locales/pl/README.md | 28 ++++++++++++------------ locales/pt-BR/README.md | 28 ++++++++++++------------ locales/tr/README.md | 28 ++++++++++++------------ locales/vi/README.md | 28 ++++++++++++------------ locales/zh-CN/README.md | 28 ++++++++++++------------ locales/zh-TW/README.md | 28 ++++++++++++------------ 15 files changed, 220 insertions(+), 220 deletions(-) diff --git a/README.md b/README.md index 81fc0781de..d14e93d964 100644 --- a/README.md +++ b/README.md @@ -181,30 +181,30 @@ 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
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| nbihan-mediware
nbihan-mediware
| PeterDaveHello
PeterDaveHello
| RaySinner
RaySinner
| sachasayan
sachasayan
| -| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| -| dtrugman
dtrugman
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| -| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| elianiva
elianiva
| aitoroses
aitoroses
| yt3trees
yt3trees
| -| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| -| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| -| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| -| dairui1
dairui1
| dqroid
dqroid
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| -| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| -| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| -| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| -| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| -| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| -| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| -| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | diff --git a/locales/ca/README.md b/locales/ca/README.md index 89b7b23fe1..a04ea161c2 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -184,24 +184,24 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 6f29b9a1d9..d3a55b6b0c 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -184,24 +184,24 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index eb23013fac..68470e32bf 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -184,24 +184,24 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 563b45126a..617f84f535 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -184,24 +184,24 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 25c9ddbb1c..50ca4caa06 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -184,24 +184,24 @@ Roo Code को बेहतर बनाने में मदद करने |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index ee75eabcc3..5b802fc888 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -184,24 +184,24 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 67eb93e6cf..1b4ea0e8c0 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -184,24 +184,24 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 4a62a139bf..5bdf5efd37 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -184,24 +184,24 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index a45d971bfc..d3235ab1b0 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -184,24 +184,24 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 97ff191778..7f2f14d8f2 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -184,24 +184,24 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index ef52cb6305..58e0e5a5eb 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -184,24 +184,24 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index b8d3305741..52d377b2d2 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -184,24 +184,24 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 7007478c2f..835da775cd 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -184,24 +184,24 @@ code --install-extension bin/roo-cline-.vsix |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index fbd7f7b143..a27cf1bbc9 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -185,24 +185,24 @@ code --install-extension bin/roo-cline-.vsix |jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| |monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| |vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|nbihan-mediware
nbihan-mediware
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|sachasayan
sachasayan
| -|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|dtrugman
dtrugman
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
| -|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|elianiva
elianiva
|aitoroses
aitoroses
|yt3trees
yt3trees
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| +|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| +|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| |franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| |taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| |bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| |Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
| -|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
| -|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
| -|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
| -|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
| -|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| -|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| -|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| -|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|vladstudio
vladstudio
| -|Yoshino-Yukitaro
Yoshino-Yukitaro
| | | | | | +|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| +|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| +|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| +|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| +|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| +|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| +|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| +|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| +|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| +|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | ## 授權 From 74faacd69d9d767d0fb6ef9d0c9d2ba01957838b Mon Sep 17 00:00:00 2001 From: Wojciech Kordalski Date: Wed, 23 Apr 2025 10:42:06 +0200 Subject: [PATCH 41/89] FakeAI "controller" object must not be copied (#2463) The FakeAI object passed by the user must be exactly the same object that is passed to FakeAIHandler via API configuration. Unfortunatelly, as the VSCode global state is used as configuration storage, we lose this property (VSCode global state creates copies of the object). Also the class of the stored object is lost, so methods of the object are unavailable. Therefore, we store the original objects in global variable and use ID field of FakeAI object to identify the original object. --- src/api/providers/fake-ai.ts | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/api/providers/fake-ai.ts b/src/api/providers/fake-ai.ts index f7509c8b06..68d028338e 100644 --- a/src/api/providers/fake-ai.ts +++ b/src/api/providers/fake-ai.ts @@ -4,21 +4,52 @@ import { ApiHandlerOptions, ModelInfo } from "../../shared/api" import { ApiStream } from "../transform/stream" interface FakeAI { + /** + * The unique identifier for the FakeAI instance. + * It is used to lookup the original FakeAI object in the fakeAiMap + * when the fakeAI object is read from the VSCode global state. + */ + readonly id: string + + /** + * A function set by the FakeAIHandler on the FakeAI instance, that removes + * the FakeAI instance from the fakeAIMap when the FakeAI instance is + * no longer needed. + */ + removeFromCache?: () => void + createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream getModel(): { id: string; info: ModelInfo } countTokens(content: Array): Promise completePrompt(prompt: string): Promise } +/** + * API providers configuration is stored in the VSCode global state. + * Therefore, when a new task is created, the FakeAI object in the configuration + * is a new object not related to the original one, but with the same ID. + * + * We use the ID to lookup the original FakeAI object in the mapping. + */ +let fakeAiMap: Map = new Map() + export class FakeAIHandler implements ApiHandler, SingleCompletionHandler { private ai: FakeAI constructor(options: ApiHandlerOptions) { - if (!options.fakeAi) { + const optionsFakeAi = options.fakeAi as FakeAI | undefined + if (!optionsFakeAi) { throw new Error("Fake AI is not set") } - this.ai = options.fakeAi as FakeAI + const id = optionsFakeAi.id + let cachedFakeAi = fakeAiMap.get(id) + if (cachedFakeAi === undefined) { + cachedFakeAi = optionsFakeAi + cachedFakeAi.removeFromCache = () => fakeAiMap.delete(id) + fakeAiMap.set(id, cachedFakeAi) + } + this.ai = cachedFakeAi } async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { From 844753e0d99e1927a5ec6fec14abe2dcecc1334f Mon Sep 17 00:00:00 2001 From: Dominik Oswald <6849456+d-oit@users.noreply.github.com> Date: Wed, 23 Apr 2025 15:34:32 +0200 Subject: [PATCH 42/89] Remove unnecessary cost calculation from vscode-lm.ts (#2875) * feat: Removed unnecessary cost calculation * Update vscode-lm.ts --------- Co-authored-by: Matt Rubens --- src/api/providers/vscode-lm.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/api/providers/vscode-lm.ts b/src/api/providers/vscode-lm.ts index af998389c2..d37f92d7f5 100644 --- a/src/api/providers/vscode-lm.ts +++ b/src/api/providers/vscode-lm.ts @@ -2,7 +2,6 @@ import { Anthropic } from "@anthropic-ai/sdk" import * as vscode from "vscode" import { SingleCompletionHandler } from "../" -import { calculateApiCostAnthropic } from "../../utils/cost" import { ApiStream } from "../transform/stream" import { convertToVsCodeLmMessages } from "../transform/vscode-lm-format" import { SELECTOR_SEPARATOR, stringifyVsCodeLmModelSelector } from "../../shared/vsCodeSelectorUtils" @@ -443,8 +442,7 @@ export class VsCodeLmHandler extends BaseProvider implements SingleCompletionHan yield { type: "usage", inputTokens: totalInputTokens, - outputTokens: totalOutputTokens, - totalCost: calculateApiCostAnthropic(this.getModel().info, totalInputTokens, totalOutputTokens), + outputTokens: totalOutputTokens } } catch (error: unknown) { this.ensureCleanState() From e53d299acf922395acf7b7b99a9a0230580dd4d9 Mon Sep 17 00:00:00 2001 From: mlopezr Date: Wed, 23 Apr 2025 15:36:50 +0200 Subject: [PATCH 43/89] Allow Amazon Bedrock Marketplace ARNs (#2874) * Update validate.ts Allow ARNs from Bedrock Marketplace, which are different because models are deployed using SageMaker Inference behind the scenes. * Update bedrock.ts Allow ARNs from Bedrock Marketplace, which are different because models are deployed using SageMaker Inference behind the scenes. --- src/api/providers/bedrock.ts | 2 +- webview-ui/src/utils/validate.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/providers/bedrock.ts b/src/api/providers/bedrock.ts index c2da82d4ac..116e2822dd 100644 --- a/src/api/providers/bedrock.ts +++ b/src/api/providers/bedrock.ts @@ -532,7 +532,7 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH * match[4] - The resource ID (e.g., "anthropic.claude-3-sonnet-20240229-v1:0") */ - const arnRegex = /^arn:aws:bedrock:([^:]+):([^:]*):(?:([^\/]+)\/([\w\.\-:]+)|([^\/]+))$/ + const arnRegex = /^arn:aws:(?:bedrock|sagemaker):([^:]+):([^:]*):(?:([^\/]+)\/([\w\.\-:]+)|([^\/]+))$/ let match = arn.match(arnRegex) if (match && match[1] && match[3] && match[4]) { diff --git a/webview-ui/src/utils/validate.ts b/webview-ui/src/utils/validate.ts index 82fda92626..439839a347 100644 --- a/webview-ui/src/utils/validate.ts +++ b/webview-ui/src/utils/validate.ts @@ -89,7 +89,7 @@ export function validateApiConfiguration(apiConfiguration?: ApiConfiguration): s */ export function validateBedrockArn(arn: string, region?: string) { // Validate ARN format - const arnRegex = /^arn:aws:bedrock:([^:]+):([^:]*):(?:([^/]+)\/([\w.\-:]+)|([^/]+))$/ + const arnRegex = /^arn:aws:(?:bedrock|sagemaker):([^:]+):([^:]*):(?:([^/]+)\/([\w.\-:]+)|([^/]+))$/ const match = arn.match(arnRegex) if (!match) { From a9ca17717c438ffffb22e1776ce20f9e1a85ca7d Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 23 Apr 2025 06:45:57 -0700 Subject: [PATCH 44/89] OpenRouter Gemini caching (#2847) * OpenRouter Gemini caching * Fix tests * Remove unsupported models * Clean up the task header a bit * Update src/api/providers/openrouter.ts Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Remove model that doesn't seem to work --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- .../providers/__tests__/openrouter.test.ts | 500 +++++++++--------- src/api/providers/openrouter.ts | 134 +++-- src/api/transform/stream.ts | 4 +- webview-ui/src/components/chat/ChatRow.tsx | 6 +- .../components/chat/ContextWindowProgress.tsx | 90 ++++ webview-ui/src/components/chat/Mention.tsx | 33 ++ .../src/components/chat/TaskActions.tsx | 54 ++ webview-ui/src/components/chat/TaskHeader.tsx | 229 ++------ 8 files changed, 545 insertions(+), 505 deletions(-) create mode 100644 webview-ui/src/components/chat/ContextWindowProgress.tsx create mode 100644 webview-ui/src/components/chat/Mention.tsx create mode 100644 webview-ui/src/components/chat/TaskActions.tsx diff --git a/src/api/providers/__tests__/openrouter.test.ts b/src/api/providers/__tests__/openrouter.test.ts index 996644b07f..d592e6c968 100644 --- a/src/api/providers/__tests__/openrouter.test.ts +++ b/src/api/providers/__tests__/openrouter.test.ts @@ -15,7 +15,7 @@ jest.mock("delay", () => jest.fn(() => Promise.resolve())) const mockOpenRouterModelInfo: ModelInfo = { maxTokens: 1000, contextWindow: 2000, - supportsPromptCache: true, + supportsPromptCache: false, inputPrice: 0.01, outputPrice: 0.02, } @@ -31,9 +31,10 @@ describe("OpenRouterHandler", () => { jest.clearAllMocks() }) - test("constructor initializes with correct options", () => { + it("initializes with correct options", () => { const handler = new OpenRouterHandler(mockOptions) expect(handler).toBeInstanceOf(OpenRouterHandler) + expect(OpenAI).toHaveBeenCalledWith({ baseURL: "https://openrouter.ai/api/v1", apiKey: mockOptions.openRouterApiKey, @@ -44,284 +45,257 @@ describe("OpenRouterHandler", () => { }) }) - test("getModel returns correct model info when options are provided", () => { - const handler = new OpenRouterHandler(mockOptions) - const result = handler.getModel() + describe("getModel", () => { + it("returns correct model info when options are provided", () => { + const handler = new OpenRouterHandler(mockOptions) + const result = handler.getModel() - expect(result).toEqual({ - id: mockOptions.openRouterModelId, - info: mockOptions.openRouterModelInfo, - maxTokens: 1000, - temperature: 0, - thinking: undefined, - topP: undefined, - }) - }) - - test("getModel returns default model info when options are not provided", () => { - const handler = new OpenRouterHandler({}) - const result = handler.getModel() - - expect(result.id).toBe("anthropic/claude-3.7-sonnet") - expect(result.info.supportsPromptCache).toBe(true) - }) - - test("getModel honors custom maxTokens for thinking models", () => { - const handler = new OpenRouterHandler({ - openRouterApiKey: "test-key", - openRouterModelId: "test-model", - openRouterModelInfo: { - ...mockOpenRouterModelInfo, - maxTokens: 128_000, - thinking: true, - }, - modelMaxTokens: 32_768, - modelMaxThinkingTokens: 16_384, - }) - - const result = handler.getModel() - expect(result.maxTokens).toBe(32_768) - expect(result.thinking).toEqual({ type: "enabled", budget_tokens: 16_384 }) - expect(result.temperature).toBe(1.0) - }) - - test("getModel does not honor custom maxTokens for non-thinking models", () => { - const handler = new OpenRouterHandler({ - ...mockOptions, - modelMaxTokens: 32_768, - modelMaxThinkingTokens: 16_384, - }) - - const result = handler.getModel() - expect(result.maxTokens).toBe(1000) - expect(result.thinking).toBeUndefined() - expect(result.temperature).toBe(0) - }) - - test("createMessage generates correct stream chunks", async () => { - const handler = new OpenRouterHandler(mockOptions) - const mockStream = { - async *[Symbol.asyncIterator]() { - yield { - id: "test-id", - choices: [ - { - delta: { - content: "test response", - }, - }, - ], - } - // Add usage information in the stream response - yield { - id: "test-id", - choices: [{ delta: {} }], - usage: { - prompt_tokens: 10, - completion_tokens: 20, - cost: 0.001, - }, - } - }, - } - - // Mock OpenAI chat.completions.create - const mockCreate = jest.fn().mockResolvedValue(mockStream) - ;(OpenAI as jest.MockedClass).prototype.chat = { - completions: { create: mockCreate }, - } as any - - const systemPrompt = "test system prompt" - const messages: Anthropic.Messages.MessageParam[] = [{ role: "user" as const, content: "test message" }] - - const generator = handler.createMessage(systemPrompt, messages) - const chunks = [] - - for await (const chunk of generator) { - chunks.push(chunk) - } - - // Verify stream chunks - expect(chunks).toHaveLength(2) // One text chunk and one usage chunk - expect(chunks[0]).toEqual({ - type: "text", - text: "test response", - }) - expect(chunks[1]).toEqual({ - type: "usage", - inputTokens: 10, - outputTokens: 20, - totalCost: 0.001, - }) - - // Verify OpenAI client was called with correct parameters - expect(mockCreate).toHaveBeenCalledWith( - expect.objectContaining({ - model: mockOptions.openRouterModelId, + expect(result).toEqual({ + id: mockOptions.openRouterModelId, + info: mockOptions.openRouterModelInfo, + maxTokens: 1000, + reasoning: undefined, + supportsPromptCache: false, temperature: 0, - messages: expect.arrayContaining([ - { role: "system", content: systemPrompt }, - { role: "user", content: "test message" }, - ]), - stream: true, - }), - ) - }) - - test("createMessage with middle-out transform enabled", async () => { - const handler = new OpenRouterHandler({ - ...mockOptions, - openRouterUseMiddleOutTransform: true, + thinking: undefined, + topP: undefined, + }) }) - const mockStream = { - async *[Symbol.asyncIterator]() { - yield { - id: "test-id", - choices: [ - { - delta: { - content: "test response", - }, - }, - ], - } - }, - } - const mockCreate = jest.fn().mockResolvedValue(mockStream) - ;(OpenAI as jest.MockedClass).prototype.chat = { - completions: { create: mockCreate }, - } as any - ;(axios.get as jest.Mock).mockResolvedValue({ data: { data: {} } }) + it("returns default model info when options are not provided", () => { + const handler = new OpenRouterHandler({}) + const result = handler.getModel() - await handler.createMessage("test", []).next() - - expect(mockCreate).toHaveBeenCalledWith( - expect.objectContaining({ - transforms: ["middle-out"], - }), - ) - }) - - test("createMessage with Claude model adds cache control", async () => { - const handler = new OpenRouterHandler({ - ...mockOptions, - openRouterModelId: "anthropic/claude-3.5-sonnet", + expect(result.id).toBe("anthropic/claude-3.7-sonnet") + expect(result.info.supportsPromptCache).toBe(true) }) - const mockStream = { - async *[Symbol.asyncIterator]() { - yield { - id: "test-id", - choices: [ - { - delta: { - content: "test response", - }, - }, - ], - } - }, - } - const mockCreate = jest.fn().mockResolvedValue(mockStream) - ;(OpenAI as jest.MockedClass).prototype.chat = { - completions: { create: mockCreate }, - } as any - ;(axios.get as jest.Mock).mockResolvedValue({ data: { data: {} } }) + it("honors custom maxTokens for thinking models", () => { + const handler = new OpenRouterHandler({ + openRouterApiKey: "test-key", + openRouterModelId: "test-model", + openRouterModelInfo: { + ...mockOpenRouterModelInfo, + maxTokens: 128_000, + thinking: true, + }, + modelMaxTokens: 32_768, + modelMaxThinkingTokens: 16_384, + }) - const messages: Anthropic.Messages.MessageParam[] = [ - { role: "user", content: "message 1" }, - { role: "assistant", content: "response 1" }, - { role: "user", content: "message 2" }, - ] + const result = handler.getModel() + expect(result.maxTokens).toBe(32_768) + expect(result.thinking).toEqual({ type: "enabled", budget_tokens: 16_384 }) + expect(result.temperature).toBe(1.0) + }) - await handler.createMessage("test system", messages).next() + it("does not honor custom maxTokens for non-thinking models", () => { + const handler = new OpenRouterHandler({ + ...mockOptions, + modelMaxTokens: 32_768, + modelMaxThinkingTokens: 16_384, + }) - expect(mockCreate).toHaveBeenCalledWith( - expect.objectContaining({ - messages: expect.arrayContaining([ - expect.objectContaining({ - role: "system", - content: expect.arrayContaining([ - expect.objectContaining({ - cache_control: { type: "ephemeral" }, - }), - ]), - }), - ]), - }), - ) - }) - - test("createMessage handles API errors", async () => { - const handler = new OpenRouterHandler(mockOptions) - const mockStream = { - async *[Symbol.asyncIterator]() { - yield { - error: { - message: "API Error", - code: 500, - }, - } - }, - } - - const mockCreate = jest.fn().mockResolvedValue(mockStream) - ;(OpenAI as jest.MockedClass).prototype.chat = { - completions: { create: mockCreate }, - } as any - - const generator = handler.createMessage("test", []) - await expect(generator.next()).rejects.toThrow("OpenRouter API Error 500: API Error") - }) - - test("completePrompt returns correct response", async () => { - const handler = new OpenRouterHandler(mockOptions) - const mockResponse = { choices: [{ message: { content: "test completion" } }] } - - const mockCreate = jest.fn().mockResolvedValue(mockResponse) - ;(OpenAI as jest.MockedClass).prototype.chat = { - completions: { create: mockCreate }, - } as any - - const result = await handler.completePrompt("test prompt") - - expect(result).toBe("test completion") - - expect(mockCreate).toHaveBeenCalledWith({ - model: mockOptions.openRouterModelId, - max_tokens: 1000, - thinking: undefined, - temperature: 0, - messages: [{ role: "user", content: "test prompt" }], - stream: false, + const result = handler.getModel() + expect(result.maxTokens).toBe(1000) + expect(result.thinking).toBeUndefined() + expect(result.temperature).toBe(0) }) }) - test("completePrompt handles API errors", async () => { - const handler = new OpenRouterHandler(mockOptions) - const mockError = { - error: { - message: "API Error", - code: 500, - }, - } + describe("createMessage", () => { + it("generates correct stream chunks", async () => { + const handler = new OpenRouterHandler(mockOptions) - const mockCreate = jest.fn().mockResolvedValue(mockError) - ;(OpenAI as jest.MockedClass).prototype.chat = { - completions: { create: mockCreate }, - } as any + const mockStream = { + async *[Symbol.asyncIterator]() { + yield { + id: "test-id", + choices: [{ delta: { content: "test response" } }], + } + yield { + id: "test-id", + choices: [{ delta: {} }], + usage: { prompt_tokens: 10, completion_tokens: 20, cost: 0.001 }, + } + }, + } - await expect(handler.completePrompt("test prompt")).rejects.toThrow("OpenRouter API Error 500: API Error") + // Mock OpenAI chat.completions.create + const mockCreate = jest.fn().mockResolvedValue(mockStream) + + ;(OpenAI as jest.MockedClass).prototype.chat = { + completions: { create: mockCreate }, + } as any + + const systemPrompt = "test system prompt" + const messages: Anthropic.Messages.MessageParam[] = [{ role: "user" as const, content: "test message" }] + + const generator = handler.createMessage(systemPrompt, messages) + const chunks = [] + + for await (const chunk of generator) { + chunks.push(chunk) + } + + // Verify stream chunks + expect(chunks).toHaveLength(2) // One text chunk and one usage chunk + expect(chunks[0]).toEqual({ type: "text", text: "test response" }) + expect(chunks[1]).toEqual({ type: "usage", inputTokens: 10, outputTokens: 20, totalCost: 0.001 }) + + // Verify OpenAI client was called with correct parameters + expect(mockCreate).toHaveBeenCalledWith( + expect.objectContaining({ + model: mockOptions.openRouterModelId, + temperature: 0, + messages: expect.arrayContaining([ + { role: "system", content: systemPrompt }, + { role: "user", content: "test message" }, + ]), + stream: true, + }), + ) + }) + + it("supports the middle-out transform", async () => { + const handler = new OpenRouterHandler({ + ...mockOptions, + openRouterUseMiddleOutTransform: true, + }) + const mockStream = { + async *[Symbol.asyncIterator]() { + yield { + id: "test-id", + choices: [{ delta: { content: "test response" } }], + } + }, + } + + const mockCreate = jest.fn().mockResolvedValue(mockStream) + ;(OpenAI as jest.MockedClass).prototype.chat = { + completions: { create: mockCreate }, + } as any + ;(axios.get as jest.Mock).mockResolvedValue({ data: { data: {} } }) + + await handler.createMessage("test", []).next() + + expect(mockCreate).toHaveBeenCalledWith(expect.objectContaining({ transforms: ["middle-out"] })) + }) + + it("adds cache control for supported models", async () => { + const handler = new OpenRouterHandler({ + ...mockOptions, + openRouterModelInfo: { + ...mockOpenRouterModelInfo, + supportsPromptCache: true, + }, + openRouterModelId: "anthropic/claude-3.5-sonnet", + }) + + const mockStream = { + async *[Symbol.asyncIterator]() { + yield { + id: "test-id", + choices: [{ delta: { content: "test response" } }], + } + }, + } + + const mockCreate = jest.fn().mockResolvedValue(mockStream) + ;(OpenAI as jest.MockedClass).prototype.chat = { + completions: { create: mockCreate }, + } as any + ;(axios.get as jest.Mock).mockResolvedValue({ data: { data: {} } }) + + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "message 1" }, + { role: "assistant", content: "response 1" }, + { role: "user", content: "message 2" }, + ] + + await handler.createMessage("test system", messages).next() + + expect(mockCreate).toHaveBeenCalledWith( + expect.objectContaining({ + messages: expect.arrayContaining([ + expect.objectContaining({ + role: "system", + content: expect.arrayContaining([ + expect.objectContaining({ cache_control: { type: "ephemeral" } }), + ]), + }), + ]), + }), + ) + }) + + it("handles API errors", async () => { + const handler = new OpenRouterHandler(mockOptions) + const mockStream = { + async *[Symbol.asyncIterator]() { + yield { error: { message: "API Error", code: 500 } } + }, + } + + const mockCreate = jest.fn().mockResolvedValue(mockStream) + ;(OpenAI as jest.MockedClass).prototype.chat = { + completions: { create: mockCreate }, + } as any + + const generator = handler.createMessage("test", []) + await expect(generator.next()).rejects.toThrow("OpenRouter API Error 500: API Error") + }) }) - test("completePrompt handles unexpected errors", async () => { - const handler = new OpenRouterHandler(mockOptions) - const mockCreate = jest.fn().mockRejectedValue(new Error("Unexpected error")) - ;(OpenAI as jest.MockedClass).prototype.chat = { - completions: { create: mockCreate }, - } as any + describe("completePrompt", () => { + it("returns correct response", async () => { + const handler = new OpenRouterHandler(mockOptions) + const mockResponse = { choices: [{ message: { content: "test completion" } }] } - await expect(handler.completePrompt("test prompt")).rejects.toThrow("Unexpected error") + const mockCreate = jest.fn().mockResolvedValue(mockResponse) + ;(OpenAI as jest.MockedClass).prototype.chat = { + completions: { create: mockCreate }, + } as any + + const result = await handler.completePrompt("test prompt") + + expect(result).toBe("test completion") + + expect(mockCreate).toHaveBeenCalledWith({ + model: mockOptions.openRouterModelId, + max_tokens: 1000, + thinking: undefined, + temperature: 0, + messages: [{ role: "user", content: "test prompt" }], + stream: false, + }) + }) + + it("handles API errors", async () => { + const handler = new OpenRouterHandler(mockOptions) + const mockError = { + error: { + message: "API Error", + code: 500, + }, + } + + const mockCreate = jest.fn().mockResolvedValue(mockError) + ;(OpenAI as jest.MockedClass).prototype.chat = { + completions: { create: mockCreate }, + } as any + + await expect(handler.completePrompt("test prompt")).rejects.toThrow("OpenRouter API Error 500: API Error") + }) + + it("handles unexpected errors", async () => { + const handler = new OpenRouterHandler(mockOptions) + const mockCreate = jest.fn().mockRejectedValue(new Error("Unexpected error")) + ;(OpenAI as jest.MockedClass).prototype.chat = { + completions: { create: mockCreate }, + } as any + + await expect(handler.completePrompt("test prompt")).rejects.toThrow("Unexpected error") + }) }) }) diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index 665d87542b..ac5d8553e6 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -6,7 +6,7 @@ import OpenAI from "openai" import { ApiHandlerOptions, ModelInfo, openRouterDefaultModelId, openRouterDefaultModelInfo } from "../../shared/api" import { parseApiPrice } from "../../utils/cost" import { convertToOpenAiMessages } from "../transform/openai-format" -import { ApiStreamChunk, ApiStreamUsageChunk } from "../transform/stream" +import { ApiStreamChunk } from "../transform/stream" import { convertToR1Format } from "../transform/r1-format" import { DEFAULT_HEADERS, DEEP_SEEK_DEFAULT_TEMPERATURE } from "./constants" @@ -28,6 +28,22 @@ type OpenRouterChatCompletionParams = OpenAI.Chat.ChatCompletionCreateParams & { } } +// See `OpenAI.Chat.Completions.ChatCompletionChunk["usage"]` +// `CompletionsAPI.CompletionUsage` +// See also: https://openrouter.ai/docs/use-cases/usage-accounting +interface CompletionUsage { + completion_tokens?: number + completion_tokens_details?: { + reasoning_tokens?: number + } + prompt_tokens?: number + prompt_tokens_details?: { + cached_tokens?: number + } + total_tokens?: number + cost?: number +} + export class OpenRouterHandler extends BaseProvider implements SingleCompletionHandler { protected options: ApiHandlerOptions private client: OpenAI @@ -46,7 +62,15 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH systemPrompt: string, messages: Anthropic.Messages.MessageParam[], ): AsyncGenerator { - let { id: modelId, maxTokens, thinking, temperature, topP, reasoningEffort } = this.getModel() + let { + id: modelId, + maxTokens, + thinking, + temperature, + supportsPromptCache, + topP, + reasoningEffort, + } = this.getModel() // Convert Anthropic messages to OpenAI format. let openAiMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [ @@ -59,46 +83,42 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH openAiMessages = convertToR1Format([{ role: "user", content: systemPrompt }, ...messages]) } - // prompt caching: https://openrouter.ai/docs/prompt-caching - // this is specifically for claude models (some models may 'support prompt caching' automatically without this) - switch (true) { - case modelId.startsWith("anthropic/"): - openAiMessages[0] = { - role: "system", - content: [ - { - type: "text", - text: systemPrompt, - // @ts-ignore-next-line - cache_control: { type: "ephemeral" }, - }, - ], + // Prompt caching: https://openrouter.ai/docs/prompt-caching + // Now with Gemini support: https://openrouter.ai/docs/features/prompt-caching + if (supportsPromptCache) { + openAiMessages[0] = { + role: "system", + content: [ + { + type: "text", + text: systemPrompt, + // @ts-ignore-next-line + cache_control: { type: "ephemeral" }, + }, + ], + } + + // Add cache_control to the last two user messages + // (note: this works because we only ever add one user message at a time, but if we added multiple we'd need to mark the user message before the last assistant message) + const lastTwoUserMessages = openAiMessages.filter((msg) => msg.role === "user").slice(-2) + + lastTwoUserMessages.forEach((msg) => { + if (typeof msg.content === "string") { + msg.content = [{ type: "text", text: msg.content }] } - // Add cache_control to the last two user messages - // (note: this works because we only ever add one user message at a time, but if we added multiple we'd need to mark the user message before the last assistant message) - const lastTwoUserMessages = openAiMessages.filter((msg) => msg.role === "user").slice(-2) + if (Array.isArray(msg.content)) { + // NOTE: this is fine since env details will always be added at the end. but if it weren't there, and the user added a image_url type message, it would pop a text part before it and then move it after to the end. + let lastTextPart = msg.content.filter((part) => part.type === "text").pop() - lastTwoUserMessages.forEach((msg) => { - if (typeof msg.content === "string") { - msg.content = [{ type: "text", text: msg.content }] + if (!lastTextPart) { + lastTextPart = { type: "text", text: "..." } + msg.content.push(lastTextPart) } - - if (Array.isArray(msg.content)) { - // NOTE: this is fine since env details will always be added at the end. but if it weren't there, and the user added a image_url type message, it would pop a text part before it and then move it after to the end. - let lastTextPart = msg.content.filter((part) => part.type === "text").pop() - - if (!lastTextPart) { - lastTextPart = { type: "text", text: "..." } - msg.content.push(lastTextPart) - } - // @ts-ignore-next-line - lastTextPart["cache_control"] = { type: "ephemeral" } - } - }) - break - default: - break + // @ts-ignore-next-line + lastTextPart["cache_control"] = { type: "ephemeral" } + } + }) } // https://openrouter.ai/docs/transforms @@ -125,9 +145,9 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH const stream = await this.client.chat.completions.create(completionParams) - let lastUsage + let lastUsage: CompletionUsage | undefined = undefined - for await (const chunk of stream as unknown as AsyncIterable) { + for await (const chunk of stream) { // OpenRouter returns an error object instead of the OpenAI SDK throwing an error. if ("error" in chunk) { const error = chunk.error as { message?: string; code?: number } @@ -137,13 +157,13 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH const delta = chunk.choices[0]?.delta - if ("reasoning" in delta && delta.reasoning) { - yield { type: "reasoning", text: delta.reasoning } as ApiStreamChunk + if ("reasoning" in delta && delta.reasoning && typeof delta.reasoning === "string") { + yield { type: "reasoning", text: delta.reasoning } } if (delta?.content) { fullResponseText += delta.content - yield { type: "text", text: delta.content } as ApiStreamChunk + yield { type: "text", text: delta.content } } if (chunk.usage) { @@ -152,16 +172,16 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH } if (lastUsage) { - yield this.processUsageMetrics(lastUsage) - } - } - - processUsageMetrics(usage: any): ApiStreamUsageChunk { - return { - type: "usage", - inputTokens: usage?.prompt_tokens || 0, - outputTokens: usage?.completion_tokens || 0, - totalCost: usage?.cost || 0, + yield { + type: "usage", + inputTokens: lastUsage.prompt_tokens || 0, + outputTokens: lastUsage.completion_tokens || 0, + // Waiting on OpenRouter to figure out what this represents in the Gemini case + // and how to best support it. + // cacheReadTokens: lastUsage.prompt_tokens_details?.cached_tokens, + reasoningTokens: lastUsage.completion_tokens_details?.reasoning_tokens, + totalCost: lastUsage.cost || 0, + } } } @@ -171,7 +191,7 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH let id = modelId ?? openRouterDefaultModelId const info = modelInfo ?? openRouterDefaultModelInfo - + const supportsPromptCache = modelInfo?.supportsPromptCache const isDeepSeekR1 = id.startsWith("deepseek/deepseek-r1") || modelId === "perplexity/sonar-reasoning" const defaultTemperature = isDeepSeekR1 ? DEEP_SEEK_DEFAULT_TEMPERATURE : 0 const topP = isDeepSeekR1 ? 0.95 : undefined @@ -180,6 +200,7 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH id, info, ...getModelParams({ options: this.options, model: info, defaultTemperature }), + supportsPromptCache, topP, } } @@ -269,6 +290,11 @@ export async function getOpenRouterModels(options?: ApiHandlerOptions) { modelInfo.cacheReadsPrice = 0.03 modelInfo.maxTokens = 8192 break + case rawModel.id.startsWith("google/gemini-2.5-pro-preview-03-25"): + case rawModel.id.startsWith("google/gemini-2.0-flash-001"): + case rawModel.id.startsWith("google/gemini-flash-1.5"): + modelInfo.supportsPromptCache = true + break default: break } diff --git a/src/api/transform/stream.ts b/src/api/transform/stream.ts index 97751edd90..caa69a09fe 100644 --- a/src/api/transform/stream.ts +++ b/src/api/transform/stream.ts @@ -1,4 +1,5 @@ export type ApiStream = AsyncGenerator + export type ApiStreamChunk = ApiStreamTextChunk | ApiStreamUsageChunk | ApiStreamReasoningChunk export interface ApiStreamTextChunk { @@ -17,5 +18,6 @@ export interface ApiStreamUsageChunk { outputTokens: number cacheWriteTokens?: number cacheReadTokens?: number - totalCost?: number // openrouter + reasoningTokens?: number + totalCost?: number } diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index ebcd59e1ee..ec94326b63 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -21,7 +21,7 @@ import { ReasoningBlock } from "./ReasoningBlock" import Thumbnails from "../common/Thumbnails" import McpResourceRow from "../mcp/McpResourceRow" import McpToolRow from "../mcp/McpToolRow" -import { highlightMentions } from "./TaskHeader" +import { Mention } from "./Mention" import { CheckpointSaved } from "./checkpoints/CheckpointSaved" import { FollowUpSuggest } from "./FollowUpSuggest" @@ -867,7 +867,9 @@ export const ChatRowContent = ({ return (
-
{highlightMentions(message.text)}
+
+ +
+ {!!item?.size && item.size > 0 && ( + <> + + {deleteTaskId && ( + !open && setDeleteTaskId(null)} + open + /> + )} + + )} +
+ ) +} diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 0dc2aa1a5f..531ec908f0 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -1,23 +1,22 @@ -import React, { memo, useMemo, useRef, useState } from "react" +import { memo, useMemo, useRef, useState } from "react" import { useWindowSize } from "react-use" -import prettyBytes from "pretty-bytes" import { useTranslation } from "react-i18next" - -import { vscode } from "@/utils/vscode" -import { formatLargeNumber } from "@/utils/format" -import { calculateTokenDistribution, getMaxTokensForModel } from "@/utils/model-utils" -import { Button } from "@/components/ui" +import { VSCodeBadge } from "@vscode/webview-ui-toolkit/react" +import { CloudUpload, CloudDownload } from "lucide-react" import { ClineMessage } from "@roo/shared/ExtensionMessage" -import { mentionRegexGlobal } from "@roo/shared/context-mentions" -import { HistoryItem } from "@roo/shared/HistoryItem" +import { getMaxTokensForModel } from "@/utils/model-utils" +import { cn } from "@/lib/utils" +import { Button } from "@/components/ui" import { useExtensionState } from "@src/context/ExtensionStateContext" + import Thumbnails from "../common/Thumbnails" import { normalizeApiConfiguration } from "../settings/ApiOptions" -import { DeleteTaskDialog } from "../history/DeleteTaskDialog" -import { cn } from "@/lib/utils" -import { VSCodeBadge } from "@vscode/webview-ui-toolkit/react" + +import { TaskActions } from "./TaskActions" +import { ContextWindowProgress } from "./ContextWindowProgress" +import { Mention } from "./Mention" interface TaskHeaderProps { task: ClineMessage @@ -31,7 +30,7 @@ interface TaskHeaderProps { onClose: () => void } -const TaskHeader: React.FC = ({ +const TaskHeader = ({ task, tokensIn, tokensOut, @@ -41,7 +40,7 @@ const TaskHeader: React.FC = ({ totalCost, contextTokens, onClose, -}) => { +}: TaskHeaderProps) => { const { t } = useTranslation() const { apiConfiguration, currentTaskItem } = useExtensionState() const { selectedModelInfo } = useMemo(() => normalizeApiConfiguration(apiConfiguration), [apiConfiguration]) @@ -53,8 +52,6 @@ const TaskHeader: React.FC = ({ const { width: windowWidth } = useWindowSize() - const shouldShowPromptCacheInfo = doesModelSupportPromptCache && apiConfiguration?.apiProvider !== "openrouter" - return (
= ({ {t("chat:task.title")} {!isTaskExpanded && ":"} - {!isTaskExpanded && {highlightMentions(task.text, false)}} + {!isTaskExpanded && ( + + + + )}
{task.images && task.images.length > 0 && } @@ -137,29 +138,37 @@ const TaskHeader: React.FC = ({
{t("chat:task.tokens")} - - - {formatLargeNumber(tokensIn || 0)} - - - - {formatLargeNumber(tokensOut || 0)} - + {typeof tokensIn === "number" && tokensIn > 0 && ( + + + {tokensIn} + + )} + {typeof tokensOut === "number" && tokensOut > 0 && ( + + + {tokensOut} + + )}
{!totalCost && }
- {shouldShowPromptCacheInfo && (cacheReads !== undefined || cacheWrites !== undefined) && ( + {doesModelSupportPromptCache && (cacheReads || cacheWrites) && (
{t("chat:task.cache")} - - + - {formatLargeNumber(cacheWrites || 0)} - - - - {formatLargeNumber(cacheReads || 0)} - + {typeof cacheWrites === "number" && cacheWrites > 0 && ( + + + {cacheWrites} + + )} + {typeof cacheReads === "number" && cacheReads > 0 && ( + + + {cacheReads} + + )}
)} @@ -180,154 +189,4 @@ const TaskHeader: React.FC = ({ ) } -export const highlightMentions = (text?: string, withShadow = true) => { - if (!text) return text - const parts = text.split(mentionRegexGlobal) - return parts.map((part, index) => { - if (index % 2 === 0) { - // This is regular text - return part - } else { - // This is a mention - return ( - vscode.postMessage({ type: "openMention", text: part })}> - @{part} - - ) - } - }) -} - -const TaskActions = ({ item }: { item: HistoryItem | undefined }) => { - const [deleteTaskId, setDeleteTaskId] = useState(null) - const { t } = useTranslation() - - return ( -
- - {!!item?.size && item.size > 0 && ( - <> - - {deleteTaskId && ( - !open && setDeleteTaskId(null)} - open - /> - )} - - )} -
- ) -} - -interface ContextWindowProgressProps { - contextWindow: number - contextTokens: number - maxTokens?: number -} - -const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: ContextWindowProgressProps) => { - const { t } = useTranslation() - // Use the shared utility function to calculate all token distribution values - const tokenDistribution = useMemo( - () => calculateTokenDistribution(contextWindow, contextTokens, maxTokens), - [contextWindow, contextTokens, maxTokens], - ) - - // Destructure the values we need - const { currentPercent, reservedPercent, availableSize, reservedForOutput, availablePercent } = tokenDistribution - - // For display purposes - const safeContextWindow = Math.max(0, contextWindow) - const safeContextTokens = Math.max(0, contextTokens) - - return ( - <> -
-
{formatLargeNumber(safeContextTokens)}
-
- {/* Invisible overlay for hover area */} -
- - {/* Main progress bar container */} -
- {/* Current tokens container */} -
- {/* Invisible overlay for current tokens section */} -
- {/* Current tokens used - darkest */} -
-
- - {/* Container for reserved tokens */} -
- {/* Invisible overlay for reserved section */} -
- {/* Reserved for output section - medium gray */} -
-
- - {/* Empty section (if any) */} - {availablePercent > 0 && ( -
- {/* Invisible overlay for available space */} -
-
- )} -
-
-
{formatLargeNumber(safeContextWindow)}
-
- - ) -} - export default memo(TaskHeader) From 80912d0919005afab6eb101e3358d19291e595aa Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Wed, 23 Apr 2025 09:47:19 -0400 Subject: [PATCH 45/89] v13.3.3 (#2876) --- .changeset/spotty-baboons-clap.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/spotty-baboons-clap.md diff --git a/.changeset/spotty-baboons-clap.md b/.changeset/spotty-baboons-clap.md new file mode 100644 index 0000000000..187385ed6b --- /dev/null +++ b/.changeset/spotty-baboons-clap.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +13.3.3 From 4606e9a6cca8c838044b3c3a2b0fd5c419a12d41 Mon Sep 17 00:00:00 2001 From: Dicha Zelianivan Arkana <51877647+elianiva@users.noreply.github.com> Date: Wed, 23 Apr 2025 22:57:50 +0700 Subject: [PATCH 46/89] fix(chat): better loading feedback (#2750) * fix(chat): better loading feedback * fix(chat): missing loading aria role Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * refactor(chat): use vscode loading for more consistency --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- webview-ui/src/components/common/CodeAccordian.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webview-ui/src/components/common/CodeAccordian.tsx b/webview-ui/src/components/common/CodeAccordian.tsx index 2f0cffd862..ec39e1704a 100644 --- a/webview-ui/src/components/common/CodeAccordian.tsx +++ b/webview-ui/src/components/common/CodeAccordian.tsx @@ -2,6 +2,7 @@ import { memo, useMemo } from "react" import { getLanguageFromPath } from "@src/utils/getLanguageFromPath" import CodeBlock, { CODE_BLOCK_BG_COLOR } from "./CodeBlock" import { ToolProgressStatus } from "@roo/shared/ExtensionMessage" +import { VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react" interface CodeAccordianProps { code?: string @@ -69,7 +70,9 @@ const CodeAccordian = ({ MozUserSelect: "none", msUserSelect: "none", }} + className={`${isLoading ? "animate-pulse" : ""}`} onClick={isLoading ? undefined : onToggleExpand}> + {isLoading && } {isFeedback || isConsoleLogs ? (
Date: Wed, 23 Apr 2025 12:21:32 -0500 Subject: [PATCH 47/89] feat: add other useful variables to the custom system prompt (#2879) --- src/core/prompts/sections/custom-system-prompt.ts | 4 ++++ src/core/prompts/system.ts | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/core/prompts/sections/custom-system-prompt.ts b/src/core/prompts/sections/custom-system-prompt.ts index b8353e2fd8..f401000bb5 100644 --- a/src/core/prompts/sections/custom-system-prompt.ts +++ b/src/core/prompts/sections/custom-system-prompt.ts @@ -5,6 +5,10 @@ import { fileExistsAtPath } from "../../../utils/fs" export type PromptVariables = { workspace?: string + mode?: string + language?: string + shell?: string + operatingSystem?: string } function interpolatePromptContent(content: string, variables: PromptVariables): string { diff --git a/src/core/prompts/system.ts b/src/core/prompts/system.ts index 077016fd55..b7bbc06e09 100644 --- a/src/core/prompts/system.ts +++ b/src/core/prompts/system.ts @@ -14,6 +14,7 @@ import { DiffStrategy } from "../../shared/tools" import { McpHub } from "../../services/mcp/McpHub" import { getToolDescriptionsForMode } from "./tools" import * as vscode from "vscode" +import * as os from "os" import { getRulesSection, getSystemInfoSection, @@ -128,6 +129,10 @@ export const SYSTEM_PROMPT = async ( // Try to load custom system prompt from file const variablesForPrompt: PromptVariables = { workspace: cwd, + mode: mode, + language: language ?? formatLanguage(vscode.env.language), + shell: vscode.env.shell, + operatingSystem: os.type(), } const fileCustomSystemPrompt = await loadSystemPromptFile(cwd, mode, variablesForPrompt) From a77be28a95dd1049e59eb577e3a55239c98cfe07 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 23 Apr 2025 11:16:20 -0700 Subject: [PATCH 48/89] Use formatLargeNumber on token counts in task header (#2883) * Format large numbers * Add changeset --- .changeset/shiny-wolves-attend.md | 5 +++++ webview-ui/src/components/chat/TaskHeader.tsx | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .changeset/shiny-wolves-attend.md diff --git a/.changeset/shiny-wolves-attend.md b/.changeset/shiny-wolves-attend.md new file mode 100644 index 0000000000..61b2bdc09b --- /dev/null +++ b/.changeset/shiny-wolves-attend.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Use formatLargeNumber on token counts in task header diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 531ec908f0..885be54265 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -7,6 +7,7 @@ import { CloudUpload, CloudDownload } from "lucide-react" import { ClineMessage } from "@roo/shared/ExtensionMessage" import { getMaxTokensForModel } from "@/utils/model-utils" +import { formatLargeNumber } from "@/utils/format" import { cn } from "@/lib/utils" import { Button } from "@/components/ui" import { useExtensionState } from "@src/context/ExtensionStateContext" @@ -141,13 +142,13 @@ const TaskHeader = ({ {typeof tokensIn === "number" && tokensIn > 0 && ( - {tokensIn} + {formatLargeNumber(tokensIn)} )} {typeof tokensOut === "number" && tokensOut > 0 && ( - {tokensOut} + {formatLargeNumber(tokensOut)} )}
@@ -160,13 +161,13 @@ const TaskHeader = ({ {typeof cacheWrites === "number" && cacheWrites > 0 && ( - {cacheWrites} + {formatLargeNumber(cacheWrites)} )} {typeof cacheReads === "number" && cacheReads > 0 && ( - {cacheReads} + {formatLargeNumber(cacheReads)} )}
From 31d4b656d06f90d826238f18854161c32ddcbc6e Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 23 Apr 2025 11:21:35 -0700 Subject: [PATCH 49/89] Package material icons in vsix (#2882) * Package material icons in vsix * Add changeset --- .changeset/tasty-pants-applaud.md | 5 ++++ .vscodeignore | 41 +++++++++++++++++++------------ flake.lock | 27 -------------------- flake.nix | 28 --------------------- 4 files changed, 30 insertions(+), 71 deletions(-) create mode 100644 .changeset/tasty-pants-applaud.md delete mode 100644 flake.lock delete mode 100644 flake.nix diff --git a/.changeset/tasty-pants-applaud.md b/.changeset/tasty-pants-applaud.md new file mode 100644 index 0000000000..d52f8d6c88 --- /dev/null +++ b/.changeset/tasty-pants-applaud.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Package material icons in vsix diff --git a/.vscodeignore b/.vscodeignore index d5bf65b3d8..0a2a8ccec0 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,38 +1,44 @@ # Default +.changeset/** .github/** .husky/** .vscode/** -.vscode-test/** -out/** -out-integration/** -evals/** -e2e/** +coverage/** node_modules/** src/** +scripts/** .gitignore -.yarnrc esbuild.js -vsc-extension-quickstart.md +jest.* **/tsconfig.json **/.eslintrc.json +.prettierignore **/*.map **/*.ts -**/.vscode-test.* +**/.gitignore # Custom -.nvmrc +.env.sample +.git-blame-ignore-revs +.gitconfig .gitattributes -.prettierignore +.tool-versions +.vite-port +.nvmrc .clinerules* .roomodes +.rooignore .roo/** cline_docs/** -coverage/** +e2e/** +evals/** locales/** -benchmark/** -.direnv/** +out/** +ellipsis.yaml +knip.json -# Ignore all webview-ui files except the build directory (https://github.com/microsoft/vscode-webview-ui-toolkit-samples/blob/main/frameworks/hello-world-react-cra/.vscodeignore) +# Ignore all webview-ui files except the build directory. +# https://github.com/microsoft/vscode-webview-ui-toolkit-samples/blob/main/frameworks/hello-world-react-cra/.vscodeignore webview-ui/src/** webview-ui/public/** webview-ui/scripts/** @@ -41,17 +47,20 @@ webview-ui/README.md webview-ui/package.json webview-ui/package-lock.json webview-ui/node_modules/** -**/.gitignore -# Fix issue where codicons don't get packaged (https://github.com/microsoft/vscode-extension-samples/issues/692) +# Include codicons !node_modules/@vscode/codicons/dist/codicon.css !node_modules/@vscode/codicons/dist/codicon.ttf +# Include material icons +!node_modules/vscode-material-icons/generated/** + # Include default themes JSON files used in getTheme !src/integrations/theme/default-themes/** # Ignore doc assets assets/docs/** + # Include icons and images !assets/icons/** !assets/images/** diff --git a/flake.lock b/flake.lock deleted file mode 100644 index 5d5fa53a69..0000000000 --- a/flake.lock +++ /dev/null @@ -1,27 +0,0 @@ -{ - "nodes": { - "nixpkgs": { - "locked": { - "lastModified": 1737569578, - "narHash": "sha256-6qY0pk2QmUtBT9Mywdvif0i/CLVgpCjMUn6g9vB+f3M=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "47addd76727f42d351590c905d9d1905ca895b82", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-24.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "nixpkgs": "nixpkgs" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index 690aa9e018..0000000000 --- a/flake.nix +++ /dev/null @@ -1,28 +0,0 @@ -{ - description = "Roo Code development environment"; - - inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; - }; - - outputs = { self, nixpkgs, ... }: let - systems = [ "aarch64-darwin" "x86_64-linux" ]; - - forAllSystems = nixpkgs.lib.genAttrs systems; - - mkDevShell = system: let - pkgs = import nixpkgs { inherit system; }; - in pkgs.mkShell { - name = "roo-code"; - - packages = with pkgs; [ - nodejs_20 - corepack_20 - ]; - }; - in { - devShells = forAllSystems (system: { - default = mkDevShell system; - }); - }; -} From a08461a6552ad3ddda6102fd4471fedd64f10465 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 23 Apr 2025 11:35:50 -0700 Subject: [PATCH 50/89] Gemini prompt caching (#2827) --- src/api/index.ts | 3 +- src/api/providers/__tests__/gemini.test.ts | 100 ++++++++++-- src/api/providers/anthropic.ts | 19 ++- src/api/providers/gemini.ts | 153 ++++++++++++++---- src/api/providers/vscode-lm.ts | 2 +- src/core/Cline.ts | 22 ++- src/exports/roo-code.d.ts | 45 ++++++ src/exports/types.ts | 45 ++++++ src/schemas/index.ts | 11 ++ src/shared/api.ts | 50 +++++- .../src/components/settings/ApiOptions.tsx | 1 + .../src/components/settings/ModelInfoView.tsx | 20 ++- .../src/components/settings/ModelPicker.tsx | 1 + 13 files changed, 401 insertions(+), 71 deletions(-) diff --git a/src/api/index.ts b/src/api/index.ts index ef8f99b7e7..10a959b548 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -28,7 +28,8 @@ export interface SingleCompletionHandler { } export interface ApiHandler { - createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream + createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[], cacheKey?: string): ApiStream + getModel(): { id: string; info: ModelInfo } /** diff --git a/src/api/providers/__tests__/gemini.test.ts b/src/api/providers/__tests__/gemini.test.ts index 897ece3ed3..34e057ffa4 100644 --- a/src/api/providers/__tests__/gemini.test.ts +++ b/src/api/providers/__tests__/gemini.test.ts @@ -3,7 +3,7 @@ import { Anthropic } from "@anthropic-ai/sdk" import { GeminiHandler } from "../gemini" -import { geminiDefaultModelId } from "../../../shared/api" +import { geminiDefaultModelId, type ModelInfo } from "../../../shared/api" const GEMINI_20_FLASH_THINKING_NAME = "gemini-2.0-flash-thinking-exp-1219" @@ -72,18 +72,15 @@ describe("GeminiHandler", () => { // Should have 3 chunks: 'Hello', ' world!', and usage info expect(chunks.length).toBe(3) - expect(chunks[0]).toEqual({ - type: "text", - text: "Hello", - }) - expect(chunks[1]).toEqual({ - type: "text", - text: " world!", - }) + expect(chunks[0]).toEqual({ type: "text", text: "Hello" }) + expect(chunks[1]).toEqual({ type: "text", text: " world!" }) expect(chunks[2]).toEqual({ type: "usage", inputTokens: 10, outputTokens: 5, + cacheReadTokens: undefined, + cacheWriteTokens: undefined, + thinkingTokens: undefined, }) // Verify the call to generateContentStream @@ -171,4 +168,89 @@ describe("GeminiHandler", () => { expect(modelInfo.id).toBe(geminiDefaultModelId) // Default model }) }) + + describe("calculateCost", () => { + // Mock ModelInfo based on gemini-1.5-flash-latest pricing (per 1M tokens) + // Removed 'id' and 'name' as they are not part of ModelInfo type directly + const mockInfo: ModelInfo = { + inputPrice: 0.125, // $/1M tokens + outputPrice: 0.375, // $/1M tokens + cacheWritesPrice: 0.125, // Assume same as input for test + cacheReadsPrice: 0.125 * 0.25, // Assume 0.25x input for test + contextWindow: 1_000_000, + maxTokens: 8192, + supportsPromptCache: true, // Enable cache calculations for tests + } + + it("should calculate cost correctly based on input and output tokens", () => { + const inputTokens = 10000 // Use larger numbers for per-million pricing + const outputTokens = 20000 + // Added non-null assertions (!) as mockInfo guarantees these values + const expectedCost = + (inputTokens / 1_000_000) * mockInfo.inputPrice! + (outputTokens / 1_000_000) * mockInfo.outputPrice! + + const cost = handler.calculateCost({ info: mockInfo, inputTokens, outputTokens }) + expect(cost).toBeCloseTo(expectedCost) + }) + + it("should return 0 if token counts are zero", () => { + // Note: The method expects numbers, not undefined. Passing undefined would be a type error. + // The calculateCost method itself returns undefined if prices are missing, but 0 if tokens are 0 and prices exist. + expect(handler.calculateCost({ info: mockInfo, inputTokens: 0, outputTokens: 0 })).toBe(0) + }) + + it("should handle only input tokens", () => { + const inputTokens = 5000 + // Added non-null assertion (!) + const expectedCost = (inputTokens / 1_000_000) * mockInfo.inputPrice! + expect(handler.calculateCost({ info: mockInfo, inputTokens, outputTokens: 0 })).toBeCloseTo(expectedCost) + }) + + it("should handle only output tokens", () => { + const outputTokens = 15000 + // Added non-null assertion (!) + const expectedCost = (outputTokens / 1_000_000) * mockInfo.outputPrice! + expect(handler.calculateCost({ info: mockInfo, inputTokens: 0, outputTokens })).toBeCloseTo(expectedCost) + }) + + it("should calculate cost with cache write tokens", () => { + const inputTokens = 10000 + const outputTokens = 20000 + const cacheWriteTokens = 5000 + const CACHE_TTL = 5 // Match the constant in gemini.ts + + // Added non-null assertions (!) + const expectedInputCost = (inputTokens / 1_000_000) * mockInfo.inputPrice! + const expectedOutputCost = (outputTokens / 1_000_000) * mockInfo.outputPrice! + const expectedCacheWriteCost = + mockInfo.cacheWritesPrice! * (cacheWriteTokens / 1_000_000) * (CACHE_TTL / 60) + const expectedCost = expectedInputCost + expectedOutputCost + expectedCacheWriteCost + + const cost = handler.calculateCost({ info: mockInfo, inputTokens, outputTokens, cacheWriteTokens }) + expect(cost).toBeCloseTo(expectedCost) + }) + + it("should calculate cost with cache read tokens", () => { + const inputTokens = 10000 // Total logical input + const outputTokens = 20000 + const cacheReadTokens = 8000 // Part of inputTokens read from cache + + const uncachedReadTokens = inputTokens - cacheReadTokens + // Added non-null assertions (!) + const expectedInputCost = (uncachedReadTokens / 1_000_000) * mockInfo.inputPrice! + const expectedOutputCost = (outputTokens / 1_000_000) * mockInfo.outputPrice! + const expectedCacheReadCost = mockInfo.cacheReadsPrice! * (cacheReadTokens / 1_000_000) + const expectedCost = expectedInputCost + expectedOutputCost + expectedCacheReadCost + + const cost = handler.calculateCost({ info: mockInfo, inputTokens, outputTokens, cacheReadTokens }) + expect(cost).toBeCloseTo(expectedCost) + }) + + it("should return undefined if pricing info is missing", () => { + // Create a copy and explicitly set a price to undefined + const incompleteInfo: ModelInfo = { ...mockInfo, outputPrice: undefined } + const cost = handler.calculateCost({ info: incompleteInfo, inputTokens: 1000, outputTokens: 1000 }) + expect(cost).toBeUndefined() + }) + }) }) diff --git a/src/api/providers/anthropic.ts b/src/api/providers/anthropic.ts index 9032754ac6..5489b32609 100644 --- a/src/api/providers/anthropic.ts +++ b/src/api/providers/anthropic.ts @@ -42,8 +42,14 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa case "claude-3-opus-20240229": case "claude-3-haiku-20240307": { /** - * The latest message will be the new user message, one before will - * be the assistant message from a previous request, and the user message before that will be a previously cached user message. So we need to mark the latest user message as ephemeral to cache it for the next request, and mark the second to last user message as ephemeral to let the server know the last message to retrieve from the cache for the current request.. + * The latest message will be the new user message, one before + * will be the assistant message from a previous request, and + * the user message before that will be a previously cached user + * message. So we need to mark the latest user message as + * ephemeral to cache it for the next request, and mark the + * second to last user message as ephemeral to let the server + * know the last message to retrieve from the cache for the + * current request. */ const userMsgIndices = messages.reduce( (acc, msg, index) => (msg.role === "user" ? [...acc, index] : acc), @@ -77,9 +83,6 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa } return message }), - // tools, // cache breakpoints go from tools > system > messages, and since tools dont change, we can just set the breakpoint at the end of system (this avoids having to set a breakpoint at the end of tools which by itself does not meet min requirements for haiku caching) - // tool_choice: { type: "auto" }, - // tools: tools, stream: true, }, (() => { @@ -102,9 +105,7 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa case "claude-3-opus-20240229": case "claude-3-haiku-20240307": betas.push("prompt-caching-2024-07-31") - return { - headers: { "anthropic-beta": betas.join(",") }, - } + return { headers: { "anthropic-beta": betas.join(",") } } default: return undefined } @@ -119,8 +120,6 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa temperature, system: [{ text: systemPrompt, type: "text" }], messages, - // tools, - // tool_choice: { type: "auto" }, stream: true, })) as any break diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index 4bf3b293bb..de77379abb 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -1,9 +1,9 @@ import type { Anthropic } from "@anthropic-ai/sdk" import { GoogleGenAI, - ThinkingConfig, type GenerateContentResponseUsageMetadata, type GenerateContentParameters, + type Content, } from "@google/genai" import { SingleCompletionHandler } from "../" @@ -13,30 +13,64 @@ import { convertAnthropicContentToGemini, convertAnthropicMessageToGemini } from import type { ApiStream } from "../transform/stream" import { BaseProvider } from "./base-provider" +const CACHE_TTL = 5 + export class GeminiHandler extends BaseProvider implements SingleCompletionHandler { protected options: ApiHandlerOptions private client: GoogleGenAI + private contentCaches: Map constructor(options: ApiHandlerOptions) { super() this.options = options this.client = new GoogleGenAI({ apiKey: options.geminiApiKey ?? "not-provided" }) + this.contentCaches = new Map() } - async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { - const { id: model, thinkingConfig, maxOutputTokens } = this.getModel() + async *createMessage( + systemInstruction: string, + messages: Anthropic.Messages.MessageParam[], + cacheKey?: string, + ): ApiStream { + const { id: model, thinkingConfig, maxOutputTokens, info } = this.getModel() + + const contents = messages.map(convertAnthropicMessageToGemini) + let uncachedContent: Content[] | undefined = undefined + let cachedContent: string | undefined = undefined + let cacheWriteTokens: number | undefined = undefined + + // https://ai.google.dev/gemini-api/docs/caching?lang=node + if (info.supportsPromptCache && cacheKey) { + const cacheEntry = this.contentCaches.get(cacheKey) + + if (cacheEntry) { + uncachedContent = contents.slice(cacheEntry.count, contents.length) + cachedContent = cacheEntry.key + } + + const newCacheEntry = await this.client.caches.create({ + model, + config: { contents, systemInstruction, ttl: `${CACHE_TTL * 60}s` }, + }) + + if (newCacheEntry.name) { + this.contentCaches.set(cacheKey, { key: newCacheEntry.name, count: contents.length }) + cacheWriteTokens = newCacheEntry.usageMetadata?.totalTokenCount ?? 0 + } + } const params: GenerateContentParameters = { model, - contents: messages.map(convertAnthropicMessageToGemini), + contents: uncachedContent ?? contents, config: { + cachedContent, + systemInstruction: cachedContent ? undefined : systemInstruction, httpOptions: this.options.googleGeminiBaseUrl ? { baseUrl: this.options.googleGeminiBaseUrl } : undefined, thinkingConfig, maxOutputTokens, temperature: this.options.modelTemperature ?? 0, - systemInstruction: systemPrompt, }, } @@ -55,46 +89,58 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl } if (lastUsageMetadata) { + const inputTokens = lastUsageMetadata.promptTokenCount ?? 0 + const outputTokens = lastUsageMetadata.candidatesTokenCount ?? 0 + const cacheReadTokens = lastUsageMetadata.cachedContentTokenCount + const reasoningTokens = lastUsageMetadata.thoughtsTokenCount + + const totalCost = this.calculateCost({ + info, + inputTokens, + outputTokens, + cacheWriteTokens, + cacheReadTokens, + }) + yield { type: "usage", - inputTokens: lastUsageMetadata.promptTokenCount ?? 0, - outputTokens: lastUsageMetadata.candidatesTokenCount ?? 0, + inputTokens, + outputTokens, + cacheWriteTokens, + cacheReadTokens, + reasoningTokens, + totalCost, } } } - override getModel(): { - id: GeminiModelId - info: ModelInfo - thinkingConfig?: ThinkingConfig - maxOutputTokens?: number - } { + override getModel() { let id = this.options.apiModelId ? (this.options.apiModelId as GeminiModelId) : geminiDefaultModelId let info: ModelInfo = geminiModels[id] - let thinkingConfig: ThinkingConfig | undefined = undefined - let maxOutputTokens: number | undefined = undefined - const thinkingSuffix = ":thinking" + if (id?.endsWith(":thinking")) { + id = id.slice(0, -":thinking".length) as GeminiModelId - if (id?.endsWith(thinkingSuffix)) { - id = id.slice(0, -thinkingSuffix.length) as GeminiModelId - info = geminiModels[id] + if (geminiModels[id]) { + info = geminiModels[id] - thinkingConfig = this.options.modelMaxThinkingTokens - ? { thinkingBudget: this.options.modelMaxThinkingTokens } - : undefined - - maxOutputTokens = this.options.modelMaxTokens ?? info.maxTokens ?? undefined + return { + id, + info, + thinkingConfig: this.options.modelMaxThinkingTokens + ? { thinkingBudget: this.options.modelMaxThinkingTokens } + : undefined, + maxOutputTokens: this.options.modelMaxTokens ?? info.maxTokens ?? undefined, + } + } } if (!info) { id = geminiDefaultModelId info = geminiModels[geminiDefaultModelId] - thinkingConfig = undefined - maxOutputTokens = undefined } - return { id, info, thinkingConfig, maxOutputTokens } + return { id, info } } async completePrompt(prompt: string): Promise { @@ -142,4 +188,57 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl return super.countTokens(content) } } + + public calculateCost({ + info, + inputTokens, + outputTokens, + cacheWriteTokens, + cacheReadTokens, + }: { + info: ModelInfo + inputTokens: number + outputTokens: number + cacheWriteTokens?: number + cacheReadTokens?: number + }) { + if (!info.inputPrice || !info.outputPrice || !info.cacheWritesPrice || !info.cacheReadsPrice) { + return undefined + } + + let inputPrice = info.inputPrice + let outputPrice = info.outputPrice + let cacheWritesPrice = info.cacheWritesPrice + let cacheReadsPrice = info.cacheReadsPrice + + // If there's tiered pricing then adjust the input and output token prices + // based on the input tokens used. + if (info.tiers) { + const tier = info.tiers.find((tier) => inputTokens <= tier.contextWindow) + + if (tier) { + inputPrice = tier.inputPrice ?? inputPrice + outputPrice = tier.outputPrice ?? outputPrice + cacheWritesPrice = tier.cacheWritesPrice ?? cacheWritesPrice + cacheReadsPrice = tier.cacheReadsPrice ?? cacheReadsPrice + } + } + + let inputTokensCost = inputPrice * (inputTokens / 1_000_000) + let outputTokensCost = outputPrice * (outputTokens / 1_000_000) + let cacheWriteCost = 0 + let cacheReadCost = 0 + + if (cacheWriteTokens) { + cacheWriteCost = cacheWritesPrice * (cacheWriteTokens / 1_000_000) * (CACHE_TTL / 60) + } + + if (cacheReadTokens) { + const uncachedReadTokens = inputTokens - cacheReadTokens + cacheReadCost = cacheReadsPrice * (cacheReadTokens / 1_000_000) + inputTokensCost = inputPrice * (uncachedReadTokens / 1_000_000) + } + + return inputTokensCost + outputTokensCost + cacheWriteCost + cacheReadCost + } } diff --git a/src/api/providers/vscode-lm.ts b/src/api/providers/vscode-lm.ts index d37f92d7f5..f3d21884b3 100644 --- a/src/api/providers/vscode-lm.ts +++ b/src/api/providers/vscode-lm.ts @@ -442,7 +442,7 @@ export class VsCodeLmHandler extends BaseProvider implements SingleCompletionHan yield { type: "usage", inputTokens: totalInputTokens, - outputTokens: totalOutputTokens + outputTokens: totalOutputTokens, } } catch (error: unknown) { this.ensureCleanState() diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 7c60ba1282..2f8b96b86e 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -136,32 +136,39 @@ export class Cline extends EventEmitter { readonly rootTask: Cline | undefined = undefined readonly parentTask: Cline | undefined = undefined readonly taskNumber: number + isPaused: boolean = false pausedModeSlug: string = defaultModeSlug private pauseInterval: NodeJS.Timeout | undefined readonly apiConfiguration: ApiConfiguration api: ApiHandler + private promptCacheKey: string + + rooIgnoreController?: RooIgnoreController private fileContextTracker: FileContextTracker private urlContentFetcher: UrlContentFetcher browserSession: BrowserSession didEditFile: boolean = false customInstructions?: string + diffStrategy?: DiffStrategy diffEnabled: boolean = false fuzzyMatchThreshold: number apiConversationHistory: (Anthropic.MessageParam & { ts?: number })[] = [] clineMessages: ClineMessage[] = [] - rooIgnoreController?: RooIgnoreController + private askResponse?: ClineAskResponse private askResponseText?: string private askResponseImages?: string[] private lastMessageTs?: number + // Not private since it needs to be accessible by tools. consecutiveMistakeCount: number = 0 consecutiveMistakeLimit: number consecutiveMistakeCountForApplyDiff: Map = new Map() + // Not private since it needs to be accessible by tools. providerRef: WeakRef private abort: boolean = false @@ -203,7 +210,6 @@ export class Cline extends EventEmitter { task, images, historyItem, - experiments, startTask = true, rootTask, parentTask, @@ -222,11 +228,15 @@ export class Cline extends EventEmitter { this.rooIgnoreController = new RooIgnoreController(this.cwd) this.fileContextTracker = new FileContextTracker(provider, this.taskId) + this.rooIgnoreController.initialize().catch((error) => { console.error("Failed to initialize RooIgnoreController:", error) }) + this.apiConfiguration = apiConfiguration this.api = buildApiHandler(apiConfiguration) + this.promptCacheKey = crypto.randomUUID() + this.urlContentFetcher = new UrlContentFetcher(provider.context) this.browserSession = new BrowserSession(provider.context) this.customInstructions = customInstructions @@ -353,6 +363,8 @@ export class Cline extends EventEmitter { } public async overwriteClineMessages(newMessages: ClineMessage[]) { + // Reset the the prompt cache key since we've altered the conversation history. + this.promptCacheKey = crypto.randomUUID() this.clineMessages = newMessages await this.saveClineMessages() } @@ -652,6 +664,7 @@ export class Cline extends EventEmitter { modifiedClineMessages, (m) => !(m.ask === "resume_task" || m.ask === "resume_completed_task"), ) + if (lastRelevantMessageIndex !== -1) { modifiedClineMessages.splice(lastRelevantMessageIndex + 1) } @@ -661,6 +674,7 @@ export class Cline extends EventEmitter { modifiedClineMessages, (m) => m.type === "say" && m.say === "api_req_started", ) + if (lastApiReqStartedIndex !== -1) { const lastApiReqStarted = modifiedClineMessages[lastApiReqStartedIndex] const { cost, cancelReason }: ClineApiReqInfo = JSON.parse(lastApiReqStarted.text || "{}") @@ -853,7 +867,7 @@ export class Cline extends EventEmitter { } const wasRecent = lastClineMessage?.ts && Date.now() - lastClineMessage.ts < 30_000 - + newUserContent.push({ type: "text", text: @@ -1092,7 +1106,7 @@ export class Cline extends EventEmitter { return { role, content } }) - const stream = this.api.createMessage(systemPrompt, cleanConversationHistory) + const stream = this.api.createMessage(systemPrompt, cleanConversationHistory, this.promptCacheKey) const iterator = stream[Symbol.asyncIterator]() try { diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 5883cb8641..f92671bfd5 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -46,6 +46,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined glamaApiKey?: string | undefined @@ -69,6 +78,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined openRouterBaseUrl?: string | undefined @@ -112,6 +130,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined openAiUseAzure?: boolean | undefined @@ -158,6 +185,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined requestyApiKey?: string | undefined @@ -180,6 +216,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined xaiApiKey?: string | undefined diff --git a/src/exports/types.ts b/src/exports/types.ts index 134f4fd066..855e51815c 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -47,6 +47,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined glamaApiKey?: string | undefined @@ -70,6 +79,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined openRouterBaseUrl?: string | undefined @@ -113,6 +131,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined openAiUseAzure?: boolean | undefined @@ -159,6 +186,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined requestyApiKey?: string | undefined @@ -181,6 +217,15 @@ type ProviderSettings = { minTokensPerCachePoint?: number | undefined maxCachePoints?: number | undefined cachableFields?: string[] | undefined + tiers?: + | { + contextWindow: number + inputPrice?: number | undefined + outputPrice?: number | undefined + cacheWritesPrice?: number | undefined + cacheReadsPrice?: number | undefined + }[] + | undefined } | null) | undefined xaiApiKey?: string | undefined diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 8ebcdfc63a..ef2a1508c8 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -114,6 +114,17 @@ export const modelInfoSchema = z.object({ minTokensPerCachePoint: z.number().optional(), maxCachePoints: z.number().optional(), cachableFields: z.array(z.string()).optional(), + tiers: z + .array( + z.object({ + contextWindow: z.number(), + inputPrice: z.number().optional(), + outputPrice: z.number().optional(), + cacheWritesPrice: z.number().optional(), + cacheReadsPrice: z.number().optional(), + }), + ) + .optional(), }) export type ModelInfo = z.infer diff --git a/src/shared/api.ts b/src/shared/api.ts index 34ec801187..ebe088599c 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -682,17 +682,35 @@ export const geminiModels = { maxTokens: 65_535, contextWindow: 1_048_576, supportsImages: true, - supportsPromptCache: false, - inputPrice: 2.5, + supportsPromptCache: true, + inputPrice: 2.5, // This is the pricing for prompts above 200k tokens. outputPrice: 15, + cacheReadsPrice: 0.625, + cacheWritesPrice: 4.5, + tiers: [ + { + contextWindow: 200_000, + inputPrice: 1.25, + outputPrice: 10, + cacheReadsPrice: 0.31, + }, + { + contextWindow: Infinity, + inputPrice: 2.5, + outputPrice: 15, + cacheReadsPrice: 0.625, + }, + ], }, "gemini-2.0-flash-001": { maxTokens: 8192, contextWindow: 1_048_576, supportsImages: true, - supportsPromptCache: false, - inputPrice: 0, - outputPrice: 0, + supportsPromptCache: true, + inputPrice: 0.1, + outputPrice: 0.4, + cacheReadsPrice: 0.025, + cacheWritesPrice: 1.0, }, "gemini-2.0-flash-lite-preview-02-05": { maxTokens: 8192, @@ -738,9 +756,25 @@ export const geminiModels = { maxTokens: 8192, contextWindow: 1_048_576, supportsImages: true, - supportsPromptCache: false, - inputPrice: 0, - outputPrice: 0, + supportsPromptCache: true, + inputPrice: 0.15, // This is the pricing for prompts above 128k tokens. + outputPrice: 0.6, + cacheReadsPrice: 0.0375, + cacheWritesPrice: 1.0, + tiers: [ + { + contextWindow: 128_000, + inputPrice: 0.075, + outputPrice: 0.3, + cacheReadsPrice: 0.01875, + }, + { + contextWindow: Infinity, + inputPrice: 0.15, + outputPrice: 0.6, + cacheReadsPrice: 0.0375, + }, + ], }, "gemini-1.5-flash-exp-0827": { maxTokens: 8192, diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 156b24c697..afefe70d86 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -1693,6 +1693,7 @@ const ApiOptions = ({ )} { const { t } = useAppTranslation() - const isGemini = useMemo(() => Object.keys(geminiModels).includes(selectedModelId), [selectedModelId]) const infoItems = [ , - !isGemini && ( - - ), + , typeof modelInfo.maxTokens === "number" && modelInfo.maxTokens > 0 && ( <> {t("settings:modelInfo.maxOutput")}:{" "} @@ -73,7 +71,7 @@ export const ModelInfoView = ({ {formatPrice(modelInfo.cacheWritesPrice || 0)} / 1M tokens ), - isGemini && ( + apiProvider === "gemini" && ( {selectedModelId === "gemini-2.5-pro-preview-03-25" ? t("settings:modelInfo.gemini.billingEstimate") diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx index 5aa3f1b314..7995409e09 100644 --- a/webview-ui/src/components/settings/ModelPicker.tsx +++ b/webview-ui/src/components/settings/ModelPicker.tsx @@ -186,6 +186,7 @@ export const ModelPicker = ({
{selectedModelId && selectedModelInfo && ( Date: Wed, 23 Apr 2025 11:41:06 -0700 Subject: [PATCH 51/89] Properly hide cache section of task header (#2884) --- .changeset/hip-news-run.md | 5 +++ webview-ui/src/components/chat/TaskHeader.tsx | 36 ++++++++++--------- 2 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 .changeset/hip-news-run.md diff --git a/.changeset/hip-news-run.md b/.changeset/hip-news-run.md new file mode 100644 index 0000000000..a9528c5e59 --- /dev/null +++ b/.changeset/hip-news-run.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Properly hide cache section of task header diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 885be54265..d08684d932 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -155,23 +155,25 @@ const TaskHeader = ({ {!totalCost && }
- {doesModelSupportPromptCache && (cacheReads || cacheWrites) && ( -
- {t("chat:task.cache")} - {typeof cacheWrites === "number" && cacheWrites > 0 && ( - - - {formatLargeNumber(cacheWrites)} - - )} - {typeof cacheReads === "number" && cacheReads > 0 && ( - - - {formatLargeNumber(cacheReads)} - - )} -
- )} + {doesModelSupportPromptCache && + ((typeof cacheReads === "number" && cacheReads > 0) || + (typeof cacheWrites === "number" && cacheWrites > 0)) && ( +
+ {t("chat:task.cache")} + {typeof cacheWrites === "number" && cacheWrites > 0 && ( + + + {formatLargeNumber(cacheWrites)} + + )} + {typeof cacheReads === "number" && cacheReads > 0 && ( + + + {formatLargeNumber(cacheReads)} + + )} +
+ )} {!!totalCost && (
From 230e953e5d62d4abee3c713dbb5dc4c2b50362cc Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 23 Apr 2025 11:42:22 -0700 Subject: [PATCH 52/89] Throttle calls to calculate task folder size (#2885) --- .changeset/twenty-planes-prove.md | 5 +++++ src/core/Cline.ts | 27 +++++++++++++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 .changeset/twenty-planes-prove.md diff --git a/.changeset/twenty-planes-prove.md b/.changeset/twenty-planes-prove.md new file mode 100644 index 0000000000..49431f68d1 --- /dev/null +++ b/.changeset/twenty-planes-prove.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Throttle calls to calculate task folder size diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 2f8b96b86e..1d35577d5a 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -374,6 +374,10 @@ export class Cline extends EventEmitter { this.emit("message", { action: "updated", message: partialMessage }) } + private taskDirSize = 0 + private taskDirSizeCheckedAt = 0 + private readonly taskDirSizeCheckInterval = 30_000 + private async saveClineMessages() { try { const taskDir = await this.ensureTaskDirectoryExists() @@ -393,14 +397,16 @@ export class Cline extends EventEmitter { ) ] - let taskDirSize = 0 + if (Date.now() - this.taskDirSizeCheckedAt > this.taskDirSizeCheckInterval) { + this.taskDirSizeCheckedAt = Date.now() - try { - taskDirSize = await getFolderSize.loose(taskDir) - } catch (err) { - console.error( - `[saveClineMessages] failed to get task directory size (${taskDir}): ${err instanceof Error ? err.message : String(err)}`, - ) + try { + this.taskDirSize = await getFolderSize.loose(taskDir) + } catch (err) { + console.error( + `[saveClineMessages] failed to get task directory size (${taskDir}): ${err instanceof Error ? err.message : String(err)}`, + ) + } } await this.providerRef.deref()?.updateTaskHistory({ @@ -413,7 +419,7 @@ export class Cline extends EventEmitter { cacheWrites: tokenUsage.totalCacheWrites, cacheReads: tokenUsage.totalCacheReads, totalCost: tokenUsage.totalCost, - size: taskDirSize, + size: this.taskDirSize, workspace: this.cwd, }) } catch (error) { @@ -1064,10 +1070,13 @@ export class Cline extends EventEmitter { const DEFAULT_THINKING_MODEL_MAX_TOKENS = 16_384 const modelInfo = this.api.getModel().info + const maxTokens = modelInfo.thinking ? this.apiConfiguration.modelMaxTokens || DEFAULT_THINKING_MODEL_MAX_TOKENS : modelInfo.maxTokens + const contextWindow = modelInfo.contextWindow + const trimmedMessages = await truncateConversationIfNeeded({ messages: this.apiConversationHistory, totalTokens, @@ -1896,11 +1905,13 @@ export class Cline extends EventEmitter { // now add to apiconversationhistory // need to save assistant responses to file before proceeding to tool use since user can exit at any moment and we wouldn't be able to save the assistant's response let didEndLoop = false + if (assistantMessage.length > 0) { await this.addToApiConversationHistory({ role: "assistant", content: [{ type: "text", text: assistantMessage }], }) + telemetryService.captureConversationMessage(this.taskId, "assistant") // NOTE: this comment is here for future reference - this was a workaround for userMessageContent not getting set to true. It was due to it not recursively calling for partial blocks when didRejectTool, so it would get stuck waiting for a partial block to complete before it could continue. From 72962b3c763e2ef06cbbbe40e62eb193985aa2dc Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 23 Apr 2025 12:09:24 -0700 Subject: [PATCH 53/89] Split api and chat message persistence into a separate module (#2866) --- package-lock.json | 22 +++++ package.json | 1 + src/core/Cline.ts | 106 +++++----------------- src/core/task-persistence/apiMessages.ts | 50 ++++++++++ src/core/task-persistence/index.ts | 3 + src/core/task-persistence/taskMessages.ts | 40 ++++++++ src/core/task-persistence/taskMetadata.ts | 63 +++++++++++++ 7 files changed, 203 insertions(+), 82 deletions(-) create mode 100644 src/core/task-persistence/apiMessages.ts create mode 100644 src/core/task-persistence/index.ts create mode 100644 src/core/task-persistence/taskMessages.ts create mode 100644 src/core/task-persistence/taskMetadata.ts diff --git a/package-lock.json b/package-lock.json index e86085b7d2..f756a62865 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ "js-tiktoken": "^1.0.19", "mammoth": "^1.8.0", "monaco-vscode-textmate-theme-converter": "^0.1.7", + "node-cache": "^5.1.2", "node-ipc": "^12.0.0", "openai": "^4.78.1", "os-name": "^6.0.0", @@ -16784,6 +16785,27 @@ "license": "MIT", "optional": true }, + "node_modules/node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "license": "MIT", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/node-cache/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", diff --git a/package.json b/package.json index 70b53db3bc..5425175ee4 100644 --- a/package.json +++ b/package.json @@ -432,6 +432,7 @@ "js-tiktoken": "^1.0.19", "mammoth": "^1.8.0", "monaco-vscode-textmate-theme-converter": "^0.1.7", + "node-cache": "^5.1.2", "node-ipc": "^12.0.0", "openai": "^4.78.1", "os-name": "^6.0.0", diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 1d35577d5a..380938dc49 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -1,4 +1,3 @@ -import fs from "fs/promises" import * as path from "path" import os from "os" import crypto from "crypto" @@ -8,7 +7,6 @@ import { Anthropic } from "@anthropic-ai/sdk" import cloneDeep from "clone-deep" import delay from "delay" import pWaitFor from "p-wait-for" -import getFolderSize from "get-folder-size" import { serializeError } from "serialize-error" import * as vscode from "vscode" @@ -58,7 +56,6 @@ import { TerminalRegistry } from "../integrations/terminal/TerminalRegistry" // utils import { calculateApiCostAnthropic } from "../utils/cost" -import { fileExistsAtPath } from "../utils/fs" import { arePathsEqual, getWorkspacePath } from "../utils/path" // tools @@ -93,6 +90,7 @@ import { truncateConversationIfNeeded } from "./sliding-window" import { ClineProvider } from "./webview/ClineProvider" import { validateToolUse } from "./mode-validator" import { MultiSearchReplaceDiffStrategy } from "./diff/strategies/multi-search-replace" +import { readApiMessages, saveApiMessages, readTaskMessages, saveTaskMessages, taskMetadata } from "./task-persistence" type UserContent = Array @@ -171,6 +169,7 @@ export class Cline extends EventEmitter { // Not private since it needs to be accessible by tools. providerRef: WeakRef + private readonly globalStoragePath: string private abort: boolean = false didFinishAbortingStream = false abandoned = false @@ -244,6 +243,7 @@ export class Cline extends EventEmitter { this.fuzzyMatchThreshold = fuzzyMatchThreshold this.consecutiveMistakeLimit = consecutiveMistakeLimit this.providerRef = new WeakRef(provider) + this.globalStoragePath = provider.context.globalStorageUri.fsPath this.diffViewProvider = new DiffViewProvider(this.cwd) this.enableCheckpoints = enableCheckpoints @@ -294,26 +294,8 @@ export class Cline extends EventEmitter { // Storing task to disk for history - private async ensureTaskDirectoryExists(): Promise { - const globalStoragePath = this.providerRef.deref()?.context.globalStorageUri.fsPath - if (!globalStoragePath) { - throw new Error("Global storage uri is invalid") - } - - // Use storagePathManager to retrieve the task storage directory - const { getTaskDirectoryPath } = await import("../shared/storagePathManager") - return getTaskDirectoryPath(globalStoragePath, this.taskId) - } - private async getSavedApiConversationHistory(): Promise { - const filePath = path.join(await this.ensureTaskDirectoryExists(), GlobalFileNames.apiConversationHistory) - const fileExists = await fileExistsAtPath(filePath) - - if (fileExists) { - return JSON.parse(await fs.readFile(filePath, "utf8")) - } - - return [] + return readApiMessages({ taskId: this.taskId, globalStoragePath: this.globalStoragePath }) } private async addToApiConversationHistory(message: Anthropic.MessageParam) { @@ -329,8 +311,11 @@ export class Cline extends EventEmitter { private async saveApiConversationHistory() { try { - const filePath = path.join(await this.ensureTaskDirectoryExists(), GlobalFileNames.apiConversationHistory) - await fs.writeFile(filePath, JSON.stringify(this.apiConversationHistory)) + await saveApiMessages({ + messages: this.apiConversationHistory, + taskId: this.taskId, + globalStoragePath: this.globalStoragePath, + }) } catch (error) { // in the off chance this fails, we don't want to stop the task console.error("Failed to save API conversation history:", error) @@ -338,21 +323,7 @@ export class Cline extends EventEmitter { } private async getSavedClineMessages(): Promise { - const filePath = path.join(await this.ensureTaskDirectoryExists(), GlobalFileNames.uiMessages) - - if (await fileExistsAtPath(filePath)) { - return JSON.parse(await fs.readFile(filePath, "utf8")) - } else { - // check old location - const oldPath = path.join(await this.ensureTaskDirectoryExists(), "claude_messages.json") - if (await fileExistsAtPath(oldPath)) { - const data = JSON.parse(await fs.readFile(oldPath, "utf8")) - await fs.unlink(oldPath) // remove old file - return data - } - } - - return [] + return readTaskMessages({ taskId: this.taskId, globalStoragePath: this.globalStoragePath }) } private async addToClineMessages(message: ClineMessage) { @@ -374,54 +345,25 @@ export class Cline extends EventEmitter { this.emit("message", { action: "updated", message: partialMessage }) } - private taskDirSize = 0 - private taskDirSizeCheckedAt = 0 - private readonly taskDirSizeCheckInterval = 30_000 - private async saveClineMessages() { try { - const taskDir = await this.ensureTaskDirectoryExists() - const filePath = path.join(taskDir, GlobalFileNames.uiMessages) - await fs.writeFile(filePath, JSON.stringify(this.clineMessages)) + await saveTaskMessages({ + messages: this.clineMessages, + taskId: this.taskId, + globalStoragePath: this.globalStoragePath, + }) - const tokenUsage = this.getTokenUsage() - this.emit("taskTokenUsageUpdated", this.taskId, tokenUsage) - - const taskMessage = this.clineMessages[0] // First message is always the task say - - const lastRelevantMessage = - this.clineMessages[ - findLastIndex( - this.clineMessages, - (m) => !(m.ask === "resume_task" || m.ask === "resume_completed_task"), - ) - ] - - if (Date.now() - this.taskDirSizeCheckedAt > this.taskDirSizeCheckInterval) { - this.taskDirSizeCheckedAt = Date.now() - - try { - this.taskDirSize = await getFolderSize.loose(taskDir) - } catch (err) { - console.error( - `[saveClineMessages] failed to get task directory size (${taskDir}): ${err instanceof Error ? err.message : String(err)}`, - ) - } - } - - await this.providerRef.deref()?.updateTaskHistory({ - id: this.taskId, - number: this.taskNumber, - ts: lastRelevantMessage.ts, - task: taskMessage.text ?? "", - tokensIn: tokenUsage.totalTokensIn, - tokensOut: tokenUsage.totalTokensOut, - cacheWrites: tokenUsage.totalCacheWrites, - cacheReads: tokenUsage.totalCacheReads, - totalCost: tokenUsage.totalCost, - size: this.taskDirSize, + const { historyItem, tokenUsage } = await taskMetadata({ + messages: this.clineMessages, + taskId: this.taskId, + taskNumber: this.taskNumber, + globalStoragePath: this.globalStoragePath, workspace: this.cwd, }) + + this.emit("taskTokenUsageUpdated", this.taskId, tokenUsage) + + await this.providerRef.deref()?.updateTaskHistory(historyItem) } catch (error) { console.error("Failed to save cline messages:", error) } diff --git a/src/core/task-persistence/apiMessages.ts b/src/core/task-persistence/apiMessages.ts new file mode 100644 index 0000000000..b361016345 --- /dev/null +++ b/src/core/task-persistence/apiMessages.ts @@ -0,0 +1,50 @@ +import * as path from "path" +import * as fs from "fs/promises" + +import { Anthropic } from "@anthropic-ai/sdk" + +import { fileExistsAtPath } from "../../utils/fs" + +import { GlobalFileNames } from "../../shared/globalFileNames" +import { getTaskDirectoryPath } from "../../shared/storagePathManager" + +export type ApiMessage = Anthropic.MessageParam & { ts?: number } + +export async function readApiMessages({ + taskId, + globalStoragePath, +}: { + taskId: string + globalStoragePath: string +}): Promise { + const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId) + const filePath = path.join(taskDir, GlobalFileNames.apiConversationHistory) + + if (await fileExistsAtPath(filePath)) { + return JSON.parse(await fs.readFile(filePath, "utf8")) + } else { + const oldPath = path.join(taskDir, "claude_messages.json") + + if (await fileExistsAtPath(oldPath)) { + const data = JSON.parse(await fs.readFile(oldPath, "utf8")) + await fs.unlink(oldPath) + return data + } + } + + return [] +} + +export async function saveApiMessages({ + messages, + taskId, + globalStoragePath, +}: { + messages: ApiMessage[] + taskId: string + globalStoragePath: string +}) { + const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId) + const filePath = path.join(taskDir, GlobalFileNames.apiConversationHistory) + await fs.writeFile(filePath, JSON.stringify(messages)) +} diff --git a/src/core/task-persistence/index.ts b/src/core/task-persistence/index.ts new file mode 100644 index 0000000000..dccdf08470 --- /dev/null +++ b/src/core/task-persistence/index.ts @@ -0,0 +1,3 @@ +export { readApiMessages, saveApiMessages } from "./apiMessages" +export { readTaskMessages, saveTaskMessages } from "./taskMessages" +export { taskMetadata } from "./taskMetadata" diff --git a/src/core/task-persistence/taskMessages.ts b/src/core/task-persistence/taskMessages.ts new file mode 100644 index 0000000000..96129e6285 --- /dev/null +++ b/src/core/task-persistence/taskMessages.ts @@ -0,0 +1,40 @@ +import * as path from "path" +import * as fs from "fs/promises" + +import { fileExistsAtPath } from "../../utils/fs" + +import { GlobalFileNames } from "../../shared/globalFileNames" +import { ClineMessage } from "../../shared/ExtensionMessage" +import { getTaskDirectoryPath } from "../../shared/storagePathManager" + +export type ReadTaskMessagesOptions = { + taskId: string + globalStoragePath: string +} + +export async function readTaskMessages({ + taskId, + globalStoragePath, +}: ReadTaskMessagesOptions): Promise { + const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId) + const filePath = path.join(taskDir, GlobalFileNames.uiMessages) + const fileExists = await fileExistsAtPath(filePath) + + if (fileExists) { + return JSON.parse(await fs.readFile(filePath, "utf8")) + } + + return [] +} + +export type SaveTaskMessagesOptions = { + messages: ClineMessage[] + taskId: string + globalStoragePath: string +} + +export async function saveTaskMessages({ messages, taskId, globalStoragePath }: SaveTaskMessagesOptions) { + const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId) + const filePath = path.join(taskDir, GlobalFileNames.uiMessages) + await fs.writeFile(filePath, JSON.stringify(messages)) +} diff --git a/src/core/task-persistence/taskMetadata.ts b/src/core/task-persistence/taskMetadata.ts new file mode 100644 index 0000000000..659ba580cf --- /dev/null +++ b/src/core/task-persistence/taskMetadata.ts @@ -0,0 +1,63 @@ +import NodeCache from "node-cache" +import getFolderSize from "get-folder-size" + +import { ClineMessage } from "../../shared/ExtensionMessage" +import { combineApiRequests } from "../../shared/combineApiRequests" +import { combineCommandSequences } from "../../shared/combineCommandSequences" +import { getApiMetrics } from "../../shared/getApiMetrics" +import { findLastIndex } from "../../shared/array" +import { HistoryItem } from "../../shared/HistoryItem" +import { getTaskDirectoryPath } from "../../shared/storagePathManager" + +const taskSizeCache = new NodeCache({ stdTTL: 5 * 60, checkperiod: 30 }) + +export type TaskMetadataOptions = { + messages: ClineMessage[] + taskId: string + taskNumber: number + globalStoragePath: string + workspace: string +} + +export async function taskMetadata({ + messages, + taskId, + taskNumber, + globalStoragePath, + workspace, +}: TaskMetadataOptions) { + const taskDir = await getTaskDirectoryPath(globalStoragePath, taskId) + const taskMessage = messages[0] // First message is always the task say. + + const lastRelevantMessage = + messages[findLastIndex(messages, (m) => !(m.ask === "resume_task" || m.ask === "resume_completed_task"))] + + let taskDirSize = taskSizeCache.get(taskDir) + + if (taskDirSize === undefined) { + try { + taskDirSize = await getFolderSize.loose(taskDir) + taskSizeCache.set(taskDir, taskDirSize) + } catch (error) { + taskDirSize = 0 + } + } + + const tokenUsage = getApiMetrics(combineApiRequests(combineCommandSequences(messages.slice(1)))) + + const historyItem: HistoryItem = { + id: taskId, + number: taskNumber, + ts: lastRelevantMessage.ts, + task: taskMessage.text ?? "", + tokensIn: tokenUsage.totalTokensIn, + tokensOut: tokenUsage.totalTokensOut, + cacheWrites: tokenUsage.totalCacheWrites, + cacheReads: tokenUsage.totalCacheReads, + totalCost: tokenUsage.totalCost, + size: taskDirSize, + workspace, + } + + return { historyItem, tokenUsage } +} From 2c40224f6f86445d4a7ebb83cb71a37b8960b656 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 23 Apr 2025 12:20:13 -0700 Subject: [PATCH 54/89] Fix task size cache TTL (#2887) --- .changeset/real-flies-try.md | 5 +++++ src/core/task-persistence/taskMetadata.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/real-flies-try.md diff --git a/.changeset/real-flies-try.md b/.changeset/real-flies-try.md new file mode 100644 index 0000000000..a24bd2f871 --- /dev/null +++ b/.changeset/real-flies-try.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Fix task size cache TTL diff --git a/src/core/task-persistence/taskMetadata.ts b/src/core/task-persistence/taskMetadata.ts index 659ba580cf..9784e62295 100644 --- a/src/core/task-persistence/taskMetadata.ts +++ b/src/core/task-persistence/taskMetadata.ts @@ -9,7 +9,7 @@ import { findLastIndex } from "../../shared/array" import { HistoryItem } from "../../shared/HistoryItem" import { getTaskDirectoryPath } from "../../shared/storagePathManager" -const taskSizeCache = new NodeCache({ stdTTL: 5 * 60, checkperiod: 30 }) +const taskSizeCache = new NodeCache({ stdTTL: 30, checkperiod: 5 * 60 }) export type TaskMetadataOptions = { messages: ClineMessage[] From 1543713c32895adb3ea5c39f9e4984b74cc80a77 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 23 Apr 2025 13:24:22 -0700 Subject: [PATCH 55/89] Don't immediately show an model ID error when changing API providers (#2888) --- webview-ui/src/components/chat/ChatView.tsx | 21 +- webview-ui/src/components/chat/TaskHeader.tsx | 10 +- .../src/components/settings/ApiOptions.tsx | 193 +++++------------- .../src/components/settings/ModelPicker.tsx | 13 +- .../src/utils/normalizeApiConfiguration.ts | 141 +++++++++++++ 5 files changed, 219 insertions(+), 159 deletions(-) create mode 100644 webview-ui/src/utils/normalizeApiConfiguration.ts diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index c287a99cbb..419537b361 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -4,6 +4,9 @@ import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRe import { useDeepCompareEffect, useEvent, useMount } from "react-use" import { Virtuoso, type VirtuosoHandle } from "react-virtuoso" import styled from "styled-components" +import removeMd from "remove-markdown" +import { Trans } from "react-i18next" + import { ClineAsk, ClineMessage, @@ -16,11 +19,19 @@ import { findLast } from "@roo/shared/array" import { combineApiRequests } from "@roo/shared/combineApiRequests" import { combineCommandSequences } from "@roo/shared/combineCommandSequences" import { getApiMetrics } from "@roo/shared/getApiMetrics" +import { AudioType } from "@roo/shared/WebviewMessage" +import { getAllModes } from "@roo/shared/modes" + import { useExtensionState } from "@src/context/ExtensionStateContext" import { vscode } from "@src/utils/vscode" +import { normalizeApiConfiguration } from "@src/utils/normalizeApiConfiguration" +import { validateCommand } from "@src/utils/command-validation" +import { useAppTranslation } from "@src/i18n/TranslationContext" + +import TelemetryBanner from "../common/TelemetryBanner" import HistoryPreview from "../history/HistoryPreview" import RooHero from "../welcome/RooHero" -import { normalizeApiConfiguration } from "../settings/ApiOptions" + import Announcement from "./Announcement" import BrowserSessionRow from "./BrowserSessionRow" import ChatRow from "./ChatRow" @@ -28,13 +39,7 @@ import ChatTextArea from "./ChatTextArea" import TaskHeader from "./TaskHeader" import AutoApproveMenu from "./AutoApproveMenu" import SystemPromptWarning from "./SystemPromptWarning" -import { AudioType } from "@roo/shared/WebviewMessage" -import { validateCommand } from "@src/utils/command-validation" -import { getAllModes } from "@roo/shared/modes" -import TelemetryBanner from "../common/TelemetryBanner" -import { useAppTranslation } from "@/i18n/TranslationContext" -import removeMd from "remove-markdown" -import { Trans } from "react-i18next" + interface ChatViewProps { isHidden: boolean showAnnouncement: boolean diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index d08684d932..9fe3cf5c9d 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -6,14 +6,14 @@ import { CloudUpload, CloudDownload } from "lucide-react" import { ClineMessage } from "@roo/shared/ExtensionMessage" -import { getMaxTokensForModel } from "@/utils/model-utils" -import { formatLargeNumber } from "@/utils/format" -import { cn } from "@/lib/utils" -import { Button } from "@/components/ui" +import { getMaxTokensForModel } from "@src/utils/model-utils" +import { formatLargeNumber } from "@src/utils/format" +import { cn } from "@src/lib/utils" +import { Button } from "@src/components/ui" import { useExtensionState } from "@src/context/ExtensionStateContext" +import { normalizeApiConfiguration } from "@src/utils/normalizeApiConfiguration" import Thumbnails from "../common/Thumbnails" -import { normalizeApiConfiguration } from "../settings/ApiOptions" import { TaskActions } from "./TaskActions" import { ContextWindowProgress } from "./ContextWindowProgress" diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index afefe70d86..0242346f81 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -11,48 +11,34 @@ import { ExternalLinkIcon } from "@radix-ui/react-icons" import { ApiConfiguration, ModelInfo, - anthropicDefaultModelId, - anthropicModels, azureOpenAiDefaultApiVersion, - bedrockDefaultModelId, - bedrockModels, - deepSeekDefaultModelId, - deepSeekModels, - geminiDefaultModelId, - geminiModels, glamaDefaultModelId, glamaDefaultModelInfo, mistralDefaultModelId, - mistralModels, openAiModelInfoSaneDefaults, - openAiNativeDefaultModelId, - openAiNativeModels, openRouterDefaultModelId, openRouterDefaultModelInfo, - vertexDefaultModelId, - vertexModels, unboundDefaultModelId, unboundDefaultModelInfo, requestyDefaultModelId, requestyDefaultModelInfo, - xaiDefaultModelId, - xaiModels, ApiProvider, - vscodeLlmModels, - vscodeLlmDefaultModelId, } from "@roo/shared/api" import { ExtensionMessage } from "@roo/shared/ExtensionMessage" +import { AWS_REGIONS } from "@roo/shared/aws_regions" -import { vscode } from "@/utils/vscode" -import { validateApiConfiguration, validateModelId, validateBedrockArn } from "@/utils/validate" +import { vscode } from "@src/utils/vscode" +import { validateApiConfiguration, validateModelId, validateBedrockArn } from "@src/utils/validate" +import { normalizeApiConfiguration } from "@src/utils/normalizeApiConfiguration" import { useOpenRouterModelProviders, OPENROUTER_DEFAULT_PROVIDER_NAME, -} from "@/components/ui/hooks/useOpenRouterModelProviders" -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, SelectSeparator, Button } from "@/components/ui" -import { MODELS_BY_PROVIDER, PROVIDERS, VERTEX_REGIONS, REASONING_MODELS } from "./constants" -import { AWS_REGIONS } from "@roo/shared/aws_regions" +} from "@src/components/ui/hooks/useOpenRouterModelProviders" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Button } from "@src/components/ui" + import { VSCodeButtonLink } from "../common/VSCodeButtonLink" + +import { MODELS_BY_PROVIDER, PROVIDERS, VERTEX_REGIONS, REASONING_MODELS } from "./constants" import { ModelInfoView } from "./ModelInfoView" import { ModelPicker } from "./ModelPicker" import { TemperatureControl } from "./TemperatureControl" @@ -281,6 +267,7 @@ const ApiOptions = ({ // Helper function to get the documentation URL and name for the currently selected provider const getSelectedProviderDocUrl = (): { url: string; name: string } | undefined => { const displayName = getProviderDisplayName(selectedProvider) + if (!displayName) { return undefined } @@ -294,6 +281,49 @@ const ApiOptions = ({ } } + const onApiProviderChange = useCallback( + (value: ApiProvider) => { + // It would be much easier to have a single attribute that stores + // the modelId, but we have a separate attribute for each of + // OpenRouter, Glama, Unbound, and Requesty. + // If you switch to one of these providers and the corresponding + // modelId is not set then you immediately end up in an error state. + // To address that we set the modelId to the default value for th + // provider if it's not already set. + switch (value) { + case "openrouter": + if (!apiConfiguration.openRouterModelId) { + setApiConfigurationField("openRouterModelId", openRouterDefaultModelId) + } + break + case "glama": + if (!apiConfiguration.glamaModelId) { + setApiConfigurationField("glamaModelId", glamaDefaultModelId) + } + break + case "unbound": + if (!apiConfiguration.unboundModelId) { + setApiConfigurationField("unboundModelId", unboundDefaultModelId) + } + break + case "requesty": + if (!apiConfiguration.requestyModelId) { + setApiConfigurationField("requestyModelId", requestyDefaultModelId) + } + break + } + + setApiConfigurationField("apiProvider", value) + }, + [ + setApiConfigurationField, + apiConfiguration.openRouterModelId, + apiConfiguration.glamaModelId, + apiConfiguration.unboundModelId, + apiConfiguration.requestyModelId, + ], + ) + return (
@@ -312,16 +342,12 @@ const ApiOptions = ({
)}
- onApiProviderChange(value as ApiProvider)}> - OpenRouter - - {PROVIDERS.filter((p) => p.value !== "openrouter").map(({ value, label }) => ( + {PROVIDERS.map(({ value, label }) => ( {label} @@ -1738,113 +1764,4 @@ const ApiOptions = ({ ) } -export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration) { - const provider = apiConfiguration?.apiProvider || "anthropic" - const modelId = apiConfiguration?.apiModelId - const getProviderData = (models: Record, defaultId: string) => { - let selectedModelId: string - let selectedModelInfo: ModelInfo - - if (modelId && modelId in models) { - selectedModelId = modelId - selectedModelInfo = models[modelId] - } else { - selectedModelId = defaultId - selectedModelInfo = models[defaultId] - } - - return { selectedProvider: provider, selectedModelId, selectedModelInfo } - } - - switch (provider) { - case "anthropic": - return getProviderData(anthropicModels, anthropicDefaultModelId) - case "xai": - return getProviderData(xaiModels, xaiDefaultModelId) - case "bedrock": - // Special case for custom ARN - if (modelId === "custom-arn") { - return { - selectedProvider: provider, - selectedModelId: "custom-arn", - selectedModelInfo: { - maxTokens: 5000, - contextWindow: 128_000, - supportsPromptCache: false, - supportsImages: true, - }, - } - } - return getProviderData(bedrockModels, bedrockDefaultModelId) - case "vertex": - return getProviderData(vertexModels, vertexDefaultModelId) - case "gemini": - return getProviderData(geminiModels, geminiDefaultModelId) - case "deepseek": - return getProviderData(deepSeekModels, deepSeekDefaultModelId) - case "openai-native": - return getProviderData(openAiNativeModels, openAiNativeDefaultModelId) - case "mistral": - return getProviderData(mistralModels, mistralDefaultModelId) - case "openrouter": - return { - selectedProvider: provider, - selectedModelId: apiConfiguration?.openRouterModelId || openRouterDefaultModelId, - selectedModelInfo: apiConfiguration?.openRouterModelInfo || openRouterDefaultModelInfo, - } - case "glama": - return { - selectedProvider: provider, - selectedModelId: apiConfiguration?.glamaModelId || glamaDefaultModelId, - selectedModelInfo: apiConfiguration?.glamaModelInfo || glamaDefaultModelInfo, - } - case "unbound": - return { - selectedProvider: provider, - selectedModelId: apiConfiguration?.unboundModelId || unboundDefaultModelId, - selectedModelInfo: apiConfiguration?.unboundModelInfo || unboundDefaultModelInfo, - } - case "requesty": - return { - selectedProvider: provider, - selectedModelId: apiConfiguration?.requestyModelId || requestyDefaultModelId, - selectedModelInfo: apiConfiguration?.requestyModelInfo || requestyDefaultModelInfo, - } - case "openai": - return { - selectedProvider: provider, - selectedModelId: apiConfiguration?.openAiModelId || "", - selectedModelInfo: apiConfiguration?.openAiCustomModelInfo || openAiModelInfoSaneDefaults, - } - case "ollama": - return { - selectedProvider: provider, - selectedModelId: apiConfiguration?.ollamaModelId || "", - selectedModelInfo: openAiModelInfoSaneDefaults, - } - case "lmstudio": - return { - selectedProvider: provider, - selectedModelId: apiConfiguration?.lmStudioModelId || "", - selectedModelInfo: openAiModelInfoSaneDefaults, - } - case "vscode-lm": - const modelFamily = apiConfiguration?.vsCodeLmModelSelector?.family ?? vscodeLlmDefaultModelId - const modelInfo = { - ...openAiModelInfoSaneDefaults, - ...vscodeLlmModels[modelFamily as keyof typeof vscodeLlmModels], - supportsImages: false, // VSCode LM API currently doesn't support images. - } - return { - selectedProvider: provider, - selectedModelId: apiConfiguration?.vsCodeLmModelSelector - ? `${apiConfiguration.vsCodeLmModelSelector.vendor}/${apiConfiguration.vsCodeLmModelSelector.family}` - : "", - selectedModelInfo: modelInfo, - } - default: - return getProviderData(anthropicModels, anthropicDefaultModelId) - } -} - export default memo(ApiOptions) diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx index 7995409e09..3060136d03 100644 --- a/webview-ui/src/components/settings/ModelPicker.tsx +++ b/webview-ui/src/components/settings/ModelPicker.tsx @@ -5,8 +5,9 @@ import { ChevronsUpDown, Check, X } from "lucide-react" import { ProviderSettings, ModelInfo } from "@roo/schemas" -import { useAppTranslation } from "@/i18n/TranslationContext" -import { cn } from "@/lib/utils" +import { useAppTranslation } from "@src/i18n/TranslationContext" +import { normalizeApiConfiguration } from "@src/utils/normalizeApiConfiguration" +import { cn } from "@src/lib/utils" import { Command, CommandEmpty, @@ -18,9 +19,8 @@ import { PopoverContent, PopoverTrigger, Button, -} from "@/components/ui" +} from "@src/components/ui" -import { normalizeApiConfiguration } from "./ApiOptions" import { ThinkingBudget } from "./ThinkingBudget" import { ModelInfoView } from "./ModelInfoView" @@ -205,10 +205,7 @@ export const ModelPicker = ({ serviceLink: , defaultModelLink: onSelect(defaultModelId)} className="text-sm" />, }} - values={{ - serviceName, - defaultModelId, - }} + values={{ serviceName, defaultModelId }} />
diff --git a/webview-ui/src/utils/normalizeApiConfiguration.ts b/webview-ui/src/utils/normalizeApiConfiguration.ts new file mode 100644 index 0000000000..908636ee99 --- /dev/null +++ b/webview-ui/src/utils/normalizeApiConfiguration.ts @@ -0,0 +1,141 @@ +import { + ApiConfiguration, + ModelInfo, + anthropicDefaultModelId, + anthropicModels, + bedrockDefaultModelId, + bedrockModels, + deepSeekDefaultModelId, + deepSeekModels, + geminiDefaultModelId, + geminiModels, + glamaDefaultModelId, + glamaDefaultModelInfo, + mistralDefaultModelId, + mistralModels, + openAiModelInfoSaneDefaults, + openAiNativeDefaultModelId, + openAiNativeModels, + openRouterDefaultModelId, + openRouterDefaultModelInfo, + vertexDefaultModelId, + vertexModels, + unboundDefaultModelId, + unboundDefaultModelInfo, + requestyDefaultModelId, + requestyDefaultModelInfo, + xaiDefaultModelId, + xaiModels, + vscodeLlmModels, + vscodeLlmDefaultModelId, +} from "@roo/shared/api" + +export function normalizeApiConfiguration(apiConfiguration?: ApiConfiguration) { + const provider = apiConfiguration?.apiProvider || "anthropic" + const modelId = apiConfiguration?.apiModelId + + const getProviderData = (models: Record, defaultId: string) => { + let selectedModelId: string + let selectedModelInfo: ModelInfo + + if (modelId && modelId in models) { + selectedModelId = modelId + selectedModelInfo = models[modelId] + } else { + selectedModelId = defaultId + selectedModelInfo = models[defaultId] + } + + return { selectedProvider: provider, selectedModelId, selectedModelInfo } + } + + switch (provider) { + case "anthropic": + return getProviderData(anthropicModels, anthropicDefaultModelId) + case "xai": + return getProviderData(xaiModels, xaiDefaultModelId) + case "bedrock": + // Special case for custom ARN + if (modelId === "custom-arn") { + return { + selectedProvider: provider, + selectedModelId: "custom-arn", + selectedModelInfo: { + maxTokens: 5000, + contextWindow: 128_000, + supportsPromptCache: false, + supportsImages: true, + }, + } + } + return getProviderData(bedrockModels, bedrockDefaultModelId) + case "vertex": + return getProviderData(vertexModels, vertexDefaultModelId) + case "gemini": + return getProviderData(geminiModels, geminiDefaultModelId) + case "deepseek": + return getProviderData(deepSeekModels, deepSeekDefaultModelId) + case "openai-native": + return getProviderData(openAiNativeModels, openAiNativeDefaultModelId) + case "mistral": + return getProviderData(mistralModels, mistralDefaultModelId) + case "openrouter": + return { + selectedProvider: provider, + selectedModelId: apiConfiguration?.openRouterModelId || openRouterDefaultModelId, + selectedModelInfo: apiConfiguration?.openRouterModelInfo || openRouterDefaultModelInfo, + } + case "glama": + return { + selectedProvider: provider, + selectedModelId: apiConfiguration?.glamaModelId || glamaDefaultModelId, + selectedModelInfo: apiConfiguration?.glamaModelInfo || glamaDefaultModelInfo, + } + case "unbound": + return { + selectedProvider: provider, + selectedModelId: apiConfiguration?.unboundModelId || unboundDefaultModelId, + selectedModelInfo: apiConfiguration?.unboundModelInfo || unboundDefaultModelInfo, + } + case "requesty": + return { + selectedProvider: provider, + selectedModelId: apiConfiguration?.requestyModelId || requestyDefaultModelId, + selectedModelInfo: apiConfiguration?.requestyModelInfo || requestyDefaultModelInfo, + } + case "openai": + return { + selectedProvider: provider, + selectedModelId: apiConfiguration?.openAiModelId || "", + selectedModelInfo: apiConfiguration?.openAiCustomModelInfo || openAiModelInfoSaneDefaults, + } + case "ollama": + return { + selectedProvider: provider, + selectedModelId: apiConfiguration?.ollamaModelId || "", + selectedModelInfo: openAiModelInfoSaneDefaults, + } + case "lmstudio": + return { + selectedProvider: provider, + selectedModelId: apiConfiguration?.lmStudioModelId || "", + selectedModelInfo: openAiModelInfoSaneDefaults, + } + case "vscode-lm": + const modelFamily = apiConfiguration?.vsCodeLmModelSelector?.family ?? vscodeLlmDefaultModelId + const modelInfo = { + ...openAiModelInfoSaneDefaults, + ...vscodeLlmModels[modelFamily as keyof typeof vscodeLlmModels], + supportsImages: false, // VSCode LM API currently doesn't support images. + } + return { + selectedProvider: provider, + selectedModelId: apiConfiguration?.vsCodeLmModelSelector + ? `${apiConfiguration.vsCodeLmModelSelector.vendor}/${apiConfiguration.vsCodeLmModelSelector.family}` + : "", + selectedModelInfo: modelInfo, + } + default: + return getProviderData(anthropicModels, anthropicDefaultModelId) + } +} From 03925d25b0cae7ccdfe46fb3ed1b1669ab4f8b36 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 23 Apr 2025 13:26:59 -0700 Subject: [PATCH 56/89] Fix code cli flag in evals (#2889) --- evals/apps/cli/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evals/apps/cli/src/index.ts b/evals/apps/cli/src/index.ts index c221314076..6b287042b0 100644 --- a/evals/apps/cli/src/index.ts +++ b/evals/apps/cli/src/index.ts @@ -190,7 +190,7 @@ const runExercise = async ({ run, task, server }: { run: Run; task: Task; server ROO_CODE_IPC_SOCKET_PATH: taskSocketPath, }, shell: "/bin/bash", - })`code --disable-workspace-trust -W ${workspacePath}` + })`code --disable-workspace-trust -n ${workspacePath}` // Give VSCode some time to spawn before connecting to its unix socket. await new Promise((resolve) => setTimeout(resolve, 3_000)) From a53f604e3ae663a714b8cfaaf9ee3287af47b80f Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Wed, 23 Apr 2025 16:46:52 -0400 Subject: [PATCH 57/89] Disable OpenRouter Gemini caching for now (#2890) --- src/api/providers/openrouter.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index ac5d8553e6..9320cefeab 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -290,11 +290,13 @@ export async function getOpenRouterModels(options?: ApiHandlerOptions) { modelInfo.cacheReadsPrice = 0.03 modelInfo.maxTokens = 8192 break + /* TODO: uncomment once we confirm it's working case rawModel.id.startsWith("google/gemini-2.5-pro-preview-03-25"): case rawModel.id.startsWith("google/gemini-2.0-flash-001"): case rawModel.id.startsWith("google/gemini-flash-1.5"): modelInfo.supportsPromptCache = true break + */ default: break } From 41db2cad4312378ff9d87e52e177772108ad7727 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Wed, 23 Apr 2025 15:42:59 -0600 Subject: [PATCH 58/89] Update search_and_replace tool description for clarity and detail (#2891) --- .../__snapshots__/system.test.ts.snap | 22 +++++++++---------- src/core/prompts/tools/search-and-replace.ts | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index 3ddf52858d..6e736931e9 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -210,7 +210,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -677,7 +677,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -1144,7 +1144,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -1611,7 +1611,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -2134,7 +2134,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -2669,7 +2669,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -3282,7 +3282,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -3749,7 +3749,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -4258,7 +4258,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -4802,7 +4802,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) @@ -5635,7 +5635,7 @@ Example for appending to the end of file: ## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory /test/path) diff --git a/src/core/prompts/tools/search-and-replace.ts b/src/core/prompts/tools/search-and-replace.ts index 9b068a6279..357a705832 100644 --- a/src/core/prompts/tools/search-and-replace.ts +++ b/src/core/prompts/tools/search-and-replace.ts @@ -2,7 +2,7 @@ import { ToolArgs } from "./types" export function getSearchAndReplaceDescription(args: ToolArgs): string { return `## search_and_replace -Description: Request to perform a search and replace operation on a file. Supports both literal text and regex patterns. Shows a diff preview before applying changes. +Description: Use this tool to find and replace specific text strings or patterns (using regex) within a file. It's suitable for targeted replacements across multiple locations within the file. Supports literal text and regex patterns, case sensitivity options, and optional line ranges. Shows a diff preview before applying changes. Required Parameters: - path: The path of the file to modify (relative to the current workspace directory ${args.cwd.toPosix()}) From c228e638b993ab844a876008e694513f221f7fba Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Wed, 23 Apr 2025 15:43:36 -0600 Subject: [PATCH 59/89] Update insert_content tool description for clarity and detail (#2892) --- .../__snapshots__/system.test.ts.snap | 22 +++++++++---------- src/core/prompts/tools/insert-content.ts | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index 6e736931e9..ade0bd1f85 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -180,7 +180,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -647,7 +647,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -1114,7 +1114,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -1581,7 +1581,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -2104,7 +2104,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -2639,7 +2639,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -3252,7 +3252,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -3719,7 +3719,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -4228,7 +4228,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -4772,7 +4772,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path @@ -5605,7 +5605,7 @@ Example: Requesting to write to frontend-config.json ## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory /test/path diff --git a/src/core/prompts/tools/insert-content.ts b/src/core/prompts/tools/insert-content.ts index 27d97fab51..7e339513d5 100644 --- a/src/core/prompts/tools/insert-content.ts +++ b/src/core/prompts/tools/insert-content.ts @@ -2,7 +2,7 @@ import { ToolArgs } from "./types" export function getInsertContentDescription(args: ToolArgs): string { return `## insert_content -Description: Insert new content at a specific line position in a file. +Description: Use this tool specifically for adding new lines of content into a file without modifying existing content. Specify the line number to insert before, or use line 0 to append to the end. Ideal for adding imports, functions, configuration blocks, log entries, or any multi-line text block. Parameters: - path: (required) File path relative to workspace directory ${args.cwd.toPosix()} From 3b65023d0b7e1470c46788f070519a8b16a41be9 Mon Sep 17 00:00:00 2001 From: axb Date: Thu, 24 Apr 2025 12:12:07 +0800 Subject: [PATCH 60/89] feat(diff): improve progress indicator for apply_diff tool (#2758) Add animated dots to progress indicator based on content length Optimize when progress updates are shown (every 10 characters) Move searchBlockCount calculation inside conditional blocks Skip unnecessary ask operations when toolProgressStatus is empty --- src/core/diff/strategies/multi-search-replace.ts | 5 +++-- src/core/tools/applyDiffTool.ts | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/core/diff/strategies/multi-search-replace.ts b/src/core/diff/strategies/multi-search-replace.ts index b7c2dffe8a..00cebd2bea 100644 --- a/src/core/diff/strategies/multi-search-replace.ts +++ b/src/core/diff/strategies/multi-search-replace.ts @@ -574,12 +574,13 @@ Only use a single line of '=======' between search and replacement content, beca const diffContent = toolUse.params.diff if (diffContent) { const icon = "diff-multiple" - const searchBlockCount = (diffContent.match(/SEARCH/g) || []).length if (toolUse.partial) { - if (diffContent.length < 1000 || (diffContent.length / 50) % 10 === 0) { + if (Math.floor(diffContent.length / 10) % 10 === 0) { + const searchBlockCount = (diffContent.match(/SEARCH/g) || []).length return { icon, text: `${searchBlockCount}` } } } else if (result) { + const searchBlockCount = (diffContent.match(/SEARCH/g) || []).length if (result.failParts?.length) { return { icon, diff --git a/src/core/tools/applyDiffTool.ts b/src/core/tools/applyDiffTool.ts index f8fd5944b8..967b881d31 100644 --- a/src/core/tools/applyDiffTool.ts +++ b/src/core/tools/applyDiffTool.ts @@ -42,6 +42,10 @@ export async function applyDiffTool( toolProgressStatus = cline.diffStrategy.getProgressStatus(block) } + if (toolProgressStatus && Object.keys(toolProgressStatus).length === 0) { + return + } + const partialMessage = JSON.stringify(sharedMessageProps) await cline.ask("tool", partialMessage, block.partial, toolProgressStatus).catch(() => {}) return From b5ffaf1ba2f6561f714f666397e1e942a1664857 Mon Sep 17 00:00:00 2001 From: Yikai Liao Date: Thu, 24 Apr 2025 12:22:47 +0800 Subject: [PATCH 61/89] Fix Terminal Carriage Return Handling for Correct Progress Bar Display (#2562) * fix(terminal): Ensure correct handling of carriage returns for progress bars This commit refines the tests for `TerminalProcess` to ensure the correct interpretation of terminal output containing carriage returns (`\\r`), which is essential for properly handling dynamic elements like progress bars (e.g., `tqdm`). - Validated the `processCarriageReturns` method's behavior in simulating terminal line overwrites caused by `\\r`. - Corrected the expectation in the `handles carriage returns in mixed content` test to accurately reflect the method's output (final line content + preserved escape sequences), confirming the logic works as intended for progress-bar-like updates. - Fixed a minor Jest `toBe` syntax error in a related test case. - Suppressed an expected `console.warn` in the non-shell-integration test for cleaner logs. By ensuring `processCarriageReturns` is correctly tested, we increase confidence that the component responsible for pre-processing terminal output handles progress bars appropriately before the output is potentially used elsewhere (e.g., sent to an LLM). * fix(test): Make TerminalProcess integration test reliable This commit fixes the flaky test case `integrates with getUnretrievedOutput to handle progress bars` in `TerminalProcess.test.ts`. The test previously failed intermittently due to: 1. Relying on a fixed `setTimeout` duration to wait for asynchronous stream processing, which created a race condition. 2. Incorrectly assuming that `await terminalProcess.run(...)` would return the final output directly via its resolved value. The fix addresses these issues by: - Removing the unreliable intermediate check based on `setTimeout`. - Modifying the test to correctly obtain the final output by listening for the `completed` event emitted by `TerminalProcess`, which is the intended way to receive the result. This ensures the test accurately reflects the behavior of `TerminalProcess` and is no longer prone to timing-related failures. * Add changeset for terminal carriage return fix * Implement terminal compress progress bar feature This commit introduces a new feature to compress terminal output by processing carriage returns. The `processCarriageReturns` function has been integrated into the `Terminal` class to handle progress bar updates effectively, ensuring only the final state is displayed. Additionally, the `terminalCompressProgressBar` setting has been added to the global settings schema, allowing users to enable or disable this feature. Tests have been updated to validate the new functionality and ensure correct behavior in various scenarios. A Benchmark is also added to test the performance. Not that there is still no i18n support for this. * Add i18n support for compressProgressBar setting in multiple languages * Optimize processCarriageReturns function for performance and multi-byte character handling This commit enhances the `processCarriageReturns` function by implementing in-place string operations to improve performance, especially with large outputs. Key features include: - Line-by-line processing to maximize chunk handling. - Use of string indexes and substring operations instead of arrays. - Single-pass traversal of input for efficiency. - Special handling for multi-byte characters to prevent corruption during overwrites. Additionally, tests have been updated to validate the new functionality, ensuring correct behavior with various character sets, including emojis and non-ASCII text. Highly Density CR case is added to Benchmark * slight performance improvement by caching several variable * Optimize multi-byte character handling in processCarriageReturns Refactor the logic within the `processCarriageReturns` function to simplify the detection of partially overwritten multi-byte characters (e.g., emojis). Removed redundant checks and clarified the conditions for identifying potential character corruption during carriage return processing. This improves code readability and maintainability while preserving the original functionality of replacing potentially corrupted characters with a space. Also enforced consistent use of semicolons for improved code style. * docs: standardize carriage return (\r) and line feed (\n) terminology Improve code clarity by consistently adding escape sequence notation to all references of carriage returns and line feeds throughout documentation and tests. This makes the code more readable and avoids ambiguity when discussing these special characters. * feat: Improve terminal output processing clarity and settings UI - Add detailed comments to `processCarriageReturns` explaining line feed handling. - Relocate `terminalCompressProgressBar` setting below `terminalOutputLineLimit` for better context in UI. * Fix: Compress Progress Bar Setting Checkbox --------- Co-authored-by: Matt Rubens --- .changeset/cuddly-cows-sip.md | 11 + evals/apps/web/src/lib/formatters.ts | 2 +- locales/ca/README.md | 50 +- locales/de/README.md | 50 +- locales/es/README.md | 50 +- locales/fr/README.md | 50 +- locales/hi/README.md | 50 +- locales/it/README.md | 50 +- locales/ja/README.md | 50 +- locales/ko/README.md | 50 +- locales/pl/README.md | 50 +- locales/pt-BR/README.md | 50 +- locales/tr/README.md | 50 +- locales/vi/README.md | 50 +- locales/zh-CN/README.md | 50 +- locales/zh-TW/README.md | 50 +- src/core/webview/ClineProvider.ts | 5 +- src/core/webview/webviewMessageHandler.ts | 7 + src/exports/roo-code.d.ts | 1 + src/exports/types.ts | 1 + .../misc/__tests__/extract-text.test.ts | 193 ++++++++ .../processCarriageReturns.benchmark.ts | 453 ++++++++++++++++++ src/integrations/misc/extract-text.ts | 128 ++++- src/integrations/terminal/Terminal.ts | 52 +- .../__tests__/TerminalProcess.test.ts | 6 + src/schemas/index.ts | 2 + src/shared/ExtensionMessage.ts | 1 + src/shared/WebviewMessage.ts | 1 + .../src/components/settings/SettingsView.tsx | 3 + .../components/settings/TerminalSettings.tsx | 15 + .../src/components/ui/select-dropdown.tsx | 3 +- .../src/context/ExtensionStateContext.tsx | 5 + webview-ui/src/i18n/locales/ca/settings.json | 4 + webview-ui/src/i18n/locales/de/settings.json | 4 + webview-ui/src/i18n/locales/en/settings.json | 4 + webview-ui/src/i18n/locales/es/settings.json | 4 + webview-ui/src/i18n/locales/fr/settings.json | 4 + webview-ui/src/i18n/locales/hi/settings.json | 4 + webview-ui/src/i18n/locales/it/settings.json | 4 + webview-ui/src/i18n/locales/ja/settings.json | 4 + webview-ui/src/i18n/locales/ko/settings.json | 4 + webview-ui/src/i18n/locales/pl/settings.json | 4 + .../src/i18n/locales/pt-BR/settings.json | 4 + webview-ui/src/i18n/locales/tr/settings.json | 4 + webview-ui/src/i18n/locales/vi/settings.json | 4 + .../src/i18n/locales/zh-CN/settings.json | 4 + .../src/i18n/locales/zh-TW/settings.json | 4 + 47 files changed, 1293 insertions(+), 356 deletions(-) create mode 100644 .changeset/cuddly-cows-sip.md create mode 100644 src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts diff --git a/.changeset/cuddly-cows-sip.md b/.changeset/cuddly-cows-sip.md new file mode 100644 index 0000000000..58e58f6953 --- /dev/null +++ b/.changeset/cuddly-cows-sip.md @@ -0,0 +1,11 @@ +--- +"roo-cline": patch +--- + +I introduced a new method `processCarriageReturns` in `TerminalProcess.ts` to process carriage returns (\r) in terminal output. This method splits the output into lines, handles each line with carriage returns (\r) by retaining only the content after the last carriage return (\r), and preserves escape sequences to avoid breaking terminal formatting. The method is called within `getUnretrievedOutput` to ensure output is processed before being displayed. Additionally, I added comprehensive test cases in `TerminalProcess.test.ts` under a new `describe("processCarriageReturns", ...)` block to validate various scenarios, including basic progress bars, multiple lines with mixed carriage returns (\r) and line feeds (\n), and ANSI escape sequences. + +Key implementation details: + +- The solution carefully handles special characters and escape sequences to maintain terminal integrity. +- Tradeoff: Slightly increased processing overhead for outputs with carriage returns (\r), but this is negligible compared to the improved user experience. +- I'd like reviewers to pay close attention to the handling of edge cases in `processCarriageReturns` (e.g., lines ending with carriage returns (\r) or mixed content with carriage returns (\r), line feeds (\n), and escape sequences) to ensure no unintended side effects. diff --git a/evals/apps/web/src/lib/formatters.ts b/evals/apps/web/src/lib/formatters.ts index 207e13a5e1..0f75b64a27 100644 --- a/evals/apps/web/src/lib/formatters.ts +++ b/evals/apps/web/src/lib/formatters.ts @@ -45,4 +45,4 @@ export const formatTokens = (tokens: number) => { } export const formatToolUsageSuccessRate = (usage: { attempts: number; failures: number }) => - usage.attempts === 0 ? '0%' : `${(((usage.attempts - usage.failures) / usage.attempts) * 100).toFixed(1)}%` + usage.attempts === 0 ? "0%" : `${(((usage.attempts - usage.failures) / usage.attempts) * 100).toFixed(1)}%` diff --git a/locales/ca/README.md b/locales/ca/README.md index a04ea161c2..624f429954 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index d3a55b6b0c..1294267c7e 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 68470e32bf..fa35f38e5e 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 617f84f535..1c309e5f9c 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 50ca4caa06..8b7f93f3ac 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index 5b802fc888..117c749aa2 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 1b4ea0e8c0..619f15c605 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 5bdf5efd37..35b1c7ab2d 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index d3235ab1b0..ca78cb9119 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 7f2f14d8f2..4593a8e4c5 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index 58e0e5a5eb..e15c0b157f 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index 52d377b2d2..3966918feb 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 835da775cd..4fe685509d 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -178,30 +178,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index a27cf1bbc9..bd9feedb0c 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -179,30 +179,32 @@ 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
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| -|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| -|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| -|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
|aheizi
aheizi
|sachasayan
sachasayan
|RaySinner
RaySinner
| -|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|elianiva
elianiva
|dtrugman
dtrugman
|emshvac
emshvac
|kyle-apex
kyle-apex
| -|pdecat
pdecat
|pugazhendhi-m
pugazhendhi-m
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|zhangtony239
zhangtony239
|upamune
upamune
| -|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|yt3trees
yt3trees
| -|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
| -|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
|axkirillov
axkirillov
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|amittell
amittell
|ashktn
ashktn
|axmo
axmo
|bannzai
bannzai
| -|dairui1
dairui1
|dqroid
dqroid
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
| -|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
|mecab
mecab
|moqimoqidea
moqimoqidea
| -|mosleyit
mosleyit
|nevermorec
nevermorec
|nobu007
nobu007
|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
| -|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
|seedlord
seedlord
|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
| -|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
| -|QuinsZouls
QuinsZouls
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
|bogdan0083
bogdan0083
|chadgauth
chadgauth
| -|dleen
dleen
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
| -|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
| -|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
|01Rian
01Rian
|samsilveira
samsilveira
|maekawataiki
maekawataiki
| -|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
|NamesMT
NamesMT
|vladstudio
vladstudio
|Yoshino-Yukitaro
Yoshino-Yukitaro
| | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| aheizi
aheizi
| sachasayan
sachasayan
| RaySinner
RaySinner
| +| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| elianiva
elianiva
| dtrugman
dtrugman
| emshvac
emshvac
| kyle-apex
kyle-apex
| +| pdecat
pdecat
| pugazhendhi-m
pugazhendhi-m
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| zhangtony239
zhangtony239
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| yt3trees
yt3trees
| +| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| +| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| axkirillov
axkirillov
| anton-otee
anton-otee
| benzntech
benzntech
| +| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| amittell
amittell
| ashktn
ashktn
| axmo
axmo
| bannzai
bannzai
| +| dairui1
dairui1
| dqroid
dqroid
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| +| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| moqimoqidea
moqimoqidea
| +| mosleyit
mosleyit
| nevermorec
nevermorec
| nobu007
nobu007
| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| +| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| seedlord
seedlord
| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| +| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| +| QuinsZouls
QuinsZouls
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| bogdan0083
bogdan0083
| chadgauth
chadgauth
| +| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| +| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| +| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| +| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| NamesMT
NamesMT
| vladstudio
vladstudio
| Yoshino-Yukitaro
Yoshino-Yukitaro
| | + ## 授權 diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 16984a4a49..7ac85534aa 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1243,6 +1243,7 @@ export class ClineProvider extends EventEmitter implements showRooIgnoredFiles, language, maxReadFileLine, + terminalCompressProgressBar, } = await this.getState() const telemetryKey = process.env.POSTHOG_API_KEY @@ -1322,10 +1323,11 @@ export class ClineProvider extends EventEmitter implements telemetryKey, machineId, showRooIgnoredFiles: showRooIgnoredFiles ?? true, - language, + language: language ?? formatLanguage(vscode.env.language), renderContext: this.renderContext, maxReadFileLine: maxReadFileLine ?? 500, settingsImportedAt: this.settingsImportedAt, + terminalCompressProgressBar: terminalCompressProgressBar ?? true, hasSystemPromptOverride, } } @@ -1391,6 +1393,7 @@ export class ClineProvider extends EventEmitter implements terminalZshOhMy: stateValues.terminalZshOhMy ?? false, terminalZshP10k: stateValues.terminalZshP10k ?? false, terminalZdotdir: stateValues.terminalZdotdir ?? false, + terminalCompressProgressBar: stateValues.terminalCompressProgressBar ?? true, mode: stateValues.mode ?? defaultModeSlug, language: stateValues.language ?? formatLanguage(vscode.env.language), mcpEnabled: stateValues.mcpEnabled ?? true, diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 639c3b477f..44e9f1ce74 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -758,6 +758,13 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We Terminal.setTerminalZdotdir(message.bool) } break + case "terminalCompressProgressBar": + await updateGlobalState("terminalCompressProgressBar", message.bool) + await provider.postStateToWebview() + if (message.bool !== undefined) { + Terminal.setCompressProgressBar(message.bool) + } + break case "mode": await provider.handleModeSwitch(message.text as Mode) break diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index f92671bfd5..54afe27146 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -328,6 +328,7 @@ type GlobalSettings = { terminalZshOhMy?: boolean | undefined terminalZshP10k?: boolean | undefined terminalZdotdir?: boolean | undefined + terminalCompressProgressBar?: boolean | undefined rateLimitSeconds?: number | undefined diffEnabled?: boolean | undefined fuzzyMatchThreshold?: number | undefined diff --git a/src/exports/types.ts b/src/exports/types.ts index 855e51815c..194951ac59 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -331,6 +331,7 @@ type GlobalSettings = { terminalZshOhMy?: boolean | undefined terminalZshP10k?: boolean | undefined terminalZdotdir?: boolean | undefined + terminalCompressProgressBar?: boolean | undefined rateLimitSeconds?: number | undefined diffEnabled?: boolean | undefined fuzzyMatchThreshold?: number | undefined diff --git a/src/integrations/misc/__tests__/extract-text.test.ts b/src/integrations/misc/__tests__/extract-text.test.ts index 97c82cd6af..c6bca0a88d 100644 --- a/src/integrations/misc/__tests__/extract-text.test.ts +++ b/src/integrations/misc/__tests__/extract-text.test.ts @@ -4,6 +4,7 @@ import { stripLineNumbers, truncateOutput, applyRunLengthEncoding, + processCarriageReturns, } from "../extract-text" describe("addLineNumbers", () => { @@ -261,3 +262,195 @@ describe("applyRunLengthEncoding", () => { expect(applyRunLengthEncoding(input)).toBe(input) }) }) + +describe("processCarriageReturns", () => { + it("should return original input if no carriage returns (\r) present", () => { + const input = "Line 1\nLine 2\nLine 3" + expect(processCarriageReturns(input)).toBe(input) + }) + + it("should process basic progress bar with carriage returns (\r)", () => { + const input = "Progress: [===>---------] 30%\rProgress: [======>------] 60%\rProgress: [==========>] 100%" + const expected = "Progress: [==========>] 100%%" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle multi-line outputs with carriage returns (\r)", () => { + const input = "Line 1\rUpdated Line 1\nLine 2\rUpdated Line 2\rFinal Line 2" + const expected = "Updated Line 1\nFinal Line 2 2" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle carriage returns (\r) at end of line", () => { + // A carriage return (\r) at the end of a line should be treated as if the cursor is at the start + // with no content following it, so we keep the existing content + const input = "Initial text\rReplacement text\r" + // Depending on terminal behavior: + // Option 1: If last carriage return (\r) is ignored because nothing follows it to replace text + const expected = "Replacement text" + expect(processCarriageReturns(input)).toBe(expected) + }) + + // Additional test to clarify behavior with a terminal-like example + it("should handle carriage returns (\r) in a way that matches terminal behavior", () => { + // In a real terminal: + // 1. "Hello" is printed + // 2. Carriage return (\r) moves cursor to start of line + // 3. "World" overwrites, becoming "World" + // 4. Carriage return (\r) moves cursor to start again + // 5. Nothing follows, so the line remains "World" (cursor just sitting at start) + const input = "Hello\rWorld\r" + const expected = "World" + expect(processCarriageReturns(input)).toBe(expected) + + // Same principle applies to carriage return (\r) + line feed (\n) + // 1. "Line1" is printed + // 2. Carriage return (\r) moves cursor to start + // 3. Line feed (\n) moves to next line, so the line remains "Line1" + expect(processCarriageReturns("Line1\r\n")).toBe("Line1\n") + }) + + it("should preserve lines without carriage returns (\r)", () => { + const input = "Line 1\nLine 2\rUpdated Line 2\nLine 3" + const expected = "Line 1\nUpdated Line 2\nLine 3" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle complex tqdm-like progress bars", () => { + const input = + "10%|██ | 10/100 [00:01<00:09, 10.00it/s]\r20%|████ | 20/100 [00:02<00:08, 10.00it/s]\r100%|██████████| 100/100 [00:10<00:00, 10.00it/s]" + const expected = "100%|██████████| 100/100 [00:10<00:00, 10.00it/s]" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle ANSI escape sequences", () => { + const input = "\x1b]633;C\x07Loading\rLoading.\rLoading..\rLoading...\x1b]633;D\x07" + const expected = "Loading...\x1b]633;D\x07" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle mixed content with carriage returns (\r) and line feeds (\n)", () => { + const input = + "Step 1: Starting\rStep 1: In progress\rStep 1: Done\nStep 2: Starting\rStep 2: In progress\rStep 2: Done" + const expected = "Step 1: Donerogress\nStep 2: Donerogress" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle empty input", () => { + expect(processCarriageReturns("")).toBe("") + }) + + it("should handle large number of carriage returns (\r) efficiently", () => { + // Create a string with many carriage returns (\r) + let input = "" + for (let i = 0; i < 10000; i++) { + input += `Progress: ${i / 100}%\r` + } + input += "Progress: 100%" + + const expected = "Progress: 100%9%" + expect(processCarriageReturns(input)).toBe(expected) + }) + + // Additional edge cases to stress test processCarriageReturns + it("should handle consecutive carriage returns (\r)", () => { + const input = "Initial\r\r\r\rFinal" + const expected = "Finalal" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle carriage returns (\r) at the start of a line", () => { + const input = "\rText after carriage return" + const expected = "Text after carriage return" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle only carriage returns (\r)", () => { + const input = "\r\r\r\r" + const expected = "" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle carriage returns (\r) with empty strings between them", () => { + const input = "Start\r\r\r\r\rEnd" + const expected = "Endrt" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle multiline with carriage returns (\r) at different positions", () => { + const input = "Line1\rLine1Updated\nLine2\nLine3\rLine3Updated\rLine3Final\nLine4" + const expected = "Line1Updated\nLine2\nLine3Finaled\nLine4" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle carriage returns (\r) with special characters", () => { + // This test demonstrates our handling of multi-byte characters (like emoji) when they get partially overwritten. + // When a carriage return (\r) causes partial overwrite of a multi-byte character (like an emoji), + // we need to handle this special case to prevent display issues or corruption. + // + // In this example: + // 1. "Line with 🚀 emoji" is printed (note that the emoji is a multi-byte character) + // 2. Carriage return (\r) moves cursor to start of line + // 3. "Line with a" is printed, which partially overwrites the line + // 4. The 'a' character ends at a position that would split the 🚀 emoji + // 5. Instead of creating corrupted output, we insert a space to replace the partial emoji + // + // This behavior mimics terminals that can detect and properly handle these situations + // by replacing partial characters with spaces to maintain text integrity. + const input = "Line with 🚀 emoji\rLine with a" + const expected = "Line with a emoji" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should correctly handle multiple consecutive line feeds (\n) with carriage returns (\r)", () => { + // Another test case for multi-byte character handling during carriage return (\r) overwrites. + // In this case, we're testing with a different emoji and pattern to ensure robustness. + // + // When a new line with an emoji partially overlaps with text from the previous line, + // we need to properly detect surrogate pairs and other multi-byte sequences to avoid + // creating invalid Unicode output. + // + // Note: The expected result might look strange but it's consistent with how real + // terminals process such content - they only overwrite at character boundaries + // and don't attempt to interpret or normalize the resulting text. + const input = "Line with not a emoji\rLine with 🔥 emoji" + const expected = "Line with 🔥 emojioji" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle carriage returns (\r) in the middle of non-ASCII text", () => { + // Tests handling of non-Latin text (like Chinese characters) + // Non-ASCII text uses multi-byte encodings, so this test verifies our handling works + // properly with such character sets. + // + // Our implementation ensures we preserve character boundaries and don't create + // invalid sequences when carriage returns (\r) cause partial overwrites. + const input = "你好世界啊\r你好地球" + const expected = "你好地球啊" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should correctly handle complex patterns of alternating carriage returns (\r) and line feeds (\n)", () => { + // Break down the example: + // 1. "Line1" + carriage return (\r) + line feed (\n): carriage return (\r) moves cursor to start of line, line feed (\n) moves to next line, preserving "Line1" + // 2. "Line2" + carriage return (\r): carriage return (\r) moves cursor to start of line + // 3. "Line2Updated" overwrites "Line2" + // 4. Line feed (\n): moves to next line + // 5. "Line3" + carriage return (\r) + line feed (\n): carriage return (\r) moves cursor to start, line feed (\n) moves to next line, preserving "Line3" + const input = "Line1\r\nLine2\rLine2Updated\nLine3\r\n" + const expected = "Line1\nLine2Updated\nLine3\n" + expect(processCarriageReturns(input)).toBe(expected) + }) + + it("should handle partial overwrites with carriage returns (\r)", () => { + // In this case: + // 1. "Initial text" is printed + // 2. Carriage return (\r) moves cursor to start of line + // 3. "next" is printed, overwriting only the first 4 chars + // 4. Carriage return (\r) moves cursor to start, but nothing follows + // Final result should be "nextial text" (first 4 chars overwritten) + const input = "Initial text\rnext\r" + const expected = "nextial text" + expect(processCarriageReturns(input)).toBe(expected) + }) +}) diff --git a/src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts b/src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts new file mode 100644 index 0000000000..942ab02c9b --- /dev/null +++ b/src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts @@ -0,0 +1,453 @@ +import { processCarriageReturns, applyRunLengthEncoding, truncateOutput } from "../../extract-text" + +/** + * Enhanced Benchmark test for terminal output processing functions + * + * This script tests terminal output processing with various data patterns: + * 1. Regular output with carriage returns (various sizes) + * 2. Extremely long single lines with carriage returns + * 3. High-density carriage return patterns + * + * Tests with various data sizes and complexity levels for real-world performance metrics + */ + +// Set a fixed random seed for reproducibility +const SEED = 12345 +let seed = SEED + +// Simple random number generator with seed +function random() { + const x = Math.sin(seed++) * 10000 + return x - Math.floor(x) +} + +// Generate random progress bar-like data with carriage returns +function generateTestData(size: number, complexity: "simple" | "medium" | "complex" = "medium"): string { + seed = SEED // Reset seed for reproducibility + + let result = "" + + // Create lines of random content + for (let i = 0; i < size; i++) { + const line = `Processing file ${i}: ` + + // For some lines, add progress bar updates with carriage returns + if (random() < 0.3) { + // 30% of lines have progress bars + let progressUpdates: number + + switch (complexity) { + case "simple": + progressUpdates = Math.floor(random() * 5) + 1 // 1-5 updates + break + case "medium": + progressUpdates = Math.floor(random() * 20) + 1 // 1-20 updates + break + case "complex": + progressUpdates = Math.floor(random() * 50) + 1 // 1-50 updates + break + } + + for (let p = 0; p < progressUpdates; p++) { + const progress = Math.floor((p / progressUpdates) * 100) + // Ensure we never have negative values for repeat + const progressChars = Math.max(0, p) + const remainingChars = Math.max(0, 20 - p) + const bar = `${line}[${"=".repeat(progressChars)}>${"-".repeat(remainingChars)}] ${progress}%\r` + result += bar + } + + // Add final state + result += `${line}[${"=".repeat(20)}] 100%\n` + } else { + // Regular line + result += `${line}Complete\n` + } + + // Add more complex patterns for complex mode + if (complexity === "complex" && random() < 0.1) { + // Add ANSI escape sequences + result += `\x1b[33mWarning: Slow operation detected\r\x1b[33mWarning: Fixed\x1b[0m\n` + + // Add Unicode with carriage returns + if (random() < 0.5) { + result += `处理中...\r已完成!\n` + } + + // Add partial line overwrites + if (random() < 0.5) { + result += `Very long line with lots of text...\rShort\n` + } + + // Add repeating patterns for RLE + if (random() < 0.5) { + result += `${"#".repeat(100)}\n` + } + + // Add excessive new lines for truncation testing + if (random() < 0.3) { + result += "\n".repeat(Math.floor(random() * 10) + 1) + } + } + } + + return result +} + +// Generate a test with extremely long single lines +function generateLongLineTestData(lineLengthKB: number, updateCount: number): string { + // Create a base string that's lineLengthKB kilobytes + const baseLength = lineLengthKB * 1024 + let baseString = "" + + // Generate a long string with repeating characters + for (let i = 0; i < baseLength; i++) { + baseString += String.fromCharCode(32 + (i % 94)) // Printable ASCII chars + } + + let result = baseString + + // Add carriage returns and modifications at various positions + for (let i = 0; i < updateCount; i++) { + // Calculate update position (divide the string into updateCount segments) + const updateLength = Math.floor(baseLength / updateCount) + const updatePosition = updateLength * i + + // Create update string that's 10% of the update segment length + const modificationLength = Math.floor(updateLength * 0.1) + let modification = "" + for (let j = 0; j < modificationLength; j++) { + modification += String.fromCharCode(65 + (j % 26)) // A-Z + } + + // Add carriage return and modification + result += `\r${modification}${baseString.substring(modification.length, updatePosition)}` + } + + return result +} + +// Generate high-density carriage return data +function generateHighDensityCRData(size: number): string { + let result = "" + + // Create small text segments separated by carriage returns + for (let i = 0; i < size; i++) { + // Add a small text segment (3-10 chars) + const segmentLength = 3 + Math.floor(random() * 8) + let segment = "" + for (let j = 0; j < segmentLength; j++) { + segment += String.fromCharCode(97 + Math.floor(random() * 26)) // a-z + } + + result += segment + + // 90% chance to add a carriage return + if (random() < 0.9) { + result += "\r" + } else { + result += "\n" + } + } + + return result +} + +// Get appropriate iteration count for different sizes to ensure meaningful timing +function getIterationCount(size: number): number { + if (size <= 10000) return 100 + if (size <= 100000) return 20 + if (size <= 500000) return 10 + return 5 // For very large tests +} + +// Calculate statistical measures +function calculateStats(durations: number[]) { + // Sort durations for percentile calculations + const sorted = [...durations].sort((a, b) => a - b) + + // Calculate mean once to avoid repeating this calculation + const mean = durations.reduce((a, b) => a + b, 0) / durations.length + + return { + min: sorted[0], + max: sorted[sorted.length - 1], + median: sorted[Math.floor(sorted.length / 2)], + p95: sorted[Math.floor(sorted.length * 0.95)], + p99: sorted[Math.floor(sorted.length * 0.99)], + mean, + stdDev: Math.sqrt(durations.map((x) => Math.pow(x - mean, 2)).reduce((a, b) => a + b, 0) / durations.length), + } +} + +// Run performance test for a specific function +function runPerformanceTest( + name: string, + fn: (input: string, ...args: any[]) => string, + input: string, + iterations: number, + args: any[] = [], +) { + console.log(`\nTesting ${name}...`) + + // Pre-warm + const warmupResult = fn(input, ...args) + const resultSize = (warmupResult.length / (1024 * 1024)).toFixed(2) + const reduction = (100 - (warmupResult.length / input.length) * 100).toFixed(2) + + // Measure performance + const durations: number[] = [] + + // Force garbage collection if available (Node.js with --expose-gc flag) + if (global.gc) { + global.gc() + } + + for (let i = 0; i < iterations; i++) { + const startTime = performance.now() + fn(input, ...args) + const endTime = performance.now() + durations.push(endTime - startTime) + + // Progress indicator + if (iterations > 10 && i % Math.floor(iterations / 10) === 0) { + process.stdout.write(".") + } + } + + if (iterations > 10) { + process.stdout.write("\n") + } + + // Calculate stats + const stats = calculateStats(durations) + + // Calculate throughput + const totalSizeProcessed = (input.length * iterations) / (1024 * 1024) // MB + const totalBenchmarkTime = durations.reduce((a, b) => a + b, 0) / 1000 // seconds + const averageThroughput = (totalSizeProcessed / totalBenchmarkTime).toFixed(2) // MB/s + const peakThroughput = (input.length / (1024 * 1024) / (stats.min / 1000)).toFixed(2) // MB/s + // Add a more stable "reliable throughput" metric based on p95 + const reliableThroughput = (input.length / (1024 * 1024) / (stats.p95 / 1000)).toFixed(2) // MB/s + + // Output metrics + console.log(`- Time Statistics (in ms):`) + console.log(` • Mean: ${stats.mean.toFixed(3)}`) + console.log(` • Median: ${stats.median.toFixed(3)}`) + console.log(` • Min: ${stats.min.toFixed(3)}`) + console.log(` • Max: ${stats.max.toFixed(3)}`) + console.log(` • P95: ${stats.p95.toFixed(3)}`) + console.log(` • P99: ${stats.p99.toFixed(3)}`) + console.log(`- Throughput:`) + console.log(` • Average: ${averageThroughput} MB/s`) + console.log(` • Peak: ${peakThroughput} MB/s`) + console.log(` • Reliable (P95): ${reliableThroughput} MB/s`) + console.log( + `- Output size: ${resultSize} MB (${reduction}% ${parseFloat(reduction) < 0 ? "increase" : "reduction"})`, + ) + + return { + stats, + resultSize, + reduction, + averageThroughput, + peakThroughput, + reliableThroughput, + } +} + +// Run comparative test between identical runs to measure variance +function runBaselineTest(input: string, iterations: number) { + console.log("\n=== Baseline Performance Test ===") + console.log(`Testing with ${(input.length / (1024 * 1024)).toFixed(2)} MB of data`) + + const runs = 5 // Run 5 times for better variance analysis + const results = [] + + for (let i = 0; i < runs; i++) { + results.push(runPerformanceTest(`Run ${i + 1}`, processCarriageReturns, input, iterations)) + } + + // Calculate average and variance metrics + const meanTimes = results.map((r) => r.stats.mean) + const avgMean = meanTimes.reduce((a, b) => a + b, 0) / runs + const maxVariation = Math.max(...meanTimes.map((t) => Math.abs(((t - avgMean) / avgMean) * 100))) + + const throughputs = results.map((r) => parseFloat(r.peakThroughput)) + const avgThroughput = throughputs.reduce((a, b) => a + b, 0) / runs + const throughputVariation = Math.max( + ...throughputs.map((t) => Math.abs(((t - avgThroughput) / avgThroughput) * 100)), + ) + + console.log("\n=== Performance Variation Analysis ===") + console.log(`Mean execution time: ${avgMean.toFixed(3)} ms (±${maxVariation.toFixed(2)}%)`) + console.log(`Peak throughput: ${avgThroughput.toFixed(2)} MB/s (±${throughputVariation.toFixed(2)}%)`) + + return { results, avgMean, maxVariation, avgThroughput, throughputVariation } +} + +// Run benchmark with different data sizes and complexity levels +function runBenchmark() { + // Define regular test configurations: [size, complexity] + const standardTestConfigs: [number, "simple" | "medium" | "complex"][] = [ + [10000, "simple"], + [10000, "complex"], + [100000, "simple"], + [100000, "complex"], + [500000, "complex"], // Large data test + ] + + // Define long line test configurations: [lineLengthKB, updateCount] + const longLineTestConfigs: [number, number][] = [ + [100, 20], // 100KB line with 20 updates + [1000, 50], // 1MB line with 50 updates + [5000, 200], // 5MB line with 200 updates + ] + + // Define high-density CR test configurations: [size] + const highDensityCRConfigs: number[] = [ + 10000, // 10K updates + 100000, // 100K updates + ] + + console.log("=".repeat(80)) + console.log("TERMINAL OUTPUT PROCESSING BENCHMARK") + console.log("=".repeat(80)) + + // Initial warmup to load JIT compiler + console.log("\nPerforming initial warmup...") + const warmupData = generateTestData(5000, "complex") + for (let i = 0; i < 50; i++) { + processCarriageReturns(warmupData) + applyRunLengthEncoding(warmupData) + truncateOutput(warmupData, 500) + } + console.log("Warmup complete") + + // Run standard tests + console.log("\n" + "=".repeat(80)) + console.log("STANDARD TESTS") + console.log("=".repeat(80)) + + for (const [size, complexity] of standardTestConfigs) { + console.log(`\n${"-".repeat(80)}`) + console.log(`Testing with ${size} lines, ${complexity} complexity...`) + + // Generate test data + const startGenTime = performance.now() + const testData = generateTestData(size, complexity) + const genTime = performance.now() - startGenTime + const dataSize = (testData.length / (1024 * 1024)).toFixed(2) + + console.log(`Generated ${dataSize} MB of test data in ${genTime.toFixed(2)}ms`) + + // Count carriage returns for reference + const carriageReturns = (testData.match(/\r/g) || []).length + const newLines = (testData.match(/\n/g) || []).length + console.log(`Test data contains ${carriageReturns} carriage returns and ${newLines} newlines`) + + // Get iteration count based on data size + const iterations = getIterationCount(size) + console.log(`Running ${iterations} iterations for each function...`) + + // Test each function + const lineLimit = 500 // Standard line limit for truncation + + console.log("\n--- Function 1: processCarriageReturns ---") + const processCarriageReturnsResult = runPerformanceTest( + "processCarriageReturns", + processCarriageReturns, + testData, + iterations, + ) + + console.log("\n--- Function 2: applyRunLengthEncoding ---") + const applyRunLengthEncodingResult = runPerformanceTest( + "applyRunLengthEncoding", + applyRunLengthEncoding, + testData, + iterations, + ) + + console.log("\n--- Function 3: truncateOutput ---") + const truncateOutputResult = runPerformanceTest("truncateOutput", truncateOutput, testData, iterations, [ + lineLimit, + ]) + + // Run baseline test to measure variance between identical runs + runBaselineTest(testData, Math.max(5, Math.floor(iterations / 4))) + + // Test combined pipeline + console.log("\n--- Combined Pipeline ---") + runPerformanceTest( + "Full Pipeline", + (input) => truncateOutput(applyRunLengthEncoding(processCarriageReturns(input)), lineLimit), + testData, + Math.max(3, Math.floor(iterations / 5)), + ) + } + + // Run long line tests + console.log("\n" + "=".repeat(80)) + console.log("EXTRA LONG LINE TESTS") + console.log("=".repeat(80)) + + for (const [lineLength, updateCount] of longLineTestConfigs) { + console.log(`\n${"-".repeat(80)}`) + console.log(`Testing with ${lineLength}KB single line, ${updateCount} carriage return updates...`) + + // Generate long line test data + const startGenTime = performance.now() + const testData = generateLongLineTestData(lineLength, updateCount) + const genTime = performance.now() - startGenTime + const dataSize = (testData.length / (1024 * 1024)).toFixed(2) + + console.log(`Generated ${dataSize} MB of long line test data in ${genTime.toFixed(2)}ms`) + console.log(`Test data contains ${updateCount} carriage returns`) + + // Use fewer iterations for long line tests + const iterations = Math.max(3, Math.min(10, getIterationCount(lineLength * 100))) + console.log(`Running ${iterations} iterations...`) + + console.log("\n--- Testing processCarriageReturns with long line ---") + runPerformanceTest("processCarriageReturns (long line)", processCarriageReturns, testData, iterations) + } + + // Run high-density carriage return tests + console.log("\n" + "=".repeat(80)) + console.log("HIGH-DENSITY CARRIAGE RETURN TESTS") + console.log("=".repeat(80)) + + for (const size of highDensityCRConfigs) { + console.log(`\n${"-".repeat(80)}`) + console.log(`Testing with ${size} high-density CR updates...`) + + // Generate high-density CR test data + const startGenTime = performance.now() + const testData = generateHighDensityCRData(size) + const genTime = performance.now() - startGenTime + const dataSize = (testData.length / (1024 * 1024)).toFixed(2) + + console.log(`Generated ${dataSize} MB of high-density CR test data in ${genTime.toFixed(2)}ms`) + + // Use fewer iterations for these intensive tests + const iterations = Math.max(5, Math.floor(getIterationCount(size) / 2)) + console.log(`Running ${iterations} iterations...`) + + console.log("\n--- Testing processCarriageReturns with high-density CRs ---") + runPerformanceTest("processCarriageReturns (high-density CR)", processCarriageReturns, testData, iterations) + } + + console.log("\n" + "=".repeat(80)) + console.log("Benchmark complete") + console.log("=".repeat(80)) +} + +// Run the benchmark +runBenchmark() + +// To run this benchmark: +// npx tsx src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts + +// To run with more accurate timing (with explicit garbage collection): +// node --expose-gc -r tsx/cjs src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts diff --git a/src/integrations/misc/extract-text.ts b/src/integrations/misc/extract-text.ts index 7b56dcb9b3..5bbbbf8514 100644 --- a/src/integrations/misc/extract-text.ts +++ b/src/integrations/misc/extract-text.ts @@ -62,7 +62,7 @@ export function addLineNumbers(content: string, startLine: number = 1): string { return startLine === 1 ? "" : `${startLine} | \n` } - // Split into lines and handle trailing newlines + // Split into lines and handle trailing line feeds (\n) const lines = content.split("\n") const lastLineEmpty = lines[lines.length - 1] === "" if (lastLineEmpty) { @@ -82,7 +82,7 @@ export function addLineNumbers(content: string, startLine: number = 1): string { // Checks if every line in the content has line numbers prefixed (e.g., "1 | content" or "123 | content") // Line numbers must be followed by a single pipe character (not double pipes) export function everyLineHasLineNumbers(content: string): boolean { - const lines = content.split(/\r?\n/) + const lines = content.split(/\r?\n/) // Handles both CRLF (carriage return (\r) + line feed (\n)) and LF (line feed (\n)) line endings return lines.length > 0 && lines.every((line) => /^\s*\d+\s+\|(?!\|)/.test(line)) } @@ -106,7 +106,7 @@ export function stripLineNumbers(content: string, aggressive: boolean = false): return match ? match[1] : line }) - // Join back with original line endings + // Join back with original line endings (carriage return (\r) + line feed (\n) or just line feed (\n)) const lineEnding = content.includes("\r\n") ? "\r\n" : "\n" return processedLines.join(lineEnding) } @@ -137,7 +137,7 @@ export function truncateOutput(content: string, lineLimit?: number): string { while ((pos = content.indexOf("\n", pos + 1)) !== -1) { totalLines++ } - totalLines++ // Account for last line without newline + totalLines++ // Account for last line without line feed (\n) if (totalLines <= lineLimit) { return content @@ -161,7 +161,7 @@ export function truncateOutput(content: string, lineLimit?: number): string { lineCount = 0 pos = content.length while (lineCount < afterLimit && (pos = content.lastIndexOf("\n", pos - 1)) !== -1) { - endStartPos = pos + 1 // Start after the newline + endStartPos = pos + 1 // Start after the line feed (\n) lineCount++ } @@ -190,7 +190,7 @@ export function applyRunLengthEncoding(content: string): string { let firstOccurrence = true while (pos < content.length) { - const nextNewlineIdx = content.indexOf("\n", pos) + const nextNewlineIdx = content.indexOf("\n", pos) // Find next line feed (\n) index const currentLine = nextNewlineIdx === -1 ? content.slice(pos) : content.slice(pos, nextNewlineIdx + 1) if (prevLine === null) { @@ -232,3 +232,119 @@ export function applyRunLengthEncoding(content: string): string { return result } + +/** + * Processes carriage returns (\r) in terminal output to simulate how a real terminal would display content. + * This function is optimized for performance by using in-place string operations and avoiding memory-intensive + * operations like split/join. + * + * Key features: + * 1. Processes output line-by-line to maximize chunk processing + * 2. Uses string indexes and substring operations instead of arrays + * 3. Single-pass traversal of the entire input + * 4. Special handling for multi-byte characters (like emoji) to prevent corruption + * 5. Replacement of partially overwritten multi-byte characters with spaces + * + * @param input The terminal output to process + * @returns The processed terminal output with carriage returns (\r) handled + */ +export function processCarriageReturns(input: string): string { + // Quick check: if no carriage returns (\r), return the original input + if (input.indexOf("\r") === -1) return input + + let output = "" + let i = 0 + const len = input.length + + // Single-pass traversal of the entire input + while (i < len) { + // Find current line's end position (line feed (\n) or end of text) + let lineEnd = input.indexOf("\n", i) + if (lineEnd === -1) lineEnd = len + + // Check if current line contains carriage returns (\r) + let crPos = input.indexOf("\r", i) + if (crPos === -1 || crPos >= lineEnd) { + // No carriage returns (\r) in this line, copy entire line + output += input.substring(i, lineEnd) + } else { + // Line has carriage returns (\r), handle overwrite logic + let curLine = input.substring(i, crPos) + curLine = processLineWithCarriageReturns(input, curLine, crPos, lineEnd) + output += curLine + } + + // 'curLine' now holds the processed content of the line *without* its original terminating line feed (\n) character. + // 'lineEnd' points to the position of that line feed (\n) in the original input, or to the end of the input string if no line feed (\n) was found. + // This check explicitly adds the line feed (\n) character back *only if* one was originally present at this position (lineEnd < len). + // This ensures we preserve the original structure, correctly handling inputs both with and without a final line feed (\n), + // rather than incorrectly injecting a line feed (\n) if the original input didn't end with one. + if (lineEnd < len) output += "\n" + + // Move to next line + i = lineEnd + 1 + } + + return output +} + +/** + * Helper function to process a single line with carriage returns. + * Handles the overwrite logic for a line that contains one or more carriage returns (\r). + * + * @param input The original input string + * @param initialLine The line content up to the first carriage return + * @param initialCrPos The position of the first carriage return in the line + * @param lineEnd The position where the line ends + * @returns The processed line with carriage returns handled + */ +function processLineWithCarriageReturns( + input: string, + initialLine: string, + initialCrPos: number, + lineEnd: number, +): string { + let curLine = initialLine + let crPos = initialCrPos + + while (crPos < lineEnd) { + // Find next carriage return (\r) or line end (line feed (\n)) + let nextCrPos = input.indexOf("\r", crPos + 1) + if (nextCrPos === -1 || nextCrPos >= lineEnd) nextCrPos = lineEnd + + // Extract segment after carriage return (\r) + let segment = input.substring(crPos + 1, nextCrPos) + + // Skip empty segments + if (segment !== "") { + // Determine how to handle overwrite + if (segment.length >= curLine.length) { + // Complete overwrite + curLine = segment + } else { + // Partial overwrite - need to check for multi-byte character boundary issues + const potentialPartialChar = curLine.charAt(segment.length) + const segmentLastCharCode = segment.length > 0 ? segment.charCodeAt(segment.length - 1) : 0 + const partialCharCode = potentialPartialChar.charCodeAt(0) + + // Simplified condition for multi-byte character detection + if ( + (segmentLastCharCode >= 0xd800 && segmentLastCharCode <= 0xdbff) || // High surrogate at end of segment + (partialCharCode >= 0xdc00 && partialCharCode <= 0xdfff) || // Low surrogate at overwrite position + (curLine.length > segment.length + 1 && partialCharCode >= 0xd800 && partialCharCode <= 0xdbff) // High surrogate followed by another character + ) { + // If a partially overwritten multi-byte character is detected, replace with space + const remainPart = curLine.substring(segment.length + 1) + curLine = segment + " " + remainPart + } else { + // Normal partial overwrite + curLine = segment + curLine.substring(segment.length) + } + } + } + + crPos = nextCrPos + } + + return curLine +} diff --git a/src/integrations/terminal/Terminal.ts b/src/integrations/terminal/Terminal.ts index 2faa57cfff..5f896c265d 100644 --- a/src/integrations/terminal/Terminal.ts +++ b/src/integrations/terminal/Terminal.ts @@ -1,7 +1,7 @@ import * as vscode from "vscode" import pWaitFor from "p-wait-for" import { ExitCodeDetails, mergePromise, TerminalProcess, TerminalProcessResultPromise } from "./TerminalProcess" -import { truncateOutput, applyRunLengthEncoding } from "../misc/extract-text" +import { truncateOutput, applyRunLengthEncoding, processCarriageReturns } from "../misc/extract-text" // Import TerminalRegistry here to avoid circular dependencies const { TerminalRegistry } = require("./TerminalRegistry") @@ -22,6 +22,7 @@ export class Terminal { private static terminalZshOhMy: boolean = false private static terminalZshP10k: boolean = false private static terminalZdotdir: boolean = false + private static compressProgressBar: boolean = true public terminal: vscode.Terminal public busy: boolean @@ -292,12 +293,13 @@ export class Terminal { * @param input The terminal output to compress * @returns The compressed terminal output */ - public static setShellIntegrationTimeout(timeoutMs: number): void { - Terminal.shellIntegrationTimeout = timeoutMs - } - - public static getShellIntegrationTimeout(): number { - return Terminal.shellIntegrationTimeout + public static compressTerminalOutput(input: string, lineLimit: number): string { + // Apply carriage return processing if the feature is enabled + let processedInput = input + if (Terminal.compressProgressBar && input.includes("\r")) { + processedInput = processCarriageReturns(input) + } + return truncateOutput(applyRunLengthEncoding(processedInput), lineLimit) } /** @@ -380,10 +382,6 @@ export class Terminal { return Terminal.terminalZshP10k } - public static compressTerminalOutput(input: string, lineLimit: number): string { - return truncateOutput(applyRunLengthEncoding(input), lineLimit) - } - /** * Sets whether to enable ZDOTDIR handling for zsh * @param enabled Whether to enable ZDOTDIR handling @@ -399,4 +397,36 @@ export class Terminal { public static getTerminalZdotdir(): boolean { return Terminal.terminalZdotdir } + + /** + * Sets whether to compress progress bar output by processing carriage returns + * @param enabled Whether to enable progress bar compression + */ + public static setCompressProgressBar(enabled: boolean): void { + Terminal.compressProgressBar = enabled + } + + /** + * Gets whether progress bar compression is enabled + * @returns Whether progress bar compression is enabled + */ + public static getCompressProgressBar(): boolean { + return Terminal.compressProgressBar + } + + /** + * Sets the shell integration timeout in milliseconds + * @param timeoutMs The timeout in milliseconds (1000-60000) + */ + public static setShellIntegrationTimeout(timeoutMs: number): void { + Terminal.shellIntegrationTimeout = timeoutMs + } + + /** + * Gets the shell integration timeout in milliseconds + * @returns The timeout in milliseconds + */ + public static getShellIntegrationTimeout(): number { + return Terminal.shellIntegrationTimeout + } } diff --git a/src/integrations/terminal/__tests__/TerminalProcess.test.ts b/src/integrations/terminal/__tests__/TerminalProcess.test.ts index 82bfe23659..a0d2b9b9c5 100644 --- a/src/integrations/terminal/__tests__/TerminalProcess.test.ts +++ b/src/integrations/terminal/__tests__/TerminalProcess.test.ts @@ -108,6 +108,9 @@ describe("TerminalProcess", () => { }) it("handles terminals without shell integration", async () => { + // Temporarily suppress the expected console.warn for this test + const consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation(() => {}) + // Create a terminal without shell integration const noShellTerminal = { sendText: jest.fn(), @@ -143,6 +146,9 @@ describe("TerminalProcess", () => { // Verify sendText was called with the command expect(noShellTerminal.sendText).toHaveBeenCalledWith("test command", true) + + // Restore the original console.warn + consoleWarnSpy.mockRestore() }) it("sets hot state for compiling commands", async () => { diff --git a/src/schemas/index.ts b/src/schemas/index.ts index ef2a1508c8..909dec5f9f 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -557,6 +557,7 @@ export const globalSettingsSchema = z.object({ terminalZshOhMy: z.boolean().optional(), terminalZshP10k: z.boolean().optional(), terminalZdotdir: z.boolean().optional(), + terminalCompressProgressBar: z.boolean().optional(), rateLimitSeconds: z.number().optional(), diffEnabled: z.boolean().optional(), @@ -632,6 +633,7 @@ const globalSettingsRecord: GlobalSettingsRecord = { terminalZshOhMy: undefined, terminalZshP10k: undefined, terminalZdotdir: undefined, + terminalCompressProgressBar: undefined, rateLimitSeconds: undefined, diffEnabled: undefined, diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 25a3133e30..b942188345 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -158,6 +158,7 @@ export type ExtensionState = Pick< | "terminalZshOhMy" | "terminalZshP10k" | "terminalZdotdir" + | "terminalCompressProgressBar" | "diffEnabled" | "fuzzyMatchThreshold" // | "experiments" // Optional in GlobalSettings, required here. diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 83725bc5c3..6b5c111f7a 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -87,6 +87,7 @@ export interface WebviewMessage { | "terminalZshOhMy" | "terminalZshP10k" | "terminalZdotdir" + | "terminalCompressProgressBar" | "mcpEnabled" | "enableMcpServerCreation" | "searchCommits" diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index c2aff35391..7205b04370 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -135,6 +135,7 @@ const SettingsView = forwardRef(({ onDone, t showRooIgnoredFiles, remoteBrowserEnabled, maxReadFileLine, + terminalCompressProgressBar, } = cachedState // Make sure apiConfiguration is initialized and managed by SettingsView. @@ -244,6 +245,7 @@ const SettingsView = forwardRef(({ onDone, t vscode.postMessage({ type: "terminalZshOhMy", bool: terminalZshOhMy }) vscode.postMessage({ type: "terminalZshP10k", bool: terminalZshP10k }) vscode.postMessage({ type: "terminalZdotdir", bool: terminalZdotdir }) + vscode.postMessage({ type: "terminalCompressProgressBar", bool: terminalCompressProgressBar }) vscode.postMessage({ type: "mcpEnabled", bool: mcpEnabled }) vscode.postMessage({ type: "alwaysApproveResubmit", bool: alwaysApproveResubmit }) vscode.postMessage({ type: "requestDelaySeconds", value: requestDelaySeconds }) @@ -490,6 +492,7 @@ const SettingsView = forwardRef(({ onDone, t terminalZshOhMy={terminalZshOhMy} terminalZshP10k={terminalZshP10k} terminalZdotdir={terminalZdotdir} + terminalCompressProgressBar={terminalCompressProgressBar} setCachedStateField={setCachedStateField} />
diff --git a/webview-ui/src/components/settings/TerminalSettings.tsx b/webview-ui/src/components/settings/TerminalSettings.tsx index d4e2d8850d..1a7259a067 100644 --- a/webview-ui/src/components/settings/TerminalSettings.tsx +++ b/webview-ui/src/components/settings/TerminalSettings.tsx @@ -19,6 +19,7 @@ type TerminalSettingsProps = HTMLAttributes & { terminalZshOhMy?: boolean terminalZshP10k?: boolean terminalZdotdir?: boolean + terminalCompressProgressBar?: boolean setCachedStateField: SetCachedStateField< | "terminalOutputLineLimit" | "terminalShellIntegrationTimeout" @@ -28,6 +29,7 @@ type TerminalSettingsProps = HTMLAttributes & { | "terminalZshOhMy" | "terminalZshP10k" | "terminalZdotdir" + | "terminalCompressProgressBar" > } @@ -40,6 +42,7 @@ export const TerminalSettings = ({ terminalZshOhMy, terminalZshP10k, terminalZdotdir, + terminalCompressProgressBar, setCachedStateField, className, ...props @@ -74,6 +77,18 @@ export const TerminalSettings = ({
+
+ setCachedStateField("terminalCompressProgressBar", e.target.checked)} + data-testid="terminal-compress-progress-bar-checkbox"> + {t("settings:terminal.compressProgressBar.label")} + +
+ {t("settings:terminal.compressProgressBar.description")} +
+
+