chore: promote dev → main (v1.1.0) — Sprint 4 Release - #106
Conversation
## Summary Adds `sprint/**` to the CI trigger in `squad-test.yml`. **Changes:** - New `push` trigger for `sprint/**` — so direct pushes to sprint consolidation branches run the parallel test suite - Added `sprint/**` to `pull_request.branches` — so PRs *targeting* sprint branches (e.g. squad/* → sprint/*) also trigger CI **Branch flow:** `squad/*` → `sprint/*` → `dev` → `main` Sprint branches are consolidation checkpoints. Without this fix, sprint-level PRs ran with zero remote validation. Closes #69 Working as Boromir (DevOps/Infra) --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Gate: Aragorn ✅ APPROVE (pre-push hook fix ready to merge)## Summary
<!-- Describe what this PR does and why. Link the issue it closes. -->
Closes #<!-- issue number -->
## Type of Change
<!-- Check all that apply -->
- [ ] 🐛 Bug fix (non-breaking change that fixes an issue)
- [ ] ✨ Feature (non-breaking change that adds functionality)
- [ ] ♻️ Refactor (no behavior change, code cleanup/restructure)
- [ ] 🧪 Tests (new or updated tests only)
- [ ] 📝 Docs (README, XML docs, comments)
- [ ] ⚙️ Infra/CI (GitHub Actions, Aspire, NuGet, deployment)
- [ ] 🔒 Security (auth, permissions, secrets, headers)
- [ ] 💥 Breaking change (existing behavior changes)
## Domain Affected
<!-- Check all that apply — this determines which reviewers are required
-->
- [ ] 🏗️ Architecture / domain logic / CQRS → **Aragorn required**
- [ ] 🔧 Backend (handlers, repositories, API endpoints, MediatR) → **Sam
required**
- [ ] ⚛️ Frontend (Blazor components, Razor pages, CSS, JS) → **Legolas
required**
- [ ] 🧪 Unit / bUnit / integration tests → **Gimli required**
- [ ] 🧪 E2E / Playwright / Aspire integration tests → **Pippin
required**
- [ ] ⚙️ CI/CD / GitHub Actions / NuGet / Aspire AppHost → **Boromir
required**
- [ ] 🔒 Auth0 / authorization / security-relevant changes → **Gandalf
required**
- [ ] 📝 Docs / README / XML docs → **Frodo required**
## Self-Review Checklist
<!-- Complete before requesting review — incomplete PRs will be returned
-->
### Code Quality
- [ ] I ran `dotnet build MyBlog.slnx --configuration Release` — 0
errors, 0 warnings
- [ ] I ran `dotnet test MyBlog.slnx --configuration Release --no-build`
— all pass
- [ ] No TODO/FIXME left unless tracked in a follow-up issue (link it)
- [ ] No secrets, API keys, or credentials committed
### Architecture
- [ ] New handlers follow the `Command`/`Query`/`Handler`/`Validator`
naming conventions
- [ ] New handlers are `sealed`
- [ ] Domain layer has no references to `Web` or `Persistence.*`
projects
- [ ] `Result<T>` / `ResultErrorCode` used for expected failures (no
exception-driven control flow)
- [ ] DTOs are records in `Domain.DTOs`; Models are in `Domain.Models`
- [ ] No DTO types embedded in Model classes
### Tests
- [ ] New code has corresponding unit tests
- [ ] Integration tests use domain-specific collections
(`[Collection("XxxIntegration")]`)
- [ ] No test compares two `IssueDto.Empty` / `CommentDto.Empty`
instances directly
### Security (check if security-relevant)
- [ ] New endpoints have appropriate `RequireAuthorization` / policy
applied
- [ ] No `MarkupString` used with user-supplied content
- [ ] No user input reflected in MongoDB queries without sanitization
### Merge Readiness
- [ ] Branch is up to date with `main` (no merge conflicts)
- [ ] CI checks are green (do not request review while checks are
pending/failing)
- [ ] PR description is complete — reviewers should not have to ask what
this does
## Screenshots / Evidence
<!-- For UI changes: before/after screenshots. For fixes: evidence the
bug is resolved. -->
## Notes for Reviewers
<!-- Anything you want reviewers to pay special attention to, or context
they need. -->
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary Closes #76 Working as Boromir (DevOps / Infra) The existing `project-board-automation.yml` only moves items between columns — it never added new issues or PRs to the board in the first place. This PR fills that gap with two dedicated workflows. ## Changes ### `add-issues-to-project.yml` - Triggers on `issues: [opened, reopened]` - Filters to issues labelled `squad` (avoids noise from unrelated issues) - Adds the issue to the MyBlog project board via GraphQL `addProjectV2ItemById` - Sets the **Status** field → **Backlog** (`f75ad846`) - Handles 403 errors gracefully with a hint to use a PAT with `project` scope ### `add-prs-to-project.yml` - Triggers on `pull_request: [opened, reopened]` - Adds every new PR to the MyBlog project board - Sets the **Status** field → **In Review** (`df73e18b`) - Handles 403 errors gracefully ## Project IDs used | Key | Value | |-----|-------| | PROJECT_ID | `PVT_kwHOA5k0b84BVFTy` | | STATUS_FIELD_ID | `PVTSSF_lAHOA5k0b84BVFTyzhQjgPk` | | BACKLOG_OPTION_ID | `f75ad846` | | IN_REVIEW_OPTION_ID | `df73e18b` | ## Notes Both workflows use `secrets.GITHUB_TOKEN`. If GitHub's fine-grained token restrictions block project writes (403), a PAT with the `project` scope stored as `secrets.GH_PROJECT_TOKEN` can be substituted. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Architecture test results → architecture-test-results artifact - Unit test results → unit-test-results artifact - Integration test results → integration-test-results artifact - All uploads use if: always() for fault tolerance - 30-day retention for cost-balancing Closes #73
…msHelper fixes (#79) feat(#59): Add Profile page, RoleClaimsHelper, and UI component tests Profile page: - Displays user info (name, email, roles) - Admin badge (red) in header - Role badges: Admin=red, others=green - Responsive Tailwind + DaisyUI layout RoleClaimsHelper: - Extract role claims from ClaimsPrincipal - Handle Auth0 and standard claim types - Performance optimization (return string[] vs IReadOnlyList) Tests (6 RoleClaimsHelper + 3 Profile): - Role extraction coverage (empty, Auth0, standard, mixed claims) - Badge rendering and styling validation - All tests passing, coverage gate met Closes #59
E2E tests with Aspire integration, CI hardening, fixture fixes.
…learnings Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
GitVersion auto-increments on main; v1.0.0-sprint3 is final sprint tag. Subsequent releases follow pure semantic versioning from v1.0.1 onwards. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
When CI runs on main after merge, create and push the git tag based on GitVersion-determined semver. This enables v1.0.1, v1.0.2, etc. to be automatically tagged without manual intervention. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
GitVersion v4 action no longer accepts 'useConfigFile'. Use 'configFilePath' to explicitly specify the GitVersion.yml location. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The 'Create and Push Git Tag' step requires 'contents: write' permission to push tags to the repository. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
semVer includes pre-release height on non-main branches, resulting in tags like v1.0.0-101. On main, we want clean semver tags like v1.0.1, which comes from the majorMinorPatch output. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Document the new automatic versioning workflow with GitVersion. This is the first commit after v1.0.0, which will trigger v1.0.1 tag creation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Aligns with squad naming conventions and PRD specification. All squad-managed workflows use the 'squad-' prefix. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…idates and blog-only paths
The AppHost.Tests requires MongoDB and Redis Docker containers to be started during test execution. On CI, these images need to be pulled from the registry, which was timing out during the test. Pre-pulling images ensures they are available before the test starts, preventing 'Connection reset by peer' errors.
The squad-ci.yml was running tests in addition to squad-test.yml, causing duplicate test execution. This workflow should only perform build operations (mirrors the pre-push gate build phase). Test execution is handled by squad-test.yml which runs on squad/** and sprint/** branches. Fixes: build-and-test check failure on PR #98
The Web application was throwing InvalidOperationException during AppHost.Tests startup because Auth0 configuration was required but not provided in CI. Solution: - Move Auth0 validation check to production environment only - In Development mode (used by Aspire E2E tests), use mock/test Auth0 values - Update appsettings.Development.json with test credentials This allows the web app to start successfully in the Aspire test environment without requiring real Auth0 credentials, while maintaining security in production where Auth0 is properly configured via user secrets. Fixes: AppHost.Tests 'Connection reset by peer' failure (PR #98) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Move Playwright E2E tests from legacy E2E structure to new AppHost.Tests layout - Extract infrastructure utilities (AspireManager, PlaywrightManager) into separate classes - Organize E2E tests by feature area (Admin, Layout, Pages, Theme) - Rename E2E test files for clarity (WebPlaywrightTests, EnvVarTests, etc.) - Add *.lscache to gitignore to ignore IDE cache files - Update AppHost.Tests project file to reference new test structure Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Centralize all NuGet package versions in Directory.Packages.props: - Created Directory.Packages.props with 30 unique package versions - Enabled ManagePackageVersionsCentrally in Directory.Build.props - Removed Version attributes from all PackageReference entries - All 10 .csproj files updated to use centralized versions Benefits: - Single source of truth for all NuGet package versions - Easier to audit and update dependencies - Reduces duplication across project files - Follows .NET best practices (SDK 10+) Build verified: Release build completes successfully
- Add Version attributes to all PackageReference items - Uses versions consistent with other test projects: - Aspire.Hosting.Testing 13.2.3 - FluentAssertions 8.9.0 - Microsoft.Playwright 1.48.0 - coverlet.collector 10.0.0 - Microsoft.NET.Test.Sdk 18.5.0 - xunit 2.9.3 - xunit.runner.visualstudio 3.1.5 Fixes: NuGet error NU1015 during CI build Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove Version attributes from all PackageReference items - Packages are managed centrally via Directory.Packages.props - Fixes NU1008 error: Central Package Management must define versions centrally Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CI cold-start takes longer than expected; increase timeout to 180 seconds to allow sufficient time for Aspire to provision containers and start the web app, even with Docker images pre-pulled. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The Web app was checking only IsDevelopment() to use mock Auth0 values, but E2E tests run in Testing environment. This caused app startup to fail with 'Auth0 configuration is missing or incomplete' error. Update check to include both Development and Testing environments, allowing mock Auth0 values to be used in both contexts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…gs__mongodb The AppHost creates a MongoDB database resource named 'myblog', so the generated connection string environment variable is ConnectionStrings__myblog, not ConnectionStrings__mongodb. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…config handling **Problem:** E2E tests were timing out during AspireManager.StartAppAsync() because: 1. The /alive endpoint was only mapped in Development environment, not Testing 2. Auth0 configuration was receiving empty strings instead of null, causing ArgumentException **Solution:** 1. Updated ServiceDefaults/Extensions.cs to map /alive and /health endpoints for Testing environment 2. Changed Web/Program.cs Auth0 config to use IsNullOrWhiteSpace() instead of IsNullOrEmpty() 3. Use direct assignment instead of null coalescing (??=) to ensure fallback values are applied 4. Added detailed logging to AspireManager for troubleshooting startup issues **Result:** - Web app now starts successfully in Testing environment - Health checks are properly accessible at /alive - AspireManager can verify app readiness before tests run - All infrastructure E2E tests can now proceed - Logging helps diagnose future startup issues Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…h runs in CI - Updated Web.csproj: Added GenerateBlazorAssets MSBuild target to run after build (Release only) - Target runs dotnet publish and copies _framework files to bin output - This ensures blazor.web.js and component JS files are available for AppHost.Tests - Added explicit publish step in squad-test.yml before AppHost.Tests runs - Fixes: FileNotFoundException for _framework/blazor.web.js in E2E tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Updated GenerateBlazorAssets target to copy files to both bin and src/Web/wwwroot - When Aspire runs 'dotnet run' from project directory, it looks for wwwroot in source location - Ensures blazor.web.js and component JS files are available for dotnet run execution Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Removed IssueTracker-specific test files (Dashboard, Admin, Issues pages) - Removed Theme and Admin layout tests (not applicable to MyBlog) - Updated HomePageTests assertions to match MyBlog's actual content - Updated Layout tests to remove IssueTracker brand/footer text expectations - Simplified NavMenu tests for MyBlog's actual page structure Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove orphaned build artifacts from src/Web/wwwroot (stale JS/CSS files, _framework directory, compressed .br/.gz variants) - Remove GenerateBlazorAssets target from Web.csproj that was causing duplicate asset conflicts in .NET 10 SDK - Add .gitignore rules to prevent future accumulation of build artifacts: _framework/, *.br, *.gz - Clean wwwroot directory and allow Blazor build system to regenerate assets on demand This fixes the BLAZOR106 error and 'Sequence contains more than one element' SDK error that was blocking Release builds on squad/80 branch. Fixes #99 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Closes #96 - Fix 7 flaky E2E tests: remove hard-coded 5000ms timeouts, use IsNullOrWhiteSpace in test login endpoint - Add ThemeSelector and fix Home href="/" in mobile hamburger menu (functional regression from Aragorn review) - Rename Layout_NavMenu_IsHiddenWhenNotAuthenticated to accurately reflect the assertion - Fix Playwright strict mode violations: use specific selectors to distinguish desktop vs mobile duplicate elements Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Resolves the VSA violation where CQRS handlers/commands/validators lived in Domain. - Deleted src/Domain/Features/ (13 files) - Deleted tests/Domain.Tests/ (superseded by Web.Tests) - Web/Program.cs: MediatR/FluentValidation now scan Web assembly only - Architecture.Tests: added Domain_Should_Not_Have_Features guard - Web.Tests: updated namespaces to MyBlog.Web.Features.* after move - AppHost.Tests: resolved all 70 build warnings Closes #103
Merge dev into main for Sprint 4 release. Resolve workflow conflicts by accepting dev versions (squad-ci.yml, squad-test.yml). Also fix squad-preview validate to exclude AppHost.Tests/Bunit. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
🏗️ PR Added to Squad Triage QueueThis PR has been labeled with Next steps:
|
Test Results Summary201 tests 201 ✅ 14s ⏱️ Results for commit 5f57e8b. |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #106 +/- ##
=======================================
Coverage ? 78.19%
=======================================
Files ? 40
Lines ? 642
Branches ? 107
=======================================
Hits ? 502
Misses ? 95
Partials ? 45
🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Pull request overview
Release promotion PR merging dev into main for Sprint 4 / v1.1.0, bringing in the new Blazor theme system, test-suite reorganization (unit/bUnit/integration/AppHost E2E), and CI/CD + build infrastructure updates (including Central Package Management).
Changes:
- Introduces a Blazor theme system (OKLCH palettes + ThemeProvider/ThemeSelector) and updates layout/components to use it.
- Reorganizes and expands test projects (Web unit tests, bUnit tests, integration tests, and Playwright/Aspire AppHost E2E).
- Updates build/CI infrastructure (CPM via
Directory.Packages.props, workflow additions/updates, pre-push gate updates).
Reviewed changes
Copilot reviewed 144 out of 146 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/Web.Tests/Web.Tests.csproj | Adds Web unit test project under new structure. |
| tests/Web.Tests/Security/RoleClaimsHelperTests.cs | Updates namespaces + expands RoleClaimsHelper tests. |
| tests/Web.Tests/ResultTests.cs | Adjusts namespace/imports for Result tests. |
| tests/Web.Tests/Handlers/GetBlogPostsHandlerTests.cs | Updates test namespace after reorg. |
| tests/Web.Tests/Handlers/EditBlogPostHandlerTests.cs | Updates namespace + strengthens NSubstitute argument match. |
| tests/Web.Tests/Handlers/DeleteBlogPostHandlerTests.cs | Updates namespace/imports for handler tests. |
| tests/Web.Tests/Handlers/CreateBlogPostHandlerTests.cs | Updates namespace for handler tests. |
| tests/Web.Tests/GlobalUsings.cs | Adds global usings for Web.Tests. |
| tests/Web.Tests/Features/BlogPosts/Commands/UpdateBlogPostCommandValidatorTests.cs | Adds validator tests (but currently mismatched naming/validator). |
| tests/Web.Tests/Features/BlogPosts/Commands/EditBlogPostCommandValidatorTests.cs | Updates namespace for validator tests. |
| tests/Web.Tests/Features/BlogPosts/Commands/DeleteBlogPostDomainCommandValidatorTests.cs | Adds delete-command validator tests. |
| tests/Web.Tests/Features/BlogPosts/Commands/DeleteBlogPostCommandValidatorTests.cs | Updates namespace for validator tests. |
| tests/Web.Tests/Features/BlogPosts/Commands/CreateBlogPostDomainCommandValidatorTests.cs | Adds create-command validator tests. |
| tests/Web.Tests/Features/BlogPosts/Commands/CreateBlogPostCommandValidatorTests.cs | Updates namespace for validator tests. |
| tests/Web.Tests/BlogPostTests.cs | Updates namespace for entity tests. |
| tests/Web.Tests/Behaviors/ValidationBehaviorTests.cs | Updates namespace/imports for pipeline behavior tests. |
| tests/Web.Tests.Integration/xunit.runner.json | Adds xUnit runner config for integration tests. |
| tests/Web.Tests.Integration/Web.Tests.Integration.csproj | Adds new integration test project. |
| tests/Web.Tests.Integration/IntegrationTest1.cs | Adds scaffold integration test placeholder. |
| tests/Web.Tests.Integration/Infrastructure/MongoDbFixture.cs | Moves/renames fixture + formatting fixes. |
| tests/Web.Tests.Integration/Infrastructure/BlogPostIntegrationCollection.cs | Updates namespace/formatting for collection fixture. |
| tests/Web.Tests.Integration/GlobalUsings.cs | Updates integration test global usings + project name. |
| tests/Web.Tests.Integration/BlogPosts/MongoDbBlogPostRepositoryTests.cs | Updates namespaces/usings + formatting. |
| tests/Web.Tests.Bunit/Web.Tests.Bunit.csproj | Adds new bUnit test project. |
| tests/Web.Tests.Bunit/Testing/TestAuthorizationService.cs | Updates namespace + project header. |
| tests/Web.Tests.Bunit/GlobalUsings.cs | Updates global usings (removes stale Domain.Abstractions global). |
| tests/Web.Tests.Bunit/Features/ProfileTests.cs | Updates namespace + adds role badge styling assertions. |
| tests/Web.Tests.Bunit/Components/Theme/ThemeProviderTests.cs | Adds ThemeProvider bUnit tests for JS interop + state behavior. |
| tests/Web.Tests.Bunit/Components/RazorSmokeTests.cs | Updates namespaces/usings + adds footer role assertion. |
| tests/Web.Tests.Bunit/Components/Layout/NavMenuTests.cs | Updates to render ThemeProvider wrapper and adds header/brand link assertions. |
| tests/Unit.Tests/Unit.Tests.csproj | Removes old combined Unit.Tests project. |
| tests/Unit.Tests/Domain/Queries/GetBlogPostByIdQueryHandlerTests.cs | Removes old Domain.Features handler tests. |
| tests/Unit.Tests/Domain/Queries/GetAllBlogPostsQueryHandlerTests.cs | Removes old Domain.Features handler tests. |
| tests/Unit.Tests/Domain/Commands/UpdateBlogPostCommandHandlerTests.cs | Removes old Domain.Features handler tests. |
| tests/Unit.Tests/Domain/Commands/DeleteBlogPostCommandHandlerTests.cs | Removes old Domain.Features handler tests. |
| tests/Unit.Tests/Domain/Commands/CreateBlogPostCommandHandlerTests.cs | Removes old Domain.Features handler tests. |
| tests/Integration.Tests/IntegrationTest1.cs | Removes old Integration.Tests scaffold. |
| tests/Integration.Tests/Integration.Tests.csproj | Removes old Integration.Tests project (replaced by Web.Tests.Integration). |
| tests/Architecture.Tests/ThemeLayerTests.cs | Adds architecture rules for Theme component namespace/dependencies. |
| tests/Architecture.Tests/DomainLayerTests.cs | Adds guard asserting Domain has no Features namespace. |
| tests/Architecture.Tests/Architecture.Tests.csproj | Updates project metadata + CPM-friendly PackageReferences. |
| tests/AppHost.Tests/WebPlaywrightTests.cs | Adds Playwright smoke tests for web resource. |
| tests/AppHost.Tests/Tests/Pages/NotFoundPageTests.cs | Adds E2E tests for 404 page. |
| tests/AppHost.Tests/Tests/Pages/HomePageTests.cs | Adds E2E tests for home page guest/auth views. |
| tests/AppHost.Tests/Tests/Layout/LayoutAuthenticatedTests.cs | Adds authenticated layout E2E tests. |
| tests/AppHost.Tests/Tests/Layout/LayoutAnonymousTests.cs | Adds anonymous layout E2E tests. |
| tests/AppHost.Tests/Infrastructure/PlaywrightManager.cs | Adds shared Playwright browser lifecycle manager. |
| tests/AppHost.Tests/Infrastructure/AspireManager.cs | Adds Aspire fixture to start AppHost + enforce Testing env + health polling. |
| tests/AppHost.Tests/Infrastructure/AppHostTestCollection.cs | Adds xUnit collection fixture for shared AspireManager. |
| tests/AppHost.Tests/EnvVarTests.cs | Adds env var resolution tests for Aspire web resource. |
| tests/AppHost.Tests/BasePlaywrightTests.cs | Adds Playwright base class with health polling + auth helpers. |
| tests/AppHost.Tests/AppHost.Tests.csproj | Adds AppHost E2E test project. |
| src/Web/appsettings.Development.json | Sets Auth0 test values in Development config. |
| src/Web/Web.csproj | Moves to CPM references + adjusts publish/build properties. |
| src/Web/Styles/themes.css | Adds OKLCH theme palettes (CSS vars). |
| src/Web/Styles/input.css | Adds Tailwind v4 input + tokens + component layer styles. |
| src/Web/Security/RoleClaimsHelper.cs | Improves null handling + internal role-claim type computation. |
| src/Web/Program.cs | Makes Auth0 required only in Production; adds /test/login endpoint; limits MediatR/validators to Web assembly. |
| src/Web/GlobalUsings.cs | Removes stale global using for Domain.Abstractions. |
| src/Web/Features/UserManagement/UserManagementHandler.cs | Adds MyBlog.Domain.Abstractions import after namespace changes. |
| src/Web/Features/UserManagement/RemoveRoleCommand.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/UserManagement/Profile.razor | Adds Admin badges and role styling; tracks _isAdmin. |
| src/Web/Features/UserManagement/GetUsersWithRolesQuery.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/UserManagement/GetAvailableRolesQuery.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/UserManagement/AssignRoleCommand.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/BlogPosts/List/Index.razor | Updates ResultErrorCode namespace reference. |
| src/Web/Features/BlogPosts/List/GetBlogPostsQuery.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/BlogPosts/List/GetBlogPostsHandler.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/BlogPosts/Edit/GetBlogPostByIdQuery.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/BlogPosts/Edit/EditBlogPostHandler.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/BlogPosts/Edit/EditBlogPostCommand.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/BlogPosts/Edit/Edit.razor | Updates ResultErrorCode namespace reference. |
| src/Web/Features/BlogPosts/Delete/DeleteBlogPostHandler.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/BlogPosts/Delete/DeleteBlogPostCommand.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/BlogPosts/Create/CreateBlogPostHandler.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Features/BlogPosts/Create/CreateBlogPostCommand.cs | Adds MyBlog.Domain.Abstractions import. |
| src/Web/Components/_Imports.razor | Adds Theme components namespace import. |
| src/Web/Components/Theme/ThemeSelector.razor | Adds ThemeSelector wrapper component. |
| src/Web/Components/Theme/ThemeProvider.razor.cs | Adds ThemeProvider code-behind with JS interop + cascading state. |
| src/Web/Components/Theme/ThemeProvider.razor | Adds cascading values for theme state/provider. |
| src/Web/Components/Theme/ThemeColorDropdownComponent.razor | Adds color dropdown component (accessible select). |
| src/Web/Components/Theme/ThemeBrightnessToggleComponent.razor | Adds brightness toggle button component with SVG icons. |
| src/Web/Components/Layout/NavMenu.razor | Refactors NavMenu: header landmark + ThemeSelector usage + consistent auth URLs. |
| src/Web/Components/Layout/MainLayout.razor | Adds role="contentinfo" to footer. |
| src/Web/Components/App.razor | Wraps routes with ThemeProvider + sets interactive render mode. |
| src/ServiceDefaults/ServiceDefaults.csproj | Moves package refs to CPM style. |
| src/ServiceDefaults/Extensions.cs | Moves namespace to MyBlog.ServiceDefaults; maps endpoints in Development/Testing; adds code coverage exclusion. |
| src/Domain/Features/BlogPosts/Queries/GetBlogPostById/GetBlogPostByIdQueryHandler.cs | Removes Domain.Features CQRS handler (migrated to Web). |
| src/Domain/Features/BlogPosts/Queries/GetBlogPostById/GetBlogPostByIdQuery.cs | Removes Domain.Features CQRS query (migrated to Web). |
| src/Domain/Features/BlogPosts/Queries/GetAllBlogPosts/GetAllBlogPostsQueryHandler.cs | Removes Domain.Features CQRS handler (migrated to Web). |
| src/Domain/Features/BlogPosts/Queries/GetAllBlogPosts/GetAllBlogPostsQuery.cs | Removes Domain.Features CQRS query (migrated to Web). |
| src/Domain/Features/BlogPosts/Commands/UpdateBlogPost/UpdateBlogPostCommandValidator.cs | Removes Domain.Features validator (migrated to Web). |
| src/Domain/Features/BlogPosts/Commands/UpdateBlogPost/UpdateBlogPostCommandHandler.cs | Removes Domain.Features handler (migrated to Web). |
| src/Domain/Features/BlogPosts/Commands/UpdateBlogPost/UpdateBlogPostCommand.cs | Removes Domain.Features command (migrated to Web). |
| src/Domain/Features/BlogPosts/Commands/DeleteBlogPost/DeleteBlogPostCommandValidator.cs | Removes Domain.Features validator (migrated to Web). |
| src/Domain/Features/BlogPosts/Commands/DeleteBlogPost/DeleteBlogPostCommandHandler.cs | Removes Domain.Features handler (migrated to Web). |
| src/Domain/Features/BlogPosts/Commands/DeleteBlogPost/DeleteBlogPostCommand.cs | Removes Domain.Features command (migrated to Web). |
| src/Domain/Features/BlogPosts/Commands/CreateBlogPost/CreateBlogPostCommandValidator.cs | Removes Domain.Features validator (migrated to Web). |
| src/Domain/Features/BlogPosts/Commands/CreateBlogPost/CreateBlogPostCommandHandler.cs | Removes Domain.Features handler (migrated to Web). |
| src/Domain/Features/BlogPosts/Commands/CreateBlogPost/CreateBlogPostCommand.cs | Removes Domain.Features command (migrated to Web). |
| src/Domain/Domain.csproj | Moves package refs to CPM style. |
| src/Domain/Behaviors/ValidationBehavior.cs | Updates Result namespace import to MyBlog.Domain.Abstractions. |
| src/Domain/Abstractions/Result.cs | Renames namespace to MyBlog.Domain.Abstractions + simplifies Fail overload usage. |
| src/AppHost/AppHost.csproj | Moves Aspire package refs to CPM style. |
| src/AppHost/AppHost.cs | Adds partial Program excluded from code coverage. |
| scripts/install-hooks.sh | Updates branch naming gate messaging (but still references old test paths). |
| package.json | Updates Tailwind CLI input to src/Web/Styles/input.css. |
| docs/blazor-web-app-starter-template-prd.md | Renames IssueTracker references to MyBlog in PRD text. |
| docs/TESTING.md | Adds testing guide doc (currently non-compliant with repo markdown rules). |
| docs/ARCHITECTURE.md | Updates architecture doc sections (some statements now inconsistent with code). |
| MyBlog.slnx | Updates solution to include new test projects and AppHost.Tests; removes old ones. |
| MyBlog.sln.DotSettings | Adds Rider/ReSharper dictionary settings. |
| Directory.Packages.props | Introduces Central Package Management (CPM) versions. |
| Directory.Build.props | Adds analyzer/code-style build settings and LangVersion latest. |
| .squad/infrastructure-fix-summary.md | Adds internal infra fix summary (currently non-compliant markdown). |
| .squad/decisions/DELETED-ASSETS.md | Renames legacy playbook reference to MyBlog. |
| .squad/decisions.md | Updates decisions text and references to renamed playbook. |
| .squad/agents/pippin/history.md | Updates history references to renamed playbook. |
| .squad/agents/boromir/history.md | Adds sprint branch flow notes. |
| .squad/agents/aragorn/history.md | Updates references to renamed playbook. |
| .squad/.ralph-state.json | Adds initial Ralph state file. |
| .gitignore | Ignores logs/coverage outputs and Blazor build artifacts. |
| .github/workflows/sync-readme.yml | Adds workflow to sync root README into docs copy. |
| .github/workflows/static.yml | Adds GitHub Pages deployment for docs/blog/. |
| .github/workflows/squad-release.yml | Adds tag-based release workflow (currently references removed test project). |
| .github/workflows/squad-promote.yml | Adds workflow to open/refresh dev→main promotion PRs. |
| .github/workflows/squad-preview.yml | Adds dev-branch validation workflow. |
| .github/workflows/squad-milestone-release.yml | Adds workflow to cut/push release tags + create release. |
| .github/workflows/squad-insider-release.yml | Adds insider branch pre-release flow (currently references removed test project). |
| .github/workflows/squad-docs.yml | Adds optional docs build workflow scaffold. |
| .github/workflows/squad-ci.yml | Simplifies CI to build-only and adjusts triggers. |
| .github/workflows/release-blog.yml | Creates Bilbo blog-brief issues on GitHub Release publish. |
| .github/workflows/milestone-release-decision.yml | Automates release-vs-blog path based on Ralph’s labels. |
| .github/workflows/milestone-blog.yml | Creates Ralph review issue when milestone closes. |
| .github/workflows/code-metrics.yml | Adds automated .NET code metrics workflow. |
| .github/workflows/blog-readme-sync.yml | Syncs docs/blog index “recent posts” into README section. |
| .github/workflows/add-prs-to-project.yml | Auto-adds PRs to project board. |
| .github/workflows/add-issues-to-project.yml | Auto-adds squad-labeled issues to project board. |
| .github/skills/squad-finalize/SKILL.md | Adds squad-finalize skill doc (currently uses H1). |
| .github/hooks/pre-push | Updates test gate paths (currently references non-existent Domain.Tests). |
| .github/extensions/squad-finalize/extension.mjs | Adds Copilot extension implementing squad-finalize automation. |
Comments suppressed due to low confidence (1)
scripts/install-hooks.sh:68
- The printed gate descriptions still reference
tests/Unit.Testsandtests/Integration.Tests, but this PR removes those projects and replaces them withtests/Web.Tests*. Update these messages to match the actual pre-push hook projects to avoid misleading contributors.
| <ThemeProvider> | ||
| <Routes @rendermode="InteractiveServer" /> | ||
| </ThemeProvider> |
There was a problem hiding this comment.
ThemeProvider is rendered outside the interactive render-mode boundary, so its cascading values and JS interop won’t participate in the interactive component tree. This likely leaves ThemeSelector without a provider and breaks theme changes at runtime. Apply the render mode to ThemeProvider (or otherwise ensure it’s inside the same interactive subtree as Routes).
| // Test-only login endpoint for E2E testing (Development/Testing environments only) | ||
| if (app.Environment.IsDevelopment() || app.Environment.IsEnvironment("Testing")) | ||
| { | ||
| app.MapGet("/test/login", MapTestLoginEndpoint).AllowAnonymous(); | ||
| } |
There was a problem hiding this comment.
The /test/login endpoint is enabled for Development as well as Testing and performs an anonymous sign-in. If a dev instance is reachable outside localhost, this becomes an auth bypass. Consider restricting this endpoint to the Testing environment only, or require an additional guard (e.g., local-only check, secret header, or compile-time DEBUG).
| TEST_PROJECTS=( | ||
| "tests/Architecture.Tests/Architecture.Tests.csproj" | ||
| "tests/Unit.Tests/Unit.Tests.csproj" | ||
| "tests/Domain.Tests/Domain.Tests.csproj" | ||
| "tests/Web.Tests/Web.Tests.csproj" | ||
| "tests/Web.Tests.Bunit/Web.Tests.Bunit.csproj" | ||
| ) |
There was a problem hiding this comment.
tests/Domain.Tests/Domain.Tests.csproj is referenced in Gate 3 but that project does not exist (tests folder contains AppHost.Tests, Architecture.Tests, Web.Tests, Web.Tests.Bunit, Web.Tests.Integration). This will make the pre-push hook fail for everyone. Remove or replace this entry with the correct test project(s).
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \ | ||
| --logger "trx;LogFileName=domain-results.trx" | ||
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \ | ||
| --logger "trx;LogFileName=web-results.trx" | ||
| dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore \ | ||
| --logger "trx;LogFileName=arch-results.trx" | ||
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \ |
There was a problem hiding this comment.
The workflow runs dotnet test tests/Unit.Tests/Unit.Tests.csproj, but that project is deleted in this PR. This will break the release pipeline on tag push. Update the test commands to run the current test projects (e.g., tests/Web.Tests, tests/Web.Tests.Bunit, tests/Web.Tests.Integration, plus tests/Architecture.Tests).
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \ | |
| --logger "trx;LogFileName=domain-results.trx" | |
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \ | |
| --logger "trx;LogFileName=web-results.trx" | |
| dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore \ | |
| --logger "trx;LogFileName=arch-results.trx" | |
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore \ | |
| dotnet test tests/Web.Tests --configuration Release --no-build --no-restore \ | |
| --logger "trx;LogFileName=domain-results.trx" | |
| dotnet test tests/Web.Tests.Integration --configuration Release --no-build --no-restore \ | |
| --logger "trx;LogFileName=web-results.trx" | |
| dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore \ | |
| --logger "trx;LogFileName=arch-results.trx" | |
| dotnet test tests/Web.Tests.Bunit --configuration Release --no-build --no-restore \ |
| # E2E Test Infrastructure Fix - AppHost.Tests Aspire Timeout Resolution | ||
|
|
||
| **Date:** 2026-04-23 | ||
| **Status:** ✅ RESOLVED | ||
| **Branch:** squad/80-reorganize-test-projects | ||
| **Commit:** 89fd3dc |
There was a problem hiding this comment.
This markdown file appears to be missing required YAML front matter and begins with an H1, which violates the repo markdown validation rules applied to **/*.md. Add the required front matter and change the top heading to H2+ so CI/doc validation doesn’t fail.
| public async Task SetColor(string color) | ||
| { | ||
| CurrentColor = color; | ||
| StateHasChanged(); | ||
| await Js.InvokeVoidAsync("themeManager.setColor", color); | ||
| } | ||
|
|
||
| public async Task SetBrightness(string brightness) | ||
| { | ||
| CurrentBrightness = brightness; | ||
| StateHasChanged(); | ||
| await Js.InvokeVoidAsync("themeManager.setBrightness", brightness); | ||
| } |
There was a problem hiding this comment.
SetColor/SetBrightness call JS interop without handling exceptions. If JS is unavailable or localStorage is blocked, the exception will propagate and can break the Blazor circuit on user interaction. Consider catching JSException (and/or TaskCanceledException) similarly to OnAfterRenderAsync, and only updating state after a successful JS call (or fallback gracefully).
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore | ||
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore | ||
| dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore | ||
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore |
There was a problem hiding this comment.
The workflow still runs dotnet test tests/Unit.Tests/Unit.Tests.csproj, which is removed in this PR. This will break insider release runs. Update the test commands to target the current test projects (Web.Tests / Web.Tests.Bunit / Web.Tests.Integration / Architecture.Tests).
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore | |
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore | |
| dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore | |
| dotnet test tests/Unit.Tests/Unit.Tests.csproj --configuration Release --no-build --no-restore | |
| dotnet test tests/Web.Tests --configuration Release --no-build --no-restore | |
| dotnet test tests/Web.Tests.Bunit --configuration Release --no-build --no-restore | |
| dotnet test tests/Web.Tests.Integration --configuration Release --no-build --no-restore | |
| dotnet test tests/Architecture.Tests --configuration Release --no-build --no-restore |
| # Testing Guide | ||
|
|
||
| This document covers the testing strategy, test projects, and code coverage requirements for IssueTrackerApp. | ||
|
|
||
| ## Test Projects | ||
|
|
There was a problem hiding this comment.
This doc violates the repo markdown rules: it starts with an H1 and has no YAML front matter, which the validators enforce for **/*.md. Also, the intro references IssueTrackerApp (not MyBlog) and includes outdated test project names/solution path. Add the required front matter and change the heading level (start at H2), then update the content to match MyBlog’s test projects.
| # Squad Finalize Skill | ||
|
|
||
| Automate the squad branch workflow: review changes, stage, commit, push, create PR, clean up, and sync with dev. | ||
|
|
||
| ## Workflow | ||
|
|
||
| ### 1. Validate Context | ||
| - Check current branch is not `main` or `dev` (safety check) | ||
| - Verify git is available and we're in a repository | ||
| - Confirm user is ready to proceed | ||
|
|
||
| ### 2. Review Changes | ||
| - Run `git diff --stat` to show summary of changes | ||
| - Present changes to user for review | ||
| - Ask user to confirm proceeding | ||
|
|
||
| ### 3. Stage and Commit | ||
| - Run `git add -A` to stage all changes | ||
| - Generate commit message from branch name (e.g., `squad/80-reorganize-test-projects` → `Reorganize Test Projects`) | ||
| - Allow user to provide custom commit message if desired | ||
| - Run `git commit -m "<message>"` with co-author trailer | ||
|
|
||
| ### 4. Push to Remote | ||
| - Run `git push -u origin <current-branch>` | ||
| - Wait for push to complete | ||
| - Report success or failure | ||
|
|
||
| ### 5. Create Pull Request | ||
| - Run `gh pr create --base dev --head <current-branch> --title "<commit-message>" --body "Automated squad workflow PR"` | ||
| - Extract PR URL from output | ||
| - Report PR creation success | ||
| - If PR already exists, fetch and display existing PR URL | ||
|
|
||
| ### 6. Cleanup | ||
| - Ask user if they want to delete the local branch (default: yes) | ||
| - If confirmed, run `git branch -D <current-branch>` | ||
| - Report branch deletion | ||
|
|
||
| ### 7. Sync with Dev |
There was a problem hiding this comment.
Markdown validators require no H1 headings (start at H2) even when YAML front matter is present. # Squad Finalize Skill will fail validation. Change it to ## and adjust subsequent heading levels accordingly.
| # Squad Finalize Skill | |
| Automate the squad branch workflow: review changes, stage, commit, push, create PR, clean up, and sync with dev. | |
| ## Workflow | |
| ### 1. Validate Context | |
| - Check current branch is not `main` or `dev` (safety check) | |
| - Verify git is available and we're in a repository | |
| - Confirm user is ready to proceed | |
| ### 2. Review Changes | |
| - Run `git diff --stat` to show summary of changes | |
| - Present changes to user for review | |
| - Ask user to confirm proceeding | |
| ### 3. Stage and Commit | |
| - Run `git add -A` to stage all changes | |
| - Generate commit message from branch name (e.g., `squad/80-reorganize-test-projects` → `Reorganize Test Projects`) | |
| - Allow user to provide custom commit message if desired | |
| - Run `git commit -m "<message>"` with co-author trailer | |
| ### 4. Push to Remote | |
| - Run `git push -u origin <current-branch>` | |
| - Wait for push to complete | |
| - Report success or failure | |
| ### 5. Create Pull Request | |
| - Run `gh pr create --base dev --head <current-branch> --title "<commit-message>" --body "Automated squad workflow PR"` | |
| - Extract PR URL from output | |
| - Report PR creation success | |
| - If PR already exists, fetch and display existing PR URL | |
| ### 6. Cleanup | |
| - Ask user if they want to delete the local branch (default: yes) | |
| - If confirmed, run `git branch -D <current-branch>` | |
| - Report branch deletion | |
| ### 7. Sync with Dev | |
| ## Squad Finalize Skill | |
| Automate the squad branch workflow: review changes, stage, commit, push, create PR, clean up, and sync with dev. | |
| ### Workflow | |
| #### 1. Validate Context | |
| - Check current branch is not `main` or `dev` (safety check) | |
| - Verify git is available and we're in a repository | |
| - Confirm user is ready to proceed | |
| #### 2. Review Changes | |
| - Run `git diff --stat` to show summary of changes | |
| - Present changes to user for review | |
| - Ask user to confirm proceeding | |
| #### 3. Stage and Commit | |
| - Run `git add -A` to stage all changes | |
| - Generate commit message from branch name (e.g., `squad/80-reorganize-test-projects` → `Reorganize Test Projects`) | |
| - Allow user to provide custom commit message if desired | |
| - Run `git commit -m "<message>"` with co-author trailer | |
| #### 4. Push to Remote | |
| - Run `git push -u origin <current-branch>` | |
| - Wait for push to complete | |
| - Report success or failure | |
| #### 5. Create Pull Request | |
| - Run `gh pr create --base dev --head <current-branch> --title "<commit-message>" --body "Automated squad workflow PR"` | |
| - Extract PR URL from output | |
| - Report PR creation success | |
| - If PR already exists, fetch and display existing PR URL | |
| #### 6. Cleanup | |
| - Ask user if they want to delete the local branch (default: yes) | |
| - If confirmed, run `git branch -D <current-branch>` | |
| - Report branch deletion | |
| #### 7. Sync with Dev |
| public class UpdateBlogPostCommandValidatorTests | ||
| { | ||
| private readonly EditBlogPostCommandValidator _validator = new(); | ||
|
|
There was a problem hiding this comment.
Test name doesn’t match the validator under test: UpdateBlogPostCommandValidatorTests instantiates EditBlogPostCommandValidator and uses EditBlogPostCommand. Rename the test class/file (or switch the validator) so the intent is clear and consistent.
Sprint 4 Release — v1.1.0
Replaces PR #105 which had a merge conflict in workflow files (
squad-ci.yml,squad-test.yml).Changes included
All Sprint 4 work from
dev:Conflict resolution
squad-ci.ymlandsquad-test.ymlhad add/add and content conflicts from main having an older version. Resolved by accepting thedevversions (correct current state).Closes #105
After merging, run squad-milestone-release to tag and publish v1.1.0.