Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
512ede4
Bump workflow actions to Node 24 versions (#310)
erikdarlingdata May 5, 2026
c90bff7
Feature/multi query stores dashboard overview (#311)
rferraton May 5, 2026
eb1f4d5
QS Overview review followups, brand sweep, version unification (#315)
erikdarlingdata May 9, 2026
3580426
Silence AVLN3001 warnings via Directory.Build.props NoWarn (#316)
erikdarlingdata May 9, 2026
6a4338d
Speed up CI with NuGet cache + solution-wide build (#317)
erikdarlingdata May 9, 2026
4e36226
Try ubuntu-latest for CI (experiment) (#319)
erikdarlingdata May 9, 2026
c4a326f
Skip CI on non-build changes via paths-ignore (#318)
erikdarlingdata May 9, 2026
801f257
feature - Improve navigation (#323)
ClaudioESSilva May 10, 2026
f13ba5c
Allow filter by "execution_type_desc" on Query Store screen (#321)
ClaudioESSilva May 10, 2026
f6d322f
Remove dead FetchHistoryAsync and FetchHistoryByHashAsync methods (#324)
erikdarlingdata May 10, 2026
5d7105e
Drop redundant TRY_CONVERT(nvarchar(max), p.query_plan) wrapper (#326)
erikdarlingdata May 10, 2026
ee40047
Expose execution_type_desc filter to CLI and MCP (#325)
erikdarlingdata May 10, 2026
ef6142c
Split PlanViewerControl.axaml.cs into partial classes (#327)
erikdarlingdata May 13, 2026
aa02254
Split QuerySessionControl.axaml.cs into partial classes (#328)
erikdarlingdata May 13, 2026
d8c14d1
Split PlanAnalyzer.cs into partial classes (#329)
erikdarlingdata May 13, 2026
a1665ad
Split QueryStoreGridControl.axaml.cs into partial classes (#330)
erikdarlingdata May 13, 2026
973a8e4
Split ShowPlanParser.cs into partial classes (#331)
erikdarlingdata May 13, 2026
5262721
Split QueryStoreService.cs into partial classes (#332)
erikdarlingdata May 13, 2026
f2a3989
Split MainWindow.axaml.cs into partial classes (#333)
erikdarlingdata May 13, 2026
0a435d9
Split AdviceContentBuilder.cs into partial classes (#334)
erikdarlingdata May 13, 2026
a2750c4
Fix two post-split UX issues (#335)
erikdarlingdata May 14, 2026
c7e4e64
Add proxy support for "Check for Updates" (#314) (#337)
erikdarlingdata May 18, 2026
d774c7b
Upgrade to .NET 10 and refresh NuGet packages (#338)
erikdarlingdata May 18, 2026
a093055
Query history improvments (#336)
rferraton May 18, 2026
18ea22d
Clean up two warnings from PR #336 (#339)
erikdarlingdata May 18, 2026
2666163
Bump version to 1.11.0 and fix workflows post-version-unification (#340)
erikdarlingdata May 19, 2026
dd9835d
check-version-bump: fall back to App.csproj when Directory.Build.prop…
erikdarlingdata May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: Bug Report
description: Report a problem with SQL Performance Studio
description: Report a problem with Performance Studio
title: "[BUG] "
labels: ["bug"]

Expand All @@ -8,7 +8,7 @@ body:
id: component
attributes:
label: Component
description: Which part of SQL Performance Studio is affected?
description: Which part of Performance Studio is affected?
options:
- Desktop App (Windows)
- Desktop App (macOS)
Expand All @@ -21,7 +21,7 @@ body:
- type: input
id: version
attributes:
label: SQL Performance Studio Version
label: Performance Studio Version
description: Check the About dialog or the release you downloaded.
placeholder: "e.g., 0.7.0"
validations:
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ blank_issues_enabled: false
contact_links:
- name: Questions & Discussion
url: https://github.com/erikdarlingdata/PerformanceStudio/discussions
about: Ask questions and discuss SQL Performance Studio with the community
about: Ask questions and discuss Performance Studio with the community
22 changes: 15 additions & 7 deletions .github/workflows/check-version-bump.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,23 @@ jobs:

steps:
- name: Checkout PR branch
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Get PR version
id: pr
shell: pwsh
run: |
$version = ([xml](Get-Content src/PlanViewer.App/PlanViewer.App.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
# Prefer Directory.Build.props; fall back to App.csproj for branches that
# predate the version-unification refactor (PR #315).
$ddb = 'src/Directory.Build.props'
$app = 'src/PlanViewer.App/PlanViewer.App.csproj'
$path = if (Test-Path $ddb) { $ddb } else { $app }
$version = ([xml](Get-Content $path)).Project.PropertyGroup.Version | Where-Object { $_ }
echo "VERSION=$version" >> $env:GITHUB_OUTPUT
Write-Host "PR version: $version"
Write-Host "PR version: $version (from $path)"

- name: Checkout main
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
ref: main
path: main-branch
Expand All @@ -30,9 +35,12 @@ jobs:
id: main
shell: pwsh
run: |
$version = ([xml](Get-Content main-branch/src/PlanViewer.App/PlanViewer.App.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
$ddb = 'main-branch/src/Directory.Build.props'
$app = 'main-branch/src/PlanViewer.App/PlanViewer.App.csproj'
$path = if (Test-Path $ddb) { $ddb } else { $app }
$version = ([xml](Get-Content $path)).Project.PropertyGroup.Version | Where-Object { $_ }
echo "VERSION=$version" >> $env:GITHUB_OUTPUT
Write-Host "Main version: $version"
Write-Host "Main version: $version (from $path)"

- name: Compare versions
env:
Expand All @@ -42,7 +50,7 @@ jobs:
echo "Main version: $MAIN_VERSION"
echo "PR version: $PR_VERSION"
if [ "$PR_VERSION" == "$MAIN_VERSION" ]; then
echo "::error::Version in PlanViewer.App.csproj ($PR_VERSION) has not changed from main. Bump the version before merging to main."
echo "::error::Version ($PR_VERSION) has not changed from main. Bump the version before merging to main."
exit 1
fi
echo "✅ Version bumped: $MAIN_VERSION → $PR_VERSION"
45 changes: 25 additions & 20 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,42 @@ on:
branches: [main]
pull_request:
branches: [main, dev]
paths-ignore:
- '**.md'
- 'LICENSE'
- '.gitattributes'
- '.gitignore'
- 'CITATION.cff'
- 'llms.txt'
- '.github/ISSUE_TEMPLATE/**'
- 'docs/**'
- 'screenshots/**'
- 'server/**'
- 'src/PlanViewer.Ssms/**'
- 'src/PlanViewer.Ssms.Installer/**'

jobs:
build-and-test:
runs-on: windows-latest
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5

- name: Setup .NET 8.0
uses: actions/setup-dotnet@v4
- name: Setup .NET 10.0
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 10.0.x
cache: true
cache-dependency-path: '**/*.csproj'

- name: Install WASM workload
run: dotnet workload install wasm-tools

- name: Restore dependencies
run: |
dotnet restore src/PlanViewer.Core/PlanViewer.Core.csproj
dotnet restore src/PlanViewer.App/PlanViewer.App.csproj
dotnet restore src/PlanViewer.Cli/PlanViewer.Cli.csproj
dotnet restore src/PlanViewer.Web/PlanViewer.Web.csproj
dotnet restore tests/PlanViewer.Core.Tests/PlanViewer.Core.Tests.csproj

- name: Build all projects
run: |
dotnet build src/PlanViewer.Core/PlanViewer.Core.csproj -c Release --no-restore
dotnet build src/PlanViewer.App/PlanViewer.App.csproj -c Release --no-restore
dotnet build src/PlanViewer.Cli/PlanViewer.Cli.csproj -c Release --no-restore
dotnet build src/PlanViewer.Web/PlanViewer.Web.csproj -c Release --no-restore
dotnet build tests/PlanViewer.Core.Tests/PlanViewer.Core.Tests.csproj -c Release --no-restore
- name: Restore solution
run: dotnet restore PlanViewer.sln

- name: Build solution
run: dotnet build PlanViewer.sln -c Release --no-restore

- name: Run tests
run: dotnet test tests/PlanViewer.Core.Tests/PlanViewer.Core.Tests.csproj -c Release --no-build --verbosity normal
21 changes: 5 additions & 16 deletions .github/workflows/deploy-web.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
paths:
- 'src/PlanViewer.Core/**'
- 'src/PlanViewer.Web/**'
- 'src/PlanViewer.App/PlanViewer.App.csproj'
- 'src/Directory.Build.props'
- '.github/workflows/deploy-web.yml'
workflow_dispatch:

Expand All @@ -27,27 +27,16 @@ jobs:
url: ${{ steps.deployment.outputs.page_url }}

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5

- name: Setup .NET 8.0
uses: actions/setup-dotnet@v4
- name: Setup .NET 10.0
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 10.0.x

- name: Install WASM workload
run: dotnet workload install wasm-tools

- name: Sync web version with app version
shell: pwsh
run: |
$appVersion = ([xml](Get-Content src/PlanViewer.App/PlanViewer.App.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
Write-Host "App version: $appVersion"
$webCsproj = 'src/PlanViewer.Web/PlanViewer.Web.csproj'
$content = Get-Content $webCsproj -Raw
$content = [regex]::Replace($content, '<Version>[^<]+</Version>', "<Version>$appVersion</Version>")
Set-Content -Path $webCsproj -Value $content -NoNewline
Write-Host "Synced web csproj to $appVersion"

- name: Publish Blazor WASM
run: dotnet publish src/PlanViewer.Web/PlanViewer.Web.csproj -c Release -o publish

Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
outputs:
has_changes: ${{ steps.check.outputs.has_changes }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
ref: dev
fetch-depth: 0
Expand All @@ -38,20 +38,20 @@ jobs:
runs-on: windows-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
ref: dev

- name: Setup .NET 8.0
uses: actions/setup-dotnet@v4
- name: Setup .NET 10.0
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 10.0.x

- name: Set nightly version
id: version
shell: pwsh
run: |
$base = ([xml](Get-Content src/PlanViewer.App/PlanViewer.App.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
$base = ([xml](Get-Content src/Directory.Build.props)).Project.PropertyGroup.Version | Where-Object { $_ }
$date = Get-Date -Format "yyyyMMdd"
$nightly = "$base-nightly.$date"
echo "VERSION=$nightly" >> $env:GITHUB_OUTPUT
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ jobs:
runs-on: windows-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5

- name: Get version
id: version
shell: pwsh
run: |
$version = ([xml](Get-Content src/PlanViewer.App/PlanViewer.App.csproj)).Project.PropertyGroup.Version | Where-Object { $_ }
$version = ([xml](Get-Content src/Directory.Build.props)).Project.PropertyGroup.Version | Where-Object { $_ }
echo "VERSION=$version" >> $env:GITHUB_OUTPUT

- name: Check if release already exists
Expand All @@ -45,10 +45,10 @@ jobs:
run: |
gh release create "v${{ steps.version.outputs.VERSION }}" --title "v${{ steps.version.outputs.VERSION }}" --generate-notes --target main

- name: Setup .NET 8.0
uses: actions/setup-dotnet@v4
- name: Setup .NET 10.0
uses: actions/setup-dotnet@v5
with:
dotnet-version: 8.0.x
dotnet-version: 10.0.x

- name: Build and test
run: |
Expand Down Expand Up @@ -78,14 +78,14 @@ jobs:
- name: Upload Windows build for signing
if: steps.signing.outputs.ENABLED == 'true'
id: upload-unsigned
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: App-unsigned
path: publish/win-x64/

- name: Sign Windows build
if: steps.signing.outputs.ENABLED == 'true'
uses: signpath/github-action-submit-signing-request@v1
uses: signpath/github-action-submit-signing-request@v2
with:
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
organization-id: '7969f8b6-d946-4a74-9bac-a55856d8b8e0'
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Project-specific
CLAUDE.md
examples/
tools/

## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Thank you for your interest in contributing to Performance Studio! This guide wi

### Prerequisites

- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
- Git

### Build and Test
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Each warning includes severity (Info, Warning, or Critical), the operator node I

## Prerequisites

- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) (required to build and run)
- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) (required to build and run)
- SQL Server instance (optional — only needed for live plan capture; file analysis works without one)
- Docker (optional — macOS/Linux users can run SQL Server locally via Docker)

Expand Down
2 changes: 1 addition & 1 deletion server/PlanShare/PlanShare.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
Expand Down
35 changes: 35 additions & 0 deletions src/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<Project>
<!--
Single source of truth for product version + identity across src/ projects.

Picked up automatically by SDK-style projects in this folder and below:
PlanViewer.App, PlanViewer.Core, PlanViewer.Cli, PlanViewer.Web,
PlanViewer.Ssms.Installer.

NOT picked up by PlanViewer.Ssms — it's a legacy non-SDK project.
Its version lives in:
Properties/AssemblyInfo.cs (AssemblyVersion + AssemblyFileVersion)
source.extension.vsixmanifest (Identity Version="...")
Bump those manually when bumping the version here.

Tests and server/ projects are outside src/ and are unaffected.
-->
<PropertyGroup>
<Version>1.11.0</Version>
<Authors>Erik Darling</Authors>
<Company>Darling Data LLC</Company>
<Product>Performance Studio</Product>
<Copyright>Copyright (c) 2026 Erik Darling, Darling Data LLC</Copyright>
</PropertyGroup>

<!--
Silence AVLN3001 ("XAML resource won't be reachable via runtime loader,
no public constructor was found"). All flagged controls take typed
constructor dependencies (ServerConnection, ICredentialService, ...) and
are instantiated directly in code-behind — they're never loaded via
AvaloniaXamlLoader.Load() and the IDE previewer isn't used.
-->
<PropertyGroup>
<NoWarn>$(NoWarn);AVLN3001</NoWarn>
</PropertyGroup>
</Project>
Loading
Loading