diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index c3ac5da..f001a6d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -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"] @@ -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) @@ -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: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 0e2121f..103b08c 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -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 diff --git a/.github/workflows/check-version-bump.yml b/.github/workflows/check-version-bump.yml index b48de67..c722ea7 100644 --- a/.github/workflows/check-version-bump.yml +++ b/.github/workflows/check-version-bump.yml @@ -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 @@ -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: @@ -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" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19e94f2..b356ba7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 diff --git a/.github/workflows/deploy-web.yml b/.github/workflows/deploy-web.yml index bbaed60..2c3ce82 100644 --- a/.github/workflows/deploy-web.yml +++ b/.github/workflows/deploy-web.yml @@ -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: @@ -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, '[^<]+', "$appVersion") - 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 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index c035742..1580355 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -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 @@ -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 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2e269f5..9fbfa31 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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 @@ -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: | @@ -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' diff --git a/.gitignore b/.gitignore index e0ded08..3bcca1d 100644 --- a/.gitignore +++ b/.gitignore @@ -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. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c21d7b4..83652dd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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 diff --git a/README.md b/README.md index cbfed00..8b9574d 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/server/PlanShare/PlanShare.csproj b/server/PlanShare/PlanShare.csproj index 5e2bf89..a246dc0 100644 --- a/server/PlanShare/PlanShare.csproj +++ b/server/PlanShare/PlanShare.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000..837fc13 --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,35 @@ + + + + 1.11.0 + Erik Darling + Darling Data LLC + Performance Studio + Copyright (c) 2026 Erik Darling, Darling Data LLC + + + + + $(NoWarn);AVLN3001 + + diff --git a/src/PlanViewer.App/AboutWindow.axaml b/src/PlanViewer.App/AboutWindow.axaml index 17f422d..1aa0790 100644 --- a/src/PlanViewer.App/AboutWindow.axaml +++ b/src/PlanViewer.App/AboutWindow.axaml @@ -2,7 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="PlanViewer.App.AboutWindow" Title="About Performance Studio" - Width="450" Height="500" + Width="480" Height="640" CanResize="False" WindowStartupLocation="CenterOwner" Icon="avares://PlanViewer.App/EDD.ico" @@ -47,14 +47,22 @@