Improve bit Boilerplate tooling (#12820) - #12821
Conversation
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
WalkthroughThe boilerplate now uses Aspire configuration and commands, replaces the in-app SCSS compiler with ChangesBoilerplate tooling updates
Estimated code review effort: 4 (Complex) | ~45 minutes Suggested reviewers: Sequence Diagram(s)sequenceDiagram
participant FileSystemWatcher
participant FileWatcherService
participant DotnetBuild
FileSystemWatcher->>FileWatcherService: report supported file change
FileWatcherService->>DotnetBuild: run queued MSBuild target
DotnetBuild-->>FileWatcherService: return build output and errors
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (1 warning, 2 inconclusive)
✅ Passed checks (2 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Pull request overview
This PR updates the Bit Boilerplate developer tooling and docs, primarily removing the dependency on Live Sass Compiler / the in-app SCSS compiler and shifting SCSS handling toward MSBuild-based CSS builds and updated Aspire tooling/configuration.
Changes:
- Replaced the in-app SCSS watcher/compiler approach with a development-only file watcher that triggers
dotnet build -t:BuildCssFileson SCSS changes. - Removed references/recommendations for the VS Code “Live Sass Compiler” extension across template docs and configuration.
- Updated Aspire-related configuration/docs (new
aspire.config.json, updated env var names, and documentation references toaspire start).
Reviewed changes
Copilot reviewed 25 out of 25 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates06RunProjectPage.razor | Removes Live Sass Compiler mention from template “run project” guidance. |
| src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor | Updates “Getting started” tooling guidance (VS Code section now cross-platform-only). |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Properties/launchSettings.json | Removes IN_APP_SCSS_COMPILER_ENABLED env var from launch profiles. |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs | Tweaks dev cache-control behavior (NoStore = true). |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.cs | Starts the new FileWatcherService in development builds. |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/ScssCompilerService.cs | Removes the old in-app SCSS compiler service. |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/FileWatcherService.cs | Adds a watcher that rebuilds CSS via MSBuild target on SCSS changes. |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Boilerplate.Server.Web.csproj | Removes old dev-only Win32 jobs dependency; excludes new watcher service from non-Dev builds. |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Properties/launchSettings.json | Updates Aspire-related environment variable names. |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs | Updates comments and adjusts structure around run-mode guidance (incl. aspire start). |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/.aspire/settings.json | Removes legacy Aspire settings file. |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Build.props | Moves/centralizes WASM/static web asset fingerprint settings and minor formatting. |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Boilerplate.Client.Web.csproj | Removes duplicated fingerprint settings (now in Directory.Build.props) and formatting-only updates. |
| src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Common/Acknowledgements.razor.cs | Removes Live Sass Compiler from acknowledgements list. |
| src/Templates/Boilerplate/Bit.Boilerplate/aspire.config.json | Adds new Aspire configuration file. |
| src/Templates/Boilerplate/Bit.Boilerplate/AGENTS.md | Updates command reference paths and Aspire run command (aspire start). |
| src/Templates/Boilerplate/Bit.Boilerplate/.vscode/tasks.json | Simplifies tasks; updates build command to use Boilerplate.slnx. |
| src/Templates/Boilerplate/Bit.Boilerplate/.vscode/settings.json | Removes Live Sass watch setting; formatting cleanup. |
| src/Templates/Boilerplate/Bit.Boilerplate/.vscode/mcp.json | Adds conditional Aspire MCP server config; formatting cleanup. |
| src/Templates/Boilerplate/Bit.Boilerplate/.vscode/extensions.json | Removes Live Sass extension recommendation. |
| src/Templates/Boilerplate/Bit.Boilerplate/.mcp.json | Reformats and adds conditional Aspire MCP server entry. |
| src/Templates/Boilerplate/Bit.Boilerplate/.docs/20- .NET Aspire.md | Updates docs to reference aspire start. |
| src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md | Removes Live Sass settings/extensions from documentation examples. |
| src/Templates/Boilerplate/Bit.Boilerplate/.devcontainer/devcontainer.json | Removes Live Sass extension from devcontainer recommendations. |
| .devcontainer/devcontainer.json | Removes Live Sass extension from repo-level devcontainer recommendations. |
There was a problem hiding this comment.
Actionable comments posted: 5
🧹 Nitpick comments (1)
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/FileWatcherService.cs (1)
20-21: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winRestrict recursive discovery and watches to style source directories.
The project scan and each watcher recurse through every child directory.
src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Boilerplate.Client.Core.csprojLines 69-87 invokesnode_modules/.bin/sass, sonode_modulesis below a watched project root. Do not traverse or watch package folders. Discover client projects directly and watch only SCSS source roots such asComponentsandStyles.Also applies to: 32-35
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/FileWatcherService.cs` around lines 20 - 21, Restrict the client project discovery using Directory.EnumerateFiles to the immediate client directory instead of recursive traversal, excluding nested package folders such as node_modules. Update the watcher setup around watcherService.WatchProject so watches target only the SCSS source roots, such as Components and Styles, rather than entire project trees.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/Templates/Boilerplate/Bit.Boilerplate/.mcp.json`:
- Around line 15-23: Make the .mcp.json template compatible with the configured
Biome JSON parser by excluding it from JSON linting or preprocessing its
conditional //#if and //#endif directives before parsing. Preserve the generated
aspire configuration and ensure the chosen approach applies specifically to this
template without affecting valid JSON files.
In
`@src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/FileWatcherService.cs`:
- Around line 51-53: Coordinate shutdown in FileWatcherService so queued or
active RunBuildAsync tasks are cancelled or drained before Dispose disposes the
watchers and buildLock. Update the ApplicationStopping shutdown flow and
QueueBuild task management to prevent WaitAsync or the finally Release from
accessing buildLock after disposal, while preserving normal build execution.
- Around line 46-54: Update QueueBuild and RunBuildAsync to use a per-project
serial queue that retains one pending build while another build is active,
rather than returning when buildLock is held. Coalesce duplicate
changedFile/projectPath events, and ensure the queued SCSS change runs after the
current build completes.
In
`@src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.cs`:
- Line 49: Correct the indentation of the FileWatcherService.Start call in the
application startup code by adding the required four leading spaces so the
Bit.Templates build passes its whitespace validation.
In
`@src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates06RunProjectPage.razor`:
- Line 50: Update the development prerequisite sentence in
Templates06RunProjectPage so it joins “Visual Studio” and “the .NET SDK” with
“and” instead of a comma.
---
Nitpick comments:
In
`@src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/FileWatcherService.cs`:
- Around line 20-21: Restrict the client project discovery using
Directory.EnumerateFiles to the immediate client directory instead of recursive
traversal, excluding nested package folders such as node_modules. Update the
watcher setup around watcherService.WatchProject so watches target only the SCSS
source roots, such as Components and Styles, rather than entire project trees.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: bf878529-b4b1-46dd-b68a-8a3deeae8d7d
📒 Files selected for processing (25)
.devcontainer/devcontainer.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.devcontainer/devcontainer.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.mdsrc/Templates/Boilerplate/Bit.Boilerplate/.docs/20- .NET Aspire.mdsrc/Templates/Boilerplate/Bit.Boilerplate/.mcp.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.vscode/extensions.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.vscode/mcp.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.vscode/settings.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.vscode/tasks.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/AGENTS.mdsrc/Templates/Boilerplate/Bit.Boilerplate/aspire.config.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Common/Acknowledgements.razor.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Boilerplate.Client.Web.csprojsrc/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Build.propssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/.aspire/settings.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Properties/launchSettings.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Boilerplate.Server.Web.csprojsrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/FileWatcherService.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/ScssCompilerService.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Properties/launchSettings.jsonsrc/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razorsrc/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates06RunProjectPage.razor
💤 Files with no reviewable changes (5)
- .devcontainer/devcontainer.json
- src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/.aspire/settings.json
- src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/ScssCompilerService.cs
- src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Common/Acknowledgements.razor.cs
- src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 30 out of 30 changed files in this pull request and generated no new comments.
Suppressed comments (3)
src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates05CreateProjectPage.razor.cs:20
brouternow hasDefault = falsebut still initializesValue = true, which makes the parameter appear modified by default (IsModified == true) and likely generates--broutereven though the default was changed to off. AlignValuewith the new default (or keep both true if it should remain enabled by default).
private Parameter<bool> brouter = new() { Value = true, Default = false };
src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Build.props:43
- Static-web-asset fingerprinting is disabled unconditionally for all environments. This can cause stale JS/CSS to be served after deployments (cache busting relies on fingerprinting), especially with CDNs/proxies. If this is only to improve the dev workflow, scope these properties to Development (or Debug) instead of globally.
<WasmFingerprintAssets>false</WasmFingerprintAssets>
<StaticWebAssetsFingerprintContent>false</StaticWebAssetsFingerprintContent>
<StaticWebAssetFingerprintingEnabled>false</StaticWebAssetFingerprintingEnabled>
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/FileWatcherService.cs:77
Startreads and scans each discovered.csprojwithout guarding against IO/parsing issues. A single unreadable/corrupted project file (or transient IO error) would throw and can prevent the dev server from starting. Consider wrapping per-project initialization in a try/catch so file watching degrades gracefully and logs the failure.
foreach (var projectPath in Directory.EnumerateFiles(srcDirectory, "*.csproj", SearchOption.AllDirectories))
{
if (IsIgnored(srcDirectory, projectPath))
continue;
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/FileWatcherService.cs`:
- Line 37: Convert Infrastructure.Services.FileWatcherService.Start to async
StartAsync and replace each File.ReadAllText call with awaited
File.ReadAllTextAsync. Update Program.cs to await StartAsync during application
startup, preserving the existing watcher initialization behavior.
In
`@src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates05CreateProjectPage.razor.cs`:
- Line 20: Initialize the brouter Parameter in Templates05CreateProjectPage with
matching Value and Default values of false so IsModified is false at startup and
GetFinalCommand does not append the BRouter option for newly generated projects.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: bab8cc46-71d6-45ef-b091-7297af699c11
📒 Files selected for processing (30)
.devcontainer/devcontainer.json.github/workflows/bit.full.ci.ymlsrc/Templates/Boilerplate/Bit.Boilerplate/.devcontainer/devcontainer.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.mdsrc/Templates/Boilerplate/Bit.Boilerplate/.docs/20- .NET Aspire.mdsrc/Templates/Boilerplate/Bit.Boilerplate/.gitignoresrc/Templates/Boilerplate/Bit.Boilerplate/.mcp.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.vscode/extensions.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.vscode/mcp.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.vscode/settings.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/.vscode/tasks.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/AGENTS.mdsrc/Templates/Boilerplate/Bit.Boilerplate/aspire.config.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Common/Acknowledgements.razor.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Boilerplate.Client.Web.csprojsrc/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Build.propssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/Services/AppCertificateService.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/.aspire/settings.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Properties/launchSettings.jsonsrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Boilerplate.Server.Web.csprojsrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/FileWatcherService.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/ScssCompilerService.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.cssrc/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Properties/launchSettings.jsonsrc/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razorsrc/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cssrc/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates05CreateProjectPage.razor.cssrc/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates06RunProjectPage.razor
💤 Files with no reviewable changes (6)
- src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs
- src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Common/Acknowledgements.razor.cs
- .devcontainer/devcontainer.json
- src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Infrastructure/Services/ScssCompilerService.cs
- src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md
- src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/.aspire/settings.json
🚧 Files skipped from review as they are similar to previous changes (16)
- src/Templates/Boilerplate/Bit.Boilerplate/.docs/20- .NET Aspire.md
- src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Properties/launchSettings.json
- src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Boilerplate.Server.Web.csproj
- src/Templates/Boilerplate/Bit.Boilerplate/.vscode/tasks.json
- src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs
- src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.cs
- src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates06RunProjectPage.razor
- src/Templates/Boilerplate/Bit.Boilerplate/.vscode/extensions.json
- src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/Boilerplate.Client.Web.csproj
- src/Templates/Boilerplate/Bit.Boilerplate/.devcontainer/devcontainer.json
- src/Templates/Boilerplate/Bit.Boilerplate/AGENTS.md
- src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs
- src/Templates/Boilerplate/Bit.Boilerplate/.vscode/settings.json
- src/Templates/Boilerplate/Bit.Boilerplate/aspire.config.json
- src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor
- src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Build.props
closes #12820
Summary by CodeRabbit
New Features
Bug Fixes
Documentation