From 93926282542e3cb4e6cb8d81734d57c1ae631bb5 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 22:10:42 +0000 Subject: [PATCH 1/6] feat: Use dynamic AutomationProperties.Name for SearchTextBox Updated the `AutomationProperties.Name` of the `SearchTextBox` in `SearchControl.xaml` to bind to `{Binding SearchPlaceholder}` instead of using a static string. This provides screen reader users with specific context depending on the active search filter, matching the tooltip's helpful guidance. Co-authored-by: AhmmedSamier <17784876+AhmmedSamier@users.noreply.github.com> --- .jules/palette.md | 3 +++ .../DeepLensVisualStudio/ToolWindows/SearchControl.xaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 .jules/palette.md diff --git a/.jules/palette.md b/.jules/palette.md new file mode 100644 index 00000000..05056312 --- /dev/null +++ b/.jules/palette.md @@ -0,0 +1,3 @@ +## 2024-04-29 - Dynamic Accessibility Names for WPF TextBoxes +**Learning:** In WPF tool windows with multiple search scopes or filters, using generic static strings for `AutomationProperties.Name` (e.g., "Search query") deprives screen reader users of important context about the current search state. +**Action:** Bind the accessibility name to a dynamic property that reacts to the selected filter state (e.g., `AutomationProperties.Name="{Binding SearchPlaceholder}"`), ensuring the screen reader context matches the visual tooltip and provides specific, helpful guidance. diff --git a/visual-studio-extension/DeepLensVisualStudio/DeepLensVisualStudio/ToolWindows/SearchControl.xaml b/visual-studio-extension/DeepLensVisualStudio/DeepLensVisualStudio/ToolWindows/SearchControl.xaml index a9089b00..88204aae 100644 --- a/visual-studio-extension/DeepLensVisualStudio/DeepLensVisualStudio/ToolWindows/SearchControl.xaml +++ b/visual-studio-extension/DeepLensVisualStudio/DeepLensVisualStudio/ToolWindows/SearchControl.xaml @@ -214,7 +214,7 @@ FontSize="14" Foreground="{DynamicResource {x:Static vsshell:VsBrushes.ToolWindowTextKey}}" Text="{Binding SearchQuery, UpdateSourceTrigger=PropertyChanged}" - AutomationProperties.Name="Search query" + AutomationProperties.Name="{Binding SearchPlaceholder}" ToolTip="{Binding SearchPlaceholder}" /> From 3a8268c506ab4ac95480dd2a79abbea7263f1c9c Mon Sep 17 00:00:00 2001 From: Ahmed Samir Date: Tue, 12 May 2026 19:08:39 +0300 Subject: [PATCH 2/6] docs(palette): remove outdated entry and refine accessibility notes Removed the 2024-04-29 WPF TextBox accessibility learning section, and updated the 2024-11-20 action item to include the full AutomationProperties.Name binding example and clarify that screen reader context matches the visual tooltip. --- .jules/palette.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.jules/palette.md b/.jules/palette.md index 64f31b2b..f1889d19 100644 --- a/.jules/palette.md +++ b/.jules/palette.md @@ -1,10 +1,6 @@ -## 2024-04-29 - Dynamic Accessibility Names for WPF TextBoxes -**Learning:** In WPF tool windows with multiple search scopes or filters, using generic static strings for `AutomationProperties.Name` (e.g., "Search query") deprives screen reader users of important context about the current search state. -**Action:** Bind the accessibility name to a dynamic property that reacts to the selected filter state (e.g., `AutomationProperties.Name="{Binding SearchPlaceholder}"`), ensuring the screen reader context matches the visual tooltip and provides specific, helpful guidance. - ## 2024-05-24 - Empty States Should Be Actionable **Learning:** Users often get stuck in empty search states because the path to recovery (clearing text or changing tabs) requires moving focus away from the empty state area. **Action:** Always provide an actionable recovery path (like a "Clear Search" button) directly within the empty state container to reduce interaction friction. ## 2024-11-20 - Dynamic Accessibility for Multi-Scope Inputs **Learning:** In multi-scope UI elements (like a unified search bar that filters based on context), static ARIA labels or `AutomationProperties.Name` attributes (e.g., "Search query") fail to convey the current state to screen reader users. The context of *what* is being searched is crucial for accessibility. -**Action:** Always bind the accessibility name (e.g., `AutomationProperties.Name` in WPF/XAML) to the dynamic placeholder property rather than a generic static string. This ensures screen readers announce context-aware hints (like "Classes: Try 'UserService'...") when the user switches scopes. +**Action:** Always bind the accessibility name (e.g., `AutomationProperties.Name="{Binding SearchPlaceholder}"`) to the dynamic placeholder property rather than a generic static string. This ensures screen readers announce context-aware hints (like "Classes: Try 'UserService'...") when the user switches scopes, and that the screen reader context matches the visual tooltip. From 32a02a27517c77bf1b3d8dea67ec1e12cf1f2842 Mon Sep 17 00:00:00 2001 From: Ahmed Samir Date: Tue, 12 May 2026 19:12:53 +0300 Subject: [PATCH 3/6] ci: bump setup-bun to v2, add caching, refine CI jobs update oven-sh/setup-bun from v1 to v2 across all github actions workflows add bun dependency caching via actions/cache@v4 to speed up dependency installs split combined test job in ci.yml into separate language server and vscode extension test jobs add workflow_dispatch trigger to ci workflow for manual runs add dedicated benchmarks ci job for master branch pushes and manual triggers rename benchmark artifact upload step for clearer naming --- .github/workflows/ci.yml | 70 ++++++++++++++++++++++++++++---- .github/workflows/release.yml | 10 ++++- .github/workflows/vs-release.yml | 10 ++++- 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee2efd21..085c0949 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,20 +5,55 @@ on: branches: ['master'] pull_request: branches: ['master'] + workflow_dispatch: jobs: - test: + test-language-server: runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: ${{ runner.os }}-bun-ls-${{ hashFiles('language-server/bun.lock') }} + restore-keys: | + ${{ runner.os }}-bun-ls- + + - name: Install Dependencies + working-directory: language-server + run: bun install --frozen-lockfile + + - name: Run Language Server Tests + working-directory: language-server + run: bun run test + test-vscode-extension: + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Bun - uses: oven-sh/setup-bun@v1 + uses: oven-sh/setup-bun@v2 with: bun-version: latest + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: ${{ runner.os }}-bun-vscode-${{ hashFiles('vscode-extension/bun.lock', 'language-server/bun.lock') }} + restore-keys: | + ${{ runner.os }}-bun-vscode- + - name: Install Dependencies run: | cd language-server && bun install --frozen-lockfile @@ -29,14 +64,35 @@ jobs: sudo apt-get update sudo apt-get install -y xvfb libasound2 libatk1.0-0 libgbm1 libgtk-3-0 libnss3 libxkbfile1 libxss1 - - name: Run Language Server Tests - working-directory: language-server - run: bun run test - - name: Run VS Code Extension Tests working-directory: vscode-extension run: xvfb-run -a bun run test + benchmarks: + runs-on: ubuntu-22.04 + if: github.event_name == 'push' && github.ref == 'refs/heads/master' || github.event_name == 'workflow_dispatch' + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: ${{ runner.os }}-bun-bench-${{ hashFiles('language-server/bun.lock', 'vscode-extension/bun.lock') }} + restore-keys: | + ${{ runner.os }}-bun-bench- + + - name: Install Dependencies + run: | + cd language-server && bun install --frozen-lockfile + cd ../vscode-extension && bun install --frozen-lockfile + - name: Run Benchmarks run: | chmod +x run_benchmarks.sh @@ -49,7 +105,7 @@ jobs: cat benchmark_report.md >> $GITHUB_STEP_SUMMARY fi - - name: Upload Benchmark Report + - name: Upload Benchmark Artifact if: always() uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 78d5b4c2..6ab65d91 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,10 +15,18 @@ jobs: uses: actions/checkout@v4 - name: Setup Bun - uses: oven-sh/setup-bun@v1 + uses: oven-sh/setup-bun@v2 with: bun-version: latest + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: ${{ runner.os }}-bun-release-${{ hashFiles('language-server/bun.lock', 'vscode-extension/bun.lock') }} + restore-keys: | + ${{ runner.os }}-bun-release- + - name: Extract version from tag id: get_version run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT diff --git a/.github/workflows/vs-release.yml b/.github/workflows/vs-release.yml index 3e557639..6fdad0b9 100644 --- a/.github/workflows/vs-release.yml +++ b/.github/workflows/vs-release.yml @@ -21,10 +21,18 @@ jobs: dotnet-version: '8.0.x' - name: Setup Bun - uses: oven-sh/setup-bun@v1 + uses: oven-sh/setup-bun@v2 with: bun-version: latest + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: ${{ runner.os }}-bun-vs-release-${{ hashFiles('language-server/bun.lock', 'vscode-extension/bun.lock') }} + restore-keys: | + ${{ runner.os }}-bun-vs-release- + - name: Add MSBuild to PATH uses: microsoft/setup-msbuild@v1.0.2 From 3d2f2cf120eeac480dcb3466098ca93957752540 Mon Sep 17 00:00:00 2001 From: Ahmed Samir Date: Tue, 12 May 2026 19:23:25 +0300 Subject: [PATCH 4/6] ci(github-workflows): add lint jobs, improve caching and restructure CI workflow - add dedicated lint job for language server and vscode extension - update all CI runners to Ubuntu 24.04 - replace manual cache actions with built-in Bun caching - add concurrency controls to cancel redundant in-progress runs - set default workflow permissions to read-only contents - add timeout limits for all jobs and reorder job dependencies - update apt install commands for quieter, more efficient installs - add missing Linux dependencies for benchmark runs --- .github/workflows/ci.yml | 83 ++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 085c0949..794a7631 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,9 +7,17 @@ on: branches: ['master'] workflow_dispatch: +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: - test-language-server: - runs-on: ubuntu-22.04 + lint: + runs-on: ubuntu-24.04 + timeout-minutes: 5 steps: - name: Checkout uses: actions/checkout@v4 @@ -18,14 +26,34 @@ jobs: uses: oven-sh/setup-bun@v2 with: bun-version: latest + cache: true + + - name: Install Dependencies + run: | + cd language-server && bun install --frozen-lockfile + cd ../vscode-extension && bun install --frozen-lockfile + + - name: Lint Language Server + working-directory: language-server + run: bun run lint + + - name: Lint VS Code Extension + working-directory: vscode-extension + run: bun run lint + + test-language-server: + runs-on: ubuntu-24.04 + needs: lint + timeout-minutes: 10 + steps: + - name: Checkout + uses: actions/checkout@v4 - - name: Cache Bun dependencies - uses: actions/cache@v4 + - name: Setup Bun + uses: oven-sh/setup-bun@v2 with: - path: ~/.bun/install/cache - key: ${{ runner.os }}-bun-ls-${{ hashFiles('language-server/bun.lock') }} - restore-keys: | - ${{ runner.os }}-bun-ls- + bun-version: latest + cache: true - name: Install Dependencies working-directory: language-server @@ -36,7 +64,9 @@ jobs: run: bun run test test-vscode-extension: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 + needs: [lint, test-language-server] + timeout-minutes: 15 steps: - name: Checkout uses: actions/checkout@v4 @@ -45,14 +75,7 @@ jobs: uses: oven-sh/setup-bun@v2 with: bun-version: latest - - - name: Cache Bun dependencies - uses: actions/cache@v4 - with: - path: ~/.bun/install/cache - key: ${{ runner.os }}-bun-vscode-${{ hashFiles('vscode-extension/bun.lock', 'language-server/bun.lock') }} - restore-keys: | - ${{ runner.os }}-bun-vscode- + cache: true - name: Install Dependencies run: | @@ -61,16 +84,20 @@ jobs: - name: Install Linux Dependencies run: | - sudo apt-get update - sudo apt-get install -y xvfb libasound2 libatk1.0-0 libgbm1 libgtk-3-0 libnss3 libxkbfile1 libxss1 + sudo apt-get update -yq + sudo apt-get install -yq --no-install-recommends xvfb libasound2 libatk1.0-0 libgbm1 libgtk-3-0 libnss3 libxkbfile1 libxss1 - name: Run VS Code Extension Tests working-directory: vscode-extension run: xvfb-run -a bun run test benchmarks: - runs-on: ubuntu-22.04 - if: github.event_name == 'push' && github.ref == 'refs/heads/master' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-24.04 + needs: [lint, test-language-server, test-vscode-extension] + timeout-minutes: 20 + if: | + (github.event_name == 'push' && github.ref == 'refs/heads/master') || + github.event_name == 'workflow_dispatch' steps: - name: Checkout uses: actions/checkout@v4 @@ -79,20 +106,18 @@ jobs: uses: oven-sh/setup-bun@v2 with: bun-version: latest - - - name: Cache Bun dependencies - uses: actions/cache@v4 - with: - path: ~/.bun/install/cache - key: ${{ runner.os }}-bun-bench-${{ hashFiles('language-server/bun.lock', 'vscode-extension/bun.lock') }} - restore-keys: | - ${{ runner.os }}-bun-bench- + cache: true - name: Install Dependencies run: | cd language-server && bun install --frozen-lockfile cd ../vscode-extension && bun install --frozen-lockfile + - name: Install Linux Dependencies (for extension benchmarks) + run: | + sudo apt-get update -yq + sudo apt-get install -yq --no-install-recommends xvfb libasound2 libatk1.0-0 libgbm1 libgtk-3-0 libnss3 libxkbfile1 libxss1 + - name: Run Benchmarks run: | chmod +x run_benchmarks.sh From 86ad94eb062c2a752145c71cd7872d108214723b Mon Sep 17 00:00:00 2001 From: Ahmed Samir Date: Tue, 12 May 2026 19:28:01 +0300 Subject: [PATCH 5/6] ci: update bun cache setup and apt dependencies - replace the default cache option in oven-sh/setup-bun with explicit actions/cache@v4 for all CI jobs, using per-job cache keys tied to their respective bun.lock files - update Linux system dependencies to use 64-bit t64-named packages to maintain compatibility with newer Ubuntu distributions --- .github/workflows/ci.yml | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 794a7631..708c649e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,14 @@ jobs: uses: oven-sh/setup-bun@v2 with: bun-version: latest - cache: true + + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }} + restore-keys: | + ${{ runner.os }}-bun- - name: Install Dependencies run: | @@ -53,7 +60,14 @@ jobs: uses: oven-sh/setup-bun@v2 with: bun-version: latest - cache: true + + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: ${{ runner.os }}-bun-ls-${{ hashFiles('language-server/bun.lock') }} + restore-keys: | + ${{ runner.os }}-bun-ls- - name: Install Dependencies working-directory: language-server @@ -75,7 +89,14 @@ jobs: uses: oven-sh/setup-bun@v2 with: bun-version: latest - cache: true + + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: ${{ runner.os }}-bun-vscode-${{ hashFiles('vscode-extension/bun.lock', 'language-server/bun.lock') }} + restore-keys: | + ${{ runner.os }}-bun-vscode- - name: Install Dependencies run: | @@ -85,7 +106,7 @@ jobs: - name: Install Linux Dependencies run: | sudo apt-get update -yq - sudo apt-get install -yq --no-install-recommends xvfb libasound2 libatk1.0-0 libgbm1 libgtk-3-0 libnss3 libxkbfile1 libxss1 + sudo apt-get install -yq --no-install-recommends xvfb libasound2t64 libatk1.0-0t64 libgbm1 libgtk-3-0t64 libnss3 libxkbfile1 libxss1 - name: Run VS Code Extension Tests working-directory: vscode-extension @@ -106,7 +127,14 @@ jobs: uses: oven-sh/setup-bun@v2 with: bun-version: latest - cache: true + + - name: Cache Bun dependencies + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: ${{ runner.os }}-bun-bench-${{ hashFiles('language-server/bun.lock', 'vscode-extension/bun.lock') }} + restore-keys: | + ${{ runner.os }}-bun-bench- - name: Install Dependencies run: | @@ -116,7 +144,7 @@ jobs: - name: Install Linux Dependencies (for extension benchmarks) run: | sudo apt-get update -yq - sudo apt-get install -yq --no-install-recommends xvfb libasound2 libatk1.0-0 libgbm1 libgtk-3-0 libnss3 libxkbfile1 libxss1 + sudo apt-get install -yq --no-install-recommends xvfb libasound2t64 libatk1.0-0t64 libgbm1 libgtk-3-0t64 libnss3 libxkbfile1 libxss1 - name: Run Benchmarks run: | From 5d5d40fc7a9678f53f15599161545de3458c33be Mon Sep 17 00:00:00 2001 From: Ahmed Samir Date: Tue, 12 May 2026 19:35:03 +0300 Subject: [PATCH 6/6] ci: update CI workflows and test setup add language server artifact upload/download to share builds across jobs add VS Code binary caching to reduce test setup time revise test commands to use pre-built artifacts remove --headless launch flag from VS Code test runner add required DBUS_SESSION_BUS_ADDRESS env var for Linux tests --- .github/workflows/ci.yml | 49 ++++++++++++++++++++++++++-- vscode-extension/src/test/runTest.ts | 2 +- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 708c649e..b298172d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,7 +75,16 @@ jobs: - name: Run Language Server Tests working-directory: language-server - run: bun run test + run: | + bun run build + bun run test + + - name: Upload Language Server Artifact + uses: actions/upload-artifact@v4 + with: + name: language-server-dist + path: language-server/dist + retention-days: 1 test-vscode-extension: runs-on: ubuntu-24.04 @@ -103,6 +112,20 @@ jobs: cd language-server && bun install --frozen-lockfile cd ../vscode-extension && bun install --frozen-lockfile + - name: Download Language Server Artifact + uses: actions/download-artifact@v4 + with: + name: language-server-dist + path: language-server/dist + + - name: Cache VS Code Binary + uses: actions/cache@v4 + with: + path: vscode-extension/.vscode-test + key: ${{ runner.os }}-vscode-${{ hashFiles('vscode-extension/package.json') }} + restore-keys: | + ${{ runner.os }}-vscode- + - name: Install Linux Dependencies run: | sudo apt-get update -yq @@ -110,7 +133,13 @@ jobs: - name: Run VS Code Extension Tests working-directory: vscode-extension - run: xvfb-run -a bun run test + run: | + bun run esbuild + bun run scripts/copy-artifacts.ts + bun x tsc -p . + xvfb-run -a node ./out/vscode-extension/src/test/runTest.js + env: + DBUS_SESSION_BUS_ADDRESS: /dev/null benchmarks: runs-on: ubuntu-24.04 @@ -141,6 +170,20 @@ jobs: cd language-server && bun install --frozen-lockfile cd ../vscode-extension && bun install --frozen-lockfile + - name: Download Language Server Artifact + uses: actions/download-artifact@v4 + with: + name: language-server-dist + path: language-server/dist + + - name: Cache VS Code Binary + uses: actions/cache@v4 + with: + path: vscode-extension/.vscode-test + key: ${{ runner.os }}-vscode-bench-${{ hashFiles('vscode-extension/package.json') }} + restore-keys: | + ${{ runner.os }}-vscode-bench- + - name: Install Linux Dependencies (for extension benchmarks) run: | sudo apt-get update -yq @@ -150,6 +193,8 @@ jobs: run: | chmod +x run_benchmarks.sh ./run_benchmarks.sh + env: + DBUS_SESSION_BUS_ADDRESS: /dev/null - name: Upload Benchmark Report if: always() diff --git a/vscode-extension/src/test/runTest.ts b/vscode-extension/src/test/runTest.ts index 4d6ebde9..cc747dbc 100644 --- a/vscode-extension/src/test/runTest.ts +++ b/vscode-extension/src/test/runTest.ts @@ -10,7 +10,7 @@ import * as path from 'node:path'; await runTests({ extensionDevelopmentPath, extensionTestsPath, - launchArgs: [workspacePath, '--no-sandbox', '--disable-gpu', '--headless'], + launchArgs: [workspacePath, '--no-sandbox', '--disable-gpu'], timeout: 120_000, }).catch((err) => { console.error('Failed to run tests', err);