Upgrade to .NET 10#242
Merged
Merged
Conversation
- Check for existing PRs before creating new ones - Create separate PR for each changed file instead of one combined PR - Use consistent branch naming pattern: sync-file/[sanitized-filename] - Prevent duplicate PRs by checking open PRs with matching branch names 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Move C# coding standards from .ai/ to Documentation/Developer/Reference/ - Move .NET conventions from .ai/ to Documentation/Developer/Reference/ - Update Reference Overview.md with proper description of reference docs - Reference documentation now properly organized for developer lookup 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Creates a new task to configure a development container that allows running Claude Code in a containerized environment with access to a single git worktree. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Starting work on Dev Container configuration for Claude Code. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Implements a secure development container based on Claude Code's official configuration with additional .NET and TimeWarp-specific tooling. Features: - .NET 10 Preview 6 with fallback to 9.0 and 8.0 - Node.js 20 base (matching Claude Code requirements) - Claude Code pre-installed via npm - Security firewall with whitelisted domains - Docker-in-Docker support for Aspire - Git worktree mounting capability - Persistent command history and configuration - PowerShell Core for project scripts Security: - Network restrictions following Claude Code best practices - Whitelisted domains: GitHub, npm, Anthropic, Microsoft/.NET services - Default deny policy for other connections Based on: https://docs.anthropic.com/en/docs/claude-code/devcontainer and https://github.com/anthropics/claude-code/tree/main/.devcontainer 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Use correct channel syntax (10.0-preview instead of 10.0-preview6) - Remove redundant features from devcontainer.json since they're installed in Dockerfile - Keep only docker-in-docker as a feature since it's complex to install manually
The dotnet-install.sh script doesn't support .NET 10 preview channel yet, so we download and extract the SDK directly from Microsoft's CDN.
Use the correct URL from builds.dotnet.microsoft.com found on the official .NET 10 download page. The previous URL was malformed.
The Node.js base image doesn't include lsb-release by default, which is needed to detect the Ubuntu version for PowerShell installation.
The node:20 base image uses Debian 12, not Ubuntu. Updated to use the correct Microsoft repository for Debian bookworm.
Changed Docker repository from Ubuntu to Debian since the node:20 base image uses Debian 12 (bookworm).
Since Aspire has matured and RunDocker.ps1 will be removed, we don't need Docker inside the container. Aspire can run directly with dotnet run. This simplifies the container and should resolve the memory/startup issues.
Instead of Docker-in-Docker, mount the host's Docker socket into the container. This allows Aspire to manage containers while running inside the dev container. Only the Docker CLI is installed, not the daemon. This approach is simpler, uses less memory, and containers persist on the host even when the dev container is rebuilt.
Handle the case where group 999 exists but isn't named 'docker'. Try to create with GID 999 first, then without GID if that fails. Make usermod non-fatal in case docker group still doesn't exist.
The container was exiting immediately after starting. Added 'sleep infinity' command to keep it running for VS Code to connect.
Use absolute path to post-create.sh since the working directory in the container might not be where we expect.
The script was using incorrect paths because the container mounts TimeWarp.Architecture directly as /workspace/timewarp-architecture, not as a subdirectory.
The permission issue was caused by UID mismatch: - Host WSL user: UID 1000 - Container node user: UID 1000 (from base image) - Container vscode user: UID 1001 (wrongly created) Now we delete the node user and create vscode with UID 1000 to match the host user. This ensures proper file permissions without sudo.
Following Claude Code's official dev container pattern: - Create /home/vscode/.claude directory with proper ownership in Dockerfile - Add chmod +x *.ps1 to post-create script for executable PowerShell scripts This ensures the container works immediately without manual fixes.
These scripts were originally developed on Windows and never had Unix execute permissions. Setting them properly so they work in WSL and containers without needing chmod.
Now that PowerShell scripts have proper execute permissions in the repository, we don't need to chmod them in the container.
Found and fixed 41 additional .ps1 files throughout the repository that were missing execute permissions. These were all originally developed on Windows.
Microsoft domains like dotnet.microsoft.com return CNAMEs (Azure Front Door) instead of direct IPs. Updated the script to: - Follow CNAME chains to get actual IPs - Skip domains that can't be resolved instead of failing - Handle duplicate IPs gracefully This prevents the firewall initialization from failing on Microsoft domains.
Dev containers should provide the environment, not assume the code is buildable. Removed Build.ps1 execution and made dotnet restore optional. The container is for development and debugging, including broken code.
Created validate-container.sh that tests: - All development tools (.NET, Node, PowerShell, etc.) - Claude Code installation - Docker socket mount and permissions - File permissions and writability - Network access (with firewall) - Aspire readiness This helps quickly diagnose any dev container issues.
CRITICAL FIXES: - Added 'dotnet workload install aspire' to Dockerfile - Fixed all references from 'claude-code' to 'claude' - Added build-time verification that Claude is installed - Made post-create script fail if Claude is missing Claude is ESSENTIAL for agentic workflows and must work out of the box.
- Remove Aspire workload installation (deprecated in Aspire 9+) - Install Aspire.ProjectTemplates via dotnet new instead - Add validation script execution to post-create - Update to use --include-previews flag for compatibility This aligns with Aspire 9.0.0 packages used in the project and resolves workload verification errors. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…nings - Run 'dotnet workload update' before restore to update manifests - Prevents 'An issue was encountered verifying workloads' warning - Ensures all .NET SDK manifests are up to date in container 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Fix Web.Server.Integration.Tests project references to use correct relative paths (up 4 levels) - Fix Web.Spa.Integration.Tests project references to use correct relative paths (up 4 levels) - Resolves build errors on Linux/WSL where incorrect paths were causing missing type references 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Remove .aider.conf.yml and legacy DGML dependency diagrams that are no longer used in the project. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated packages: - Riok.Mapperly: 4.1.1 → 4.3.0 - libphonenumber-csharp: 8.13.54 → 9.0.18 (major version) libphonenumber-csharp major version update includes breaking changes but the library maintains backward compatibility for core phone number parsing and formatting functionality. Test results: 24 tests passed (8 analyzers, 1 common, 6 API, 9 Web.Spa) Pre-existing failures: 2 Web.Spa tests Build status: Successful 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated package: - System.ServiceModel.Primitives: 8.1.1 → 8.1.2 Patch version update for WCF service model primitives. Test results: 24 tests passed (8 analyzers, 1 common, 6 API, 9 Web.Spa) Pre-existing failures: 2 Web.Spa tests Build status: Successful 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated package: - TimeWarp.SourceGenerators: 1.0.0-alpha.8 → 1.0.0-beta.7 This is a major pre-release update from alpha to beta, indicating improved stability and feature completeness for the TimeWarp source generator package. Test results: 24 tests passed (8 analyzers, 1 common, 6 API, 9 Web.Spa) Pre-existing failures: 2 Web.Spa tests Build status: Successful 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Create task for migrating API documentation from Swashbuckle.AspNetCore to Scalar.AspNetCore based on impact analysis. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Replace Swashbuckle.AspNetCore with Scalar.AspNetCore to modernize API documentation interface while maintaining OpenAPI compatibility. Package Changes: - Remove Swashbuckle.AspNetCore and all variants from Directory.Packages.props - Remove MicroElements.Swashbuckle.FluentValidation package - Add Scalar.AspNetCore to Common.Server.csproj Code Changes: - CommonServerModule: Replace AddSwaggerGen with AddOpenApi - CommonServerModule: Replace UseSwaggerUi with UseScalarApiReference - Web.Server Program: Update method calls and remove unused constants - Remove SwaggerOperation attributes from 4 endpoint files - Update GlobalUsings to remove Swashbuckle and add Scalar imports Build Status: All projects compile successfully Refs: Kanban/InProgress/042_Migrate-From-Swashbuckle-To-Scalar.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Remove FluentValidation.AspNetCore (deprecated and no longer maintained) and migrate to manual validation approach using core FluentValidation. Package Changes: - Remove FluentValidation.AspNetCore from Directory.Packages.props - Update FluentValidation.DependencyInjectionExtensions from 11.9.1 to 12.1.0 - Replace FluentValidation.AspNetCore with FluentValidation.DependencyInjectionExtensions in project files Code Changes: - Remove AddFluentValidationAutoValidation() call from Web.Server/Program.cs - Remove AddFluentValidationClientsideAdapters() call from Web.Server/Program.cs - Remove FluentValidation.AspNetCore using from Web.Server/GlobalUsings.cs - Remove FluentValidation.AspNetCore using from Api.Server/GlobalUsings.cs - Keep AddValidatorsFromAssemblyContaining for validator registration Note: FluentValidation.AspNetCore is deprecated per FluentValidation/FluentValidation#1959 The team recommends using core FluentValidation with manual validation. Build Status: All projects compile successfully 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
…tion.AspNetCore - Remove FastEndpoints.Swagger from Api.Server (use Scalar directly) - Remove deprecated FluentValidation.AspNetCore package - Add IHttpContextAccessor registration (previously done by deprecated package) - Register FluentValidationBehavior pipeline in Web.Server for validation - Update FluentValidation.DependencyInjectionExtensions to 12.1.0 This migration improves the API documentation experience with Scalar's modern interface while maintaining full validation functionality through MediatR pipeline behaviors. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
All tests pass with identical results to baseline: - 35 tests passing - 2 pre-existing failures (CosmosDB emulator) - 4 skipped tests - Slight performance improvement in test execution No regressions detected from this upgrade. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Created task to remove unused AutoMapper dependency and document Mapperly as the preferred mapping library. Analysis shows AutoMapper is registered but never used (no Profile classes, no IMapper usage). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Removed AutoMapper from the solution as it was registered but never actually used. No Profile classes or IMapper usage existed in the codebase. Changes: - Removed AutoMapper package from Directory.Packages.props - Removed AutoMapper reference from Web.Server.csproj - Removed AutoMapper global using from Web.Server/GlobalUsings.cs - Removed AddAutoMapper registration from Web.Server/Program.cs Mapperly (Riok.Mapperly 4.1.1) is already referenced in Web.Application as the preferred mapping library for future use. Build succeeded with 0 warnings and 0 errors. Core integration tests passed successfully. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Marked all checklist items as complete and added completion summary with: - Commit hash and file changes - Build and test results (all passed) - Impact analysis Moved task from InProgress to Done folder. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated package: - xunit.runner.visualstudio: 3.0.1 → 3.1.5 This package enables running xUnit tests in Visual Studio Test Explorer and via dotnet test. Used by the Aspire test project. Note: The Aspire xUnit test has a pre-existing failure (incorrect resource name) that is unrelated to this package update. All Fixie-based tests pass. Test results: 24 Fixie tests passed (8 analyzers, 1 common, 6 API, 9 Web.Spa) Pre-existing failures: 2 Web.Spa tests Build status: Successful 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated IntegrationTest1.cs with correct resource name and endpoint: - Changed resource name from "api-server" to "api" (matches ApiServerProjectResourceName constant) - Fixed endpoint URL from "api/weatherForecasts" to "api/weatherforecast" (singular, matches actual route) - Enabled Aspire test in RunTests.ps1 (now passing) Test now passes successfully. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated Microsoft.Azure.AppConfiguration.AspNetCore from 8.0.0 to 8.4.0. All tests pass with no regressions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated Microsoft.NET.Test.Sdk from 17.12.0 to 18.0.0 (major version). All tests pass with no regressions. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated Azure.Identity from 1.13.2 to 1.17.0. All tests pass with no new regressions (2 pre-existing CosmosDB failures). Used by Common.Server for DefaultAzureCredential in Azure App Configuration Key Vault access. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated Microsoft.Identity.Web from 3.9.2 to 4.0.1 (major version). All tests pass with no regressions. Used by Web.Server for Microsoft Entra ID (Azure AD) authentication. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Documented all completed package updates in two waves: - Wave 1: Infrastructure & Core Libraries (7 packages) - Wave 2: Azure & Identity (4 packages) Marked all checklist items as complete and documented: - Test results showing all 25 tests passing - Additional work fixing Aspire integration test - Outstanding Aspire packages deferred for coordinated update 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Fixed two breaking changes introduced by Aspire package updates: 1. WithCommand API change: Updated to use new CommandOptions parameter - Changed from individual parameters to CommandOptions object - Updated updateState, iconName, and iconVariant to use CommandOptions properties 2. CosmosDB API change: Updated AddDatabase to AddCosmosDatabase - Changed from cosmos.AddDatabase() to cosmos.AddCosmosDatabase() - Moved RunAsEmulator() to be called on cosmos resource before adding database - Changed cosmosdb variable type to var to handle new return type Both changes address obsolete API warnings in Aspire 9.x. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated Aspire packages from 9.0.0 to 9.5.2: - Aspire.Hosting.AppHost - Aspire.Hosting.Azure.CosmosDB - Aspire.Hosting.Testing - Aspire.Microsoft.Azure.Cosmos All tests pass with updated packages. CosmosDB emulator updated to latest version to resolve expired evaluation period. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Added Wave 3 (Aspire Updates) to completed updates: - 4 Aspire packages updated from 9.0.0 to 9.5.2 - Documented breaking changes and their fixes - Updated test results to reflect CosmosDB emulator update - Marked all outstanding items as complete All NuGet packages are now up to date! 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Renamed WeatherForecastDto to TWeatherForecast across all files for consistency with naming conventions - Removed incorrect value equality assertion from clone test (line 41) - WeatherForecastDto comment claiming it was a record class was incorrect - git history shows it was always a sealed class - Clone test now correctly validates only reference inequality, not value equality - Updated serialization test namespace and method signature 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Changed UserDto to TUser in examples to align with T-prefix naming convention for DTOs - Maintains consistency with recent TWeatherForecast rename 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Added SVG avatar for repository branding 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Added IApiServerApiService registration in AspireSpaTestApplication - Added IAccessTokenProvider (fake) for authentication - Configured JsonSerializerOptions for API serialization - Added required using statements to GlobalUsings.cs - Updated test expectation from 1 to 5 forecasts (matches API handler) The test was failing because the FetchWeatherForecasts handler couldn't be constructed - it requires IApiServerApiService which wasn't registered in the test DI container. The handler would silently fail, leaving the state null. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Added additional work items (DTO rename, test fixes, documentation) - Updated final test results showing all tests passing - Task is now complete with all packages updated and all tests passing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Updated packages to .NET 10 RC versions and fixed all build warnings: - Upgrade target framework from net9.0 to net10.0 - Update Microsoft.Extensions.* packages to 10.0.0-rc.2.25502.107 - Update Microsoft.AspNetCore.* packages to 10.0.0-rc.2.25502.107 - Update Microsoft.CodeAnalysis.* packages to 5.0.0-2.final Fix NU1510 warnings (unnecessary package references): - Remove Microsoft.AspNetCore.Http.Abstractions from TimeWarp.Modules and Common.Server - Remove Microsoft.Extensions.DependencyInjection.Abstractions from TimeWarp.Modules and Common.Server - Remove System.Net.Http.Json and Microsoft.Extensions.Http from Web.Spa - Remove Microsoft.Extensions.Configuration.Abstractions from Api.Server Fix NU1903 warning (Newtonsoft.Json security vulnerability): - Remove Microsoft.AspNetCore.SignalR.Core 1.2.0 from Web.Contracts - Remove System.ServiceModel.Primitives from Web.Contracts (only needed in Grpc.Contracts) Fix CS0436 warning (Program class conflict): - Add NoWarn suppression for CS0436 in Testing.Common.csproj - Add NoWarn suppression in Api.Server.Integration.Tests.csproj - Add NoWarn suppression in Web.Spa.Integration.Tests.csproj - Add NoWarn suppression in Web.Server.Integration.Tests.csproj - Filed issue fixie/fixie#369 for permanent fix Convert Grpc.Server from top-level statements to explicit Program class. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
|
Claude finished @StevenTCramer's task —— View job PR Review: Upgrade to .NET 10Todo List
Review SummaryThis is a comprehensive upgrade to .NET 10 with good attention to resolving warnings and security issues. The changes are well-structured and thoroughly documented. ✅ StrengthsPackage Management
Security Improvements
Build Configuration
Development Experience
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Changes
Package Updates
NU1510 Fixes (Unnecessary Package References)
NU1903 Fix (Security Vulnerability)
CS0436 Fix (Program Class Conflict)
Other Changes
Test Plan
🤖 Generated with Claude Code