From d6860e1114f552d4b5c45c1968458c4bf79768bf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 25 Apr 2025 23:53:45 -0400 Subject: [PATCH 01/43] Update contributors list (#2946) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 50 ++++++++++++++++++++--------------------- locales/ca/README.md | 42 +++++++++++++++++----------------- locales/de/README.md | 42 +++++++++++++++++----------------- locales/es/README.md | 42 +++++++++++++++++----------------- locales/fr/README.md | 42 +++++++++++++++++----------------- locales/hi/README.md | 42 +++++++++++++++++----------------- locales/it/README.md | 42 +++++++++++++++++----------------- locales/ja/README.md | 42 +++++++++++++++++----------------- locales/ko/README.md | 42 +++++++++++++++++----------------- locales/pl/README.md | 42 +++++++++++++++++----------------- locales/pt-BR/README.md | 42 +++++++++++++++++----------------- locales/tr/README.md | 42 +++++++++++++++++----------------- locales/vi/README.md | 42 +++++++++++++++++----------------- locales/zh-CN/README.md | 42 +++++++++++++++++----------------- locales/zh-TW/README.md | 42 +++++++++++++++++----------------- 15 files changed, 319 insertions(+), 319 deletions(-) diff --git a/README.md b/README.md index 40273cbf203..f0c0ad812c6 100644 --- a/README.md +++ b/README.md @@ -181,31 +181,31 @@ 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
| wkordalski
wkordalski
| vigneshsubbiah16
vigneshsubbiah16
| cannuri
cannuri
| -| lloydchang
lloydchang
| Szpadel
Szpadel
| qdaxb
qdaxb
| lupuletic
lupuletic
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| elianiva
elianiva
| 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
| aitoroses
aitoroses
| axkirillov
axkirillov
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| franekp
franekp
| yt3trees
yt3trees
| anton-otee
anton-otee
| benzntech
benzntech
| -| bramburn
bramburn
| GitlyHallows
GitlyHallows
| philfung
philfung
| napter
napter
| mdp
mdp
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| SplittyDev
SplittyDev
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| -| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| ashktn
ashktn
| amittell
amittell
| -| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| -| samir-nimbly
samir-nimbly
| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| -| nobu007
nobu007
| nevermorec
nevermorec
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Yoshino-Yukitaro
Yoshino-Yukitaro
| -| hesara
hesara
| DeXtroTip
DeXtroTip
| celestial-vault
celestial-vault
| linegel
linegel
| snoyiatk
snoyiatk
| dbasclpy
dbasclpy
| -| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| -| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| AMHesch
AMHesch
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| -| NamesMT
NamesMT
| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| -| Jdo300
Jdo300
| eltociear
eltociear
| | | | | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| jquanton
jquanton
| +| nissa-seru
nissa-seru
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| psv2522
psv2522
| diarmidmackenzie
diarmidmackenzie
| +| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| sachasayan
sachasayan
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| +| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| +| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| 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
| philfung
philfung
| 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
| nevermorec
nevermorec
| im47cn
im47cn
| hongzio
hongzio
| +| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| ashktn
ashktn
| +| eltociear
eltociear
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| +| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| +| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| +| hesara
hesara
| DeXtroTip
DeXtroTip
| celestial-vault
celestial-vault
| linegel
linegel
| snoyiatk
snoyiatk
| dbasclpy
dbasclpy
| +| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| +| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| +| samsilveira
samsilveira
| 01Rian
01Rian
| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Jdo300
Jdo300
| | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index 620ae86f430..eec221b2c87 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -180,29 +180,29 @@ 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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index d323fb72726..722e1497682 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -180,29 +180,29 @@ 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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index f831d989033..7edc9be831b 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -180,29 +180,29 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index fa9482d0ee4..9be04dd3238 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -180,29 +180,29 @@ 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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 9e79016b8ec..2ec7584a758 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -180,29 +180,29 @@ 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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index ec6343388fe..3d04b2bfe61 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -180,29 +180,29 @@ 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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index d1c58af1d4e..323c06e811b 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -180,29 +180,29 @@ 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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index d8c089e52e4..33a286e3b1e 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -180,29 +180,29 @@ 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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index e5399fca201..d6958df8ccb 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -180,29 +180,29 @@ 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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 9dfae9e2d0e..fd3cb509167 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -180,29 +180,29 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index 20efc689f50..f26e54dca7e 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -180,29 +180,29 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index fdb22b91b04..70bfa54527d 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -180,29 +180,29 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index 7cc4d0bfbda..65ceba0ee80 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -180,29 +180,29 @@ code --install-extension bin/roo-cline-.vsix |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 1984654c946..91d1379a3ec 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -181,29 +181,29 @@ code --install-extension bin/roo-cline-.vsix |mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| |:---:|:---:|:---:|:---:|:---:|:---:| -|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|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
|wkordalski
wkordalski
|vigneshsubbiah16
vigneshsubbiah16
|cannuri
cannuri
| -|lloydchang
lloydchang
|Szpadel
Szpadel
|qdaxb
qdaxb
|lupuletic
lupuletic
|Premshay
Premshay
|psv2522
psv2522
| -|diarmidmackenzie
diarmidmackenzie
|elianiva
elianiva
|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
|aitoroses
aitoroses
|axkirillov
axkirillov
| -|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
|vagadiya
vagadiya
| -|vincentsong
vincentsong
|yongjer
yongjer
|franekp
franekp
|yt3trees
yt3trees
|anton-otee
anton-otee
|benzntech
benzntech
| -|bramburn
bramburn
|GitlyHallows
GitlyHallows
|philfung
philfung
|napter
napter
|mdp
mdp
|jcbdev
jcbdev
| -|Chenjiayuan195
Chenjiayuan195
|SplittyDev
SplittyDev
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
| -|kinandan
kinandan
|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|dqroid
dqroid
| -|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
|amittell
amittell
| -|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
| -|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| -|nobu007
nobu007
|nevermorec
nevermorec
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|jquanton
jquanton
| +|nissa-seru
nissa-seru
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|qdaxb
qdaxb
|Szpadel
Szpadel
|Premshay
Premshay
|psv2522
psv2522
|diarmidmackenzie
diarmidmackenzie
| +|lupuletic
lupuletic
|elianiva
elianiva
|olweraltuve
olweraltuve
|sachasayan
sachasayan
|afshawnlotfi
afshawnlotfi
|pugazhendhi-m
pugazhendhi-m
| +|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
|emshvac
emshvac
| +|kyle-apex
kyle-apex
|pdecat
pdecat
|zhangtony239
zhangtony239
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|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
|philfung
philfung
|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
|nevermorec
nevermorec
|im47cn
im47cn
|hongzio
hongzio
| +|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|ashktn
ashktn
| +|eltociear
eltociear
|PretzelVector
PretzelVector
|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
| +|shariqriazz
shariqriazz
|seedlord
seedlord
|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
| +|philipnext
philipnext
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
| |hesara
hesara
|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|snoyiatk
snoyiatk
|dbasclpy
dbasclpy
| |dleen
dleen
|chadgauth
chadgauth
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
| -|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
| -|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
|01Rian
01Rian
| -|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|libertyteeth
libertyteeth
|shtse8
shtse8
| -|Jdo300
Jdo300
|eltociear
eltociear
| | | | | +|QuinsZouls
QuinsZouls
|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| +|Yikai-Liao
Yikai-Liao
|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
| +|samsilveira
samsilveira
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
|Jdo300
Jdo300
| | | | ## 授權 From 42c1f5f88280edb2568775157e1a7196f27c91b1 Mon Sep 17 00:00:00 2001 From: R00-B0T <110429663+R00-B0T@users.noreply.github.com> Date: Fri, 25 Apr 2025 21:03:17 -0700 Subject: [PATCH 02/43] Changeset version bump (#2957) * changeset version bump * Update package.json * Update package-lock.json * Update CHANGELOG.md --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens --- .changeset/khaki-months-float.md | 5 ----- .changeset/lazy-rats-end.md | 5 ----- .changeset/moody-snails-listen.md | 5 ----- CHANGELOG.md | 12 ++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 15 insertions(+), 18 deletions(-) delete mode 100644 .changeset/khaki-months-float.md delete mode 100644 .changeset/lazy-rats-end.md delete mode 100644 .changeset/moody-snails-listen.md diff --git a/.changeset/khaki-months-float.md b/.changeset/khaki-months-float.md deleted file mode 100644 index 0fdb66921c7..00000000000 --- a/.changeset/khaki-months-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Omit reasoning params for non-reasoning models diff --git a/.changeset/lazy-rats-end.md b/.changeset/lazy-rats-end.md deleted file mode 100644 index 83335896bb9..00000000000 --- a/.changeset/lazy-rats-end.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": minor ---- - -Updates default model id for Unbound from claude 3.5 to 3.7 diff --git a/.changeset/moody-snails-listen.md b/.changeset/moody-snails-listen.md deleted file mode 100644 index eaf34e01ea6..00000000000 --- a/.changeset/moody-snails-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Update tips diff --git a/CHANGELOG.md b/CHANGELOG.md index a8ba67f21ab..a489c618ffc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Roo Code Changelog +## [3.14.3] - 2025-04-25 + +- Add Boomerang Orchestrator as a built-in mode +- Improve home screen UI +- Make token count estimation more efficient to reduce gray screens +- Revert change to automatically close files after edit until we figure out how to make it work well with diagnostics +- Clean up settings data model +- Omit reasoning params for non-reasoning models +- Clearer documentation for adding settings (thanks @shariqriazz!) +- Fix word wrapping in Roo message title (thanks @zhangtony239!) +- Update default model id for Unbound from claude 3.5 to 3.7 (thanks @pugazhendhi-m!) + ## [3.14.2] - 2025-04-24 - Enable prompt caching for Gemini (with some improvements) diff --git a/package-lock.json b/package-lock.json index 48413ebf901..3aedb880bf5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.14.2", + "version": "3.14.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.14.2", + "version": "3.14.3", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", diff --git a/package.json b/package.json index d7c3de86ed3..6289122d619 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.14.2", + "version": "3.14.3", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 418791a743f895f6ca2586f25d0f6215370295e3 Mon Sep 17 00:00:00 2001 From: Julio Navarro Date: Sat, 26 Apr 2025 08:46:05 -0400 Subject: [PATCH 03/43] Fix: custom modes export import (#2810) * Enhance export method in ContextProxy to filter out project custom modes, ensuring only global settings are included in the export. * Fix issue of customModes not being imported when importing settings. The problem was that the Custom modes are managed by the CustomModesManager, not by the context proxy. * * Fix tests * Update webviewMessageHandler to provide customModeManager to importSettings --- src/core/config/ContextProxy.ts | 4 ++ .../config/__tests__/importExport.test.ts | 57 +++++++++++++++++++ src/core/config/importExport.ts | 18 ++++-- src/core/webview/webviewMessageHandler.ts | 1 + 4 files changed, 76 insertions(+), 4 deletions(-) diff --git a/src/core/config/ContextProxy.ts b/src/core/config/ContextProxy.ts index 3f61688bbb9..6b017503d5e 100644 --- a/src/core/config/ContextProxy.ts +++ b/src/core/config/ContextProxy.ts @@ -230,6 +230,10 @@ export class ContextProxy { public async export(): Promise { try { const globalSettings = globalSettingsExportSchema.parse(this.getValues()) + + // Exports should only contain global settings, so this skips project custom modes (those exist in the .roomode folder) + globalSettings.customModes = globalSettings.customModes?.filter((mode) => mode.source === "global") + return Object.fromEntries(Object.entries(globalSettings).filter(([_, value]) => value !== undefined)) } catch (error) { if (error instanceof ZodError) { diff --git a/src/core/config/__tests__/importExport.test.ts b/src/core/config/__tests__/importExport.test.ts index 038bf2ad80a..8330187b3b4 100644 --- a/src/core/config/__tests__/importExport.test.ts +++ b/src/core/config/__tests__/importExport.test.ts @@ -9,6 +9,7 @@ import { ProviderName } from "../../../schemas" import { importSettings, exportSettings } from "../importExport" import { ProviderSettingsManager } from "../ProviderSettingsManager" import { ContextProxy } from "../ContextProxy" +import { CustomModesManager } from "../CustomModesManager" // Mock VSCode modules jest.mock("vscode", () => ({ @@ -37,6 +38,7 @@ describe("importExport", () => { let mockProviderSettingsManager: jest.Mocked let mockContextProxy: jest.Mocked let mockExtensionContext: jest.Mocked + let mockCustomModesManager: jest.Mocked beforeEach(() => { // Reset all mocks @@ -56,6 +58,11 @@ describe("importExport", () => { export: jest.fn().mockImplementation(() => Promise.resolve({})), } as unknown as jest.Mocked + // Setup customModesManager mock + mockCustomModesManager = { + updateCustomMode: jest.fn(), + } as unknown as jest.Mocked + const map = new Map() mockExtensionContext = { @@ -74,6 +81,7 @@ describe("importExport", () => { const result = await importSettings({ providerSettingsManager: mockProviderSettingsManager, contextProxy: mockContextProxy, + customModesManager: mockCustomModesManager, }) expect(result).toEqual({ success: false }) @@ -138,6 +146,7 @@ describe("importExport", () => { const result = await importSettings({ providerSettingsManager: mockProviderSettingsManager, contextProxy: mockContextProxy, + customModesManager: mockCustomModesManager, }) expect(result.success).toBe(true) @@ -181,6 +190,7 @@ describe("importExport", () => { const result = await importSettings({ providerSettingsManager: mockProviderSettingsManager, contextProxy: mockContextProxy, + customModesManager: mockCustomModesManager, }) expect(result).toEqual({ success: false }) @@ -202,6 +212,7 @@ describe("importExport", () => { const result = await importSettings({ providerSettingsManager: mockProviderSettingsManager, contextProxy: mockContextProxy, + customModesManager: mockCustomModesManager, }) expect(result).toEqual({ success: false }) @@ -220,6 +231,7 @@ describe("importExport", () => { const result = await importSettings({ providerSettingsManager: mockProviderSettingsManager, contextProxy: mockContextProxy, + customModesManager: mockCustomModesManager, }) expect(result).toEqual({ success: false }) @@ -252,6 +264,7 @@ describe("importExport", () => { const result = await importSettings({ providerSettingsManager, contextProxy: mockContextProxy, + customModesManager: mockCustomModesManager, }) expect(result.success).toBe(true) @@ -261,6 +274,50 @@ describe("importExport", () => { }) }) + it("should call updateCustomMode for each custom mode in config", async () => { + ;(vscode.window.showOpenDialog as jest.Mock).mockResolvedValue([{ fsPath: "/mock/path/settings.json" }]) + const customModes = [ + { + slug: "mode1", + name: "Mode One", + roleDefinition: "Custom role one", + groups: [], + }, + { + slug: "mode2", + name: "Mode Two", + roleDefinition: "Custom role two", + groups: [], + }, + ] + const mockFileContent = JSON.stringify({ + providerProfiles: { + currentApiConfigName: "test", + apiConfigs: {}, + }, + globalSettings: { + mode: "code", + customModes, + }, + }) + ;(fs.readFile as jest.Mock).mockResolvedValue(mockFileContent) + mockProviderSettingsManager.export.mockResolvedValue({ + currentApiConfigName: "test", + apiConfigs: {}, + }) + mockProviderSettingsManager.listConfig.mockResolvedValue([]) + const result = await importSettings({ + providerSettingsManager: mockProviderSettingsManager, + contextProxy: mockContextProxy, + customModesManager: mockCustomModesManager, + }) + expect(result.success).toBe(true) + expect(mockCustomModesManager.updateCustomMode).toHaveBeenCalledTimes(customModes.length) + customModes.forEach((mode) => { + expect(mockCustomModesManager.updateCustomMode).toHaveBeenCalledWith(mode.slug, mode) + }) + }) + describe("exportSettings", () => { it("should not export settings when user cancels file selection", async () => { // Mock user canceling file selection diff --git a/src/core/config/importExport.ts b/src/core/config/importExport.ts index f8059160a2e..e16314cb6c5 100644 --- a/src/core/config/importExport.ts +++ b/src/core/config/importExport.ts @@ -8,13 +8,20 @@ import { z } from "zod" import { globalSettingsSchema } from "../../schemas" import { ProviderSettingsManager, providerProfilesSchema } from "./ProviderSettingsManager" import { ContextProxy } from "./ContextProxy" +import { CustomModesManager } from "./CustomModesManager" -type ImportExportOptions = { +type ImportOptions = { providerSettingsManager: ProviderSettingsManager contextProxy: ContextProxy + customModesManager: CustomModesManager } -export const importSettings = async ({ providerSettingsManager, contextProxy }: ImportExportOptions) => { +type ExportOptions = { + providerSettingsManager: ProviderSettingsManager + contextProxy: ContextProxy +} + +export const importSettings = async ({ providerSettingsManager, contextProxy, customModesManager }: ImportOptions) => { const uris = await vscode.window.showOpenDialog({ filters: { JSON: ["json"] }, canSelectMany: false, @@ -31,7 +38,6 @@ export const importSettings = async ({ providerSettingsManager, contextProxy }: try { const previousProviderProfiles = await providerSettingsManager.export() - const { providerProfiles: newProviderProfiles, globalSettings } = schema.parse( JSON.parse(await fs.readFile(uris[0].fsPath, "utf-8")), ) @@ -48,6 +54,10 @@ export const importSettings = async ({ providerSettingsManager, contextProxy }: }, } + await Promise.all( + (globalSettings.customModes ?? []).map((mode) => customModesManager.updateCustomMode(mode.slug, mode)), + ) + await providerSettingsManager.import(newProviderProfiles) await contextProxy.setValues(globalSettings) @@ -60,7 +70,7 @@ export const importSettings = async ({ providerSettingsManager, contextProxy }: } } -export const exportSettings = async ({ providerSettingsManager, contextProxy }: ImportExportOptions) => { +export const exportSettings = async ({ providerSettingsManager, contextProxy }: ExportOptions) => { const uri = await vscode.window.showSaveDialog({ filters: { JSON: ["json"] }, defaultUri: vscode.Uri.file(path.join(os.homedir(), "Documents", "roo-code-settings.json")), diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index f235d80d0bd..e5c9299182e 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -262,6 +262,7 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We const { success } = await importSettings({ providerSettingsManager: provider.providerSettingsManager, contextProxy: provider.contextProxy, + customModesManager: provider.customModesManager, }) if (success) { From 1924e10e72051e81e60e84b1c3f9b012b47357da Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Sat, 26 Apr 2025 09:45:26 -0700 Subject: [PATCH 04/43] Fix all linter errors (and fix the lint scripts too) (#2958) --- package.json | 2 +- src/__mocks__/fs/promises.ts | 22 +-------------- src/__mocks__/services/ripgrep/index.ts | 6 ++-- src/api/index.ts | 2 +- .../__tests__/bedrock-custom-arn.test.ts | 8 +++--- .../__tests__/bedrock-invokedModelId.test.ts | 22 ++++----------- src/api/providers/__tests__/bedrock.test.ts | 5 +--- src/api/providers/__tests__/gemini.test.ts | 2 +- src/api/providers/__tests__/lmstudio.test.ts | 6 ++-- src/api/providers/__tests__/mistral.test.ts | 7 +++-- src/api/providers/__tests__/ollama.test.ts | 6 ++-- .../providers/__tests__/openai-native.test.ts | 6 ++-- src/api/providers/__tests__/openai.test.ts | 4 +-- src/api/providers/__tests__/requesty.test.ts | 6 ++-- src/api/providers/__tests__/vertex.test.ts | 3 +- src/api/providers/__tests__/vscode-lm.test.ts | 2 +- src/api/providers/bedrock.ts | 7 +++-- src/api/providers/gemini.ts | 1 - src/api/providers/human-relay.ts | 24 ++++------------ src/api/providers/mistral.ts | 11 +------- src/api/providers/openai.ts | 2 +- src/api/providers/vertex.ts | 11 +------- src/api/providers/vscode-lm.ts | 2 +- .../__tests__/cache-strategy.test.ts | 20 ++++++------- .../transform/cache-strategy/base-strategy.ts | 1 - .../cache-strategy/multi-point-strategy.ts | 4 --- src/api/transform/mistral-format.ts | 4 +-- src/core/__tests__/Cline.test.ts | 14 +++++----- src/core/__tests__/mode-validator.test.ts | 5 +--- .../read-file-maxReadFileLine.test.ts | 3 +- src/core/__tests__/read-file-xml.test.ts | 3 +- src/core/config/ProviderSettingsManager.ts | 8 +++--- .../__tests__/CustomModesManager.test.ts | 4 +-- .../diff/strategies/multi-search-replace.ts | 4 +-- .../ignore/__mocks__/RooIgnoreController.ts | 6 ++-- .../RooIgnoreController.security.test.ts | 1 - .../__tests__/RooIgnoreController.test.ts | 3 -- src/core/mentions/index.ts | 2 +- src/core/prompts/__tests__/sections.test.ts | 2 +- src/core/prompts/__tests__/system.test.ts | 14 ---------- src/core/prompts/instructions/create-mode.ts | 2 +- .../__tests__/custom-instructions.test.ts | 8 +++--- src/core/prompts/sections/modes.ts | 2 +- src/core/prompts/sections/rules.ts | 11 ++------ src/core/prompts/sections/system-info.ts | 10 ++----- src/core/prompts/system.ts | 5 ++-- src/core/prompts/tools/new-task.ts | 2 +- src/core/tools/applyDiffTool.ts | 4 --- src/core/tools/useMcpToolTool.ts | 2 +- .../webview/__tests__/ClineProvider.test.ts | 17 ++++------- .../misc/__tests__/line-counter.test.ts | 6 ++-- .../processCarriageReturns.benchmark.ts | 18 ++---------- src/integrations/misc/extract-text.ts | 1 - src/integrations/misc/read-lines.ts | 1 - src/integrations/terminal/TerminalProcess.ts | 3 +- .../TerminalProcessExec.bash.test.ts | 1 - .../__tests__/TerminalProcessExec.cmd.test.ts | 1 - .../TerminalProcessExec.pwsh.test.ts | 1 - .../TerminalProcessInterpretExitCode.test.ts | 15 ---------- .../workspace/WorkspaceTracker.ts | 2 +- src/services/browser/BrowserSession.ts | 1 - src/services/browser/browserDiscovery.ts | 3 +- src/services/checkpoints/types.ts | 2 +- src/services/glob/__mocks__/list-files.ts | 14 +--------- src/services/mcp/McpHub.ts | 6 +--- src/services/mcp/__tests__/McpHub.test.ts | 1 - src/services/ripgrep/index.ts | 6 ++-- src/services/tree-sitter/__tests__/helpers.ts | 3 -- .../tree-sitter/__tests__/index.test.ts | 4 +-- .../__tests__/markdownIntegration.test.ts | 5 ++-- .../parseSourceCodeDefinitions.cpp.test.ts | 28 ++++++------------- .../parseSourceCodeDefinitions.go.test.ts | 22 +++------------ .../parseSourceCodeDefinitions.java.test.ts | 10 ++----- .../parseSourceCodeDefinitions.json.test.ts | 12 +++----- .../parseSourceCodeDefinitions.python.test.ts | 12 ++------ .../parseSourceCodeDefinitions.rust.test.ts | 10 ++----- .../parseSourceCodeDefinitions.tsx.test.ts | 16 ++++------- src/services/tree-sitter/index.ts | 10 ++----- .../__tests__/vsCodeSelectorUtils.test.ts | 2 +- src/utils/__tests__/git.test.ts | 3 +- src/utils/logging/CompactLogger.ts | 2 +- webview-ui/package.json | 3 +- .../src/components/chat/ChatTextArea.tsx | 3 +- .../src/components/chat/ContextMenu.tsx | 1 - .../chat/__tests__/ChatTextArea.test.tsx | 2 +- .../src/components/common/CodeBlock.tsx | 4 +-- .../src/components/common/MarkdownBlock.tsx | 4 +-- .../src/components/prompts/PromptsView.tsx | 2 +- .../settings/AutoApproveSettings.tsx | 1 - .../settings/ExperimentalSettings.tsx | 1 - .../__tests__/ApiConfigManager.test.tsx | 15 +++++----- .../ui/__tests__/select-dropdown.test.tsx | 7 +---- .../src/components/ui/chat/ChatMessage.tsx | 2 +- 93 files changed, 181 insertions(+), 413 deletions(-) diff --git a/package.json b/package.json index 6289122d619..4862683683a 100644 --- a/package.json +++ b/package.json @@ -364,7 +364,7 @@ "install-webview": "cd webview-ui && npm install", "install-e2e": "cd e2e && npm install", "lint": "npm-run-all -l -p lint:*", - "lint:extension": "eslint src/**/*.ts", + "lint:extension": "eslint src --ext .ts", "lint:webview": "cd webview-ui && npm run lint", "lint:e2e": "cd e2e && npm run lint", "check-types": "npm-run-all -l -p check-types:*", diff --git a/src/__mocks__/fs/promises.ts b/src/__mocks__/fs/promises.ts index b037cd24573..e375649c786 100644 --- a/src/__mocks__/fs/promises.ts +++ b/src/__mocks__/fs/promises.ts @@ -24,26 +24,6 @@ const baseTestDirs = [ "/test/log/path", ] -// Helper function to format instructions -const formatInstructions = (sections: string[]): string => { - const joinedSections = sections.filter(Boolean).join("\n\n") - return joinedSections - ? ` -==== - -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. - -${joinedSections}` - : "" -} - -// Helper function to format rule content -const formatRuleContent = (ruleFile: string, content: string): string => { - return `Rules:\n# Rules from ${ruleFile}:\n${content}` -} - type RuleFiles = { ".clinerules-code": string ".clinerules-ask": string @@ -65,7 +45,7 @@ const ensureDirectoryExists = (path: string) => { } const mockFs = { - readFile: jest.fn().mockImplementation(async (filePath: string, encoding?: string) => { + readFile: jest.fn().mockImplementation(async (filePath: string, _encoding?: string) => { // Return stored content if it exists if (mockFiles.has(filePath)) { return mockFiles.get(filePath) diff --git a/src/__mocks__/services/ripgrep/index.ts b/src/__mocks__/services/ripgrep/index.ts index f24adcb18dd..079b77d8316 100644 --- a/src/__mocks__/services/ripgrep/index.ts +++ b/src/__mocks__/services/ripgrep/index.ts @@ -13,7 +13,7 @@ * @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 => { +export const getBinPath = jest.fn().mockImplementation(async (_vscodeAppRoot?: string): Promise => { return "/mock/path/to/rg" }) @@ -30,7 +30,7 @@ export const getBinPath = jest.fn().mockImplementation(async (vscodeAppRoot?: st export const regexSearchFiles = jest .fn() .mockImplementation( - async (cwd?: string, directoryPath?: string, regex?: string, filePattern?: string): Promise => { + async (_cwd?: string, _directoryPath?: string, _regex?: string, _filePattern?: string): Promise => { return "Mock search results" }, ) @@ -43,6 +43,6 @@ export const regexSearchFiles = jest * @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 => { +export const truncateLine = jest.fn().mockImplementation((line?: string, _maxLength?: number): string => { return line || "" }) diff --git a/src/api/index.ts b/src/api/index.ts index 10a959b548c..0e207335f39 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -77,7 +77,7 @@ export function buildApiHandler(configuration: ApiConfiguration): ApiHandler { case "requesty": return new RequestyHandler(options) case "human-relay": - return new HumanRelayHandler(options) + return new HumanRelayHandler() case "fake-ai": return new FakeAIHandler(options) case "xai": diff --git a/src/api/providers/__tests__/bedrock-custom-arn.test.ts b/src/api/providers/__tests__/bedrock-custom-arn.test.ts index 8b2d4c48d57..ebec24044f0 100644 --- a/src/api/providers/__tests__/bedrock-custom-arn.test.ts +++ b/src/api/providers/__tests__/bedrock-custom-arn.test.ts @@ -1,3 +1,5 @@ +// npx jest src/api/providers/__tests__/bedrock-custom-arn.test.ts + import { AwsBedrockHandler } from "../bedrock" import { ApiHandlerOptions } from "../../../shared/api" import { logger } from "../../../utils/logging" @@ -52,9 +54,6 @@ jest.mock("@aws-sdk/client-bedrock-runtime", () => { } }) -// Get mock module for testing -const bedrockMock = jest.requireMock("@aws-sdk/client-bedrock-runtime").__mock - describe("Bedrock ARN Handling", () => { // Helper function to create a handler with specific options const createHandler = (options: Partial = {}) => { @@ -236,7 +235,8 @@ describe("Bedrock ARN Handling", () => { // Create handler with ARN region different from provided region const arn = "arn:aws:bedrock:eu-west-1:123456789012:inference-profile/anthropic.claude-3-sonnet-20240229-v1:0" - const handler = createHandler({ + + createHandler({ awsCustomArn: arn, awsRegion: "us-east-1", // Different from ARN region }) diff --git a/src/api/providers/__tests__/bedrock-invokedModelId.test.ts b/src/api/providers/__tests__/bedrock-invokedModelId.test.ts index 5db6e955824..3e49ad0b952 100644 --- a/src/api/providers/__tests__/bedrock-invokedModelId.test.ts +++ b/src/api/providers/__tests__/bedrock-invokedModelId.test.ts @@ -1,3 +1,9 @@ +// npx jest src/api/providers/__tests__/bedrock-invokedModelId.test.ts + +import { ApiHandlerOptions } from "../../../shared/api" + +import { AwsBedrockHandler, StreamEvent } from "../bedrock" + // Mock AWS SDK credential providers and Bedrock client jest.mock("@aws-sdk/credential-providers", () => ({ fromIni: jest.fn().mockReturnValue({ @@ -62,11 +68,6 @@ jest.mock("@aws-sdk/client-bedrock-runtime", () => { } }) -import { AwsBedrockHandler, StreamEvent } from "../bedrock" -import { ApiHandlerOptions } from "../../../shared/api" -import { BedrockRuntimeClient } from "@aws-sdk/client-bedrock-runtime" -const { fromIni } = require("@aws-sdk/credential-providers") - describe("AwsBedrockHandler with invokedModelId", () => { let mockSend: jest.Mock @@ -279,17 +280,6 @@ describe("AwsBedrockHandler with invokedModelId", () => { } }) - // Mock getModel to return expected values - const getModelSpy = jest.spyOn(handler, "getModel").mockReturnValue({ - id: "anthropic.claude-3-5-sonnet-20241022-v2:0", - info: { - maxTokens: 4096, - contextWindow: 128_000, - supportsPromptCache: false, - supportsImages: true, - }, - }) - // Create a message generator const messageGenerator = handler.createMessage("system prompt", [{ role: "user", content: "user message" }]) diff --git a/src/api/providers/__tests__/bedrock.test.ts b/src/api/providers/__tests__/bedrock.test.ts index fb81345ae52..bddb0626bb9 100644 --- a/src/api/providers/__tests__/bedrock.test.ts +++ b/src/api/providers/__tests__/bedrock.test.ts @@ -22,11 +22,8 @@ jest.mock("@aws-sdk/client-bedrock-runtime", () => ({ })) import { AwsBedrockHandler } from "../bedrock" -import { MessageContent } from "../../../shared/api" -import { BedrockRuntimeClient, ConverseStreamCommand } from "@aws-sdk/client-bedrock-runtime" + import { Anthropic } from "@anthropic-ai/sdk" -const { fromIni } = require("@aws-sdk/credential-providers") -import { logger } from "../../../utils/logging" describe("AwsBedrockHandler", () => { let handler: AwsBedrockHandler diff --git a/src/api/providers/__tests__/gemini.test.ts b/src/api/providers/__tests__/gemini.test.ts index c5679ccf7f8..af32b1bebbf 100644 --- a/src/api/providers/__tests__/gemini.test.ts +++ b/src/api/providers/__tests__/gemini.test.ts @@ -95,7 +95,7 @@ describe("GeminiHandler", () => { const stream = handler.createMessage(systemPrompt, mockMessages) await expect(async () => { - for await (const chunk of stream) { + for await (const _chunk of stream) { // Should throw before yielding any chunks } }).rejects.toThrow() diff --git a/src/api/providers/__tests__/lmstudio.test.ts b/src/api/providers/__tests__/lmstudio.test.ts index 114f9938498..8667b273d12 100644 --- a/src/api/providers/__tests__/lmstudio.test.ts +++ b/src/api/providers/__tests__/lmstudio.test.ts @@ -1,7 +1,7 @@ +import { Anthropic } from "@anthropic-ai/sdk" + import { LmStudioHandler } from "../lmstudio" import { ApiHandlerOptions } from "../../../shared/api" -import OpenAI from "openai" -import { Anthropic } from "@anthropic-ai/sdk" // Mock OpenAI client const mockCreate = jest.fn() @@ -120,7 +120,7 @@ describe("LmStudioHandler", () => { const stream = handler.createMessage(systemPrompt, messages) await expect(async () => { - for await (const chunk of stream) { + for await (const _chunk of stream) { // Should not reach here } }).rejects.toThrow("Please check the LM Studio developer logs to debug what went wrong") diff --git a/src/api/providers/__tests__/mistral.test.ts b/src/api/providers/__tests__/mistral.test.ts index 781cb3dcfc5..5578cec49e9 100644 --- a/src/api/providers/__tests__/mistral.test.ts +++ b/src/api/providers/__tests__/mistral.test.ts @@ -1,6 +1,7 @@ -import { MistralHandler } from "../mistral" -import { ApiHandlerOptions, mistralDefaultModelId } from "../../../shared/api" import { Anthropic } from "@anthropic-ai/sdk" + +import { MistralHandler } from "../mistral" +import { ApiHandlerOptions } from "../../../shared/api" import { ApiStreamTextChunk } from "../../transform/stream" // Mock Mistral client @@ -9,7 +10,7 @@ jest.mock("@mistralai/mistralai", () => { return { Mistral: jest.fn().mockImplementation(() => ({ chat: { - stream: mockCreate.mockImplementation(async (options) => { + stream: mockCreate.mockImplementation(async (_options) => { const stream = { [Symbol.asyncIterator]: async function* () { yield { diff --git a/src/api/providers/__tests__/ollama.test.ts b/src/api/providers/__tests__/ollama.test.ts index a0fc0093ab3..91b14684212 100644 --- a/src/api/providers/__tests__/ollama.test.ts +++ b/src/api/providers/__tests__/ollama.test.ts @@ -1,7 +1,7 @@ +import { Anthropic } from "@anthropic-ai/sdk" + import { OllamaHandler } from "../ollama" import { ApiHandlerOptions } from "../../../shared/api" -import OpenAI from "openai" -import { Anthropic } from "@anthropic-ai/sdk" // Mock OpenAI client const mockCreate = jest.fn() @@ -120,7 +120,7 @@ describe("OllamaHandler", () => { const stream = handler.createMessage(systemPrompt, messages) await expect(async () => { - for await (const chunk of stream) { + for await (const _chunk of stream) { // Should not reach here } }).rejects.toThrow("API Error") diff --git a/src/api/providers/__tests__/openai-native.test.ts b/src/api/providers/__tests__/openai-native.test.ts index ce5fb6c8a67..68ab0f5a5fa 100644 --- a/src/api/providers/__tests__/openai-native.test.ts +++ b/src/api/providers/__tests__/openai-native.test.ts @@ -1,7 +1,7 @@ +import { Anthropic } from "@anthropic-ai/sdk" + import { OpenAiNativeHandler } from "../openai-native" import { ApiHandlerOptions } from "../../../shared/api" -import OpenAI from "openai" -import { Anthropic } from "@anthropic-ai/sdk" // Mock OpenAI client const mockCreate = jest.fn() @@ -116,7 +116,7 @@ describe("OpenAiNativeHandler", () => { mockCreate.mockRejectedValueOnce(new Error("API Error")) const stream = handler.createMessage(systemPrompt, messages) await expect(async () => { - for await (const chunk of stream) { + for await (const _chunk of stream) { // Should not reach here } }).rejects.toThrow("API Error") diff --git a/src/api/providers/__tests__/openai.test.ts b/src/api/providers/__tests__/openai.test.ts index 5d8c92f80b2..17da968ae61 100644 --- a/src/api/providers/__tests__/openai.test.ts +++ b/src/api/providers/__tests__/openai.test.ts @@ -176,7 +176,7 @@ describe("OpenAiHandler", () => { const stream = handler.createMessage("system prompt", testMessages) await expect(async () => { - for await (const chunk of stream) { + for await (const _chunk of stream) { // Should not reach here } }).rejects.toThrow("API Error") @@ -191,7 +191,7 @@ describe("OpenAiHandler", () => { const stream = handler.createMessage("system prompt", testMessages) await expect(async () => { - for await (const chunk of stream) { + for await (const _chunk of stream) { // Should not reach here } }).rejects.toThrow("Rate limit exceeded") diff --git a/src/api/providers/__tests__/requesty.test.ts b/src/api/providers/__tests__/requesty.test.ts index 53dda2637ec..dfb00586577 100644 --- a/src/api/providers/__tests__/requesty.test.ts +++ b/src/api/providers/__tests__/requesty.test.ts @@ -1,6 +1,6 @@ import { Anthropic } from "@anthropic-ai/sdk" import OpenAI from "openai" -import { ApiHandlerOptions, ModelInfo, requestyDefaultModelInfo } from "../../../shared/api" +import { ApiHandlerOptions, ModelInfo } from "../../../shared/api" import { RequestyHandler } from "../requesty" import { convertToOpenAiMessages } from "../../transform/openai-format" import { convertToR1Format } from "../../transform/r1-format" @@ -40,9 +40,7 @@ describe("RequestyHandler", () => { jest.clearAllMocks() // Setup mock create function that preserves params - let lastParams: any - mockCreate = jest.fn().mockImplementation((params) => { - lastParams = params + mockCreate = jest.fn().mockImplementation((_params) => { return { [Symbol.asyncIterator]: async function* () { yield { diff --git a/src/api/providers/__tests__/vertex.test.ts b/src/api/providers/__tests__/vertex.test.ts index 6c4e891d0b7..3af1e3c70fe 100644 --- a/src/api/providers/__tests__/vertex.test.ts +++ b/src/api/providers/__tests__/vertex.test.ts @@ -2,7 +2,6 @@ import { Anthropic } from "@anthropic-ai/sdk" import { AnthropicVertex } from "@anthropic-ai/vertex-sdk" -import { BetaThinkingConfigParam } from "@anthropic-ai/sdk/resources/beta" import { VertexHandler } from "../vertex" import { ApiStreamChunk } from "../../transform/stream" @@ -388,7 +387,7 @@ describe("VertexHandler", () => { const stream = handler.createMessage(systemPrompt, mockMessages) await expect(async () => { - for await (const chunk of stream) { + for await (const _chunk of stream) { // Should throw before yielding any chunks } }).rejects.toThrow("Vertex API error") diff --git a/src/api/providers/__tests__/vscode-lm.test.ts b/src/api/providers/__tests__/vscode-lm.test.ts index d7e674d0450..59d49f764e7 100644 --- a/src/api/providers/__tests__/vscode-lm.test.ts +++ b/src/api/providers/__tests__/vscode-lm.test.ts @@ -21,7 +21,7 @@ jest.mock("vscode", () => { return { workspace: { - onDidChangeConfiguration: jest.fn((callback) => ({ + onDidChangeConfiguration: jest.fn((_callback) => ({ dispose: jest.fn(), })), }, diff --git a/src/api/providers/bedrock.ts b/src/api/providers/bedrock.ts index 116e2822dd5..b388748440f 100644 --- a/src/api/providers/bedrock.ts +++ b/src/api/providers/bedrock.ts @@ -603,8 +603,8 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH // Look for a pattern where the first segment before a dot doesn't contain dots or colons // and the remaining parts still contain at least one dot const genericPrefixMatch = modelId.match(/^([^.:]+)\.(.+\..+)$/) + if (genericPrefixMatch) { - const genericPrefix = genericPrefixMatch[1] + "." return genericPrefixMatch[2] } } @@ -708,10 +708,11 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH if (Array.isArray(content)) { return content.map((block) => { // Use destructuring to remove cachePoint property - const { cachePoint, ...rest } = block + const { cachePoint: _, ...rest } = block return rest }) } + return content } @@ -864,7 +865,7 @@ Suggestions: /** * Formats an error message based on the error type and context */ - private formatErrorMessage(error: unknown, errorType: string, isStreamContext: boolean): string { + private formatErrorMessage(error: unknown, errorType: string, _isStreamContext: boolean): string { const definition = AwsBedrockHandler.ERROR_TYPES[errorType] || AwsBedrockHandler.ERROR_TYPES.GENERIC let template = definition.messageTemplate diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index 94e5610adb2..777b9ee9158 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -4,7 +4,6 @@ import { type GenerateContentResponseUsageMetadata, type GenerateContentParameters, type Content, - CreateCachedContentConfig, } from "@google/genai" import NodeCache from "node-cache" diff --git a/src/api/providers/human-relay.ts b/src/api/providers/human-relay.ts index b8bd4c28298..ecc29c8e7d3 100644 --- a/src/api/providers/human-relay.ts +++ b/src/api/providers/human-relay.ts @@ -1,23 +1,16 @@ -// filepath: e:\Project\Roo-Code\src\api\providers\human-relay.ts import { Anthropic } from "@anthropic-ai/sdk" -import { ApiHandlerOptions, ModelInfo } from "../../shared/api" +import * as vscode from "vscode" + +import { ModelInfo } from "../../shared/api" import { ApiHandler, SingleCompletionHandler } from "../index" import { ApiStream } from "../transform/stream" -import * as vscode from "vscode" -import { ExtensionMessage } from "../../shared/ExtensionMessage" -import { getPanel } from "../../activate/registerCommands" // Import the getPanel function /** * Human Relay API processor * This processor does not directly call the API, but interacts with the model through human operations copy and paste. */ export class HumanRelayHandler implements ApiHandler, SingleCompletionHandler { - private options: ApiHandlerOptions - - constructor(options: ApiHandlerOptions) { - this.options = options - } - countTokens(content: Array): Promise { + countTokens(_content: Array): Promise { return Promise.resolve(0) } @@ -125,15 +118,10 @@ async function showHumanRelayDialog(promptText: string): Promise { - resolve(response) - }, + (response: string | undefined) => resolve(response), ) // Open the dialog box directly using the current panel - vscode.commands.executeCommand("roo-cline.showHumanRelayDialog", { - requestId, - promptText, - }) + vscode.commands.executeCommand("roo-cline.showHumanRelayDialog", { requestId, promptText }) }) } diff --git a/src/api/providers/mistral.ts b/src/api/providers/mistral.ts index 38f753c2610..4daaa2ab855 100644 --- a/src/api/providers/mistral.ts +++ b/src/api/providers/mistral.ts @@ -1,16 +1,7 @@ import { Anthropic } from "@anthropic-ai/sdk" import { Mistral } from "@mistralai/mistralai" import { SingleCompletionHandler } from "../" -import { - ApiHandlerOptions, - mistralDefaultModelId, - MistralModelId, - mistralModels, - ModelInfo, - openAiNativeDefaultModelId, - OpenAiNativeModelId, - openAiNativeModels, -} from "../../shared/api" +import { ApiHandlerOptions, mistralDefaultModelId, MistralModelId, mistralModels, ModelInfo } from "../../shared/api" import { convertToMistralMessages } from "../transform/mistral-format" import { ApiStream } from "../transform/stream" import { BaseProvider } from "./base-provider" diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 71568dfde1e..10cc5e40cd4 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -226,7 +226,7 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl } } - protected processUsageMetrics(usage: any, modelInfo?: ModelInfo): ApiStreamUsageChunk { + protected processUsageMetrics(usage: any, _modelInfo?: ModelInfo): ApiStreamUsageChunk { return { type: "usage", inputTokens: usage?.prompt_tokens || 0, diff --git a/src/api/providers/vertex.ts b/src/api/providers/vertex.ts index 1f863c57cdb..865e588de58 100644 --- a/src/api/providers/vertex.ts +++ b/src/api/providers/vertex.ts @@ -57,15 +57,6 @@ interface VertexMessage extends Omit content: string | VertexContentBlock[] } -interface VertexMessageCreateParams { - model: string - max_tokens: number - temperature: number - system: string | VertexTextBlock[] - messages: VertexMessage[] - stream: boolean -} - interface VertexMessageResponse { content: Array<{ type: "text"; text: string }> } @@ -259,7 +250,7 @@ export class VertexHandler extends BaseProvider implements SingleCompletionHandl private async *createClaudeMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { const model = this.getModel() - let { id, info, temperature, maxTokens, thinking } = model + let { id, temperature, maxTokens, thinking } = model const useCache = model.info.supportsPromptCache // Find indices of user messages that we want to cache diff --git a/src/api/providers/vscode-lm.ts b/src/api/providers/vscode-lm.ts index f3d21884b3a..85a17cc2654 100644 --- a/src/api/providers/vscode-lm.ts +++ b/src/api/providers/vscode-lm.ts @@ -122,7 +122,7 @@ export class VsCodeLmHandler extends BaseProvider implements SingleCompletionHan family: "lm", version: "1.0", maxInputTokens: 8192, - sendRequest: async (messages, options, token) => { + sendRequest: async (_messages, _options, _token) => { // Provide a minimal implementation return { stream: (async function* () { diff --git a/src/api/transform/cache-strategy/__tests__/cache-strategy.test.ts b/src/api/transform/cache-strategy/__tests__/cache-strategy.test.ts index 83729a7aa04..6a490aac2c1 100644 --- a/src/api/transform/cache-strategy/__tests__/cache-strategy.test.ts +++ b/src/api/transform/cache-strategy/__tests__/cache-strategy.test.ts @@ -1,10 +1,10 @@ -import { MultiPointStrategy } from "../multi-point-strategy" -import { CacheStrategy } from "../base-strategy" -import { CacheStrategyConfig, ModelInfo, CachePointPlacement } from "../types" import { ContentBlock, SystemContentBlock } from "@aws-sdk/client-bedrock-runtime" import { Anthropic } from "@anthropic-ai/sdk" +import { BedrockRuntimeClient } from "@aws-sdk/client-bedrock-runtime" + +import { MultiPointStrategy } from "../multi-point-strategy" +import { CacheStrategyConfig, ModelInfo, CachePointPlacement } from "../types" import { AwsBedrockHandler } from "../../../providers/bedrock" -import { BedrockRuntimeClient, ConverseStreamCommand } from "@aws-sdk/client-bedrock-runtime" // Common test utilities const defaultModelInfo: ModelInfo = { @@ -363,7 +363,7 @@ describe("Cache Strategy", () => { // Call the method that uses convertToBedrockConverseMessages const stream = handler.createMessage(systemPrompt, mockMessages) - for await (const chunk of stream) { + for await (const _chunk of stream) { // Just consume the stream } @@ -404,7 +404,7 @@ describe("Cache Strategy", () => { // Call the method that uses convertToBedrockConverseMessages const stream = handler.createMessage(systemPrompt, mockMessages) - for await (const chunk of stream) { + for await (const _chunk of stream) { // Just consume the stream } @@ -505,7 +505,7 @@ describe("Cache Strategy", () => { // Call the method that uses convertToBedrockConverseMessages const stream = handler.createMessage(systemPrompt, mockMessages) - for await (const chunk of stream) { + for await (const _chunk of stream) { // Just consume the stream } @@ -555,7 +555,7 @@ describe("Cache Strategy", () => { // Call the method that uses convertToBedrockConverseMessages const stream = handler.createMessage(systemPrompt, mockMessages) - for await (const chunk of stream) { + for await (const _chunk of stream) { // Just consume the stream } @@ -931,7 +931,7 @@ describe("Cache Strategy", () => { // (260 tokens from messages 7-8 plus 400 tokens from the new messages) // Create messages matching Example 5 from documentation - const messages = [ + const _messages = [ createMessage("user", "Tell me about machine learning.", 100), createMessage("assistant", "Machine learning is a field of study...", 200), createMessage("user", "What about deep learning?", 100), @@ -948,7 +948,7 @@ describe("Cache Strategy", () => { ] // Previous cache point placements from Example 4 - const previousCachePointPlacements: CachePointPlacement[] = [ + const _previousCachePointPlacements: CachePointPlacement[] = [ { index: 2, // After the second user message type: "message", diff --git a/src/api/transform/cache-strategy/base-strategy.ts b/src/api/transform/cache-strategy/base-strategy.ts index 987e28431db..1bc05cdb843 100644 --- a/src/api/transform/cache-strategy/base-strategy.ts +++ b/src/api/transform/cache-strategy/base-strategy.ts @@ -1,7 +1,6 @@ import { Anthropic } from "@anthropic-ai/sdk" import { ContentBlock, SystemContentBlock, Message, ConversationRole } from "@aws-sdk/client-bedrock-runtime" import { CacheStrategyConfig, CacheResult, CachePointPlacement } from "./types" -import { logger } from "../../../utils/logging" export abstract class CacheStrategy { /** diff --git a/src/api/transform/cache-strategy/multi-point-strategy.ts b/src/api/transform/cache-strategy/multi-point-strategy.ts index aa5ae37f343..dc82136997c 100644 --- a/src/api/transform/cache-strategy/multi-point-strategy.ts +++ b/src/api/transform/cache-strategy/multi-point-strategy.ts @@ -95,9 +95,6 @@ export class MultiPointStrategy extends CacheStrategy { return placements } - // Calculate total tokens in the conversation - const totalTokens = this.config.messages.reduce((acc, curr) => acc + this.estimateTokenCount(curr), 0) - // Calculate tokens in new messages (added since last cache point placement) const lastPreviousIndex = previousPlacements[previousPlacements.length - 1].index const newMessagesTokens = this.config.messages @@ -181,7 +178,6 @@ export class MultiPointStrategy extends CacheStrategy { } else if (i === smallestGapIndex) { // Replace with a combined placement const combinedEndIndex = previousPlacements[i + 1].index - const combinedTokens = tokensBetweenPlacements[i] + tokensBetweenPlacements[i + 1] // Find the optimal placement within this combined range const startOfRange = i === 0 ? 0 : previousPlacements[i - 1].index + 1 diff --git a/src/api/transform/mistral-format.ts b/src/api/transform/mistral-format.ts index baf81ef24d2..3f9487a9980 100644 --- a/src/api/transform/mistral-format.ts +++ b/src/api/transform/mistral-format.ts @@ -21,7 +21,7 @@ export function convertToMistralMessages(anthropicMessages: Anthropic.Messages.M }) } else { if (anthropicMessage.role === "user") { - const { nonToolMessages, toolMessages } = anthropicMessage.content.reduce<{ + const { nonToolMessages } = anthropicMessage.content.reduce<{ nonToolMessages: (Anthropic.TextBlockParam | Anthropic.ImageBlockParam)[] toolMessages: Anthropic.ToolResultBlockParam[] }>( @@ -53,7 +53,7 @@ export function convertToMistralMessages(anthropicMessages: Anthropic.Messages.M }) } } else if (anthropicMessage.role === "assistant") { - const { nonToolMessages, toolMessages } = anthropicMessage.content.reduce<{ + const { nonToolMessages } = anthropicMessage.content.reduce<{ nonToolMessages: (Anthropic.TextBlockParam | Anthropic.ImageBlockParam)[] toolMessages: Anthropic.ToolUseBlockParam[] }>( diff --git a/src/core/__tests__/Cline.test.ts b/src/core/__tests__/Cline.test.ts index e12078d3525..d407e10454b 100644 --- a/src/core/__tests__/Cline.test.ts +++ b/src/core/__tests__/Cline.test.ts @@ -191,19 +191,19 @@ describe("Cline", () => { return undefined }), - update: jest.fn().mockImplementation((key, value) => Promise.resolve()), + update: jest.fn().mockImplementation((_key, _value) => Promise.resolve()), keys: jest.fn().mockReturnValue([]), }, globalStorageUri: storageUri, workspaceState: { - get: jest.fn().mockImplementation((key) => undefined), - update: jest.fn().mockImplementation((key, value) => Promise.resolve()), + get: jest.fn().mockImplementation((_key) => undefined), + update: jest.fn().mockImplementation((_key, _value) => Promise.resolve()), keys: jest.fn().mockReturnValue([]), }, secrets: { - get: jest.fn().mockImplementation((key) => Promise.resolve(undefined)), - store: jest.fn().mockImplementation((key, value) => Promise.resolve()), - delete: jest.fn().mockImplementation((key) => Promise.resolve()), + get: jest.fn().mockImplementation((_key) => Promise.resolve(undefined)), + store: jest.fn().mockImplementation((_key, _value) => Promise.resolve()), + delete: jest.fn().mockImplementation((_key) => Promise.resolve()), }, extensionUri: { fsPath: "/mock/extension/path", @@ -385,7 +385,7 @@ describe("Cline", () => { // 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 { + async function (this: any, _verbose: boolean = false): Promise { // Use test-specific mock if available if (this._mockGetEnvironmentDetails) { return this._mockGetEnvironmentDetails() diff --git a/src/core/__tests__/mode-validator.test.ts b/src/core/__tests__/mode-validator.test.ts index 72c08d00286..1111f24b9f2 100644 --- a/src/core/__tests__/mode-validator.test.ts +++ b/src/core/__tests__/mode-validator.test.ts @@ -1,6 +1,6 @@ // npx jest src/core/__tests__/mode-validator.test.ts -import { isToolAllowedForMode, getModeConfig, modes, ModeConfig } from "../../shared/modes" +import { isToolAllowedForMode, modes, ModeConfig } from "../../shared/modes" import { TOOL_GROUPS } from "../../shared/tools" import { validateToolUse } from "../mode-validator" @@ -10,7 +10,6 @@ describe("mode-validator", () => { describe("isToolAllowedForMode", () => { describe("code mode", () => { it("allows all code mode tools", () => { - const mode = getModeConfig(codeMode) // Code mode has all groups Object.entries(TOOL_GROUPS).forEach(([_, config]) => { config.tools.forEach((tool: string) => { @@ -26,7 +25,6 @@ describe("mode-validator", () => { describe("architect mode", () => { it("allows configured tools", () => { - const mode = getModeConfig(architectMode) // Architect mode has read, browser, and mcp groups const architectTools = [ ...TOOL_GROUPS.read.tools, @@ -41,7 +39,6 @@ describe("mode-validator", () => { describe("ask mode", () => { it("allows configured tools", () => { - const mode = getModeConfig(askMode) // Ask mode has read, browser, and mcp groups const askTools = [...TOOL_GROUPS.read.tools, ...TOOL_GROUPS.browser.tools, ...TOOL_GROUPS.mcp.tools] askTools.forEach((tool) => { diff --git a/src/core/__tests__/read-file-maxReadFileLine.test.ts b/src/core/__tests__/read-file-maxReadFileLine.test.ts index e3b0a8f67bf..f8508694549 100644 --- a/src/core/__tests__/read-file-maxReadFileLine.test.ts +++ b/src/core/__tests__/read-file-maxReadFileLine.test.ts @@ -8,7 +8,6 @@ import { extractTextFromFile } from "../../integrations/misc/extract-text" import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter" import { isBinaryFile } from "isbinaryfile" import { ReadFileToolUse } from "../../shared/tools" -import { ToolUsage } from "../../schemas" // Mock dependencies jest.mock("../../integrations/misc/line-counter") @@ -100,7 +99,7 @@ describe("read_file tool with maxReadFileLine setting", () => { mockInputContent = fileContent // Setup the extractTextFromFile mock implementation with the current mockInputContent - mockedExtractTextFromFile.mockImplementation((filePath) => { + mockedExtractTextFromFile.mockImplementation((_filePath) => { const actual = jest.requireActual("../../integrations/misc/extract-text") return Promise.resolve(actual.addLineNumbers(mockInputContent)) }) diff --git a/src/core/__tests__/read-file-xml.test.ts b/src/core/__tests__/read-file-xml.test.ts index 1e63bb1446f..1228750a7df 100644 --- a/src/core/__tests__/read-file-xml.test.ts +++ b/src/core/__tests__/read-file-xml.test.ts @@ -8,7 +8,6 @@ import { extractTextFromFile } from "../../integrations/misc/extract-text" import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter" import { isBinaryFile } from "isbinaryfile" import { ReadFileToolUse } from "../../shared/tools" -import { ToolUsage } from "../../schemas" // Mock dependencies jest.mock("../../integrations/misc/line-counter") @@ -22,7 +21,7 @@ jest.mock("../../integrations/misc/extract-text", () => { ...actual, // Expose the spy so tests can access it __addLineNumbersSpy: addLineNumbersSpy, - extractTextFromFile: jest.fn().mockImplementation((filePath) => { + extractTextFromFile: jest.fn().mockImplementation((_filePath) => { // Use the actual addLineNumbers function const content = mockInputContent return Promise.resolve(actual.addLineNumbers(content)) diff --git a/src/core/config/ProviderSettingsManager.ts b/src/core/config/ProviderSettingsManager.ts index 9956c4b0953..7df34e7844a 100644 --- a/src/core/config/ProviderSettingsManager.ts +++ b/src/core/config/ProviderSettingsManager.ts @@ -1,7 +1,7 @@ import { ExtensionContext } from "vscode" import { z, ZodError } from "zod" -import { providerSettingsSchema, ApiConfigMeta, ProviderSettings } from "../../schemas" +import { providerSettingsSchema, ApiConfigMeta } from "../../schemas" import { Mode, modes } from "../../shared/modes" import { telemetryService } from "../../services/telemetry/TelemetryService" @@ -78,7 +78,7 @@ export class ProviderSettingsManager { let isDirty = false // Ensure all configs have IDs. - for (const [name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) { + for (const [_name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) { if (!apiConfig.id) { apiConfig.id = this.generateId() isDirty = true @@ -130,7 +130,7 @@ export class ProviderSettingsManager { rateLimitSeconds = 0 } - for (const [name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) { + for (const [_name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) { if (apiConfig.rateLimitSeconds === undefined) { apiConfig.rateLimitSeconds = rateLimitSeconds } @@ -162,7 +162,7 @@ export class ProviderSettingsManager { fuzzyMatchThreshold = 1.0 } - for (const [name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) { + for (const [_name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) { if (apiConfig.diffEnabled === undefined) { apiConfig.diffEnabled = diffEnabled } diff --git a/src/core/config/__tests__/CustomModesManager.test.ts b/src/core/config/__tests__/CustomModesManager.test.ts index 3af26c92b80..a5de1414835 100644 --- a/src/core/config/__tests__/CustomModesManager.test.ts +++ b/src/core/config/__tests__/CustomModesManager.test.ts @@ -170,7 +170,7 @@ describe("CustomModesManager", () => { throw new Error("File not found") }) ;(fs.writeFile as jest.Mock).mockImplementation( - async (path: string, content: string, encoding?: string) => { + async (path: string, content: string, _encoding?: string) => { if (path === mockSettingsPath) { settingsContent = JSON.parse(content) } @@ -297,7 +297,7 @@ describe("CustomModesManager", () => { throw new Error("File not found") }) ;(fs.writeFile as jest.Mock).mockImplementation( - async (path: string, content: string, encoding?: string) => { + async (path: string, content: string, _encoding?: string) => { if (path === mockSettingsPath) { settingsContent = JSON.parse(content) } diff --git a/src/core/diff/strategies/multi-search-replace.ts b/src/core/diff/strategies/multi-search-replace.ts index 00cebd2bead..7c07f06ba0b 100644 --- a/src/core/diff/strategies/multi-search-replace.ts +++ b/src/core/diff/strategies/multi-search-replace.ts @@ -203,7 +203,7 @@ Only use a single line of '=======' between search and replacement content, beca const SEARCH_PREFIX = "<<<<<<<" const REPLACE_PREFIX = ">>>>>>>" - const reportMergeConflictError = (found: string, expected: string) => ({ + const reportMergeConflictError = (found: string, _expected: string) => ({ success: false, error: `ERROR: Special marker '${found}' found in your diff content at line ${state.line}:\n` + @@ -525,7 +525,7 @@ Only use a single line of '=======' between search and replacement content, beca }) // Apply the replacement while preserving exact indentation - const indentedReplaceLines = replaceLines.map((line, i) => { + const indentedReplaceLines = replaceLines.map((line) => { // Get the matched line's exact indentation const matchedIndent = originalIndents[0] || "" diff --git a/src/core/ignore/__mocks__/RooIgnoreController.ts b/src/core/ignore/__mocks__/RooIgnoreController.ts index 7060b5ea667..45ac23aacbe 100644 --- a/src/core/ignore/__mocks__/RooIgnoreController.ts +++ b/src/core/ignore/__mocks__/RooIgnoreController.ts @@ -3,7 +3,7 @@ export const LOCK_TEXT_SYMBOL = "\u{1F512}" export class RooIgnoreController { rooIgnoreContent: string | undefined = undefined - constructor(cwd: string) { + constructor(_cwd: string) { // No-op constructor } @@ -12,12 +12,12 @@ export class RooIgnoreController { return Promise.resolve() } - validateAccess(filePath: string): boolean { + validateAccess(_filePath: string): boolean { // Default implementation: allow all access return true } - validateCommand(command: string): string | undefined { + validateCommand(_command: string): string | undefined { // Default implementation: allow all commands return undefined } diff --git a/src/core/ignore/__tests__/RooIgnoreController.security.test.ts b/src/core/ignore/__tests__/RooIgnoreController.security.test.ts index 3bb4f467709..c71c1fcdb6f 100644 --- a/src/core/ignore/__tests__/RooIgnoreController.security.test.ts +++ b/src/core/ignore/__tests__/RooIgnoreController.security.test.ts @@ -4,7 +4,6 @@ import { RooIgnoreController } from "../RooIgnoreController" import * as path from "path" import * as fs from "fs/promises" import { fileExistsAtPath } from "../../../utils/fs" -import * as vscode from "vscode" // Mock dependencies jest.mock("fs/promises") diff --git a/src/core/ignore/__tests__/RooIgnoreController.test.ts b/src/core/ignore/__tests__/RooIgnoreController.test.ts index d8ae0a53d8e..1e5dbd50727 100644 --- a/src/core/ignore/__tests__/RooIgnoreController.test.ts +++ b/src/core/ignore/__tests__/RooIgnoreController.test.ts @@ -433,9 +433,6 @@ describe("RooIgnoreController", () => { mockFileExists.mockResolvedValue(true) mockReadFile.mockResolvedValue("node_modules") - // Find and trigger the onCreate handler - const onCreateHandler = mockWatcher.onDidCreate.mock.calls[0][0] - // Force reload of .rooignore content manually await controller.initialize() diff --git a/src/core/mentions/index.ts b/src/core/mentions/index.ts index 592ff8fe87e..73b4e71613f 100644 --- a/src/core/mentions/index.ts +++ b/src/core/mentions/index.ts @@ -2,7 +2,7 @@ import * as vscode from "vscode" import * as path from "path" import { openFile } from "../../integrations/misc/open-file" import { UrlContentFetcher } from "../../services/browser/UrlContentFetcher" -import { mentionRegexGlobal, formatGitSuggestion, type MentionSuggestion } from "../../shared/context-mentions" +import { mentionRegexGlobal } from "../../shared/context-mentions" import fs from "fs/promises" import { extractTextFromFile } from "../../integrations/misc/extract-text" import { isBinaryFile } from "isbinaryfile" diff --git a/src/core/prompts/__tests__/sections.test.ts b/src/core/prompts/__tests__/sections.test.ts index 525db3ffc3f..d6515883c8b 100644 --- a/src/core/prompts/__tests__/sections.test.ts +++ b/src/core/prompts/__tests__/sections.test.ts @@ -35,7 +35,7 @@ describe("getCapabilitiesSection", () => { const mockDiffStrategy: DiffStrategy = { getName: () => "MockStrategy", getToolDescription: () => "apply_diff tool description", - applyDiff: async (originalContent: string, diffContent: string): Promise => { + applyDiff: async (_originalContent: string, _diffContent: string): Promise => { return { success: true, content: "mock result" } }, } diff --git a/src/core/prompts/__tests__/system.test.ts b/src/core/prompts/__tests__/system.test.ts index d0dda37e2dd..7f480dd69d7 100644 --- a/src/core/prompts/__tests__/system.test.ts +++ b/src/core/prompts/__tests__/system.test.ts @@ -2,11 +2,9 @@ import * as vscode from "vscode" import { SYSTEM_PROMPT } from "../system" import { McpHub } from "../../../services/mcp/McpHub" -import { ClineProvider } from "../../../core/webview/ClineProvider" import { defaultModeSlug, modes, Mode, ModeConfig } from "../../../shared/modes" import "../../../utils/path" // Import path utils to get access to toPosix string extension. import { addCustomInstructions } from "../sections/custom-instructions" -import { EXPERIMENT_IDS } from "../../../shared/experiments" import { MultiSearchReplaceDiffStrategy } from "../../diff/strategies/multi-search-replace" // Mock the sections @@ -119,14 +117,6 @@ const mockContext = { }, } as unknown as vscode.ExtensionContext -// Create a minimal mock of ClineProvider -const mockProvider = { - ensureMcpServersDirectoryExists: async () => "/mock/mcp/path", - ensureSettingsDirectoryExists: async () => "/mock/settings/path", - postMessageToWebview: async () => {}, - context: mockContext, -} as unknown as ClineProvider - // Instead of extending McpHub, create a mock that implements just what we need const createMockMcpHub = (): McpHub => ({ @@ -481,7 +471,6 @@ describe("SYSTEM_PROMPT", () => { }) describe("addCustomInstructions", () => { - let experiments: Record | undefined beforeAll(() => { // Ensure fs mock is properly initialized const mockFs = jest.requireMock("fs/promises") @@ -493,9 +482,6 @@ describe("addCustomInstructions", () => { } throw new Error(`ENOENT: no such file or directory, mkdir '${path}'`) }) - - // Initialize experiments as undefined by default - experiments = undefined }) beforeEach(() => { diff --git a/src/core/prompts/instructions/create-mode.ts b/src/core/prompts/instructions/create-mode.ts index fd88dbfb596..2540b4feabd 100644 --- a/src/core/prompts/instructions/create-mode.ts +++ b/src/core/prompts/instructions/create-mode.ts @@ -1,6 +1,6 @@ import * as path from "path" import * as vscode from "vscode" -import { promises as fs } from "fs" + import { GlobalFileNames } from "../../../shared/globalFileNames" export async function createModeInstructions(context: vscode.ExtensionContext | undefined): Promise { diff --git a/src/core/prompts/sections/__tests__/custom-instructions.test.ts b/src/core/prompts/sections/__tests__/custom-instructions.test.ts index 77ccba07a04..e243526d210 100644 --- a/src/core/prompts/sections/__tests__/custom-instructions.test.ts +++ b/src/core/prompts/sections/__tests__/custom-instructions.test.ts @@ -1,8 +1,8 @@ -import { loadRuleFiles, addCustomInstructions } from "../custom-instructions" import fs from "fs/promises" -import path from "path" import { PathLike } from "fs" +import { loadRuleFiles, addCustomInstructions } from "../custom-instructions" + // Mock fs/promises jest.mock("fs/promises") @@ -134,7 +134,7 @@ describe("loadRuleFiles", () => { ] as any) statMock.mockImplementation( - (path) => + (_path) => ({ isFile: jest.fn().mockReturnValue(true), }) as any, @@ -428,7 +428,7 @@ describe("addCustomInstructions", () => { ] as any) statMock.mockImplementation( - (path) => + (_path) => ({ isFile: jest.fn().mockReturnValue(true), }) as any, diff --git a/src/core/prompts/sections/modes.ts b/src/core/prompts/sections/modes.ts index 50c805dd5dd..0fa5e065760 100644 --- a/src/core/prompts/sections/modes.ts +++ b/src/core/prompts/sections/modes.ts @@ -1,8 +1,8 @@ import * as path from "path" import * as vscode from "vscode" import { promises as fs } from "fs" + import { ModeConfig, getAllModesWithPrompts } from "../../../shared/modes" -import { GlobalFileNames } from "../../../shared/globalFileNames" export async function getModesSection(context: vscode.ExtensionContext): Promise { const settingsDir = path.join(context.globalStorageUri.fsPath, "settings") diff --git a/src/core/prompts/sections/rules.ts b/src/core/prompts/sections/rules.ts index f7a68558894..caafcb48d3f 100644 --- a/src/core/prompts/sections/rules.ts +++ b/src/core/prompts/sections/rules.ts @@ -1,6 +1,6 @@ import { DiffStrategy } from "../../../shared/tools" -function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Record): string { +function getEditingInstructions(diffStrategy?: DiffStrategy): string { const instructions: string[] = [] const availableTools: string[] = [] @@ -44,12 +44,7 @@ function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Recor return instructions.join("\n") } -export function getRulesSection( - cwd: string, - supportsComputerUse: boolean, - diffStrategy?: DiffStrategy, - experiments?: Record | undefined, -): string { +export function getRulesSection(cwd: string, supportsComputerUse: boolean, diffStrategy?: DiffStrategy): string { return `==== RULES @@ -61,7 +56,7 @@ 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 '${cwd.toPosix()}', and if so prepend with \`cd\`'ing into that directory && then executing the command (as one command since you are stuck operating from '${cwd.toPosix()}'). For example, if you needed to run \`npm install\` in a project outside of '${cwd.toPosix()}', 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 ${diffStrategy ? "apply_diff or write_to_file" : "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. -${getEditingInstructions(diffStrategy, experiments)} +${getEditingInstructions(diffStrategy)} - 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$" diff --git a/src/core/prompts/sections/system-info.ts b/src/core/prompts/sections/system-info.ts index b2cdc99e79c..8adc90a160e 100644 --- a/src/core/prompts/sections/system-info.ts +++ b/src/core/prompts/sections/system-info.ts @@ -1,15 +1,9 @@ -import defaultShell from "default-shell" import os from "os" import osName from "os-name" -import { Mode, ModeConfig, getModeBySlug, defaultModeSlug, isToolAllowedForMode } from "../../../shared/modes" -import { getShell } from "../../../utils/shell" - -export function getSystemInfoSection(cwd: string, currentMode: Mode, customModes?: ModeConfig[]): string { - const findModeBySlug = (slug: string, modes?: ModeConfig[]) => modes?.find((m) => m.slug === slug) - const currentModeName = findModeBySlug(currentMode, customModes)?.name || currentMode - const codeModeName = findModeBySlug(defaultModeSlug, customModes)?.name || "Code" +import { getShell } from "../../../utils/shell" +export function getSystemInfoSection(cwd: string): string { let details = `==== SYSTEM INFORMATION diff --git a/src/core/prompts/system.ts b/src/core/prompts/system.ts index b7bbc06e096..f56a9476637 100644 --- a/src/core/prompts/system.ts +++ b/src/core/prompts/system.ts @@ -3,7 +3,6 @@ import { modes, CustomModePrompts, PromptComponent, - getRoleDefinition, defaultModeSlug, ModeConfig, getModeBySlug, @@ -87,9 +86,9 @@ ${getCapabilitiesSection(cwd, supportsComputerUse, mcpHub, effectiveDiffStrategy ${modesSection} -${getRulesSection(cwd, supportsComputerUse, effectiveDiffStrategy, experiments)} +${getRulesSection(cwd, supportsComputerUse, effectiveDiffStrategy)} -${getSystemInfoSection(cwd, mode, customModeConfigs)} +${getSystemInfoSection(cwd)} ${getObjectiveSection()} diff --git a/src/core/prompts/tools/new-task.ts b/src/core/prompts/tools/new-task.ts index 3de2e6a5373..1bf8848aef4 100644 --- a/src/core/prompts/tools/new-task.ts +++ b/src/core/prompts/tools/new-task.ts @@ -1,6 +1,6 @@ import { ToolArgs } from "./types" -export function getNewTaskDescription(args: ToolArgs): string { +export function getNewTaskDescription(_args: ToolArgs): string { return `## 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. diff --git a/src/core/tools/applyDiffTool.ts b/src/core/tools/applyDiffTool.ts index 967b881d31a..590040f2bab 100644 --- a/src/core/tools/applyDiffTool.ts +++ b/src/core/tools/applyDiffTool.ts @@ -96,8 +96,6 @@ export async function applyDiffTool( error: "No diff strategy available", } - let partResults = "" - if (!diffResult.success) { cline.consecutiveMistakeCount++ const currentCount = (cline.consecutiveMistakeCountForApplyDiff.get(relPath) || 0) + 1 @@ -116,8 +114,6 @@ export async function applyDiffTool( formattedError = `\n${ failPart.error }${errorDetails ? `\n\nDetails:\n${errorDetails}` : ""}\n` - - partResults += formattedError } } else { const errorDetails = diffResult.details ? JSON.stringify(diffResult.details, null, 2) : "" diff --git a/src/core/tools/useMcpToolTool.ts b/src/core/tools/useMcpToolTool.ts index 9a5463355c2..882f214a6f9 100644 --- a/src/core/tools/useMcpToolTool.ts +++ b/src/core/tools/useMcpToolTool.ts @@ -90,7 +90,7 @@ export async function useMcpToolTool( return item.text } if (item.type === "resource") { - const { blob, ...rest } = item.resource + const { blob: _, ...rest } = item.resource return JSON.stringify(rest, null, 2) } return "" diff --git a/src/core/webview/__tests__/ClineProvider.test.ts b/src/core/webview/__tests__/ClineProvider.test.ts index 4c5a28fa4d4..5bdfd0e23e3 100644 --- a/src/core/webview/__tests__/ClineProvider.test.ts +++ b/src/core/webview/__tests__/ClineProvider.test.ts @@ -82,7 +82,7 @@ const mockAddCustomInstructions = jest.fn().mockResolvedValue("Combined instruct // Mock delay module jest.mock("delay", () => { - const delayFn = (ms: number) => Promise.resolve() + const delayFn = (_ms: number) => Promise.resolve() delayFn.createDelay = () => delayFn delayFn.reject = () => Promise.reject(new Error("Delay rejected")) delayFn.range = () => Promise.resolve() @@ -137,7 +137,7 @@ jest.mock("vscode", () => ({ get: jest.fn().mockReturnValue([]), update: jest.fn(), }), - onDidChangeConfiguration: jest.fn().mockImplementation((callback) => ({ + onDidChangeConfiguration: jest.fn().mockImplementation(() => ({ dispose: jest.fn(), })), onDidSaveTextDocument: jest.fn(() => ({ dispose: jest.fn() })), @@ -212,7 +212,7 @@ jest.mock("../../Cline", () => ({ Cline: jest .fn() .mockImplementation( - (provider, apiConfiguration, customInstructions, diffEnabled, fuzzyMatchThreshold, task, taskId) => ({ + (_provider, _apiConfiguration, _customInstructions, _diffEnabled, _fuzzyMatchThreshold, _task, taskId) => ({ api: undefined, abortTask: jest.fn(), handleWebviewAskResponse: jest.fn(), @@ -231,7 +231,7 @@ jest.mock("../../Cline", () => ({ // Mock extract-text jest.mock("../../../integrations/misc/extract-text", () => ({ - extractTextFromFile: jest.fn().mockImplementation(async (filePath: string) => { + extractTextFromFile: jest.fn().mockImplementation(async (_filePath: string) => { const content = "const x = 1;\nconst y = 2;\nconst z = 3;" const lines = content.split("\n") return lines.map((line, index) => `${index + 1} | ${line}`).join("\n") @@ -322,9 +322,7 @@ describe("ClineProvider", () => { callback() return { dispose: jest.fn() } }), - onDidChangeVisibility: jest.fn().mockImplementation((callback) => { - return { dispose: jest.fn() } - }), + onDidChangeVisibility: jest.fn().mockImplementation(() => ({ dispose: jest.fn() })), } as unknown as vscode.WebviewView provider = new ClineProvider(mockContext, mockOutputChannel, "sidebar", new ContextProxy(mockContext)) @@ -1055,7 +1053,7 @@ describe("ClineProvider", () => { // Reset and setup mock mockAddCustomInstructions.mockClear() mockAddCustomInstructions.mockImplementation( - (modeInstructions: string, globalInstructions: string, cwd: string) => { + (modeInstructions: string, globalInstructions: string, _cwd: string) => { return Promise.resolve(modeInstructions || globalInstructions || "") }, ) @@ -2028,7 +2026,6 @@ describe.skip("ContextProxy integration", () => { let mockContext: vscode.ExtensionContext let mockOutputChannel: vscode.OutputChannel let mockContextProxy: any - let mockGlobalStateUpdate: jest.Mock beforeEach(() => { // Reset mocks @@ -2050,8 +2047,6 @@ describe.skip("ContextProxy integration", () => { mockOutputChannel = { appendLine: jest.fn() } as unknown as vscode.OutputChannel mockContextProxy = new ContextProxy(mockContext) provider = new ClineProvider(mockContext, mockOutputChannel, "sidebar", mockContextProxy) - - mockGlobalStateUpdate = mockContext.globalState.update as jest.Mock }) test("updateGlobalState uses contextProxy", async () => { diff --git a/src/integrations/misc/__tests__/line-counter.test.ts b/src/integrations/misc/__tests__/line-counter.test.ts index 12df3e6e897..35c99993abe 100644 --- a/src/integrations/misc/__tests__/line-counter.test.ts +++ b/src/integrations/misc/__tests__/line-counter.test.ts @@ -64,7 +64,7 @@ describe("countFileLines", () => { } const mockReadStream = { - on: jest.fn().mockImplementation(function (this: any, event, callback) { + on: jest.fn().mockImplementation(function (this: any, _event, _callback) { return this }), } @@ -96,7 +96,7 @@ describe("countFileLines", () => { } const mockReadStream = { - on: jest.fn().mockImplementation(function (this: any, event, callback) { + on: jest.fn().mockImplementation(function (this: any, _event, _callback) { return this }), } @@ -126,7 +126,7 @@ describe("countFileLines", () => { } const mockReadStream = { - on: jest.fn().mockImplementation(function (this: any, event, callback) { + on: jest.fn().mockImplementation(function (this: any, _event, _callback) { return this }), } diff --git a/src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts b/src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts index 942ab02c9b7..2862c85bcd0 100644 --- a/src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts +++ b/src/integrations/misc/__tests__/performance/processCarriageReturns.benchmark.ts @@ -354,25 +354,13 @@ function runBenchmark() { const lineLimit = 500 // Standard line limit for truncation console.log("\n--- Function 1: processCarriageReturns ---") - const processCarriageReturnsResult = runPerformanceTest( - "processCarriageReturns", - processCarriageReturns, - testData, - iterations, - ) + runPerformanceTest("processCarriageReturns", processCarriageReturns, testData, iterations) console.log("\n--- Function 2: applyRunLengthEncoding ---") - const applyRunLengthEncodingResult = runPerformanceTest( - "applyRunLengthEncoding", - applyRunLengthEncoding, - testData, - iterations, - ) + runPerformanceTest("applyRunLengthEncoding", applyRunLengthEncoding, testData, iterations) console.log("\n--- Function 3: truncateOutput ---") - const truncateOutputResult = runPerformanceTest("truncateOutput", truncateOutput, testData, iterations, [ - lineLimit, - ]) + runPerformanceTest("truncateOutput", truncateOutput, testData, iterations, [lineLimit]) // Run baseline test to measure variance between identical runs runBaselineTest(testData, Math.max(5, Math.floor(iterations / 4))) diff --git a/src/integrations/misc/extract-text.ts b/src/integrations/misc/extract-text.ts index 596923d93e4..e257e1c8e34 100644 --- a/src/integrations/misc/extract-text.ts +++ b/src/integrations/misc/extract-text.ts @@ -187,7 +187,6 @@ export function applyRunLengthEncoding(content: string): string { let pos = 0 let repeatCount = 0 let prevLine = null - let firstOccurrence = true while (pos < content.length) { const nextNewlineIdx = content.indexOf("\n", pos) // Find next line feed (\n) index diff --git a/src/integrations/misc/read-lines.ts b/src/integrations/misc/read-lines.ts index 1c5db87acb3..5a5eda9f838 100644 --- a/src/integrations/misc/read-lines.ts +++ b/src/integrations/misc/read-lines.ts @@ -7,7 +7,6 @@ * Now you can read a range of lines from a file */ import { createReadStream } from "fs" -import { createInterface } from "readline" const outOfRangeError = (filepath: string, n: number) => { return new RangeError(`Line with index ${n} does not exist in '${filepath}'. Note that line indexing is zero-based`) diff --git a/src/integrations/terminal/TerminalProcess.ts b/src/integrations/terminal/TerminalProcess.ts index a84db00ef30..286480bc76a 100644 --- a/src/integrations/terminal/TerminalProcess.ts +++ b/src/integrations/terminal/TerminalProcess.ts @@ -412,7 +412,8 @@ export class TerminalProcess extends EventEmitter { } // Wait for shell execution to complete and handle exit details - const exitDetails = await shellExecutionComplete + await shellExecutionComplete + this.isHot = false if (commandOutputStarted) { diff --git a/src/integrations/terminal/__tests__/TerminalProcessExec.bash.test.ts b/src/integrations/terminal/__tests__/TerminalProcessExec.bash.test.ts index 109203c5991..22abc3f0413 100644 --- a/src/integrations/terminal/__tests__/TerminalProcessExec.bash.test.ts +++ b/src/integrations/terminal/__tests__/TerminalProcessExec.bash.test.ts @@ -221,7 +221,6 @@ async function testTerminalCommand( const exitDetails = TerminalProcess.interpretExitCode(exitCode) // Set a timeout to avoid hanging tests - let timeoutId: NodeJS.Timeout const timeoutPromise = new Promise((_, reject) => { timeoutId = setTimeout(() => { reject(new Error("Test timed out after 1000ms")) diff --git a/src/integrations/terminal/__tests__/TerminalProcessExec.cmd.test.ts b/src/integrations/terminal/__tests__/TerminalProcessExec.cmd.test.ts index 80d57da6176..c2a4fe30c1a 100644 --- a/src/integrations/terminal/__tests__/TerminalProcessExec.cmd.test.ts +++ b/src/integrations/terminal/__tests__/TerminalProcessExec.cmd.test.ts @@ -69,7 +69,6 @@ async function testCmdCommand( let startTime: bigint = BigInt(0) let endTime: bigint = BigInt(0) let timeRecorded = false - let timeoutId: NodeJS.Timeout | undefined // Create a mock terminal with shell integration const mockTerminal = { diff --git a/src/integrations/terminal/__tests__/TerminalProcessExec.pwsh.test.ts b/src/integrations/terminal/__tests__/TerminalProcessExec.pwsh.test.ts index 3294d1198ee..e6ca6830676 100644 --- a/src/integrations/terminal/__tests__/TerminalProcessExec.pwsh.test.ts +++ b/src/integrations/terminal/__tests__/TerminalProcessExec.pwsh.test.ts @@ -71,7 +71,6 @@ async function testPowerShellCommand( let startTime: bigint = BigInt(0) let endTime: bigint = BigInt(0) let timeRecorded = false - let timeoutId: NodeJS.Timeout | undefined // Create a mock terminal with shell integration const mockTerminal = { diff --git a/src/integrations/terminal/__tests__/TerminalProcessInterpretExitCode.test.ts b/src/integrations/terminal/__tests__/TerminalProcessInterpretExitCode.test.ts index 8a4cfd58f58..f0e312c6119 100644 --- a/src/integrations/terminal/__tests__/TerminalProcessInterpretExitCode.test.ts +++ b/src/integrations/terminal/__tests__/TerminalProcessInterpretExitCode.test.ts @@ -1,20 +1,5 @@ import { TerminalProcess } from "../TerminalProcess" import { execSync } from "child_process" -import { Terminal } from "../Terminal" -import * as vscode from "vscode" - -// Mock vscode.Terminal for testing -const mockTerminal = { - name: "Test Terminal", - processId: Promise.resolve(123), - creationOptions: {}, - exitStatus: undefined, - state: { isInteractedWith: true }, - dispose: jest.fn(), - hide: jest.fn(), - show: jest.fn(), - sendText: jest.fn(), -} as unknown as vscode.Terminal describe("TerminalProcess.interpretExitCode", () => { it("should handle undefined exit code", () => { diff --git a/src/integrations/workspace/WorkspaceTracker.ts b/src/integrations/workspace/WorkspaceTracker.ts index 4621fdc99ea..6c3b7e2a662 100644 --- a/src/integrations/workspace/WorkspaceTracker.ts +++ b/src/integrations/workspace/WorkspaceTracker.ts @@ -1,10 +1,10 @@ import * as vscode from "vscode" import * as path from "path" + import { listFiles } from "../../services/glob/list-files" import { ClineProvider } from "../../core/webview/ClineProvider" import { toRelativePath } from "../../utils/path" import { getWorkspacePath } from "../../utils/path" -import { logger } from "../../utils/logging" const MAX_INITIAL_FILES = 1_000 diff --git a/src/services/browser/BrowserSession.ts b/src/services/browser/BrowserSession.ts index 241865a5488..699b8c7315b 100644 --- a/src/services/browser/BrowserSession.ts +++ b/src/services/browser/BrowserSession.ts @@ -6,7 +6,6 @@ import { Browser, Page, ScreenshotOptions, TimeoutError, launch, connect } from import PCR from "puppeteer-chromium-resolver" import pWaitFor from "p-wait-for" import delay from "delay" -import axios from "axios" import { fileExistsAtPath } from "../../utils/fs" import { BrowserActionResult } from "../../shared/ExtensionMessage" import { discoverChromeHostUrl, tryChromeHostUrl } from "./browserDiscovery" diff --git a/src/services/browser/browserDiscovery.ts b/src/services/browser/browserDiscovery.ts index b17e166a9b5..ecfd1c868a9 100644 --- a/src/services/browser/browserDiscovery.ts +++ b/src/services/browser/browserDiscovery.ts @@ -45,8 +45,7 @@ export async function isPortOpen(host: string, port: number, timeout = 1000): Pr export async function tryChromeHostUrl(chromeHostUrl: string): Promise { try { console.log(`Trying to connect to Chrome at: ${chromeHostUrl}/json/version`) - const response = await axios.get(`${chromeHostUrl}/json/version`, { timeout: 1000 }) - const data = response.data + await axios.get(`${chromeHostUrl}/json/version`, { timeout: 1000 }) return true } catch (error) { return false diff --git a/src/services/checkpoints/types.ts b/src/services/checkpoints/types.ts index 81611e81ec1..0b49c7266d3 100644 --- a/src/services/checkpoints/types.ts +++ b/src/services/checkpoints/types.ts @@ -1,4 +1,4 @@ -import { CommitResult, SimpleGit } from "simple-git" +import { CommitResult } from "simple-git" export type CheckpointResult = Partial & Pick diff --git a/src/services/glob/__mocks__/list-files.ts b/src/services/glob/__mocks__/list-files.ts index 68bc60e730d..07741e4c9a0 100644 --- a/src/services/glob/__mocks__/list-files.ts +++ b/src/services/glob/__mocks__/list-files.ts @@ -21,18 +21,6 @@ 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 @@ -42,7 +30,7 @@ const mockArePathsEqual = (path1: string, path2: string): boolean => { * @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) => { +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") { diff --git a/src/services/mcp/McpHub.ts b/src/services/mcp/McpHub.ts index 59349ffdbcc..46f59858f9b 100644 --- a/src/services/mcp/McpHub.ts +++ b/src/services/mcp/McpHub.ts @@ -1,5 +1,5 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js" -import { StdioClientTransport, StdioServerParameters } from "@modelcontextprotocol/sdk/client/stdio.js" +import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js" import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js" import ReconnectingEventSource from "reconnecting-eventsource" import { @@ -205,11 +205,7 @@ export class McpHub { * @param error The error object */ private showErrorMessage(message: string, error: unknown): void { - const errorMessage = error instanceof Error ? error.message : `${error}` console.error(`${message}:`, error) - // if (vscode.window && typeof vscode.window.showErrorMessage === 'function') { - // vscode.window.showErrorMessage(`${message}: ${errorMessage}`) - // } } public setupWorkspaceFoldersWatcher(): void { diff --git a/src/services/mcp/__tests__/McpHub.test.ts b/src/services/mcp/__tests__/McpHub.test.ts index 5df70d0b592..ffd98ff6bda 100644 --- a/src/services/mcp/__tests__/McpHub.test.ts +++ b/src/services/mcp/__tests__/McpHub.test.ts @@ -37,7 +37,6 @@ describe("McpHub", () => { // Store original console methods const originalConsoleError = console.error - const mockSettingsPath = "/mock/settings/path/mcp_settings.json" beforeEach(() => { jest.clearAllMocks() diff --git a/src/services/ripgrep/index.ts b/src/services/ripgrep/index.ts index 89e1da62f80..01e2c26fd16 100644 --- a/src/services/ripgrep/index.ts +++ b/src/services/ripgrep/index.ts @@ -1,8 +1,9 @@ -import * as vscode from "vscode" import * as childProcess from "child_process" import * as path from "path" -import * as fs from "fs" import * as readline from "readline" + +import * as vscode from "vscode" + import { RooIgnoreController } from "../../core/ignore/RooIgnoreController" import { fileExistsAtPath } from "../../utils/fs" /* @@ -160,7 +161,6 @@ export async function regexSearchFiles( } const results: SearchFileResult[] = [] - let currentResult: Partial | null = null let currentFile: SearchFileResult | null = null output.split("\n").forEach((line) => { diff --git a/src/services/tree-sitter/__tests__/helpers.ts b/src/services/tree-sitter/__tests__/helpers.ts index 2ba005e390c..522e6c1cc31 100644 --- a/src/services/tree-sitter/__tests__/helpers.ts +++ b/src/services/tree-sitter/__tests__/helpers.ts @@ -28,8 +28,6 @@ export async function initializeTreeSitter() { } const TreeSitter = await initializeWorkingParser() - const wasmPath = path.join(process.cwd(), "dist/tree-sitter-tsx.wasm") - const tsxLang = await TreeSitter.Language.load(wasmPath) initializedTreeSitter = TreeSitter return TreeSitter @@ -68,7 +66,6 @@ export async function testParseSourceCodeDefinitions( } = {}, ): Promise { // Set default options - const language = options.language || "tsx" const wasmFile = options.wasmFile || "tree-sitter-tsx.wasm" const queryString = options.queryString || tsxQuery const extKey = options.extKey || "tsx" diff --git a/src/services/tree-sitter/__tests__/index.test.ts b/src/services/tree-sitter/__tests__/index.test.ts index 951a86f19c3..d25b9abef5e 100644 --- a/src/services/tree-sitter/__tests__/index.test.ts +++ b/src/services/tree-sitter/__tests__/index.test.ts @@ -1,9 +1,9 @@ +import * as fs from "fs/promises" + import { parseSourceCodeForDefinitionsTopLevel } from "../index" import { listFiles } from "../../glob/list-files" import { loadRequiredLanguageParsers } from "../languageParser" import { fileExistsAtPath } from "../../../utils/fs" -import * as fs from "fs/promises" -import * as path from "path" // Mock dependencies jest.mock("../../glob/list-files") diff --git a/src/services/tree-sitter/__tests__/markdownIntegration.test.ts b/src/services/tree-sitter/__tests__/markdownIntegration.test.ts index 1d8b669a91c..dc88e37dd4b 100644 --- a/src/services/tree-sitter/__tests__/markdownIntegration.test.ts +++ b/src/services/tree-sitter/__tests__/markdownIntegration.test.ts @@ -1,6 +1,7 @@ -import { describe, expect, it, jest, beforeEach } from "@jest/globals" import * as fs from "fs/promises" -import * as path from "path" + +import { describe, expect, it, jest, beforeEach } from "@jest/globals" + import { parseSourceCodeDefinitionsForFile } from "../index" // Mock fs.readFile diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts index c9d94bd0528..43c03a1ea53 100644 --- a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts @@ -1,12 +1,7 @@ import { describe, expect, it, jest, beforeEach } from "@jest/globals" -import { parseSourceCodeDefinitionsForFile } from ".." -import * as fs from "fs/promises" -import * as path from "path" -import Parser from "web-tree-sitter" -import { fileExistsAtPath } from "../../../utils/fs" -import { loadRequiredLanguageParsers } from "../languageParser" + import { cppQuery } from "../queries" -import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers" +import { testParseSourceCodeDefinitions } from "./helpers" // Sample C++ content for tests covering all supported structures: // - struct declarations @@ -516,7 +511,6 @@ const cppOptions = { // Mock file system operations jest.mock("fs/promises") -const mockedFs = jest.mocked(fs) // Mock loadRequiredLanguageParsers jest.mock("../languageParser", () => ({ @@ -654,12 +648,10 @@ describe("parseSourceCodeDefinitionsForFile with C++", () => { }) it("should parse C++ using declarations and aliases", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - + // const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) + // const resultLines = result?.split("\n") || [] // Test using declarations - not supported by current parser // expect(resultLines.some((line) => line.includes("using std::string"))).toBe(true) - // Test using directives - not supported by current parser // expect(resultLines.some((line) => line.includes("using namespace std"))).toBe(true) // Test alias declarations - not supported by current parser @@ -683,12 +675,10 @@ describe("parseSourceCodeDefinitionsForFile with C++", () => { }) it("should parse C++ attributes and macros", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - + // const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) + // const resultLines = result?.split("\n") || [] // Test attributes - not supported by current parser // expect(resultLines.some((line) => line.includes("[[nodiscard]]") || line.includes("attribute_declaration"))).toBe(true) - // Test macro definitions - not supported by current parser // expect(resultLines.some((line) => line.includes("#define SQUARE"))).toBe(true) }) @@ -721,12 +711,10 @@ describe("parseSourceCodeDefinitionsForFile with C++", () => { }) it("should parse C++ inline functions and variables", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - + // const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) + // const resultLines = result?.split("\n") || [] // Test inline functions - not supported by current parser // expect(resultLines.some((line) => line.includes("inline double square"))).toBe(true) - // Test inline variables - not supported by current parser // expect(resultLines.some((line) => line.includes("inline constexpr double PI"))).toBe(true) }) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts index ae851368c6c..137809626d8 100644 --- a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts @@ -1,12 +1,7 @@ import { describe, expect, it, jest, beforeEach } from "@jest/globals" -import { parseSourceCodeDefinitionsForFile } from ".." -import * as fs from "fs/promises" -import * as path from "path" -import Parser from "web-tree-sitter" -import { fileExistsAtPath } from "../../../utils/fs" -import { loadRequiredLanguageParsers } from "../languageParser" + import { goQuery } from "../queries" -import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers" +import { testParseSourceCodeDefinitions } from "./helpers" // Sample Go content for tests covering all supported structures: // - function declarations (with associated comments) @@ -260,7 +255,6 @@ const goOptions = { // Mock file system operations jest.mock("fs/promises") -const mockedFs = jest.mocked(fs) // Mock loadRequiredLanguageParsers jest.mock("../languageParser", () => ({ @@ -279,7 +273,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => { it("should parse Go struct definitions", async () => { const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] // Check for struct definitions - we only check for the ones that are actually captured expect(result).toContain("type Point struct") @@ -289,7 +282,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => { it("should parse Go method declarations", async () => { const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] // Check for method declarations - we only check for the ones that are actually captured expect(result).toContain("func (p *Point) Move") @@ -298,7 +290,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => { it("should parse Go function declarations", async () => { const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] // Check for function declarations - we only check for the ones that are actually captured expect(result).toContain("func CalculateDistance") @@ -308,7 +299,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => { it("should parse Go interface definitions", async () => { const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] // Check for interface definitions - we only check for the ones that are actually captured expect(result).toContain("type Shape interface") @@ -327,8 +317,7 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => { }) it("should parse Go type aliases", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] + await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) // Note: Type aliases might not be captured due to Tree-Sitter parser limitations // This test is kept for completeness @@ -336,9 +325,7 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => { }) it("should parse Go embedded structs and interfaces", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] - + await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) // Note: Embedded structs and interfaces might not be captured due to Tree-Sitter parser limitations // This test is kept for completeness expect(true).toBe(true) @@ -346,7 +333,6 @@ describe("parseSourceCodeDefinitionsForFile with Go", () => { it("should parse Go init functions", async () => { const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] // Check for init functions expect(result).toContain("func init") diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.java.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.java.test.ts index ebaeef65665..3f27300275e 100644 --- a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.java.test.ts +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.java.test.ts @@ -1,12 +1,7 @@ import { describe, expect, it, jest, beforeEach } from "@jest/globals" -import { parseSourceCodeDefinitionsForFile } from ".." -import * as fs from "fs/promises" -import * as path from "path" -import Parser from "web-tree-sitter" -import { fileExistsAtPath } from "../../../utils/fs" -import { loadRequiredLanguageParsers } from "../languageParser" + import { javaQuery } from "../queries" -import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers" +import { testParseSourceCodeDefinitions } from "./helpers" // Sample Java content for tests covering all supported structures: // - class declarations (including inner and anonymous classes) @@ -309,7 +304,6 @@ const javaOptions = { // Mock file system operations jest.mock("fs/promises") -const mockedFs = jest.mocked(fs) // Mock loadRequiredLanguageParsers jest.mock("../languageParser", () => ({ diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.json.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.json.test.ts index a23f00c64c3..e9b902c0141 100644 --- a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.json.test.ts +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.json.test.ts @@ -1,11 +1,10 @@ -import { describe, expect, it, jest, beforeEach } from "@jest/globals" -import { parseSourceCodeDefinitionsForFile } from ".." import * as fs from "fs/promises" import * as path from "path" -import { fileExistsAtPath } from "../../../utils/fs" -import { loadRequiredLanguageParsers } from "../languageParser" + +import { describe, expect, it, jest, beforeEach } from "@jest/globals" + import { javascriptQuery } from "../queries" -import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers" +import { initializeTreeSitter, testParseSourceCodeDefinitions, debugLog } from "./helpers" // Sample JSON content for tests const sampleJsonContent = `{ @@ -68,9 +67,6 @@ describe("jsonParserDebug", () => { parser.setLanguage(jsLang) const tree = parser.parse(sampleJsonContent) - // Extract definitions using JavaScript query - const query = jsLang.query(javascriptQuery) - expect(tree).toBeDefined() }) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.python.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.python.test.ts index 4c1ea34b32f..cf3fb59cbba 100644 --- a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.python.test.ts +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.python.test.ts @@ -1,12 +1,7 @@ import { describe, expect, it, jest, beforeEach } from "@jest/globals" -import { parseSourceCodeDefinitionsForFile } from ".." -import * as fs from "fs/promises" -import * as path from "path" -import Parser from "web-tree-sitter" -import { fileExistsAtPath } from "../../../utils/fs" -import { loadRequiredLanguageParsers } from "../languageParser" + import { pythonQuery } from "../queries" -import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers" +import { testParseSourceCodeDefinitions } from "./helpers" // Sample Python content for tests covering all supported structures: // - class definitions @@ -355,7 +350,6 @@ const pythonOptions = { // Mock file system operations jest.mock("fs/promises") -const mockedFs = jest.mocked(fs) // Mock loadRequiredLanguageParsers jest.mock("../languageParser", () => ({ @@ -374,7 +368,6 @@ describe("parseSourceCodeDefinitionsForFile with Python", () => { it("should parse Python class definitions", async () => { const result = await testParseSourceCodeDefinitions("/test/file.py", samplePythonContent, pythonOptions) - const resultLines = result?.split("\n") || [] // Check for class definitions expect(result).toContain("class Point") @@ -386,7 +379,6 @@ describe("parseSourceCodeDefinitionsForFile with Python", () => { it("should parse Python function definitions", async () => { const result = await testParseSourceCodeDefinitions("/test/file.py", samplePythonContent, pythonOptions) - const resultLines = result?.split("\n") || [] // Check for function definitions expect(result).toContain("def calculate_average") diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.rust.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.rust.test.ts index fe5bc1a4a13..4b992406c6a 100644 --- a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.rust.test.ts +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.rust.test.ts @@ -1,12 +1,7 @@ import { describe, expect, it, jest, beforeEach } from "@jest/globals" -import { parseSourceCodeDefinitionsForFile } from ".." -import * as fs from "fs/promises" -import * as path from "path" -import Parser from "web-tree-sitter" -import { fileExistsAtPath } from "../../../utils/fs" -import { loadRequiredLanguageParsers } from "../languageParser" + import { rustQuery } from "../queries" -import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers" +import { testParseSourceCodeDefinitions } from "./helpers" // Sample Rust content for tests covering all supported structures: // - struct definitions @@ -318,7 +313,6 @@ const rustOptions = { // Mock file system operations jest.mock("fs/promises") -const mockedFs = jest.mocked(fs) // Mock loadRequiredLanguageParsers jest.mock("../languageParser", () => ({ diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.tsx.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.tsx.test.ts index f03382b024c..eef530c2db2 100644 --- a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.tsx.test.ts +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.tsx.test.ts @@ -1,11 +1,11 @@ -import { describe, expect, it, jest, beforeEach, beforeAll } from "@jest/globals" -import { parseSourceCodeDefinitionsForFile } from ".." +// npx jest src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.tsx.test.ts + import * as fs from "fs/promises" import * as path from "path" -import { fileExistsAtPath } from "../../../utils/fs" -import { loadRequiredLanguageParsers } from "../languageParser" -import tsxQuery from "../queries/tsx" -import { initializeTreeSitter, testParseSourceCodeDefinitions, inspectTreeStructure, debugLog } from "./helpers" + +import { describe, expect, it, jest, beforeEach } from "@jest/globals" + +import { initializeTreeSitter, testParseSourceCodeDefinitions, debugLog } from "./helpers" // Sample component content with enhanced TypeScript language constructs const sampleTsxContent = ` @@ -338,9 +338,6 @@ describe("treeParserDebug", () => { const tree = parser.parse(sampleCode) // console.log("Parsed tree:", tree.rootNode.toString()) - // Extract definitions using TSX query - const query = tsxLang.query(tsxQuery) - expect(tree).toBeDefined() }) @@ -571,7 +568,6 @@ it("should parse conditional types", async function () { // Save the initial line count to compare later const initialLineCount = initialResult ? initialResult.split("\n").length : 0 - const initialCaptures = initialResult ? initialResult : "" // Now check if the new query pattern improves the output const updatedResult = await testParseSourceCodeDefinitions("/test/conditional-type.tsx", conditionalTypeContent) diff --git a/src/services/tree-sitter/index.ts b/src/services/tree-sitter/index.ts index c9573e40dd2..529add14f84 100644 --- a/src/services/tree-sitter/index.ts +++ b/src/services/tree-sitter/index.ts @@ -3,7 +3,7 @@ import * as path from "path" import { listFiles } from "../glob/list-files" import { LanguageParser, loadRequiredLanguageParsers } from "./languageParser" import { fileExistsAtPath } from "../../utils/fs" -import { parseMarkdown, formatMarkdownCaptures } from "./markdownParser" +import { parseMarkdown } from "./markdownParser" import { RooIgnoreController } from "../../core/ignore/RooIgnoreController" const extensions = [ @@ -109,7 +109,7 @@ export async function parseSourceCodeForDefinitionsTopLevel( let result = "" // Separate files to parse and remaining files - const { filesToParse, remainingFiles } = separateFiles(allFiles) + const { filesToParse } = separateFiles(allFiles) // Filter filepaths for access if controller is provided const allowedFilesToParse = rooIgnoreController ? rooIgnoreController.filterPaths(filesToParse) : filesToParse @@ -227,9 +227,6 @@ function processCaptures(captures: any[], lines: string[], minComponentLines: nu // Sort captures by their start position captures.sort((a, b) => a.node.startPosition.row - b.node.startPosition.row) - // Keep track of the last line we've processed - let lastLine = -1 - // Track already processed lines to avoid duplicates const processedLines = new Set() @@ -300,13 +297,12 @@ function processCaptures(captures: any[], lines: string[], minComponentLines: nu } } } - - lastLine = endLine }) if (formattedOutput.length > 0) { return formattedOutput } + return null } diff --git a/src/shared/__tests__/vsCodeSelectorUtils.test.ts b/src/shared/__tests__/vsCodeSelectorUtils.test.ts index 6e6c188bc08..3c2e6108474 100644 --- a/src/shared/__tests__/vsCodeSelectorUtils.test.ts +++ b/src/shared/__tests__/vsCodeSelectorUtils.test.ts @@ -1,4 +1,4 @@ -import { stringifyVsCodeLmModelSelector, SELECTOR_SEPARATOR } from "../vsCodeSelectorUtils" +import { stringifyVsCodeLmModelSelector } from "../vsCodeSelectorUtils" import { LanguageModelChatSelector } from "vscode" describe("vsCodeSelectorUtils", () => { diff --git a/src/utils/__tests__/git.test.ts b/src/utils/__tests__/git.test.ts index 629849c2360..f2814339fc8 100644 --- a/src/utils/__tests__/git.test.ts +++ b/src/utils/__tests__/git.test.ts @@ -1,7 +1,8 @@ import { jest } from "@jest/globals" -import { searchCommits, getCommitInfo, getWorkingState, GitCommit } from "../git" import { ExecException } from "child_process" +import { searchCommits, getCommitInfo, getWorkingState } from "../git" + type ExecFunction = ( command: string, options: { cwd?: string }, diff --git a/src/utils/logging/CompactLogger.ts b/src/utils/logging/CompactLogger.ts index 4fc27ed58ab..949c24de0b3 100644 --- a/src/utils/logging/CompactLogger.ts +++ b/src/utils/logging/CompactLogger.ts @@ -142,7 +142,7 @@ export class CompactLogger implements ILogger { l: level, m: message, c: meta?.ctx, - d: meta ? (({ ctx, ...rest }) => (Object.keys(rest).length > 0 ? rest : undefined))(meta) : undefined, + d: meta ? (({ ctx: _, ...rest }) => (Object.keys(rest).length > 0 ? rest : undefined))(meta) : undefined, } this.transport.write(entry) diff --git a/webview-ui/package.json b/webview-ui/package.json index 8267a7e918c..91ba3d76dce 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -4,8 +4,7 @@ "private": true, "type": "module", "scripts": { - "lint": "eslint src/**/*.ts src/**/*.tsx", - "lint-fix": "eslint src/**/*.ts src/**/*.tsx --fix", + "lint": "eslint src --ext .ts,.tsx", "check-types": "tsc", "test": "jest -w=40%", "dev": "vite", diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 9cfeddd5ea4..2c60d5f1aec 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -94,11 +94,12 @@ const ChatTextArea = forwardRef( // Close dropdown when clicking outside. useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { + const handleClickOutside = () => { if (showDropdown) { setShowDropdown(false) } } + document.addEventListener("mousedown", handleClickOutside) return () => document.removeEventListener("mousedown", handleClickOutside) }, [showDropdown]) diff --git a/webview-ui/src/components/chat/ContextMenu.tsx b/webview-ui/src/components/chat/ContextMenu.tsx index dbee398bf80..27d53803a85 100644 --- a/webview-ui/src/components/chat/ContextMenu.tsx +++ b/webview-ui/src/components/chat/ContextMenu.tsx @@ -33,7 +33,6 @@ const ContextMenu: React.FC = ({ selectedType, queryItems, modes, - loading = false, dynamicSearchResults = [], }) => { const [materialIconsBaseUri, setMaterialIconsBaseUri] = useState("") diff --git a/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx b/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx index 2262f1494da..0f8ad2cbc64 100644 --- a/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx +++ b/webview-ui/src/components/chat/__tests__/ChatTextArea.test.tsx @@ -360,7 +360,7 @@ describe("ChatTextArea", () => { const outsidePath = "/Users/other/project/file.js" // Mock the convertToMentionPath function to return the original path for paths outside cwd - mockConvertToMentionPath.mockImplementationOnce((path, cwd) => { + mockConvertToMentionPath.mockImplementationOnce((path, _cwd) => { return path // Return original path for this test }) diff --git a/webview-ui/src/components/common/CodeBlock.tsx b/webview-ui/src/components/common/CodeBlock.tsx index 04da931bd14..d5d41940a3b 100644 --- a/webview-ui/src/components/common/CodeBlock.tsx +++ b/webview-ui/src/components/common/CodeBlock.tsx @@ -100,7 +100,7 @@ const StyledPre = styled.pre<{ theme: any }>` ${(props) => Object.keys(props.theme) - .map((key, index) => { + .map((key) => { return ` & ${key} { color: ${props.theme[key]}; @@ -135,7 +135,7 @@ const CodeBlock = memo(({ source, forceWrap = false }: CodeBlockProps) => { ], rehypeReactOptions: { components: { - pre: ({ node, ...preProps }: any) => , + pre: ({ node: _, ...preProps }: any) => , }, }, }) diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index e8ff7067138..22aa345dfd6 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -160,7 +160,7 @@ const StyledPre = styled.pre<{ theme: any }>` ${(props) => Object.keys(props.theme) - .map((key, index) => { + .map((key) => { return ` & ${key} { color: ${props.theme[key]}; @@ -195,7 +195,7 @@ const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { ], rehypeReactOptions: { components: { - pre: ({ node, children, ...preProps }: any) => { + pre: ({ node: _, children, ...preProps }: any) => { if (Array.isArray(children) && children.length === 1 && React.isValidElement(children[0])) { const child = children[0] as React.ReactElement<{ className?: string }> if (child.props?.className?.includes("language-mermaid")) { diff --git a/webview-ui/src/components/prompts/PromptsView.tsx b/webview-ui/src/components/prompts/PromptsView.tsx index e53bea24609..61c61490e71 100644 --- a/webview-ui/src/components/prompts/PromptsView.tsx +++ b/webview-ui/src/components/prompts/PromptsView.tsx @@ -316,7 +316,7 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { // Handle clicks outside the config menu useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { + const handleClickOutside = () => { if (showConfigMenu) { setShowConfigMenu(false) } diff --git a/webview-ui/src/components/settings/AutoApproveSettings.tsx b/webview-ui/src/components/settings/AutoApproveSettings.tsx index 8b71dbdfed9..e75b7ff723a 100644 --- a/webview-ui/src/components/settings/AutoApproveSettings.tsx +++ b/webview-ui/src/components/settings/AutoApproveSettings.tsx @@ -57,7 +57,6 @@ export const AutoApproveSettings = ({ alwaysAllowExecute, allowedCommands, setCachedStateField, - className, ...props }: AutoApproveSettingsProps) => { const { t } = useAppTranslation() diff --git a/webview-ui/src/components/settings/ExperimentalSettings.tsx b/webview-ui/src/components/settings/ExperimentalSettings.tsx index 7b962ccfed5..5e060832cf0 100644 --- a/webview-ui/src/components/settings/ExperimentalSettings.tsx +++ b/webview-ui/src/components/settings/ExperimentalSettings.tsx @@ -18,7 +18,6 @@ type ExperimentalSettingsProps = HTMLAttributes & { } export const ExperimentalSettings = ({ - setCachedStateField, experiments, setExperimentEnabled, className, diff --git a/webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx b/webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx index d6a82bc0e4d..37cbdabcda1 100644 --- a/webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx +++ b/webview-ui/src/components/settings/__tests__/ApiConfigManager.test.tsx @@ -1,6 +1,5 @@ // npx jest src/components/settings/__tests__/ApiConfigManager.test.tsx -import React from "react" import { render, screen, fireEvent, within } from "@testing-library/react" import ApiConfigManager from "../ApiConfigManager" @@ -21,14 +20,14 @@ jest.mock("@vscode/webview-ui-toolkit/react", () => ({ jest.mock("@/components/ui", () => ({ ...jest.requireActual("@/components/ui"), - Dialog: ({ children, open, onOpenChange }: any) => ( + Dialog: ({ children, open }: any) => (
{children}
), DialogContent: ({ children }: any) =>
{children}
, DialogTitle: ({ children }: any) =>
{children}
, - Button: ({ children, onClick, disabled, variant, "data-testid": dataTestId }: any) => ( + Button: ({ children, onClick, disabled, "data-testid": dataTestId }: any) => ( @@ -43,16 +42,16 @@ jest.mock("@/components/ui", () => ({ /> ), // New components for searchable dropdown - Popover: ({ children, open, onOpenChange }: any) => ( + Popover: ({ children, open }: any) => (
{children} {open &&
}
), - PopoverTrigger: ({ children, asChild }: any) =>
{children}
, - PopoverContent: ({ children, className }: any) =>
{children}
, + PopoverTrigger: ({ children }: any) =>
{children}
, + PopoverContent: ({ children }: any) =>
{children}
, Command: ({ children }: any) =>
{children}
, - CommandInput: ({ value, onValueChange, placeholder, className, "data-testid": dataTestId, ref }: any) => ( + CommandInput: ({ value, onValueChange, placeholder, className, "data-testid": dataTestId }: any) => ( onValueChange(e.target.value)} @@ -70,7 +69,7 @@ jest.mock("@/components/ui", () => ({ ), // Keep old components for backward compatibility - Select: ({ children, value, onValueChange }: any) => ( + Select: ({ value, onValueChange }: any) => ( console.log(e.target.value)} + className="input-field" + /> + alert("Clicked!")} + > + Member Expression Component + + {}} + complex={[{ id: '1', value: 1 }]} + /> + + ); +}; + +// Event Handlers (synthetic events) - spans 4+ lines +const EventHandlersComponent: React.FC = () => { + const handleClick = (event: React.MouseEvent) => { + console.log('Button clicked', event.currentTarget); + event.preventDefault(); + event.stopPropagation(); + }; + + const handleChange = (event: React.ChangeEvent) => { + const value = event.target.value; + console.log('Input value changed:', value); + }; + + const handleSubmit = (event: React.FormEvent) => { + event.preventDefault(); + console.log('Form submitted'); + }; + + return ( +
+ + +
+ ); +}; + +// State Definitions (class and hooks) - spans 4+ lines +const HooksStateComponent: React.FC = () => { + const [count, setCount] = React.useState(0); + const [user, setUser] = React.useState<{ + name: string; + age: number; + isActive: boolean; + }>({ + name: 'John', + age: 30, + isActive: true + }); + + const incrementCount = () => { + setCount(prevCount => prevCount + 1); + }; + + const updateUser = () => { + setUser({ + ...user, + age: user.age + 1, + isActive: !user.isActive + }); + }; + + return ( +
+

Count: {count}

+

User: {user.name}, {user.age}, {user.isActive ? 'Active' : 'Inactive'}

+ + +
+ ); +}; + +// Hooks Usage (built-in hooks) - spans 4+ lines +const HooksUsageComponent: React.FC<{ id: string }> = ({ id }) => { + const [data, setData] = React.useState([]); + const counter = React.useRef(0); + const prevId = React.useRef(); + + React.useEffect(() => { + console.log('Component mounted'); + fetchData(id); + + return () => { + console.log('Component unmounted'); + }; + }, [id]); + + React.useEffect(() => { + prevId.current = id; + }, [id]); + + const fetchData = React.useCallback((userId: string) => { + counter.current += 1; + // Mock fetch to avoid async/await parsing issues + setTimeout(() => { + setData(['user_data_1', 'user_data_2']); + }, 100); + setData(data); + }, []); + + const memoizedValue = React.useMemo(() => { + return { + processedData: data.map(item => item.toUpperCase()), + counter: counter.current + }; + }, [data]); + + return ( +
+

Data loaded: {memoizedValue.processedData.join(', ')}

+

Previous ID: {prevId.current}

+

Current ID: {id}

+

Fetch count: {counter.current}

+
+ ); +}; + +// Generic Components (type parameters) - spans 4+ lines +interface GenericComponentProps { + items: T[]; + renderItem: (item: T) => React.ReactNode; + keyExtractor: (item: T) => string; + onItemSelect?: (item: T) => void; +} + +function GenericListComponent({ + items, + renderItem, + keyExtractor, + onItemSelect +}: GenericComponentProps): JSX.Element { + return ( +
    + {items.map(item => ( +
  • onItemSelect && onItemSelect(item)} + > + {renderItem(item)} +
  • + ))} +
+ ); +} + +// Usage of generic component - spans 4+ lines +type UserType = { + id: string; + name: string; + email: string; + role: 'admin' | 'user'; +}; + +const GenericComponentUsage: React.FC = () => { + const users: UserType[] = [ + { id: '1', name: 'Alice', email: 'alice@example.com', role: 'admin' }, + { id: '2', name: 'Bob', email: 'bob@example.com', role: 'user' }, + { id: '3', name: 'Charlie', email: 'charlie@example.com', role: 'user' } + ]; + + return ( + + items={users} + keyExtractor={user => user.id} + renderItem={user => ( +
+ {user.name} + {user.email} + {user.role} +
+ )} + onItemSelect={user => console.log('Selected user:', user)} + /> + ); +}; +` diff --git a/src/services/tree-sitter/__tests__/fixtures/sample-typescript.ts b/src/services/tree-sitter/__tests__/fixtures/sample-typescript.ts new file mode 100644 index 00000000000..9e092ead8f5 --- /dev/null +++ b/src/services/tree-sitter/__tests__/fixtures/sample-typescript.ts @@ -0,0 +1,208 @@ +export default String.raw` +// Import statements test - inherently single-line, exempt from 4-line requirement +import React, { useState, useEffect } from 'react'; +import { render } from 'react-dom'; +import * as utils from './utils'; + +// Interface declaration test +interface TestInterfaceDefinition { + name: string; + value: number; + + methodSignature( + param1: string, + param2: number + ): string; +} + +// Type declaration test +type TestTypeDefinition = { + id: number; + name: string; + + callback: ( + param: string + ) => void; +}; + +// Enum declaration test +enum TestEnumDefinition { + First = 'FIRST', + Second = 'SECOND', + Third = 'THIRD', + Fourth = 'FOURTH' +} + +// Namespace declaration test +namespace TestNamespaceDefinition { + export interface InnerInterface { + prop: string; + } + + export function innerFunction( + param: string + ): void { + console.log(param); + } +} + +// Generic interface test +interface TestGenericInterfaceDefinition { + data: T; + metadata: U; + + process( + input: T + ): U; +} + +// Function with type annotations +function testTypedFunctionDefinition( + param1: string, + param2: number, + callback: (result: string) => void +): string { + const result = param1.repeat(param2); + callback(result); + return result; +} + +// Async function with type annotations +async function testTypedAsyncFunctionDefinition( + url: string, + options: RequestInit, + timeout: number +): Promise { + const response = await fetch(url, options); + const data = await response.json(); + return data; +} + +// Generic function test +function testGenericFunctionDefinition( + input: T, + transform: (value: T) => U +): U { + return transform(input); +} + +// Class with interface implementation +class TestTypedClassDefinition implements TestInterfaceDefinition { + // Typed class fields + private readonly #privateField: string; + static staticField: number = 42; + + constructor( + public name: string, + public value: number + ) { + this.#privateField = 'private'; + } + + // Interface method implementation + methodSignature( + param1: string, + param2: number + ): string { + return param1.repeat(param2); + } + + // Generic method + genericMethod( + input: T, + count: number + ): T[] { + return Array(count).fill(input); + } +} + +// Abstract class test +abstract class TestAbstractClassDefinition { + constructor( + protected name: string, + private value: number + ) {} + + abstract process( + input: string + ): number; + + // Concrete method + format(): string { + return this.name + + String(this.value); + } +} + +// Typed object literal +const testTypedObjectLiteralDefinition: TestTypeDefinition = { + id: 1, + name: 'test', + + callback: ( + param: string + ): void => { + console.log(param); + } +}; + +// JSX element with TypeScript props +interface TestJsxPropsDefinition { + title: string; + items: string[]; + onSelect: (item: string) => void; +} + +const testTypedJsxElementDefinition = ( + props: TestJsxPropsDefinition +): JSX.Element => { + return ( +
+
+ {props.title} +
+
+ {props.items.map(item => ( +
props.onSelect(item)}> + {item} +
+ ))} +
+
+ ); +}; + +// Decorator with TypeScript types +function testTypedDecoratorDefinition( + target: any, + propertyKey: string, + descriptor: PropertyDescriptor +): PropertyDescriptor { + const original = descriptor.value; + descriptor.value = function(...args: any[]) { + return original.apply(this, args); + }; + return descriptor; +} + +// Class with typed decorator +@testTypedDecoratorDefinition +class TestTypedDecoratedClassDefinition { + constructor( + private name: string, + protected type: string + ) {} + + @testTypedDecoratorDefinition + testDecoratedMethodDefinition( + param1: string, + param2: number + ): string { + return param1.repeat(param2); + } +} + +// Module exports - inherently single-line, exempt from 4-line requirement +export { testTypedFunctionDefinition, TestTypedClassDefinition }; +export default TestTypedDecoratedClassDefinition; +` diff --git a/src/services/tree-sitter/__tests__/fixtures/sample-vue.ts b/src/services/tree-sitter/__tests__/fixtures/sample-vue.ts new file mode 100644 index 00000000000..1a8a33c80cd --- /dev/null +++ b/src/services/tree-sitter/__tests__/fixtures/sample-vue.ts @@ -0,0 +1,93 @@ +export const sampleVue = ` + + + + + +` diff --git a/src/services/tree-sitter/__tests__/fixtures/sample-zig.ts b/src/services/tree-sitter/__tests__/fixtures/sample-zig.ts new file mode 100644 index 00000000000..661a884bf5c --- /dev/null +++ b/src/services/tree-sitter/__tests__/fixtures/sample-zig.ts @@ -0,0 +1,42 @@ +export const sampleZig = ` +const std = @import("std"); + +// A basic struct +pub const Point = struct { + x: f32, + y: f32, + + pub fn init(x: f32, y: f32) Point { + return Point{ .x = x, .y = y }; + } + + pub fn distance(self: Point) f32 { + return @sqrt(self.x * self.x + self.y * self.y); + } +}; + +// A function definition +pub fn main() !void { + const point = Point.init(3.0, 4.0); + const dist = point.distance(); + std.debug.print("Distance: {d}\n", .{dist}); +} + +// An enum definition +const Direction = enum { + North, + South, + East, + West, +}; + +// Global variables +var global_point: Point = undefined; +pub const VERSION: u32 = 1; + +// A type definition +pub const Vector = struct { + direction: Direction, + magnitude: f32, +}; +` diff --git a/src/services/tree-sitter/__tests__/helpers.ts b/src/services/tree-sitter/__tests__/helpers.ts index 522e6c1cc31..3326e1c89b3 100644 --- a/src/services/tree-sitter/__tests__/helpers.ts +++ b/src/services/tree-sitter/__tests__/helpers.ts @@ -1,9 +1,20 @@ import { jest } from "@jest/globals" -import { parseSourceCodeDefinitionsForFile } from ".." +import { parseSourceCodeDefinitionsForFile, setMinComponentLines } from ".." import * as fs from "fs/promises" import * as path from "path" import Parser from "web-tree-sitter" import tsxQuery from "../queries/tsx" +// Mock setup +jest.mock("fs/promises") +export const mockedFs = jest.mocked(fs) + +jest.mock("../../../utils/fs", () => ({ + fileExistsAtPath: jest.fn().mockImplementation(() => Promise.resolve(true)), +})) + +jest.mock("../languageParser", () => ({ + loadRequiredLanguageParsers: jest.fn(), +})) // Global debug flag - read from environment variable or default to 0 export const DEBUG = process.env.DEBUG ? parseInt(process.env.DEBUG, 10) : 0 @@ -15,9 +26,6 @@ export const debugLog = (message: string, ...args: any[]) => { } } -// Mock fs module -const mockedFs = jest.mocked(fs) - // Store the initialized TreeSitter for reuse let initializedTreeSitter: Parser | null = null @@ -65,15 +73,18 @@ export async function testParseSourceCodeDefinitions( extKey?: string } = {}, ): Promise { + // Set minimum component lines to 0 for tests + setMinComponentLines(0) + // Set default options const wasmFile = options.wasmFile || "tree-sitter-tsx.wasm" const queryString = options.queryString || tsxQuery const extKey = options.extKey || "tsx" - // Clear any previous mocks + // Clear any previous mocks and set up fs mock jest.clearAllMocks() - - // Mock fs.readFile to return our sample content + jest.mock("fs/promises") + const mockedFs = require("fs/promises") as jest.Mocked mockedFs.readFile.mockResolvedValue(content) // Get the mock function @@ -105,12 +116,12 @@ export async function testParseSourceCodeDefinitions( expect(mockedLoadRequiredLanguageParsers).toHaveBeenCalledWith([testFilePath]) expect(mockedLoadRequiredLanguageParsers).toHaveBeenCalled() - debugLog(`content:\n${content}\n\nResult:\n${result}`) + debugLog(`Result:\n${result}`) return result } // Helper function to inspect tree structure -export async function inspectTreeStructure(content: string, language: string = "typescript"): Promise { +export async function inspectTreeStructure(content: string, language: string = "typescript"): Promise { const TreeSitter = await initializeTreeSitter() const parser = new TreeSitter() const wasmPath = path.join(process.cwd(), `dist/tree-sitter-${language}.wasm`) @@ -122,41 +133,5 @@ export async function inspectTreeStructure(content: string, language: string = " // Print the tree structure debugLog(`TREE STRUCTURE (${language}):\n${tree.rootNode.toString()}`) - - // Add more detailed debug information - debugLog("\nDETAILED NODE INSPECTION:") - - // Function to recursively print node details - const printNodeDetails = (node: Parser.SyntaxNode, depth: number = 0) => { - const indent = " ".repeat(depth) - debugLog( - `${indent}Node Type: ${node.type}, Start: ${node.startPosition.row}:${node.startPosition.column}, End: ${node.endPosition.row}:${node.endPosition.column}`, - ) - - // Print children - for (let i = 0; i < node.childCount; i++) { - const child = node.child(i) - if (child) { - // For type_alias_declaration nodes, print more details - if (node.type === "type_alias_declaration") { - debugLog(`${indent} TYPE ALIAS: ${node.text}`) - } - - // For conditional_type nodes, print more details - if (node.type === "conditional_type" || child.type === "conditional_type") { - debugLog(`${indent} CONDITIONAL TYPE FOUND: ${child.text}`) - } - - // For infer_type nodes, print more details - if (node.type === "infer_type" || child.type === "infer_type") { - debugLog(`${indent} INFER TYPE FOUND: ${child.text}`) - } - - printNodeDetails(child, depth + 1) - } - } - } - - // Start recursive printing from the root node - printNodeDetails(tree.rootNode) + return tree.rootNode.toString() } diff --git a/src/services/tree-sitter/__tests__/inspectC.test.ts b/src/services/tree-sitter/__tests__/inspectC.test.ts new file mode 100644 index 00000000000..8e397ce9933 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectC.test.ts @@ -0,0 +1,25 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { cQuery } from "../queries" +import sampleCContent from "./fixtures/sample-c" + +describe("inspectC", () => { + const testOptions = { + language: "c", + wasmFile: "tree-sitter-c.wasm", + queryString: cQuery, + extKey: "c", + } + + it("should inspect C tree structure", async () => { + await inspectTreeStructure(sampleCContent, "c") + }) + + it("should parse C definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.c", sampleCContent, testOptions) + // Only verify that parsing produces output with line numbers and content + if (!result || !result.match(/\d+--\d+ \|/)) { + throw new Error("Failed to parse C definitions with line numbers") + } + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectCSS.test.ts b/src/services/tree-sitter/__tests__/inspectCSS.test.ts new file mode 100644 index 00000000000..1f3d1a6a963 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectCSS.test.ts @@ -0,0 +1,27 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { cssQuery } from "../queries" +import sampleCSSContent from "./fixtures/sample-css" + +describe("CSS Tree-sitter Parser", () => { + const testOptions = { + language: "css", + wasmFile: "tree-sitter-css.wasm", + queryString: cssQuery, + extKey: "css", + } + + it("should properly parse CSS structures", async () => { + // First run inspectTreeStructure to get query structure output + await inspectTreeStructure(sampleCSSContent, "css") + + // Then run testParseSourceCodeDefinitions to get line numbers + const result = await testParseSourceCodeDefinitions("test.css", sampleCSSContent, testOptions) + expect(result).toBeDefined() + if (!result) { + throw new Error("No result returned from parser") + } + expect(result).toMatch(/\d+--\d+ \|/) + expect(result.split("\n").length).toBeGreaterThan(1) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectCSharp.test.ts b/src/services/tree-sitter/__tests__/inspectCSharp.test.ts new file mode 100644 index 00000000000..d8d01839418 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectCSharp.test.ts @@ -0,0 +1,24 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { csharpQuery } from "../queries" +import sampleCSharpContent from "./fixtures/sample-c-sharp" + +describe("inspectCSharp", () => { + const testOptions = { + language: "c_sharp", + wasmFile: "tree-sitter-c_sharp.wasm", + queryString: csharpQuery, + extKey: "cs", + } + + it("should inspect C# tree structure", async () => { + // Should execute without throwing + await expect(inspectTreeStructure(sampleCSharpContent, "c_sharp")).resolves.not.toThrow() + }) + + it("should parse C# definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.cs", sampleCSharpContent, testOptions) + expect(result).toBeDefined() + expect(result).toMatch(/\d+--\d+ \|/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectCpp.test.ts b/src/services/tree-sitter/__tests__/inspectCpp.test.ts new file mode 100644 index 00000000000..b6e28cf19a5 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectCpp.test.ts @@ -0,0 +1,23 @@ +import { describe, it, expect } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { cppQuery } from "../queries" +import sampleCppContent from "./fixtures/sample-cpp" + +describe("C++ Tree-sitter Parser", () => { + const testOptions = { + language: "cpp", + wasmFile: "tree-sitter-cpp.wasm", + queryString: cppQuery, + extKey: "cpp", + } + + it("should properly parse structures", async () => { + // First run inspectTreeStructure to get query structure output + await inspectTreeStructure(sampleCppContent, "cpp") + + // Then run testParseSourceCodeDefinitions to get line numbers + const result = await testParseSourceCodeDefinitions("test.cpp", sampleCppContent, testOptions) + expect(result).toBeDefined() + expect(result).toMatch(/\d+--\d+ \|/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectElisp.test.ts b/src/services/tree-sitter/__tests__/inspectElisp.test.ts new file mode 100644 index 00000000000..242019177be --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectElisp.test.ts @@ -0,0 +1,29 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { elispQuery } from "../queries/elisp" +import sampleElispContent from "./fixtures/sample-elisp" + +describe("inspectElisp", () => { + const testOptions = { + language: "elisp", + wasmFile: "tree-sitter-elisp.wasm", + queryString: elispQuery, + extKey: "el", + } + + it("should validate Elisp tree structure inspection", async () => { + const result = await inspectTreeStructure(sampleElispContent, "elisp") + expect(result).toBeDefined() + expect(result.length).toBeGreaterThan(0) + }) + + it("should validate Elisp definitions parsing", async () => { + const result = await testParseSourceCodeDefinitions("test.el", sampleElispContent, testOptions) + expect(result).toBeDefined() + expect(result).toMatch(/\d+--\d+ \|/) // Verify line number format + + // Verify some sample content is parsed + expect(result).toMatch(/defun test-function/) + expect(result).toMatch(/defmacro test-macro/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectElixir.test.ts b/src/services/tree-sitter/__tests__/inspectElixir.test.ts new file mode 100644 index 00000000000..a756b1cd9f7 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectElixir.test.ts @@ -0,0 +1,26 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { elixirQuery } from "../queries" +import sampleElixirContent from "./fixtures/sample-elixir" + +describe("inspectElixir", () => { + const testOptions = { + language: "elixir", + wasmFile: "tree-sitter-elixir.wasm", + queryString: elixirQuery, + extKey: "ex", + } + + it("should inspect Elixir tree structure", async () => { + const result = await inspectTreeStructure(sampleElixirContent, "elixir") + expect(result).toBeDefined() + expect(result.length).toBeGreaterThan(0) + }) + + it("should parse Elixir definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.ex", sampleElixirContent, testOptions) + expect(result).toBeDefined() + expect(result).toContain("--") + expect(result).toMatch(/\d+--\d+ \|/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectEmbeddedTemplate.test.ts b/src/services/tree-sitter/__tests__/inspectEmbeddedTemplate.test.ts new file mode 100644 index 00000000000..4d2157cca62 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectEmbeddedTemplate.test.ts @@ -0,0 +1,24 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { embeddedTemplateQuery } from "../queries" +import sampleEmbeddedTemplateContent from "./fixtures/sample-embedded_template" + +describe("inspectEmbeddedTemplate", () => { + const testOptions = { + language: "embedded_template", + wasmFile: "tree-sitter-embedded_template.wasm", + queryString: embeddedTemplateQuery, + extKey: "erb", // Match the file extension we're using + } + + it("should inspect embedded template tree structure", async () => { + const result = await inspectTreeStructure(sampleEmbeddedTemplateContent, "embedded_template") + expect(result).toBeTruthy() + }) + + it("should parse embedded template definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.erb", sampleEmbeddedTemplateContent, testOptions) + expect(result).toBeTruthy() + expect(result).toMatch(/\d+--\d+ \|/) // Verify line number format + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectGo.test.ts b/src/services/tree-sitter/__tests__/inspectGo.test.ts new file mode 100644 index 00000000000..185867d1eba --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectGo.test.ts @@ -0,0 +1,24 @@ +import { describe, it, expect } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import sampleGoContent from "./fixtures/sample-go" +import goQuery from "../queries/go" + +describe("Go Tree-sitter Parser", () => { + // Test 1: Get query structure output + it("should inspect tree structure", async () => { + await inspectTreeStructure(sampleGoContent, "go") + }) + + // Test 2: Get line numbers + it("should parse source code definitions", async () => { + const testOptions = { + language: "go", + wasmFile: "tree-sitter-go.wasm", + queryString: goQuery, + extKey: "go", + } + + const result = await testParseSourceCodeDefinitions("file.go", sampleGoContent, testOptions) + expect(result).toBeDefined() + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectHtml.test.ts b/src/services/tree-sitter/__tests__/inspectHtml.test.ts new file mode 100644 index 00000000000..bc7a2c34c26 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectHtml.test.ts @@ -0,0 +1,24 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { htmlQuery } from "../queries" +import { sampleHtmlContent } from "./fixtures/sample-html" + +describe("inspectHtml", () => { + const testOptions = { + language: "html", + wasmFile: "tree-sitter-html.wasm", + queryString: htmlQuery, + extKey: "html", + } + + it("should inspect HTML tree structure", async () => { + // Should execute without error + await expect(inspectTreeStructure(sampleHtmlContent, "html")).resolves.not.toThrow() + }) + + it("should parse HTML definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.html", sampleHtmlContent, testOptions) + expect(result).toBeDefined() + expect(result).toMatch(/\d+--\d+ \| { + const testOptions = { + language: "java", + wasmFile: "tree-sitter-java.wasm", + queryString: javaQuery, + extKey: "java", + } + + it("should inspect Java tree structure", async () => { + const result = await inspectTreeStructure(sampleJavaContent, "java") + expect(result).toBeTruthy() + }) + + it("should parse Java definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.java", sampleJavaContent, testOptions) + expect(result).toBeTruthy() + expect(result).toMatch(/\d+--\d+ \| /) // Verify line number format + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectJavaScript.test.ts b/src/services/tree-sitter/__tests__/inspectJavaScript.test.ts new file mode 100644 index 00000000000..c5d7387473b --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectJavaScript.test.ts @@ -0,0 +1,25 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { javascriptQuery } from "../queries" +import sampleJavaScriptContent from "./fixtures/sample-javascript" + +describe("inspectJavaScript", () => { + const testOptions = { + language: "javascript", + wasmFile: "tree-sitter-javascript.wasm", + queryString: javascriptQuery, + extKey: "js", + } + + it("should inspect JavaScript tree structure", async () => { + // Should not throw + await expect(inspectTreeStructure(sampleJavaScriptContent, "javascript")).resolves.not.toThrow() + }) + + it("should parse JavaScript definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.js", sampleJavaScriptContent, testOptions) + expect(result).toBeDefined() + expect(result).toMatch(/\d+--\d+ \| /) + expect(result).toMatch(/function testFunctionDefinition/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectJson.test.ts b/src/services/tree-sitter/__tests__/inspectJson.test.ts new file mode 100644 index 00000000000..e8c3506ae60 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectJson.test.ts @@ -0,0 +1,21 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { javascriptQuery } from "../queries" +import sampleJsonContent from "./fixtures/sample-json" + +describe("inspectJson", () => { + const testOptions = { + language: "javascript", + wasmFile: "tree-sitter-javascript.wasm", + queryString: javascriptQuery, + extKey: "json", + } + + it("should inspect JSON tree structure", async () => { + await inspectTreeStructure(sampleJsonContent, "json") + }) + + it("should parse JSON definitions", async () => { + await testParseSourceCodeDefinitions("test.json", sampleJsonContent, testOptions) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectKotlin.test.ts b/src/services/tree-sitter/__tests__/inspectKotlin.test.ts new file mode 100644 index 00000000000..df9a3e557bd --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectKotlin.test.ts @@ -0,0 +1,21 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { kotlinQuery } from "../queries" +import sampleKotlinContent from "./fixtures/sample-kotlin" + +describe("inspectKotlin", () => { + const testOptions = { + language: "kotlin", + wasmFile: "tree-sitter-kotlin.wasm", + queryString: kotlinQuery, + extKey: "kt", + } + + it("should inspect Kotlin tree structure", async () => { + await inspectTreeStructure(sampleKotlinContent, "kotlin") + }) + + it("should parse Kotlin definitions", async () => { + await testParseSourceCodeDefinitions("test.kt", sampleKotlinContent, testOptions) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectLua.test.ts b/src/services/tree-sitter/__tests__/inspectLua.test.ts new file mode 100644 index 00000000000..0868bbd5d64 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectLua.test.ts @@ -0,0 +1,23 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions, debugLog } from "./helpers" +import { luaQuery } from "../queries" +import sampleLuaContent from "./fixtures/sample-lua" + +describe("inspectLua", () => { + const testOptions = { + language: "lua", + wasmFile: "tree-sitter-lua.wasm", + queryString: luaQuery, + extKey: "lua", + } + + it("should inspect Lua tree structure", async () => { + await inspectTreeStructure(sampleLuaContent, "lua") + }) + + it("should parse Lua definitions", async () => { + const result = await testParseSourceCodeDefinitions("file.lua", sampleLuaContent, testOptions) + expect(result).toBeDefined() // Confirm parse succeeded + debugLog("Lua parse result:", result) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectOCaml.test.ts b/src/services/tree-sitter/__tests__/inspectOCaml.test.ts new file mode 100644 index 00000000000..0a18cb87c10 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectOCaml.test.ts @@ -0,0 +1,27 @@ +import { describe, it, expect } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { ocamlQuery } from "../queries" +import { sampleOCaml } from "./fixtures/sample-ocaml" + +describe("inspectOCaml", () => { + const testOptions = { + language: "ocaml", + wasmFile: "tree-sitter-ocaml.wasm", + queryString: ocamlQuery, + extKey: "ml", + } + + it("should inspect OCaml tree structure", async () => { + const result = await inspectTreeStructure(sampleOCaml, "ocaml") + expect(result).toBeDefined() + expect(result.length).toBeGreaterThan(0) + }) + + it("should parse OCaml definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.ml", sampleOCaml, testOptions) + expect(result).toBeDefined() + expect(result).toMatch(/\d+--\d+ \| module StringSet/) + expect(result).toMatch(/\d+--\d+ \| type shape/) + expect(result).toMatch(/\d+--\d+ \| let rec process_list/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectPhp.test.ts b/src/services/tree-sitter/__tests__/inspectPhp.test.ts new file mode 100644 index 00000000000..a120b2bcd72 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectPhp.test.ts @@ -0,0 +1,21 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { phpQuery } from "../queries" +import samplePhpContent from "./fixtures/sample-php" + +describe("inspectPhp", () => { + const testOptions = { + language: "php", + wasmFile: "tree-sitter-php.wasm", + queryString: phpQuery, + extKey: "php", + } + + it("should inspect PHP tree structure", async () => { + await inspectTreeStructure(samplePhpContent, "php") + }) + + it("should parse PHP definitions", async () => { + await testParseSourceCodeDefinitions("test.php", samplePhpContent, testOptions) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectPython.test.ts b/src/services/tree-sitter/__tests__/inspectPython.test.ts new file mode 100644 index 00000000000..99c0132fac8 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectPython.test.ts @@ -0,0 +1,24 @@ +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { samplePythonContent } from "./fixtures/sample-python" +import { pythonQuery } from "../queries" + +// Python test options +const pythonOptions = { + language: "python", + wasmFile: "tree-sitter-python.wasm", + queryString: pythonQuery, + extKey: "py", +} + +describe("Python Tree-sitter Parser", () => { + it("should successfully parse and inspect Python code", async () => { + // Verify tree structure inspection succeeds + const inspectResult = await inspectTreeStructure(samplePythonContent, "python") + expect(inspectResult).toBeDefined() + + // Verify source code definitions parsing succeeds + const parseResult = await testParseSourceCodeDefinitions("test.py", samplePythonContent, pythonOptions) + expect(parseResult).toMatch(/\d+--\d+ \|/) // Verify line number format + expect(parseResult).toContain("class") // Basic content verification + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectRuby.test.ts b/src/services/tree-sitter/__tests__/inspectRuby.test.ts new file mode 100644 index 00000000000..f95c080114c --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectRuby.test.ts @@ -0,0 +1,22 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { rubyQuery } from "../queries" +import sampleRubyContent from "./fixtures/sample-ruby" + +describe("inspectRuby", () => { + const testOptions = { + language: "ruby", + wasmFile: "tree-sitter-ruby.wasm", + queryString: rubyQuery, + extKey: "rb", + } + + it("should inspect Ruby tree structure and parse definitions", async () => { + // First inspect the tree structure + await inspectTreeStructure(sampleRubyContent, "ruby") + + // Then validate definition parsing + const result = await testParseSourceCodeDefinitions("test.rb", sampleRubyContent, testOptions) + expect(result).toMatch(/\d+--\d+ \|/) // Verify line number format + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectRust.test.ts b/src/services/tree-sitter/__tests__/inspectRust.test.ts new file mode 100644 index 00000000000..2d7c1896d5a --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectRust.test.ts @@ -0,0 +1,33 @@ +import { describe, it, expect } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions, debugLog } from "./helpers" +import { rustQuery } from "../queries" +import sampleRustContent from "./fixtures/sample-rust" + +describe("inspectRust", () => { + const testOptions = { + language: "rust", + wasmFile: "tree-sitter-rust.wasm", + queryString: rustQuery, + extKey: "rs", + } + + it("should inspect Rust tree structure", async () => { + // This test only validates that inspectTreeStructure succeeds + // It will output debug information when DEBUG=1 is set + await inspectTreeStructure(sampleRustContent, "rust") + }) + + it("should parse Rust definitions", async () => { + // This test validates that parsing produces output with line numbers + const result = await testParseSourceCodeDefinitions("test.rs", sampleRustContent, testOptions) + + // Only validate that we get some output with the expected format + expect(result).toBeTruthy() + + // Check that the output contains line numbers in the format "N--M | content" + expect(result).toMatch(/\d+--\d+ \|/) + + // Output for debugging purposes + debugLog("Rust definitions parsing succeeded") + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectScala.test.ts b/src/services/tree-sitter/__tests__/inspectScala.test.ts new file mode 100644 index 00000000000..a8323fb2841 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectScala.test.ts @@ -0,0 +1,25 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions, debugLog } from "./helpers" +import { scalaQuery } from "../queries" +import { sampleScala } from "./fixtures/sample-scala" + +describe("inspectScala", () => { + const testOptions = { + language: "scala", + wasmFile: "tree-sitter-scala.wasm", + queryString: scalaQuery, + extKey: "scala", + } + + it("should inspect Scala tree structure", async () => { + const result = await inspectTreeStructure(sampleScala, "scala") + expect(result).toBeDefined() + }) + + it("should parse Scala definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.scala", sampleScala, testOptions) + expect(result).toBeDefined() + expect(result).toMatch(/\d+--\d+ \|/) + debugLog("Scala parse result:", result) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectSolidity.test.ts b/src/services/tree-sitter/__tests__/inspectSolidity.test.ts new file mode 100644 index 00000000000..94492c297a3 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectSolidity.test.ts @@ -0,0 +1,26 @@ +import { describe, it } from "@jest/globals" +import { debugLog, inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { solidityQuery } from "../queries" +import { sampleSolidity } from "./fixtures/sample-solidity" + +describe("inspectSolidity", () => { + const testOptions = { + language: "solidity", + wasmFile: "tree-sitter-solidity.wasm", + queryString: solidityQuery, + extKey: "sol", + } + + it("should inspect Solidity tree structure", async () => { + const result = await inspectTreeStructure(sampleSolidity, "solidity") + expect(result).toBeDefined() + debugLog("Tree Structure:", result) + }) + + it("should parse Solidity definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.sol", sampleSolidity, testOptions) + expect(result).toBeDefined() + expect(result).toMatch(/\d+--\d+ \|/) + debugLog("Parse Result:", result) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectSwift.test.ts b/src/services/tree-sitter/__tests__/inspectSwift.test.ts new file mode 100644 index 00000000000..8c515963f73 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectSwift.test.ts @@ -0,0 +1,30 @@ +import { describe, it, expect } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions, debugLog } from "./helpers" +import { swiftQuery } from "../queries" +import sampleSwiftContent from "./fixtures/sample-swift" + +describe("inspectSwift", () => { + const testOptions = { + language: "swift", + wasmFile: "tree-sitter-swift.wasm", + queryString: swiftQuery, + extKey: "swift", + } + + it("should inspect Swift tree structure", async () => { + // Should execute without throwing + await expect(inspectTreeStructure(sampleSwiftContent, "swift")).resolves.not.toThrow() + }) + + it("should parse Swift definitions", async () => { + // This test validates that testParseSourceCodeDefinitions produces output + const result = await testParseSourceCodeDefinitions("test.swift", sampleSwiftContent, testOptions) + expect(result).toBeDefined() + + // Check that the output format includes line numbers and content + if (result) { + expect(result).toMatch(/\d+--\d+ \| .+/) + debugLog("Swift parsing test completed successfully") + } + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectSystemRDL.test.ts b/src/services/tree-sitter/__tests__/inspectSystemRDL.test.ts new file mode 100644 index 00000000000..f7d2266a70b --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectSystemRDL.test.ts @@ -0,0 +1,22 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions, debugLog } from "./helpers" +import systemrdlQuery from "../queries/systemrdl" +import sampleSystemRDLContent from "./fixtures/sample-systemrdl" + +describe("inspectSystemRDL", () => { + const testOptions = { + language: "systemrdl", + wasmFile: "tree-sitter-systemrdl.wasm", + queryString: systemrdlQuery, + extKey: "rdl", + } + + it("should inspect SystemRDL tree structure", async () => { + await inspectTreeStructure(sampleSystemRDLContent, "systemrdl") + }) + + it("should parse SystemRDL definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.rdl", sampleSystemRDLContent, testOptions) + debugLog("SystemRDL parse result:", result) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectTLAPlus.test.ts b/src/services/tree-sitter/__tests__/inspectTLAPlus.test.ts new file mode 100644 index 00000000000..95094b45181 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectTLAPlus.test.ts @@ -0,0 +1,21 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { tlaPlusQuery } from "../queries" +import sampleTLAPlusContent from "./fixtures/sample-tlaplus" + +describe("inspectTLAPlus", () => { + const testOptions = { + language: "tlaplus", + wasmFile: "tree-sitter-tlaplus.wasm", + queryString: tlaPlusQuery, + extKey: "tla", + } + + it("should inspect TLA+ tree structure", async () => { + await inspectTreeStructure(sampleTLAPlusContent, "tlaplus") + }) + + it("should parse TLA+ definitions", async () => { + await testParseSourceCodeDefinitions("test.tla", sampleTLAPlusContent, testOptions) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectTOML.test.ts b/src/services/tree-sitter/__tests__/inspectTOML.test.ts new file mode 100644 index 00000000000..3e1e733294f --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectTOML.test.ts @@ -0,0 +1,21 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { tomlQuery } from "../queries" +import { sampleToml } from "./fixtures/sample-toml" + +describe("inspectTOML", () => { + const testOptions = { + language: "toml", + wasmFile: "tree-sitter-toml.wasm", + queryString: tomlQuery, + extKey: "toml", + } + + it("should inspect TOML tree structure", async () => { + await inspectTreeStructure(sampleToml, "toml") + }) + + it("should parse TOML definitions", async () => { + await testParseSourceCodeDefinitions("test.toml", sampleToml, testOptions) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectTsx.test.ts b/src/services/tree-sitter/__tests__/inspectTsx.test.ts new file mode 100644 index 00000000000..acf59765789 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectTsx.test.ts @@ -0,0 +1,30 @@ +import { describe, it, expect } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions, debugLog } from "./helpers" +import sampleTsxContent from "./fixtures/sample-tsx" + +describe("inspectTsx", () => { + const testOptions = { + language: "tsx", + wasmFile: "tree-sitter-tsx.wasm", + } + + it("should inspect TSX tree structure", async () => { + // This test only validates that the function executes without error + await inspectTreeStructure(sampleTsxContent, "tsx") + // No expectations - just verifying it runs + }) + + it("should parse TSX definitions and produce line number output", async () => { + // Execute parsing and capture the result + const result = await testParseSourceCodeDefinitions("test.tsx", sampleTsxContent, testOptions) + + // Validate that the result is defined + expect(result).toBeDefined() + + // Validate that the result contains line number output format (N--M | content) + expect(result).toMatch(/\d+--\d+ \|/) + + // Debug output the result for inspection + debugLog("TSX Parse Result Sample:", result?.substring(0, 500) + "...") + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectTypeScript.test.ts b/src/services/tree-sitter/__tests__/inspectTypeScript.test.ts new file mode 100644 index 00000000000..f7f58a85339 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectTypeScript.test.ts @@ -0,0 +1,25 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions } from "./helpers" +import { typescriptQuery } from "../queries" +import sampleTypeScriptContent from "./fixtures/sample-typescript" + +describe("inspectTypeScript", () => { + const testOptions = { + language: "typescript", + wasmFile: "tree-sitter-typescript.wasm", + queryString: typescriptQuery, + extKey: "ts", + } + + it("should successfully inspect TypeScript tree structure", async () => { + // Should execute without throwing + await expect(inspectTreeStructure(sampleTypeScriptContent, "typescript")).resolves.not.toThrow() + }) + + it("should successfully parse TypeScript definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.ts", sampleTypeScriptContent, testOptions) + expect(result).toBeDefined() + expect(result).toMatch(/\d+--\d+ \|/) // Verify line number format + expect(result).toMatch(/interface TestInterfaceDefinition/) // Verify some content + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectVue.test.ts b/src/services/tree-sitter/__tests__/inspectVue.test.ts new file mode 100644 index 00000000000..08695f6bfe5 --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectVue.test.ts @@ -0,0 +1,22 @@ +import { describe, it } from "@jest/globals" +import { inspectTreeStructure, testParseSourceCodeDefinitions, debugLog } from "./helpers" +import { vueQuery } from "../queries/vue" +import { sampleVue } from "./fixtures/sample-vue" + +describe("Vue Parser", () => { + const testOptions = { + language: "vue", + wasmFile: "tree-sitter-vue.wasm", + queryString: vueQuery, + extKey: "vue", + } + + it("should inspect Vue tree structure", async () => { + await inspectTreeStructure(sampleVue, "vue") + }) + + it("should parse Vue definitions", async () => { + const result = await testParseSourceCodeDefinitions("test.vue", sampleVue, testOptions) + debugLog("Vue parse result:", result) + }) +}) diff --git a/src/services/tree-sitter/__tests__/inspectZig.test.ts b/src/services/tree-sitter/__tests__/inspectZig.test.ts new file mode 100644 index 00000000000..62037bd4b8c --- /dev/null +++ b/src/services/tree-sitter/__tests__/inspectZig.test.ts @@ -0,0 +1,20 @@ +import { describe, it, expect } from "@jest/globals" +import { testParseSourceCodeDefinitions, inspectTreeStructure } from "./helpers" +import { sampleZig } from "./fixtures/sample-zig" +import { zigQuery } from "../queries" + +describe("Zig Tree-sitter Parser", () => { + it("should inspect tree structure", async () => { + await inspectTreeStructure(sampleZig, "zig") + }) + + it("should parse source code definitions", async () => { + const result = await testParseSourceCodeDefinitions("file.zig", sampleZig, { + language: "zig", + wasmFile: "tree-sitter-zig.wasm", + queryString: zigQuery, + extKey: "zig", + }) + expect(result).toBeDefined() + }) +}) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.c-sharp.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.c-sharp.test.ts new file mode 100644 index 00000000000..52facd4c4cd --- /dev/null +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.c-sharp.test.ts @@ -0,0 +1,112 @@ +/* +TODO: The following structures can be parsed by tree-sitter but lack query support: + +1. Using Directives: + (using_directive) - Can be parsed by tree-sitter but not appearing in output despite query pattern +*/ + +import { describe, expect, it, jest, beforeEach } from "@jest/globals" +import { csharpQuery } from "../queries" +import { testParseSourceCodeDefinitions } from "./helpers" +import sampleCSharpContent from "./fixtures/sample-c-sharp" + +// C# test options +const csharpOptions = { + language: "c_sharp", + wasmFile: "tree-sitter-c_sharp.wasm", + queryString: csharpQuery, + extKey: "cs", +} + +// Mock file system operations +jest.mock("fs/promises") + +// Mock loadRequiredLanguageParsers +jest.mock("../languageParser", () => ({ + loadRequiredLanguageParsers: jest.fn(), +})) + +// Mock fileExistsAtPath to return true for our test paths +jest.mock("../../../utils/fs", () => ({ + fileExistsAtPath: jest.fn().mockImplementation(() => Promise.resolve(true)), +})) + +describe("parseSourceCodeDefinitionsForFile with C#", () => { + let parseResult: string | undefined + + beforeAll(async () => { + // Cache parse result for all tests + const result = await testParseSourceCodeDefinitions("/test/file.cs", sampleCSharpContent, csharpOptions) + if (!result) { + throw new Error("Failed to parse C# source code definitions") + } + parseResult = result + }) + + beforeEach(() => { + jest.clearAllMocks() + expect(parseResult).toBeDefined() + }) + + it("should parse namespace declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*namespace TestNamespaceDefinition/) + }) + + it("should parse file-scoped namespace declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*namespace TestFileScopedNamespaceDefinition/) + }) + + it("should parse class declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*public class TestClassDefinition/) + }) + + it("should parse interface declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*public interface ITestInterfaceDefinition/) + }) + + it("should parse enum declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*public enum TestEnumDefinition/) + }) + + it("should parse method declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*void TestInterfaceMethod/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*public async Task TestAsyncMethodDefinition/) + }) + + it("should parse property declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*public string TestPropertyDefinition/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*public required string TestRequiredProperty/) + }) + + it("should parse event declarations", () => { + expect(parseResult).toMatch( + /\d+--\d+ \|\s*public event EventHandler TestEventDefinition/, + ) + }) + + it("should parse delegate declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*public delegate void TestDelegateDefinition/) + }) + + it("should parse struct declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*public struct TestStructDefinition/) + }) + + it("should parse record declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*public record TestRecordDefinition/) + }) + + it("should parse attribute declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*\[AttributeUsage/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*\[TestAttributeDefinition/) + }) + + it("should parse generic type parameters", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*public class TestGenericClassDefinition/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*public T TestGenericMethodDefinition/) + }) + + it("should parse LINQ expressions", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*var result = from num in _numbers/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.c.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.c.test.ts new file mode 100644 index 00000000000..020625d5c3e --- /dev/null +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.c.test.ts @@ -0,0 +1,114 @@ +import { describe, it, beforeAll } from "@jest/globals" +import { testParseSourceCodeDefinitions } from "./helpers" +import { cQuery } from "../queries" +import sampleCContent from "./fixtures/sample-c" + +describe("C Source Code Definition Tests", () => { + let parseResult: string + + beforeAll(async () => { + const result = await testParseSourceCodeDefinitions("test.c", sampleCContent, { + language: "c", + wasmFile: "tree-sitter-c.wasm", + queryString: cQuery, + extKey: "c", + }) + if (!result || !result.match(/\d+--\d+ \|/)) { + throw new Error("Failed to parse C tree structure") + } + parseResult = result + }) + + it("should parse function declarations and definitions", () => { + // Regular function declarations + expect(parseResult).toMatch(/\d+--\d+ \|\s*void multiline_prototype\(/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*void void_param_prototype\(/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*void function_pointer_prototype\(/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*int variadic_prototype\(/) + + // Function definitions + expect(parseResult).toMatch(/\d+--\d+ \|\s*int basic_multitype_function\(/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*void array_param_function\(/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*void pointer_param_function\(/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*int variadic_impl_function\(/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*void test_pointer_function\(/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*int test_variadic_function\(/) + }) + + it("should parse struct definitions", () => { + // Regular structs + expect(parseResult).toMatch(/\d+--\d+ \|\s*struct nested_struct \{/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*struct bitfield_struct \{/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*struct callback_struct \{/) + + // Special struct types + expect(parseResult).toMatch(/\d+--\d+ \|\s*struct anonymous_union_struct \{/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*struct aligned_struct \{/) + + // Global struct + expect(parseResult).toMatch(/\d+--\d+ \|\s*static struct config_struct \{/) + }) + + it("should parse union definitions", () => { + // Regular unions + expect(parseResult).toMatch(/\d+--\d+ \|\s*union multitype_data_union \{/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*union bitfield_union \{/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*union basic_types_struct \{/) + + // Anonymous union in struct + expect(parseResult).toMatch(/\d+--\d+ \|\s*struct anonymous_union_struct \{/) + }) + + it("should parse enum definitions", () => { + // Sequential value enums + expect(parseResult).toMatch(/\d+--\d+ \|\s*enum sequential_value_enum \{/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*enum TestBasicEnum \{/) + + // Explicit value enums + expect(parseResult).toMatch(/\d+--\d+ \|\s*enum explicit_value_enum \{/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*enum TestValuedEnum \{/) + + // Mixed value enums + expect(parseResult).toMatch(/\d+--\d+ \|\s*enum mixed_value_enum \{/) + }) + + it("should parse typedef declarations", () => { + // Anonymous struct typedefs + expect(parseResult).toMatch(/\d+--\d+ \|\s*typedef struct \{/) + + // Basic type typedefs + expect(parseResult).toMatch(/\d+--\d+ \|\s*typedef unsigned long long timestamp_typedef/) + + // Function pointer typedef usage + expect(parseResult).toMatch(/\d+--\d+ \|\s*extern TEST_COMPARE_FUNC test_get_comparator/) + }) + + it("should parse preprocessor definitions", () => { + // Object-like macros + expect(parseResult).toMatch(/\d+--\d+ \|\s*#define MAX_SIZE 1024/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*#define TEST_OS "windows"/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*#define TEST_OS "unix"/) + + // Function-like macros + expect(parseResult).toMatch(/\d+--\d+ \|\s*#define TEST_MIN\(a,b\)/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*#define TEST_MAX\(a,b\)/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*#define TEST_DEBUG_LOG\(level, msg, \.\.\.\)/) + + // Conditional compilation + expect(parseResult).toMatch(/\d+--\d+ \|\s*#ifdef _WIN32/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*#if TEST_DEBUG_LEVEL >= 2/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*#ifdef TEST_ENABLE_LOGGING/) + }) + + it("should parse global variable declarations", () => { + // Basic global variables + expect(parseResult).toMatch(/\d+--\d+ \|\s*static const int MAGIC_NUMBER =/) + + // Array variables + expect(parseResult).toMatch(/\d+--\d+ \|\s*static const char\* const BUILD_INFO\[\]/) + + // Struct variables + expect(parseResult).toMatch(/\d+--\d+ \|\s*static struct config_struct/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*\} DEFAULT_CONFIG =/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts index 43c03a1ea53..15811c55ead 100644 --- a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.cpp.test.ts @@ -1,777 +1,112 @@ -import { describe, expect, it, jest, beforeEach } from "@jest/globals" - -import { cppQuery } from "../queries" -import { testParseSourceCodeDefinitions } from "./helpers" - -// Sample C++ content for tests covering all supported structures: -// - struct declarations -// - union declarations -// - function declarations -// - method declarations (with namespace scope) -// - typedef declarations -// - class declarations -// - enum declarations (including enum class) -// - namespace declarations (including nested namespaces) -// - template declarations (including specializations and variadic templates) -// - macro definitions -// - constructor declarations -// - destructor declarations -// - operator overloading -// - static member declarations -// - friend declarations -// - using declarations and directives -// - alias declarations (using) -// - constexpr functions and variables -// - lambda expressions -// - attributes -// - inheritance relationships -// - static variables -// - virtual functions -// - auto type deduction -// - concepts (C++20) -// - inline functions and variables -// - nested namespaces (C++17) -// - structured bindings (C++17) -// - noexcept specifier -// - default parameters -// - variadic templates -// - explicit template instantiation -const sampleCppContent = ` -// Basic struct declaration -struct Point { - double x; - double y; - - // Method within struct - double distanceFromOrigin() const { - return std::sqrt(x*x + y*y); - } -}; - -// Union declaration -union IntOrFloat { - int int_value; - float float_value; - - // Constructor for union - IntOrFloat() : int_value(0) {} -}; - -// Typedef declaration -typedef unsigned int uint; -typedef long double extended_precision; -typedef void (*FunctionPointer)(int, double); -typedef int IntArray[10]; - -// Class declaration -class Rectangle { -private: - double width; - double height; - -public: - // Constructor - Rectangle(double w, double h) : width(w), height(h) {} - - // Destructor - ~Rectangle() { - // Cleanup code here - width = 0; - height = 0; - } - - // Method declaration - double area() const { - return width * height; - } - - // Static member declaration - static Rectangle createSquare(double size) { - return Rectangle(size, size); - } - - // Operator overloading - bool operator==(const Rectangle& other) const { - return width == other.width && - height == other.height; - } - - // Friend declaration - friend std::ostream& operator<<(std::ostream& os, const Rectangle& rect); -}; - -// Standalone function declaration -double calculateDistance(const Point& p1, const Point& p2) { - double dx = p2.x - p1.x; - double dy = p2.y - p1.y; - return std::sqrt(dx * dx + dy * dy); -} - -// Namespace declaration -namespace geometry { - // Class in namespace - class Circle { - private: - double radius; - Point center; - - public: - Circle(double r, const Point& c) : radius(r), center(c) {} - - double area() const { - return 3.14159 * radius * radius; - } - - double circumference() const { - return 2 * 3.14159 * radius; - } - - // Virtual method - virtual void scale(double factor) { - radius *= factor; - } - }; - - // Function in namespace - double distanceFromOrigin(const Point& p) { - Point origin = {0.0, 0.0}; - return calculateDistance(origin, p); - } - - // Inline function - inline double square(double x) { - return x * x; - } - - // Inline variable (C++17) - inline constexpr double PI = 3.14159265358979323846; -} - -// Method declaration with namespace scope -double geometry::Circle::getRadius() const { - return radius; -} - -// Enum declaration -enum Color { - RED, - GREEN, - BLUE, - YELLOW -}; - -// Enum class (scoped enum) -enum class Direction { - NORTH, - SOUTH, - EAST, - WEST -}; - -// Template class declaration -template -class Container { -private: - T data; - -public: - Container(T value) : data(value) {} - - T getValue() const { - return data; - } - - void setValue(T value) { - data = value; - } -}; - -// Template function declaration -template -T max(T a, T b) { - return (a > b) ? a : b; -} - -// Using declaration -using std::string; -using std::vector; -using std::cout; -using std::endl; - -// Using directive -using namespace std; -using namespace geometry; -using namespace std::chrono; -using namespace std::literals; - -// Alias declaration (using) -using IntVector = std::vector; -using StringMap = std::map; -using IntFunction = int (*)(int, int); -using ComplexNumber = std::complex; - -// Constexpr function -constexpr int factorial(int n) { - return n <= 1 ? 1 : (n * factorial(n - 1)); -} - -// Constexpr variable -constexpr double PI = 3.14159265358979323846; -constexpr int MAX_BUFFER_SIZE = 1024; -constexpr char SEPARATOR = ';'; -constexpr bool DEBUG_MODE = true; - -// Lambda expression -auto multiplyBy = [](int x) { - return [x](int y) { - return x * y; - }; -}; - -// Lambda with capture -auto counter = [count = 0]() mutable { - return ++count; -}; - -// Attribute -[[nodiscard]] int importantFunction() { - return 42; -} - -// Multiple attributes -[[nodiscard, deprecated("Use newFunction instead")]] -int oldFunction() { - return 100; -} - -// Macro definition -#define SQUARE(x) ((x) * (x)) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define CONCAT(a, b) a##b -#define STR(x) #x - -// Inheritance -class Shape { -public: - virtual double area() const = 0; - virtual double perimeter() const = 0; - virtual ~Shape() {} - - // Static method in base class - static void printInfo() { - std::cout << "This is a shape." << std::endl; - } -}; - -class Square : public Shape { -private: - double side; - -public: - Square(double s) : side(s) {} - - double area() const override { - return side * side; - } - - double perimeter() const override { - return 4 * side; - } -}; - -// Multiple inheritance -class ColoredShape : public Shape { -protected: - Color color; - -public: - ColoredShape(Color c) : color(c) {} - - Color getColor() const { - return color; - } - - // Pure virtual method - virtual void render() const = 0; -}; - -class ColoredSquare : public Square, public ColoredShape { -public: - ColoredSquare(double s, Color c) : Square(s), ColoredShape(c) {} - - // Using declaration in class - using Square::area; - - void render() const override { - // Implementation here - std::cout << "Rendering colored square" << std::endl; - } -}; - -// Operator overloading as a non-member function -std::ostream& operator<<(std::ostream& os, const Rectangle& rect) { - os << "Rectangle(" << rect.width << ", " << rect.height << ")"; - return os; -} - -// Noexcept specifier -void safeFunction() noexcept { - // This function won't throw exceptions - int a = 5; - int b = 10; - int c = a + b; -} - -// Function with default parameters -void setValues(int a = 0, int b = 0, int c = 0) { - // Function with default parameters - int sum = a + b + c; - std::cout << "Sum: " << sum << std::endl; -} - -// Function with variadic templates -template -void printAll(Args... args) { - (std::cout << ... << args) << std::endl; -} - -// Variadic template with fold expressions (C++17) -template -auto sum(Args... args) { - return (... + args); -} - -// Structured binding (C++17) -void structuredBindingExample() { - std::pair person = {42, "John"}; - auto [id, name] = person; - - std::cout << "ID: " << id << ", Name: " << name << std::endl; -} - -// Auto type deduction -auto getNumber() { - return 42; -} - -auto getText() -> std::string { - return "Hello, World!"; -} - -// Inline namespace -inline namespace v1 { - void currentFunction() { - // Current version of the function - std::cout << "v1 implementation" << std::endl; - } -} - -// Nested namespace (C++17) -namespace graphics::rendering { - void render() { - // Rendering function - std::cout << "Rendering graphics" << std::endl; - } - - class Renderer { - public: - void draw() { - std::cout << "Drawing" << std::endl; - } - }; -} - -// Explicit template instantiation -template class Container; -template class Container; -template class Container; -template double max(double, double); - -// Static variable -static int globalCounter = 0; -static std::string appName = "CppApp"; -static const int VERSION_MAJOR = 1; -static const int VERSION_MINOR = 0; - -// Virtual inheritance to solve diamond problem -class Animal { -public: - virtual void speak() const { - std::cout << "Animal speaks" << std::endl; - } -}; - -class Mammal : virtual public Animal { -public: - void speak() const override { - std::cout << "Mammal speaks" << std::endl; - } -}; - -class Bird : virtual public Animal { -public: - void speak() const override { - std::cout << "Bird speaks" << std::endl; - } -}; - -class Bat : public Mammal, public Bird { -public: - void speak() const override { - std::cout << "Bat speaks" << std::endl; - } -}; - -// Concepts (C++20) - commented out for compatibility /* -template -concept Numeric = std::is_arithmetic_v; - -template -T add(T a, T b) { - return a + b; -} -*/ +TODO: The following C++ structures can be parsed by tree-sitter but lack query support: -// Class template with non-type parameters -template -class Array { -private: - T data[Size]; - -public: - Array() { - for (int i = 0; i < Size; ++i) { - data[i] = T(); - } - } - - T& operator[](int index) { - return data[index]; - } - - int size() const { - return Size; - } -}; +1. Virtual Methods: + (field_declaration (virtual) type: (primitive_type) declarator: (function_declarator)) + Example: virtual void method() = 0; -// Template specialization -template<> -class Container { -private: - bool data; - -public: - Container(bool value) : data(value) {} - - bool getValue() const { - return data; - } - - void setValue(bool value) { - data = value; - } - - void toggle() { - data = !data; - } -}; +2. Default Methods: + (default_method_clause) + Example: virtual ~base_class_definition() = default; -// Function with trailing return type -auto multiply(int a, int b) -> int { - return a * b; -} +3. Field Initializer Lists: + (field_initializer_list (field_initializer)) + Example: constructor() : field1(value1), field2(value2) {} -// Class with explicit constructors and conversion operators -class Number { -private: - int value; - -public: - explicit Number(int v) : value(v) {} - - explicit operator int() const { - return value; - } - - int getValue() const { - return value; - } -}; -` +4. Base Class Clauses: + (base_class_clause (access_specifier) (type_identifier)) + Example: class derived : public base {} -// C++ test options -const cppOptions = { - language: "cpp", - wasmFile: "tree-sitter-cpp.wasm", - queryString: cppQuery, - extKey: "cpp", - content: sampleCppContent, -} +5. Type Aliases: + (alias_declaration name: (type_identifier) type: (type_descriptor)) + Example: using size_type = std::size_t; +*/ -// Mock file system operations -jest.mock("fs/promises") +import { describe, it, expect, beforeAll } from "@jest/globals" +import { testParseSourceCodeDefinitions } from "./helpers" +import { cppQuery } from "../queries" +import sampleCppContent from "./fixtures/sample-cpp" -// Mock loadRequiredLanguageParsers -jest.mock("../languageParser", () => ({ - loadRequiredLanguageParsers: jest.fn(), -})) +describe("parseSourceCodeDefinitions (C++)", () => { + const testOptions = { + language: "cpp", + wasmFile: "tree-sitter-cpp.wasm", + queryString: cppQuery, + extKey: "cpp", + } -// Mock fileExistsAtPath to return true for our test paths -jest.mock("../../../utils/fs", () => ({ - fileExistsAtPath: jest.fn().mockImplementation(() => Promise.resolve(true)), -})) + let parseResult: string -describe("parseSourceCodeDefinitionsForFile with C++", () => { - beforeEach(() => { - jest.clearAllMocks() + beforeAll(async () => { + const result = await testParseSourceCodeDefinitions("test.cpp", sampleCppContent, testOptions) + expect(result).toBeDefined() + expect(typeof result).toBe("string") + expect(result).toContain("# test.cpp") + parseResult = result as string }) - it("should parse C++ struct declarations", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - - // Check for struct declarations - expect(result).toContain("struct Point") + it("should parse function declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| void multiline_function_prototype\(/) + expect(parseResult).toMatch(/\d+--\d+ \| void function_with_implementation\(/) }) - it("should parse C++ union declarations", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - - // Check for union declarations - expect(result).toContain("union IntOrFloat") + it("should parse struct declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| struct four_field_struct/) }) - it("should parse C++ function declarations", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - - // Check for function declarations - expect(result).toContain("double calculateDistance") + it("should parse class declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| class base_class_definition/) + expect(parseResult).toMatch(/\d+--\d+ \| class template_class_definition/) }) - it("should parse C++ class declarations", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - - // Check for class declarations - expect(result).toContain("class Rectangle") + it("should parse union declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| union four_member_union/) }) - it("should correctly identify structs, unions, and functions", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - - // Verify that structs, unions, and functions are being identified - const resultLines = result?.split("\n") || [] - - // Check that struct Point is found - const pointStructLine = resultLines.find((line) => line.includes("struct Point")) - expect(pointStructLine).toBeTruthy() - - // Check that union IntOrFloat is found - const unionLine = resultLines.find((line) => line.includes("union IntOrFloat")) - expect(unionLine).toBeTruthy() - - // Check that function calculateDistance is found - const distanceFuncLine = resultLines.find((line) => line.includes("double calculateDistance")) - expect(distanceFuncLine).toBeTruthy() + it("should parse enum declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| enum class scoped_enumeration/) }) - it("should parse all basic C++ structures", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Verify all struct declarations are captured - expect(resultLines.some((line) => line.includes("struct Point"))).toBe(true) - - // Verify union declarations are captured - expect(resultLines.some((line) => line.includes("union IntOrFloat"))).toBe(true) - // Verify typedef declarations are captured - not supported by current parser - // expect(resultLines.some((line) => line.includes("typedef unsigned int uint"))).toBe(true) - - // Verify class declarations are captured - expect(resultLines.some((line) => line.includes("class Rectangle"))).toBe(true) - - // Verify function declarations are captured - expect(resultLines.some((line) => line.includes("double calculateDistance"))).toBe(true) - - // Verify the output format includes line numbers - expect(resultLines.some((line) => /\d+--\d+ \|/.test(line))).toBe(true) - - // Verify the output includes the file name - expect(result).toContain("# file.cpp") + it("should parse typedef declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| typedef std::vector { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test enum declarations - expect(resultLines.some((line) => line.includes("enum Color"))).toBe(true) - expect(resultLines.some((line) => line.includes("enum class Direction"))).toBe(true) - - // Test namespace declarations - expect(resultLines.some((line) => line.includes("namespace geometry"))).toBe(true) + it("should parse namespace declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| namespace deeply_nested_namespace/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*namespace inner/) }) - it("should parse C++ templates", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test template class declarations - checking for template and class separately - expect(resultLines.some((line) => line.includes("template"))).toBe(true) - expect(resultLines.some((line) => line.includes("class Container"))).toBe(true) - - // Test template function declarations - not fully supported by current parser - // expect(resultLines.some((line) => line.includes("template") && line.includes("T max"))).toBe(true) - // Test template specialization - not supported by current parser - // expect(resultLines.some((line) => line.includes("template<>") && line.includes("class Container"))).toBe(true) - - // Test explicit template instantiation - not supported by current parser - // expect(resultLines.some((line) => line.includes("template class Container"))).toBe(true) + it("should parse template declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| template { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - // Test constructor declarations - not supported by current parser - // expect(resultLines.some((line) => line.includes("Rectangle(double w, double h)"))).toBe(true) - - // Test destructor declarations - not supported by current parser - // expect(resultLines.some((line) => line.includes("~Rectangle()"))).toBe(true) - expect(resultLines.some((line) => line.includes("~Rectangle()"))).toBe(true) - - // Test operator overloading - expect(resultLines.some((line) => line.includes("operator=="))).toBe(true) - // Test static member declarations - not supported by current parser - // expect(resultLines.some((line) => line.includes("static Rectangle createSquare"))).toBe(true) - - // Test friend declarations - not supported by current parser - // expect(resultLines.some((line) => line.includes("friend std::ostream& operator<<"))).toBe(true) - }) - - it("should parse C++ using declarations and aliases", async () => { - // const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - // const resultLines = result?.split("\n") || [] - // Test using declarations - not supported by current parser - // expect(resultLines.some((line) => line.includes("using std::string"))).toBe(true) - // Test using directives - not supported by current parser - // expect(resultLines.some((line) => line.includes("using namespace std"))).toBe(true) - // Test alias declarations - not supported by current parser - // expect(resultLines.some((line) => line.includes("using IntVector = std::vector"))).toBe(true) - }) - - it("should parse C++ constexpr and lambda expressions", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test constexpr functions - not supported by current parser - // expect(resultLines.some((line) => line.includes("constexpr int factorial"))).toBe(true) - - // Test constexpr variables - not supported by current parser - // expect(resultLines.some((line) => line.includes("constexpr double PI"))).toBe(true) - - // Test lambda expressions - expect(resultLines.some((line) => line.includes("auto multiplyBy") || line.includes("lambda_expression"))).toBe( - true, - ) - }) - - it("should parse C++ attributes and macros", async () => { - // const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - // const resultLines = result?.split("\n") || [] - // Test attributes - not supported by current parser - // expect(resultLines.some((line) => line.includes("[[nodiscard]]") || line.includes("attribute_declaration"))).toBe(true) - // Test macro definitions - not supported by current parser - // expect(resultLines.some((line) => line.includes("#define SQUARE"))).toBe(true) - }) - - it("should parse C++ inheritance", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test inheritance - expect(resultLines.some((line) => line.includes("class Square : public Shape"))).toBe(true) - expect( - resultLines.some((line) => line.includes("class ColoredSquare : public Square, public ColoredShape")), - ).toBe(true) - }) - - it("should parse C++ virtual functions", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test virtual functions - checking for virtual keyword - expect(resultLines.some((line) => line.includes("virtual"))).toBe(true) + it("should parse macro definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| #define MULTI_LINE_MACRO\(x, y\)/) }) - it("should parse C++ auto type deduction", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test auto type deduction - checking for auto keyword - expect(resultLines.some((line) => line.includes("auto"))).toBe(true) + it("should parse variable declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| static const std::map { - // const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - // const resultLines = result?.split("\n") || [] - // Test inline functions - not supported by current parser - // expect(resultLines.some((line) => line.includes("inline double square"))).toBe(true) - // Test inline variables - not supported by current parser - // expect(resultLines.some((line) => line.includes("inline constexpr double PI"))).toBe(true) + it("should parse constructor declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*constructor_test\(/) }) - it("should parse C++17 features", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test nested namespaces (C++17) - expect(resultLines.some((line) => line.includes("namespace graphics::rendering"))).toBe(true) - - // Test structured bindings (C++17) - not supported by current parser - // expect(resultLines.some((line) => line.includes("auto [id, name] = person"))).toBe(true) - - // Test variadic templates with fold expressions (C++17) - not supported by current parser - // expect(resultLines.some((line) => line.includes("template") && line.includes("auto sum"))).toBe(true) + it("should parse destructor declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*~destructor_test\(\)/) }) - it("should parse C++ functions with special specifiers", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test noexcept specifier - expect(resultLines.some((line) => line.includes("void safeFunction() noexcept"))).toBe(true) - - // Test functions with default parameters - expect(resultLines.some((line) => line.includes("void setValues(int a = 0, int b = 0, int c = 0)"))).toBe(true) - - // Test functions with trailing return type - not supported by current parser - // expect(resultLines.some((line) => line.includes("auto multiply(int a, int b) -> int"))).toBe(true) + it("should parse operator overloads", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*bool operator==/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*bool operator { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test explicit constructors - not supported by current parser - // expect(resultLines.some((line) => line.includes("explicit Number(int v)"))).toBe(true) - - // Test conversion operators - not supported by current parser - // expect(resultLines.some((line) => line.includes("explicit operator int()"))).toBe(true) - - // Test virtual inheritance - expect(resultLines.some((line) => line.includes("class Mammal : virtual public Animal"))).toBe(true) + it("should parse friend declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*friend class friend_class;/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*friend void friend_function\(/) }) - it("should parse C++ template variations", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.cpp", sampleCppContent, cppOptions) - const resultLines = result?.split("\n") || [] - - // Test class template with non-type parameters - checking for template and class separately - expect( - resultLines.some((line) => line.includes("template") || line.includes("template")), - ).toBe(true) - expect(resultLines.some((line) => line.includes("class Array"))).toBe(true) - - // Test variadic templates - not supported by current parser - // expect(resultLines.some((line) => line.includes("template") && line.includes("void printAll"))).toBe(true) + it("should parse using declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*using base_class_definition::virtual_method;/) }) }) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.css.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.css.test.ts new file mode 100644 index 00000000000..dc4857c57fa --- /dev/null +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.css.test.ts @@ -0,0 +1,71 @@ +import { describe, it, beforeAll, beforeEach } from "@jest/globals" +import { testParseSourceCodeDefinitions, debugLog } from "./helpers" +import { cssQuery } from "../queries" +import sampleCSSContent from "./fixtures/sample-css" + +describe("parseSourceCodeDefinitionsForFile with CSS", () => { + const testOptions = { + language: "css", + wasmFile: "tree-sitter-css.wasm", + queryString: cssQuery, + extKey: "css", + debug: true, + } + + let parseResult: string | undefined + + beforeAll(async () => { + // Cache parse result for all tests + parseResult = await testParseSourceCodeDefinitions("test.css", sampleCSSContent, testOptions) + if (!parseResult) { + throw new Error("No result returned from parser") + } + debugLog("CSS Parse Result:", parseResult) + }) + + beforeEach(() => { + jest.clearAllMocks() + }) + + it("should parse CSS variable declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*--test-variable-definition-primary:/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*--test-variable-definition-secondary:/) + debugLog("Variable declarations:", parseResult!.match(/--test-variable-definition-[\w-]+:[\s\S]*?;/g)) + }) + + it("should parse import statements", () => { + expect(parseResult).toMatch(/\d+--\d+ \| @import .+test-import-definition/) + debugLog("Import statements:", parseResult!.match(/@import[\s\S]*?;/g)) + }) + + it("should parse media queries", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*\.test-media-query-definition/) + debugLog("Media queries:", parseResult!.match(/@media[\s\S]*?{[\s\S]*?}/g)) + }) + + it("should parse keyframe declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| @keyframes test-keyframe-definition-fade/) + debugLog("Keyframe declarations:", parseResult!.match(/@keyframes[\s\S]*?{[\s\S]*?}/g)) + }) + + it("should parse function declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| {1,}background-color: rgba\(/) + expect(parseResult).toMatch(/\d+--\d+ \| {1,}transform: translate\(/) + debugLog("Function declarations:", parseResult!.match(/(?:rgba|translate|calc|var)\([\s\S]*?\)/g)) + }) + + it("should parse basic rulesets", () => { + expect(parseResult).toMatch(/\d+--\d+ \| \.test-ruleset-definition {/) + debugLog("Basic rulesets:", parseResult!.match(/\.test-ruleset-definition[\s\S]*?{[\s\S]*?}/g)) + }) + + it("should parse complex selectors", () => { + expect(parseResult).toMatch(/\d+--\d+ \| \.test-selector-definition[:\s>]/) + debugLog("Complex selectors:", parseResult!.match(/\.test-selector-definition[\s\S]*?{[\s\S]*?}/g)) + }) + + it("should parse nested rulesets", () => { + expect(parseResult).toMatch(/\d+--\d+ \| \.test-nested-ruleset-definition {/) + debugLog("Nested rulesets:", parseResult!.match(/\.test-nested-ruleset-definition[\s\S]*?{[\s\S]*?}/g)) + }) +}) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.elisp.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.elisp.test.ts new file mode 100644 index 00000000000..196d8383945 --- /dev/null +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.elisp.test.ts @@ -0,0 +1,67 @@ +/* +TODO: The following structures can be parsed by tree-sitter but lack query support: + +1. Variable Definition: + (defvar name value docstring) + +2. Constant Definition: + (defconst name value docstring) +*/ + +import { describe, it, expect } from "@jest/globals" +import { testParseSourceCodeDefinitions } from "./helpers" +import { elispQuery } from "../queries/elisp" +import sampleElispContent from "./fixtures/sample-elisp" + +describe("parseSourceCodeDefinitions.elisp", () => { + const testOptions = { + language: "elisp", + wasmFile: "tree-sitter-elisp.wasm", + queryString: elispQuery, + extKey: "el", + } + + let parseResult: string = "" + + beforeAll(async () => { + const result = await testParseSourceCodeDefinitions("file.el", sampleElispContent, testOptions) + expect(result).toBeDefined() + if (!result) { + throw new Error("Failed to parse source code definitions") + } + parseResult = result + }) + + it("should parse function definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| \(defun test-function/) + }) + + it("should parse macro definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| \(defmacro test-macro/) + }) + + it("should parse custom form definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| \(defcustom test-custom/) + }) + + it("should parse face definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| \(defface test-face/) + }) + + it("should parse advice definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| \(defadvice test-advice/) + }) + + it("should parse group definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| \(defgroup test-group nil/) + }) + + it("should verify total number of definitions", () => { + const matches = parseResult.match(/\d+--\d+ \|/g) || [] + expect(matches.length).toBe(6) // All supported definition types + }) + + it("should verify file header is present", () => { + expect(parseResult).toMatch(/# file\.el/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.elixir.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.elixir.test.ts new file mode 100644 index 00000000000..d16dcb062af --- /dev/null +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.elixir.test.ts @@ -0,0 +1,90 @@ +import { describe, expect, it, jest, beforeAll, beforeEach } from "@jest/globals" +import { elixirQuery } from "../queries" +import { testParseSourceCodeDefinitions, debugLog } from "./helpers" +import sampleElixirContent from "./fixtures/sample-elixir" + +// Elixir test options +const elixirOptions = { + language: "elixir", + wasmFile: "tree-sitter-elixir.wasm", + queryString: elixirQuery, + extKey: "ex", +} + +// Mock file system operations +jest.mock("fs/promises") + +// Mock loadRequiredLanguageParsers +jest.mock("../languageParser", () => ({ + loadRequiredLanguageParsers: jest.fn(), +})) + +// Mock fileExistsAtPath to return true for our test paths +jest.mock("../../../utils/fs", () => ({ + fileExistsAtPath: jest.fn().mockImplementation(() => Promise.resolve(true)), +})) + +describe("parseSourceCodeDefinitionsForFile with Elixir", () => { + let parseResult: string = "" + + beforeAll(async () => { + // Cache parse result for all tests + parseResult = (await testParseSourceCodeDefinitions("/test/file.ex", sampleElixirContent, elixirOptions))! + debugLog("Elixir Parse Result:", parseResult) + }) + + beforeEach(() => { + jest.clearAllMocks() + }) + + it("should parse module definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| defmodule TestModuleDefinition do/) + expect(parseResult).toMatch(/\d+--\d+ \| defmodule TestBehaviourDefinition do/) + expect(parseResult).toMatch(/\d+--\d+ \| defmodule TestModuleDefinitionTest do/) + debugLog("Module definitions found:", parseResult.match(/defmodule[\s\S]*?end/g)) + }) + + it("should parse function definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| def test_function_definition/) + expect(parseResult).toMatch(/\d+--\d+ \| def test_pipeline_definition/) + expect(parseResult).toMatch(/\d+--\d+ \| def test_comprehension_definition/) + expect(parseResult).toMatch(/\d+--\d+ \| def test_sigil_definition/) + debugLog("Function definitions found:", parseResult.match(/def[\s\S]*?end/g)) + }) + + it("should parse macro definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| defmacro test_macro_definition/) + debugLog("Macro definitions found:", parseResult.match(/defmacro[\s\S]*?end/g)) + }) + + it("should parse protocol implementations", () => { + expect(parseResult).toMatch(/\d+--\d+ \| defimpl String\.Chars/) + debugLog("Protocol implementations found:", parseResult.match(/defimpl[\s\S]*?end/g)) + }) + + it("should parse behaviour callbacks", () => { + expect(parseResult).toMatch(/\d+--\d+ \| @callback test_behaviour_callback/) + debugLog("Behaviour callbacks found:", parseResult.match(/@callback[\s\S]*?\)/g)) + }) + + it("should parse struct definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| defstruct \[/) + debugLog("Struct definitions found:", parseResult.match(/defstruct[\s\S]*?\]/g)) + }) + + it("should parse guard definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| defguard test_guard_definition/) + debugLog("Guard definitions found:", parseResult.match(/defguard[\s\S]*?end/g)) + }) + + it("should parse module attributes", () => { + expect(parseResult).toMatch(/\d+--\d+ \| @test_attribute_definition/) + expect(parseResult).toMatch(/\d+--\d+ \| @moduledoc/) + debugLog("Module attributes found:", parseResult.match(/@[\s\S]*?\]/g)) + }) + + it("should parse test definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| test "test_definition"/) + debugLog("Test definitions found:", parseResult.match(/test[\s\S]*?end/g)) + }) +}) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.embedded_template.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.embedded_template.test.ts new file mode 100644 index 00000000000..523907923c9 --- /dev/null +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.embedded_template.test.ts @@ -0,0 +1,53 @@ +import { describe, it } from "@jest/globals" +import { debugLog, testParseSourceCodeDefinitions } from "./helpers" +import { embeddedTemplateQuery } from "../queries" +import sampleEmbeddedTemplateContent from "./fixtures/sample-embedded_template" + +describe("parseSourceCodeDefinitions (Embedded Template)", () => { + const testOptions = { + language: "embedded_template", + wasmFile: "tree-sitter-embedded_template.wasm", + queryString: embeddedTemplateQuery, + extKey: "erb", + minComponentLines: 4, + } + + let parseResult: string = "" + + beforeAll(async () => { + const result = await testParseSourceCodeDefinitions("test.erb", sampleEmbeddedTemplateContent, testOptions) + if (!result) { + throw new Error("Failed to parse source code definitions") + } + parseResult = result + debugLog("All definitions:", parseResult) + }) + + it("should detect multi-line comments", () => { + expect(parseResult).toMatch(/\d+--\d+ \| <%# Multi-line comment block explaining/) + }) + + it("should detect function definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| <% def complex_helper\(param1, param2\)/) + expect(parseResult).toMatch(/\d+--\d+ \| <% def render_navigation\(items\)/) + }) + + it("should detect class definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| <% class TemplateHelper/) + }) + + it("should detect module definitions", () => { + expect(parseResult).toMatch(/\d+--\d+ \| <% module TemplateUtils/) + }) + + it("should detect control structures", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s+<% if user\.authenticated\? %>/) + expect(parseResult).toMatch(/\d+--\d+ \|\s+<% user\.posts\.each do \|post\| %>/) + expect(parseResult).toMatch(/\d+--\d+ \|\s+<% if post\.has_comments\? %>/) + }) + + it("should detect content blocks", () => { + expect(parseResult).toMatch(/\d+--\d+ \| <% content_for :header do/) + expect(parseResult).toMatch(/\d+--\d+ \| <% content_for :main do/) + }) +}) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts index 137809626d8..57fc8041353 100644 --- a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.go.test.ts @@ -1,391 +1,96 @@ -import { describe, expect, it, jest, beforeEach } from "@jest/globals" - -import { goQuery } from "../queries" +/* +TODO: The following structures can be parsed by tree-sitter but lack query support: + +1. Anonymous Functions (func_literal): + (func_literal parameters: (parameter_list) body: (block ...)) + - Currently visible in goroutine and defer statements + - Would enable capturing lambda/closure definitions + +2. Map Types (map_type): + (map_type key: (type_identifier) value: (interface_type)) + - Currently visible in struct field declarations + - Would enable capturing map type definitions + +3. Pointer Types (pointer_type): + (pointer_type (type_identifier)) + - Currently visible in method receiver declarations + - Would enable capturing pointer type definitions +*/ + +import { describe, it, expect, beforeAll } from "@jest/globals" +import sampleGoContent from "./fixtures/sample-go" import { testParseSourceCodeDefinitions } from "./helpers" - -// Sample Go content for tests covering all supported structures: -// - function declarations (with associated comments) -// - method declarations (with associated comments) -// - type specifications -// - struct definitions -// - interface definitions -// - constant declarations -// - variable declarations -// - type aliases -// - embedded structs -// - embedded interfaces -// - init functions -// - anonymous functions -// - generic types (Go 1.18+) -// - package-level variables -// - multiple constants in a single block -// - multiple variables in a single block -const sampleGoContent = ` -package main - -import ( - "fmt" - "math" - "strings" -) - -// Basic struct definition -// This is a simple Point struct -type Point struct { - X float64 - Y float64 -} - -// Method for Point struct -// Calculates the distance from the origin -func (p Point) DistanceFromOrigin() float64 { - return math.Sqrt(p.X*p.X + p.Y*p.Y) -} - -// Another method for Point struct -// Moves the point by the given deltas -func (p *Point) Move(dx, dy float64) { - p.X += dx - p.Y += dy -} - -// Basic interface definition -// Defines a shape with area and perimeter methods -type Shape interface { - Area() float64 - Perimeter() float64 -} - -// Rectangle struct implementing Shape interface -type Rectangle struct { - Width float64 - Height float64 -} - -// Area method for Rectangle -func (r Rectangle) Area() float64 { - return r.Width * r.Height -} - -// Perimeter method for Rectangle -func (r Rectangle) Perimeter() float64 { - return 2 * (r.Width + r.Height) -} - -// Circle struct implementing Shape interface -type Circle struct { - Radius float64 -} - -// Area method for Circle -func (c Circle) Area() float64 { - return math.Pi * c.Radius * c.Radius -} - -// Perimeter method for Circle -func (c Circle) Perimeter() float64 { - return 2 * math.Pi * c.Radius -} - -// Constants declaration -const ( - Pi = 3.14159 - MaxItems = 100 - DefaultName = "Unknown" -) - -// Single constant declaration -const AppVersion = "1.0.0" - -// Variables declaration -var ( - MaxConnections = 1000 - Timeout = 30 - IsDebug = false -) - -// Single variable declaration -var GlobalCounter int = 0 - -// Type alias -type Distance float64 - -// Function with multiple parameters -func CalculateDistance(p1, p2 Point) Distance { - dx := p2.X - p1.X - dy := p2.Y - p1.Y - return Distance(math.Sqrt(dx*dx + dy*dy)) -} - -// Function with a comment -// This function formats a name -func FormatName(first, last string) string { - return fmt.Sprintf("%s, %s", last, first) -} - -// Struct with embedded struct -type Employee struct { - Person // Embedded struct - JobTitle string - Salary float64 -} - -// Person struct to be embedded -type Person struct { - FirstName string - LastName string - Age int -} - -// Interface with embedded interface -type ReadWriter interface { - Reader // Embedded interface - Writer // Embedded interface - ReadAndWrite() bool -} - -// Reader interface to be embedded -type Reader interface { - Read() []byte -} - -// Writer interface to be embedded -type Writer interface { - Write(data []byte) int -} - -// Init function -func init() { - fmt.Println("Initializing package...") - GlobalCounter = 1 -} - -// Function that returns an anonymous function -func CreateCounter() func() int { - count := 0 - - // Anonymous function - return func() int { - count++ - return count - } -} - -// Generic type (Go 1.18+) -type Stack[T any] struct { - items []T -} - -// Generic method for Stack -func (s *Stack[T]) Push(item T) { - s.items = append(s.items, item) -} - -// Generic method for Stack -func (s *Stack[T]) Pop() (T, bool) { - var zero T - if len(s.items) == 0 { - return zero, false - } - - item := s.items[len(s.items)-1] - s.items = s.items[:len(s.items)-1] - return item, true -} - -// Generic function (Go 1.18+) -func Map[T, U any](items []T, f func(T) U) []U { - result := make([]U, len(items)) - for i, item := range items { - result[i] = f(item) - } - return result -} - -// Function that uses an anonymous function -func ProcessItems(items []string) []string { - return Map(items, func(s string) string { - return strings.ToUpper(s) - }) -} - -// Main function -func main() { - fmt.Println("Hello, World!") - - // Using structs - p := Point{X: 3, Y: 4} - fmt.Printf("Distance from origin: %f\n", p.DistanceFromOrigin()) - - // Using interfaces - var shapes []Shape = []Shape{ - Rectangle{Width: 5, Height: 10}, - Circle{Radius: 7}, - } - - for _, shape := range shapes { - fmt.Printf("Area: %f, Perimeter: %f\n", shape.Area(), shape.Perimeter()) - } - - // Using anonymous function - counter := CreateCounter() - fmt.Println(counter()) // 1 - fmt.Println(counter()) // 2 - - // Using generic types - stack := Stack[int]{} - stack.Push(1) - stack.Push(2) - stack.Push(3) - - if val, ok := stack.Pop(); ok { - fmt.Println(val) // 3 - } -} -` - -// Go test options -const goOptions = { - language: "go", - wasmFile: "tree-sitter-go.wasm", - queryString: goQuery, - extKey: "go", - content: sampleGoContent, -} - -// Mock file system operations -jest.mock("fs/promises") - -// Mock loadRequiredLanguageParsers -jest.mock("../languageParser", () => ({ - loadRequiredLanguageParsers: jest.fn(), -})) - -// Mock fileExistsAtPath to return true for our test paths -jest.mock("../../../utils/fs", () => ({ - fileExistsAtPath: jest.fn().mockImplementation(() => Promise.resolve(true)), -})) - -describe("parseSourceCodeDefinitionsForFile with Go", () => { - beforeEach(() => { - jest.clearAllMocks() +import goQuery from "../queries/go" + +describe("Go Source Code Definition Tests", () => { + let parseResult: string + + beforeAll(async () => { + const testOptions = { + language: "go", + wasmFile: "tree-sitter-go.wasm", + queryString: goQuery, + extKey: "go", + } + + const result = await testParseSourceCodeDefinitions("file.go", sampleGoContent, testOptions) + expect(result).toBeDefined() + parseResult = result as string }) - it("should parse Go struct definitions", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - - // Check for struct definitions - we only check for the ones that are actually captured - expect(result).toContain("type Point struct") - expect(result).toContain("type Rectangle struct") - // Note: Some structs might not be captured due to Tree-Sitter parser limitations + it("should parse package declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*package main/) }) - it("should parse Go method declarations", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - - // Check for method declarations - we only check for the ones that are actually captured - expect(result).toContain("func (p *Point) Move") - // Note: Some methods might not be captured due to Tree-Sitter parser limitations + it("should parse import declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*"fmt"/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*"sync"/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*"time"/) }) - it("should parse Go function declarations", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - - // Check for function declarations - we only check for the ones that are actually captured - expect(result).toContain("func CalculateDistance") - expect(result).toContain("func CreateCounter") - // Note: Some functions might not be captured due to Tree-Sitter parser limitations + it("should parse const declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*TestConstDefinition1 = "test1"/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*TestConstDefinition2 = "test2"/) }) - it("should parse Go interface definitions", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - - // Check for interface definitions - we only check for the ones that are actually captured - expect(result).toContain("type Shape interface") - expect(result).toContain("type ReadWriter interface") - // Note: Some interfaces might not be captured due to Tree-Sitter parser limitations + it("should parse var declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*TestVarDefinition1 string = "var1"/) + expect(parseResult).toMatch(/\d+--\d+ \|\s*TestVarDefinition2 int\s*= 42/) }) - it("should parse Go constant and variable declarations", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] - - // Check for constant and variable groups - expect(resultLines.some((line) => line.includes("const ("))).toBe(true) - expect(resultLines.some((line) => line.includes("var ("))).toBe(true) - // Note: Individual constants/variables might not be captured due to Tree-Sitter parser limitations + it("should parse interface declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*type TestInterfaceDefinition interface/) }) - it("should parse Go type aliases", async () => { - await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - - // Note: Type aliases might not be captured due to Tree-Sitter parser limitations - // This test is kept for completeness - expect(true).toBe(true) + it("should parse struct declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*type TestStructDefinition struct/) }) - it("should parse Go embedded structs and interfaces", async () => { - await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - // Note: Embedded structs and interfaces might not be captured due to Tree-Sitter parser limitations - // This test is kept for completeness - expect(true).toBe(true) + it("should parse type declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*type TestTypeDefinition struct/) }) - it("should parse Go init functions", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - - // Check for init functions - expect(result).toContain("func init") + it("should parse function declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*func TestFunctionDefinition\(/) }) - it("should parse Go anonymous functions", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] - - // Check for anonymous functions - we look for the return statement that contains the anonymous function - expect(resultLines.some((line) => line.includes("return func"))).toBe(true) + it("should parse method declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*func \(t \*TestStructDefinition\) TestMethodDefinition\(/) }) - it("should parse Go generic types and functions", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] - - // Check for generic functions - we only check for the ones that are actually captured - expect(resultLines.some((line) => line.includes("func Map[T, U any]"))).toBe(true) - expect(resultLines.some((line) => line.includes("func (s *Stack[T])"))).toBe(true) - // Note: Generic types might not be captured due to Tree-Sitter parser limitations + it("should parse channel function declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*func TestChannelDefinition\(/) }) - it("should handle all Go language constructs comprehensively", async () => { - const result = await testParseSourceCodeDefinitions("/test/file.go", sampleGoContent, goOptions) - const resultLines = result?.split("\n") || [] - - // Verify struct definitions are captured - expect(resultLines.some((line) => line.includes("type Point struct"))).toBe(true) - expect(resultLines.some((line) => line.includes("type Rectangle struct"))).toBe(true) - expect(resultLines.some((line) => line.includes("type Employee struct"))).toBe(true) - expect(resultLines.some((line) => line.includes("type Person struct"))).toBe(true) - - // Verify interface definitions are captured - expect(resultLines.some((line) => line.includes("type Shape interface"))).toBe(true) - expect(resultLines.some((line) => line.includes("type ReadWriter interface"))).toBe(true) - - // Verify method declarations are captured - expect(resultLines.some((line) => line.includes("func (p *Point) Move"))).toBe(true) - - // Verify function declarations are captured - expect(resultLines.some((line) => line.includes("func CalculateDistance"))).toBe(true) - expect(resultLines.some((line) => line.includes("func CreateCounter"))).toBe(true) - expect(resultLines.some((line) => line.includes("func init"))).toBe(true) - - // Verify constant and variable groups are captured - expect(resultLines.some((line) => line.includes("const ("))).toBe(true) - expect(resultLines.some((line) => line.includes("var ("))).toBe(true) + it("should parse goroutine function declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*func TestGoroutineDefinition\(\)/) + }) - // Verify the output format includes line numbers - expect(resultLines.some((line) => /\d+--\d+ \|/.test(line))).toBe(true) + it("should parse defer function declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*func TestDeferDefinition\(\)/) + }) - // Verify the output includes the file name - expect(result).toContain("# file.go") + it("should parse select function declarations", () => { + expect(parseResult).toMatch(/\d+--\d+ \|\s*func TestSelectDefinition\(/) }) }) diff --git a/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.html.test.ts b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.html.test.ts new file mode 100644 index 00000000000..1ac6d55024d --- /dev/null +++ b/src/services/tree-sitter/__tests__/parseSourceCodeDefinitions.html.test.ts @@ -0,0 +1,70 @@ +import { describe, it, expect } from "@jest/globals" +import { sampleHtmlContent } from "./fixtures/sample-html" +import { htmlQuery } from "../queries" +import { testParseSourceCodeDefinitions } from "./helpers" + +describe("HTML Source Code Definition Tests", () => { + let parseResult: string + + beforeAll(async () => { + const testOptions = { + language: "html", + wasmFile: "tree-sitter-html.wasm", + queryString: htmlQuery, + extKey: "html", + } + const result = await testParseSourceCodeDefinitions("test.html", sampleHtmlContent, testOptions) + if (!result) { + throw new Error("Failed to parse HTML content") + } + parseResult = result + }) + + it("should parse doctype definition", () => { + expect(parseResult).toMatch(/1--1 \|\s*/) + }) + + it("should parse document definition", () => { + expect(parseResult).toMatch(/2--2 \|\s*/) + }) + + it("should parse element definition", () => { + expect(parseResult).toMatch(/17--17 \|\s*
{ + expect(parseResult).toMatch(/32--32 \|\s*