diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index c659eb80eb..9e22303a35 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,12 +1,66 @@ name: Bug Report -description: Clearly report a bug with detailed repro steps +description: Report a broken behavior in plain language with a minimal reproduction labels: ["bug"] +title: "[BUG] " body: - type: markdown attributes: value: | - **Thanks for your report!** Please check existing issues first: - 👉 https://github.com/RooCodeInc/Roo-Code/issues + Thank you for your report! Please search existing issues first: + https://github.com/RooCodeInc/Roo-Code/issues + + - type: textarea + id: problem + attributes: + label: Problem (one or two sentences) + description: Describe what went wrong in plain language. + placeholder: 'Example: "Expected the task to start, but nothing happened and no message appeared."' + validations: + required: true + + - type: textarea + id: context + attributes: + label: Context (who is affected and when) + description: Who sees this and in what situation? Keep it non-technical. + placeholder: 'Example: "Happens to new users when starting a run from the New Run page with dark theme enabled."' + validations: + required: true + + - type: textarea + id: steps + attributes: + label: Reproduction steps + description: Provide clear, numbered steps so we can reproduce. + placeholder: | + 1) Environment/setup (OS, extension version, relevant settings) + 2) Exact actions (clicks, inputs, commands) + 3) What you observed after each step + validations: + required: true + + - type: input + id: expected + attributes: + label: Expected result + placeholder: e.g., "The task starts and shows progress." + validations: + required: true + + - type: input + id: actual + attributes: + label: Actual result + placeholder: e.g., "The button appears disabled and no progress is shown." + validations: + required: true + + - type: textarea + id: variations + attributes: + label: Variations tried (optional) + description: Different browsers, devices, providers, or settings you tried. + placeholder: e.g., "Tried Chrome/Firefox, disabling dark theme, switching providers." - type: input id: version @@ -19,7 +73,7 @@ body: - type: dropdown id: provider attributes: - label: API Provider + label: API Provider (optional) options: - Anthropic - AWS Bedrock @@ -45,57 +99,23 @@ body: - VS Code Language Model API - xAI (Grok) - Not Applicable / Other - validations: - required: true - type: input id: model attributes: - label: Model Used + label: Model Used (optional) description: Exact model name (e.g., Claude 3.7 Sonnet). Use N/A if irrelevant. - validations: - required: true - type: textarea id: roo-code-tasks attributes: - label: Roo Code Task Links (Optional) - description: | - If you have any publicly shared task links that demonstrate the issue, please paste them here. - This helps maintainers understand the context. - Example: https://app.roocode.com/share/task-id + label: Roo Code Task Links (optional) + description: If you have any publicly shared Roo Code task links that demonstrate the issue, paste them here. placeholder: Paste your Roo Code share links here, one per line - - type: textarea - id: steps - attributes: - label: 🔁 Steps to Reproduce - description: | - 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. - validations: - required: true - - - type: textarea - id: what-happened - attributes: - label: 💥 Outcome Summary - description: | - Recap what went wrong in one or two lines. - - Example: "Expected code to run, but got an empty response and no error." - placeholder: Expected ___, but got ___. - validations: - required: true - - type: textarea id: logs attributes: - label: 📄 Relevant Logs or Errors (Optional) - description: Paste API logs, terminal output, or errors here. Use triple backticks (```) for code formatting. + label: Relevant logs or errors (optional) + description: Paste relevant output or errors. Use triple backticks (```) for formatting. render: shell diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 4863f9ffa6..7e140ec08c 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,71 +1,47 @@ -name: Detailed Feature Proposal -description: Report a specific problem that needs solving in Roo Code -labels: ["proposal", "enhancement"] +name: Enhancement Request +description: Propose an improvement in plain language focused on user benefit +labels: ["enhancement"] +title: "[ENHANCEMENT] " body: - type: markdown attributes: value: | - **Thank you for submitting a feature request for Roo Code!** - - This template helps you describe problems that need solving. Focus on the problem - the Roo team will work to design solutions unless you want to contribute the implementation yourself. - - **Quality over speed:** We prefer detailed, clear problem descriptions over quick ones. Vague requests often get closed or require multiple rounds of clarification, which wastes everyone's time. - - **Before submitting:** - - Search existing [Issues](https://github.com/RooCodeInc/Roo-Code/issues) and [Discussions](https://github.com/RooCodeInc/Roo-Code/discussions) to avoid duplicates - - For general ideas, use [GitHub Discussions](https://github.com/RooCodeInc/Roo-Code/discussions/categories/feature-requests) instead of this template. - - - type: markdown - attributes: - value: | - ## ❌ Common mistakes that lead to request rejection: - - **Vague problem descriptions:** "UI is bad" -> Should be: "Submit button is invisible on dark theme" - - **Missing user impact:** "This would be cool" -> Should explain who benefits and how - - **No specific context:** Describe exactly when and how the problem occurs - + Thank you for helping improve Roo Code! + Please focus on the problem and the desired behavior in plain language. - type: textarea - id: problem-description + id: problem attributes: - label: What specific problem does this solve? - description: | - **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.) - placeholder: Be specific about the problem, who it affects, and the impact. Avoid generic statements like "it's slow" or "it's confusing." + label: Problem (one or two sentences) + description: What problem are users facing? + placeholder: e.g., "Users often click Copy Run by mistake and duplicate runs unintentionally." validations: required: true + - type: textarea + id: context + attributes: + label: Context (who is affected and when) + description: Who encounters this and in what situation? + placeholder: e.g., "Happens when browsing the Runs list; most visible for new users." + validations: + required: true - type: textarea - id: additional-context + id: desired attributes: - label: Additional context (optional) - description: Mockups, screenshots, links, user quotes, or other relevant information that supports your proposal. + label: Desired behavior (conceptual, not technical) + description: Describe what should happen in simple terms. + placeholder: e.g., "Ask for confirmation before copying a run." + validations: + required: true - type: textarea - id: roo-code-tasks + id: constraints attributes: - label: Roo Code Task Links (Optional) - description: | - If you used Roo Code to explore this feature request or develop solutions, share the public task links here. - This helps maintainers understand the context and any exploration you've done. - Example: https://app.roocode.com/share/task-id - placeholder: Paste your Roo Code share links here, one per line + label: Constraints / preferences (optional) + description: Any considerations like performance, accessibility, or UX expectations. + placeholder: e.g., "Keep it quick and unobtrusive; keyboard accessible." - type: checkboxes id: checklist @@ -74,128 +50,42 @@ body: options: - label: I've searched existing Issues and Discussions for duplicates required: true - - label: This describes a specific problem with clear impact and context + - label: This describes a specific problem with clear context and impact required: true + - type: textarea + id: roo-code-tasks + attributes: + label: Roo Code Task Links (optional) + description: If you explored this with Roo Code, share public task links for context. + placeholder: Paste your Roo Code share links here, one per line + - type: markdown attributes: value: | --- - - ## 🛠️ **Optional: Contributing & Technical Analysis** - - **🎯 Just reporting a problem?** You can click "Submit new issue" right now! The sections below are only needed if you want to contribute a solution via pull request. - - **⚠️ Only continue if you want to:** - - Propose a specific solution design - - Implement the feature yourself via pull request - - Provide technical analysis to help with implementation - - **For contributors who continue:** - - A maintainer (especially @hannesrudolph) will review this proposal. **Do not start implementation until approved and assigned.** We're a small team with limited resources, so every code addition needs careful consideration. We're always happy to receive clear, actionable proposals though! - - Join [Discord](https://discord.gg/roocode) and DM **Hannes Rudolph** (`hrudolph`) for guidance on implementation - - Check our [Roadmap](https://github.com/orgs/RooCodeInc/projects/1/views/1?query=sort%3Aupdated-desc+is%3Aopen&filterQuery=is%3Aissue%2Copen%2Cclosed+label%3A%22feature+request%22+status%3A%22Issue+%5BUnassigned%5D%22%2C%22Issue+%5BIn+Progress%5D%22) to see open feature requests ready to be implemented or currently being worked on - - - type: checkboxes - id: willingness-to-contribute - attributes: - label: Interested in implementing this? - description: | - **Important:** If you check "Yes" below, the technical sections become REQUIRED. - We need detailed technical analysis from contributors to ensure quality implementation. - options: - - label: Yes, I'd like to help implement this feature - required: false - - - type: checkboxes - id: implementation-approval - attributes: - label: Implementation requirements - options: - - label: I understand this needs approval before implementation begins - required: false - - - type: textarea - id: proposed-solution - attributes: - label: How should this be solved? (REQUIRED if contributing, optional otherwise) - description: | - **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? - placeholder: Describe the specific changes and how they will work. Include user interaction details if relevant. + Optional (for contributors): You can stop here if you're just proposing the improvement. - type: textarea id: acceptance-criteria attributes: - label: How will we know it works? (Acceptance Criteria - REQUIRED if contributing, optional otherwise) - description: | - **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] + label: Acceptance criteria (optional) + description: Define what “working” looks like with specific, testable outcomes. + placeholder: | + Given [context] 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 - ``` - placeholder: | - 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. - type: textarea - id: technical-considerations + id: proposed-solution attributes: - label: Technical considerations (REQUIRED if contributing, optional otherwise) - description: | - **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 - placeholder: e.g., "Will need to refactor task manager", "Could impact memory usage on large files", "Requires a large portion of code to be rewritten" + label: Proposed approach (optional) + description: If you have an idea, describe it briefly in plain language. - type: textarea - id: trade-offs-and-risks + id: risks attributes: - label: Trade-offs and risks (REQUIRED if contributing, optional otherwise) - description: | - **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 - placeholder: 'e.g., "Alternative: use library X but it is 500KB larger", "Risk: might slow older devices", "Breaking: changes API response format"' + label: Trade-offs / risks (optional) + description: Potential downsides or alternatives considered. diff --git a/.github/workflows/code-qa.yml b/.github/workflows/code-qa.yml index ba85a01b21..f8ac0c8642 100644 --- a/.github/workflows/code-qa.yml +++ b/.github/workflows/code-qa.yml @@ -86,22 +86,38 @@ jobs: - name: Create .env.local file working-directory: apps/vscode-e2e run: echo "OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY }}" > .env.local + - name: Set VS Code test version + run: echo "VSCODE_VERSION=1.101.2" >> $GITHUB_ENV + - name: Cache VS Code test runtime + uses: actions/cache@v4 + with: + path: apps/vscode-e2e/.vscode-test + key: ${{ runner.os }}-vscode-test-${{ env.VSCODE_VERSION }} + - name: Pre-download VS Code test runtime with retry + working-directory: apps/vscode-e2e + run: | + for attempt in 1 2 3; do + echo "Download attempt $attempt of 3..." + node -e " + const { downloadAndUnzipVSCode } = require('@vscode/test-electron'); + downloadAndUnzipVSCode({ version: process.env.VSCODE_VERSION || '1.101.2' }) + .then(() => { + console.log('✅ VS Code test runtime downloaded successfully'); + process.exit(0); + }) + .catch(err => { + console.error('❌ Failed to download VS Code (attempt $attempt):', err); + process.exit(1); + }); + " && break || { + if [ $attempt -eq 3 ]; then + echo "All download attempts failed" + exit 1 + fi + echo "Retrying in 5 seconds..." + sleep 5 + } + done - name: Run integration tests working-directory: apps/vscode-e2e run: xvfb-run -a pnpm test:ci - - notify-slack-on-failure: - runs-on: ubuntu-latest - needs: [check-translations, knip, compile, unit-test, integration-test] - if: ${{ always() && github.event_name == 'push' && github.ref == 'refs/heads/main' && contains(needs.*.result, 'failure') }} - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Send Slack notification on failure - uses: ./.github/actions/slack-notify - with: - webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }} - channel: "#ci" - workflow-name: "Code QA" - failed-jobs: ${{ toJSON(needs) }} diff --git a/.github/workflows/discord-pr-notify.yml b/.github/workflows/discord-pr-notify.yml deleted file mode 100644 index 88c918edfe..0000000000 --- a/.github/workflows/discord-pr-notify.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Discord PR Notifier - -on: - workflow_dispatch: - pull_request_target: - types: [opened] - -jobs: - notify: - runs-on: ubuntu-latest - if: github.head_ref != 'changeset-release/main' - steps: - - name: Send Discord Notification - run: | - PAYLOAD=$(jq -n \ - --arg title "${{ github.event.pull_request.title }}" \ - --arg url "${{ github.event.pull_request.html_url }}" \ - --arg author "${{ github.event.pull_request.user.login }}" \ - '{ - content: ("🚀 **New PR:** " + $title + "\n🔗 <" + $url + ">\n👤 **Author:** " + $author), - thread_name: ($title + " by " + $author) - }') - - curl -X POST "${{ secrets.DISCORD_WEBHOOK }}" \ - -H "Content-Type: application/json" \ - -d "$PAYLOAD" diff --git a/.gitignore b/.gitignore index 65c201c3c2..e044fc32a7 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ logs .qodo/ .vercel .roo/mcp.json + +# Qdrant +qdrant_storage/ diff --git a/.roo/commands/release.md b/.roo/commands/release.md index 702c5ba892..8adf57e6f0 100644 --- a/.roo/commands/release.md +++ b/.roo/commands/release.md @@ -26,15 +26,19 @@ argument-hint: patch | minor | major - Without issue: "- Add support for Gemini 2.5 Pro caching (thanks @contributor!)" - CRITICAL: Include EVERY SINGLE PR in the changeset - don't assume you know which ones are important. Count the total PRs to verify completeness and cross-reference the list to ensure nothing is missed. -6. If a major or minor release: +6. If the generate_image tool is available, create a release image at `releases/[version]-release.png` + - The image should feature a realistic-looking kangaroo doing something human-like that relates to the main highlight of the release + - Pass `releases/template.png` as the reference image for aspect ratio and kangaroo style + - Add the generated image to .changeset/v[version].md before the list of changes with format: `![X.Y.Z Release - Description](/releases/X.Y.Z-release.png)` +7. If a major or minor release: - Ask the user what the three most important areas to highlight are in the release - Update the English version relevant announcement files and documentation (webview-ui/src/components/chat/Announcement.tsx, README.md, and the `latestAnnouncementId` in src/core/webview/ClineProvider.ts) - Ask the user to confirm that the English version looks good to them before proceeding - Use the new_task tool to create a subtask in `translate` mode with detailed instructions of which content needs to be translated into all supported languages (The READMEs as well as the translation strings) -7. Create a new branch for the release preparation: `git checkout -b release/v[version]` -8. Commit and push the changeset file and any documentation updates to the repository: `git add . && git commit -m "chore: add changeset for v[version]" && git push origin release/v[version]` -9. Create a pull request for the release: `gh pr create --title "Release v[version]" --body "Release preparation for v[version]. This PR includes the changeset and any necessary documentation updates." --base main --head release/v[version]` -10. The GitHub Actions workflow will automatically: +8. Create a new branch for the release preparation: `git checkout -b release/v[version]` +9. Commit and push the changeset file and any documentation updates to the repository: `git add . && git commit -m "chore: add changeset for v[version]" && git push origin release/v[version]` +10. Create a pull request for the release: `gh pr create --title "Release v[version]" --body "Release preparation for v[version]. This PR includes the changeset and any necessary documentation updates." --base main --head release/v[version]` +11. The GitHub Actions workflow will automatically: - Create a version bump PR when changesets are merged to main - Update the CHANGELOG.md with proper formatting - Publish the release when the version bump PR is merged diff --git a/.roo/rules-merge-resolver/1_workflow.xml b/.roo/rules-merge-resolver/1_workflow.xml index a63809db70..2f0d1162f6 100644 --- a/.roo/rules-merge-resolver/1_workflow.xml +++ b/.roo/rules-merge-resolver/1_workflow.xml @@ -30,12 +30,13 @@ gh pr checkout [PR_NUMBER] --force git fetch origin main - git rebase origin/main + GIT_EDITOR=true git rebase origin/main
Force checkout the PR branch to ensure clean state Fetch the latest main branch Attempt to rebase onto main to reveal conflicts + Use GIT_EDITOR=true to ensure non-interactive rebase
@@ -108,8 +109,8 @@ - git rebase origin/main - Rebase current branch onto main to reveal conflicts + GIT_EDITOR=true git rebase origin/main + Rebase current branch onto main to reveal conflicts (non-interactive) @@ -133,6 +134,20 @@ + + GIT_EDITOR=true git rebase --continue + Continue rebase after resolving conflicts (non-interactive) + + + + + + true + Set to 'true' (a no-op command) to prevent interactive prompts during rebase operations + Prefix git rebase commands with GIT_EDITOR=true to ensure non-interactive execution + + + All merge conflicts have been resolved Resolved files have been staged diff --git a/.roo/rules-merge-resolver/3_tool_usage.xml b/.roo/rules-merge-resolver/3_tool_usage.xml index 35f3b5da75..30e7495574 100644 --- a/.roo/rules-merge-resolver/3_tool_usage.xml +++ b/.roo/rules-merge-resolver/3_tool_usage.xml @@ -26,6 +26,8 @@ Chain git commands with && for efficiency Use --format options for structured output Capture command output for parsing + Use GIT_EDITOR=true for non-interactive git rebase operations + Set environment variables inline to avoid prompts during automation @@ -46,7 +48,7 @@ Rebase onto main to reveal conflicts - git rebase origin/main + GIT_EDITOR=true git rebase origin/main @@ -71,7 +73,7 @@ Continue rebase after resolution - git rebase --continue + GIT_EDITOR=true git rebase --continue @@ -152,7 +154,7 @@ const config = { execute_command - Get PR info with gh CLI execute_command - Checkout PR with gh pr checkout --force execute_command - Fetch origin main - execute_command - Rebase onto origin/main + execute_command - Rebase onto origin/main with GIT_EDITOR=true execute_command - Check for conflicts with git status @@ -178,13 +180,22 @@ const config = { execute_command - Check all conflicts resolved - execute_command - Continue rebase with git rebase --continue + execute_command - Continue rebase with GIT_EDITOR=true git rebase --continue execute_command - Verify clean status + + Git commands waiting for interactive input + + Use GIT_EDITOR=true to bypass editor prompts + Set GIT_SEQUENCE_EDITOR=true for sequence editing + Consider --no-edit flag for commit operations + + + Rebase completes without conflicts @@ -225,4 +236,42 @@ const config = { + + + + Ensuring git operations run without requiring user interaction is critical + for automated conflict resolution. The mode uses environment variables to + bypass interactive prompts. + + + + + Set to 'true' (a no-op command) to skip editor prompts + GIT_EDITOR=true git rebase --continue + During rebase operations that would normally open an editor + + + + Skip interactive rebase todo editing + GIT_SEQUENCE_EDITOR=true git rebase -i HEAD~3 + When interactive rebase is triggered but no editing needed + + + + Use flags to avoid interactive prompts + + git commit --no-edit (use existing message) + git merge --no-edit (skip merge message editing) + git cherry-pick --no-edit (keep original message) + + + + + + Always test commands locally first to identify potential prompts + Combine environment variables when multiple editors might be invoked + Document why non-interactive mode is used in comments + Have fallback strategies if automation fails + + \ No newline at end of file diff --git a/.roo/rules-merge-resolver/4_complete_example.xml b/.roo/rules-merge-resolver/4_complete_example.xml index dae8587997..32b2bf344b 100644 --- a/.roo/rules-merge-resolver/4_complete_example.xml +++ b/.roo/rules-merge-resolver/4_complete_example.xml @@ -54,7 +54,7 @@ From github.com:user/repo -git rebase origin/main +GIT_EDITOR=true git rebase origin/main ]]> -git rebase --continue +GIT_EDITOR=true git rebase --continue ]]> Use git blame and commit messages to understand the history Combine non-conflicting improvements when possible Prioritize bugfixes while accommodating refactors - Complete the rebase process with git rebase --continue + Use GIT_EDITOR=true to ensure non-interactive rebase operations + Complete the rebase process with GIT_EDITOR=true git rebase --continue Validate that both sets of changes work together \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c75bb9e327..a17950ff59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,182 @@ # Roo Code Changelog +## [3.28.3] - 2025-09-16 + +![3.28.3 Release - UI/UX Improvements and Bug Fixes](/releases/3.28.3-release.png) + +- Fix: Filter out Claude Code built-in tools (ExitPlanMode, BashOutput, KillBash) (#7817 by @juliettefournier-econ, PR by @roomote) +- Replace + icon with edit icon for New Task button (#7941 by @hannesrudolph, PR by @roomote) +- Fix: Corrected C# tree-sitter query (#5238 by @vadash, PR by @mubeen-zulfiqar) +- Add keyboard shortcut for "Add to Context" action (#7907 by @hannesrudolph, PR by @roomote) +- Fix: Context menu is obscured when edit message (#7759 by @mini2s, PR by @NaccOll) +- Fix: Handle ByteString conversion errors in OpenAI embedders (#7959 by @PavelA85, PR by @daniel-lxs) +- Add Z.ai coding plan support (thanks @daniel-lxs!) +- Move slash commands to Settings tab with gear icon for discoverability (thanks @roomote!) +- Reposition Add Image button inside ChatTextArea (thanks @roomote!) +- Bring back a way to temporarily and globally pause auto-approve without losing your toggle state (thanks @brunobergher!) +- Makes text area buttons appear only when there's text (thanks @brunobergher!) +- CONTRIBUTING.md tweaks and issue template rewrite (thanks @hannesrudolph!) +- Bump axios from 1.9.0 to 1.12.0 (thanks @dependabot!) + +## [3.28.2] - 2025-09-14 + +![3.28.2 Release - Auto-approve improvements](/releases/3.28.2-release.png) + +- Improve auto-approve UI with smaller and more subtle design (thanks @brunobergher!) +- Fix: Message queue re-queue loop in Task.ask() causing performance issues (#7861 by @hannesrudolph, PR by @daniel-lxs) +- Fix: Restrict @-mention parsing to line-start or whitespace boundaries to prevent false triggers (#7875 by @hannesrudolph, PR by @app/roomote) +- Fix: Make nested git repository warning persistent with path info for better visibility (#7884 by @hannesrudolph, PR by @app/roomote) +- Fix: Include API key in Ollama /api/tags requests for authenticated instances (#7902 by @ItsOnlyBinary, PR by @app/roomote) +- Fix: Preserve original first message context during conversation condensing (thanks @daniel-lxs!) +- Add Qwen3 Next 80B A3B models to chutes provider (thanks @daniel-lxs!) +- Disable Roomote Control on logout for better security (thanks @cte!) +- Add padding to the cloudview for better visual spacing (thanks @mrubens!) + +## [3.28.1] - 2025-09-11 + +![3.28.1 Release - Kangaroo riding rocket to the clouds](/releases/3.28.1-release.png) + +- Announce Roo Code Cloud! +- Add cloud task button for opening tasks in Roo Code Cloud (thanks @app/roomote!) +- Make Posthog telemetry the default (thanks @mrubens!) +- Show notification when the checkpoint initialization fails (thanks @app/roomote!) +- Bust cache in generated image preview (thanks @mrubens!) +- Fix: Center active mode in selector dropdown on open (#7882 by @hannesrudolph, PR by @app/roomote) +- Fix: Preserve first message during conversation condensing (thanks @daniel-lxs!) + +## [3.28.0] - 2025-09-10 + +![3.28.0 Release - Continue tasks in Roo Code Cloud](/releases/3.28.0-release.png) + +- feat: Continue tasks in Roo Code Cloud (thanks @brunobergher!) +- feat: Support connecting to Cloud without redirect handling (thanks @mrubens!) +- feat: Add toggle to control task syncing to Cloud (thanks @jr!) +- feat: Add click-to-edit, ESC-to-cancel, and fix padding consistency for chat messages (#7788 by @hannesrudolph, PR by @app/roomote) +- feat: Make reasoning more visible (thanks @app/roomote!) +- fix: Fix Groq context window display (thanks @mrubens!) +- fix: Add GIT_EDITOR env var to merge-resolver mode for non-interactive rebase (thanks @daniel-lxs!) +- fix: Resolve chat message edit/delete duplication issues (thanks @daniel-lxs!) +- fix: Reduce CodeBlock button z-index to prevent overlap with popovers (#7703 by @A0nameless0man, PR by @daniel-lxs) +- fix: Revert PR #7188 - Restore temperature parameter to fix TabbyApi/ExLlamaV2 crashes (#7581 by @drknyt, PR by @daniel-lxs) +- fix: Make ollama models info transport work like lmstudio (#7674 by @ItsOnlyBinary, PR by @ItsOnlyBinary) +- fix: Update DeepSeek pricing to new unified rates effective Sept 5, 2025 (#7685 by @NaccOll, PR by @app/roomote) +- feat: Update Vertex AI models and regions (#7725 by @ssweens, PR by @ssweens) +- chore: Update dependency eslint-plugin-turbo to v2.5.6 (thanks @app/renovate!) +- chore: Update dependency @changesets/cli to v2.29.6 (thanks @app/renovate!) +- chore: Update dependency nock to v14.0.10 (thanks @app/renovate!) +- chore: Update dependency eslint-config-prettier to v10.1.8 (thanks @app/renovate!) +- chore: Update dependency esbuild to v0.25.9 (thanks @app/renovate!) + +## [3.27.0] - 2025-09-05 + +![3.27.0 Release - Bug Fixes and Improvements](/releases/3.27.0-release.png) + +- Add: User message editing and deletion functionality (thanks @NaccOll!) +- Add: Kimi K2-0905 model support in Chutes provider (#7700 by @pwilkin, PR by @app/roomote) +- Fix: Prevent stack overflow in codebase indexing for large projects (#7588 by @StarTrai1, PR by @daniel-lxs) +- Fix: Resolve race condition in Gemini Grounding Sources by improving code design (#6372 by @daniel-lxs, PR by @HahaBill) +- Fix: Preserve conversation context by retrying with full conversation on invalid previous_response_id (thanks @daniel-lxs!) +- Fix: Identify MCP and slash command config path in multiple folder workspaces (#6720 by @kfuglsang, PR by @NaccOll) +- Fix: Handle array paths from VSCode terminal profiles correctly (#7695 by @Amosvcc, PR by @app/roomote) +- Fix: Improve WelcomeView styling and readability (thanks @daniel-lxs!) +- Fix: Resolve CI e2e test ETIMEDOUT errors when downloading VS Code (thanks @daniel-lxs!) + +## [3.26.7] - 2025-09-04 + +![3.26.7 Release - OpenAI Service Tiers](/releases/3.26.7-release.png) + +- Feature: Add OpenAI Responses API service tiers (flex/priority) with UI selector and pricing (thanks @hannesrudolph!) +- Feature: Add DeepInfra as a model provider in Roo Code (#7661 by @Thachnh, PR by @Thachnh) +- Feature: Update kimi-k2-0905-preview and kimi-k2-turbo-preview models on the Moonshot provider (thanks @CellenLee!) +- Feature: Add kimi-k2-0905-preview to Groq, Moonshot, and Fireworks (thanks @daniel-lxs and Cline!) +- Fix: Prevent countdown timer from showing in history for answered follow-up questions (#7624 by @XuyiK, PR by @daniel-lxs) +- Fix: Moonshot's maximum return token count limited to 1024 issue resolved (#6936 by @greyishsong, PR by @wangxiaolong100) +- Fix: Add error transform to cryptic OpenAI SDK errors when API key is invalid (#7483 by @A0nameless0man, PR by @app/roomote) +- Fix: Validate MCP tool exists before execution (#7631 by @R-omk, PR by @app/roomote) +- Fix: Handle zsh glob qualifiers correctly (thanks @mrubens!) +- Fix: Handle zsh process substitution correctly (thanks @mrubens!) +- Fix: Minor zh-TW Traditional Chinese locale typo fix (thanks @PeterDaveHello!) + +## [3.26.6] - 2025-09-03 + +![3.26.6 Release - Bug Fixes and Tool Improvements](/releases/3.26.6-release.png) + +- Add experimental run_slash_command tool to let the model initiate slash commands (thanks @app/roomote!) +- Fix: use askApproval wrapper in insert_content and search_and_replace tools (#7648 by @hannesrudolph, PR by @app/roomote) +- Add Kimi K2 Turbo model configuration to moonshotModels (thanks @wangxiaolong100!) +- Fix: preserve scroll position when switching tabs in settings (thanks @DC-Dancao!) + +## [3.26.5] - 2025-09-03 + +![3.26.5 Release - Enhanced AI Thinking Capabilities](/releases/3.26.5-release.png) + +- feat: Add support for Qwen3 235B A22B Thinking 2507 model in chutes (thanks @mohammad154!) +- feat: Add auto-approve support for MCP access_resource tool (#7565 by @m-ibm, PR by @daniel-lxs) +- feat: Add configurable embedding batch size for code indexing (#7356 by @BenLampson, PR by @app/roomote) +- fix: Add cache reporting support for OpenAI-Native provider (thanks @hannesrudolph!) +- feat: Move message queue to the extension host for better performance (thanks @cte!) + +## [3.26.4] - 2025-09-01 + +![3.26.4 Release - Memory Optimization](/releases/3.26.4-release.png) + +- Optimize memory usage for image handling in webview (thanks @daniel-lxs!) +- Fix: Special tokens should not break task processing (#7539 by @pwilkin, PR by @pwilkin) +- Add Ollama API key support for Turbo mode (#7147 by @LivioGama, PR by @app/roomote) +- Rename Account tab to Cloud tab for clarity (thanks @app/roomote!) +- Add kangaroo-themed release image generation (thanks @mrubens!) + +## [3.26.3] - 2025-08-29 + +![3.26.3 Release - Kangaroo Photo Editor](/releases/3.26.3-release.png) + +- Add optional input image parameter to image generation tool (thanks @roomote!) +- Refactor: Flatten image generation settings structure (thanks @daniel-lxs!) +- Show console logging in vitests when the --no-silent flag is set (thanks @hassoncs!) + +## [3.26.2] - 2025-08-28 + +![3.26.2 Release - Kangaroo Digital Artist](/releases/3.26.2-release.png) + +- feat: Add experimental image generation tool with OpenRouter integration (thanks @daniel-lxs!) +- Fix: Resolve GPT-5 Responses API issues with condensing and image support (#7334 by @nlbuescher, PR by @daniel-lxs) +- Fix: Hide .rooignore'd files from environment details by default (#7368 by @AlexBlack772, PR by @app/roomote) +- Fix: Exclude browser scroll actions from repetition detection (#7470 by @cgrierson-smartsheet, PR by @app/roomote) + +## [3.26.1] - 2025-08-27 + +![3.26.1 Release - Kangaroo Network Engineer](/releases/3.26.1-release.png) + +- Add Vercel AI Gateway provider integration (thanks @joshualipman123!) +- Add support for Vercel embeddings (thanks @mrubens!) +- Enable on-disk storage for Qdrant vectors and HNSW index (thanks @daniel-lxs!) +- Show model ID in API configuration dropdown (thanks @daniel-lxs!) +- Update tooltip component to match native VSCode tooltip shadow styling (thanks @roomote!) +- Fix: remove duplicate cache display in task header (thanks @mrubens!) +- Random chat text area cleanup (thanks @cte!) + +## [3.26.0] - 2025-08-26 + +![3.26.0 Release - Kangaroo Speed Racer](/releases/3.26.0-release.png) + +- Sonic -> Grok Code Fast +- feat: Add Qwen Code CLI API Support with OAuth Authentication (thanks @evinelias and Cline!) +- feat: Add Deepseek v3.1 to Fireworks AI provider (#7374 by @dmarkey, PR by @app/roomote) +- Add a built-in /init slash command (thanks @mrubens and @hannesrudolph!) +- Fix: Make auto approve toggle trigger stay (#3909 by @kyle-apex, PR by @elianiva) +- Fix: Preserve user input when selecting follow-up choices (#7316 by @teihome, PR by @daniel-lxs) +- Fix: Handle Mistral thinking content as reasoning chunks (#6842 by @Biotrioo, PR by @app/roomote) +- Fix: Resolve newTaskRequireTodos setting not working correctly (thanks @hannesrudolph!) +- Fix: Requesty model listing (#7377 by @dtrugman, PR by @dtrugman) +- feat: Hide static providers with no models from provider list (thanks @daniel-lxs!) +- Add todos parameter to new_task tool usage in issue-fixer mode (thanks @hannesrudolph!) +- Handle substitution patterns in command validation (thanks @mrubens!) +- Mark code-workspace files as protected (thanks @mrubens!) +- Update list of default allowed commands (thanks @mrubens!) +- Follow symlinks in rooignore checks (thanks @mrubens!) +- Show cache read and write prices for OpenRouter inference providers (thanks @chrarnoldus!) +- chore(deps): Update dependency drizzle-kit to v0.31.4 (thanks @app/renovate!) + ## [3.25.23] - 2025-08-22 - feat: add custom base URL support for Requesty provider (thanks @requesty-JohnCosta27!) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c23c424f41..869b59a16d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -67,25 +67,27 @@ Mention alignment with these areas in your PRs. ### Issue-First Approach -All contributions must begin with a GitHub Issue. +All contributions start with a GitHub Issue using our skinny templates. - **Check existing issues**: Search [GitHub Issues](https://github.com/RooCodeInc/Roo-Code/issues). -- **Create an issue**: Use appropriate templates: - - **Bugs:** "Bug Report" template. - - **Features:** "Detailed Feature Proposal" template. Approval required before starting. -- **Claim issues**: Comment and await official assignment. - -**PRs without approved issues may be closed.** +- **Create an issue** using: + - **Enhancements:** "Enhancement Request" template (plain language focused on user benefit). + - **Bugs:** "Bug Report" template (minimal repro + expected vs actual + version). +- **Want to work on it?** Comment "Claiming" on the issue and DM **Hannes Rudolph (`hrudolph`)** on [Discord](https://discord.gg/roocode) to get assigned. Assignment will be confirmed in the thread. +- **PRs must link to the issue.** Unlinked PRs may be closed. ### Deciding What to Work On -- Check the [GitHub Project](https://github.com/orgs/RooCodeInc/projects/1) for unassigned "Good First Issues." +- Check the [GitHub Project](https://github.com/orgs/RooCodeInc/projects/1) for "Issue [Unassigned]" issues. - For docs, visit [Roo Code Docs](https://github.com/RooCodeInc/Roo-Code-Docs). ### Reporting Bugs - Check for existing reports first. -- Create new bugs using the ["Bug Report" template](https://github.com/RooCodeInc/Roo-Code/issues/new/choose). +- Create a new bug using the ["Bug Report" template](https://github.com/RooCodeInc/Roo-Code/issues/new/choose) with: + - Clear, numbered reproduction steps + - Expected vs actual result + - Roo Code version (required); API provider/model if relevant - **Security issues**: Report privately via [security advisories](https://github.com/RooCodeInc/Roo-Code/security/advisories/new). ## Development & Submission Process @@ -118,13 +120,14 @@ pnpm install - Begin as a **Draft PR** if seeking early feedback. - Clearly describe your changes following the Pull Request Template. +- Link the issue in the PR description/title (e.g., "Fixes #123"). - Provide screenshots/videos for UI changes. - Indicate if documentation updates are necessary. ### Pull Request Policy -- Must reference pre-approved, assigned issues. -- PRs without adherence to the policy may be closed. +- Must reference an assigned GitHub Issue. To get assigned: comment "Claiming" on the issue and DM **Hannes Rudolph (`hrudolph`)** on [Discord](https://discord.gg/roocode). Assignment will be confirmed in the thread. +- Unlinked PRs may be closed. - PRs should pass CI tests, align with the roadmap, and have clear documentation. ### Review Process diff --git a/PRIVACY.md b/PRIVACY.md index 2385fc27b9..02e8e15103 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,6 +1,6 @@ # Roo Code Privacy Policy -**Last Updated: August 20th, 2025** +**Last Updated: September 11th, 2025** Roo Code respects your privacy and is committed to transparency about how we handle your data. Below is a simple breakdown of where key pieces of data go—and, importantly, where they don’t. @@ -10,19 +10,19 @@ Roo Code respects your privacy and is committed to transparency about how we han - **Commands**: Any commands executed through Roo Code happen on your local environment. However, when you use AI-powered features, the relevant code and context from your commands may be transmitted to your chosen AI model provider (e.g., OpenAI, Anthropic, OpenRouter) to generate responses. We do not have access to or store this data, but AI providers may process it per their privacy policies. - **Prompts & AI Requests**: When you use AI-powered features, your prompts and relevant project context are sent to your chosen AI model provider (e.g., OpenAI, Anthropic, OpenRouter) to generate responses. We do not store or process this data. These AI providers have their own privacy policies and may store data per their terms of service. If you choose Roo Code Cloud as the provider (proxy mode), prompts may transit Roo Code servers only to forward them to the upstream model and are not stored. - **API Keys & Credentials**: If you enter an API key (e.g., to connect an AI model), it is stored locally on your device and never sent to us or any third party, except the provider you have chosen. -- **Telemetry (Usage Data)**: We only collect feature usage and error data if you explicitly opt-in. This telemetry is powered by PostHog and helps us understand feature usage to improve Roo Code. This includes your VS Code machine ID and feature usage patterns and exception reports. We do **not** collect personally identifiable information, your code, or AI prompts. -- **Marketplace Requests**: When you browse or search the Marketplace for Model Configuration Profiles (MCPs) or Custom Modes, Roo Code makes a secure API call to Roo Code’s backend servers to retrieve listing information. These requests send only the query parameters (e.g., extension version, search term) necessary to fulfill the request and do not include your code, prompts, or personally identifiable information. +- **Telemetry (Usage Data)**: We collect anonymous feature usage and error data to help us improve Roo Code. This telemetry is powered by PostHog and includes your VS Code machine ID, feature usage patterns, and exception reports. This telemetry does **not** collect personally identifiable information, your code, or AI prompts. You can opt out of this telemetry at any time through the settings. +- **Marketplace Requests**: When you browse or search the Marketplace for Model Configuration Profiles (MCPs) or Custom Modes, Roo Code makes a secure API call to Roo Code's backend servers to retrieve listing information. These requests send only the query parameters (e.g., extension version, search term) necessary to fulfill the request and do not include your code, prompts, or personally identifiable information. ### **How We Use Your Data (If Collected)** -- If you opt-in to telemetry, we use it to understand feature usage and improve Roo Code. +- We use telemetry to understand feature usage and improve Roo Code. - We do **not** sell or share your data. - We do **not** train any models on your data. ### **Your Choices & Control** - You can run models locally to prevent data being sent to third-parties. -- By default, telemetry collection is off and if you turn it on, you can opt out of telemetry at any time. +- Telemetry collection is enabled by default to help us improve Roo Code, but you can opt out at any time through the settings. - You can delete Roo Code to stop all data collection. ### **Security & Updates** diff --git a/README.md b/README.md index 2f3a6069d9..354c6e4703 100644 --- a/README.md +++ b/README.md @@ -1,124 +1,89 @@ -
- +

+ VS Code + X + YouTube + Join Discord + Join r/RooCode +

+

+ Get help fast → Join Discord • Prefer async? → Join r/RooCode +

-English • [Català](locales/ca/README.md) • [Deutsch](locales/de/README.md) • [Español](locales/es/README.md) • [Français](locales/fr/README.md) • [हिंदी](locales/hi/README.md) • [Bahasa Indonesia](locales/id/README.md) • [Italiano](locales/it/README.md) • [日本語](locales/ja/README.md) +# Roo Code -
- +> Your AI-Powered Dev Team, Right in Your Editor -[한국어](locales/ko/README.md) • [Nederlands](locales/nl/README.md) • [Polski](locales/pl/README.md) • [Português (BR)](locales/pt-BR/README.md) • [Русский](locales/ru/README.md) • [Türkçe](locales/tr/README.md) • [Tiếng Việt](locales/vi/README.md) • [简体中文](locales/zh-CN/README.md) • [繁體中文](locales/zh-TW/README.md) +
+ 🌐 Available languages - -
-
-
-

Roo Code

-

- -

-

Connect with developers, contribute ideas, and stay ahead with the latest AI-powered coding tools.

- - Join Discord - Join Reddit - -
-
-
- -
- -Download on VS Marketplace -Feature Requests -Rate & Review -Documentation - -
- -**Roo Code** is an AI-powered **autonomous coding agent** that lives in your editor. It can: - -- Communicate in natural language -- Read and write files directly in your workspace -- Run terminal commands -- Automate browser actions -- Integrate with any OpenAI-compatible or custom API/model -- Adapt its “personality” and capabilities through **Custom Modes** - -Whether you’re seeking a flexible coding partner, a system architect, or specialized roles like a QA engineer or product manager, Roo Code can help you build software more efficiently. - -Check out the [CHANGELOG](CHANGELOG.md) for detailed updates and fixes. +- [English](README.md) +- [Català](locales/ca/README.md) +- [Deutsch](locales/de/README.md) +- [Español](locales/es/README.md) +- [Français](locales/fr/README.md) +- [हिंदी](locales/hi/README.md) +- [Bahasa Indonesia](locales/id/README.md) +- [Italiano](locales/it/README.md) +- [日本語](locales/ja/README.md) +- [한국어](locales/ko/README.md) +- [Nederlands](locales/nl/README.md) +- [Polski](locales/pl/README.md) +- [Português (BR)](locales/pt-BR/README.md) +- [Русский](locales/ru/README.md) +- [Türkçe](locales/tr/README.md) +- [Tiếng Việt](locales/vi/README.md) +- [简体中文](locales/zh-CN/README.md) +- [繁體中文](locales/zh-TW/README.md) +- ... + --- -## 🎉 Roo Code 3.25 Released +## What Can Roo Code Do For YOU? -Roo Code 3.25 brings powerful new features and significant improvements to enhance your development workflow! +- Generate Code from natural language descriptions and specs +- Adapt with Modes: Code, Architect, Ask, Debug, and Custom Modes +- Refactor & Debug existing code +- Write & Update documentation +- Answer Questions about your codebase +- Automate repetitive tasks +- Utilize MCP Servers -- **Message Queueing** - Queue multiple messages while Roo is working, allowing you to continue planning your workflow without interruption. -- **Custom Slash Commands** - Create personalized slash commands for quick access to frequently used prompts and workflows, with full UI management. -- **Enhanced Gemini Tools** - New URL context and Google Search grounding capabilities provide Gemini models with real-time web information and enhanced research abilities. +## Modes ---- +Roo Code adapts to how you work: -## What Can Roo Code Do? +- Code Mode: everyday coding, edits, and file ops +- Architect Mode: plan systems, specs, and migrations +- Ask Mode: fast answers, explanations, and docs +- Debug Mode: trace issues, add logs, isolate root causes +- Custom Modes: build specialized modes for your team or workflow +- Roomote Control: Roomote Control lets you remotely control tasks running in your local VS Code instance. -- 🚀 **Generate Code** from natural language descriptions -- 🔧 **Refactor & Debug** existing code -- 📝 **Write & Update** documentation -- 🤔 **Answer Questions** about your codebase -- 🔄 **Automate** repetitive tasks -- 🏗️ **Create** new files and projects +Learn more: [Using Modes](https://docs.roocode.com/basic-usage/using-modes) • [Custom Modes](https://docs.roocode.com/advanced-usage/custom-modes) • [Custom Modes](https://docs.roocode.com/roo-code-cloud/roomote-control) -## Quick Start +## Tutorial & Feature Videos -1. [Install Roo Code](https://docs.roocode.com/getting-started/installing) -2. [Connect Your AI Provider](https://docs.roocode.com/getting-started/connecting-api-provider) -3. [Try Your First Task](https://docs.roocode.com/getting-started/your-first-task) +
-## Key Features +| | | | +| :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +|
Installing Roo Code |
Configuring Profiles |
Codebase Indexing | +|
Custom Modes |
Checkpoints |
Todo Lists | -### Multiple Modes - -Roo Code adapts to your needs with specialized [modes](https://docs.roocode.com/basic-usage/using-modes): - -- **Code Mode:** For general-purpose coding tasks -- **Architect Mode:** For planning and technical leadership -- **Ask Mode:** For answering questions and providing information -- **Debug Mode:** For systematic problem diagnosis -- **[Custom Modes](https://docs.roocode.com/advanced-usage/custom-modes):** Create unlimited specialized personas for security auditing, performance optimization, documentation, or any other task - -### Smart Tools - -Roo Code comes with powerful [tools](https://docs.roocode.com/basic-usage/how-tools-work) that can: - -- Read and write files in your project -- Execute commands in your VS Code terminal -- Control a web browser -- Use external tools via [MCP (Model Context Protocol)](https://docs.roocode.com/advanced-usage/mcp) - -MCP extends Roo Code's capabilities by allowing you to add unlimited custom tools. Integrate with external APIs, connect to databases, or create specialized development tools - MCP provides the framework to expand Roo Code's functionality to meet your specific needs. - -### Customization - -Make Roo Code work your way with: - -- [Custom Instructions](https://docs.roocode.com/advanced-usage/custom-instructions) for personalized behavior -- [Custom Modes](https://docs.roocode.com/advanced-usage/custom-modes) for specialized tasks -- [Local Models](https://docs.roocode.com/advanced-usage/local-models) for offline use -- [Auto-Approval Settings](https://docs.roocode.com/advanced-usage/auto-approving-actions) for faster workflows +
+

+More quick tutorial and feature videos... +

## Resources -### Documentation - -- [Basic Usage Guide](https://docs.roocode.com/basic-usage/the-chat-interface) -- [Advanced Features](https://docs.roocode.com/advanced-usage/auto-approving-actions) -- [Frequently Asked Questions](https://docs.roocode.com/faq) - -### Community - -- **Discord:** [Join our Discord server](https://discord.gg/roocode) for real-time help and discussions -- **Reddit:** [Visit our subreddit](https://www.reddit.com/r/RooCode) to share experiences and tips -- **GitHub:** Report [issues](https://github.com/RooCodeInc/Roo-Code/issues) or request [features](https://github.com/RooCodeInc/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop) +- **[Documentation](https://docs.roocode.com):** The official guide to installing, configuring, and mastering Roo Code. +- **[YouTube Channel](https://youtube.com/@roocodeyt?feature=shared):** Watch tutorials and see features in action. +- **[Discord Server](https://discord.gg/roocode):** Join the community for real-time help and discussion. +- **[Reddit Community](https://www.reddit.com/r/RooCode):** Share your experiences and see what others are building. +- **[GitHub Issues](https://github.com/RooCodeInc/Roo-Code/issues):** Report bugs and track development. +- **[Feature Requests](https://github.com/RooCodeInc/Roo-Code/discussions/categories/feature-requests?discussions_q=is%3Aopen+category%3A%22Feature+Requests%22+sort%3Atop):** Have an idea? Share it with the developers. --- @@ -208,47 +173,7 @@ 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
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| -| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| 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
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| -| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| -| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| 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
| brunobergher
brunobergher
| 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
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| -| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| -| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| -| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| -| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| -| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| -| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| -| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| -| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| -| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| -| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| -| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| -| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| -| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| -| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| -| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| -| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| -| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| 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
| AntiMoron
AntiMoron
| -| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| -| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| -| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| -| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| -| 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
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| -| Jdo300
Jdo300
| hesara
hesara
| | | | | +[![Contributors](https://contrib.rocks/image?repo=RooCodeInc/roo-code&max=120&columns=12&cacheBust=0000000000)](https://github.com/RooCodeInc/roo-code/graphs/contributors) diff --git a/apps/vscode-e2e/src/runTest.ts b/apps/vscode-e2e/src/runTest.ts index 2e8b262a49..2bec946b4a 100644 --- a/apps/vscode-e2e/src/runTest.ts +++ b/apps/vscode-e2e/src/runTest.ts @@ -38,6 +38,7 @@ async function main() { extensionTestsPath, launchArgs: [testWorkspace], extensionTestsEnv, + version: process.env.VSCODE_VERSION || "1.101.2", }) // Clean up the temporary workspace diff --git a/apps/web-docs/.gitkeep b/apps/web-docs/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/web-docs/README.md b/apps/web-docs/README.md deleted file mode 100644 index 1333ed77b7..0000000000 --- a/apps/web-docs/README.md +++ /dev/null @@ -1 +0,0 @@ -TODO diff --git a/apps/web-evals/package.json b/apps/web-evals/package.json index df8efec115..869355100f 100644 --- a/apps/web-evals/package.json +++ b/apps/web-evals/package.json @@ -24,7 +24,7 @@ "@radix-ui/react-slider": "^1.2.4", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tabs": "^1.1.3", - "@radix-ui/react-tooltip": "^1.1.8", + "@radix-ui/react-tooltip": "^1.2.8", "@roo-code/evals": "workspace:^", "@roo-code/types": "workspace:^", "@tanstack/react-query": "^5.69.0", diff --git a/apps/web-roo-code/next.config.ts b/apps/web-roo-code/next.config.ts index b50bd93994..ec82764607 100644 --- a/apps/web-roo-code/next.config.ts +++ b/apps/web-roo-code/next.config.ts @@ -21,7 +21,7 @@ const nextConfig: NextConfig = { destination: "https://roocode.com/:path*", permanent: true, }, - // Redirect cloud waitlist to Notion page + // Redirect cloud waitlist to Notion page (kept for extension compatibility) { source: "/cloud-waitlist", destination: "https://roo-code.notion.site/238fd1401b0a8087b858e1ad431507cf?pvs=105", diff --git a/apps/web-roo-code/package.json b/apps/web-roo-code/package.json index fa59cacccb..ceda6f6296 100644 --- a/apps/web-roo-code/package.json +++ b/apps/web-roo-code/package.json @@ -22,17 +22,19 @@ "embla-carousel-auto-scroll": "^8.6.0", "embla-carousel-autoplay": "^8.6.0", "embla-carousel-react": "^8.6.0", - "framer-motion": "^12.15.0", + "framer-motion": "12.15.0", "lucide-react": "^0.518.0", "next": "^15.2.5", "next-themes": "^0.4.6", "posthog-js": "^1.248.1", "react": "^18.3.1", + "react-cookie-consent": "^9.0.0", "react-dom": "^18.3.1", "react-icons": "^5.5.0", "recharts": "^2.15.3", "tailwind-merge": "^3.3.0", "tailwindcss-animate": "^1.0.7", + "tldts": "^6.1.86", "zod": "^3.25.61" }, "devDependencies": { diff --git a/apps/web-roo-code/src/app/evals/evals.tsx b/apps/web-roo-code/src/app/evals/evals.tsx index 6b619de2b8..294d702f84 100644 --- a/apps/web-roo-code/src/app/evals/evals.tsx +++ b/apps/web-roo-code/src/app/evals/evals.tsx @@ -1,61 +1,35 @@ "use client" import { useMemo } from "react" -import { ScatterChart, Scatter, XAxis, YAxis, Label, Customized, Cross } from "recharts" - -import type { TaskMetrics, Run } from "@roo-code/evals" import { formatTokens, formatCurrency, formatDuration, formatScore } from "@/lib" import { useOpenRouterModels } from "@/lib/hooks" -import { - ChartContainer, - ChartTooltip, - ChartTooltipContent, - ChartConfig, - ChartLegend, - ChartLegendContent, - Table, - TableBody, - TableCaption, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui" +import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui" -export function Evals({ - runs, -}: { - runs: (Run & { - label: string - score: number - languageScores?: Record<"go" | "java" | "javascript" | "python" | "rust", number> - taskMetrics: TaskMetrics - modelId?: string - })[] -}) { +import type { EvalRun } from "./types" +import { Plot } from "./plot" + +export function Evals({ runs }: { runs: EvalRun[] }) { const { data: openRouterModels } = useOpenRouterModels() - const tableData = useMemo( + const tableData: (EvalRun & { label: string; cost: number })[] = useMemo( () => - runs.map((run) => ({ - ...run, - label: run.description || run.model, - score: run.score, - cost: run.taskMetrics.cost, - model: openRouterModels?.[run.modelId ?? ""], - modelInfo: openRouterModels?.[run.modelId ?? ""]?.modelInfo, - })), + runs.map((run) => { + const openRouterModelInfo = openRouterModels?.[run.modelId ?? ""]?.modelInfo + + return { + ...run, + label: run.name || run.description || run.model, + cost: run.taskMetrics.cost, + description: run.description ?? openRouterModelInfo?.description ?? null, + contextWindow: run.contextWindow ?? openRouterModelInfo?.contextWindow ?? null, + inputPrice: run.inputPrice ?? openRouterModelInfo?.inputPrice ?? null, + outputPrice: run.outputPrice ?? openRouterModelInfo?.outputPrice ?? null, + } + }), [runs, openRouterModels], ) - const chartData = useMemo(() => tableData.filter(({ cost }) => cost < 100), [tableData]) - - const chartConfig = useMemo( - () => chartData.reduce((acc, run) => ({ ...acc, [run.label]: run }), {} as ChartConfig), - [chartData], - ) - return (
@@ -127,17 +101,15 @@ export function Evals({ {tableData.map((run) => ( - +
{run.label}
-
- {formatTokens(run.modelInfo?.contextWindow ?? 0)} -
+
{formatTokens(run.contextWindow)}
-
{formatCurrency(run.modelInfo?.inputPrice ?? 0)}
+
{formatCurrency(run.inputPrice)}
/
-
{formatCurrency(run.modelInfo?.outputPrice ?? 0)}
+
{formatCurrency(run.outputPrice)}
{formatDuration(run.taskMetrics.duration)} @@ -169,58 +141,9 @@ export function Evals({ ))}
-
Cost Versus Score
- - - Math.round((dataMin - 5) / 5) * 5, - (dataMax: number) => Math.round((dataMax + 5) / 5) * 5, - ]} - tickFormatter={(value) => formatCurrency(value)}> - - Math.max(0, Math.round((dataMin - 5) / 5) * 5), - (dataMax: number) => Math.min(100, Math.round((dataMax + 5) / 5) * 5), - ]} - tickFormatter={(value) => `${value}%`}> - - } /> - - {chartData.map((d, i) => ( - - ))} - } /> - - -
- (Note: Very expensive models are excluded from the scatter plot.) -
+
) } - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const renderQuadrant = (props: any) => ( - -) diff --git a/apps/web-roo-code/src/app/evals/plot.tsx b/apps/web-roo-code/src/app/evals/plot.tsx new file mode 100644 index 0000000000..f68007cd12 --- /dev/null +++ b/apps/web-roo-code/src/app/evals/plot.tsx @@ -0,0 +1,336 @@ +"use client" + +import { useMemo } from "react" +import { ScatterChart, Scatter, XAxis, YAxis, Customized, Cross, LabelList } from "recharts" + +import { formatCurrency } from "@/lib" +import { ChartContainer, ChartTooltip, ChartConfig } from "@/components/ui" + +import type { EvalRun } from "./types" + +type PlotProps = { + tableData: (EvalRun & { label: string; cost: number })[] +} + +type LabelPosition = "top" | "bottom" | "left" | "right" + +export const Plot = ({ tableData }: PlotProps) => { + const chartData = useMemo(() => tableData.filter(({ cost }) => cost < 50), [tableData]) + + const chartConfig = useMemo( + () => chartData.reduce((acc, run) => ({ ...acc, [run.label]: run }), {} as ChartConfig), + [chartData], + ) + + // Calculate label positions to avoid overlaps. + const labelPositions = useMemo(() => { + const positions: Record = {} + + // Track placed labels with their approximate bounds. + const placedLabels: Array<{ + cost: number + score: number + label: string + position: LabelPosition + }> = [] + + // Helper function to check if two labels would overlap. + const wouldLabelsOverlap = ( + p1: { cost: number; score: number; position: LabelPosition }, + p2: { cost: number; score: number; position: LabelPosition }, + ): boolean => { + // Approximate thresholds for overlap detection. + const horizontalThreshold = 4 // Cost units. + const verticalThreshold = 5 // Score units. + + const costDiff = Math.abs(p1.cost - p2.cost) + const scoreDiff = Math.abs(p1.score - p2.score) + + // If points are far apart, no overlap. + if (costDiff > horizontalThreshold * 2 || scoreDiff > verticalThreshold * 2) { + return false + } + + // Check specific position combinations for overlap. + // Same position for nearby points definitely overlaps. + if (p1.position === p2.position && costDiff < horizontalThreshold && scoreDiff < verticalThreshold) { + return true + } + + // Check adjacent position overlaps. + const p1IsTop = p1.position === "top" + const p1IsBottom = p1.position === "bottom" + const p2IsTop = p2.position === "top" + const p2IsBottom = p2.position === "bottom" + + // If both labels are on the same vertical side and points are close + // horizontally. + if ((p1IsTop && p2IsTop) || (p1IsBottom && p2IsBottom)) { + if (costDiff < horizontalThreshold && scoreDiff < verticalThreshold / 2) { + return true + } + } + + return false + } + + // Helper function to check if position would overlap with a data point. + const wouldOverlapPoint = (point: (typeof chartData)[0], position: LabelPosition): boolean => { + for (const other of chartData) { + if (other.label === point.label) { + continue + } + + const costDiff = Math.abs(point.cost - other.cost) + const scoreDiff = Math.abs(point.score - other.score) + + // Check if label would be placed on top of another point. + switch (position) { + case "top": + // Label is above, check if there's a point above. + if (costDiff < 3 && other.score > point.score && other.score - point.score < 6) { + return true + } + break + case "bottom": + // Label is below, check if there's a point below. + if (costDiff < 3 && other.score < point.score && point.score - other.score < 6) { + return true + } + break + case "left": + // Label is to the left, check if there's a point to the left. + if (scoreDiff < 3 && other.cost < point.cost && point.cost - other.cost < 4) { + return true + } + break + case "right": + // Label is to the right, check if there's a point to the right. + if (scoreDiff < 3 && other.cost > point.cost && other.cost - point.cost < 4) { + return true + } + break + } + } + return false + } + + // Sort points to process them in a consistent order. + // Process from top-left to bottom-right. + const sortedData = [...chartData].sort((a, b) => { + // First by score (higher first). + const scoreDiff = b.score - a.score + if (Math.abs(scoreDiff) > 1) return scoreDiff + // Then by cost (lower first). + return a.cost - b.cost + }) + + // Process each point and find the best position. + sortedData.forEach((point) => { + // Try positions in order of preference. + const positionPreferences: LabelPosition[] = ["top", "bottom", "right", "left"] + + let bestPosition: LabelPosition = "top" + + for (const position of positionPreferences) { + // Check if this position would overlap with any placed labels. + let hasLabelOverlap = false + + for (const placed of placedLabels) { + if ( + wouldLabelsOverlap( + { cost: point.cost, score: point.score, position }, + { cost: placed.cost, score: placed.score, position: placed.position }, + ) + ) { + hasLabelOverlap = true + break + } + } + + // Check if this position would overlap with any data points. + const hasPointOverlap = wouldOverlapPoint(point, position) + + // If no overlaps, use this position. + if (!hasLabelOverlap && !hasPointOverlap) { + bestPosition = position + break + } + } + + // Use the best position found + positions[point.label] = bestPosition + placedLabels.push({ + cost: point.cost, + score: point.score, + label: point.label, + position: bestPosition, + }) + }) + + return positions + }, [chartData]) + + return ( + <> +
Cost x Score
+ + + Math.max(0, Math.round((dataMin - 5) / 5) * 5), + (dataMax: number) => Math.round((dataMax + 5) / 5) * 5, + ]} + tickFormatter={(value) => formatCurrency(value)} + /> + Math.max(0, Math.round((dataMin - 5) / 5) * 5), + (dataMax: number) => Math.min(100, Math.round((dataMax + 5) / 5) * 5), + ]} + tickFormatter={(value) => `${value}%`} + /> + { + if (!active || !payload || !payload.length || !payload[0]) { + return null + } + + const { label, cost, score } = payload[0].payload + + return ( +
+
{label}
+
+
+ Score: {Math.round(score)}% +
+
+ Cost: {formatCurrency(cost)} +
+
+
+ ) + }} + /> + + {chartData.map((d, index) => ( + + renderCustomLabel(props, labelPositions[d.label] || "top")} + /> + + ))} +
+
+
+ (Note: Models with a cost of $50 or more are excluded from the scatter plot.) +
+ + ) +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const renderQuadrant = (props: any) => ( + +) + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const renderCustomLabel = (props: any, position: LabelPosition) => { + const { x, y, value } = props + const maxWidth = 80 // Maximum width in pixels - adjust as needed. + + const truncateText = (text: string, maxChars: number = 20) => { + if (text.length <= maxChars) { + return text + } + + return text.substring(0, maxChars - 1) + "…" + } + + // Calculate position offsets based on label position. + let xOffset = 0 + let yOffset = 0 + let textAnchor: "middle" | "start" | "end" = "middle" + let dominantBaseline: "auto" | "hanging" | "middle" = "auto" + + switch (position) { + case "top": + yOffset = -8 + textAnchor = "middle" + dominantBaseline = "auto" + break + case "bottom": + yOffset = 15 + textAnchor = "middle" + dominantBaseline = "hanging" + break + case "left": + xOffset = -8 + yOffset = 5 + textAnchor = "end" + dominantBaseline = "middle" + break + case "right": + xOffset = 15 + yOffset = 5 + textAnchor = "start" + dominantBaseline = "middle" + break + } + + return ( + + {truncateText(value)} + + ) +} + +const generateSpectrumColor = (index: number, total: number): string => { + // Distribute hues evenly across the color wheel (0-360 degrees). + // Start at 0 (red) and distribute evenly. + const hue = (index * 360) / total + + // Use high saturation for vibrant colors. + const saturation = 70 + + // Use medium lightness for good visibility on both light and dark backgrounds. + const lightness = 50 + + return `hsl(${Math.round(hue)}, ${saturation}%, ${lightness}%)` +} diff --git a/apps/web-roo-code/src/app/evals/types.ts b/apps/web-roo-code/src/app/evals/types.ts new file mode 100644 index 0000000000..c28049661d --- /dev/null +++ b/apps/web-roo-code/src/app/evals/types.ts @@ -0,0 +1,9 @@ +import type { TaskMetrics, Run } from "@roo-code/evals" + +export type EvalRun = Run & { + label: string + score: number + languageScores?: Record<"go" | "java" | "javascript" | "python" | "rust", number> + taskMetrics: TaskMetrics + modelId?: string +} diff --git a/apps/web-roo-code/src/app/layout.tsx b/apps/web-roo-code/src/app/layout.tsx index ac33c8920f..0810598049 100644 --- a/apps/web-roo-code/src/app/layout.tsx +++ b/apps/web-roo-code/src/app/layout.tsx @@ -1,8 +1,8 @@ import React from "react" import type { Metadata } from "next" import { Inter } from "next/font/google" -import Script from "next/script" import { SEO } from "@/lib/seo" +import { CookieConsentWrapper } from "@/components/CookieConsentWrapper" import { Providers } from "@/components/providers" @@ -93,22 +93,13 @@ export default function RootLayout({ children }: { children: React.ReactNode }) /> - {/* Google tag (gtag.js) */} -
{children} + diff --git a/apps/web-roo-code/src/app/page.tsx b/apps/web-roo-code/src/app/page.tsx index a7fd810a66..bafef64936 100644 --- a/apps/web-roo-code/src/app/page.tsx +++ b/apps/web-roo-code/src/app/page.tsx @@ -32,14 +32,17 @@ export default async function Home() { AI-Powered - Dev Team, Right in Your Editor. + Dev Team, in Your Editor + + and Beyond +

- Supercharge your editor with AI that{" "} + Supercharge your software development with AI that{" "} understands your codebase - - , streamlines development, and helps you write, refactor, and debug with ease. + {" "} + and helps you write, refactor, and debug with ease in your editor and in the cloud.

diff --git a/apps/web-roo-code/src/components/CookieConsentWrapper.tsx b/apps/web-roo-code/src/components/CookieConsentWrapper.tsx new file mode 100644 index 0000000000..23b8f5a28f --- /dev/null +++ b/apps/web-roo-code/src/components/CookieConsentWrapper.tsx @@ -0,0 +1,111 @@ +"use client" + +import React, { useState, useEffect } from "react" +import ReactCookieConsent from "react-cookie-consent" +import { Cookie } from "lucide-react" +import { getDomain } from "tldts" +import { CONSENT_COOKIE_NAME } from "@roo-code/types" +import { dispatchConsentEvent } from "@/lib/analytics/consent-manager" + +/** + * GDPR-compliant cookie consent banner component + * Handles both the UI and consent event dispatching + */ +export function CookieConsentWrapper() { + const [cookieDomain, setCookieDomain] = useState(null) + + useEffect(() => { + // Get the appropriate domain using tldts + if (typeof window !== "undefined") { + const domain = getDomain(window.location.hostname) + setCookieDomain(domain) + } + }, []) + + const handleAccept = () => { + dispatchConsentEvent(true) + } + + const handleDecline = () => { + dispatchConsentEvent(false) + } + + const extraCookieOptions = cookieDomain + ? { + domain: cookieDomain, + } + : {} + + const containerClasses = ` + fixed bottom-2 left-2 right-2 z-[999] + bg-black/95 dark:bg-white/95 + text-white dark:text-black + border-t-neutral-800 dark:border-t-gray-200 + backdrop-blur-xl + border-t + font-semibold + rounded-t-lg + px-4 py-4 md:px-8 md:py-4 + flex flex-wrap items-center justify-between gap-4 + text-sm font-sans + `.trim() + + const buttonWrapperClasses = ` + flex + flex-row-reverse + items-center + gap-2 + `.trim() + + const acceptButtonClasses = ` + bg-white text-black border-neutral-800 + dark:bg-black dark:text-white dark:border-gray-200 + hover:opacity-50 + transition-opacity + rounded-md + px-4 py-2 mr-2 + text-sm font-bold + cursor-pointer + focus:outline-none focus:ring-2 focus:ring-offset-2 + `.trim() + + const declineButtonClasses = ` + dark:bg-white dark:text-black dark:border-gray-200 + bg-black text-white border-neutral-800 + hover:opacity-50 + border border-border + transition-opacity + rounded-md + px-4 py-2 + text-sm font-bold + cursor-pointer + focus:outline-none focus:ring-2 focus:ring-offset-2 + `.trim() + + return ( +
+ +
+ + Like most of the internet, we use cookies. Are you OK with that? +
+
+
+ ) +} diff --git a/apps/web-roo-code/src/components/chromes/nav-bar.tsx b/apps/web-roo-code/src/components/chromes/nav-bar.tsx index ca6a4d4b4f..00fe9d2727 100644 --- a/apps/web-roo-code/src/components/chromes/nav-bar.tsx +++ b/apps/web-roo-code/src/components/chromes/nav-bar.tsx @@ -69,19 +69,13 @@ export function NavBar({ stars, downloads }: NavBarProps) { className="text-muted-foreground transition-transform duration-200 hover:scale-105 hover:text-foreground"> Community -
-
- - Roo Code Cloud is coming - - - Sign up - -
-
+ + Cloud +
@@ -121,19 +115,6 @@ export function NavBar({ stars, downloads }: NavBarProps) {