Skip to content

Commit fcb4c18

Browse files
committed
Merge branch 'main' into max-api-retry
2 parents 0ffcfa5 + 2b17eeb commit fcb4c18

Some content is hidden

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

68 files changed

+4989
-1438
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: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,24 @@
1-
# Roo Cline Changelog
1+
# Roo Code Changelog
2+
3+
## [3.2.4]
4+
5+
- Only allow use of the diff tool if it's enabled in settings
6+
7+
## [3.2.3]
8+
9+
- Fix bug where language selector wasn't working
10+
11+
## [3.2.0 - 3.2.2]
12+
13+
- **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.
14+
15+
- **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:
16+
- Define custom prompts
17+
- Choose which tools each mode can access
18+
- Create specialized assistants for any workflow
19+
- Just type "Create a new mode for <X>" or visit the Prompts tab in the top menu to get started
20+
21+
Join us at https://www.reddit.com/r/RooCode to share your custom modes and be part of our next chapter!
222

323
## [3.1.7]
424

@@ -51,7 +71,7 @@
5171

5272
## [3.0.0]
5373

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
74+
- 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
5575

5676
## [2.2.46]
5777

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: 8 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.4",
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,7 +100,7 @@
100100
{
101101
"command": "roo-cline.openInNewTab",
102102
"title": "Open In New Tab",
103-
"category": "Roo Cline"
103+
"category": "Roo Code"
104104
}
105105
],
106106
"menus": {
@@ -138,7 +138,7 @@
138138
]
139139
},
140140
"configuration": {
141-
"title": "RooCline",
141+
"title": "Roo Code",
142142
"properties": {
143143
"roo-cline.allowedCommands": {
144144
"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__/openrouter.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ describe("OpenRouterHandler", () => {
3636
apiKey: mockOptions.openRouterApiKey,
3737
defaultHeaders: {
3838
"HTTP-Referer": "https://github.com/RooVetGit/Roo-Cline",
39-
"X-Title": "Roo-Cline",
39+
"X-Title": "Roo Code",
4040
},
4141
})
4242
})

0 commit comments

Comments
 (0)