Skip to content

Commit 212150a

Browse files
committed
Merge remote-tracking branch 'origin/main' into marketplace_review
2 parents a688883 + bfeb12b commit 212150a

Some content is hidden

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

74 files changed

+1301
-2554
lines changed

.changeset/metal-suns-lay.md

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
name: 'Slack Notification'
2+
description: 'Send Slack notification for workflow failures'
3+
inputs:
4+
webhook-url:
5+
description: 'Slack webhook URL'
6+
required: true
7+
channel:
8+
description: 'Slack channel to notify'
9+
required: true
10+
workflow-name:
11+
description: 'Name of the workflow'
12+
required: true
13+
failed-jobs:
14+
description: 'JSON object containing job results'
15+
required: true
16+
17+
runs:
18+
using: 'composite'
19+
steps:
20+
- name: Parse failed jobs
21+
id: parse-jobs
22+
shell: bash
23+
run: |
24+
echo "Parsing job results..."
25+
failed_list=""
26+
27+
echo '${{ inputs.failed-jobs }}' | jq -r 'to_entries[] | select(.value.result == "failure") | .key' | while read job; do
28+
case $job in
29+
"check-translations") failed_list="${failed_list}❌ Translation check\n" ;;
30+
"knip") failed_list="${failed_list}❌ Knip analysis\n" ;;
31+
"compile") failed_list="${failed_list}❌ Compile & lint\n" ;;
32+
"unit-test") failed_list="${failed_list}❌ Unit tests\n" ;;
33+
"integration-test") failed_list="${failed_list}❌ Integration tests\n" ;;
34+
esac
35+
done
36+
37+
echo "failed_jobs<<EOF" >> $GITHUB_OUTPUT
38+
echo -e "$failed_list" | sed '/^$/d' >> $GITHUB_OUTPUT
39+
echo "EOF" >> $GITHUB_OUTPUT
40+
41+
- name: Send Slack notification
42+
uses: 8398a7/action-slack@v3
43+
with:
44+
status: failure
45+
channel: ${{ inputs.channel }}
46+
text: |
47+
🚨 ${{ inputs.workflow-name }} workflow failed on main branch!
48+
49+
Repository: ${{ github.repository }}
50+
Commit: ${{ github.sha }}
51+
Author: ${{ github.actor }}
52+
53+
Failed jobs:
54+
${{ steps.parse-jobs.outputs.failed_jobs }}
55+
56+
View details: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
57+
env:
58+
SLACK_WEBHOOK_URL: ${{ inputs.webhook-url }}

.github/workflows/code-qa.yml

Lines changed: 97 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,107 @@
11
name: Code QA Roo Code
22

33
on:
4-
workflow_dispatch:
5-
push:
6-
branches: [main]
7-
pull_request:
8-
types: [opened, reopened, ready_for_review, synchronize]
9-
branches: [main]
4+
workflow_dispatch:
5+
push:
6+
branches: [main]
7+
pull_request:
8+
types: [opened, reopened, ready_for_review, synchronize]
9+
branches: [main]
1010

1111
jobs:
12-
check-translations:
13-
runs-on: ubuntu-latest
14-
steps:
15-
- name: Checkout code
16-
uses: actions/checkout@v4
17-
- name: Setup Node.js and pnpm
18-
uses: ./.github/actions/setup-node-pnpm
19-
- name: Verify all translations are complete
20-
run: node scripts/find-missing-translations.js
12+
check-translations:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- name: Checkout code
16+
uses: actions/checkout@v4
17+
- name: Setup Node.js and pnpm
18+
uses: ./.github/actions/setup-node-pnpm
19+
- name: Verify all translations are complete
20+
run: node scripts/find-missing-translations.js
2121

22-
knip:
23-
runs-on: ubuntu-latest
24-
steps:
25-
- name: Checkout code
26-
uses: actions/checkout@v4
27-
- name: Setup Node.js and pnpm
28-
uses: ./.github/actions/setup-node-pnpm
29-
- name: Run knip checks
30-
run: pnpm knip
22+
knip:
23+
runs-on: ubuntu-latest
24+
steps:
25+
- name: Checkout code
26+
uses: actions/checkout@v4
27+
- name: Setup Node.js and pnpm
28+
uses: ./.github/actions/setup-node-pnpm
29+
- name: Run knip checks
30+
run: pnpm knip
3131

32-
compile:
33-
runs-on: ubuntu-latest
34-
steps:
35-
- name: Checkout code
36-
uses: actions/checkout@v4
37-
- name: Setup Node.js and pnpm
38-
uses: ./.github/actions/setup-node-pnpm
39-
- name: Lint
40-
run: pnpm lint
41-
- name: Check types
42-
run: pnpm check-types
32+
compile:
33+
runs-on: ubuntu-latest
34+
steps:
35+
- name: Checkout code
36+
uses: actions/checkout@v4
37+
- name: Setup Node.js and pnpm
38+
uses: ./.github/actions/setup-node-pnpm
39+
- name: Lint
40+
run: pnpm lint
41+
- name: Check types
42+
run: pnpm check-types
4343

44-
platform-unit-test:
45-
runs-on: ${{ matrix.os }}
46-
strategy:
47-
matrix:
48-
os: [ubuntu-latest, windows-latest]
49-
steps:
50-
- name: Checkout code
51-
uses: actions/checkout@v4
52-
- name: Setup Node.js and pnpm
53-
uses: ./.github/actions/setup-node-pnpm
54-
- name: Run unit tests
55-
run: pnpm test
44+
unit-test:
45+
name: platform-unit-test (${{ matrix.name }})
46+
runs-on: ${{ matrix.os }}
47+
strategy:
48+
matrix:
49+
include:
50+
- os: ubuntu-latest
51+
name: ubuntu-latest
52+
- os: windows-latest
53+
name: windows-latest
54+
steps:
55+
- name: Checkout code
56+
uses: actions/checkout@v4
57+
- name: Setup Node.js and pnpm
58+
uses: ./.github/actions/setup-node-pnpm
59+
- name: Run unit tests
60+
run: pnpm test
5661

57-
check-openrouter-api-key:
58-
runs-on: ubuntu-latest
59-
outputs:
60-
exists: ${{ steps.openrouter-api-key-check.outputs.defined }}
61-
steps:
62-
- name: Check if OpenRouter API key exists
63-
id: openrouter-api-key-check
64-
shell: bash
65-
run: |
66-
if [ "${{ secrets.OPENROUTER_API_KEY }}" != '' ]; then
67-
echo "defined=true" >> $GITHUB_OUTPUT;
68-
else
69-
echo "defined=false" >> $GITHUB_OUTPUT;
70-
fi
62+
check-openrouter-api-key:
63+
runs-on: ubuntu-latest
64+
outputs:
65+
exists: ${{ steps.openrouter-api-key-check.outputs.defined }}
66+
steps:
67+
- name: Check if OpenRouter API key exists
68+
id: openrouter-api-key-check
69+
shell: bash
70+
run: |
71+
if [ "${{ secrets.OPENROUTER_API_KEY }}" != '' ]; then
72+
echo "defined=true" >> $GITHUB_OUTPUT;
73+
else
74+
echo "defined=false" >> $GITHUB_OUTPUT;
75+
fi
7176
72-
integration-test:
73-
runs-on: ubuntu-latest
74-
needs: [check-openrouter-api-key]
75-
if: needs.check-openrouter-api-key.outputs.exists == 'true'
76-
steps:
77-
- name: Checkout code
78-
uses: actions/checkout@v4
79-
- name: Setup Node.js and pnpm
80-
uses: ./.github/actions/setup-node-pnpm
81-
- name: Create .env.local file
82-
working-directory: apps/vscode-e2e
83-
run: echo "OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY }}" > .env.local
84-
- name: Run integration tests
85-
working-directory: apps/vscode-e2e
86-
run: xvfb-run -a pnpm test:ci
77+
integration-test:
78+
runs-on: ubuntu-latest
79+
needs: [check-openrouter-api-key]
80+
if: needs.check-openrouter-api-key.outputs.exists == 'true'
81+
steps:
82+
- name: Checkout code
83+
uses: actions/checkout@v4
84+
- name: Setup Node.js and pnpm
85+
uses: ./.github/actions/setup-node-pnpm
86+
- name: Create .env.local file
87+
working-directory: apps/vscode-e2e
88+
run: echo "OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY }}" > .env.local
89+
- name: Run integration tests
90+
working-directory: apps/vscode-e2e
91+
run: xvfb-run -a pnpm test:ci
92+
93+
notify-slack-on-failure:
94+
runs-on: ubuntu-latest
95+
needs: [check-translations, knip, compile, unit-test, integration-test]
96+
if: ${{ always() && github.event_name == 'push' && github.ref == 'refs/heads/main' && contains(needs.*.result, 'failure') }}
97+
steps:
98+
- name: Checkout code
99+
uses: actions/checkout@v4
100+
101+
- name: Send Slack notification on failure
102+
uses: ./.github/actions/slack-notify
103+
with:
104+
webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
105+
channel: "#ci"
106+
workflow-name: "Code QA"
107+
failed-jobs: ${{ toJSON(needs) }}

.github/workflows/evals.yml

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
name: Evals
2+
3+
on:
4+
pull_request:
5+
types: [labeled]
6+
workflow_dispatch:
7+
8+
env:
9+
DOCKER_BUILDKIT: 1
10+
COMPOSE_DOCKER_CLI_BUILD: 1
11+
12+
jobs:
13+
evals:
14+
# Run if triggered manually or if PR has 'evals' label.
15+
if: github.event_name == 'workflow_dispatch' || contains(github.event.label.name, 'evals')
16+
runs-on: blacksmith-16vcpu-ubuntu-2404
17+
timeout-minutes: 45
18+
19+
defaults:
20+
run:
21+
working-directory: packages/evals
22+
23+
steps:
24+
- name: Checkout repository
25+
uses: actions/checkout@v4
26+
27+
- name: Set up Docker Buildx
28+
uses: docker/setup-buildx-action@v3
29+
30+
- name: Create environment
31+
run: |
32+
cat > .env.local << EOF
33+
OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY || 'test-key-for-build' }}
34+
EOF
35+
36+
cat > .env.development << EOF
37+
NODE_ENV=development
38+
DATABASE_URL=postgresql://postgres:password@db:5432/evals_development
39+
REDIS_URL=redis://redis:6379
40+
HOST_EXECUTION_METHOD=docker
41+
EOF
42+
43+
- name: Build image
44+
uses: docker/build-push-action@v5
45+
with:
46+
context: .
47+
file: packages/evals/Dockerfile.runner
48+
tags: evals-runner:latest
49+
cache-from: type=gha
50+
cache-to: type=gha,mode=max
51+
push: false
52+
load: true
53+
54+
- name: Tag image
55+
run: docker tag evals-runner:latest evals-runner
56+
57+
- name: Start containers
58+
run: |
59+
docker compose up -d db redis
60+
timeout 60 bash -c 'until docker compose exec -T db pg_isready -U postgres; do sleep 2; done'
61+
timeout 60 bash -c 'until docker compose exec -T redis redis-cli ping | grep -q PONG; do sleep 2; done'
62+
docker compose run --rm runner sh -c 'nc -z db 5432 && echo "✓ Runner -> Database connection successful"'
63+
docker compose run --rm runner sh -c 'nc -z redis 6379 && echo "✓ Runner -> Redis connection successful"'
64+
docker compose run --rm runner docker ps
65+
66+
- name: Run database migrations
67+
run: docker compose run --rm runner pnpm --filter @roo-code/evals db:migrate
68+
69+
- name: Run evals
70+
run: docker compose run --rm runner pnpm --filter @roo-code/evals cli --ci
71+
72+
- name: Cleanup
73+
if: always()
74+
run: docker compose down -v --remove-orphans

.github/workflows/update-contributors.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3232
- name: Create Pull Request
3333
if: steps.check-changes.outputs.changes == 'true'
34-
uses: peter-evans/create-pull-request@v5
34+
uses: peter-evans/create-pull-request@v7
3535
with:
3636
token: ${{ secrets.GITHUB_TOKEN }}
3737
commit-message: "docs: update contributors list [skip ci]"

.roomodes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ customModes:
5858
- Add JSDoc comments for complex test scenarios
5959
- Ensure mocks are properly typed
6060
- Verify both positive and negative test cases
61+
- Always use data-testid attributes when testing webview-ui
6162
- slug: design-engineer
6263
name: 🎨 Design Engineer
6364
roleDefinition: >-

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Roo Code Changelog
22

3+
## [3.19.6] - 2025-06-09
4+
5+
- Replace explicit caching with implicit caching to reduce latency for Gemini models
6+
- Clarify that the default concurrent file read limit is 15 files (thanks @olearycrew!)
7+
- Fix copy button logic (thanks @samhvw8!)
8+
- Fade buttons on history preview if no interaction in progress (thanks @sachasayan!)
9+
- Allow MCP server refreshing, fix state changes in MCP server management UI view (thanks @taylorwilsdon!)
10+
- Remove unnecessary npx usage in some npm scripts (thanks @user202729!)
11+
- Bug fix for trailing slash error when using LiteLLM provider (thanks @kcwhite!)
12+
313
## [3.19.5] - 2025-06-05
414

515
- Fix Gemini 2.5 Pro Preview thinking budget bug
Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,22 @@
11
"use server"
22

3-
import * as fs from "fs/promises"
43
import * as path from "path"
54
import { fileURLToPath } from "url"
65

7-
import { type ExerciseLanguage, exerciseLanguages } from "@roo-code/evals"
6+
import { exerciseLanguages, listDirectories } from "@roo-code/evals"
87

98
const __dirname = path.dirname(fileURLToPath(import.meta.url)) // <repo>/apps/web-evals/src/actions
109

11-
const EXERCISES_BASE_PATH = path.resolve(__dirname, "../../../../../evals")
12-
13-
export const listDirectories = async (relativePath: string) => {
14-
try {
15-
const targetPath = path.resolve(__dirname, relativePath)
16-
const entries = await fs.readdir(targetPath, { withFileTypes: true })
17-
return entries.filter((entry) => entry.isDirectory() && !entry.name.startsWith(".")).map((entry) => entry.name)
18-
} catch (error) {
19-
console.error(`Error listing directories at ${relativePath}:`, error)
20-
return []
21-
}
22-
}
10+
const EVALS_REPO_PATH = path.resolve(__dirname, "../../../../../evals")
2311

2412
export const getExercises = async () => {
2513
const result = await Promise.all(
2614
exerciseLanguages.map(async (language) => {
27-
const languagePath = path.join(EXERCISES_BASE_PATH, language)
28-
const exercises = await listDirectories(languagePath)
15+
const languagePath = path.join(EVALS_REPO_PATH, language)
16+
const exercises = await listDirectories(__dirname, languagePath)
2917
return exercises.map((exercise) => `${language}/${exercise}`)
3018
}),
3119
)
3220

3321
return result.flat()
3422
}
35-
36-
export const getExercisesForLanguage = async (language: ExerciseLanguage) =>
37-
listDirectories(path.join(EXERCISES_BASE_PATH, language))

0 commit comments

Comments
 (0)