From ba5af60109027c32fe29936257274d676d42f96a Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Wed, 16 Apr 2025 18:05:04 -0400 Subject: [PATCH 01/15] Fix diff escaping issues (#2694) * Fix diff escaping issues * Potential fix for code scanning alert no. 75: Double escaping or unescaping Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- src/core/tools/applyDiffTool.ts | 8 +++- src/core/tools/executeCommandTool.ts | 5 +- src/core/tools/writeToFileTool.ts | 9 +--- .../__tests__/text-normalization.test.ts | 48 ++++++++++++++++++- src/utils/text-normalization.ts | 18 +++++++ 5 files changed, 76 insertions(+), 12 deletions(-) diff --git a/src/core/tools/applyDiffTool.ts b/src/core/tools/applyDiffTool.ts index d18adaa8d0..43de5af988 100644 --- a/src/core/tools/applyDiffTool.ts +++ b/src/core/tools/applyDiffTool.ts @@ -11,7 +11,7 @@ import path from "path" import fs from "fs/promises" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" import { telemetryService } from "../../services/telemetry/TelemetryService" - +import { unescapeHtmlEntities } from "../../utils/text-normalization" export async function applyDiffTool( cline: Cline, block: ToolUse, @@ -21,7 +21,11 @@ export async function applyDiffTool( removeClosingTag: RemoveClosingTag, ) { const relPath: string | undefined = block.params.path - const diffContent: string | undefined = block.params.diff + let diffContent: string | undefined = block.params.diff + + if (diffContent && !cline.api.getModel().id.includes("claude")) { + diffContent = unescapeHtmlEntities(diffContent) + } const sharedMessageProps: ClineSayTool = { tool: "appliedDiff", diff --git a/src/core/tools/executeCommandTool.ts b/src/core/tools/executeCommandTool.ts index 79f89f092d..5a70c657ac 100644 --- a/src/core/tools/executeCommandTool.ts +++ b/src/core/tools/executeCommandTool.ts @@ -2,6 +2,7 @@ import { Cline } from "../Cline" import { ToolUse } from "../assistant-message" import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" import { formatResponse } from "../prompts/responses" +import { unescapeHtmlEntities } from "../../utils/text-normalization" export async function executeCommandTool( cline: Cline, @@ -32,8 +33,8 @@ export async function executeCommandTool( return } - // unescape html entities (e.g. < -> <) - command = command.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&") + // Unescape HTML entities + command = unescapeHtmlEntities(command) cline.consecutiveMistakeCount = 0 diff --git a/src/core/tools/writeToFileTool.ts b/src/core/tools/writeToFileTool.ts index 25f3a72df2..6a012537f6 100644 --- a/src/core/tools/writeToFileTool.ts +++ b/src/core/tools/writeToFileTool.ts @@ -14,6 +14,7 @@ import { isPathOutsideWorkspace } from "../../utils/pathUtils" import { everyLineHasLineNumbers } from "../../integrations/misc/extract-text" import delay from "delay" import { detectCodeOmission } from "../../integrations/editor/detect-omission" +import { unescapeHtmlEntities } from "../../utils/text-normalization" export async function writeToFileTool( cline: Cline, @@ -60,13 +61,7 @@ export async function writeToFileTool( } if (!cline.api.getModel().id.includes("claude")) { - // it seems not just llama models are doing cline, but also gemini and potentially others - if (newContent.includes(">") || newContent.includes("<") || newContent.includes(""")) { - newContent = newContent - .replace(/>/g, ">") - .replace(/</g, "<") - .replace(/"/g, '"') - } + newContent = unescapeHtmlEntities(newContent) } // Determine if the path is outside the workspace diff --git a/src/utils/__tests__/text-normalization.test.ts b/src/utils/__tests__/text-normalization.test.ts index da7184d889..5908ffc55b 100644 --- a/src/utils/__tests__/text-normalization.test.ts +++ b/src/utils/__tests__/text-normalization.test.ts @@ -1,4 +1,4 @@ -import { normalizeString } from "../text-normalization" +import { normalizeString, unescapeHtmlEntities } from "../text-normalization" describe("Text normalization utilities", () => { describe("normalizeString", () => { @@ -30,4 +30,50 @@ describe("Text normalization utilities", () => { expect(normalizeString(input)).toBe('Let\'s test this-with some "fancy" punctuation... and spaces') }) }) + + describe("unescapeHtmlEntities", () => { + test("unescapes basic HTML entities", () => { + expect(unescapeHtmlEntities("<div>Hello</div>")).toBe("
Hello
") + }) + + test("unescapes ampersand entity", () => { + expect(unescapeHtmlEntities("This & that")).toBe("This & that") + }) + + test("unescapes quote entities", () => { + expect(unescapeHtmlEntities(""quoted" and 'single-quoted'")).toBe( + "\"quoted\" and 'single-quoted'", + ) + }) + + test("unescapes apostrophe entity", () => { + expect(unescapeHtmlEntities("Don't worry")).toBe("Don't worry") + }) + + test("handles mixed content with multiple entity types", () => { + expect( + unescapeHtmlEntities( + "<a href="https://example.com?param1=value&param2=value">Link</a>", + ), + ).toBe('Link') + }) + + test("handles mixed content with apostrophe entities", () => { + expect( + unescapeHtmlEntities( + "<div>Don't forget that Tom&Jerry's show is at 3 o'clock</div>", + ), + ).toBe("
Don't forget that Tom&Jerry's show is at 3 o'clock
") + }) + + test("returns original string when no entities are present", () => { + const original = "Plain text without entities" + expect(unescapeHtmlEntities(original)).toBe(original) + }) + + test("handles empty or undefined input", () => { + expect(unescapeHtmlEntities("")).toBe("") + expect(unescapeHtmlEntities(undefined as unknown as string)).toBe(undefined) + }) + }) }) diff --git a/src/utils/text-normalization.ts b/src/utils/text-normalization.ts index b6e4e8da58..15f35c8437 100644 --- a/src/utils/text-normalization.ts +++ b/src/utils/text-normalization.ts @@ -75,3 +75,21 @@ export function normalizeString(str: string, options: NormalizeOptions = DEFAULT return normalized } + +/** + * Unescapes common HTML entities in a string + * + * @param text The string containing HTML entities to unescape + * @returns The unescaped string with HTML entities converted to their literal characters + */ +export function unescapeHtmlEntities(text: string): string { + if (!text) return text + + return text + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/'/g, "'") + .replace(/&/g, "&") +} From 30c44ff14c5c090fd8c498299a0c0f3d37fd1176 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Wed, 16 Apr 2025 23:04:16 -0400 Subject: [PATCH 02/15] Support dragging and dropping tabs into chat text area (#2698) --- webview-ui/src/components/chat/ChatTextArea.tsx | 2 +- .../src/utils/__tests__/path-mentions.test.ts | 15 +++++++++++++++ webview-ui/src/utils/path-mentions.ts | 9 ++++++--- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 97cf28b269..84bc7634e2 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -612,7 +612,7 @@ const ChatTextArea = forwardRef( e.preventDefault() setIsDraggingOver(false) - const text = e.dataTransfer.getData("text") + const text = e.dataTransfer.getData("application/vnd.code.uri-list") if (text) { // Split text on newlines to handle multiple files const lines = text.split(/\r?\n/).filter((line) => line.trim() !== "") diff --git a/webview-ui/src/utils/__tests__/path-mentions.test.ts b/webview-ui/src/utils/__tests__/path-mentions.test.ts index bb5591fbe5..e0f291b7f6 100644 --- a/webview-ui/src/utils/__tests__/path-mentions.test.ts +++ b/webview-ui/src/utils/__tests__/path-mentions.test.ts @@ -41,5 +41,20 @@ describe("path-mentions", () => { "@/nested/deeply/file.txt", ) }) + + it("should strip file:// protocol from paths if present", () => { + // Without cwd + expect(convertToMentionPath("file:///Users/user/project/file.txt")).toBe("/Users/user/project/file.txt") + + // With cwd - should strip protocol and then apply mention path logic + expect(convertToMentionPath("file:///Users/user/project/file.txt", "/Users/user/project")).toBe( + "@/file.txt", + ) + + // With Windows paths + expect(convertToMentionPath("file://C:/Users/user/project/file.txt", "C:/Users/user/project")).toBe( + "@/file.txt", + ) + }) }) }) diff --git a/webview-ui/src/utils/path-mentions.ts b/webview-ui/src/utils/path-mentions.ts index 960483f593..3021fe5069 100644 --- a/webview-ui/src/utils/path-mentions.ts +++ b/webview-ui/src/utils/path-mentions.ts @@ -12,11 +12,14 @@ * @returns A mention-friendly path */ export function convertToMentionPath(path: string, cwd?: string): string { - const normalizedPath = path.replace(/\\/g, "/") + // Strip file:// protocol if present + const pathWithoutProtocol = path.startsWith("file://") ? path.substring(7) : path + + const normalizedPath = pathWithoutProtocol.replace(/\\/g, "/") let normalizedCwd = cwd ? cwd.replace(/\\/g, "/") : "" if (!normalizedCwd) { - return path + return pathWithoutProtocol } // Remove trailing slash from cwd if it exists @@ -34,5 +37,5 @@ export function convertToMentionPath(path: string, cwd?: string): string { return "@" + (relativePath.startsWith("/") ? relativePath : "/" + relativePath) } - return path + return pathWithoutProtocol } From 0374436fac1edeb7a03f0e6f5c5994a5627d44c8 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Wed, 16 Apr 2025 23:08:58 -0700 Subject: [PATCH 03/15] Support xAI for evals (#2703) --- evals/apps/web/src/app/runs/new/new-run.tsx | 2 ++ evals/packages/types/src/roo-code-defaults.ts | 4 ++-- evals/packages/types/src/roo-code.ts | 5 +++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/evals/apps/web/src/app/runs/new/new-run.tsx b/evals/apps/web/src/app/runs/new/new-run.tsx index 88b736e8f4..38759eaa87 100644 --- a/evals/apps/web/src/app/runs/new/new-run.tsx +++ b/evals/apps/web/src/app/runs/new/new-run.tsx @@ -158,6 +158,7 @@ export function NewRun() { .parse(JSON.parse(await file.text())) const providerSettings = providerProfiles.apiConfigs[providerProfiles.currentApiConfigName] ?? {} + const { apiProvider, apiModelId, @@ -177,6 +178,7 @@ export function NewRun() { case "gemini": case "mistral": case "openai-native": + case "xai": case "vertex": setValue("model", apiModelId ?? "") break diff --git a/evals/packages/types/src/roo-code-defaults.ts b/evals/packages/types/src/roo-code-defaults.ts index 0f569e76cc..e02bda5d38 100644 --- a/evals/packages/types/src/roo-code-defaults.ts +++ b/evals/packages/types/src/roo-code-defaults.ts @@ -9,7 +9,7 @@ export const rooCodeDefaults: RooCodeSettings = { rateLimitSeconds: 0, pinnedApiConfigs: {}, - lastShownAnnouncementId: "apr-04-2025-boomerang", + lastShownAnnouncementId: "apr-16-2025-3-12", autoApprovalEnabled: true, alwaysAllowReadOnly: true, @@ -45,7 +45,7 @@ export const rooCodeDefaults: RooCodeSettings = { maxReadFileLine: 500, terminalOutputLineLimit: 500, - terminalShellIntegrationTimeout: 15_000, + terminalShellIntegrationTimeout: 30000, terminalCommandDelay: 0, terminalPowershellCounter: false, terminalZshClearEolMark: true, diff --git a/evals/packages/types/src/roo-code.ts b/evals/packages/types/src/roo-code.ts index 7c982f2944..fc87247ee4 100644 --- a/evals/packages/types/src/roo-code.ts +++ b/evals/packages/types/src/roo-code.ts @@ -18,6 +18,7 @@ export const providerNames = [ "lmstudio", "gemini", "openai-native", + "xai", "mistral", "deepseek", "unbound", @@ -360,6 +361,8 @@ export const providerSettingsSchema = z.object({ googleGeminiBaseUrl: z.string().optional(), // OpenAI Native openAiNativeApiKey: z.string().optional(), + // XAI + xaiApiKey: z.string().optional(), // Mistral mistralApiKey: z.string().optional(), mistralCodestralUrl: z.string().optional(), @@ -433,6 +436,8 @@ const providerSettingsRecord: ProviderSettingsRecord = { openAiUseAzure: undefined, azureApiVersion: undefined, openAiStreamingEnabled: undefined, + // xAI + xaiApiKey: undefined, // Ollama ollamaModelId: undefined, ollamaBaseUrl: undefined, From 511ebb7a9891740770ca61ef3338c3cf88bb6616 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Thu, 17 Apr 2025 07:55:53 -0400 Subject: [PATCH 04/15] Make sure the slash commands only fire if they're the first character (#2702) --- .../src/components/chat/ChatTextArea.tsx | 3 + .../src/components/chat/ContextMenu.tsx | 6 +- .../utils/__tests__/context-mentions.test.ts | 57 +++++++++++++++---- webview-ui/src/utils/context-mentions.ts | 3 +- 4 files changed, 55 insertions(+), 14 deletions(-) diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 84bc7634e2..3ce6155dc0 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -305,6 +305,7 @@ const ChatTextArea = forwardRef( const direction = event.key === "ArrowUp" ? -1 : 1 const options = getContextMenuOptions( searchQuery, + inputValue, selectedType, queryItems, fileSearchResults, @@ -341,6 +342,7 @@ const ChatTextArea = forwardRef( event.preventDefault() const selectedOption = getContextMenuOptions( searchQuery, + inputValue, selectedType, queryItems, fileSearchResults, @@ -780,6 +782,7 @@ const ChatTextArea = forwardRef( void searchQuery: string + inputValue: string onMouseDown: () => void selectedIndex: number setSelectedIndex: (index: number) => void @@ -24,6 +25,7 @@ interface ContextMenuProps { const ContextMenu: React.FC = ({ onSelect, searchQuery, + inputValue, onMouseDown, selectedIndex, setSelectedIndex, @@ -36,8 +38,8 @@ const ContextMenu: React.FC = ({ const menuRef = useRef(null) const filteredOptions = useMemo(() => { - return getContextMenuOptions(searchQuery, selectedType, queryItems, dynamicSearchResults, modes) - }, [searchQuery, selectedType, queryItems, dynamicSearchResults, modes]) + return getContextMenuOptions(searchQuery, inputValue, selectedType, queryItems, dynamicSearchResults, modes) + }, [searchQuery, inputValue, selectedType, queryItems, dynamicSearchResults, modes]) useEffect(() => { if (menuRef.current) { diff --git a/webview-ui/src/utils/__tests__/context-mentions.test.ts b/webview-ui/src/utils/__tests__/context-mentions.test.ts index c72a26d911..1e69964a94 100644 --- a/webview-ui/src/utils/__tests__/context-mentions.test.ts +++ b/webview-ui/src/utils/__tests__/context-mentions.test.ts @@ -90,7 +90,7 @@ describe("getContextMenuOptions", () => { ] it("should return all option types for empty query", () => { - const result = getContextMenuOptions("", null, []) + const result = getContextMenuOptions("", "", null, []) expect(result).toHaveLength(6) expect(result.map((item) => item.type)).toEqual([ ContextMenuOptionType.Problems, @@ -103,7 +103,7 @@ describe("getContextMenuOptions", () => { }) it("should filter by selected type when query is empty", () => { - const result = getContextMenuOptions("", ContextMenuOptionType.File, mockQueryItems) + const result = getContextMenuOptions("", "", ContextMenuOptionType.File, mockQueryItems) expect(result).toHaveLength(2) expect(result.map((item) => item.type)).toContain(ContextMenuOptionType.File) expect(result.map((item) => item.type)).toContain(ContextMenuOptionType.OpenedFile) @@ -112,19 +112,19 @@ describe("getContextMenuOptions", () => { }) it("should match git commands", () => { - const result = getContextMenuOptions("git", null, mockQueryItems) + const result = getContextMenuOptions("git", "git", null, mockQueryItems) expect(result[0].type).toBe(ContextMenuOptionType.Git) expect(result[0].label).toBe("Git Commits") }) it("should match git commit hashes", () => { - const result = getContextMenuOptions("abc1234", null, mockQueryItems) + const result = getContextMenuOptions("abc1234", "abc1234", null, mockQueryItems) expect(result[0].type).toBe(ContextMenuOptionType.Git) expect(result[0].value).toBe("abc1234") }) it("should return NoResults when no matches found", () => { - const result = getContextMenuOptions("nonexistent", null, mockQueryItems) + const result = getContextMenuOptions("nonexistent", "nonexistent", null, mockQueryItems) expect(result).toHaveLength(1) expect(result[0].type).toBe(ContextMenuOptionType.NoResults) }) @@ -145,7 +145,7 @@ describe("getContextMenuOptions", () => { }, ] - const result = getContextMenuOptions("test", null, testItems, mockDynamicSearchResults) + const result = getContextMenuOptions("test", "test", null, testItems, mockDynamicSearchResults) // Check if opened files and dynamic search results are included expect(result.some((item) => item.type === ContextMenuOptionType.OpenedFile)).toBe(true) @@ -154,7 +154,7 @@ describe("getContextMenuOptions", () => { it("should maintain correct result ordering according to implementation", () => { // Add multiple item types to test ordering - const result = getContextMenuOptions("t", null, mockQueryItems, mockDynamicSearchResults) + const result = getContextMenuOptions("t", "t", null, mockQueryItems, mockDynamicSearchResults) // Find the different result types const fileResults = result.filter( @@ -185,7 +185,7 @@ describe("getContextMenuOptions", () => { }) it("should include opened files when dynamic search results exist", () => { - const result = getContextMenuOptions("open", null, mockQueryItems, mockDynamicSearchResults) + const result = getContextMenuOptions("open", "open", null, mockQueryItems, mockDynamicSearchResults) // Verify opened files are included expect(result.some((item) => item.type === ContextMenuOptionType.OpenedFile)).toBe(true) @@ -194,7 +194,7 @@ describe("getContextMenuOptions", () => { }) it("should include git results when dynamic search results exist", () => { - const result = getContextMenuOptions("commit", null, mockQueryItems, mockDynamicSearchResults) + const result = getContextMenuOptions("commit", "commit", null, mockQueryItems, mockDynamicSearchResults) // Verify git results are included expect(result.some((item) => item.type === ContextMenuOptionType.Git)).toBe(true) @@ -215,7 +215,7 @@ describe("getContextMenuOptions", () => { }, ] - const result = getContextMenuOptions("test", null, mockQueryItems, duplicateSearchResults) + const result = getContextMenuOptions("test", "test", null, mockQueryItems, duplicateSearchResults) // Count occurrences of src/test.ts in results const duplicateCount = result.filter( @@ -233,6 +233,7 @@ describe("getContextMenuOptions", () => { it("should return NoResults when all combined results are empty with dynamic search", () => { // Use a query that won't match anything const result = getContextMenuOptions( + "nonexistentquery123456", "nonexistentquery123456", null, mockQueryItems, @@ -281,7 +282,7 @@ describe("getContextMenuOptions", () => { ] // Get results for "test" query - const result = getContextMenuOptions(testQuery, null, testItems, testSearchResults) + const result = getContextMenuOptions(testQuery, testQuery, null, testItems, testSearchResults) // Verify we have results expect(result.length).toBeGreaterThan(0) @@ -310,6 +311,40 @@ describe("getContextMenuOptions", () => { expect(firstGitResultIndex).toBeGreaterThan(firstSearchResultIndex) } }) + + it("should process slash commands when both query and inputValue start with slash", () => { + const mockModes = [ + { + slug: "code", + name: "Code", + roleDefinition: "You are a coding assistant", + groups: ["read" as const, "edit" as const], + }, + { + slug: "architect", + name: "Architect", + roleDefinition: "You are an architecture assistant", + groups: ["read" as const], + }, + ] + + const result = getContextMenuOptions("/co", "/co", null, [], [], mockModes) + + // Verify mode results are returned + expect(result[0].type).toBe(ContextMenuOptionType.Mode) + expect(result[0].value).toBe("code") + }) + + it("should not process slash commands when query starts with slash but inputValue doesn't", () => { + // Use a completely non-matching query to ensure we get NoResults + // and provide empty query items to avoid any matches + const result = getContextMenuOptions("/nonexistentquery", "Hello /code", null, [], []) + + // Should not process as a mode command + expect(result[0].type).not.toBe(ContextMenuOptionType.Mode) + // Should return NoResults since it won't match anything + expect(result[0].type).toBe(ContextMenuOptionType.NoResults) + }) }) describe("shouldShowContextMenu", () => { diff --git a/webview-ui/src/utils/context-mentions.ts b/webview-ui/src/utils/context-mentions.ts index f294f0a030..12478864f6 100644 --- a/webview-ui/src/utils/context-mentions.ts +++ b/webview-ui/src/utils/context-mentions.ts @@ -84,13 +84,14 @@ export interface ContextMenuQueryItem { export function getContextMenuOptions( query: string, + inputValue: string, selectedType: ContextMenuOptionType | null = null, queryItems: ContextMenuQueryItem[], dynamicSearchResults: SearchResult[] = [], modes?: ModeConfig[], ): ContextMenuQueryItem[] { // Handle slash commands for modes - if (query.startsWith("/")) { + if (query.startsWith("/") && inputValue.startsWith("/")) { const modeQuery = query.slice(1) if (!modes?.length) return [{ type: ContextMenuOptionType.NoResults }] From d3ba74c568683fb012a709283ce93dec6250be56 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 17 Apr 2025 10:26:50 -0400 Subject: [PATCH 05/15] Update contributors list (#2675) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 47 ++++++++++++++++++++------------------- locales/ca/README.md | 49 ++++++++++++++++++++--------------------- locales/de/README.md | 49 ++++++++++++++++++++--------------------- locales/es/README.md | 49 ++++++++++++++++++++--------------------- locales/fr/README.md | 49 ++++++++++++++++++++--------------------- locales/hi/README.md | 49 ++++++++++++++++++++--------------------- locales/it/README.md | 49 ++++++++++++++++++++--------------------- locales/ja/README.md | 49 ++++++++++++++++++++--------------------- locales/ko/README.md | 49 ++++++++++++++++++++--------------------- locales/pl/README.md | 49 ++++++++++++++++++++--------------------- locales/pt-BR/README.md | 49 ++++++++++++++++++++--------------------- locales/tr/README.md | 49 ++++++++++++++++++++--------------------- locales/vi/README.md | 49 ++++++++++++++++++++--------------------- locales/zh-CN/README.md | 49 ++++++++++++++++++++--------------------- locales/zh-TW/README.md | 49 ++++++++++++++++++++--------------------- 15 files changed, 360 insertions(+), 373 deletions(-) diff --git a/README.md b/README.md index aa6a182f0f..9acf339410 100644 --- a/README.md +++ b/README.md @@ -181,29 +181,30 @@ Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| +| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| +| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| PeterDaveHello
PeterDaveHello
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| +| pugazhendhi-m
pugazhendhi-m
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| +| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| +| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| +| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| +| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| +| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| +| mecab
mecab
| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| +| ashktn
ashktn
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| +| oprstchn
oprstchn
| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| +| shaybc
shaybc
| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| +| AMHesch
AMHesch
| adamwlarson
adamwlarson
| alarno
alarno
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| +| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| elianiva
elianiva
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| +| linegel
linegel
| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| +| shtse8
shtse8
| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| +| 01Rian
01Rian
| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| +| vladstudio
vladstudio
| | | | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index ddc9026df6..b43c627902 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -178,31 +178,30 @@ Ens encanten les contribucions de la comunitat! Comenceu llegint el nostre [CONT Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 80274ecc4a..e621914fb6 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -178,31 +178,30 @@ Wir lieben Community-Beiträge! Beginnen Sie mit dem Lesen unserer [CONTRIBUTING Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 4f13ac2ad2..63699cd4a9 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -178,31 +178,30 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p ¡Gracias a todos nuestros colaboradores que han ayudado a mejorar Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index d296c640d9..8c54b1f257 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -178,31 +178,30 @@ Nous adorons les contributions de la communauté ! Commencez par lire notre [CON Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 76ef87dfb0..64c24c391d 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -178,31 +178,30 @@ code --install-extension bin/roo-cline-.vsix Roo Code को बेहतर बनाने में मदद करने वाले हमारे सभी योगदानकर्ताओं को धन्यवाद! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index 915ae9ed7f..f77b05ba2f 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -178,31 +178,30 @@ Amiamo i contributi della community! Inizia leggendo il nostro [CONTRIBUTING.md] Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 8ce4287ae9..490496bfff 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -178,31 +178,30 @@ code --install-extension bin/roo-cline-.vsix Roo Codeの改善に貢献してくれたすべての貢献者に感謝します! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 36908a4e4f..9cca1246c7 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -178,31 +178,30 @@ code --install-extension bin/roo-cline-.vsix Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사드립니다! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index b7c4001da5..ce13b9374b 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -178,31 +178,30 @@ Kochamy wkład społeczności! Zacznij od przeczytania naszego [CONTRIBUTING.md] Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 2b714ba2fa..e99d72d9ab 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -178,31 +178,30 @@ Adoramos contribuições da comunidade! Comece lendo nosso [CONTRIBUTING.md](CON Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melhor! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## Licença diff --git a/locales/tr/README.md b/locales/tr/README.md index 6ccae19e9e..cddd257c9d 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -178,31 +178,30 @@ Topluluk katkılarını seviyoruz! [CONTRIBUTING.md](CONTRIBUTING.md) dosyasın Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara teşekkür ederiz! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index f95eecc3c3..a6eef078e9 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -178,31 +178,30 @@ Chúng tôi rất hoan nghênh đóng góp từ cộng đồng! Bắt đầu b Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index a65330f7ba..91afd06cb3 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -178,31 +178,30 @@ code --install-extension bin/roo-cline-.vsix 感谢所有帮助改进 Roo Code 的贡献者! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index ce89a16202..6395dc0d0b 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -179,31 +179,30 @@ code --install-extension bin/roo-cline-.vsix 感謝所有幫助改進 Roo Code 的貢獻者! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| nissa-seru
nissa-seru
| -| jquanton
jquanton
| KJ7LNW
KJ7LNW
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| monotykamary
monotykamary
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| feifei325
feifei325
| wkordalski
wkordalski
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| lupuletic
lupuletic
| qdaxb
qdaxb
| Premshay
Premshay
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| RaySinner
RaySinner
| aheizi
aheizi
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| PeterDaveHello
PeterDaveHello
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| -| zhangtony239
zhangtony239
| upamune
upamune
| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| -| dtrugman
dtrugman
| aitoroses
aitoroses
| yt3trees
yt3trees
| franekp
franekp
| yongjer
yongjer
| vincentsong
vincentsong
| -| vagadiya
vagadiya
| teddyOOXX
teddyOOXX
| eonghk
eonghk
| taisukeoe
taisukeoe
| heyseth
heyseth
| ross
ross
| -| philfung
philfung
| nbihan-mediware
nbihan-mediware
| napter
napter
| mdp
mdp
| SplittyDev
SplittyDev
| Chenjiayuan195
Chenjiayuan195
| -| jcbdev
jcbdev
| GitlyHallows
GitlyHallows
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| -| im47cn
im47cn
| dqroid
dqroid
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| ashktn
ashktn
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| nobu007
nobu007
| oprstchn
oprstchn
| -| philipnext
philipnext
| pokutuna
pokutuna
| refactorthis
refactorthis
| ronyblum
ronyblum
| samir-nimbly
samir-nimbly
| shaybc
shaybc
| -| shohei-ihaya
shohei-ihaya
| student20880
student20880
| cdlliuy
cdlliuy
| PretzelVector
PretzelVector
| nevermorec
nevermorec
| AMHesch
AMHesch
| -| adamwlarson
adamwlarson
| alarno
alarno
| axkirillov
axkirillov
| andreastempsch
andreastempsch
| atlasgong
atlasgong
| Atlogit
Atlogit
| -| bogdan0083
bogdan0083
| chadgauth
chadgauth
| dleen
dleen
| dbasclpy
dbasclpy
| snoyiatk
snoyiatk
| linegel
linegel
| -| celestial-vault
celestial-vault
| DeXtroTip
DeXtroTip
| hesara
hesara
| eltociear
eltociear
| Jdo300
Jdo300
| shtse8
shtse8
| -| libertyteeth
libertyteeth
| mamertofabian
mamertofabian
| marvijo-code
marvijo-code
| kvokka
kvokka
| Sarke
Sarke
| 01Rian
01Rian
| -| sachasayan
sachasayan
| samsilveira
samsilveira
| maekawataiki
maekawataiki
| tgfjt
tgfjt
| tmsjngx0
tmsjngx0
| vladstudio
vladstudio
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|nissa-seru
nissa-seru
| +|jquanton
jquanton
|KJ7LNW
KJ7LNW
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|monotykamary
monotykamary
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|feifei325
feifei325
|wkordalski
wkordalski
|cannuri
cannuri
|lloydchang
lloydchang
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|lupuletic
lupuletic
|qdaxb
qdaxb
|Premshay
Premshay
|psv2522
psv2522
| +|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|PeterDaveHello
PeterDaveHello
|RaySinner
RaySinner
|aheizi
aheizi
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
| +|zhangtony239
zhangtony239
|upamune
upamune
|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| +|dtrugman
dtrugman
|aitoroses
aitoroses
|yt3trees
yt3trees
|franekp
franekp
|yongjer
yongjer
|vincentsong
vincentsong
| +|vagadiya
vagadiya
|teddyOOXX
teddyOOXX
|eonghk
eonghk
|taisukeoe
taisukeoe
|heyseth
heyseth
|ross
ross
| +|philfung
philfung
|nbihan-mediware
nbihan-mediware
|napter
napter
|mdp
mdp
|SplittyDev
SplittyDev
|Chenjiayuan195
Chenjiayuan195
| +|jcbdev
jcbdev
|GitlyHallows
GitlyHallows
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
| +|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|kohii
kohii
|lightrabbit
lightrabbit
|olup
olup
| +|mecab
mecab
|im47cn
im47cn
|dqroid
dqroid
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
| +|ashktn
ashktn
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|moqimoqidea
moqimoqidea
|mosleyit
mosleyit
|nobu007
nobu007
| +|oprstchn
oprstchn
|philipnext
philipnext
|pokutuna
pokutuna
|refactorthis
refactorthis
|ronyblum
ronyblum
|samir-nimbly
samir-nimbly
| +|shaybc
shaybc
|shohei-ihaya
shohei-ihaya
|student20880
student20880
|cdlliuy
cdlliuy
|PretzelVector
PretzelVector
|nevermorec
nevermorec
| +|AMHesch
AMHesch
|adamwlarson
adamwlarson
|alarno
alarno
|andreastempsch
andreastempsch
|atlasgong
atlasgong
|Atlogit
Atlogit
| +|bogdan0083
bogdan0083
|chadgauth
chadgauth
|dleen
dleen
|elianiva
elianiva
|dbasclpy
dbasclpy
|snoyiatk
snoyiatk
| +|linegel
linegel
|celestial-vault
celestial-vault
|DeXtroTip
DeXtroTip
|hesara
hesara
|eltociear
eltociear
|Jdo300
Jdo300
| +|shtse8
shtse8
|libertyteeth
libertyteeth
|mamertofabian
mamertofabian
|marvijo-code
marvijo-code
|kvokka
kvokka
|Sarke
Sarke
| +|01Rian
01Rian
|sachasayan
sachasayan
|samsilveira
samsilveira
|maekawataiki
maekawataiki
|tgfjt
tgfjt
|tmsjngx0
tmsjngx0
| +|vladstudio
vladstudio
| | | | | | ## 授權 From 94842f21af0c1b969019f6f3cf0f5cb4570ab13d Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Thu, 17 Apr 2025 10:34:32 -0400 Subject: [PATCH 06/15] v3.12.3 (#2710) --- .changeset/strange-eggs-beam.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/strange-eggs-beam.md diff --git a/.changeset/strange-eggs-beam.md b/.changeset/strange-eggs-beam.md new file mode 100644 index 0000000000..b5747730c5 --- /dev/null +++ b/.changeset/strange-eggs-beam.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +v3.12.3 From 0736379ad0260c1a17f81ee7cbbed403880b078c Mon Sep 17 00:00:00 2001 From: R00-B0T <110429663+R00-B0T@users.noreply.github.com> Date: Thu, 17 Apr 2025 07:45:43 -0700 Subject: [PATCH 07/15] Changeset version bump (#2711) * changeset version bump * Updating CHANGELOG.md format * Update CHANGELOG.md --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: R00-B0T Co-authored-by: Matt Rubens --- .changeset/strange-eggs-beam.md | 5 ----- CHANGELOG.md | 6 ++++++ package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) delete mode 100644 .changeset/strange-eggs-beam.md diff --git a/.changeset/strange-eggs-beam.md b/.changeset/strange-eggs-beam.md deleted file mode 100644 index b5747730c5..0000000000 --- a/.changeset/strange-eggs-beam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -v3.12.3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 2559714ab9..f5dd214ef8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Roo Code Changelog +## [3.12.3] - 2025-04-17 + +- Fix character escaping issues in Gemini diff edits +- Support dragging and dropping tabs into the chat box (thanks @NyxJae!) +- Make sure slash commands only fire at the beginning of the chat box (thanks @logosstone!) + ## [3.12.2] - 2025-04-16 - Add OpenAI o3 & 4o-mini (thanks @PeterDaveHello!) diff --git a/package-lock.json b/package-lock.json index 51ad221702..91f5affa09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.12.2", + "version": "3.12.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.12.2", + "version": "3.12.3", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", diff --git a/package.json b/package.json index 720efbea71..4804150ffd 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.12.2", + "version": "3.12.3", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 159e4005e56fc87f5e634d67688f01b22bfbd256 Mon Sep 17 00:00:00 2001 From: Sacha Sayan Date: Thu, 17 Apr 2025 12:54:55 -0400 Subject: [PATCH 08/15] UI Glam Sesh: Makeover for TaskHeader, ChatView, HistoryPreview... (#2701) * - UI Glam Session -> Makeover for TaskHeader, ChatView, HistoryPreview, WelcomeView - In particular, display a "no tasks in workspace" message when no tasks are found. - Clean up Inferface Settings (not needed now) on Settings View - Copy updates throughout these areas. * Apply suggestions from code review Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Missing translation string. * Fix test * Fix tests * Improve translations / fix missing strings. * Support xAI for evals (#2703) * Make sure the slash commands only fire if they're the first character (#2702) * Update contributors list (#2675) docs: update contributors list [skip ci] Co-authored-by: mrubens * v3.12.3 (#2710) * Changeset version bump (#2711) * changeset version bump * Updating CHANGELOG.md format * Update CHANGELOG.md --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: R00-B0T Co-authored-by: Matt Rubens * Update translations --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: cte Co-authored-by: Matt Rubens Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: R00-B0T <110429663+R00-B0T@users.noreply.github.com> Co-authored-by: R00-B0T --- assets/images/roo-logo.svg | 3 + src/core/webview/ClineProvider.ts | 5 +- src/core/webview/webviewMessageHandler.ts | 5 - src/exports/roo-code.d.ts | 1 - src/exports/types.ts | 1 - src/schemas/index.ts | 4 - src/shared/ExtensionMessage.ts | 1 - src/shared/WebviewMessage.ts | 1 - .../__tests__/ContextWindowProgress.test.tsx | 14 +- webview-ui/src/components/chat/ChatRow.tsx | 5 +- webview-ui/src/components/chat/ChatView.tsx | 10 +- webview-ui/src/components/chat/TaskHeader.tsx | 343 ++++-------------- .../chat/__tests__/TaskHeader.test.tsx | 4 +- .../src/components/history/HistoryPreview.tsx | 176 +++++---- .../components/settings/InterfaceSettings.tsx | 40 -- .../src/components/settings/SettingsView.tsx | 12 - webview-ui/src/components/welcome/RooHero.tsx | 32 ++ .../src/components/welcome/WelcomeView.tsx | 26 +- .../src/context/ExtensionStateContext.tsx | 3 - webview-ui/src/i18n/locales/ca/chat.json | 4 +- webview-ui/src/i18n/locales/ca/settings.json | 6 - webview-ui/src/i18n/locales/ca/welcome.json | 2 +- webview-ui/src/i18n/locales/de/chat.json | 4 +- webview-ui/src/i18n/locales/de/history.json | 2 +- webview-ui/src/i18n/locales/de/settings.json | 6 - webview-ui/src/i18n/locales/de/welcome.json | 2 +- webview-ui/src/i18n/locales/en/chat.json | 6 +- webview-ui/src/i18n/locales/en/history.json | 2 +- webview-ui/src/i18n/locales/en/settings.json | 6 - webview-ui/src/i18n/locales/en/welcome.json | 2 +- webview-ui/src/i18n/locales/es/chat.json | 4 +- webview-ui/src/i18n/locales/es/settings.json | 6 - webview-ui/src/i18n/locales/es/welcome.json | 4 +- webview-ui/src/i18n/locales/fr/chat.json | 4 +- webview-ui/src/i18n/locales/fr/settings.json | 6 - webview-ui/src/i18n/locales/fr/welcome.json | 4 +- webview-ui/src/i18n/locales/hi/chat.json | 4 +- webview-ui/src/i18n/locales/hi/history.json | 2 +- webview-ui/src/i18n/locales/hi/settings.json | 6 - webview-ui/src/i18n/locales/hi/welcome.json | 4 +- webview-ui/src/i18n/locales/it/chat.json | 4 +- webview-ui/src/i18n/locales/it/history.json | 2 +- webview-ui/src/i18n/locales/it/settings.json | 6 - webview-ui/src/i18n/locales/it/welcome.json | 4 +- webview-ui/src/i18n/locales/ja/chat.json | 4 +- webview-ui/src/i18n/locales/ja/history.json | 2 +- webview-ui/src/i18n/locales/ja/settings.json | 6 - webview-ui/src/i18n/locales/ja/welcome.json | 4 +- webview-ui/src/i18n/locales/ko/chat.json | 4 +- webview-ui/src/i18n/locales/ko/settings.json | 6 - webview-ui/src/i18n/locales/ko/welcome.json | 4 +- webview-ui/src/i18n/locales/pl/chat.json | 4 +- webview-ui/src/i18n/locales/pl/settings.json | 6 - webview-ui/src/i18n/locales/pl/welcome.json | 4 +- webview-ui/src/i18n/locales/pt-BR/chat.json | 4 +- .../src/i18n/locales/pt-BR/settings.json | 6 - .../src/i18n/locales/pt-BR/welcome.json | 4 +- webview-ui/src/i18n/locales/tr/chat.json | 4 +- webview-ui/src/i18n/locales/tr/settings.json | 6 - webview-ui/src/i18n/locales/tr/welcome.json | 4 +- webview-ui/src/i18n/locales/vi/chat.json | 4 +- webview-ui/src/i18n/locales/vi/settings.json | 6 - webview-ui/src/i18n/locales/vi/welcome.json | 4 +- webview-ui/src/i18n/locales/zh-CN/chat.json | 4 +- .../src/i18n/locales/zh-CN/settings.json | 6 - .../src/i18n/locales/zh-CN/welcome.json | 4 +- webview-ui/src/i18n/locales/zh-TW/chat.json | 4 +- .../src/i18n/locales/zh-TW/settings.json | 6 - .../src/i18n/locales/zh-TW/welcome.json | 6 +- 69 files changed, 295 insertions(+), 609 deletions(-) create mode 100644 assets/images/roo-logo.svg delete mode 100644 webview-ui/src/components/settings/InterfaceSettings.tsx create mode 100644 webview-ui/src/components/welcome/RooHero.tsx diff --git a/assets/images/roo-logo.svg b/assets/images/roo-logo.svg new file mode 100644 index 0000000000..d2af8edd7a --- /dev/null +++ b/assets/images/roo-logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index dba450f9ae..f2b4391051 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -655,7 +655,7 @@ export class ClineProvider extends EventEmitter implements Roo Code @@ -1216,7 +1216,6 @@ export class ClineProvider extends EventEmitter implements telemetrySetting, showRooIgnoredFiles, language, - showGreeting, maxReadFileLine, } = await this.getState() @@ -1297,7 +1296,6 @@ export class ClineProvider extends EventEmitter implements renderContext: this.renderContext, maxReadFileLine: maxReadFileLine ?? 500, settingsImportedAt: this.settingsImportedAt, - showGreeting: showGreeting ?? true, // Ensure showGreeting is included in the returned state } } @@ -1385,7 +1383,6 @@ export class ClineProvider extends EventEmitter implements telemetrySetting: stateValues.telemetrySetting || "unset", showRooIgnoredFiles: stateValues.showRooIgnoredFiles ?? true, maxReadFileLine: stateValues.maxReadFileLine ?? 500, - showGreeting: stateValues.showGreeting ?? true, // Ensure showGreeting is returned by getState } } diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 51ddb8dd0b..863d0aed51 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -645,11 +645,6 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We await updateGlobalState("diffEnabled", diffEnabled) await provider.postStateToWebview() break - case "showGreeting": - const showGreeting = message.bool ?? true - await updateGlobalState("showGreeting", showGreeting) - await provider.postStateToWebview() - break case "enableCheckpoints": const enableCheckpoints = message.bool ?? true await updateGlobalState("enableCheckpoints", enableCheckpoints) diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 85f7e8733e..70ae8b08b4 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -262,7 +262,6 @@ type GlobalSettings = { remoteBrowserHost?: string | undefined cachedChromeHostUrl?: string | undefined enableCheckpoints?: boolean | undefined - showGreeting?: boolean | undefined ttsEnabled?: boolean | undefined ttsSpeed?: number | undefined soundEnabled?: boolean | undefined diff --git a/src/exports/types.ts b/src/exports/types.ts index e301f7bfd0..878f0b95b2 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -265,7 +265,6 @@ type GlobalSettings = { remoteBrowserHost?: string | undefined cachedChromeHostUrl?: string | undefined enableCheckpoints?: boolean | undefined - showGreeting?: boolean | undefined ttsEnabled?: boolean | undefined ttsSpeed?: number | undefined soundEnabled?: boolean | undefined diff --git a/src/schemas/index.ts b/src/schemas/index.ts index aeab4f0703..48f5b2989e 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -529,8 +529,6 @@ export const globalSettingsSchema = z.object({ enableCheckpoints: z.boolean().optional(), - showGreeting: z.boolean().optional(), - ttsEnabled: z.boolean().optional(), ttsSpeed: z.number().optional(), soundEnabled: z.boolean().optional(), @@ -606,8 +604,6 @@ const globalSettingsRecord: GlobalSettingsRecord = { enableCheckpoints: undefined, - showGreeting: undefined, - ttsEnabled: undefined, ttsSpeed: undefined, soundEnabled: undefined, diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index c2f2d6b1bc..a568e9d8ba 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -142,7 +142,6 @@ export type ExtensionState = Pick< | "remoteBrowserEnabled" | "remoteBrowserHost" // | "enableCheckpoints" // Optional in GlobalSettings, required here. - | "showGreeting" | "ttsEnabled" | "ttsSpeed" | "soundEnabled" diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index ff071ff2ee..f1ab993679 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -125,7 +125,6 @@ export interface WebviewMessage { | "maxReadFileLine" | "searchFiles" | "toggleApiConfigPin" - | "showGreeting" text?: string disabled?: boolean askResponse?: ClineAskResponse diff --git a/webview-ui/src/__tests__/ContextWindowProgress.test.tsx b/webview-ui/src/__tests__/ContextWindowProgress.test.tsx index 9386173aa2..bf0af4598d 100644 --- a/webview-ui/src/__tests__/ContextWindowProgress.test.tsx +++ b/webview-ui/src/__tests__/ContextWindowProgress.test.tsx @@ -1,4 +1,5 @@ -import React from "react" +// npx jest src/__tests__/ContextWindowProgress.test.tsx + import { render, screen } from "@testing-library/react" import "@testing-library/jest-dom" import TaskHeader from "../components/chat/TaskHeader" @@ -68,7 +69,9 @@ describe("ContextWindowProgress", () => { }) // Check for basic elements - expect(screen.getByTestId("context-window-label")).toBeInTheDocument() + // The context-window-label is not part of the ContextWindowProgress component + // but rather part of the parent TaskHeader component in expanded state + expect(screen.getByTestId("context-tokens-count")).toBeInTheDocument() expect(screen.getByTestId("context-tokens-count")).toHaveTextContent("1000") // contextTokens // The actual context window might be different than what we pass in // due to the mock returning a default value from the API config @@ -83,7 +86,8 @@ describe("ContextWindowProgress", () => { // In the current implementation, the component is still displayed with zero values // rather than being hidden completely - expect(screen.getByTestId("context-window-label")).toBeInTheDocument() + // The context-window-label is not part of the ContextWindowProgress component + expect(screen.getByTestId("context-tokens-count")).toBeInTheDocument() expect(screen.getByTestId("context-tokens-count")).toHaveTextContent("0") }) @@ -117,8 +121,8 @@ describe("ContextWindowProgress", () => { // We can't reliably test computed styles in JSDOM, so we'll just check // that the component appears to be working correctly by checking for expected elements - expect(screen.getByTestId("context-window-label")).toBeInTheDocument() + // The context-window-label is not part of the ContextWindowProgress component + expect(screen.getByTestId("context-tokens-count")).toBeInTheDocument() expect(screen.getByTestId("context-tokens-count")).toHaveTextContent("1000") - expect(screen.getByText("1000")).toBeInTheDocument() }) }) diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index c468dfccfc..e2c7495b65 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -854,11 +854,10 @@ export const ChatRowContent = ({ case "user_feedback": return (
0 ? (messages[0].say === "task" ? messages[0] : undefined) : undefined) : undefined @@ -1224,12 +1224,8 @@ const ChatViewComponent: React.ForwardRefRenderFunction {telemetrySetting === "unset" && } {showAnnouncement && } - {showGreeting === true && ( -
-

{t("chat:greeting")}

-

{t("chat:aboutMe")}

-
- )} + + {taskHistory.length > 0 && }
)} diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 2dcf5fd09c..6a2c91b303 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -1,4 +1,4 @@ -import React, { memo, useEffect, useMemo, useRef, useState } from "react" +import React, { memo, useMemo, useRef, useState } from "react" import { useWindowSize } from "react-use" import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" import prettyBytes from "pretty-bytes" @@ -44,267 +44,87 @@ const TaskHeader: React.FC = ({ const { t } = useTranslation() const { apiConfiguration, currentTaskItem } = useExtensionState() const { selectedModelInfo } = useMemo(() => normalizeApiConfiguration(apiConfiguration), [apiConfiguration]) - const [isTaskExpanded, setIsTaskExpanded] = useState(true) - const [isTextExpanded, setIsTextExpanded] = useState(false) - const [showSeeMore, setShowSeeMore] = useState(false) + const [isTaskExpanded, setIsTaskExpanded] = useState(false) + const textContainerRef = useRef(null) const textRef = useRef(null) const contextWindow = selectedModelInfo?.contextWindow || 1 - /* - When dealing with event listeners in React components that depend on state - variables, we face a challenge. We want our listener to always use the most - up-to-date version of a callback function that relies on current state, but - we don't want to constantly add and remove event listeners as that function - updates. This scenario often arises with resize listeners or other window - events. Simply adding the listener in a useEffect with an empty dependency - array risks using stale state, while including the callback in the - dependencies can lead to unnecessary re-registrations of the listener. There - are react hook libraries that provide a elegant solution to this problem by - utilizing the useRef hook to maintain a reference to the latest callback - function without triggering re-renders or effect re-runs. This approach - ensures that our event listener always has access to the most current state - while minimizing performance overhead and potential memory leaks from - multiple listener registrations. - - Sources - - https://usehooks-ts.com/react-hook/use-event-listener - - https://streamich.github.io/react-use/?path=/story/sensors-useevent--docs - - https://github.com/streamich/react-use/blob/master/src/useEvent.ts - - https://stackoverflow.com/questions/55565444/how-to-register-event-with-useeffect-hooks - - Before: - - const updateMaxHeight = useCallback(() => { - if (isExpanded && textContainerRef.current) { - const maxHeight = window.innerHeight * (3 / 5) - textContainerRef.current.style.maxHeight = `${maxHeight}px` - } - }, [isExpanded]) - - useEffect(() => { - updateMaxHeight() - }, [isExpanded, updateMaxHeight]) - - useEffect(() => { - window.removeEventListener("resize", updateMaxHeight) - window.addEventListener("resize", updateMaxHeight) - return () => { - window.removeEventListener("resize", updateMaxHeight) - } - }, [updateMaxHeight]) - - After: - */ - - const { height: windowHeight, width: windowWidth } = useWindowSize() - - useEffect(() => { - if (isTextExpanded && textContainerRef.current) { - const maxHeight = windowHeight * (1 / 2) - textContainerRef.current.style.maxHeight = `${maxHeight}px` - } - }, [isTextExpanded, windowHeight]) - - useEffect(() => { - if (textRef.current && textContainerRef.current) { - let textContainerHeight = textContainerRef.current.clientHeight - if (!textContainerHeight) { - textContainerHeight = textContainerRef.current.getBoundingClientRect().height - } - const isOverflowing = textRef.current.scrollHeight > textContainerHeight - // necessary to show see more button again if user resizes window to expand and then back to collapse - if (!isOverflowing) { - setIsTextExpanded(false) - } - setShowSeeMore(isOverflowing) - } - }, [task.text, windowWidth]) - - const isCostAvailable = useMemo(() => { - return totalCost !== null && totalCost !== undefined && totalCost > 0 && !isNaN(totalCost) - }, [totalCost]) + const { width: windowWidth } = useWindowSize() const shouldShowPromptCacheInfo = doesModelSupportPromptCache && apiConfiguration?.apiProvider !== "openrouter" return ( -
+
-
+ className={`rounded p-[10px] flex flex-col gap-[6px] relative z-1 outline hover:outline-vscode-badge-foreground hover:text-vscode-badge-foreground transition-color duration-500 ${!!isTaskExpanded ? "outline-vscode-badge-foreground text-vscode-badge-foreground" : "outline-vscode-badge-foreground/80 text-vscode-badge-foreground/80"}`}> +
setIsTaskExpanded(!isTaskExpanded)}> -
+
-
- +
+ {t("chat:task.title")} {!isTaskExpanded && ":"} - {!isTaskExpanded && ( - {highlightMentions(task.text, false)} - )} + {!isTaskExpanded && {highlightMentions(task.text, false)}}
- {!isTaskExpanded && isCostAvailable && ( -
- ${totalCost?.toFixed(4)} -
- )} +
+ {/* Collapsed state: Track context and cost if we have any */} + {!isTaskExpanded && contextWindow > 0 && ( +
+ + {!!totalCost && ( +
+ ${totalCost?.toFixed(2)} +
+ )} +
+ )} + {/* Expanded state: Show task text and images */} {isTaskExpanded && ( <>
+ className="-mt-0.5 text-vscode-font-size overflow-y-auto break-words break-anywhere relative">
{highlightMentions(task.text, false)}
- {!isTextExpanded && showSeeMore && ( -
-
-
setIsTextExpanded(!isTextExpanded)}> - {t("chat:task.seeMore")} -
-
- )}
- {isTextExpanded && showSeeMore && ( -
setIsTextExpanded(!isTextExpanded)}> - {t("chat:task.seeLess")} -
- )} - {task.images && task.images.length > 0 && } -
-
-
- {t("chat:task.tokens")} - - - {formatLargeNumber(tokensIn || 0)} - - - - {formatLargeNumber(tokensOut || 0)} - -
- {!isCostAvailable && } -
- +
{isTaskExpanded && contextWindow > 0 && (
+
+ + {t("chat:task.contextWindow")} + +
= ({ />
)} +
+
+ {t("chat:task.tokens")} + + + {formatLargeNumber(tokensIn || 0)} + + + + {formatLargeNumber(tokensOut || 0)} + +
+ {!totalCost && } +
{shouldShowPromptCacheInfo && (cacheReads !== undefined || cacheWrites !== undefined) && (
- {t("chat:task.cache")} + {t("chat:task.cache")} - - +{formatLargeNumber(cacheWrites || 0)} + + + {formatLargeNumber(cacheWrites || 0)} - + {formatLargeNumber(cacheReads || 0)}
)} - {isCostAvailable && ( + {!!totalCost && (
{t("chat:task.apiCost")} - ${totalCost?.toFixed(4)} + ${totalCost?.toFixed(2)}
@@ -362,8 +190,7 @@ export const highlightMentions = (text?: string, withShadow = true) => { return ( vscode.postMessage({ type: "openMention", text: part })}> @{part} @@ -439,22 +266,12 @@ const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: Cont return ( <> -
- - {t("chat:task.contextWindow")} - -
{formatLargeNumber(safeContextTokens)}
{/* Invisible overlay for hover area */}
@@ -465,13 +282,7 @@ const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: Cont
{/* Invisible overlay for current tokens section */}
{/* Current tokens used - darkest */} -
+
{/* Container for reserved tokens */}
{/* Invisible overlay for reserved section */}
{/* Reserved for output section - medium gray */} -
+
{/* Empty section (if any) */} @@ -517,13 +312,7 @@ const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: Cont
{/* Invisible overlay for available space */}
{ }} />, ) - expect(screen.getByText("$0.0500")).toBeInTheDocument() + expect(screen.getByText("$0.05")).toBeInTheDocument() }) it("should not display cost when totalCost is 0", () => { diff --git a/webview-ui/src/components/history/HistoryPreview.tsx b/webview-ui/src/components/history/HistoryPreview.tsx index 0bc4fb69a5..a49eda9998 100644 --- a/webview-ui/src/components/history/HistoryPreview.tsx +++ b/webview-ui/src/components/history/HistoryPreview.tsx @@ -2,99 +2,117 @@ import { memo } from "react" import { vscode } from "@/utils/vscode" import { formatLargeNumber, formatDate } from "@/utils/format" -import { Button, Checkbox } from "@/components/ui" +import { Button } from "@/components/ui" import { useAppTranslation } from "../../i18n/TranslationContext" import { CopyButton } from "./CopyButton" import { useTaskSearch } from "./useTaskSearch" +import { Trans } from "react-i18next" + type HistoryPreviewProps = { showHistoryView: () => void } const HistoryPreview = ({ showHistoryView }: HistoryPreviewProps) => { - const { tasks, showAllWorkspaces, setShowAllWorkspaces } = useTaskSearch() + const { tasks, showAllWorkspaces } = useTaskSearch() const { t } = useAppTranslation() return ( -
-
-
- - {t("history:recentTasks")} -
- -
-
- setShowAllWorkspaces(checked === true)} - variant="description" - /> - -
- {tasks.slice(0, 3).map((item) => ( -
vscode.postMessage({ type: "showTaskWithId", text: item.id })}> -
-
- - {formatDate(item.ts)} - - + <> +
+ {!!tasks.length && ( +
+
+ + {t("history:recentTasks")}
-
- {item.task} -
-
- - {t("history:tokens", { - in: formatLargeNumber(item.tokensIn || 0), - out: formatLargeNumber(item.tokensOut || 0), - })} - - {!!item.cacheWrites && ( - <> - {" • "} - - {t("history:cache", { - writes: formatLargeNumber(item.cacheWrites || 0), - reads: formatLargeNumber(item.cacheReads || 0), - })} - - - )} - {!!item.totalCost && ( - <> - {" • "} - {t("history:apiCost", { cost: item.totalCost?.toFixed(4) })} - - )} -
- {showAllWorkspaces && item.workspace && ( -
- - {item.workspace} -
- )} +
-
- ))} -
+ )} + {tasks.length === 0 && ( + <> +

+ + the docs + + ), + }} + /> +

+ + + + )} + {tasks.slice(0, 3).map((item) => ( +
vscode.postMessage({ type: "showTaskWithId", text: item.id })}> +
+
+ + {formatDate(item.ts)} + + +
+
+ {item.task} +
+
+ + {t("history:tokens", { + in: formatLargeNumber(item.tokensIn || 0), + out: formatLargeNumber(item.tokensOut || 0), + })} + + {!!item.cacheWrites && ( + <> + {" • "} + + {t("history:cache", { + writes: formatLargeNumber(item.cacheWrites || 0), + reads: formatLargeNumber(item.cacheReads || 0), + })} + + + )} + {!!item.totalCost && ( + <> + {" • "} + {t("history:apiCost", { cost: item.totalCost?.toFixed(4) })} + + )} +
+ {showAllWorkspaces && item.workspace && ( +
+ + {item.workspace} +
+ )} +
+
+ ))} +
+ ) } diff --git a/webview-ui/src/components/settings/InterfaceSettings.tsx b/webview-ui/src/components/settings/InterfaceSettings.tsx deleted file mode 100644 index d7e959a75a..0000000000 --- a/webview-ui/src/components/settings/InterfaceSettings.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { HTMLAttributes } from "react" -import { useAppTranslation } from "@/i18n/TranslationContext" -import { VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" -import { Monitor } from "lucide-react" - -import { SetCachedStateField } from "./types" -import { SectionHeader } from "./SectionHeader" -import { Section } from "./Section" - -type InterfaceSettingsProps = HTMLAttributes & { - showGreeting?: boolean - setCachedStateField: SetCachedStateField<"showGreeting"> -} - -export const InterfaceSettings = ({ showGreeting, setCachedStateField, ...props }: InterfaceSettingsProps) => { - const { t } = useAppTranslation() - return ( -
- -
- -
{t("settings:sections.interface")}
-
-
- -
-
- setCachedStateField("showGreeting", e.target.checked)}> - {t("settings:interface.showgreeting.label")} - -
- {t("settings:interface.showgreeting.description")} -
-
-
-
- ) -} diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 2ec12cae18..485d63ec9d 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -13,7 +13,6 @@ import { Globe, Info, LucideIcon, - Monitor, } from "lucide-react" import { CaretSortIcon } from "@radix-ui/react-icons" @@ -47,7 +46,6 @@ import ApiOptions from "./ApiOptions" import { AutoApproveSettings } from "./AutoApproveSettings" import { BrowserSettings } from "./BrowserSettings" import { CheckpointSettings } from "./CheckpointSettings" -import { InterfaceSettings } from "./InterfaceSettings" import { NotificationSettings } from "./NotificationSettings" import { ContextManagementSettings } from "./ContextManagementSettings" import { TerminalSettings } from "./TerminalSettings" @@ -65,7 +63,6 @@ const sectionNames = [ "autoApprove", "browser", "checkpoints", - "interface", "notifications", "contextManagement", "terminal", @@ -138,7 +135,6 @@ const SettingsView = forwardRef(({ onDone, t showRooIgnoredFiles, remoteBrowserEnabled, maxReadFileLine, - showGreeting, } = cachedState // Make sure apiConfiguration is initialized and managed by SettingsView. @@ -261,7 +257,6 @@ const SettingsView = forwardRef(({ onDone, t vscode.postMessage({ type: "alwaysAllowSubtasks", bool: alwaysAllowSubtasks }) vscode.postMessage({ type: "upsertApiConfiguration", text: currentApiConfigName, apiConfiguration }) vscode.postMessage({ type: "telemetrySetting", text: telemetrySetting }) - vscode.postMessage({ type: "showGreeting", bool: showGreeting }) setChangeDetected(false) } } @@ -290,7 +285,6 @@ const SettingsView = forwardRef(({ onDone, t const autoApproveRef = useRef(null) const browserRef = useRef(null) const checkpointsRef = useRef(null) - const interfaceRef = useRef(null) const notificationsRef = useRef(null) const contextManagementRef = useRef(null) const terminalRef = useRef(null) @@ -304,7 +298,6 @@ const SettingsView = forwardRef(({ onDone, t { id: "autoApprove", icon: CheckCheck, ref: autoApproveRef }, { id: "browser", icon: SquareMousePointer, ref: browserRef }, { id: "checkpoints", icon: GitBranch, ref: checkpointsRef }, - { id: "interface", icon: Monitor, ref: interfaceRef }, { id: "notifications", icon: Bell, ref: notificationsRef }, { id: "contextManagement", icon: Database, ref: contextManagementRef }, { id: "terminal", icon: SquareTerminal, ref: terminalRef }, @@ -317,7 +310,6 @@ const SettingsView = forwardRef(({ onDone, t autoApproveRef, browserRef, checkpointsRef, - interfaceRef, notificationsRef, contextManagementRef, terminalRef, @@ -468,10 +460,6 @@ const SettingsView = forwardRef(({ onDone, t />
-
- -
-
{ + const { t } = useAppTranslation() + + const [imagesBaseUri] = useState(() => { + const w = window as any + return w.IMAGES_BASE_URI || "" + }) + + return ( +
+
+ Roo logo +
+

{t("chat:greeting")}

+
+ ) +} + +export default WelcomeView diff --git a/webview-ui/src/components/welcome/WelcomeView.tsx b/webview-ui/src/components/welcome/WelcomeView.tsx index 3b81f51b61..83f1670466 100644 --- a/webview-ui/src/components/welcome/WelcomeView.tsx +++ b/webview-ui/src/components/welcome/WelcomeView.tsx @@ -5,8 +5,10 @@ import { validateApiConfiguration } from "../../utils/validate" import { vscode } from "../../utils/vscode" import ApiOptions from "../settings/ApiOptions" import { Tab, TabContent } from "../common/Tab" +import { Trans } from "react-i18next" import { useAppTranslation } from "../../i18n/TranslationContext" import { getRequestyAuthUrl, getOpenRouterAuthUrl } from "../../oauth/urls" +import RooHero from "./RooHero" import knuthShuffle from "knuth-shuffle-seeded" const WelcomeView = () => { @@ -35,12 +37,14 @@ const WelcomeView = () => { return ( -

{t("welcome:greeting")}

-
{t("welcome:introduction")}
-
{t("welcome:chooseProvider")}
+ + +
+ +
-

{t("welcome:startRouter")}

+

{t("welcome:startRouter")}

{/* Define the providers */} @@ -71,10 +75,11 @@ const WelcomeView = () => { -
+
{provider.name}
+
{provider.name} { />
-
{t("welcome:or")}
-

{t("welcome:startCustom")}

+
{t("welcome:or")}
+

{t("welcome:startCustom")}

setPinnedApiConfigs: (value: Record) => void togglePinnedApiConfig: (configName: string) => void - setShowGreeting: (value: boolean) => void } export const ExtensionStateContext = createContext(undefined) @@ -124,7 +123,6 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode clineMessages: [], taskHistory: [], shouldShowAnnouncement: false, - showGreeting: true, allowedCommands: [], soundEnabled: false, soundVolume: 0.5, @@ -317,7 +315,6 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode setAwsUsePromptCache: (value) => setState((prevState) => ({ ...prevState, awsUsePromptCache: value })), setMaxReadFileLine: (value) => setState((prevState) => ({ ...prevState, maxReadFileLine: value })), setPinnedApiConfigs: (value) => setState((prevState) => ({ ...prevState, pinnedApiConfigs: value })), - setShowGreeting: (value) => setState((prevState) => ({ ...prevState, showGreeting: value })), togglePinnedApiConfig: (configId) => setState((prevState) => { const currentPinned = prevState.pinnedApiConfigs || {} diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 4274447432..3e1022ce3d 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Què pot fer Roo per tu?", + "greeting": "Benvingut a Roo", "task": { "title": "Tasca", "seeMore": "Veure més", @@ -65,7 +65,7 @@ "tooltip": "Cancel·la l'operació actual" }, "scrollToBottom": "Desplaça't al final del xat", - "aboutMe": "Gràcies als últims avenços en capacitats de codificació intel·ligent, puc gestionar tasques complexes de desenvolupament de programari pas a pas. Amb eines que em permeten crear i editar fitxers, explorar projectes complexos, utilitzar el navegador i executar ordres de terminal (després que em donis permís), puc ajudar-te de maneres que van més enllà de la finalització de codi o el suport tècnic. Fins i tot puc utilitzar MCP per crear noves eines i ampliar les meves capacitats.", + "onboarding": " La vostra llista de tasques en aquest espai de treball està buida. Comença escrivint una tasca a continuació. \nNo esteu segur per on començar? \nMés informació sobre què pot fer Roo als documents.", "selectMode": "Selecciona el mode d'interacció", "selectApiConfig": "Selecciona la configuració de l'API", "enhancePrompt": "Millora la sol·licitud amb context addicional", diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index a4795a2239..c6400bdd18 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "ARN personalitzat", "useCustomArn": "Utilitza ARN personalitzat..." - }, - "interface": { - "showgreeting": { - "label": "Mostrar missatge de benvinguda", - "description": "Quan està activat, Roo mostrarà un missatge de benvinguda i introducció." - } } } diff --git a/webview-ui/src/i18n/locales/ca/welcome.json b/webview-ui/src/i18n/locales/ca/welcome.json index 89b1611881..579901c2c2 100644 --- a/webview-ui/src/i18n/locales/ca/welcome.json +++ b/webview-ui/src/i18n/locales/ca/welcome.json @@ -1,6 +1,6 @@ { "greeting": "Hola, sóc en Roo!", - "introduction": "Puc fer tot tipus de tasques gràcies als últims avenços en capacitats de codificació agent i accés a eines que em permeten crear i editar fitxers, explorar projectes complexos, utilitzar el navegador i executar ordres de terminal (amb el teu permís, és clar). Fins i tot puc utilitzar MCP per crear noves eines i ampliar les meves pròpies capacitats.", + "introduction": "Roo Code és el principal agent de codificació autònom. Prepara't per arquitectar, codificar, depurar i augmentar la teva productivitat com mai abans. Per continuar, Roo Code necessita una clau API.", "notice": "Per començar, aquesta extensió necessita un proveïdor d'API.", "start": "Som-hi!", "chooseProvider": "Tria un proveïdor d'API per començar:", diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 250bc59696..b1d52b3980 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Was kann Roo für dich tun?", + "greeting": "Willkommen in Roo", "task": { "title": "Aufgabe", "seeMore": "Mehr anzeigen", @@ -65,7 +65,7 @@ "tooltip": "Aktuelle Operation abbrechen" }, "scrollToBottom": "Zum Chat-Ende scrollen", - "aboutMe": "Dank neuester Durchbrüche in agentischen Coding-Fähigkeiten kann ich komplexe Softwareentwicklungsaufgaben schrittweise bearbeiten. Mit Werkzeugen, die mir erlauben, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu nutzen und Terminalbefehle auszuführen (nachdem du die Erlaubnis erteilt hast), kann ich dir auf Weisen helfen, die über Code-Vervollständigung oder technischen Support hinausgehen. Ich kann sogar MCP nutzen, um neue Werkzeuge zu erstellen und meine eigenen Fähigkeiten zu erweitern.", + "onboarding": "Deine Aufgabenliste in diesem Arbeitsbereich ist leer. Beginne mit der Eingabe einer Aufgabe unten. Du bist dir nicht sicher, wie du anfangen sollst? Lies mehr darüber, was Roo für dich tun kann, in den Dokumenten.", "selectMode": "Interaktionsmodus auswählen", "selectApiConfig": "API-Konfiguration auswählen", "enhancePrompt": "Prompt mit zusätzlichem Kontext verbessern", diff --git a/webview-ui/src/i18n/locales/de/history.json b/webview-ui/src/i18n/locales/de/history.json index ed0e53b48e..f85243c886 100644 --- a/webview-ui/src/i18n/locales/de/history.json +++ b/webview-ui/src/i18n/locales/de/history.json @@ -1,5 +1,5 @@ { - "recentTasks": "Kürzliche Aufgaben", + "recentTasks": "Jüngste Aufgaben", "viewAll": "Alle anzeigen", "tokens": "Tokens: ↑{{in}} ↓{{out}}", "cache": "Cache: +{{writes}} → {{reads}}", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index dda9befbce..2459c293b1 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "Benutzerdefinierte ARN", "useCustomArn": "Benutzerdefinierte ARN verwenden..." - }, - "interface": { - "showgreeting": { - "label": "Begrüßungsnachricht anzeigen", - "description": "Wenn aktiviert, zeigt Roo eine Willkommensnachricht und Einführung an." - } } } diff --git a/webview-ui/src/i18n/locales/de/welcome.json b/webview-ui/src/i18n/locales/de/welcome.json index 19fcb0eac3..8c8202f672 100644 --- a/webview-ui/src/i18n/locales/de/welcome.json +++ b/webview-ui/src/i18n/locales/de/welcome.json @@ -1,6 +1,6 @@ { "greeting": "Hallo, ich bin Roo!", - "introduction": "Ich kann alle Arten von Aufgaben erledigen, dank der neuesten Durchbrüche in agentenbasierten Codierungsfähigkeiten und dem Zugang zu Tools, die es mir ermöglichen, Dateien zu erstellen und zu bearbeiten, komplexe Projekte zu erkunden, den Browser zu verwenden und Terminalbefehle auszuführen (natürlich mit deiner Erlaubnis). Ich kann sogar MCP verwenden, um neue Tools zu erstellen und meine eigenen Fähigkeiten zu erweitern.", + "introduction": "Roo Code ist der führende autonome Coding-Agent. Mach dich bereit, zu architektieren, zu coden, zu debuggen und deine Produktivität wie nie zuvor zu steigern. Um fortzufahren, benötigt Roo Code einen API-Schlüssel.", "notice": "Um loszulegen, benötigt diese Erweiterung einen API-Anbieter.", "start": "Los geht's!", "chooseProvider": "Wähle einen API-Anbieter, um zu beginnen:", diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 1874dc53c0..49a79953f8 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -1,5 +1,5 @@ { - "greeting": "What can Roo do for you?", + "greeting": "Welcome to Roo", "task": { "title": "Task", "seeMore": "See more", @@ -7,7 +7,7 @@ "tokens": "Tokens:", "cache": "Cache:", "apiCost": "API Cost:", - "contextWindow": "Context Window:", + "contextWindow": "Context Length:", "closeAndStart": "Close task and start a new one", "export": "Export task history", "delete": "Delete Task (Shift + Click to skip confirmation)" @@ -65,7 +65,7 @@ "tooltip": "Cancel the current operation" }, "scrollToBottom": "Scroll to bottom of chat", - "aboutMe": "Thanks to the latest breakthroughs in agentic coding capabilities, I can handle complex software development tasks step-by-step. With tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (after you grant permission), I can assist you in ways that go beyond code completion or tech support. I can even use MCP to create new tools and extend my own capabilities.", + "onboarding": "Your task list in this workspace is empty. Start by typing in a task below. Not sure how to begin? Read more about what Roo can do for you in the docs.", "selectMode": "Select mode for interaction", "selectApiConfig": "Select API configuration", "enhancePrompt": "Enhance prompt with additional context", diff --git a/webview-ui/src/i18n/locales/en/history.json b/webview-ui/src/i18n/locales/en/history.json index 81b93645f0..5e785fd544 100644 --- a/webview-ui/src/i18n/locales/en/history.json +++ b/webview-ui/src/i18n/locales/en/history.json @@ -1,6 +1,6 @@ { "recentTasks": "Recent Tasks", - "viewAll": "View All", + "viewAll": "View All Tasks", "tokens": "Tokens: ↑{{in}} ↓{{out}}", "cache": "Cache: +{{writes}} → {{reads}}", "apiCost": "API Cost: ${{cost}}", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index ffd68f7e6e..04dcd12bd5 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -478,11 +478,5 @@ "labels": { "customArn": "Custom ARN", "useCustomArn": "Use custom ARN..." - }, - "interface": { - "showgreeting": { - "label": "Show greeting message", - "description": "When enabled, Roo will display a welcome message and introduction." - } } } diff --git a/webview-ui/src/i18n/locales/en/welcome.json b/webview-ui/src/i18n/locales/en/welcome.json index 811d760c0f..5f46a80a03 100644 --- a/webview-ui/src/i18n/locales/en/welcome.json +++ b/webview-ui/src/i18n/locales/en/welcome.json @@ -1,6 +1,6 @@ { "greeting": "Hi, I'm Roo!", - "introduction": "I can do all kinds of tasks thanks to the latest breakthroughs in agentic coding capabilities and access to tools that let me create & edit files, explore complex projects, use the browser, and execute terminal commands (with your permission, of course). I can even use MCP to create new tools and extend my own capabilities.", + "introduction": "Roo Code is the premiere autonomous coding agent. Get ready to architect, code, debug, and boost your productivity like you've never seen before. To continue, Roo Code requires an API key.", "notice": "To get started, this extension needs an API provider.", "start": "Let's go!", "chooseProvider": "Choose an API provider to get started:", diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index d1f36460fc..90b6c8fcd7 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -7,7 +7,7 @@ "tokens": "Tokens:", "cache": "Caché:", "apiCost": "Costo de API:", - "contextWindow": "Ventana de contexto:", + "contextWindow": "Longitud del contexto:", "closeAndStart": "Cerrar tarea e iniciar una nueva", "export": "Exportar historial de tareas", "delete": "Eliminar tarea (Shift + Clic para omitir confirmación)" @@ -65,7 +65,7 @@ "tooltip": "Cancelar la operación actual" }, "scrollToBottom": "Desplazarse al final del chat", - "aboutMe": "Gracias a los últimos avances en capacidades de codificación agentiva, puedo manejar tareas complejas de desarrollo de software paso a paso. Con herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (después de tu aprobación), puedo ayudarte de maneras que van más allá de la finalización de código o el soporte técnico. Incluso puedo usar MCP para crear nuevas herramientas y ampliar mis propias capacidades.", + "onboarding": "", "selectMode": "Seleccionar modo de interacción", "selectApiConfig": "Seleccionar configuración de API", "enhancePrompt": "Mejorar el mensaje con contexto adicional", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 8e68d7be47..e504111781 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "ARN personalizado", "useCustomArn": "Usar ARN personalizado..." - }, - "interface": { - "showgreeting": { - "label": "Mostrar mensaje de bienvenida", - "description": "Cuando está habilitado, Roo mostrará un mensaje de bienvenida e introducción." - } } } diff --git a/webview-ui/src/i18n/locales/es/welcome.json b/webview-ui/src/i18n/locales/es/welcome.json index b2289200a1..bfcedb61cb 100644 --- a/webview-ui/src/i18n/locales/es/welcome.json +++ b/webview-ui/src/i18n/locales/es/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "¡Hola, soy Roo!", - "introduction": "Puedo realizar todo tipo de tareas gracias a los últimos avances en capacidades de codificación agentica y acceso a herramientas que me permiten crear y editar archivos, explorar proyectos complejos, usar el navegador y ejecutar comandos de terminal (con tu permiso, por supuesto). Incluso puedo usar MCP para crear nuevas herramientas y ampliar mis propias capacidades.", + "greeting": "Bienvenido a Roo", + "introduction": "Roo Code es el principal agente de codificación autónomo. Prepárate para arquitectar, codificar, depurar y aumentar tu productividad como nunca antes. Para continuar, Roo Code requiere una clave API.", "notice": "Para comenzar, esta extensión necesita un proveedor de API.", "start": "¡Vamos!", "chooseProvider": "Elige un proveedor de API para comenzar:", diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 5a75ecc6b0..700d58601c 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -7,7 +7,7 @@ "tokens": "Tokens :", "cache": "Cache :", "apiCost": "Coût API :", - "contextWindow": "Fenêtre de contexte :", + "contextWindow": "Durée du contexte :", "closeAndStart": "Fermer la tâche et en commencer une nouvelle", "export": "Exporter l'historique des tâches", "delete": "Supprimer la tâche (Shift + Clic pour ignorer la confirmation)" @@ -65,7 +65,7 @@ "tooltip": "Annuler l'opération actuelle" }, "scrollToBottom": "Défiler jusqu'au bas du chat", - "aboutMe": "Grâce aux dernières avancées en matière de capacités de codage agent, je peux gérer des tâches complexes de développement logiciel étape par étape. Avec des outils qui me permettent de créer et d'éditer des fichiers, d'explorer des projets complexes, d'utiliser le navigateur et d'exécuter des commandes de terminal (après votre autorisation), je peux vous aider de manières qui vont au-delà de la complétion de code ou du support technique. Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.", + "onboarding": "Grâce aux dernières avancées en matière de capacités de codage agent, je peux gérer des tâches complexes de développement logiciel étape par étape. Avec des outils qui me permettent de créer et d'éditer des fichiers, d'explorer des projets complexes, d'utiliser le navigateur et d'exécuter des commandes de terminal (après votre autorisation), je peux vous aider de manières qui vont au-delà de la complétion de code ou du support technique. Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.", "selectMode": "Sélectionner le mode d'interaction", "selectApiConfig": "Sélectionner la configuration API", "enhancePrompt": "Améliorer la requête avec un contexte supplémentaire", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 5c2904c1d2..e04f6a4de6 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "ARN personnalisé", "useCustomArn": "Utiliser un ARN personnalisé..." - }, - "interface": { - "showgreeting": { - "label": "Afficher le message de bienvenue", - "description": "Lorsque cette option est activée, Roo affichera un message de bienvenue et une introduction." - } } } diff --git a/webview-ui/src/i18n/locales/fr/welcome.json b/webview-ui/src/i18n/locales/fr/welcome.json index ca2038a4f5..d8ed64c768 100644 --- a/webview-ui/src/i18n/locales/fr/welcome.json +++ b/webview-ui/src/i18n/locales/fr/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "Salut, je suis Roo !", - "introduction": "Je peux effectuer toutes sortes de tâches grâce aux dernières avancées en matière de capacités de codage agentique et à l'accès à des outils qui me permettent de créer et de modifier des fichiers, d'explorer des projets complexes, d'utiliser le navigateur et d'exécuter des commandes terminal (avec ta permission, bien sûr). Je peux même utiliser MCP pour créer de nouveaux outils et étendre mes propres capacités.", + "greeting": "Bienvenue à Roo", + "introduction": "Roo Code est l'agent de codage autonome de premier plan. Prépare-toi à architecturer, coder, déboguer et à augmenter ta productivité comme jamais auparavant. Pour continuer, Roo Code nécessite une clé API.", "notice": "Pour commencer, cette extension a besoin d'un fournisseur d'API.", "start": "C'est parti !", "chooseProvider": "Choisis un fournisseur d'API pour commencer :", diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 5e0379c2a6..7d22e4b679 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -7,7 +7,7 @@ "tokens": "Tokens:", "cache": "कैश:", "apiCost": "API लागत:", - "contextWindow": "संदर्भ विंडो:", + "contextWindow": "संदर्भ लंबाई:", "closeAndStart": "कार्य बंद करें और नया शुरू करें", "export": "कार्य इतिहास निर्यात करें", "delete": "कार्य हटाएं (पुष्टि को छोड़ने के लिए Shift + क्लिक)" @@ -65,7 +65,7 @@ "tooltip": "वर्तमान ऑपरेशन रद्द करें" }, "scrollToBottom": "चैट के निचले हिस्से तक स्क्रॉल करें", - "aboutMe": "एजेंटिक कोडिंग क्षमताओं में नवीनतम प्रगति के कारण, मैं जटिल सॉफ्टवेयर विकास कार्यों को चरण-दर-चरण संभाल सकता हूं। ऐसे उपकरणों के साथ जो मुझे फ़ाइलें बनाने और संपादित करने, जटिल प्रोजेक्ट का अन्वेषण करने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड (आपकी अनुमति के बाद) निष्पादित करने की अनुमति देते हैं, मैं आपकी मदद कोड पूर्णता या तकनीकी समर्थन से परे तरीकों से कर सकता हूं। मैं अपनी क्षमताओं का विस्तार करने और नए उपकरण बनाने के लिए MCP का भी उपयोग कर सकता हूं।", + "onboarding": "एजेंटिक कोडिंग क्षमताओं में नवीनतम प्रगति के कारण, मैं जटिल सॉफ्टवेयर विकास कार्यों को चरण-दर-चरण संभाल सकता हूं। ऐसे उपकरणों के साथ जो मुझे फ़ाइलें बनाने और संपादित करने, जटिल प्रोजेक्ट का अन्वेषण करने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड (आपकी अनुमति के बाद) निष्पादित करने की अनुमति देते हैं, मैं आपकी मदद कोड पूर्णता या तकनीकी समर्थन से परे तरीकों से कर सकता हूं। मैं अपनी क्षमताओं का विस्तार करने और नए उपकरण बनाने के लिए MCP का भी उपयोग कर सकता हूं।", "selectMode": "इंटरैक्शन मोड चुनें", "selectApiConfig": "API कॉन्फ़िगरेशन चुनें", "enhancePrompt": "अतिरिक्त संदर्भ के साथ प्रॉम्प्ट बढ़ाएँ", diff --git a/webview-ui/src/i18n/locales/hi/history.json b/webview-ui/src/i18n/locales/hi/history.json index 0cae1e9cc1..dcadfbe5e4 100644 --- a/webview-ui/src/i18n/locales/hi/history.json +++ b/webview-ui/src/i18n/locales/hi/history.json @@ -1,5 +1,5 @@ { - "recentTasks": "हालिया कार्य", + "recentTasks": "हाल के कार्य", "viewAll": "सभी देखें", "tokens": "Tokens: ↑{{in}} ↓{{out}}", "cache": "कैश: +{{writes}} → {{reads}}", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 414c312c5c..40435cf6bf 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "कस्टम ARN", "useCustomArn": "कस्टम ARN का उपयोग करें..." - }, - "interface": { - "showgreeting": { - "label": "स्वागत संदेश दिखाएँ", - "description": "जब सक्षम किया जाता है, तो Roo एक स्वागत संदेश और परिचय प्रदर्शित करेगा।" - } } } diff --git a/webview-ui/src/i18n/locales/hi/welcome.json b/webview-ui/src/i18n/locales/hi/welcome.json index 6ec08c646b..69dd5321be 100644 --- a/webview-ui/src/i18n/locales/hi/welcome.json +++ b/webview-ui/src/i18n/locales/hi/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "नमस्ते, मैं रू हूँ!", - "introduction": "मैं सभी प्रकार के कार्य कर सकता हूँ, एजेंटिक कोडिंग क्षमताओं में नवीनतम सफलताओं और उन टूल्स तक पहुंच के लिए धन्यवाद जो मुझे फाइलें बनाने और संपादित करने, जटिल परियोजनाओं का पता लगाने, ब्राउज़र का उपयोग करने और टर्मिनल कमांड निष्पादित करने की अनुमति देते हैं (आपकी अनुमति से, बिल्कुल)। मैं MCP का उपयोग करके नए टूल बना सकता हूँ और अपनी क्षमताओं का विस्तार कर सकता हूँ।", + "greeting": "ROO में आपका स्वागत है", + "introduction": "Roo Code प्रमुख स्वायत्त कोडिंग एजेंट है। आर्किटेक्ट, कोड, डीबग करने और अपनी उत्पादकता को पहले कभी न देखे गए तरीके से बढ़ाने के लिए तैयार हो जाइए। जारी रखने के लिए, Roo Code को एक API कुंजी की आवश्यकता है।", "notice": "शुरू करने के लिए, इस एक्सटेंशन को एक API प्रदाता की आवश्यकता है।", "start": "चलो शुरू करें!", "chooseProvider": "शुरू करने के लिए एक API प्रदाता चुनें:", diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 9ddf4f105d..816f557181 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -7,7 +7,7 @@ "tokens": "Tokens:", "cache": "Cache:", "apiCost": "Costo API:", - "contextWindow": "Finestra di contesto:", + "contextWindow": "Lunghezza del contesto:", "closeAndStart": "Chiudi attività e iniziane una nuova", "export": "Esporta cronologia attività", "delete": "Elimina attività (Shift + Clic per saltare la conferma)" @@ -65,7 +65,7 @@ "tooltip": "Annulla l'operazione corrente" }, "scrollToBottom": "Scorri fino alla fine della chat", - "aboutMe": "Grazie alle più recenti innovazioni nelle capacità di codifica agentica, posso gestire complesse attività di sviluppo software passo dopo passo. Con strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi da terminale (dopo la tua autorizzazione), posso aiutarti in modi che vanno oltre il completamento del codice o il supporto tecnico. Posso persino usare MCP per creare nuovi strumenti ed estendere le mie capacità.", + "onboarding": "Grazie alle più recenti innovazioni nelle capacità di codifica agentica, posso gestire complesse attività di sviluppo software passo dopo passo. Con strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi da terminale (dopo la tua autorizzazione), posso aiutarti in modi che vanno oltre il completamento del codice o il supporto tecnico. Posso persino usare MCP per creare nuovi strumenti ed estendere le mie capacità.", "selectMode": "Seleziona modalità di interazione", "selectApiConfig": "Seleziona configurazione API", "enhancePrompt": "Migliora prompt con contesto aggiuntivo", diff --git a/webview-ui/src/i18n/locales/it/history.json b/webview-ui/src/i18n/locales/it/history.json index 11d7e7f82c..9f0dc2ce75 100644 --- a/webview-ui/src/i18n/locales/it/history.json +++ b/webview-ui/src/i18n/locales/it/history.json @@ -1,5 +1,5 @@ { - "recentTasks": "Attività recenti", + "recentTasks": "Compiti recenti", "viewAll": "Vedi tutto", "tokens": "Tokens: ↑{{in}} ↓{{out}}", "cache": "Cache: +{{writes}} → {{reads}}", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 63a3b5810e..3e565d4db5 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "ARN personalizzato", "useCustomArn": "Usa ARN personalizzato..." - }, - "interface": { - "showgreeting": { - "label": "Mostra messaggio di benvenuto", - "description": "Quando abilitato, Roo mostrerà un messaggio di benvenuto e un'introduzione." - } } } diff --git a/webview-ui/src/i18n/locales/it/welcome.json b/webview-ui/src/i18n/locales/it/welcome.json index 94dba7c2e9..861213d182 100644 --- a/webview-ui/src/i18n/locales/it/welcome.json +++ b/webview-ui/src/i18n/locales/it/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "Ciao, sono Roo!", - "introduction": "Posso svolgere tutti i tipi di attività grazie ai più recenti progressi nelle capacità di codifica agentica e all'accesso a strumenti che mi permettono di creare e modificare file, esplorare progetti complessi, utilizzare il browser ed eseguire comandi terminal (con il tuo permesso, ovviamente). Posso persino utilizzare MCP per creare nuovi strumenti ed estendere le mie capacità.", + "greeting": "Benvenuto su Roo", + "introduction": "Roo Code è il principale agente di codifica autonomo. Preparati ad architettare, codificare, debuggare e aumentare la tua produttività come mai prima d'ora. Per continuare, Roo Code richiede una chiave API.", "notice": "Per iniziare, questa estensione necessita di un fornitore di API.", "start": "Andiamo!", "chooseProvider": "Scegli un fornitore di API per iniziare:", diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 0d43615f39..679d8f551f 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Rooにお手伝いできることはありますか?", + "greeting": "ROOへようこそ", "task": { "title": "タスク", "seeMore": "もっと見る", @@ -65,7 +65,7 @@ "tooltip": "現在の操作をキャンセル" }, "scrollToBottom": "チャットの最下部にスクロール", - "aboutMe": "最新のエージェント型コーディング能力の進歩により、複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可後)を可能にするツールにより、コード補完や技術サポート以上の方法であなたをサポートできます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。", + "onboarding": "最新のエージェント型コーディング能力の進歩により、複雑なソフトウェア開発タスクをステップバイステップで処理できます。ファイルの作成や編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(許可後)を可能にするツールにより、コード補完や技術サポート以上の方法であなたをサポートできます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。", "selectMode": "対話モードを選択", "selectApiConfig": "API設定を選択", "enhancePrompt": "追加コンテキストでプロンプトを強化", diff --git a/webview-ui/src/i18n/locales/ja/history.json b/webview-ui/src/i18n/locales/ja/history.json index bf435e4431..561df1e52b 100644 --- a/webview-ui/src/i18n/locales/ja/history.json +++ b/webview-ui/src/i18n/locales/ja/history.json @@ -1,5 +1,5 @@ { - "recentTasks": "最近のタスク", + "recentTasks": "Recent Tasks", "viewAll": "すべて表示", "tokens": "Tokens: ↑{{in}} ↓{{out}}", "cache": "キャッシュ: +{{writes}} → {{reads}}", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 78f0b280ce..5ec5eb8992 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "カスタム ARN", "useCustomArn": "カスタム ARN を使用..." - }, - "interface": { - "showgreeting": { - "label": "ようこそメッセージを表示", - "description": "有効にすると、Rooはようこそメッセージと紹介を表示します。" - } } } diff --git a/webview-ui/src/i18n/locales/ja/welcome.json b/webview-ui/src/i18n/locales/ja/welcome.json index 6b614d3dd2..d0bc5e8079 100644 --- a/webview-ui/src/i18n/locales/ja/welcome.json +++ b/webview-ui/src/i18n/locales/ja/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "こんにちは、私はルーです!", - "introduction": "エージェント型コーディング能力の最新の進歩と、ファイルの作成・編集、複雑なプロジェクトの探索、ブラウザの使用、ターミナルコマンドの実行(もちろんあなたの許可を得て)を可能にするツールへのアクセスにより、あらゆる種類のタスクを実行できます。MCPを使用して新しいツールを作成し、自分の能力を拡張することもできます。", + "greeting": "ROOへようこそ", + "introduction": "Roo Codeは最高の自律型コーディングエージェントです。アーキテクチャの設計、コーディング、デバッグ、そして今までにない生産性向上を体験する準備をしてください。続行するには、Roo CodeにはAPIキーが必要です。", "notice": "開始するには、この拡張機能にはAPIプロバイダーが必要です。", "start": "さあ、始めましょう!", "chooseProvider": "開始するにはAPIプロバイダーを選択してください:", diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index dcd1d4dd82..8aa0d70dc2 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Roo가 어떻게 도와드릴까요?", + "greeting": "Roo에 오신 것을 환영합니다", "task": { "title": "작업", "seeMore": "더 보기", @@ -65,7 +65,7 @@ "tooltip": "현재 작업 취소" }, "scrollToBottom": "채팅 하단으로 스크롤", - "aboutMe": "최신 에이전트 코딩 기능의 발전 덕분에 복잡한 소프트웨어 개발 작업을 단계별로 처리할 수 있습니다. 파일 생성 및 편집, 복잡한 프로젝트 탐색, 브라우저 사용, 터미널 명령 실행(승인 후)을 가능하게 하는 도구를 통해 코드 완성이나 기술 지원을 넘어서는 방식으로 도움을 드릴 수 있습니다. MCP를 사용하여 새로운 도구를 만들고 자체 기능을 확장할 수도 있습니다.", + "onboarding": "이 작업 공간의 작업 목록이 비어 있습니다. 아래에 작업을 입력하여 시작하세요. 어떻게 시작해야 할지 모르겠나요? Roo가 무엇을 할 수 있는지 문서에서 자세히 알아보세요.", "selectMode": "상호작용 모드 선택", "selectApiConfig": "API 구성 선택", "enhancePrompt": "추가 컨텍스트로 프롬프트 향상", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index b051a4cda8..06a1eec9d8 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "사용자 지정 ARN", "useCustomArn": "사용자 지정 ARN 사용..." - }, - "interface": { - "showgreeting": { - "label": "환영 메시지 표시", - "description": "활성화하면 Roo가 환영 메시지와 소개를 표시합니다." - } } } diff --git a/webview-ui/src/i18n/locales/ko/welcome.json b/webview-ui/src/i18n/locales/ko/welcome.json index 83eb000af1..8b4c6e0da2 100644 --- a/webview-ui/src/i18n/locales/ko/welcome.json +++ b/webview-ui/src/i18n/locales/ko/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "안녕하세요, 저는 루입니다!", - "introduction": "에이전트 코딩 능력의 최신 발전과 파일 생성 및 편집, 복잡한 프로젝트 탐색, 브라우저 사용, 터미널 명령 실행(물론 사용자의 허락 하에)을 가능하게 하는 도구에 대한 접근 덕분에 모든 종류의 작업을 수행할 수 있습니다. MCP를 사용하여 새로운 도구를 만들고 제 능력을 확장할 수도 있습니다.", + "greeting": "Roo에 오신 것을 환영합니다", + "introduction": "Roo Code는 최고의 자율적 코딩 에이전트입니다. 아키텍처 설계, 코딩, 디버깅, 그리고 전례 없는 생산성 향상을 경험할 준비를 하세요. 계속하려면 Roo Code에 API 키가 필요합니다.", "notice": "시작하려면 이 확장 프로그램에 API 공급자가 필요합니다.", "start": "시작해 봅시다!", "chooseProvider": "시작하려면 API 공급자를 선택하세요:", diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 841a41f390..6f3af7b19c 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Co Roo może dla Ciebie zrobić?", + "greeting": "Witamy w Roo", "task": { "title": "Zadanie", "seeMore": "Zobacz więcej", @@ -65,7 +65,7 @@ "tooltip": "Anuluj bieżącą operację" }, "scrollToBottom": "Przewiń do dołu czatu", - "aboutMe": "Dzięki najnowszym przełomom w zdolnościach kodowania agentowego, mogę krok po kroku obsługiwać złożone zadania związane z tworzeniem oprogramowania. Dzięki narzędziom, które pozwalają mi tworzyć i edytować pliki, eksplorować złożone projekty, korzystać z przeglądarki i wykonywać polecenia terminala (po udzieleniu zgody), mogę pomagać w sposób wykraczający poza uzupełnianie kodu czy wsparcie techniczne. Mogę nawet używać MCP do tworzenia nowych narzędzi i rozszerzania własnych możliwości.", + "onboarding": "Twoja lista zadań w tym obszarze roboczym jest pusta. Zacznij od wpisania zadania poniżej. Nie wiesz, jak zacząć? Przeczytaj więcej o tym, co Roo może dla Ciebie zrobić w dokumentacji.", "selectMode": "Wybierz tryb interakcji", "selectApiConfig": "Wybierz konfigurację API", "enhancePrompt": "Ulepsz podpowiedź dodatkowym kontekstem", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 024c356a57..7556210ee1 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "Niestandardowy ARN", "useCustomArn": "Użyj niestandardowego ARN..." - }, - "interface": { - "showgreeting": { - "label": "Pokaż wiadomość powitalną", - "description": "Gdy włączone, Roo wyświetli wiadomość powitalną i wprowadzenie." - } } } diff --git a/webview-ui/src/i18n/locales/pl/welcome.json b/webview-ui/src/i18n/locales/pl/welcome.json index fb13723490..502f52e2bb 100644 --- a/webview-ui/src/i18n/locales/pl/welcome.json +++ b/webview-ui/src/i18n/locales/pl/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "Cześć, jestem Roo!", - "introduction": "Mogę wykonywać wszelkiego rodzaju zadania dzięki najnowszym osiągnięciom w zakresie możliwości kodowania agentowego i dostępu do narzędzi, które pozwalają mi tworzyć i edytować pliki, eksplorować złożone projekty, korzystać z przeglądarki i wykonywać polecenia terminalowe (oczywiście za Twoją zgodą). Mogę nawet używać MCP do tworzenia nowych narzędzi i rozszerzania własnych możliwości.", + "greeting": "Witamy w Roo", + "introduction": "Roo Code to wiodący autonomiczny agent kodowania. Przygotuj się na projektowanie architektury, kodowanie, debugowanie i zwiększenie produktywności jak nigdy dotąd. Aby kontynuować, Roo Code wymaga klucza API.", "notice": "Aby rozpocząć, to rozszerzenie potrzebuje dostawcy API.", "start": "Zaczynajmy!", "chooseProvider": "Wybierz dostawcę API, aby rozpocząć:", diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 0a5ea9d157..f52920cc7b 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -1,5 +1,5 @@ { - "greeting": "O que o Roo pode fazer por você?", + "greeting": "Bem-vindo a Roo", "task": { "title": "Tarefa", "seeMore": "Ver mais", @@ -65,7 +65,7 @@ "tooltip": "Cancelar a operação atual" }, "scrollToBottom": "Rolar para o final do chat", - "aboutMe": "Graças aos mais recentes avanços em capacidades de codificação agentiva, posso lidar com tarefas complexas de desenvolvimento de software passo a passo. Com ferramentas que me permitem criar e editar arquivos, explorar projetos complexos, usar o navegador e executar comandos de terminal (após sua permissão), posso ajudar de maneiras que vão além da conclusão de código ou suporte técnico. Posso até usar o MCP para criar novas ferramentas e expandir minhas próprias capacidades.", + "onboarding": "Sua lista de tarefas neste espaço de trabalho está vazia. Comece digitando uma tarefa abaixo. Não sabe como começar? Leia mais sobre o que o Roo pode fazer por você nos documentos.", "selectMode": "Selecionar modo de interação", "selectApiConfig": "Selecionar configuração de API", "enhancePrompt": "Aprimorar prompt com contexto adicional", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 428fc2fa03..14742d8db9 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "ARN personalizado", "useCustomArn": "Usar ARN personalizado..." - }, - "interface": { - "showgreeting": { - "label": "Mostrar mensagem de boas-vindas", - "description": "Quando ativado, o Roo exibirá uma mensagem de boas-vindas e introdução." - } } } diff --git a/webview-ui/src/i18n/locales/pt-BR/welcome.json b/webview-ui/src/i18n/locales/pt-BR/welcome.json index 5f0fa0c193..03a47b303e 100644 --- a/webview-ui/src/i18n/locales/pt-BR/welcome.json +++ b/webview-ui/src/i18n/locales/pt-BR/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "Olá, eu sou o Roo!", - "introduction": "Posso realizar todos os tipos de tarefas graças aos últimos avanços nas capacidades de codificação agentica e ao acesso a ferramentas que me permitem criar e editar arquivos, explorar projetos complexos, usar o navegador e executar comandos de terminal (com sua permissão, é claro). Posso até usar o MCP para criar novas ferramentas e expandir minhas próprias capacidades.", + "greeting": "Bem-vindo a Roo", + "introduction": "Roo Code é o principal agente de codificação autônomo. Prepare-se para arquitetar, codificar, depurar e aumentar sua produtividade como nunca antes. Para continuar, o Roo Code necessita de uma chave API.", "notice": "Para começar, esta extensão precisa de um provedor de API.", "start": "Vamos lá!", "chooseProvider": "Escolha um provedor de API para começar:", diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index bea0aa93bc..858e15bdcc 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -7,7 +7,7 @@ "tokens": "Tokenlar:", "cache": "Önbellek:", "apiCost": "API Maliyeti:", - "contextWindow": "Bağlam Penceresi:", + "contextWindow": "Bağlam Uzunluğu:", "closeAndStart": "Görevi kapat ve yeni bir görev başlat", "export": "Görev geçmişini dışa aktar", "delete": "Görevi sil (Onayı atlamak için Shift + Tıkla)" @@ -65,7 +65,7 @@ "tooltip": "Mevcut işlemi iptal et" }, "scrollToBottom": "Sohbetin altına kaydır", - "aboutMe": "Ajansal kodlama yeteneklerindeki son atılımlar sayesinde, karmaşık yazılım geliştirme görevlerini adım adım ele alabilirim. Dosya oluşturma ve düzenleme, karmaşık projeleri keşfetme, tarayıcıyı kullanma ve terminal komutlarını çalıştırma (izin verdikten sonra) olanağı sağlayan araçlarla, kod tamamlama veya teknik desteğin ötesinde size yardımcı olabilirim. Hatta yeni araçlar oluşturmak ve kendi yeteneklerimi genişletmek için MCP'yi bile kullanabilirim.", + "onboarding": "Bu çalışma alanındaki görev listeniz boş. Aşağıya bir görev yazarak başlayın. Nasıl başlayacağınızdan emin değil misiniz? Roo'nun sizin için neler yapabileceği hakkında daha fazla bilgiyi belgelerde okuyun.", "selectMode": "Etkileşim modunu seçin", "selectApiConfig": "API yapılandırmasını seçin", "enhancePrompt": "Ek bağlamla istemi geliştir", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 5d9e5d7e57..d378d5d528 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "Özel ARN", "useCustomArn": "Özel ARN kullan..." - }, - "interface": { - "showgreeting": { - "label": "Karşılama mesajını göster", - "description": "Etkinleştirildiğinde, Roo bir karşılama mesajı ve tanıtım gösterecektir." - } } } diff --git a/webview-ui/src/i18n/locales/tr/welcome.json b/webview-ui/src/i18n/locales/tr/welcome.json index 76bf97429e..5ff28bf1fb 100644 --- a/webview-ui/src/i18n/locales/tr/welcome.json +++ b/webview-ui/src/i18n/locales/tr/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "Merhaba, ben Roo!", - "introduction": "Ajan tabanlı kodlama yeteneklerindeki son gelişmeler ve dosya oluşturma ve düzenleme, karmaşık projeleri keşfetme, tarayıcı kullanma ve terminal komutları çalıştırma (tabii ki senin izninle) gibi işlemleri yapmamı sağlayan araçlara erişim sayesinde her türlü görevi gerçekleştirebilirim. Hatta MCP'yi kullanarak yeni araçlar oluşturabilir ve kendi yeteneklerimi genişletebilirim.", + "greeting": "Roo'ya Hoş Geldiniz", + "introduction": "Roo Code, önde gelen otonom kodlama aracıdır. Daha önce hiç görmediğin şekilde mimari tasarım yapmaya, kod yazmaya, hata ayıklamaya ve üretkenliğini artırmaya hazırlan. Devam etmek için Roo Code'un bir API anahtarına ihtiyacı var.", "notice": "Başlamak için bu eklentinin bir API sağlayıcısına ihtiyacı var.", "start": "Hadi başlayalım!", "chooseProvider": "Başlamak için bir API sağlayıcısı seç:", diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 82633febbc..9eed10180b 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -7,7 +7,7 @@ "tokens": "Tokens:", "cache": "Bộ nhớ đệm:", "apiCost": "Chi phí API:", - "contextWindow": "Cửa sổ ngữ cảnh:", + "contextWindow": "Chiều dài bối cảnh:", "closeAndStart": "Đóng nhiệm vụ và bắt đầu nhiệm vụ mới", "export": "Xuất lịch sử nhiệm vụ", "delete": "Xóa nhiệm vụ (Shift + Click để bỏ qua xác nhận)" @@ -65,7 +65,7 @@ "tooltip": "Hủy thao tác hiện tại" }, "scrollToBottom": "Cuộn xuống cuối cuộc trò chuyện", - "aboutMe": "Nhờ những đột phá mới nhất trong khả năng lập trình tác nhân, tôi có thể xử lý các nhiệm vụ phát triển phần mềm phức tạp từng bước một. Với các công cụ cho phép tôi tạo và chỉnh sửa tệp, khám phá các dự án phức tạp, sử dụng trình duyệt và thực thi lệnh terminal (sau khi bạn cấp quyền), tôi có thể hỗ trợ bạn theo cách vượt xa việc hoàn thành mã hoặc hỗ trợ kỹ thuật. Tôi thậm chí có thể sử dụng MCP để tạo các công cụ mới và mở rộng khả năng của mình.", + "onboarding": "Danh sách nhiệm vụ của bạn trong không gian làm việc này trống. Bắt đầu bằng cách nhập nhiệm vụ bên dưới. Bạn không chắc chắn nên bắt đầu như thế nào? Đọc thêm về những gì Roo có thể làm cho bạn trong tài liệu.", "selectMode": "Chọn chế độ tương tác", "selectApiConfig": "Chọn cấu hình API", "enhancePrompt": "Nâng cao yêu cầu với ngữ cảnh bổ sung", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 6a73d36857..e38971bc40 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "ARN tùy chỉnh", "useCustomArn": "Sử dụng ARN tùy chỉnh..." - }, - "interface": { - "showgreeting": { - "label": "Hiển thị thông báo chào mừng", - "description": "Khi được bật, Roo sẽ hiển thị thông báo chào mừng và giới thiệu." - } } } diff --git a/webview-ui/src/i18n/locales/vi/welcome.json b/webview-ui/src/i18n/locales/vi/welcome.json index 91dcea70c6..4d3551a1f9 100644 --- a/webview-ui/src/i18n/locales/vi/welcome.json +++ b/webview-ui/src/i18n/locales/vi/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "Xin chào, tôi là Roo!", - "introduction": "Tôi có thể thực hiện nhiều loại nhiệm vụ nhờ vào những đột phá mới nhất trong khả năng lập trình dạng đại lý và quyền truy cập vào các công cụ cho phép tôi tạo & chỉnh sửa tệp, khám phá các dự án phức tạp, sử dụng trình duyệt và thực thi lệnh terminal (với sự cho phép của bạn, tất nhiên). Tôi thậm chí có thể sử dụng MCP để tạo công cụ mới và mở rộng khả năng của mình.", + "greeting": "Chào mừng bạn đến với Roo", + "introduction": "Roo Code là công cụ lập trình tự động hàng đầu. Hãy sẵn sàng để thiết kế kiến trúc, viết mã, gỡ lỗi và tăng năng suất của bạn như chưa từng có trước đây. Để tiếp tục, Roo Code yêu cầu một khóa API.", "notice": "Để bắt đầu, tiện ích mở rộng này cần một nhà cung cấp API.", "start": "Bắt đầu thôi!", "chooseProvider": "Chọn một nhà cung cấp API để bắt đầu:", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 0e641bd516..f794aa6283 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -7,7 +7,7 @@ "tokens": "Token 用量:", "cache": "缓存:", "apiCost": "API 费用:", - "contextWindow": "上下文窗口:", + "contextWindow": "上下文长度:", "closeAndStart": "关闭任务并开始新任务", "export": "导出任务历史", "delete": "删除任务(Shift + 点击跳过确认)" @@ -65,7 +65,7 @@ "tooltip": "取消当前操作" }, "scrollToBottom": "滚动到聊天底部", - "aboutMe": "基于最新的AI编程技术,我可以逐步处理复杂软件开发任务。支持创建编辑文件、分析复杂项目、浏览器操作及运行终端命令,不仅能提供代码补全和基础答疑,还能完成更高阶的开发协助。通过MCP系统,我甚至可以自己制作新工具,持续提升解决问题的能力。", + "onboarding": "此工作区中的任务列表为空。 请在下方输入任务开始。 不确定如何开始? 在 文档 中阅读更多关于 Roo 可以为您做什么的信息。", "selectMode": "选择交互模式", "selectApiConfig": "选择API配置", "enhancePrompt": "增强提示词", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 1038b46f5d..53357ead9c 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -479,11 +479,5 @@ "labels": { "customArn": "自定义 ARN", "useCustomArn": "使用自定义 ARN..." - }, - "interface": { - "showgreeting": { - "label": "显示欢迎消息", - "description": "启用后,Roo 将显示欢迎语和简介。" - } } } diff --git a/webview-ui/src/i18n/locales/zh-CN/welcome.json b/webview-ui/src/i18n/locales/zh-CN/welcome.json index 93179bb112..bb1056b4d3 100644 --- a/webview-ui/src/i18n/locales/zh-CN/welcome.json +++ b/webview-ui/src/i18n/locales/zh-CN/welcome.json @@ -1,6 +1,6 @@ { - "greeting": "你好,我是 Roo!", - "introduction": "基于最新的AI编程技术,我可以逐步处理复杂软件开发任务。支持创建编辑文件、分析复杂项目、浏览器操作及运行终端命令,不仅能提供代码补全和基础答疑,还能完成更高阶的开发协助。通过MCP系统,我甚至可以自己制作新工具,持续提升解决问题的能力。", + "greeting": "欢迎来到Roo", + "introduction": "Roo Code 是领先的自主编程助手。准备好以前所未有的方式进行架构设计、编码、调试并提升你的工作效率。要继续使用,Roo Code 需要一个 API 密钥。", "notice": "请先配置大语言模型API提供商", "start": "开始吧!", "chooseProvider": "选择一个 API 提供商开始:", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index c9ad321717..fbfaaf5d23 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -7,7 +7,7 @@ "tokens": "Tokens:", "cache": "快取:", "apiCost": "API 費用:", - "contextWindow": "上下文視窗:", + "contextWindow": "上下文長度:", "closeAndStart": "關閉現有工作並開始一項新的工作", "export": "匯出工作紀錄", "delete": "刪除工作(按住 Shift 並點選可跳過確認)" @@ -65,7 +65,7 @@ "tooltip": "取消目前操作" }, "scrollToBottom": "捲動至對話框底部", - "aboutMe": "由於程式代理功能的最新突破,我能夠逐步處理複雜的軟體開發工作。透過允許我建立和編輯檔案、探索複雜專案、使用瀏覽器和執行終端機命令(在您授權後)的工具,我可以以超越程式碼補全或技術支援的方式協助您。我甚至可以使用 MCP 建立新工具並擴展自己的能力。", + "onboarding": "您在此工作區中的工作清單是空的。 請在下方輸入工作以開始。 不確定如何開始? 在 說明文件 中閱讀更多關於 Roo 能為您做什麼的資訊。", "selectMode": "選擇互動模式", "selectApiConfig": "選擇 API 設定", "enhancePrompt": "使用額外內容增強提示", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 8d4efcf6b2..d144d92985 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -478,11 +478,5 @@ "labels": { "customArn": "自訂 ARN", "useCustomArn": "使用自訂 ARN..." - }, - "interface": { - "showgreeting": { - "label": "顯示歡迎訊息", - "description": "啟用後,Roo 將顯示歡迎訊息與介紹。" - } } } diff --git a/webview-ui/src/i18n/locales/zh-TW/welcome.json b/webview-ui/src/i18n/locales/zh-TW/welcome.json index a5bb584f55..171d095f5c 100644 --- a/webview-ui/src/i18n/locales/zh-TW/welcome.json +++ b/webview-ui/src/i18n/locales/zh-TW/welcome.json @@ -1,7 +1,7 @@ { - "greeting": "嗨,我是 Roo!", - "introduction": "由於程式代理功能的最新突破,以及能夠讓我建立和編輯檔案、探索複雜專案、使用瀏覽器和執行終端機命令的工具(在您授權後),我能完成各種工作。我甚至可以使用 MCP 建立新工具並擴展自己的功能。", - "notice": "要開始使用,此擴充功能需要一個 API 提供者。", + "greeting": "歡迎來到 Roo", + "introduction": "Roo Code 是頂尖的自主編程助手。準備好以前所未有的方式進行架構設計、編碼、除錯並提升您的工作效率。要繼續使用,Roo Code 需要一個 API 金鑰。", + "notice": "開始使用前,此擴充功能需要一個 API 提供者。", "start": "讓我們開始吧!", "chooseProvider": "選擇一個 API 提供者開始:", "routers": { From d3c37eaec8456f323f2beae971061c0dc9df8e85 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Thu, 17 Apr 2025 10:23:19 -0700 Subject: [PATCH 09/15] Add missing translation (#2714) * Add missing translation * More translation fixes --- .changeset/ten-grapes-punch.md | 5 +++++ webview-ui/src/i18n/locales/ca/chat.json | 2 +- webview-ui/src/i18n/locales/ca/welcome.json | 2 +- webview-ui/src/i18n/locales/de/chat.json | 2 +- webview-ui/src/i18n/locales/en/chat.json | 2 +- webview-ui/src/i18n/locales/es/chat.json | 4 ++-- webview-ui/src/i18n/locales/es/welcome.json | 2 +- webview-ui/src/i18n/locales/fr/chat.json | 2 +- webview-ui/src/i18n/locales/fr/welcome.json | 2 +- webview-ui/src/i18n/locales/hi/chat.json | 2 +- webview-ui/src/i18n/locales/hi/welcome.json | 2 +- webview-ui/src/i18n/locales/it/chat.json | 2 +- webview-ui/src/i18n/locales/it/welcome.json | 2 +- webview-ui/src/i18n/locales/ja/chat.json | 2 +- webview-ui/src/i18n/locales/ja/welcome.json | 2 +- webview-ui/src/i18n/locales/ko/chat.json | 2 +- webview-ui/src/i18n/locales/ko/welcome.json | 2 +- webview-ui/src/i18n/locales/pl/chat.json | 2 +- webview-ui/src/i18n/locales/pl/welcome.json | 2 +- webview-ui/src/i18n/locales/pt-BR/chat.json | 2 +- webview-ui/src/i18n/locales/pt-BR/welcome.json | 2 +- webview-ui/src/i18n/locales/tr/chat.json | 2 +- webview-ui/src/i18n/locales/tr/welcome.json | 2 +- webview-ui/src/i18n/locales/vi/chat.json | 2 +- webview-ui/src/i18n/locales/vi/welcome.json | 2 +- webview-ui/src/i18n/locales/zh-CN/chat.json | 2 +- webview-ui/src/i18n/locales/zh-CN/welcome.json | 2 +- webview-ui/src/i18n/locales/zh-TW/chat.json | 2 +- webview-ui/src/i18n/locales/zh-TW/welcome.json | 2 +- 29 files changed, 34 insertions(+), 29 deletions(-) create mode 100644 .changeset/ten-grapes-punch.md diff --git a/.changeset/ten-grapes-punch.md b/.changeset/ten-grapes-punch.md new file mode 100644 index 0000000000..d9fef3e018 --- /dev/null +++ b/.changeset/ten-grapes-punch.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Add missing translation diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 3e1022ce3d..6beabc0ea0 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Benvingut a Roo", + "greeting": "Benvingut a Roo Code", "task": { "title": "Tasca", "seeMore": "Veure més", diff --git a/webview-ui/src/i18n/locales/ca/welcome.json b/webview-ui/src/i18n/locales/ca/welcome.json index 579901c2c2..bbc2c5d64c 100644 --- a/webview-ui/src/i18n/locales/ca/welcome.json +++ b/webview-ui/src/i18n/locales/ca/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "Hola, sóc en Roo!", + "greeting": "Hola, sóc Roo!", "introduction": "Roo Code és el principal agent de codificació autònom. Prepara't per arquitectar, codificar, depurar i augmentar la teva productivitat com mai abans. Per continuar, Roo Code necessita una clau API.", "notice": "Per començar, aquesta extensió necessita un proveïdor d'API.", "start": "Som-hi!", diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index b1d52b3980..456680016a 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Willkommen in Roo", + "greeting": "Willkommen bei Roo Code", "task": { "title": "Aufgabe", "seeMore": "Mehr anzeigen", diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 49a79953f8..03bc1d7b04 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Welcome to Roo", + "greeting": "Welcome to Roo Code", "task": { "title": "Task", "seeMore": "See more", diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 90b6c8fcd7..9ba996ef28 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -1,5 +1,5 @@ { - "greeting": "¿Qué puede hacer Roo por ti?", + "greeting": "Bienvenido a Roo Code", "task": { "title": "Tarea", "seeMore": "Ver más", @@ -65,7 +65,7 @@ "tooltip": "Cancelar la operación actual" }, "scrollToBottom": "Desplazarse al final del chat", - "onboarding": "", + "onboarding": "Tu lista de tareas en este espacio de trabajo está vacía. Comienza escribiendo una tarea abajo. ¿No estás seguro cómo empezar? Lee más sobre lo que Roo puede hacer por ti en la documentación.", "selectMode": "Seleccionar modo de interacción", "selectApiConfig": "Seleccionar configuración de API", "enhancePrompt": "Mejorar el mensaje con contexto adicional", diff --git a/webview-ui/src/i18n/locales/es/welcome.json b/webview-ui/src/i18n/locales/es/welcome.json index bfcedb61cb..ccbf65bc6b 100644 --- a/webview-ui/src/i18n/locales/es/welcome.json +++ b/webview-ui/src/i18n/locales/es/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "Bienvenido a Roo", + "greeting": "¡Hola, soy Roo!", "introduction": "Roo Code es el principal agente de codificación autónomo. Prepárate para arquitectar, codificar, depurar y aumentar tu productividad como nunca antes. Para continuar, Roo Code requiere una clave API.", "notice": "Para comenzar, esta extensión necesita un proveedor de API.", "start": "¡Vamos!", diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 700d58601c..f9fc4ca3e4 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Que peut faire Roo pour vous ?", + "greeting": "Bienvenue sur Roo Code", "task": { "title": "Tâche", "seeMore": "Voir plus", diff --git a/webview-ui/src/i18n/locales/fr/welcome.json b/webview-ui/src/i18n/locales/fr/welcome.json index d8ed64c768..4b3bb43540 100644 --- a/webview-ui/src/i18n/locales/fr/welcome.json +++ b/webview-ui/src/i18n/locales/fr/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "Bienvenue à Roo", + "greeting": "Salut, je suis Roo !", "introduction": "Roo Code est l'agent de codage autonome de premier plan. Prépare-toi à architecturer, coder, déboguer et à augmenter ta productivité comme jamais auparavant. Pour continuer, Roo Code nécessite une clé API.", "notice": "Pour commencer, cette extension a besoin d'un fournisseur d'API.", "start": "C'est parti !", diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 7d22e4b679..d57cb09e5e 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Roo आपके लिए क्या कर सकता है?", + "greeting": "Roo Code में आपका स्वागत है", "task": { "title": "कार्य", "seeMore": "अधिक देखें", diff --git a/webview-ui/src/i18n/locales/hi/welcome.json b/webview-ui/src/i18n/locales/hi/welcome.json index 69dd5321be..2c858d50b9 100644 --- a/webview-ui/src/i18n/locales/hi/welcome.json +++ b/webview-ui/src/i18n/locales/hi/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "ROO में आपका स्वागत है", + "greeting": "नमस्ते, मैं रू हूँ!", "introduction": "Roo Code प्रमुख स्वायत्त कोडिंग एजेंट है। आर्किटेक्ट, कोड, डीबग करने और अपनी उत्पादकता को पहले कभी न देखे गए तरीके से बढ़ाने के लिए तैयार हो जाइए। जारी रखने के लिए, Roo Code को एक API कुंजी की आवश्यकता है।", "notice": "शुरू करने के लिए, इस एक्सटेंशन को एक API प्रदाता की आवश्यकता है।", "start": "चलो शुरू करें!", diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 816f557181..c4456c437e 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Cosa può fare Roo per te?", + "greeting": "Benvenuto a Roo Code", "task": { "title": "Attività", "seeMore": "Vedi altro", diff --git a/webview-ui/src/i18n/locales/it/welcome.json b/webview-ui/src/i18n/locales/it/welcome.json index 861213d182..f521778b25 100644 --- a/webview-ui/src/i18n/locales/it/welcome.json +++ b/webview-ui/src/i18n/locales/it/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "Benvenuto su Roo", + "greeting": "Ciao, sono Roo!", "introduction": "Roo Code è il principale agente di codifica autonomo. Preparati ad architettare, codificare, debuggare e aumentare la tua produttività come mai prima d'ora. Per continuare, Roo Code richiede una chiave API.", "notice": "Per iniziare, questa estensione necessita di un fornitore di API.", "start": "Andiamo!", diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 679d8f551f..bda35e1ef9 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -1,5 +1,5 @@ { - "greeting": "ROOへようこそ", + "greeting": "Roo Code へようこそ", "task": { "title": "タスク", "seeMore": "もっと見る", diff --git a/webview-ui/src/i18n/locales/ja/welcome.json b/webview-ui/src/i18n/locales/ja/welcome.json index d0bc5e8079..d4af12478d 100644 --- a/webview-ui/src/i18n/locales/ja/welcome.json +++ b/webview-ui/src/i18n/locales/ja/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "ROOへようこそ", + "greeting": "こんにちは、Rooです!", "introduction": "Roo Codeは最高の自律型コーディングエージェントです。アーキテクチャの設計、コーディング、デバッグ、そして今までにない生産性向上を体験する準備をしてください。続行するには、Roo CodeにはAPIキーが必要です。", "notice": "開始するには、この拡張機能にはAPIプロバイダーが必要です。", "start": "さあ、始めましょう!", diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 8aa0d70dc2..8fad15321a 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Roo에 오신 것을 환영합니다", + "greeting": "Roo Code에 오신 것을 환영합니다", "task": { "title": "작업", "seeMore": "더 보기", diff --git a/webview-ui/src/i18n/locales/ko/welcome.json b/webview-ui/src/i18n/locales/ko/welcome.json index 8b4c6e0da2..320e2f4af6 100644 --- a/webview-ui/src/i18n/locales/ko/welcome.json +++ b/webview-ui/src/i18n/locales/ko/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "Roo에 오신 것을 환영합니다", + "greeting": "안녕하세요, 저는 Roo입니다!", "introduction": "Roo Code는 최고의 자율적 코딩 에이전트입니다. 아키텍처 설계, 코딩, 디버깅, 그리고 전례 없는 생산성 향상을 경험할 준비를 하세요. 계속하려면 Roo Code에 API 키가 필요합니다.", "notice": "시작하려면 이 확장 프로그램에 API 공급자가 필요합니다.", "start": "시작해 봅시다!", diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 6f3af7b19c..56ee50a5fe 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Witamy w Roo", + "greeting": "Witamy w Roo Code", "task": { "title": "Zadanie", "seeMore": "Zobacz więcej", diff --git a/webview-ui/src/i18n/locales/pl/welcome.json b/webview-ui/src/i18n/locales/pl/welcome.json index 502f52e2bb..b85aa0029b 100644 --- a/webview-ui/src/i18n/locales/pl/welcome.json +++ b/webview-ui/src/i18n/locales/pl/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "Witamy w Roo", + "greeting": "Cześć, jestem Roo!", "introduction": "Roo Code to wiodący autonomiczny agent kodowania. Przygotuj się na projektowanie architektury, kodowanie, debugowanie i zwiększenie produktywności jak nigdy dotąd. Aby kontynuować, Roo Code wymaga klucza API.", "notice": "Aby rozpocząć, to rozszerzenie potrzebuje dostawcy API.", "start": "Zaczynajmy!", diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index f52920cc7b..178ef8662e 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Bem-vindo a Roo", + "greeting": "Bem-vindo ao Roo Code", "task": { "title": "Tarefa", "seeMore": "Ver mais", diff --git a/webview-ui/src/i18n/locales/pt-BR/welcome.json b/webview-ui/src/i18n/locales/pt-BR/welcome.json index 03a47b303e..561655cf7b 100644 --- a/webview-ui/src/i18n/locales/pt-BR/welcome.json +++ b/webview-ui/src/i18n/locales/pt-BR/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "Bem-vindo a Roo", + "greeting": "Olá, eu sou o Roo!", "introduction": "Roo Code é o principal agente de codificação autônomo. Prepare-se para arquitetar, codificar, depurar e aumentar sua produtividade como nunca antes. Para continuar, o Roo Code necessita de uma chave API.", "notice": "Para começar, esta extensão precisa de um provedor de API.", "start": "Vamos lá!", diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 858e15bdcc..652ecb331b 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Roo sizin için ne yapabilir?", + "greeting": "Roo Code'a Hoş Geldiniz", "task": { "title": "Görev", "seeMore": "Daha fazla gör", diff --git a/webview-ui/src/i18n/locales/tr/welcome.json b/webview-ui/src/i18n/locales/tr/welcome.json index 5ff28bf1fb..a2d6cc7cfa 100644 --- a/webview-ui/src/i18n/locales/tr/welcome.json +++ b/webview-ui/src/i18n/locales/tr/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "Roo'ya Hoş Geldiniz", + "greeting": "Merhaba, ben Roo!", "introduction": "Roo Code, önde gelen otonom kodlama aracıdır. Daha önce hiç görmediğin şekilde mimari tasarım yapmaya, kod yazmaya, hata ayıklamaya ve üretkenliğini artırmaya hazırlan. Devam etmek için Roo Code'un bir API anahtarına ihtiyacı var.", "notice": "Başlamak için bu eklentinin bir API sağlayıcısına ihtiyacı var.", "start": "Hadi başlayalım!", diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 9eed10180b..736b80fb08 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Roo có thể giúp gì cho bạn?", + "greeting": "Chào mừng đến với Roo Code", "task": { "title": "Nhiệm vụ", "seeMore": "Xem thêm", diff --git a/webview-ui/src/i18n/locales/vi/welcome.json b/webview-ui/src/i18n/locales/vi/welcome.json index 4d3551a1f9..4a80252b66 100644 --- a/webview-ui/src/i18n/locales/vi/welcome.json +++ b/webview-ui/src/i18n/locales/vi/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "Chào mừng bạn đến với Roo", + "greeting": "Xin chào, tôi là Roo!", "introduction": "Roo Code là công cụ lập trình tự động hàng đầu. Hãy sẵn sàng để thiết kế kiến trúc, viết mã, gỡ lỗi và tăng năng suất của bạn như chưa từng có trước đây. Để tiếp tục, Roo Code yêu cầu một khóa API.", "notice": "Để bắt đầu, tiện ích mở rộng này cần một nhà cung cấp API.", "start": "Bắt đầu thôi!", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index f794aa6283..bae6183e0c 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Roo 能为您做什么?", + "greeting": "欢迎使用 Roo Code", "task": { "title": "任务", "seeMore": "展开", diff --git a/webview-ui/src/i18n/locales/zh-CN/welcome.json b/webview-ui/src/i18n/locales/zh-CN/welcome.json index bb1056b4d3..580d84cb66 100644 --- a/webview-ui/src/i18n/locales/zh-CN/welcome.json +++ b/webview-ui/src/i18n/locales/zh-CN/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "欢迎来到Roo", + "greeting": "嗨,我是 Roo!", "introduction": "Roo Code 是领先的自主编程助手。准备好以前所未有的方式进行架构设计、编码、调试并提升你的工作效率。要继续使用,Roo Code 需要一个 API 密钥。", "notice": "请先配置大语言模型API提供商", "start": "开始吧!", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index fbfaaf5d23..fac403b84d 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -1,5 +1,5 @@ { - "greeting": "Roo 可以為您做些什麼?", + "greeting": "歡迎使用 Roo Code", "task": { "title": "工作", "seeMore": "顯示更多", diff --git a/webview-ui/src/i18n/locales/zh-TW/welcome.json b/webview-ui/src/i18n/locales/zh-TW/welcome.json index 171d095f5c..ab3ac52fcb 100644 --- a/webview-ui/src/i18n/locales/zh-TW/welcome.json +++ b/webview-ui/src/i18n/locales/zh-TW/welcome.json @@ -1,5 +1,5 @@ { - "greeting": "歡迎來到 Roo", + "greeting": "嗨,我是 Roo!", "introduction": "Roo Code 是頂尖的自主編程助手。準備好以前所未有的方式進行架構設計、編碼、除錯並提升您的工作效率。要繼續使用,Roo Code 需要一個 API 金鑰。", "notice": "開始使用前,此擴充功能需要一個 API 提供者。", "start": "讓我們開始吧!", From 1e0e01b9f3d1d0955e14901393920c2da9833c8b Mon Sep 17 00:00:00 2001 From: Sam Hoang Van Date: Fri, 18 Apr 2025 02:58:22 +0700 Subject: [PATCH 10/15] feat: add append_to_file tool for appending content to files (#2712) - Implemented the append_to_file tool to allow users to append content to existing files or create new ones if they do not exist. - Updated the rules and instructions to include the new tool. - Added tests for the append_to_file functionality, covering various scenarios including error handling and content preprocessing. - Enhanced the experiment schema to include the new append_to_file experiment ID. - Updated relevant interfaces and types to accommodate the new tool. - Modified the UI to display the append_to_file tool in the appropriate sections. --- src/core/Cline.ts | 6 + src/core/assistant-message/index.ts | 6 + .../__snapshots__/system.test.ts.snap | 308 ++++++++++++++++ src/core/prompts/sections/rules.ts | 9 + src/core/prompts/tools/append-to-file.ts | 25 ++ src/core/prompts/tools/index.ts | 3 + .../tools/__tests__/appendToFileTool.test.ts | 331 ++++++++++++++++++ src/core/tools/appendToFileTool.ts | 175 +++++++++ src/exports/roo-code.d.ts | 1 + src/exports/types.ts | 1 + src/schemas/index.ts | 3 +- src/shared/__tests__/experiments.test.ts | 3 + src/shared/experiments.ts | 2 + src/shared/tool-groups.ts | 3 +- 14 files changed, 874 insertions(+), 2 deletions(-) create mode 100644 src/core/prompts/tools/append-to-file.ts create mode 100644 src/core/tools/__tests__/appendToFileTool.test.ts create mode 100644 src/core/tools/appendToFileTool.ts diff --git a/src/core/Cline.ts b/src/core/Cline.ts index d025d72668..91885a2876 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -76,6 +76,7 @@ import { askFollowupQuestionTool } from "./tools/askFollowupQuestionTool" import { switchModeTool } from "./tools/switchModeTool" import { attemptCompletionTool } from "./tools/attemptCompletionTool" import { newTaskTool } from "./tools/newTaskTool" +import { appendToFileTool } from "./tools/appendToFileTool" export type ToolResponse = string | Array type UserContent = Array @@ -1390,6 +1391,8 @@ export class Cline extends EventEmitter { return `[${block.name} for '${block.params.task}']` case "write_to_file": return `[${block.name} for '${block.params.path}']` + case "append_to_file": + return `[${block.name} for '${block.params.path}']` case "apply_diff": return `[${block.name} for '${block.params.path}']` case "search_files": @@ -1573,6 +1576,9 @@ export class Cline extends EventEmitter { case "write_to_file": await writeToFileTool(this, block, askApproval, handleError, pushToolResult, removeClosingTag) break + case "append_to_file": + await appendToFileTool(this, block, askApproval, handleError, pushToolResult, removeClosingTag) + break case "apply_diff": await applyDiffTool(this, block, askApproval, handleError, pushToolResult, removeClosingTag) break diff --git a/src/core/assistant-message/index.ts b/src/core/assistant-message/index.ts index 77c2f6c403..0a1bec32f2 100644 --- a/src/core/assistant-message/index.ts +++ b/src/core/assistant-message/index.ts @@ -12,6 +12,7 @@ export const toolUseNames = [ "execute_command", "read_file", "write_to_file", + "append_to_file", "apply_diff", "insert_content", "search_and_replace", @@ -94,6 +95,11 @@ export interface WriteToFileToolUse extends ToolUse { params: Partial, "path" | "content" | "line_count">> } +export interface AppendToFileToolUse extends ToolUse { + name: "append_to_file" + params: Partial, "path" | "content">> +} + export interface InsertCodeBlockToolUse extends ToolUse { name: "insert_content" params: Partial, "path" | "operations">> diff --git a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap index ff556d80d4..380aee682f 100644 --- a/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap +++ b/src/core/prompts/__tests__/__snapshots__/system.test.ts.snap @@ -179,6 +179,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -576,6 +598,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## insert_content Description: Inserts content at specific line positions in a file. This is the primary tool for adding new content and code (functions/methods/classes, imports, attributes etc.) as it allows for precise insertions without overwriting existing content. The tool uses an efficient line-based insertion system that maintains file integrity and proper ordering of multiple insertions. Beware to use the proper indentation. This tool is the preferred way to add new content and code to files. Parameters: @@ -1062,6 +1106,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## search_and_replace Description: Request to perform search and replace operations on a file. Each operation can specify a search pattern (string or regex) and replacement text, with optional line range restrictions and regex flags. Shows a diff preview before applying changes. Parameters: @@ -1512,6 +1578,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -1909,6 +1997,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -2306,6 +2416,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -2703,6 +2835,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## browser_action Description: Request to interact with a Puppeteer-controlled browser. Every action, except \`close\`, will be responded to with a screenshot of the browser's current state, along with any new console logs. You may only perform one browser action per message, and wait for the user's response including a screenshot and logs to determine the next action. - The sequence of actions **must always start with** launching the browser at a URL, and **must always end with** closing the browser. If you need to visit a new URL that is not possible to navigate to from the current webpage, you must first close the browser, then launch again at the new URL. @@ -3156,6 +3310,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -3621,6 +3797,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## browser_action Description: Request to interact with a Puppeteer-controlled browser. Every action, except \`close\`, will be responded to with a screenshot of the browser's current state, along with any new console logs. You may only perform one browser action per message, and wait for the user's response including a screenshot and logs to determine the next action. - The sequence of actions **must always start with** launching the browser at a URL, and **must always end with** closing the browser. If you need to visit a new URL that is not possible to navigate to from the current webpage, you must first close the browser, then launch again at the new URL. @@ -4164,6 +4362,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -4563,6 +4783,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## execute_command Description: Request to execute a CLI command on the system. Use this when you need to perform system operations or run specific commands to accomplish any step in the user's task. You must tailor your command to the user's system and provide a clear explanation of what the command does. For command chaining, use the appropriate chaining syntax for the user's shell. Prefer to execute complex CLI commands over creating executable scripts, as they are more flexible and easier to run. Prefer relative commands and paths that avoid location sensitivity for terminal consistency, e.g: \`touch ./testdata/example.file\`, \`dir ./examples/model1/data/yaml\`, or \`go test ./cmd/front --config ./cmd/front/config.yml\`. If directed by the user, you may open a terminal in a different directory by using the \`cwd\` parameter. Parameters: @@ -5002,6 +5244,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## insert_content Description: Inserts content at specific line positions in a file. This is the primary tool for adding new content and code (functions/methods/classes, imports, attributes etc.) as it allows for precise insertions without overwriting existing content. The tool uses an efficient line-based insertion system that maintains file integrity and proper ordering of multiple insertions. Beware to use the proper indentation. This tool is the preferred way to add new content and code to files. Parameters: @@ -5561,6 +5825,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## insert_content Description: Inserts content at specific line positions in a file. This is the primary tool for adding new content and code (functions/methods/classes, imports, attributes etc.) as it allows for precise insertions without overwriting existing content. The tool uses an efficient line-based insertion system that maintains file integrity and proper ordering of multiple insertions. Beware to use the proper indentation. This tool is the preferred way to add new content and code to files. Parameters: @@ -6405,6 +6691,28 @@ Example: Requesting to write to frontend-config.json 14 +## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory /test/path) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + + + ## insert_content Description: Inserts content at specific line positions in a file. This is the primary tool for adding new content and code (functions/methods/classes, imports, attributes etc.) as it allows for precise insertions without overwriting existing content. The tool uses an efficient line-based insertion system that maintains file integrity and proper ordering of multiple insertions. Beware to use the proper indentation. This tool is the preferred way to add new content and code to files. Parameters: diff --git a/src/core/prompts/sections/rules.ts b/src/core/prompts/sections/rules.ts index 4772c9ed02..2e5d1be5b7 100644 --- a/src/core/prompts/sections/rules.ts +++ b/src/core/prompts/sections/rules.ts @@ -16,6 +16,9 @@ function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Recor if (experiments?.["insert_content"]) { availableTools.push("insert_content (for adding lines to existing files)") } + if (experiments?.["append_to_file"]) { + availableTools.push("append_to_file (for appending content to the end of files)") + } if (experiments?.["search_and_replace"]) { availableTools.push("search_and_replace (for finding and replacing individual pieces of text)") } @@ -32,6 +35,12 @@ function getEditingInstructions(diffStrategy?: DiffStrategy, experiments?: Recor ) } + if (experiments?.["append_to_file"]) { + instructions.push( + "- The append_to_file tool adds content to the end of files, such as appending new log entries or adding new data records. This tool will always add the content at the end of the file.", + ) + } + if (experiments?.["search_and_replace"]) { instructions.push( "- The search_and_replace tool finds and replaces text or regex in files. This tool allows you to search for a specific regex pattern or text and replace it with another value. Be cautious when using this tool to ensure you are replacing the correct text. It can support multiple operations at once.", diff --git a/src/core/prompts/tools/append-to-file.ts b/src/core/prompts/tools/append-to-file.ts new file mode 100644 index 0000000000..ae24c83dc9 --- /dev/null +++ b/src/core/prompts/tools/append-to-file.ts @@ -0,0 +1,25 @@ +import { ToolArgs } from "./types" + +export function getAppendToFileDescription(args: ToolArgs): string { + return `## append_to_file +Description: Request to append content to a file at the specified path. If the file exists, the content will be appended to the end of the file. If the file doesn't exist, it will be created with the provided content. This tool will automatically create any directories needed to write the file. +Parameters: +- path: (required) The path of the file to append to (relative to the current workspace directory ${args.cwd}) +- content: (required) The content to append to the file. The content will be added at the end of the existing file content. Do NOT include line numbers in the content. +Usage: + +File path here + +Your content to append here + + + +Example: Requesting to append to a log file + +logs/app.log + +[2024-04-17 15:20:30] New log entry +[2024-04-17 15:20:31] Another log entry + +` +} diff --git a/src/core/prompts/tools/index.ts b/src/core/prompts/tools/index.ts index 408385ec12..2fee9b78ad 100644 --- a/src/core/prompts/tools/index.ts +++ b/src/core/prompts/tools/index.ts @@ -2,6 +2,7 @@ import { getExecuteCommandDescription } from "./execute-command" import { getReadFileDescription } from "./read-file" import { getFetchInstructionsDescription } from "./fetch-instructions" import { getWriteToFileDescription } from "./write-to-file" +import { getAppendToFileDescription } from "./append-to-file" import { getSearchFilesDescription } from "./search-files" import { getListFilesDescription } from "./list-files" import { getInsertContentDescription } from "./insert-content" @@ -26,6 +27,7 @@ const toolDescriptionMap: Record string | undefined> read_file: (args) => getReadFileDescription(args), fetch_instructions: () => getFetchInstructionsDescription(), write_to_file: (args) => getWriteToFileDescription(args), + append_to_file: (args) => getAppendToFileDescription(args), search_files: (args) => getSearchFilesDescription(args), list_files: (args) => getListFilesDescription(args), list_code_definition_names: (args) => getListCodeDefinitionNamesDescription(args), @@ -101,6 +103,7 @@ export { getReadFileDescription, getFetchInstructionsDescription, getWriteToFileDescription, + getAppendToFileDescription, getSearchFilesDescription, getListFilesDescription, getListCodeDefinitionNamesDescription, diff --git a/src/core/tools/__tests__/appendToFileTool.test.ts b/src/core/tools/__tests__/appendToFileTool.test.ts new file mode 100644 index 0000000000..ec61d7f0b4 --- /dev/null +++ b/src/core/tools/__tests__/appendToFileTool.test.ts @@ -0,0 +1,331 @@ +// npx jest src/core/tools/__tests__/appendToFileTool.test.ts + +import { describe, expect, it, jest, beforeEach } from "@jest/globals" +import { appendToFileTool } from "../appendToFileTool" +import { Cline } from "../../Cline" +import { ToolUse } from "../../assistant-message" +import { formatResponse } from "../../prompts/responses" +import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../types" +import { ClineSayTool, ClineAsk } from "../../../shared/ExtensionMessage" +import { RecordSource } from "../../context-tracking/FileContextTrackerTypes" +import { FileContextTracker } from "../../context-tracking/FileContextTracker" +import { DiffViewProvider } from "../../../integrations/editor/DiffViewProvider" +import { RooIgnoreController } from "../../ignore/RooIgnoreController" + +// Mock dependencies +jest.mock("../../Cline") +jest.mock("../../prompts/responses") +jest.mock("delay") + +describe("appendToFileTool", () => { + // Setup common test variables + let mockCline: jest.Mocked> & { + consecutiveMistakeCount: number + didEditFile: boolean + cwd: string + } + let mockAskApproval: jest.Mock + let mockHandleError: jest.Mock + let mockPushToolResult: jest.Mock + let mockRemoveClosingTag: jest.Mock + let mockToolUse: ToolUse + let mockDiffViewProvider: jest.Mocked> + let mockFileContextTracker: jest.Mocked> + + beforeEach(() => { + // Reset mocks + jest.clearAllMocks() + + mockDiffViewProvider = { + editType: undefined, + isEditing: false, + originalContent: "", + open: jest.fn().mockReturnValue(Promise.resolve()), + update: jest.fn().mockReturnValue(Promise.resolve()), + reset: jest.fn().mockReturnValue(Promise.resolve()), + revertChanges: jest.fn().mockReturnValue(Promise.resolve()), + saveChanges: jest.fn().mockReturnValue( + Promise.resolve({ + newProblemsMessage: "", + userEdits: undefined, + finalContent: "", + }), + ), + scrollToFirstDiff: jest.fn(), + createdDirs: [], + documentWasOpen: false, + streamedLines: [], + preDiagnostics: [], + postDiagnostics: [], + isEditorOpen: false, + hasChanges: false, + } as unknown as jest.Mocked + + mockFileContextTracker = { + trackFileContext: jest.fn().mockReturnValue(Promise.resolve()), + } as unknown as jest.Mocked + + // Create mock implementations + const mockClineBase = { + ask: jest.fn().mockReturnValue( + Promise.resolve({ + response: { type: "text" as ClineAsk }, + text: "", + }), + ), + say: jest.fn().mockReturnValue(Promise.resolve()), + sayAndCreateMissingParamError: jest.fn().mockReturnValue(Promise.resolve("Missing parameter error")), + consecutiveMistakeCount: 0, + didEditFile: false, + cwd: "/test/path", + diffViewProvider: mockDiffViewProvider, + getFileContextTracker: jest.fn().mockReturnValue(mockFileContextTracker), + rooIgnoreController: { + validateAccess: jest.fn().mockReturnValue(true), + } as unknown as RooIgnoreController, + api: { + getModel: jest.fn().mockReturnValue({ + id: "gpt-4", + info: { + contextWindow: 8000, + supportsPromptCache: true, + maxTokens: null, + supportsImages: false, + supportsComputerUse: true, + supportsFunctionCalling: true, + supportsVision: false, + isMultiModal: false, + isChatBased: true, + isCompletionBased: false, + cachableFields: [], + }, + }), + createMessage: jest.fn(), + countTokens: jest.fn(), + }, + } + + // Create a properly typed mock + mockCline = { + ...mockClineBase, + consecutiveMistakeCount: 0, + didEditFile: false, + cwd: "/test/path", + } as unknown as jest.Mocked> & { + consecutiveMistakeCount: number + didEditFile: boolean + cwd: string + } + + mockAskApproval = jest.fn().mockReturnValue(Promise.resolve(true)) + mockHandleError = jest.fn().mockReturnValue(Promise.resolve()) + mockPushToolResult = jest.fn() + mockRemoveClosingTag = jest.fn().mockImplementation((tag, value) => value) + + // Create a mock tool use object + mockToolUse = { + type: "tool_use", + name: "append_to_file", + params: { + path: "test.txt", + content: "test content", + }, + partial: false, + } + }) + + describe("Basic functionality", () => { + it("should append content to a new file", async () => { + // Setup + mockDiffViewProvider.editType = "create" + + // Execute + await appendToFileTool( + mockCline as unknown as Cline, + mockToolUse, + mockAskApproval as unknown as AskApproval, + mockHandleError as unknown as HandleError, + mockPushToolResult as unknown as PushToolResult, + mockRemoveClosingTag as unknown as RemoveClosingTag, + ) + + // Verify + expect(mockDiffViewProvider.open).toHaveBeenCalledWith("test.txt") + expect(mockDiffViewProvider.update).toHaveBeenCalledWith("test content", true) + expect(mockAskApproval).toHaveBeenCalled() + expect(mockFileContextTracker.trackFileContext).toHaveBeenCalledWith("test.txt", "roo_edited") + expect(mockCline.didEditFile).toBe(true) + }) + + it("should append content to an existing file", async () => { + // Setup + mockDiffViewProvider.editType = "modify" + mockDiffViewProvider.originalContent = "existing content" + + // Execute + await appendToFileTool( + mockCline as unknown as Cline, + mockToolUse, + mockAskApproval as unknown as AskApproval, + mockHandleError as unknown as HandleError, + mockPushToolResult as unknown as PushToolResult, + mockRemoveClosingTag as unknown as RemoveClosingTag, + ) + + // Verify + expect(mockDiffViewProvider.open).toHaveBeenCalledWith("test.txt") + expect(mockDiffViewProvider.update).toHaveBeenCalledWith("existing content\ntest content", true) + // The tool adds its own newline between existing and new content + expect(mockAskApproval).toHaveBeenCalled() + expect(mockFileContextTracker.trackFileContext).toHaveBeenCalledWith("test.txt", "roo_edited") + }) + }) + + describe("Content preprocessing", () => { + it("should remove code block markers", async () => { + // Setup + mockToolUse.params.content = "```\ntest content\n```" + + // Execute + await appendToFileTool( + mockCline as unknown as Cline, + mockToolUse, + mockAskApproval as unknown as AskApproval, + mockHandleError as unknown as HandleError, + mockPushToolResult as unknown as PushToolResult, + mockRemoveClosingTag as unknown as RemoveClosingTag, + ) + + // Verify + expect(mockDiffViewProvider.update).toHaveBeenCalledWith("test content", true) + }) + + it("should unescape HTML entities for non-Claude models", async () => { + // Setup + mockToolUse.params.content = "test & content" + + // Execute + await appendToFileTool( + mockCline as unknown as Cline, + mockToolUse, + mockAskApproval as unknown as AskApproval, + mockHandleError as unknown as HandleError, + mockPushToolResult as unknown as PushToolResult, + mockRemoveClosingTag as unknown as RemoveClosingTag, + ) + + // Verify + expect(mockDiffViewProvider.update).toHaveBeenCalledWith("test & content", true) + }) + }) + + describe("Error handling", () => { + it("should handle missing path parameter", async () => { + // Setup + mockToolUse.params.path = undefined + + // Execute + await appendToFileTool( + mockCline as unknown as Cline, + mockToolUse, + mockAskApproval as unknown as AskApproval, + mockHandleError as unknown as HandleError, + mockPushToolResult as unknown as PushToolResult, + mockRemoveClosingTag as unknown as RemoveClosingTag, + ) + + // Verify + expect(mockCline.consecutiveMistakeCount).toBe(0) + expect(mockDiffViewProvider.open).not.toHaveBeenCalled() + }) + + it("should handle missing content parameter", async () => { + // Setup + mockToolUse.params.content = undefined + + // Execute + await appendToFileTool( + mockCline as unknown as Cline, + mockToolUse, + mockAskApproval as unknown as AskApproval, + mockHandleError as unknown as HandleError, + mockPushToolResult as unknown as PushToolResult, + mockRemoveClosingTag as unknown as RemoveClosingTag, + ) + + // Verify + expect(mockCline.consecutiveMistakeCount).toBe(0) + expect(mockDiffViewProvider.open).not.toHaveBeenCalled() + }) + + it("should handle rooignore validation failures", async () => { + // Setup + const validateAccessMock = jest.fn().mockReturnValue(false) as jest.MockedFunction< + (filePath: string) => boolean + > + mockCline.rooIgnoreController = { + validateAccess: validateAccessMock, + } as unknown as RooIgnoreController + const mockRooIgnoreError = "RooIgnore error" + ;(formatResponse.rooIgnoreError as jest.Mock).mockReturnValue(mockRooIgnoreError) + ;(formatResponse.toolError as jest.Mock).mockReturnValue("Tool error") + + // Execute + await appendToFileTool( + mockCline as unknown as Cline, + mockToolUse, + mockAskApproval as unknown as AskApproval, + mockHandleError as unknown as HandleError, + mockPushToolResult as unknown as PushToolResult, + mockRemoveClosingTag as unknown as RemoveClosingTag, + ) + + // Verify + expect(mockCline.say).toHaveBeenCalledWith("rooignore_error", "test.txt") + expect(formatResponse.rooIgnoreError).toHaveBeenCalledWith("test.txt") + expect(mockPushToolResult).toHaveBeenCalled() + expect(mockDiffViewProvider.open).not.toHaveBeenCalled() + }) + + it("should handle user rejection", async () => { + // Setup + mockAskApproval.mockReturnValue(Promise.resolve(false)) + + // Execute + await appendToFileTool( + mockCline as unknown as Cline, + mockToolUse, + mockAskApproval as unknown as AskApproval, + mockHandleError as unknown as HandleError, + mockPushToolResult as unknown as PushToolResult, + mockRemoveClosingTag as unknown as RemoveClosingTag, + ) + + // Verify + expect(mockDiffViewProvider.revertChanges).toHaveBeenCalled() + expect(mockFileContextTracker.trackFileContext).not.toHaveBeenCalled() + }) + }) + + describe("Partial updates", () => { + it("should handle partial updates", async () => { + // Setup + mockToolUse.partial = true + + // Execute + await appendToFileTool( + mockCline as unknown as Cline, + mockToolUse, + mockAskApproval as unknown as AskApproval, + mockHandleError as unknown as HandleError, + mockPushToolResult as unknown as PushToolResult, + mockRemoveClosingTag as unknown as RemoveClosingTag, + ) + + // Verify + expect(mockCline.ask).toHaveBeenCalledWith("tool", expect.any(String), true) + expect(mockDiffViewProvider.update).toHaveBeenCalledWith("test content", false) + expect(mockAskApproval).not.toHaveBeenCalled() + }) + }) +}) diff --git a/src/core/tools/appendToFileTool.ts b/src/core/tools/appendToFileTool.ts new file mode 100644 index 0000000000..d0d0b9dd3c --- /dev/null +++ b/src/core/tools/appendToFileTool.ts @@ -0,0 +1,175 @@ +import * as vscode from "vscode" + +import { Cline } from "../Cline" +import { ClineSayTool } from "../../shared/ExtensionMessage" +import { ToolUse } from "../assistant-message" +import { formatResponse } from "../prompts/responses" +import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { RecordSource } from "../context-tracking/FileContextTrackerTypes" +import path from "path" +import { fileExistsAtPath } from "../../utils/fs" +import { addLineNumbers, stripLineNumbers } from "../../integrations/misc/extract-text" +import { getReadablePath } from "../../utils/path" +import { isPathOutsideWorkspace } from "../../utils/pathUtils" +import { everyLineHasLineNumbers } from "../../integrations/misc/extract-text" +import delay from "delay" +import { unescapeHtmlEntities } from "../../utils/text-normalization" + +export async function appendToFileTool( + cline: Cline, + block: ToolUse, + askApproval: AskApproval, + handleError: HandleError, + pushToolResult: PushToolResult, + removeClosingTag: RemoveClosingTag, +) { + const relPath: string | undefined = block.params.path + let newContent: string | undefined = block.params.content + if (!relPath || !newContent) { + return + } + + const accessAllowed = cline.rooIgnoreController?.validateAccess(relPath) + if (!accessAllowed) { + await cline.say("rooignore_error", relPath) + pushToolResult(formatResponse.toolError(formatResponse.rooIgnoreError(relPath))) + return + } + + // Check if file exists using cached map or fs.access + let fileExists: boolean + if (cline.diffViewProvider.editType !== undefined) { + fileExists = cline.diffViewProvider.editType === "modify" + } else { + const absolutePath = path.resolve(cline.cwd, relPath) + fileExists = await fileExistsAtPath(absolutePath) + cline.diffViewProvider.editType = fileExists ? "modify" : "create" + } + + // pre-processing newContent for cases where weaker models might add artifacts + if (newContent.startsWith("```")) { + newContent = newContent.split("\n").slice(1).join("\n").trim() + } + if (newContent.endsWith("```")) { + newContent = newContent.split("\n").slice(0, -1).join("\n").trim() + } + + if (!cline.api.getModel().id.includes("claude")) { + newContent = unescapeHtmlEntities(newContent) + } + + // Determine if the path is outside the workspace + const fullPath = relPath ? path.resolve(cline.cwd, removeClosingTag("path", relPath)) : "" + const isOutsideWorkspace = isPathOutsideWorkspace(fullPath) + + const sharedMessageProps: ClineSayTool = { + tool: fileExists ? "appliedDiff" : "newFileCreated", + path: getReadablePath(cline.cwd, removeClosingTag("path", relPath)), + isOutsideWorkspace, + } + + try { + if (block.partial) { + // update gui message + const partialMessage = JSON.stringify(sharedMessageProps) + await cline.ask("tool", partialMessage, block.partial).catch(() => {}) + // update editor + if (!cline.diffViewProvider.isEditing) { + await cline.diffViewProvider.open(relPath) + } + // If file exists, append newContent to existing content + if (fileExists && cline.diffViewProvider.originalContent) { + newContent = cline.diffViewProvider.originalContent + "\n" + newContent + } + // editor is open, stream content in + await cline.diffViewProvider.update( + everyLineHasLineNumbers(newContent) ? stripLineNumbers(newContent) : newContent, + false, + ) + return + } else { + if (!relPath) { + cline.consecutiveMistakeCount++ + pushToolResult(await cline.sayAndCreateMissingParamError("append_to_file", "path")) + await cline.diffViewProvider.reset() + return + } + if (!newContent) { + cline.consecutiveMistakeCount++ + pushToolResult(await cline.sayAndCreateMissingParamError("append_to_file", "content")) + await cline.diffViewProvider.reset() + return + } + cline.consecutiveMistakeCount = 0 + + if (!cline.diffViewProvider.isEditing) { + const partialMessage = JSON.stringify(sharedMessageProps) + await cline.ask("tool", partialMessage, true).catch(() => {}) + await cline.diffViewProvider.open(relPath) + } + + // If file exists, append newContent to existing content + if (fileExists && cline.diffViewProvider.originalContent) { + newContent = cline.diffViewProvider.originalContent + "\n" + newContent + } + + await cline.diffViewProvider.update( + everyLineHasLineNumbers(newContent) ? stripLineNumbers(newContent) : newContent, + true, + ) + await delay(300) // wait for diff view to update + cline.diffViewProvider.scrollToFirstDiff() + + const completeMessage = JSON.stringify({ + ...sharedMessageProps, + content: fileExists ? undefined : newContent, + diff: fileExists + ? formatResponse.createPrettyPatch(relPath, cline.diffViewProvider.originalContent, newContent) + : undefined, + } satisfies ClineSayTool) + const didApprove = await askApproval("tool", completeMessage) + if (!didApprove) { + await cline.diffViewProvider.revertChanges() + return + } + const { newProblemsMessage, userEdits, finalContent } = await cline.diffViewProvider.saveChanges() + + // Track file edit operation + if (relPath) { + await cline.getFileContextTracker().trackFileContext(relPath, "roo_edited" as RecordSource) + } + cline.didEditFile = true + + if (userEdits) { + await cline.say( + "user_feedback_diff", + JSON.stringify({ + tool: fileExists ? "appliedDiff" : "newFileCreated", + path: getReadablePath(cline.cwd, relPath), + diff: userEdits, + } satisfies ClineSayTool), + ) + pushToolResult( + `The user made the following updates to your content:\n\n${userEdits}\n\n` + + `The updated content, which includes both your original modifications and the user's edits, has been successfully saved to ${relPath.toPosix()}. Here is the full, updated content of the file, including line numbers:\n\n` + + `\n${addLineNumbers( + finalContent || "", + )}\n\n\n` + + `Please note:\n` + + `1. You do not need to re-write the file with these changes, as they have already been applied.\n` + + `2. Proceed with the task using this updated file content as the new baseline.\n` + + `3. If the user's edits have addressed part of the task or changed the requirements, adjust your approach accordingly.` + + `${newProblemsMessage}`, + ) + } else { + pushToolResult(`The content was successfully appended to ${relPath.toPosix()}.${newProblemsMessage}`) + } + await cline.diffViewProvider.reset() + return + } + } catch (error) { + await handleError("appending to file", error) + await cline.diffViewProvider.reset() + return + } +} diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 70ae8b08b4..7c7439f538 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -286,6 +286,7 @@ type GlobalSettings = { search_and_replace: boolean insert_content: boolean powerSteering: boolean + append_to_file: boolean } | undefined language?: diff --git a/src/exports/types.ts b/src/exports/types.ts index 878f0b95b2..9d91b1e1f7 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -289,6 +289,7 @@ type GlobalSettings = { search_and_replace: boolean insert_content: boolean powerSteering: boolean + append_to_file: boolean } | undefined language?: diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 48f5b2989e..259d968c00 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -276,7 +276,7 @@ export type CustomSupportPrompts = z.infer * ExperimentId */ -export const experimentIds = ["search_and_replace", "insert_content", "powerSteering"] as const +export const experimentIds = ["search_and_replace", "insert_content", "powerSteering", "append_to_file"] as const export const experimentIdsSchema = z.enum(experimentIds) @@ -290,6 +290,7 @@ const experimentsSchema = z.object({ search_and_replace: z.boolean(), insert_content: z.boolean(), powerSteering: z.boolean(), + append_to_file: z.boolean(), }) export type Experiments = z.infer diff --git a/src/shared/__tests__/experiments.test.ts b/src/shared/__tests__/experiments.test.ts index ff2f4fd040..163722230f 100644 --- a/src/shared/__tests__/experiments.test.ts +++ b/src/shared/__tests__/experiments.test.ts @@ -16,6 +16,7 @@ describe("experiments", () => { powerSteering: false, search_and_replace: false, insert_content: false, + append_to_file: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(false) }) @@ -25,6 +26,7 @@ describe("experiments", () => { powerSteering: true, search_and_replace: false, insert_content: false, + append_to_file: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(true) }) @@ -34,6 +36,7 @@ describe("experiments", () => { search_and_replace: false, insert_content: false, powerSteering: false, + append_to_file: false, } expect(Experiments.isEnabled(experiments, EXPERIMENT_IDS.POWER_STEERING)).toBe(false) }) diff --git a/src/shared/experiments.ts b/src/shared/experiments.ts index aeaefa2c94..15c1ab8fbf 100644 --- a/src/shared/experiments.ts +++ b/src/shared/experiments.ts @@ -7,6 +7,7 @@ export const EXPERIMENT_IDS = { INSERT_BLOCK: "insert_content", SEARCH_AND_REPLACE: "search_and_replace", POWER_STEERING: "powerSteering", + APPEND_BLOCK: "append_to_file", } as const satisfies Record type _AssertExperimentIds = AssertEqual>> @@ -21,6 +22,7 @@ export const experimentConfigsMap: Record = { INSERT_BLOCK: { enabled: false }, SEARCH_AND_REPLACE: { enabled: false }, POWER_STEERING: { enabled: false }, + APPEND_BLOCK: { enabled: false }, } export const experimentDefault = Object.fromEntries( diff --git a/src/shared/tool-groups.ts b/src/shared/tool-groups.ts index 8340a8e542..f124f8bd2e 100644 --- a/src/shared/tool-groups.ts +++ b/src/shared/tool-groups.ts @@ -12,6 +12,7 @@ export const TOOL_DISPLAY_NAMES = { read_file: "read files", fetch_instructions: "fetch instructions", write_to_file: "write files", + append_to_file: "append to files", apply_diff: "apply changes", search_files: "search files", list_files: "list files", @@ -33,7 +34,7 @@ export const TOOL_GROUPS: Record = { tools: ["read_file", "fetch_instructions", "search_files", "list_files", "list_code_definition_names"], }, edit: { - tools: ["apply_diff", "write_to_file", "insert_content", "search_and_replace"], + tools: ["apply_diff", "write_to_file", "append_to_file", "insert_content", "search_and_replace"], }, browser: { tools: ["browser_action"], From 026091e4323ce5e40cced4c64608053ea6870f98 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Thu, 17 Apr 2025 14:18:50 -0600 Subject: [PATCH 11/15] Fix filename format in downloadTask function for markdown export (#2717) * Fix filename format in downloadTask function for markdown export * Update src/integrations/misc/export-markdown.ts Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- src/integrations/misc/export-markdown.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/integrations/misc/export-markdown.ts b/src/integrations/misc/export-markdown.ts index 05b31671d8..962f761e7f 100644 --- a/src/integrations/misc/export-markdown.ts +++ b/src/integrations/misc/export-markdown.ts @@ -15,7 +15,7 @@ export async function downloadTask(dateTs: number, conversationHistory: Anthropi const ampm = hours >= 12 ? "pm" : "am" hours = hours % 12 hours = hours ? hours : 12 // the hour '0' should be '12' - const fileName = `cline_task_${month}-${day}-${year}_${hours}-${minutes}-${seconds}-${ampm}.md` + const fileName = `roo_task_${month}-${day}-${year}_${hours}-${minutes}-${seconds}-${ampm}.md` // Generate markdown const markdownContent = conversationHistory From 471caff000984f8a06e22776f9daadf1cfc2dee7 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Thu, 17 Apr 2025 13:31:48 -0700 Subject: [PATCH 12/15] Clean up types related to tools (#2719) --- .changeset/wise-spies-type.md | 5 + src/core/Cline.ts | 76 +++--- src/core/__tests__/mode-validator.test.ts | 2 +- .../read-file-maxReadFileLine.test.ts | 4 +- src/core/__tests__/read-file-xml.test.ts | 6 +- src/core/assistant-message/index.ts | 157 +----------- .../parse-assistant-message.ts | 16 +- .../diff/strategies/multi-search-replace.ts | 5 +- src/core/diff/types.ts | 2 +- src/core/mode-validator.ts | 5 +- src/core/prompts/tools/index.ts | 2 +- .../tools/__tests__/appendToFileTool.test.ts | 7 +- .../__tests__/executeCommandTool.test.ts | 5 +- src/core/tools/accessMcpResourceTool.ts | 4 +- src/core/tools/appendToFileTool.ts | 8 +- src/core/tools/applyDiffTool.ts | 19 +- src/core/tools/askFollowupQuestionTool.ts | 3 +- src/core/tools/attemptCompletionTool.ts | 8 +- src/core/tools/browserActionTool.ts | 3 +- src/core/tools/executeCommandTool.ts | 3 +- src/core/tools/fetchInstructionsTool.ts | 3 +- src/core/tools/insertContentTool.ts | 8 +- src/core/tools/listCodeDefinitionNamesTool.ts | 11 +- src/core/tools/listFilesTool.ts | 5 +- src/core/tools/newTaskTool.ts | 7 +- src/core/tools/readFileTool.ts | 6 +- src/core/tools/searchAndReplaceTool.ts | 8 +- src/core/tools/searchFilesTool.ts | 6 +- src/core/tools/switchModeTool.ts | 11 +- src/core/tools/types.ts | 19 -- src/core/tools/useMcpToolTool.ts | 3 +- src/core/tools/writeToFileTool.ts | 10 +- src/services/telemetry/PostHogClient.ts | 147 +++++++++++ src/services/telemetry/TelemetryService.ts | 212 ++-------------- src/shared/modes.ts | 2 +- src/shared/tool-groups.ts | 72 ------ src/shared/tools.ts | 236 ++++++++++++++++++ .../src/components/prompts/PromptsView.tsx | 3 +- 38 files changed, 543 insertions(+), 566 deletions(-) create mode 100644 .changeset/wise-spies-type.md delete mode 100644 src/core/tools/types.ts create mode 100644 src/services/telemetry/PostHogClient.ts delete mode 100644 src/shared/tool-groups.ts create mode 100644 src/shared/tools.ts diff --git a/.changeset/wise-spies-type.md b/.changeset/wise-spies-type.md new file mode 100644 index 0000000000..8c1e83fc18 --- /dev/null +++ b/.changeset/wise-spies-type.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Clean up types related to tools diff --git a/src/core/Cline.ts b/src/core/Cline.ts index 91885a2876..69278bd125 100644 --- a/src/core/Cline.ts +++ b/src/core/Cline.ts @@ -12,20 +12,14 @@ import getFolderSize from "get-folder-size" import { serializeError } from "serialize-error" import * as vscode from "vscode" +// schemas import { TokenUsage } from "../schemas" + +// api import { ApiHandler, buildApiHandler } from "../api" import { ApiStream } from "../api/transform/stream" -import { DIFF_VIEW_URI_SCHEME, DiffViewProvider } from "../integrations/editor/DiffViewProvider" -import { CheckpointServiceOptions, RepoPerTaskCheckpointService } from "../services/checkpoints" -import { findToolName, formatContentBlockToMarkdown } from "../integrations/misc/export-markdown" -import { fetchInstructionsTool } from "./tools/fetchInstructionsTool" -import { listFilesTool } from "./tools/listFilesTool" -import { readFileTool } from "./tools/readFileTool" -import { ExitCodeDetails, TerminalProcess } from "../integrations/terminal/TerminalProcess" -import { Terminal } from "../integrations/terminal/Terminal" -import { TerminalRegistry } from "../integrations/terminal/TerminalRegistry" -import { UrlContentFetcher } from "../services/browser/UrlContentFetcher" -import { listFiles } from "../services/glob/list-files" + +// shared import { ApiConfiguration } from "../shared/api" import { findLastIndex } from "../shared/array" import { combineApiRequests } from "../shared/combineApiRequests" @@ -42,26 +36,35 @@ import { getApiMetrics } from "../shared/getApiMetrics" import { HistoryItem } from "../shared/HistoryItem" import { ClineAskResponse } from "../shared/WebviewMessage" import { GlobalFileNames } from "../shared/globalFileNames" -import { defaultModeSlug, getModeBySlug, getFullModeDetails } from "../shared/modes" +import { defaultModeSlug, getModeBySlug, getFullModeDetails, isToolAllowedForMode } from "../shared/modes" import { EXPERIMENT_IDS, experiments as Experiments, ExperimentId } from "../shared/experiments" +import { formatLanguage } from "../shared/language" +import { ToolParamName, ToolName, ToolResponse } from "../shared/tools" + +// services +import { UrlContentFetcher } from "../services/browser/UrlContentFetcher" +import { listFiles } from "../services/glob/list-files" +import { BrowserSession } from "../services/browser/BrowserSession" +import { McpHub } from "../services/mcp/McpHub" +import { telemetryService } from "../services/telemetry/TelemetryService" +import { CheckpointServiceOptions, RepoPerTaskCheckpointService } from "../services/checkpoints" + +// integrations +import { DIFF_VIEW_URI_SCHEME, DiffViewProvider } from "../integrations/editor/DiffViewProvider" +import { findToolName, formatContentBlockToMarkdown } from "../integrations/misc/export-markdown" +import { ExitCodeDetails, TerminalProcess } from "../integrations/terminal/TerminalProcess" +import { Terminal } from "../integrations/terminal/Terminal" +import { TerminalRegistry } from "../integrations/terminal/TerminalRegistry" + +// utils import { calculateApiCostAnthropic } from "../utils/cost" import { fileExistsAtPath } from "../utils/fs" -import { arePathsEqual } from "../utils/path" -import { parseMentions } from "./mentions" -import { FileContextTracker } from "./context-tracking/FileContextTracker" -import { RooIgnoreController } from "./ignore/RooIgnoreController" -import { AssistantMessageContent, parseAssistantMessage, ToolParamName, ToolUseName } from "./assistant-message" -import { formatResponse } from "./prompts/responses" -import { SYSTEM_PROMPT } from "./prompts/system" -import { truncateConversationIfNeeded } from "./sliding-window" -import { ClineProvider } from "./webview/ClineProvider" -import { BrowserSession } from "../services/browser/BrowserSession" -import { formatLanguage } from "../shared/language" -import { McpHub } from "../services/mcp/McpHub" -import { DiffStrategy, getDiffStrategy } from "./diff/DiffStrategy" -import { telemetryService } from "../services/telemetry/TelemetryService" -import { validateToolUse, isToolAllowedForMode, ToolName } from "./mode-validator" -import { getWorkspacePath } from "../utils/path" +import { arePathsEqual, getWorkspacePath } from "../utils/path" + +// tools +import { fetchInstructionsTool } from "./tools/fetchInstructionsTool" +import { listFilesTool } from "./tools/listFilesTool" +import { readFileTool } from "./tools/readFileTool" import { writeToFileTool } from "./tools/writeToFileTool" import { applyDiffTool } from "./tools/applyDiffTool" import { insertContentTool } from "./tools/insertContentTool" @@ -78,7 +81,20 @@ import { attemptCompletionTool } from "./tools/attemptCompletionTool" import { newTaskTool } from "./tools/newTaskTool" import { appendToFileTool } from "./tools/appendToFileTool" -export type ToolResponse = string | Array +// prompts +import { formatResponse } from "./prompts/responses" +import { SYSTEM_PROMPT } from "./prompts/system" + +// ... everything else +import { parseMentions } from "./mentions" +import { FileContextTracker } from "./context-tracking/FileContextTracker" +import { RooIgnoreController } from "./ignore/RooIgnoreController" +import { type AssistantMessageContent, parseAssistantMessage } from "./assistant-message" +import { truncateConversationIfNeeded } from "./sliding-window" +import { ClineProvider } from "./webview/ClineProvider" +import { DiffStrategy, getDiffStrategy } from "./diff/DiffStrategy" +import { validateToolUse } from "./mode-validator" + type UserContent = Array export type ClineEvents = { @@ -573,7 +589,7 @@ export class Cline extends EventEmitter { } } - async sayAndCreateMissingParamError(toolName: ToolUseName, paramName: string, relPath?: string) { + async sayAndCreateMissingParamError(toolName: ToolName, paramName: string, relPath?: string) { await this.say( "error", `Roo tried to use ${toolName}${ diff --git a/src/core/__tests__/mode-validator.test.ts b/src/core/__tests__/mode-validator.test.ts index fee41971c6..66b23ff2ed 100644 --- a/src/core/__tests__/mode-validator.test.ts +++ b/src/core/__tests__/mode-validator.test.ts @@ -1,5 +1,5 @@ import { isToolAllowedForMode, getModeConfig, modes, ModeConfig } from "../../shared/modes" -import { TOOL_GROUPS } from "../../shared/tool-groups" +import { TOOL_GROUPS } from "../../shared/tools" import { validateToolUse } from "../mode-validator" const [codeMode, architectMode, askMode] = modes.map((mode) => mode.slug) diff --git a/src/core/__tests__/read-file-maxReadFileLine.test.ts b/src/core/__tests__/read-file-maxReadFileLine.test.ts index bbbbcb37eb..3a3f7e97bb 100644 --- a/src/core/__tests__/read-file-maxReadFileLine.test.ts +++ b/src/core/__tests__/read-file-maxReadFileLine.test.ts @@ -1,11 +1,11 @@ import * as path from "path" + import { countFileLines } from "../../integrations/misc/line-counter" import { readLines } from "../../integrations/misc/read-lines" import { extractTextFromFile, addLineNumbers } from "../../integrations/misc/extract-text" import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter" import { isBinaryFile } from "isbinaryfile" -import { ReadFileToolUse } from "../assistant-message" -import { Cline } from "../Cline" +import { ReadFileToolUse } from "../../shared/tools" // Mock dependencies jest.mock("../../integrations/misc/line-counter") diff --git a/src/core/__tests__/read-file-xml.test.ts b/src/core/__tests__/read-file-xml.test.ts index 6b995d18b8..46ca065514 100644 --- a/src/core/__tests__/read-file-xml.test.ts +++ b/src/core/__tests__/read-file-xml.test.ts @@ -1,11 +1,11 @@ import * as path from "path" + import { countFileLines } from "../../integrations/misc/line-counter" import { readLines } from "../../integrations/misc/read-lines" -import { extractTextFromFile, addLineNumbers } from "../../integrations/misc/extract-text" +import { extractTextFromFile } from "../../integrations/misc/extract-text" import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter" import { isBinaryFile } from "isbinaryfile" -import { ReadFileToolUse } from "../assistant-message" -import { Cline } from "../Cline" +import { ReadFileToolUse } from "../../shared/tools" // Mock dependencies jest.mock("../../integrations/misc/line-counter") diff --git a/src/core/assistant-message/index.ts b/src/core/assistant-message/index.ts index 0a1bec32f2..c53e88ed96 100644 --- a/src/core/assistant-message/index.ts +++ b/src/core/assistant-message/index.ts @@ -1,156 +1 @@ -export type AssistantMessageContent = TextContent | ToolUse - -export { parseAssistantMessage } from "./parse-assistant-message" - -export interface TextContent { - type: "text" - content: string - partial: boolean -} - -export const toolUseNames = [ - "execute_command", - "read_file", - "write_to_file", - "append_to_file", - "apply_diff", - "insert_content", - "search_and_replace", - "search_files", - "list_files", - "list_code_definition_names", - "browser_action", - "use_mcp_tool", - "access_mcp_resource", - "ask_followup_question", - "attempt_completion", - "switch_mode", - "new_task", - "fetch_instructions", -] as const - -// Converts array of tool call names into a union type ("execute_command" | "read_file" | ...) -export type ToolUseName = (typeof toolUseNames)[number] - -export const toolParamNames = [ - "command", - "path", - "content", - "line_count", - "regex", - "file_pattern", - "recursive", - "action", - "url", - "coordinate", - "text", - "server_name", - "tool_name", - "arguments", - "uri", - "question", - "result", - "diff", - "start_line", - "end_line", - "mode_slug", - "reason", - "operations", - "mode", - "message", - "cwd", - "follow_up", - "task", - "size", -] as const - -export type ToolParamName = (typeof toolParamNames)[number] - -export interface ToolUse { - type: "tool_use" - name: ToolUseName - // params is a partial record, allowing only some or none of the possible parameters to be used - params: Partial> - partial: boolean -} - -export interface ExecuteCommandToolUse extends ToolUse { - name: "execute_command" - // Pick, "command"> makes "command" required, but Partial<> makes it optional - params: Partial, "command" | "cwd">> -} - -export interface ReadFileToolUse extends ToolUse { - name: "read_file" - params: Partial, "path" | "start_line" | "end_line">> -} - -export interface FetchInstructionsToolUse extends ToolUse { - name: "fetch_instructions" - params: Partial, "task">> -} - -export interface WriteToFileToolUse extends ToolUse { - name: "write_to_file" - params: Partial, "path" | "content" | "line_count">> -} - -export interface AppendToFileToolUse extends ToolUse { - name: "append_to_file" - params: Partial, "path" | "content">> -} - -export interface InsertCodeBlockToolUse extends ToolUse { - name: "insert_content" - params: Partial, "path" | "operations">> -} - -export interface SearchFilesToolUse extends ToolUse { - name: "search_files" - params: Partial, "path" | "regex" | "file_pattern">> -} - -export interface ListFilesToolUse extends ToolUse { - name: "list_files" - params: Partial, "path" | "recursive">> -} - -export interface ListCodeDefinitionNamesToolUse extends ToolUse { - name: "list_code_definition_names" - params: Partial, "path">> -} - -export interface BrowserActionToolUse extends ToolUse { - name: "browser_action" - params: Partial, "action" | "url" | "coordinate" | "text" | "size">> -} - -export interface UseMcpToolToolUse extends ToolUse { - name: "use_mcp_tool" - params: Partial, "server_name" | "tool_name" | "arguments">> -} - -export interface AccessMcpResourceToolUse extends ToolUse { - name: "access_mcp_resource" - params: Partial, "server_name" | "uri">> -} - -export interface AskFollowupQuestionToolUse extends ToolUse { - name: "ask_followup_question" - params: Partial, "question" | "follow_up">> -} - -export interface AttemptCompletionToolUse extends ToolUse { - name: "attempt_completion" - params: Partial, "result" | "command">> -} - -export interface SwitchModeToolUse extends ToolUse { - name: "switch_mode" - params: Partial, "mode_slug" | "reason">> -} - -export interface NewTaskToolUse extends ToolUse { - name: "new_task" - params: Partial, "mode" | "message">> -} +export { type AssistantMessageContent, parseAssistantMessage } from "./parse-assistant-message" diff --git a/src/core/assistant-message/parse-assistant-message.ts b/src/core/assistant-message/parse-assistant-message.ts index e38e8f6458..aa97873701 100644 --- a/src/core/assistant-message/parse-assistant-message.ts +++ b/src/core/assistant-message/parse-assistant-message.ts @@ -1,12 +1,6 @@ -import { - AssistantMessageContent, - TextContent, - ToolUse, - ToolParamName, - toolParamNames, - toolUseNames, - ToolUseName, -} from "." +import { TextContent, ToolUse, ToolParamName, toolParamNames, toolNames, ToolName } from "../../shared/tools" + +export type AssistantMessageContent = TextContent | ToolUse export function parseAssistantMessage(assistantMessage: string) { let contentBlocks: AssistantMessageContent[] = [] @@ -84,13 +78,13 @@ export function parseAssistantMessage(assistantMessage: string) { // no currentToolUse let didStartToolUse = false - const possibleToolUseOpeningTags = toolUseNames.map((name) => `<${name}>`) + const possibleToolUseOpeningTags = toolNames.map((name) => `<${name}>`) for (const toolUseOpeningTag of possibleToolUseOpeningTags) { if (accumulator.endsWith(toolUseOpeningTag)) { // start of a new tool use currentToolUse = { type: "tool_use", - name: toolUseOpeningTag.slice(1, -1) as ToolUseName, + name: toolUseOpeningTag.slice(1, -1) as ToolName, params: {}, partial: true, } diff --git a/src/core/diff/strategies/multi-search-replace.ts b/src/core/diff/strategies/multi-search-replace.ts index 5ba1825bac..a9d4ba6560 100644 --- a/src/core/diff/strategies/multi-search-replace.ts +++ b/src/core/diff/strategies/multi-search-replace.ts @@ -1,8 +1,9 @@ +import { distance } from "fastest-levenshtein" + import { DiffStrategy, DiffResult } from "../types" import { addLineNumbers, everyLineHasLineNumbers, stripLineNumbers } from "../../../integrations/misc/extract-text" -import { distance } from "fastest-levenshtein" import { ToolProgressStatus } from "../../../shared/ExtensionMessage" -import { ToolUse } from "../../assistant-message" +import { ToolUse } from "../../../shared/tools" import { normalizeString } from "../../../utils/text-normalization" const BUFFER_LINES = 40 // Number of extra context lines to show before and after matches diff --git a/src/core/diff/types.ts b/src/core/diff/types.ts index 68097710fb..0cb5686ecb 100644 --- a/src/core/diff/types.ts +++ b/src/core/diff/types.ts @@ -2,8 +2,8 @@ * Interface for implementing different diff strategies */ +import { ToolUse } from "../../shared/tools" import { ToolProgressStatus } from "../../shared/ExtensionMessage" -import { ToolUse } from "../assistant-message" export type DiffResult = | { success: true; content: string; failParts?: DiffResult[] } diff --git a/src/core/mode-validator.ts b/src/core/mode-validator.ts index 415c06cc36..8a9ac881c7 100644 --- a/src/core/mode-validator.ts +++ b/src/core/mode-validator.ts @@ -1,8 +1,5 @@ +import { ToolName } from "../shared/tools" import { Mode, isToolAllowedForMode, ModeConfig } from "../shared/modes" -import { ToolName } from "../shared/tool-groups" - -export { isToolAllowedForMode } -export type { ToolName } export function validateToolUse( toolName: ToolName, diff --git a/src/core/prompts/tools/index.ts b/src/core/prompts/tools/index.ts index 2fee9b78ad..642b9fd652 100644 --- a/src/core/prompts/tools/index.ts +++ b/src/core/prompts/tools/index.ts @@ -18,7 +18,7 @@ import { getNewTaskDescription } from "./new-task" import { DiffStrategy } from "../../diff/DiffStrategy" import { McpHub } from "../../../services/mcp/McpHub" import { Mode, ModeConfig, getModeConfig, isToolAllowedForMode, getGroupName } from "../../../shared/modes" -import { ToolName, TOOL_GROUPS, ALWAYS_AVAILABLE_TOOLS } from "../../../shared/tool-groups" +import { ToolName, TOOL_GROUPS, ALWAYS_AVAILABLE_TOOLS } from "../../../shared/tools" import { ToolArgs } from "./types" // Map of tool names to their description functions diff --git a/src/core/tools/__tests__/appendToFileTool.test.ts b/src/core/tools/__tests__/appendToFileTool.test.ts index ec61d7f0b4..b16921abdb 100644 --- a/src/core/tools/__tests__/appendToFileTool.test.ts +++ b/src/core/tools/__tests__/appendToFileTool.test.ts @@ -1,13 +1,12 @@ // npx jest src/core/tools/__tests__/appendToFileTool.test.ts import { describe, expect, it, jest, beforeEach } from "@jest/globals" + import { appendToFileTool } from "../appendToFileTool" import { Cline } from "../../Cline" -import { ToolUse } from "../../assistant-message" import { formatResponse } from "../../prompts/responses" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../types" -import { ClineSayTool, ClineAsk } from "../../../shared/ExtensionMessage" -import { RecordSource } from "../../context-tracking/FileContextTrackerTypes" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../../shared/tools" +import { ClineAsk } from "../../../shared/ExtensionMessage" import { FileContextTracker } from "../../context-tracking/FileContextTracker" import { DiffViewProvider } from "../../../integrations/editor/DiffViewProvider" import { RooIgnoreController } from "../../ignore/RooIgnoreController" diff --git a/src/core/tools/__tests__/executeCommandTool.test.ts b/src/core/tools/__tests__/executeCommandTool.test.ts index 2c975b7809..859d79ad7f 100644 --- a/src/core/tools/__tests__/executeCommandTool.test.ts +++ b/src/core/tools/__tests__/executeCommandTool.test.ts @@ -1,12 +1,11 @@ // npx jest src/core/tools/__tests__/executeCommandTool.test.ts import { describe, expect, it, jest, beforeEach } from "@jest/globals" + import { executeCommandTool } from "../executeCommandTool" import { Cline } from "../../Cline" -import { ToolUse } from "../../assistant-message" import { formatResponse } from "../../prompts/responses" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../types" -import { ClineAsk } from "../../../schemas" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../../shared/tools" // Mock dependencies jest.mock("../../Cline") diff --git a/src/core/tools/accessMcpResourceTool.ts b/src/core/tools/accessMcpResourceTool.ts index 94bea9062c..ced110f8b6 100644 --- a/src/core/tools/accessMcpResourceTool.ts +++ b/src/core/tools/accessMcpResourceTool.ts @@ -1,7 +1,5 @@ import { ClineAskUseMcpServer } from "../../shared/ExtensionMessage" -import { RemoveClosingTag } from "./types" -import { ToolUse } from "../assistant-message" -import { AskApproval, HandleError, PushToolResult } from "./types" +import { ToolUse, RemoveClosingTag, AskApproval, HandleError, PushToolResult } from "../../shared/tools" import { Cline } from "../Cline" import { formatResponse } from "../prompts/responses" diff --git a/src/core/tools/appendToFileTool.ts b/src/core/tools/appendToFileTool.ts index d0d0b9dd3c..a812677ae8 100644 --- a/src/core/tools/appendToFileTool.ts +++ b/src/core/tools/appendToFileTool.ts @@ -1,18 +1,16 @@ -import * as vscode from "vscode" +import path from "path" +import delay from "delay" import { Cline } from "../Cline" import { ClineSayTool } from "../../shared/ExtensionMessage" -import { ToolUse } from "../assistant-message" import { formatResponse } from "../prompts/responses" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" -import path from "path" import { fileExistsAtPath } from "../../utils/fs" import { addLineNumbers, stripLineNumbers } from "../../integrations/misc/extract-text" import { getReadablePath } from "../../utils/path" import { isPathOutsideWorkspace } from "../../utils/pathUtils" import { everyLineHasLineNumbers } from "../../integrations/misc/extract-text" -import delay from "delay" import { unescapeHtmlEntities } from "../../utils/text-normalization" export async function appendToFileTool( diff --git a/src/core/tools/applyDiffTool.ts b/src/core/tools/applyDiffTool.ts index 43de5af988..433d23a42b 100644 --- a/src/core/tools/applyDiffTool.ts +++ b/src/core/tools/applyDiffTool.ts @@ -1,17 +1,18 @@ -import { ClineSayTool } from "../../shared/ExtensionMessage" -import { getReadablePath } from "../../utils/path" -import { ToolUse } from "../assistant-message" -import { Cline } from "../Cline" -import { RemoveClosingTag } from "./types" -import { formatResponse } from "../prompts/responses" -import { AskApproval, HandleError, PushToolResult } from "./types" -import { fileExistsAtPath } from "../../utils/fs" -import { addLineNumbers } from "../../integrations/misc/extract-text" import path from "path" import fs from "fs/promises" + +import { ClineSayTool } from "../../shared/ExtensionMessage" +import { getReadablePath } from "../../utils/path" +import { Cline } from "../Cline" +import { ToolUse, RemoveClosingTag } from "../../shared/tools" +import { formatResponse } from "../prompts/responses" +import { AskApproval, HandleError, PushToolResult } from "../../shared/tools" +import { fileExistsAtPath } from "../../utils/fs" +import { addLineNumbers } from "../../integrations/misc/extract-text" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" import { telemetryService } from "../../services/telemetry/TelemetryService" import { unescapeHtmlEntities } from "../../utils/text-normalization" + export async function applyDiffTool( cline: Cline, block: ToolUse, diff --git a/src/core/tools/askFollowupQuestionTool.ts b/src/core/tools/askFollowupQuestionTool.ts index 5ed06e2403..2e7263ad58 100644 --- a/src/core/tools/askFollowupQuestionTool.ts +++ b/src/core/tools/askFollowupQuestionTool.ts @@ -1,6 +1,5 @@ import { Cline } from "../Cline" -import { ToolUse } from "../assistant-message" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { formatResponse } from "../prompts/responses" import { parseXml } from "../../utils/xml" diff --git a/src/core/tools/attemptCompletionTool.ts b/src/core/tools/attemptCompletionTool.ts index 437e803d31..891673969e 100644 --- a/src/core/tools/attemptCompletionTool.ts +++ b/src/core/tools/attemptCompletionTool.ts @@ -1,18 +1,18 @@ -import { ToolResponse } from "../Cline" +import Anthropic from "@anthropic-ai/sdk" -import { ToolUse } from "../assistant-message" import { Cline } from "../Cline" import { + ToolResponse, + ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag, ToolDescription, AskFinishSubTaskApproval, -} from "./types" +} from "../../shared/tools" import { formatResponse } from "../prompts/responses" import { telemetryService } from "../../services/telemetry/TelemetryService" -import Anthropic from "@anthropic-ai/sdk" export async function attemptCompletionTool( cline: Cline, diff --git a/src/core/tools/browserActionTool.ts b/src/core/tools/browserActionTool.ts index 406a9f1fad..c3f02821c1 100644 --- a/src/core/tools/browserActionTool.ts +++ b/src/core/tools/browserActionTool.ts @@ -1,6 +1,5 @@ import { Cline } from "../Cline" -import { ToolUse } from "../assistant-message" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { BrowserAction, BrowserActionResult, diff --git a/src/core/tools/executeCommandTool.ts b/src/core/tools/executeCommandTool.ts index 5a70c657ac..8c54200bd7 100644 --- a/src/core/tools/executeCommandTool.ts +++ b/src/core/tools/executeCommandTool.ts @@ -1,6 +1,5 @@ import { Cline } from "../Cline" -import { ToolUse } from "../assistant-message" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { formatResponse } from "../prompts/responses" import { unescapeHtmlEntities } from "../../utils/text-normalization" diff --git a/src/core/tools/fetchInstructionsTool.ts b/src/core/tools/fetchInstructionsTool.ts index 3e185301db..eaa27737e9 100644 --- a/src/core/tools/fetchInstructionsTool.ts +++ b/src/core/tools/fetchInstructionsTool.ts @@ -1,9 +1,8 @@ import { Cline } from "../Cline" import { fetchInstructions } from "../prompts/instructions/instructions" import { ClineSayTool } from "../../shared/ExtensionMessage" -import { ToolUse } from "../assistant-message" import { formatResponse } from "../prompts/responses" -import { AskApproval, HandleError, PushToolResult } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult } from "../../shared/tools" export async function fetchInstructionsTool( cline: Cline, diff --git a/src/core/tools/insertContentTool.ts b/src/core/tools/insertContentTool.ts index 24cf6c57b6..f05407f502 100644 --- a/src/core/tools/insertContentTool.ts +++ b/src/core/tools/insertContentTool.ts @@ -1,15 +1,15 @@ +import delay from "delay" +import fs from "fs/promises" + import { getReadablePath } from "../../utils/path" import { Cline } from "../Cline" -import { ToolUse } from "../assistant-message" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { formatResponse } from "../prompts/responses" import { ClineSayTool } from "../../shared/ExtensionMessage" import path from "path" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" import { fileExistsAtPath } from "../../utils/fs" import { insertGroups } from "../diff/insert-groups" -import delay from "delay" -import fs from "fs/promises" export async function insertContentTool( cline: Cline, diff --git a/src/core/tools/listCodeDefinitionNamesTool.ts b/src/core/tools/listCodeDefinitionNamesTool.ts index 6d6a2db3e9..8487367e2b 100644 --- a/src/core/tools/listCodeDefinitionNamesTool.ts +++ b/src/core/tools/listCodeDefinitionNamesTool.ts @@ -1,11 +1,10 @@ -import { ToolUse } from "../assistant-message" -import { HandleError, PushToolResult, RemoveClosingTag } from "./types" -import { Cline } from "../Cline" -import { AskApproval } from "./types" -import { ClineSayTool } from "../../shared/ExtensionMessage" -import { getReadablePath } from "../../utils/path" import path from "path" import fs from "fs/promises" + +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" +import { Cline } from "../Cline" +import { ClineSayTool } from "../../shared/ExtensionMessage" +import { getReadablePath } from "../../utils/path" import { parseSourceCodeForDefinitionsTopLevel, parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" diff --git a/src/core/tools/listFilesTool.ts b/src/core/tools/listFilesTool.ts index efc9226e0a..a010191f75 100644 --- a/src/core/tools/listFilesTool.ts +++ b/src/core/tools/listFilesTool.ts @@ -1,11 +1,12 @@ import * as path from "path" + import { Cline } from "../Cline" import { ClineSayTool } from "../../shared/ExtensionMessage" -import { ToolParamName, ToolUse } from "../assistant-message" import { formatResponse } from "../prompts/responses" import { listFiles } from "../../services/glob/list-files" import { getReadablePath } from "../../utils/path" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" + /** * Implements the list_files tool. * diff --git a/src/core/tools/newTaskTool.ts b/src/core/tools/newTaskTool.ts index 57e290c26b..d6c94dd838 100644 --- a/src/core/tools/newTaskTool.ts +++ b/src/core/tools/newTaskTool.ts @@ -1,10 +1,9 @@ -import { ToolUse } from "../assistant-message" -import { HandleError, PushToolResult, RemoveClosingTag } from "./types" +import delay from "delay" + +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { Cline } from "../Cline" -import { AskApproval } from "./types" import { defaultModeSlug, getModeBySlug } from "../../shared/modes" import { formatResponse } from "../prompts/responses" -import delay from "delay" export async function newTaskTool( cline: Cline, diff --git a/src/core/tools/readFileTool.ts b/src/core/tools/readFileTool.ts index fdb74109c3..022ec4321c 100644 --- a/src/core/tools/readFileTool.ts +++ b/src/core/tools/readFileTool.ts @@ -1,10 +1,11 @@ import path from "path" +import { isBinaryFile } from "isbinaryfile" + import { Cline } from "../Cline" import { ClineSayTool } from "../../shared/ExtensionMessage" -import { ToolUse } from "../assistant-message" import { formatResponse } from "../prompts/responses" import { t } from "../../i18n" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" import { isPathOutsideWorkspace } from "../../utils/pathUtils" import { getReadablePath } from "../../utils/path" @@ -12,7 +13,6 @@ import { countFileLines } from "../../integrations/misc/line-counter" import { readLines } from "../../integrations/misc/read-lines" import { extractTextFromFile, addLineNumbers } from "../../integrations/misc/extract-text" import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter" -import { isBinaryFile } from "isbinaryfile" export async function readFileTool( cline: Cline, diff --git a/src/core/tools/searchAndReplaceTool.ts b/src/core/tools/searchAndReplaceTool.ts index 6996c9361e..7b88405e37 100644 --- a/src/core/tools/searchAndReplaceTool.ts +++ b/src/core/tools/searchAndReplaceTool.ts @@ -1,13 +1,13 @@ +import path from "path" +import fs from "fs/promises" + import { Cline } from "../Cline" -import { ToolUse } from "../assistant-message" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { formatResponse } from "../prompts/responses" import { ClineSayTool } from "../../shared/ExtensionMessage" import { getReadablePath } from "../../utils/path" -import path from "path" import { fileExistsAtPath } from "../../utils/fs" import { addLineNumbers } from "../../integrations/misc/extract-text" -import fs from "fs/promises" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" export async function searchAndReplaceTool( diff --git a/src/core/tools/searchFilesTool.ts b/src/core/tools/searchFilesTool.ts index e3659da9a1..3cf651a0db 100644 --- a/src/core/tools/searchFilesTool.ts +++ b/src/core/tools/searchFilesTool.ts @@ -1,9 +1,9 @@ +import path from "path" + import { Cline } from "../Cline" -import { ToolUse } from "../assistant-message" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { ClineSayTool } from "../../shared/ExtensionMessage" import { getReadablePath } from "../../utils/path" -import path from "path" import { regexSearchFiles } from "../../services/ripgrep" export async function searchFilesTool( diff --git a/src/core/tools/switchModeTool.ts b/src/core/tools/switchModeTool.ts index 48e6e59fe0..595eb04290 100644 --- a/src/core/tools/switchModeTool.ts +++ b/src/core/tools/switchModeTool.ts @@ -1,11 +1,10 @@ -import { Cline } from "../Cline" -import { ToolUse } from "../assistant-message" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" -import { formatResponse } from "../prompts/responses" -import { defaultModeSlug } from "../../shared/modes" -import { getModeBySlug } from "../../shared/modes" import delay from "delay" +import { Cline } from "../Cline" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" +import { formatResponse } from "../prompts/responses" +import { defaultModeSlug, getModeBySlug } from "../../shared/modes" + export async function switchModeTool( cline: Cline, block: ToolUse, diff --git a/src/core/tools/types.ts b/src/core/tools/types.ts deleted file mode 100644 index 5b027241f6..0000000000 --- a/src/core/tools/types.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ClineAsk, ToolProgressStatus } from "../../schemas" -import { ToolParamName } from "../assistant-message" -import { ToolResponse } from "../Cline" - -export type AskApproval = ( - type: ClineAsk, - partialMessage?: string, - progressStatus?: ToolProgressStatus, -) => Promise - -export type HandleError = (action: string, error: Error) => Promise - -export type PushToolResult = (content: ToolResponse) => void - -export type RemoveClosingTag = (tag: ToolParamName, content?: string) => string - -export type AskFinishSubTaskApproval = () => Promise - -export type ToolDescription = () => string diff --git a/src/core/tools/useMcpToolTool.ts b/src/core/tools/useMcpToolTool.ts index 699f693a13..f89a2938b7 100644 --- a/src/core/tools/useMcpToolTool.ts +++ b/src/core/tools/useMcpToolTool.ts @@ -1,6 +1,5 @@ import { Cline } from "../Cline" -import { ToolUse } from "../assistant-message" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { formatResponse } from "../prompts/responses" import { ClineAskUseMcpServer } from "../../shared/ExtensionMessage" diff --git a/src/core/tools/writeToFileTool.ts b/src/core/tools/writeToFileTool.ts index 6a012537f6..89dd010254 100644 --- a/src/core/tools/writeToFileTool.ts +++ b/src/core/tools/writeToFileTool.ts @@ -1,18 +1,16 @@ +import path from "path" +import delay from "delay" import * as vscode from "vscode" import { Cline } from "../Cline" import { ClineSayTool } from "../../shared/ExtensionMessage" -import { ToolUse } from "../assistant-message" import { formatResponse } from "../prompts/responses" -import { AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "./types" +import { ToolUse, AskApproval, HandleError, PushToolResult, RemoveClosingTag } from "../../shared/tools" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" -import path from "path" import { fileExistsAtPath } from "../../utils/fs" -import { addLineNumbers, stripLineNumbers } from "../../integrations/misc/extract-text" +import { addLineNumbers, stripLineNumbers, everyLineHasLineNumbers } from "../../integrations/misc/extract-text" import { getReadablePath } from "../../utils/path" import { isPathOutsideWorkspace } from "../../utils/pathUtils" -import { everyLineHasLineNumbers } from "../../integrations/misc/extract-text" -import delay from "delay" import { detectCodeOmission } from "../../integrations/editor/detect-omission" import { unescapeHtmlEntities } from "../../utils/text-normalization" diff --git a/src/services/telemetry/PostHogClient.ts b/src/services/telemetry/PostHogClient.ts new file mode 100644 index 0000000000..c968d17d01 --- /dev/null +++ b/src/services/telemetry/PostHogClient.ts @@ -0,0 +1,147 @@ +import { PostHog } from "posthog-node" +import * as vscode from "vscode" + +import { logger } from "../../utils/logging" + +// This forward declaration is needed to avoid circular dependencies +export interface ClineProviderInterface { + // Gets telemetry properties to attach to every event + getTelemetryProperties(): Promise> +} + +/** + * PostHogClient handles telemetry event tracking for the Roo Code extension + * Uses PostHog analytics to track user interactions and system events + * Respects user privacy settings and VSCode's global telemetry configuration + */ +export class PostHogClient { + public static readonly EVENTS = { + TASK: { + CREATED: "Task Created", + RESTARTED: "Task Reopened", + COMPLETED: "Task Completed", + CONVERSATION_MESSAGE: "Conversation Message", + MODE_SWITCH: "Mode Switched", + TOOL_USED: "Tool Used", + CHECKPOINT_CREATED: "Checkpoint Created", + CHECKPOINT_RESTORED: "Checkpoint Restored", + CHECKPOINT_DIFFED: "Checkpoint Diffed", + CODE_ACTION_USED: "Code Action Used", + PROMPT_ENHANCED: "Prompt Enhanced", + }, + ERRORS: { + SCHEMA_VALIDATION_ERROR: "Schema Validation Error", + DIFF_APPLICATION_ERROR: "Diff Application Error", + CONSECUTIVE_MISTAKE_ERROR: "Consecutive Mistake Error", + }, + } + + private static instance: PostHogClient + private client: PostHog + private distinctId: string = vscode.env.machineId + private telemetryEnabled: boolean = false + private providerRef: WeakRef | null = null + + private constructor() { + this.client = new PostHog(process.env.POSTHOG_API_KEY || "", { host: "https://us.i.posthog.com" }) + } + + /** + * Updates the telemetry state based on user preferences and VSCode settings + * Only enables telemetry if both VSCode global telemetry is enabled and user has opted in + * @param didUserOptIn Whether the user has explicitly opted into telemetry + */ + public updateTelemetryState(didUserOptIn: boolean): void { + this.telemetryEnabled = false + + // First check global telemetry level - telemetry should only be enabled when level is "all" + const telemetryLevel = vscode.workspace.getConfiguration("telemetry").get("telemetryLevel", "all") + const globalTelemetryEnabled = telemetryLevel === "all" + + // We only enable telemetry if global vscode telemetry is enabled + if (globalTelemetryEnabled) { + this.telemetryEnabled = didUserOptIn + } + + // Update PostHog client state based on telemetry preference + if (this.telemetryEnabled) { + this.client.optIn() + } else { + this.client.optOut() + } + } + + /** + * Gets or creates the singleton instance of PostHogClient + * @returns The PostHogClient instance + */ + public static getInstance(): PostHogClient { + if (!PostHogClient.instance) { + PostHogClient.instance = new PostHogClient() + } + + return PostHogClient.instance + } + + /** + * Sets the ClineProvider reference to use for global properties + * @param provider A ClineProvider instance to use + */ + public setProvider(provider: ClineProviderInterface): void { + this.providerRef = new WeakRef(provider) + logger.debug("PostHogClient: ClineProvider reference set") + } + + /** + * Captures a telemetry event if telemetry is enabled + * @param event The event to capture with its properties + */ + public async capture(event: { event: string; properties?: any }): Promise { + // Only send events if telemetry is enabled + if (this.telemetryEnabled) { + // Get global properties from ClineProvider if available + let globalProperties: Record = {} + const provider = this.providerRef?.deref() + + if (provider) { + try { + // Get the telemetry properties directly from the provider + globalProperties = await provider.getTelemetryProperties() + } catch (error) { + // Log error but continue with capturing the event + logger.error( + `Error getting telemetry properties: ${error instanceof Error ? error.message : String(error)}`, + ) + } + } + + // Merge global properties with event-specific properties + // Event properties take precedence in case of conflicts + const mergedProperties = { + ...globalProperties, + ...(event.properties || {}), + } + + this.client.capture({ + distinctId: this.distinctId, + event: event.event, + properties: mergedProperties, + }) + } + } + + /** + * Checks if telemetry is currently enabled + * @returns Whether telemetry is enabled + */ + public isTelemetryEnabled(): boolean { + return this.telemetryEnabled + } + + /** + * Shuts down the PostHog client + */ + public async shutdown(): Promise { + await this.client.shutdown() + } +} diff --git a/src/services/telemetry/TelemetryService.ts b/src/services/telemetry/TelemetryService.ts index 863f78ac93..c37c9d8ee4 100644 --- a/src/services/telemetry/TelemetryService.ts +++ b/src/services/telemetry/TelemetryService.ts @@ -1,152 +1,7 @@ -import { PostHog } from "posthog-node" -import * as vscode from "vscode" import { ZodError } from "zod" import { logger } from "../../utils/logging" - -// This forward declaration is needed to avoid circular dependencies -interface ClineProviderInterface { - // Gets telemetry properties to attach to every event - getTelemetryProperties(): Promise> -} - -/** - * PostHogClient handles telemetry event tracking for the Roo Code extension - * Uses PostHog analytics to track user interactions and system events - * Respects user privacy settings and VSCode's global telemetry configuration - */ -class PostHogClient { - public static readonly EVENTS = { - TASK: { - CREATED: "Task Created", - RESTARTED: "Task Reopened", - COMPLETED: "Task Completed", - CONVERSATION_MESSAGE: "Conversation Message", - MODE_SWITCH: "Mode Switched", - TOOL_USED: "Tool Used", - CHECKPOINT_CREATED: "Checkpoint Created", - CHECKPOINT_RESTORED: "Checkpoint Restored", - CHECKPOINT_DIFFED: "Checkpoint Diffed", - CODE_ACTION_USED: "Code Action Used", - PROMPT_ENHANCED: "Prompt Enhanced", - }, - ERRORS: { - SCHEMA_VALIDATION_ERROR: "Schema Validation Error", - DIFF_APPLICATION_ERROR: "Diff Application Error", - CONSECUTIVE_MISTAKE_ERROR: "Consecutive Mistake Error", - }, - } - - private static instance: PostHogClient - private client: PostHog - private distinctId: string = vscode.env.machineId - private telemetryEnabled: boolean = false - private providerRef: WeakRef | null = null - - private constructor() { - this.client = new PostHog(process.env.POSTHOG_API_KEY || "", { - host: "https://us.i.posthog.com", - }) - } - - /** - * Updates the telemetry state based on user preferences and VSCode settings - * Only enables telemetry if both VSCode global telemetry is enabled and user has opted in - * @param didUserOptIn Whether the user has explicitly opted into telemetry - */ - public updateTelemetryState(didUserOptIn: boolean): void { - this.telemetryEnabled = false - - // First check global telemetry level - telemetry should only be enabled when level is "all" - const telemetryLevel = vscode.workspace.getConfiguration("telemetry").get("telemetryLevel", "all") - const globalTelemetryEnabled = telemetryLevel === "all" - - // We only enable telemetry if global vscode telemetry is enabled - if (globalTelemetryEnabled) { - this.telemetryEnabled = didUserOptIn - } - - // Update PostHog client state based on telemetry preference - if (this.telemetryEnabled) { - this.client.optIn() - } else { - this.client.optOut() - } - } - - /** - * Gets or creates the singleton instance of PostHogClient - * @returns The PostHogClient instance - */ - public static getInstance(): PostHogClient { - if (!PostHogClient.instance) { - PostHogClient.instance = new PostHogClient() - } - return PostHogClient.instance - } - - /** - * Sets the ClineProvider reference to use for global properties - * @param provider A ClineProvider instance to use - */ - public setProvider(provider: ClineProviderInterface): void { - this.providerRef = new WeakRef(provider) - logger.debug("PostHogClient: ClineProvider reference set") - } - - /** - * Captures a telemetry event if telemetry is enabled - * @param event The event to capture with its properties - */ - public async capture(event: { event: string; properties?: any }): Promise { - // Only send events if telemetry is enabled - if (this.telemetryEnabled) { - // Get global properties from ClineProvider if available - let globalProperties: Record = {} - const provider = this.providerRef?.deref() - - if (provider) { - try { - // Get the telemetry properties directly from the provider - globalProperties = await provider.getTelemetryProperties() - } catch (error) { - // Log error but continue with capturing the event - logger.error( - `Error getting telemetry properties: ${error instanceof Error ? error.message : String(error)}`, - ) - } - } - - // Merge global properties with event-specific properties - // Event properties take precedence in case of conflicts - const mergedProperties = { - ...globalProperties, - ...(event.properties || {}), - } - - this.client.capture({ - distinctId: this.distinctId, - event: event.event, - properties: mergedProperties, - }) - } - } - - /** - * Checks if telemetry is currently enabled - * @returns Whether telemetry is enabled - */ - public isTelemetryEnabled(): boolean { - return this.telemetryEnabled - } - - /** - * Shuts down the PostHog client - */ - public async shutdown(): Promise { - await this.client.shutdown() - } -} +import { PostHogClient, ClineProviderInterface } from "./PostHogClient" /** * TelemetryService wrapper class that defers PostHogClient initialization @@ -155,7 +10,6 @@ class PostHogClient { class TelemetryService { private client: PostHogClient | null = null private initialized = false - private providerRef: WeakRef | null = null /** * Initialize the telemetry service with the PostHog client @@ -179,12 +33,11 @@ class TelemetryService { * @param provider A ClineProvider instance to use */ public setProvider(provider: ClineProviderInterface): void { - // Keep a weak reference to avoid memory leaks - this.providerRef = new WeakRef(provider) // If client is initialized, pass the provider reference - if (this.isReady()) { + if (this.isReady) { this.client!.setProvider(provider) } + logger.debug("TelemetryService: ClineProvider reference set") } @@ -193,7 +46,7 @@ class TelemetryService { * Checks if the service is initialized before performing any operation * @returns Whether the service is ready to use */ - private isReady(): boolean { + private get isReady(): boolean { return this.initialized && this.client !== null } @@ -202,7 +55,10 @@ class TelemetryService { * @param didUserOptIn Whether the user has explicitly opted into telemetry */ public updateTelemetryState(didUserOptIn: boolean): void { - if (!this.isReady()) return + if (!this.isReady) { + return + } + this.client!.updateTelemetryState(didUserOptIn) } @@ -211,7 +67,10 @@ class TelemetryService { * @param event The event to capture with its properties */ public capture(event: { event: string; properties?: any }): void { - if (!this.isReady()) return + if (!this.isReady) { + return + } + this.client!.capture(event) } @@ -238,24 +97,15 @@ class TelemetryService { } public captureConversationMessage(taskId: string, source: "user" | "assistant"): void { - this.captureEvent(PostHogClient.EVENTS.TASK.CONVERSATION_MESSAGE, { - taskId, - source, - }) + this.captureEvent(PostHogClient.EVENTS.TASK.CONVERSATION_MESSAGE, { taskId, source }) } public captureModeSwitch(taskId: string, newMode: string): void { - this.captureEvent(PostHogClient.EVENTS.TASK.MODE_SWITCH, { - taskId, - newMode, - }) + this.captureEvent(PostHogClient.EVENTS.TASK.MODE_SWITCH, { taskId, newMode }) } public captureToolUsage(taskId: string, tool: string): void { - this.captureEvent(PostHogClient.EVENTS.TASK.TOOL_USED, { - taskId, - tool, - }) + this.captureEvent(PostHogClient.EVENTS.TASK.TOOL_USED, { taskId, tool }) } public captureCheckpointCreated(taskId: string): void { @@ -271,36 +121,24 @@ class TelemetryService { } public captureCodeActionUsed(actionType: string): void { - this.captureEvent(PostHogClient.EVENTS.TASK.CODE_ACTION_USED, { - actionType, - }) + this.captureEvent(PostHogClient.EVENTS.TASK.CODE_ACTION_USED, { actionType }) } public capturePromptEnhanced(taskId?: string): void { - this.captureEvent(PostHogClient.EVENTS.TASK.PROMPT_ENHANCED, { - ...(taskId && { taskId }), - }) + this.captureEvent(PostHogClient.EVENTS.TASK.PROMPT_ENHANCED, { ...(taskId && { taskId }) }) } public captureSchemaValidationError({ schemaName, error }: { schemaName: string; error: ZodError }): void { - this.captureEvent(PostHogClient.EVENTS.ERRORS.SCHEMA_VALIDATION_ERROR, { - schemaName, - // https://zod.dev/ERROR_HANDLING?id=formatting-errors - error: error.format(), - }) + // https://zod.dev/ERROR_HANDLING?id=formatting-errors + this.captureEvent(PostHogClient.EVENTS.ERRORS.SCHEMA_VALIDATION_ERROR, { schemaName, error: error.format() }) } public captureDiffApplicationError(taskId: string, consecutiveMistakeCount: number): void { - this.captureEvent(PostHogClient.EVENTS.ERRORS.DIFF_APPLICATION_ERROR, { - taskId, - consecutiveMistakeCount, - }) + this.captureEvent(PostHogClient.EVENTS.ERRORS.DIFF_APPLICATION_ERROR, { taskId, consecutiveMistakeCount }) } public captureConsecutiveMistakeError(taskId: string): void { - this.captureEvent(PostHogClient.EVENTS.ERRORS.CONSECUTIVE_MISTAKE_ERROR, { - taskId, - }) + this.captureEvent(PostHogClient.EVENTS.ERRORS.CONSECUTIVE_MISTAKE_ERROR, { taskId }) } /** @@ -308,15 +146,17 @@ class TelemetryService { * @returns Whether telemetry is enabled */ public isTelemetryEnabled(): boolean { - if (!this.isReady()) return false - return this.client!.isTelemetryEnabled() + return this.isReady && this.client!.isTelemetryEnabled() } /** * Shuts down the PostHog client */ public async shutdown(): Promise { - if (!this.isReady()) return + if (!this.isReady) { + return + } + await this.client!.shutdown() } } diff --git a/src/shared/modes.ts b/src/shared/modes.ts index 0f51b4e50f..9aa4d2eb86 100644 --- a/src/shared/modes.ts +++ b/src/shared/modes.ts @@ -1,7 +1,7 @@ import * as vscode from "vscode" import { GroupOptions, GroupEntry, ModeConfig, PromptComponent, CustomModePrompts } from "../schemas" -import { TOOL_GROUPS, ToolGroup, ALWAYS_AVAILABLE_TOOLS } from "./tool-groups" +import { TOOL_GROUPS, ToolGroup, ALWAYS_AVAILABLE_TOOLS } from "./tools" import { addCustomInstructions } from "../core/prompts/sections/custom-instructions" export type Mode = string diff --git a/src/shared/tool-groups.ts b/src/shared/tool-groups.ts deleted file mode 100644 index f124f8bd2e..0000000000 --- a/src/shared/tool-groups.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type { ToolGroup } from "../schemas" - -// Define tool group configuration -export type ToolGroupConfig = { - tools: readonly string[] - alwaysAvailable?: boolean // Whether this group is always available and shouldn't show in prompts view -} - -// Map of tool slugs to their display names -export const TOOL_DISPLAY_NAMES = { - execute_command: "run commands", - read_file: "read files", - fetch_instructions: "fetch instructions", - write_to_file: "write files", - append_to_file: "append to files", - apply_diff: "apply changes", - search_files: "search files", - list_files: "list files", - list_code_definition_names: "list definitions", - browser_action: "use a browser", - use_mcp_tool: "use mcp tools", - access_mcp_resource: "access mcp resources", - ask_followup_question: "ask questions", - attempt_completion: "complete tasks", - switch_mode: "switch modes", - new_task: "create new task", -} as const - -export type { ToolGroup } - -// Define available tool groups -export const TOOL_GROUPS: Record = { - read: { - tools: ["read_file", "fetch_instructions", "search_files", "list_files", "list_code_definition_names"], - }, - edit: { - tools: ["apply_diff", "write_to_file", "append_to_file", "insert_content", "search_and_replace"], - }, - browser: { - tools: ["browser_action"], - }, - command: { - tools: ["execute_command"], - }, - mcp: { - tools: ["use_mcp_tool", "access_mcp_resource"], - }, - modes: { - tools: ["switch_mode", "new_task"], - alwaysAvailable: true, - }, -} - -// Tools that are always available to all modes -export const ALWAYS_AVAILABLE_TOOLS = [ - "ask_followup_question", - "attempt_completion", - "switch_mode", - "new_task", -] as const - -// Tool name types for type safety -export type ToolName = keyof typeof TOOL_DISPLAY_NAMES - -// Tool helper functions -export function getToolName(toolConfig: string | readonly [ToolName, ...any[]]): ToolName { - return typeof toolConfig === "string" ? (toolConfig as ToolName) : toolConfig[0] -} - -export function getToolOptions(toolConfig: string | readonly [ToolName, ...any[]]): any { - return typeof toolConfig === "string" ? undefined : toolConfig[1] -} diff --git a/src/shared/tools.ts b/src/shared/tools.ts new file mode 100644 index 0000000000..7dd12893a3 --- /dev/null +++ b/src/shared/tools.ts @@ -0,0 +1,236 @@ +import { Anthropic } from "@anthropic-ai/sdk" + +import { ClineAsk, ToolProgressStatus, ToolGroup } from "../schemas" + +export type ToolResponse = string | Array + +export type AskApproval = ( + type: ClineAsk, + partialMessage?: string, + progressStatus?: ToolProgressStatus, +) => Promise + +export type HandleError = (action: string, error: Error) => Promise + +export type PushToolResult = (content: ToolResponse) => void + +export type RemoveClosingTag = (tag: ToolParamName, content?: string) => string + +export type AskFinishSubTaskApproval = () => Promise + +export type ToolDescription = () => string + +export interface TextContent { + type: "text" + content: string + partial: boolean +} + +export const toolNames = [ + "execute_command", + "read_file", + "write_to_file", + "append_to_file", + "apply_diff", + "insert_content", + "search_and_replace", + "search_files", + "list_files", + "list_code_definition_names", + "browser_action", + "use_mcp_tool", + "access_mcp_resource", + "ask_followup_question", + "attempt_completion", + "switch_mode", + "new_task", + "fetch_instructions", +] as const + +export type ToolName = (typeof toolNames)[number] + +export const toolParamNames = [ + "command", + "path", + "content", + "line_count", + "regex", + "file_pattern", + "recursive", + "action", + "url", + "coordinate", + "text", + "server_name", + "tool_name", + "arguments", + "uri", + "question", + "result", + "diff", + "start_line", + "end_line", + "mode_slug", + "reason", + "operations", + "mode", + "message", + "cwd", + "follow_up", + "task", + "size", +] as const + +export type ToolParamName = (typeof toolParamNames)[number] + +export interface ToolUse { + type: "tool_use" + name: ToolName + // params is a partial record, allowing only some or none of the possible parameters to be used + params: Partial> + partial: boolean +} + +export interface ExecuteCommandToolUse extends ToolUse { + name: "execute_command" + // Pick, "command"> makes "command" required, but Partial<> makes it optional + params: Partial, "command" | "cwd">> +} + +export interface ReadFileToolUse extends ToolUse { + name: "read_file" + params: Partial, "path" | "start_line" | "end_line">> +} + +export interface FetchInstructionsToolUse extends ToolUse { + name: "fetch_instructions" + params: Partial, "task">> +} + +export interface WriteToFileToolUse extends ToolUse { + name: "write_to_file" + params: Partial, "path" | "content" | "line_count">> +} + +export interface InsertCodeBlockToolUse extends ToolUse { + name: "insert_content" + params: Partial, "path" | "operations">> +} + +export interface SearchFilesToolUse extends ToolUse { + name: "search_files" + params: Partial, "path" | "regex" | "file_pattern">> +} + +export interface ListFilesToolUse extends ToolUse { + name: "list_files" + params: Partial, "path" | "recursive">> +} + +export interface ListCodeDefinitionNamesToolUse extends ToolUse { + name: "list_code_definition_names" + params: Partial, "path">> +} + +export interface BrowserActionToolUse extends ToolUse { + name: "browser_action" + params: Partial, "action" | "url" | "coordinate" | "text" | "size">> +} + +export interface UseMcpToolToolUse extends ToolUse { + name: "use_mcp_tool" + params: Partial, "server_name" | "tool_name" | "arguments">> +} + +export interface AccessMcpResourceToolUse extends ToolUse { + name: "access_mcp_resource" + params: Partial, "server_name" | "uri">> +} + +export interface AskFollowupQuestionToolUse extends ToolUse { + name: "ask_followup_question" + params: Partial, "question" | "follow_up">> +} + +export interface AttemptCompletionToolUse extends ToolUse { + name: "attempt_completion" + params: Partial, "result" | "command">> +} + +export interface SwitchModeToolUse extends ToolUse { + name: "switch_mode" + params: Partial, "mode_slug" | "reason">> +} + +export interface NewTaskToolUse extends ToolUse { + name: "new_task" + params: Partial, "mode" | "message">> +} + +export type ToolUsage = Record< + ToolName, + { + attempts: number + failures: number + } +> + +// Define tool group configuration +export type ToolGroupConfig = { + tools: readonly string[] + alwaysAvailable?: boolean // Whether this group is always available and shouldn't show in prompts view +} + +export const TOOL_DISPLAY_NAMES: Record = { + execute_command: "run commands", + read_file: "read files", + fetch_instructions: "fetch instructions", + write_to_file: "write files", + append_to_file: "append to files", + apply_diff: "apply changes", + search_files: "search files", + list_files: "list files", + list_code_definition_names: "list definitions", + browser_action: "use a browser", + use_mcp_tool: "use mcp tools", + access_mcp_resource: "access mcp resources", + ask_followup_question: "ask questions", + attempt_completion: "complete tasks", + switch_mode: "switch modes", + new_task: "create new task", + insert_content: "insert content", + search_and_replace: "search and replace", +} as const + +export type { ToolGroup } + +// Define available tool groups. +export const TOOL_GROUPS: Record = { + read: { + tools: ["read_file", "fetch_instructions", "search_files", "list_files", "list_code_definition_names"], + }, + edit: { + tools: ["apply_diff", "write_to_file", "append_to_file", "insert_content", "search_and_replace"], + }, + browser: { + tools: ["browser_action"], + }, + command: { + tools: ["execute_command"], + }, + mcp: { + tools: ["use_mcp_tool", "access_mcp_resource"], + }, + modes: { + tools: ["switch_mode", "new_task"], + alwaysAvailable: true, + }, +} + +// Tools that are always available to all modes. +export const ALWAYS_AVAILABLE_TOOLS: ToolName[] = [ + "ask_followup_question", + "attempt_completion", + "switch_mode", + "new_task", +] as const diff --git a/webview-ui/src/components/prompts/PromptsView.tsx b/webview-ui/src/components/prompts/PromptsView.tsx index 95664e266f..b3ea68a3dd 100644 --- a/webview-ui/src/components/prompts/PromptsView.tsx +++ b/webview-ui/src/components/prompts/PromptsView.tsx @@ -9,6 +9,7 @@ import { VSCodeRadioGroup, VSCodeRadio, } from "@vscode/webview-ui-toolkit/react" + import { useExtensionState } from "../../context/ExtensionStateContext" import { Mode, @@ -22,7 +23,7 @@ import { import { modeConfigSchema } from "../../../../src/schemas" import { supportPrompt, SupportPromptType } from "../../../../src/shared/support-prompt" -import { TOOL_GROUPS, ToolGroup } from "../../../../src/shared/tool-groups" +import { TOOL_GROUPS, ToolGroup } from "../../../../src/shared/tools" import { vscode } from "../../utils/vscode" import { Tab, TabContent, TabHeader } from "../common/Tab" import i18next from "i18next" From d86d601104c94d408f7316b7497e3bc9862ffb19 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Thu, 17 Apr 2025 16:39:00 -0400 Subject: [PATCH 13/15] Add gemini 2.5 flash preview (#2720) --- src/shared/api.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/shared/api.ts b/src/shared/api.ts index 2335872bb3..da7b6d79b8 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -485,6 +485,14 @@ export const vertexModels = { inputPrice: 0.15, outputPrice: 0.6, }, + "gemini-2.5-flash-preview-04-17": { + maxTokens: 65_536, + contextWindow: 1_048_576, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0.15, + outputPrice: 0.6, + }, "gemini-2.5-pro-preview-03-25": { maxTokens: 65_535, contextWindow: 1_048_576, @@ -632,6 +640,14 @@ export const openAiModelInfoSaneDefaults: ModelInfo = { export type GeminiModelId = keyof typeof geminiModels export const geminiDefaultModelId: GeminiModelId = "gemini-2.0-flash-001" export const geminiModels = { + "gemini-2.5-flash-preview-04-17": { + maxTokens: 65_536, + contextWindow: 1_048_576, + supportsImages: true, + supportsPromptCache: false, + inputPrice: 0.15, + outputPrice: 0.6, + }, "gemini-2.5-pro-exp-03-25": { maxTokens: 65_536, contextWindow: 1_048_576, From b077267b4a9b8762174d559efe0f198c5ce5e225 Mon Sep 17 00:00:00 2001 From: Smartsheet-JB-Brown Date: Thu, 17 Apr 2025 15:25:11 -0700 Subject: [PATCH 14/15] fixes image support in bedrock. regression from prompt cache implementation (#2723) fixes image support in bedrock. regression created during prompt caching implementation --- src/api/providers/__tests__/bedrock.test.ts | 154 ++++++++++++++++++-- src/api/providers/bedrock.ts | 54 ++++--- 2 files changed, 175 insertions(+), 33 deletions(-) diff --git a/src/api/providers/__tests__/bedrock.test.ts b/src/api/providers/__tests__/bedrock.test.ts index 4b377861bf..fb81345ae5 100644 --- a/src/api/providers/__tests__/bedrock.test.ts +++ b/src/api/providers/__tests__/bedrock.test.ts @@ -7,9 +7,23 @@ jest.mock("@aws-sdk/credential-providers", () => { return { fromIni: mockFromIni } }) +// Mock BedrockRuntimeClient and ConverseStreamCommand +const mockConverseStreamCommand = jest.fn() +const mockSend = jest.fn().mockResolvedValue({ + stream: [], +}) + +jest.mock("@aws-sdk/client-bedrock-runtime", () => ({ + BedrockRuntimeClient: jest.fn().mockImplementation(() => ({ + send: mockSend, + })), + ConverseStreamCommand: mockConverseStreamCommand, + ConverseCommand: jest.fn(), +})) + import { AwsBedrockHandler } from "../bedrock" import { MessageContent } from "../../../shared/api" -import { BedrockRuntimeClient } from "@aws-sdk/client-bedrock-runtime" +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" @@ -57,7 +71,6 @@ describe("AwsBedrockHandler", () => { }) it("should handle inference-profile ARN with apne3 region prefix", () => { - // Mock the parseArn method before creating the handler const originalParseArn = AwsBedrockHandler.prototype["parseArn"] const parseArnMock = jest.fn().mockImplementation(function (this: any, arn: string, region?: string) { return originalParseArn.call(this, arn, region) @@ -65,12 +78,11 @@ describe("AwsBedrockHandler", () => { AwsBedrockHandler.prototype["parseArn"] = parseArnMock try { - // Create a handler with a custom ARN that includes the apne3. region prefix const customArnHandler = new AwsBedrockHandler({ apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", awsAccessKey: "test-access-key", awsSecretKey: "test-secret-key", - awsRegion: "ap-northeast-3", // Osaka region + awsRegion: "ap-northeast-3", awsCustomArn: "arn:aws:bedrock:ap-northeast-3:123456789012:inference-profile/apne3.anthropic.claude-3-5-sonnet-20241022-v2:0", }) @@ -79,23 +91,17 @@ describe("AwsBedrockHandler", () => { expect(modelInfo.id).toBe( "arn:aws:bedrock:ap-northeast-3:123456789012:inference-profile/apne3.anthropic.claude-3-5-sonnet-20241022-v2:0", - ), - // Verify the model info is defined - expect(modelInfo.info).toBeDefined() + ) + expect(modelInfo.info).toBeDefined() - // Verify parseArn was called with the correct ARN expect(parseArnMock).toHaveBeenCalledWith( "arn:aws:bedrock:ap-northeast-3:123456789012:inference-profile/apne3.anthropic.claude-3-5-sonnet-20241022-v2:0", "ap-northeast-3", ) - // Verify the model ID was correctly extracted from the ARN (without the region prefix) expect((customArnHandler as any).arnInfo.modelId).toBe("anthropic.claude-3-5-sonnet-20241022-v2:0") - - // Verify cross-region inference flag is false since apne3 is a prefix for a single region expect((customArnHandler as any).arnInfo.crossRegionInference).toBe(false) } finally { - // Restore the original method AwsBedrockHandler.prototype["parseArn"] = originalParseArn } }) @@ -109,12 +115,132 @@ describe("AwsBedrockHandler", () => { awsRegion: "us-east-1", }) const modelInfo = customArnHandler.getModel() - // Should fall back to default prompt router model expect(modelInfo.id).toBe( "arn:aws:bedrock:ap-northeast-3:123456789012:default-prompt-router/my_router_arn_no_model", - ) // bedrockDefaultPromptRouterModelId + ) expect(modelInfo.info).toBeDefined() expect(modelInfo.info.maxTokens).toBe(4096) }) }) + + describe("image handling", () => { + const mockImageData = Buffer.from("test-image-data").toString("base64") + + beforeEach(() => { + // Reset the mocks before each test + mockSend.mockReset() + mockConverseStreamCommand.mockReset() + + mockSend.mockResolvedValue({ + stream: [], + }) + }) + + it("should properly convert image content to Bedrock format", async () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: [ + { + type: "image", + source: { + type: "base64", + data: mockImageData, + media_type: "image/jpeg", + }, + }, + { + type: "text", + text: "What's in this image?", + }, + ], + }, + ] + + const generator = handler.createMessage("", messages) + await generator.next() // Start the generator + + // Verify the command was created with the right payload + expect(mockConverseStreamCommand).toHaveBeenCalled() + const commandArg = mockConverseStreamCommand.mock.calls[0][0] + + // Verify the image was properly formatted + const imageBlock = commandArg.messages[0].content[0] + expect(imageBlock).toHaveProperty("image") + expect(imageBlock.image).toHaveProperty("format", "jpeg") + expect(imageBlock.image.source).toHaveProperty("bytes") + expect(imageBlock.image.source.bytes).toBeInstanceOf(Uint8Array) + }) + + it("should reject unsupported image formats", async () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: [ + { + type: "image", + source: { + type: "base64", + data: mockImageData, + media_type: "image/tiff" as "image/jpeg", // Type assertion to bypass TS + }, + }, + ], + }, + ] + + const generator = handler.createMessage("", messages) + await expect(generator.next()).rejects.toThrow("Unsupported image format: tiff") + }) + + it("should handle multiple images in a single message", async () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: [ + { + type: "image", + source: { + type: "base64", + data: mockImageData, + media_type: "image/jpeg", + }, + }, + { + type: "text", + text: "First image", + }, + { + type: "image", + source: { + type: "base64", + data: mockImageData, + media_type: "image/png", + }, + }, + { + type: "text", + text: "Second image", + }, + ], + }, + ] + + const generator = handler.createMessage("", messages) + await generator.next() // Start the generator + + // Verify the command was created with the right payload + expect(mockConverseStreamCommand).toHaveBeenCalled() + const commandArg = mockConverseStreamCommand.mock.calls[0][0] + + // Verify both images were properly formatted + const firstImage = commandArg.messages[0].content[0] + const secondImage = commandArg.messages[0].content[2] + + expect(firstImage).toHaveProperty("image") + expect(firstImage.image).toHaveProperty("format", "jpeg") + expect(secondImage).toHaveProperty("image") + expect(secondImage.image).toHaveProperty("format", "png") + }) + }) }) diff --git a/src/api/providers/bedrock.ts b/src/api/providers/bedrock.ts index d513219899..c2da82d4ac 100644 --- a/src/api/providers/bedrock.ts +++ b/src/api/providers/bedrock.ts @@ -3,6 +3,7 @@ import { ConverseStreamCommand, ConverseCommand, BedrockRuntimeClientConfig, + ContentBlock, } from "@aws-sdk/client-bedrock-runtime" import { fromIni } from "@aws-sdk/credential-providers" import { Anthropic } from "@anthropic-ai/sdk" @@ -23,6 +24,7 @@ import { Message, SystemContentBlock } from "@aws-sdk/client-bedrock-runtime" import { MultiPointStrategy } from "../transform/cache-strategy/multi-point-strategy" import { ModelInfo as CacheModelInfo } from "../transform/cache-strategy/types" import { AMAZON_BEDROCK_REGION_INFO } from "../../shared/aws_regions" +import { convertToBedrockConverseMessages as sharedConverter } from "../transform/bedrock-converse-format" const BEDROCK_DEFAULT_TEMPERATURE = 0.3 const BEDROCK_MAX_TOKENS = 4096 @@ -434,7 +436,18 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH modelInfo?: any, conversationId?: string, // Optional conversation ID to track cache points across messages ): { system: SystemContentBlock[]; messages: Message[] } { - // Convert model info to expected format + // First convert messages using shared converter for proper image handling + const convertedMessages = sharedConverter(anthropicMessages as Anthropic.Messages.MessageParam[]) + + // If prompt caching is disabled, return the converted messages directly + if (!usePromptCache) { + return { + system: systemMessage ? [{ text: systemMessage } as SystemContentBlock] : [], + messages: convertedMessages, + } + } + + // Convert model info to expected format for cache strategy const cacheModelInfo: CacheModelInfo = { maxTokens: modelInfo?.maxTokens || 8192, contextWindow: modelInfo?.contextWindow || 200_000, @@ -444,18 +457,6 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH cachableFields: modelInfo?.cachableFields || [], } - // Clean messages by removing any existing cache points - const cleanedMessages = anthropicMessages.map((msg) => { - if (typeof msg.content === "string") { - return msg - } - const cleaned = { - ...msg, - content: this.removeCachePoints(msg.content), - } - return cleaned - }) - // Get previous cache point placements for this conversation if available const previousPlacements = conversationId && this.previousCachePointPlacements[conversationId] @@ -466,21 +467,36 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH const config = { modelInfo: cacheModelInfo, systemPrompt: systemMessage, - messages: cleanedMessages as Anthropic.Messages.MessageParam[], + messages: anthropicMessages as Anthropic.Messages.MessageParam[], usePromptCache, previousCachePointPlacements: previousPlacements, } - // Determine optimal cache points + // Get cache point placements let strategy = new MultiPointStrategy(config) - const result = strategy.determineOptimalCachePoints() + const cacheResult = strategy.determineOptimalCachePoints() // Store cache point placements for future use if conversation ID is provided - if (conversationId && result.messageCachePointPlacements) { - this.previousCachePointPlacements[conversationId] = result.messageCachePointPlacements + if (conversationId && cacheResult.messageCachePointPlacements) { + this.previousCachePointPlacements[conversationId] = cacheResult.messageCachePointPlacements } - return result + // Apply cache points to the properly converted messages + const messagesWithCache = convertedMessages.map((msg, index) => { + const placement = cacheResult.messageCachePointPlacements?.find((p) => p.index === index) + if (placement) { + return { + ...msg, + content: [...(msg.content || []), { cachePoint: { type: "default" } } as ContentBlock], + } + } + return msg + }) + + return { + system: systemMessage ? [{ text: systemMessage } as SystemContentBlock] : [], + messages: messagesWithCache, + } } /************************************************************************************ From 3c937c38275a994913cadca2692ebc4d03d23e23 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Thu, 17 Apr 2025 15:28:11 -0700 Subject: [PATCH 15/15] Task header theme fixes (#2721) --- evals/packages/db/scripts/copy-run.mts | 12 ++- webview-ui/src/components/chat/ChatRow.tsx | 92 ++++--------------- .../src/components/chat/FollowUpSuggest.tsx | 67 +++++++------- webview-ui/src/components/chat/TaskHeader.tsx | 43 ++++----- webview-ui/src/components/ui/badge.tsx | 2 +- webview-ui/src/components/ui/button.tsx | 4 +- 6 files changed, 85 insertions(+), 135 deletions(-) diff --git a/evals/packages/db/scripts/copy-run.mts b/evals/packages/db/scripts/copy-run.mts index 9901058d7a..fa82907181 100644 --- a/evals/packages/db/scripts/copy-run.mts +++ b/evals/packages/db/scripts/copy-run.mts @@ -57,7 +57,17 @@ const copyRun = async (runId: number) => { tasks, async (task) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { id: _, ...newTaskMetricsValues } = task.taskMetrics! + const { id: _, ...newTaskMetricsValues } = task.taskMetrics || { + duration: 0, + tokensIn: 0, + tokensOut: 0, + tokensContext: 0, + cacheWrites: 0, + cacheReads: 0, + cost: 0, + createdAt: new Date(), + } + const [newTaskMetrics] = await destDb.insert(schema.taskMetrics).values(newTaskMetricsValues).returning() if (!newTaskMetrics) { diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index e2c7495b65..60526e11d1 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -1,9 +1,12 @@ -import { VSCodeBadge, VSCodeButton, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react" -import deepEqual from "fast-deep-equal" import React, { memo, useEffect, useMemo, useRef, useState } from "react" import { useSize } from "react-use" -import { useCopyToClipboard } from "../../utils/clipboard" import { useTranslation, Trans } from "react-i18next" +import deepEqual from "fast-deep-equal" +import { VSCodeBadge, VSCodeButton, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react" + +import { Button } from "@/components/ui" + +import { useCopyToClipboard } from "../../utils/clipboard" import { safeJsonParse } from "../../utils/json" import { ClineApiReqInfo, @@ -25,7 +28,7 @@ import McpResourceRow from "../mcp/McpResourceRow" import McpToolRow from "../mcp/McpToolRow" import { highlightMentions } from "./TaskHeader" import { CheckpointSaved } from "./checkpoints/CheckpointSaved" -import FollowUpSuggest from "./FollowUpSuggest" +import { FollowUpSuggest } from "./FollowUpSuggest" interface ChatRowProps { message: ClineMessage @@ -230,7 +233,8 @@ export const ChatRowContent = ({ return [ , + style={{ color: normalColor, marginBottom: "-1.5px" }} + />, {t("chat:questions.hasQuestion")}, ] default: @@ -795,39 +799,6 @@ export const ChatRowContent = ({ )}

- - {/* {apiProvider === "" && ( -
- - - Uh-oh, this could be a problem on end. We've been alerted and - will resolve this ASAP. You can also{" "} - - contact us - - . - -
- )} */} )} @@ -853,46 +824,19 @@ export const ChatRowContent = ({ ) case "user_feedback": return ( -
-
- - {highlightMentions(message.text)} - - +
+
{highlightMentions(message.text)}
+
{message.images && message.images.length > 0 && ( diff --git a/webview-ui/src/components/chat/FollowUpSuggest.tsx b/webview-ui/src/components/chat/FollowUpSuggest.tsx index 25371dc502..b300add5fb 100644 --- a/webview-ui/src/components/chat/FollowUpSuggest.tsx +++ b/webview-ui/src/components/chat/FollowUpSuggest.tsx @@ -1,7 +1,8 @@ import { useCallback } from "react" -import { cn } from "../../lib/utils" -import { Button } from "../ui/button" -import { Edit } from "lucide-react" +import { ArrowRight, Edit } from "lucide-react" + +import { Button } from "@/components/ui" + import { useAppTranslation } from "../../i18n/TranslationContext" interface FollowUpSuggestProps { @@ -10,7 +11,7 @@ interface FollowUpSuggestProps { ts: number } -const FollowUpSuggest = ({ suggestions = [], onSuggestionClick, ts = 1 }: FollowUpSuggestProps) => { +export const FollowUpSuggest = ({ suggestions = [], onSuggestionClick, ts = 1 }: FollowUpSuggestProps) => { const { t } = useAppTranslation() const handleSuggestionClick = useCallback( (suggestion: string, event: React.MouseEvent) => { @@ -19,45 +20,39 @@ const FollowUpSuggest = ({ suggestions = [], onSuggestionClick, ts = 1 }: Follow [onSuggestionClick], ) - // Don't render if there are no suggestions or no click handler + // Don't render if there are no suggestions or no click handler. if (!suggestions?.length || !onSuggestionClick) { return null } return ( -
-
-
- {suggestions.map((suggestion) => ( -
- -
{ - e.stopPropagation() - // Simulate shift-click by directly calling the handler with shiftKey=true - onSuggestionClick?.(suggestion, { ...e, shiftKey: true }) - }} - title={t("chat:followUpSuggest.copyToInput")}> - -
+
+ {suggestions.map((suggestion) => ( +
+ +
{ + e.stopPropagation() + // Simulate shift-click by directly calling the handler with shiftKey=true. + onSuggestionClick?.(suggestion, { ...e, shiftKey: true }) + }} + title={t("chat:followUpSuggest.copyToInput")}> + +
-
+ ))}
) } - -export default FollowUpSuggest diff --git a/webview-ui/src/components/chat/TaskHeader.tsx b/webview-ui/src/components/chat/TaskHeader.tsx index 6a2c91b303..3053099b10 100644 --- a/webview-ui/src/components/chat/TaskHeader.tsx +++ b/webview-ui/src/components/chat/TaskHeader.tsx @@ -1,13 +1,12 @@ import React, { memo, useMemo, useRef, useState } from "react" import { useWindowSize } from "react-use" -import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" import prettyBytes from "pretty-bytes" import { useTranslation } from "react-i18next" import { vscode } from "@/utils/vscode" import { formatLargeNumber } from "@/utils/format" import { calculateTokenDistribution, getMaxTokensForModel } from "@/utils/model-utils" -import { Button } from "@/components/ui" +import { Button, Badge } from "@/components/ui" import { ClineMessage } from "../../../../src/shared/ExtensionMessage" import { mentionRegexGlobal } from "../../../../src/shared/context-mentions" @@ -17,6 +16,7 @@ import { useExtensionState } from "../../context/ExtensionStateContext" import Thumbnails from "../common/Thumbnails" import { normalizeApiConfiguration } from "../settings/ApiOptions" import { DeleteTaskDialog } from "../history/DeleteTaskDialog" +import { cn } from "@/lib/utils" interface TaskHeaderProps { task: ClineMessage @@ -55,10 +55,15 @@ const TaskHeader: React.FC = ({ const shouldShowPromptCacheInfo = doesModelSupportPromptCache && apiConfiguration?.apiProvider !== "openrouter" return ( -
+
-
+ className={cn( + "rounded-xs p-2.5 flex flex-col gap-1.5 relative z-1 border", + !!isTaskExpanded + ? "border-vscode-panel-border text-vscode-foreground" + : "border-vscode-panel-border/80 text-vscode-foreground/80", + )}> +
setIsTaskExpanded(!isTaskExpanded)}> @@ -73,14 +78,14 @@ const TaskHeader: React.FC = ({ {!isTaskExpanded && {highlightMentions(task.text, false)}}
- - - - + title={t("chat:task.closeAndStart")} + className="shrink-0 w-5 h-5"> + +
{/* Collapsed state: Track context and cost if we have any */} {!isTaskExpanded && contextWindow > 0 && ( @@ -90,11 +95,7 @@ const TaskHeader: React.FC = ({ contextTokens={contextTokens || 0} maxTokens={getMaxTokensForModel(selectedModelInfo, apiConfiguration)} /> - {!!totalCost && ( -
- ${totalCost?.toFixed(2)} -
- )} + {!!totalCost && ${totalCost.toFixed(2)}}
)} {/* Expanded state: Show task text and images */} @@ -271,7 +272,7 @@ const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: Cont
{/* Invisible overlay for hover area */}
@@ -282,7 +283,7 @@ const ContextWindowProgress = ({ contextWindow, contextTokens, maxTokens }: Cont
{/* Invisible overlay for current tokens section */}
{/* Invisible overlay for reserved section */}
{/* Invisible overlay for available space */}