Skip to content

Commit 0cfc095

Browse files
committed
Merge remote-tracking branch 'origin/main' into aws-profile-support
2 parents 7f0550a + 0a32e24 commit 0cfc095

File tree

80 files changed

+6199
-1727
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+6199
-1727
lines changed

.git-blame-ignore-revs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
# Ran Prettier on all files - https://github.com/RooVetGit/Roo-Cline/pull/404
1+
# Ran Prettier on all files - https://github.com/RooVetGit/Roo-Code/pull/404
22
60a0a824b96a0b326af4d8871b6903f4ddcfe114
33
579bdd9dbf6d2d569e5e7adb5ff6292b1e42ea34

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
blank_issues_enabled: false
22
contact_links:
33
- name: Feature Request
4-
url: https://github.com/RooVetGit/Roo-Cline/discussions/categories/feature-requests
5-
about: Share and vote on feature requests for Roo Cline
4+
url: https://github.com/RooVetGit/Roo-Code/discussions/categories/feature-requests
5+
about: Share and vote on feature requests for Roo Code
66
- name: Leave a Review
77
url: https://marketplace.visualstudio.com/items?itemName=RooVeterinaryInc.roo-cline&ssr=false#review-details
8-
about: Enjoying Roo Cline? Leave a review here!
8+
about: Enjoying Roo Code? Leave a review here!

.github/workflows/code-qa.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Code QA Roo Cline
1+
name: Code QA Roo Code
22

33
on:
44
push:

CHANGELOG.md

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,44 @@
1-
# Roo Cline Changelog
1+
# Roo Code Changelog
2+
3+
## [3.2.8]
4+
5+
- Fixed bug opening custom modes settings JSON
6+
- Reverts provider key entry back to checking onInput instead of onChange to hopefully address issues entering API keys (thanks @samhvw8!)
7+
- Added explicit checkbox to use Azure for OpenAI compatible providers (thanks @samhvw8!)
8+
- Fixed Glama usage reporting (thanks @punkpeye!)
9+
- Added Llama 3.3 70B Instruct model to the AWS Bedrock provider options (thanks @Premshay!)
10+
11+
## [3.2.7]
12+
13+
- Fix bug creating new configuration profiles
14+
15+
## [3.2.6]
16+
17+
- Fix bug with role definition overrides for built-in modes
18+
19+
## [3.2.5]
20+
21+
- Added gemini flash thinking 01-21 model and a few visual fixes (thanks @monotykamary!)
22+
23+
## [3.2.4]
24+
25+
- Only allow use of the diff tool if it's enabled in settings
26+
27+
## [3.2.3]
28+
29+
- Fix bug where language selector wasn't working
30+
31+
## [3.2.0 - 3.2.2]
32+
33+
- **Name Change From Roo Cline to Roo Code:** We're excited to announce our new name! After growing beyond 50,000 installations, we've rebranded from Roo Cline to Roo Code to better reflect our identity as we chart our own course.
34+
35+
- **Custom Modes:** Create your own personas for Roo Code! While our built-in modes (Code, Architect, Ask) are still here, you can now shape entirely new ones:
36+
- Define custom prompts
37+
- Choose which tools each mode can access
38+
- Create specialized assistants for any workflow
39+
- Just type "Create a new mode for <X>" or visit the Prompts tab in the top menu to get started
40+
41+
Join us at https://www.reddit.com/r/RooCode to share your custom modes and be part of our next chapter!
242

343
## [3.1.7]
444

@@ -51,7 +91,7 @@
5191

5292
## [3.0.0]
5393

54-
- This release adds chat modes! Now you can ask Roo Cline questions about system architecture or the codebase without immediately jumping into writing code. You can even assign different API configuration profiles to each mode if you prefer to use different models for thinking vs coding. Would love feedback in the new Roo Cline Reddit! https://www.reddit.com/r/roocline
94+
- This release adds chat modes! Now you can ask Roo Code questions about system architecture or the codebase without immediately jumping into writing code. You can even assign different API configuration profiles to each mode if you prefer to use different models for thinking vs coding. Would love feedback in the new Roo Code Reddit! https://www.reddit.com/r/RooCode
5595

5696
## [2.2.46]
5797

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@
186186
same "printed page" as the copyright notice for easier
187187
identification within third-party archives.
188188

189-
Copyright 2024 Cline Bot Inc.
189+
Copyright 2025 Roo Veterinary Inc.
190190

191191
Licensed under the Apache License, Version 2.0 (the "License");
192192
you may not use this file except in compliance with the License.

README.md

Lines changed: 137 additions & 145 deletions
Large diffs are not rendered by default.

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
22
"name": "roo-cline",
3-
"displayName": "Roo Cline",
4-
"description": "A fork of Cline, an autonomous coding agent, with some added experimental configuration and automation features.",
3+
"displayName": "Roo Code (prev. Roo Cline)",
4+
"description": "A VS Code plugin that enhances coding with AI-powered automation, multi-model support, and experimental features.",
55
"publisher": "RooVeterinaryInc",
6-
"version": "3.1.7",
6+
"version": "3.2.8",
77
"icon": "assets/icons/rocket.png",
88
"galleryBanner": {
99
"color": "#617A91",
@@ -17,9 +17,9 @@
1717
},
1818
"repository": {
1919
"type": "git",
20-
"url": "https://github.com/RooVetGit/Roo-Cline"
20+
"url": "https://github.com/RooVetGit/Roo-Code"
2121
},
22-
"homepage": "https://github.com/RooVetGit/Roo-Cline",
22+
"homepage": "https://github.com/RooVetGit/Roo-Code",
2323
"categories": [
2424
"AI",
2525
"Chat",
@@ -52,7 +52,7 @@
5252
"activitybar": [
5353
{
5454
"id": "roo-cline-ActivityBar",
55-
"title": "Roo Cline",
55+
"title": "Roo Code",
5656
"icon": "$(rocket)"
5757
}
5858
]
@@ -100,10 +100,42 @@
100100
{
101101
"command": "roo-cline.openInNewTab",
102102
"title": "Open In New Tab",
103-
"category": "Roo Cline"
103+
"category": "Roo Code"
104+
},
105+
{
106+
"command": "roo-cline.explainCode",
107+
"title": "Roo Code: Explain Code",
108+
"category": "Roo Code"
109+
},
110+
{
111+
"command": "roo-cline.fixCode",
112+
"title": "Roo Code: Fix Code",
113+
"category": "Roo Code"
114+
},
115+
{
116+
"command": "roo-cline.improveCode",
117+
"title": "Roo Code: Improve Code",
118+
"category": "Roo Code"
104119
}
105120
],
106121
"menus": {
122+
"editor/context": [
123+
{
124+
"command": "roo-cline.explainCode",
125+
"when": "editorHasSelection",
126+
"group": "Roo Code@1"
127+
},
128+
{
129+
"command": "roo-cline.fixCode",
130+
"when": "editorHasSelection",
131+
"group": "Roo Code@2"
132+
},
133+
{
134+
"command": "roo-cline.improveCode",
135+
"when": "editorHasSelection",
136+
"group": "Roo Code@3"
137+
}
138+
],
107139
"view/title": [
108140
{
109141
"command": "roo-cline.plusButtonClicked",
@@ -138,7 +170,7 @@
138170
]
139171
},
140172
"configuration": {
141-
"title": "RooCline",
173+
"title": "Roo Code",
142174
"properties": {
143175
"roo-cline.allowedCommands": {
144176
"type": "array",

src/__mocks__/fs/promises.ts

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
// Mock file system data
2+
const mockFiles = new Map()
3+
const mockDirectories = new Set()
4+
5+
// Initialize base test directories
6+
const baseTestDirs = [
7+
"/mock",
8+
"/mock/extension",
9+
"/mock/extension/path",
10+
"/mock/storage",
11+
"/mock/storage/path",
12+
"/mock/settings",
13+
"/mock/settings/path",
14+
"/mock/mcp",
15+
"/mock/mcp/path",
16+
"/test",
17+
"/test/path",
18+
"/test/storage",
19+
"/test/storage/path",
20+
"/test/storage/path/settings",
21+
"/test/extension",
22+
"/test/extension/path",
23+
"/test/global-storage",
24+
"/test/log/path",
25+
]
26+
27+
// Helper function to format instructions
28+
const formatInstructions = (sections: string[]): string => {
29+
const joinedSections = sections.filter(Boolean).join("\n\n")
30+
return joinedSections
31+
? `
32+
====
33+
34+
USER'S CUSTOM INSTRUCTIONS
35+
36+
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.
37+
38+
${joinedSections}`
39+
: ""
40+
}
41+
42+
// Helper function to format rule content
43+
const formatRuleContent = (ruleFile: string, content: string): string => {
44+
return `Rules:\n# Rules from ${ruleFile}:\n${content}`
45+
}
46+
47+
type RuleFiles = {
48+
".clinerules-code": string
49+
".clinerules-ask": string
50+
".clinerules-architect": string
51+
".clinerules-test": string
52+
".clinerules-review": string
53+
".clinerules": string
54+
}
55+
56+
// Helper function to ensure directory exists
57+
const ensureDirectoryExists = (path: string) => {
58+
const parts = path.split("/")
59+
let currentPath = ""
60+
for (const part of parts) {
61+
if (!part) continue
62+
currentPath += "/" + part
63+
mockDirectories.add(currentPath)
64+
}
65+
}
66+
67+
const mockFs = {
68+
readFile: jest.fn().mockImplementation(async (filePath: string, encoding?: string) => {
69+
// Return stored content if it exists
70+
if (mockFiles.has(filePath)) {
71+
return mockFiles.get(filePath)
72+
}
73+
74+
// Handle rule files
75+
const ruleFiles: RuleFiles = {
76+
".clinerules-code": "# Code Mode Rules\n1. Code specific rule",
77+
".clinerules-ask": "# Ask Mode Rules\n1. Ask specific rule",
78+
".clinerules-architect": "# Architect Mode Rules\n1. Architect specific rule",
79+
".clinerules-test":
80+
"# Test Engineer Rules\n1. Always write tests first\n2. Get approval before modifying non-test code",
81+
".clinerules-review":
82+
"# Code Reviewer Rules\n1. Provide specific examples in feedback\n2. Focus on maintainability and best practices",
83+
".clinerules": "# Test Rules\n1. First rule\n2. Second rule",
84+
}
85+
86+
// Check for exact file name match
87+
const fileName = filePath.split("/").pop()
88+
if (fileName && fileName in ruleFiles) {
89+
return ruleFiles[fileName as keyof RuleFiles]
90+
}
91+
92+
// Check for file name in path
93+
for (const [ruleFile, content] of Object.entries(ruleFiles)) {
94+
if (filePath.includes(ruleFile)) {
95+
return content
96+
}
97+
}
98+
99+
// Handle file not found
100+
const error = new Error(`ENOENT: no such file or directory, open '${filePath}'`)
101+
;(error as any).code = "ENOENT"
102+
throw error
103+
}),
104+
105+
writeFile: jest.fn().mockImplementation(async (path: string, content: string) => {
106+
// Ensure parent directory exists
107+
const parentDir = path.split("/").slice(0, -1).join("/")
108+
ensureDirectoryExists(parentDir)
109+
mockFiles.set(path, content)
110+
return Promise.resolve()
111+
}),
112+
113+
mkdir: jest.fn().mockImplementation(async (path: string, options?: { recursive?: boolean }) => {
114+
// Always handle recursive creation
115+
const parts = path.split("/")
116+
let currentPath = ""
117+
118+
// For recursive or test/mock paths, create all parent directories
119+
if (options?.recursive || path.startsWith("/test") || path.startsWith("/mock")) {
120+
for (const part of parts) {
121+
if (!part) continue
122+
currentPath += "/" + part
123+
mockDirectories.add(currentPath)
124+
}
125+
return Promise.resolve()
126+
}
127+
128+
// For non-recursive paths, verify parent exists
129+
for (let i = 0; i < parts.length - 1; i++) {
130+
if (!parts[i]) continue
131+
currentPath += "/" + parts[i]
132+
if (!mockDirectories.has(currentPath)) {
133+
const error = new Error(`ENOENT: no such file or directory, mkdir '${path}'`)
134+
;(error as any).code = "ENOENT"
135+
throw error
136+
}
137+
}
138+
139+
// Add the final directory
140+
currentPath += "/" + parts[parts.length - 1]
141+
mockDirectories.add(currentPath)
142+
return Promise.resolve()
143+
return Promise.resolve()
144+
}),
145+
146+
access: jest.fn().mockImplementation(async (path: string) => {
147+
// Check if the path exists in either files or directories
148+
if (mockFiles.has(path) || mockDirectories.has(path) || path.startsWith("/test")) {
149+
return Promise.resolve()
150+
}
151+
const error = new Error(`ENOENT: no such file or directory, access '${path}'`)
152+
;(error as any).code = "ENOENT"
153+
throw error
154+
}),
155+
156+
constants: jest.requireActual("fs").constants,
157+
158+
// Expose mock data for test assertions
159+
_mockFiles: mockFiles,
160+
_mockDirectories: mockDirectories,
161+
162+
// Helper to set up initial mock data
163+
_setInitialMockData: () => {
164+
// Set up default MCP settings
165+
mockFiles.set(
166+
"/mock/settings/path/cline_mcp_settings.json",
167+
JSON.stringify({
168+
mcpServers: {
169+
"test-server": {
170+
command: "node",
171+
args: ["test.js"],
172+
disabled: false,
173+
alwaysAllow: ["existing-tool"],
174+
},
175+
},
176+
}),
177+
)
178+
179+
// Ensure all base directories exist
180+
baseTestDirs.forEach((dir) => {
181+
const parts = dir.split("/")
182+
let currentPath = ""
183+
for (const part of parts) {
184+
if (!part) continue
185+
currentPath += "/" + part
186+
mockDirectories.add(currentPath)
187+
}
188+
})
189+
},
190+
}
191+
192+
// Initialize mock data
193+
mockFs._setInitialMockData()
194+
195+
module.exports = mockFs

src/api/providers/__tests__/gemini.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ describe("GeminiHandler", () => {
204204
geminiApiKey: "test-key",
205205
})
206206
const modelInfo = invalidHandler.getModel()
207-
expect(modelInfo.id).toBe("gemini-2.0-flash-thinking-exp-1219") // Default model
207+
expect(modelInfo.id).toBe("gemini-2.0-flash-thinking-exp-01-21") // Default model
208208
})
209209
})
210210
})

0 commit comments

Comments
 (0)