Skip to content

Commit aad2004

Browse files
Merge main 18861b2 into task123-1653
One file conflicted, src/api/providers/__tests__/opencode-go.spec.ts, in 2 hunks. Both sides changed the same abort-bridging tests: main added tests around the shared abort helpers, this branch replaced their fixed sleeps with waits on observable conditions. The resolution keeps this branch's side at both hunks and keeps main's additions everywhere else, so the merged file is the pre-conversion merged file plus exactly the lines the conversion adds; no line of main's content is dropped. The same holds for the other three specs, which merged cleanly. src/eslint-suppressions.json arrives from main: 39,022 B, 338 files and 3,766 entries at this branch's head, 30,910 B, 265 files and 2,868 entries at main. This branch never touched that file, so the decrease arrives with this merge rather than with any commit of ours, and it is a decrease, not an increase. The merged tree carries both of main's provider-spec hygiene changes, the sleep guard in packages/config-eslint/api-provider-hygiene.js scoped to api/**/__tests__/**/*.spec.ts, and the converted specs, which is why the conversion commit lands in this same push rather than later. Controls on the merged tree, all with node v22.23.4 and pnpm 10.8.1: - the four provider spec files pass 331 of 331 tests, the same count as before the conversion; - pnpm --dir src run lint and the repo-root pnpm lint both exit 0 with 0 problems; - pnpm --dir src run check-types and the repo-root pnpm run check-types both exit 0; - armed mutants at the abort-bridge, timeout-mapping and model-resolution sites fail the same tests against the unconverted and the converted specs. No changeset and no CHANGELOG entry is added here; review state and labels are untouched.
2 parents 6b796fe + 18861b2 commit aad2004

897 files changed

Lines changed: 44040 additions & 15736 deletions

File tree

Some content is hidden

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

‎.coderabbit.yaml‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ reviews:
9696
a call-count check. For code with fallback behavior, verify both the cold-start case
9797
(no prior state) and the warm case (prior state exists) are covered, as they exercise
9898
different branches.
99+
A test double must not re-implement production logic. If a mock, stub, or inline helper
100+
copies a predicate, filter, sort, or transform that also exists in production code, a
101+
change to the production copy cannot fail the test. Bind the real function instead, for
102+
example with `vi.importActual` or `vi.spyOn`, and replace only the external boundary
103+
(network, filesystem, VS Code API).
104+
For code that filters, groups, reorders, or deduplicates a collection, require a test
105+
with mixed input, such as interleaved item types and repeated items, that asserts the
106+
full output array. A test that uses only one item type cannot fail when the production
107+
predicate becomes narrower. Ask for the case that fails when the predicate covers a
108+
subset of the intended items.
109+
When Stryker reports a surviving mutant on changed code, prefer a test that kills it.
110+
If the mutant is equivalent, prefer to delete the redundant branch before adding a
111+
`Stryker disable` comment.
99112
100113
- path: "apps/vscode-e2e/**"
101114
instructions: >-

‎.github/actions/setup-node-pnpm/action.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ runs:
2424
using: "composite"
2525
steps:
2626
- name: Install pnpm
27-
uses: pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86 # v6.0.10
27+
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
2828
with:
2929
version: ${{ inputs.pnpm-version }}
3030
- name: Get pnpm store directory
@@ -39,7 +39,7 @@ runs:
3939
restore-keys: |
4040
${{ runner.os }}-pnpm-store-
4141
- name: Setup Node.js
42-
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
42+
uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
4343
with:
4444
node-version: ${{ inputs.node-version }}
4545
- name: Install dependencies

‎.github/pull_request_template.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ Write the steps that test your changes. This helps reviewers check your work.
4040
- [ ] **Self-Review**: I reviewed my own code with care.
4141
- [ ] **Writing Style**: The PR title and description use Simplified Technical English (ASD-STE100): short sentences, plain words, active voice, one idea per sentence, no contractions.
4242
- [ ] **Testing**: New and/or updated tests have been added to cover my changes (if applicable).
43+
- [ ] **Test Helpers** (test changes only): Shared test helpers (`src/test-utils/`, `@/utils/test-utils`) are used only for mechanical duplication; test intent and scenario-specific mocks remain visible.
4344
- [ ] **Visual Snapshot** (UI changes only): If a user would notice this change at a glance (layout, theme tokens, brand elements, empty/error states), I added or updated a `*.visual.tsx` snapshot in `webview-ui/`. See `webview-ui/AGENTS.md` → "When a UI change needs a snapshot".
4445
- [ ] **Documentation Impact**: I checked if my changes need documentation updates (see "Documentation Updates" section below).
4546
- [ ] **Contribution Guidelines**: I read and agree to the [Contributor Guidelines](/CONTRIBUTING.md).

‎.github/workflows/cli-release.yml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ jobs:
198198
rm -rf "$VERIFY_DIR"
199199
200200
- name: Upload artifact
201-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
201+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
202202
with:
203203
name: cli-${{ matrix.platform }}
204204
path: |
@@ -230,7 +230,7 @@ jobs:
230230
echo "tag=cli-v$VERSION" >> $GITHUB_OUTPUT
231231
232232
- name: Download all artifacts
233-
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
233+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
234234
with:
235235
path: artifacts
236236

@@ -376,7 +376,7 @@ jobs:
376376

377377
steps:
378378
- name: Download all artifacts
379-
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
379+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
380380
with:
381381
path: artifacts
382382

‎.github/workflows/code-qa.yml‎

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ on:
99
merge_group:
1010
types: [checks_requested]
1111

12+
# Cancel superseded runs when a pull request is updated. Non-PR events keep
13+
# unique groups, so main, merge-queue, and manual runs are never cancelled.
14+
concurrency:
15+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
16+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
17+
1218
# Least privilege: every job below escalates only where it needs to.
1319
permissions:
1420
contents: read
@@ -66,8 +72,12 @@ jobs:
6672
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
6773
- name: Setup Node.js and pnpm
6874
uses: ./.github/actions/setup-node-pnpm
75+
with:
76+
install-args: "--frozen-lockfile"
6977
- name: Verify all translations are complete
7078
run: node scripts/find-missing-translations.js
79+
- name: Verify t() calls pass every interpolation variable
80+
run: node scripts/check-i18n-interpolation.js
7181

7282
knip:
7383
runs-on: ubuntu-latest
@@ -76,6 +86,8 @@ jobs:
7686
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
7787
- name: Setup Node.js and pnpm
7888
uses: ./.github/actions/setup-node-pnpm
89+
with:
90+
install-args: "--frozen-lockfile"
7991
- name: Verify Knip guardrails
8092
run: pnpm test:knip-policy
8193
- name: Run knip checks
@@ -90,6 +102,8 @@ jobs:
90102
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
91103
- name: Setup Node.js and pnpm
92104
uses: ./.github/actions/setup-node-pnpm
105+
with:
106+
install-args: "--frozen-lockfile"
93107
- name: Check formatting
94108
run: pnpm format:check
95109
- name: Lint
@@ -110,6 +124,8 @@ jobs:
110124
run: pnpm agent-evals:check-types
111125
- name: Model-check task lifecycle protocols
112126
run: pnpm lifecycle:model-check
127+
- name: Model-check webview recovery
128+
run: pnpm webview-recovery:check-types && pnpm webview-recovery:model-check
113129
- name: Validate MCP OAuth integration
114130
run: pnpm mcp:integration-check
115131

@@ -133,7 +149,7 @@ jobs:
133149
- name: Package extension
134150
run: pnpm --filter ./src vsix
135151
- name: Upload test VSIX
136-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
152+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
137153
with:
138154
name: zoo-code-vsix-pr-${{ github.event.pull_request.number }}
139155
path: bin/*.vsix
@@ -163,6 +179,8 @@ jobs:
163179
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
164180
- name: Setup Node.js and pnpm
165181
uses: ./.github/actions/setup-node-pnpm
182+
with:
183+
install-args: "--frozen-lockfile"
166184
- name: Restore Turbo cache
167185
id: turbo-cache
168186
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
@@ -229,6 +247,11 @@ jobs:
229247
- name: Verify coverage cache inputs
230248
if: matrix.collect-coverage
231249
run: pnpm --dir src run verify:coverage-cache-inputs
250+
# Validate build/static cache inputs (issue #2290 contract) so a
251+
# stale webview or extension bundle is never restored as a hit.
252+
- name: Verify build cache inputs
253+
if: matrix.collect-coverage
254+
run: pnpm --dir src run verify:build-cache-inputs
232255
- name: Save Turbo cache
233256
if: steps.turbo-cache.outputs.cache-hit != 'true'
234257
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
@@ -246,7 +269,7 @@ jobs:
246269
# See https://docs.codecov.com/docs/flags
247270
- name: Upload non-core coverage to Codecov
248271
if: matrix.collect-coverage
249-
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
272+
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
250273
with:
251274
files: >-
252275
src/coverage/merged/lcov.info,
@@ -258,31 +281,31 @@ jobs:
258281
token: ${{ secrets.CODECOV_TOKEN }}
259282
- name: Upload webview JSDOM coverage to Codecov
260283
if: matrix.collect-coverage
261-
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
284+
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
262285
with:
263286
files: webview-ui/coverage/lcov.info
264287
disable_search: true
265288
flags: webview-ui
266289
token: ${{ secrets.CODECOV_TOKEN }}
267290
- name: Upload core unit coverage to Codecov
268291
if: matrix.collect-coverage
269-
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
292+
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
270293
with:
271294
files: packages/core/coverage/unit/lcov.info
272295
disable_search: true
273296
flags: ${{ matrix.codecov-flag }},core-unit
274297
token: ${{ secrets.CODECOV_TOKEN }}
275298
- name: Upload core integration coverage to Codecov
276299
if: matrix.collect-coverage
277-
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
300+
uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
278301
with:
279302
files: packages/core/coverage/integration/lcov.info
280303
disable_search: true
281304
flags: ${{ matrix.codecov-flag }},core-integration
282305
token: ${{ secrets.CODECOV_TOKEN }}
283306
- name: Upload coverage reports to GitHub
284307
if: matrix.collect-coverage
285-
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
308+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
286309
with:
287310
name: coverage-reports-${{ matrix.name }}
288311
path: |

‎.github/workflows/codeql.yml‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ on:
77
schedule:
88
- cron: "24 19 * * 3"
99

10+
# Cancel superseded runs when a pull request is updated. Non-PR events keep
11+
# unique groups, so main pushes and scheduled scans are never cancelled.
12+
concurrency:
13+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
14+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
15+
1016
# Least privilege: the analyze job escalates to security-events: write via its
1117
# own job-level permissions block.
1218
permissions:
@@ -52,7 +58,7 @@ jobs:
5258

5359
# Initializes the CodeQL tools for scanning.
5460
- name: Initialize CodeQL
55-
uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
61+
uses: github/codeql-action/init@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
5662
with:
5763
languages: ${{ matrix.language }}
5864
build-mode: ${{ matrix.build-mode }}
@@ -80,6 +86,6 @@ jobs:
8086
exit 1
8187
8288
- name: Perform CodeQL Analysis
83-
uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
89+
uses: github/codeql-action/analyze@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
8490
with:
8591
category: "/language:${{matrix.language}}"

‎.github/workflows/e2e.yml‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ on:
77
merge_group:
88
types: [checks_requested]
99

10+
# Cancel superseded runs when a pull request is updated. Non-PR events keep
11+
# unique groups, so merge-queue and manual runs are never cancelled.
12+
concurrency:
13+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
14+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
15+
1016
permissions:
1117
contents: read
1218

@@ -156,6 +162,18 @@ jobs:
156162
if: github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true'
157163
run: TEST_FILE=restart-persistence.test USE_MOCK=true xvfb-run -a pnpm --filter @roo-code/vscode-e2e exec node ./out/runTest.js
158164

165+
- name: Upload restart-persistence failure artifacts
166+
# runTest.js preserves a failed scenario workspace (phase results,
167+
# VS Code logs, task files) under apps/vscode-e2e/test-failures/
168+
# instead of deleting it, so the interrupted-write state from
169+
# issue #2130-style failures stays inspectable.
170+
if: failure()
171+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
172+
with:
173+
name: restart-persistence-failure
174+
path: apps/vscode-e2e/test-failures/
175+
if-no-files-found: ignore
176+
159177
- name: Explain skipped mocked E2E pass marker
160178
if: steps.e2e-marker.outputs.cache-hit != 'true' && steps.run-e2e.outcome == 'success' && steps.vscode-fallback.outputs.used == 'true'
161179
run: echo "Skipping mocked E2E pass marker because tests ran against a stale cached VS Code binary (VS Code download endpoints unreachable)."

0 commit comments

Comments
 (0)