From 7f70145cb122f2b6983d9fd3f413f7942cf2adfa Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Thu, 24 Jul 2025 19:13:40 -0700 Subject: [PATCH 01/44] Expose default modes in @roo-code/types (#6184) --- packages/types/npm/package.json | 2 +- packages/types/src/mode.ts | 65 +++++++++++++++++++++++++++ src/shared/modes.ts | 79 +++++---------------------------- 3 files changed, 76 insertions(+), 70 deletions(-) diff --git a/packages/types/npm/package.json b/packages/types/npm/package.json index 7f364e3d4f..95461be5cc 100644 --- a/packages/types/npm/package.json +++ b/packages/types/npm/package.json @@ -1,6 +1,6 @@ { "name": "@roo-code/types", - "version": "1.36.0", + "version": "1.37.0", "description": "TypeScript type definitions for Roo Code.", "publishConfig": { "access": "public", diff --git a/packages/types/src/mode.ts b/packages/types/src/mode.ts index 175ec095fc..88dcbb9574 100644 --- a/packages/types/src/mode.ts +++ b/packages/types/src/mode.ts @@ -128,3 +128,68 @@ export type CustomModePrompts = z.infer export const customSupportPromptsSchema = z.record(z.string(), z.string().optional()) export type CustomSupportPrompts = z.infer + +/** + * DEFAULT_MODES + */ + +export const DEFAULT_MODES: readonly ModeConfig[] = [ + { + slug: "architect", + name: "🏗️ Architect", + roleDefinition: + "You are Roo, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution.", + whenToUse: + "Use this mode when you need to plan, design, or strategize before implementation. Perfect for breaking down complex problems, creating technical specifications, designing system architecture, or brainstorming solutions before coding.", + description: "Plan and design before implementation", + groups: ["read", ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }], "browser", "mcp"], + customInstructions: + "1. Do some information gathering (using provided tools) to get more context about the task.\n\n2. You should also ask the user clarifying questions to get a better understanding of the task.\n\n3. Once you've gained more context about the user's request, break down the task into clear, actionable steps and create a todo list using the `update_todo_list` tool. Each todo item should be:\n - Specific and actionable\n - Listed in logical execution order\n - Focused on a single, well-defined outcome\n - Clear enough that another mode could execute it independently\n\n **Note:** If the `update_todo_list` tool is not available, write the plan to a markdown file (e.g., `plan.md` or `todo.md`) instead.\n\n4. As you gather more information or discover new requirements, update the todo list to reflect the current understanding of what needs to be accomplished.\n\n5. Ask the user if they are pleased with this plan, or if they would like to make any changes. Think of this as a brainstorming session where you can discuss the task and refine the todo list.\n\n6. Include Mermaid diagrams if they help clarify complex workflows or system architecture. Please avoid using double quotes (\"\") and parentheses () inside square brackets ([]) in Mermaid diagrams, as this can cause parsing errors.\n\n7. Use the switch_mode tool to request that the user switch to another mode to implement the solution.\n\n**IMPORTANT: Focus on creating clear, actionable todo lists rather than lengthy markdown documents. Use the todo list as your primary planning tool to track and organize the work that needs to be done.**", + }, + { + slug: "code", + name: "💻 Code", + roleDefinition: + "You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.", + whenToUse: + "Use this mode when you need to write, modify, or refactor code. Ideal for implementing features, fixing bugs, creating new files, or making code improvements across any programming language or framework.", + description: "Write, modify, and refactor code", + groups: ["read", "edit", "browser", "command", "mcp"], + }, + { + slug: "ask", + name: "❓ Ask", + roleDefinition: + "You are Roo, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.", + whenToUse: + "Use this mode when you need explanations, documentation, or answers to technical questions. Best for understanding concepts, analyzing existing code, getting recommendations, or learning about technologies without making changes.", + description: "Get answers and explanations", + groups: ["read", "browser", "mcp"], + customInstructions: + "You can analyze code, explain concepts, and access external resources. Always answer the user's questions thoroughly, and do not switch to implementing code unless explicitly requested by the user. Include Mermaid diagrams when they clarify your response.", + }, + { + slug: "debug", + name: "🪲 Debug", + roleDefinition: + "You are Roo, an expert software debugger specializing in systematic problem diagnosis and resolution.", + whenToUse: + "Use this mode when you're troubleshooting issues, investigating errors, or diagnosing problems. Specialized in systematic debugging, adding logging, analyzing stack traces, and identifying root causes before applying fixes.", + description: "Diagnose and fix software issues", + groups: ["read", "edit", "browser", "command", "mcp"], + customInstructions: + "Reflect on 5-7 different possible sources of the problem, distill those down to 1-2 most likely sources, and then add logs to validate your assumptions. Explicitly ask the user to confirm the diagnosis before fixing the problem.", + }, + { + slug: "orchestrator", + name: "🪃 Orchestrator", + roleDefinition: + "You are Roo, a strategic workflow orchestrator who coordinates complex tasks by delegating them to appropriate specialized modes. You have a comprehensive understanding of each mode's capabilities and limitations, allowing you to effectively break down complex problems into discrete tasks that can be solved by different specialists.", + whenToUse: + "Use this mode for complex, multi-step projects that require coordination across different specialties. Ideal when you need to break down large tasks into subtasks, manage workflows, or coordinate work that spans multiple domains or expertise areas.", + description: "Coordinate tasks across multiple modes", + groups: [], + customInstructions: + "Your role is to coordinate complex workflows by delegating tasks to specialized modes. As an orchestrator, you should:\n\n1. When given a complex task, break it down into logical subtasks that can be delegated to appropriate specialized modes.\n\n2. For each subtask, use the `new_task` tool to delegate. Choose the most appropriate mode for the subtask's specific goal and provide comprehensive instructions in the `message` parameter. These instructions must include:\n * All necessary context from the parent task or previous subtasks required to complete the work.\n * A clearly defined scope, specifying exactly what the subtask should accomplish.\n * An explicit statement that the subtask should *only* perform the work outlined in these instructions and not deviate.\n * An instruction for the subtask to signal completion by using the `attempt_completion` tool, providing a concise yet thorough summary of the outcome in the `result` parameter, keeping in mind that this summary will be the source of truth used to keep track of what was completed on this project.\n * A statement that these specific instructions supersede any conflicting general instructions the subtask's mode might have.\n\n3. Track and manage the progress of all subtasks. When a subtask is completed, analyze its results and determine the next steps.\n\n4. Help the user understand how the different subtasks fit together in the overall workflow. Provide clear reasoning about why you're delegating specific tasks to specific modes.\n\n5. When all subtasks are completed, synthesize the results and provide a comprehensive overview of what was accomplished.\n\n6. Ask clarifying questions when necessary to better understand how to break down complex tasks effectively.\n\n7. Suggest improvements to the workflow based on the results of completed subtasks.\n\nUse subtasks to maintain clarity. If a request significantly shifts focus or requires a different expertise (mode), consider creating a subtask rather than overloading the current one.", + }, +] as const diff --git a/src/shared/modes.ts b/src/shared/modes.ts index 168f4ff867..f68d25c682 100644 --- a/src/shared/modes.ts +++ b/src/shared/modes.ts @@ -1,13 +1,14 @@ import * as vscode from "vscode" -import type { - GroupOptions, - GroupEntry, - ModeConfig, - CustomModePrompts, - ExperimentId, - ToolGroup, - PromptComponent, +import { + type GroupOptions, + type GroupEntry, + type ModeConfig, + type CustomModePrompts, + type ExperimentId, + type ToolGroup, + type PromptComponent, + DEFAULT_MODES, } from "@roo-code/types" import { addCustomInstructions } from "../core/prompts/sections/custom-instructions" @@ -60,67 +61,7 @@ export function getToolsForMode(groups: readonly GroupEntry[]): string[] { } // Main modes configuration as an ordered array -// Note: The first mode in this array is the default mode for new installations -export const modes: readonly ModeConfig[] = [ - { - slug: "architect", - name: "🏗️ Architect", - roleDefinition: - "You are Roo, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution.", - whenToUse: - "Use this mode when you need to plan, design, or strategize before implementation. Perfect for breaking down complex problems, creating technical specifications, designing system architecture, or brainstorming solutions before coding.", - description: "Plan and design before implementation", - groups: ["read", ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }], "browser", "mcp"], - customInstructions: - "1. Do some information gathering (using provided tools) to get more context about the task.\n\n2. You should also ask the user clarifying questions to get a better understanding of the task.\n\n3. Once you've gained more context about the user's request, break down the task into clear, actionable steps and create a todo list using the `update_todo_list` tool. Each todo item should be:\n - Specific and actionable\n - Listed in logical execution order\n - Focused on a single, well-defined outcome\n - Clear enough that another mode could execute it independently\n\n **Note:** If the `update_todo_list` tool is not available, write the plan to a markdown file (e.g., `plan.md` or `todo.md`) instead.\n\n4. As you gather more information or discover new requirements, update the todo list to reflect the current understanding of what needs to be accomplished.\n\n5. Ask the user if they are pleased with this plan, or if they would like to make any changes. Think of this as a brainstorming session where you can discuss the task and refine the todo list.\n\n6. Include Mermaid diagrams if they help clarify complex workflows or system architecture. Please avoid using double quotes (\"\") and parentheses () inside square brackets ([]) in Mermaid diagrams, as this can cause parsing errors.\n\n7. Use the switch_mode tool to request that the user switch to another mode to implement the solution.\n\n**IMPORTANT: Focus on creating clear, actionable todo lists rather than lengthy markdown documents. Use the todo list as your primary planning tool to track and organize the work that needs to be done.**", - }, - { - slug: "code", - name: "💻 Code", - roleDefinition: - "You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.", - whenToUse: - "Use this mode when you need to write, modify, or refactor code. Ideal for implementing features, fixing bugs, creating new files, or making code improvements across any programming language or framework.", - description: "Write, modify, and refactor code", - groups: ["read", "edit", "browser", "command", "mcp"], - }, - { - slug: "ask", - name: "❓ Ask", - roleDefinition: - "You are Roo, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.", - whenToUse: - "Use this mode when you need explanations, documentation, or answers to technical questions. Best for understanding concepts, analyzing existing code, getting recommendations, or learning about technologies without making changes.", - description: "Get answers and explanations", - groups: ["read", "browser", "mcp"], - customInstructions: - "You can analyze code, explain concepts, and access external resources. Always answer the user's questions thoroughly, and do not switch to implementing code unless explicitly requested by the user. Include Mermaid diagrams when they clarify your response.", - }, - { - slug: "debug", - name: "🪲 Debug", - roleDefinition: - "You are Roo, an expert software debugger specializing in systematic problem diagnosis and resolution.", - whenToUse: - "Use this mode when you're troubleshooting issues, investigating errors, or diagnosing problems. Specialized in systematic debugging, adding logging, analyzing stack traces, and identifying root causes before applying fixes.", - description: "Diagnose and fix software issues", - groups: ["read", "edit", "browser", "command", "mcp"], - customInstructions: - "Reflect on 5-7 different possible sources of the problem, distill those down to 1-2 most likely sources, and then add logs to validate your assumptions. Explicitly ask the user to confirm the diagnosis before fixing the problem.", - }, - { - slug: "orchestrator", - name: "🪃 Orchestrator", - roleDefinition: - "You are Roo, a strategic workflow orchestrator who coordinates complex tasks by delegating them to appropriate specialized modes. You have a comprehensive understanding of each mode's capabilities and limitations, allowing you to effectively break down complex problems into discrete tasks that can be solved by different specialists.", - whenToUse: - "Use this mode for complex, multi-step projects that require coordination across different specialties. Ideal when you need to break down large tasks into subtasks, manage workflows, or coordinate work that spans multiple domains or expertise areas.", - description: "Coordinate tasks across multiple modes", - groups: [], - customInstructions: - "Your role is to coordinate complex workflows by delegating tasks to specialized modes. As an orchestrator, you should:\n\n1. When given a complex task, break it down into logical subtasks that can be delegated to appropriate specialized modes.\n\n2. For each subtask, use the `new_task` tool to delegate. Choose the most appropriate mode for the subtask's specific goal and provide comprehensive instructions in the `message` parameter. These instructions must include:\n * All necessary context from the parent task or previous subtasks required to complete the work.\n * A clearly defined scope, specifying exactly what the subtask should accomplish.\n * An explicit statement that the subtask should *only* perform the work outlined in these instructions and not deviate.\n * An instruction for the subtask to signal completion by using the `attempt_completion` tool, providing a concise yet thorough summary of the outcome in the `result` parameter, keeping in mind that this summary will be the source of truth used to keep track of what was completed on this project.\n * A statement that these specific instructions supersede any conflicting general instructions the subtask's mode might have.\n\n3. Track and manage the progress of all subtasks. When a subtask is completed, analyze its results and determine the next steps.\n\n4. Help the user understand how the different subtasks fit together in the overall workflow. Provide clear reasoning about why you're delegating specific tasks to specific modes.\n\n5. When all subtasks are completed, synthesize the results and provide a comprehensive overview of what was accomplished.\n\n6. Ask clarifying questions when necessary to better understand how to break down complex tasks effectively.\n\n7. Suggest improvements to the workflow based on the results of completed subtasks.\n\nUse subtasks to maintain clarity. If a request significantly shifts focus or requires a different expertise (mode), consider creating a subtask rather than overloading the current one.", - }, -] as const +export const modes = DEFAULT_MODES // Export the default mode slug export const defaultModeSlug = modes[0].slug From 02118c5e7f12a559788ab3a172acebaae7bdfa80 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Thu, 24 Jul 2025 22:16:43 -0400 Subject: [PATCH 02/44] Add type for allowing org members to view all tasks (#6193) --- packages/types/npm/package.json | 2 +- packages/types/src/cloud.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/types/npm/package.json b/packages/types/npm/package.json index 95461be5cc..e99ffe30c2 100644 --- a/packages/types/npm/package.json +++ b/packages/types/npm/package.json @@ -1,6 +1,6 @@ { "name": "@roo-code/types", - "version": "1.37.0", + "version": "1.39.0", "description": "TypeScript type definitions for Roo Code.", "publishConfig": { "access": "public", diff --git a/packages/types/src/cloud.ts b/packages/types/src/cloud.ts index 75ff0b08b9..6df7292dd5 100644 --- a/packages/types/src/cloud.ts +++ b/packages/types/src/cloud.ts @@ -96,6 +96,7 @@ export const organizationCloudSettingsSchema = z.object({ recordTaskMessages: z.boolean().optional(), enableTaskSharing: z.boolean().optional(), taskShareExpirationDays: z.number().int().positive().optional(), + allowMembersViewAllTasks: z.boolean().optional(), }) export type OrganizationCloudSettings = z.infer @@ -128,6 +129,7 @@ export const ORGANIZATION_DEFAULT: OrganizationSettings = { recordTaskMessages: true, enableTaskSharing: true, taskShareExpirationDays: 30, + allowMembersViewAllTasks: true, }, defaultSettings: {}, allowList: ORGANIZATION_ALLOW_ALL, From 25857a4809c81a91b39e734ce63dd98fcb441ffe Mon Sep 17 00:00:00 2001 From: KJ7LNW <93454819+KJ7LNW@users.noreply.github.com> Date: Thu, 24 Jul 2025 21:40:43 -0700 Subject: [PATCH 03/44] feat: add efficiency warning for single SEARCH/REPLACE blocks in apply_diff (#6055) Co-authored-by: Eric Wheeler Co-authored-by: Daniel Riccio --- src/core/tools/applyDiffTool.ts | 11 +++++++++-- src/core/tools/multiApplyDiffTool.ts | 16 +++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/core/tools/applyDiffTool.ts b/src/core/tools/applyDiffTool.ts index ad4bb0590f..f046ba67d2 100644 --- a/src/core/tools/applyDiffTool.ts +++ b/src/core/tools/applyDiffTool.ts @@ -193,10 +193,17 @@ export async function applyDiffToolLegacy( // Get the formatted response message const message = await cline.diffViewProvider.pushToolWriteResult(cline, cline.cwd, !fileExists) + // Check for single SEARCH/REPLACE block warning + const searchBlocks = (diffContent.match(/<<<<<<< SEARCH/g) || []).length + const singleBlockNotice = + searchBlocks === 1 + ? "\nMaking multiple related changes in a single apply_diff is more efficient. If other changes are needed in this file, please include them as additional SEARCH/REPLACE blocks." + : "" + if (partFailHint) { - pushToolResult(partFailHint + message) + pushToolResult(partFailHint + message + singleBlockNotice) } else { - pushToolResult(message) + pushToolResult(message + singleBlockNotice) } await cline.diffViewProvider.reset() diff --git a/src/core/tools/multiApplyDiffTool.ts b/src/core/tools/multiApplyDiffTool.ts index 4ddef4880b..ec8c77a63b 100644 --- a/src/core/tools/multiApplyDiffTool.ts +++ b/src/core/tools/multiApplyDiffTool.ts @@ -601,8 +601,22 @@ ${errorDetails ? `\nTechnical details:\n${errorDetails}\n` : ""} await cline.say("diff_error", allDiffErrors.join("\n")) } + // Check for single SEARCH/REPLACE block warning + let totalSearchBlocks = 0 + for (const operation of operations) { + for (const diffItem of operation.diff) { + const searchBlocks = (diffItem.content.match(/<<<<<<< SEARCH/g) || []).length + totalSearchBlocks += searchBlocks + } + } + + const singleBlockNotice = + totalSearchBlocks === 1 + ? "\nMaking multiple related changes in a single apply_diff is more efficient. If other changes are needed in this file, please include them as additional SEARCH/REPLACE blocks." + : "" + // Push the final result combining all operation results - pushToolResult(results.join("\n\n")) + pushToolResult(results.join("\n\n") + singleBlockNotice) return } catch (error) { await handleError("applying diff", error) From d54e3fcdfc730b66b7409944d34cfa52e109fc64 Mon Sep 17 00:00:00 2001 From: KJ7LNW <93454819+KJ7LNW@users.noreply.github.com> Date: Thu, 24 Jul 2025 21:41:12 -0700 Subject: [PATCH 04/44] fix: allow auto-approve checkbox to be toggled at any time (#6061) Co-authored-by: Eric Wheeler Co-authored-by: Daniel Riccio --- webview-ui/src/components/chat/AutoApproveMenu.tsx | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/webview-ui/src/components/chat/AutoApproveMenu.tsx b/webview-ui/src/components/chat/AutoApproveMenu.tsx index 2e987b7c49..0feafae15d 100644 --- a/webview-ui/src/components/chat/AutoApproveMenu.tsx +++ b/webview-ui/src/components/chat/AutoApproveMenu.tsx @@ -1,4 +1,4 @@ -import { useCallback, useMemo, useState } from "react" +import { memo, useCallback, useMemo, useState } from "react" import { Trans } from "react-i18next" import { VSCodeCheckbox, VSCodeLink, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" @@ -129,11 +129,6 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { setIsExpanded((prev) => !prev) }, []) - // Disable main checkbox while menu is open or no options selected - const isCheckboxDisabled = useMemo(() => { - return !hasEnabledOptions || isExpanded - }, [hasEnabledOptions, isExpanded]) - const enabledActionsList = Object.entries(toggles) .filter(([_key, value]) => !!value) .map(([key]) => t(autoApproveSettingsConfig[key as AutoApproveSetting].labelKey)) @@ -178,7 +173,7 @@ const AutoApproveMenu = ({ style }: AutoApproveMenuProps) => { content={!hasEnabledOptions ? t("chat:autoApprove.selectOptionsFirst") : undefined}> { ) } -export default AutoApproveMenu +export default memo(AutoApproveMenu) From b1406342a86ab2f50e1df0162e7f9d56f17529bd Mon Sep 17 00:00:00 2001 From: Nahim EL ATMANI Date: Thu, 24 Jul 2025 21:41:35 -0700 Subject: [PATCH 05/44] Fix Ollama API URL normalization by removing trailing slashes (#6079) Co-authored-by: Nahim El Atmani <2959826+Naam@users.noreply.github.com> --- .../embedders/__tests__/ollama.spec.ts | 84 +++++++++++++++++++ src/services/code-index/embedders/ollama.ts | 7 +- 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/src/services/code-index/embedders/__tests__/ollama.spec.ts b/src/services/code-index/embedders/__tests__/ollama.spec.ts index ad95a18a3a..253158dd50 100644 --- a/src/services/code-index/embedders/__tests__/ollama.spec.ts +++ b/src/services/code-index/embedders/__tests__/ollama.spec.ts @@ -80,6 +80,90 @@ describe("CodeIndexOllamaEmbedder", () => { const embedderWithDefaults = new CodeIndexOllamaEmbedder({}) expect(embedderWithDefaults.embedderInfo.name).toBe("ollama") }) + + it("should normalize URLs with trailing slashes", async () => { + // Create embedder with URL that has a trailing slash + const embedderWithTrailingSlash = new CodeIndexOllamaEmbedder({ + ollamaBaseUrl: "http://localhost:11434/", + ollamaModelId: "nomic-embed-text", + }) + + // Mock successful /api/tags call to test the normalized URL + mockFetch.mockImplementationOnce(() => + Promise.resolve({ + ok: true, + status: 200, + json: () => Promise.resolve({ models: [{ name: "nomic-embed-text" }] }), + } as Response), + ) + + // Call a method that uses the baseUrl + await embedderWithTrailingSlash.validateConfiguration() + + // Verify the URL used in the fetch call doesn't have a trailing slash + expect(mockFetch).toHaveBeenCalledWith( + "http://localhost:11434/api/tags", + expect.objectContaining({ + method: "GET", + }), + ) + }) + + it("should not modify URLs without trailing slashes", async () => { + // Create embedder with URL that doesn't have a trailing slash + const embedderWithoutTrailingSlash = new CodeIndexOllamaEmbedder({ + ollamaBaseUrl: "http://localhost:11434", + ollamaModelId: "nomic-embed-text", + }) + + // Mock successful /api/tags call + mockFetch.mockImplementationOnce(() => + Promise.resolve({ + ok: true, + status: 200, + json: () => Promise.resolve({ models: [{ name: "nomic-embed-text" }] }), + } as Response), + ) + + // Call a method that uses the baseUrl + await embedderWithoutTrailingSlash.validateConfiguration() + + // Verify the URL used in the fetch call is correct + expect(mockFetch).toHaveBeenCalledWith( + "http://localhost:11434/api/tags", + expect.objectContaining({ + method: "GET", + }), + ) + }) + + it("should handle multiple trailing slashes", async () => { + // Create embedder with URL that has multiple trailing slashes + const embedderWithMultipleTrailingSlashes = new CodeIndexOllamaEmbedder({ + ollamaBaseUrl: "http://localhost:11434///", + ollamaModelId: "nomic-embed-text", + }) + + // Mock successful /api/tags call + mockFetch.mockImplementationOnce(() => + Promise.resolve({ + ok: true, + status: 200, + json: () => Promise.resolve({ models: [{ name: "nomic-embed-text" }] }), + } as Response), + ) + + // Call a method that uses the baseUrl + await embedderWithMultipleTrailingSlashes.validateConfiguration() + + // Verify the URL used in the fetch call doesn't have trailing slashes + expect(mockFetch).toHaveBeenCalledWith( + "http://localhost:11434/api/tags", + expect.objectContaining({ + method: "GET", + }), + ) + }) }) describe("validateConfiguration", () => { diff --git a/src/services/code-index/embedders/ollama.ts b/src/services/code-index/embedders/ollama.ts index c160d39490..9688a15ff0 100644 --- a/src/services/code-index/embedders/ollama.ts +++ b/src/services/code-index/embedders/ollama.ts @@ -20,7 +20,12 @@ export class CodeIndexOllamaEmbedder implements IEmbedder { constructor(options: ApiHandlerOptions) { // Ensure ollamaBaseUrl and ollamaModelId exist on ApiHandlerOptions or add defaults - this.baseUrl = options.ollamaBaseUrl || "http://localhost:11434" + let baseUrl = options.ollamaBaseUrl || "http://localhost:11434" + + // Normalize the baseUrl by removing all trailing slashes + baseUrl = baseUrl.replace(/\/+$/, "") + + this.baseUrl = baseUrl this.defaultModelId = options.ollamaModelId || "nomic-embed-text:latest" } From d62a2605765842eb96e17cc1dbeae8845c07f01b Mon Sep 17 00:00:00 2001 From: John Richmond <5629+jr@users.noreply.github.com> Date: Thu, 24 Jul 2025 22:04:49 -0700 Subject: [PATCH 06/44] Add support for bedrock api keys (#6132) Co-authored-by: Roo Code --- packages/types/src/global-settings.ts | 1 + packages/types/src/provider-settings.ts | 2 + packages/types/src/providers/bedrock.ts | 4 +- pnpm-lock.yaml | 1147 +++++++++-------- .../bedrock-inference-profiles.spec.ts | 2 +- .../__tests__/bedrock-reasoning.spec.ts | 46 + .../__tests__/bedrock-vpc-endpoint.spec.ts | 2 +- src/api/providers/bedrock.ts | 20 +- src/package.json | 4 +- .../components/settings/providers/Bedrock.tsx | 54 +- .../providers/__tests__/Bedrock.spec.tsx | 136 +- webview-ui/src/i18n/locales/ca/settings.json | 1 + webview-ui/src/i18n/locales/de/settings.json | 1 + webview-ui/src/i18n/locales/en/settings.json | 1 + webview-ui/src/i18n/locales/es/settings.json | 1 + webview-ui/src/i18n/locales/fr/settings.json | 1 + webview-ui/src/i18n/locales/hi/settings.json | 3 +- webview-ui/src/i18n/locales/id/settings.json | 1 + webview-ui/src/i18n/locales/it/settings.json | 1 + webview-ui/src/i18n/locales/ja/settings.json | 1 + webview-ui/src/i18n/locales/ko/settings.json | 1 + webview-ui/src/i18n/locales/nl/settings.json | 1 + webview-ui/src/i18n/locales/pl/settings.json | 1 + .../src/i18n/locales/pt-BR/settings.json | 1 + webview-ui/src/i18n/locales/ru/settings.json | 1 + webview-ui/src/i18n/locales/tr/settings.json | 1 + webview-ui/src/i18n/locales/vi/settings.json | 1 + .../src/i18n/locales/zh-CN/settings.json | 1 + .../src/i18n/locales/zh-TW/settings.json | 1 + 29 files changed, 858 insertions(+), 580 deletions(-) diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index a7732f8026..d5e76eccea 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -164,6 +164,7 @@ export const SECRET_STATE_KEYS = [ "glamaApiKey", "openRouterApiKey", "awsAccessKey", + "awsApiKey", "awsSecretKey", "awsSessionToken", "openAiApiKey", diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index ea7089a81e..682514b0fa 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -114,6 +114,8 @@ const bedrockSchema = apiModelIdProviderModelSchema.extend({ awsUsePromptCache: z.boolean().optional(), awsProfile: z.string().optional(), awsUseProfile: z.boolean().optional(), + awsApiKey: z.string().optional(), + awsUseApiKey: z.boolean().optional(), awsCustomArn: z.string().optional(), awsModelContextWindow: z.number().optional(), awsBedrockEndpointEnabled: z.boolean().optional(), diff --git a/packages/types/src/providers/bedrock.ts b/packages/types/src/providers/bedrock.ts index 58e860dd94..9c1f349334 100644 --- a/packages/types/src/providers/bedrock.ts +++ b/packages/types/src/providers/bedrock.ts @@ -360,7 +360,7 @@ export const BEDROCK_MAX_TOKENS = 4096 export const BEDROCK_DEFAULT_CONTEXT = 128_000 -// AWS Bedrock Inference Profile mapping based on official documentation +// Amazon Bedrock Inference Profile mapping based on official documentation // https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html // This mapping is pre-ordered by pattern length (descending) to ensure more specific patterns match first export const AWS_INFERENCE_PROFILE_MAPPING: Array<[string, string]> = [ @@ -378,7 +378,7 @@ export const AWS_INFERENCE_PROFILE_MAPPING: Array<[string, string]> = [ ["sa-", "sa."], ] -// AWS Bedrock supported regions for the regions dropdown +// Amazon Bedrock supported regions for the regions dropdown // Based on official AWS documentation export const BEDROCK_REGIONS = [ { value: "us-east-1", label: "us-east-1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b94b47a1e..14e33596d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -568,11 +568,11 @@ importers: specifier: ^0.7.0 version: 0.7.0 '@aws-sdk/client-bedrock-runtime': - specifier: ^3.779.0 - version: 3.817.0 + specifier: ^3.848.0 + version: 3.848.0 '@aws-sdk/credential-providers': - specifier: ^3.806.0 - version: 3.817.0 + specifier: ^3.848.0 + version: 3.848.0 '@google/genai': specifier: ^1.0.0 version: 1.3.0(@modelcontextprotocol/sdk@1.12.0) @@ -1188,111 +1188,123 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-bedrock-runtime@3.817.0': - resolution: {integrity: sha512-fG3QAjIEq7P0a134E2P8r4qw/V6rL0X5voUPIcXte1oNKUXUjNXJb21N/NGmcDLCUVWvYXb24dD0YXyQ2kwZdA==} + '@aws-sdk/client-bedrock-runtime@3.848.0': + resolution: {integrity: sha512-oWXy0eLanklzZLz6TQwcxxnwqYFjdDCHnKkdMWLOHSPgPJVZxqGfr1KD72XHwg9386+vxInZ0VYIggs0cut/Hw==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-cognito-identity@3.817.0': - resolution: {integrity: sha512-MNGwOJDQU0jpvsLLPSuPQDhPtDzFTc/k7rLmiKoPrIlgb3Y8pSF4crpJ+ZH3+xod2NWyyOVMEMQeMaKFFdMaKw==} + '@aws-sdk/client-cognito-identity@3.848.0': + resolution: {integrity: sha512-Sin8aLnA81MgvUJrfQsBIQ1UJg4klWT3NuYYjExLiVQf3A0/F7Bfx1HTIyWXtSchY4QgGr7MMone0/0KZ4Dy9g==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.817.0': - resolution: {integrity: sha512-fCh5rUHmWmWDvw70NNoWpE5+BRdtNi45kDnIoeoszqVg7UKF79SlG+qYooUT52HKCgDNHqgbWaXxMOSqd2I/OQ==} + '@aws-sdk/client-sso@3.848.0': + resolution: {integrity: sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.816.0': - resolution: {integrity: sha512-Lx50wjtyarzKpMFV6V+gjbSZDgsA/71iyifbClGUSiNPoIQ4OCV0KVOmAAj7mQRVvGJqUMWKVM+WzK79CjbjWA==} + '@aws-sdk/core@3.846.0': + resolution: {integrity: sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.817.0': - resolution: {integrity: sha512-+dzgWGmdmMNDdeSF+VvONN+hwqoGKX5A6Z3+siMO4CIoKWN7u5nDOx/JLjTGdVQji3522pJjJ+o9veQJNWOMRg==} + '@aws-sdk/credential-provider-cognito-identity@3.848.0': + resolution: {integrity: sha512-2cm/Ye6ktagW1h7FmF4sgo8STZyBr2+0+L9lr/veuPKZVWoi/FyhJR3l0TtKrd8z78no9P5xbsGUmxoDLtsxiw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.816.0': - resolution: {integrity: sha512-wUJZwRLe+SxPxRV9AENYBLrJZRrNIo+fva7ZzejsC83iz7hdfq6Rv6B/aHEdPwG/nQC4+q7UUvcRPlomyrpsBA==} + '@aws-sdk/credential-provider-env@3.846.0': + resolution: {integrity: sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.816.0': - resolution: {integrity: sha512-gcWGzMQ7yRIF+ljTkR8Vzp7727UY6cmeaPrFQrvcFB8PhOqWpf7g0JsgOf5BSaP8CkkSQcTQHc0C5ZYAzUFwPg==} + '@aws-sdk/credential-provider-http@3.846.0': + resolution: {integrity: sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.817.0': - resolution: {integrity: sha512-kyEwbQyuXE+phWVzloMdkFv6qM6NOon+asMXY5W0fhDKwBz9zQLObDRWBrvQX9lmqq8BbDL1sCfZjOh82Y+RFw==} + '@aws-sdk/credential-provider-ini@3.848.0': + resolution: {integrity: sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.817.0': - resolution: {integrity: sha512-b5mz7av0Lhavs1Bz3Zb+jrs0Pki93+8XNctnVO0drBW98x1fM4AR38cWvGbM/w9F9Q0/WEH3TinkmrMPrP4T/w==} + '@aws-sdk/credential-provider-node@3.848.0': + resolution: {integrity: sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.816.0': - resolution: {integrity: sha512-9Tm+AxMoV2Izvl5b9tyMQRbBwaex8JP06HN7ZeCXgC5sAsSN+o8dsThnEhf8jKN+uBpT6CLWKN1TXuUMrAmW1A==} + '@aws-sdk/credential-provider-process@3.846.0': + resolution: {integrity: sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.817.0': - resolution: {integrity: sha512-gFUAW3VmGvdnueK1bh6TOcRX+j99Xm0men1+gz3cA4RE+rZGNy1Qjj8YHlv0hPwI9OnTPZquvPzA5fkviGREWg==} + '@aws-sdk/credential-provider-sso@3.848.0': + resolution: {integrity: sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.817.0': - resolution: {integrity: sha512-A2kgkS9g6NY0OMT2f2EdXHpL17Ym81NhbGnQ8bRXPqESIi7TFypFD2U6osB2VnsFv+MhwM+Ke4PKXSmLun22/A==} + '@aws-sdk/credential-provider-web-identity@3.848.0': + resolution: {integrity: sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-providers@3.817.0': - resolution: {integrity: sha512-i6Q2MyktWHG4YG+EmLlnXTgNVjW9/yeNHSKzF55GTho5fjqfU+t9beJfuMWclanRCifamm3N5e5OCm52rVDdTQ==} + '@aws-sdk/credential-providers@3.848.0': + resolution: {integrity: sha512-lRDuU05YC+r/1JmRULngJQli7scP5hmq0/7D+xw1s8eRM0H2auaH7LQFlq/SLxQZLMkVNPCrmsug3b3KcLj1NA==} engines: {node: '>=18.0.0'} - '@aws-sdk/eventstream-handler-node@3.804.0': - resolution: {integrity: sha512-LZddQVBUCB86tZtLJRhqiDyIqr4hfRxZCcUp1fZSfpBMcf419lgcFRGWMR3J/kCWHQ0G05aor7fSeoeaxskuNQ==} + '@aws-sdk/eventstream-handler-node@3.840.0': + resolution: {integrity: sha512-m/zVrSSAEHq+6h4sy0JUEBScB1pGgs/1+iRVhfzfbnf+/gTr4ut2jRq4tDiNEX9pQ1oFVvw+ntPua5qfquQeRQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-eventstream@3.804.0': - resolution: {integrity: sha512-3lPxZshOJoKSxIMUq8FCiIre+FZ1g/t+O7DHwOMB6EuzJ8lp5QyUeh1wE5iD/gB8VhWZoj90rGIaWCmT8ccEuA==} + '@aws-sdk/middleware-eventstream@3.840.0': + resolution: {integrity: sha512-4khgf7AjJ4llh3aiNmZ+x4PGl4vkKNxRHn0xTgi6Iw1J3SChsF2mnNaLXK8hoXeydx756rw+JhqOuZH91i5l4w==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.804.0': - resolution: {integrity: sha512-bum1hLVBrn2lJCi423Z2fMUYtsbkGI2s4N+2RI2WSjvbaVyMSv/WcejIrjkqiiMR+2Y7m5exgoKeg4/TODLDPQ==} + '@aws-sdk/middleware-host-header@3.840.0': + resolution: {integrity: sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.804.0': - resolution: {integrity: sha512-w/qLwL3iq0KOPQNat0Kb7sKndl9BtceigINwBU7SpkYWX9L/Lem6f8NPEKrC9Tl4wDBht3Yztub4oRTy/horJA==} + '@aws-sdk/middleware-logger@3.840.0': + resolution: {integrity: sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.804.0': - resolution: {integrity: sha512-zqHOrvLRdsUdN/ehYfZ9Tf8svhbiLLz5VaWUz22YndFv6m9qaAcijkpAOlKexsv3nLBMJdSdJ6GUTAeIy3BZzw==} + '@aws-sdk/middleware-recursion-detection@3.840.0': + resolution: {integrity: sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.816.0': - resolution: {integrity: sha512-bHRSlWZ0xDsFR8E2FwDb//0Ff6wMkVx4O+UKsfyNlAbtqCiiHRt5ANNfKPafr95cN2CCxLxiPvFTFVblQM5TsQ==} + '@aws-sdk/middleware-user-agent@3.848.0': + resolution: {integrity: sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.817.0': - resolution: {integrity: sha512-vQ2E06A48STJFssueJQgxYD8lh1iGJoLJnHdshRDWOQb8gy1wVQR+a7MkPGhGR6lGoS0SCnF/Qp6CZhnwLsqsQ==} + '@aws-sdk/middleware-websocket@3.844.0': + resolution: {integrity: sha512-5ZtntUZ9ZMdUbQZ3kI5e5tpiZPN/O57h6fnGZ+GHB+wpSVSOQS78TBt0qYZW+CoZr8iyRsVkJheGETajFCMaUg==} + engines: {node: '>= 14.0.0'} + + '@aws-sdk/nested-clients@3.848.0': + resolution: {integrity: sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==} engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.808.0': - resolution: {integrity: sha512-9x2QWfphkARZY5OGkl9dJxZlSlYM2l5inFeo2bKntGuwg4A4YUe5h7d5yJ6sZbam9h43eBrkOdumx03DAkQF9A==} + '@aws-sdk/region-config-resolver@3.840.0': + resolution: {integrity: sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.817.0': - resolution: {integrity: sha512-CYN4/UO0VaqyHf46ogZzNrVX7jI3/CfiuktwKlwtpKA6hjf2+ivfgHSKzPpgPBcSEfiibA/26EeLuMnB6cpSrQ==} + '@aws-sdk/token-providers@3.848.0': + resolution: {integrity: sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.804.0': resolution: {integrity: sha512-A9qnsy9zQ8G89vrPPlNG9d1d8QcKRGqJKqwyGgS0dclJpwy6d1EWgQLIolKPl6vcFpLoe6avLOLxr+h8ur5wpg==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.808.0': - resolution: {integrity: sha512-N6Lic98uc4ADB7fLWlzx+1uVnq04VgVjngZvwHoujcRg9YDhIg9dUDiTzD5VZv13g1BrPYmvYP1HhsildpGV6w==} + '@aws-sdk/types@3.840.0': + resolution: {integrity: sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.848.0': + resolution: {integrity: sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-format-url@3.840.0': + resolution: {integrity: sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg==} engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.804.0': resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.804.0': - resolution: {integrity: sha512-KfW6T6nQHHM/vZBBdGn6fMyG/MgX5lq82TDdX4HRQRRuHKLgBWGpKXqqvBwqIaCdXwWHgDrg2VQups6GqOWW2A==} + '@aws-sdk/util-user-agent-browser@3.840.0': + resolution: {integrity: sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==} - '@aws-sdk/util-user-agent-node@3.816.0': - resolution: {integrity: sha512-Q6dxmuj4hL7pudhrneWEQ7yVHIQRBFr0wqKLF1opwOi1cIePuoEbPyJ2jkel6PDEv1YMfvsAKaRshp6eNA8VHg==} + '@aws-sdk/util-user-agent-node@3.848.0': + resolution: {integrity: sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1303,6 +1315,10 @@ packages: '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + '@aws-sdk/xml-builder@3.821.0': + resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} + engines: {node: '>=18.0.0'} + '@azure/abort-controller@2.1.2': resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} engines: {node: '>=18.0.0'} @@ -3103,66 +3119,66 @@ packages: resolution: {integrity: sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==} engines: {node: '>=14.0.0'} - '@smithy/abort-controller@4.0.3': - resolution: {integrity: sha512-AqXFf6DXnuRBXy4SoK/n1mfgHaKaq36bmkphmD1KO0nHq6xK/g9KHSW4HEsPQUBCGdIEfuJifGHwxFXPIFay9Q==} + '@smithy/abort-controller@4.0.4': + resolution: {integrity: sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.1.3': - resolution: {integrity: sha512-N5e7ofiyYDmHxnPnqF8L4KtsbSDwyxFRfDK9bp1d9OyPO4ytRLd0/XxCqi5xVaaqB65v4woW8uey6jND6zxzxQ==} + '@smithy/config-resolver@4.1.4': + resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.4.0': - resolution: {integrity: sha512-dDYISQo7k0Ml/rXlFIjkTmTcQze/LxhtIRAEmZ6HJ/EI0inVxVEVnrUXJ7jPx6ZP0GHUhFm40iQcCgS5apXIXA==} + '@smithy/core@3.7.1': + resolution: {integrity: sha512-ExRCsHnXFtBPnM7MkfKBPcBBdHw1h/QS/cbNw4ho95qnyNHvnpmGbR39MIAv9KggTr5qSPxRSEL+hRXlyGyGQw==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.0.5': - resolution: {integrity: sha512-saEAGwrIlkb9XxX/m5S5hOtzjoJPEK6Qw2f9pYTbIsMPOFyGSXBBTw95WbOyru8A1vIS2jVCCU1Qhz50QWG3IA==} + '@smithy/credential-provider-imds@4.0.6': + resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} engines: {node: '>=18.0.0'} '@smithy/eventstream-codec@2.2.0': resolution: {integrity: sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==} - '@smithy/eventstream-codec@4.0.3': - resolution: {integrity: sha512-V22KIPXZsE2mc4zEgYGANM/7UbL9jWlOACEolyGyMuTY+jjHJ2PQ0FdopOTS1CS7u6PlAkALmypkv2oQ4aftcg==} + '@smithy/eventstream-codec@4.0.4': + resolution: {integrity: sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.0.3': - resolution: {integrity: sha512-oe1d/tfCGVZBMX8O6HApaM4G+fF9JNdyLP7tWXt00epuL/kLOdp/4o9VqheLFeJaXgao+9IaBgs/q/oM48hxzg==} + '@smithy/eventstream-serde-browser@4.0.4': + resolution: {integrity: sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.1.1': - resolution: {integrity: sha512-XXCPGjRNwpFWHKQJMKIjGLfFKYULYckFnxGcWmBC2mBf3NsrvUKgqHax4NCqc0TfbDAimPDHOc6HOKtzsXK9Gw==} + '@smithy/eventstream-serde-config-resolver@4.1.2': + resolution: {integrity: sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==} engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-node@2.2.0': resolution: {integrity: sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==} engines: {node: '>=14.0.0'} - '@smithy/eventstream-serde-node@4.0.3': - resolution: {integrity: sha512-HOEbRmm9TrikCoFrypYu0J/gC4Lsk8gl5LtOz1G3laD2Jy44+ht2Pd2E9qjNQfhMJIzKDZ/gbuUH0s0v4kWQ0A==} + '@smithy/eventstream-serde-node@4.0.4': + resolution: {integrity: sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==} engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-universal@2.2.0': resolution: {integrity: sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==} engines: {node: '>=14.0.0'} - '@smithy/eventstream-serde-universal@4.0.3': - resolution: {integrity: sha512-ShOP512CZrYI9n+h64PJ84udzoNHUQtPddyh1j175KNTKsSnMEDNscOWJWyEoLQiuhWWw51lSa+k6ea9ZGXcRg==} + '@smithy/eventstream-serde-universal@4.0.4': + resolution: {integrity: sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==} engines: {node: '>=18.0.0'} '@smithy/fetch-http-handler@2.5.0': resolution: {integrity: sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==} - '@smithy/fetch-http-handler@5.0.3': - resolution: {integrity: sha512-yBZwavI31roqTndNI7ONHqesfH01JmjJK6L3uUpZAhyAmr86LN5QiPzfyZGIxQmed8VEK2NRSQT3/JX5V1njfQ==} + '@smithy/fetch-http-handler@5.1.0': + resolution: {integrity: sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.0.3': - resolution: {integrity: sha512-W5Uhy6v/aYrgtjh9y0YP332gIQcwccQ+EcfWhllL0B9rPae42JngTTUpb8W6wuxaNFzqps4xq5klHckSSOy5fw==} + '@smithy/hash-node@4.0.4': + resolution: {integrity: sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.0.3': - resolution: {integrity: sha512-1Bo8Ur1ZGqxvwTqBmv6DZEn0rXtwJGeqiiO2/JFcCtz3nBakOqeXbJBElXJMMzd0ghe8+eB6Dkw98nMYctgizg==} + '@smithy/invalid-dependency@4.0.4': + resolution: {integrity: sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': @@ -3177,112 +3193,112 @@ packages: resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.0.3': - resolution: {integrity: sha512-NE/Zph4BP5u16bzYq2csq9qD0T6UBLeg4AuNrwNJ7Gv9uLYaGEgelZUOdRndGdMGcUfSGvNlXGb2aA2hPCwJ6g==} + '@smithy/middleware-content-length@4.0.4': + resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} '@smithy/middleware-endpoint@2.5.1': resolution: {integrity: sha512-1/8kFp6Fl4OsSIVTWHnNjLnTL8IqpIb/D3sTSczrKFnrE9VMNWxnrRKNvpUHOJ6zpGD5f62TPm7+17ilTJpiCQ==} engines: {node: '>=14.0.0'} - '@smithy/middleware-endpoint@4.1.7': - resolution: {integrity: sha512-KDzM7Iajo6K7eIWNNtukykRT4eWwlHjCEsULZUaSfi/SRSBK8BPRqG5FsVfp58lUxcvre8GT8AIPIqndA0ERKw==} + '@smithy/middleware-endpoint@4.1.16': + resolution: {integrity: sha512-plpa50PIGLqzMR2ANKAw2yOW5YKS626KYKqae3atwucbz4Ve4uQ9K9BEZxDLIFmCu7hKLcrq2zmj4a+PfmUV5w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.8': - resolution: {integrity: sha512-e2OtQgFzzlSG0uCjcJmi02QuFSRTrpT11Eh2EcqqDFy7DYriteHZJkkf+4AsxsrGDugAtPFcWBz1aq06sSX5fQ==} + '@smithy/middleware-retry@4.1.17': + resolution: {integrity: sha512-gsCimeG6BApj0SBecwa1Be+Z+JOJe46iy3B3m3A8jKJHf7eIihP76Is4LwLrbJ1ygoS7Vg73lfqzejmLOrazUA==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@2.3.0': resolution: {integrity: sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==} engines: {node: '>=14.0.0'} - '@smithy/middleware-serde@4.0.6': - resolution: {integrity: sha512-YECyl7uNII+jCr/9qEmCu8xYL79cU0fqjo0qxpcVIU18dAPHam/iYwcknAu4Jiyw1uN+sAx7/SMf/Kmef/Jjsg==} + '@smithy/middleware-serde@4.0.8': + resolution: {integrity: sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==} engines: {node: '>=18.0.0'} '@smithy/middleware-stack@2.2.0': resolution: {integrity: sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==} engines: {node: '>=14.0.0'} - '@smithy/middleware-stack@4.0.3': - resolution: {integrity: sha512-baeV7t4jQfQtFxBADFmnhmqBmqR38dNU5cvEgHcMK/Kp3D3bEI0CouoX2Sr/rGuntR+Eg0IjXdxnGGTc6SbIkw==} + '@smithy/middleware-stack@4.0.4': + resolution: {integrity: sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==} engines: {node: '>=18.0.0'} '@smithy/node-config-provider@2.3.0': resolution: {integrity: sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==} engines: {node: '>=14.0.0'} - '@smithy/node-config-provider@4.1.2': - resolution: {integrity: sha512-SUvNup8iU1v7fmM8XPk+27m36udmGCfSz+VZP5Gb0aJ3Ne0X28K/25gnsrg3X1rWlhcnhzNUUysKW/Ied46ivQ==} + '@smithy/node-config-provider@4.1.3': + resolution: {integrity: sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==} engines: {node: '>=18.0.0'} '@smithy/node-http-handler@2.5.0': resolution: {integrity: sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==} engines: {node: '>=14.0.0'} - '@smithy/node-http-handler@4.0.5': - resolution: {integrity: sha512-T7QglZC1vS7SPT44/1qSIAQEx5bFKb3LfO6zw/o4Xzt1eC5HNoH1TkS4lMYA9cWFbacUhx4hRl/blLun4EOCkg==} + '@smithy/node-http-handler@4.1.0': + resolution: {integrity: sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==} engines: {node: '>=18.0.0'} '@smithy/property-provider@2.2.0': resolution: {integrity: sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==} engines: {node: '>=14.0.0'} - '@smithy/property-provider@4.0.3': - resolution: {integrity: sha512-Wcn17QNdawJZcZZPBuMuzyBENVi1AXl4TdE0jvzo4vWX2x5df/oMlmr/9M5XAAC6+yae4kWZlOYIsNsgDrMU9A==} + '@smithy/property-provider@4.0.4': + resolution: {integrity: sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==} engines: {node: '>=18.0.0'} '@smithy/protocol-http@3.3.0': resolution: {integrity: sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==} engines: {node: '>=14.0.0'} - '@smithy/protocol-http@5.1.1': - resolution: {integrity: sha512-Vsay2mzq05DwNi9jK01yCFtfvu9HimmgC7a4HTs7lhX12Sx8aWsH0mfz6q/02yspSp+lOB+Q2HJwi4IV2GKz7A==} + '@smithy/protocol-http@5.1.2': + resolution: {integrity: sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==} engines: {node: '>=18.0.0'} '@smithy/querystring-builder@2.2.0': resolution: {integrity: sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==} engines: {node: '>=14.0.0'} - '@smithy/querystring-builder@4.0.3': - resolution: {integrity: sha512-UUzIWMVfPmDZcOutk2/r1vURZqavvQW0OHvgsyNV0cKupChvqg+/NKPRMaMEe+i8tP96IthMFeZOZWpV+E4RAw==} + '@smithy/querystring-builder@4.0.4': + resolution: {integrity: sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==} engines: {node: '>=18.0.0'} '@smithy/querystring-parser@2.2.0': resolution: {integrity: sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==} engines: {node: '>=14.0.0'} - '@smithy/querystring-parser@4.0.3': - resolution: {integrity: sha512-K5M4ZJQpFCblOJ5Oyw7diICpFg1qhhR47m2/5Ef1PhGE19RaIZf50tjYFrxa6usqcuXyTiFPGo4d1geZdH4YcQ==} + '@smithy/querystring-parser@4.0.4': + resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.4': - resolution: {integrity: sha512-W5ScbQ1bTzgH91kNEE2CvOzM4gXlDOqdow4m8vMFSIXCel2scbHwjflpVNnC60Y3F1m5i7w2gQg9lSnR+JsJAA==} + '@smithy/service-error-classification@4.0.6': + resolution: {integrity: sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==} engines: {node: '>=18.0.0'} '@smithy/shared-ini-file-loader@2.4.0': resolution: {integrity: sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==} engines: {node: '>=14.0.0'} - '@smithy/shared-ini-file-loader@4.0.3': - resolution: {integrity: sha512-vHwlrqhZGIoLwaH8vvIjpHnloShqdJ7SUPNM2EQtEox+yEDFTVQ7E+DLZ+6OhnYEgFUwPByJyz6UZaOu2tny6A==} + '@smithy/shared-ini-file-loader@4.0.4': + resolution: {integrity: sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==} engines: {node: '>=18.0.0'} '@smithy/signature-v4@3.1.2': resolution: {integrity: sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==} engines: {node: '>=16.0.0'} - '@smithy/signature-v4@5.1.1': - resolution: {integrity: sha512-zy8Repr5zvT0ja+Tf5wjV/Ba6vRrhdiDcp/ww6cvqYbSEudIkziDe3uppNRlFoCViyJXdPnLcwyZdDLA4CHzSg==} + '@smithy/signature-v4@5.1.2': + resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} '@smithy/smithy-client@2.5.1': resolution: {integrity: sha512-jrbSQrYCho0yDaaf92qWgd+7nAeap5LtHTI51KXqmpIFCceKU3K9+vIVTUH72bOJngBMqa4kyu1VJhRcSrk/CQ==} engines: {node: '>=14.0.0'} - '@smithy/smithy-client@4.3.0': - resolution: {integrity: sha512-DNsRA38pN6tYHUjebmwD9e4KcgqTLldYQb2gC6K+oxXYdCTxPn6wV9+FvOa6wrU2FQEnGJoi+3GULzOTKck/tg==} + '@smithy/smithy-client@4.4.8': + resolution: {integrity: sha512-pcW691/lx7V54gE+dDGC26nxz8nrvnvRSCJaIYD6XLPpOInEZeKdV/SpSux+wqeQ4Ine7LJQu8uxMvobTIBK0w==} engines: {node: '>=18.0.0'} '@smithy/types@2.12.0': @@ -3293,15 +3309,15 @@ packages: resolution: {integrity: sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==} engines: {node: '>=16.0.0'} - '@smithy/types@4.3.0': - resolution: {integrity: sha512-+1iaIQHthDh9yaLhRzaoQxRk+l9xlk+JjMFxGRhNLz+m9vKOkjNeU8QuB4w3xvzHyVR/BVlp/4AXDHjoRIkfgQ==} + '@smithy/types@4.3.1': + resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} engines: {node: '>=18.0.0'} '@smithy/url-parser@2.2.0': resolution: {integrity: sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==} - '@smithy/url-parser@4.0.3': - resolution: {integrity: sha512-n5/DnosDu/tweOqUUNtUbu7eRIR4J/Wz9nL7V5kFYQQVb8VYdj7a4G5NJHCw6o21ul7CvZoJkOpdTnsQDLT0tQ==} + '@smithy/url-parser@4.0.4': + resolution: {integrity: sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==} engines: {node: '>=18.0.0'} '@smithy/util-base64@2.3.0': @@ -3336,16 +3352,16 @@ packages: resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.15': - resolution: {integrity: sha512-bJJ/B8owQbHAflatSq92f9OcV8858DJBQF1Y3GRjB8psLyUjbISywszYPFw16beREHO/C3I3taW4VGH+tOuwrQ==} + '@smithy/util-defaults-mode-browser@4.0.24': + resolution: {integrity: sha512-UkQNgaQ+bidw1MgdgPO1z1k95W/v8Ej/5o/T/Is8PiVUYPspl/ZxV6WO/8DrzZQu5ULnmpB9CDdMSRwgRc21AA==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.15': - resolution: {integrity: sha512-8CUrEW2Ni5q+NmYkj8wsgkfqoP7l4ZquptFbq92yQE66xevc4SxqP2zH6tMtN158kgBqBDsZ+qlrRwXWOjCR8A==} + '@smithy/util-defaults-mode-node@4.0.24': + resolution: {integrity: sha512-phvGi/15Z4MpuQibTLOYIumvLdXb+XIJu8TA55voGgboln85jytA3wiD7CkUE8SNcWqkkb+uptZKPiuFouX/7g==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.0.5': - resolution: {integrity: sha512-PjDpqLk24/vAl340tmtCA++Q01GRRNH9cwL9qh46NspAX9S+IQVcK+GOzPt0GLJ6KYGyn8uOgo2kvJhiThclJw==} + '@smithy/util-endpoints@3.0.6': + resolution: {integrity: sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==} engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@2.2.0': @@ -3368,20 +3384,20 @@ packages: resolution: {integrity: sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==} engines: {node: '>=16.0.0'} - '@smithy/util-middleware@4.0.3': - resolution: {integrity: sha512-iIsC6qZXxkD7V3BzTw3b1uK8RVC1M8WvwNxK1PKrH9FnxntCd30CSunXjL/8iJBE8Z0J14r2P69njwIpRG4FBQ==} + '@smithy/util-middleware@4.0.4': + resolution: {integrity: sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.4': - resolution: {integrity: sha512-Aoqr9W2jDYGrI6OxljN8VmLDQIGO4VdMAUKMf9RGqLG8hn6or+K41NEy1Y5dtum9q8F7e0obYAuKl2mt/GnpZg==} + '@smithy/util-retry@4.0.6': + resolution: {integrity: sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==} engines: {node: '>=18.0.0'} '@smithy/util-stream@2.2.0': resolution: {integrity: sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==} engines: {node: '>=14.0.0'} - '@smithy/util-stream@4.2.1': - resolution: {integrity: sha512-W3IR0x5DY6iVtjj5p902oNhD+Bz7vs5S+p6tppbPa509rV9BdeXZjGuRSCtVEad9FA0Mba+tNUtUmtnSI1nwUw==} + '@smithy/util-stream@4.2.3': + resolution: {integrity: sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@2.2.0': @@ -5674,14 +5690,14 @@ packages: fast-shallow-equal@1.0.0: resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} - fast-xml-parser@4.4.1: - resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} - hasBin: true - fast-xml-parser@5.2.3: resolution: {integrity: sha512-OdCYfRqfpuLUFonTNjvd30rCBZUneHpSQkCqfaeWQ9qrKcl6XlWeDBNVwGb+INAIxRshuN2jF+BE0L6gbBO2mw==} hasBin: true + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -8767,9 +8783,6 @@ packages: strip-literal@3.0.0: resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - strnum@2.1.1: resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} @@ -9753,8 +9766,8 @@ snapshots: dependencies: '@anthropic-ai/sdk': 0.37.0 '@aws-crypto/sha256-js': 4.0.0 - '@aws-sdk/client-bedrock-runtime': 3.817.0 - '@aws-sdk/credential-providers': 3.817.0 + '@aws-sdk/client-bedrock-runtime': 3.848.0 + '@aws-sdk/credential-providers': 3.848.0 '@smithy/eventstream-serde-node': 2.2.0 '@smithy/fetch-http-handler': 2.5.0 '@smithy/protocol-http': 3.3.0 @@ -9797,13 +9810,13 @@ snapshots: '@aws-crypto/crc32@3.0.0': dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.0 tslib: 1.14.1 '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.0 tslib: 2.8.1 '@aws-crypto/sha256-browser@5.2.0': @@ -9811,7 +9824,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.0 '@aws-sdk/util-locate-window': 3.804.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -9825,7 +9838,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -9834,67 +9847,69 @@ snapshots: '@aws-crypto/util@3.0.0': dependencies: - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@4.0.0': dependencies: - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.804.0 + '@aws-sdk/types': 3.840.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-bedrock-runtime@3.817.0': + '@aws-sdk/client-bedrock-runtime@3.848.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.816.0 - '@aws-sdk/credential-provider-node': 3.817.0 - '@aws-sdk/eventstream-handler-node': 3.804.0 - '@aws-sdk/middleware-eventstream': 3.804.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.816.0 - '@aws-sdk/region-config-resolver': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.808.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.816.0 - '@smithy/config-resolver': 4.1.3 - '@smithy/core': 3.4.0 - '@smithy/eventstream-serde-browser': 4.0.3 - '@smithy/eventstream-serde-config-resolver': 4.1.1 - '@smithy/eventstream-serde-node': 4.0.3 - '@smithy/fetch-http-handler': 5.0.3 - '@smithy/hash-node': 4.0.3 - '@smithy/invalid-dependency': 4.0.3 - '@smithy/middleware-content-length': 4.0.3 - '@smithy/middleware-endpoint': 4.1.7 - '@smithy/middleware-retry': 4.1.8 - '@smithy/middleware-serde': 4.0.6 - '@smithy/middleware-stack': 4.0.3 - '@smithy/node-config-provider': 4.1.2 - '@smithy/node-http-handler': 4.0.5 - '@smithy/protocol-http': 5.1.1 - '@smithy/smithy-client': 4.3.0 - '@smithy/types': 4.3.0 - '@smithy/url-parser': 4.0.3 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/credential-provider-node': 3.848.0 + '@aws-sdk/eventstream-handler-node': 3.840.0 + '@aws-sdk/middleware-eventstream': 3.840.0 + '@aws-sdk/middleware-host-header': 3.840.0 + '@aws-sdk/middleware-logger': 3.840.0 + '@aws-sdk/middleware-recursion-detection': 3.840.0 + '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/middleware-websocket': 3.844.0 + '@aws-sdk/region-config-resolver': 3.840.0 + '@aws-sdk/token-providers': 3.848.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.848.0 + '@aws-sdk/util-user-agent-browser': 3.840.0 + '@aws-sdk/util-user-agent-node': 3.848.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.7.1 + '@smithy/eventstream-serde-browser': 4.0.4 + '@smithy/eventstream-serde-config-resolver': 4.1.2 + '@smithy/eventstream-serde-node': 4.0.4 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.16 + '@smithy/middleware-retry': 4.1.17 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.1.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.8 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.15 - '@smithy/util-defaults-mode-node': 4.0.15 - '@smithy/util-endpoints': 3.0.5 - '@smithy/util-middleware': 4.0.3 - '@smithy/util-retry': 4.0.4 - '@smithy/util-stream': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.0.24 + '@smithy/util-defaults-mode-node': 4.0.24 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 + '@smithy/util-stream': 4.2.3 '@smithy/util-utf8': 4.0.0 '@types/uuid': 9.0.8 tslib: 2.8.1 @@ -9902,373 +9917,408 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-cognito-identity@3.817.0': + '@aws-sdk/client-cognito-identity@3.848.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.816.0 - '@aws-sdk/credential-provider-node': 3.817.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.816.0 - '@aws-sdk/region-config-resolver': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.808.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.816.0 - '@smithy/config-resolver': 4.1.3 - '@smithy/core': 3.4.0 - '@smithy/fetch-http-handler': 5.0.3 - '@smithy/hash-node': 4.0.3 - '@smithy/invalid-dependency': 4.0.3 - '@smithy/middleware-content-length': 4.0.3 - '@smithy/middleware-endpoint': 4.1.7 - '@smithy/middleware-retry': 4.1.8 - '@smithy/middleware-serde': 4.0.6 - '@smithy/middleware-stack': 4.0.3 - '@smithy/node-config-provider': 4.1.2 - '@smithy/node-http-handler': 4.0.5 - '@smithy/protocol-http': 5.1.1 - '@smithy/smithy-client': 4.3.0 - '@smithy/types': 4.3.0 - '@smithy/url-parser': 4.0.3 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/credential-provider-node': 3.848.0 + '@aws-sdk/middleware-host-header': 3.840.0 + '@aws-sdk/middleware-logger': 3.840.0 + '@aws-sdk/middleware-recursion-detection': 3.840.0 + '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/region-config-resolver': 3.840.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.848.0 + '@aws-sdk/util-user-agent-browser': 3.840.0 + '@aws-sdk/util-user-agent-node': 3.848.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.7.1 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.16 + '@smithy/middleware-retry': 4.1.17 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.1.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.8 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.15 - '@smithy/util-defaults-mode-node': 4.0.15 - '@smithy/util-endpoints': 3.0.5 - '@smithy/util-middleware': 4.0.3 - '@smithy/util-retry': 4.0.4 + '@smithy/util-defaults-mode-browser': 4.0.24 + '@smithy/util-defaults-mode-node': 4.0.24 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.817.0': + '@aws-sdk/client-sso@3.848.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.816.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.816.0 - '@aws-sdk/region-config-resolver': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.808.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.816.0 - '@smithy/config-resolver': 4.1.3 - '@smithy/core': 3.4.0 - '@smithy/fetch-http-handler': 5.0.3 - '@smithy/hash-node': 4.0.3 - '@smithy/invalid-dependency': 4.0.3 - '@smithy/middleware-content-length': 4.0.3 - '@smithy/middleware-endpoint': 4.1.7 - '@smithy/middleware-retry': 4.1.8 - '@smithy/middleware-serde': 4.0.6 - '@smithy/middleware-stack': 4.0.3 - '@smithy/node-config-provider': 4.1.2 - '@smithy/node-http-handler': 4.0.5 - '@smithy/protocol-http': 5.1.1 - '@smithy/smithy-client': 4.3.0 - '@smithy/types': 4.3.0 - '@smithy/url-parser': 4.0.3 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/middleware-host-header': 3.840.0 + '@aws-sdk/middleware-logger': 3.840.0 + '@aws-sdk/middleware-recursion-detection': 3.840.0 + '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/region-config-resolver': 3.840.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.848.0 + '@aws-sdk/util-user-agent-browser': 3.840.0 + '@aws-sdk/util-user-agent-node': 3.848.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.7.1 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.16 + '@smithy/middleware-retry': 4.1.17 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.1.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.8 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.15 - '@smithy/util-defaults-mode-node': 4.0.15 - '@smithy/util-endpoints': 3.0.5 - '@smithy/util-middleware': 4.0.3 - '@smithy/util-retry': 4.0.4 + '@smithy/util-defaults-mode-browser': 4.0.24 + '@smithy/util-defaults-mode-node': 4.0.24 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.816.0': + '@aws-sdk/core@3.846.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/core': 3.4.0 - '@smithy/node-config-provider': 4.1.2 - '@smithy/property-provider': 4.0.3 - '@smithy/protocol-http': 5.1.1 - '@smithy/signature-v4': 5.1.1 - '@smithy/smithy-client': 4.3.0 - '@smithy/types': 4.3.0 - '@smithy/util-middleware': 4.0.3 - fast-xml-parser: 4.4.1 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/xml-builder': 3.821.0 + '@smithy/core': 3.7.1 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/smithy-client': 4.4.8 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-utf8': 4.0.0 + fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-cognito-identity@3.817.0': + '@aws-sdk/credential-provider-cognito-identity@3.848.0': dependencies: - '@aws-sdk/client-cognito-identity': 3.817.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/client-cognito-identity': 3.848.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-env@3.816.0': + '@aws-sdk/credential-provider-env@3.846.0': dependencies: - '@aws-sdk/core': 3.816.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.816.0': + '@aws-sdk/credential-provider-http@3.846.0': dependencies: - '@aws-sdk/core': 3.816.0 - '@aws-sdk/types': 3.804.0 - '@smithy/fetch-http-handler': 5.0.3 - '@smithy/node-http-handler': 4.0.5 - '@smithy/property-provider': 4.0.3 - '@smithy/protocol-http': 5.1.1 - '@smithy/smithy-client': 4.3.0 - '@smithy/types': 4.3.0 - '@smithy/util-stream': 4.2.1 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/types': 3.840.0 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/node-http-handler': 4.1.0 + '@smithy/property-provider': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.8 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.817.0': + '@aws-sdk/credential-provider-ini@3.848.0': dependencies: - '@aws-sdk/core': 3.816.0 - '@aws-sdk/credential-provider-env': 3.816.0 - '@aws-sdk/credential-provider-http': 3.816.0 - '@aws-sdk/credential-provider-process': 3.816.0 - '@aws-sdk/credential-provider-sso': 3.817.0 - '@aws-sdk/credential-provider-web-identity': 3.817.0 - '@aws-sdk/nested-clients': 3.817.0 - '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.0.5 - '@smithy/property-provider': 4.0.3 - '@smithy/shared-ini-file-loader': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/credential-provider-env': 3.846.0 + '@aws-sdk/credential-provider-http': 3.846.0 + '@aws-sdk/credential-provider-process': 3.846.0 + '@aws-sdk/credential-provider-sso': 3.848.0 + '@aws-sdk/credential-provider-web-identity': 3.848.0 + '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/types': 3.840.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.817.0': + '@aws-sdk/credential-provider-node@3.848.0': dependencies: - '@aws-sdk/credential-provider-env': 3.816.0 - '@aws-sdk/credential-provider-http': 3.816.0 - '@aws-sdk/credential-provider-ini': 3.817.0 - '@aws-sdk/credential-provider-process': 3.816.0 - '@aws-sdk/credential-provider-sso': 3.817.0 - '@aws-sdk/credential-provider-web-identity': 3.817.0 - '@aws-sdk/types': 3.804.0 - '@smithy/credential-provider-imds': 4.0.5 - '@smithy/property-provider': 4.0.3 - '@smithy/shared-ini-file-loader': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/credential-provider-env': 3.846.0 + '@aws-sdk/credential-provider-http': 3.846.0 + '@aws-sdk/credential-provider-ini': 3.848.0 + '@aws-sdk/credential-provider-process': 3.846.0 + '@aws-sdk/credential-provider-sso': 3.848.0 + '@aws-sdk/credential-provider-web-identity': 3.848.0 + '@aws-sdk/types': 3.840.0 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.816.0': + '@aws-sdk/credential-provider-process@3.846.0': dependencies: - '@aws-sdk/core': 3.816.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.3 - '@smithy/shared-ini-file-loader': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.817.0': + '@aws-sdk/credential-provider-sso@3.848.0': dependencies: - '@aws-sdk/client-sso': 3.817.0 - '@aws-sdk/core': 3.816.0 - '@aws-sdk/token-providers': 3.817.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.3 - '@smithy/shared-ini-file-loader': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/client-sso': 3.848.0 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/token-providers': 3.848.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.817.0': + '@aws-sdk/credential-provider-web-identity@3.848.0': dependencies: - '@aws-sdk/core': 3.816.0 - '@aws-sdk/nested-clients': 3.817.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-providers@3.817.0': + '@aws-sdk/credential-providers@3.848.0': dependencies: - '@aws-sdk/client-cognito-identity': 3.817.0 - '@aws-sdk/core': 3.816.0 - '@aws-sdk/credential-provider-cognito-identity': 3.817.0 - '@aws-sdk/credential-provider-env': 3.816.0 - '@aws-sdk/credential-provider-http': 3.816.0 - '@aws-sdk/credential-provider-ini': 3.817.0 - '@aws-sdk/credential-provider-node': 3.817.0 - '@aws-sdk/credential-provider-process': 3.816.0 - '@aws-sdk/credential-provider-sso': 3.817.0 - '@aws-sdk/credential-provider-web-identity': 3.817.0 - '@aws-sdk/nested-clients': 3.817.0 - '@aws-sdk/types': 3.804.0 - '@smithy/config-resolver': 4.1.3 - '@smithy/core': 3.4.0 - '@smithy/credential-provider-imds': 4.0.5 - '@smithy/node-config-provider': 4.1.2 - '@smithy/property-provider': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/client-cognito-identity': 3.848.0 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/credential-provider-cognito-identity': 3.848.0 + '@aws-sdk/credential-provider-env': 3.846.0 + '@aws-sdk/credential-provider-http': 3.846.0 + '@aws-sdk/credential-provider-ini': 3.848.0 + '@aws-sdk/credential-provider-node': 3.848.0 + '@aws-sdk/credential-provider-process': 3.846.0 + '@aws-sdk/credential-provider-sso': 3.848.0 + '@aws-sdk/credential-provider-web-identity': 3.848.0 + '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/types': 3.840.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.7.1 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/eventstream-handler-node@3.804.0': + '@aws-sdk/eventstream-handler-node@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/eventstream-codec': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/types': 3.840.0 + '@smithy/eventstream-codec': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-eventstream@3.804.0': + '@aws-sdk/middleware-eventstream@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.1 - '@smithy/types': 4.3.0 + '@aws-sdk/types': 3.840.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.804.0': + '@aws-sdk/middleware-host-header@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.1 - '@smithy/types': 4.3.0 + '@aws-sdk/types': 3.840.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.804.0': + '@aws-sdk/middleware-logger@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.3.0 + '@aws-sdk/types': 3.840.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.804.0': + '@aws-sdk/middleware-recursion-detection@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/protocol-http': 5.1.1 - '@smithy/types': 4.3.0 + '@aws-sdk/types': 3.840.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.816.0': + '@aws-sdk/middleware-user-agent@3.848.0': dependencies: - '@aws-sdk/core': 3.816.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.808.0 - '@smithy/core': 3.4.0 - '@smithy/protocol-http': 5.1.1 - '@smithy/types': 4.3.0 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.848.0 + '@smithy/core': 3.7.1 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.817.0': + '@aws-sdk/middleware-websocket@3.844.0': + dependencies: + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-format-url': 3.840.0 + '@smithy/eventstream-codec': 4.0.4 + '@smithy/eventstream-serde-browser': 4.0.4 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/signature-v4': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-hex-encoding': 4.0.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.848.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.816.0 - '@aws-sdk/middleware-host-header': 3.804.0 - '@aws-sdk/middleware-logger': 3.804.0 - '@aws-sdk/middleware-recursion-detection': 3.804.0 - '@aws-sdk/middleware-user-agent': 3.816.0 - '@aws-sdk/region-config-resolver': 3.808.0 - '@aws-sdk/types': 3.804.0 - '@aws-sdk/util-endpoints': 3.808.0 - '@aws-sdk/util-user-agent-browser': 3.804.0 - '@aws-sdk/util-user-agent-node': 3.816.0 - '@smithy/config-resolver': 4.1.3 - '@smithy/core': 3.4.0 - '@smithy/fetch-http-handler': 5.0.3 - '@smithy/hash-node': 4.0.3 - '@smithy/invalid-dependency': 4.0.3 - '@smithy/middleware-content-length': 4.0.3 - '@smithy/middleware-endpoint': 4.1.7 - '@smithy/middleware-retry': 4.1.8 - '@smithy/middleware-serde': 4.0.6 - '@smithy/middleware-stack': 4.0.3 - '@smithy/node-config-provider': 4.1.2 - '@smithy/node-http-handler': 4.0.5 - '@smithy/protocol-http': 5.1.1 - '@smithy/smithy-client': 4.3.0 - '@smithy/types': 4.3.0 - '@smithy/url-parser': 4.0.3 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/middleware-host-header': 3.840.0 + '@aws-sdk/middleware-logger': 3.840.0 + '@aws-sdk/middleware-recursion-detection': 3.840.0 + '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/region-config-resolver': 3.840.0 + '@aws-sdk/types': 3.840.0 + '@aws-sdk/util-endpoints': 3.848.0 + '@aws-sdk/util-user-agent-browser': 3.840.0 + '@aws-sdk/util-user-agent-node': 3.848.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/core': 3.7.1 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/hash-node': 4.0.4 + '@smithy/invalid-dependency': 4.0.4 + '@smithy/middleware-content-length': 4.0.4 + '@smithy/middleware-endpoint': 4.1.16 + '@smithy/middleware-retry': 4.1.17 + '@smithy/middleware-serde': 4.0.8 + '@smithy/middleware-stack': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/node-http-handler': 4.1.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/smithy-client': 4.4.8 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.15 - '@smithy/util-defaults-mode-node': 4.0.15 - '@smithy/util-endpoints': 3.0.5 - '@smithy/util-middleware': 4.0.3 - '@smithy/util-retry': 4.0.4 + '@smithy/util-defaults-mode-browser': 4.0.24 + '@smithy/util-defaults-mode-node': 4.0.24 + '@smithy/util-endpoints': 3.0.6 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.808.0': + '@aws-sdk/region-config-resolver@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.1.2 - '@smithy/types': 4.3.0 + '@aws-sdk/types': 3.840.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.3 + '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@aws-sdk/token-providers@3.817.0': + '@aws-sdk/token-providers@3.848.0': dependencies: - '@aws-sdk/core': 3.816.0 - '@aws-sdk/nested-clients': 3.817.0 - '@aws-sdk/types': 3.804.0 - '@smithy/property-provider': 4.0.3 - '@smithy/shared-ini-file-loader': 4.0.3 - '@smithy/types': 4.3.0 + '@aws-sdk/core': 3.846.0 + '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/types': 3.840.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt '@aws-sdk/types@3.804.0': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.808.0': + '@aws-sdk/types@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.3.0 - '@smithy/util-endpoints': 3.0.5 + '@smithy/types': 4.3.1 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.848.0': + dependencies: + '@aws-sdk/types': 3.840.0 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-endpoints': 3.0.6 + tslib: 2.8.1 + + '@aws-sdk/util-format-url@3.840.0': + dependencies: + '@aws-sdk/types': 3.840.0 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@aws-sdk/util-locate-window@3.804.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.804.0': + '@aws-sdk/util-user-agent-browser@3.840.0': dependencies: - '@aws-sdk/types': 3.804.0 - '@smithy/types': 4.3.0 + '@aws-sdk/types': 3.840.0 + '@smithy/types': 4.3.1 bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.816.0': + '@aws-sdk/util-user-agent-node@3.848.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.816.0 - '@aws-sdk/types': 3.804.0 - '@smithy/node-config-provider': 4.1.2 - '@smithy/types': 4.3.0 + '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/types': 3.840.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.8.1 + '@aws-sdk/xml-builder@3.821.0': + dependencies: + '@smithy/types': 4.3.1 + tslib: 2.8.1 + '@azure/abort-controller@2.1.2': dependencies: tslib: 2.8.1 @@ -12133,36 +12183,37 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/abort-controller@4.0.3': + '@smithy/abort-controller@4.0.4': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/config-resolver@4.1.3': + '@smithy/config-resolver@4.1.4': dependencies: - '@smithy/node-config-provider': 4.1.2 - '@smithy/types': 4.3.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.3 + '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/core@3.4.0': + '@smithy/core@3.7.1': dependencies: - '@smithy/middleware-serde': 4.0.6 - '@smithy/protocol-http': 5.1.1 - '@smithy/types': 4.3.0 + '@smithy/middleware-serde': 4.0.8 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.3 - '@smithy/util-stream': 4.2.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-stream': 4.2.3 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.0.5': + '@smithy/credential-provider-imds@4.0.6': dependencies: - '@smithy/node-config-provider': 4.1.2 - '@smithy/property-provider': 4.0.3 - '@smithy/types': 4.3.0 - '@smithy/url-parser': 4.0.3 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 tslib: 2.8.1 '@smithy/eventstream-codec@2.2.0': @@ -12172,22 +12223,22 @@ snapshots: '@smithy/util-hex-encoding': 2.2.0 tslib: 2.8.1 - '@smithy/eventstream-codec@4.0.3': + '@smithy/eventstream-codec@4.0.4': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 '@smithy/util-hex-encoding': 4.0.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.0.3': + '@smithy/eventstream-serde-browser@4.0.4': dependencies: - '@smithy/eventstream-serde-universal': 4.0.3 - '@smithy/types': 4.3.0 + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.1.1': + '@smithy/eventstream-serde-config-resolver@4.1.2': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/eventstream-serde-node@2.2.0': @@ -12196,10 +12247,10 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.0.3': + '@smithy/eventstream-serde-node@4.0.4': dependencies: - '@smithy/eventstream-serde-universal': 4.0.3 - '@smithy/types': 4.3.0 + '@smithy/eventstream-serde-universal': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/eventstream-serde-universal@2.2.0': @@ -12208,10 +12259,10 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.0.3': + '@smithy/eventstream-serde-universal@4.0.4': dependencies: - '@smithy/eventstream-codec': 4.0.3 - '@smithy/types': 4.3.0 + '@smithy/eventstream-codec': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/fetch-http-handler@2.5.0': @@ -12222,24 +12273,24 @@ snapshots: '@smithy/util-base64': 2.3.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.0.3': + '@smithy/fetch-http-handler@5.1.0': dependencies: - '@smithy/protocol-http': 5.1.1 - '@smithy/querystring-builder': 4.0.3 - '@smithy/types': 4.3.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 '@smithy/util-base64': 4.0.0 tslib: 2.8.1 - '@smithy/hash-node@4.0.3': + '@smithy/hash-node@4.0.4': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 '@smithy/util-buffer-from': 4.0.0 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.0.3': + '@smithy/invalid-dependency@4.0.4': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': @@ -12254,10 +12305,10 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/middleware-content-length@4.0.3': + '@smithy/middleware-content-length@4.0.4': dependencies: - '@smithy/protocol-http': 5.1.1 - '@smithy/types': 4.3.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/middleware-endpoint@2.5.1': @@ -12270,26 +12321,26 @@ snapshots: '@smithy/util-middleware': 2.2.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.7': + '@smithy/middleware-endpoint@4.1.16': dependencies: - '@smithy/core': 3.4.0 - '@smithy/middleware-serde': 4.0.6 - '@smithy/node-config-provider': 4.1.2 - '@smithy/shared-ini-file-loader': 4.0.3 - '@smithy/types': 4.3.0 - '@smithy/url-parser': 4.0.3 - '@smithy/util-middleware': 4.0.3 + '@smithy/core': 3.7.1 + '@smithy/middleware-serde': 4.0.8 + '@smithy/node-config-provider': 4.1.3 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 + '@smithy/url-parser': 4.0.4 + '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.8': + '@smithy/middleware-retry@4.1.17': dependencies: - '@smithy/node-config-provider': 4.1.2 - '@smithy/protocol-http': 5.1.1 - '@smithy/service-error-classification': 4.0.4 - '@smithy/smithy-client': 4.3.0 - '@smithy/types': 4.3.0 - '@smithy/util-middleware': 4.0.3 - '@smithy/util-retry': 4.0.4 + '@smithy/node-config-provider': 4.1.3 + '@smithy/protocol-http': 5.1.2 + '@smithy/service-error-classification': 4.0.6 + '@smithy/smithy-client': 4.4.8 + '@smithy/types': 4.3.1 + '@smithy/util-middleware': 4.0.4 + '@smithy/util-retry': 4.0.6 tslib: 2.8.1 uuid: 9.0.1 @@ -12298,10 +12349,10 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/middleware-serde@4.0.6': + '@smithy/middleware-serde@4.0.8': dependencies: - '@smithy/protocol-http': 5.1.1 - '@smithy/types': 4.3.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/middleware-stack@2.2.0': @@ -12309,9 +12360,9 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.0.3': + '@smithy/middleware-stack@4.0.4': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/node-config-provider@2.3.0': @@ -12321,11 +12372,11 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.1.2': + '@smithy/node-config-provider@4.1.3': dependencies: - '@smithy/property-provider': 4.0.3 - '@smithy/shared-ini-file-loader': 4.0.3 - '@smithy/types': 4.3.0 + '@smithy/property-provider': 4.0.4 + '@smithy/shared-ini-file-loader': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/node-http-handler@2.5.0': @@ -12336,12 +12387,12 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.0.5': + '@smithy/node-http-handler@4.1.0': dependencies: - '@smithy/abort-controller': 4.0.3 - '@smithy/protocol-http': 5.1.1 - '@smithy/querystring-builder': 4.0.3 - '@smithy/types': 4.3.0 + '@smithy/abort-controller': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/querystring-builder': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/property-provider@2.2.0': @@ -12349,9 +12400,9 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/property-provider@4.0.3': + '@smithy/property-provider@4.0.4': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/protocol-http@3.3.0': @@ -12359,9 +12410,9 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/protocol-http@5.1.1': + '@smithy/protocol-http@5.1.2': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/querystring-builder@2.2.0': @@ -12370,9 +12421,9 @@ snapshots: '@smithy/util-uri-escape': 2.2.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.0.3': + '@smithy/querystring-builder@4.0.4': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 '@smithy/util-uri-escape': 4.0.0 tslib: 2.8.1 @@ -12381,23 +12432,23 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.0.3': + '@smithy/querystring-parser@4.0.4': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/service-error-classification@4.0.4': + '@smithy/service-error-classification@4.0.6': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 '@smithy/shared-ini-file-loader@2.4.0': dependencies: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/shared-ini-file-loader@4.0.3': + '@smithy/shared-ini-file-loader@4.0.4': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/signature-v4@3.1.2': @@ -12410,13 +12461,13 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 - '@smithy/signature-v4@5.1.1': + '@smithy/signature-v4@5.1.2': dependencies: '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.1 - '@smithy/types': 4.3.0 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.3 + '@smithy/util-middleware': 4.0.4 '@smithy/util-uri-escape': 4.0.0 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 @@ -12430,14 +12481,14 @@ snapshots: '@smithy/util-stream': 2.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.3.0': + '@smithy/smithy-client@4.4.8': dependencies: - '@smithy/core': 3.4.0 - '@smithy/middleware-endpoint': 4.1.7 - '@smithy/middleware-stack': 4.0.3 - '@smithy/protocol-http': 5.1.1 - '@smithy/types': 4.3.0 - '@smithy/util-stream': 4.2.1 + '@smithy/core': 3.7.1 + '@smithy/middleware-endpoint': 4.1.16 + '@smithy/middleware-stack': 4.0.4 + '@smithy/protocol-http': 5.1.2 + '@smithy/types': 4.3.1 + '@smithy/util-stream': 4.2.3 tslib: 2.8.1 '@smithy/types@2.12.0': @@ -12448,7 +12499,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/types@4.3.0': + '@smithy/types@4.3.1': dependencies: tslib: 2.8.1 @@ -12458,10 +12509,10 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.8.1 - '@smithy/url-parser@4.0.3': + '@smithy/url-parser@4.0.4': dependencies: - '@smithy/querystring-parser': 4.0.3 - '@smithy/types': 4.3.0 + '@smithy/querystring-parser': 4.0.4 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/util-base64@2.3.0': @@ -12503,28 +12554,28 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.15': + '@smithy/util-defaults-mode-browser@4.0.24': dependencies: - '@smithy/property-provider': 4.0.3 - '@smithy/smithy-client': 4.3.0 - '@smithy/types': 4.3.0 + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.8 + '@smithy/types': 4.3.1 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.15': + '@smithy/util-defaults-mode-node@4.0.24': dependencies: - '@smithy/config-resolver': 4.1.3 - '@smithy/credential-provider-imds': 4.0.5 - '@smithy/node-config-provider': 4.1.2 - '@smithy/property-provider': 4.0.3 - '@smithy/smithy-client': 4.3.0 - '@smithy/types': 4.3.0 + '@smithy/config-resolver': 4.1.4 + '@smithy/credential-provider-imds': 4.0.6 + '@smithy/node-config-provider': 4.1.3 + '@smithy/property-provider': 4.0.4 + '@smithy/smithy-client': 4.4.8 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.0.5': + '@smithy/util-endpoints@3.0.6': dependencies: - '@smithy/node-config-provider': 4.1.2 - '@smithy/types': 4.3.0 + '@smithy/node-config-provider': 4.1.3 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/util-hex-encoding@2.2.0': @@ -12549,15 +12600,15 @@ snapshots: '@smithy/types': 3.7.2 tslib: 2.8.1 - '@smithy/util-middleware@4.0.3': + '@smithy/util-middleware@4.0.4': dependencies: - '@smithy/types': 4.3.0 + '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/util-retry@4.0.4': + '@smithy/util-retry@4.0.6': dependencies: - '@smithy/service-error-classification': 4.0.4 - '@smithy/types': 4.3.0 + '@smithy/service-error-classification': 4.0.6 + '@smithy/types': 4.3.1 tslib: 2.8.1 '@smithy/util-stream@2.2.0': @@ -12571,11 +12622,11 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@smithy/util-stream@4.2.1': + '@smithy/util-stream@4.2.3': dependencies: - '@smithy/fetch-http-handler': 5.0.3 - '@smithy/node-http-handler': 4.0.5 - '@smithy/types': 4.3.0 + '@smithy/fetch-http-handler': 5.1.0 + '@smithy/node-http-handler': 4.1.0 + '@smithy/types': 4.3.1 '@smithy/util-base64': 4.0.0 '@smithy/util-buffer-from': 4.0.0 '@smithy/util-hex-encoding': 4.0.0 @@ -15176,14 +15227,14 @@ snapshots: fast-shallow-equal@1.0.0: {} - fast-xml-parser@4.4.1: - dependencies: - strnum: 1.1.2 - fast-xml-parser@5.2.3: dependencies: strnum: 2.1.1 + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.1 + fastest-levenshtein@1.0.16: {} fastest-stable-stringify@2.0.2: {} @@ -18847,8 +18898,6 @@ snapshots: dependencies: js-tokens: 9.0.1 - strnum@1.1.2: {} - strnum@2.1.1: {} strong-type@0.1.6: {} diff --git a/src/api/providers/__tests__/bedrock-inference-profiles.spec.ts b/src/api/providers/__tests__/bedrock-inference-profiles.spec.ts index 7eef16d241..16ee002e20 100644 --- a/src/api/providers/__tests__/bedrock-inference-profiles.spec.ts +++ b/src/api/providers/__tests__/bedrock-inference-profiles.spec.ts @@ -16,7 +16,7 @@ vitest.mock("@aws-sdk/client-bedrock-runtime", () => { } }) -describe("AWS Bedrock Inference Profiles", () => { +describe("Amazon Bedrock Inference Profiles", () => { // Helper function to create a handler with specific options const createHandler = (options: Partial = {}) => { const defaultOptions: ApiHandlerOptions = { diff --git a/src/api/providers/__tests__/bedrock-reasoning.spec.ts b/src/api/providers/__tests__/bedrock-reasoning.spec.ts index f11a27fa96..f8d9beb0eb 100644 --- a/src/api/providers/__tests__/bedrock-reasoning.spec.ts +++ b/src/api/providers/__tests__/bedrock-reasoning.spec.ts @@ -278,5 +278,51 @@ describe("AwsBedrockHandler - Extended Thinking", () => { expect(reasoningChunks[0].text).toBe("Let me think...") expect(reasoningChunks[1].text).toBe(" about this problem.") }) + + it("should support API key authentication", async () => { + handler = new AwsBedrockHandler({ + apiProvider: "bedrock", + apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", + awsRegion: "us-east-1", + awsUseApiKey: true, + awsApiKey: "test-api-key-token", + }) + + mockSend.mockResolvedValue({ + stream: (async function* () { + yield { messageStart: { role: "assistant" } } + yield { + contentBlockStart: { + start: { text: "Hello from API key auth" }, + contentBlockIndex: 0, + }, + } + yield { metadata: { usage: { inputTokens: 100, outputTokens: 50 } } } + })(), + }) + + const messages = [{ role: "user" as const, content: "Test message" }] + const stream = handler.createMessage("System prompt", messages) + + const chunks = [] + for await (const chunk of stream) { + chunks.push(chunk) + } + + // Verify the client was created with API key token + expect(BedrockRuntimeClient).toHaveBeenCalledWith( + expect.objectContaining({ + region: "us-east-1", + token: { token: "test-api-key-token" }, + authSchemePreference: ["httpBearerAuth"], + }), + ) + + // Verify the stream worked correctly + expect(mockSend).toHaveBeenCalledTimes(1) + const textChunks = chunks.filter((c) => c.type === "text") + expect(textChunks).toHaveLength(1) + expect(textChunks[0].text).toBe("Hello from API key auth") + }) }) }) diff --git a/src/api/providers/__tests__/bedrock-vpc-endpoint.spec.ts b/src/api/providers/__tests__/bedrock-vpc-endpoint.spec.ts index ca8329ec11..7823775bea 100644 --- a/src/api/providers/__tests__/bedrock-vpc-endpoint.spec.ts +++ b/src/api/providers/__tests__/bedrock-vpc-endpoint.spec.ts @@ -29,7 +29,7 @@ import { BedrockRuntimeClient } from "@aws-sdk/client-bedrock-runtime" // Get access to the mocked functions const mockBedrockRuntimeClient = vi.mocked(BedrockRuntimeClient) -describe("AWS Bedrock VPC Endpoint Functionality", () => { +describe("Amazon Bedrock VPC Endpoint Functionality", () => { beforeEach(() => { // Clear all mocks before each test vi.clearAllMocks() diff --git a/src/api/providers/bedrock.ts b/src/api/providers/bedrock.ts index a25fea5200..76e502e6c7 100644 --- a/src/api/providers/bedrock.ts +++ b/src/api/providers/bedrock.ts @@ -222,7 +222,11 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH this.options.awsBedrockEndpointEnabled && { endpoint: this.options.awsBedrockEndpoint }), } - if (this.options.awsUseProfile && this.options.awsProfile) { + if (this.options.awsUseApiKey && this.options.awsApiKey) { + // Use API key/token-based authentication if enabled and API key is set + clientConfig.token = { token: this.options.awsApiKey } + clientConfig.authSchemePreference = ["httpBearerAuth"] // Otherwise there's no end of credential problems. + } else if (this.options.awsUseProfile && this.options.awsProfile) { // Use profile-based credentials if enabled and profile is set clientConfig.credentials = fromIni({ profile: this.options.awsProfile, @@ -1078,7 +1082,7 @@ Please verify: "throttl", "rate", "limit", - "bedrock is unable to process your request", // AWS Bedrock specific throttling message + "bedrock is unable to process your request", // Amazon Bedrock specific throttling message "please wait", "quota exceeded", "service unavailable", @@ -1124,7 +1128,7 @@ Suggestions: Please try: 1. Contact AWS support to request a quota increase 2. Reduce request frequency temporarily -3. Check your AWS Bedrock quotas in the AWS console +3. Check your Amazon Bedrock quotas in the AWS console 4. Consider using a different model or region with available capacity `, @@ -1139,7 +1143,7 @@ Please try: Please try: 1. Wait a few minutes and retry -2. Check the model status in AWS Bedrock console +2. Check the model status in Amazon Bedrock console 3. Verify the model is properly provisioned `, @@ -1147,7 +1151,7 @@ Please try: }, INTERNAL_SERVER_ERROR: { patterns: ["internal server error", "internal error", "server error", "service error"], - messageTemplate: `AWS Bedrock internal server error. This is a temporary service issue. + messageTemplate: `Amazon Bedrock internal server error. This is a temporary service issue. Please try: 1. Retry the request after a brief delay @@ -1184,7 +1188,7 @@ Please try: ], messageTemplate: `Parameter validation error: {errorMessage} -This error indicates that the request parameters don't match AWS Bedrock's expected format. +This error indicates that the request parameters don't match Amazon Bedrock's expected format. Common causes: 1. Extended thinking parameter format is incorrect @@ -1193,7 +1197,7 @@ Common causes: Please check: - Model supports the requested features (extended thinking, etc.) -- Parameter format matches AWS Bedrock specification +- Parameter format matches Amazon Bedrock specification - Model ID is correct for the requested features`, logLevel: "error", }, @@ -1218,7 +1222,7 @@ Please check: return "THROTTLING" } - // Check for AWS Bedrock specific throttling exception names + // Check for Amazon Bedrock specific throttling exception names if ((error as any).name === "ThrottlingException" || (error as any).__type === "ThrottlingException") { return "THROTTLING" } diff --git a/src/package.json b/src/package.json index 1fac5fb365..c816837bb7 100644 --- a/src/package.json +++ b/src/package.json @@ -413,8 +413,8 @@ "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", "@anthropic-ai/vertex-sdk": "^0.7.0", - "@aws-sdk/client-bedrock-runtime": "^3.779.0", - "@aws-sdk/credential-providers": "^3.806.0", + "@aws-sdk/client-bedrock-runtime": "^3.848.0", + "@aws-sdk/credential-providers": "^3.848.0", "@google/genai": "^1.0.0", "@lmstudio/sdk": "^1.1.1", "@mistralai/mistralai": "^1.3.6", diff --git a/webview-ui/src/components/settings/providers/Bedrock.tsx b/webview-ui/src/components/settings/providers/Bedrock.tsx index 1839298f9b..750f631856 100644 --- a/webview-ui/src/components/settings/providers/Bedrock.tsx +++ b/webview-ui/src/components/settings/providers/Bedrock.tsx @@ -1,6 +1,6 @@ import { useCallback, useState, useEffect } from "react" import { Checkbox } from "vscrui" -import { VSCodeTextField, VSCodeRadio, VSCodeRadioGroup } from "@vscode/webview-ui-toolkit/react" +import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { type ProviderSettings, type ModelInfo, BEDROCK_REGIONS } from "@roo-code/types" @@ -37,19 +37,51 @@ export const Bedrock = ({ apiConfiguration, setApiConfigurationField, selectedMo return ( <> - (e.target as HTMLInputElement).value === "profile", - )}> - {t("settings:providers.awsCredentials")} - {t("settings:providers.awsProfile")} - +
+ + +
{t("settings:providers.apiKeyStorageNotice")}
- {apiConfiguration?.awsUseProfile ? ( + {apiConfiguration?.awsUseApiKey ? ( + + + + ) : apiConfiguration?.awsUseProfile ? ( ({ // Mock the UI components vi.mock("@src/components/ui", () => ({ - Select: ({ children }: any) =>
{children}
, - SelectContent: ({ children }: any) =>
{children}
, - SelectItem: () =>
Item
, - SelectTrigger: ({ children }: any) =>
{children}
, - SelectValue: () =>
Value
, + Select: ({ children, value, onValueChange }: any) => ( + + ), + SelectContent: ({ children }: any) => <>{children}, + SelectItem: ({ children, value }: any) => , + SelectTrigger: ({ children }: any) => <>{children}, + SelectValue: () => null, + StandardTooltip: ({ children }: any) =>
{children}
, })) // Mock the constants @@ -424,5 +429,126 @@ describe("Bedrock Component", () => { expect(screen.getByTestId("vpc-endpoint-input")).toBeInTheDocument() expect(screen.getByTestId("vpc-endpoint-input")).toHaveValue("https://updated-endpoint.aws.com") }) + + // Test Scenario 6: Authentication Method Selection Tests + describe("Authentication Method Selection", () => { + it("should display credentials option as selected when neither awsUseProfile nor awsUseApiKey is true", () => { + const apiConfiguration: Partial = { + awsUseProfile: false, + awsUseApiKey: false, + } + + render( + , + ) + + // Find the first select element (authentication method) + const selectInputs = screen.getAllByRole("combobox") + const authSelect = selectInputs[0] as HTMLSelectElement + expect(authSelect).toHaveValue("credentials") + }) + + it("should display profile option as selected when awsUseProfile is true", () => { + const apiConfiguration: Partial = { + awsUseProfile: true, + awsUseApiKey: false, + } + + render( + , + ) + + const selectInputs = screen.getAllByRole("combobox") + const authSelect = selectInputs[0] as HTMLSelectElement + expect(authSelect).toHaveValue("profile") + }) + + it("should display apikey option as selected when awsUseApiKey is true", () => { + const apiConfiguration: Partial = { + awsUseProfile: false, + awsUseApiKey: true, + } + + render( + , + ) + + const selectInputs = screen.getAllByRole("combobox") + const authSelect = selectInputs[0] as HTMLSelectElement + expect(authSelect).toHaveValue("apikey") + }) + + it("should call setApiConfigurationField correctly when switching to profile", () => { + const apiConfiguration: Partial = { + awsUseProfile: false, + awsUseApiKey: false, + } + + render( + , + ) + + const selectInputs = screen.getAllByRole("combobox") + const authSelect = selectInputs[0] as HTMLSelectElement + fireEvent.change(authSelect, { target: { value: "profile" } }) + + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("awsUseApiKey", false) + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("awsUseProfile", true) + }) + + it("should call setApiConfigurationField correctly when switching to apikey", () => { + const apiConfiguration: Partial = { + awsUseProfile: false, + awsUseApiKey: false, + } + + render( + , + ) + + const selectInputs = screen.getAllByRole("combobox") + const authSelect = selectInputs[0] as HTMLSelectElement + fireEvent.change(authSelect, { target: { value: "apikey" } }) + + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("awsUseApiKey", true) + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("awsUseProfile", false) + }) + + it("should call setApiConfigurationField correctly when switching to credentials", () => { + const apiConfiguration: Partial = { + awsUseProfile: true, + awsUseApiKey: false, + } + + render( + , + ) + + const selectInputs = screen.getAllByRole("combobox") + const authSelect = selectInputs[0] as HTMLSelectElement + fireEvent.change(authSelect, { target: { value: "credentials" } }) + + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("awsUseApiKey", false) + expect(mockSetApiConfigurationField).toHaveBeenCalledWith("awsUseProfile", false) + }) + }) }) }) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 047b5858bf..ab929d724d 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "URL base de LiteLLM", "awsCredentials": "Credencials d'AWS", "awsProfile": "Perfil d'AWS", + "awsApiKey": "Clau d'API d'Amazon Bedrock", "awsProfileName": "Nom del perfil d'AWS", "awsAccessKey": "Clau d'accés d'AWS", "awsSecretKey": "Clau secreta d'AWS", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index fa64685462..766bc891e4 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "LiteLLM Basis-URL", "awsCredentials": "AWS Anmeldedaten", "awsProfile": "AWS Profil", + "awsApiKey": "Amazon Bedrock API-Schlüssel", "awsProfileName": "AWS Profilname", "awsAccessKey": "AWS Zugangsschlüssel", "awsSecretKey": "AWS Geheimschlüssel", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index f2b05b3369..cfd5b04286 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "LiteLLM Base URL", "awsCredentials": "AWS Credentials", "awsProfile": "AWS Profile", + "awsApiKey": "Amazon Bedrock API Key", "awsProfileName": "AWS Profile Name", "awsAccessKey": "AWS Access Key", "awsSecretKey": "AWS Secret Key", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 3d60bfb45c..f536863909 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "URL base de LiteLLM", "awsCredentials": "Credenciales de AWS", "awsProfile": "Perfil de AWS", + "awsApiKey": "Clave de API de Amazon Bedrock", "awsProfileName": "Nombre del perfil de AWS", "awsAccessKey": "Clave de acceso de AWS", "awsSecretKey": "Clave secreta de AWS", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 2654afcbdc..0e12c58d38 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "URL de base LiteLLM", "awsCredentials": "Identifiants AWS", "awsProfile": "Profil AWS", + "awsApiKey": "Clé API Amazon Bedrock", "awsProfileName": "Nom du profil AWS", "awsAccessKey": "Clé d'accès AWS", "awsSecretKey": "Clé secrète AWS", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 279de29ada..d2cfa971ff 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -221,7 +221,7 @@ "noProviderMatchFound": "कोई प्रदाता नहीं मिला", "noMatchFound": "कोई मिलान प्रोफ़ाइल नहीं मिला", "vscodeLmDescription": "VS कोड भाषा मॉडल API आपको अन्य VS कोड एक्सटेंशन (जैसे GitHub Copilot) द्वारा प्रदान किए गए मॉडल चलाने की अनुमति देता है। शुरू करने का सबसे आसान तरीका VS कोड मार्केटप्लेस से Copilot और Copilot चैट एक्सटेंशन इंस्टॉल करना है।", - "awsCustomArnUse": "आप जिस मॉडल का उपयोग करना चाहते हैं, उसके लिए एक वैध AWS बेडरॉक ARN दर्ज करें। प्रारूप उदाहरण:", + "awsCustomArnUse": "आप जिस मॉडल का उपयोग करना चाहते हैं, उसके लिए एक वैध Amazon बेडरॉक ARN दर्ज करें। प्रारूप उदाहरण:", "awsCustomArnDesc": "सुनिश्चित करें कि ARN में क्षेत्र ऊपर चयनित AWS क्षेत्र से मेल खाता है।", "openRouterApiKey": "OpenRouter API कुंजी", "getOpenRouterApiKey": "OpenRouter API कुंजी प्राप्त करें", @@ -287,6 +287,7 @@ "litellmBaseUrl": "LiteLLM आधार URL", "awsCredentials": "AWS क्रेडेंशियल्स", "awsProfile": "AWS प्रोफाइल", + "awsApiKey": "Amazon बेडरॉक API कुंजी", "awsProfileName": "AWS प्रोफाइल नाम", "awsAccessKey": "AWS एक्सेस कुंजी", "awsSecretKey": "AWS सीक्रेट कुंजी", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index d54db7122e..3f362f650d 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -291,6 +291,7 @@ "litellmBaseUrl": "LiteLLM Base URL", "awsCredentials": "AWS Credentials", "awsProfile": "AWS Profile", + "awsApiKey": "Kunci API Amazon Bedrock", "awsProfileName": "Nama AWS Profile", "awsAccessKey": "AWS Access Key", "awsSecretKey": "AWS Secret Key", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index ed77701914..14deda20ea 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "URL base LiteLLM", "awsCredentials": "Credenziali AWS", "awsProfile": "Profilo AWS", + "awsApiKey": "Chiave API Amazon Bedrock", "awsProfileName": "Nome profilo AWS", "awsAccessKey": "Chiave di accesso AWS", "awsSecretKey": "Chiave segreta AWS", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index efa020b320..d7864e40db 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "LiteLLM ベースURL", "awsCredentials": "AWS認証情報", "awsProfile": "AWSプロファイル", + "awsApiKey": "Amazon Bedrock APIキー", "awsProfileName": "AWSプロファイル名", "awsAccessKey": "AWSアクセスキー", "awsSecretKey": "AWSシークレットキー", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 39b8fd6e33..adbe216463 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "LiteLLM 기본 URL", "awsCredentials": "AWS 자격 증명", "awsProfile": "AWS 프로필", + "awsApiKey": "Amazon Bedrock API 키", "awsProfileName": "AWS 프로필 이름", "awsAccessKey": "AWS 액세스 키", "awsSecretKey": "AWS 시크릿 키", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index d7eba61045..6085be8fb1 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "LiteLLM basis-URL", "awsCredentials": "AWS-inloggegevens", "awsProfile": "AWS-profiel", + "awsApiKey": "Amazon Bedrock API-sleutel", "awsProfileName": "AWS-profielnaam", "awsAccessKey": "AWS-toegangssleutel", "awsSecretKey": "AWS-geheime sleutel", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 960c59724b..9107fd959e 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "URL bazowy LiteLLM", "awsCredentials": "Poświadczenia AWS", "awsProfile": "Profil AWS", + "awsApiKey": "Klucz API Amazon Bedrock", "awsProfileName": "Nazwa profilu AWS", "awsAccessKey": "Klucz dostępu AWS", "awsSecretKey": "Klucz tajny AWS", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 2bb9d4b921..8137d917ae 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "URL base LiteLLM", "awsCredentials": "Credenciais AWS", "awsProfile": "Perfil AWS", + "awsApiKey": "Chave de API Amazon Bedrock", "awsProfileName": "Nome do Perfil AWS", "awsAccessKey": "Chave de Acesso AWS", "awsSecretKey": "Chave Secreta AWS", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index c57a8db3d6..e93f24e9d7 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "Базовый URL LiteLLM", "awsCredentials": "AWS-учётные данные", "awsProfile": "Профиль AWS", + "awsApiKey": "Ключ API Amazon Bedrock", "awsProfileName": "Имя профиля AWS", "awsAccessKey": "AWS Access Key", "awsSecretKey": "AWS Secret Key", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 576e3c1b53..450738183b 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "LiteLLM Temel URL", "awsCredentials": "AWS Kimlik Bilgileri", "awsProfile": "AWS Profili", + "awsApiKey": "Amazon Bedrock API Anahtarı", "awsProfileName": "AWS Profil Adı", "awsAccessKey": "AWS Erişim Anahtarı", "awsSecretKey": "AWS Gizli Anahtarı", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 76a4f9397d..87e99ce6f5 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "URL cơ sở LiteLLM", "awsCredentials": "Thông tin xác thực AWS", "awsProfile": "Hồ sơ AWS", + "awsApiKey": "Khóa API Amazon Bedrock", "awsProfileName": "Tên hồ sơ AWS", "awsAccessKey": "Khóa truy cập AWS", "awsSecretKey": "Khóa bí mật AWS", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 748b9f1d5d..e94c857e65 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "LiteLLM 基础 URL", "awsCredentials": "AWS 凭证", "awsProfile": "AWS 配置文件", + "awsApiKey": "Amazon Bedrock API 密钥", "awsProfileName": "AWS 配置文件名称", "awsAccessKey": "AWS 访问密钥", "awsSecretKey": "AWS 密钥", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index f4a6149102..fa10cf3028 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -287,6 +287,7 @@ "litellmBaseUrl": "LiteLLM 基礎 URL", "awsCredentials": "AWS 認證", "awsProfile": "AWS Profile", + "awsApiKey": "Amazon Bedrock API 金鑰", "awsProfileName": "AWS Profile 名稱", "awsAccessKey": "AWS Access Key", "awsSecretKey": "AWS Secret Key", From f45d9be709fe27485392c63742ede24aa3050233 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Fri, 25 Jul 2025 16:45:45 -0400 Subject: [PATCH 07/44] fix: respect maxReadFileLine setting for file mentions to prevent context exhaustion (#6073) Co-authored-by: Roo Code Co-authored-by: Daniel Riccio --- .../processUserContentMentions.spec.ts | 353 ++++++++++++++++++ src/core/mentions/index.ts | 14 +- .../mentions/processUserContentMentions.ts | 5 + src/core/task/Task.ts | 2 + .../extract-text-large-files.spec.ts | 221 +++++++++++ src/integrations/misc/extract-text.ts | 38 +- 6 files changed, 629 insertions(+), 4 deletions(-) create mode 100644 src/core/mentions/__tests__/processUserContentMentions.spec.ts create mode 100644 src/integrations/misc/__tests__/extract-text-large-files.spec.ts diff --git a/src/core/mentions/__tests__/processUserContentMentions.spec.ts b/src/core/mentions/__tests__/processUserContentMentions.spec.ts new file mode 100644 index 0000000000..3aebd66e53 --- /dev/null +++ b/src/core/mentions/__tests__/processUserContentMentions.spec.ts @@ -0,0 +1,353 @@ +// npx vitest core/mentions/__tests__/processUserContentMentions.spec.ts + +import { describe, it, expect, vi, beforeEach } from "vitest" +import { processUserContentMentions } from "../processUserContentMentions" +import { parseMentions } from "../index" +import { UrlContentFetcher } from "../../../services/browser/UrlContentFetcher" +import { FileContextTracker } from "../../context-tracking/FileContextTracker" + +// Mock the parseMentions function +vi.mock("../index", () => ({ + parseMentions: vi.fn(), +})) + +describe("processUserContentMentions", () => { + let mockUrlContentFetcher: UrlContentFetcher + let mockFileContextTracker: FileContextTracker + let mockRooIgnoreController: any + + beforeEach(() => { + vi.clearAllMocks() + + mockUrlContentFetcher = {} as UrlContentFetcher + mockFileContextTracker = {} as FileContextTracker + mockRooIgnoreController = {} + + // Default mock implementation + vi.mocked(parseMentions).mockImplementation(async (text) => `parsed: ${text}`) + }) + + describe("maxReadFileLine parameter", () => { + it("should pass maxReadFileLine to parseMentions when provided", async () => { + const userContent = [ + { + type: "text" as const, + text: "Read file with limit", + }, + ] + + await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + rooIgnoreController: mockRooIgnoreController, + maxReadFileLine: 100, + }) + + expect(parseMentions).toHaveBeenCalledWith( + "Read file with limit", + "/test", + mockUrlContentFetcher, + mockFileContextTracker, + mockRooIgnoreController, + true, + true, // includeDiagnosticMessages + 50, // maxDiagnosticMessages + 100, + ) + }) + + it("should pass undefined maxReadFileLine when not provided", async () => { + const userContent = [ + { + type: "text" as const, + text: "Read file without limit", + }, + ] + + await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + rooIgnoreController: mockRooIgnoreController, + }) + + expect(parseMentions).toHaveBeenCalledWith( + "Read file without limit", + "/test", + mockUrlContentFetcher, + mockFileContextTracker, + mockRooIgnoreController, + true, + true, // includeDiagnosticMessages + 50, // maxDiagnosticMessages + undefined, + ) + }) + + it("should handle UNLIMITED_LINES constant correctly", async () => { + const userContent = [ + { + type: "text" as const, + text: "Read unlimited lines", + }, + ] + + await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + rooIgnoreController: mockRooIgnoreController, + maxReadFileLine: -1, + }) + + expect(parseMentions).toHaveBeenCalledWith( + "Read unlimited lines", + "/test", + mockUrlContentFetcher, + mockFileContextTracker, + mockRooIgnoreController, + true, + true, // includeDiagnosticMessages + 50, // maxDiagnosticMessages + -1, + ) + }) + }) + + describe("content processing", () => { + it("should process text blocks with tags", async () => { + const userContent = [ + { + type: "text" as const, + text: "Do something", + }, + ] + + const result = await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + }) + + expect(parseMentions).toHaveBeenCalled() + expect(result[0]).toEqual({ + type: "text", + text: "parsed: Do something", + }) + }) + + it("should process text blocks with tags", async () => { + const userContent = [ + { + type: "text" as const, + text: "Fix this issue", + }, + ] + + const result = await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + }) + + expect(parseMentions).toHaveBeenCalled() + expect(result[0]).toEqual({ + type: "text", + text: "parsed: Fix this issue", + }) + }) + + it("should not process text blocks without task or feedback tags", async () => { + const userContent = [ + { + type: "text" as const, + text: "Regular text without special tags", + }, + ] + + const result = await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + }) + + expect(parseMentions).not.toHaveBeenCalled() + expect(result[0]).toEqual(userContent[0]) + }) + + it("should process tool_result blocks with string content", async () => { + const userContent = [ + { + type: "tool_result" as const, + tool_use_id: "123", + content: "Tool feedback", + }, + ] + + const result = await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + }) + + expect(parseMentions).toHaveBeenCalled() + expect(result[0]).toEqual({ + type: "tool_result", + tool_use_id: "123", + content: "parsed: Tool feedback", + }) + }) + + it("should process tool_result blocks with array content", async () => { + const userContent = [ + { + type: "tool_result" as const, + tool_use_id: "123", + content: [ + { + type: "text" as const, + text: "Array task", + }, + { + type: "text" as const, + text: "Regular text", + }, + ], + }, + ] + + const result = await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + }) + + expect(parseMentions).toHaveBeenCalledTimes(1) + expect(result[0]).toEqual({ + type: "tool_result", + tool_use_id: "123", + content: [ + { + type: "text", + text: "parsed: Array task", + }, + { + type: "text", + text: "Regular text", + }, + ], + }) + }) + + it("should handle mixed content types", async () => { + const userContent = [ + { + type: "text" as const, + text: "First task", + }, + { + type: "image" as const, + source: { + type: "base64" as const, + media_type: "image/png" as const, + data: "base64data", + }, + }, + { + type: "tool_result" as const, + tool_use_id: "456", + content: "Feedback", + }, + ] + + const result = await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + maxReadFileLine: 50, + }) + + expect(parseMentions).toHaveBeenCalledTimes(2) + expect(result).toHaveLength(3) + expect(result[0]).toEqual({ + type: "text", + text: "parsed: First task", + }) + expect(result[1]).toEqual(userContent[1]) // Image block unchanged + expect(result[2]).toEqual({ + type: "tool_result", + tool_use_id: "456", + content: "parsed: Feedback", + }) + }) + }) + + describe("showRooIgnoredFiles parameter", () => { + it("should default showRooIgnoredFiles to true", async () => { + const userContent = [ + { + type: "text" as const, + text: "Test default", + }, + ] + + await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + }) + + expect(parseMentions).toHaveBeenCalledWith( + "Test default", + "/test", + mockUrlContentFetcher, + mockFileContextTracker, + undefined, + true, // showRooIgnoredFiles should default to true + true, // includeDiagnosticMessages + 50, // maxDiagnosticMessages + undefined, + ) + }) + + it("should respect showRooIgnoredFiles when explicitly set to false", async () => { + const userContent = [ + { + type: "text" as const, + text: "Test explicit false", + }, + ] + + await processUserContentMentions({ + userContent, + cwd: "/test", + urlContentFetcher: mockUrlContentFetcher, + fileContextTracker: mockFileContextTracker, + showRooIgnoredFiles: false, + }) + + expect(parseMentions).toHaveBeenCalledWith( + "Test explicit false", + "/test", + mockUrlContentFetcher, + mockFileContextTracker, + undefined, + false, + true, // includeDiagnosticMessages + 50, // maxDiagnosticMessages + undefined, + ) + }) + }) +}) diff --git a/src/core/mentions/index.ts b/src/core/mentions/index.ts index 7ce54b984e..d0d305d096 100644 --- a/src/core/mentions/index.ts +++ b/src/core/mentions/index.ts @@ -82,6 +82,7 @@ export async function parseMentions( showRooIgnoredFiles: boolean = true, includeDiagnosticMessages: boolean = true, maxDiagnosticMessages: number = 50, + maxReadFileLine?: number, ): Promise { const mentions: Set = new Set() let parsedText = text.replace(mentionRegexGlobal, (match, mention) => { @@ -149,7 +150,13 @@ export async function parseMentions( } else if (mention.startsWith("/")) { const mentionPath = mention.slice(1) try { - const content = await getFileOrFolderContent(mentionPath, cwd, rooIgnoreController, showRooIgnoredFiles) + const content = await getFileOrFolderContent( + mentionPath, + cwd, + rooIgnoreController, + showRooIgnoredFiles, + maxReadFileLine, + ) if (mention.endsWith("/")) { parsedText += `\n\n\n${content}\n` } else { @@ -212,6 +219,7 @@ async function getFileOrFolderContent( cwd: string, rooIgnoreController?: any, showRooIgnoredFiles: boolean = true, + maxReadFileLine?: number, ): Promise { const unescapedPath = unescapeSpaces(mentionPath) const absPath = path.resolve(cwd, unescapedPath) @@ -224,7 +232,7 @@ async function getFileOrFolderContent( return `(File ${mentionPath} is ignored by .rooignore)` } try { - const content = await extractTextFromFile(absPath) + const content = await extractTextFromFile(absPath, maxReadFileLine) return content } catch (error) { return `(Failed to read contents of ${mentionPath}): ${error.message}` @@ -264,7 +272,7 @@ async function getFileOrFolderContent( if (isBinary) { return undefined } - const content = await extractTextFromFile(absoluteFilePath) + const content = await extractTextFromFile(absoluteFilePath, maxReadFileLine) return `\n${content}\n` } catch (error) { return undefined diff --git a/src/core/mentions/processUserContentMentions.ts b/src/core/mentions/processUserContentMentions.ts index 0649c4bc3c..245a25b379 100644 --- a/src/core/mentions/processUserContentMentions.ts +++ b/src/core/mentions/processUserContentMentions.ts @@ -15,6 +15,7 @@ export async function processUserContentMentions({ showRooIgnoredFiles = true, includeDiagnosticMessages = true, maxDiagnosticMessages = 50, + maxReadFileLine, }: { userContent: Anthropic.Messages.ContentBlockParam[] cwd: string @@ -24,6 +25,7 @@ export async function processUserContentMentions({ showRooIgnoredFiles?: boolean includeDiagnosticMessages?: boolean maxDiagnosticMessages?: number + maxReadFileLine?: number }) { // Process userContent array, which contains various block types: // TextBlockParam, ImageBlockParam, ToolUseBlockParam, and ToolResultBlockParam. @@ -52,6 +54,7 @@ export async function processUserContentMentions({ showRooIgnoredFiles, includeDiagnosticMessages, maxDiagnosticMessages, + maxReadFileLine, ), } } @@ -71,6 +74,7 @@ export async function processUserContentMentions({ showRooIgnoredFiles, includeDiagnosticMessages, maxDiagnosticMessages, + maxReadFileLine, ), } } @@ -91,6 +95,7 @@ export async function processUserContentMentions({ showRooIgnoredFiles, includeDiagnosticMessages, maxDiagnosticMessages, + maxReadFileLine, ), } } diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 95d12f66aa..fe8fd0f68f 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -1230,6 +1230,7 @@ export class Task extends EventEmitter { showRooIgnoredFiles = true, includeDiagnosticMessages = true, maxDiagnosticMessages = 50, + maxReadFileLine = -1, } = (await this.providerRef.deref()?.getState()) ?? {} const parsedUserContent = await processUserContentMentions({ @@ -1241,6 +1242,7 @@ export class Task extends EventEmitter { showRooIgnoredFiles, includeDiagnosticMessages, maxDiagnosticMessages, + maxReadFileLine, }) const environmentDetails = await getEnvironmentDetails(this, includeFileDetails) diff --git a/src/integrations/misc/__tests__/extract-text-large-files.spec.ts b/src/integrations/misc/__tests__/extract-text-large-files.spec.ts new file mode 100644 index 0000000000..fc2f7f54b6 --- /dev/null +++ b/src/integrations/misc/__tests__/extract-text-large-files.spec.ts @@ -0,0 +1,221 @@ +// npx vitest run integrations/misc/__tests__/extract-text-large-files.spec.ts + +import { describe, it, expect, vi, beforeEach, Mock } from "vitest" +import * as fs from "fs/promises" +import { extractTextFromFile } from "../extract-text" +import { countFileLines } from "../line-counter" +import { readLines } from "../read-lines" +import { isBinaryFile } from "isbinaryfile" + +// Mock all dependencies +vi.mock("fs/promises") +vi.mock("../line-counter") +vi.mock("../read-lines") +vi.mock("isbinaryfile") + +describe("extractTextFromFile - Large File Handling", () => { + // Type the mocks + const mockedFs = vi.mocked(fs) + const mockedCountFileLines = vi.mocked(countFileLines) + const mockedReadLines = vi.mocked(readLines) + const mockedIsBinaryFile = vi.mocked(isBinaryFile) + + beforeEach(() => { + vi.clearAllMocks() + // Set default mock behavior + mockedFs.access.mockResolvedValue(undefined) + mockedIsBinaryFile.mockResolvedValue(false) + }) + + it("should truncate files that exceed maxReadFileLine limit", async () => { + const largeFileContent = Array(150) + .fill(null) + .map((_, i) => `Line ${i + 1}: This is a test line with some content`) + .join("\n") + + mockedCountFileLines.mockResolvedValue(150) + mockedReadLines.mockResolvedValue( + Array(100) + .fill(null) + .map((_, i) => `Line ${i + 1}: This is a test line with some content`) + .join("\n"), + ) + + const result = await extractTextFromFile("/test/large-file.ts", 100) + + // Should only include first 100 lines with line numbers + expect(result).toContain(" 1 | Line 1: This is a test line with some content") + expect(result).toContain("100 | Line 100: This is a test line with some content") + expect(result).not.toContain("101 | Line 101: This is a test line with some content") + + // Should include truncation message + expect(result).toContain( + "[File truncated: showing 100 of 150 total lines. The file is too large and may exhaust the context window if read in full.]", + ) + }) + + it("should not truncate files within the maxReadFileLine limit", async () => { + const smallFileContent = Array(50) + .fill(null) + .map((_, i) => `Line ${i + 1}: This is a test line`) + .join("\n") + + mockedCountFileLines.mockResolvedValue(50) + mockedFs.readFile.mockResolvedValue(smallFileContent as any) + + const result = await extractTextFromFile("/test/small-file.ts", 100) + + // Should include all lines with line numbers + expect(result).toContain(" 1 | Line 1: This is a test line") + expect(result).toContain("50 | Line 50: This is a test line") + + // Should not include truncation message + expect(result).not.toContain("[File truncated:") + }) + + it("should handle files with exactly maxReadFileLine lines", async () => { + const exactFileContent = Array(100) + .fill(null) + .map((_, i) => `Line ${i + 1}`) + .join("\n") + + mockedCountFileLines.mockResolvedValue(100) + mockedFs.readFile.mockResolvedValue(exactFileContent as any) + + const result = await extractTextFromFile("/test/exact-file.ts", 100) + + // Should include all lines with line numbers + expect(result).toContain(" 1 | Line 1") + expect(result).toContain("100 | Line 100") + + // Should not include truncation message + expect(result).not.toContain("[File truncated:") + }) + + it("should handle undefined maxReadFileLine by not truncating", async () => { + const largeFileContent = Array(200) + .fill(null) + .map((_, i) => `Line ${i + 1}`) + .join("\n") + + mockedFs.readFile.mockResolvedValue(largeFileContent as any) + + const result = await extractTextFromFile("/test/large-file.ts", undefined) + + // Should include all lines with line numbers when maxReadFileLine is undefined + expect(result).toContain(" 1 | Line 1") + expect(result).toContain("200 | Line 200") + + // Should not include truncation message + expect(result).not.toContain("[File truncated:") + }) + + it("should handle empty files", async () => { + mockedFs.readFile.mockResolvedValue("" as any) + + const result = await extractTextFromFile("/test/empty-file.ts", 100) + + expect(result).toBe("") + expect(result).not.toContain("[File truncated:") + }) + + it("should handle files with only newlines", async () => { + const newlineOnlyContent = "\n\n\n\n\n" + + mockedCountFileLines.mockResolvedValue(6) // 5 newlines = 6 lines + mockedReadLines.mockResolvedValue("\n\n") + + const result = await extractTextFromFile("/test/newline-file.ts", 3) + + // Should truncate at line 3 + expect(result).toContain("[File truncated: showing 3 of 6 total lines") + }) + + it("should handle very large files efficiently", async () => { + // Simulate a 10,000 line file + mockedCountFileLines.mockResolvedValue(10000) + mockedReadLines.mockResolvedValue( + Array(500) + .fill(null) + .map((_, i) => `Line ${i + 1}: Some content here`) + .join("\n"), + ) + + const result = await extractTextFromFile("/test/very-large-file.ts", 500) + + // Should only include first 500 lines with line numbers + expect(result).toContain(" 1 | Line 1: Some content here") + expect(result).toContain("500 | Line 500: Some content here") + expect(result).not.toContain("501 | Line 501: Some content here") + + // Should show truncation message + expect(result).toContain("[File truncated: showing 500 of 10000 total lines") + }) + + it("should handle maxReadFileLine of 0 by throwing an error", async () => { + const fileContent = "Line 1\nLine 2\nLine 3" + + mockedFs.readFile.mockResolvedValue(fileContent as any) + + // maxReadFileLine of 0 should throw an error + await expect(extractTextFromFile("/test/file.ts", 0)).rejects.toThrow( + "Invalid maxReadFileLine: 0. Must be a positive integer or -1 for unlimited.", + ) + }) + + it("should handle negative maxReadFileLine by treating as undefined", async () => { + const fileContent = "Line 1\nLine 2\nLine 3" + + mockedFs.readFile.mockResolvedValue(fileContent as any) + + const result = await extractTextFromFile("/test/file.ts", -1) + + // Should include all content with line numbers when negative + expect(result).toContain("1 | Line 1") + expect(result).toContain("2 | Line 2") + expect(result).toContain("3 | Line 3") + expect(result).not.toContain("[File truncated:") + }) + + it("should preserve file content structure when truncating", async () => { + const structuredContent = [ + "function example() {", + " const x = 1;", + " const y = 2;", + " return x + y;", + "}", + "", + "// More code below", + ].join("\n") + + mockedCountFileLines.mockResolvedValue(7) + mockedReadLines.mockResolvedValue(["function example() {", " const x = 1;", " const y = 2;"].join("\n")) + + const result = await extractTextFromFile("/test/structured.ts", 3) + + // Should preserve the first 3 lines with line numbers + expect(result).toContain("1 | function example() {") + expect(result).toContain("2 | const x = 1;") + expect(result).toContain("3 | const y = 2;") + expect(result).not.toContain("4 | return x + y;") + + // Should include truncation info + expect(result).toContain("[File truncated: showing 3 of 7 total lines") + }) + + it("should handle binary files by throwing an error", async () => { + mockedIsBinaryFile.mockResolvedValue(true) + + await expect(extractTextFromFile("/test/binary.bin", 100)).rejects.toThrow( + "Cannot read text for file type: .bin", + ) + }) + + it("should handle file not found errors", async () => { + mockedFs.access.mockRejectedValue(new Error("ENOENT")) + + await expect(extractTextFromFile("/test/nonexistent.ts", 100)).rejects.toThrow( + "File not found: /test/nonexistent.ts", + ) + }) +}) diff --git a/src/integrations/misc/extract-text.ts b/src/integrations/misc/extract-text.ts index eb02f63b95..8231c609be 100644 --- a/src/integrations/misc/extract-text.ts +++ b/src/integrations/misc/extract-text.ts @@ -5,6 +5,8 @@ import mammoth from "mammoth" import fs from "fs/promises" import { isBinaryFile } from "isbinaryfile" import { extractTextFromXLSX } from "./extract-text-from-xlsx" +import { countFileLines } from "./line-counter" +import { readLines } from "./read-lines" async function extractTextFromPDF(filePath: string): Promise { const dataBuffer = await fs.readFile(filePath) @@ -48,7 +50,27 @@ export function getSupportedBinaryFormats(): string[] { return Object.keys(SUPPORTED_BINARY_FORMATS) } -export async function extractTextFromFile(filePath: string): Promise { +/** + * Extracts text content from a file, with support for various formats including PDF, DOCX, XLSX, and plain text. + * For large text files, can limit the number of lines read to prevent context exhaustion. + * + * @param filePath - Path to the file to extract text from + * @param maxReadFileLine - Maximum number of lines to read from text files. + * Use UNLIMITED_LINES (-1) or undefined for no limit. + * Must be a positive integer or UNLIMITED_LINES. + * @returns Promise resolving to the extracted text content with line numbers + * @throws {Error} If file not found, unsupported format, or invalid parameters + */ +export async function extractTextFromFile(filePath: string, maxReadFileLine?: number): Promise { + // Validate maxReadFileLine parameter + if (maxReadFileLine !== undefined && maxReadFileLine !== -1) { + if (!Number.isInteger(maxReadFileLine) || maxReadFileLine < 1) { + throw new Error( + `Invalid maxReadFileLine: ${maxReadFileLine}. Must be a positive integer or -1 for unlimited.`, + ) + } + } + try { await fs.access(filePath) } catch (error) { @@ -67,6 +89,20 @@ export async function extractTextFromFile(filePath: string): Promise { const isBinary = await isBinaryFile(filePath).catch(() => false) if (!isBinary) { + // Check if we need to apply line limit + if (maxReadFileLine !== undefined && maxReadFileLine !== -1) { + const totalLines = await countFileLines(filePath) + if (totalLines > maxReadFileLine) { + // Read only up to maxReadFileLine (endLine is 0-based and inclusive) + const content = await readLines(filePath, maxReadFileLine - 1, 0) + const numberedContent = addLineNumbers(content) + return ( + numberedContent + + `\n\n[File truncated: showing ${maxReadFileLine} of ${totalLines} total lines. The file is too large and may exhaust the context window if read in full.]` + ) + } + } + // Read the entire file if no limit or file is within limit return addLineNumbers(await fs.readFile(filePath, "utf8")) } else { throw new Error(`Cannot read text for file type: ${fileExtension}`) From c68f8f591e97cfe9a98a2290ce2a687bf45abcc4 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Fri, 25 Jul 2025 14:49:51 -0600 Subject: [PATCH 08/44] feat: Add terminal command permissions UI to chat interface (#5480) (#5798) Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Roo Code Co-authored-by: Daniel Riccio Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com> --- .../src/components/chat/CommandExecution.tsx | 65 +- .../chat/CommandPatternSelector.tsx | 183 ++++++ .../chat/__tests__/CommandExecution.spec.tsx | 560 ++++++++++++++++++ .../__tests__/CommandPatternSelector.spec.tsx | 272 +++++++++ webview-ui/src/i18n/locales/ca/chat.json | 16 + webview-ui/src/i18n/locales/de/chat.json | 16 + webview-ui/src/i18n/locales/en/chat.json | 16 + webview-ui/src/i18n/locales/es/chat.json | 16 + webview-ui/src/i18n/locales/fr/chat.json | 16 + webview-ui/src/i18n/locales/hi/chat.json | 16 + webview-ui/src/i18n/locales/id/chat.json | 16 + webview-ui/src/i18n/locales/it/chat.json | 16 + webview-ui/src/i18n/locales/ja/chat.json | 16 + webview-ui/src/i18n/locales/ko/chat.json | 16 + webview-ui/src/i18n/locales/nl/chat.json | 16 + webview-ui/src/i18n/locales/pl/chat.json | 16 + webview-ui/src/i18n/locales/pt-BR/chat.json | 16 + webview-ui/src/i18n/locales/ru/chat.json | 16 + webview-ui/src/i18n/locales/tr/chat.json | 16 + webview-ui/src/i18n/locales/vi/chat.json | 16 + webview-ui/src/i18n/locales/zh-CN/chat.json | 16 + webview-ui/src/i18n/locales/zh-TW/chat.json | 16 + .../utils/__tests__/command-parser.spec.ts | 137 +++++ webview-ui/src/utils/command-parser.ts | 68 +++ 24 files changed, 1569 insertions(+), 4 deletions(-) create mode 100644 webview-ui/src/components/chat/CommandPatternSelector.tsx create mode 100644 webview-ui/src/components/chat/__tests__/CommandExecution.spec.tsx create mode 100644 webview-ui/src/components/chat/__tests__/CommandPatternSelector.spec.tsx create mode 100644 webview-ui/src/utils/__tests__/command-parser.spec.ts create mode 100644 webview-ui/src/utils/command-parser.ts diff --git a/webview-ui/src/components/chat/CommandExecution.tsx b/webview-ui/src/components/chat/CommandExecution.tsx index 8c92ec7e7b..d027e5e604 100644 --- a/webview-ui/src/components/chat/CommandExecution.tsx +++ b/webview-ui/src/components/chat/CommandExecution.tsx @@ -6,6 +6,7 @@ import { CommandExecutionStatus, commandExecutionStatusSchema } from "@roo-code/ import { ExtensionMessage } from "@roo/ExtensionMessage" import { safeJsonParse } from "@roo/safeJsonParse" + import { COMMAND_OUTPUT_STRING } from "@roo/combineCommandSequences" import { vscode } from "@src/utils/vscode" @@ -13,6 +14,13 @@ import { useExtensionState } from "@src/context/ExtensionStateContext" import { cn } from "@src/lib/utils" import { Button } from "@src/components/ui" import CodeBlock from "../common/CodeBlock" +import { CommandPatternSelector } from "./CommandPatternSelector" +import { extractPatternsFromCommand } from "../../utils/command-parser" + +interface CommandPattern { + pattern: string + description?: string +} interface CommandExecutionProps { executionId: string @@ -22,7 +30,13 @@ interface CommandExecutionProps { } export const CommandExecution = ({ executionId, text, icon, title }: CommandExecutionProps) => { - const { terminalShellIntegrationDisabled = false } = useExtensionState() + const { + terminalShellIntegrationDisabled = false, + allowedCommands = [], + deniedCommands = [], + setAllowedCommands, + setDeniedCommands, + } = useExtensionState() const { command, output: parsedOutput } = useMemo(() => parseCommandAndOutput(text), [text]) @@ -37,6 +51,37 @@ export const CommandExecution = ({ executionId, text, icon, title }: CommandExec // streaming output (this is the case for running commands). const output = streamingOutput || parsedOutput + // Extract command patterns from the actual command that was executed + const commandPatterns = useMemo(() => { + const extractedPatterns = extractPatternsFromCommand(command) + return extractedPatterns.map((pattern) => ({ + pattern, + })) + }, [command]) + + // Handle pattern changes + const handleAllowPatternChange = (pattern: string) => { + const isAllowed = allowedCommands.includes(pattern) + const newAllowed = isAllowed ? allowedCommands.filter((p) => p !== pattern) : [...allowedCommands, pattern] + const newDenied = deniedCommands.filter((p) => p !== pattern) + + setAllowedCommands(newAllowed) + setDeniedCommands(newDenied) + vscode.postMessage({ type: "allowedCommands", commands: newAllowed }) + vscode.postMessage({ type: "deniedCommands", commands: newDenied }) + } + + const handleDenyPatternChange = (pattern: string) => { + const isDenied = deniedCommands.includes(pattern) + const newDenied = isDenied ? deniedCommands.filter((p) => p !== pattern) : [...deniedCommands, pattern] + const newAllowed = allowedCommands.filter((p) => p !== pattern) + + setAllowedCommands(newAllowed) + setDeniedCommands(newDenied) + vscode.postMessage({ type: "allowedCommands", commands: newAllowed }) + vscode.postMessage({ type: "deniedCommands", commands: newDenied }) + } + const onMessage = useCallback( (event: MessageEvent) => { const message: ExtensionMessage = event.data @@ -121,9 +166,21 @@ export const CommandExecution = ({ executionId, text, icon, title }: CommandExec -
- - +
+
+ + +
+ {command && command.trim() && ( + + )}
) diff --git a/webview-ui/src/components/chat/CommandPatternSelector.tsx b/webview-ui/src/components/chat/CommandPatternSelector.tsx new file mode 100644 index 0000000000..431141fa32 --- /dev/null +++ b/webview-ui/src/components/chat/CommandPatternSelector.tsx @@ -0,0 +1,183 @@ +import React, { useState, useMemo } from "react" +import { Check, ChevronDown, Info, X } from "lucide-react" +import { cn } from "../../lib/utils" +import { useTranslation, Trans } from "react-i18next" +import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" +import { StandardTooltip } from "../ui/standard-tooltip" + +interface CommandPattern { + pattern: string + description?: string +} + +interface CommandPatternSelectorProps { + command: string + patterns: CommandPattern[] + allowedCommands: string[] + deniedCommands: string[] + onAllowPatternChange: (pattern: string) => void + onDenyPatternChange: (pattern: string) => void +} + +export const CommandPatternSelector: React.FC = ({ + command, + patterns, + allowedCommands, + deniedCommands, + onAllowPatternChange, + onDenyPatternChange, +}) => { + const { t } = useTranslation() + const [isExpanded, setIsExpanded] = useState(false) + const [editingStates, setEditingStates] = useState>({}) + + // Create a combined list with full command first, then patterns + const allPatterns = useMemo(() => { + const fullCommandPattern: CommandPattern = { pattern: command } + + // Create a set to track unique patterns we've already seen + const seenPatterns = new Set() + seenPatterns.add(command) // Add the full command first + + // Filter out any patterns that are duplicates or are the same as the full command + const uniquePatterns = patterns.filter((p) => { + if (seenPatterns.has(p.pattern)) { + return false + } + seenPatterns.add(p.pattern) + return true + }) + + return [fullCommandPattern, ...uniquePatterns] + }, [command, patterns]) + + const getPatternStatus = (pattern: string): "allowed" | "denied" | "none" => { + if (allowedCommands.includes(pattern)) return "allowed" + if (deniedCommands.includes(pattern)) return "denied" + return "none" + } + + const getEditState = (pattern: string) => { + return editingStates[pattern] || { isEditing: false, value: pattern } + } + + const setEditState = (pattern: string, isEditing: boolean, value?: string) => { + setEditingStates((prev) => ({ + ...prev, + [pattern]: { isEditing, value: value ?? pattern }, + })) + } + + return ( +
+
+ + + {isExpanded && ( +
+ {allPatterns.map((item) => { + const editState = getEditState(item.pattern) + const status = getPatternStatus(editState.value) + + return ( +
+
+ {editState.isEditing ? ( + setEditState(item.pattern, true, e.target.value)} + onBlur={() => setEditState(item.pattern, false)} + onKeyDown={(e) => { + if (e.key === "Enter") { + setEditState(item.pattern, false) + } + if (e.key === "Escape") { + setEditState(item.pattern, false, item.pattern) + } + }} + className="font-mono text-xs bg-vscode-input-background text-vscode-input-foreground border border-vscode-input-border rounded px-2 py-1.5 w-full focus:outline-0 focus:ring-1 focus:ring-vscode-focusBorder" + placeholder={item.pattern} + autoFocus + /> + ) : ( +
setEditState(item.pattern, true)} + className="font-mono text-xs text-vscode-foreground cursor-pointer hover:bg-vscode-list-hoverBackground px-2 py-1.5 rounded transition-colors border border-transparent" + title="Click to edit pattern"> + {editState.value} + {item.description && ( + + - {item.description} + + )} +
+ )} +
+
+ + +
+
+ ) + })} +
+ )} +
+ ) +} diff --git a/webview-ui/src/components/chat/__tests__/CommandExecution.spec.tsx b/webview-ui/src/components/chat/__tests__/CommandExecution.spec.tsx new file mode 100644 index 0000000000..f59cb9a2ea --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/CommandExecution.spec.tsx @@ -0,0 +1,560 @@ +import React from "react" +import { render, screen, fireEvent } from "@testing-library/react" +import { describe, it, expect, vi, beforeEach } from "vitest" +import { CommandExecution } from "../CommandExecution" +import { ExtensionStateContext } from "../../../context/ExtensionStateContext" + +// Mock dependencies +vi.mock("react-use", () => ({ + useEvent: vi.fn(), +})) + +import { vscode } from "../../../utils/vscode" + +vi.mock("../../../utils/vscode", () => ({ + vscode: { + postMessage: vi.fn(), + }, +})) + +vi.mock("../../common/CodeBlock", () => ({ + default: ({ source }: { source: string }) =>
{source}
, +})) + +vi.mock("../CommandPatternSelector", () => ({ + CommandPatternSelector: ({ command, onAllowPatternChange, onDenyPatternChange }: any) => ( +
+ {command} + + +
+ ), +})) + +// Mock ExtensionStateContext +const mockExtensionState = { + terminalShellIntegrationDisabled: false, + allowedCommands: ["npm"], + deniedCommands: ["rm"], + setAllowedCommands: vi.fn(), + setDeniedCommands: vi.fn(), +} + +const ExtensionStateWrapper = ({ children }: { children: React.ReactNode }) => ( + {children} +) + +describe("CommandExecution", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it("should render command without output", () => { + render( + + + , + ) + + expect(screen.getByTestId("code-block")).toHaveTextContent("npm install") + }) + + it("should render command with output", () => { + render( + + + , + ) + + const codeBlocks = screen.getAllByTestId("code-block") + expect(codeBlocks[0]).toHaveTextContent("npm install") + }) + + it("should render with custom icon and title", () => { + const icon = 📦 + const title = Installing Dependencies + + render( + + + , + ) + + expect(screen.getByTestId("custom-icon")).toBeInTheDocument() + expect(screen.getByTestId("custom-title")).toBeInTheDocument() + }) + + it("should show command pattern selector for commands", () => { + render( + + + , + ) + + expect(screen.getByTestId("command-pattern-selector")).toBeInTheDocument() + // Check that the command is shown in the pattern selector + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toHaveTextContent("npm install express") + }) + + it("should handle allow command change", () => { + render( + + + , + ) + + const allowButton = screen.getByText("Allow git push") + fireEvent.click(allowButton) + + expect(mockExtensionState.setAllowedCommands).toHaveBeenCalledWith(["npm", "git push"]) + expect(mockExtensionState.setDeniedCommands).toHaveBeenCalledWith(["rm"]) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "allowedCommands", commands: ["npm", "git push"] }) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "deniedCommands", commands: ["rm"] }) + }) + + it("should handle deny command change", () => { + render( + + + , + ) + + const denyButton = screen.getByText("Deny docker run") + fireEvent.click(denyButton) + + expect(mockExtensionState.setAllowedCommands).toHaveBeenCalledWith(["npm"]) + expect(mockExtensionState.setDeniedCommands).toHaveBeenCalledWith(["rm", "docker run"]) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "allowedCommands", commands: ["npm"] }) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "deniedCommands", commands: ["rm", "docker run"] }) + }) + + it("should toggle allowed command", () => { + // Update the mock state to have "npm test" in allowedCommands + const stateWithNpmTest = { + ...mockExtensionState, + allowedCommands: ["npm test"], + deniedCommands: ["rm"], + } + + render( + + + , + ) + + const allowButton = screen.getByText("Allow npm test") + fireEvent.click(allowButton) + + // "npm test" is already in allowedCommands, so it should be removed + expect(stateWithNpmTest.setAllowedCommands).toHaveBeenCalledWith([]) + expect(stateWithNpmTest.setDeniedCommands).toHaveBeenCalledWith(["rm"]) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "allowedCommands", commands: [] }) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "deniedCommands", commands: ["rm"] }) + }) + + it("should toggle denied command", () => { + // Update the mock state to have "rm -rf" in deniedCommands + const stateWithRmRf = { + ...mockExtensionState, + allowedCommands: ["npm"], + deniedCommands: ["rm -rf"], + } + + render( + + + , + ) + + const denyButton = screen.getByText("Deny rm -rf") + fireEvent.click(denyButton) + + // "rm -rf" is already in deniedCommands, so it should be removed + expect(stateWithRmRf.setAllowedCommands).toHaveBeenCalledWith(["npm"]) + expect(stateWithRmRf.setDeniedCommands).toHaveBeenCalledWith([]) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "allowedCommands", commands: ["npm"] }) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "deniedCommands", commands: [] }) + }) + + it("should parse command with Output: separator", () => { + const commandText = `npm install +Output: +Installing...` + + render( + + + , + ) + + const codeBlocks = screen.getAllByTestId("code-block") + expect(codeBlocks[0]).toHaveTextContent("npm install") + }) + + it("should parse command with output", () => { + const commandText = `npm install +Output: +Suggested patterns: npm, npm install, npm run` + + render( + + + , + ) + + // First check that the command was parsed correctly + const codeBlocks = screen.getAllByTestId("code-block") + expect(codeBlocks[0]).toHaveTextContent("npm install") + expect(codeBlocks[1]).toHaveTextContent("Suggested patterns: npm, npm install, npm run") + + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + // Should show the full command in the selector + expect(selector).toHaveTextContent("npm install") + }) + + it("should handle commands with pipes", () => { + render( + + + , + ) + + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + expect(selector).toHaveTextContent("ls -la | grep test") + }) + + it("should handle commands with && operator", () => { + render( + + + , + ) + + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + expect(selector).toHaveTextContent("npm install && npm test") + }) + + it("should not show pattern selector for empty commands", () => { + render( + + + , + ) + + expect(screen.queryByTestId("command-pattern-selector")).not.toBeInTheDocument() + }) + + it("should expand output when terminal shell integration is disabled", () => { + const disabledState = { + ...mockExtensionState, + terminalShellIntegrationDisabled: true, + } + + const commandText = `npm install +Output: +Output here` + + render( + + + , + ) + + // Output should be visible when shell integration is disabled + const codeBlocks = screen.getAllByTestId("code-block") + expect(codeBlocks).toHaveLength(2) // Command and output blocks + expect(codeBlocks[1]).toHaveTextContent("Output here") + }) + + it("should handle undefined allowedCommands and deniedCommands", () => { + const stateWithUndefined = { + ...mockExtensionState, + allowedCommands: undefined, + deniedCommands: undefined, + } + + render( + + + , + ) + + // Should show pattern selector when patterns are available + expect(screen.getByTestId("command-pattern-selector")).toBeInTheDocument() + }) + + it("should handle command change when moving from denied to allowed", () => { + // Update the mock state to have "rm file.txt" in deniedCommands + const stateWithRmInDenied = { + ...mockExtensionState, + allowedCommands: ["npm"], + deniedCommands: ["rm file.txt"], + } + + render( + + + , + ) + + const allowButton = screen.getByText("Allow rm file.txt") + fireEvent.click(allowButton) + + // "rm file.txt" should be removed from denied and added to allowed + expect(stateWithRmInDenied.setAllowedCommands).toHaveBeenCalledWith(["npm", "rm file.txt"]) + expect(stateWithRmInDenied.setDeniedCommands).toHaveBeenCalledWith([]) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "allowedCommands", commands: ["npm", "rm file.txt"] }) + expect(vscode.postMessage).toHaveBeenCalledWith({ type: "deniedCommands", commands: [] }) + }) + + describe("integration with CommandPatternSelector", () => { + it("should show complex commands with multiple operators", () => { + render( + + + , + ) + + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + expect(selector).toHaveTextContent("npm install && npm test || echo 'failed'") + }) + + it("should handle commands with output", () => { + const commandWithOutput = `npm install +Output: +Installing packages... +Other output here` + + render( + + icon} + title={Run Command} + /> + , + ) + + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + // Should show the command in the selector + expect(selector).toHaveTextContent("npm install") + }) + + it("should handle commands with subshells", () => { + render( + + + , + ) + + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + expect(selector).toHaveTextContent("echo $(whoami) && git status") + }) + + it("should handle commands with backtick subshells", () => { + render( + + + , + ) + + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + expect(selector).toHaveTextContent("git commit -m `date`") + }) + + it("should handle commands with special characters", () => { + render( + + + , + ) + + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + expect(selector).toHaveTextContent("cd ~/projects && npm start") + }) + + it("should handle commands with mixed content including output", () => { + const commandWithMixedContent = `npm test +Output: +Running tests... +✓ Test 1 passed +✓ Test 2 passed` + + render( + + icon} + title={Run Command} + /> + , + ) + + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + // Should show the command in the selector + expect(selector).toHaveTextContent("npm test") + }) + + it("should update both allowed and denied lists when commands conflict", () => { + const conflictState = { + ...mockExtensionState, + allowedCommands: ["git"], + deniedCommands: ["git push origin main"], + } + + render( + + + , + ) + + // Click to allow "git push origin main" + const allowButton = screen.getByText("Allow git push origin main") + fireEvent.click(allowButton) + + // Should add to allowed and remove from denied + expect(conflictState.setAllowedCommands).toHaveBeenCalledWith(["git", "git push origin main"]) + expect(conflictState.setDeniedCommands).toHaveBeenCalledWith([]) + }) + + it("should handle commands with special quotes", () => { + // Test with a command that has quotes + const commandWithQuotes = "echo 'test with unclosed quote" + + render( + + + , + ) + + // Should still render the command + expect(screen.getByTestId("code-block")).toHaveTextContent("echo 'test with unclosed quote") + + // Should show pattern selector with the full command + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + expect(selector).toHaveTextContent("echo 'test with unclosed quote") + }) + + it("should handle empty or whitespace-only commands", () => { + render( + + + , + ) + + // Should render without errors + expect(screen.getByTestId("code-block")).toBeInTheDocument() + + // Should not show pattern selector for empty commands + expect(screen.queryByTestId("command-pattern-selector")).not.toBeInTheDocument() + }) + + it("should handle commands with only output and no command prefix", () => { + const outputOnly = `Some output without a command +Multiple lines of output +Without any command prefix` + + render( + + + , + ) + + // Should treat the entire text as command when no prefix is found + const codeBlock = screen.getByTestId("code-block") + // The mock CodeBlock component renders text content without preserving newlines + expect(codeBlock.textContent).toContain("Some output without a command") + expect(codeBlock.textContent).toContain("Multiple lines of output") + expect(codeBlock.textContent).toContain("Without any command prefix") + }) + + it("should handle simple commands", () => { + const plainCommand = "docker build ." + + render( + + + , + ) + + // Should render the command + expect(screen.getByTestId("code-block")).toHaveTextContent("docker build .") + + // Should show pattern selector with the full command + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + expect(selector).toHaveTextContent("docker build .") + + // Verify no output is shown (since there's no Output: separator) + const codeBlocks = screen.getAllByTestId("code-block") + expect(codeBlocks).toHaveLength(1) // Only the command block, no output block + }) + + it("should handle commands with numeric output", () => { + const commandWithNumericOutput = `wc -l *.go *.java +Output: + 10 file1.go + 20 file2.go + 15 Main.java + 45 total` + + render( + + + , + ) + + // Should render the command and output + const codeBlocks = screen.getAllByTestId("code-block") + expect(codeBlocks[0]).toHaveTextContent("wc -l *.go *.java") + + // Should show pattern selector + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + + // Should show the full command in the selector + expect(selector).toHaveTextContent("wc -l *.go *.java") + + // The output should still be displayed in the code block + expect(codeBlocks.length).toBeGreaterThan(1) + expect(codeBlocks[1].textContent).toContain("45 total") + }) + + it("should handle commands with zero output", () => { + const commandWithZeroTotal = `wc -l *.go *.java +Output: + 0 total` + + render( + + + , + ) + + // Should show pattern selector + const selector = screen.getByTestId("command-pattern-selector") + expect(selector).toBeInTheDocument() + + // Should show the full command in the selector + expect(selector).toHaveTextContent("wc -l *.go *.java") + + // The output should still be displayed in the code block + const codeBlocks = screen.getAllByTestId("code-block") + expect(codeBlocks.length).toBeGreaterThan(1) + expect(codeBlocks[1]).toHaveTextContent("0 total") + }) + }) +}) diff --git a/webview-ui/src/components/chat/__tests__/CommandPatternSelector.spec.tsx b/webview-ui/src/components/chat/__tests__/CommandPatternSelector.spec.tsx new file mode 100644 index 0000000000..18c5ddd5aa --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/CommandPatternSelector.spec.tsx @@ -0,0 +1,272 @@ +import React from "react" +import { render, screen, fireEvent } from "@testing-library/react" +import { describe, it, expect, vi } from "vitest" +import { CommandPatternSelector } from "../CommandPatternSelector" +import { TooltipProvider } from "../../../components/ui/tooltip" + +// Mock react-i18next +vi.mock("react-i18next", () => ({ + useTranslation: () => ({ + t: (key: string) => key, + }), + Trans: ({ i18nKey, children }: any) => {i18nKey || children}, +})) + +// Mock VSCodeLink +vi.mock("@vscode/webview-ui-toolkit/react", () => ({ + VSCodeLink: ({ children, onClick }: any) => ( + + {children} + + ), +})) + +// Wrapper component with TooltipProvider +const TestWrapper = ({ children }: { children: React.ReactNode }) => {children} + +describe("CommandPatternSelector", () => { + const defaultProps = { + command: "npm install express", + patterns: [ + { pattern: "npm install", description: "Install npm packages" }, + { pattern: "npm *", description: "Any npm command" }, + ], + allowedCommands: ["npm install"], + deniedCommands: ["git push"], + onAllowPatternChange: vi.fn(), + onDenyPatternChange: vi.fn(), + } + + it("should render with command permissions header", () => { + const { container } = render( + + + , + ) + + // The component should render without errors + expect(container).toBeTruthy() + + // Check for the command permissions text + expect(screen.getByText("chat:commandExecution.manageCommands")).toBeInTheDocument() + }) + + it("should show full command as first pattern when expanded", () => { + render( + + + , + ) + + // Click to expand the component + const expandButton = screen.getByRole("button") + fireEvent.click(expandButton) + + // Check that the full command is shown + expect(screen.getByText("npm install express")).toBeInTheDocument() + }) + + it("should show extracted patterns when expanded", () => { + render( + + + , + ) + + // Click to expand the component + const expandButton = screen.getByRole("button") + fireEvent.click(expandButton) + + // Check that patterns are shown + expect(screen.getByText("npm install")).toBeInTheDocument() + expect(screen.getByText("- Install npm packages")).toBeInTheDocument() + expect(screen.getByText("npm *")).toBeInTheDocument() + expect(screen.getByText("- Any npm command")).toBeInTheDocument() + }) + + it("should allow editing patterns when clicked", () => { + render( + + + , + ) + + // Click to expand the component + const expandButton = screen.getByRole("button") + fireEvent.click(expandButton) + + // Click on the full command pattern + const fullCommandDiv = screen.getByText("npm install express").closest("div") + fireEvent.click(fullCommandDiv!) + + // An input should appear + const input = screen.getByDisplayValue("npm install express") as HTMLInputElement + expect(input).toBeInTheDocument() + + // Change the value + fireEvent.change(input, { target: { value: "npm install react" } }) + expect(input.value).toBe("npm install react") + }) + + it("should show allowed status for patterns in allowed list", () => { + render( + + + , + ) + + // Click to expand the component + const expandButton = screen.getByRole("button") + fireEvent.click(expandButton) + + // Find the npm install pattern row + const npmInstallPattern = screen.getByText("npm install").closest(".ml-5") + + // The allow button should have the active styling (we can check by aria-label) + const allowButton = npmInstallPattern?.querySelector('button[aria-label*="removeFromAllowed"]') + expect(allowButton).toBeInTheDocument() + }) + + it("should show denied status for patterns in denied list", () => { + const props = { + ...defaultProps, + patterns: [{ pattern: "git push", description: "Push to git" }], + } + + render( + + + , + ) + + // Click to expand the component + const expandButton = screen.getByRole("button") + fireEvent.click(expandButton) + + // Find the git push pattern row + const gitPushPattern = screen.getByText("git push").closest(".ml-5") + + // The deny button should have the active styling (we can check by aria-label) + const denyButton = gitPushPattern?.querySelector('button[aria-label*="removeFromDenied"]') + expect(denyButton).toBeInTheDocument() + }) + + it("should call onAllowPatternChange when allow button is clicked", () => { + const mockOnAllowPatternChange = vi.fn() + const props = { + ...defaultProps, + onAllowPatternChange: mockOnAllowPatternChange, + } + + render( + + + , + ) + + // Click to expand the component + const expandButton = screen.getByRole("button") + fireEvent.click(expandButton) + + // Find the full command pattern row and click allow + const fullCommandPattern = screen.getByText("npm install express").closest(".ml-5") + const allowButton = fullCommandPattern?.querySelector('button[aria-label*="addToAllowed"]') + fireEvent.click(allowButton!) + + // Check that the callback was called with the pattern + expect(mockOnAllowPatternChange).toHaveBeenCalledWith("npm install express") + }) + + it("should call onDenyPatternChange when deny button is clicked", () => { + const mockOnDenyPatternChange = vi.fn() + const props = { + ...defaultProps, + onDenyPatternChange: mockOnDenyPatternChange, + } + + render( + + + , + ) + + // Click to expand the component + const expandButton = screen.getByRole("button") + fireEvent.click(expandButton) + + // Find the full command pattern row and click deny + const fullCommandPattern = screen.getByText("npm install express").closest(".ml-5") + const denyButton = fullCommandPattern?.querySelector('button[aria-label*="addToDenied"]') + fireEvent.click(denyButton!) + + // Check that the callback was called with the pattern + expect(mockOnDenyPatternChange).toHaveBeenCalledWith("npm install express") + }) + + it("should use edited pattern value when buttons are clicked", () => { + const mockOnAllowPatternChange = vi.fn() + const props = { + ...defaultProps, + onAllowPatternChange: mockOnAllowPatternChange, + } + + render( + + + , + ) + + // Click to expand the component + const expandButton = screen.getByRole("button") + fireEvent.click(expandButton) + + // Click on the full command pattern to edit + const fullCommandDiv = screen.getByText("npm install express").closest("div") + fireEvent.click(fullCommandDiv!) + + // Edit the command + const input = screen.getByDisplayValue("npm install express") as HTMLInputElement + fireEvent.change(input, { target: { value: "npm install react" } }) + + // Don't press Enter or blur - just click the button while still editing + // This simulates the user clicking the button while the input is still focused + + // Find the allow button in the same row as the input + const patternRow = input.closest(".ml-5") + const allowButton = patternRow?.querySelector('button[aria-label*="addToAllowed"]') + expect(allowButton).toBeInTheDocument() + + // Click the allow button - this should use the current edited value + fireEvent.click(allowButton!) + + // Check that the callback was called with the edited pattern + expect(mockOnAllowPatternChange).toHaveBeenCalledWith("npm install react") + }) + + it("should cancel edit on Escape key", () => { + render( + + + , + ) + + // Click to expand the component + const expandButton = screen.getByRole("button") + fireEvent.click(expandButton) + + // Click on the full command pattern to edit + const fullCommandDiv = screen.getByText("npm install express").closest("div") + fireEvent.click(fullCommandDiv!) + + // Edit the command + const input = screen.getByDisplayValue("npm install express") as HTMLInputElement + fireEvent.change(input, { target: { value: "npm install react" } }) + + // Press Escape to cancel + fireEvent.keyDown(input, { key: "Escape" }) + + // The original value should be restored + expect(screen.getByText("npm install express")).toBeInTheDocument() + expect(screen.queryByDisplayValue("npm install react")).not.toBeInTheDocument() + }) +}) diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 01d9ee1c1a..17fe22d71e 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo ha vist noms de definicions de codi font utilitzats en aquest directori (fora de l'espai de treball):" }, "commandOutput": "Sortida de l'ordre", + "commandExecution": { + "running": "Executant", + "pid": "PID: {{pid}}", + "exited": "Finalitzat ({{exitCode}})", + "manageCommands": "Gestiona els permisos de les ordres", + "commandManagementDescription": "Gestiona els permisos de les ordres: Fes clic a ✓ per permetre l'execució automàtica, ✗ per denegar l'execució. Els patrons es poden activar/desactivar o eliminar de les llistes. Mostra tots els paràmetres", + "addToAllowed": "Afegeix a la llista de permesos", + "removeFromAllowed": "Elimina de la llista de permesos", + "addToDenied": "Afegeix a la llista de denegats", + "removeFromDenied": "Elimina de la llista de denegats", + "abortCommand": "Interromp l'execució de l'ordre", + "expandOutput": "Amplia la sortida", + "collapseOutput": "Redueix la sortida", + "expandManagement": "Amplia la secció de gestió d'ordres", + "collapseManagement": "Redueix la secció de gestió d'ordres" + }, "response": "Resposta", "arguments": "Arguments", "mcp": { diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 032145234d..2f603a3717 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo hat Quellcode-Definitionsnamen in diesem Verzeichnis (außerhalb des Arbeitsbereichs) angezeigt:" }, "commandOutput": "Befehlsausgabe", + "commandExecution": { + "running": "Wird ausgeführt", + "pid": "PID: {{pid}}", + "exited": "Beendet ({{exitCode}})", + "manageCommands": "Befehlsberechtigungen verwalten", + "commandManagementDescription": "Befehlsberechtigungen verwalten: Klicke auf ✓, um die automatische Ausführung zu erlauben, ✗, um die Ausführung zu verweigern. Muster können ein-/ausgeschaltet oder aus Listen entfernt werden. Alle Einstellungen anzeigen", + "addToAllowed": "Zur Liste der erlaubten Befehle hinzufügen", + "removeFromAllowed": "Von der Liste der erlaubten Befehle entfernen", + "addToDenied": "Zur Liste der verweigerten Befehle hinzufügen", + "removeFromDenied": "Von der Liste der verweigerten Befehle entfernen", + "abortCommand": "Befehlsausführung abbrechen", + "expandOutput": "Ausgabe erweitern", + "collapseOutput": "Ausgabe einklappen", + "expandManagement": "Befehlsverwaltungsbereich erweitern", + "collapseManagement": "Befehlsverwaltungsbereich einklappen" + }, "response": "Antwort", "arguments": "Argumente", "mcp": { diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 3bbb3fbf72..d09c75424d 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -211,6 +211,22 @@ "resultTooltip": "Similarity score: {{score}} (click to open file)" }, "commandOutput": "Command Output", + "commandExecution": { + "running": "Running", + "pid": "PID: {{pid}}", + "exited": "Exited ({{exitCode}})", + "manageCommands": "Manage Command Permissions", + "commandManagementDescription": "Manage command permissions: Click ✓ to allow auto-execution, ✗ to deny execution. Patterns can be toggled on/off or removed from lists. View all settings", + "addToAllowed": "Add to allowed list", + "removeFromAllowed": "Remove from allowed list", + "addToDenied": "Add to denied list", + "removeFromDenied": "Remove from denied list", + "abortCommand": "Abort command execution", + "expandOutput": "Expand output", + "collapseOutput": "Collapse output", + "expandManagement": "Expand command management section", + "collapseManagement": "Collapse command management section" + }, "response": "Response", "arguments": "Arguments", "mcp": { diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index adcfd1d40c..97dd41d952 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo vio nombres de definiciones de código fuente utilizados en este directorio (fuera del espacio de trabajo):" }, "commandOutput": "Salida del comando", + "commandExecution": { + "running": "Ejecutando", + "pid": "PID: {{pid}}", + "exited": "Finalizado ({{exitCode}})", + "manageCommands": "Gestionar permisos de comandos", + "commandManagementDescription": "Gestionar permisos de comandos: Haz clic en ✓ para permitir la ejecución automática, ✗ para denegar la ejecución. Los patrones se pueden activar/desactivar o eliminar de las listas. Ver todos los ajustes", + "addToAllowed": "Añadir a la lista de permitidos", + "removeFromAllowed": "Eliminar de la lista de permitidos", + "addToDenied": "Añadir a la lista de denegados", + "removeFromDenied": "Eliminar de la lista de denegados", + "abortCommand": "Abortar ejecución del comando", + "expandOutput": "Expandir salida", + "collapseOutput": "Contraer salida", + "expandManagement": "Expandir sección de gestión de comandos", + "collapseManagement": "Contraer sección de gestión de comandos" + }, "response": "Respuesta", "arguments": "Argumentos", "mcp": { diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 3e49a64867..1ecbeeca81 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo a vu les noms de définitions de code source utilisés dans ce répertoire (hors espace de travail) :" }, "commandOutput": "Sortie de commande", + "commandExecution": { + "running": "En cours d'exécution", + "pid": "PID : {{pid}}", + "exited": "Terminé ({{exitCode}})", + "manageCommands": "Gérer les autorisations de commande", + "commandManagementDescription": "Gérer les autorisations de commande : Cliquez sur ✓ pour autoriser l'exécution automatique, ✗ pour refuser l'exécution. Les modèles peuvent être activés/désactivés ou supprimés des listes. Voir tous les paramètres", + "addToAllowed": "Ajouter à la liste autorisée", + "removeFromAllowed": "Retirer de la liste autorisée", + "addToDenied": "Ajouter à la liste refusée", + "removeFromDenied": "Retirer de la liste refusée", + "abortCommand": "Abandonner l'exécution de la commande", + "expandOutput": "Développer la sortie", + "collapseOutput": "Réduire la sortie", + "expandManagement": "Développer la section de gestion des commandes", + "collapseManagement": "Réduire la section de gestion des commandes" + }, "response": "Réponse", "arguments": "Arguments", "mcp": { diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 3b5c7b8a67..48b9982172 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo ने इस निर्देशिका (कार्यक्षेत्र के बाहर) में उपयोग किए गए सोर्स कोड परिभाषा नामों को देखा:" }, "commandOutput": "कमांड आउटपुट", + "commandExecution": { + "running": "चलाया जा रहा है", + "pid": "पीआईडी: {{pid}}", + "exited": "बाहर निकल गया ({{exitCode}})", + "manageCommands": "कमांड अनुमतियाँ प्रबंधित करें", + "commandManagementDescription": "कमांड अनुमतियों का प्रबंधन करें: स्वतः-निष्पादन की अनुमति देने के लिए ✓ पर क्लिक करें, निष्पादन से इनकार करने के लिए ✗ पर क्लिक करें। पैटर्न को चालू/बंद किया जा सकता है या सूचियों से हटाया जा सकता है। सभी सेटिंग्स देखें", + "addToAllowed": "अनुमत सूची में जोड़ें", + "removeFromAllowed": "अनुमत सूची से हटाएं", + "addToDenied": "अस्वीकृत सूची में जोड़ें", + "removeFromDenied": "अस्वीकृत सूची से हटाएं", + "abortCommand": "कमांड निष्पादन रद्द करें", + "expandOutput": "आउटपुट का विस्तार करें", + "collapseOutput": "आउटपुट संक्षिप्त करें", + "expandManagement": "कमांड प्रबंधन अनुभाग का विस्तार करें", + "collapseManagement": "कमांड प्रबंधन अनुभाग संक्षिप्त करें" + }, "response": "प्रतिक्रिया", "arguments": "आर्ग्युमेंट्स", "mcp": { diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json index 2ef1cb75e7..ba20ad324b 100644 --- a/webview-ui/src/i18n/locales/id/chat.json +++ b/webview-ui/src/i18n/locales/id/chat.json @@ -214,6 +214,22 @@ "resultTooltip": "Skor kemiripan: {{score}} (klik untuk membuka file)" }, "commandOutput": "Output Perintah", + "commandExecution": { + "running": "Menjalankan", + "pid": "PID: {{pid}}", + "exited": "Keluar ({{exitCode}})", + "manageCommands": "Kelola Izin Perintah", + "commandManagementDescription": "Kelola izin perintah: Klik ✓ untuk mengizinkan eksekusi otomatis, ✗ untuk menolak eksekusi. Pola dapat diaktifkan/dinonaktifkan atau dihapus dari daftar. Lihat semua pengaturan", + "addToAllowed": "Tambahkan ke daftar yang diizinkan", + "removeFromAllowed": "Hapus dari daftar yang diizinkan", + "addToDenied": "Tambahkan ke daftar yang ditolak", + "removeFromDenied": "Hapus dari daftar yang ditolak", + "abortCommand": "Batalkan eksekusi perintah", + "expandOutput": "Perluas output", + "collapseOutput": "Ciutkan output", + "expandManagement": "Perluas bagian manajemen perintah", + "collapseManagement": "Ciutkan bagian manajemen perintah" + }, "response": "Respons", "arguments": "Argumen", "mcp": { diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index eb3984f1be..55691c71ac 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo ha visualizzato i nomi delle definizioni di codice sorgente utilizzate in questa directory (fuori dall'area di lavoro):" }, "commandOutput": "Output del comando", + "commandExecution": { + "running": "In esecuzione", + "pid": "PID: {{pid}}", + "exited": "Terminato ({{exitCode}})", + "manageCommands": "Gestisci autorizzazioni comandi", + "commandManagementDescription": "Gestisci le autorizzazioni dei comandi: fai clic su ✓ per consentire l'esecuzione automatica, ✗ per negare l'esecuzione. I pattern possono essere attivati/disattivati o rimossi dagli elenchi. Visualizza tutte le impostazioni", + "addToAllowed": "Aggiungi all'elenco consentiti", + "removeFromAllowed": "Rimuovi dall'elenco consentiti", + "addToDenied": "Aggiungi all'elenco negati", + "removeFromDenied": "Rimuovi dall'elenco negati", + "abortCommand": "Interrompi esecuzione comando", + "expandOutput": "Espandi output", + "collapseOutput": "Comprimi output", + "expandManagement": "Espandi la sezione di gestione dei comandi", + "collapseManagement": "Comprimi la sezione di gestione dei comandi" + }, "response": "Risposta", "arguments": "Argomenti", "mcp": { diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 2f6e6bfab7..d502103260 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Rooはこのディレクトリ(ワークスペース外)で使用されているソースコード定義名を表示しました:" }, "commandOutput": "コマンド出力", + "commandExecution": { + "running": "実行中", + "pid": "PID: {{pid}}", + "exited": "終了しました ({{exitCode}})", + "manageCommands": "コマンド権限の管理", + "commandManagementDescription": "コマンドの権限を管理します:✓ をクリックして自動実行を許可し、✗ をクリックして実行を拒否します。パターンはオン/オフの切り替えやリストからの削除が可能です。すべての設定を表示", + "addToAllowed": "許可リストに追加", + "removeFromAllowed": "許可リストから削除", + "addToDenied": "拒否リストに追加", + "removeFromDenied": "拒否リストから削除", + "abortCommand": "コマンドの実行を中止", + "expandOutput": "出力を展開", + "collapseOutput": "出力を折りたたむ", + "expandManagement": "コマンド管理セクションを展開", + "collapseManagement": "コマンド管理セクションを折りたたむ" + }, "response": "応答", "arguments": "引数", "mcp": { diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index f4a5c33602..2fcac36cba 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo가 이 디렉토리(워크스페이스 외부)에서 사용된 소스 코드 정의 이름을 보았습니다:" }, "commandOutput": "명령 출력", + "commandExecution": { + "running": "실행 중", + "pid": "PID: {{pid}}", + "exited": "종료됨 ({{exitCode}})", + "manageCommands": "명령 권한 관리", + "commandManagementDescription": "명령 권한 관리: 자동 실행을 허용하려면 ✓를 클릭하고 실행을 거부하려면 ✗를 클릭하십시오. 패턴은 켜거나 끄거나 목록에서 제거할 수 있습니다. 모든 설정 보기", + "addToAllowed": "허용 목록에 추가", + "removeFromAllowed": "허용 목록에서 제거", + "addToDenied": "거부 목록에 추가", + "removeFromDenied": "거부 목록에서 제거", + "abortCommand": "명령 실행 중단", + "expandOutput": "출력 확장", + "collapseOutput": "출력 축소", + "expandManagement": "명령 관리 섹션 확장", + "collapseManagement": "명령 관리 섹션 축소" + }, "response": "응답", "arguments": "인수", "mcp": { diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index 1d11db2668..7f295a0b3d 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -187,6 +187,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo heeft broncode-definitienamen bekeken die in deze map (buiten werkruimte) worden gebruikt:" }, "commandOutput": "Commando-uitvoer", + "commandExecution": { + "running": "Lopend", + "pid": "PID: {{pid}}", + "exited": "Afgesloten ({{exitCode}})", + "manageCommands": "Beheer Commando Toestemmingen", + "commandManagementDescription": "Beheer commando toestemmingen: Klik op ✓ om automatische uitvoering toe te staan, ✗ om uitvoering te weigeren. Patronen kunnen worden in- of uitgeschakeld of uit lijsten worden verwijderd. Bekijk alle instellingen", + "addToAllowed": "Toevoegen aan toegestane lijst", + "removeFromAllowed": "Verwijderen van toegestane lijst", + "addToDenied": "Toevoegen aan geweigerde lijst", + "removeFromDenied": "Verwijderen van geweigerde lijst", + "abortCommand": "Commando-uitvoering afbreken", + "expandOutput": "Uitvoer uitvouwen", + "collapseOutput": "Uitvoer samenvouwen", + "expandManagement": "Beheersectie voor commando's uitvouwen", + "collapseManagement": "Beheersectie voor commando's samenvouwen" + }, "response": "Antwoord", "arguments": "Argumenten", "mcp": { diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 88c58418ad..b0a9d16e6a 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo zobaczył nazwy definicji kodu źródłowego używane w tym katalogu (poza obszarem roboczym):" }, "commandOutput": "Wyjście polecenia", + "commandExecution": { + "running": "Wykonywanie", + "pid": "PID: {{pid}}", + "exited": "Zakończono ({{exitCode}})", + "manageCommands": "Zarządzaj uprawnieniami poleceń", + "commandManagementDescription": "Zarządzaj uprawnieniami poleceń: Kliknij ✓, aby zezwolić na automatyczne wykonanie, ✗, aby odmówić wykonania. Wzorce można włączać/wyłączać lub usuwać z listy. Zobacz wszystkie ustawienia", + "addToAllowed": "Dodaj do listy dozwolonych", + "removeFromAllowed": "Usuń z listy dozwolonych", + "addToDenied": "Dodaj do listy odrzuconych", + "removeFromDenied": "Usuń z listy odrzuconych", + "abortCommand": "Przerwij wykonywanie polecenia", + "expandOutput": "Rozwiń wyjście", + "collapseOutput": "Zwiń wyjście", + "expandManagement": "Rozwiń sekcję zarządzania poleceniami", + "collapseManagement": "Zwiń sekcję zarządzania poleceniami" + }, "response": "Odpowiedź", "arguments": "Argumenty", "mcp": { diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 3784d6cc64..e73eabfb93 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo visualizou nomes de definição de código-fonte usados neste diretório (fora do espaço de trabalho):" }, "commandOutput": "Saída do comando", + "commandExecution": { + "running": "Executando", + "pid": "PID: {{pid}}", + "exited": "Encerrado ({{exitCode}})", + "manageCommands": "Gerenciar Permissões de Comando", + "commandManagementDescription": "Gerencie as permissões de comando: Clique em ✓ para permitir a execução automática, ✗ para negar a execução. Os padrões podem ser ativados/desativados ou removidos das listas. Ver todas as configurações", + "addToAllowed": "Adicionar à lista de permitidos", + "removeFromAllowed": "Remover da lista de permitidos", + "addToDenied": "Adicionar à lista de negados", + "removeFromDenied": "Remover da lista de negados", + "abortCommand": "Abortar execução do comando", + "expandOutput": "Expandir saída", + "collapseOutput": "Recolher saída", + "expandManagement": "Expandir seção de gerenciamento de comandos", + "collapseManagement": "Recolher seção de gerenciamento de comandos" + }, "response": "Resposta", "arguments": "Argumentos", "mcp": { diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index 0660d3e1d6..01987bdda1 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -187,6 +187,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo просмотрел имена определений исходного кода в этой директории (вне рабочего пространства):" }, "commandOutput": "Вывод команды", + "commandExecution": { + "running": "Выполняется", + "pid": "PID: {{pid}}", + "exited": "Завершено ({{exitCode}})", + "manageCommands": "Управление разрешениями команд", + "commandManagementDescription": "Управляйте разрешениями команд: Нажмите ✓, чтобы разрешить автоматическое выполнение, ✗, чтобы запретить выполнение. Шаблоны можно включать/выключать или удалять из списков. Просмотреть все настройки", + "addToAllowed": "Добавить в список разрешенных", + "removeFromAllowed": "Удалить из списка разрешенных", + "addToDenied": "Добавить в список запрещенных", + "removeFromDenied": "Удалить из списка запрещенных", + "abortCommand": "Прервать выполнение команды", + "expandOutput": "Развернуть вывод", + "collapseOutput": "Свернуть вывод", + "expandManagement": "Развернуть раздел управления командами", + "collapseManagement": "Свернуть раздел управления командами" + }, "response": "Ответ", "arguments": "Аргументы", "mcp": { diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 75bc126dff..88e5fea67e 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo bu dizinde (çalışma alanı dışında) kullanılan kaynak kod tanımlama isimlerini görüntüledi:" }, "commandOutput": "Komut Çıktısı", + "commandExecution": { + "running": "Çalışıyor", + "pid": "PID: {{pid}}", + "exited": "Çıkıldı ({{exitCode}})", + "manageCommands": "Komut İzinlerini Yönet", + "commandManagementDescription": "Komut izinlerini yönetin: Otomatik yürütmeye izin vermek için ✓'e, yürütmeyi reddetmek için ✗'e tıklayın. Desenler açılıp kapatılabilir veya listelerden kaldırılabilir. Tüm ayarları görüntüle", + "addToAllowed": "İzin verilenler listesine ekle", + "removeFromAllowed": "İzin verilenler listesinden kaldır", + "addToDenied": "Reddedilenler listesine ekle", + "removeFromDenied": "Reddedilenler listesinden kaldır", + "abortCommand": "Komut yürütmeyi iptal et", + "expandOutput": "Çıktıyı genişlet", + "collapseOutput": "Çıktıyı daralt", + "expandManagement": "Komut yönetimi bölümünü genişlet", + "collapseManagement": "Komut yönetimi bölümünü daralt" + }, "response": "Yanıt", "arguments": "Argümanlar", "mcp": { diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 944eabcb94..a0562a85de 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo đã xem tên định nghĩa mã nguồn được sử dụng trong thư mục này (ngoài không gian làm việc):" }, "commandOutput": "Kết quả lệnh", + "commandExecution": { + "running": "Đang chạy", + "pid": "PID: {{pid}}", + "exited": "Đã thoát ({{exitCode}})", + "manageCommands": "Quản lý quyền lệnh", + "commandManagementDescription": "Quản lý quyền lệnh: Nhấp vào ✓ để cho phép tự động thực thi, ✗ để từ chối thực thi. Các mẫu có thể được bật/tắt hoặc xóa khỏi danh sách. Xem tất cả cài đặt", + "addToAllowed": "Thêm vào danh sách cho phép", + "removeFromAllowed": "Xóa khỏi danh sách cho phép", + "addToDenied": "Thêm vào danh sách từ chối", + "removeFromDenied": "Xóa khỏi danh sách từ chối", + "abortCommand": "Hủy bỏ thực thi lệnh", + "expandOutput": "Mở rộng kết quả", + "collapseOutput": "Thu gọn kết quả", + "expandManagement": "Mở rộng phần quản lý lệnh", + "collapseManagement": "Thu gọn phần quản lý lệnh" + }, "response": "Phản hồi", "arguments": "Tham số", "mcp": { diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 616cd14fec..fe5c0bc768 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo已查看此目录中使用的源代码定义名称(工作区外):" }, "commandOutput": "命令输出", + "commandExecution": { + "running": "正在运行", + "pid": "PID: {{pid}}", + "exited": "已退出 ({{exitCode}})", + "manageCommands": "管理命令权限", + "commandManagementDescription": "管理命令权限:点击 ✓ 允许自动执行,点击 ✗ 拒绝执行。可以打开/关闭模式或从列表中删除。查看所有设置", + "addToAllowed": "添加到允许列表", + "removeFromAllowed": "从允许列表中删除", + "addToDenied": "添加到拒绝列表", + "removeFromDenied": "从拒绝列表中删除", + "abortCommand": "中止命令执行", + "expandOutput": "展开输出", + "collapseOutput": "折叠输出", + "expandManagement": "展开命令管理部分", + "collapseManagement": "折叠命令管理部分" + }, "response": "响应", "arguments": "参数", "mcp": { diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 662421900e..8623ad2b0e 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -192,6 +192,22 @@ "didViewDefinitionsOutsideWorkspace": "Roo 已檢視此目錄(工作區外)中使用的原始碼定義名稱:" }, "commandOutput": "命令輸出", + "commandExecution": { + "running": "正在執行", + "pid": "PID: {{pid}}", + "exited": "已退出 ({{exitCode}})", + "manageCommands": "管理命令權限", + "commandManagementDescription": "管理命令權限:點擊 ✓ 允許自動執行,點擊 ✗ 拒絕執行。可以開啟/關閉模式或從清單中刪除。檢視所有設定", + "addToAllowed": "新增至允許清單", + "removeFromAllowed": "從允許清單中移除", + "addToDenied": "新增至拒絕清單", + "removeFromDenied": "從拒絕清單中移除", + "abortCommand": "中止命令執行", + "expandOutput": "展開輸出", + "collapseOutput": "折疊輸出", + "expandManagement": "展開命令管理部分", + "collapseManagement": "折疊命令管理部分" + }, "response": "回應", "arguments": "參數", "mcp": { diff --git a/webview-ui/src/utils/__tests__/command-parser.spec.ts b/webview-ui/src/utils/__tests__/command-parser.spec.ts new file mode 100644 index 0000000000..05303f87fc --- /dev/null +++ b/webview-ui/src/utils/__tests__/command-parser.spec.ts @@ -0,0 +1,137 @@ +import { describe, it, expect } from "vitest" +import { extractPatternsFromCommand } from "../command-parser" + +describe("extractPatternsFromCommand", () => { + it("should extract simple command pattern", () => { + const patterns = extractPatternsFromCommand("ls") + expect(patterns).toEqual(["ls"]) + }) + + it("should extract command with subcommand", () => { + const patterns = extractPatternsFromCommand("git push origin main") + expect(patterns).toEqual(["git", "git push", "git push origin"]) + }) + + it("should stop at flags", () => { + const patterns = extractPatternsFromCommand("git commit -m 'test'") + expect(patterns).toEqual(["git", "git commit"]) + }) + + it("should stop at paths", () => { + const patterns = extractPatternsFromCommand("cd /usr/local/bin") + expect(patterns).toEqual(["cd"]) + }) + + it("should handle pipes", () => { + const patterns = extractPatternsFromCommand("ls -la | grep test") + expect(patterns).toEqual(["grep", "grep test", "ls"]) + }) + + it("should handle && operator", () => { + const patterns = extractPatternsFromCommand("npm install && git push origin main") + expect(patterns).toEqual(["git", "git push", "git push origin", "npm", "npm install"]) + }) + + it("should handle || operator", () => { + const patterns = extractPatternsFromCommand("npm test || npm run test:ci") + expect(patterns).toEqual(["npm", "npm run", "npm test"]) + }) + + it("should handle semicolon separator", () => { + const patterns = extractPatternsFromCommand("cd src; npm install") + expect(patterns).toEqual(["cd", "cd src", "npm", "npm install"]) + }) + + it("should skip numeric commands", () => { + const patterns = extractPatternsFromCommand("0 total") + expect(patterns).toEqual([]) + }) + + it("should handle empty command", () => { + const patterns = extractPatternsFromCommand("") + expect(patterns).toEqual([]) + }) + + it("should handle null/undefined", () => { + expect(extractPatternsFromCommand(null as any)).toEqual([]) + expect(extractPatternsFromCommand(undefined as any)).toEqual([]) + }) + + it("should handle scripts", () => { + const patterns = extractPatternsFromCommand("./script.sh --verbose") + expect(patterns).toEqual(["./script.sh"]) + }) + + it("should handle paths with dots", () => { + const patterns = extractPatternsFromCommand("git add .") + expect(patterns).toEqual(["git", "git add"]) + }) + + it("should handle paths with tilde", () => { + const patterns = extractPatternsFromCommand("cd ~/projects") + expect(patterns).toEqual(["cd"]) + }) + + it("should handle colons in arguments", () => { + const patterns = extractPatternsFromCommand("docker run image:tag") + expect(patterns).toEqual(["docker", "docker run"]) + }) + + it("should return sorted patterns", () => { + const patterns = extractPatternsFromCommand("npm run build && git push") + expect(patterns).toEqual(["git", "git push", "npm", "npm run", "npm run build"]) + }) + + it("should handle complex command with multiple operators", () => { + const patterns = extractPatternsFromCommand("npm install && npm test | grep success || echo 'failed'") + expect(patterns).toContain("npm") + expect(patterns).toContain("npm install") + expect(patterns).toContain("npm test") + expect(patterns).toContain("grep") + expect(patterns).toContain("echo") + }) + + it("should handle malformed commands gracefully", () => { + const patterns = extractPatternsFromCommand("echo 'unclosed quote") + expect(patterns).toContain("echo") + }) + + it("should not treat package managers specially", () => { + const patterns = extractPatternsFromCommand("npm run build") + expect(patterns).toEqual(["npm", "npm run", "npm run build"]) + // Now includes "npm run build" with 3-level extraction + }) + + it("should extract at most 3 levels", () => { + const patterns = extractPatternsFromCommand("git push origin main --force") + expect(patterns).toEqual(["git", "git push", "git push origin"]) + // Should NOT include deeper levels beyond 3 + }) + + it("should handle multi-level commands like gh pr", () => { + const patterns = extractPatternsFromCommand("gh pr checkout 123") + expect(patterns).toEqual(["gh", "gh pr", "gh pr checkout"]) + }) + + it("should extract 3 levels for git remote add", () => { + const patterns = extractPatternsFromCommand("git remote add origin https://github.com/user/repo.git") + expect(patterns).toEqual(["git", "git remote", "git remote add"]) + }) + + it("should extract 3 levels for npm run build", () => { + const patterns = extractPatternsFromCommand("npm run build --production") + expect(patterns).toEqual(["npm", "npm run", "npm run build"]) + }) + + it("should stop at file extensions even at third level", () => { + const patterns = extractPatternsFromCommand("node scripts test.js") + expect(patterns).toEqual(["node", "node scripts"]) + // Should NOT include "node scripts test.js" because of .js + }) + + it("should stop at flags at any level", () => { + const patterns = extractPatternsFromCommand("docker run -it ubuntu") + expect(patterns).toEqual(["docker", "docker run"]) + // Stops at -it flag + }) +}) diff --git a/webview-ui/src/utils/command-parser.ts b/webview-ui/src/utils/command-parser.ts new file mode 100644 index 0000000000..bce464f9ad --- /dev/null +++ b/webview-ui/src/utils/command-parser.ts @@ -0,0 +1,68 @@ +import { parse } from "shell-quote" + +/** + * Extract command patterns from a command string. + * Returns at most 3 levels: base command, command + first argument, and command + first two arguments. + * Stops at flags (-), paths (/\~), file extensions (.ext), or special characters (:). + */ +export function extractPatternsFromCommand(command: string): string[] { + if (!command?.trim()) return [] + + const patterns = new Set() + + try { + const parsed = parse(command) + const commandSeparators = new Set(["|", "&&", "||", ";"]) + let currentTokens: string[] = [] + + for (const token of parsed) { + if (typeof token === "object" && "op" in token && commandSeparators.has(token.op)) { + // Process accumulated tokens as a command + if (currentTokens.length > 0) { + extractFromTokens(currentTokens, patterns) + currentTokens = [] + } + } else if (typeof token === "string") { + currentTokens.push(token) + } + } + + // Process any remaining tokens + if (currentTokens.length > 0) { + extractFromTokens(currentTokens, patterns) + } + } catch (error) { + console.warn("Failed to parse command:", error) + // Fallback: just extract the first word + const firstWord = command.trim().split(/\s+/)[0] + if (firstWord) patterns.add(firstWord) + } + + return Array.from(patterns).sort() +} + +function extractFromTokens(tokens: string[], patterns: Set): void { + if (tokens.length === 0 || typeof tokens[0] !== "string") return + + const mainCmd = tokens[0] + + // Skip numeric commands like "0" from "0 total" + if (/^\d+$/.test(mainCmd)) return + + patterns.add(mainCmd) + + // Breaking expressions that indicate we should stop looking for subcommands + const breakingExps = [/^-/, /[\\/:.~ ]/] + + // Extract up to 3 levels maximum + const maxLevels = Math.min(tokens.length, 3) + + for (let i = 1; i < maxLevels; i++) { + const arg = tokens[i] + + if (typeof arg !== "string" || breakingExps.some((re) => re.test(arg))) break + + const pattern = tokens.slice(0, i + 1).join(" ") + patterns.add(pattern.trim()) + } +} From c61bd95bbe010dae6520384fbd818353e1051677 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Fri, 25 Jul 2025 16:51:45 -0400 Subject: [PATCH 09/44] fix: restore list styles for markdown lists in chat interface (#6095) Co-authored-by: Roo Code Co-authored-by: Daniel Riccio --- .../src/suite/markdown-lists.test.ts | 168 ++++++++++++++++++ .../src/components/common/MarkdownBlock.tsx | 25 +++ .../common/__tests__/MarkdownBlock.spec.tsx | 80 +++++++++ webview-ui/src/components/settings/styles.ts | 25 +++ 4 files changed, 298 insertions(+) create mode 100644 apps/vscode-e2e/src/suite/markdown-lists.test.ts diff --git a/apps/vscode-e2e/src/suite/markdown-lists.test.ts b/apps/vscode-e2e/src/suite/markdown-lists.test.ts new file mode 100644 index 0000000000..a229d9c270 --- /dev/null +++ b/apps/vscode-e2e/src/suite/markdown-lists.test.ts @@ -0,0 +1,168 @@ +import * as assert from "assert" + +import type { ClineMessage } from "@roo-code/types" + +import { waitUntilCompleted } from "./utils" +import { setDefaultSuiteTimeout } from "./test-utils" + +suite("Markdown List Rendering", function () { + setDefaultSuiteTimeout(this) + + test("Should render unordered lists with bullets in chat", async () => { + const api = globalThis.api + + const messages: ClineMessage[] = [] + + api.on("message", ({ message }: { message: ClineMessage }) => { + if (message.type === "say" && message.partial === false) { + messages.push(message) + } + }) + + const taskId = await api.startNewTask({ + configuration: { mode: "ask", alwaysAllowModeSwitch: true, autoApprovalEnabled: true }, + text: "Please show me an example of an unordered list with the following items: Apple, Banana, Orange", + }) + + await waitUntilCompleted({ api, taskId }) + + // Find the message containing the list + const listMessage = messages.find( + ({ say, text }) => + (say === "completion_result" || say === "text") && + text?.includes("Apple") && + text?.includes("Banana") && + text?.includes("Orange"), + ) + + assert.ok(listMessage, "Should have a message containing the list items") + + // The rendered markdown should contain list markers + const messageText = listMessage?.text || "" + assert.ok( + messageText.includes("- Apple") || messageText.includes("* Apple") || messageText.includes("• Apple"), + "List items should be rendered with bullet points", + ) + }) + + test("Should render ordered lists with numbers in chat", async () => { + const api = globalThis.api + + const messages: ClineMessage[] = [] + + api.on("message", ({ message }: { message: ClineMessage }) => { + if (message.type === "say" && message.partial === false) { + messages.push(message) + } + }) + + const taskId = await api.startNewTask({ + configuration: { mode: "ask", alwaysAllowModeSwitch: true, autoApprovalEnabled: true }, + text: "Please show me a numbered list with three steps: First step, Second step, Third step", + }) + + await waitUntilCompleted({ api, taskId }) + + // Find the message containing the numbered list + const listMessage = messages.find( + ({ say, text }) => + (say === "completion_result" || say === "text") && + text?.includes("First step") && + text?.includes("Second step") && + text?.includes("Third step"), + ) + + assert.ok(listMessage, "Should have a message containing the numbered list") + + // The rendered markdown should contain numbered markers + const messageText = listMessage?.text || "" + assert.ok( + messageText.includes("1. First step") || messageText.includes("1) First step"), + "List items should be rendered with numbers", + ) + }) + + test("Should render nested lists with proper hierarchy", async () => { + const api = globalThis.api + + const messages: ClineMessage[] = [] + + api.on("message", ({ message }: { message: ClineMessage }) => { + if (message.type === "say" && message.partial === false) { + messages.push(message) + } + }) + + const taskId = await api.startNewTask({ + configuration: { mode: "ask", alwaysAllowModeSwitch: true, autoApprovalEnabled: true }, + text: "Please create a nested list with 'Main item' having two sub-items: 'Sub-item A' and 'Sub-item B'", + }) + + await waitUntilCompleted({ api, taskId }) + + // Find the message containing the nested list + const listMessage = messages.find( + ({ say, text }) => + (say === "completion_result" || say === "text") && + text?.includes("Main item") && + text?.includes("Sub-item A") && + text?.includes("Sub-item B"), + ) + + assert.ok(listMessage, "Should have a message containing the nested list") + + // The rendered markdown should show hierarchy through indentation + const messageText = listMessage?.text || "" + + // Check for main item + assert.ok( + messageText.includes("- Main item") || + messageText.includes("* Main item") || + messageText.includes("• Main item"), + "Main list item should be rendered", + ) + + // Check for sub-items with indentation (typically 2-4 spaces or a tab) + assert.ok( + messageText.match(/\s{2,}- Sub-item A/) || + messageText.match(/\s{2,}\* Sub-item A/) || + messageText.match(/\s{2,}• Sub-item A/) || + messageText.includes("\t- Sub-item A") || + messageText.includes("\t* Sub-item A") || + messageText.includes("\t• Sub-item A"), + "Sub-items should be indented", + ) + }) + + test("Should render mixed ordered and unordered lists", async () => { + const api = globalThis.api + + const messages: ClineMessage[] = [] + + api.on("message", ({ message }: { message: ClineMessage }) => { + if (message.type === "say" && message.partial === false) { + messages.push(message) + } + }) + + const taskId = await api.startNewTask({ + configuration: { mode: "ask", alwaysAllowModeSwitch: true, autoApprovalEnabled: true }, + text: "Please create a list that has both numbered items and bullet points, mixing ordered and unordered lists", + }) + + await waitUntilCompleted({ api, taskId }) + + // Find a message that contains both types of lists + const listMessage = messages.find( + ({ say, text }) => + (say === "completion_result" || say === "text") && + text && + // Check for numbered list markers + (text.includes("1.") || text.includes("1)")) && + // Check for bullet list markers + (text.includes("-") || text.includes("*") || text.includes("•")), + ) + + assert.ok(listMessage, "Should have a message containing mixed list types") + }) +}) diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index fe033efe3f..4c958593aa 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -151,6 +151,31 @@ const StyledMarkdown = styled.div` margin-left: 0; } + ol { + list-style-type: decimal; + } + + ul { + list-style-type: disc; + } + + /* Nested list styles */ + ul ul { + list-style-type: circle; + } + + ul ul ul { + list-style-type: square; + } + + ol ol { + list-style-type: lower-alpha; + } + + ol ol ol { + list-style-type: lower-roman; + } + p { white-space: pre-wrap; } diff --git a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx index ec97e4e667..38a0680b22 100644 --- a/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx +++ b/webview-ui/src/components/common/__tests__/MarkdownBlock.spec.tsx @@ -36,4 +36,84 @@ describe("MarkdownBlock", () => { const paragraph = container.querySelector("p") expect(paragraph?.textContent).toBe("Check out this link: https://example.com.") }) + + it("should render unordered lists with proper styling", async () => { + const markdown = `Here are some items: +- First item +- Second item + - Nested item + - Another nested item` + + const { container } = render() + + // Wait for the content to be processed + await screen.findByText(/Here are some items/, { exact: false }) + + // Check that ul elements exist + const ulElements = container.querySelectorAll("ul") + expect(ulElements.length).toBeGreaterThan(0) + + // Check that list items exist + const liElements = container.querySelectorAll("li") + expect(liElements.length).toBe(4) + + // Verify the text content + expect(screen.getByText("First item")).toBeInTheDocument() + expect(screen.getByText("Second item")).toBeInTheDocument() + expect(screen.getByText("Nested item")).toBeInTheDocument() + expect(screen.getByText("Another nested item")).toBeInTheDocument() + }) + + it("should render ordered lists with proper styling", async () => { + const markdown = `And a numbered list: +1. Step one +2. Step two +3. Step three` + + const { container } = render() + + // Wait for the content to be processed + await screen.findByText(/And a numbered list/, { exact: false }) + + // Check that ol elements exist + const olElements = container.querySelectorAll("ol") + expect(olElements.length).toBe(1) + + // Check that list items exist + const liElements = container.querySelectorAll("li") + expect(liElements.length).toBe(3) + + // Verify the text content + expect(screen.getByText("Step one")).toBeInTheDocument() + expect(screen.getByText("Step two")).toBeInTheDocument() + expect(screen.getByText("Step three")).toBeInTheDocument() + }) + + it("should render nested lists with proper hierarchy", async () => { + const markdown = `Complex list: +1. First level ordered + - Second level unordered + - Another second level + 1. Third level ordered + 2. Another third level +2. Back to first level` + + const { container } = render() + + // Wait for the content to be processed + await screen.findByText(/Complex list/, { exact: false }) + + // Check nested structure + const olElements = container.querySelectorAll("ol") + const ulElements = container.querySelectorAll("ul") + + expect(olElements.length).toBeGreaterThan(0) + expect(ulElements.length).toBeGreaterThan(0) + + // Verify all text is rendered + expect(screen.getByText("First level ordered")).toBeInTheDocument() + expect(screen.getByText("Second level unordered")).toBeInTheDocument() + expect(screen.getByText("Third level ordered")).toBeInTheDocument() + expect(screen.getByText("Back to first level")).toBeInTheDocument() + }) }) diff --git a/webview-ui/src/components/settings/styles.ts b/webview-ui/src/components/settings/styles.ts index 7eac289bb0..8d123f8d41 100644 --- a/webview-ui/src/components/settings/styles.ts +++ b/webview-ui/src/components/settings/styles.ts @@ -32,6 +32,31 @@ export const StyledMarkdown = styled.div` margin-left: 0; } + ol { + list-style-type: decimal; + } + + ul { + list-style-type: disc; + } + + /* Nested list styles */ + ul ul { + list-style-type: circle; + } + + ul ul ul { + list-style-type: square; + } + + ol ol { + list-style-type: lower-alpha; + } + + ol ol ol { + list-style-type: lower-roman; + } + p { white-space: pre-wrap; } From 490538f9dfbe16d0ca9d9e46661243caf125174b Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Fri, 25 Jul 2025 16:49:23 -0500 Subject: [PATCH 10/44] fix: prevent duplicate command patterns by trimming full command (#6224) --- webview-ui/src/components/chat/CommandPatternSelector.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/webview-ui/src/components/chat/CommandPatternSelector.tsx b/webview-ui/src/components/chat/CommandPatternSelector.tsx index 431141fa32..b79d86ccfe 100644 --- a/webview-ui/src/components/chat/CommandPatternSelector.tsx +++ b/webview-ui/src/components/chat/CommandPatternSelector.tsx @@ -33,11 +33,13 @@ export const CommandPatternSelector: React.FC = ({ // Create a combined list with full command first, then patterns const allPatterns = useMemo(() => { - const fullCommandPattern: CommandPattern = { pattern: command } + // Trim the command to ensure consistency with extracted patterns + const trimmedCommand = command.trim() + const fullCommandPattern: CommandPattern = { pattern: trimmedCommand } // Create a set to track unique patterns we've already seen const seenPatterns = new Set() - seenPatterns.add(command) // Add the full command first + seenPatterns.add(trimmedCommand) // Add the trimmed full command first // Filter out any patterns that are duplicates or are the same as the full command const uniquePatterns = patterns.filter((p) => { From 912d7953588c16554d8e996dc3462ff7353df4ea Mon Sep 17 00:00:00 2001 From: Chris Hasson Date: Fri, 25 Jul 2025 15:27:40 -0700 Subject: [PATCH 11/44] fix(chat): Cancel auto-approve timer when editing follow-up suggestion (#6226) Co-authored-by: Chris Hasson --- .changeset/kind-horses-sniff.md | 5 +++++ webview-ui/src/components/chat/FollowUpSuggest.tsx | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 .changeset/kind-horses-sniff.md diff --git a/.changeset/kind-horses-sniff.md b/.changeset/kind-horses-sniff.md new file mode 100644 index 0000000000..9a6afbd167 --- /dev/null +++ b/.changeset/kind-horses-sniff.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Cancel auto-approve timer when editing follow-up suggestion diff --git a/webview-ui/src/components/chat/FollowUpSuggest.tsx b/webview-ui/src/components/chat/FollowUpSuggest.tsx index 1ffe31bbcb..3f5bc3a017 100644 --- a/webview-ui/src/components/chat/FollowUpSuggest.tsx +++ b/webview-ui/src/components/chat/FollowUpSuggest.tsx @@ -134,6 +134,9 @@ export const FollowUpSuggest = ({ className="absolute top-0 right-0 opacity-0 group-hover:opacity-100 transition-opacity" onClick={(e) => { e.stopPropagation() + // Cancel the auto-approve timer when edit button is clicked + setSuggestionSelected(true) + onCancelAutoApproval?.() // Simulate shift-click by directly calling the handler with shiftKey=true. onSuggestionClick?.(suggestion, { ...e, shiftKey: true }) }}> From 31d16dcc33596a6d0f95725be2ec180ea47f413e Mon Sep 17 00:00:00 2001 From: "Thomas G. Lopes" <26071571+TGlide@users.noreply.github.com> Date: Sat, 26 Jul 2025 01:09:09 +0100 Subject: [PATCH 12/44] Hugging Face provider: add more details (#6190) * add more details * format details better * fix tests * fix: address PR #6190 review feedback - Move huggingface-models.ts to src/api/providers/fetchers/huggingface.ts - Remove 'any' types and add proper TypeScript interfaces - Add missing i18n keys and translations for all languages - Replace magic numbers with named constants - Add JSDoc documentation for HuggingFaceModel interface - Improve error handling in API endpoint - Update model capabilities display to match other providers - Remove tool calling display (not used) - Add comprehensive test coverage for new UI features * fix: preserve HuggingFace provider details in model response - Store raw HuggingFace models in cache to preserve provider information - Export getCachedRawHuggingFaceModels to retrieve full model data - Update huggingface-models.ts to return cached raw models when available - Include provider name in model descriptions - Always add provider-specific variants to show all available providers - Remove console.log statements from fetcher --------- Co-authored-by: Daniel Riccio --- packages/types/src/providers/huggingface.ts | 17 ++ packages/types/src/providers/index.ts | 1 + src/api/huggingface-models.ts | 56 ++++- src/api/providers/fetchers/huggingface.ts | 229 ++++++++++++++++++ src/api/providers/huggingface.ts | 35 ++- src/services/huggingface-models.ts | 171 ------------- src/shared/ExtensionMessage.ts | 27 +-- .../settings/providers/HuggingFace.tsx | 156 ++++++++++-- .../providers/__tests__/HuggingFace.spec.tsx | 137 ++++++++++- webview-ui/src/i18n/locales/ca/settings.json | 5 +- webview-ui/src/i18n/locales/de/settings.json | 5 +- webview-ui/src/i18n/locales/en/settings.json | 5 +- webview-ui/src/i18n/locales/es/settings.json | 5 +- webview-ui/src/i18n/locales/fr/settings.json | 5 +- webview-ui/src/i18n/locales/hi/settings.json | 5 +- webview-ui/src/i18n/locales/id/settings.json | 5 +- webview-ui/src/i18n/locales/it/settings.json | 5 +- webview-ui/src/i18n/locales/ja/settings.json | 5 +- webview-ui/src/i18n/locales/ko/settings.json | 5 +- webview-ui/src/i18n/locales/nl/settings.json | 5 +- webview-ui/src/i18n/locales/pl/settings.json | 5 +- .../src/i18n/locales/pt-BR/settings.json | 5 +- webview-ui/src/i18n/locales/ru/settings.json | 5 +- webview-ui/src/i18n/locales/tr/settings.json | 5 +- webview-ui/src/i18n/locales/vi/settings.json | 5 +- .../src/i18n/locales/zh-CN/settings.json | 5 +- .../src/i18n/locales/zh-TW/settings.json | 5 +- 27 files changed, 683 insertions(+), 236 deletions(-) create mode 100644 packages/types/src/providers/huggingface.ts create mode 100644 src/api/providers/fetchers/huggingface.ts delete mode 100644 src/services/huggingface-models.ts diff --git a/packages/types/src/providers/huggingface.ts b/packages/types/src/providers/huggingface.ts new file mode 100644 index 0000000000..d2571a073e --- /dev/null +++ b/packages/types/src/providers/huggingface.ts @@ -0,0 +1,17 @@ +/** + * HuggingFace provider constants + */ + +// Default values for HuggingFace models +export const HUGGINGFACE_DEFAULT_MAX_TOKENS = 2048 +export const HUGGINGFACE_MAX_TOKENS_FALLBACK = 8192 +export const HUGGINGFACE_DEFAULT_CONTEXT_WINDOW = 128_000 + +// UI constants +export const HUGGINGFACE_SLIDER_STEP = 256 +export const HUGGINGFACE_SLIDER_MIN = 1 +export const HUGGINGFACE_TEMPERATURE_MAX_VALUE = 2 + +// API constants +export const HUGGINGFACE_API_URL = "https://router.huggingface.co/v1/models?collection=roocode" +export const HUGGINGFACE_CACHE_DURATION = 1000 * 60 * 60 // 1 hour diff --git a/packages/types/src/providers/index.ts b/packages/types/src/providers/index.ts index e4e506b8a7..f5061f152c 100644 --- a/packages/types/src/providers/index.ts +++ b/packages/types/src/providers/index.ts @@ -6,6 +6,7 @@ export * from "./deepseek.js" export * from "./gemini.js" export * from "./glama.js" export * from "./groq.js" +export * from "./huggingface.js" export * from "./lite-llm.js" export * from "./lm-studio.js" export * from "./mistral.js" diff --git a/src/api/huggingface-models.ts b/src/api/huggingface-models.ts index ec1915d0e3..1ee6369d4b 100644 --- a/src/api/huggingface-models.ts +++ b/src/api/huggingface-models.ts @@ -1,4 +1,10 @@ -import { fetchHuggingFaceModels, type HuggingFaceModel } from "../services/huggingface-models" +import { + getHuggingFaceModels as fetchModels, + getCachedRawHuggingFaceModels, + type HuggingFaceModel, +} from "./providers/fetchers/huggingface" +import axios from "axios" +import { HUGGINGFACE_API_URL } from "@roo-code/types" export interface HuggingFaceModelsResponse { models: HuggingFaceModel[] @@ -7,11 +13,49 @@ export interface HuggingFaceModelsResponse { } export async function getHuggingFaceModels(): Promise { - const models = await fetchHuggingFaceModels() + try { + // First, trigger the fetch to populate cache + await fetchModels() - return { - models, - cached: false, // We could enhance this to track if data came from cache - timestamp: Date.now(), + // Get the raw models from cache + const cachedRawModels = getCachedRawHuggingFaceModels() + + if (cachedRawModels) { + return { + models: cachedRawModels, + cached: true, + timestamp: Date.now(), + } + } + + // If no cached raw models, fetch directly from API + const response = await axios.get(HUGGINGFACE_API_URL, { + headers: { + "Upgrade-Insecure-Requests": "1", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Site": "none", + "Sec-Fetch-User": "?1", + Priority: "u=0, i", + Pragma: "no-cache", + "Cache-Control": "no-cache", + }, + timeout: 10000, + }) + + const models = response.data?.data || [] + + return { + models, + cached: false, + timestamp: Date.now(), + } + } catch (error) { + console.error("Failed to get HuggingFace models:", error) + return { + models: [], + cached: false, + timestamp: Date.now(), + } } } diff --git a/src/api/providers/fetchers/huggingface.ts b/src/api/providers/fetchers/huggingface.ts new file mode 100644 index 0000000000..16c33b9e04 --- /dev/null +++ b/src/api/providers/fetchers/huggingface.ts @@ -0,0 +1,229 @@ +import axios from "axios" +import { z } from "zod" +import type { ModelInfo } from "@roo-code/types" +import { + HUGGINGFACE_API_URL, + HUGGINGFACE_CACHE_DURATION, + HUGGINGFACE_DEFAULT_MAX_TOKENS, + HUGGINGFACE_DEFAULT_CONTEXT_WINDOW, +} from "@roo-code/types" +import type { ModelRecord } from "../../../shared/api" + +/** + * HuggingFace Provider Schema + */ +const huggingFaceProviderSchema = z.object({ + provider: z.string(), + status: z.enum(["live", "staging", "error"]), + supports_tools: z.boolean().optional(), + supports_structured_output: z.boolean().optional(), + context_length: z.number().optional(), + pricing: z + .object({ + input: z.number(), + output: z.number(), + }) + .optional(), +}) + +/** + * Represents a provider that can serve a HuggingFace model + * @property provider - The provider identifier (e.g., "sambanova", "together") + * @property status - The current status of the provider + * @property supports_tools - Whether the provider supports tool/function calling + * @property supports_structured_output - Whether the provider supports structured output + * @property context_length - The maximum context length supported by this provider + * @property pricing - The pricing information for input/output tokens + */ +export type HuggingFaceProvider = z.infer + +/** + * HuggingFace Model Schema + */ +const huggingFaceModelSchema = z.object({ + id: z.string(), + object: z.literal("model"), + created: z.number(), + owned_by: z.string(), + providers: z.array(huggingFaceProviderSchema), +}) + +/** + * Represents a HuggingFace model available through the router API + * @property id - The unique identifier of the model + * @property object - The object type (always "model") + * @property created - Unix timestamp of when the model was created + * @property owned_by - The organization that owns the model + * @property providers - List of providers that can serve this model + */ +export type HuggingFaceModel = z.infer + +/** + * HuggingFace API Response Schema + */ +const huggingFaceApiResponseSchema = z.object({ + object: z.string(), + data: z.array(huggingFaceModelSchema), +}) + +/** + * Represents the response from the HuggingFace router API + * @property object - The response object type + * @property data - Array of available models + */ +type HuggingFaceApiResponse = z.infer + +/** + * Cache entry for storing fetched models + * @property data - The cached model records + * @property timestamp - Unix timestamp of when the cache was last updated + */ +interface CacheEntry { + data: ModelRecord + rawModels?: HuggingFaceModel[] + timestamp: number +} + +let cache: CacheEntry | null = null + +/** + * Parse a HuggingFace model into ModelInfo format + * @param model - The HuggingFace model to parse + * @param provider - Optional specific provider to use for capabilities + * @returns ModelInfo object compatible with the application's model system + */ +function parseHuggingFaceModel(model: HuggingFaceModel, provider?: HuggingFaceProvider): ModelInfo { + // Use provider-specific values if available, otherwise find first provider with values + const contextLength = + provider?.context_length || + model.providers.find((p) => p.context_length)?.context_length || + HUGGINGFACE_DEFAULT_CONTEXT_WINDOW + + const pricing = provider?.pricing || model.providers.find((p) => p.pricing)?.pricing + + // Include provider name in description if specific provider is given + const description = provider ? `${model.id} via ${provider.provider}` : `${model.id} via HuggingFace` + + return { + maxTokens: Math.min(contextLength, HUGGINGFACE_DEFAULT_MAX_TOKENS), + contextWindow: contextLength, + supportsImages: false, // HuggingFace API doesn't provide this info yet + supportsPromptCache: false, + supportsComputerUse: false, + inputPrice: pricing?.input, + outputPrice: pricing?.output, + description, + } +} + +/** + * Fetches available models from HuggingFace + * + * @returns A promise that resolves to a record of model IDs to model info + * @throws Will throw an error if the request fails + */ +export async function getHuggingFaceModels(): Promise { + const now = Date.now() + + // Check cache + if (cache && now - cache.timestamp < HUGGINGFACE_CACHE_DURATION) { + return cache.data + } + + const models: ModelRecord = {} + + try { + const response = await axios.get(HUGGINGFACE_API_URL, { + headers: { + "Upgrade-Insecure-Requests": "1", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Site": "none", + "Sec-Fetch-User": "?1", + Priority: "u=0, i", + Pragma: "no-cache", + "Cache-Control": "no-cache", + }, + timeout: 10000, // 10 second timeout + }) + + const result = huggingFaceApiResponseSchema.safeParse(response.data) + + if (!result.success) { + console.error("HuggingFace models response validation failed:", result.error.format()) + throw new Error("Invalid response format from HuggingFace API") + } + + const validModels = result.data.data.filter((model) => model.providers.length > 0) + + for (const model of validModels) { + // Add the base model + models[model.id] = parseHuggingFaceModel(model) + + // Add provider-specific variants for all live providers + for (const provider of model.providers) { + if (provider.status === "live") { + const providerKey = `${model.id}:${provider.provider}` + const providerModel = parseHuggingFaceModel(model, provider) + + // Always add provider variants to show all available providers + models[providerKey] = providerModel + } + } + } + + // Update cache + cache = { + data: models, + rawModels: validModels, + timestamp: now, + } + + return models + } catch (error) { + console.error("Error fetching HuggingFace models:", error) + + // Return cached data if available + if (cache) { + return cache.data + } + + // Re-throw with more context + if (axios.isAxiosError(error)) { + if (error.response) { + throw new Error( + `Failed to fetch HuggingFace models: ${error.response.status} ${error.response.statusText}`, + ) + } else if (error.request) { + throw new Error( + "Failed to fetch HuggingFace models: No response from server. Check your internet connection.", + ) + } + } + + throw new Error( + `Failed to fetch HuggingFace models: ${error instanceof Error ? error.message : "Unknown error"}`, + ) + } +} + +/** + * Get cached models without making an API request + */ +export function getCachedHuggingFaceModels(): ModelRecord | null { + return cache?.data || null +} + +/** + * Get cached raw models for UI display + */ +export function getCachedRawHuggingFaceModels(): HuggingFaceModel[] | null { + return cache?.rawModels || null +} + +/** + * Clear the cache + */ +export function clearHuggingFaceCache(): void { + cache = null +} diff --git a/src/api/providers/huggingface.ts b/src/api/providers/huggingface.ts index 913605bd92..aa158654c9 100644 --- a/src/api/providers/huggingface.ts +++ b/src/api/providers/huggingface.ts @@ -1,16 +1,18 @@ import OpenAI from "openai" import { Anthropic } from "@anthropic-ai/sdk" -import type { ApiHandlerOptions } from "../../shared/api" +import type { ApiHandlerOptions, ModelRecord } from "../../shared/api" import { ApiStream } from "../transform/stream" import { convertToOpenAiMessages } from "../transform/openai-format" import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index" import { DEFAULT_HEADERS } from "./constants" import { BaseProvider } from "./base-provider" +import { getHuggingFaceModels, getCachedHuggingFaceModels } from "./fetchers/huggingface" export class HuggingFaceHandler extends BaseProvider implements SingleCompletionHandler { private client: OpenAI private options: ApiHandlerOptions + private modelCache: ModelRecord | null = null constructor(options: ApiHandlerOptions) { super() @@ -25,6 +27,20 @@ export class HuggingFaceHandler extends BaseProvider implements SingleCompletion apiKey: this.options.huggingFaceApiKey, defaultHeaders: DEFAULT_HEADERS, }) + + // Try to get cached models first + this.modelCache = getCachedHuggingFaceModels() + + // Fetch models asynchronously + this.fetchModels() + } + + private async fetchModels() { + try { + this.modelCache = await getHuggingFaceModels() + } catch (error) { + console.error("Failed to fetch HuggingFace models:", error) + } } override async *createMessage( @@ -43,6 +59,11 @@ export class HuggingFaceHandler extends BaseProvider implements SingleCompletion stream_options: { include_usage: true }, } + // Add max_tokens if specified + if (this.options.includeMaxTokens && this.options.modelMaxTokens) { + params.max_tokens = this.options.modelMaxTokens + } + const stream = await this.client.chat.completions.create(params) for await (const chunk of stream) { @@ -86,6 +107,18 @@ export class HuggingFaceHandler extends BaseProvider implements SingleCompletion override getModel() { const modelId = this.options.huggingFaceModelId || "meta-llama/Llama-3.3-70B-Instruct" + + // Try to get model info from cache + const modelInfo = this.modelCache?.[modelId] + + if (modelInfo) { + return { + id: modelId, + info: modelInfo, + } + } + + // Fallback to default values if model not found in cache return { id: modelId, info: { diff --git a/src/services/huggingface-models.ts b/src/services/huggingface-models.ts deleted file mode 100644 index 9c0bc406f9..0000000000 --- a/src/services/huggingface-models.ts +++ /dev/null @@ -1,171 +0,0 @@ -export interface HuggingFaceModel { - _id: string - id: string - inferenceProviderMapping: InferenceProviderMapping[] - trendingScore: number - config: ModelConfig - tags: string[] - pipeline_tag: "text-generation" | "image-text-to-text" - library_name?: string -} - -export interface InferenceProviderMapping { - provider: string - providerId: string - status: "live" | "staging" | "error" - task: "conversational" -} - -export interface ModelConfig { - architectures: string[] - model_type: string - tokenizer_config?: { - chat_template?: string | Array<{ name: string; template: string }> - model_max_length?: number - } -} - -interface HuggingFaceApiParams { - pipeline_tag?: "text-generation" | "image-text-to-text" - filter: string - inference_provider: string - limit: number - expand: string[] -} - -const DEFAULT_PARAMS: HuggingFaceApiParams = { - filter: "conversational", - inference_provider: "all", - limit: 100, - expand: [ - "inferenceProviderMapping", - "config", - "library_name", - "pipeline_tag", - "tags", - "mask_token", - "trendingScore", - ], -} - -const BASE_URL = "https://huggingface.co/api/models" -const CACHE_DURATION = 1000 * 60 * 60 // 1 hour - -interface CacheEntry { - data: HuggingFaceModel[] - timestamp: number - status: "success" | "partial" | "error" -} - -let cache: CacheEntry | null = null - -function buildApiUrl(params: HuggingFaceApiParams): string { - const url = new URL(BASE_URL) - - // Add simple params - Object.entries(params).forEach(([key, value]) => { - if (!Array.isArray(value)) { - url.searchParams.append(key, String(value)) - } - }) - - // Handle array params specially - params.expand.forEach((item) => { - url.searchParams.append("expand[]", item) - }) - - return url.toString() -} - -const headers: HeadersInit = { - "Upgrade-Insecure-Requests": "1", - "Sec-Fetch-Dest": "document", - "Sec-Fetch-Mode": "navigate", - "Sec-Fetch-Site": "none", - "Sec-Fetch-User": "?1", - Priority: "u=0, i", - Pragma: "no-cache", - "Cache-Control": "no-cache", -} - -const requestInit: RequestInit = { - credentials: "include", - headers, - method: "GET", - mode: "cors", -} - -export async function fetchHuggingFaceModels(): Promise { - const now = Date.now() - - // Check cache - if (cache && now - cache.timestamp < CACHE_DURATION) { - console.log("Using cached Hugging Face models") - return cache.data - } - - try { - console.log("Fetching Hugging Face models from API...") - - // Fetch both text-generation and image-text-to-text models in parallel - const [textGenResponse, imgTextResponse] = await Promise.allSettled([ - fetch(buildApiUrl({ ...DEFAULT_PARAMS, pipeline_tag: "text-generation" }), requestInit), - fetch(buildApiUrl({ ...DEFAULT_PARAMS, pipeline_tag: "image-text-to-text" }), requestInit), - ]) - - let textGenModels: HuggingFaceModel[] = [] - let imgTextModels: HuggingFaceModel[] = [] - let hasErrors = false - - // Process text-generation models - if (textGenResponse.status === "fulfilled" && textGenResponse.value.ok) { - textGenModels = await textGenResponse.value.json() - } else { - console.error("Failed to fetch text-generation models:", textGenResponse) - hasErrors = true - } - - // Process image-text-to-text models - if (imgTextResponse.status === "fulfilled" && imgTextResponse.value.ok) { - imgTextModels = await imgTextResponse.value.json() - } else { - console.error("Failed to fetch image-text-to-text models:", imgTextResponse) - hasErrors = true - } - - // Combine and filter models - const allModels = [...textGenModels, ...imgTextModels] - .filter((model) => model.inferenceProviderMapping.length > 0) - .sort((a, b) => a.id.toLowerCase().localeCompare(b.id.toLowerCase())) - - // Update cache - cache = { - data: allModels, - timestamp: now, - status: hasErrors ? "partial" : "success", - } - - console.log(`Fetched ${allModels.length} Hugging Face models (status: ${cache.status})`) - return allModels - } catch (error) { - console.error("Error fetching Hugging Face models:", error) - - // Return cached data if available - if (cache) { - console.log("Using stale cached data due to fetch error") - cache.status = "error" - return cache.data - } - - // No cache available, return empty array - return [] - } -} - -export function getCachedModels(): HuggingFaceModel[] | null { - return cache?.data || null -} - -export function clearCache(): void { - cache = null -} diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 000762e317..bdd32c4e36 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -138,26 +138,21 @@ export interface ExtensionMessage { lmStudioModels?: string[] vsCodeLmModels?: { vendor?: string; family?: string; version?: string; id?: string }[] huggingFaceModels?: Array<{ - _id: string id: string - inferenceProviderMapping: Array<{ + object: string + created: number + owned_by: string + providers: Array<{ provider: string - providerId: string status: "live" | "staging" | "error" - task: "conversational" - }> - trendingScore: number - config: { - architectures: string[] - model_type: string - tokenizer_config?: { - chat_template?: string | Array<{ name: string; template: string }> - model_max_length?: number + supports_tools?: boolean + supports_structured_output?: boolean + context_length?: number + pricing?: { + input: number + output: number } - } - tags: string[] - pipeline_tag: "text-generation" | "image-text-to-text" - library_name?: string + }> }> mcpServers?: McpServer[] commits?: GitCommit[] diff --git a/webview-ui/src/components/settings/providers/HuggingFace.tsx b/webview-ui/src/components/settings/providers/HuggingFace.tsx index d4195492dd..afbdf2ff59 100644 --- a/webview-ui/src/components/settings/providers/HuggingFace.tsx +++ b/webview-ui/src/components/settings/providers/HuggingFace.tsx @@ -1,38 +1,43 @@ import { useCallback, useState, useEffect, useMemo } from "react" import { useEvent } from "react-use" -import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" +import { VSCodeTextField, VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" import type { ProviderSettings } from "@roo-code/types" +import { + HUGGINGFACE_DEFAULT_MAX_TOKENS, + HUGGINGFACE_MAX_TOKENS_FALLBACK, + HUGGINGFACE_SLIDER_STEP, + HUGGINGFACE_SLIDER_MIN, + HUGGINGFACE_TEMPERATURE_MAX_VALUE, +} from "@roo-code/types" import { ExtensionMessage } from "@roo/ExtensionMessage" import { vscode } from "@src/utils/vscode" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" -import { SearchableSelect, type SearchableSelectOption } from "@src/components/ui" +import { SearchableSelect, type SearchableSelectOption, Slider } from "@src/components/ui" +import { TemperatureControl } from "../TemperatureControl" +import { cn } from "@src/lib/utils" +import { formatPrice } from "@/utils/formatPrice" import { inputEventTransform } from "../transforms" type HuggingFaceModel = { - _id: string id: string - inferenceProviderMapping: Array<{ + object: string + created: number + owned_by: string + providers: Array<{ provider: string - providerId: string status: "live" | "staging" | "error" - task: "conversational" - }> - trendingScore: number - config: { - architectures: string[] - model_type: string - tokenizer_config?: { - chat_template?: string | Array<{ name: string; template: string }> - model_max_length?: number + supports_tools?: boolean + supports_structured_output?: boolean + context_length?: number + pricing?: { + input: number + output: number } - } - tags: string[] - pipeline_tag: "text-generation" | "image-text-to-text" - library_name?: string + }> } type HuggingFaceProps = { @@ -81,10 +86,7 @@ export const HuggingFace = ({ apiConfiguration, setApiConfigurationField }: Hugg // Get current model and its providers const currentModel = models.find((m) => m.id === apiConfiguration?.huggingFaceModelId) - const availableProviders = useMemo( - () => currentModel?.inferenceProviderMapping || [], - [currentModel?.inferenceProviderMapping], - ) + const availableProviders = useMemo(() => currentModel?.providers || [], [currentModel?.providers]) // Set default provider when model changes useEffect(() => { @@ -140,6 +142,32 @@ export const HuggingFace = ({ apiConfiguration, setApiConfigurationField }: Hugg return nameMap[provider] || provider.charAt(0).toUpperCase() + provider.slice(1) } + // Get current provider + const currentProvider = useMemo(() => { + if (!currentModel || !selectedProvider || selectedProvider === "auto") return null + return currentModel.providers.find((p) => p.provider === selectedProvider) + }, [currentModel, selectedProvider]) + + // Get model capabilities based on current provider + const modelCapabilities = useMemo(() => { + if (!currentModel) return null + + // For now, assume text-only models since we don't have pipeline_tag in new API + // This could be enhanced by checking model name patterns or adding vision support detection + const supportsImages = false + + // Use provider-specific capabilities if a specific provider is selected + const maxTokens = + currentProvider?.context_length || currentModel.providers.find((p) => p.context_length)?.context_length + const supportsTools = currentProvider?.supports_tools || currentModel.providers.some((p) => p.supports_tools) + + return { + supportsImages, + maxTokens, + supportsTools, + } + }, [currentModel, currentProvider]) + return ( <> )} + {/* Model capabilities */} + {currentModel && modelCapabilities && ( +
+
+ + {modelCapabilities.supportsImages + ? t("settings:modelInfo.supportsImages") + : t("settings:modelInfo.noImages")} +
+ {modelCapabilities.maxTokens && ( +
+ {t("settings:modelInfo.maxOutput")}:{" "} + {modelCapabilities.maxTokens.toLocaleString()} tokens +
+ )} + {currentProvider?.pricing && ( + <> +
+ {t("settings:modelInfo.inputPrice")}:{" "} + {formatPrice(currentProvider.pricing.input)} / 1M tokens +
+
+ {t("settings:modelInfo.outputPrice")}:{" "} + {formatPrice(currentProvider.pricing.output)} / 1M tokens +
+ + )} +
+ )} + + {/* Temperature control */} + setApiConfigurationField("modelTemperature", value)} + maxValue={HUGGINGFACE_TEMPERATURE_MAX_VALUE} + /> + + {/* Max tokens control */} +
+ + setApiConfigurationField("includeMaxTokens", (e.target as HTMLInputElement).checked) + }> + + +
+ {t("settings:limitMaxTokensDescription")} +
+ + {apiConfiguration?.includeMaxTokens && ( +
+
+ +
+ setApiConfigurationField("modelMaxTokens", value)} + /> + + {apiConfiguration?.modelMaxTokens || HUGGINGFACE_DEFAULT_MAX_TOKENS} + +
+
+ {t("settings:maxTokensGenerateDescription")} +
+
+
+ )} +
+
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/__tests__/HuggingFace.spec.tsx b/webview-ui/src/components/settings/providers/__tests__/HuggingFace.spec.tsx index 3fd29e4c72..0256fe94d3 100644 --- a/webview-ui/src/components/settings/providers/__tests__/HuggingFace.spec.tsx +++ b/webview-ui/src/components/settings/providers/__tests__/HuggingFace.spec.tsx @@ -1,9 +1,8 @@ -import React from "react" import { render, screen } from "@/utils/test-utils" import { HuggingFace } from "../HuggingFace" import { ProviderSettings } from "@roo-code/types" -// Mock the VSCodeTextField component +// Mock the VSCode components vi.mock("@vscode/webview-ui-toolkit/react", () => ({ VSCodeTextField: ({ children, @@ -32,6 +31,18 @@ vi.mock("@vscode/webview-ui-toolkit/react", () => ({ ) }, + VSCodeCheckbox: ({ children, checked, onChange, ...rest }: any) => ( +
+ + {children} +
+ ), VSCodeLink: ({ children, href, onClick }: any) => ( {children} @@ -53,6 +64,10 @@ vi.mock("@src/i18n/TranslationContext", () => ({ "settings:providers.getHuggingFaceApiKey": "Get Hugging Face API Key", "settings:providers.huggingFaceApiKey": "Hugging Face API Key", "settings:providers.huggingFaceModelId": "Model ID", + "settings:modelInfo.fetchingModels": "Fetching models...", + "settings:modelInfo.errorFetchingModels": "Error fetching models", + "settings:modelInfo.noModelsFound": "No models found", + "settings:modelInfo.noImages": "Does not support images", } return translations[key] || key }, @@ -79,11 +94,31 @@ vi.mock("@src/components/ui", () => ({ ), })) +// Mock the formatPrice utility +vi.mock("@/utils/formatPrice", () => ({ + formatPrice: (price: number) => `$${price.toFixed(2)}`, +})) + +// Create a mock postMessage function +const mockPostMessage = vi.fn() + +// Mock the vscode module +vi.mock("@src/utils/vscode", () => ({ + vscode: { + postMessage: vi.fn(), + }, +})) + +// Import the mocked module to set up the spy +import { vscode } from "@src/utils/vscode" + describe("HuggingFace Component", () => { const mockSetApiConfigurationField = vi.fn() beforeEach(() => { vi.clearAllMocks() + // Set up the mock implementation + vi.mocked(vscode.postMessage).mockImplementation(mockPostMessage) }) it("should render with internationalized labels", () => { @@ -159,4 +194,102 @@ describe("HuggingFace Component", () => { expect(apiKeyButton).toBeInTheDocument() expect(apiKeyButton).toHaveTextContent("Get Hugging Face API Key") }) + + it("should fetch models when component mounts", () => { + const apiConfiguration: Partial = { + huggingFaceApiKey: "test-api-key", + huggingFaceModelId: "", + } + + render( + , + ) + + // Check that the fetch models message was sent + expect(mockPostMessage).toHaveBeenCalledWith({ + type: "requestHuggingFaceModels", + }) + }) + + it("should display loading state while fetching models", () => { + const apiConfiguration: Partial = { + huggingFaceApiKey: "test-api-key", + huggingFaceModelId: "", + } + + render( + , + ) + + // Check for loading text in the label + expect(screen.getByText("settings:providers.huggingFaceLoading")).toBeInTheDocument() + }) + + it("should display model capabilities when a model is selected", async () => { + const apiConfiguration: Partial = { + huggingFaceApiKey: "test-api-key", + huggingFaceModelId: "test-model", + huggingFaceInferenceProvider: "test-provider", // Select a specific provider to show pricing + } + + const { rerender } = render( + , + ) + + // Simulate receiving models from the backend + const mockModels = [ + { + id: "test-model", + object: "model", + created: Date.now(), + owned_by: "test", + providers: [ + { + provider: "test-provider", + status: "live" as const, + supports_tools: false, + supports_structured_output: false, + context_length: 8192, + pricing: { + input: 0.001, + output: 0.002, + }, + }, + ], + }, + ] + + // Simulate message event + const messageEvent = new MessageEvent("message", { + data: { + type: "huggingFaceModels", + huggingFaceModels: mockModels, + }, + }) + window.dispatchEvent(messageEvent) + + // Re-render to trigger effect + rerender( + , + ) + + // Check that model capabilities are displayed + expect(screen.getByText("Does not support images")).toBeInTheDocument() + expect(screen.getByText("8,192 tokens")).toBeInTheDocument() + // Check that both input and output prices are displayed + const priceElements = screen.getAllByText("$0.00 / 1M tokens") + expect(priceElements).toHaveLength(2) // One for input, one for output + }) }) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index ab929d724d..828790cbb4 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -755,5 +755,8 @@ "useCustomArn": "Utilitza ARN personalitzat..." }, "includeMaxOutputTokens": "Incloure tokens màxims de sortida", - "includeMaxOutputTokensDescription": "Enviar el paràmetre de tokens màxims de sortida a les sol·licituds API. Alguns proveïdors poden no admetre això." + "includeMaxOutputTokensDescription": "Enviar el paràmetre de tokens màxims de sortida a les sol·licituds API. Alguns proveïdors poden no admetre això.", + "limitMaxTokensDescription": "Limitar el nombre màxim de tokens en la resposta", + "maxOutputTokensLabel": "Tokens màxims de sortida", + "maxTokensGenerateDescription": "Tokens màxims a generar en la resposta" } diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 766bc891e4..83662adb48 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -755,5 +755,8 @@ "useCustomArn": "Benutzerdefinierte ARN verwenden..." }, "includeMaxOutputTokens": "Maximale Ausgabe-Tokens einbeziehen", - "includeMaxOutputTokensDescription": "Senden Sie den Parameter für maximale Ausgabe-Tokens in API-Anfragen. Einige Anbieter unterstützen dies möglicherweise nicht." + "includeMaxOutputTokensDescription": "Senden Sie den Parameter für maximale Ausgabe-Tokens in API-Anfragen. Einige Anbieter unterstützen dies möglicherweise nicht.", + "limitMaxTokensDescription": "Begrenze die maximale Anzahl von Tokens in der Antwort", + "maxOutputTokensLabel": "Maximale Ausgabe-Tokens", + "maxTokensGenerateDescription": "Maximale Tokens, die in der Antwort generiert werden" } diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index cfd5b04286..2b4d3b8fe0 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -755,5 +755,8 @@ "useCustomArn": "Use custom ARN..." }, "includeMaxOutputTokens": "Include max output tokens", - "includeMaxOutputTokensDescription": "Send max output tokens parameter in API requests. Some providers may not support this." + "includeMaxOutputTokensDescription": "Send max output tokens parameter in API requests. Some providers may not support this.", + "limitMaxTokensDescription": "Limit the maximum number of tokens in the response", + "maxOutputTokensLabel": "Max output tokens", + "maxTokensGenerateDescription": "Maximum tokens to generate in response" } diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index f536863909..45b7209797 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -755,5 +755,8 @@ "useCustomArn": "Usar ARN personalizado..." }, "includeMaxOutputTokens": "Incluir tokens máximos de salida", - "includeMaxOutputTokensDescription": "Enviar parámetro de tokens máximos de salida en solicitudes API. Algunos proveedores pueden no soportar esto." + "includeMaxOutputTokensDescription": "Enviar parámetro de tokens máximos de salida en solicitudes API. Algunos proveedores pueden no soportar esto.", + "limitMaxTokensDescription": "Limitar el número máximo de tokens en la respuesta", + "maxOutputTokensLabel": "Tokens máximos de salida", + "maxTokensGenerateDescription": "Tokens máximos a generar en la respuesta" } diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 0e12c58d38..1f846f1e68 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -755,5 +755,8 @@ "useCustomArn": "Utiliser un ARN personnalisé..." }, "includeMaxOutputTokens": "Inclure les tokens de sortie maximum", - "includeMaxOutputTokensDescription": "Envoyer le paramètre de tokens de sortie maximum dans les requêtes API. Certains fournisseurs peuvent ne pas supporter cela." + "includeMaxOutputTokensDescription": "Envoyer le paramètre de tokens de sortie maximum dans les requêtes API. Certains fournisseurs peuvent ne pas supporter cela.", + "limitMaxTokensDescription": "Limiter le nombre maximum de tokens dans la réponse", + "maxOutputTokensLabel": "Tokens de sortie maximum", + "maxTokensGenerateDescription": "Tokens maximum à générer dans la réponse" } diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index d2cfa971ff..ebe8524aa5 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "कस्टम ARN का उपयोग करें..." }, "includeMaxOutputTokens": "अधिकतम आउटपुट टोकन शामिल करें", - "includeMaxOutputTokensDescription": "API अनुरोधों में अधिकतम आउटपुट टोकन पैरामीटर भेजें। कुछ प्रदाता इसका समर्थन नहीं कर सकते हैं।" + "includeMaxOutputTokensDescription": "API अनुरोधों में अधिकतम आउटपुट टोकन पैरामीटर भेजें। कुछ प्रदाता इसका समर्थन नहीं कर सकते हैं।", + "limitMaxTokensDescription": "प्रतिक्रिया में टोकन की अधिकतम संख्या सीमित करें", + "maxOutputTokensLabel": "अधिकतम आउटपुट टोकन", + "maxTokensGenerateDescription": "प्रतिक्रिया में उत्पन्न करने के लिए अधिकतम टोकन" } diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index 3f362f650d..bddc9a98c1 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -785,5 +785,8 @@ "useCustomArn": "Gunakan ARN kustom..." }, "includeMaxOutputTokens": "Sertakan token output maksimum", - "includeMaxOutputTokensDescription": "Kirim parameter token output maksimum dalam permintaan API. Beberapa provider mungkin tidak mendukung ini." + "includeMaxOutputTokensDescription": "Kirim parameter token output maksimum dalam permintaan API. Beberapa provider mungkin tidak mendukung ini.", + "limitMaxTokensDescription": "Batasi jumlah maksimum token dalam respons", + "maxOutputTokensLabel": "Token output maksimum", + "maxTokensGenerateDescription": "Token maksimum untuk dihasilkan dalam respons" } diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 14deda20ea..4e3038c242 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "Usa ARN personalizzato..." }, "includeMaxOutputTokens": "Includi token di output massimi", - "includeMaxOutputTokensDescription": "Invia il parametro dei token di output massimi nelle richieste API. Alcuni provider potrebbero non supportarlo." + "includeMaxOutputTokensDescription": "Invia il parametro dei token di output massimi nelle richieste API. Alcuni provider potrebbero non supportarlo.", + "limitMaxTokensDescription": "Limita il numero massimo di token nella risposta", + "maxOutputTokensLabel": "Token di output massimi", + "maxTokensGenerateDescription": "Token massimi da generare nella risposta" } diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index d7864e40db..0aa402d139 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "カスタム ARN を使用..." }, "includeMaxOutputTokens": "最大出力トークンを含める", - "includeMaxOutputTokensDescription": "APIリクエストで最大出力トークンパラメータを送信します。一部のプロバイダーはこれをサポートしていない場合があります。" + "includeMaxOutputTokensDescription": "APIリクエストで最大出力トークンパラメータを送信します。一部のプロバイダーはこれをサポートしていない場合があります。", + "limitMaxTokensDescription": "レスポンスの最大トークン数を制限する", + "maxOutputTokensLabel": "最大出力トークン", + "maxTokensGenerateDescription": "レスポンスで生成する最大トークン数" } diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index adbe216463..25b79b795f 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "사용자 지정 ARN 사용..." }, "includeMaxOutputTokens": "최대 출력 토큰 포함", - "includeMaxOutputTokensDescription": "API 요청에서 최대 출력 토큰 매개변수를 전송합니다. 일부 제공업체는 이를 지원하지 않을 수 있습니다." + "includeMaxOutputTokensDescription": "API 요청에서 최대 출력 토큰 매개변수를 전송합니다. 일부 제공업체는 이를 지원하지 않을 수 있습니다.", + "limitMaxTokensDescription": "응답에서 최대 토큰 수 제한", + "maxOutputTokensLabel": "최대 출력 토큰", + "maxTokensGenerateDescription": "응답에서 생성할 최대 토큰 수" } diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 6085be8fb1..36f5f50c4e 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "Aangepaste ARN gebruiken..." }, "includeMaxOutputTokens": "Maximale output tokens opnemen", - "includeMaxOutputTokensDescription": "Stuur maximale output tokens parameter in API-verzoeken. Sommige providers ondersteunen dit mogelijk niet." + "includeMaxOutputTokensDescription": "Stuur maximale output tokens parameter in API-verzoeken. Sommige providers ondersteunen dit mogelijk niet.", + "limitMaxTokensDescription": "Beperk het maximale aantal tokens in het antwoord", + "maxOutputTokensLabel": "Maximale output tokens", + "maxTokensGenerateDescription": "Maximale tokens om te genereren in het antwoord" } diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 9107fd959e..455beebfda 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "Użyj niestandardowego ARN..." }, "includeMaxOutputTokens": "Uwzględnij maksymalne tokeny wyjściowe", - "includeMaxOutputTokensDescription": "Wyślij parametr maksymalnych tokenów wyjściowych w żądaniach API. Niektórzy dostawcy mogą tego nie obsługiwać." + "includeMaxOutputTokensDescription": "Wyślij parametr maksymalnych tokenów wyjściowych w żądaniach API. Niektórzy dostawcy mogą tego nie obsługiwać.", + "limitMaxTokensDescription": "Ogranicz maksymalną liczbę tokenów w odpowiedzi", + "maxOutputTokensLabel": "Maksymalne tokeny wyjściowe", + "maxTokensGenerateDescription": "Maksymalne tokeny do wygenerowania w odpowiedzi" } diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 8137d917ae..0e77668246 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "Usar ARN personalizado..." }, "includeMaxOutputTokens": "Incluir tokens máximos de saída", - "includeMaxOutputTokensDescription": "Enviar parâmetro de tokens máximos de saída nas solicitações de API. Alguns provedores podem não suportar isso." + "includeMaxOutputTokensDescription": "Enviar parâmetro de tokens máximos de saída nas solicitações de API. Alguns provedores podem não suportar isso.", + "limitMaxTokensDescription": "Limitar o número máximo de tokens na resposta", + "maxOutputTokensLabel": "Tokens máximos de saída", + "maxTokensGenerateDescription": "Tokens máximos para gerar na resposta" } diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index e93f24e9d7..2750202856 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "Использовать пользовательский ARN..." }, "includeMaxOutputTokens": "Включить максимальные выходные токены", - "includeMaxOutputTokensDescription": "Отправлять параметр максимальных выходных токенов в API-запросах. Некоторые провайдеры могут не поддерживать это." + "includeMaxOutputTokensDescription": "Отправлять параметр максимальных выходных токенов в API-запросах. Некоторые провайдеры могут не поддерживать это.", + "limitMaxTokensDescription": "Ограничить максимальное количество токенов в ответе", + "maxOutputTokensLabel": "Максимальные выходные токены", + "maxTokensGenerateDescription": "Максимальные токены для генерации в ответе" } diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 450738183b..a6d8a2b6b9 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "Özel ARN kullan..." }, "includeMaxOutputTokens": "Maksimum çıktı tokenlerini dahil et", - "includeMaxOutputTokensDescription": "API isteklerinde maksimum çıktı token parametresini gönder. Bazı sağlayıcılar bunu desteklemeyebilir." + "includeMaxOutputTokensDescription": "API isteklerinde maksimum çıktı token parametresini gönder. Bazı sağlayıcılar bunu desteklemeyebilir.", + "limitMaxTokensDescription": "Yanıttaki maksimum token sayısını sınırla", + "maxOutputTokensLabel": "Maksimum çıktı tokenları", + "maxTokensGenerateDescription": "Yanıtta oluşturulacak maksimum token sayısı" } diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 87e99ce6f5..b0e0fb7edf 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "Sử dụng ARN tùy chỉnh..." }, "includeMaxOutputTokens": "Bao gồm token đầu ra tối đa", - "includeMaxOutputTokensDescription": "Gửi tham số token đầu ra tối đa trong các yêu cầu API. Một số nhà cung cấp có thể không hỗ trợ điều này." + "includeMaxOutputTokensDescription": "Gửi tham số token đầu ra tối đa trong các yêu cầu API. Một số nhà cung cấp có thể không hỗ trợ điều này.", + "limitMaxTokensDescription": "Giới hạn số lượng token tối đa trong phản hồi", + "maxOutputTokensLabel": "Token đầu ra tối đa", + "maxTokensGenerateDescription": "Token tối đa để tạo trong phản hồi" } diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index e94c857e65..509176a6f4 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "使用自定义 ARN..." }, "includeMaxOutputTokens": "包含最大输出 Token 数", - "includeMaxOutputTokensDescription": "在 API 请求中发送最大输出 Token 参数。某些提供商可能不支持此功能。" + "includeMaxOutputTokensDescription": "在 API 请求中发送最大输出 Token 参数。某些提供商可能不支持此功能。", + "limitMaxTokensDescription": "限制响应中的最大 Token 数量", + "maxOutputTokensLabel": "最大输出 Token 数", + "maxTokensGenerateDescription": "响应中生成的最大 Token 数" } diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index fa10cf3028..044ac0a751 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -756,5 +756,8 @@ "useCustomArn": "使用自訂 ARN..." }, "includeMaxOutputTokens": "包含最大輸出 Token 數", - "includeMaxOutputTokensDescription": "在 API 請求中傳送最大輸出 Token 參數。某些提供商可能不支援此功能。" + "includeMaxOutputTokensDescription": "在 API 請求中傳送最大輸出 Token 參數。某些提供商可能不支援此功能。", + "limitMaxTokensDescription": "限制回應中的最大 Token 數量", + "maxOutputTokensLabel": "最大輸出 Token 數", + "maxTokensGenerateDescription": "回應中產生的最大 Token 數" } From 440ec30d669396e4064f88cf1eac33f2cd65bcc1 Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Fri, 25 Jul 2025 19:14:35 -0500 Subject: [PATCH 13/44] fix: add error message when no workspace folder is open for code indexing (#6227) * fix: add error message when no workspace folder is open for code indexing - Add 'Indexing requires an open workspace folder' error message in orchestrator.ts - Replace hardcoded error string with translatable message using i18n - Add translations for the error message in all 18 supported languages - Ensures proper error handling when users attempt code indexing without a workspace * fix: add workspace folder checks for code indexing operations - Add null checks for codeIndexManager in webviewMessageHandler - Show translated error message when no workspace folder is open - Prevents crashes when users try to use indexing features without a workspace - Uses existing translation key from orchestrator * Update src/i18n/locales/ca/embeddings.json 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/core/webview/webviewMessageHandler.ts | 60 +++++++++++++++++++++-- src/i18n/locales/ca/embeddings.json | 9 ++++ src/i18n/locales/de/embeddings.json | 9 ++++ src/i18n/locales/en/embeddings.json | 9 ++++ src/i18n/locales/es/embeddings.json | 9 ++++ src/i18n/locales/fr/embeddings.json | 9 ++++ src/i18n/locales/hi/embeddings.json | 9 ++++ src/i18n/locales/id/embeddings.json | 9 ++++ src/i18n/locales/it/embeddings.json | 9 ++++ src/i18n/locales/ja/embeddings.json | 9 ++++ src/i18n/locales/ko/embeddings.json | 9 ++++ src/i18n/locales/nl/embeddings.json | 9 ++++ src/i18n/locales/pl/embeddings.json | 9 ++++ src/i18n/locales/pt-BR/embeddings.json | 9 ++++ src/i18n/locales/ru/embeddings.json | 9 ++++ src/i18n/locales/tr/embeddings.json | 9 ++++ src/i18n/locales/vi/embeddings.json | 9 ++++ src/i18n/locales/zh-CN/embeddings.json | 9 ++++ src/i18n/locales/zh-TW/embeddings.json | 9 ++++ src/services/code-index/orchestrator.ts | 27 ++++++---- 20 files changed, 237 insertions(+), 12 deletions(-) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index c739c2ade8..c0ff851087 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2092,6 +2092,19 @@ export const webviewMessageHandler = async ( } } } + } else { + // No workspace open - send error status + provider.log("Cannot save code index settings: No workspace folder open") + await provider.postMessageToWebview({ + type: "indexingStatusUpdate", + values: { + systemStatus: "Error", + message: t("embeddings:orchestrator.indexingRequiresWorkspace"), + processedItems: 0, + totalItems: 0, + currentItemUnit: "items", + }, + }) } } catch (error) { provider.log(`Error saving code index settings: ${error.message || error}`) @@ -2105,7 +2118,22 @@ export const webviewMessageHandler = async ( } case "requestIndexingStatus": { - const status = provider.codeIndexManager!.getCurrentStatus() + const manager = provider.codeIndexManager + if (!manager) { + // No workspace open - send error status + provider.postMessageToWebview({ + type: "indexingStatusUpdate", + values: { + systemStatus: "Error", + message: t("embeddings:orchestrator.indexingRequiresWorkspace"), + processedItems: 0, + totalItems: 0, + currentItemUnit: "items", + }, + }) + return + } + const status = manager.getCurrentStatus() provider.postMessageToWebview({ type: "indexingStatusUpdate", values: status, @@ -2136,7 +2164,22 @@ export const webviewMessageHandler = async ( } case "startIndexing": { try { - const manager = provider.codeIndexManager! + const manager = provider.codeIndexManager + if (!manager) { + // No workspace open - send error status + provider.postMessageToWebview({ + type: "indexingStatusUpdate", + values: { + systemStatus: "Error", + message: t("embeddings:orchestrator.indexingRequiresWorkspace"), + processedItems: 0, + totalItems: 0, + currentItemUnit: "items", + }, + }) + provider.log("Cannot start indexing: No workspace folder open") + return + } if (manager.isFeatureEnabled && manager.isFeatureConfigured) { if (!manager.isInitialized) { await manager.initialize(provider.contextProxy) @@ -2151,7 +2194,18 @@ export const webviewMessageHandler = async ( } case "clearIndexData": { try { - const manager = provider.codeIndexManager! + const manager = provider.codeIndexManager + if (!manager) { + provider.log("Cannot clear index data: No workspace folder open") + provider.postMessageToWebview({ + type: "indexCleared", + values: { + success: false, + error: t("embeddings:orchestrator.indexingRequiresWorkspace"), + }, + }) + return + } await manager.clearIndexData() provider.postMessageToWebview({ type: "indexCleared", values: { success: true } }) } catch (error) { diff --git a/src/i18n/locales/ca/embeddings.json b/src/i18n/locales/ca/embeddings.json index 651bc2b80f..35ddca3b10 100644 --- a/src/i18n/locales/ca/embeddings.json +++ b/src/i18n/locales/ca/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "No s'ha pogut determinar la dimensió del vector per al model '{{modelId}}' amb el proveïdor '{{provider}}'. Comprova els perfils del model o la configuració.", "qdrantUrlMissing": "Falta l'URL de Qdrant per crear l'emmagatzematge de vectors", "codeIndexingNotConfigured": "No es poden crear serveis: La indexació de codi no està configurada correctament" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Indexació fallida: No s'ha indexat cap bloc de codi amb èxit. Això normalment indica un problema de configuració de l'embedder.", + "indexingFailedCritical": "Indexació fallida: No s'ha indexat cap bloc de codi amb èxit malgrat trobar fitxers per processar. Això indica una fallida crítica de l'embedder.", + "fileWatcherStarted": "Monitor de fitxers iniciat.", + "fileWatcherStopped": "Monitor de fitxers aturat.", + "failedDuringInitialScan": "Ha fallat durant l'escaneig inicial: {{errorMessage}}", + "unknownError": "Error desconegut", + "indexingRequiresWorkspace": "Indexació requereix una carpeta de workspace oberta" } } diff --git a/src/i18n/locales/de/embeddings.json b/src/i18n/locales/de/embeddings.json index 167abc516c..f5aa7339ef 100644 --- a/src/i18n/locales/de/embeddings.json +++ b/src/i18n/locales/de/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Konnte die Vektordimension für Modell '{{modelId}}' mit Anbieter '{{provider}}' nicht bestimmen. Überprüfe die Modellprofile oder Konfiguration.", "qdrantUrlMissing": "Qdrant-URL fehlt für die Erstellung des Vektorspeichers", "codeIndexingNotConfigured": "Kann keine Dienste erstellen: Code-Indizierung ist nicht richtig konfiguriert" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Indizierung fehlgeschlagen: Keine Code-Blöcke wurden erfolgreich indiziert. Dies deutet normalerweise auf ein Embedder-Konfigurationsproblem hin.", + "indexingFailedCritical": "Indizierung fehlgeschlagen: Keine Code-Blöcke wurden erfolgreich indiziert, obwohl zu verarbeitende Dateien gefunden wurden. Dies deutet auf einen kritischen Embedder-Fehler hin.", + "fileWatcherStarted": "Datei-Watcher gestartet.", + "fileWatcherStopped": "Datei-Watcher gestoppt.", + "failedDuringInitialScan": "Fehler während des ersten Scans: {{errorMessage}}", + "unknownError": "Unbekannter Fehler", + "indexingRequiresWorkspace": "Indexierung erfordert einen offenen Workspace-Ordner" } } diff --git a/src/i18n/locales/en/embeddings.json b/src/i18n/locales/en/embeddings.json index 270a8d193b..66465d8c35 100644 --- a/src/i18n/locales/en/embeddings.json +++ b/src/i18n/locales/en/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Could not determine vector dimension for model '{{modelId}}' with provider '{{provider}}'. Check model profiles or configuration.", "qdrantUrlMissing": "Qdrant URL missing for vector store creation", "codeIndexingNotConfigured": "Cannot create services: Code indexing is not properly configured" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Indexing failed: No code blocks were successfully indexed. This usually indicates an embedder configuration issue.", + "indexingFailedCritical": "Indexing failed: No code blocks were successfully indexed despite finding files to process. This indicates a critical embedder failure.", + "fileWatcherStarted": "File watcher started.", + "fileWatcherStopped": "File watcher stopped.", + "failedDuringInitialScan": "Failed during initial scan: {{errorMessage}}", + "unknownError": "Unknown error", + "indexingRequiresWorkspace": "Indexing requires an open workspace folder" } } diff --git a/src/i18n/locales/es/embeddings.json b/src/i18n/locales/es/embeddings.json index 06478f1d50..51621b6d17 100644 --- a/src/i18n/locales/es/embeddings.json +++ b/src/i18n/locales/es/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "No se pudo determinar la dimensión del vector para el modelo '{{modelId}}' con el proveedor '{{provider}}'. Verifica los perfiles del modelo o la configuración.", "qdrantUrlMissing": "Falta la URL de Qdrant para crear el almacén de vectores", "codeIndexingNotConfigured": "No se pueden crear servicios: La indexación de código no está configurada correctamente" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Indexación fallida: No se indexaron exitosamente bloques de código. Esto usualmente indica un problema de configuración del incrustador.", + "indexingFailedCritical": "Indexación fallida: No se indexaron exitosamente bloques de código a pesar de encontrar archivos para procesar. Esto indica una falla crítica del incrustador.", + "fileWatcherStarted": "Monitor de archivos iniciado.", + "fileWatcherStopped": "Monitor de archivos detenido.", + "failedDuringInitialScan": "Falló durante el escaneo inicial: {{errorMessage}}", + "unknownError": "Error desconocido", + "indexingRequiresWorkspace": "La indexación requiere una carpeta de workspace abierta" } } diff --git a/src/i18n/locales/fr/embeddings.json b/src/i18n/locales/fr/embeddings.json index 167d093e7a..e3a9227234 100644 --- a/src/i18n/locales/fr/embeddings.json +++ b/src/i18n/locales/fr/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Impossible de déterminer la dimension du vecteur pour le modèle '{{modelId}}' avec le fournisseur '{{provider}}'. Vérifie les profils du modèle ou la configuration.", "qdrantUrlMissing": "URL Qdrant manquante pour la création du stockage de vecteurs", "codeIndexingNotConfigured": "Impossible de créer les services : L'indexation du code n'est pas correctement configurée" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Échec de l'indexation : Aucun bloc de code n'a été indexé avec succès. Cela indique généralement un problème de configuration de l'embedder.", + "indexingFailedCritical": "Échec de l'indexation : Aucun bloc de code n'a été indexé avec succès malgré la découverte de fichiers à traiter. Cela indique une défaillance critique de l'embedder.", + "fileWatcherStarted": "Surveillant de fichiers démarré.", + "fileWatcherStopped": "Surveillant de fichiers arrêté.", + "failedDuringInitialScan": "Échec lors du scan initial : {{errorMessage}}", + "unknownError": "Erreur inconnue", + "indexingRequiresWorkspace": "L'indexation nécessite l'ouverture d'un dossier workspace" } } diff --git a/src/i18n/locales/hi/embeddings.json b/src/i18n/locales/hi/embeddings.json index ad24cfe9d1..01563e833a 100644 --- a/src/i18n/locales/hi/embeddings.json +++ b/src/i18n/locales/hi/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "प्रदाता '{{provider}}' के साथ मॉडल '{{modelId}}' के लिए वेक्टर आयाम निर्धारित नहीं कर सका। मॉडल प्रोफ़ाइल या कॉन्फ़िगरेशन की जांच करें।", "qdrantUrlMissing": "वेक्टर स्टोर बनाने के लिए Qdrant URL गायब है", "codeIndexingNotConfigured": "सेवाएं नहीं बना सकते: कोड इंडेक्सिंग ठीक से कॉन्फ़िगर नहीं है" + }, + "orchestrator": { + "indexingFailedNoBlocks": "इंडेक्सिंग असफल: कोई भी कोड ब्लॉक सफलतापूर्वक इंडेक्स नहीं हुआ। यह आमतौर पर एम्बेडर कॉन्फ़िगरेशन समस्या को दर्शाता है।", + "indexingFailedCritical": "इंडेक्सिंग असफल: प्रोसेस करने के लिए फाइलें मिलने के बावजूद कोई भी कोड ब्लॉक सफलतापूर्वक इंडेक्स नहीं हुआ। यह एक गंभीर एम्बेडर विफलता को दर्शाता है।", + "fileWatcherStarted": "फाइल वॉचर शुरू हुआ।", + "fileWatcherStopped": "फाइल वॉचर रुक गया।", + "failedDuringInitialScan": "प्रारंभिक स्कैन के दौरान असफल: {{errorMessage}}", + "unknownError": "अज्ञात त्रुटि", + "indexingRequiresWorkspace": "इंडेक्सिंग के लिए एक खुला वर्कस्पेस फ़ोल्डर आवश्यक है" } } diff --git a/src/i18n/locales/id/embeddings.json b/src/i18n/locales/id/embeddings.json index 997c6e8018..a66c1965ab 100644 --- a/src/i18n/locales/id/embeddings.json +++ b/src/i18n/locales/id/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Tidak dapat menentukan dimensi vektor untuk model '{{modelId}}' dengan penyedia '{{provider}}'. Periksa profil model atau konfigurasi.", "qdrantUrlMissing": "URL Qdrant tidak ada untuk membuat penyimpanan vektor", "codeIndexingNotConfigured": "Tidak dapat membuat layanan: Pengindeksan kode tidak dikonfigurasi dengan benar" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Pengindeksan gagal: Tidak ada blok kode yang berhasil diindeks. Ini biasanya menunjukkan masalah konfigurasi embedder.", + "indexingFailedCritical": "Pengindeksan gagal: Tidak ada blok kode yang berhasil diindeks meskipun menemukan file untuk diproses. Ini menunjukkan kegagalan kritis embedder.", + "fileWatcherStarted": "Pemantau file dimulai.", + "fileWatcherStopped": "Pemantau file dihentikan.", + "failedDuringInitialScan": "Gagal selama pemindaian awal: {{errorMessage}}", + "unknownError": "Kesalahan tidak diketahui", + "indexingRequiresWorkspace": "Pengindeksan memerlukan folder workspace yang terbuka" } } diff --git a/src/i18n/locales/it/embeddings.json b/src/i18n/locales/it/embeddings.json index 1bc406aecb..d59bc2c26d 100644 --- a/src/i18n/locales/it/embeddings.json +++ b/src/i18n/locales/it/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Impossibile determinare la dimensione del vettore per il modello '{{modelId}}' con il provider '{{provider}}'. Controlla i profili del modello o la configurazione.", "qdrantUrlMissing": "URL Qdrant mancante per la creazione dello storage vettoriale", "codeIndexingNotConfigured": "Impossibile creare i servizi: L'indicizzazione del codice non è configurata correttamente" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Indicizzazione fallita: Nessun blocco di codice è stato indicizzato con successo. Questo di solito indica un problema di configurazione dell'embedder.", + "indexingFailedCritical": "Indicizzazione fallita: Nessun blocco di codice è stato indicizzato con successo nonostante siano stati trovati file da elaborare. Questo indica un errore critico dell'embedder.", + "fileWatcherStarted": "Monitoraggio file avviato.", + "fileWatcherStopped": "Monitoraggio file fermato.", + "failedDuringInitialScan": "Fallito durante la scansione iniziale: {{errorMessage}}", + "unknownError": "Errore sconosciuto", + "indexingRequiresWorkspace": "L'indicizzazione richiede una cartella di workspace aperta" } } diff --git a/src/i18n/locales/ja/embeddings.json b/src/i18n/locales/ja/embeddings.json index 7152eb52df..799c6745fa 100644 --- a/src/i18n/locales/ja/embeddings.json +++ b/src/i18n/locales/ja/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "プロバイダー '{{provider}}' のモデル '{{modelId}}' の埋め込み次元を決定できませんでした。モデルプロファイルまたは設定を確認してください。", "qdrantUrlMissing": "ベクターストア作成のためのQdrant URLがありません", "codeIndexingNotConfigured": "サービスを作成できません: コードインデックスが正しく設定されていません" + }, + "orchestrator": { + "indexingFailedNoBlocks": "インデックス作成に失敗しました:コードブロックが正常にインデックス化されませんでした。これは通常、エンベッダーの設定問題を示しています。", + "indexingFailedCritical": "インデックス作成に失敗しました:処理するファイルが見つかったにもかかわらず、コードブロックが正常にインデックス化されませんでした。これは重大なエンベッダーの障害を示しています。", + "fileWatcherStarted": "ファイルウォッチャーが開始されました。", + "fileWatcherStopped": "ファイルウォッチャーが停止されました。", + "failedDuringInitialScan": "初期スキャン中に失敗しました:{{errorMessage}}", + "unknownError": "不明なエラー", + "indexingRequiresWorkspace": "インデックス作成には、開かれたワークスペースフォルダーが必要です" } } diff --git a/src/i18n/locales/ko/embeddings.json b/src/i18n/locales/ko/embeddings.json index f1c40f66bc..3817135982 100644 --- a/src/i18n/locales/ko/embeddings.json +++ b/src/i18n/locales/ko/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "프로바이더 '{{provider}}'의 모델 '{{modelId}}'에 대한 벡터 차원을 결정할 수 없습니다. 모델 프로필 또는 구성을 확인하세요.", "qdrantUrlMissing": "벡터 저장소 생성을 위한 Qdrant URL이 누락되었습니다", "codeIndexingNotConfigured": "서비스를 생성할 수 없습니다: 코드 인덱싱이 올바르게 구성되지 않았습니다" + }, + "orchestrator": { + "indexingFailedNoBlocks": "인덱싱 실패: 코드 블록이 성공적으로 인덱싱되지 않았습니다. 이는 일반적으로 임베더 구성 문제를 나타냅니다.", + "indexingFailedCritical": "인덱싱 실패: 처리할 파일을 찾았음에도 불구하고 코드 블록이 성공적으로 인덱싱되지 않았습니다. 이는 중요한 임베더 오류를 나타냅니다.", + "fileWatcherStarted": "파일 감시자가 시작되었습니다.", + "fileWatcherStopped": "파일 감시자가 중지되었습니다.", + "failedDuringInitialScan": "초기 스캔 중 실패: {{errorMessage}}", + "unknownError": "알 수 없는 오류", + "indexingRequiresWorkspace": "인덱싱에는 열린 워크스페이스 폴더가 필요합니다" } } diff --git a/src/i18n/locales/nl/embeddings.json b/src/i18n/locales/nl/embeddings.json index 19b7bfeaa2..52d675c890 100644 --- a/src/i18n/locales/nl/embeddings.json +++ b/src/i18n/locales/nl/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Kan de vectordimensie voor model '{{modelId}}' met provider '{{provider}}' niet bepalen. Controleer modelprofielen of configuratie.", "qdrantUrlMissing": "Qdrant URL ontbreekt voor het maken van vectoropslag", "codeIndexingNotConfigured": "Kan geen services maken: Code-indexering is niet correct geconfigureerd" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Indexering mislukt: Geen codeblokken werden succesvol geïndexeerd. Dit duidt meestal op een embedder configuratieprobleem.", + "indexingFailedCritical": "Indexering mislukt: Geen codeblokken werden succesvol geïndexeerd ondanks het vinden van bestanden om te verwerken. Dit duidt op een kritieke embedder fout.", + "fileWatcherStarted": "Bestandsmonitor gestart.", + "fileWatcherStopped": "Bestandsmonitor gestopt.", + "failedDuringInitialScan": "Mislukt tijdens initiële scan: {{errorMessage}}", + "unknownError": "Onbekende fout", + "indexingRequiresWorkspace": "Indexering vereist een geopende workspace map" } } diff --git a/src/i18n/locales/pl/embeddings.json b/src/i18n/locales/pl/embeddings.json index 46e761cb8b..4d1ad0316c 100644 --- a/src/i18n/locales/pl/embeddings.json +++ b/src/i18n/locales/pl/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Nie można określić wymiaru wektora dla modelu '{{modelId}}' z dostawcą '{{provider}}'. Sprawdź profile modelu lub konfigurację.", "qdrantUrlMissing": "Brak adresu URL Qdrant do utworzenia magazynu wektorów", "codeIndexingNotConfigured": "Nie można utworzyć usług: Indeksowanie kodu nie jest poprawnie skonfigurowane" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Indeksowanie nie powiodło się: Żadne bloki kodu nie zostały pomyślnie zaindeksowane. To zwykle wskazuje na problem z konfiguracją embeddera.", + "indexingFailedCritical": "Indeksowanie nie powiodło się: Żadne bloki kodu nie zostały pomyślnie zaindeksowane pomimo znalezienia plików do przetworzenia. To wskazuje na krytyczny błąd embeddera.", + "fileWatcherStarted": "Monitor plików uruchomiony.", + "fileWatcherStopped": "Monitor plików zatrzymany.", + "failedDuringInitialScan": "Niepowodzenie podczas początkowego skanowania: {{errorMessage}}", + "unknownError": "Nieznany błąd", + "indexingRequiresWorkspace": "Indeksowanie wymaga otwartego folderu workspace" } } diff --git a/src/i18n/locales/pt-BR/embeddings.json b/src/i18n/locales/pt-BR/embeddings.json index 816b1ecded..875bba95dc 100644 --- a/src/i18n/locales/pt-BR/embeddings.json +++ b/src/i18n/locales/pt-BR/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Não foi possível determinar a dimensão do vetor para o modelo '{{modelId}}' com o provedor '{{provider}}'. Verifique os perfis do modelo ou a configuração.", "qdrantUrlMissing": "URL do Qdrant ausente para criação do armazenamento de vetores", "codeIndexingNotConfigured": "Não é possível criar serviços: A indexação de código não está configurada corretamente" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Indexação falhou: Nenhum bloco de código foi indexado com sucesso. Isso geralmente indica um problema de configuração do embedder.", + "indexingFailedCritical": "Indexação falhou: Nenhum bloco de código foi indexado com sucesso apesar de encontrar arquivos para processar. Isso indica uma falha crítica do embedder.", + "fileWatcherStarted": "Monitor de arquivos iniciado.", + "fileWatcherStopped": "Monitor de arquivos parado.", + "failedDuringInitialScan": "Falhou durante a varredura inicial: {{errorMessage}}", + "unknownError": "Erro desconhecido", + "indexingRequiresWorkspace": "A indexação requer uma pasta de workspace aberta" } } diff --git a/src/i18n/locales/ru/embeddings.json b/src/i18n/locales/ru/embeddings.json index fb1688e2ca..80dfa9a594 100644 --- a/src/i18n/locales/ru/embeddings.json +++ b/src/i18n/locales/ru/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Не удалось определить размерность вектора для модели '{{modelId}}' с провайдером '{{provider}}'. Проверьте профили модели или конфигурацию.", "qdrantUrlMissing": "Отсутствует URL Qdrant для создания векторного хранилища", "codeIndexingNotConfigured": "Невозможно создать сервисы: Индексация кода не настроена должным образом" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Индексация не удалась: Ни один блок кода не был успешно проиндексирован. Это обычно указывает на проблему конфигурации эмбеддера.", + "indexingFailedCritical": "Индексация не удалась: Ни один блок кода не был успешно проиндексирован, несмотря на обнаружение файлов для обработки. Это указывает на критическую ошибку эмбеддера.", + "fileWatcherStarted": "Наблюдатель файлов запущен.", + "fileWatcherStopped": "Наблюдатель файлов остановлен.", + "failedDuringInitialScan": "Ошибка во время первоначального сканирования: {{errorMessage}}", + "unknownError": "Неизвестная ошибка", + "indexingRequiresWorkspace": "Для индексации требуется открытая папка рабочего пространства" } } diff --git a/src/i18n/locales/tr/embeddings.json b/src/i18n/locales/tr/embeddings.json index 5023190929..ba717b7c82 100644 --- a/src/i18n/locales/tr/embeddings.json +++ b/src/i18n/locales/tr/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "'{{provider}}' sağlayıcısı ile '{{modelId}}' modeli için vektör boyutu belirlenemedi. Model profillerini veya yapılandırmayı kontrol et.", "qdrantUrlMissing": "Vektör deposu oluşturmak için Qdrant URL'si eksik", "codeIndexingNotConfigured": "Hizmetler oluşturulamıyor: Kod indeksleme düzgün yapılandırılmamış" + }, + "orchestrator": { + "indexingFailedNoBlocks": "İndeksleme başarısız: Hiçbir kod bloğu başarıyla indekslenemedi. Bu genellikle bir embedder yapılandırma sorunu olduğunu gösterir.", + "indexingFailedCritical": "İndeksleme başarısız: İşlenecek dosyalar bulunmasına rağmen hiçbir kod bloğu başarıyla indekslenemedi. Bu kritik bir embedder hatası olduğunu gösterir.", + "fileWatcherStarted": "Dosya izleyici başlatıldı.", + "fileWatcherStopped": "Dosya izleyici durduruldu.", + "failedDuringInitialScan": "İlk tarama sırasında başarısız: {{errorMessage}}", + "unknownError": "Bilinmeyen hata", + "indexingRequiresWorkspace": "İndeksleme açık bir workspace klasörü gerektirir" } } diff --git a/src/i18n/locales/vi/embeddings.json b/src/i18n/locales/vi/embeddings.json index 626f0f6862..12980b3345 100644 --- a/src/i18n/locales/vi/embeddings.json +++ b/src/i18n/locales/vi/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "Không thể xác định kích thước vector cho mô hình '{{modelId}}' với nhà cung cấp '{{provider}}'. Kiểm tra hồ sơ mô hình hoặc cấu hình.", "qdrantUrlMissing": "Thiếu URL Qdrant để tạo kho lưu trữ vector", "codeIndexingNotConfigured": "Không thể tạo dịch vụ: Lập chỉ mục mã không được cấu hình đúng cách" + }, + "orchestrator": { + "indexingFailedNoBlocks": "Lập chỉ mục thất bại: Không có khối mã nào được lập chỉ mục thành công. Điều này thường cho thấy vấn đề cấu hình embedder.", + "indexingFailedCritical": "Lập chỉ mục thất bại: Không có khối mã nào được lập chỉ mục thành công mặc dù đã tìm thấy tệp để xử lý. Điều này cho thấy lỗi nghiêm trọng của embedder.", + "fileWatcherStarted": "Trình theo dõi tệp đã khởi động.", + "fileWatcherStopped": "Trình theo dõi tệp đã dừng.", + "failedDuringInitialScan": "Thất bại trong quá trình quét ban đầu: {{errorMessage}}", + "unknownError": "Lỗi không xác định", + "indexingRequiresWorkspace": "Lập chỉ mục yêu cầu một thư mục workspace đang mở" } } diff --git a/src/i18n/locales/zh-CN/embeddings.json b/src/i18n/locales/zh-CN/embeddings.json index 3247631bb2..1589689c06 100644 --- a/src/i18n/locales/zh-CN/embeddings.json +++ b/src/i18n/locales/zh-CN/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "无法确定提供商 '{{provider}}' 的模型 '{{modelId}}' 的向量维度。请检查模型配置文件或配置。", "qdrantUrlMissing": "创建向量存储缺少 Qdrant URL", "codeIndexingNotConfigured": "无法创建服务:代码索引未正确配置" + }, + "orchestrator": { + "indexingFailedNoBlocks": "索引失败:没有代码块被成功索引。这通常表示 Embedder 配置问题。", + "indexingFailedCritical": "索引失败:尽管找到了要处理的文件,但没有代码块被成功索引。这表示 Embedder 出现严重故障。", + "fileWatcherStarted": "文件监控已启动。", + "fileWatcherStopped": "文件监控已停止。", + "failedDuringInitialScan": "初始扫描失败:{{errorMessage}}", + "unknownError": "未知错误", + "indexingRequiresWorkspace": "索引需要打开的工作区文件夹" } } diff --git a/src/i18n/locales/zh-TW/embeddings.json b/src/i18n/locales/zh-TW/embeddings.json index b3b3231d4a..2dc41221f3 100644 --- a/src/i18n/locales/zh-TW/embeddings.json +++ b/src/i18n/locales/zh-TW/embeddings.json @@ -52,5 +52,14 @@ "vectorDimensionNotDetermined": "無法確定提供商 '{{provider}}' 的模型 '{{modelId}}' 的向量維度。請檢查模型設定檔或設定。", "qdrantUrlMissing": "建立向量儲存缺少 Qdrant URL", "codeIndexingNotConfigured": "無法建立服務:程式碼索引未正確設定" + }, + "orchestrator": { + "indexingFailedNoBlocks": "索引失敗:沒有程式碼區塊被成功索引。這通常表示 Embedder 設定問題。", + "indexingFailedCritical": "索引失敗:儘管找到了要處理的檔案,但沒有程式碼區塊被成功索引。這表示 Embedder 出現嚴重故障。", + "fileWatcherStarted": "檔案監控已啟動。", + "fileWatcherStopped": "檔案監控已停止。", + "failedDuringInitialScan": "初始掃描失敗:{{errorMessage}}", + "unknownError": "未知錯誤", + "indexingRequiresWorkspace": "索引需要開啟的工作區資料夾" } } diff --git a/src/services/code-index/orchestrator.ts b/src/services/code-index/orchestrator.ts index 505aee7668..fbc4a24118 100644 --- a/src/services/code-index/orchestrator.ts +++ b/src/services/code-index/orchestrator.ts @@ -7,6 +7,7 @@ import { DirectoryScanner } from "./processors" import { CacheManager } from "./cache-manager" import { TelemetryService } from "@roo-code/telemetry" import { TelemetryEventName } from "@roo-code/types" +import { t } from "../../i18n" /** * Manages the code indexing workflow, coordinating between different services and managers. @@ -94,6 +95,13 @@ export class CodeIndexOrchestrator { * Initiates the indexing process (initial scan and starts watcher). */ public async startIndexing(): Promise { + // Check if workspace is available first + if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { + this.stateManager.setSystemState("Error", t("embeddings:orchestrator.indexingRequiresWorkspace")) + console.warn("[CodeIndexOrchestrator] Start rejected: No workspace folder open.") + return + } + if (!this.configManager.isFeatureConfigured) { this.stateManager.setSystemState("Standby", "Missing configuration. Save your settings to start indexing.") console.warn("[CodeIndexOrchestrator] Start rejected: Missing configuration.") @@ -165,9 +173,7 @@ export class CodeIndexOrchestrator { const firstError = batchErrors[0] throw new Error(`Indexing failed: ${firstError.message}`) } else { - throw new Error( - "Indexing failed: No code blocks were successfully indexed. This usually indicates an embedder configuration issue.", - ) + throw new Error(t("embeddings:orchestrator.indexingFailedNoBlocks")) } } @@ -191,14 +197,12 @@ export class CodeIndexOrchestrator { // Final sanity check: If we found blocks but indexed none and somehow no errors were reported, // this is still a failure if (cumulativeBlocksFoundSoFar > 0 && cumulativeBlocksIndexed === 0) { - throw new Error( - "Indexing failed: No code blocks were successfully indexed despite finding files to process. This indicates a critical embedder failure.", - ) + throw new Error(t("embeddings:orchestrator.indexingFailedCritical")) } await this._startWatcher() - this.stateManager.setSystemState("Indexed", "File watcher started.") + this.stateManager.setSystemState("Indexed", t("embeddings:orchestrator.fileWatcherStarted")) } catch (error: any) { console.error("[CodeIndexOrchestrator] Error during indexing:", error) TelemetryService.instance.captureEvent(TelemetryEventName.CODE_INDEX_ERROR, { @@ -219,7 +223,12 @@ export class CodeIndexOrchestrator { await this.cacheManager.clearCacheFile() - this.stateManager.setSystemState("Error", `Failed during initial scan: ${error.message || "Unknown error"}`) + this.stateManager.setSystemState( + "Error", + t("embeddings:orchestrator.failedDuringInitialScan", { + errorMessage: error.message || t("embeddings:orchestrator.unknownError"), + }), + ) this.stopWatcher() } finally { this._isProcessing = false @@ -235,7 +244,7 @@ export class CodeIndexOrchestrator { this._fileWatcherSubscriptions = [] if (this.stateManager.state !== "Error") { - this.stateManager.setSystemState("Standby", "File watcher stopped.") + this.stateManager.setSystemState("Standby", t("embeddings:orchestrator.fileWatcherStopped")) } this._isProcessing = false } From 0504199ce418b6857e5eb8c238570e53c3f90d69 Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Fri, 25 Jul 2025 19:39:18 -0500 Subject: [PATCH 14/44] refactor: consolidate HuggingFace models API into providers/fetchers (#6228) refactor: move HuggingFace models API to providers/fetchers - Moved getHuggingFaceModels functionality from src/api/huggingface-models.ts to src/api/providers/fetchers/huggingface.ts - Added getHuggingFaceModelsWithMetadata function to maintain the same API interface - Updated import in webviewMessageHandler.ts to use the new location - Deleted the now redundant src/api/huggingface-models.ts file This consolidates all HuggingFace-related API logic into a single location within the providers/fetchers directory structure. --- src/api/huggingface-models.ts | 61 ----------------------- src/api/providers/fetchers/huggingface.ts | 61 +++++++++++++++++++++++ src/core/webview/webviewMessageHandler.ts | 4 +- 3 files changed, 63 insertions(+), 63 deletions(-) delete mode 100644 src/api/huggingface-models.ts diff --git a/src/api/huggingface-models.ts b/src/api/huggingface-models.ts deleted file mode 100644 index 1ee6369d4b..0000000000 --- a/src/api/huggingface-models.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { - getHuggingFaceModels as fetchModels, - getCachedRawHuggingFaceModels, - type HuggingFaceModel, -} from "./providers/fetchers/huggingface" -import axios from "axios" -import { HUGGINGFACE_API_URL } from "@roo-code/types" - -export interface HuggingFaceModelsResponse { - models: HuggingFaceModel[] - cached: boolean - timestamp: number -} - -export async function getHuggingFaceModels(): Promise { - try { - // First, trigger the fetch to populate cache - await fetchModels() - - // Get the raw models from cache - const cachedRawModels = getCachedRawHuggingFaceModels() - - if (cachedRawModels) { - return { - models: cachedRawModels, - cached: true, - timestamp: Date.now(), - } - } - - // If no cached raw models, fetch directly from API - const response = await axios.get(HUGGINGFACE_API_URL, { - headers: { - "Upgrade-Insecure-Requests": "1", - "Sec-Fetch-Dest": "document", - "Sec-Fetch-Mode": "navigate", - "Sec-Fetch-Site": "none", - "Sec-Fetch-User": "?1", - Priority: "u=0, i", - Pragma: "no-cache", - "Cache-Control": "no-cache", - }, - timeout: 10000, - }) - - const models = response.data?.data || [] - - return { - models, - cached: false, - timestamp: Date.now(), - } - } catch (error) { - console.error("Failed to get HuggingFace models:", error) - return { - models: [], - cached: false, - timestamp: Date.now(), - } - } -} diff --git a/src/api/providers/fetchers/huggingface.ts b/src/api/providers/fetchers/huggingface.ts index 16c33b9e04..7a45c74535 100644 --- a/src/api/providers/fetchers/huggingface.ts +++ b/src/api/providers/fetchers/huggingface.ts @@ -227,3 +227,64 @@ export function getCachedRawHuggingFaceModels(): HuggingFaceModel[] | null { export function clearHuggingFaceCache(): void { cache = null } + +/** + * HuggingFace Models Response Interface + */ +export interface HuggingFaceModelsResponse { + models: HuggingFaceModel[] + cached: boolean + timestamp: number +} + +/** + * Get HuggingFace models with response metadata + * This function provides a higher-level API that includes cache status and timestamp + */ +export async function getHuggingFaceModelsWithMetadata(): Promise { + try { + // First, trigger the fetch to populate cache + await getHuggingFaceModels() + + // Get the raw models from cache + const cachedRawModels = getCachedRawHuggingFaceModels() + + if (cachedRawModels) { + return { + models: cachedRawModels, + cached: true, + timestamp: Date.now(), + } + } + + // If no cached raw models, fetch directly from API + const response = await axios.get(HUGGINGFACE_API_URL, { + headers: { + "Upgrade-Insecure-Requests": "1", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Site": "none", + "Sec-Fetch-User": "?1", + Priority: "u=0, i", + Pragma: "no-cache", + "Cache-Control": "no-cache", + }, + timeout: 10000, + }) + + const models = response.data?.data || [] + + return { + models, + cached: false, + timestamp: Date.now(), + } + } catch (error) { + console.error("Failed to get HuggingFace models:", error) + return { + models: [], + cached: false, + timestamp: Date.now(), + } + } +} diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index c0ff851087..82c780adf4 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -676,8 +676,8 @@ export const webviewMessageHandler = async ( break case "requestHuggingFaceModels": try { - const { getHuggingFaceModels } = await import("../../api/huggingface-models") - const huggingFaceModelsResponse = await getHuggingFaceModels() + const { getHuggingFaceModelsWithMetadata } = await import("../../api/providers/fetchers/huggingface") + const huggingFaceModelsResponse = await getHuggingFaceModelsWithMetadata() provider.postMessageToWebview({ type: "huggingFaceModels", huggingFaceModels: huggingFaceModelsResponse.models, From 97ec777e9c9910ea3a773caf00c89f3996b5846f Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 25 Jul 2025 23:36:25 -0400 Subject: [PATCH 15/44] Clean up some of the hugging face provider settings (#6236) --- .../settings/providers/HuggingFace.tsx | 78 +++---------------- 1 file changed, 12 insertions(+), 66 deletions(-) diff --git a/webview-ui/src/components/settings/providers/HuggingFace.tsx b/webview-ui/src/components/settings/providers/HuggingFace.tsx index afbdf2ff59..8716739d80 100644 --- a/webview-ui/src/components/settings/providers/HuggingFace.tsx +++ b/webview-ui/src/components/settings/providers/HuggingFace.tsx @@ -1,22 +1,14 @@ import { useCallback, useState, useEffect, useMemo } from "react" import { useEvent } from "react-use" -import { VSCodeTextField, VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" +import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import type { ProviderSettings } from "@roo-code/types" -import { - HUGGINGFACE_DEFAULT_MAX_TOKENS, - HUGGINGFACE_MAX_TOKENS_FALLBACK, - HUGGINGFACE_SLIDER_STEP, - HUGGINGFACE_SLIDER_MIN, - HUGGINGFACE_TEMPERATURE_MAX_VALUE, -} from "@roo-code/types" import { ExtensionMessage } from "@roo/ExtensionMessage" import { vscode } from "@src/utils/vscode" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" -import { SearchableSelect, type SearchableSelectOption, Slider } from "@src/components/ui" -import { TemperatureControl } from "../TemperatureControl" +import { SearchableSelect, type SearchableSelectOption } from "@src/components/ui" import { cn } from "@src/lib/utils" import { formatPrice } from "@/utils/formatPrice" @@ -179,6 +171,16 @@ export const HuggingFace = ({ apiConfiguration, setApiConfigurationField }: Hugg
+
+ {t("settings:providers.apiKeyStorageNotice")} +
+ + {!apiConfiguration?.huggingFaceApiKey && ( + + {t("settings:providers.getHuggingFaceApiKey")} + + )} +
)} - - {/* Temperature control */} - setApiConfigurationField("modelTemperature", value)} - maxValue={HUGGINGFACE_TEMPERATURE_MAX_VALUE} - /> - - {/* Max tokens control */} -
- - setApiConfigurationField("includeMaxTokens", (e.target as HTMLInputElement).checked) - }> - - -
- {t("settings:limitMaxTokensDescription")} -
- - {apiConfiguration?.includeMaxTokens && ( -
-
- -
- setApiConfigurationField("modelMaxTokens", value)} - /> - - {apiConfiguration?.modelMaxTokens || HUGGINGFACE_DEFAULT_MAX_TOKENS} - -
-
- {t("settings:maxTokensGenerateDescription")} -
-
-
- )} -
- -
- {t("settings:providers.apiKeyStorageNotice")} -
- - {!apiConfiguration?.huggingFaceApiKey && ( - - {t("settings:providers.getHuggingFaceApiKey")} - - )} ) } From 55d23e0d2676d8a689b54c5ddef4a091c7bdf81d Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 26 Jul 2025 00:22:11 -0400 Subject: [PATCH 16/44] chore: add changeset for v3.24.0 (#6237) --- .changeset/v3.24.0.md | 17 ++++ README.md | 9 +- locales/ca/README.md | 87 ++++++++++--------- locales/de/README.md | 87 ++++++++++--------- locales/es/README.md | 87 ++++++++++--------- locales/fr/README.md | 87 ++++++++++--------- locales/hi/README.md | 87 ++++++++++--------- locales/id/README.md | 87 ++++++++++--------- locales/it/README.md | 87 ++++++++++--------- locales/ja/README.md | 87 ++++++++++--------- locales/ko/README.md | 87 ++++++++++--------- locales/nl/README.md | 87 ++++++++++--------- locales/pl/README.md | 87 ++++++++++--------- locales/pt-BR/README.md | 87 ++++++++++--------- locales/ru/README.md | 87 ++++++++++--------- locales/tr/README.md | 87 ++++++++++--------- locales/vi/README.md | 87 ++++++++++--------- locales/zh-CN/README.md | 87 ++++++++++--------- locales/zh-TW/README.md | 87 ++++++++++--------- src/core/webview/ClineProvider.ts | 2 +- .../src/components/chat/Announcement.tsx | 10 +++ webview-ui/src/i18n/locales/ca/chat.json | 6 +- webview-ui/src/i18n/locales/de/chat.json | 6 +- webview-ui/src/i18n/locales/en/chat.json | 5 +- webview-ui/src/i18n/locales/es/chat.json | 6 +- webview-ui/src/i18n/locales/fr/chat.json | 6 +- webview-ui/src/i18n/locales/hi/chat.json | 6 +- webview-ui/src/i18n/locales/id/chat.json | 6 +- webview-ui/src/i18n/locales/it/chat.json | 6 +- webview-ui/src/i18n/locales/ja/chat.json | 6 +- webview-ui/src/i18n/locales/ko/chat.json | 6 +- webview-ui/src/i18n/locales/nl/chat.json | 6 +- webview-ui/src/i18n/locales/pl/chat.json | 6 +- webview-ui/src/i18n/locales/pt-BR/chat.json | 6 +- webview-ui/src/i18n/locales/ru/chat.json | 6 +- webview-ui/src/i18n/locales/tr/chat.json | 6 +- webview-ui/src/i18n/locales/vi/chat.json | 6 +- webview-ui/src/i18n/locales/zh-CN/chat.json | 6 +- webview-ui/src/i18n/locales/zh-TW/chat.json | 6 +- 39 files changed, 852 insertions(+), 772 deletions(-) create mode 100644 .changeset/v3.24.0.md diff --git a/.changeset/v3.24.0.md b/.changeset/v3.24.0.md new file mode 100644 index 0000000000..1b0f58a2ac --- /dev/null +++ b/.changeset/v3.24.0.md @@ -0,0 +1,17 @@ +--- +"roo-cline": minor +--- + +- Add Hugging Face provider with support for open source models (thanks @TGlide!) +- Add terminal command permissions UI to chat interface +- Add support for Agent Rules standard via AGENTS.md (thanks @sgryphon!) +- Add settings to control diagnostic messages +- Fix auto-approve checkbox to be toggled at any time (thanks @KJ7LNW!) +- Add efficiency warning for single SEARCH/REPLACE blocks in apply_diff (thanks @KJ7LNW!) +- Fix respect maxReadFileLine setting for file mentions to prevent context exhaustion (thanks @sebinseban!) +- Fix Ollama API URL normalization by removing trailing slashes (thanks @Naam!) +- Fix restore list styles for markdown lists in chat interface (thanks @village-way!) +- Add support for bedrock api keys +- Add confirmation dialog and proper cleanup for marketplace mode removal +- Fix cancel auto-approve timer when editing follow-up suggestion (thanks @hassoncs!) +- Fix add error message when no workspace folder is open for code indexing diff --git a/README.md b/README.md index c173cdb3d7..092b31e942 100644 --- a/README.md +++ b/README.md @@ -49,12 +49,13 @@ Check out the [CHANGELOG](CHANGELOG.md) for detailed updates and fixes. --- -## 🎉 Roo Code 3.23 Released +## 🎉 Roo Code 3.24 Released -Roo Code 3.23 brings powerful new features and significant improvements to enhance your development workflow! +Roo Code 3.24 brings powerful new features and significant improvements to enhance your development workflow! -- **Codebase Indexing Graduated from Experimental** - Full codebase indexing is now stable and ready for production use with improved search and context understanding. -- **New Todo List Feature** - Keep your tasks on track with integrated todo management that helps you stay organized and focused on your development goals. +- **Hugging Face Provider** - Access tons of great open source models directly through the new Hugging Face provider with seamless integration and model selection. +- **Inline Command Controls** - New auto-approve and deny controls for command execution give you precise control over terminal operations with customizable permissions. +- **AGENTS.md Rules Support** - Adds support for a community standard AGENTS.md file in the root of the project. --- diff --git a/locales/ca/README.md b/locales/ca/README.md index c75275881c..c029d7b269 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -50,12 +50,13 @@ Consulteu el [CHANGELOG](../../CHANGELOG.md) per a actualitzacions i correccions --- -## 🎉 Roo Code 3.23 Llançat +## 🎉 Roo Code 3.24 Llançat -Roo Code 3.23 aporta noves funcionalitats potents i millores significatives per millorar el vostre flux de treball de desenvolupament! +Roo Code 3.24 aporta noves funcionalitats potents i millores significatives per millorar el vostre flux de treball de desenvolupament! -- **Indexació de base de codi graduada d'experimental** - La indexació completa de la base de codi ara és estable i llesta per a ús en producció amb cerca millorada i comprensió del context. -- **Nova funcionalitat de llista de tasques** - Mantingueu les vostres tasques en el bon camí amb gestió integrada de tasques que us ajuda a mantenir-vos organitzats i centrats en els vostres objectius de desenvolupament. +- **Proveïdor Hugging Face** - Accediu a moltíssims models de codi obert excel·lents directament a través del nou proveïdor Hugging Face amb integració perfecta i selecció de models. +- **Controls de Comandes en Línia** - Nous controls d'aprovació automàtica i denegació per a l'execució de comandes us donen un control precís sobre les operacions de terminal amb permisos personalitzables. +- **Suport per a Regles AGENTS.md** - Afegeix suport per a un fitxer AGENTS.md estàndard de la comunitat a l'arrel del projecte. --- @@ -180,44 +181,46 @@ 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
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index e9357daa47..647fed2639 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -50,12 +50,13 @@ Sehen Sie sich das [CHANGELOG](../../CHANGELOG.md) für detaillierte Updates und --- -## 🎉 Roo Code 3.23 veröffentlicht +## 🎉 Roo Code 3.24 veröffentlicht -Roo Code 3.23 bringt mächtige neue Funktionen und bedeutende Verbesserungen, um deinen Entwicklungsworkflow zu verbessern! +Roo Code 3.24 bringt mächtige neue Funktionen und bedeutende Verbesserungen, um deinen Entwicklungsworkflow zu verbessern! -- **Codebase-Indexierung von experimentell graduiert** - Die vollständige Codebase-Indexierung ist jetzt stabil und bereit für den Produktionseinsatz mit verbesserter Suche und Kontextverständnis. -- **Neue Todo-Listen-Funktion** - Halte deine Aufgaben auf Kurs mit integriertem Aufgabenmanagement, das dir hilft, organisiert zu bleiben und dich auf deine Entwicklungsziele zu konzentrieren. +- **Hugging Face Provider** - Greife auf unzählige großartige Open-Source-Modelle direkt über den neuen Hugging Face Provider mit nahtloser Integration und Modellauswahl zu. +- **Inline-Befehlssteuerungen** - Neue Auto-Genehmigung und Verweigerungssteuerungen für die Befehlsausführung geben dir präzise Kontrolle über Terminal-Operationen mit anpassbaren Berechtigungen. +- **AGENTS.md Regeln-Unterstützung** - Fügt Unterstützung für eine Community-Standard AGENTS.md-Datei im Projektverzeichnis hinzu. --- @@ -180,44 +181,46 @@ 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
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 09eb159479..8cbebf52b1 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -50,12 +50,13 @@ Consulta el [CHANGELOG](../../CHANGELOG.md) para ver actualizaciones detalladas --- -## 🎉 Roo Code 3.23 Lanzado +## 🎉 Roo Code 3.24 Lanzado -¡Roo Code 3.23 trae nuevas funcionalidades poderosas y mejoras significativas para mejorar tu flujo de trabajo de desarrollo! +¡Roo Code 3.24 trae nuevas funcionalidades poderosas y mejoras significativas para mejorar tu flujo de trabajo de desarrollo! -- **Indexación de base de código graduada de experimental** - La indexación completa de la base de código ahora es estable y está lista para uso en producción con búsqueda mejorada y comprensión del contexto. -- **Nueva funcionalidad de lista de tareas** - Mantén tus tareas en el buen camino con gestión integrada de tareas que te ayuda a mantenerte organizado y enfocado en tus objetivos de desarrollo. +- **Proveedor Hugging Face** - Accede a toneladas de excelentes modelos de código abierto directamente a través del nuevo proveedor Hugging Face con integración perfecta y selección de modelos. +- **Controles de Comandos en Línea** - Nuevos controles de auto-aprobación y denegación para la ejecución de comandos te dan control preciso sobre las operaciones de terminal con permisos personalizables. +- **Soporte para Reglas AGENTS.md** - Añade soporte para un archivo AGENTS.md estándar de la comunidad en la raíz del proyecto. --- @@ -180,44 +181,46 @@ 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
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 0ca48da21e..35c33cff35 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -50,12 +50,13 @@ Consultez le [CHANGELOG](../../CHANGELOG.md) pour des mises à jour détaillées --- -## 🎉 Roo Code 3.23 est sorti +## 🎉 Roo Code 3.24 est sorti -Roo Code 3.23 apporte de puissantes nouvelles fonctionnalités et des améliorations significatives pour améliorer ton flux de travail de développement ! +Roo Code 3.24 apporte de puissantes nouvelles fonctionnalités et des améliorations significatives pour améliorer ton flux de travail de développement ! -- **Indexation de base de code graduée d'expérimentale** - L'indexation complète de la base de code est maintenant stable et prête pour un usage en production avec une recherche améliorée et une compréhension du contexte. -- **Nouvelle fonctionnalité de liste de tâches** - Garde tes tâches sur la bonne voie avec une gestion intégrée des tâches qui t'aide à rester organisé et concentré sur tes objectifs de développement. +- **Fournisseur Hugging Face** - Accède à des tonnes d'excellents modèles open source directement via le nouveau fournisseur Hugging Face avec une intégration transparente et une sélection de modèles. +- **Contrôles de Commandes en Ligne** - De nouveaux contrôles d'auto-approbation et de refus pour l'exécution de commandes te donnent un contrôle précis sur les opérations de terminal avec des permissions personnalisables. +- **Support des Règles AGENTS.md** - Ajoute le support d'un fichier AGENTS.md standard de la communauté à la racine du projet. --- @@ -180,44 +181,46 @@ 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
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index aa3da73d0f..01693feb1d 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -50,12 +50,13 @@ --- -## 🎉 Roo Code 3.23 जारी +## 🎉 Roo Code 3.24 जारी -Roo Code 3.23 आपके डेवलपमेंट वर्कफ़्लो को बेहतर बनाने के लिए शक्तिशाली नई सुविधाएं और महत्वपूर्ण सुधार लाता है! +Roo Code 3.24 आपके डेवलपमेंट वर्कफ़्लो को बेहतर बनाने के लिए शक्तिशाली नई सुविधाएं और महत्वपूर्ण सुधार लाता है! -- **कोडबेस इंडेक्सिंग एक्सपेरिमेंटल से ग्रेजुएट** - पूर्ण कोडबेस इंडेक्सिंग अब स्थिर है और बेहतर खोज और संदर्भ समझ के साथ प्रोडक्शन उपयोग के लिए तैयार है। -- **नई टूडू लिस्ट सुविधा** - एकीकृत टास्क प्रबंधन के साथ अपने टास्क को ट्रैक पर रखें जो आपको व्यवस्थित रहने और अपने डेवलपमेंट लक्ष्यों पर केंद्रित रहने में मदद करता है। +- **Hugging Face प्रोवाइडर** - नए Hugging Face प्रोवाइडर के माध्यम से सीमलेस एकीकरण और मॉडल चयन के साथ सीधे बहुत सारे बेहतरीन ओपन सोर्स मॉडल्स तक पहुंच प्राप्त करें। +- **इनलाइन कमांड कंट्रोल्स** - कमांड निष्पादन के लिए नए ऑटो-अप्रूव और डिनाई कंट्रोल्स आपको अनुकूलन योग्य अनुमतियों के साथ टर्मिनल ऑपरेशन पर सटीक नियंत्रण देते हैं। +- **AGENTS.md नियम समर्थन** - प्रोजेक्ट की रूट में कम्युनिटी स्टैंडर्ड AGENTS.md फ़ाइल के लिए समर्थन जोड़ता है। --- @@ -180,44 +181,46 @@ code --install-extension bin/roo-cline-.vsix Roo Code को बेहतर बनाने में मदद करने वाले हमारे सभी योगदानकर्ताओं को धन्यवाद! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## लाइसेंस diff --git a/locales/id/README.md b/locales/id/README.md index 2aa0d6b423..a922c8d28b 100644 --- a/locales/id/README.md +++ b/locales/id/README.md @@ -49,12 +49,13 @@ Lihat [CHANGELOG](../../CHANGELOG.md) untuk update dan perbaikan detail. --- -## 🎉 Roo Code 3.23 Dirilis +## 🎉 Roo Code 3.24 Dirilis -Roo Code 3.23 menghadirkan fitur-fitur baru yang powerful dan peningkatan signifikan untuk meningkatkan workflow development kamu! +Roo Code 3.24 menghadirkan fitur-fitur baru yang powerful dan peningkatan signifikan untuk meningkatkan workflow development kamu! -- **Indexing codebase lulus dari eksperimental** - Indexing codebase lengkap sekarang stabil dan siap untuk penggunaan produksi dengan pencarian yang ditingkatkan dan pemahaman konteks. -- **Fitur daftar todo baru** - Jaga tugas kamu tetap on track dengan manajemen tugas terintegrasi yang membantu kamu tetap terorganisir dan fokus pada tujuan development kamu. +- **Hugging Face Provider** - Akses model open source yang luar biasa langsung melalui Hugging Face provider baru dengan integrasi yang mulus dan pemilihan model. +- **Kontrol Perintah Inline** - Kontrol auto-approve dan tolak baru untuk eksekusi perintah memberikan kontrol yang tepat atas operasi terminal dengan izin yang dapat disesuaikan. +- **Dukungan Aturan AGENTS.md** - Menambahkan dukungan untuk file AGENTS.md standar komunitas di root proyek. --- @@ -174,44 +175,46 @@ Kami menyukai kontribusi komunitas! Mulai dengan membaca [CONTRIBUTING.md](CONTR Terima kasih kepada semua kontributor kami yang telah membantu membuat Roo Code lebih baik! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## License diff --git a/locales/it/README.md b/locales/it/README.md index c357f4330d..8f18ab1f75 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -50,12 +50,13 @@ Consulta il [CHANGELOG](../../CHANGELOG.md) per aggiornamenti dettagliati e corr --- -## 🎉 Roo Code 3.23 Rilasciato +## 🎉 Roo Code 3.24 Rilasciato -Roo Code 3.23 porta nuove funzionalità potenti e miglioramenti significativi per migliorare il tuo flusso di lavoro di sviluppo! +Roo Code 3.24 porta nuove funzionalità potenti e miglioramenti significativi per migliorare il tuo flusso di lavoro di sviluppo! -- **Indicizzazione codebase graduata da sperimentale** - L'indicizzazione completa del codebase è ora stabile e pronta per l'uso in produzione con ricerca migliorata e comprensione del contesto. -- **Nuova funzionalità lista todo** - Mantieni i tuoi task in carreggiata con gestione integrata dei task che ti aiuta a rimanere organizzato e concentrato sui tuoi obiettivi di sviluppo. +- **Provider Hugging Face** - Accedi a fantastici modelli open source direttamente tramite il nuovo provider Hugging Face con integrazione perfetta e selezione dei modelli. +- **Controlli Comando Inline** - Nuovi controlli di auto-approvazione e rifiuto per l'esecuzione dei comandi ti danno controllo preciso sulle operazioni del terminale con permessi personalizzabili. +- **Supporto Regole AGENTS.md** - Aggiunge supporto per un file AGENTS.md standard della comunità nella root del progetto. --- @@ -180,44 +181,46 @@ 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
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 2c8b5ecf27..660c575196 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -50,12 +50,13 @@ --- -## 🎉 Roo Code 3.23 リリース +## 🎉 Roo Code 3.24 リリース -Roo Code 3.23は、開発ワークフローを向上させる強力な新機能と重要な改善をもたらします! +Roo Code 3.24は、開発ワークフローを向上させる強力な新機能と重要な改善をもたらします! -- **コードベースインデックス化が実験的から卒業** - 完全なコードベースインデックス化が安定し、改善された検索とコンテキスト理解でプロダクション使用の準備が整いました。 -- **新しいTodoリスト機能** - 統合されたタスク管理でタスクを軌道に乗せ、整理された状態を保ち、開発目標に集中できるようサポートします。 +- **Hugging Face Provider** - 新しいHugging Face Providerを通じて、シームレスな統合とモデル選択で、優れたオープンソースモデルに直接アクセスできます。 +- **インラインコマンドコントロール** - コマンド実行のための新しい自動承認と拒否コントロールにより、カスタマイズ可能な権限でターミナル操作を正確に制御できます。 +- **AGENTS.md ルールサポート** - プロジェクトのルートにコミュニティ標準のAGENTS.mdファイルのサポートを追加します。 --- @@ -180,44 +181,46 @@ code --install-extension bin/roo-cline-.vsix Roo Codeの改善に貢献してくれたすべての貢献者に感謝します! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 3b41d7927d..d748f21118 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -50,12 +50,13 @@ --- -## 🎉 Roo Code 3.23 출시 +## 🎉 Roo Code 3.24 출시 -Roo Code 3.23가 개발 워크플로우를 향상시키는 강력한 새 기능과 중요한 개선사항을 제공합니다! +Roo Code 3.24가 개발 워크플로우를 향상시키는 강력한 새 기능과 중요한 개선사항을 제공합니다! -- **코드베이스 인덱싱이 실험적에서 졸업** - 전체 코드베이스 인덱싱이 이제 안정적이며 향상된 검색과 컨텍스트 이해로 프로덕션 사용 준비가 완료되었습니다. -- **새로운 할 일 목록 기능** - 통합된 작업 관리로 작업을 궤도에 유지하여 체계적으로 정리하고 개발 목표에 집중할 수 있도록 도와줍니다. +- **Hugging Face Provider** - 새로운 Hugging Face Provider를 통해 원활한 통합과 모델 선택으로 뛰어난 오픈소스 모델에 직접 액세스할 수 있습니다. +- **인라인 명령 제어** - 명령 실행을 위한 새로운 자동 승인 및 거부 제어로 사용자 정의 가능한 권한으로 터미널 작업을 정확하게 제어할 수 있습니다. +- **AGENTS.md 규칙 지원** - 프로젝트 루트에 커뮤니티 표준 AGENTS.md 파일에 대한 지원을 추가합니다. --- @@ -180,44 +181,46 @@ code --install-extension bin/roo-cline-.vsix Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사드립니다! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## 라이선스 diff --git a/locales/nl/README.md b/locales/nl/README.md index 77372be7ff..8d59256181 100644 --- a/locales/nl/README.md +++ b/locales/nl/README.md @@ -50,12 +50,13 @@ Bekijk de [CHANGELOG](../../CHANGELOG.md) voor gedetailleerde updates en fixes. --- -## 🎉 Roo Code 3.23 Uitgebracht +## 🎉 Roo Code 3.24 Uitgebracht -Roo Code 3.23 brengt krachtige nieuwe functies en significante verbeteringen om je ontwikkelingsworkflow te verbeteren! +Roo Code 3.24 brengt krachtige nieuwe functies en significante verbeteringen om je ontwikkelingsworkflow te verbeteren! -- **Codebase indexering afgestudeerd van experimenteel** - Volledige codebase indexering is nu stabiel en klaar voor productiegebruik met verbeterde zoekfunctionaliteit en contextbegrip. -- **Nieuwe todo-lijst functie** - Houd je taken op koers met geïntegreerd taakbeheer dat je helpt georganiseerd te blijven en gefocust op je ontwikkelingsdoelen. +- **Hugging Face Provider** - Krijg toegang tot geweldige open source modellen direct via de nieuwe Hugging Face provider met naadloze integratie en modelselectie. +- **Inline Commando Controles** - Nieuwe auto-goedkeuring en weiger controles voor commando-uitvoering geven je precieze controle over terminal operaties met aanpasbare machtigingen. +- **AGENTS.md Regels Ondersteuning** - Voegt ondersteuning toe voor een community standaard AGENTS.md bestand in de root van het project. --- @@ -180,44 +181,46 @@ We houden van bijdragen uit de community! Begin met het lezen van onze [CONTRIBU Dank aan alle bijdragers die Roo Code beter hebben gemaakt! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Licentie diff --git a/locales/pl/README.md b/locales/pl/README.md index 5a44275d6e..a12b895bcc 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -50,12 +50,13 @@ Sprawdź [CHANGELOG](../../CHANGELOG.md), aby uzyskać szczegółowe informacje --- -## 🎉 Roo Code 3.23 został wydany +## 🎉 Roo Code 3.24 został wydany -Roo Code 3.23 wprowadza potężne nowe funkcje i znaczące usprawnienia, aby ulepszyć Twój przepływ pracy deweloperskiej! +Roo Code 3.24 wprowadza potężne nowe funkcje i znaczące usprawnienia, aby ulepszyć Twój przepływ pracy deweloperskiej! -- **Indeksowanie bazy kodu ukończone z eksperymentalnego** - Pełne indeksowanie bazy kodu jest teraz stabilne i gotowe do użytku produkcyjnego z ulepszonymi wyszukiwaniem i rozumieniem kontekstu. -- **Nowa funkcja listy zadań** - Utrzymuj swoje zadania na właściwym torze dzięki zintegrowanemu zarządzaniu zadaniami, które pomaga ci pozostać zorganizowanym i skupionym na celach deweloperskich. +- **Hugging Face Provider** - Uzyskaj dostęp do wielu wspaniałych modeli open source bezpośrednio przez nowego dostawcę Hugging Face z płynną integracją i wyborem modeli. +- **Kontrole Poleceń Inline** - Nowe kontrole automatycznego zatwierdzania i odrzucania dla wykonywania poleceń dają Ci precyzyjną kontrolę nad operacjami terminala z konfigurowalnymi uprawnieniami. +- **Wsparcie Reguł AGENTS.md** - Dodaje wsparcie dla standardowego pliku AGENTS.md społeczności w katalogu głównym projektu. --- @@ -180,44 +181,46 @@ 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
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 8412b94ffc..1abfe2ce0b 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -50,12 +50,13 @@ Confira o [CHANGELOG](../../CHANGELOG.md) para atualizações e correções deta --- -## 🎉 Roo Code 3.23 foi lançado +## 🎉 Roo Code 3.24 foi lançado -O Roo Code 3.23 traz novos recursos poderosos e melhorias significativas para aprimorar seu fluxo de trabalho de desenvolvimento! +O Roo Code 3.24 traz novos recursos poderosos e melhorias significativas para aprimorar seu fluxo de trabalho de desenvolvimento! -- **Indexação de base de código graduada do experimental** - A indexação completa da base de código agora é estável e pronta para uso em produção com busca aprimorada e compreensão de contexto. -- **Nova funcionalidade de lista de tarefas** - Mantenha suas tarefas no caminho certo com gerenciamento integrado de tarefas que ajuda você a se manter organizado e focado em seus objetivos de desenvolvimento. +- **Hugging Face Provider** - Acesse toneladas de excelentes modelos de código aberto diretamente através do novo provedor Hugging Face com integração perfeita e seleção de modelos. +- **Controles de Comando Inline** - Novos controles de aprovação automática e negação para execução de comandos oferecem controle preciso sobre operações de terminal com permissões personalizáveis. +- **Suporte a Regras AGENTS.md** - Adiciona suporte para um arquivo AGENTS.md padrão da comunidade na raiz do projeto. --- @@ -180,44 +181,46 @@ 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
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Licença diff --git a/locales/ru/README.md b/locales/ru/README.md index e3161a73d8..8629023dd1 100644 --- a/locales/ru/README.md +++ b/locales/ru/README.md @@ -50,12 +50,13 @@ --- -## 🎉 Выпущен Roo Code 3.23 +## 🎉 Выпущен Roo Code 3.24 -Roo Code 3.23 представляет мощные новые функции и значительные улучшения для повышения эффективности вашего рабочего процесса разработки! +Roo Code 3.24 представляет мощные новые функции и значительные улучшения для повышения эффективности вашего рабочего процесса разработки. -- **Индексация кодовой базы выпущена из экспериментальной** - Полная индексация кодовой базы теперь стабильна и готова для производственного использования с улучшенным поиском и пониманием контекста. -- **Новая функция списка дел** - Держите свои задачи на правильном пути с интегрированным управлением задачами, которое помогает вам оставаться организованным и сосредоточенным на ваших целях разработки. +- **Провайдер Hugging Face** - Получите доступ к множеству отличных моделей с открытым исходным кодом напрямую через новый провайдер Hugging Face с бесшовной интеграцией и выбором моделей. +- **Встроенные элементы управления командами** - Новые элементы управления автоматическим подтверждением и отклонением для выполнения команд дают вам точный контроль над операциями терминала с настраиваемыми разрешениями. +- **Поддержка правил AGENTS.md** - Добавляет поддержку стандартного файла AGENTS.md сообщества в корне проекта. --- @@ -180,44 +181,46 @@ code --install-extension bin/roo-cline-.vsix Спасибо всем нашим участникам, которые помогли сделать Roo Code лучше! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Лицензия diff --git a/locales/tr/README.md b/locales/tr/README.md index 7e65ebbafd..7a20da474c 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -50,12 +50,13 @@ Detaylı güncellemeler ve düzeltmeler için [CHANGELOG](../../CHANGELOG.md) do --- -## 🎉 Roo Code 3.23 Yayınlandı +## 🎉 Roo Code 3.24 Yayınlandı -Roo Code 3.23 geliştirme iş akışınızı geliştirmek için güçlü yeni özellikler ve önemli iyileştirmeler getiriyor! +Roo Code 3.24 geliştirme iş akışınızı geliştirmek için güçlü yeni özellikler ve önemli iyileştirmeler getiriyor. -- **Kod Tabanı İndeksleme Deneysel Aşamadan Çıktı** - Tam kod tabanı indeksleme artık kararlı ve geliştirilmiş arama ve bağlam anlayışı ile üretim kullanımına hazır. -- **Yeni Yapılacaklar Listesi Özelliği** - Görevlerinizi yolunda tutun, organize kalmanıza ve geliştirme hedeflerinize odaklanmanıza yardımcı olan entegre görev yönetimi ile. +- **Hugging Face Sağlayıcısı** - Yeni Hugging Face sağlayıcısı aracılığıyla sorunsuz entegrasyon ve model seçimi ile doğrudan tonlarca harika açık kaynak modeline erişin. +- **Satır İçi Komut Kontrolleri** - Komut yürütme için yeni otomatik onay ve reddetme kontrolleri, özelleştirilebilir izinlerle terminal işlemleri üzerinde hassas kontrol sağlar. +- **AGENTS.md Kuralları Desteği** - Projenin kök dizininde topluluk standardı AGENTS.md dosyası için destek ekler. --- @@ -180,44 +181,46 @@ 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
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index 5483d8c2cf..5744fbe2a2 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -50,12 +50,13 @@ Kiểm tra [CHANGELOG](../../CHANGELOG.md) để biết thông tin chi tiết v --- -## 🎉 Đã Phát Hành Roo Code 3.23 +## 🎉 Đã Phát Hành Roo Code 3.24 -Roo Code 3.23 mang đến những tính năng mới mạnh mẽ và cải tiến đáng kể để nâng cao quy trình phát triển của bạn! +Roo Code 3.24 mang đến những tính năng mới mạnh mẽ và cải tiến đáng kể để nâng cao quy trình phát triển của bạn. -- **Lập Chỉ Mục Codebase Tốt Nghiệp Khỏi Thử Nghiệm** - Lập chỉ mục codebase đầy đủ hiện đã ổn định và sẵn sàng cho sử dụng sản xuất với khả năng tìm kiếm và hiểu ngữ cảnh được cải thiện. -- **Tính Năng Danh Sách Việc Cần Làm Mới** - Giữ các tác vụ của bạn đúng hướng với quản lý tác vụ tích hợp giúp bạn có tổ chức và tập trung vào mục tiêu phát triển. +- **Nhà Cung Cấp Hugging Face** - Truy cập hàng tấn mô hình nguồn mở tuyệt vời trực tiếp thông qua nhà cung cấp Hugging Face mới với tích hợp liền mạch và lựa chọn mô hình. +- **Điều Khiển Lệnh Nội Tuyến** - Các điều khiển tự động phê duyệt và từ chối mới cho việc thực thi lệnh cung cấp cho bạn quyền kiểm soát chính xác các hoạt động terminal với quyền hạn có thể tùy chỉnh. +- **Hỗ Trợ Quy Tắc AGENTS.md** - Thêm hỗ trợ cho tệp AGENTS.md tiêu chuẩn cộng đồng trong thư mục gốc của dự án. --- @@ -180,44 +181,46 @@ 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
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index a3af91c935..a043414318 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -50,12 +50,13 @@ --- -## 🎉 Roo Code 3.23 已发布 +## 🎉 Roo Code 3.24 已发布 -Roo Code 3.23 带来强大的新功能和重大改进,提升您的开发工作流程! +Roo Code 3.24 带来强大的新功能和重大改进,提升您的开发工作流程。 -- **代码库索引从实验阶段毕业** - 完整的代码库索引现已稳定,可用于生产环境,具有改进的搜索和上下文理解能力。 -- **新的待办事项列表功能** - 通过集成的任务管理保持任务进度,帮助您保持组织性并专注于开发目标。 +- **Hugging Face 提供者** - 通过新的 Hugging Face 提供者直接访问大量优秀的开源模型,具有无缝集成和模型选择功能。 +- **内联命令控制** - 新的自动批准和拒绝控制功能为命令执行提供精确控制,具有可自定义的权限设置。 +- **AGENTS.md 规则支持** - 添加对项目根目录中社区标准 AGENTS.md 文件的支持。 --- @@ -180,44 +181,46 @@ code --install-extension bin/roo-cline-.vsix 感谢所有帮助改进 Roo Code 的贡献者! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 16f0f7c936..c3b2982531 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -51,12 +51,13 @@ --- -## 🎉 Roo Code 3.23 已發布 +## 🎉 Roo Code 3.24 已發布 -Roo Code 3.23 帶來強大的新功能和重大改進,以提升您的開發工作流程! +Roo Code 3.24 帶來強大的新功能和重大改進,以提升您的開發工作流程。 -- **程式碼庫索引從實驗階段畢業** - 完整的程式碼庫索引現已穩定,可用於生產環境,具有改進的搜尋和上下文理解能力。 -- **新的待辦事項清單功能** - 透過整合的任務管理保持任務進度,幫助您保持組織性並專注於開發目標。 +- **Hugging Face 提供者** - 透過新的 Hugging Face 提供者直接存取大量優秀的開源模型,具有無縫整合和模型選擇功能。 +- **內嵌命令控制** - 新的自動核准和拒絕控制功能為命令執行提供精確控制,具有可自訂的權限設定。 +- **AGENTS.md 規則支援** - 新增對專案根目錄中社群標準 AGENTS.md 檔案的支援。 --- @@ -181,44 +182,46 @@ code --install-extension bin/roo-cline-.vsix 感謝所有幫助改進 Roo Code 的貢獻者! -|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|daniel-lxs
daniel-lxs
|samhvw8
samhvw8
|hannesrudolph
hannesrudolph
| -|:---:|:---:|:---:|:---:|:---:|:---:| -|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|MuriloFP
MuriloFP
|canrobins13
canrobins13
|stea9499
stea9499
| -|joemanley201
joemanley201
|System233
System233
|jr
jr
|nissa-seru
nissa-seru
|jquanton
jquanton
|roomote-agent
roomote-agent
| -|NyxJae
NyxJae
|d-oit
d-oit
|elianiva
elianiva
|wkordalski
wkordalski
|qdaxb
qdaxb
|punkpeye
punkpeye
| -|SannidhyaSah
SannidhyaSah
|xyOz-dev
xyOz-dev
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|cannuri
cannuri
| -|feifei325
feifei325
|zhangtony239
zhangtony239
|chrarnoldus
chrarnoldus
|shariqriazz
shariqriazz
|vigneshsubbiah16
vigneshsubbiah16
|pugazhendhi-m
pugazhendhi-m
| -|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
|lupuletic
lupuletic
|kiwina
kiwina
|liwilliam2021
liwilliam2021
| -|Premshay
Premshay
|psv2522
psv2522
|olweraltuve
olweraltuve
|diarmidmackenzie
diarmidmackenzie
|ChuKhaLi
ChuKhaLi
|PeterDaveHello
PeterDaveHello
| -|aheizi
aheizi
|hassoncs
hassoncs
|nbihan-mediware
nbihan-mediware
|noritaka1166
noritaka1166
|RaySinner
RaySinner
|afshawnlotfi
afshawnlotfi
| -|dleffel
dleffel
|StevenTCramer
StevenTCramer
|Ruakij
Ruakij
|pdecat
pdecat
|kyle-apex
kyle-apex
|emshvac
emshvac
| -|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
|dlab-anton
dlab-anton
|arthurauffray
arthurauffray
| -|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
| -|aitoroses
aitoroses
|anton-otee
anton-otee
|ross
ross
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
|taisukeoe
taisukeoe
| -|avtc
avtc
|eonghk
eonghk
|GOODBOY008
GOODBOY008
|kcwhite
kcwhite
|ronyblum
ronyblum
|teddyOOXX
teddyOOXX
| -|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| -|seedlord
seedlord
|bramburn
bramburn
|benzntech
benzntech
|axkirillov
axkirillov
|olearycrew
olearycrew
|brunobergher
brunobergher
| -|catrielmuller
catrielmuller
|devxpain
devxpain
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
| -|julionav
julionav
|KanTakahiro
KanTakahiro
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
|philfung
philfung
| -|chris-garrett
chris-garrett
|dairui1
dairui1
|dqroid
dqroid
|janaki-sasidhar
janaki-sasidhar
|forestyoo
forestyoo
|hatsu38
hatsu38
| -|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
| -|bbenshalom
bbenshalom
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
| -|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|s97712
s97712
|vladstudio
vladstudio
|vivekfyi
vivekfyi
|tmsjngx0
tmsjngx0
| -|Githubguy132010
Githubguy132010
|DeXtroTip
DeXtroTip
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
| -|thill2323
thill2323
|takakoutso
takakoutso
|student20880
student20880
|shubhamgupta731
shubhamgupta731
|shohei-ihaya
shohei-ihaya
|shivamd1810
shivamd1810
| -|shaybc
shaybc
|sensei-woo
sensei-woo
|samir-nimbly
samir-nimbly
|robertheadley
robertheadley
|refactorthis
refactorthis
|qingyuan1109
qingyuan1109
| -|pokutuna
pokutuna
|philipnext
philipnext
|village-way
village-way
|oprstchn
oprstchn
|nobu007
nobu007
|mosleyit
mosleyit
| -|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|lhish
lhish
| -|kohii
kohii
|pfitz
pfitz
|ExactDoug
ExactDoug
|celestial-vault
celestial-vault
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
| -|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
|Deon588
Deon588
|dleen
dleen
|CW-B-W
CW-B-W
| -|chadgauth
chadgauth
|thecolorblue
thecolorblue
|bogdan0083
bogdan0083
|benashby
benashby
|Atlogit
Atlogit
|atlasgong
atlasgong
| -|andrewshu2000
andrewshu2000
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
|HadesArchitect
HadesArchitect
|alarno
alarno
| -|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
|AMHesch
AMHesch
|tgfjt
tgfjt
| -|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
|RandalSchwartz
RandalSchwartz
| -|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|PaperBoardOfficial
PaperBoardOfficial
|OlegOAndreev
OlegOAndreev
|kvokka
kvokka
| -|ecmasx
ecmasx
|mollux
mollux
|marvijo-code
marvijo-code
|markijbema
markijbema
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
| -|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
|kevinvandijk
kevinvandijk
|KevinZhao
KevinZhao
|ksze
ksze
| -|Juice10
Juice10
|Fovty
Fovty
|Jdo300
Jdo300
|hesara
hesara
| | | + +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| MuriloFP
MuriloFP
| canrobins13
canrobins13
| stea9499
stea9499
| +| joemanley201
joemanley201
| System233
System233
| jr
jr
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| wkordalski
wkordalski
| qdaxb
qdaxb
| punkpeye
punkpeye
| +| SannidhyaSah
SannidhyaSah
| xyOz-dev
xyOz-dev
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| cannuri
cannuri
| +| feifei325
feifei325
| zhangtony239
zhangtony239
| chrarnoldus
chrarnoldus
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| lupuletic
lupuletic
| kiwina
kiwina
| liwilliam2021
liwilliam2021
| +| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| PeterDaveHello
PeterDaveHello
| +| aheizi
aheizi
| hassoncs
hassoncs
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| afshawnlotfi
afshawnlotfi
| +| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| emshvac
emshvac
| +| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| +| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| +| aitoroses
aitoroses
| anton-otee
anton-otee
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| taisukeoe
taisukeoe
| +| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| +| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| seedlord
seedlord
| bramburn
bramburn
| benzntech
benzntech
| axkirillov
axkirillov
| olearycrew
olearycrew
| brunobergher
brunobergher
| +| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| +| julionav
julionav
| KanTakahiro
KanTakahiro
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| +| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| hatsu38
hatsu38
| +| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| +| bbenshalom
bbenshalom
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| +| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| tmsjngx0
tmsjngx0
| +| Githubguy132010
Githubguy132010
| DeXtroTip
DeXtroTip
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| +| thill2323
thill2323
| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| +| shaybc
shaybc
| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| +| pokutuna
pokutuna
| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| +| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| +| kohii
kohii
| pfitz
pfitz
| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| +| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| +| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| +| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| tgfjt
tgfjt
| +| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| +| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| kvokka
kvokka
| +| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| +| Juice10
Juice10
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | | + ## 授權 diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 905e657b37..6bcb85e337 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -112,7 +112,7 @@ export class ClineProvider public isViewLaunched = false public settingsImportedAt?: number - public readonly latestAnnouncementId = "jul-09-2025-3-23-0" // Update for v3.23.0 announcement + public readonly latestAnnouncementId = "jul-26-2025-3-24-0" // Update for v3.24.0 announcement public readonly providerSettingsManager: ProviderSettingsManager public readonly customModesManager: CustomModesManager diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx index fa0781c865..65b78c3cd6 100644 --- a/webview-ui/src/components/chat/Announcement.tsx +++ b/webview-ui/src/components/chat/Announcement.tsx @@ -82,6 +82,16 @@ const Announcement = ({ hideAnnouncement }: AnnouncementProps) => { }} /> +
  • + •{" "} + , + code: , + }} + /> +
  • Indexació de Base de Codi Graduada d'Experimental: La indexació completa de la base de codi ara és estable i està llesta per a ús en producció amb cerca millorada i comprensió del context.", - "feature2": "Nova Funcionalitat de Llista de Tasques Pendents: Mantingueu les vostres tasques en el bon camí amb gestió integrada de tasques pendents que us ajuda a mantenir-vos organitzats i centrats en els vostres objectius de desenvolupament.", - "feature3": "Transicions Millorades d'Arquitecte a Codi: Transferències fluides de la planificació en mode Arquitecte a la implementació en mode Codi.", + "feature1": "Proveïdor de Hugging Face: Accedeix a molts models de codi obert excel·lents directament a través del nou proveïdor de Hugging Face amb integració perfecta i selecció de models.", + "feature2": "Controls de Comandament en Línia: Nous controls d'aprovació automàtica i denegació per a l'execució de comandaments et donen control precís sobre les operacions de terminal amb permisos personalitzables.", + "feature3": "Suport per a Regles AGENTS.md: Afegeix suport per a un fitxer AGENTS.md estàndard de la comunitat a l'arrel del projecte.", "hideButton": "Amaga l'anunci", "detailsDiscussLinks": "Obtén més detalls i uneix-te a les discussions a Discord i Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 2f603a3717..c28a41aabd 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} veröffentlicht", "description": "Roo Code {{version}} bringt mächtige neue Funktionen und bedeutende Verbesserungen, um deinen Entwicklungsworkflow zu verbessern.", "whatsNew": "Was ist neu", - "feature1": "Codebase-Indizierung aus experimentellem Status graduiert: Die vollständige Codebase-Indizierung ist jetzt stabil und bereit für den Produktionseinsatz mit verbesserter Suche und Kontextverständnis.", - "feature2": "Neue Todo-Listen-Funktion: Behalte deine Aufgaben im Blick mit integriertem Todo-Management, das dir hilft, organisiert und fokussiert auf deine Entwicklungsziele zu bleiben.", - "feature3": "Verbesserte Architect-zu-Code-Übergänge: Nahtlose Übergaben von der Planung im Architect-Modus zur Implementierung im Code-Modus.", + "feature1": "Hugging Face Provider: Greife direkt über den neuen Hugging Face Provider auf viele großartige Open-Source-Modelle zu mit nahtloser Integration und Modellauswahl.", + "feature2": "Inline-Befehlssteuerung: Neue Auto-Genehmigung und Verweigerungssteuerung für die Befehlsausführung geben dir präzise Kontrolle über Terminal-Operationen mit anpassbaren Berechtigungen.", + "feature3": "AGENTS.md Regeln-Unterstützung: Fügt Unterstützung für eine Community-Standard AGENTS.md-Datei im Projektstamm hinzu.", "hideButton": "Ankündigung ausblenden", "detailsDiscussLinks": "Erhalte mehr Details und diskutiere auf Discord und Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index d09c75424d..b5e9c1da16 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -272,8 +272,9 @@ "title": "🎉 Roo Code {{version}} Released", "description": "Roo Code {{version}} brings powerful new features and significant improvements to enhance your development workflow.", "whatsNew": "What's New", - "feature1": "Codebase Indexing Graduated from Experimental: Full codebase indexing is now stable and ready for production use with improved search and context understanding.", - "feature2": "New Todo List Feature: Keep your tasks on track with integrated todo management that helps you stay organized and focused on your development goals.", + "feature1": "Hugging Face Provider: Access tons of great open source models directly through the new Hugging Face provider with seamless integration and model selection.", + "feature2": "Inline Command Controls: New auto-approve and deny controls for command execution give you precise control over terminal operations with customizable permissions.", + "feature3": "AGENTS.md Rules Support: Adds support for a community standard AGENTS.md file in the root of the project.", "hideButton": "Hide announcement", "detailsDiscussLinks": "Get more details and discuss in Discord and Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index 97dd41d952..da2973027c 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} publicado", "description": "Roo Code {{version}} trae poderosas nuevas funcionalidades y mejoras significativas para mejorar tu flujo de trabajo de desarrollo.", "whatsNew": "Novedades", - "feature1": "Indexación de código base graduada de experimental: La indexación completa del código base ahora es estable y está lista para uso en producción con búsqueda mejorada y comprensión de contexto.", - "feature2": "Nueva función de lista de tareas: Mantén tus tareas en el buen camino con gestión integrada de tareas que te ayuda a mantenerte organizado y enfocado en tus objetivos de desarrollo.", - "feature3": "Transiciones mejoradas de Arquitecto a Código: Transferencias fluidas desde la planificación en modo Arquitecto hasta la implementación en modo Código.", + "feature1": "Proveedor de Hugging Face: Accede a toneladas de excelentes modelos de código abierto directamente a través del nuevo proveedor de Hugging Face con integración perfecta y selección de modelos.", + "feature2": "Controles de Comando en Línea: Nuevos controles de auto-aprobación y denegación para la ejecución de comandos te dan control preciso sobre las operaciones de terminal con permisos personalizables.", + "feature3": "Soporte para Reglas AGENTS.md: Añade soporte para un archivo AGENTS.md estándar de la comunidad en la raíz del proyecto.", "hideButton": "Ocultar anuncio", "detailsDiscussLinks": "Obtén más detalles y participa en Discord y Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 1ecbeeca81..1153dea6c0 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} est sortie", "description": "Roo Code {{version}} apporte de puissantes nouvelles fonctionnalités et des améliorations significatives pour améliorer ton flux de travail de développement.", "whatsNew": "Quoi de neuf", - "feature1": "L'indexation de la base de code sort du statut expérimental : L'indexation complète de la base de code est maintenant stable et prête pour un usage en production avec une recherche améliorée et une meilleure compréhension du contexte.", - "feature2": "Nouvelle fonctionnalité de liste de tâches : Garde tes tâches sur la bonne voie avec une gestion intégrée des tâches qui t'aide à rester organisé et concentré sur tes objectifs de développement.", - "feature3": "Transitions Architecte vers Code améliorées : Transferts fluides de la planification en mode Architecte vers l'implémentation en mode Code.", + "feature1": "Fournisseur Hugging Face : Accédez à des tonnes d'excellents modèles open source directement via le nouveau fournisseur Hugging Face avec une intégration transparente et une sélection de modèles.", + "feature2": "Contrôles de Commande en Ligne : De nouveaux contrôles d'approbation automatique et de refus pour l'exécution de commandes vous donnent un contrôle précis sur les opérations de terminal avec des permissions personnalisables.", + "feature3": "Support des Règles AGENTS.md : Ajoute le support d'un fichier AGENTS.md standard de la communauté à la racine du projet.", "hideButton": "Masquer l'annonce", "detailsDiscussLinks": "Obtenez plus de détails et participez aux discussions sur Discord et Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 48b9982172..114384da18 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} रिलीज़ हुआ", "description": "Roo Code {{version}} आपके विकास वर्कफ़्लो को बेहतर बनाने के लिए शक्तिशाली नई सुविधाएं और महत्वपूर्ण सुधार लेकर आया है।", "whatsNew": "नया क्या है", - "feature1": "कोडबेस इंडेक्सिंग प्रयोगात्मक से स्नातक: पूर्ण कोडबेस इंडेक्सिंग अब स्थिर है और बेहतर खोज और संदर्भ समझ के साथ उत्पादन उपयोग के लिए तैयार है।", - "feature2": "नई टूडू सूची सुविधा: एकीकृत टूडू प्रबंधन के साथ अपने कार्यों को ट्रैक पर रखें जो आपको व्यवस्थित रहने और अपने विकास लक्ष्यों पर केंद्रित रहने में मदद करता है।", - "feature3": "बेहतर आर्किटेक्ट से कोड ट्रांज़िशन: आर्किटेक्ट मोड में प्लानिंग से कोड मोड में इम्प्लीमेंटेशन तक सहज स्थानांतरण।", + "feature1": "Hugging Face प्रदाता: नए Hugging Face प्रदाता के माध्यम से सहज एकीकरण और मॉडल चयन के साथ सीधे बहुत सारे बेहतरीन ओपन सोर्स मॉडल तक पहुंचें।", + "feature2": "इनलाइन कमांड नियंत्रण: कमांड निष्पादन के लिए नए ऑटो-अप्रूव और डिनाई नियंत्रण आपको अनुकूलन योग्य अनुमतियों के साथ टर्मिनल संचालन पर सटीक नियंत्रण देते हैं।", + "feature3": "AGENTS.md नियम समर्थन: प्रोजेक्ट की रूट में कम्युनिटी स्टैंडर्ड AGENTS.md फ़ाइल के लिए समर्थन जोड़ता है।", "hideButton": "घोषणा छुपाएं", "detailsDiscussLinks": "Discord और Reddit पर अधिक विवरण प्राप्त करें और चर्चाओं में शामिल हों 🚀" }, diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json index ba20ad324b..e272ba3fa2 100644 --- a/webview-ui/src/i18n/locales/id/chat.json +++ b/webview-ui/src/i18n/locales/id/chat.json @@ -275,9 +275,9 @@ "title": "🎉 Roo Code {{version}} Dirilis", "description": "Roo Code {{version}} menghadirkan fitur-fitur baru yang kuat dan peningkatan signifikan untuk meningkatkan alur kerja pengembangan Anda.", "whatsNew": "Yang Baru", - "feature1": "Pengindeksan Codebase Lulus dari Eksperimental: Pengindeksan codebase lengkap kini stabil dan siap untuk penggunaan produksi dengan pencarian yang ditingkatkan dan pemahaman konteks.", - "feature2": "Fitur Daftar Todo Baru: Jaga tugas Anda tetap pada jalur dengan manajemen todo terintegrasi yang membantu Anda tetap terorganisir dan fokus pada tujuan pengembangan.", - "feature3": "Transisi Arsitektur ke Kode yang Ditingkatkan: Transfer yang mulus dari perencanaan di mode Arsitektur ke implementasi di mode Kode.", + "feature1": "Penyedia Hugging Face: Akses banyak model open source yang luar biasa secara langsung melalui penyedia Hugging Face baru dengan integrasi yang mulus dan pemilihan model.", + "feature2": "Kontrol Perintah Inline: Kontrol persetujuan otomatis dan penolakan baru untuk eksekusi perintah memberi Anda kontrol yang tepat atas operasi terminal dengan izin yang dapat disesuaikan.", + "feature3": "Dukungan Aturan AGENTS.md: Menambahkan dukungan untuk file AGENTS.md standar komunitas di root proyek.", "hideButton": "Sembunyikan pengumuman", "detailsDiscussLinks": "Dapatkan detail lebih lanjut dan bergabung dalam diskusi di Discord dan Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 55691c71ac..4a0b58180b 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Rilasciato Roo Code {{version}}", "description": "Roo Code {{version}} porta nuove potenti funzionalità e miglioramenti significativi per potenziare il tuo flusso di lavoro di sviluppo.", "whatsNew": "Novità", - "feature1": "Indicizzazione Codebase Promossa da Sperimentale: L'indicizzazione completa del codebase è ora stabile e pronta per l'uso in produzione con ricerca migliorata e comprensione del contesto.", - "feature2": "Nuova Funzione Lista Todo: Mantieni i tuoi task in carreggiata con la gestione integrata dei todo che ti aiuta a rimanere organizzato e concentrato sui tuoi obiettivi di sviluppo.", - "feature3": "Transizioni Migliorate da Architetto a Codice: Trasferimenti fluidi dalla pianificazione in modalità Architetto all'implementazione in modalità Codice.", + "feature1": "Provider Hugging Face: Accedi a tantissimi ottimi modelli open source direttamente tramite il nuovo provider Hugging Face con integrazione perfetta e selezione dei modelli.", + "feature2": "Controlli Comando Inline: Nuovi controlli di approvazione automatica e rifiuto per l'esecuzione dei comandi ti danno controllo preciso sulle operazioni del terminale con permessi personalizzabili.", + "feature3": "Supporto Regole AGENTS.md: Aggiunge il supporto per un file AGENTS.md standard della comunità nella radice del progetto.", "hideButton": "Nascondi annuncio", "detailsDiscussLinks": "Ottieni maggiori dettagli e partecipa alle discussioni su Discord e Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index d502103260..1db33759d5 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} リリース", "description": "Roo Code {{version}}は、開発ワークフローを向上させる強力な新機能と重要な改善をもたらします。", "whatsNew": "新機能", - "feature1": "コードベースインデックス機能が実験段階を卒業: 完全なコードベースインデックス機能が安定し、改善された検索とコンテキスト理解により本番環境での使用が可能になりました。", - "feature2": "新しいTodoリスト機能: 統合されたTodo管理でタスクを軌道に乗せ、開発目標に整理され集中した状態を維持できます。", - "feature3": "改善されたアーキテクトからコードへの移行: アーキテクトモードでの計画からコードモードでの実装へのシームレスな引き継ぎ。", + "feature1": "Hugging Face プロバイダー: 新しいHugging Faceプロバイダーを通じて、シームレスな統合とモデル選択により、多数の優れたオープンソースモデルに直接アクセスできます。", + "feature2": "インラインコマンドコントロール: コマンド実行のための新しい自動承認と拒否コントロールにより、カスタマイズ可能な権限でターミナル操作を正確に制御できます。", + "feature3": "AGENTS.mdルールサポート: プロジェクトルートにコミュニティ標準のAGENTS.mdファイルのサポートを追加します。", "hideButton": "通知を非表示", "detailsDiscussLinks": "詳細はDiscordRedditでご確認・ディスカッションください 🚀" }, diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 2fcac36cba..9af867fe7a 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} 출시", "description": "Roo Code {{version}}은 개발 워크플로우를 향상시키는 강력한 새 기능과 중요한 개선사항을 제공합니다.", "whatsNew": "새로운 기능", - "feature1": "코드베이스 인덱싱이 실험 단계에서 졸업: 전체 코드베이스 인덱싱이 이제 안정적이며 향상된 검색 및 컨텍스트 이해 기능으로 프로덕션 사용이 준비되었습니다.", - "feature2": "새로운 할 일 목록 기능: 통합된 할 일 관리로 작업을 궤도에 유지하여 개발 목표에 체계적이고 집중된 상태를 유지하세요.", - "feature3": "개선된 아키텍트에서 코드로의 전환: 아키텍트 모드에서의 계획부터 코드 모드에서의 구현까지 원활한 인수인계.", + "feature1": "Hugging Face 프로바이더: 새로운 Hugging Face 프로바이더를 통해 원활한 통합과 모델 선택으로 수많은 훌륭한 오픈 소스 모델에 직접 액세스하세요.", + "feature2": "인라인 명령 제어: 명령 실행을 위한 새로운 자동 승인 및 거부 제어로 사용자 정의 가능한 권한으로 터미널 작업을 정밀하게 제어할 수 있습니다.", + "feature3": "AGENTS.md 규칙 지원: 프로젝트 루트에 커뮤니티 표준 AGENTS.md 파일에 대한 지원을 추가합니다.", "hideButton": "공지 숨기기", "detailsDiscussLinks": "DiscordReddit에서 자세한 내용을 확인하고 토론에 참여하세요 🚀" }, diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index 7f295a0b3d..0c95429b55 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -248,9 +248,9 @@ "title": "🎉 Roo Code {{version}} uitgebracht", "description": "Roo Code {{version}} brengt krachtige nieuwe functies en significante verbeteringen om je ontwikkelingsworkflow te verbeteren.", "whatsNew": "Wat is er nieuw", - "feature1": "Codebase Indexering Afgestudeerd van Experimenteel: Volledige codebase indexering is nu stabiel en klaar voor productiegebruik met verbeterde zoekfunctionaliteit en contextbegrip.", - "feature2": "Nieuwe Todo Lijst Functie: Houd je taken op koers met geïntegreerd todo-beheer dat je helpt georganiseerd en gefocust te blijven op je ontwikkelingsdoelen.", - "feature3": "Verbeterde Architect naar Code Overgangen: Soepele overdrachten van planning in Architect modus naar implementatie in Code modus.", + "feature1": "Hugging Face Provider: Krijg toegang tot talloze geweldige open source modellen direct via de nieuwe Hugging Face provider met naadloze integratie en modelselectie.", + "feature2": "Inline Commando Controles: Nieuwe auto-goedkeuring en weigering controles voor commando-uitvoering geven je precieze controle over terminal operaties met aanpasbare permissies.", + "feature3": "AGENTS.md Regels Ondersteuning: Voegt ondersteuning toe voor een community standaard AGENTS.md bestand in de root van het project.", "hideButton": "Aankondiging verbergen", "detailsDiscussLinks": "Krijg meer details en doe mee aan discussies op Discord en Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index b0a9d16e6a..c2cb70a05d 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} wydany", "description": "Roo Code {{version}} wprowadza potężne nowe funkcje i znaczące ulepszenia, aby ulepszyć Twój przepływ pracy programistycznej.", "whatsNew": "Co nowego", - "feature1": "Indeksowanie bazy kodu ukończone z fazy eksperymentalnej: Pełne indeksowanie bazy kodu jest teraz stabilne i gotowe do użytku produkcyjnego z ulepszonymi funkcjami wyszukiwania i rozumienia kontekstu.", - "feature2": "Nowa funkcja listy zadań: Utrzymuj swoje zadania na właściwym torze dzięki zintegrowanemu zarządzaniu zadaniami, które pomaga ci pozostać zorganizowanym i skupionym na celach rozwojowych.", - "feature3": "Ulepszone przejścia z Architekta do Kodu: Płynne transfery z planowania w trybie Architekta do implementacji w trybie Kodu.", + "feature1": "Dostawca Hugging Face: Uzyskaj dostęp do mnóstwa wspaniałych modeli open source bezpośrednio przez nowego dostawcę Hugging Face z bezproblemową integracją i wyborem modeli.", + "feature2": "Kontrole Poleceń Inline: Nowe kontrole automatycznego zatwierdzania i odrzucania dla wykonywania poleceń dają ci precyzyjną kontrolę nad operacjami terminala z konfigurowalnymi uprawnieniami.", + "feature3": "Wsparcie Reguł AGENTS.md: Dodaje wsparcie dla standardowego pliku AGENTS.md społeczności w katalogu głównym projektu.", "hideButton": "Ukryj ogłoszenie", "detailsDiscussLinks": "Uzyskaj więcej szczegółów i dołącz do dyskusji na Discord i Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index e73eabfb93..64a6b4a067 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} Lançado", "description": "Roo Code {{version}} traz novos recursos poderosos e melhorias significativas para aprimorar seu fluxo de trabalho de desenvolvimento.", "whatsNew": "O que há de novo", - "feature1": "Indexação de Base de Código Graduada do Experimental: A indexação completa da base de código agora é estável e pronta para uso em produção com busca aprimorada e compreensão de contexto.", - "feature2": "Nova Funcionalidade de Lista de Tarefas: Mantenha suas tarefas no caminho certo com gerenciamento integrado de tarefas que ajuda você a se manter organizado e focado em seus objetivos de desenvolvimento.", - "feature3": "Transições Aprimoradas de Arquiteto para Código: Transferências suaves do planejamento no modo Arquiteto para implementação no modo Código.", + "feature1": "Provedor Hugging Face: Acesse toneladas de excelentes modelos de código aberto diretamente através do novo provedor Hugging Face com integração perfeita e seleção de modelos.", + "feature2": "Controles de Comando Inline: Novos controles de aprovação automática e negação para execução de comandos oferecem controle preciso sobre operações de terminal com permissões personalizáveis.", + "feature3": "Suporte a Regras AGENTS.md: Adiciona suporte para um arquivo AGENTS.md padrão da comunidade na raiz do projeto.", "hideButton": "Ocultar anúncio", "detailsDiscussLinks": "Obtenha mais detalhes e participe da discussão no Discord e Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index 01987bdda1..a860c9e94e 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -248,9 +248,9 @@ "title": "🎉 Выпущен Roo Code {{version}}", "description": "Roo Code {{version}} приносит мощные новые функции и значительные улучшения для совершенствования вашего рабочего процесса разработки.", "whatsNew": "Что нового", - "feature1": "Индексация кодовой базы выпущена из экспериментального статуса: Полная индексация кодовой базы теперь стабильна и готова к использованию в продакшене с улучшенным поиском и пониманием контекста.", - "feature2": "Новая функция списка задач: Держите свои задачи на правильном пути с интегрированным управлением задачами, которое помогает оставаться организованным и сосредоточенным на целях разработки.", - "feature3": "Улучшенные переходы от Архитектора к Коду: Плавные переходы от планирования в режиме Архитектора к реализации в режиме Кода.", + "feature1": "Провайдер Hugging Face: Получите доступ к множеству отличных моделей с открытым исходным кодом напрямую через новый провайдер Hugging Face с бесшовной интеграцией и выбором моделей.", + "feature2": "Встроенные элементы управления командами: Новые элементы управления автоматическим одобрением и отклонением для выполнения команд дают вам точный контроль над операциями терминала с настраиваемыми разрешениями.", + "feature3": "Поддержка правил AGENTS.md: Добавляет поддержку стандартного файла AGENTS.md сообщества в корне проекта.", "hideButton": "Скрыть объявление", "detailsDiscussLinks": "Подробнее и обсуждение в Discord и Reddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 88e5fea67e..6ddca0a625 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} Yayınlandı", "description": "Roo Code {{version}}, geliştirme iş akışınızı geliştirmek için güçlü yeni özellikler ve önemli iyileştirmeler getiriyor.", "whatsNew": "Yenilikler", - "feature1": "Kod Tabanı İndeksleme Deneysel Aşamadan Mezun Oldu: Tam kod tabanı indeksleme artık kararlı ve geliştirilmiş arama ve bağlam anlayışı ile üretim kullanımına hazır.", - "feature2": "Yeni Yapılacaklar Listesi Özelliği: Görevlerinizi yolunda tutmak için entegre yapılacaklar yönetimi ile organize kalın ve geliştirme hedeflerinize odaklanın.", - "feature3": "Geliştirilmiş Mimar'dan Kod'a Geçişler: Mimar modunda planlamadan Kod modunda uygulamaya sorunsuz aktarımlar.", + "feature1": "Hugging Face Sağlayıcısı: Yeni Hugging Face sağlayıcısı aracılığıyla sorunsuz entegrasyon ve model seçimi ile tonlarca harika açık kaynak modeline doğrudan erişin.", + "feature2": "Satır İçi Komut Kontrolleri: Komut yürütme için yeni otomatik onay ve reddetme kontrolleri, özelleştirilebilir izinlerle terminal işlemleri üzerinde hassas kontrol sağlar.", + "feature3": "AGENTS.md Kuralları Desteği: Projenin kökünde topluluk standardı AGENTS.md dosyası için destek ekler.", "hideButton": "Duyuruyu gizle", "detailsDiscussLinks": "Discord ve Reddit'te daha fazla ayrıntı alın ve tartışmalara katılın 🚀" }, diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index a0562a85de..61b11998ad 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} Đã phát hành", "description": "Roo Code {{version}} mang đến các tính năng mạnh mẽ mới và cải tiến đáng kể để nâng cao quy trình phát triển của bạn.", "whatsNew": "Có gì mới", - "feature1": "Lập chỉ mục Codebase Tốt nghiệp từ Thử nghiệm: Lập chỉ mục codebase đầy đủ hiện đã ổn định và sẵn sàng cho sử dụng sản xuất với tìm kiếm cải tiến và hiểu biết ngữ cảnh.", - "feature2": "Tính năng Danh sách Todo Mới: Giữ nhiệm vụ của bạn đúng hướng với quản lý todo tích hợp giúp bạn duy trì tổ chức và tập trung vào mục tiêu phát triển.", - "feature3": "Cải thiện Chuyển đổi từ Architect sang Code: Chuyển đổi mượt mà từ lập kế hoạch trong chế độ Architect sang triển khai trong chế độ Code.", + "feature1": "Nhà cung cấp Hugging Face: Truy cập hàng tấn mô hình mã nguồn mở tuyệt vời trực tiếp thông qua nhà cung cấp Hugging Face mới với tích hợp liền mạch và lựa chọn mô hình.", + "feature2": "Điều khiển Lệnh Inline: Các điều khiển tự động phê duyệt và từ chối mới cho việc thực thi lệnh cung cấp cho bạn quyền kiểm soát chính xác các hoạt động terminal với quyền có thể tùy chỉnh.", + "feature3": "Hỗ trợ Quy tắc AGENTS.md: Thêm hỗ trợ cho tệp AGENTS.md tiêu chuẩn cộng đồng trong thư mục gốc của dự án.", "hideButton": "Ẩn thông báo", "detailsDiscussLinks": "Nhận thêm chi tiết và thảo luận tại DiscordReddit 🚀" }, diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index fe5c0bc768..a19d7af5f0 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} 已发布", "description": "Roo Code {{version}} 带来强大的新功能和重大改进,提升您的开发工作流程。", "whatsNew": "新特性", - "feature1": "代码库索引从实验阶段正式发布: 完整的代码库索引现已稳定,可用于生产环境,具备改进的搜索和上下文理解功能。", - "feature2": "新增待办事项列表功能: 通过集成的待办事项管理保持任务进度,帮助你保持条理并专注于开发目标。", - "feature3": "改进的架构师到代码转换: 从架构师模式的规划到代码模式的实现,实现无缝交接。", + "feature1": "Hugging Face 提供商: 通过新的 Hugging Face 提供商直接访问大量优秀的开源模型,具备无缝集成和模型选择功能。", + "feature2": "内联命令控制: 新的自动批准和拒绝命令执行控制,为您提供对终端操作的精确控制和可自定义权限。", + "feature3": "AGENTS.md 规则支持: 添加对项目根目录中社区标准 AGENTS.md 文件的支持。", "hideButton": "隐藏公告", "detailsDiscussLinks": "在 DiscordReddit 获取更多详情并参与讨论 🚀" }, diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 8623ad2b0e..45053a4493 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -263,9 +263,9 @@ "title": "🎉 Roo Code {{version}} 已發布", "description": "Roo Code {{version}} 帶來強大的新功能和重大改進,提升您的開發工作流程。", "whatsNew": "新功能", - "feature1": "程式碼庫索引從實驗階段正式發布:完整的程式碼庫索引現已穩定,可用於正式環境,具備改進的搜尋和內容理解功能。", - "feature2": "新增待辦事項清單功能:透過整合的待辦事項管理保持工作進度,幫助您保持條理並專注於開發目標。", - "feature3": "改進的 Architect 到 Code 轉換:從 Architect 模式的規劃到 Code 模式的實作,轉換更加順暢。", + "feature1": "Hugging Face 提供者:透過新的 Hugging Face 提供者直接存取大量優秀的開源模型,具備無縫整合和模型選擇功能。", + "feature2": "內嵌命令控制:新的自動核准和拒絕命令執行控制,為您提供對終端機操作的精確控制和可自訂權限。", + "feature3": "AGENTS.md 規則支援:新增對專案根目錄中社群標準 AGENTS.md 檔案的支援。", "hideButton": "隱藏公告", "detailsDiscussLinks": "在 DiscordReddit 取得更多詳細資訊並參與討論 🚀" }, From 31fee354093903ba3cb90c8bade9242480a4d51e Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 26 Jul 2025 00:26:39 -0400 Subject: [PATCH 17/44] Delete .changeset/kind-horses-sniff.md --- .changeset/kind-horses-sniff.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/kind-horses-sniff.md diff --git a/.changeset/kind-horses-sniff.md b/.changeset/kind-horses-sniff.md deleted file mode 100644 index 9a6afbd167..0000000000 --- a/.changeset/kind-horses-sniff.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Cancel auto-approve timer when editing follow-up suggestion From a1dbd1aac9bee4816816b4c7138503db4be5fcdc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:30:11 -0400 Subject: [PATCH 18/44] Update contributors list (#6110) Co-authored-by: mrubens <2600+mrubens@users.noreply.github.com> --- README.md | 76 +++++++++++++++++++-------------------- locales/ca/README.md | 78 ++++++++++++++++++++--------------------- locales/de/README.md | 78 ++++++++++++++++++++--------------------- locales/es/README.md | 78 ++++++++++++++++++++--------------------- locales/fr/README.md | 78 ++++++++++++++++++++--------------------- locales/hi/README.md | 78 ++++++++++++++++++++--------------------- locales/id/README.md | 78 ++++++++++++++++++++--------------------- locales/it/README.md | 78 ++++++++++++++++++++--------------------- locales/ja/README.md | 78 ++++++++++++++++++++--------------------- locales/ko/README.md | 78 ++++++++++++++++++++--------------------- locales/nl/README.md | 78 ++++++++++++++++++++--------------------- locales/pl/README.md | 78 ++++++++++++++++++++--------------------- locales/pt-BR/README.md | 78 ++++++++++++++++++++--------------------- locales/ru/README.md | 78 ++++++++++++++++++++--------------------- locales/tr/README.md | 78 ++++++++++++++++++++--------------------- locales/vi/README.md | 78 ++++++++++++++++++++--------------------- locales/zh-CN/README.md | 78 ++++++++++++++++++++--------------------- locales/zh-TW/README.md | 78 ++++++++++++++++++++--------------------- 18 files changed, 684 insertions(+), 718 deletions(-) diff --git a/README.md b/README.md index 092b31e942..d4b5ecb073 100644 --- a/README.md +++ b/README.md @@ -208,44 +208,44 @@ Thanks to all our contributors who have helped make Roo Code better! -| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | +| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | +| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | +| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | +| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | chrarnoldus
    chrarnoldus
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | +| cannuri
    cannuri
    | feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | +| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | +| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | hassoncs
    hassoncs
    | ChuKhaLi
    ChuKhaLi
    | +| PeterDaveHello
    PeterDaveHello
    | aheizi
    aheizi
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | +| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | +| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | +| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | +| brunobergher
    brunobergher
    | aitoroses
    aitoroses
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | +| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | +| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | +| seedlord
    seedlord
    | bramburn
    bramburn
    | anton-otee
    anton-otee
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | +| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | +| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | +| bbenshalom
    bbenshalom
    | chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | +| hatsu38
    hatsu38
    | hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | +| bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | Yikai-Liao
    Yikai-Liao
    | +| zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | TGlide
    TGlide
    | +| Githubguy132010
    Githubguy132010
    | tgfjt
    tgfjt
    | nevermorec
    nevermorec
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | +| user202729
    user202729
    | thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | +| shivamd1810
    shivamd1810
    | shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | +| qingyuan1109
    qingyuan1109
    | pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | +| mosleyit
    mosleyit
    | moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | +| lhish
    lhish
    | kohii
    kohii
    | DeXtroTip
    DeXtroTip
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | +| linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | +| dleen
    dleen
    | CW-B-W
    CW-B-W
    | chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | +| Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | +| HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | +| AMHesch
    AMHesch
    | maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | +| RandalSchwartz
    RandalSchwartz
    | SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | +| Naam
    Naam
    | kvokka
    kvokka
    | ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | +| mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | +| KevinZhao
    KevinZhao
    | ksze
    ksze
    | Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | diff --git a/locales/ca/README.md b/locales/ca/README.md index c029d7b269..6288db96b3 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -181,46 +181,44 @@ 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
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 647fed2639..7428fb73a7 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -181,46 +181,44 @@ 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
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 8cbebf52b1..89fb43fb78 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -181,46 +181,44 @@ 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
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 35c33cff35..bd018e0cf5 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -181,46 +181,44 @@ 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
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 01693feb1d..197583eb8e 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -181,46 +181,44 @@ code --install-extension bin/roo-cline-.vsix Roo Code को बेहतर बनाने में मदद करने वाले हमारे सभी योगदानकर्ताओं को धन्यवाद! - -| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## लाइसेंस diff --git a/locales/id/README.md b/locales/id/README.md index a922c8d28b..d59cc500d3 100644 --- a/locales/id/README.md +++ b/locales/id/README.md @@ -175,46 +175,44 @@ Kami menyukai kontribusi komunitas! Mulai dengan membaca [CONTRIBUTING.md](CONTR Terima kasih kepada semua kontributor kami yang telah membantu membuat Roo Code lebih baik! - -| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## License diff --git a/locales/it/README.md b/locales/it/README.md index 8f18ab1f75..ff87d9469c 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -181,46 +181,44 @@ 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
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 660c575196..a8be33e70c 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -181,46 +181,44 @@ code --install-extension bin/roo-cline-.vsix Roo Codeの改善に貢献してくれたすべての貢献者に感謝します! - -| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index d748f21118..0ca8ce2548 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -181,46 +181,44 @@ code --install-extension bin/roo-cline-.vsix Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사드립니다! - -| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## 라이선스 diff --git a/locales/nl/README.md b/locales/nl/README.md index 8d59256181..957d03fe3a 100644 --- a/locales/nl/README.md +++ b/locales/nl/README.md @@ -181,46 +181,44 @@ We houden van bijdragen uit de community! Begin met het lezen van onze [CONTRIBU Dank aan alle bijdragers die Roo Code beter hebben gemaakt! - -| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Licentie diff --git a/locales/pl/README.md b/locales/pl/README.md index a12b895bcc..9ed65919f0 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -181,46 +181,44 @@ 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
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 1abfe2ce0b..d6eed633ea 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -181,46 +181,44 @@ 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
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Licença diff --git a/locales/ru/README.md b/locales/ru/README.md index 8629023dd1..c869feb512 100644 --- a/locales/ru/README.md +++ b/locales/ru/README.md @@ -181,46 +181,44 @@ code --install-extension bin/roo-cline-.vsix Спасибо всем нашим участникам, которые помогли сделать Roo Code лучше! - -| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Лицензия diff --git a/locales/tr/README.md b/locales/tr/README.md index 7a20da474c..95d8b3303a 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -181,46 +181,44 @@ 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
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index 5744fbe2a2..16a869f81e 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -181,46 +181,44 @@ 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
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index a043414318..cc82d4626b 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -181,46 +181,44 @@ code --install-extension bin/roo-cline-.vsix 感谢所有帮助改进 Roo Code 的贡献者! - -| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index c3b2982531..314d452956 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -182,46 +182,44 @@ code --install-extension bin/roo-cline-.vsix 感謝所有幫助改進 Roo Code 的貢獻者! - -| mrubens
    mrubens
    | saoudrizwan
    saoudrizwan
    | cte
    cte
    | daniel-lxs
    daniel-lxs
    | samhvw8
    samhvw8
    | hannesrudolph
    hannesrudolph
    | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
    KJ7LNW
    | a8trejo
    a8trejo
    | ColemanRoo
    ColemanRoo
    | MuriloFP
    MuriloFP
    | canrobins13
    canrobins13
    | stea9499
    stea9499
    | -| joemanley201
    joemanley201
    | System233
    System233
    | jr
    jr
    | nissa-seru
    nissa-seru
    | jquanton
    jquanton
    | roomote-agent
    roomote-agent
    | -| NyxJae
    NyxJae
    | d-oit
    d-oit
    | elianiva
    elianiva
    | wkordalski
    wkordalski
    | qdaxb
    qdaxb
    | punkpeye
    punkpeye
    | -| SannidhyaSah
    SannidhyaSah
    | xyOz-dev
    xyOz-dev
    | sachasayan
    sachasayan
    | Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    | monotykamary
    monotykamary
    | cannuri
    cannuri
    | -| feifei325
    feifei325
    | zhangtony239
    zhangtony239
    | chrarnoldus
    chrarnoldus
    | shariqriazz
    shariqriazz
    | vigneshsubbiah16
    vigneshsubbiah16
    | pugazhendhi-m
    pugazhendhi-m
    | -| lloydchang
    lloydchang
    | dtrugman
    dtrugman
    | Szpadel
    Szpadel
    | lupuletic
    lupuletic
    | kiwina
    kiwina
    | liwilliam2021
    liwilliam2021
    | -| Premshay
    Premshay
    | psv2522
    psv2522
    | olweraltuve
    olweraltuve
    | diarmidmackenzie
    diarmidmackenzie
    | ChuKhaLi
    ChuKhaLi
    | PeterDaveHello
    PeterDaveHello
    | -| aheizi
    aheizi
    | hassoncs
    hassoncs
    | nbihan-mediware
    nbihan-mediware
    | noritaka1166
    noritaka1166
    | RaySinner
    RaySinner
    | afshawnlotfi
    afshawnlotfi
    | -| dleffel
    dleffel
    | StevenTCramer
    StevenTCramer
    | Ruakij
    Ruakij
    | pdecat
    pdecat
    | kyle-apex
    kyle-apex
    | emshvac
    emshvac
    | -| Lunchb0ne
    Lunchb0ne
    | SmartManoj
    SmartManoj
    | vagadiya
    vagadiya
    | slytechnical
    slytechnical
    | dlab-anton
    dlab-anton
    | arthurauffray
    arthurauffray
    | -| upamune
    upamune
    | NamesMT
    NamesMT
    | taylorwilsdon
    taylorwilsdon
    | sammcj
    sammcj
    | p12tic
    p12tic
    | gtaylor
    gtaylor
    | -| aitoroses
    aitoroses
    | anton-otee
    anton-otee
    | ross
    ross
    | mr-ryan-james
    mr-ryan-james
    | heyseth
    heyseth
    | taisukeoe
    taisukeoe
    | -| avtc
    avtc
    | eonghk
    eonghk
    | GOODBOY008
    GOODBOY008
    | kcwhite
    kcwhite
    | ronyblum
    ronyblum
    | teddyOOXX
    teddyOOXX
    | -| vincentsong
    vincentsong
    | yongjer
    yongjer
    | zeozeozeo
    zeozeozeo
    | ashktn
    ashktn
    | franekp
    franekp
    | yt3trees
    yt3trees
    | -| seedlord
    seedlord
    | bramburn
    bramburn
    | benzntech
    benzntech
    | axkirillov
    axkirillov
    | olearycrew
    olearycrew
    | brunobergher
    brunobergher
    | -| catrielmuller
    catrielmuller
    | devxpain
    devxpain
    | snoyiatk
    snoyiatk
    | GitlyHallows
    GitlyHallows
    | jcbdev
    jcbdev
    | Chenjiayuan195
    Chenjiayuan195
    | -| julionav
    julionav
    | KanTakahiro
    KanTakahiro
    | SplittyDev
    SplittyDev
    | mdp
    mdp
    | napter
    napter
    | philfung
    philfung
    | -| chris-garrett
    chris-garrett
    | dairui1
    dairui1
    | dqroid
    dqroid
    | janaki-sasidhar
    janaki-sasidhar
    | forestyoo
    forestyoo
    | hatsu38
    hatsu38
    | -| hongzio
    hongzio
    | im47cn
    im47cn
    | shoopapa
    shoopapa
    | jwcraig
    jwcraig
    | kinandan
    kinandan
    | nevermorec
    nevermorec
    | -| bbenshalom
    bbenshalom
    | bannzai
    bannzai
    | axmo
    axmo
    | asychin
    asychin
    | amittell
    amittell
    | Yoshino-Yukitaro
    Yoshino-Yukitaro
    | -| Yikai-Liao
    Yikai-Liao
    | zxdvd
    zxdvd
    | s97712
    s97712
    | vladstudio
    vladstudio
    | vivekfyi
    vivekfyi
    | tmsjngx0
    tmsjngx0
    | -| Githubguy132010
    Githubguy132010
    | DeXtroTip
    DeXtroTip
    | PretzelVector
    PretzelVector
    | zetaloop
    zetaloop
    | cdlliuy
    cdlliuy
    | user202729
    user202729
    | -| thill2323
    thill2323
    | takakoutso
    takakoutso
    | student20880
    student20880
    | shubhamgupta731
    shubhamgupta731
    | shohei-ihaya
    shohei-ihaya
    | shivamd1810
    shivamd1810
    | -| shaybc
    shaybc
    | sensei-woo
    sensei-woo
    | samir-nimbly
    samir-nimbly
    | robertheadley
    robertheadley
    | refactorthis
    refactorthis
    | qingyuan1109
    qingyuan1109
    | -| pokutuna
    pokutuna
    | philipnext
    philipnext
    | village-way
    village-way
    | oprstchn
    oprstchn
    | nobu007
    nobu007
    | mosleyit
    mosleyit
    | -| moqimoqidea
    moqimoqidea
    | mlopezr
    mlopezr
    | mecab
    mecab
    | olup
    olup
    | lightrabbit
    lightrabbit
    | lhish
    lhish
    | -| kohii
    kohii
    | pfitz
    pfitz
    | ExactDoug
    ExactDoug
    | celestial-vault
    celestial-vault
    | linegel
    linegel
    | edwin-truthsearch-io
    edwin-truthsearch-io
    | -| EamonNerbonne
    EamonNerbonne
    | dbasclpy
    dbasclpy
    | dflatline
    dflatline
    | Deon588
    Deon588
    | dleen
    dleen
    | CW-B-W
    CW-B-W
    | -| chadgauth
    chadgauth
    | thecolorblue
    thecolorblue
    | bogdan0083
    bogdan0083
    | benashby
    benashby
    | Atlogit
    Atlogit
    | atlasgong
    atlasgong
    | -| andrewshu2000
    andrewshu2000
    | andreastempsch
    andreastempsch
    | alasano
    alasano
    | QuinsZouls
    QuinsZouls
    | HadesArchitect
    HadesArchitect
    | alarno
    alarno
    | -| nexon33
    nexon33
    | adilhafeez
    adilhafeez
    | adamwlarson
    adamwlarson
    | adamhill
    adamhill
    | AMHesch
    AMHesch
    | tgfjt
    tgfjt
    | -| maekawataiki
    maekawataiki
    | AlexandruSmirnov
    AlexandruSmirnov
    | samsilveira
    samsilveira
    | 01Rian
    01Rian
    | RSO
    RSO
    | RandalSchwartz
    RandalSchwartz
    | -| SECKainersdorfer
    SECKainersdorfer
    | R-omk
    R-omk
    | Sarke
    Sarke
    | PaperBoardOfficial
    PaperBoardOfficial
    | OlegOAndreev
    OlegOAndreev
    | kvokka
    kvokka
    | -| ecmasx
    ecmasx
    | mollux
    mollux
    | marvijo-code
    marvijo-code
    | markijbema
    markijbema
    | mamertofabian
    mamertofabian
    | monkeyDluffy6017
    monkeyDluffy6017
    | -| libertyteeth
    libertyteeth
    | shtse8
    shtse8
    | Rexarrior
    Rexarrior
    | kevinvandijk
    kevinvandijk
    | KevinZhao
    KevinZhao
    | ksze
    ksze
    | -| Juice10
    Juice10
    | Fovty
    Fovty
    | Jdo300
    Jdo300
    | hesara
    hesara
    | | | - +|mrubens
    mrubens
    |saoudrizwan
    saoudrizwan
    |cte
    cte
    |daniel-lxs
    daniel-lxs
    |samhvw8
    samhvw8
    |hannesrudolph
    hannesrudolph
    | +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
    KJ7LNW
    |a8trejo
    a8trejo
    |ColemanRoo
    ColemanRoo
    |MuriloFP
    MuriloFP
    |canrobins13
    canrobins13
    |stea9499
    stea9499
    | +|joemanley201
    joemanley201
    |System233
    System233
    |jr
    jr
    |nissa-seru
    nissa-seru
    |jquanton
    jquanton
    |roomote-agent
    roomote-agent
    | +|NyxJae
    NyxJae
    |d-oit
    d-oit
    |elianiva
    elianiva
    |wkordalski
    wkordalski
    |qdaxb
    qdaxb
    |punkpeye
    punkpeye
    | +|SannidhyaSah
    SannidhyaSah
    |xyOz-dev
    xyOz-dev
    |chrarnoldus
    chrarnoldus
    |sachasayan
    sachasayan
    |Smartsheet-JB-Brown
    Smartsheet-JB-Brown
    |monotykamary
    monotykamary
    | +|cannuri
    cannuri
    |feifei325
    feifei325
    |zhangtony239
    zhangtony239
    |shariqriazz
    shariqriazz
    |vigneshsubbiah16
    vigneshsubbiah16
    |pugazhendhi-m
    pugazhendhi-m
    | +|lloydchang
    lloydchang
    |dtrugman
    dtrugman
    |Szpadel
    Szpadel
    |lupuletic
    lupuletic
    |kiwina
    kiwina
    |liwilliam2021
    liwilliam2021
    | +|Premshay
    Premshay
    |psv2522
    psv2522
    |olweraltuve
    olweraltuve
    |diarmidmackenzie
    diarmidmackenzie
    |hassoncs
    hassoncs
    |ChuKhaLi
    ChuKhaLi
    | +|PeterDaveHello
    PeterDaveHello
    |aheizi
    aheizi
    |nbihan-mediware
    nbihan-mediware
    |noritaka1166
    noritaka1166
    |RaySinner
    RaySinner
    |afshawnlotfi
    afshawnlotfi
    | +|dleffel
    dleffel
    |StevenTCramer
    StevenTCramer
    |Ruakij
    Ruakij
    |pdecat
    pdecat
    |kyle-apex
    kyle-apex
    |emshvac
    emshvac
    | +|Lunchb0ne
    Lunchb0ne
    |SmartManoj
    SmartManoj
    |vagadiya
    vagadiya
    |slytechnical
    slytechnical
    |dlab-anton
    dlab-anton
    |arthurauffray
    arthurauffray
    | +|upamune
    upamune
    |NamesMT
    NamesMT
    |taylorwilsdon
    taylorwilsdon
    |sammcj
    sammcj
    |p12tic
    p12tic
    |gtaylor
    gtaylor
    | +|brunobergher
    brunobergher
    |aitoroses
    aitoroses
    |ross
    ross
    |mr-ryan-james
    mr-ryan-james
    |heyseth
    heyseth
    |taisukeoe
    taisukeoe
    | +|avtc
    avtc
    |eonghk
    eonghk
    |GOODBOY008
    GOODBOY008
    |kcwhite
    kcwhite
    |ronyblum
    ronyblum
    |teddyOOXX
    teddyOOXX
    | +|vincentsong
    vincentsong
    |yongjer
    yongjer
    |zeozeozeo
    zeozeozeo
    |ashktn
    ashktn
    |franekp
    franekp
    |yt3trees
    yt3trees
    | +|seedlord
    seedlord
    |bramburn
    bramburn
    |anton-otee
    anton-otee
    |benzntech
    benzntech
    |axkirillov
    axkirillov
    |olearycrew
    olearycrew
    | +|catrielmuller
    catrielmuller
    |devxpain
    devxpain
    |snoyiatk
    snoyiatk
    |GitlyHallows
    GitlyHallows
    |jcbdev
    jcbdev
    |Chenjiayuan195
    Chenjiayuan195
    | +|julionav
    julionav
    |KanTakahiro
    KanTakahiro
    |SplittyDev
    SplittyDev
    |mdp
    mdp
    |napter
    napter
    |philfung
    philfung
    | +|bbenshalom
    bbenshalom
    |chris-garrett
    chris-garrett
    |dairui1
    dairui1
    |dqroid
    dqroid
    |janaki-sasidhar
    janaki-sasidhar
    |forestyoo
    forestyoo
    | +|hatsu38
    hatsu38
    |hongzio
    hongzio
    |im47cn
    im47cn
    |shoopapa
    shoopapa
    |jwcraig
    jwcraig
    |kinandan
    kinandan
    | +|bannzai
    bannzai
    |axmo
    axmo
    |asychin
    asychin
    |amittell
    amittell
    |Yoshino-Yukitaro
    Yoshino-Yukitaro
    |Yikai-Liao
    Yikai-Liao
    | +|zxdvd
    zxdvd
    |s97712
    s97712
    |vladstudio
    vladstudio
    |vivekfyi
    vivekfyi
    |tmsjngx0
    tmsjngx0
    |TGlide
    TGlide
    | +|Githubguy132010
    Githubguy132010
    |tgfjt
    tgfjt
    |nevermorec
    nevermorec
    |PretzelVector
    PretzelVector
    |zetaloop
    zetaloop
    |cdlliuy
    cdlliuy
    | +|user202729
    user202729
    |thill2323
    thill2323
    |takakoutso
    takakoutso
    |student20880
    student20880
    |shubhamgupta731
    shubhamgupta731
    |shohei-ihaya
    shohei-ihaya
    | +|shivamd1810
    shivamd1810
    |shaybc
    shaybc
    |sensei-woo
    sensei-woo
    |samir-nimbly
    samir-nimbly
    |robertheadley
    robertheadley
    |refactorthis
    refactorthis
    | +|qingyuan1109
    qingyuan1109
    |pokutuna
    pokutuna
    |philipnext
    philipnext
    |village-way
    village-way
    |oprstchn
    oprstchn
    |nobu007
    nobu007
    | +|mosleyit
    mosleyit
    |moqimoqidea
    moqimoqidea
    |mlopezr
    mlopezr
    |mecab
    mecab
    |olup
    olup
    |lightrabbit
    lightrabbit
    | +|lhish
    lhish
    |kohii
    kohii
    |DeXtroTip
    DeXtroTip
    |pfitz
    pfitz
    |ExactDoug
    ExactDoug
    |celestial-vault
    celestial-vault
    | +|linegel
    linegel
    |edwin-truthsearch-io
    edwin-truthsearch-io
    |EamonNerbonne
    EamonNerbonne
    |dbasclpy
    dbasclpy
    |dflatline
    dflatline
    |Deon588
    Deon588
    | +|dleen
    dleen
    |CW-B-W
    CW-B-W
    |chadgauth
    chadgauth
    |thecolorblue
    thecolorblue
    |bogdan0083
    bogdan0083
    |benashby
    benashby
    | +|Atlogit
    Atlogit
    |atlasgong
    atlasgong
    |andrewshu2000
    andrewshu2000
    |andreastempsch
    andreastempsch
    |alasano
    alasano
    |QuinsZouls
    QuinsZouls
    | +|HadesArchitect
    HadesArchitect
    |alarno
    alarno
    |nexon33
    nexon33
    |adilhafeez
    adilhafeez
    |adamwlarson
    adamwlarson
    |adamhill
    adamhill
    | +|AMHesch
    AMHesch
    |maekawataiki
    maekawataiki
    |AlexandruSmirnov
    AlexandruSmirnov
    |samsilveira
    samsilveira
    |01Rian
    01Rian
    |RSO
    RSO
    | +|RandalSchwartz
    RandalSchwartz
    |SECKainersdorfer
    SECKainersdorfer
    |R-omk
    R-omk
    |Sarke
    Sarke
    |PaperBoardOfficial
    PaperBoardOfficial
    |OlegOAndreev
    OlegOAndreev
    | +|Naam
    Naam
    |kvokka
    kvokka
    |ecmasx
    ecmasx
    |mollux
    mollux
    |marvijo-code
    marvijo-code
    |markijbema
    markijbema
    | +|mamertofabian
    mamertofabian
    |monkeyDluffy6017
    monkeyDluffy6017
    |libertyteeth
    libertyteeth
    |shtse8
    shtse8
    |Rexarrior
    Rexarrior
    |kevinvandijk
    kevinvandijk
    | +|KevinZhao
    KevinZhao
    |ksze
    ksze
    |Juice10
    Juice10
    |Fovty
    Fovty
    |Jdo300
    Jdo300
    |hesara
    hesara
    | ## 授權 From daccdb365cbc181e681ac6405dad0678c02f7a6f Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 26 Jul 2025 00:36:55 -0400 Subject: [PATCH 19/44] Kick off release (#6238) --- .changeset/brown-insects-start.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/brown-insects-start.md diff --git a/.changeset/brown-insects-start.md b/.changeset/brown-insects-start.md new file mode 100644 index 0000000000..02fe83d0d4 --- /dev/null +++ b/.changeset/brown-insects-start.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Kick off release From 62160758fcffd2b34708a6baade85653d8029eef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:41:54 -0400 Subject: [PATCH 20/44] Changeset version bump (#6239) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens --- .changeset/brown-insects-start.md | 5 ----- .changeset/v3.24.0.md | 17 ----------------- CHANGELOG.md | 16 ++++++++++++++++ src/package.json | 2 +- 4 files changed, 17 insertions(+), 23 deletions(-) delete mode 100644 .changeset/brown-insects-start.md delete mode 100644 .changeset/v3.24.0.md diff --git a/.changeset/brown-insects-start.md b/.changeset/brown-insects-start.md deleted file mode 100644 index 02fe83d0d4..0000000000 --- a/.changeset/brown-insects-start.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Kick off release diff --git a/.changeset/v3.24.0.md b/.changeset/v3.24.0.md deleted file mode 100644 index 1b0f58a2ac..0000000000 --- a/.changeset/v3.24.0.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -"roo-cline": minor ---- - -- Add Hugging Face provider with support for open source models (thanks @TGlide!) -- Add terminal command permissions UI to chat interface -- Add support for Agent Rules standard via AGENTS.md (thanks @sgryphon!) -- Add settings to control diagnostic messages -- Fix auto-approve checkbox to be toggled at any time (thanks @KJ7LNW!) -- Add efficiency warning for single SEARCH/REPLACE blocks in apply_diff (thanks @KJ7LNW!) -- Fix respect maxReadFileLine setting for file mentions to prevent context exhaustion (thanks @sebinseban!) -- Fix Ollama API URL normalization by removing trailing slashes (thanks @Naam!) -- Fix restore list styles for markdown lists in chat interface (thanks @village-way!) -- Add support for bedrock api keys -- Add confirmation dialog and proper cleanup for marketplace mode removal -- Fix cancel auto-approve timer when editing follow-up suggestion (thanks @hassoncs!) -- Fix add error message when no workspace folder is open for code indexing diff --git a/CHANGELOG.md b/CHANGELOG.md index e34a65dbee..9892ca1cc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Roo Code Changelog +## [3.24.0] - 2025-07-25 + +- Add Hugging Face provider with support for open source models (thanks @TGlide!) +- Add terminal command permissions UI to chat interface +- Add support for Agent Rules standard via AGENTS.md (thanks @sgryphon!) +- Add settings to control diagnostic messages +- Fix auto-approve checkbox to be toggled at any time (thanks @KJ7LNW!) +- Add efficiency warning for single SEARCH/REPLACE blocks in apply_diff (thanks @KJ7LNW!) +- Fix respect maxReadFileLine setting for file mentions to prevent context exhaustion (thanks @sebinseban!) +- Fix Ollama API URL normalization by removing trailing slashes (thanks @Naam!) +- Fix restore list styles for markdown lists in chat interface (thanks @village-way!) +- Add support for bedrock api keys +- Add confirmation dialog and proper cleanup for marketplace mode removal +- Fix cancel auto-approve timer when editing follow-up suggestion (thanks @hassoncs!) +- Fix add error message when no workspace folder is open for code indexing + ## [3.23.19] - 2025-07-23 - Add Roo Code Cloud Waitlist CTAs (thanks @brunobergher!) diff --git a/src/package.json b/src/package.json index c816837bb7..61b8059e10 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.23.19", + "version": "3.24.0", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 478869e37a34e0003ef142ce864f8fdf629a214e Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Sat, 26 Jul 2025 15:31:01 -0500 Subject: [PATCH 21/44] feat: add markdown table rendering support (#6252) --- .../src/components/common/MarkdownBlock.tsx | 297 ++++++++---------- 1 file changed, 136 insertions(+), 161 deletions(-) diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index 4c958593aa..ca6c9316b1 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -1,9 +1,10 @@ -import React, { memo, useEffect } from "react" -import { useRemark } from "react-remark" +import React, { memo } from "react" +import ReactMarkdown from "react-markdown" import styled from "styled-components" import { visit } from "unist-util-visit" import rehypeKatex from "rehype-katex" import remarkMath from "remark-math" +import remarkGfm from "remark-gfm" import { vscode } from "@src/utils/vscode" import { useExtensionState } from "@src/context/ExtensionStateContext" @@ -15,68 +16,6 @@ interface MarkdownBlockProps { markdown?: string } -/** - * Custom remark plugin that converts plain URLs in text into clickable links - * - * The original bug: We were converting text nodes into paragraph nodes, - * which broke the markdown structure because text nodes should remain as text nodes - * within their parent elements (like paragraphs, list items, etc.). - * This caused the entire content to disappear because the structure became invalid. - */ -const remarkUrlToLink = () => { - return (tree: any) => { - // Visit all "text" nodes in the markdown AST (Abstract Syntax Tree) - visit(tree, "text", (node: any, index, parent) => { - const urlRegex = /https?:\/\/[^\s<>)"]+/g - const matches = node.value.match(urlRegex) - - if (!matches || !parent) { - return - } - - const parts = node.value.split(urlRegex) - const children: any[] = [] - const cleanedMatches = matches.map((url: string) => url.replace(/[.,;:!?'"]+$/, "")) - - parts.forEach((part: string, i: number) => { - if (part) { - children.push({ type: "text", value: part }) - } - - if (cleanedMatches[i]) { - const originalUrl = matches[i] - const cleanedUrl = cleanedMatches[i] - const removedPunctuation = originalUrl.substring(cleanedUrl.length) - - // Create a proper link node with all required properties - children.push({ - type: "link", - url: cleanedUrl, - title: null, - children: [{ type: "text", value: cleanedUrl }], - data: { - hProperties: { - href: cleanedUrl, - }, - }, - }) - - if (removedPunctuation) { - children.push({ type: "text", value: removedPunctuation }) - } - } - }) - - // Replace the original text node with our new nodes in the parent's children array. - // This preserves the document structure while adding our links. - parent.children.splice(index!, 1, ...children) - - // Return SKIP to prevent visiting the newly created nodes - return ["skip", index! + children.length] - }) - } -} - const StyledMarkdown = styled.div` code:not(pre > code) { font-family: var(--vscode-editor-font-family, monospace); @@ -191,117 +130,153 @@ const StyledMarkdown = styled.div` text-decoration-color: var(--vscode-textLink-activeForeground); } } + + /* Table styles for remark-gfm */ + table { + width: 100%; + border-collapse: collapse; + margin: 1em 0; + overflow-x: auto; + display: block; + } + + th, + td { + border: 1px solid var(--vscode-panel-border); + padding: 8px 12px; + text-align: left; + } + + th { + background-color: var(--vscode-editor-background); + font-weight: 600; + color: var(--vscode-foreground); + } + + tr:nth-child(even) { + background-color: var(--vscode-editor-inactiveSelectionBackground); + } + + tr:hover { + background-color: var(--vscode-list-hoverBackground); + } ` const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { - const { theme } = useExtensionState() - const [reactContent, setMarkdown] = useRemark({ - remarkPlugins: [ - remarkUrlToLink, - remarkMath, - () => { - return (tree) => { - visit(tree, "code", (node: any) => { - if (!node.lang) { - node.lang = "text" - } else if (node.lang.includes(".")) { - node.lang = node.lang.split(".").slice(-1)[0] - } - }) + const { theme: _theme } = useExtensionState() + + const components = { + a: ({ href, children, ...props }: any) => { + const handleClick = (e: React.MouseEvent) => { + // Only process file:// protocol or local file paths + const isLocalPath = href?.startsWith("file://") || href?.startsWith("/") || !href?.includes("://") + + if (!isLocalPath) { + return } - }, - ], - rehypePlugins: [rehypeKatex as any], - rehypeReactOptions: { - components: { - a: ({ href, children, ...props }: any) => { - const handleClick = (e: React.MouseEvent) => { - // Only process file:// protocol or local file paths - const isLocalPath = href.startsWith("file://") || href.startsWith("/") || !href.includes("://") - if (!isLocalPath) { - return - } + e.preventDefault() - e.preventDefault() + // Handle absolute vs project-relative paths + let filePath = href.replace("file://", "") - // Handle absolute vs project-relative paths - let filePath = href.replace("file://", "") + // Extract line number if present + const match = filePath.match(/(.*):(\d+)(-\d+)?$/) + let values = undefined + if (match) { + filePath = match[1] + values = { line: parseInt(match[2]) } + } - // Extract line number if present - const match = filePath.match(/(.*):(\d+)(-\d+)?$/) - let values = undefined - if (match) { - filePath = match[1] - values = { line: parseInt(match[2]) } - } + // Add ./ prefix if needed + if (!filePath.startsWith("/") && !filePath.startsWith("./")) { + filePath = "./" + filePath + } - // Add ./ prefix if needed - if (!filePath.startsWith("/") && !filePath.startsWith("./")) { - filePath = "./" + filePath - } + vscode.postMessage({ + type: "openFile", + text: filePath, + values, + }) + } - vscode.postMessage({ - type: "openFile", - text: filePath, - values, - }) - } - - return ( - - {children} - - ) - }, - pre: ({ node: _, children }: any) => { - // Check for Mermaid diagrams first - if (Array.isArray(children) && children.length === 1 && React.isValidElement(children[0])) { - const child = children[0] as React.ReactElement<{ className?: string }> - - if (child.props?.className?.includes("language-mermaid")) { - return child - } - } - - // For all other code blocks, use CodeBlock with copy button - const codeNode = children?.[0] - - if (!codeNode?.props?.children) { - return null - } - - const language = - (Array.isArray(codeNode.props?.className) - ? codeNode.props.className - : [codeNode.props?.className] - ).map((c: string) => c?.replace("language-", ""))[0] || "javascript" - - const rawText = codeNode.props.children[0] || "" - return - }, - code: (props: any) => { - const className = props.className || "" - - if (className.includes("language-mermaid")) { - const codeText = String(props.children || "") - return - } - - return - }, - }, + return ( + + {children} + + ) }, - }) + pre: ({ children, ..._props }: any) => { + // The structure from react-markdown v9 is: pre > code > text + const codeEl = children as React.ReactElement - useEffect(() => { - setMarkdown(markdown || "") - }, [markdown, setMarkdown, theme]) + if (!codeEl || !codeEl.props) { + return
    {children}
    + } + + const { className = "", children: codeChildren } = codeEl.props + + // Get the actual code text + let codeString = "" + if (typeof codeChildren === "string") { + codeString = codeChildren + } else if (Array.isArray(codeChildren)) { + codeString = codeChildren.filter((child) => typeof child === "string").join("") + } + + // Handle mermaid diagrams + if (className.includes("language-mermaid")) { + return ( +
    + +
    + ) + } + + // Extract language from className + const match = /language-(\w+)/.exec(className) + const language = match ? match[1] : "text" + + // Wrap CodeBlock in a div to ensure proper separation + return ( +
    + +
    + ) + }, + code: ({ children, className, ...props }: any) => { + // This handles inline code + return ( + + {children} + + ) + }, + } return ( -
    - {reactContent} -
    + + { + return (tree: any) => { + visit(tree, "code", (node: any) => { + if (!node.lang) { + node.lang = "text" + } else if (node.lang.includes(".")) { + node.lang = node.lang.split(".").slice(-1)[0] + } + }) + } + }, + ]} + rehypePlugins={[rehypeKatex as any]} + components={components}> + {markdown || ""} + + ) }) From 4d0550c855e1a4f42cac6b7e3a27559468ff7d19 Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Sat, 26 Jul 2025 17:21:53 -0500 Subject: [PATCH 22/44] fix: restore working settings link in command permissions tooltip (#6253) - Replace broken command URI with onClick handler that posts message - Command URIs don't work in webview context, must use postMessage - Restores original working implementation from PR #5798 - Directs to autoApprove section where command permissions are configured The bug was introduced in commit 77bc9e6f when the tooltip was updated to use command URI instead of the working onClick pattern. --- .../src/components/chat/CommandPatternSelector.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/CommandPatternSelector.tsx b/webview-ui/src/components/chat/CommandPatternSelector.tsx index b79d86ccfe..c3b13b79d9 100644 --- a/webview-ui/src/components/chat/CommandPatternSelector.tsx +++ b/webview-ui/src/components/chat/CommandPatternSelector.tsx @@ -31,6 +31,10 @@ export const CommandPatternSelector: React.FC = ({ const [isExpanded, setIsExpanded] = useState(false) const [editingStates, setEditingStates] = useState>({}) + const handleOpenSettings = () => { + window.postMessage({ type: "action", action: "settingsButtonClicked", values: { section: "autoApprove" } }) + } + // Create a combined list with full command first, then patterns const allPatterns = useMemo(() => { // Trim the command to ensure consistency with extracted patterns @@ -90,7 +94,11 @@ export const CommandPatternSelector: React.FC = ({ components={{ settingsLink: ( { + e.preventDefault() + handleOpenSettings() + }} className="text-vscode-textLink-foreground hover:text-vscode-textLink-activeForeground" /> ), From f530a71371e8694dbae117fda63e1eb0818b611a Mon Sep 17 00:00:00 2001 From: Murilo Pires <50873657+MuriloFP@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:30:56 -0300 Subject: [PATCH 23/44] # fix: list_files recursive mode now works for dot directories (#5176) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add Issue Fixer Orchestrator mode * The `list_files` tool with `recursive: true` was returning empty results when targeting directories that start with a dot (e.g., `.roo-memory`). This happened because the recursive mode was applying a blanket exclusion pattern `!**/.*//**` that excluded all files inside any hidden directory, even when the user explicitly requested to list that directory. - `src/services/glob/list-files.ts` - **Modified `buildRecursiveArgs()`**: Removed the problematic `!**/.*//**` exclusion pattern for hidden directories in recursive mode - **Enhanced `listFilteredDirectories()`**: Added `isTargetDir` parameter to distinguish between explicitly targeted directories and discovered subdirectories - **Updated `shouldIncludeDirectory()`**: Always include explicitly targeted directories (even if hidden), while still applying ignore rules to subdirectories found during traversal - **Before**: `list_files` with `path: ".roo-memory"` and `recursive: true` → Empty results - **After**: `list_files` with `path: ".roo-memory"` and `recursive: true` → Returns directory contents - **Preserved**: Hidden subdirectories discovered during traversal are still filtered out This maintains consistency with `.gitignore` and `.rooignore` mechanisms while ensuring explicitly targeted directories are always processed. Fixes #2992 * Update src/services/glob/list-files.ts Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * fix: list_files recursive mode now works correctly for hidden directories - Fixed ripgrep exclusion pattern from `!**/.*//**` to `!**/.*/**` - Hidden directories (like .git/) now appear in recursive listings but their contents are excluded - Contents of hidden directories are only shown when explicitly targeting that directory - Prevents context window overflow from massive hidden directories like .git/ - Maintains consistent behavior: show directory exists, avoid flooding with contents Fixes #2992 * fix(glob): show top-level hidden directories in list_files - Modified list-files.ts to show hidden directories at top level - Added test coverage for hidden directory visibility behavior - Maintains existing functionality while fixing the .roo directory issue Addresses PR #5176 feedback with simplified implementation * fix(glob): include top-level files when recursively listing ignored directories - Fix issue where files at root level of directories in DIRS_TO_IGNORE were excluded - Add explicit include patterns (* and **/*) when targeting ignored directories - Modify exclusion pattern to use !*/dir/** instead of !**/dir/** for target directory - Add comprehensive test case for .roo/temp scenario Fixes #5176 * fix(list-files): improve handling of explicitly targeted ignored directories - Fixed issue where recursive listing would skip files in explicitly targeted directories that are in DIRS_TO_IGNORE - When targeting a directory like 'temp' that's in the ignore list, we now skip adding exclusion patterns for it - This ensures all files in the target directory are listed while still preventing recursion into nested directories with the same ignored name - Also fixed path resolution to convert relative paths from ripgrep to absolute paths * fix(tests): add missing mocks for list-files tests * refactor: improve list-files implementation - Remove redundant path resolution in listFilesWithRipgrep - Convert CRITICAL_IGNORE_PATTERNS to Set for better performance - Standardize error message format across all console.warn calls * fix: update tests to handle cross-platform path resolution --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Daniel Riccio --- .../glob/__tests__/list-files.spec.ts | 379 +++++++++++++++++- src/services/glob/constants.ts | 1 + src/services/glob/list-files.ts | 258 ++++++++++-- 3 files changed, 587 insertions(+), 51 deletions(-) diff --git a/src/services/glob/__tests__/list-files.spec.ts b/src/services/glob/__tests__/list-files.spec.ts index 6c133a732a..d855388002 100644 --- a/src/services/glob/__tests__/list-files.spec.ts +++ b/src/services/glob/__tests__/list-files.spec.ts @@ -3,6 +3,18 @@ import * as path from "path" import { listFiles } from "../list-files" import * as childProcess from "child_process" +vi.mock("child_process") +vi.mock("fs") +vi.mock("vscode", () => ({ + env: { + appRoot: "/mock/vscode/app/root", + }, +})) + +vi.mock("../../ripgrep", () => ({ + getBinPath: vi.fn().mockResolvedValue("/mock/path/to/rg"), +})) + vi.mock("../list-files", async () => { const actual = await vi.importActual("../list-files") return { @@ -83,8 +95,11 @@ describe("list-files symlink support", () => { mockSpawn.mockReturnValue(mockProcess as any) + // Use a test directory path + const testDir = "/test/dir" + // Call listFiles to trigger ripgrep execution - await listFiles("/test/dir", false, 100) + await listFiles(testDir, false, 100) // Verify that spawn was called with --follow flag (the critical fix) const [rgPath, args] = mockSpawn.mock.calls[0] @@ -93,9 +108,12 @@ describe("list-files symlink support", () => { expect(args).toContain("--hidden") expect(args).toContain("--follow") // This is the critical assertion - the fix should add this flag - // Platform-agnostic path check - verify the last argument is the resolved path - const expectedPath = path.resolve("/test/dir") - expect(args[args.length - 1]).toBe(expectedPath) + // Platform-agnostic path check - verify the last argument ends with the expected path + const lastArg = args[args.length - 1] + // On Windows, the path might be resolved to something like D:\test\dir + // On Unix, it would be /test/dir + // So we just check that it ends with the expected segments + expect(lastArg).toMatch(/[/\\]test[/\\]dir$/) }) it("should include --follow flag for recursive listings too", async () => { @@ -124,8 +142,11 @@ describe("list-files symlink support", () => { mockSpawn.mockReturnValue(mockProcess as any) + // Use a test directory path + const testDir = "/test/dir" + // Call listFiles with recursive=true - await listFiles("/test/dir", true, 100) + await listFiles(testDir, true, 100) // Verify that spawn was called with --follow flag (the critical fix) const [rgPath, args] = mockSpawn.mock.calls[0] @@ -134,9 +155,12 @@ describe("list-files symlink support", () => { expect(args).toContain("--hidden") expect(args).toContain("--follow") // This should be present in recursive mode too - // Platform-agnostic path check - verify the last argument is the resolved path - const expectedPath = path.resolve("/test/dir") - expect(args[args.length - 1]).toBe(expectedPath) + // Platform-agnostic path check - verify the last argument ends with the expected path + const lastArg = args[args.length - 1] + // On Windows, the path might be resolved to something like D:\test\dir + // On Unix, it would be /test/dir + // So we just check that it ends with the expected segments + expect(lastArg).toMatch(/[/\\]test[/\\]dir$/) }) it("should ensure first-level directories are included when limit is reached", async () => { @@ -159,18 +183,19 @@ describe("list-files symlink support", () => { on: vi.fn((event, callback) => { if (event === "data") { // Return many file paths to trigger the limit + // Note: ripgrep returns relative paths const paths = [ - "/test/dir/a_dir/", - "/test/dir/a_dir/subdir1/", - "/test/dir/a_dir/subdir1/file1.txt", - "/test/dir/a_dir/subdir1/file2.txt", - "/test/dir/a_dir/subdir2/", - "/test/dir/a_dir/subdir2/file3.txt", - "/test/dir/a_dir/file4.txt", - "/test/dir/a_dir/file5.txt", - "/test/dir/file1.txt", - "/test/dir/file2.txt", + "a_dir/", + "a_dir/subdir1/", + "a_dir/subdir1/file1.txt", + "a_dir/subdir1/file2.txt", + "a_dir/subdir2/", + "a_dir/subdir2/file3.txt", + "a_dir/file4.txt", + "a_dir/file5.txt", + "file1.txt", + "file2.txt", // Note: b_dir and c_dir are missing from ripgrep output ].join("\n") + "\n" setTimeout(() => callback(paths), 10) @@ -216,3 +241,321 @@ describe("list-files symlink support", () => { expect(hasCDir).toBe(true) }) }) + +describe("hidden directory exclusion", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it("should exclude .git subdirectories from recursive directory listing", async () => { + // Mock filesystem structure with .git subdirectories + const mockReaddir = vi.fn() + vi.mocked(fs.promises).readdir = mockReaddir + + // Mock the directory structure: + // /test/ + // .git/ + // hooks/ + // objects/ + // src/ + // components/ + mockReaddir + .mockResolvedValueOnce([ + { name: ".git", isDirectory: () => true, isSymbolicLink: () => false }, + { name: "src", isDirectory: () => true, isSymbolicLink: () => false }, + ]) + .mockResolvedValueOnce([ + // src subdirectories (should be included) + { name: "components", isDirectory: () => true, isSymbolicLink: () => false }, + ]) + .mockResolvedValueOnce([]) // components/ is empty + + // Mock ripgrep to return no files + const mockSpawn = vi.mocked(childProcess.spawn) + const mockProcess = { + stdout: { + on: vi.fn((event, callback) => { + if (event === "data") { + // No files returned + } + }), + }, + stderr: { + on: vi.fn(), + }, + on: vi.fn((event, callback) => { + if (event === "close") { + setTimeout(() => callback(0), 10) + } + }), + kill: vi.fn(), + } + mockSpawn.mockReturnValue(mockProcess as any) + + // Call listFiles with recursive=true + const [result] = await listFiles("/test", true, 100) + + // Verify that .git subdirectories are NOT included + const directories = result.filter((item) => item.endsWith("/")) + + // More specific checks - look for exact paths + const hasSrcDir = directories.some((dir) => dir.endsWith("/test/src/") || dir.endsWith("src/")) + const hasComponentsDir = directories.some( + (dir) => + dir.endsWith("/test/src/components/") || dir.endsWith("src/components/") || dir.includes("components/"), + ) + const hasGitDir = directories.some((dir) => dir.includes(".git/")) + + // Should include src/ and src/components/ but NOT .git/ or its subdirectories + expect(hasSrcDir).toBe(true) + expect(hasComponentsDir).toBe(true) + + // Should NOT include .git (hidden directories are excluded) + expect(hasGitDir).toBe(false) + }) + + it("should allow explicit targeting of hidden directories", async () => { + // Mock filesystem structure for explicit .roo-memory targeting + const mockReaddir = vi.fn() + vi.mocked(fs.promises).readdir = mockReaddir + + // Mock .roo-memory directory contents + mockReaddir.mockResolvedValueOnce([ + { name: "tasks", isDirectory: () => true, isSymbolicLink: () => false }, + { name: "context", isDirectory: () => true, isSymbolicLink: () => false }, + ]) + + // Mock ripgrep to return no files + const mockSpawn = vi.mocked(childProcess.spawn) + const mockProcess = { + stdout: { + on: vi.fn((event, callback) => { + if (event === "data") { + // No files returned + } + }), + }, + stderr: { + on: vi.fn(), + }, + on: vi.fn((event, callback) => { + if (event === "close") { + setTimeout(() => callback(0), 10) + } + }), + kill: vi.fn(), + } + mockSpawn.mockReturnValue(mockProcess as any) + + // Call listFiles explicitly targeting .roo-memory directory + const [result] = await listFiles("/test/.roo-memory", true, 100) + + // When explicitly targeting a hidden directory, its subdirectories should be included + const directories = result.filter((item) => item.endsWith("/")) + + const hasTasksDir = directories.some((dir) => dir.includes(".roo-memory/tasks/") || dir.includes("tasks/")) + const hasContextDir = directories.some( + (dir) => dir.includes(".roo-memory/context/") || dir.includes("context/"), + ) + + expect(hasTasksDir).toBe(true) + expect(hasContextDir).toBe(true) + }) + + it("should include top-level files when recursively listing a hidden directory that's also in DIRS_TO_IGNORE", async () => { + // This test specifically addresses the bug where files at the root level of .roo/temp + // were being excluded when using recursive listing + const mockSpawn = vi.mocked(childProcess.spawn) + const mockProcess = { + stdout: { + on: vi.fn((event, callback) => { + if (event === "data") { + // Simulate files that should be found in .roo/temp + // Note: ripgrep returns relative paths + setTimeout(() => { + callback("teste1.md\n") + callback("22/test2.md\n") + }, 10) + } + }), + }, + stderr: { + on: vi.fn(), + }, + on: vi.fn((event, callback) => { + if (event === "close") { + setTimeout(() => callback(0), 20) + } + }), + kill: vi.fn(), + } + + mockSpawn.mockReturnValue(mockProcess as any) + + // Mock directory listing for .roo/temp + const mockReaddir = vi.fn() + vi.mocked(fs.promises).readdir = mockReaddir + mockReaddir.mockResolvedValueOnce([{ name: "22", isDirectory: () => true, isSymbolicLink: () => false }]) + + // Call listFiles targeting .roo/temp (which is both hidden and in DIRS_TO_IGNORE) + const [files] = await listFiles("/test/.roo/temp", true, 100) + + // Verify ripgrep was called with correct arguments + const [rgPath, args] = mockSpawn.mock.calls[0] + expect(args).toContain("--no-ignore-vcs") + expect(args).toContain("--no-ignore") + + // Check for the inclusion patterns that should be added + expect(args).toContain("-g") + const gIndex = args.indexOf("-g") + expect(args[gIndex + 1]).toBe("*") + + // Verify that both top-level and nested files are included + const fileNames = files.map((f) => path.basename(f)) + expect(fileNames).toContain("teste1.md") + expect(fileNames).toContain("test2.md") + + // Ensure the top-level file is actually included + const topLevelFile = files.find((f) => f.endsWith("teste1.md")) + expect(topLevelFile).toBeTruthy() + }) +}) + +describe("buildRecursiveArgs edge cases", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it("should correctly detect hidden directories with trailing slashes", async () => { + const mockSpawn = vi.mocked(childProcess.spawn) + const mockProcess = { + stdout: { + on: vi.fn((event, callback) => { + if (event === "data") { + setTimeout(() => callback("file.txt\n"), 10) + } + }), + }, + stderr: { + on: vi.fn(), + }, + on: vi.fn((event, callback) => { + if (event === "close") { + setTimeout(() => callback(0), 20) + } + }), + kill: vi.fn(), + } + mockSpawn.mockReturnValue(mockProcess as any) + + // Test with trailing slash on hidden directory + await listFiles("/test/.hidden/", true, 100) + + const [rgPath, args] = mockSpawn.mock.calls[0] + // When targeting a hidden directory, these flags should be present + expect(args).toContain("--no-ignore-vcs") + expect(args).toContain("--no-ignore") + expect(args).toContain("-g") + const gIndex = args.indexOf("-g") + expect(args[gIndex + 1]).toBe("*") + }) + + it("should correctly detect hidden directories with redundant separators", async () => { + const mockSpawn = vi.mocked(childProcess.spawn) + const mockProcess = { + stdout: { + on: vi.fn((event, callback) => { + if (event === "data") { + setTimeout(() => callback("file.txt\n"), 10) + } + }), + }, + stderr: { + on: vi.fn(), + }, + on: vi.fn((event, callback) => { + if (event === "close") { + setTimeout(() => callback(0), 20) + } + }), + kill: vi.fn(), + } + mockSpawn.mockReturnValue(mockProcess as any) + + // Test with redundant separators before hidden directory + await listFiles("/test//.hidden", true, 100) + + const [rgPath, args] = mockSpawn.mock.calls[0] + // When targeting a hidden directory, these flags should be present + expect(args).toContain("--no-ignore-vcs") + expect(args).toContain("--no-ignore") + expect(args).toContain("-g") + const gIndex = args.indexOf("-g") + expect(args[gIndex + 1]).toBe("*") + }) + + it("should correctly detect nested hidden directories with mixed separators", async () => { + const mockSpawn = vi.mocked(childProcess.spawn) + const mockProcess = { + stdout: { + on: vi.fn((event, callback) => { + if (event === "data") { + setTimeout(() => callback("file.txt\n"), 10) + } + }), + }, + stderr: { + on: vi.fn(), + }, + on: vi.fn((event, callback) => { + if (event === "close") { + setTimeout(() => callback(0), 20) + } + }), + kill: vi.fn(), + } + mockSpawn.mockReturnValue(mockProcess as any) + + // Test with complex path including hidden directory + await listFiles("/test//normal/.hidden//subdir/", true, 100) + + const [rgPath, args] = mockSpawn.mock.calls[0] + // When targeting a path containing a hidden directory, these flags should be present + expect(args).toContain("--no-ignore-vcs") + expect(args).toContain("--no-ignore") + expect(args).toContain("-g") + const gIndex = args.indexOf("-g") + expect(args[gIndex + 1]).toBe("*") + }) + + it("should not detect hidden directories when path only has dots in filenames", async () => { + const mockSpawn = vi.mocked(childProcess.spawn) + const mockProcess = { + stdout: { + on: vi.fn((event, callback) => { + if (event === "data") { + setTimeout(() => callback("file.txt\n"), 10) + } + }), + }, + stderr: { + on: vi.fn(), + }, + on: vi.fn((event, callback) => { + if (event === "close") { + setTimeout(() => callback(0), 20) + } + }), + kill: vi.fn(), + } + mockSpawn.mockReturnValue(mockProcess as any) + + // Test with a path that has dots but no hidden directories + await listFiles("/test/file.with.dots/normal", true, 100) + + const [rgPath, args] = mockSpawn.mock.calls[0] + // Should NOT have the special flags for hidden directories + expect(args).not.toContain("--no-ignore-vcs") + expect(args).not.toContain("--no-ignore") + }) +}) diff --git a/src/services/glob/constants.ts b/src/services/glob/constants.ts index 1ddcc37df9..380e4afaf3 100644 --- a/src/services/glob/constants.ts +++ b/src/services/glob/constants.ts @@ -20,5 +20,6 @@ export const DIRS_TO_IGNORE = [ "deps", "pkg", "Pods", + ".git", ".*", ] diff --git a/src/services/glob/list-files.ts b/src/services/glob/list-files.ts index 05fa8a1d7b..7347515784 100644 --- a/src/services/glob/list-files.ts +++ b/src/services/glob/list-files.ts @@ -8,6 +8,20 @@ import { arePathsEqual } from "../../utils/path" import { getBinPath } from "../../services/ripgrep" import { DIRS_TO_IGNORE } from "./constants" +/** + * Context object for directory scanning operations + */ +interface ScanContext { + /** Whether this is the explicitly targeted directory */ + isTargetDir: boolean + /** Whether we're inside an explicitly targeted hidden directory */ + insideExplicitHiddenTarget: boolean + /** The base path for the scan operation */ + basePath: string + /** The ignore instance for gitignore handling */ + ignoreInstance: ReturnType +} + /** * List files in a directory, with optional recursive traversal * @@ -70,7 +84,13 @@ async function getFirstLevelDirectories(dirPath: string, ignoreInstance: ReturnT for (const entry of entries) { if (entry.isDirectory() && !entry.isSymbolicLink()) { const fullDirPath = path.join(absolutePath, entry.name) - if (shouldIncludeDirectory(entry.name, fullDirPath, dirPath, ignoreInstance)) { + const context: ScanContext = { + isTargetDir: false, + insideExplicitHiddenTarget: false, + basePath: dirPath, + ignoreInstance, + } + if (shouldIncludeDirectory(entry.name, fullDirPath, context)) { const formattedPath = fullDirPath.endsWith("/") ? fullDirPath : `${fullDirPath}/` directories.push(formattedPath) } @@ -179,9 +199,14 @@ async function listFilesWithRipgrep( recursive: boolean, limit: number, ): Promise { + const rgArgs = buildRipgrepArgs(dirPath, recursive) + + const relativePaths = await execRipgrep(rgPath, rgArgs, limit) + + // Convert relative paths from ripgrep to absolute paths + // Resolve dirPath once here for the mapping operation const absolutePath = path.resolve(dirPath) - const rgArgs = buildRipgrepArgs(absolutePath, recursive) - return execRipgrep(rgPath, rgArgs, limit) + return relativePaths.map((relativePath) => path.resolve(absolutePath, relativePath)) } /** @@ -192,7 +217,7 @@ function buildRipgrepArgs(dirPath: string, recursive: boolean): string[] { const args = ["--files", "--hidden", "--follow"] if (recursive) { - return [...args, ...buildRecursiveArgs(), dirPath] + return [...args, ...buildRecursiveArgs(dirPath), dirPath] } else { return [...args, ...buildNonRecursiveArgs(), dirPath] } @@ -201,14 +226,62 @@ function buildRipgrepArgs(dirPath: string, recursive: boolean): string[] { /** * Build ripgrep arguments for recursive directory traversal */ -function buildRecursiveArgs(): string[] { +function buildRecursiveArgs(dirPath: string): string[] { const args: string[] = [] // In recursive mode, respect .gitignore by default // (ripgrep does this automatically) + // Check if we're explicitly targeting a hidden directory + // Normalize the path first to handle edge cases + const normalizedPath = path.normalize(dirPath) + // Split by separator and filter out empty parts + // This handles cases like trailing slashes, multiple separators, etc. + const pathParts = normalizedPath.split(path.sep).filter((part) => part.length > 0) + const isTargetingHiddenDir = pathParts.some((part) => part.startsWith(".")) + + // Get the target directory name to check if it's in the ignore list + const targetDirName = path.basename(dirPath) + const isTargetInIgnoreList = DIRS_TO_IGNORE.includes(targetDirName) + + // If targeting a hidden directory or a directory in the ignore list, + // use special handling to ensure all files are shown + if (isTargetingHiddenDir || isTargetInIgnoreList) { + args.push("--no-ignore-vcs") + args.push("--no-ignore") + + // When targeting an ignored directory, we need to be careful with glob patterns + // Add a pattern to explicitly include files at the root level + args.push("-g", "*") + args.push("-g", "**/*") + } + // Apply directory exclusions for recursive searches for (const dir of DIRS_TO_IGNORE) { + // Special handling for hidden directories pattern + if (dir === ".*") { + // If we're explicitly targeting a hidden directory, don't exclude hidden files/dirs + // This allows the target hidden directory and all its contents to be listed + if (!isTargetingHiddenDir) { + // Not targeting hidden dir: exclude all hidden directories + args.push("-g", `!**/.*/**`) + } + // If targeting hidden dir: don't add any exclusion for hidden directories + continue + } + + // When explicitly targeting a directory that's in the ignore list (e.g., "temp"), + // we need special handling: + // - Don't add any exclusion pattern for the target directory itself + // - Only exclude nested subdirectories with the same name + // This ensures all files in the target directory are listed, while still + // preventing recursion into nested directories with the same ignored name + if (dir === targetDirName && isTargetInIgnoreList) { + // Skip adding any exclusion pattern - we want to see everything in the target directory + continue + } + + // For all other cases, exclude the directory pattern globally args.push("-g", `!**/${dir}/**`) } @@ -231,8 +304,11 @@ function buildNonRecursiveArgs(): string[] { // Apply directory exclusions for non-recursive searches for (const dir of DIRS_TO_IGNORE) { if (dir === ".*") { - // For hidden files/dirs in non-recursive mode - args.push("-g", "!.*") + // For hidden directories in non-recursive mode, we want to show the directories + // themselves but not their contents. Since we're using --maxdepth 1, this + // naturally happens - we just need to avoid excluding the directories entirely. + // We'll let the directory scanning logic handle the visibility. + continue } else { // Direct children only args.push("-g", `!${dir}`) @@ -261,7 +337,7 @@ async function createIgnoreInstance(dirPath: string): Promise { + // For environment details generation, we don't want to treat the root as a "target" + // if we're doing a general recursive scan, as this would include hidden directories + // Only treat as target if we're explicitly scanning a single hidden directory + const isExplicitHiddenTarget = path.basename(absolutePath).startsWith(".") + + // Create initial context for the scan + const initialContext: ScanContext = { + isTargetDir: isExplicitHiddenTarget, + insideExplicitHiddenTarget: isExplicitHiddenTarget, + basePath: dirPath, + ignoreInstance, + } + + async function scanDirectory(currentPath: string, context: ScanContext): Promise { try { // List all entries in the current directory const entries = await fs.promises.readdir(currentPath, { withFileTypes: true }) @@ -323,61 +412,155 @@ async function listFilteredDirectories( const dirName = entry.name const fullDirPath = path.join(currentPath, dirName) + // Create context for subdirectory checks + // Subdirectories found during scanning are never target directories themselves + const subdirContext: ScanContext = { + ...context, + isTargetDir: false, + } + // Check if this directory should be included - if (shouldIncludeDirectory(dirName, fullDirPath, dirPath, ignoreInstance)) { + if (shouldIncludeDirectory(dirName, fullDirPath, subdirContext)) { // Add the directory to our results (with trailing slash) + // fullDirPath is already absolute since it's built with path.join from absolutePath const formattedPath = fullDirPath.endsWith("/") ? fullDirPath : `${fullDirPath}/` directories.push(formattedPath) + } - // If recursive mode and not a ignored directory, scan subdirectories - if (recursive && !isDirectoryExplicitlyIgnored(dirName)) { - await scanDirectory(fullDirPath) + // If recursive mode and not a ignored directory, scan subdirectories + // Don't recurse into hidden directories unless they are the explicit target + // or we're already inside an explicitly targeted hidden directory + const isHiddenDir = dirName.startsWith(".") + + // Use the same logic as shouldIncludeDirectory for recursion decisions + // When inside an explicitly targeted hidden directory, only block critical directories + let shouldRecurseIntoDir = true + if (context.insideExplicitHiddenTarget) { + // Only apply the most critical ignore patterns when inside explicit hidden target + shouldRecurseIntoDir = !CRITICAL_IGNORE_PATTERNS.has(dirName) + } else { + shouldRecurseIntoDir = !isDirectoryExplicitlyIgnored(dirName) + } + + const shouldRecurse = + recursive && + shouldRecurseIntoDir && + !( + isHiddenDir && + DIRS_TO_IGNORE.includes(".*") && + !context.isTargetDir && + !context.insideExplicitHiddenTarget + ) + if (shouldRecurse) { + // If we're entering a hidden directory that's the target, or we're already inside one, + // mark that we're inside an explicitly targeted hidden directory + const newInsideExplicitHiddenTarget = + context.insideExplicitHiddenTarget || (isHiddenDir && context.isTargetDir) + const newContext: ScanContext = { + ...context, + isTargetDir: false, + insideExplicitHiddenTarget: newInsideExplicitHiddenTarget, } + await scanDirectory(fullDirPath, newContext) } } } } catch (err) { - // Silently continue if we can't read a directory + // Continue if we can't read a directory console.warn(`Could not read directory ${currentPath}: ${err}`) } } // Start scanning from the root directory - await scanDirectory(absolutePath) + await scanDirectory(absolutePath, initialContext) return directories } /** - * Determine if a directory should be included in results based on filters + * Critical directories that should always be ignored, even inside explicitly targeted hidden directories */ -function shouldIncludeDirectory( - dirName: string, +const CRITICAL_IGNORE_PATTERNS = new Set(["node_modules", ".git", "__pycache__", "venv", "env"]) + +/** + * Check if a directory matches any of the given patterns + */ +function matchesIgnorePattern(dirName: string, patterns: string[]): boolean { + for (const pattern of patterns) { + if (pattern === dirName || (pattern.includes("/") && pattern.split("/")[0] === dirName)) { + return true + } + } + return false +} + +/** + * Check if a directory is ignored by gitignore + */ +function isIgnoredByGitignore( fullDirPath: string, basePath: string, ignoreInstance: ReturnType, ): boolean { - // Skip hidden directories if configured to ignore them - if (dirName.startsWith(".") && DIRS_TO_IGNORE.includes(".*")) { - return false - } - - // Check against explicit ignore patterns - if (isDirectoryExplicitlyIgnored(dirName)) { - return false - } - - // Check against gitignore patterns using the ignore library - // Calculate relative path from the base directory const relativePath = path.relative(basePath, fullDirPath) const normalizedPath = relativePath.replace(/\\/g, "/") + return ignoreInstance.ignores(normalizedPath) || ignoreInstance.ignores(normalizedPath + "/") +} - // Check if the directory is ignored by .gitignore - if (ignoreInstance.ignores(normalizedPath) || ignoreInstance.ignores(normalizedPath + "/")) { +/** + * Check if a target directory should be included + */ +function shouldIncludeTargetDirectory(dirName: string): boolean { + // Only apply non-hidden-directory ignore rules to target directories + const nonHiddenIgnorePatterns = DIRS_TO_IGNORE.filter((pattern) => pattern !== ".*") + return !matchesIgnorePattern(dirName, nonHiddenIgnorePatterns) +} + +/** + * Check if a directory inside an explicitly targeted hidden directory should be included + */ +function shouldIncludeInsideHiddenTarget(dirName: string, fullDirPath: string, context: ScanContext): boolean { + // Only apply the most critical ignore patterns when inside explicit hidden target + if (CRITICAL_IGNORE_PATTERNS.has(dirName)) { return false } - return true + // Check against gitignore patterns + return !isIgnoredByGitignore(fullDirPath, context.basePath, context.ignoreInstance) +} + +/** + * Check if a regular directory should be included + */ +function shouldIncludeRegularDirectory(dirName: string, fullDirPath: string, context: ScanContext): boolean { + // Check against explicit ignore patterns (excluding the ".*" pattern) + const nonHiddenIgnorePatterns = DIRS_TO_IGNORE.filter((pattern) => pattern !== ".*") + if (matchesIgnorePattern(dirName, nonHiddenIgnorePatterns)) { + return false + } + + // Check against gitignore patterns + return !isIgnoredByGitignore(fullDirPath, context.basePath, context.ignoreInstance) +} + +/** + * Determine if a directory should be included in results based on filters + */ +function shouldIncludeDirectory(dirName: string, fullDirPath: string, context: ScanContext): boolean { + // If this is the explicitly targeted directory, allow it even if it's hidden + // This preserves the ability to explicitly target hidden directories like .roo-memory + if (context.isTargetDir) { + return shouldIncludeTargetDirectory(dirName) + } + + // If we're inside an explicitly targeted hidden directory, allow subdirectories + // even if they would normally be filtered out by the ".*" pattern or other ignore rules + if (context.insideExplicitHiddenTarget) { + return shouldIncludeInsideHiddenTarget(dirName, fullDirPath, context) + } + + // Regular directory inclusion logic + return shouldIncludeRegularDirectory(dirName, fullDirPath, context) } /** @@ -390,6 +573,11 @@ function isDirectoryExplicitlyIgnored(dirName: string): boolean { return true } + // Skip the ".*" pattern - it's handled specially to allow top-level visibility + if (pattern === ".*") { + continue + } + // Path patterns that contain / if (pattern.includes("/")) { const pathParts = pattern.split("/") @@ -432,6 +620,9 @@ function formatAndCombineResults(files: string[], directories: string[], limit: */ async function execRipgrep(rgPath: string, args: string[], limit: number): Promise { return new Promise((resolve, reject) => { + // Extract the directory path from args (it's the last argument) + const searchDir = args[args.length - 1] + const rgProcess = childProcess.spawn(rgPath, args) let output = "" let results: string[] = [] @@ -497,6 +688,7 @@ async function execRipgrep(rgPath: string, args: string[], limit: number): Promi // Process each complete line for (const line of lines) { if (line.trim() && results.length < limit) { + // Keep the relative path as returned by ripgrep results.push(line) } else if (results.length >= limit) { break From 91c21a1bba2e3e1d881eab1e25701fcc0b9a2acc Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Sat, 26 Jul 2025 18:41:02 -0400 Subject: [PATCH 24/44] fix: add text wrapping to command patterns in Manage Command Permissions (#6255) Co-authored-by: Roo Code --- webview-ui/src/components/chat/CommandPatternSelector.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webview-ui/src/components/chat/CommandPatternSelector.tsx b/webview-ui/src/components/chat/CommandPatternSelector.tsx index c3b13b79d9..87ccb1bab7 100644 --- a/webview-ui/src/components/chat/CommandPatternSelector.tsx +++ b/webview-ui/src/components/chat/CommandPatternSelector.tsx @@ -141,9 +141,9 @@ export const CommandPatternSelector: React.FC = ({ ) : (
    setEditState(item.pattern, true)} - className="font-mono text-xs text-vscode-foreground cursor-pointer hover:bg-vscode-list-hoverBackground px-2 py-1.5 rounded transition-colors border border-transparent" + className="font-mono text-xs text-vscode-foreground cursor-pointer hover:bg-vscode-list-hoverBackground px-2 py-1.5 rounded transition-colors border border-transparent break-all" title="Click to edit pattern"> - {editState.value} + {editState.value} {item.description && ( - {item.description} From 623fa2a02524f86713a308413d669131a93ac1a6 Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Sat, 26 Jul 2025 20:15:34 -0500 Subject: [PATCH 25/44] test: update list-files test for fixed hidden files bug (#6261) test: update list-files test to reflect fixed hidden files bug --- apps/vscode-e2e/src/suite/tools/list-files.test.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/vscode-e2e/src/suite/tools/list-files.test.ts b/apps/vscode-e2e/src/suite/tools/list-files.test.ts index 5340a13a16..c374e79515 100644 --- a/apps/vscode-e2e/src/suite/tools/list-files.test.ts +++ b/apps/vscode-e2e/src/suite/tools/list-files.test.ts @@ -242,8 +242,8 @@ This directory contains various files and subdirectories for testing the list_fi // Verify the tool returned the expected files (non-recursive) assert.ok(listResults, "Tool execution results should be captured") - // Check that expected root-level files are present (excluding hidden files due to current bug) - const expectedFiles = ["root-file-1.txt", "root-file-2.js", "config.yaml", "README.md"] + // Check that expected root-level files are present (including hidden files now that bug is fixed) + const expectedFiles = ["root-file-1.txt", "root-file-2.js", "config.yaml", "README.md", ".hidden-file"] const expectedDirs = ["nested/"] const results = listResults as string @@ -255,13 +255,9 @@ This directory contains various files and subdirectories for testing the list_fi assert.ok(results.includes(dir), `Tool results should include directory ${dir}`) } - // BUG: Hidden files are currently excluded in non-recursive mode - // This should be fixed - hidden files should be included when using --hidden flag - console.log("BUG DETECTED: Hidden files are excluded in non-recursive mode") - assert.ok( - !results.includes(".hidden-file"), - "KNOWN BUG: Hidden files are currently excluded in non-recursive mode", - ) + // Verify hidden files are now included (bug has been fixed) + console.log("Verifying hidden files are included in non-recursive mode") + assert.ok(results.includes(".hidden-file"), "Hidden files should be included in non-recursive mode") // Verify nested files are NOT included (non-recursive) const nestedFiles = ["nested-file-1.md", "nested-file-2.json", "deep-nested-file.ts"] From 43f649b03f27a7a8f63a8c73632788e192e795be Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Sat, 26 Jul 2025 21:55:12 -0500 Subject: [PATCH 26/44] fix: prevent scrollbar flickering in chat view during content streaming (#6266) --- webview-ui/src/components/chat/Markdown.tsx | 2 +- .../src/components/common/MarkdownBlock.tsx | 207 ++++++++++-------- 2 files changed, 119 insertions(+), 90 deletions(-) diff --git a/webview-ui/src/components/chat/Markdown.tsx b/webview-ui/src/components/chat/Markdown.tsx index ba838284d7..87780d5df8 100644 --- a/webview-ui/src/components/chat/Markdown.tsx +++ b/webview-ui/src/components/chat/Markdown.tsx @@ -21,7 +21,7 @@ export const Markdown = memo(({ markdown, partial }: { markdown?: string; partia onMouseEnter={() => setIsHovering(true)} onMouseLeave={() => setIsHovering(false)} style={{ position: "relative" }}> -
    +
    {markdown && !partial && isHovering && ( diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index ca6c9316b1..cae609d955 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -1,4 +1,4 @@ -import React, { memo } from "react" +import React, { memo, useMemo } from "react" import ReactMarkdown from "react-markdown" import styled from "styled-components" import { visit } from "unist-util-visit" @@ -7,7 +7,6 @@ import remarkMath from "remark-math" import remarkGfm from "remark-gfm" import { vscode } from "@src/utils/vscode" -import { useExtensionState } from "@src/context/ExtensionStateContext" import CodeBlock from "./CodeBlock" import MermaidBlock from "./MermaidBlock" @@ -117,6 +116,19 @@ const StyledMarkdown = styled.div` p { white-space: pre-wrap; + margin: 0.5em 0; + } + + /* Prevent layout shifts during streaming */ + pre { + min-height: 3em; + transition: height 0.2s ease-out; + } + + /* Code block container styling */ + div:has(> pre) { + position: relative; + contain: layout style; } a { @@ -133,11 +145,18 @@ const StyledMarkdown = styled.div` /* Table styles for remark-gfm */ table { - width: 100%; border-collapse: collapse; margin: 1em 0; + width: auto; + min-width: 50%; + max-width: 100%; + table-layout: fixed; + } + + /* Table wrapper for horizontal scrolling */ + .table-wrapper { overflow-x: auto; - display: block; + margin: 1em 0; } th, @@ -145,6 +164,8 @@ const StyledMarkdown = styled.div` border: 1px solid var(--vscode-panel-border); padding: 8px 12px; text-align: left; + word-wrap: break-word; + overflow-wrap: break-word; } th { @@ -163,96 +184,104 @@ const StyledMarkdown = styled.div` ` const MarkdownBlock = memo(({ markdown }: MarkdownBlockProps) => { - const { theme: _theme } = useExtensionState() - - const components = { - a: ({ href, children, ...props }: any) => { - const handleClick = (e: React.MouseEvent) => { - // Only process file:// protocol or local file paths - const isLocalPath = href?.startsWith("file://") || href?.startsWith("/") || !href?.includes("://") - - if (!isLocalPath) { - return - } - - e.preventDefault() - - // Handle absolute vs project-relative paths - let filePath = href.replace("file://", "") - - // Extract line number if present - const match = filePath.match(/(.*):(\d+)(-\d+)?$/) - let values = undefined - if (match) { - filePath = match[1] - values = { line: parseInt(match[2]) } - } - - // Add ./ prefix if needed - if (!filePath.startsWith("/") && !filePath.startsWith("./")) { - filePath = "./" + filePath - } - - vscode.postMessage({ - type: "openFile", - text: filePath, - values, - }) - } - - return ( - - {children} - - ) - }, - pre: ({ children, ..._props }: any) => { - // The structure from react-markdown v9 is: pre > code > text - const codeEl = children as React.ReactElement - - if (!codeEl || !codeEl.props) { - return
    {children}
    - } - - const { className = "", children: codeChildren } = codeEl.props - - // Get the actual code text - let codeString = "" - if (typeof codeChildren === "string") { - codeString = codeChildren - } else if (Array.isArray(codeChildren)) { - codeString = codeChildren.filter((child) => typeof child === "string").join("") - } - - // Handle mermaid diagrams - if (className.includes("language-mermaid")) { + const components = useMemo( + () => ({ + table: ({ children, ...props }: any) => { return ( -
    - +
    + {children}
    ) - } + }, + a: ({ href, children, ...props }: any) => { + const handleClick = (e: React.MouseEvent) => { + // Only process file:// protocol or local file paths + const isLocalPath = href?.startsWith("file://") || href?.startsWith("/") || !href?.includes("://") - // Extract language from className - const match = /language-(\w+)/.exec(className) - const language = match ? match[1] : "text" + if (!isLocalPath) { + return + } - // Wrap CodeBlock in a div to ensure proper separation - return ( -
    - -
    - ) - }, - code: ({ children, className, ...props }: any) => { - // This handles inline code - return ( - - {children} - - ) - }, - } + e.preventDefault() + + // Handle absolute vs project-relative paths + let filePath = href.replace("file://", "") + + // Extract line number if present + const match = filePath.match(/(.*):(\d+)(-\d+)?$/) + let values = undefined + if (match) { + filePath = match[1] + values = { line: parseInt(match[2]) } + } + + // Add ./ prefix if needed + if (!filePath.startsWith("/") && !filePath.startsWith("./")) { + filePath = "./" + filePath + } + + vscode.postMessage({ + type: "openFile", + text: filePath, + values, + }) + } + + return ( + + {children} + + ) + }, + pre: ({ children, ..._props }: any) => { + // The structure from react-markdown v9 is: pre > code > text + const codeEl = children as React.ReactElement + + if (!codeEl || !codeEl.props) { + return
    {children}
    + } + + const { className = "", children: codeChildren } = codeEl.props + + // Get the actual code text + let codeString = "" + if (typeof codeChildren === "string") { + codeString = codeChildren + } else if (Array.isArray(codeChildren)) { + codeString = codeChildren.filter((child) => typeof child === "string").join("") + } + + // Handle mermaid diagrams + if (className.includes("language-mermaid")) { + return ( +
    + +
    + ) + } + + // Extract language from className + const match = /language-(\w+)/.exec(className) + const language = match ? match[1] : "text" + + // Wrap CodeBlock in a div to ensure proper separation + return ( +
    + +
    + ) + }, + code: ({ children, className, ...props }: any) => { + // This handles inline code + return ( + + {children} + + ) + }, + }), + [], + ) return ( From 5d4e3819e4dc737d316b7c7ead7a268e8d32e7d7 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Sat, 26 Jul 2025 23:16:46 -0400 Subject: [PATCH 27/44] Support for custom slash commands (#6263) --- src/__tests__/command-integration.spec.ts | 56 ++++ src/__tests__/command-mentions.spec.ts | 307 ++++++++++++++++++ src/__tests__/commands.spec.ts | 97 ++++++ src/core/mentions/index.ts | 28 +- src/core/webview/webviewMessageHandler.ts | 25 ++ src/services/command/commands.ts | 150 +++++++++ src/shared/ExtensionMessage.ts | 8 + src/shared/WebviewMessage.ts | 1 + src/shared/context-mentions.ts | 3 + .../__tests__/command-autocomplete.spec.ts | 271 ++++++++++++++++ .../src/components/chat/ChatTextArea.tsx | 35 +- .../src/components/chat/ContextMenu.tsx | 39 ++- .../src/context/ExtensionStateContext.tsx | 9 +- webview-ui/src/i18n/locales/ca/chat.json | 3 + webview-ui/src/i18n/locales/de/chat.json | 3 + webview-ui/src/i18n/locales/en/chat.json | 3 + webview-ui/src/i18n/locales/es/chat.json | 3 + webview-ui/src/i18n/locales/fr/chat.json | 3 + webview-ui/src/i18n/locales/hi/chat.json | 3 + webview-ui/src/i18n/locales/id/chat.json | 3 + webview-ui/src/i18n/locales/it/chat.json | 3 + webview-ui/src/i18n/locales/ja/chat.json | 3 + webview-ui/src/i18n/locales/ko/chat.json | 3 + webview-ui/src/i18n/locales/nl/chat.json | 3 + webview-ui/src/i18n/locales/pl/chat.json | 3 + webview-ui/src/i18n/locales/pt-BR/chat.json | 3 + webview-ui/src/i18n/locales/ru/chat.json | 3 + webview-ui/src/i18n/locales/tr/chat.json | 3 + webview-ui/src/i18n/locales/vi/chat.json | 3 + webview-ui/src/i18n/locales/zh-CN/chat.json | 3 + webview-ui/src/i18n/locales/zh-TW/chat.json | 3 + .../utils/__tests__/context-mentions.spec.ts | 41 ++- webview-ui/src/utils/context-mentions.ts | 96 ++++-- 33 files changed, 1171 insertions(+), 49 deletions(-) create mode 100644 src/__tests__/command-integration.spec.ts create mode 100644 src/__tests__/command-mentions.spec.ts create mode 100644 src/__tests__/commands.spec.ts create mode 100644 src/services/command/commands.ts create mode 100644 webview-ui/src/__tests__/command-autocomplete.spec.ts diff --git a/src/__tests__/command-integration.spec.ts b/src/__tests__/command-integration.spec.ts new file mode 100644 index 0000000000..e884325b68 --- /dev/null +++ b/src/__tests__/command-integration.spec.ts @@ -0,0 +1,56 @@ +import { describe, it, expect } from "vitest" +import { getCommands, getCommand, getCommandNames } from "../services/command/commands" +import * as path from "path" + +describe("Command Integration Tests", () => { + const testWorkspaceDir = path.join(__dirname, "../../") + + it("should discover command files in .roo/commands/", async () => { + const commands = await getCommands(testWorkspaceDir) + + // Should be able to discover commands (may be empty in test environment) + expect(Array.isArray(commands)).toBe(true) + + // If commands exist, verify they have valid properties + commands.forEach((command) => { + expect(command.name).toBeDefined() + expect(typeof command.name).toBe("string") + expect(command.source).toMatch(/^(project|global)$/) + expect(command.content).toBeDefined() + expect(typeof command.content).toBe("string") + }) + }) + + it("should return command names correctly", async () => { + const commandNames = await getCommandNames(testWorkspaceDir) + + // Should return an array (may be empty in test environment) + expect(Array.isArray(commandNames)).toBe(true) + + // If command names exist, they should be strings + commandNames.forEach((name) => { + expect(typeof name).toBe("string") + expect(name.length).toBeGreaterThan(0) + }) + }) + + it("should load command content if commands exist", async () => { + const commands = await getCommands(testWorkspaceDir) + + if (commands.length > 0) { + const firstCommand = commands[0] + const loadedCommand = await getCommand(testWorkspaceDir, firstCommand.name) + + expect(loadedCommand).toBeDefined() + expect(loadedCommand?.name).toBe(firstCommand.name) + expect(loadedCommand?.source).toMatch(/^(project|global)$/) + expect(loadedCommand?.content).toBeDefined() + expect(typeof loadedCommand?.content).toBe("string") + } + }) + + it("should handle non-existent commands gracefully", async () => { + const nonExistentCommand = await getCommand(testWorkspaceDir, "non-existent-command") + expect(nonExistentCommand).toBeUndefined() + }) +}) diff --git a/src/__tests__/command-mentions.spec.ts b/src/__tests__/command-mentions.spec.ts new file mode 100644 index 0000000000..d4de0bbba7 --- /dev/null +++ b/src/__tests__/command-mentions.spec.ts @@ -0,0 +1,307 @@ +import { describe, it, expect, beforeEach, vi } from "vitest" +import { parseMentions } from "../core/mentions" +import { UrlContentFetcher } from "../services/browser/UrlContentFetcher" +import { getCommand } from "../services/command/commands" + +// Mock the dependencies +vi.mock("../services/command/commands") +vi.mock("../services/browser/UrlContentFetcher") + +const MockedUrlContentFetcher = vi.mocked(UrlContentFetcher) +const mockGetCommand = vi.mocked(getCommand) + +describe("Command Mentions", () => { + let mockUrlContentFetcher: any + + beforeEach(() => { + vi.clearAllMocks() + + // Create a mock UrlContentFetcher instance + mockUrlContentFetcher = { + launchBrowser: vi.fn(), + urlToMarkdown: vi.fn(), + closeBrowser: vi.fn(), + } + + MockedUrlContentFetcher.mockImplementation(() => mockUrlContentFetcher) + }) + + // Helper function to call parseMentions with required parameters + const callParseMentions = async (text: string) => { + return await parseMentions( + text, + "/test/cwd", // cwd + mockUrlContentFetcher, // urlContentFetcher + undefined, // fileContextTracker + undefined, // rooIgnoreController + true, // showRooIgnoredFiles + true, // includeDiagnosticMessages + 50, // maxDiagnosticMessages + undefined, // maxReadFileLine + ) + } + + describe("parseMentions with command support", () => { + it("should parse command mentions and include content", async () => { + const commandContent = "# Setup Environment\n\nRun the following commands:\n```bash\nnpm install\n```" + mockGetCommand.mockResolvedValue({ + name: "setup", + content: commandContent, + source: "project", + filePath: "/project/.roo/commands/setup.md", + }) + + const input = "/setup Please help me set up the project" + const result = await callParseMentions(input) + + expect(mockGetCommand).toHaveBeenCalledWith("/test/cwd", "setup") + expect(result).toContain('') + expect(result).toContain(commandContent) + expect(result).toContain("") + expect(result).toContain("Please help me set up the project") + }) + + it("should handle multiple commands in message", async () => { + mockGetCommand + .mockResolvedValueOnce({ + name: "setup", + content: "# Setup instructions", + source: "project", + filePath: "/project/.roo/commands/setup.md", + }) + .mockResolvedValueOnce({ + name: "deploy", + content: "# Deploy instructions", + source: "project", + filePath: "/project/.roo/commands/deploy.md", + }) + + // Both commands should be recognized + const input = "/setup the project\nThen /deploy later" + const result = await callParseMentions(input) + + expect(mockGetCommand).toHaveBeenCalledWith("/test/cwd", "setup") + expect(mockGetCommand).toHaveBeenCalledWith("/test/cwd", "deploy") + expect(mockGetCommand).toHaveBeenCalledTimes(2) // Both commands called + expect(result).toContain('') + expect(result).toContain("# Setup instructions") + expect(result).toContain('') + expect(result).toContain("# Deploy instructions") + }) + + it("should handle non-existent command gracefully", async () => { + mockGetCommand.mockResolvedValue(undefined) + + const input = "/nonexistent command" + const result = await callParseMentions(input) + + expect(mockGetCommand).toHaveBeenCalledWith("/test/cwd", "nonexistent") + expect(result).toContain('') + expect(result).toContain("Command 'nonexistent' not found") + expect(result).toContain("") + }) + + it("should handle command loading errors", async () => { + mockGetCommand.mockRejectedValue(new Error("Failed to load command")) + + const input = "/error-command test" + const result = await callParseMentions(input) + + expect(result).toContain('') + expect(result).toContain("Error loading command") + expect(result).toContain("") + }) + + it("should handle command names with hyphens and underscores at start", async () => { + mockGetCommand.mockResolvedValue({ + name: "setup-dev", + content: "# Dev setup", + source: "project", + filePath: "/project/.roo/commands/setup-dev.md", + }) + + const input = "/setup-dev for the project" + const result = await callParseMentions(input) + + expect(mockGetCommand).toHaveBeenCalledWith("/test/cwd", "setup-dev") + expect(result).toContain('') + expect(result).toContain("# Dev setup") + }) + + it("should preserve command content formatting", async () => { + const commandContent = `# Complex Command + +## Step 1 +Run this command: +\`\`\`bash +npm install +\`\`\` + +## Step 2 +- Check file1.js +- Update file2.ts +- Test everything + +> **Note**: This is important!` + + mockGetCommand.mockResolvedValue({ + name: "complex", + content: commandContent, + source: "project", + filePath: "/project/.roo/commands/complex.md", + }) + + const input = "/complex command" + const result = await callParseMentions(input) + + expect(result).toContain('') + expect(result).toContain("# Complex Command") + expect(result).toContain("```bash") + expect(result).toContain("npm install") + expect(result).toContain("- Check file1.js") + expect(result).toContain("> **Note**: This is important!") + expect(result).toContain("") + }) + + it("should handle empty command content", async () => { + mockGetCommand.mockResolvedValue({ + name: "empty", + content: "", + source: "project", + filePath: "/project/.roo/commands/empty.md", + }) + + const input = "/empty command" + const result = await callParseMentions(input) + + expect(result).toContain('') + expect(result).toContain("") + // Should still include the command tags even with empty content + }) + }) + + describe("command mention regex patterns", () => { + it("should match valid command mention patterns anywhere", () => { + const commandRegex = /\/([a-zA-Z0-9_\.-]+)(?=\s|$)/g + + const validPatterns = ["/setup", "/build-prod", "/test_suite", "/my-command", "/command123"] + + validPatterns.forEach((pattern) => { + const match = pattern.match(commandRegex) + expect(match).toBeTruthy() + expect(match![0]).toBe(pattern) + }) + }) + + it("should match command patterns in middle of text", () => { + const commandRegex = /\/([a-zA-Z0-9_\.-]+)(?=\s|$)/g + + const validPatterns = ["Please /setup", "Run /build now", "Use /deploy here"] + + validPatterns.forEach((pattern) => { + const match = pattern.match(commandRegex) + expect(match).toBeTruthy() + expect(match![0]).toMatch(/^\/[a-zA-Z0-9_\.-]+$/) + }) + }) + + it("should match commands at start of new lines", () => { + const commandRegex = /\/([a-zA-Z0-9_\.-]+)(?=\s|$)/g + + const multilineText = "First line\n/setup the project\nAnother line\n/deploy when ready" + const matches = multilineText.match(commandRegex) + + // Should match both commands now + expect(matches).toBeTruthy() + expect(matches).toHaveLength(2) + expect(matches![0]).toBe("/setup") + expect(matches![1]).toBe("/deploy") + }) + + it("should match multiple commands in message", () => { + const commandRegex = /(?:^|\s)\/([a-zA-Z0-9_\.-]+)(?=\s|$)/g + + const validText = "/setup the project\nThen /deploy later" + const matches = validText.match(commandRegex) + + expect(matches).toBeTruthy() + expect(matches).toHaveLength(2) + expect(matches![0]).toBe("/setup") + expect(matches![1]).toBe(" /deploy") // Note: includes leading space + }) + + it("should not match invalid command patterns", () => { + const commandRegex = /\/([a-zA-Z0-9_\.-]+)(?=\s|$)/g + + const invalidPatterns = ["/ space", "/with space", "/with/slash", "//double", "/with@symbol"] + + invalidPatterns.forEach((pattern) => { + const match = pattern.match(commandRegex) + if (match) { + // If it matches, it should not be the full invalid pattern + expect(match[0]).not.toBe(pattern) + } + }) + }) + }) + + describe("command mention text transformation", () => { + it("should transform command mentions at start of message", async () => { + const input = "/setup the project" + const result = await callParseMentions(input) + + expect(result).toContain("Command 'setup' (see below for command content)") + }) + + it("should process multiple commands in message", async () => { + mockGetCommand + .mockResolvedValueOnce({ + name: "setup", + content: "# Setup instructions", + source: "project", + filePath: "/project/.roo/commands/setup.md", + }) + .mockResolvedValueOnce({ + name: "deploy", + content: "# Deploy instructions", + source: "project", + filePath: "/project/.roo/commands/deploy.md", + }) + + const input = "/setup the project\nThen /deploy later" + const result = await callParseMentions(input) + + expect(result).toContain("Command 'setup' (see below for command content)") + expect(result).toContain("Command 'deploy' (see below for command content)") + }) + + it("should match commands anywhere with proper word boundaries", async () => { + mockGetCommand.mockResolvedValue({ + name: "build", + content: "# Build instructions", + source: "project", + filePath: "/project/.roo/commands/build.md", + }) + + // At the beginning - should match + let input = "/build the project" + let result = await callParseMentions(input) + expect(result).toContain("Command 'build'") + + // After space - should match + input = "Please /build and test" + result = await callParseMentions(input) + expect(result).toContain("Command 'build'") + + // At the end - should match + input = "Run the /build" + result = await callParseMentions(input) + expect(result).toContain("Command 'build'") + + // At start of new line - should match + input = "Some text\n/build the project" + result = await callParseMentions(input) + expect(result).toContain("Command 'build'") + }) + }) +}) diff --git a/src/__tests__/commands.spec.ts b/src/__tests__/commands.spec.ts new file mode 100644 index 0000000000..9401050062 --- /dev/null +++ b/src/__tests__/commands.spec.ts @@ -0,0 +1,97 @@ +import { describe, it, expect } from "vitest" +import { + getCommands, + getCommand, + getCommandNames, + getCommandNameFromFile, + isMarkdownFile, +} from "../services/command/commands" + +describe("Command Utilities", () => { + const testCwd = "/test/project" + + describe("getCommandNameFromFile", () => { + it("should strip .md extension only", () => { + expect(getCommandNameFromFile("my-command.md")).toBe("my-command") + expect(getCommandNameFromFile("test.txt")).toBe("test.txt") + expect(getCommandNameFromFile("no-extension")).toBe("no-extension") + expect(getCommandNameFromFile("multiple.dots.file.md")).toBe("multiple.dots.file") + expect(getCommandNameFromFile("api.config.md")).toBe("api.config") + expect(getCommandNameFromFile("deploy_prod.md")).toBe("deploy_prod") + }) + }) + + describe("isMarkdownFile", () => { + it("should identify markdown files correctly", () => { + // Markdown files + expect(isMarkdownFile("command.md")).toBe(true) + expect(isMarkdownFile("my-command.md")).toBe(true) + expect(isMarkdownFile("README.MD")).toBe(true) + expect(isMarkdownFile("test.Md")).toBe(true) + + // Non-markdown files + expect(isMarkdownFile("command.txt")).toBe(false) + expect(isMarkdownFile("script.sh")).toBe(false) + expect(isMarkdownFile("config.json")).toBe(false) + expect(isMarkdownFile("no-extension")).toBe(false) + expect(isMarkdownFile("file.md.bak")).toBe(false) + }) + }) + + describe("getCommands", () => { + it("should return empty array when no command directories exist", async () => { + // This will fail to find directories but should return empty array gracefully + const commands = await getCommands(testCwd) + expect(Array.isArray(commands)).toBe(true) + }) + }) + + describe("getCommandNames", () => { + it("should return empty array when no commands exist", async () => { + const names = await getCommandNames(testCwd) + expect(Array.isArray(names)).toBe(true) + }) + }) + + describe("getCommand", () => { + it("should return undefined for non-existent command", async () => { + const result = await getCommand(testCwd, "non-existent") + expect(result).toBeUndefined() + }) + }) + + describe("command name extraction edge cases", () => { + it("should handle various filename formats", () => { + // Files without extensions + expect(getCommandNameFromFile("command")).toBe("command") + expect(getCommandNameFromFile("my-command")).toBe("my-command") + + // Files with multiple dots - only strip .md extension + expect(getCommandNameFromFile("my.complex.command.md")).toBe("my.complex.command") + expect(getCommandNameFromFile("v1.2.3.txt")).toBe("v1.2.3.txt") + + // Edge cases + expect(getCommandNameFromFile(".")).toBe(".") + expect(getCommandNameFromFile("..")).toBe("..") + expect(getCommandNameFromFile(".hidden.md")).toBe(".hidden") + }) + }) + + describe("command loading behavior", () => { + it("should handle multiple calls to getCommands", async () => { + const commands1 = await getCommands(testCwd) + const commands2 = await getCommands(testCwd) + expect(Array.isArray(commands1)).toBe(true) + expect(Array.isArray(commands2)).toBe(true) + }) + }) + + describe("error handling", () => { + it("should handle invalid command names gracefully", async () => { + // These should not throw errors + expect(await getCommand(testCwd, "")).toBeUndefined() + expect(await getCommand(testCwd, " ")).toBeUndefined() + expect(await getCommand(testCwd, "non/existent/path")).toBeUndefined() + }) + }) +}) diff --git a/src/core/mentions/index.ts b/src/core/mentions/index.ts index d0d305d096..494fbae4fc 100644 --- a/src/core/mentions/index.ts +++ b/src/core/mentions/index.ts @@ -4,7 +4,7 @@ import * as path from "path" import * as vscode from "vscode" import { isBinaryFile } from "isbinaryfile" -import { mentionRegexGlobal, unescapeSpaces } from "../../shared/context-mentions" +import { mentionRegexGlobal, commandRegexGlobal, unescapeSpaces } from "../../shared/context-mentions" import { getCommitInfo, getWorkingState } from "../../utils/git" import { getWorkspacePath } from "../../utils/path" @@ -18,6 +18,7 @@ import { UrlContentFetcher } from "../../services/browser/UrlContentFetcher" import { FileContextTracker } from "../context-tracking/FileContextTracker" import { RooIgnoreController } from "../ignore/RooIgnoreController" +import { getCommand } from "../../services/command/commands" import { t } from "../../i18n" @@ -85,7 +86,16 @@ export async function parseMentions( maxReadFileLine?: number, ): Promise { const mentions: Set = new Set() - let parsedText = text.replace(mentionRegexGlobal, (match, mention) => { + const commandMentions: Set = new Set() + + // First pass: extract command mentions (starting with /) + let parsedText = text.replace(commandRegexGlobal, (match, commandName) => { + commandMentions.add(commandName) + return `Command '${commandName}' (see below for command content)` + }) + + // Second pass: handle regular mentions + parsedText = parsedText.replace(mentionRegexGlobal, (match, mention) => { mentions.add(mention) if (mention.startsWith("http")) { return `'${mention}' (see below for site content)` @@ -203,6 +213,20 @@ export async function parseMentions( } } + // Process command mentions + for (const commandName of commandMentions) { + try { + const command = await getCommand(cwd, commandName) + if (command) { + parsedText += `\n\n\n${command.content}\n` + } else { + parsedText += `\n\n\nCommand '${commandName}' not found. Available commands can be found in .roo/commands/ or ~/.roo/commands/\n` + } + } catch (error) { + parsedText += `\n\n\nError loading command '${commandName}': ${error.message}\n` + } + } + if (urlMention) { try { await urlContentFetcher.closeBrowser() diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 82c780adf4..da73c56920 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2356,5 +2356,30 @@ export const webviewMessageHandler = async ( } break } + case "requestCommands": { + try { + const { getCommands } = await import("../../services/command/commands") + const commands = await getCommands(provider.cwd || "") + + // Convert to the format expected by the frontend + const commandList = commands.map((command) => ({ + name: command.name, + source: command.source, + })) + + await provider.postMessageToWebview({ + type: "commands", + commands: commandList, + }) + } catch (error) { + provider.log(`Error fetching commands: ${JSON.stringify(error, Object.getOwnPropertyNames(error), 2)}`) + // Send empty array on error + await provider.postMessageToWebview({ + type: "commands", + commands: [], + }) + } + break + } } } diff --git a/src/services/command/commands.ts b/src/services/command/commands.ts new file mode 100644 index 0000000000..a78b2187f8 --- /dev/null +++ b/src/services/command/commands.ts @@ -0,0 +1,150 @@ +import fs from "fs/promises" +import * as path from "path" +import { getGlobalRooDirectory, getProjectRooDirectoryForCwd } from "../roo-config" + +export interface Command { + name: string + content: string + source: "global" | "project" + filePath: string +} + +/** + * Get all available commands from both global and project directories + */ +export async function getCommands(cwd: string): Promise { + const commands = new Map() + + // Scan global commands first + const globalDir = path.join(getGlobalRooDirectory(), "commands") + await scanCommandDirectory(globalDir, "global", commands) + + // Scan project commands (these override global ones) + const projectDir = path.join(getProjectRooDirectoryForCwd(cwd), "commands") + await scanCommandDirectory(projectDir, "project", commands) + + return Array.from(commands.values()) +} + +/** + * Get a specific command by name (optimized to avoid scanning all commands) + */ +export async function getCommand(cwd: string, name: string): Promise { + // Try to find the command directly without scanning all commands + const projectDir = path.join(getProjectRooDirectoryForCwd(cwd), "commands") + const globalDir = path.join(getGlobalRooDirectory(), "commands") + + // Check project directory first (project commands override global ones) + const projectCommand = await tryLoadCommand(projectDir, name, "project") + if (projectCommand) { + return projectCommand + } + + // Check global directory if not found in project + const globalCommand = await tryLoadCommand(globalDir, name, "global") + return globalCommand +} + +/** + * Try to load a specific command from a directory + */ +async function tryLoadCommand( + dirPath: string, + name: string, + source: "global" | "project", +): Promise { + try { + const stats = await fs.stat(dirPath) + if (!stats.isDirectory()) { + return undefined + } + + // Try to find the command file directly + const commandFileName = `${name}.md` + const filePath = path.join(dirPath, commandFileName) + + try { + const content = await fs.readFile(filePath, "utf-8") + return { + name, + content: content.trim(), + source, + filePath, + } + } catch (error) { + // File doesn't exist or can't be read + return undefined + } + } catch (error) { + // Directory doesn't exist or can't be read + return undefined + } +} + +/** + * Get command names for autocomplete + */ +export async function getCommandNames(cwd: string): Promise { + const commands = await getCommands(cwd) + return commands.map((cmd) => cmd.name) +} + +/** + * Scan a specific command directory + */ +async function scanCommandDirectory( + dirPath: string, + source: "global" | "project", + commands: Map, +): Promise { + try { + const stats = await fs.stat(dirPath) + if (!stats.isDirectory()) { + return + } + + const entries = await fs.readdir(dirPath, { withFileTypes: true }) + + for (const entry of entries) { + if (entry.isFile() && isMarkdownFile(entry.name)) { + const filePath = path.join(dirPath, entry.name) + const commandName = getCommandNameFromFile(entry.name) + + try { + const content = await fs.readFile(filePath, "utf-8") + + // Project commands override global ones + if (source === "project" || !commands.has(commandName)) { + commands.set(commandName, { + name: commandName, + content: content.trim(), + source, + filePath, + }) + } + } catch (error) { + console.warn(`Failed to read command file ${filePath}:`, error) + } + } + } + } catch (error) { + // Directory doesn't exist or can't be read - this is fine + } +} + +/** + * Extract command name from filename (strip .md extension only) + */ +export function getCommandNameFromFile(filename: string): string { + if (filename.toLowerCase().endsWith(".md")) { + return filename.slice(0, -3) + } + return filename +} + +/** + * Check if a file is a markdown file + */ +export function isMarkdownFile(filename: string): boolean { + return filename.toLowerCase().endsWith(".md") +} diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index bdd32c4e36..816069f91f 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -19,6 +19,12 @@ import { Mode } from "./modes" import { RouterModels } from "./api" import type { MarketplaceItem } from "@roo-code/types" +// Command interface for frontend/backend communication +export interface Command { + name: string + source: "global" | "project" +} + // Type for marketplace installed metadata export interface MarketplaceInstalledMetadata { project: Record @@ -109,6 +115,7 @@ export interface ExtensionMessage { | "codeIndexSecretStatus" | "showDeleteMessageDialog" | "showEditMessageDialog" + | "commands" text?: string payload?: any // Add a generic payload for now, can refine later action?: @@ -180,6 +187,7 @@ export interface ExtensionMessage { settings?: any messageTs?: number context?: string + commands?: Command[] } export type ExtensionState = Pick< diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 795e276522..1304e4c7d5 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -201,6 +201,7 @@ export interface WebviewMessage { | "checkRulesDirectoryResult" | "saveCodeIndexSettingsAtomic" | "requestCodeIndexSecretStatus" + | "requestCommands" text?: string editedMessageContent?: string tab?: "settings" | "history" | "mcp" | "modes" | "chat" | "marketplace" | "account" diff --git a/src/shared/context-mentions.ts b/src/shared/context-mentions.ts index 2edb99de6a..d7e59a77dd 100644 --- a/src/shared/context-mentions.ts +++ b/src/shared/context-mentions.ts @@ -57,6 +57,9 @@ export const mentionRegex = /(? { + const mockCommands: Command[] = [ + { name: "setup", source: "project" }, + { name: "build", source: "project" }, + { name: "deploy", source: "global" }, + { name: "test-suite", source: "project" }, + { name: "cleanup_old", source: "global" }, + ] + + const mockQueryItems = [ + { type: ContextMenuOptionType.File, value: "/src/app.ts" }, + { type: ContextMenuOptionType.Problems, value: "problems" }, + ] + + // Mock translation function + const mockT = (key: string, options?: { name?: string }) => { + if (key === "chat:command.triggerDescription") { + return `Trigger the ${options?.name || "command"} command` + } + return key + } + + describe("slash command command suggestions", () => { + it('should return all commands when query is just "/"', () => { + const options = getContextMenuOptions("/", "/", mockT, null, mockQueryItems, [], [], mockCommands) + + expect(options).toHaveLength(5) + expect(options.every((option) => option.type === ContextMenuOptionType.Command)).toBe(true) + + const commandNames = options.map((option) => option.value) + expect(commandNames).toContain("setup") + expect(commandNames).toContain("build") + expect(commandNames).toContain("deploy") + expect(commandNames).toContain("test-suite") + expect(commandNames).toContain("cleanup_old") + }) + + it("should filter commands based on fuzzy search", () => { + const options = getContextMenuOptions("/set", "/set", mockT, null, mockQueryItems, [], [], mockCommands) + + // Should match 'setup' (fuzzy search behavior may vary) + expect(options.length).toBeGreaterThan(0) + const commandNames = options.map((option) => option.value) + expect(commandNames).toContain("setup") + // Note: fuzzy search may not match 'test-suite' for 'set' query + }) + + it("should return commands with correct format", () => { + const options = getContextMenuOptions("/setup", "/setup", mockT, null, mockQueryItems, [], [], mockCommands) + + const setupOption = options.find((option) => option.value === "setup") + expect(setupOption).toBeDefined() + expect(setupOption!.type).toBe(ContextMenuOptionType.Command) + expect(setupOption!.label).toBe("setup") + expect(setupOption!.description).toBe("Trigger the setup command") + expect(setupOption!.icon).toBe("$(play)") + }) + + it("should handle empty command list", () => { + const options = getContextMenuOptions("/setup", "/setup", mockT, null, mockQueryItems, [], [], []) + + // Should return NoResults when no commands match + expect(options).toHaveLength(1) + expect(options[0].type).toBe(ContextMenuOptionType.NoResults) + }) + + it("should handle no matching commands", () => { + const options = getContextMenuOptions( + "/nonexistent", + "/nonexistent", + mockT, + null, + mockQueryItems, + [], + [], + mockCommands, + ) + + // Should return NoResults when no commands match + expect(options).toHaveLength(1) + expect(options[0].type).toBe(ContextMenuOptionType.NoResults) + }) + + it("should not return command suggestions for non-slash queries", () => { + const options = getContextMenuOptions("setup", "setup", mockT, null, mockQueryItems, [], [], mockCommands) + + // Should not contain command options for non-slash queries + const commandOptions = options.filter((option) => option.type === ContextMenuOptionType.Command) + expect(commandOptions).toHaveLength(0) + }) + + it("should handle commands with special characters in names", () => { + const specialCommands: Command[] = [ + { name: "setup-dev", source: "project" }, + { name: "test_suite", source: "project" }, + { name: "deploy.prod", source: "global" }, + ] + + const options = getContextMenuOptions( + "/setup", + "/setup", + mockT, + null, + mockQueryItems, + [], + [], + specialCommands, + ) + + const setupDevOption = options.find((option) => option.value === "setup-dev") + expect(setupDevOption).toBeDefined() + expect(setupDevOption!.label).toBe("setup-dev") + }) + + it("should handle case-insensitive fuzzy matching", () => { + const options = getContextMenuOptions("/setup", "/setup", mockT, null, mockQueryItems, [], [], mockCommands) + + const commandNames = options.map((option) => option.value) + expect(commandNames).toContain("setup") + }) + + it("should prioritize exact matches in fuzzy search", () => { + const commandsWithSimilarNames: Command[] = [ + { name: "test", source: "project" }, + { name: "test-suite", source: "project" }, + { name: "integration-test", source: "project" }, + ] + + const options = getContextMenuOptions( + "/test", + "/test", + mockT, + null, + mockQueryItems, + [], + [], + commandsWithSimilarNames, + ) + + // 'test' should be first due to exact match + expect(options[0].value).toBe("test") + }) + + it("should handle partial matches correctly", () => { + const options = getContextMenuOptions("/te", "/te", mockT, null, mockQueryItems, [], [], mockCommands) + + // Should match 'test-suite' + const commandNames = options.map((option) => option.value) + expect(commandNames).toContain("test-suite") + }) + }) + + describe("command integration with modes", () => { + const mockModes = [ + { + name: "Code", + slug: "code", + description: "Write and edit code", + roleDefinition: "You are a code assistant", + groups: ["read", "edit"], + }, + { + name: "Debug", + slug: "debug", + description: "Debug applications", + roleDefinition: "You are a debug assistant", + groups: ["read", "edit"], + }, + ] as any[] + + it("should return both modes and commands for slash commands", () => { + const options = getContextMenuOptions("/", "/", mockT, null, mockQueryItems, [], mockModes, mockCommands) + + const modeOptions = options.filter((option) => option.type === ContextMenuOptionType.Mode) + const commandOptions = options.filter((option) => option.type === ContextMenuOptionType.Command) + + expect(modeOptions.length).toBe(2) + expect(commandOptions.length).toBe(5) + }) + + it("should filter both modes and commands based on query", () => { + const options = getContextMenuOptions( + "/co", + "/co", + mockT, + null, + mockQueryItems, + [], + mockModes, + mockCommands, + ) + + // Should match 'code' mode and possibly some commands (fuzzy search may match) + const modeOptions = options.filter((option) => option.type === ContextMenuOptionType.Mode) + const commandOptions = options.filter((option) => option.type === ContextMenuOptionType.Command) + + expect(modeOptions.length).toBe(1) + expect(modeOptions[0].value).toBe("code") + // Fuzzy search might match some commands, so we just check it's a reasonable number + expect(commandOptions.length).toBeGreaterThanOrEqual(0) + }) + }) + + describe("command source indication", () => { + it("should not expose source information in autocomplete", () => { + const options = getContextMenuOptions("/setup", "/setup", mockT, null, mockQueryItems, [], [], mockCommands) + + const setupOption = options.find((option) => option.value === "setup") + expect(setupOption).toBeDefined() + + // Source should not be exposed in the UI + expect(setupOption!.description).not.toContain("project") + expect(setupOption!.description).not.toContain("global") + expect(setupOption!.description).toBe("Trigger the setup command") + }) + }) + + describe("edge cases", () => { + it("should handle undefined commands gracefully", () => { + const options = getContextMenuOptions("/setup", "/setup", mockT, null, mockQueryItems, [], [], undefined) + + expect(options).toHaveLength(1) + expect(options[0].type).toBe(ContextMenuOptionType.NoResults) + }) + + it("should handle empty query with commands", () => { + const options = getContextMenuOptions("", "", mockT, null, mockQueryItems, [], [], mockCommands) + + // Should not return command options for empty query + const commandOptions = options.filter((option) => option.type === ContextMenuOptionType.Command) + expect(commandOptions).toHaveLength(0) + }) + + it("should handle very long command names", () => { + const longNameCommands: Command[] = [ + { name: "very-long-command-name-that-exceeds-normal-length", source: "project" }, + ] + + const options = getContextMenuOptions( + "/very", + "/very", + mockT, + null, + mockQueryItems, + [], + [], + longNameCommands, + ) + + expect(options.length).toBe(1) + expect(options[0].value).toBe("very-long-command-name-that-exceeds-normal-length") + }) + + it("should handle commands with numeric names", () => { + const numericCommands: Command[] = [ + { name: "command1", source: "project" }, + { name: "v2-setup", source: "project" }, + { name: "123test", source: "project" }, + ] + + const options = getContextMenuOptions("/v", "/v", mockT, null, mockQueryItems, [], [], numericCommands) + + const commandNames = options.map((option) => option.value) + expect(commandNames).toContain("v2-setup") + }) + }) +}) diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 6c541353eb..e179013203 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -86,6 +86,7 @@ const ChatTextArea = forwardRef( togglePinnedApiConfig, taskHistory, clineMessages, + commands, } = useExtensionState() // Find the ID and display text for the currently selected API configuration @@ -273,6 +274,27 @@ const ChatTextArea = forwardRef( return } + if (type === ContextMenuOptionType.Command && value) { + // Handle command selection. + setSelectedMenuIndex(-1) + setInputValue("") + setShowContextMenu(false) + + // Insert the command mention into the textarea + const commandMention = `/${value}` + setInputValue(commandMention + " ") + setCursorPosition(commandMention.length + 1) + setIntendedCursorPosition(commandMention.length + 1) + + // Focus the textarea + setTimeout(() => { + if (textAreaRef.current) { + textAreaRef.current.focus() + } + }, 0) + return + } + if ( type === ContextMenuOptionType.File || type === ContextMenuOptionType.Folder || @@ -302,6 +324,8 @@ const ChatTextArea = forwardRef( insertValue = "terminal" } else if (type === ContextMenuOptionType.Git) { insertValue = value || "" + } else if (type === ContextMenuOptionType.Command) { + insertValue = value ? `/${value}` : "" } const { newValue, mentionIndex } = insertMention( @@ -344,10 +368,12 @@ const ChatTextArea = forwardRef( const options = getContextMenuOptions( searchQuery, inputValue, + t, selectedType, queryItems, fileSearchResults, allModes, + commands, ) const optionsLength = options.length @@ -381,10 +407,12 @@ const ChatTextArea = forwardRef( const selectedOption = getContextMenuOptions( searchQuery, inputValue, + t, selectedType, queryItems, fileSearchResults, allModes, + commands, )[selectedMenuIndex] if ( selectedOption && @@ -475,6 +503,8 @@ const ChatTextArea = forwardRef( fileSearchResults, handleHistoryNavigation, resetHistoryNavigation, + commands, + t, ], ) @@ -504,10 +534,12 @@ const ChatTextArea = forwardRef( if (showMenu) { if (newValue.startsWith("/")) { - // Handle slash command. + // Handle slash command - request fresh commands const query = newValue setSearchQuery(query) setSelectedMenuIndex(0) + // Request commands fresh each time slash menu is shown + vscode.postMessage({ type: "requestCommands" }) } else { // Existing @ mention handling. const lastAtIndex = newValue.lastIndexOf("@", newCursorPosition - 1) @@ -1245,6 +1277,7 @@ const ChatTextArea = forwardRef( modes={allModes} loading={searchLoading} dynamicSearchResults={fileSearchResults} + commands={commands} />
    )} diff --git a/webview-ui/src/components/chat/ContextMenu.tsx b/webview-ui/src/components/chat/ContextMenu.tsx index 1672c35ee3..372dea088c 100644 --- a/webview-ui/src/components/chat/ContextMenu.tsx +++ b/webview-ui/src/components/chat/ContextMenu.tsx @@ -1,7 +1,9 @@ import React, { useEffect, useMemo, useRef, useState } from "react" import { getIconForFilePath, getIconUrlByName, getIconForDirectoryPath } from "vscode-material-icons" +import { useTranslation } from "react-i18next" import type { ModeConfig } from "@roo-code/types" +import type { Command } from "@roo/ExtensionMessage" import { ContextMenuOptionType, @@ -23,6 +25,7 @@ interface ContextMenuProps { modes?: ModeConfig[] loading?: boolean dynamicSearchResults?: SearchResult[] + commands?: Command[] } const ContextMenu: React.FC = ({ @@ -36,13 +39,24 @@ const ContextMenu: React.FC = ({ queryItems, modes, dynamicSearchResults = [], + commands = [], }) => { const [materialIconsBaseUri, setMaterialIconsBaseUri] = useState("") const menuRef = useRef(null) + const { t } = useTranslation() const filteredOptions = useMemo(() => { - return getContextMenuOptions(searchQuery, inputValue, selectedType, queryItems, dynamicSearchResults, modes) - }, [searchQuery, inputValue, selectedType, queryItems, dynamicSearchResults, modes]) + return getContextMenuOptions( + searchQuery, + inputValue, + t, + selectedType, + queryItems, + dynamicSearchResults, + modes, + commands, + ) + }, [searchQuery, inputValue, t, selectedType, queryItems, dynamicSearchResults, modes, commands]) useEffect(() => { if (menuRef.current) { @@ -87,6 +101,25 @@ const ContextMenu: React.FC = ({ )}
    ) + case ContextMenuOptionType.Command: + return ( +
    + {option.label} + {option.description && ( + + {option.description} + + )} +
    + ) case ContextMenuOptionType.Problems: return Problems case ContextMenuOptionType.Terminal: @@ -163,6 +196,8 @@ const ContextMenu: React.FC = ({ switch (option.type) { case ContextMenuOptionType.Mode: return "symbol-misc" + case ContextMenuOptionType.Command: + return "play" case ContextMenuOptionType.OpenedFile: return "window" case ContextMenuOptionType.File: diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index ff1ce31c53..cb51fe9c9a 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -10,7 +10,7 @@ import { ORGANIZATION_ALLOW_ALL, } from "@roo-code/types" -import { ExtensionMessage, ExtensionState, MarketplaceInstalledMetadata } from "@roo/ExtensionMessage" +import { ExtensionMessage, ExtensionState, MarketplaceInstalledMetadata, Command } from "@roo/ExtensionMessage" import { findLastIndex } from "@roo/array" import { McpServer } from "@roo/mcp" import { checkExistKey } from "@roo/checkExistApiConfig" @@ -33,6 +33,7 @@ export interface ExtensionStateContextType extends ExtensionState { currentCheckpoint?: string filePaths: string[] openedTabs: Array<{ label: string; isActive: boolean; path?: string }> + commands: Command[] organizationAllowList: OrganizationAllowList cloudIsAuthenticated: boolean sharingEnabled: boolean @@ -242,6 +243,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode const [theme, setTheme] = useState(undefined) const [filePaths, setFilePaths] = useState([]) const [openedTabs, setOpenedTabs] = useState>([]) + const [commands, setCommands] = useState([]) const [mcpServers, setMcpServers] = useState([]) const [currentCheckpoint, setCurrentCheckpoint] = useState() const [extensionRouterModels, setExtensionRouterModels] = useState(undefined) @@ -308,6 +310,10 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode setOpenedTabs(tabs) break } + case "commands": { + setCommands(message.commands ?? []) + break + } case "messageUpdated": { const clineMessage = message.clineMessage! setState((prevState) => { @@ -372,6 +378,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode currentCheckpoint, filePaths, openedTabs, + commands, soundVolume: state.soundVolume, ttsSpeed: state.ttsSpeed, fuzzyMatchThreshold: state.fuzzyMatchThreshold, diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 8865da01c2..ace10191cf 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Edita el teu missatge..." + }, + "command": { + "triggerDescription": "Activa la comanda {{name}}" } } diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index c28a41aabd..692f3c3afb 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -344,6 +344,9 @@ "description": "Führe Remote-Agenten in der Cloud aus, greife von überall auf deine Aufgaben zu, arbeite mit anderen zusammen und vieles mehr.", "joinWaitlist": "Tritt der Warteliste bei, um frühen Zugang zu erhalten." }, + "command": { + "triggerDescription": "Starte den {{name}} Befehl" + }, "editMessage": { "placeholder": "Bearbeite deine Nachricht..." } diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index b5e9c1da16..441dad589d 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -346,5 +346,8 @@ "title": "Roo Code Cloud is coming soon!", "description": "Run Roomote agents in the cloud, access your tasks from anywhere, collaborate with others, and more.", "joinWaitlist": "Join the waitlist to get early access." + }, + "command": { + "triggerDescription": "Trigger the {{name}} command" } } diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index da2973027c..a379f4cfe0 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Edita tu mensaje..." + }, + "command": { + "triggerDescription": "Activar el comando {{name}}" } } diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 1153dea6c0..09ac5da79b 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Modifiez votre message..." + }, + "command": { + "triggerDescription": "Déclencher la commande {{name}}" } } diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 114384da18..99699335c0 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "अपना संदेश संपादित करें..." + }, + "command": { + "triggerDescription": "{{name}} कमांड को ट्रिगर करें" } } diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json index e272ba3fa2..e40ca9c7f7 100644 --- a/webview-ui/src/i18n/locales/id/chat.json +++ b/webview-ui/src/i18n/locales/id/chat.json @@ -352,5 +352,8 @@ }, "editMessage": { "placeholder": "Edit pesan Anda..." + }, + "command": { + "triggerDescription": "Jalankan perintah {{name}}" } } diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 4a0b58180b..97329b4c75 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Modifica il tuo messaggio..." + }, + "command": { + "triggerDescription": "Attiva il comando {{name}}" } } diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 1db33759d5..c6de5224fc 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "メッセージを編集..." + }, + "command": { + "triggerDescription": "{{name}}コマンドをトリガー" } } diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 9af867fe7a..132e8a19ea 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "메시지 편집..." + }, + "command": { + "triggerDescription": "{{name}} 명령 트리거" } } diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index 0c95429b55..62cbad798d 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Bewerk je bericht..." + }, + "command": { + "triggerDescription": "Activeer de {{name}} opdracht" } } diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index c2cb70a05d..371e81e77a 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Edytuj swoją wiadomość..." + }, + "command": { + "triggerDescription": "Uruchom polecenie {{name}}" } } diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 64a6b4a067..61d28acaff 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Edite sua mensagem..." + }, + "command": { + "triggerDescription": "Acionar o comando {{name}}" } } diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index a860c9e94e..4cfbb36805 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Редактировать сообщение..." + }, + "command": { + "triggerDescription": "Запустить команду {{name}}" } } diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 6ddca0a625..1a5d1438b5 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Mesajını düzenle..." + }, + "command": { + "triggerDescription": "{{name}} komutunu tetikle" } } diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 61b11998ad..4195845279 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "Chỉnh sửa tin nhắn của bạn..." + }, + "command": { + "triggerDescription": "Kích hoạt lệnh {{name}}" } } diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index a19d7af5f0..c3787cce0e 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -344,6 +344,9 @@ "description": "在云端运行远程代理,随时随地访问任务,与他人协作等更多功能。", "joinWaitlist": "加入等待列表获取早期访问权限。" }, + "command": { + "triggerDescription": "触发 {{name}} 命令" + }, "editMessage": { "placeholder": "编辑消息..." } diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 45053a4493..27c53f8ed6 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -346,5 +346,8 @@ }, "editMessage": { "placeholder": "編輯訊息..." + }, + "command": { + "triggerDescription": "觸發 {{name}} 命令" } } diff --git a/webview-ui/src/utils/__tests__/context-mentions.spec.ts b/webview-ui/src/utils/__tests__/context-mentions.spec.ts index 50fb1b1c50..f0266cc07f 100644 --- a/webview-ui/src/utils/__tests__/context-mentions.spec.ts +++ b/webview-ui/src/utils/__tests__/context-mentions.spec.ts @@ -194,8 +194,16 @@ describe("getContextMenuOptions", () => { { path: "/Users/test/project/assets/", type: "folder", label: "assets/" }, ] + // Mock translation function + const mockT = (key: string, options?: { name?: string }) => { + if (key === "chat:command.triggerDescription" && options?.name) { + return `Trigger command: ${options.name}` + } + return key + } + it("should return all option types for empty query", () => { - const result = getContextMenuOptions("", "", null, []) + const result = getContextMenuOptions("", "", mockT, null, []) expect(result).toHaveLength(6) expect(result.map((item) => item.type)).toEqual([ ContextMenuOptionType.Problems, @@ -208,7 +216,7 @@ describe("getContextMenuOptions", () => { }) it("should filter by selected type when query is empty", () => { - const result = getContextMenuOptions("", "", ContextMenuOptionType.File, mockQueryItems) + const result = getContextMenuOptions("", "", mockT, 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) @@ -217,19 +225,19 @@ describe("getContextMenuOptions", () => { }) it("should match git commands", () => { - const result = getContextMenuOptions("git", "git", null, mockQueryItems) + const result = getContextMenuOptions("git", "git", mockT, 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", "abc1234", null, mockQueryItems) + const result = getContextMenuOptions("abc1234", "abc1234", mockT, 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", "nonexistent", null, mockQueryItems) + const result = getContextMenuOptions("nonexistent", "nonexistent", mockT, null, mockQueryItems) expect(result).toHaveLength(1) expect(result[0].type).toBe(ContextMenuOptionType.NoResults) }) @@ -250,7 +258,7 @@ describe("getContextMenuOptions", () => { }, ] - const result = getContextMenuOptions("test", "test", null, testItems, mockDynamicSearchResults) + const result = getContextMenuOptions("test", "test", mockT, null, testItems, mockDynamicSearchResults) // Check if opened files and dynamic search results are included expect(result.some((item) => item.type === ContextMenuOptionType.OpenedFile)).toBe(true) @@ -259,7 +267,7 @@ describe("getContextMenuOptions", () => { it("should maintain correct result ordering according to implementation", () => { // Add multiple item types to test ordering - const result = getContextMenuOptions("t", "t", null, mockQueryItems, mockDynamicSearchResults) + const result = getContextMenuOptions("t", "t", mockT, null, mockQueryItems, mockDynamicSearchResults) // Find the different result types const fileResults = result.filter( @@ -290,7 +298,7 @@ describe("getContextMenuOptions", () => { }) it("should include opened files when dynamic search results exist", () => { - const result = getContextMenuOptions("open", "open", null, mockQueryItems, mockDynamicSearchResults) + const result = getContextMenuOptions("open", "open", mockT, null, mockQueryItems, mockDynamicSearchResults) // Verify opened files are included expect(result.some((item) => item.type === ContextMenuOptionType.OpenedFile)).toBe(true) @@ -299,7 +307,7 @@ describe("getContextMenuOptions", () => { }) it("should include git results when dynamic search results exist", () => { - const result = getContextMenuOptions("commit", "commit", null, mockQueryItems, mockDynamicSearchResults) + const result = getContextMenuOptions("commit", "commit", mockT, null, mockQueryItems, mockDynamicSearchResults) // Verify git results are included expect(result.some((item) => item.type === ContextMenuOptionType.Git)).toBe(true) @@ -320,7 +328,7 @@ describe("getContextMenuOptions", () => { }, ] - const result = getContextMenuOptions("test", "test", null, mockQueryItems, duplicateSearchResults) + const result = getContextMenuOptions("test", "test", mockT, null, mockQueryItems, duplicateSearchResults) // Count occurrences of src/test.ts in results const duplicateCount = result.filter( @@ -340,6 +348,7 @@ describe("getContextMenuOptions", () => { const result = getContextMenuOptions( "nonexistentquery123456", "nonexistentquery123456", + mockT, null, mockQueryItems, [], // Empty dynamic search results @@ -387,7 +396,7 @@ describe("getContextMenuOptions", () => { ] // Get results for "test" query - const result = getContextMenuOptions(testQuery, testQuery, null, testItems, testSearchResults) + const result = getContextMenuOptions(testQuery, testQuery, mockT, null, testItems, testSearchResults) // Verify we have results expect(result.length).toBeGreaterThan(0) @@ -433,7 +442,7 @@ describe("getContextMenuOptions", () => { }, ] - const result = getContextMenuOptions("/co", "/co", null, [], [], mockModes) + const result = getContextMenuOptions("/co", "/co", mockT, null, [], [], mockModes) // Verify mode results are returned expect(result[0].type).toBe(ContextMenuOptionType.Mode) @@ -443,7 +452,7 @@ describe("getContextMenuOptions", () => { 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, [], []) + const result = getContextMenuOptions("/nonexistentquery", "Hello /code", mockT, null, [], []) // Should not process as a mode command expect(result[0].type).not.toBe(ContextMenuOptionType.Mode) @@ -453,7 +462,7 @@ describe("getContextMenuOptions", () => { // --- Tests for Escaped Spaces (Focus on how paths are presented) --- it("should return search results with correct labels/descriptions (no escaping needed here)", () => { - const options = getContextMenuOptions("@search", "search", null, mockQueryItems, mockSearchResults) + const options = getContextMenuOptions("@search", "search", mockT, null, mockQueryItems, mockSearchResults) const fileResult = options.find((o) => o.label === "search result spaces.ts") expect(fileResult).toBeDefined() // Value should be the normalized path, description might be the same or label @@ -466,7 +475,7 @@ describe("getContextMenuOptions", () => { }) it("should return query items (like opened files) with correct labels/descriptions", () => { - const options = getContextMenuOptions("open", "@open", null, mockQueryItems, []) + const options = getContextMenuOptions("open", "@open", mockT, null, mockQueryItems, []) const openedFile = options.find((o) => o.label === "open file.ts") expect(openedFile).toBeDefined() expect(openedFile?.value).toBe("src/open file.ts") @@ -483,7 +492,7 @@ describe("getContextMenuOptions", () => { ] // The formatting happens in getContextMenuOptions when converting search results to menu items - const formattedItems = getContextMenuOptions("spaces", "@spaces", null, [], searchResults) + const formattedItems = getContextMenuOptions("spaces", "@spaces", mockT, null, [], searchResults) // Verify we get some results back that aren't "No Results" expect(formattedItems.length).toBeGreaterThan(0) diff --git a/webview-ui/src/utils/context-mentions.ts b/webview-ui/src/utils/context-mentions.ts index 889dca9dbe..50ab3cf12b 100644 --- a/webview-ui/src/utils/context-mentions.ts +++ b/webview-ui/src/utils/context-mentions.ts @@ -1,6 +1,7 @@ import { Fzf } from "fzf" import type { ModeConfig } from "@roo-code/types" +import type { Command } from "@roo/ExtensionMessage" import { mentionRegex } from "@roo/context-mentions" @@ -105,6 +106,7 @@ export enum ContextMenuOptionType { Git = "git", NoResults = "noResults", Mode = "mode", // Add mode type + Command = "command", // Add command type } export interface ContextMenuQueryItem { @@ -118,43 +120,83 @@ export interface ContextMenuQueryItem { export function getContextMenuOptions( query: string, inputValue: string, + t: (key: string, options?: { name?: string }) => string, selectedType: ContextMenuOptionType | null = null, queryItems: ContextMenuQueryItem[], dynamicSearchResults: SearchResult[] = [], modes?: ModeConfig[], + commands?: Command[], ): ContextMenuQueryItem[] { - // Handle slash commands for modes + // Handle slash commands for modes and commands if (query.startsWith("/") && inputValue.startsWith("/")) { - const modeQuery = query.slice(1) - if (!modes?.length) return [{ type: ContextMenuOptionType.NoResults }] + const slashQuery = query.slice(1) + const results: ContextMenuQueryItem[] = [] - // Create searchable strings array for fzf - const searchableItems = modes.map((mode) => ({ - original: mode, - searchStr: mode.name, - })) + // Add mode suggestions + if (modes?.length) { + // Create searchable strings array for fzf + const searchableItems = modes.map((mode) => ({ + original: mode, + searchStr: mode.name, + })) - // Initialize fzf instance for fuzzy search - const fzf = new Fzf(searchableItems, { - selector: (item) => item.searchStr, - }) + // Initialize fzf instance for fuzzy search + const fzf = new Fzf(searchableItems, { + selector: (item) => item.searchStr, + }) - // Get fuzzy matching items - const matchingModes = modeQuery - ? fzf.find(modeQuery).map((result) => ({ - type: ContextMenuOptionType.Mode, - value: result.item.original.slug, - label: result.item.original.name, - description: getModeDescription(result.item.original), - })) - : modes.map((mode) => ({ - type: ContextMenuOptionType.Mode, - value: mode.slug, - label: mode.name, - description: getModeDescription(mode), - })) + // Get fuzzy matching items + const matchingModes = slashQuery + ? fzf.find(slashQuery).map((result) => ({ + type: ContextMenuOptionType.Mode, + value: result.item.original.slug, + label: result.item.original.name, + description: getModeDescription(result.item.original), + })) + : modes.map((mode) => ({ + type: ContextMenuOptionType.Mode, + value: mode.slug, + label: mode.name, + description: getModeDescription(mode), + })) - return matchingModes.length > 0 ? matchingModes : [{ type: ContextMenuOptionType.NoResults }] + results.push(...matchingModes) + } + + // Add command suggestions + if (commands?.length) { + // Create searchable strings array for fzf + const searchableCommands = commands.map((command) => ({ + original: command, + searchStr: command.name, + })) + + // Initialize fzf instance for fuzzy search + const fzf = new Fzf(searchableCommands, { + selector: (item) => item.searchStr, + }) + + // Get fuzzy matching commands + const matchingCommands = slashQuery + ? fzf.find(slashQuery).map((result) => ({ + type: ContextMenuOptionType.Command, + value: result.item.original.name, + label: result.item.original.name, + description: t("chat:command.triggerDescription", { name: result.item.original.name }), + icon: "$(play)", + })) + : commands.map((command) => ({ + type: ContextMenuOptionType.Command, + value: command.name, + label: command.name, + description: t("chat:command.triggerDescription", { name: command.name }), + icon: "$(play)", + })) + + results.push(...matchingCommands) + } + + return results.length > 0 ? results : [{ type: ContextMenuOptionType.NoResults }] } const workingChanges: ContextMenuQueryItem = { From 8625b451f49d9fb69489cc152462e697461a7eb0 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Sat, 26 Jul 2025 23:13:57 -0600 Subject: [PATCH 28/44] feat: Add search functionality to mode selector popup and reorganize layout (#6140) Co-authored-by: Roo Code Translate Mode Co-authored-by: Daniel Riccio --- .../src/components/chat/ModeSelector.tsx | 276 +++++++++++++----- .../chat/__tests__/ModeSelector.spec.tsx | 146 ++++++++- webview-ui/src/i18n/locales/ca/chat.json | 4 +- webview-ui/src/i18n/locales/de/chat.json | 4 +- webview-ui/src/i18n/locales/en/chat.json | 4 +- webview-ui/src/i18n/locales/es/chat.json | 4 +- webview-ui/src/i18n/locales/fr/chat.json | 4 +- webview-ui/src/i18n/locales/hi/chat.json | 4 +- webview-ui/src/i18n/locales/id/chat.json | 4 +- webview-ui/src/i18n/locales/it/chat.json | 4 +- webview-ui/src/i18n/locales/ja/chat.json | 4 +- webview-ui/src/i18n/locales/ko/chat.json | 4 +- webview-ui/src/i18n/locales/nl/chat.json | 4 +- webview-ui/src/i18n/locales/pl/chat.json | 4 +- webview-ui/src/i18n/locales/pt-BR/chat.json | 4 +- webview-ui/src/i18n/locales/ru/chat.json | 4 +- webview-ui/src/i18n/locales/tr/chat.json | 4 +- webview-ui/src/i18n/locales/vi/chat.json | 4 +- webview-ui/src/i18n/locales/zh-CN/chat.json | 4 +- webview-ui/src/i18n/locales/zh-TW/chat.json | 4 +- 20 files changed, 399 insertions(+), 95 deletions(-) diff --git a/webview-ui/src/components/chat/ModeSelector.tsx b/webview-ui/src/components/chat/ModeSelector.tsx index 336e9f8357..93dd2f1f4f 100644 --- a/webview-ui/src/components/chat/ModeSelector.tsx +++ b/webview-ui/src/components/chat/ModeSelector.tsx @@ -1,5 +1,5 @@ import React from "react" -import { ChevronUp, Check } from "lucide-react" +import { ChevronUp, Check, X } from "lucide-react" import { cn } from "@/lib/utils" import { useRooPortal } from "@/components/ui/hooks/useRooPortal" import { Popover, PopoverContent, PopoverTrigger, StandardTooltip } from "@/components/ui" @@ -11,6 +11,10 @@ import { Mode, getAllModes } from "@roo/modes" import { ModeConfig, CustomModePrompts } from "@roo-code/types" import { telemetryClient } from "@/utils/TelemetryClient" import { TelemetryEventName } from "@roo-code/types" +import { Fzf } from "fzf" + +// Minimum number of modes required to show search functionality +const SEARCH_THRESHOLD = 6 interface ModeSelectorProps { value: Mode @@ -21,6 +25,7 @@ interface ModeSelectorProps { modeShortcutText: string customModes?: ModeConfig[] customModePrompts?: CustomModePrompts + disableSearch?: boolean } export const ModeSelector = ({ @@ -32,13 +37,16 @@ export const ModeSelector = ({ modeShortcutText, customModes, customModePrompts, + disableSearch = false, }: ModeSelectorProps) => { const [open, setOpen] = React.useState(false) + const [searchValue, setSearchValue] = React.useState("") + const searchInputRef = React.useRef(null) const portalContainer = useRooPortal("roo-portal") const { hasOpenedModeSelector, setHasOpenedModeSelector } = useExtensionState() const { t } = useAppTranslation() - const trackModeSelectorOpened = () => { + const trackModeSelectorOpened = React.useCallback(() => { // Track telemetry every time the mode selector is opened telemetryClient.capture(TelemetryEventName.MODE_SELECTOR_OPENED) @@ -47,7 +55,7 @@ export const ModeSelector = ({ setHasOpenedModeSelector(true) vscode.postMessage({ type: "hasOpenedModeSelector", bool: true }) } - } + }, [hasOpenedModeSelector, setHasOpenedModeSelector]) // Get all modes including custom modes and merge custom prompt descriptions const modes = React.useMemo(() => { @@ -61,6 +69,96 @@ export const ModeSelector = ({ // Find the selected mode const selectedMode = React.useMemo(() => modes.find((mode) => mode.slug === value), [modes, value]) + // Memoize searchable items for fuzzy search with separate name and description search + const nameSearchItems = React.useMemo(() => { + return modes.map((mode) => ({ + original: mode, + searchStr: [mode.name, mode.slug].filter(Boolean).join(" "), + })) + }, [modes]) + + const descriptionSearchItems = React.useMemo(() => { + return modes.map((mode) => ({ + original: mode, + searchStr: mode.description || "", + })) + }, [modes]) + + // Create memoized Fzf instances for name and description searches + const nameFzfInstance = React.useMemo(() => { + return new Fzf(nameSearchItems, { + selector: (item) => item.searchStr, + }) + }, [nameSearchItems]) + + const descriptionFzfInstance = React.useMemo(() => { + return new Fzf(descriptionSearchItems, { + selector: (item) => item.searchStr, + }) + }, [descriptionSearchItems]) + + // Filter modes based on search value using fuzzy search with priority + const filteredModes = React.useMemo(() => { + if (!searchValue) return modes + + // First search in names/slugs + const nameMatches = nameFzfInstance.find(searchValue) + const nameMatchedModes = new Set(nameMatches.map((result) => result.item.original.slug)) + + // Then search in descriptions + const descriptionMatches = descriptionFzfInstance.find(searchValue) + + // Combine results: name matches first, then description matches + const combinedResults = [ + ...nameMatches.map((result) => result.item.original), + ...descriptionMatches + .filter((result) => !nameMatchedModes.has(result.item.original.slug)) + .map((result) => result.item.original), + ] + + return combinedResults + }, [modes, searchValue, nameFzfInstance, descriptionFzfInstance]) + + const onClearSearch = React.useCallback(() => { + setSearchValue("") + searchInputRef.current?.focus() + }, []) + + const handleSelect = React.useCallback( + (modeSlug: string) => { + onChange(modeSlug as Mode) + setOpen(false) + // Clear search after selection + setSearchValue("") + }, + [onChange], + ) + + const onOpenChange = React.useCallback( + (isOpen: boolean) => { + if (isOpen) trackModeSelectorOpened() + setOpen(isOpen) + // Clear search when closing + if (!isOpen) { + setSearchValue("") + } + }, + [trackModeSelectorOpened], + ) + + // Auto-focus search input when popover opens + React.useEffect(() => { + if (open && searchInputRef.current) { + searchInputRef.current.focus() + } + }, [open]) + + // Determine if search should be shown + const showSearch = !disableSearch && modes.length > SEARCH_THRESHOLD + + // Combine instruction text for tooltip + const instructionText = `${t("chat:modeSelector.description")} ${modeShortcutText}` + const trigger = ( { - if (isOpen) trackModeSelectorOpened() - setOpen(isOpen) - }} - data-testid="mode-selector-root"> + {title ? {trigger} : trigger}
    -
    -
    -

    {t("chat:modeSelector.title")}

    -
    - { - window.postMessage( - { - type: "action", - action: "marketplaceButtonClicked", - values: { marketplaceTab: "mode" }, - }, - "*", - ) - - setOpen(false) - }} - /> - { - vscode.postMessage({ - type: "switchTab", - tab: "modes", - }) - setOpen(false) - }} - /> -
    + {/* Show search bar only when there are more than SEARCH_THRESHOLD items, otherwise show info blurb */} + {showSearch ? ( +
    + setSearchValue(e.target.value)} + placeholder={t("chat:modeSelector.searchPlaceholder")} + className="w-full h-8 px-2 py-1 text-xs bg-vscode-input-background text-vscode-input-foreground border border-vscode-input-border rounded focus:outline-0" + data-testid="mode-search-input" + /> + {searchValue.length > 0 && ( +
    + +
    + )}
    -

    - {t("chat:modeSelector.description")} -
    - {modeShortcutText} -

    -
    + ) : ( +
    +

    {instructionText}

    +
    + )} {/* Mode List */} -
    - {modes.map((mode) => ( -
    + {filteredModes.length === 0 && searchValue ? ( +
    + {t("chat:modeSelector.noResults")} +
    + ) : ( +
    + {filteredModes.map((mode) => ( +
    handleSelect(mode.slug)} + className={cn( + "px-3 py-1.5 text-sm cursor-pointer flex items-center", + "hover:bg-vscode-list-hoverBackground", + mode.slug === value + ? "bg-vscode-list-activeSelectionBackground text-vscode-list-activeSelectionForeground" + : "", + )} + data-testid="mode-selector-item"> +
    +
    {mode.name}
    + {mode.description && ( +
    + {mode.description} +
    + )} +
    + {mode.slug === value && } +
    + ))} +
    + )} +
    + + {/* Bottom bar with buttons on left and title on right */} +
    +
    + { - onChange(mode.slug as Mode) + window.postMessage( + { + type: "action", + action: "marketplaceButtonClicked", + values: { marketplaceTab: "mode" }, + }, + "*", + ) setOpen(false) }} - data-testid="mode-selector-item"> -
    -

    {mode.name}

    - {mode.description && ( -

    - {mode.description} -

    - )} -
    - {mode.slug === value ? ( - - ) : ( -
    - )} -
    - ))} + /> + { + vscode.postMessage({ + type: "switchTab", + tab: "modes", + }) + setOpen(false) + }} + /> +
    + + {/* Info icon and title on the right - only show info icon when search bar is visible */} +
    + {showSearch && ( + + + + )} +

    + {t("chat:modeSelector.title")} +

    +
    diff --git a/webview-ui/src/components/chat/__tests__/ModeSelector.spec.tsx b/webview-ui/src/components/chat/__tests__/ModeSelector.spec.tsx index d6fc81368d..a829168893 100644 --- a/webview-ui/src/components/chat/__tests__/ModeSelector.spec.tsx +++ b/webview-ui/src/components/chat/__tests__/ModeSelector.spec.tsx @@ -1,8 +1,9 @@ import React from "react" -import { render, screen } from "@/utils/test-utils" +import { render, screen, fireEvent } from "@/utils/test-utils" import { describe, test, expect, vi } from "vitest" import ModeSelector from "../ModeSelector" import { Mode } from "@roo/modes" +import { ModeConfig } from "@roo-code/types" // Mock the dependencies vi.mock("@/utils/vscode", () => ({ @@ -28,6 +29,23 @@ vi.mock("@/components/ui/hooks/useRooPortal", () => ({ useRooPortal: () => document.body, })) +vi.mock("@/utils/TelemetryClient", () => ({ + telemetryClient: { + capture: vi.fn(), + }, +})) + +// Create a variable to control what getAllModes returns +let mockModes: ModeConfig[] = [] + +vi.mock("@roo/modes", async () => { + const actual = await vi.importActual("@roo/modes") + return { + ...actual, + getAllModes: () => mockModes, + } +}) + describe("ModeSelector", () => { test("shows custom description from customModePrompts", () => { const customModePrompts = { @@ -55,4 +73,130 @@ describe("ModeSelector", () => { // The component should be rendered expect(screen.getByTestId("mode-selector-trigger")).toBeInTheDocument() }) + + test("shows search bar when there are more than 6 modes", () => { + // Set up mock to return 7 modes + mockModes = Array.from({ length: 7 }, (_, i) => ({ + slug: `mode-${i}`, + name: `Mode ${i}`, + description: `Description for mode ${i}`, + roleDefinition: "Role definition", + groups: ["read", "edit"], + })) + + render() + + // Click to open the popover + fireEvent.click(screen.getByTestId("mode-selector-trigger")) + + // Search input should be visible + expect(screen.getByTestId("mode-search-input")).toBeInTheDocument() + + // Info icon should be visible + expect(screen.getByText("chat:modeSelector.title")).toBeInTheDocument() + const infoIcon = document.querySelector(".codicon-info") + expect(infoIcon).toBeInTheDocument() + }) + + test("shows info blurb instead of search bar when there are 6 or fewer modes", () => { + // Set up mock to return 5 modes + mockModes = Array.from({ length: 5 }, (_, i) => ({ + slug: `mode-${i}`, + name: `Mode ${i}`, + description: `Description for mode ${i}`, + roleDefinition: "Role definition", + groups: ["read", "edit"], + })) + + render() + + // Click to open the popover + fireEvent.click(screen.getByTestId("mode-selector-trigger")) + + // Search input should NOT be visible + expect(screen.queryByTestId("mode-search-input")).not.toBeInTheDocument() + + // Info blurb should be visible + expect(screen.getByText(/chat:modeSelector.description/)).toBeInTheDocument() + + // Info icon should NOT be visible + const infoIcon = document.querySelector(".codicon-info") + expect(infoIcon).not.toBeInTheDocument() + }) + + test("filters modes correctly when searching", () => { + // Set up mock to return 7 modes to enable search + mockModes = Array.from({ length: 7 }, (_, i) => ({ + slug: `mode-${i}`, + name: `Mode ${i}`, + description: `Description for mode ${i}`, + roleDefinition: "Role definition", + groups: ["read", "edit"], + })) + + render() + + // Click to open the popover + fireEvent.click(screen.getByTestId("mode-selector-trigger")) + + // Type in search + const searchInput = screen.getByTestId("mode-search-input") + fireEvent.change(searchInput, { target: { value: "Mode 3" } }) + + // Should show filtered results + const modeItems = screen.getAllByTestId("mode-selector-item") + expect(modeItems.length).toBeLessThan(7) // Should have filtered some out + }) + + test("respects disableSearch prop even when there are more than 6 modes", () => { + // Set up mock to return 10 modes + mockModes = Array.from({ length: 10 }, (_, i) => ({ + slug: `mode-${i}`, + name: `Mode ${i}`, + description: `Description for mode ${i}`, + roleDefinition: "Role definition", + groups: ["read", "edit"], + })) + + render( + , + ) + + // Click to open the popover + fireEvent.click(screen.getByTestId("mode-selector-trigger")) + + // Search input should NOT be visible even with 10 modes + expect(screen.queryByTestId("mode-search-input")).not.toBeInTheDocument() + + // Info blurb should be visible instead + expect(screen.getByText(/chat:modeSelector.description/)).toBeInTheDocument() + + // Info icon should NOT be visible + const infoIcon = document.querySelector(".codicon-info") + expect(infoIcon).not.toBeInTheDocument() + }) + + test("shows search when disableSearch is false (default) and modes > 6", () => { + // Set up mock to return 8 modes + mockModes = Array.from({ length: 8 }, (_, i) => ({ + slug: `mode-${i}`, + name: `Mode ${i}`, + description: `Description for mode ${i}`, + roleDefinition: "Role definition", + groups: ["read", "edit"], + })) + + // Don't pass disableSearch prop (should default to false) + render() + + // Click to open the popover + fireEvent.click(screen.getByTestId("mode-selector-trigger")) + + // Search input should be visible + expect(screen.getByTestId("mode-search-input")).toBeInTheDocument() + + // Info icon should be visible + const infoIcon = document.querySelector(".codicon-info") + expect(infoIcon).toBeInTheDocument() + }) }) diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index ace10191cf..7793f2fcac 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -116,7 +116,9 @@ "title": "Modes", "marketplace": "Marketplace de Modes", "settings": "Configuració de Modes", - "description": "Personalitats especialitzades que adapten el comportament de Roo." + "description": "Personalitats especialitzades que adapten el comportament de Roo.", + "searchPlaceholder": "Cerca modes...", + "noResults": "No s'han trobat resultats" }, "errorReadingFile": "Error en llegir el fitxer:", "noValidImages": "No s'ha processat cap imatge vàlida", diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 692f3c3afb..7a95da7438 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -116,7 +116,9 @@ "title": "Modi", "marketplace": "Modus-Marketplace", "settings": "Modus-Einstellungen", - "description": "Spezialisierte Personas, die Roos Verhalten anpassen." + "description": "Spezialisierte Personas, die Roos Verhalten anpassen.", + "searchPlaceholder": "Modi suchen...", + "noResults": "Keine Ergebnisse gefunden" }, "errorReadingFile": "Fehler beim Lesen der Datei:", "noValidImages": "Keine gültigen Bilder wurden verarbeitet", diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 441dad589d..bb41ab3b8c 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -118,7 +118,9 @@ "title": "Modes", "marketplace": "Mode Marketplace", "settings": "Mode Settings", - "description": "Specialized personas that tailor Roo's behavior." + "description": "Specialized personas that tailor Roo's behavior.", + "searchPlaceholder": "Search modes...", + "noResults": "No results found" }, "enhancePromptDescription": "The 'Enhance Prompt' button helps improve your prompt by providing additional context, clarification, or rephrasing. Try typing a prompt in here and clicking the button again to see how it works.", "addImages": "Add images to message", diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index a379f4cfe0..68c358fc22 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -116,7 +116,9 @@ "title": "Modos", "marketplace": "Marketplace de Modos", "settings": "Configuración de Modos", - "description": "Personalidades especializadas que adaptan el comportamiento de Roo." + "description": "Personalidades especializadas que adaptan el comportamiento de Roo.", + "searchPlaceholder": "Buscar modos...", + "noResults": "No se encontraron resultados" }, "errorReadingFile": "Error al leer el archivo:", "noValidImages": "No se procesaron imágenes válidas", diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 09ac5da79b..54098d55dd 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -116,7 +116,9 @@ "title": "Modes", "marketplace": "Marketplace de Modes", "settings": "Paramètres des Modes", - "description": "Personas spécialisés qui adaptent le comportement de Roo." + "description": "Personas spécialisés qui adaptent le comportement de Roo.", + "searchPlaceholder": "Rechercher des modes...", + "noResults": "Aucun résultat trouvé" }, "errorReadingFile": "Erreur lors de la lecture du fichier :", "noValidImages": "Aucune image valide n'a été traitée", diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 99699335c0..f1595807ed 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -116,7 +116,9 @@ "title": "मोड्स", "marketplace": "मोड मार्केटप्लेस", "settings": "मोड सेटिंग्स", - "description": "विशेष व्यक्तित्व जो Roo के व्यवहार को अनुकूलित करते हैं।" + "description": "विशेष व्यक्तित्व जो Roo के व्यवहार को अनुकूलित करते हैं।", + "searchPlaceholder": "मोड खोजें...", + "noResults": "कोई परिणाम नहीं मिला" }, "errorReadingFile": "फ़ाइल पढ़ने में त्रुटि:", "noValidImages": "कोई मान्य चित्र प्रोसेस नहीं किया गया", diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json index e40ca9c7f7..2e0880abcb 100644 --- a/webview-ui/src/i18n/locales/id/chat.json +++ b/webview-ui/src/i18n/locales/id/chat.json @@ -122,7 +122,9 @@ "title": "Mode", "marketplace": "Marketplace Mode", "settings": "Pengaturan Mode", - "description": "Persona khusus yang menyesuaikan perilaku Roo." + "description": "Persona khusus yang menyesuaikan perilaku Roo.", + "searchPlaceholder": "Cari mode...", + "noResults": "Tidak ada hasil yang ditemukan" }, "addImages": "Tambahkan gambar ke pesan", "sendMessage": "Kirim pesan", diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 97329b4c75..a8fa4ac82c 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -116,7 +116,9 @@ "title": "Modalità", "marketplace": "Marketplace delle Modalità", "settings": "Impostazioni Modalità", - "description": "Personalità specializzate che adattano il comportamento di Roo." + "description": "Personalità specializzate che adattano il comportamento di Roo.", + "searchPlaceholder": "Cerca modalità...", + "noResults": "Nessun risultato trovato" }, "errorReadingFile": "Errore nella lettura del file:", "noValidImages": "Nessuna immagine valida è stata elaborata", diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index c6de5224fc..e29994f3f5 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -116,7 +116,9 @@ "title": "モード", "marketplace": "モードマーケットプレイス", "settings": "モード設定", - "description": "Rooの動作をカスタマイズする専門的なペルソナ。" + "description": "Rooの動作をカスタマイズする専門的なペルソナ。", + "searchPlaceholder": "モードを検索...", + "noResults": "結果が見つかりません" }, "errorReadingFile": "ファイル読み込みエラー:", "noValidImages": "有効な画像が処理されませんでした", diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 132e8a19ea..8c9b3c839c 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -116,7 +116,9 @@ "title": "모드", "marketplace": "모드 마켓플레이스", "settings": "모드 설정", - "description": "Roo의 행동을 맞춤화하는 전문화된 페르소나." + "description": "Roo의 행동을 맞춤화하는 전문화된 페르소나.", + "searchPlaceholder": "모드 검색...", + "noResults": "결과를 찾을 수 없습니다" }, "errorReadingFile": "파일 읽기 오류:", "noValidImages": "처리된 유효한 이미지가 없습니다", diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index 62cbad798d..964ab7ee85 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -108,7 +108,9 @@ "title": "Modi", "marketplace": "Modus Marktplaats", "settings": "Modus Instellingen", - "description": "Gespecialiseerde persona's die het gedrag van Roo aanpassen." + "description": "Gespecialiseerde persona's die het gedrag van Roo aanpassen.", + "searchPlaceholder": "Zoek modi...", + "noResults": "Geen resultaten gevonden" }, "addImages": "Afbeeldingen toevoegen aan bericht", "sendMessage": "Bericht verzenden", diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 371e81e77a..26733de380 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -116,7 +116,9 @@ "title": "Tryby", "marketplace": "Marketplace Trybów", "settings": "Ustawienia Trybów", - "description": "Wyspecjalizowane persony, które dostosowują zachowanie Roo." + "description": "Wyspecjalizowane persony, które dostosowują zachowanie Roo.", + "searchPlaceholder": "Szukaj trybów...", + "noResults": "Nie znaleziono wyników" }, "errorReadingFile": "Błąd odczytu pliku:", "noValidImages": "Nie przetworzono żadnych prawidłowych obrazów", diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 61d28acaff..7430ed2360 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -116,7 +116,9 @@ "title": "Modos", "marketplace": "Marketplace de Modos", "settings": "Configurações de Modos", - "description": "Personas especializadas que adaptam o comportamento do Roo." + "description": "Personas especializadas que adaptam o comportamento do Roo.", + "searchPlaceholder": "Pesquisar modos...", + "noResults": "Nenhum resultado encontrado" }, "errorReadingFile": "Erro ao ler arquivo:", "noValidImages": "Nenhuma imagem válida foi processada", diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index 4cfbb36805..128ac90045 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -108,7 +108,9 @@ "title": "Режимы", "marketplace": "Маркетплейс режимов", "settings": "Настройки режимов", - "description": "Специализированные персоны, которые настраивают поведение Roo." + "description": "Специализированные персоны, которые настраивают поведение Roo.", + "searchPlaceholder": "Поиск режимов...", + "noResults": "Ничего не найдено" }, "addImages": "Добавить изображения к сообщению", "sendMessage": "Отправить сообщение", diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 1a5d1438b5..10556d8c91 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -116,7 +116,9 @@ "title": "Modlar", "marketplace": "Mod Pazaryeri", "settings": "Mod Ayarları", - "description": "Roo'nun davranışını özelleştiren uzmanlaşmış kişilikler." + "description": "Roo'nun davranışını özelleştiren uzmanlaşmış kişilikler.", + "searchPlaceholder": "Modları ara...", + "noResults": "Sonuç bulunamadı" }, "errorReadingFile": "Dosya okuma hatası:", "noValidImages": "Hiçbir geçerli resim işlenmedi", diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 4195845279..c4b2bd19a7 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -116,7 +116,9 @@ "title": "Chế độ", "marketplace": "Chợ Chế độ", "settings": "Cài đặt Chế độ", - "description": "Các nhân cách chuyên biệt điều chỉnh hành vi của Roo." + "description": "Các nhân cách chuyên biệt điều chỉnh hành vi của Roo.", + "searchPlaceholder": "Tìm kiếm chế độ...", + "noResults": "Không tìm thấy kết quả nào" }, "errorReadingFile": "Lỗi khi đọc tệp:", "noValidImages": "Không có hình ảnh hợp lệ nào được xử lý", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index c3787cce0e..44b92e7222 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -116,7 +116,9 @@ "title": "模式", "marketplace": "模式市场", "settings": "模式设置", - "description": "专门定制Roo行为的角色。" + "description": "专门定制Roo行为的角色。", + "searchPlaceholder": "搜索模式...", + "noResults": "未找到结果" }, "errorReadingFile": "读取文件时出错:", "noValidImages": "没有处理有效图片", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 27c53f8ed6..469f5f9dca 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -116,7 +116,9 @@ "title": "模式", "marketplace": "模式市集", "settings": "模式設定", - "description": "專門定制Roo行為的角色。" + "description": "專門定制Roo行為的角色。", + "searchPlaceholder": "搜尋模式...", + "noResults": "沒有找到結果" }, "errorReadingFile": "讀取檔案時發生錯誤:", "noValidImages": "未處理到任何有效圖片", From 7a6e85224806b5a7ead527e2992607cba47bd376 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Sat, 26 Jul 2025 23:15:10 -0600 Subject: [PATCH 29/44] feat: sync API config selector style with mode selector from PR #6140 (#6148) Co-authored-by: Daniel Riccio --- .../src/components/chat/ApiConfigSelector.tsx | 242 ++++++++++ .../src/components/chat/ChatTextArea.tsx | 129 +----- .../chat/__tests__/ApiConfigSelector.spec.tsx | 418 ++++++++++++++++++ webview-ui/src/i18n/locales/ca/common.json | 3 +- webview-ui/src/i18n/locales/de/common.json | 3 +- webview-ui/src/i18n/locales/en/common.json | 3 +- webview-ui/src/i18n/locales/es/common.json | 3 +- webview-ui/src/i18n/locales/fr/common.json | 3 +- webview-ui/src/i18n/locales/hi/common.json | 3 +- webview-ui/src/i18n/locales/id/common.json | 3 +- webview-ui/src/i18n/locales/it/common.json | 3 +- webview-ui/src/i18n/locales/ja/common.json | 3 +- webview-ui/src/i18n/locales/ko/common.json | 3 +- webview-ui/src/i18n/locales/nl/common.json | 3 +- webview-ui/src/i18n/locales/pl/common.json | 3 +- webview-ui/src/i18n/locales/pt-BR/common.json | 3 +- webview-ui/src/i18n/locales/ru/common.json | 3 +- webview-ui/src/i18n/locales/tr/common.json | 3 +- webview-ui/src/i18n/locales/vi/common.json | 3 +- webview-ui/src/i18n/locales/zh-CN/common.json | 3 +- webview-ui/src/i18n/locales/zh-TW/common.json | 3 +- 21 files changed, 705 insertions(+), 138 deletions(-) create mode 100644 webview-ui/src/components/chat/ApiConfigSelector.tsx create mode 100644 webview-ui/src/components/chat/__tests__/ApiConfigSelector.spec.tsx diff --git a/webview-ui/src/components/chat/ApiConfigSelector.tsx b/webview-ui/src/components/chat/ApiConfigSelector.tsx new file mode 100644 index 0000000000..32b8714772 --- /dev/null +++ b/webview-ui/src/components/chat/ApiConfigSelector.tsx @@ -0,0 +1,242 @@ +import React, { useState, useMemo, useCallback } from "react" +import { cn } from "@/lib/utils" +import { useRooPortal } from "@/components/ui/hooks/useRooPortal" +import { Popover, PopoverContent, PopoverTrigger, StandardTooltip } from "@/components/ui" +import { IconButton } from "./IconButton" +import { useAppTranslation } from "@/i18n/TranslationContext" +import { vscode } from "@/utils/vscode" +import { Fzf } from "fzf" +import { Button } from "@/components/ui" + +interface ApiConfigSelectorProps { + value: string + displayName: string + disabled?: boolean + title?: string + onChange: (value: string) => void + triggerClassName?: string + listApiConfigMeta: Array<{ id: string; name: string }> + pinnedApiConfigs?: Record + togglePinnedApiConfig: (id: string) => void +} + +export const ApiConfigSelector = ({ + value, + displayName, + disabled = false, + title = "", + onChange, + triggerClassName = "", + listApiConfigMeta, + pinnedApiConfigs, + togglePinnedApiConfig, +}: ApiConfigSelectorProps) => { + const { t } = useAppTranslation() + const [open, setOpen] = useState(false) + const [searchValue, setSearchValue] = useState("") + const portalContainer = useRooPortal("roo-portal") + + // Create searchable items for fuzzy search + const searchableItems = useMemo(() => { + return listApiConfigMeta.map((config) => ({ + original: config, + searchStr: config.name, + })) + }, [listApiConfigMeta]) + + // Create Fzf instance + const fzfInstance = useMemo(() => { + return new Fzf(searchableItems, { + selector: (item) => item.searchStr, + }) + }, [searchableItems]) + + // Filter configs based on search + const filteredConfigs = useMemo(() => { + if (!searchValue) return listApiConfigMeta + + const matchingItems = fzfInstance.find(searchValue).map((result) => result.item.original) + return matchingItems + }, [listApiConfigMeta, searchValue, fzfInstance]) + + // Separate pinned and unpinned configs + const { pinnedConfigs, unpinnedConfigs } = useMemo(() => { + const pinned = filteredConfigs.filter((config) => pinnedApiConfigs?.[config.id]) + const unpinned = filteredConfigs.filter((config) => !pinnedApiConfigs?.[config.id]) + return { pinnedConfigs: pinned, unpinnedConfigs: unpinned } + }, [filteredConfigs, pinnedApiConfigs]) + + const handleSelect = useCallback( + (configId: string) => { + onChange(configId) + setOpen(false) + setSearchValue("") + }, + [onChange], + ) + + const handleEditClick = useCallback(() => { + vscode.postMessage({ + type: "switchTab", + tab: "settings", + }) + setOpen(false) + }, []) + + const renderConfigItem = useCallback( + (config: { id: string; name: string }, isPinned: boolean) => { + const isCurrentConfig = config.id === value + + return ( +
    handleSelect(config.id)} + className={cn( + "px-3 py-1.5 text-sm cursor-pointer flex items-center group", + "hover:bg-vscode-list-hoverBackground", + isCurrentConfig && + "bg-vscode-list-activeSelectionBackground text-vscode-list-activeSelectionForeground", + )}> + {config.name} +
    + {isCurrentConfig && ( +
    + +
    + )} + + + +
    +
    + ) + }, + [value, handleSelect, t, togglePinnedApiConfig], + ) + + const triggerContent = ( + + + {displayName} + + ) + + return ( + + {title ? {triggerContent} : triggerContent} + +
    + {/* Search input or info blurb */} + {listApiConfigMeta.length > 6 ? ( +
    + setSearchValue(e.target.value)} + placeholder={t("common:ui.search_placeholder")} + className="w-full h-8 px-2 py-1 text-xs bg-vscode-input-background text-vscode-input-foreground border border-vscode-input-border rounded focus:outline-0" + autoFocus + /> + {searchValue.length > 0 && ( +
    + setSearchValue("")} + /> +
    + )} +
    + ) : ( +
    +

    + {t("prompts:apiConfiguration.select")} +

    +
    + )} + + {/* Config list */} +
    + {filteredConfigs.length === 0 && searchValue ? ( +
    + {t("common:ui.no_results")} +
    + ) : ( +
    + {/* Pinned configs */} + {pinnedConfigs.map((config) => renderConfigItem(config, true))} + + {/* Separator between pinned and unpinned */} + {pinnedConfigs.length > 0 && unpinnedConfigs.length > 0 && ( +
    + )} + + {/* Unpinned configs */} + {unpinnedConfigs.map((config) => renderConfigItem(config, false))} +
    + )} +
    + + {/* Bottom bar with buttons on left and title on right */} +
    +
    + +
    + + {/* Info icon and title on the right with matching spacing */} +
    + {listApiConfigMeta.length > 6 && ( + + + + )} +

    + {t("prompts:apiConfiguration.title")} +

    +
    +
    +
    + + + ) +} diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index e179013203..4fe2ec8a14 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -19,13 +19,14 @@ import { SearchResult, } from "@src/utils/context-mentions" import { convertToMentionPath } from "@/utils/path-mentions" -import { SelectDropdown, DropdownOptionType, Button, StandardTooltip } from "@/components/ui" +import { StandardTooltip } from "@/components/ui" import Thumbnails from "../common/Thumbnails" import ModeSelector from "./ModeSelector" +import { ApiConfigSelector } from "./ApiConfigSelector" import { MAX_IMAGES_PER_MESSAGE } from "./ChatView" import ContextMenu from "./ContextMenu" -import { VolumeX, Pin, Check, Image, WandSparkles, SendHorizontal } from "lucide-react" +import { VolumeX, Image, WandSparkles, SendHorizontal } from "lucide-react" import { IndexingStatusBadge } from "./IndexingStatusBadge" import { cn } from "@/lib/utils" import { usePromptHistory } from "./hooks/usePromptHistory" @@ -856,122 +857,11 @@ const ChatTextArea = forwardRef( /> ) - // Helper function to get API config dropdown options - const getApiConfigOptions = useMemo(() => { - const pinnedConfigs = (listApiConfigMeta || []) - .filter((config) => pinnedApiConfigs && pinnedApiConfigs[config.id]) - .map((config) => ({ - value: config.id, - label: config.name, - name: config.name, - type: DropdownOptionType.ITEM, - pinned: true, - })) - .sort((a, b) => a.label.localeCompare(b.label)) - - const unpinnedConfigs = (listApiConfigMeta || []) - .filter((config) => !pinnedApiConfigs || !pinnedApiConfigs[config.id]) - .map((config) => ({ - value: config.id, - label: config.name, - name: config.name, - type: DropdownOptionType.ITEM, - pinned: false, - })) - .sort((a, b) => a.label.localeCompare(b.label)) - - const hasPinnedAndUnpinned = pinnedConfigs.length > 0 && unpinnedConfigs.length > 0 - - return [ - ...pinnedConfigs, - ...(hasPinnedAndUnpinned - ? [ - { - value: "sep-pinned", - label: t("chat:separator"), - type: DropdownOptionType.SEPARATOR, - }, - ] - : []), - ...unpinnedConfigs, - { - value: "sep-2", - label: t("chat:separator"), - type: DropdownOptionType.SEPARATOR, - }, - { - value: "settingsButtonClicked", - label: t("chat:edit"), - type: DropdownOptionType.ACTION, - }, - ] - }, [listApiConfigMeta, pinnedApiConfigs, t]) - // Helper function to handle API config change const handleApiConfigChange = useCallback((value: string) => { - if (value === "settingsButtonClicked") { - vscode.postMessage({ - type: "loadApiConfiguration", - text: value, - values: { section: "providers" }, - }) - } else { - vscode.postMessage({ type: "loadApiConfigurationById", text: value }) - } + vscode.postMessage({ type: "loadApiConfigurationById", text: value }) }, []) - // Helper function to render API config item - const renderApiConfigItem = useCallback( - ({ type, value, label, pinned }: any) => { - if (type !== DropdownOptionType.ITEM) { - return label - } - - const config = listApiConfigMeta?.find((c) => c.id === value) - const isCurrentConfig = config?.name === currentApiConfigName - - return ( -
    -
    - {label} -
    -
    -
    - -
    - - - -
    -
    - ) - }, - [listApiConfigMeta, currentApiConfigName, t, togglePinnedApiConfig], - ) - // Helper function to render non-edit mode controls const renderNonEditModeControls = () => (
    @@ -979,17 +869,16 @@ const ChatTextArea = forwardRef(
    {renderModeSelector()}
    -
    diff --git a/webview-ui/src/components/chat/__tests__/ApiConfigSelector.spec.tsx b/webview-ui/src/components/chat/__tests__/ApiConfigSelector.spec.tsx new file mode 100644 index 0000000000..934d14cc7b --- /dev/null +++ b/webview-ui/src/components/chat/__tests__/ApiConfigSelector.spec.tsx @@ -0,0 +1,418 @@ +import React from "react" +import { render, screen, fireEvent, waitFor } from "@/utils/test-utils" +import { describe, test, expect, vi, beforeEach } from "vitest" +import { ApiConfigSelector } from "../ApiConfigSelector" +import { vscode } from "@/utils/vscode" + +// Mock the dependencies +vi.mock("@/utils/vscode", () => ({ + vscode: { + postMessage: vi.fn(), + }, +})) + +vi.mock("@/i18n/TranslationContext", () => ({ + useAppTranslation: () => ({ + t: (key: string) => key, + }), +})) + +vi.mock("@/components/ui/hooks/useRooPortal", () => ({ + useRooPortal: () => document.body, +})) + +// Mock Popover components to be testable +vi.mock("@/components/ui", () => ({ + Popover: ({ children, open }: any) => ( +
    + {children} +
    + ), + PopoverTrigger: ({ children, disabled, ...props }: any) => ( + + ), + PopoverContent: ({ children }: any) =>
    {children}
    , + StandardTooltip: ({ children }: any) => <>{children}, + Button: ({ children, onClick, ...props }: any) => ( + + ), +})) + +describe("ApiConfigSelector", () => { + const mockOnChange = vi.fn() + const mockTogglePinnedApiConfig = vi.fn() + + const defaultProps = { + value: "config1", + displayName: "Config 1", + onChange: mockOnChange, + listApiConfigMeta: [ + { id: "config1", name: "Config 1" }, + { id: "config2", name: "Config 2" }, + { id: "config3", name: "Config 3" }, + ], + pinnedApiConfigs: { config1: true }, + togglePinnedApiConfig: mockTogglePinnedApiConfig, + } + + beforeEach(() => { + vi.clearAllMocks() + }) + + test("renders correctly with default props", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + expect(trigger).toBeInTheDocument() + expect(trigger).toHaveTextContent("Config 1") + }) + + test("renders with ChevronUp icon", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + // Check for the icon by looking for the codicon span element + const icon = trigger.querySelector(".codicon-chevron-up") + expect(icon).toBeInTheDocument() + }) + + test("handles disabled state correctly", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + expect(trigger).toBeDisabled() + }) + + test("renders with custom title tooltip", () => { + const customTitle = "Custom tooltip text" + render() + + // The component should render with the tooltip wrapper + const trigger = screen.getByTestId("dropdown-trigger") + expect(trigger).toBeInTheDocument() + }) + + test("applies custom trigger className", () => { + const customClass = "custom-trigger-class" + render() + + const trigger = screen.getByTestId("dropdown-trigger") + expect(trigger.className).toContain(customClass) + }) + + test("opens popover when trigger is clicked", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + // Check if popover content is rendered + const popoverContent = screen.getByTestId("popover-content") + expect(popoverContent).toBeInTheDocument() + }) + + test("renders search input when popover is open and more than 6 configs", () => { + const props = { + ...defaultProps, + listApiConfigMeta: [ + { id: "config1", name: "Config 1" }, + { id: "config2", name: "Config 2" }, + { id: "config3", name: "Config 3" }, + { id: "config4", name: "Config 4" }, + { id: "config5", name: "Config 5" }, + { id: "config6", name: "Config 6" }, + { id: "config7", name: "Config 7" }, + ], + } + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + const searchInput = screen.getByPlaceholderText("common:ui.search_placeholder") + expect(searchInput).toBeInTheDocument() + }) + + test("renders info blurb instead of search when 6 or fewer configs", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + // Should not have search input + expect(screen.queryByPlaceholderText("common:ui.search_placeholder")).not.toBeInTheDocument() + // Should have info blurb + expect(screen.getByText("prompts:apiConfiguration.select")).toBeInTheDocument() + }) + + test("filters configs based on search input", async () => { + const props = { + ...defaultProps, + listApiConfigMeta: [ + { id: "config1", name: "Config 1" }, + { id: "config2", name: "Config 2" }, + { id: "config3", name: "Config 3" }, + { id: "config4", name: "Config 4" }, + { id: "config5", name: "Config 5" }, + { id: "config6", name: "Config 6" }, + { id: "config7", name: "Config 7" }, + ], + } + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + const searchInput = screen.getByPlaceholderText("common:ui.search_placeholder") + fireEvent.change(searchInput, { target: { value: "Config 2" } }) + + // Wait for the filtering to take effect + await waitFor(() => { + // Config 2 should be visible + expect(screen.getByText("Config 2")).toBeInTheDocument() + // Config 3 should not be visible (assuming exact match filtering) + expect(screen.queryByText("Config 3")).not.toBeInTheDocument() + }) + }) + + test("shows no results message when search has no matches", async () => { + const props = { + ...defaultProps, + listApiConfigMeta: [ + { id: "config1", name: "Config 1" }, + { id: "config2", name: "Config 2" }, + { id: "config3", name: "Config 3" }, + { id: "config4", name: "Config 4" }, + { id: "config5", name: "Config 5" }, + { id: "config6", name: "Config 6" }, + { id: "config7", name: "Config 7" }, + ], + } + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + const searchInput = screen.getByPlaceholderText("common:ui.search_placeholder") + fireEvent.change(searchInput, { target: { value: "NonExistentConfig" } }) + + await waitFor(() => { + expect(screen.getByText("common:ui.no_results")).toBeInTheDocument() + }) + }) + + test("clears search when X button is clicked", async () => { + const props = { + ...defaultProps, + listApiConfigMeta: [ + { id: "config1", name: "Config 1" }, + { id: "config2", name: "Config 2" }, + { id: "config3", name: "Config 3" }, + { id: "config4", name: "Config 4" }, + { id: "config5", name: "Config 5" }, + { id: "config6", name: "Config 6" }, + { id: "config7", name: "Config 7" }, + ], + } + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + const searchInput = screen.getByPlaceholderText("common:ui.search_placeholder") as HTMLInputElement + fireEvent.change(searchInput, { target: { value: "test" } }) + + expect(searchInput.value).toBe("test") + + // Find and click the X button + const clearButton = screen.getByTestId("popover-content").querySelector(".cursor-pointer") + if (clearButton) { + fireEvent.click(clearButton) + } + + await waitFor(() => { + expect(searchInput.value).toBe("") + }) + }) + + test("calls onChange when a config is selected", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + const config2 = screen.getByText("Config 2") + fireEvent.click(config2) + + expect(mockOnChange).toHaveBeenCalledWith("config2") + }) + + test("shows check mark for selected config", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + // The selected config (config1) should have a check mark + // Use getAllByText since there might be multiple elements with "Config 1" + const config1Elements = screen.getAllByText("Config 1") + // Find the one that's in the dropdown content (not the trigger) + const configInDropdown = config1Elements.find((el) => el.closest('[data-testid="popover-content"]')) + const selectedConfigRow = configInDropdown?.closest("div") + const checkIcon = selectedConfigRow?.querySelector(".codicon-check") + expect(checkIcon).toBeInTheDocument() + }) + + test("separates pinned and unpinned configs", () => { + const props = { + ...defaultProps, + pinnedApiConfigs: { config1: true, config3: true }, + } + + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + const content = screen.getByTestId("popover-content") + const configTexts = content.querySelectorAll(".truncate") + + // Pinned configs should appear first + expect(configTexts[0]).toHaveTextContent("Config 1") + expect(configTexts[1]).toHaveTextContent("Config 3") + // Unpinned config should appear after separator + expect(configTexts[2]).toHaveTextContent("Config 2") + }) + + test("toggles pin status when pin button is clicked", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + // Find the pin button for Config 2 (unpinned) + const config2Row = screen.getByText("Config 2").closest("div") + const pinButton = config2Row?.querySelector("button") + + if (pinButton) { + fireEvent.click(pinButton) + } + + expect(mockTogglePinnedApiConfig).toHaveBeenCalledWith("config2") + expect(vi.mocked(vscode.postMessage)).toHaveBeenCalledWith({ + type: "toggleApiConfigPin", + text: "config2", + }) + }) + + test("opens settings when edit button is clicked", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + // Find the settings button by its icon class within the popover content + const popoverContent = screen.getByTestId("popover-content") + const settingsButton = popoverContent.querySelector('[aria-label="chat:edit"]') as HTMLElement + expect(settingsButton).toBeInTheDocument() + fireEvent.click(settingsButton) + + expect(vi.mocked(vscode.postMessage)).toHaveBeenCalledWith({ + type: "switchTab", + tab: "settings", + }) + }) + + test("renders bottom bar with title and info icon when more than 6 configs", () => { + const props = { + ...defaultProps, + listApiConfigMeta: [ + { id: "config1", name: "Config 1" }, + { id: "config2", name: "Config 2" }, + { id: "config3", name: "Config 3" }, + { id: "config4", name: "Config 4" }, + { id: "config5", name: "Config 5" }, + { id: "config6", name: "Config 6" }, + { id: "config7", name: "Config 7" }, + ], + } + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + // Check for the title + expect(screen.getByText("prompts:apiConfiguration.title")).toBeInTheDocument() + + // Check for the info icon + const infoIcon = screen.getByTestId("popover-content").querySelector(".codicon-info") + expect(infoIcon).toBeInTheDocument() + }) + + test("renders bottom bar with title but no info icon when 6 or fewer configs", () => { + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + // Check for the title + expect(screen.getByText("prompts:apiConfiguration.title")).toBeInTheDocument() + + // Check that info icon is not present + const infoIcon = screen.getByTestId("popover-content").querySelector(".codicon-info") + expect(infoIcon).not.toBeInTheDocument() + }) + + test("handles empty config list gracefully", () => { + const props = { + ...defaultProps, + listApiConfigMeta: [], + } + + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + // Should render info blurb instead of search for empty list + expect(screen.queryByPlaceholderText("common:ui.search_placeholder")).not.toBeInTheDocument() + expect(screen.getByText("prompts:apiConfiguration.select")).toBeInTheDocument() + expect(screen.getByText("prompts:apiConfiguration.title")).toBeInTheDocument() + }) + + test("maintains search value when pinning/unpinning", async () => { + const props = { + ...defaultProps, + listApiConfigMeta: [ + { id: "config1", name: "Config 1" }, + { id: "config2", name: "Config 2" }, + { id: "config3", name: "Config 3" }, + { id: "config4", name: "Config 4" }, + { id: "config5", name: "Config 5" }, + { id: "config6", name: "Config 6" }, + { id: "config7", name: "Config 7" }, + ], + } + render() + + const trigger = screen.getByTestId("dropdown-trigger") + fireEvent.click(trigger) + + const searchInput = screen.getByPlaceholderText("common:ui.search_placeholder") as HTMLInputElement + fireEvent.change(searchInput, { target: { value: "Config" } }) + + // Pin a config + const config2Row = screen.getByText("Config 2").closest("div") + const pinButton = config2Row?.querySelector("button") + if (pinButton) { + fireEvent.click(pinButton) + } + + // Search value should be maintained + expect(searchInput.value).toBe("Config") + }) +}) diff --git a/webview-ui/src/i18n/locales/ca/common.json b/webview-ui/src/i18n/locales/ca/common.json index a7adfc6d20..13ad7a2ca7 100644 --- a/webview-ui/src/i18n/locales/ca/common.json +++ b/webview-ui/src/i18n/locales/ca/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "Cerca..." + "search_placeholder": "Cerca...", + "no_results": "No s'han trobat resultats" }, "mermaid": { "loading": "Generant diagrama mermaid...", diff --git a/webview-ui/src/i18n/locales/de/common.json b/webview-ui/src/i18n/locales/de/common.json index f2a4491534..c873e25d12 100644 --- a/webview-ui/src/i18n/locales/de/common.json +++ b/webview-ui/src/i18n/locales/de/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "Suchen..." + "search_placeholder": "Suchen...", + "no_results": "Keine Ergebnisse gefunden" }, "mermaid": { "loading": "Mermaid-Diagramm wird generiert...", diff --git a/webview-ui/src/i18n/locales/en/common.json b/webview-ui/src/i18n/locales/en/common.json index ab6b3bc07e..af0dfcdf80 100644 --- a/webview-ui/src/i18n/locales/en/common.json +++ b/webview-ui/src/i18n/locales/en/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "Search..." + "search_placeholder": "Search...", + "no_results": "No results found" }, "mermaid": { "loading": "Generating mermaid diagram...", diff --git a/webview-ui/src/i18n/locales/es/common.json b/webview-ui/src/i18n/locales/es/common.json index b4dce90c98..ee0a924d43 100644 --- a/webview-ui/src/i18n/locales/es/common.json +++ b/webview-ui/src/i18n/locales/es/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "Buscar..." + "search_placeholder": "Buscar...", + "no_results": "No se encontraron resultados" }, "mermaid": { "loading": "Generando diagrama mermaid...", diff --git a/webview-ui/src/i18n/locales/fr/common.json b/webview-ui/src/i18n/locales/fr/common.json index c451040cd8..40c12e2afb 100644 --- a/webview-ui/src/i18n/locales/fr/common.json +++ b/webview-ui/src/i18n/locales/fr/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "Rechercher..." + "search_placeholder": "Rechercher...", + "no_results": "Aucun résultat trouvé" }, "mermaid": { "loading": "Génération du diagramme mermaid...", diff --git a/webview-ui/src/i18n/locales/hi/common.json b/webview-ui/src/i18n/locales/hi/common.json index bef23aaecc..227e25637e 100644 --- a/webview-ui/src/i18n/locales/hi/common.json +++ b/webview-ui/src/i18n/locales/hi/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "खोजें..." + "search_placeholder": "खोजें...", + "no_results": "कोई परिणाम नहीं मिला" }, "mermaid": { "loading": "मरमेड डायग्राम जनरेट हो रहा है...", diff --git a/webview-ui/src/i18n/locales/id/common.json b/webview-ui/src/i18n/locales/id/common.json index 42ab59a799..3a3a3f5a78 100644 --- a/webview-ui/src/i18n/locales/id/common.json +++ b/webview-ui/src/i18n/locales/id/common.json @@ -20,7 +20,8 @@ "billion_suffix": "m" }, "ui": { - "search_placeholder": "Cari..." + "search_placeholder": "Cari...", + "no_results": "Tidak ada hasil yang ditemukan" }, "mermaid": { "loading": "Membuat diagram mermaid...", diff --git a/webview-ui/src/i18n/locales/it/common.json b/webview-ui/src/i18n/locales/it/common.json index e32bf2c712..20886d126b 100644 --- a/webview-ui/src/i18n/locales/it/common.json +++ b/webview-ui/src/i18n/locales/it/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "Cerca..." + "search_placeholder": "Cerca...", + "no_results": "Nessun risultato trovato" }, "mermaid": { "loading": "Generazione del diagramma mermaid...", diff --git a/webview-ui/src/i18n/locales/ja/common.json b/webview-ui/src/i18n/locales/ja/common.json index 7c7047dfe8..a7390de32a 100644 --- a/webview-ui/src/i18n/locales/ja/common.json +++ b/webview-ui/src/i18n/locales/ja/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "検索..." + "search_placeholder": "検索...", + "no_results": "結果が見つかりません" }, "mermaid": { "loading": "Mermaidダイアグラムを生成中...", diff --git a/webview-ui/src/i18n/locales/ko/common.json b/webview-ui/src/i18n/locales/ko/common.json index 3aef6758c2..2164c65624 100644 --- a/webview-ui/src/i18n/locales/ko/common.json +++ b/webview-ui/src/i18n/locales/ko/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "검색..." + "search_placeholder": "검색...", + "no_results": "결과를 찾을 수 없습니다" }, "mermaid": { "loading": "머메이드 다이어그램 생성 중...", diff --git a/webview-ui/src/i18n/locales/nl/common.json b/webview-ui/src/i18n/locales/nl/common.json index 2db305d20e..4b72bccb9c 100644 --- a/webview-ui/src/i18n/locales/nl/common.json +++ b/webview-ui/src/i18n/locales/nl/common.json @@ -20,7 +20,8 @@ "billion_suffix": "mrd" }, "ui": { - "search_placeholder": "Zoeken..." + "search_placeholder": "Zoeken...", + "no_results": "Geen resultaten gevonden" }, "mermaid": { "loading": "Mermaid-diagram genereren...", diff --git a/webview-ui/src/i18n/locales/pl/common.json b/webview-ui/src/i18n/locales/pl/common.json index a0cfc9ccd9..6ec9e6661a 100644 --- a/webview-ui/src/i18n/locales/pl/common.json +++ b/webview-ui/src/i18n/locales/pl/common.json @@ -20,7 +20,8 @@ "keep": "Zachowaj" }, "ui": { - "search_placeholder": "Szukaj..." + "search_placeholder": "Szukaj...", + "no_results": "Nie znaleziono wyników" }, "mermaid": { "loading": "Generowanie diagramu mermaid...", diff --git a/webview-ui/src/i18n/locales/pt-BR/common.json b/webview-ui/src/i18n/locales/pt-BR/common.json index 3f922852c7..964ba893f2 100644 --- a/webview-ui/src/i18n/locales/pt-BR/common.json +++ b/webview-ui/src/i18n/locales/pt-BR/common.json @@ -20,7 +20,8 @@ "keep": "Manter" }, "ui": { - "search_placeholder": "Pesquisar..." + "search_placeholder": "Pesquisar...", + "no_results": "Nenhum resultado encontrado" }, "mermaid": { "loading": "Gerando diagrama mermaid...", diff --git a/webview-ui/src/i18n/locales/ru/common.json b/webview-ui/src/i18n/locales/ru/common.json index efdb5e05c6..772b797bba 100644 --- a/webview-ui/src/i18n/locales/ru/common.json +++ b/webview-ui/src/i18n/locales/ru/common.json @@ -20,7 +20,8 @@ "keep": "Оставить" }, "ui": { - "search_placeholder": "Поиск..." + "search_placeholder": "Поиск...", + "no_results": "Результатов не найдено" }, "mermaid": { "loading": "Создание диаграммы mermaid...", diff --git a/webview-ui/src/i18n/locales/tr/common.json b/webview-ui/src/i18n/locales/tr/common.json index a33564663c..7bbb6f3d84 100644 --- a/webview-ui/src/i18n/locales/tr/common.json +++ b/webview-ui/src/i18n/locales/tr/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "Ara..." + "search_placeholder": "Ara...", + "no_results": "Sonuç bulunamadı" }, "mermaid": { "loading": "Mermaid diyagramı oluşturuluyor...", diff --git a/webview-ui/src/i18n/locales/vi/common.json b/webview-ui/src/i18n/locales/vi/common.json index b7d531d71f..2d36482495 100644 --- a/webview-ui/src/i18n/locales/vi/common.json +++ b/webview-ui/src/i18n/locales/vi/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "Tìm kiếm..." + "search_placeholder": "Tìm kiếm...", + "no_results": "Không tìm thấy kết quả nào" }, "mermaid": { "loading": "Đang tạo biểu đồ mermaid...", diff --git a/webview-ui/src/i18n/locales/zh-CN/common.json b/webview-ui/src/i18n/locales/zh-CN/common.json index 5a5ddb0c69..de6d1cd7fe 100644 --- a/webview-ui/src/i18n/locales/zh-CN/common.json +++ b/webview-ui/src/i18n/locales/zh-CN/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "搜索..." + "search_placeholder": "搜索...", + "no_results": "未找到结果" }, "mermaid": { "loading": "生成 Mermaid 图表中...", diff --git a/webview-ui/src/i18n/locales/zh-TW/common.json b/webview-ui/src/i18n/locales/zh-TW/common.json index fa8fc47132..a3949a2a9d 100644 --- a/webview-ui/src/i18n/locales/zh-TW/common.json +++ b/webview-ui/src/i18n/locales/zh-TW/common.json @@ -20,7 +20,8 @@ "billion_suffix": "b" }, "ui": { - "search_placeholder": "搜尋..." + "search_placeholder": "搜尋...", + "no_results": "找不到結果" }, "mermaid": { "loading": "產生 Mermaid 圖表中...", From b73c17a375996d11c8d35ae7e589ab5e4bc649c1 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Sun, 27 Jul 2025 10:20:41 -0600 Subject: [PATCH 30/44] Update issue writer rules and workflow configurations (#6230) --- .roo/rules-issue-writer/1_workflow.xml | 1198 ++++++++++++++--- .../2_github_issue_templates.xml | 403 +++--- .roo/rules-issue-writer/3_best_practices.xml | 146 +- .../4_common_mistakes_to_avoid.xml | 100 +- .../rules-issue-writer/5_github_cli_usage.xml | 137 +- .../6_technical_analysis_workflow.xml | 349 ----- .roomodes | 36 +- 7 files changed, 1540 insertions(+), 829 deletions(-) delete mode 100644 .roo/rules-issue-writer/6_technical_analysis_workflow.xml diff --git a/.roo/rules-issue-writer/1_workflow.xml b/.roo/rules-issue-writer/1_workflow.xml index f24b643e3d..641f19e8a9 100644 --- a/.roo/rules-issue-writer/1_workflow.xml +++ b/.roo/rules-issue-writer/1_workflow.xml @@ -3,14 +3,24 @@ Initialize Issue Creation Process - When the user requests to create an issue, immediately set up a todo list to track the workflow. + IMPORTANT: This mode assumes the first user message is already a request to create an issue. + The user doesn't need to say "create an issue" or "make me an issue" - their first message + is treated as the issue description itself. + + When the session starts, immediately: + 1. Treat the user's first message as the issue description + 2. Initialize the workflow by using the update_todo_list tool + 3. Begin the issue creation process without asking what they want to do + [ ] Detect current repository information + [ ] Determine monorepo context + [ ] Perform initial codebase discovery [ ] Analyze user request to determine issue type - [ ] Gather initial information for the issue + [ ] Gather and verify additional information [ ] Determine if user wants to contribute - [ ] Perform technical analysis (if contributing) + [ ] Perform issue scoping (if contributing) [ ] Draft issue content [ ] Review and confirm with user [ ] Create GitHub issue @@ -21,49 +31,47 @@ - Determine Issue Type + Detect current repository information - Analyze the user's initial request to automatically assess whether they're reporting a bug or proposing a feature. - Look for keywords and context clues: + CRITICAL FIRST STEP: Verify we're in a git repository and get repository information. - Bug indicators: - - Words like "error", "broken", "not working", "fails", "crash", "bug" - - Descriptions of unexpected behavior - - Error messages or stack traces - - References to something that used to work + 1. Check if we're in a git repository: + + git rev-parse --is-inside-work-tree 2>/dev/null || echo "not-git-repo" + - Feature indicators: - - Words like "feature", "enhancement", "add", "implement", "would be nice" - - Descriptions of new functionality - - Suggestions for improvements - - "It would be great if..." + If the output is "not-git-repo", immediately stop and inform the user: - Based on your analysis, order the options with the most likely choice first: + + + This mode must be run from within a GitHub repository. Please navigate to a git repository and try again. + + - - Based on your request, what type of issue would you like to create? - - [If bug indicators found:] - Bug Report - Report a problem with existing functionality - Detailed Feature Proposal - Propose a new feature or enhancement + 2. If in a git repository, get the repository information: + + git remote get-url origin 2>/dev/null | sed -E 's/.*[:/]([^/]+)\/([^/]+)(\.git)?$/\1\/\2/' | sed 's/\.git$//' + - [If feature indicators found:] - Detailed Feature Proposal - Propose a new feature or enhancement - Bug Report - Report a problem with existing functionality + Store this as REPO_FULL_NAME for use throughout the workflow. - [If unclear:] - Bug Report - Report a problem with existing functionality - Detailed Feature Proposal - Propose a new feature or enhancement - - + If no origin remote exists, stop with: + + + No GitHub remote found. This mode requires a GitHub repository with an 'origin' remote configured. + + - After determining the type, update the todo list: + Update todo after detecting repository: - [x] Analyze user request to determine issue type - [-] Gather initial information for the issue + [x] Detect current repository information + [-] Determine monorepo context + [ ] Perform initial codebase discovery + [ ] Analyze user request to determine issue type + [ ] Gather and verify additional information [ ] Determine if user wants to contribute - [ ] Perform technical analysis (if contributing) + [ ] Perform issue scoping (if contributing) [ ] Draft issue content [ ] Review and confirm with user [ ] Create GitHub issue @@ -73,37 +81,48 @@ - Gather Initial Information + Determine Monorepo Context - Based on the user's initial prompt or request, extract key information. - If the user hasn't provided enough detail, use ask_followup_question to gather - the required fields from the appropriate template. + CRITICAL FIRST STEP: Since this is a monorepo, we must establish which specific repository/package + within the monorepo the user is referring to before any codebase exploration. - For Bug Reports, ensure you have: - - App version (ask user to check in VSCode extension panel if unknown) - - API provider being used - - Model being used - - Clear steps to reproduce - - What happened vs what was expected - - Any error messages or logs + First, explore the monorepo structure: + + . + false + - For Feature Requests, ensure you have: - - Specific problem description with impact (who is affected, when it happens, current vs expected behavior, impact) - - Additional context if available (mockups, screenshots, links) + Common monorepo packages to look for: + - apps/ (application packages) + - packages/ (shared packages) + - src/ (main source if not using workspaces) - IMPORTANT: Do NOT ask for solution design, acceptance criteria, or technical details - unless the user explicitly states they want to contribute the implementation. + Based on the user's description, try to identify which package they're referring to. + If unclear, ask for clarification: - Use multiple ask_followup_question calls if needed to gather all information. - Be specific in your questions based on what's missing. + + I see this is a monorepo with multiple packages. Which specific package or application is your issue related to? + + apps/vscode - The main VSCode extension + apps/web-roo-code - The web application + packages/cloud - Cloud functionality + packages/types - Type definitions + Let me describe which package: [specify] + + - After gathering information, update the todo: + Store the monorepo context for all future codebase searches and explorations. + + Update todo after determining context: - [x] Analyze user request to determine issue type - [x] Gather initial information for the issue - [-] Determine if user wants to contribute - [ ] Perform technical analysis (if contributing) + [x] Detect current repository information + [x] Determine monorepo context + [-] Perform initial codebase discovery + [ ] Analyze user request to determine issue type + [ ] Gather and verify additional information + [ ] Determine if user wants to contribute + [ ] Perform issue scoping (if contributing) [ ] Draft issue content [ ] Review and confirm with user [ ] Create GitHub issue @@ -113,33 +132,50 @@ - Determine if User Wants to Contribute + Perform Initial Codebase Discovery - Before exploring the codebase, determine if the user wants to contribute the implementation: + Now that we know the monorepo context, immediately search the codebase to understand + what the user is talking about before determining the issue type. - - Are you interested in implementing this yourself, or are you just reporting the problem for the Roo team to solve? - - Just reporting the problem - the Roo team can design the solution - I want to contribute and implement this myself - I'm not sure yet, but I'd like to provide technical analysis - - + DISCOVERY ACTIVITIES: - Based on their response: - - If just reporting: Skip to step 5 (Draft Issue - Problem Only) - - If contributing: Continue to step 4 (Technical Analysis) - - If providing analysis: Continue to step 4 but make technical sections optional + 1. Extract keywords and concepts from the user's INITIAL MESSAGE (their issue description) + 2. Search the codebase to verify these concepts exist + 3. Build understanding of the actual implementation + 4. Identify relevant files, components, and code patterns - Update the todo based on the decision: + + [Keywords from user's initial message/description] + [Monorepo package path from step 1] + + + Additional searches based on initial findings: + - If error mentioned: search for exact error strings + - If feature mentioned: search for related functionality + - If component mentioned: search for implementation details + + + [monorepo package path] + [specific patterns found in initial search] + + + Document findings: + - Components/features found that match user's description + - Actual implementation details discovered + - Related code sections identified + - Any discrepancies between user description and code reality + + Update todos: - [x] Analyze user request to determine issue type - [x] Gather initial information for the issue - [x] Determine if user wants to contribute - [If contributing: [ ] Perform technical analysis (if contributing)] - [If not contributing: [-] Perform technical analysis (skipped - not contributing)] - [-] Draft issue content + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery + [-] Analyze user request to determine issue type + [ ] Gather and verify additional information + [ ] Determine if user wants to contribute + [ ] Perform issue scoping (if contributing) + [ ] Draft issue content [ ] Review and confirm with user [ ] Create GitHub issue @@ -148,37 +184,54 @@ - Technical Analysis for Contributors + Analyze Request to Determine Issue Type - ONLY perform this step if the user wants to contribute or provide technical analysis. + Using the codebase discoveries from step 2, analyze the user's request to determine + the appropriate issue type with informed context. - This step uses the comprehensive technical analysis sub-workflow defined in - 6_technical_analysis_workflow.xml. The sub-workflow will: + CRITICAL GUIDANCE FOR ISSUE TYPE SELECTION: + For issues that affect user workflows or require behavior changes: + - PREFER the feature proposal template over bug report + - Focus on explaining WHO is affected and WHEN this happens + - Describe the user impact before diving into technical details - 1. Create its own detailed investigation todo list - 2. Perform exhaustive codebase searches using iterative refinement - 3. Analyze all relevant files and dependencies - 4. Form and validate hypotheses about the implementation - 5. Create a comprehensive technical solution - 6. Define detailed acceptance criteria + Based on your findings, classify the issue: - To execute the technical analysis sub-workflow: - - Follow all phases defined in 6_technical_analysis_workflow.xml - - Use the aggressive investigation approach from issue-investigator mode - - Document all findings in extreme detail - - Ensure the analysis is thorough enough for automated implementation + Bug indicators (verified against code): + - Error messages that match actual error handling in code + - Broken functionality in existing features found in codebase + - Regression from previous behavior documented in code/tests + - Code paths that don't work as documented - The sub-workflow will manage its own todo list for the investigation process - and will produce a comprehensive technical analysis section for the issue. + Feature indicators (verified against code): + - New functionality not found in current codebase + - Enhancement to existing features found in code + - Missing capabilities compared to similar features + - Integration points that could be extended + - WORKFLOW IMPROVEMENTS: When existing behavior works but doesn't meet user needs - After completing the technical analysis: + IMPORTANT: Use your codebase findings to inform the question: + + + Based on your request about [specific feature/component found in code], what type of issue would you like to create? + + [Order based on codebase findings and user description] + Bug Report - [Specific component] is not working as expected + Feature Proposal - Add [specific capability] to [existing component] + + + + Update todos: + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery [x] Analyze user request to determine issue type - [x] Gather initial information for the issue - [x] Determine if user wants to contribute - [x] Perform technical analysis (if contributing) - [-] Draft issue content + [-] Gather and verify additional information + [ ] Determine if user wants to contribute + [ ] Perform issue scoping (if contributing) + [ ] Draft issue content [ ] Review and confirm with user [ ] Create GitHub issue @@ -187,113 +240,709 @@ - Draft Issue Content + Gather and Verify Additional Information - Create the issue body based on whether the user is just reporting or contributing. + Based on the issue type and initial codebase discovery, gather information while + continuously verifying against the actual code implementation. - For Bug Reports, format is the same regardless of contribution intent: - ``` - ## App Version - [version from user] + CRITICAL FOR FEATURE REQUESTS: Be fact-driven and challenge assumptions! + When users describe current behavior as problematic for a feature request, you MUST verify + their claims against the actual code. If their description doesn't match reality, this + might actually be a bug report, not a feature request. - ## API Provider - [provider from dropdown list] + For Bug Reports: + 1. When user describes steps to reproduce: + - Search for the UI components/commands mentioned + - Verify the code paths that would be executed + - Check for existing error handling or known issues + + 2. When user provides error messages: + - Search for exact error strings in codebase + - Find where errors are thrown + - Understand the conditions that trigger them + + 3. For version information: + - Check package.json for actual version + - Look for version-specific code or migrations - ## Model Used - [exact model name] + Example verification searches: + + [monorepo package path] + [exact error message from user] + - ## 🔁 Steps to Reproduce + + [feature or component name] implementation + [monorepo package path] + - 1. [First step with specific details] - 2. [Second step with exact actions] - 3. [Continue numbering all steps] + For Feature Requests - AGGRESSIVE VERIFICATION WITH CONCRETE EXAMPLES: + 1. When user claims current behavior is X: + - ALWAYS search for the actual implementation + - Read the relevant code to verify their claim + - Check CSS/styling files if UI-related + - Look at configuration files + - Examine test files to understand expected behavior + - TRACE THE DATA FLOW: Follow values from where they're calculated to where they're used + + 2. CRITICAL: Look for existing variables/code that could be reused: + - Search for variables that are calculated but not used where expected + - Identify existing patterns that could be extended + - Find similar features that work correctly for comparison + + 3. If discrepancy found between claim and code: + - Do NOT proceed without clarification + - Present CONCRETE before/after examples with actual values + - Show exactly what happens vs what should happen + - Ask if this might be a bug instead + + Example verification approach: + User says: "Feature X doesn't work properly" - Include: - - Exact button clicks or menu selections - - Specific input text or prompts used - - File names and paths involved - - Any settings or configuration + Your investigation should follow this pattern: + a) What is calculated: Search for where X is computed/defined + b) Where it's stored: Find variables/state holding the value + c) Where it's used: Trace all usages of that value + d) What's missing: Identify gaps in the flow - ## 💥 Outcome Summary + Present findings with concrete examples: - Expected: [what should have happened] - Actual: [what actually happened] + + I investigated the implementation and found something interesting: - ## 📄 Relevant Logs or Errors + Current behavior: + - The value is calculated at [file:line]: `value = computeX()` + - It's stored in variable `calculatedValue` at [file:line] + - BUT it's only used for [purpose A] at [file:line] + - It's NOT used for [purpose B] where you expected it - ```[language] - [paste any error messages or logs] - ``` + Concrete example: + - When you do [action], the system calculates [value] + - This value goes to [location A] + - But [location B] still uses [old/different value] - [If user is contributing, add the comprehensive technical analysis section from step 4] - ``` + Is this the issue you're experiencing? This seems like the calculated value isn't being used where it should be. + + Yes, exactly! The value is calculated but not used in the right place + No, the issue is that the calculation itself is wrong + Actually, I see now that [location B] should use a different value + + - For Feature Requests - PROBLEM REPORTERS (not contributing): - ``` - ## What specific problem does this solve? + 4. Continue verification until facts are established: + - If user confirms it's a bug, switch to bug report workflow + - If user provides more specific context, search again + - Do not accept vague claims without code verification + + 5. For genuine feature requests after verification: + - Document what the code currently does (with evidence and line numbers) + - Show the exact data flow: input → processing → output + - Confirm what the user wants changed with concrete examples + - Ensure the request is based on accurate understanding - [Detailed problem description following the template guidelines] + CRITICAL: For feature requests, if user's description doesn't match codebase reality: + - Challenge the assumption with code evidence AND concrete examples + - Show actual vs expected behavior with specific values + - Suggest it might be a bug if code shows different intent + - Ask for clarification repeatedly if needed + - Do NOT proceed until facts are established - **Who is affected:** [user groups] - **When this happens:** [specific scenarios] - **Current behavior:** [what happens now] - **Expected behavior:** [what should happen] - **Impact:** [time wasted, errors, productivity loss] + Only proceed when you have: + - Verified current behavior in code with line-by-line analysis + - Confirmed user's understanding matches reality + - Determined if it's truly a feature request or actually a bug + - Identified any existing code that could be reused for the fix - ## Additional context - - [Any mockups, screenshots, links, or other supporting information] - ``` - - For Feature Requests - CONTRIBUTORS (implementing the feature): - ``` - ## What specific problem does this solve? - - [Detailed problem description following the template guidelines] - - **Who is affected:** [user groups] - **When this happens:** [specific scenarios] - **Current behavior:** [what happens now] - **Expected behavior:** [what should happen] - **Impact:** [time wasted, errors, productivity loss] - - ## Additional context - - [Any mockups, screenshots, links, or other supporting information] - - --- - - ## 🛠️ Contributing & Technical Analysis - - ✅ **I'm interested in implementing this feature** - ✅ **I understand this needs approval before implementation begins** - - [Insert the comprehensive technical analysis section from step 4, including:] - - Root cause / Implementation target - - Affected components with file paths and line numbers - - Current implementation analysis - - Detailed proposed implementation steps - - Code architecture considerations - - Testing requirements - - Performance impact - - Security considerations - - Migration strategy - - Rollback plan - - Dependencies and breaking changes - - Implementation complexity assessment - - ## Acceptance Criteria - - [Insert the detailed acceptance criteria from the technical analysis] - ``` - - After drafting: + Update todos after verification: + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery [x] Analyze user request to determine issue type - [x] Gather initial information for the issue + [x] Gather and verify additional information + [-] Determine if user wants to contribute + [ ] Perform issue scoping (if contributing) + [ ] Draft issue content + [ ] Review and confirm with user + [ ] Create GitHub issue + + + + + + + Determine Contribution Intent with Context + + Before asking about contribution, perform a quick technical assessment to provide context: + + 1. Search for complexity indicators: + - Number of files that would need changes + - Existing tests that would need updates + - Dependencies and integration points + + 2. Look for contribution helpers: + - CONTRIBUTING.md guidelines + - Existing similar implementations + - Test patterns to follow + + + CONTRIBUTING guide setup development + + + Based on findings, provide informed context in the question: + + + Based on my analysis, this [issue type] involves [brief complexity assessment from code exploration]. Are you interested in implementing this yourself, or are you reporting it for the Roo team to handle? + + Just reporting the problem - the Roo team can design the solution + I want to contribute and implement this myself + I'd like to provide issue scoping to help whoever implements it + + + + Update todos based on response: + + + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery + [x] Analyze user request to determine issue type + [x] Gather and verify additional information [x] Determine if user wants to contribute - [x] Perform technical analysis (if contributing) + [If contributing: [-] Perform issue scoping (if contributing)] + [If not contributing: [-] Perform issue scoping (skipped - not contributing)] + [-] Draft issue content + [ ] Review and confirm with user + [ ] Create GitHub issue + + + + + + + Issue Scoping for Contributors + + ONLY perform this step if the user wants to contribute or provide issue scoping. + + This step performs a comprehensive, aggressive investigation to create detailed technical + scoping that can guide implementation. The process involves multiple sub-phases: + + + + Perform an exhaustive investigation to produce a comprehensive technical solution + with extreme detail, suitable for automated fix workflows. + + + + Expand the todo list to include detailed investigation steps + + When starting the issue scoping phase, update the main todo list to include + the detailed investigation steps: + + + + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery + [x] Analyze user request to determine issue type + [x] Gather and verify additional information + [x] Determine if user wants to contribute + [-] Perform issue scoping (if contributing) + [ ] Extract keywords from the issue description + [ ] Perform initial broad codebase search + [ ] Analyze search results and identify key components + [ ] Deep dive into relevant files and implementations + [ ] Form initial hypothesis about the issue/feature + [ ] Attempt to disprove hypothesis through further investigation + [ ] Identify all affected files and dependencies + [ ] Map out the complete implementation approach + [ ] Document technical risks and edge cases + [ ] Formulate comprehensive technical solution + [ ] Create detailed acceptance criteria + [ ] Prepare issue scoping summary + [ ] Draft issue content + [ ] Review and confirm with user + [ ] Create GitHub issue + + + + + + + Extract all relevant keywords, concepts, and technical terms + + - Identify primary technical concepts from user's description + - Extract error messages or specific symptoms + - Note any mentioned file paths or components + - List related features or functionality + - Include synonyms and related terms + + + Update the main todo list to mark "Extract keywords" as complete and move to next phase + + + + + Perform multiple rounds of increasingly focused searches + + + Use codebase_search with all extracted keywords to get an overview of relevant code. + + [Combined keywords from extraction phase] + [Monorepo package path] + + + + + Based on initial results, identify key components and search for: + - Related class/function definitions + - Import statements and dependencies + - Configuration files + - Test files that might reveal expected behavior + + + + Search for specific implementation details: + - Error handling patterns + - State management + - API endpoints or routes + - Database queries or models + - UI components and their interactions + + + + Look for: + - Edge cases in the code + - Integration points with other systems + - Configuration options that affect behavior + - Feature flags or conditional logic + + + + After completing all search iterations, update the todo list to show progress + + + + + Thoroughly analyze all relevant files discovered + + - Use list_code_definition_names to understand file structure + - Read complete files to understand full context + - Trace execution paths through the code + - Identify all dependencies and imports + - Map relationships between components + + + Document findings including: + - File paths and their purposes + - Key functions and their responsibilities + - Data flow through the system + - External dependencies + - Potential impact areas + + + + + Form a comprehensive hypothesis about the issue or feature + + - Identify the most likely root cause + - Trace the bug through the execution path + - Determine why the current implementation fails + - Consider environmental factors + + + - Identify the optimal integration points + - Determine required architectural changes + - Plan the implementation approach + - Consider scalability and maintainability + + + + + Aggressively attempt to disprove the hypothesis + + + - Look for similar features implemented differently + - Check for deprecated code that might interfere + + + - Search for configuration that could change behavior + - Look for environment-specific code paths + + + - Find existing tests that might contradict hypothesis + - Look for test cases that reveal edge cases + + + - Search for comments explaining design decisions + - Look for TODO or FIXME comments related to the area + + + + If hypothesis is disproven, return to search phase with new insights. + If hypothesis stands, proceed to solution formulation. + + + + + Create a comprehensive technical solution - PRIORITIZE SIMPLICITY + + CRITICAL: Before proposing any solution, ask yourself: + 1. What existing variables/functions can I reuse? + 2. What's the minimal change that fixes the issue? + 3. Can I leverage existing patterns in the codebase? + 4. Is there a simpler approach I'm overlooking? + + The best solution often reuses existing code rather than creating new complexity. + + + + ALWAYS consider backwards compatibility: + 1. Will existing data/configurations still work with the new code? + 2. Can we detect and handle legacy formats automatically? + 3. What migration paths are needed for existing users? + 4. Are there ways to make changes additive rather than breaking? + 5. Document any compatibility considerations clearly + + + + FIRST, identify what can be reused: + - Variables that are already calculated but not used where needed + - Functions that already do what we need + - Patterns in similar features we can follow + - Configuration that already exists but isn't applied + + Example finding: + "The variable `calculatedValue` already contains what we need at line X, + we just need to use it at line Y instead of recalculating" + + + + - Start with the SIMPLEST possible fix + - Exact files to modify with line numbers + - Prefer changing variable usage over creating new logic + - Specific code changes required (minimal diff) + - Order of implementation steps + - Migration strategy if needed + + + + - All files that import affected code + - API contracts that must be maintained + - Existing tests that validate current behavior + - Configuration changes required (prefer reusing existing) + - Documentation updates needed + + + + - Unit tests to add or modify + - Integration tests required + - Edge cases to test + - Performance testing needs + - Manual testing scenarios + + + + - Breaking changes identified + - Performance implications + - Security considerations + - Backward compatibility issues + - Rollback strategy + + + + + + Create extremely detailed acceptance criteria + + Given [detailed context including system state] + When [specific user or system action] + Then [exact expected outcome] + And [additional verifiable outcomes] + But [what should NOT happen] + + Include: + - Specific UI changes with exact text/behavior + - API response formats + - Database state changes + - Performance requirements + - Error handling scenarios + + + - Each criterion must be independently testable + - Include both positive and negative test cases + - Specify exact error messages and codes + - Define performance thresholds where applicable + + + + + Format the comprehensive issue scoping section + + + + + Additional monorepo considerations: + - Scope all searches to the identified monorepo package + - Check for cross-package dependencies + - Verify against package-specific conventions + - Look for package-specific configuration + - Check if changes affect multiple packages + - Identify shared dependencies that might be impacted + - Look for workspace-specific scripts or tooling + - Consider package versioning implications + + After completing the comprehensive issue scoping, update the main todo list to show + all investigation steps are complete: + + + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery + [x] Analyze user request to determine issue type + [x] Gather and verify additional information + [x] Determine if user wants to contribute + [x] Perform issue scoping (if contributing) + [x] Extract keywords from the issue description + [x] Perform initial broad codebase search + [x] Analyze search results and identify key components + [x] Deep dive into relevant files and implementations + [x] Form initial hypothesis about the issue/feature + [x] Attempt to disprove hypothesis through further investigation + [x] Identify all affected files and dependencies + [x] Map out the complete implementation approach + [x] Document technical risks and edge cases + [x] Formulate comprehensive technical solution + [x] Create detailed acceptance criteria + [x] Prepare issue scoping summary + [-] Draft issue content + [ ] Review and confirm with user + [ ] Create GitHub issue + + + + + + + Check for Repository Issue Templates + + Check if the repository has custom issue templates and use them. If not, create a simple generic template. + + 1. Check for issue templates in standard locations: + + .github/ISSUE_TEMPLATE + true + + + 2. Also check for single template file: + + .github + false + + + Look for files like: + - .github/ISSUE_TEMPLATE/*.md + - .github/ISSUE_TEMPLATE/*.yml + - .github/ISSUE_TEMPLATE/*.yaml + - .github/issue_template.md + - .github/ISSUE_TEMPLATE.md + + 3. If templates are found: + a. Parse the template files to extract: + - Template name and description + - Required fields + - Template body structure + - Labels to apply + + b. For YAML templates, look for: + - name: Template display name + - description: Template description + - labels: Default labels + - body: Form fields or markdown template + + c. For Markdown templates, look for: + - Front matter with metadata + - Template structure with placeholders + + 4. If multiple templates exist, ask user to choose: + + I found the following issue templates in this repository. Which one would you like to use? + + [Template 1 name]: [Template 1 description] + [Template 2 name]: [Template 2 description] + + + + 5. If no templates are found: + - Create a simple generic template based on issue type + - For bugs: Basic structure with description, steps to reproduce, expected vs actual + - For features: Problem description, proposed solution, impact + + 6. Store the selected/created template information: + - Template content/structure + - Required fields + - Default labels + - Any special formatting requirements + + Update todos: + + + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery + [x] Analyze user request to determine issue type + [x] Gather and verify additional information + [x] Determine if user wants to contribute + [x] Perform issue scoping (if contributing) + [x] Check for repository issue templates + [-] Draft issue content + [ ] Review and confirm with user + [ ] Create GitHub issue + + + + + + + Draft Issue Content + + Create the issue body using the template from step 8 and all verified information from codebase exploration. + + If using a repository template: + - Fill in the template fields with gathered information + - Include code references and findings where appropriate + - Respect the template's structure and formatting + + If using a generated template (no repo templates found): + + For Bug Reports: + ``` + ## Description + [Clear description of the bug with code context] + + ## Steps to Reproduce + 1. [Step with relevant code paths] + 2. [Step with component references] + 3. [Continue with specific details] + + ## Expected Behavior + [What should happen based on code logic] + + ## Actual Behavior + [What actually happens] + + ## Additional Context + - Version: [from package.json if found] + - Environment: [any relevant details] + - Error logs: [if any] + + ## Code Investigation + [Include findings from codebase exploration] + - Relevant files: [list with line numbers] + - Possible cause: [hypothesis from code review] + + [If user is contributing, add the comprehensive issue scoping section from step 7] + ``` + + For Feature Requests: + ``` + ## Problem Description + [What problem does this solve, who is affected, when it happens] + + ## Current Behavior + [How it works now with specific examples] + + ## Proposed Solution + [What should change] + + ## Impact + [Who benefits and how] + + ## Technical Context + [Findings from codebase exploration] + - Similar features: [code references] + - Integration points: [from exploration] + - Architecture considerations: [if any] + + [If contributing, add the comprehensive issue scoping section from step 7] + ``` + + Update todos: + + + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery + [x] Analyze user request to determine issue type + [x] Gather and verify additional information + [x] Determine if user wants to contribute + [x] Perform issue scoping (if contributing) + [x] Check for repository issue templates [x] Draft issue content [-] Review and confirm with user [ ] Create GitHub issue @@ -302,19 +951,26 @@ - + Review and Confirm with User - Present the complete drafted issue to the user for review: + Present the complete drafted issue to the user for review, highlighting the + code-verified information: - I've prepared the following GitHub issue. Please review it carefully: + I've prepared the following GitHub issue based on my analysis of the codebase and your description. I've verified the technical details against the actual implementation. Please review: [Show the complete formatted issue content] + Key verifications made: + - ✓ Component locations confirmed in code + - ✓ Error messages matched to source + - ✓ Architecture compatibility checked + [List other relevant verifications] + Would you like me to create this issue, or would you like to make any changes? - Yes, create this issue in RooCodeInc/Roo-Code + Yes, create this issue in the detected repository Modify the problem description Add more technical details Change the title to: [let me specify] @@ -326,57 +982,161 @@ After confirmation: + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery [x] Analyze user request to determine issue type - [x] Gather initial information for the issue + [x] Gather and verify additional information [x] Determine if user wants to contribute - [x] Perform technical analysis (if contributing) + [x] Perform issue scoping (if contributing) [x] Draft issue content [x] Review and confirm with user - [-] Create GitHub issue + [-] Prepare issue for submission + [ ] Handle submission choice - - Create GitHub Issue + + Prepare Issue for Submission - Once user confirms, create the issue using the GitHub CLI: + Once user confirms the issue content, prepare it for submission: - First, save the issue body to a temporary file: + First, perform final duplicate check with refined search based on our findings: - cat > /tmp/issue_body.md << 'EOF' -[The complete formatted issue body from step 5] -EOF + gh issue list --repo $REPO_FULL_NAME --search "[key terms from verified analysis]" --state all --limit 10 - Then create the issue: - - gh issue create --repo RooCodeInc/Roo-Code --title "[Create a descriptive title based on the issue content]" --body-file /tmp/issue_body.md --label "bug" - + If no exact duplicates are found, save the issue content to a temporary file within the project: - For feature requests, use labels "proposal,enhancement": - - gh issue create --repo RooCodeInc/Roo-Code --title "[Create a descriptive title based on the issue content]" --body-file /tmp/issue_body.md --label "proposal" --label "enhancement" - + + github_issue_draft.md + [The complete formatted issue body from step 7] + [calculated line count] + - The command will return the issue URL. Inform the user of the created issue number and URL. + After saving the issue draft, ask the user how they would like to proceed: - Clean up the temporary file: - - rm /tmp/issue_body.md - + + I've saved the issue draft to github_issue_draft.md. The issue is ready for submission with the following details: + + Title: "[Descriptive title with component name]" + Labels: [appropriate labels based on issue type] + Repository: $REPO_FULL_NAME + + How would you like to proceed? + + Submit the issue now to the repository + Let me make some edits to the issue first + I'll submit it manually later + + - Complete the workflow: + Based on the user's response: + + If "Submit the issue now": + - Use gh issue create with the saved file + - Provide the created issue URL and number + - Clean up the temporary file + - Complete the workflow + + If "Let me make some edits": + - Ask what changes they'd like to make + - Update the draft file with their changes + - Return to the submission question + + If "I'll submit it manually": + - Inform them the draft is saved at .tmp/github_issue_draft.md + - Provide the gh command they can use later + - Complete the workflow without submission + + Update todos based on the outcome: + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery [x] Analyze user request to determine issue type - [x] Gather initial information for the issue + [x] Gather and verify additional information [x] Determine if user wants to contribute - [x] Perform technical analysis (if contributing) + [x] Perform issue scoping (if contributing) [x] Draft issue content [x] Review and confirm with user - [x] Create GitHub issue + [x] Prepare issue for submission + [-] Handle submission choice + + + + + + + Handle Submission Choice + + This step handles the user's choice from step 9. + + OPTION 1: Submit the issue now + If the user chooses to submit immediately: + + + gh issue create --repo $REPO_FULL_NAME --title "[Descriptive title]" --body-file github_issue_draft.md --label "[appropriate labels]" + + + Label selection based on findings: + - Bug: "bug", potentially "regression" if code shows it worked before + - Feature: "proposal", "enhancement", potentially package-specific labels + - Add "monorepo" label if affects multiple packages + + After successful creation: + - Capture and display the issue URL + - Clean up the temporary file: + + rm github_issue_draft.md + + - Provide a summary of key findings included + + OPTION 2: Make edits + If the user wants to edit: + + + What changes would you like to make to the issue? + + Update the title + Modify the problem description + Add or remove technical details + Change the labels or other metadata + + + + - Apply the requested changes to the draft + - Update the file with write_to_file + - Return to step 9 to ask about submission again + + OPTION 3: Manual submission + If the user will submit manually: + + Provide clear instructions: + "The issue draft has been saved to github_issue_draft.md + + To submit it later, you can use: + gh issue create --repo $REPO_FULL_NAME --title "[Your title]" --body-file github_issue_draft.md --label "[labels]" + + Or you can copy the content and create the issue through the GitHub web interface." + + Final todo update: + + + [x] Detect current repository information + [x] Determine monorepo context + [x] Perform initial codebase discovery + [x] Analyze user request to determine issue type + [x] Gather and verify additional information + [x] Determine if user wants to contribute + [x] Perform issue scoping (if contributing) + [x] Draft issue content + [x] Review and confirm with user + [x] Prepare issue for submission + [x] Handle submission choice diff --git a/.roo/rules-issue-writer/2_github_issue_templates.xml b/.roo/rules-issue-writer/2_github_issue_templates.xml index 3130f2026e..36b44125dd 100644 --- a/.roo/rules-issue-writer/2_github_issue_templates.xml +++ b/.roo/rules-issue-writer/2_github_issue_templates.xml @@ -1,219 +1,190 @@ - - Bug Report - Clearly report a bug with detailed repro steps - ["bug"] - - - - What version of Roo Code are you using? (e.g., v3.3.1) - - - - - - Anthropic - - AWS Bedrock - - Chutes AI - - DeepSeek - - Glama - - Google Gemini - - Google Vertex AI - - Groq - - Human Relay Provider - - LiteLLM - - LM Studio - - Mistral AI - - Ollama - - OpenAI - - OpenAI Compatible - - OpenRouter - - Requesty - - Unbound - - VS Code Language Model API - - xAI (Grok) - - Not Applicable / Other - - - - - Exact model name (e.g., Claude 3.7 Sonnet). Use N/A if irrelevant. - - - - - Help us see what you saw. Give clear, numbered steps: - - 1. Setup (OS, extension version, settings) - 2. Exact actions (clicks, input, files, commands) - 3. What happened after each step - - Think like you're writing a recipe. Without this, we can't reproduce the issue. - - - - - - Recap what went wrong in one or two lines. - - Example: "Expected code to run, but got an empty response and no error." - - Expected ___, but got ___. - - - - Paste API logs, terminal output, or errors here. Use triple backticks (```) for code formatting. - shell - - - - - - Detailed Feature Proposal - Report a specific problem that needs solving in Roo Code - ["proposal", "enhancement"] - - - - - **Be concrete and detailed.** Explain the problem from a user's perspective. - - ✅ **Good examples (specific, clear impact):** - - "When running large tasks, users wait 5+ minutes because tasks execute sequentially instead of in parallel, blocking productivity" - - "AI can only read one file per request, forcing users to make multiple requests for multi-file projects, increasing wait time from 30s to 5+ minutes" - - "Dark theme users can't see the submit button because it uses white text on light grey background" - - ❌ **Poor examples (vague, unclear impact):** - - "The UI looks weird" -> What specifically looks weird? On which screen? What's the impact? - - "System prompt is not good" -> What's wrong with it? What behaviour does it cause? What should it do instead? - - "Performance could be better" -> Where? How slow is it currently? What's the user impact? - - **Your problem description should answer:** - - Who is affected? (all users, specific user types, etc.) - - When does this happen? (specific scenarios/steps) - - What's the current behaviour vs expected behaviour? - - What's the impact? (time wasted, errors caused, etc.) - - Be specific about the problem, who it affects, and the impact. Avoid generic statements like "it's slow" or "it's confusing." - - - - Mockups, screenshots, links, user quotes, or other relevant information that supports your proposal. - - + + This mode prioritizes using repository-specific issue templates over hardcoded ones. + If no templates exist in the repository, simple generic templates are created on the fly. + + + + + .github/ISSUE_TEMPLATE/*.yml + .github/ISSUE_TEMPLATE/*.yaml + .github/ISSUE_TEMPLATE/*.md + .github/issue_template.md + .github/ISSUE_TEMPLATE.md + - - - - - **Important:** If you check "Yes" below, the technical sections become REQUIRED. - We need detailed technical analysis from contributors to ensure quality implementation. - - - - - - - - - - - **If you want to implement this feature, this section is REQUIRED.** - - **Describe your solution in detail.** Explain not just what to build, but how it should work. - - ✅ **Good examples:** - - "Add parallel task execution: Allow up to 3 tasks to run simultaneously with a queue system for additional tasks. Show progress for each active task in the UI." - - "Enable multi-file AI processing: Modify the request handler to accept multiple files in a single request and process them together, reducing round trips." - - "Fix button contrast: Change submit button to use primary colour on dark theme (white text on blue background) instead of current grey." - - ❌ **Poor examples:** - - "Make it faster" -> How? What specific changes? - - "Improve the UI" -> Which part? What specific improvements? - - "Fix the prompt" -> What should the new prompt do differently? - - **Your solution should explain:** - - What exactly will change? - - How will users interact with it? - - What will the new behaviour look like? - - Describe the specific changes and how they will work. Include user interaction details if relevant. - - - - - **If you want to implement this feature, this section is REQUIRED.** - - **This is crucial - don't skip it.** Define what "working" looks like with specific, testable criteria. - - **Format suggestion:** - ``` - Given [context/situation] - When [user action] - Then [expected result] - And [additional expectations] - But [what should NOT happen] - ``` - - **Example:** - ``` - Given I have 5 large tasks to run - When I start all of them - Then they execute in parallel (max 3 at once, can be configured) - And I see progress for each active task - And queued tasks show "waiting" status - But the UI doesn't freeze or become unresponsive - ``` - - - Define specific, testable criteria. What should users be able to do? What should happen? What should NOT happen? - Use the Given/When/Then format above or your own clear structure. - - - - - - **If you want to implement this feature, this section is REQUIRED.** - - Share technical insights that could help planning: - - Implementation approach or architecture changes - - Performance implications - - Compatibility concerns - - Systems that might be affected - - Potential blockers you can foresee - - e.g., "Will need to refactor task manager", "Could impact memory usage on large files", "Requires a large portion of code to be rewritten" - - - - - **If you want to implement this feature, this section is REQUIRED.** - - What could go wrong or what alternatives did you consider? - - Alternative approaches and why you chose this one - - Potential negative impacts (performance, UX, etc.) - - Breaking changes or migration concerns - - Edge cases that need careful handling - - e.g., "Alternative: use library X but it is 500KB larger", "Risk: might slow older devices", "Breaking: changes API response format" - - - - - - - Template now focuses on problem reporting first, with solution contribution as optional - - - Only problem description and context are required for basic submission - - - Technical fields (solution, acceptance criteria, etc.) are only required if user wants to contribute - - - Users can submit after describing the problem without technical details - - - Implementation guidance moved to contributor section only - - + + Display name of the template + Brief description of when to use this template + Default issue title (optional) + Array of labels to apply + Array of default assignees + Array of form elements or markdown content + + + + + Static markdown content + + The markdown content to display + + + + + Single-line text input + + Unique identifier + Display label + Help text + Placeholder text + Default value + Boolean + + + + + Multi-line text input + + Unique identifier + Display label + Help text + Placeholder text + Default value + Boolean + Language for syntax highlighting + + + + + Dropdown selection + + Unique identifier + Display label + Help text + Array of options + Boolean + + + + + Multiple checkbox options + + Unique identifier + Display label + Help text + Array of checkbox items + + + + + + + Optional YAML front matter with: + - name: Template name + - about: Template description + - title: Default title + - labels: Comma-separated or array + - assignees: Comma-separated or array + + + Markdown content with sections and placeholders + Common patterns: + - Headers with ## + - Placeholder text in brackets or as comments + - Checklists with - [ ] + - Code blocks with ``` + + + + + + + When no repository templates exist, create simple templates based on issue type. + These should be minimal and focused on gathering essential information. + + + + + - Description: Clear explanation of the bug + - Steps to Reproduce: Numbered list + - Expected Behavior: What should happen + - Actual Behavior: What actually happens + - Additional Context: Version, environment, logs + - Code Investigation: Findings from exploration (if any) + + ["bug"] + + + + + - Problem Description: What problem this solves + - Current Behavior: How it works now + - Proposed Solution: What should change + - Impact: Who benefits and how + - Technical Context: Code findings (if any) + + ["enhancement", "proposal"] + + + + + + When parsing YAML templates: + 1. Use a YAML parser to extract the structure + 2. Convert form elements to markdown sections + 3. Preserve required field indicators + 4. Include descriptions as help text + 5. Maintain the intended flow of the template + + + + When parsing Markdown templates: + 1. Extract front matter if present + 2. Identify section headers + 3. Look for placeholder patterns + 4. Preserve formatting and structure + 5. Replace generic placeholders with user's information + + + + For template selection: + 1. If only one template exists, use it automatically + 2. If multiple exist, let user choose based on name/description + 3. Match template to issue type when possible (bug vs feature) + 4. Respect template metadata (labels, assignees, etc.) + + + + + + Fill templates intelligently using gathered information: + - Map user's description to appropriate sections + - Include code investigation findings where relevant + - Preserve template structure and formatting + - Don't leave placeholder text unfilled + - Add contributor scoping if user is contributing + + + + + + + + + + + + + When no templates exist, create appropriate generic templates on the fly. + Keep them simple and focused on essential information. + + + + - Don't overwhelm with too many fields + - Focus on problem description first + - Include technical details only if user is contributing + - Use clear, simple section headers + - Adapt based on issue type (bug vs feature) + + \ No newline at end of file diff --git a/.roo/rules-issue-writer/3_best_practices.xml b/.roo/rules-issue-writer/3_best_practices.xml index 6d70cba144..f2f149ed26 100644 --- a/.roo/rules-issue-writer/3_best_practices.xml +++ b/.roo/rules-issue-writer/3_best_practices.xml @@ -1,38 +1,172 @@ + + - CRITICAL: This mode assumes the user's FIRST message is already an issue description + - Do NOT ask "What would you like to do?" or "Do you want to create an issue?" + - Immediately start the issue creation workflow when the user begins talking + - Treat their initial message as the problem/feature description + - Begin with repository detection and codebase discovery right away + - The user is already in "issue creation mode" by choosing this mode + + + + - ALWAYS check for repository-specific issue templates before creating issues + - Use templates from .github/ISSUE_TEMPLATE/ directory if they exist + - Parse both YAML (.yml/.yaml) and Markdown (.md) template formats + - If multiple templates exist, let the user choose the appropriate one + - If no templates exist, create a simple generic template on the fly + - NEVER fall back to hardcoded templates - always use repo templates or generate minimal ones + - Respect template metadata like labels, assignees, and title patterns + - Fill templates intelligently using gathered information from codebase exploration + + - Focus on helping users describe problems clearly, not solutions - - The Roo team will design solutions unless the user explicitly wants to contribute + - The project team will design solutions unless the user explicitly wants to contribute - Don't push users to provide technical details they may not have - Make it easy for non-technical users to report issues effectively + + CRITICAL: Lead with user impact: + - Always explain WHO is affected and WHEN the problem occurs + - Use concrete examples with actual values, not abstractions + - Show before/after scenarios with specific data + - Example: "Users trying to [action] see [actual result] instead of [expected result]" + + - ALWAYS verify user claims against actual code implementation + - For feature requests, aggressively check if current behavior matches user's description + - If code shows different intent than user describes, it might be a bug not a feature + - Present code evidence when challenging user assumptions + - Do not be agreeable - be fact-driven and question discrepancies + - Continue verification until facts are established + - A "feature request" where code shows the feature should already work is likely a bug + + CRITICAL additions for thorough analysis: + - Trace data flow from where values are created to where they're used + - Look for existing variables/functions that already contain needed data + - Check if the issue is just missing usage of existing code + - Follow imports and exports to understand data availability + - Identify patterns in similar features that work correctly + + - Always search for existing similar issues before creating a new one - - Search GitHub Discussions (especially feature-requests category) for related topics + - Check for and use repository issue templates before creating content - Include specific version numbers and environment details - Use code blocks with syntax highlighting for code snippets - Make titles descriptive but concise (e.g., "Dark theme: Submit button invisible due to white-on-grey text") - For bugs, always test if the issue is reproducible - Include screenshots or mockups when relevant (ask user to provide) - Link to related issues or PRs if found during exploration - - Add "Closes #[number]" for discussions that would be fully addressed by the issue - - Add "Related to #[number]" for partially related discussions + + CRITICAL: Use concrete examples throughout: + - Show actual data values, not just descriptions + - Include specific file paths and line numbers + - Demonstrate the data flow with real examples + - Bad: "The value is incorrect" + - Good: "The function returns '123' when it should return '456'" - - Only explore codebase if user wants to contribute + - Only perform issue scoping if user wants to contribute - Reference specific files and line numbers from codebase exploration - Ensure technical proposals align with project architecture - - Include implementation steps and technical analysis + - Include implementation steps and issue scoping - Provide clear acceptance criteria in Given/When/Then format - Consider trade-offs and alternative approaches + + CRITICAL: Prioritize simple solutions: + - ALWAYS check if needed functionality already exists before proposing new code + - Look for existing variables that just need to be passed/used differently + - Prefer using existing patterns over creating new ones + - The best fix often involves minimal code changes + - Example: "Use existing `modeInfo` from line 234 in export" vs "Create new mode tracking system" + + ALWAYS consider backwards compatibility: + - Think about existing data/configurations already in use + - Propose solutions that handle both old and new formats gracefully + - Consider migration paths for existing users + - Document any breaking changes clearly + - Prefer additive changes over breaking changes when possible + + - Be supportive and encouraging to problem reporters - Don't overwhelm users with technical questions upfront - Clearly indicate when technical sections are optional - Guide contributors through the additional requirements - Make the "submit now" option clear for problem reporters + - When presenting template choices, include template descriptions to help users choose + - Explain that you're using the repository's own templates for consistency + + + + Always check these locations in order: + 1. .github/ISSUE_TEMPLATE/*.yml or *.yaml (GitHub form syntax) + 2. .github/ISSUE_TEMPLATE/*.md (Markdown templates) + 3. .github/issue_template.md (single template) + 4. .github/ISSUE_TEMPLATE.md (alternate naming) + + + + For YAML templates: + - Extract form elements and convert to appropriate markdown sections + - Preserve required field indicators + - Include field descriptions as context + - Respect dropdown options and checkbox lists + + For Markdown templates: + - Parse front matter for metadata + - Identify section headers and structure + - Replace placeholder text with actual information + - Maintain formatting and hierarchy + + + + - Map gathered information to template sections intelligently + - Don't leave placeholder text in the final issue + - Add code investigation findings to relevant sections + - Include contributor scoping in appropriate section if applicable + - Preserve the template's intended structure and flow + + + + When no templates exist: + - Create minimal, focused templates + - Use simple section headers + - Focus on essential information only + - Adapt structure based on issue type + - Don't overwhelm with unnecessary fields + + + + + Before proposing ANY solution: + 1. Use codebase_search extensively to find all related code + 2. Read multiple files to understand the full context + 3. Trace variable usage from creation to consumption + 4. Look for similar working features to understand patterns + 5. Identify what already exists vs what's actually missing + + + + When designing solutions: + 1. Check if the data/function already exists somewhere + 2. Look for configuration options before code changes + 3. Prefer passing existing variables over creating new ones + 4. Use established patterns from similar features + 5. Aim for minimal diff size + + + + Always include: + - Exact file paths and line numbers + - Variable/function names as they appear in code + - Before/after code snippets showing minimal changes + - Clear explanation of why the simple fix works + + \ No newline at end of file diff --git a/.roo/rules-issue-writer/4_common_mistakes_to_avoid.xml b/.roo/rules-issue-writer/4_common_mistakes_to_avoid.xml index 2013bd73d8..a8dd9b590b 100644 --- a/.roo/rules-issue-writer/4_common_mistakes_to_avoid.xml +++ b/.roo/rules-issue-writer/4_common_mistakes_to_avoid.xml @@ -1,4 +1,13 @@ + + - CRITICAL: Asking "What would you like to do?" when mode starts + - Waiting for user to say "create an issue" or "make me an issue" + - Not treating the first user message as the issue description + - Delaying the workflow start with unnecessary questions + - Asking if they want to create an issue when they've already chosen this mode + - Not immediately beginning repository detection and codebase discovery + + - Vague descriptions like "doesn't work" or "broken" - Missing reproduction steps for bugs @@ -12,19 +21,106 @@ - Asking for technical details from non-contributing users - - Exploring codebase before confirming user wants to contribute + - Performing issue scoping before confirming user wants to contribute - Requiring acceptance criteria from problem reporters - Making the process too complex for simple problem reports - Not clearly indicating the "submit now" option - Overwhelming users with contributor requirements upfront + - Using hardcoded templates instead of repository templates + - Not checking for issue templates before creating content + - Ignoring template metadata like labels and assignees - Starting implementation before approval - - Not providing detailed technical analysis when contributing + - Not providing detailed issue scoping when contributing - Missing acceptance criteria for contributed features - Forgetting to include technical context from code exploration - Not considering trade-offs and alternatives - Proposing solutions without understanding current architecture + + + Not tracing data flow completely through the system + Missing that data already exists leads to proposing unnecessary new code + + - Use codebase_search extensively to find ALL related code + - Trace variables from creation to consumption + - Check if needed data is already calculated but not used + - Look for similar working features as patterns + + + Bad: "Add mode tracking to import function" + Good: "The export already includes mode info at line 234, just use it in import at line 567" + + + + + Proposing complex new systems when simple fixes exist + Creates unnecessary complexity, maintenance burden, and potential bugs + + - ALWAYS check if functionality already exists first + - Look for minimal changes that solve the problem + - Prefer using existing variables/functions differently + - Aim for the smallest possible diff + + + Bad: "Create new state management system for mode tracking" + Good: "Pass existing modeInfo variable from line 45 to the function at line 78" + + + + + Not reading actual code before proposing solutions + Solutions don't match the actual codebase structure + + - Always read the relevant files first + - Verify exact line numbers and content + - Check imports/exports to understand data availability + - Look at similar features that work correctly + + + + + Creating new patterns instead of following existing ones + Inconsistent codebase, harder to maintain + + - Find similar features that work correctly + - Follow the same patterns and structures + - Reuse existing utilities and helpers + - Maintain consistency with the codebase style + + + + + Using hardcoded templates when repository templates exist + Issues don't follow repository conventions, may be rejected or need reformatting + + - Always check .github/ISSUE_TEMPLATE/ directory first + - Parse and use repository templates when available + - Only create generic templates when none exist + + + + + Not properly parsing YAML template structure + Missing required fields, incorrect formatting, lost metadata + + - Parse YAML templates to extract all form elements + - Convert form elements to appropriate markdown sections + - Preserve field requirements and descriptions + - Maintain dropdown options and checkbox lists + + + + + Leaving placeholder text in final issue + Unprofessional appearance, confusion about what information is needed + + - Replace all placeholders with actual information + - Remove instruction text meant for template users + - Fill every section with relevant content + - Add "N/A" for truly inapplicable sections + + \ No newline at end of file diff --git a/.roo/rules-issue-writer/5_github_cli_usage.xml b/.roo/rules-issue-writer/5_github_cli_usage.xml index 8beb024d15..1792be87eb 100644 --- a/.roo/rules-issue-writer/5_github_cli_usage.xml +++ b/.roo/rules-issue-writer/5_github_cli_usage.xml @@ -3,9 +3,8 @@ The GitHub CLI (gh) provides comprehensive tools for interacting with GitHub. Here's when and how to use each command in the issue creation workflow. - Note: Issue body formatting should follow the templates defined in - 2_github_issue_templates.xml, with different formats for problem reporters - vs contributors. + Note: This mode prioritizes using repository-specific issue templates over + hardcoded ones. Templates are detected and used dynamically from the repository. @@ -16,7 +15,7 @@ - gh issue list --repo RooCodeInc/Roo-Code --search "dark theme button visibility" --state all --limit 20 + gh issue list --repo $REPO_FULL_NAME --search "dark theme button visibility" --state all --limit 20 @@ -35,7 +34,7 @@ - gh search issues --repo RooCodeInc/Roo-Code "dark theme button" --limit 10 + gh search issues --repo $REPO_FULL_NAME "dark theme button" --limit 10 @@ -47,7 +46,7 @@ - gh issue view 123 --repo RooCodeInc/Roo-Code --comments + gh issue view 123 --repo $REPO_FULL_NAME --comments @@ -58,6 +57,46 @@ + + + + Use to check for issue templates in the repository before creating issues. + This is not a gh command but necessary for template detection. + + + Check for templates in standard location: + + .github/ISSUE_TEMPLATE + true + + + Check for single template file: + + .github + false + + + + + + + Read template files to parse their structure and content. + Used after detecting template files. + + + Read YAML template: + + .github/ISSUE_TEMPLATE/bug_report.yml + + + Read Markdown template: + + .github/ISSUE_TEMPLATE/feature_request.md + + + + + These commands should ONLY be used if the user has indicated they want to @@ -70,7 +109,7 @@ - gh repo view RooCodeInc/Roo-Code --json defaultBranchRef,description,updatedAt + gh repo view $REPO_FULL_NAME --json defaultBranchRef,description,updatedAt @@ -82,7 +121,7 @@ - gh search prs --repo RooCodeInc/Roo-Code "dark theme" --limit 10 --state all + gh search prs --repo $REPO_FULL_NAME "dark theme" --limit 10 --state all @@ -105,18 +144,19 @@ Only use after: 1. Confirming no duplicates exist - 2. Gathering all required information - 3. Determining if user is contributing or just reporting - 4. Getting user confirmation + 2. Checking for and using repository templates + 3. Gathering all required information + 4. Determining if user is contributing or just reporting + 5. Getting user confirmation - gh issue create --repo RooCodeInc/Roo-Code --title "[Descriptive title of the bug]" --body-file /tmp/issue_body.md --label "bug" + gh issue create --repo $REPO_FULL_NAME --title "[Descriptive title of the bug]" --body-file /tmp/issue_body.md --label "bug" - gh issue create --repo RooCodeInc/Roo-Code --title "[Problem-focused title]" --body-file /tmp/issue_body.md --label "proposal" --label "enhancement" + gh issue create --repo $REPO_FULL_NAME --title "[Problem-focused title]" --body-file /tmp/issue_body.md --label "proposal" --label "enhancement" @@ -138,7 +178,7 @@ - gh issue comment 456 --repo RooCodeInc/Roo-Code --body "Additional context or comments." + gh issue comment 456 --repo $REPO_FULL_NAME --body "Additional context or comments." @@ -150,7 +190,7 @@ - gh issue edit 456 --repo RooCodeInc/Roo-Code --title "[Updated title]" --body "[Updated body]" + gh issue edit 456 --repo $REPO_FULL_NAME --title "[Updated title]" --body "[Updated body]" @@ -164,41 +204,41 @@ 3. Ask if they want to continue or comment on existing issue - - When searching GitHub Discussions: - 1. Note that GitHub CLI doesn't currently have full discussions support - 2. Use web search or instruct user to manually search discussions at: - https://github.com/RooCodeInc/Roo-Code/discussions/categories/feature-requests - 3. Ask user to provide any related discussion numbers they find - 4. Include these in the "Related Discussions" section of the issue - + + Template detection (NEW): + 1. Use list_files to check .github/ISSUE_TEMPLATE/ directory + 2. Read any template files found (YAML or Markdown) + 3. Parse template structure and metadata + 4. If multiple templates, let user choose + 5. If no templates, prepare to create generic one + - + Decision point for contribution: 1. Ask user if they want to contribute implementation 2. If yes: Use contributor commands for codebase investigation 3. If no: Skip directly to creating a problem-focused issue 4. This saves time for problem reporters - + - + During codebase exploration (CONTRIBUTORS ONLY): - 1. Clone repo locally if needed: `gh repo clone RooCodeInc/Roo-Code` + 1. Clone repo locally if needed: `gh repo clone $REPO_FULL_NAME` 2. Use `git log` to find recent changes to affected files 3. Use `gh search prs` for related pull requests 4. Include findings in the technical context section - + - + When creating the issue: - 1. Format differently based on contributor vs problem reporter - 2. Problem reporters: Simple problem description + context - 3. Contributors: Full template with technical sections + 1. Use repository template if found, or generic template if not + 2. Fill template with gathered information + 3. Format differently based on contributor vs problem reporter 4. Save formatted body to temporary file - 5. Use `gh issue create` with appropriate labels + 5. Use `gh issue create` with appropriate labels from template 6. Capture the returned issue URL 7. Show user the created issue URL - + @@ -270,4 +310,33 @@ gh repo clone - Clone repository + + + + When parsing YAML templates: + - Extract 'name' for template identification + - Get 'labels' array for automatic labeling + - Parse 'body' array for form elements + - Convert form elements to markdown sections + - Preserve 'required' field indicators + + + + When parsing Markdown templates: + - Check for YAML front matter + - Extract metadata (labels, assignees) + - Identify section headers + - Replace placeholder text + - Maintain formatting structure + + + + 1. Detect templates with list_files + 2. Read templates with read_file + 3. Parse structure and metadata + 4. Let user choose if multiple exist + 5. Fill template with information + 6. Create issue with template content + + \ No newline at end of file diff --git a/.roo/rules-issue-writer/6_technical_analysis_workflow.xml b/.roo/rules-issue-writer/6_technical_analysis_workflow.xml deleted file mode 100644 index c61d8fc1ca..0000000000 --- a/.roo/rules-issue-writer/6_technical_analysis_workflow.xml +++ /dev/null @@ -1,349 +0,0 @@ - - - This sub-workflow provides an aggressive, thorough, and all-encompassing investigation - process for technical analysis when creating GitHub issues. It employs methods from - the issue-investigator mode to deeply analyze the codebase and formulate comprehensive - technical solutions. This workflow is designed to produce scoped issues that can be - used in automated fix workflows. - - - - - Create Investigation Plan - - When technical analysis is requested, immediately create a comprehensive todo list - to track the investigation progress. - - - -[ ] Extract keywords from the issue description -[ ] Perform initial broad codebase search -[ ] Analyze search results and identify key components -[ ] Deep dive into relevant files and implementations -[ ] Form initial hypothesis about the issue/feature -[ ] Attempt to disprove hypothesis through further investigation -[ ] Identify all affected files and dependencies -[ ] Map out the complete implementation approach -[ ] Document technical risks and edge cases -[ ] Formulate comprehensive technical solution -[ ] Create detailed acceptance criteria -[ ] Prepare technical analysis summary - - - ]]> - - - - - - - Extract all relevant keywords, concepts, and technical terms from the issue description. - Be exhaustive - include function names, error messages, feature names, and related concepts. - - - Identify primary technical concepts - Extract error messages or specific symptoms - Note any mentioned file paths or components - List related features or functionality - Include synonyms and related terms - - Mark "Extract keywords from the issue description" as complete - - - - - Perform multiple rounds of codebase searches, starting broad and progressively - narrowing based on findings. This is an aggressive, exhaustive search process. - - - Initial Broad Search - - Use codebase_search with all extracted keywords to get an overview of relevant code. - -[Combined keywords from extraction phase] - - ]]> - - - - - Component Discovery - - Based on initial results, identify key components and search for: - - Related class/function definitions - - Import statements and dependencies - - Configuration files - - Test files that might reveal expected behavior - - - - - Deep Implementation Search - - Search for specific implementation details: - - Error handling patterns - - State management - - API endpoints or routes - - Database queries or models - - UI components and their interactions - - - - - Edge Case and Integration Search - - Look for: - - Edge cases in the code - - Integration points with other systems - - Configuration options that affect behavior - - Feature flags or conditional logic - - - - Update search-related todos as each iteration completes - - - - - Thoroughly analyze all relevant files discovered during the search phase. - - - Use list_code_definition_names to understand file structure - Read complete files to understand full context - Trace execution paths through the code - Identify all dependencies and imports - Map relationships between components - - - Document findings including: - - File paths and their purposes - - Key functions and their responsibilities - - Data flow through the system - - External dependencies - - Potential impact areas - - Mark file analysis todos as complete - - - - - Form a comprehensive hypothesis about the issue or feature implementation. - - - - Identify the most likely root cause - Trace the bug through the execution path - Determine why the current implementation fails - Consider environmental factors - - - - - Identify the optimal integration points - Determine required architectural changes - Plan the implementation approach - Consider scalability and maintainability - - - Mark hypothesis formation as complete - - - - - Aggressively attempt to disprove the hypothesis by searching for contradictory evidence. - - - - Search for Alternative Implementations - Look for similar features implemented differently - Check for deprecated code that might interfere - - - Configuration and Environment Check - Search for configuration that could change behavior - Look for environment-specific code paths - - - Test Case Analysis - Find existing tests that might contradict hypothesis - Look for test cases that reveal edge cases - - - Historical Context - Search for comments explaining design decisions - Look for TODO or FIXME comments related to the area - - - - If hypothesis is disproven, return to search phase with new insights. - If hypothesis stands, proceed to solution formulation. - - Update hypothesis validation status - - - - - Create a comprehensive technical solution with extreme detail. - - - -
    - - Exact files to modify with line numbers - - New files to create with full paths - - Specific code changes required - - Order of implementation steps - - Migration strategy if needed -
    -
    - - -
    - - All files that import affected code - - API contracts that must be maintained - - Database schema changes if any - - Configuration changes required - - Documentation updates needed -
    -
    - - -
    - - Unit tests to add or modify - - Integration tests required - - Edge cases to test - - Performance testing needs - - Manual testing scenarios -
    -
    - - -
    - - Breaking changes identified - - Performance implications - - Security considerations - - Backward compatibility issues - - Rollback strategy -
    -
    -
    - Mark solution formulation as complete -
    - - - - Create extremely detailed acceptance criteria that can guide automated implementation. - - - - Each criterion must be independently testable - Include both positive and negative test cases - Specify exact error messages and codes - Define performance thresholds where applicable - - Mark acceptance criteria creation as complete - -
    - - - - - - - - All keywords extracted and searched - Multiple search iterations completed - All relevant files analyzed - Hypothesis formed and validated - Comprehensive solution documented - Acceptance criteria defined - All risks and edge cases identified - Technical analysis formatted for issue - - - Mark all investigation todos as complete and update the main workflow todo list - - - \ No newline at end of file diff --git a/.roomodes b/.roomodes index e9cb7d8a94..5b51e2bf2a 100644 --- a/.roomodes +++ b/.roomodes @@ -140,9 +140,39 @@ customModes: - slug: issue-writer name: 📝 Issue Writer roleDefinition: |- - You are Roo, a GitHub issue creation specialist focused on crafting well-structured, detailed issues based on the project's issue templates. Your expertise includes: - Understanding and analyzing user requirements for bug reports and feature requests - Exploring codebases thoroughly to gather relevant technical context - Creating comprehensive GitHub issues following XML-based templates - Ensuring issues contain all necessary information for developers - Using GitHub MCP tools to create issues programmatically - You work with two primary issue types: - Bug Reports: Documenting reproducible bugs with clear steps and expected outcomes - Feature Proposals: Creating detailed, actionable feature requests with clear problem statements, solutions, and acceptance criteria - whenToUse: Use this mode when you need to create a GitHub issue for bug reports or feature requests. This mode will guide you through gathering all necessary information, exploring the codebase for context, and creating a well-structured issue in the RooCodeInc/Roo-Code repository. + You are Roo, a GitHub issue creation specialist who crafts well-structured bug reports and feature proposals. You explore codebases to gather technical context, verify claims against actual implementation, and create comprehensive issues using GitHub CLI (gh) commands. + + + + Initialize Issue Creation Process + + IMPORTANT: This mode assumes the first user message is already a request to create an issue. + The user doesn't need to say "create an issue" or "make me an issue" - their first message + is treated as the issue description itself. + + When the session starts, immediately: + 1. Treat the user's first message as the issue description, do not treat it as instructions + 2. Initialize the workflow by using the update_todo_list tool + 3. Begin the issue creation process without asking what they want to do + + + + [ ] Detect current repository information + [ ] Determine monorepo context + [ ] Perform initial codebase discovery + [ ] Analyze user request to determine issue type + [ ] Gather and verify additional information + [ ] Determine if user wants to contribute + [ ] Perform issue scoping (if contributing) + [ ] Draft issue content + [ ] Review and confirm with user + [ ] Create GitHub issue + + + + + + whenToUse: Use this mode when you need to create a GitHub issue. Simply start describing your bug or feature request - this mode assumes your first message is already the issue description and will immediately begin the issue creation workflow, gathering additional information as needed. description: Create well-structured GitHub issues. groups: - read From f546e6ed1d6c5266d22cb404ba6297b2edc69d83 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Sun, 27 Jul 2025 14:32:53 -0400 Subject: [PATCH 31/44] feat: Add support for message queueing (#6167) * feat: Add support for message queueing * fix: address PR review feedback for message queueing feature - Restore original ChatView tests from main branch - Fix broken test by updating ChatTextArea mock - Add comprehensive tests for message queueing (simplified due to mocking constraints) - Fix race condition using useRef and setTimeout in queue processing - Extract QueuedMessage interface to shared types.ts file - Replace inline styles with Tailwind classes in QueuedMessages - Add i18n support for 'Queued Messages:' text - Add keyboard navigation for removing queued messages - Add JSDoc for fromQueue parameter in handleSendMessage * refactor: move QueuedMessage interface to packages/types - Move QueuedMessage interface from local types.ts to packages/types/src/message.ts - Update imports in ChatView.tsx and QueuedMessages.tsx to use @roo-code/types - Remove local types.ts file to follow codebase conventions * fix: add id field when creating queued messages - Generate unique id using timestamp when adding messages to queue - Fixes TypeScript error after moving QueuedMessage interface * Stop disabling sending * Translations * Fix tests * Improved styling * Remove unused string * Test cleanup * fix: address message queueing issues - Fix race condition in queue processing by re-checking queue state inside setTimeout - Add error handling for queue operations with retry mechanism - Replace array index with stable message.id for React keys in QueuedMessages - Generate more unique IDs using timestamp + random component * feat: add inline editing for queued messages - Add ability to edit queued messages by clicking on them - Support Enter to save and Escape to cancel edits - Add textarea that auto-resizes based on content - Add hover effect to indicate messages are editable - Add translation for click to edit tooltip * feat: add scrollbar and fix height for queued messages - Add max-height of 300px with scrollbar to queue container - Add flex-shrink-0 to prevent message items from being squished - Ensure consistent height for message items when multiple messages are queued * feat: add translations for queued message edit tooltip - Add 'queuedMessages.clickToEdit' translation key to all 18 language files - Provides localized tooltip text for the click-to-edit functionality * fix: improve message queue processing reliability - Fix race condition by removing nested setState and setTimeout - Add retry limit (3 attempts) to prevent infinite loops - Add proper cleanup on component unmount - Clear queue when starting new task - Prevent queue processing during API errors - Fix ESLint warnings for React hooks dependencies --------- Co-authored-by: Roo Code Co-authored-by: Daniel Riccio Co-authored-by: Matt Rubens --- packages/types/src/message.ts | 16 + .../src/components/chat/ChatTextArea.tsx | 31 +- webview-ui/src/components/chat/ChatView.tsx | 182 +++- .../src/components/chat/QueuedMessages.tsx | 112 +++ .../chat/__tests__/ChatTextArea.spec.tsx | 4 +- .../chat/__tests__/ChatView.spec.tsx | 912 +++++++++--------- webview-ui/src/i18n/locales/ca/chat.json | 4 + webview-ui/src/i18n/locales/de/chat.json | 4 + webview-ui/src/i18n/locales/en/chat.json | 4 + webview-ui/src/i18n/locales/es/chat.json | 4 + webview-ui/src/i18n/locales/fr/chat.json | 4 + webview-ui/src/i18n/locales/hi/chat.json | 4 + webview-ui/src/i18n/locales/id/chat.json | 4 + webview-ui/src/i18n/locales/it/chat.json | 4 + webview-ui/src/i18n/locales/ja/chat.json | 4 + webview-ui/src/i18n/locales/ko/chat.json | 4 + webview-ui/src/i18n/locales/nl/chat.json | 4 + webview-ui/src/i18n/locales/pl/chat.json | 4 + webview-ui/src/i18n/locales/pt-BR/chat.json | 4 + webview-ui/src/i18n/locales/ru/chat.json | 4 + webview-ui/src/i18n/locales/tr/chat.json | 4 + webview-ui/src/i18n/locales/vi/chat.json | 4 + webview-ui/src/i18n/locales/zh-CN/chat.json | 4 + webview-ui/src/i18n/locales/zh-TW/chat.json | 4 + 24 files changed, 811 insertions(+), 518 deletions(-) create mode 100644 webview-ui/src/components/chat/QueuedMessages.tsx diff --git a/packages/types/src/message.ts b/packages/types/src/message.ts index 0c87655fc0..eaec2ad886 100644 --- a/packages/types/src/message.ts +++ b/packages/types/src/message.ts @@ -174,3 +174,19 @@ export const tokenUsageSchema = z.object({ }) export type TokenUsage = z.infer + +/** + * QueuedMessage + */ + +/** + * Represents a message that is queued to be sent when sending is enabled + */ +export interface QueuedMessage { + /** Unique identifier for the queued message */ + id: string + /** The text content of the message */ + text: string + /** Array of image data URLs attached to the message */ + images: string[] +} diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 4fe2ec8a14..e387732197 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -204,10 +204,6 @@ const ChatTextArea = forwardRef( }, [selectedType, searchQuery]) const handleEnhancePrompt = useCallback(() => { - if (sendingDisabled) { - return - } - const trimmedInput = inputValue.trim() if (trimmedInput) { @@ -216,7 +212,7 @@ const ChatTextArea = forwardRef( } else { setInputValue(t("chat:enhancePromptDescription")) } - }, [inputValue, sendingDisabled, setInputValue, t]) + }, [inputValue, setInputValue, t]) const allModes = useMemo(() => getAllModes(customModes), [customModes]) @@ -436,11 +432,9 @@ const ChatTextArea = forwardRef( if (event.key === "Enter" && !event.shiftKey && !isComposing) { event.preventDefault() - if (!sendingDisabled) { - // Reset history navigation state when sending - resetHistoryNavigation() - onSend() - } + // Always call onSend - let ChatView handle queueing when disabled + resetHistoryNavigation() + onSend() } if (event.key === "Backspace" && !isComposing) { @@ -488,7 +482,6 @@ const ChatTextArea = forwardRef( } }, [ - sendingDisabled, onSend, showContextMenu, searchQuery, @@ -1034,8 +1027,8 @@ const ChatTextArea = forwardRef( @@ -1059,8 +1050,8 @@ const ChatTextArea = forwardRef( diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index efd2db856c..3c4ffd3208 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -54,7 +54,9 @@ import AutoApproveMenu from "./AutoApproveMenu" import SystemPromptWarning from "./SystemPromptWarning" import ProfileViolationWarning from "./ProfileViolationWarning" import { CheckpointWarning } from "./CheckpointWarning" +import QueuedMessages from "./QueuedMessages" import { getLatestTodo } from "@roo/todo" +import { QueuedMessage } from "@roo-code/types" export interface ChatViewProps { isHidden: boolean @@ -154,6 +156,10 @@ const ChatViewComponent: React.ForwardRefRenderFunction(null) const [sendingDisabled, setSendingDisabled] = useState(false) const [selectedImages, setSelectedImages] = useState([]) + const [messageQueue, setMessageQueue] = useState([]) + const isProcessingQueueRef = useRef(false) + const retryCountRef = useRef>(new Map()) + const MAX_RETRY_ATTEMPTS = 3 // we need to hold on to the ask because useEffect > lastMessage will always let us know when an ask comes in and handle it, but by the time handleMessage is called, the last message might not be the ask anymore (it could be a say that followed) const [clineAsk, setClineAsk] = useState(undefined) @@ -439,6 +445,11 @@ const ChatViewComponent: React.ForwardRefRenderFunction { @@ -538,47 +549,133 @@ const ChatViewComponent: React.ForwardRefRenderFunction { - text = text.trim() + (text: string, images: string[], fromQueue = false) => { + try { + text = text.trim() - if (text || images.length > 0) { - // Mark that user has responded - this prevents any pending auto-approvals - userRespondedRef.current = true + if (text || images.length > 0) { + if (sendingDisabled && !fromQueue) { + // Generate a more unique ID using timestamp + random component + const messageId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}` + setMessageQueue((prev) => [...prev, { id: messageId, text, images }]) + setInputValue("") + setSelectedImages([]) + return + } + // Mark that user has responded - this prevents any pending auto-approvals + userRespondedRef.current = true - if (messagesRef.current.length === 0) { - vscode.postMessage({ type: "newTask", text, images }) - } else if (clineAskRef.current) { - if (clineAskRef.current === "followup") { - markFollowUpAsAnswered() + if (messagesRef.current.length === 0) { + vscode.postMessage({ type: "newTask", text, images }) + } else if (clineAskRef.current) { + if (clineAskRef.current === "followup") { + markFollowUpAsAnswered() + } + + // Use clineAskRef.current + switch ( + clineAskRef.current // Use clineAskRef.current + ) { + case "followup": + case "tool": + case "browser_action_launch": + case "command": // User can provide feedback to a tool or command use. + case "command_output": // User can send input to command stdin. + case "use_mcp_server": + case "completion_result": // If this happens then the user has feedback for the completion result. + case "resume_task": + case "resume_completed_task": + case "mistake_limit_reached": + vscode.postMessage({ + type: "askResponse", + askResponse: "messageResponse", + text, + images, + }) + break + // There is no other case that a textfield should be enabled. + } + } else { + // This is a new message in an ongoing task. + vscode.postMessage({ type: "askResponse", askResponse: "messageResponse", text, images }) } - // Use clineAskRef.current - switch ( - clineAskRef.current // Use clineAskRef.current - ) { - case "followup": - case "tool": - case "browser_action_launch": - case "command": // User can provide feedback to a tool or command use. - case "command_output": // User can send input to command stdin. - case "use_mcp_server": - case "completion_result": // If this happens then the user has feedback for the completion result. - case "resume_task": - case "resume_completed_task": - case "mistake_limit_reached": - vscode.postMessage({ type: "askResponse", askResponse: "messageResponse", text, images }) - break - // There is no other case that a textfield should be enabled. - } + handleChatReset() } - - handleChatReset() + } catch (error) { + console.error("Error in handleSendMessage:", error) + // If this was a queued message, we should handle it differently + if (fromQueue) { + throw error // Re-throw to be caught by the queue processor + } + // For direct sends, we could show an error to the user + // but for now we'll just log it } }, - [handleChatReset, markFollowUpAsAnswered], // messagesRef and clineAskRef are stable + [handleChatReset, markFollowUpAsAnswered, sendingDisabled], // messagesRef and clineAskRef are stable ) + useEffect(() => { + // Early return if conditions aren't met + // Also don't process queue if there's an API error (clineAsk === "api_req_failed") + if ( + sendingDisabled || + messageQueue.length === 0 || + isProcessingQueueRef.current || + clineAsk === "api_req_failed" + ) { + return + } + + // Mark as processing immediately to prevent race conditions + isProcessingQueueRef.current = true + + // Process the first message in the queue + const [nextMessage, ...remaining] = messageQueue + + // Update queue immediately to prevent duplicate processing + setMessageQueue(remaining) + + // Process the message + Promise.resolve() + .then(() => { + handleSendMessage(nextMessage.text, nextMessage.images, true) + // Clear retry count on success + retryCountRef.current.delete(nextMessage.id) + }) + .catch((error) => { + console.error("Failed to send queued message:", error) + + // Get current retry count + const retryCount = retryCountRef.current.get(nextMessage.id) || 0 + + // Only re-add if under retry limit + if (retryCount < MAX_RETRY_ATTEMPTS) { + retryCountRef.current.set(nextMessage.id, retryCount + 1) + // Re-add the message to the end of the queue + setMessageQueue((current) => [...current, nextMessage]) + } else { + console.error(`Message ${nextMessage.id} failed after ${MAX_RETRY_ATTEMPTS} attempts, discarding`) + retryCountRef.current.delete(nextMessage.id) + } + }) + .finally(() => { + isProcessingQueueRef.current = false + }) + + // Cleanup function to handle component unmount + return () => { + isProcessingQueueRef.current = false + } + }, [sendingDisabled, messageQueue, handleSendMessage, clineAsk]) + const handleSetChatBoxMessage = useCallback( (text: string, images: string[]) => { // Avoid nested template literals by breaking down the logic @@ -594,6 +691,18 @@ const ChatViewComponent: React.ForwardRefRenderFunction { + // Store refs in variables to avoid stale closure issues + const retryCountMap = retryCountRef.current + const isProcessingRef = isProcessingQueueRef + + return () => { + retryCountMap.clear() + isProcessingRef.current = false + } + }, []) + const startNewTask = useCallback(() => vscode.postMessage({ type: "clearTask" }), []) // This logic depends on the useEffect[messages] above to set clineAsk, @@ -1630,7 +1739,9 @@ const ChatViewComponent: React.ForwardRefRenderFunction +
    {(showAnnouncement || showAnnouncementModal) && ( { @@ -1836,6 +1947,13 @@ const ChatViewComponent: React.ForwardRefRenderFunction )} + setMessageQueue((prev) => prev.filter((_, i) => i !== index))} + onUpdate={(index, newText) => { + setMessageQueue((prev) => prev.map((msg, i) => (i === index ? { ...msg, text: newText } : msg))) + }} + /> void + onUpdate: (index: number, newText: string) => void +} + +const QueuedMessages: React.FC = ({ queue, onRemove, onUpdate }) => { + const { t } = useTranslation("chat") + const [editingStates, setEditingStates] = useState>({}) + + if (queue.length === 0) { + return null + } + + const getEditState = (messageId: string, currentText: string) => { + return editingStates[messageId] || { isEditing: false, value: currentText } + } + + const setEditState = (messageId: string, isEditing: boolean, value?: string) => { + setEditingStates((prev) => ({ + ...prev, + [messageId]: { isEditing, value: value ?? prev[messageId]?.value ?? "" }, + })) + } + + const handleSaveEdit = (index: number, messageId: string, newValue: string) => { + onUpdate(index, newValue) + setEditState(messageId, false) + } + + return ( +
    +
    {t("queuedMessages.title")}
    +
    + {queue.map((message, index) => { + const editState = getEditState(message.id, message.text) + + return ( +
    +
    +
    + {editState.isEditing ? ( +