dotnet-scaffold-project
Scaffolds a new .NET project with all modern best practices applied. Generates the full solution structure including
Central Package Management, analyzers, .editorconfig, SourceLink, and deterministic builds.
Prerequisites: Run [skill:dotnet-version-detection] first to determine available SDK version — this affects which
features and templates are available.
Scope
- Full solution structure generation (src/, tests/, .sln)
- Central Package Management and Directory.Build.props
- Analyzers, .editorconfig, SourceLink, deterministic builds
Out of scope
- Solution layout rationale and conventions -- see [skill:dotnet-project-structure]
- Analyzer configuration details -- see [skill:dotnet-add-analyzers]
- CI workflow generation -- see [skill:dotnet-add-ci]
Cross-references: [skill:dotnet-project-structure] for layout rationale, [skill:dotnet-add-analyzers] for analyzer
configuration, [skill:dotnet-add-ci] for adding CI after scaffolding.
Step 1: Create Solution Structure
Create the directory layout and solution file.
# Create the directory structure
mkdir -p MyApp/src MyApp/tests
# Create solution file
cd MyApp
dotnet new sln -n MyApp
# For .NET 9+ SDK, convert to .slnx
dotnet sln MyApp.sln migrate
```text
### Choose Project Template
Select the appropriate template based on the application type:
| Template | Command | SDK |
|----------|---------|-----|
| Web API (minimal) | `dotnet new webapi -n MyApp.Api -o src/MyApp.Api` | `Microsoft.NET.Sdk.Web` |
| Web API (controllers) | `dotnet new webapi -n MyApp.Api -o src/MyApp.Api --use-controllers` | `Microsoft.NET.Sdk.Web` |
| Console app | `dotnet new console -n MyApp.Cli -o src/MyApp.Cli` | `Microsoft.NET.Sdk` |
| Worker service | `dotnet new worker -n MyApp.Worker -o src/MyApp.Worker` | `Microsoft.NET.Sdk.Worker` |
| Class library | `dotnet new classlib -n MyApp.Core -o src/MyApp.Core` | `Microsoft.NET.Sdk` |
| Blazor web app | `dotnet new blazor -n MyApp.Web -o src/MyApp.Web` | `Microsoft.NET.Sdk.Web` |
| MAUI app | `dotnet new maui -n MyApp.Mobile -o src/MyApp.Mobile` | `Microsoft.Maui.Sdk` |
| xUnit test | `dotnet new xunit -n MyApp.Tests -o tests/MyApp.Tests` | `Microsoft.NET.Sdk` |
```bash
# Example: Web API with class library and tests
dotnet new classlib -n MyApp.Core -o src/MyApp.Core
dotnet new webapi -n MyApp.Api -o src/MyApp.Api
dotnet new xunit -n MyApp.UnitTests -o tests/MyApp.UnitTests
# Add projects to solution
dotnet sln add src/MyApp.Core/MyApp.Core.csproj
dotnet sln add src/MyApp.Api/MyApp.Api.csproj
dotnet sln add tests/MyApp.UnitTests/MyApp.UnitTests.csproj
# Add project references
dotnet add src/MyApp.Api/MyApp.Api.csproj reference src/MyApp.Core/MyApp.Core.csproj
dotnet add tests/MyApp.UnitTests/MyApp.UnitTests.csproj reference src/MyApp.Core/MyApp.Core.csproj
```csharp
---
## Step 2: Add global.json
Pin the SDK version for reproducible builds.
```json
{
"sdk": {
"version": "10.0.100",
"rollForward": "latestPatch"
}
}
```text
Adjust the version to match the output of `dotnet --version`.
---
## Step 3: Add Directory.Build.props
Create at the repo root to share build settings across all projects.
```xml
<Project>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<LangVersion>14</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<AnalysisLevel>latest-all</AnalysisLevel>
</PropertyGroup>
<!-- Deterministic builds and SourceLink (for libraries) -->
<PropertyGroup>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<DebugType>embedded</DebugType>
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
</PropertyGroup>
<!-- NuGet audit -->
<PropertyGroup>
<NuGetAudit>true</NuGetAudit>
<NuGetAuditLevel>low</NuGetAuditLevel>
<NuGetAuditMode>all</NuGetAuditMode>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
</Project>
```text
After creating this, **remove** `<TargetFramework>`, `<Nullable>`, and `<ImplicitUsings>` from individual `.csproj` files to avoid duplication.
### Optional: Separate Test Props
```xml
<!-- tests/Directory.Build.props -->
<Project>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
<PropertyGroup>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<!-- Use Microsoft.Testing.Platform v2 runner (requires Microsoft.NET.Test.Sdk 17.13+/18.x) -->
<UseMicrosoftTestingPlatformRunner>true</UseMicrosoftTestingPlatformRunner>
<!-- Tests don't need TreatWarningsAsErrors -->
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
</Project>
```text
---
## Step 4: Add Directory.Build.targets
Apply shared package references (SourceLink, analyzers) to all projects. Items go in `.targets` so they are imported after project evaluation.
```xml
<Project>
<ItemGroup>
<!-- SourceLink for debugger source navigation -->
<PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="all" />
</ItemGroup>
</Project>
```text
The built-in Roslyn analyzers are already enabled by the `AnalysisLevel` and `EnforceCodeStyleInBuild` properties in Directory.Build.props (Step 3). For additional third-party analyzers, see [skill:dotnet-add-analyzers].
---
## Step 5: Set Up Central Package Management
Create `Directory.Packages.props` at the repo root.
```xml
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<ItemGroup>
<!-- Framework packages -->
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="9.0.0" />
</ItemGroup>
<ItemGroup>
<!-- Test packages -->
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="xunit.v3" Version="3.2.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
<PackageVersion Include="coverlet.collector" Version="8.0.0" />
</ItemGroup>
</Project>
```text
After creating this, **remove** `Version` attributes from all `<PackageReference>` elements in `.csproj` files.
---
## Step 6: Add .editorconfig
Create at the repo root. See [skill:dotnet-project-structure] for the full recommended config.
Minimal starter:
```ini
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{csproj,props,targets,xml,json,yml,yaml}]
indent_size = 2
[*.cs]
csharp_style_namespace_declarations = file_scoped:warning
csharp_prefer_braces = true:warning
dotnet_style_require_accessibility_modifiers = always:warning
dotnet_sort_system_directives_first = true
csharp_using_directive_placement = outside_namespace:warning
```csharp
---
## Step 7: Add nuget.config
Configure package sources with supply-chain security:
```xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
</configuration>
```text
---
## Step 8: Add .gitignore
```bash
dotnet new gitignore
```bash
This generates the standard .NET `.gitignore` covering `bin/`, `obj/`, `*.user`, etc.
---
## Step 9: Clean Up Generated Projects
After scaffolding, apply the shared configuration:
1. **Remove duplicated properties** from individual `.csproj` files (TargetFramework, Nullable, ImplicitUsings — these are in Directory.Build.props)
2. **Remove Version attributes** from PackageReference elements (managed by CPM)
3. **Delete template-generated Class1.cs** from class libraries
4. **Set file-scoped namespaces** in all generated `.cs` files
### Cleaned csproj Example
Before (template-generated):
```xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
```text
After (with shared props and CPM):
```xml
<Project Sdk="Microsoft.NET.Sdk">
</Project>
```xml
For web projects that need `Microsoft.NET.Sdk.Web`, the csproj still specifies the SDK but inherits everything else.
---
## Step 10: Verify
Run these commands to verify the scaffolded project:
```bash
# Restore and verify lock files generated
dotnet restore
find . -name "packages.lock.json" -type f
# Build with all analyzers
dotnet build --no-restore
# Run tests
dotnet test --no-build
# Verify CPM is active (no Version attributes in project PackageReferences)
# Should only find versions in Directory.Packages.props, not in csproj files
find . -name "*.csproj" -exec grep -l 'Version=' {} \; # expect no output
```csharp
---
## Final Structure
```text
MyApp/
├── .editorconfig
├── .gitignore
├── global.json
├── nuget.config
├── MyApp.slnx
├── Directory.Build.props
├── Directory.Build.targets
├── Directory.Packages.props
├── src/
│ ├── MyApp.Core/
│ │ └── MyApp.Core.csproj
│ └── MyApp.Api/
│ ├── MyApp.Api.csproj
│ ├── Program.cs
│ └── appsettings.json
└── tests/
└── MyApp.UnitTests/
├── MyApp.UnitTests.csproj
└── SampleTest.cs
```csharp
---
## References
- [.NET Library Design Guidance](https://learn.microsoft.com/en-us/dotnet/standard/library-guidance/)
- [Central Package Management](https://learn.microsoft.com/en-us/nuget/consume-packages/central-package-management)
- [SourceLink](https://learn.microsoft.com/en-us/dotnet/standard/library-guidance/sourcelink)
- [NuGet Audit](https://learn.microsoft.com/en-us/nuget/concepts/auditing-packages)
- [dotnet new Templates](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new)
Code Navigation (Serena MCP)
Primary approach: Use Serena symbol operations for efficient code navigation:
- Find definitions:
serena_find_symbol instead of text search
- Understand structure:
serena_get_symbols_overview for file organization
- Track references:
serena_find_referencing_symbols for impact analysis
- Precise edits:
serena_replace_symbol_body for clean modifications
When to use Serena vs traditional tools:
- Use Serena: Navigation, refactoring, dependency analysis, precise edits
- Use Read/Grep: Reading full files, pattern matching, simple text operations
- Fallback: If Serena unavailable, traditional tools work fine
Example workflow:
# Instead of:
Read: src/Services/OrderService.cs
Grep: "public void ProcessOrder"
# Use:
serena_find_symbol: "OrderService/ProcessOrder"
serena_get_symbols_overview: "src/Services/OrderService.cs"
1---2name: dotnet-scaffold-project3description: Creates a new .NET project. Generates solution with CPM, analyzers, editorconfig, SourceLink.4license: MIT5targets: ['*']6category: developer-experience7subcategory: project8tags:9 - tooling10 - dotnet11 - skill12 - project13 - scaffolding14version: '1.0.0'15author: 'dotnet-agent-harness'16invocable: true17related_skills:18 - dotnet-project-structure19 - dotnet-project-analysis20 - dotnet-version-detection21claudecode:22 allowed-tools: ['Read', 'Grep', 'Glob', 'Bash', 'Write', 'Edit']23codexcli:24 short-description: '.NET skill guidance for project tasks'25opencode:26 allowed-tools: ['Read', 'Grep', 'Glob', 'Bash', 'Write', 'Edit']27copilot: {}28geminicli: {}29antigravity: {}30---3132# dotnet-scaffold-project3334Scaffolds a new .NET project with all modern best practices applied. Generates the full solution structure including35Central Package Management, analyzers, .editorconfig, SourceLink, and deterministic builds.3637**Prerequisites:** Run [skill:dotnet-version-detection] first to determine available SDK version — this affects which38features and templates are available.3940## Scope4142- Full solution structure generation (src/, tests/, .sln)43- Central Package Management and Directory.Build.props44- Analyzers, .editorconfig, SourceLink, deterministic builds4546## Out of scope4748- Solution layout rationale and conventions -- see [skill:dotnet-project-structure]49- Analyzer configuration details -- see [skill:dotnet-add-analyzers]50- CI workflow generation -- see [skill:dotnet-add-ci]5152Cross-references: [skill:dotnet-project-structure] for layout rationale, [skill:dotnet-add-analyzers] for analyzer53configuration, [skill:dotnet-add-ci] for adding CI after scaffolding.5455---5657## Step 1: Create Solution Structure5859Create the directory layout and solution file.6061````bash6263# Create the directory structure64mkdir -p MyApp/src MyApp/tests6566# Create solution file67cd MyApp68dotnet new sln -n MyApp6970# For .NET 9+ SDK, convert to .slnx71dotnet sln MyApp.sln migrate7273```text7475### Choose Project Template7677Select the appropriate template based on the application type:7879| Template | Command | SDK |80|----------|---------|-----|81| Web API (minimal) | `dotnet new webapi -n MyApp.Api -o src/MyApp.Api` | `Microsoft.NET.Sdk.Web` |82| Web API (controllers) | `dotnet new webapi -n MyApp.Api -o src/MyApp.Api --use-controllers` | `Microsoft.NET.Sdk.Web` |83| Console app | `dotnet new console -n MyApp.Cli -o src/MyApp.Cli` | `Microsoft.NET.Sdk` |84| Worker service | `dotnet new worker -n MyApp.Worker -o src/MyApp.Worker` | `Microsoft.NET.Sdk.Worker` |85| Class library | `dotnet new classlib -n MyApp.Core -o src/MyApp.Core` | `Microsoft.NET.Sdk` |86| Blazor web app | `dotnet new blazor -n MyApp.Web -o src/MyApp.Web` | `Microsoft.NET.Sdk.Web` |87| MAUI app | `dotnet new maui -n MyApp.Mobile -o src/MyApp.Mobile` | `Microsoft.Maui.Sdk` |88| xUnit test | `dotnet new xunit -n MyApp.Tests -o tests/MyApp.Tests` | `Microsoft.NET.Sdk` |8990```bash9192# Example: Web API with class library and tests93dotnet new classlib -n MyApp.Core -o src/MyApp.Core94dotnet new webapi -n MyApp.Api -o src/MyApp.Api95dotnet new xunit -n MyApp.UnitTests -o tests/MyApp.UnitTests9697# Add projects to solution98dotnet sln add src/MyApp.Core/MyApp.Core.csproj99dotnet sln add src/MyApp.Api/MyApp.Api.csproj100dotnet sln add tests/MyApp.UnitTests/MyApp.UnitTests.csproj101102# Add project references103dotnet add src/MyApp.Api/MyApp.Api.csproj reference src/MyApp.Core/MyApp.Core.csproj104dotnet add tests/MyApp.UnitTests/MyApp.UnitTests.csproj reference src/MyApp.Core/MyApp.Core.csproj105106```csharp107108---109110## Step 2: Add global.json111112Pin the SDK version for reproducible builds.113114```json115116{117 "sdk": {118 "version": "10.0.100",119 "rollForward": "latestPatch"120 }121}122123```text124125Adjust the version to match the output of `dotnet --version`.126127---128129## Step 3: Add Directory.Build.props130131Create at the repo root to share build settings across all projects.132133```xml134135<Project>136 <PropertyGroup>137 <TargetFramework>net10.0</TargetFramework>138 <LangVersion>14</LangVersion>139 <Nullable>enable</Nullable>140 <ImplicitUsings>enable</ImplicitUsings>141 <TreatWarningsAsErrors>true</TreatWarningsAsErrors>142 <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>143 <AnalysisLevel>latest-all</AnalysisLevel>144 </PropertyGroup>145146 <!-- Deterministic builds and SourceLink (for libraries) -->147 <PropertyGroup>148 <PublishRepositoryUrl>true</PublishRepositoryUrl>149 <EmbedUntrackedSources>true</EmbedUntrackedSources>150 <DebugType>embedded</DebugType>151 <ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>152 </PropertyGroup>153154 <!-- NuGet audit -->155 <PropertyGroup>156 <NuGetAudit>true</NuGetAudit>157 <NuGetAuditLevel>low</NuGetAuditLevel>158 <NuGetAuditMode>all</NuGetAuditMode>159 <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>160 </PropertyGroup>161</Project>162163```text164165After creating this, **remove** `<TargetFramework>`, `<Nullable>`, and `<ImplicitUsings>` from individual `.csproj` files to avoid duplication.166167### Optional: Separate Test Props168169```xml170171<!-- tests/Directory.Build.props -->172<Project>173 <Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />174 <PropertyGroup>175 <IsPackable>false</IsPackable>176 <IsTestProject>true</IsTestProject>177 <!-- Use Microsoft.Testing.Platform v2 runner (requires Microsoft.NET.Test.Sdk 17.13+/18.x) -->178 <UseMicrosoftTestingPlatformRunner>true</UseMicrosoftTestingPlatformRunner>179 <!-- Tests don't need TreatWarningsAsErrors -->180 <TreatWarningsAsErrors>false</TreatWarningsAsErrors>181 </PropertyGroup>182</Project>183184```text185186---187188## Step 4: Add Directory.Build.targets189190Apply shared package references (SourceLink, analyzers) to all projects. Items go in `.targets` so they are imported after project evaluation.191192```xml193194<Project>195 <ItemGroup>196 <!-- SourceLink for debugger source navigation -->197 <PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="all" />198 </ItemGroup>199</Project>200201```text202203The built-in Roslyn analyzers are already enabled by the `AnalysisLevel` and `EnforceCodeStyleInBuild` properties in Directory.Build.props (Step 3). For additional third-party analyzers, see [skill:dotnet-add-analyzers].204205---206207## Step 5: Set Up Central Package Management208209Create `Directory.Packages.props` at the repo root.210211```xml212213<Project>214 <PropertyGroup>215 <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>216 <CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>217 </PropertyGroup>218 <ItemGroup>219 <!-- Framework packages -->220 <PackageVersion Include="Microsoft.SourceLink.GitHub" Version="9.0.0" />221 </ItemGroup>222 <ItemGroup>223 <!-- Test packages -->224 <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />225 <PackageVersion Include="xunit.v3" Version="3.2.2" />226 <PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />227 <PackageVersion Include="coverlet.collector" Version="8.0.0" />228 </ItemGroup>229</Project>230231```text232233After creating this, **remove** `Version` attributes from all `<PackageReference>` elements in `.csproj` files.234235---236237## Step 6: Add .editorconfig238239Create at the repo root. See [skill:dotnet-project-structure] for the full recommended config.240241Minimal starter:242243```ini244245root = true246247[*]248indent_style = space249indent_size = 4250end_of_line = lf251charset = utf-8252trim_trailing_whitespace = true253insert_final_newline = true254255[*.{csproj,props,targets,xml,json,yml,yaml}]256indent_size = 2257258[*.cs]259csharp_style_namespace_declarations = file_scoped:warning260csharp_prefer_braces = true:warning261dotnet_style_require_accessibility_modifiers = always:warning262dotnet_sort_system_directives_first = true263csharp_using_directive_placement = outside_namespace:warning264265```csharp266267---268269## Step 7: Add nuget.config270271Configure package sources with supply-chain security:272273```xml274275<?xml version="1.0" encoding="utf-8"?>276<configuration>277 <packageSources>278 <clear />279 <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />280 </packageSources>281 <packageSourceMapping>282 <packageSource key="nuget.org">283 <package pattern="*" />284 </packageSource>285 </packageSourceMapping>286</configuration>287288```text289290---291292## Step 8: Add .gitignore293294```bash295296dotnet new gitignore297298```bash299300This generates the standard .NET `.gitignore` covering `bin/`, `obj/`, `*.user`, etc.301302---303304## Step 9: Clean Up Generated Projects305306After scaffolding, apply the shared configuration:3073081. **Remove duplicated properties** from individual `.csproj` files (TargetFramework, Nullable, ImplicitUsings — these are in Directory.Build.props)3092. **Remove Version attributes** from PackageReference elements (managed by CPM)3103. **Delete template-generated Class1.cs** from class libraries3114. **Set file-scoped namespaces** in all generated `.cs` files312313### Cleaned csproj Example314315Before (template-generated):316317```xml318319<Project Sdk="Microsoft.NET.Sdk">320 <PropertyGroup>321 <TargetFramework>net10.0</TargetFramework>322 <Nullable>enable</Nullable>323 <ImplicitUsings>enable</ImplicitUsings>324 </PropertyGroup>325</Project>326327```text328329After (with shared props and CPM):330331```xml332333<Project Sdk="Microsoft.NET.Sdk">334</Project>335336```xml337338For web projects that need `Microsoft.NET.Sdk.Web`, the csproj still specifies the SDK but inherits everything else.339340---341342## Step 10: Verify343344Run these commands to verify the scaffolded project:345346```bash347348# Restore and verify lock files generated349dotnet restore350find . -name "packages.lock.json" -type f351352# Build with all analyzers353dotnet build --no-restore354355# Run tests356dotnet test --no-build357358# Verify CPM is active (no Version attributes in project PackageReferences)359# Should only find versions in Directory.Packages.props, not in csproj files360find . -name "*.csproj" -exec grep -l 'Version=' {} \; # expect no output361362```csharp363364---365366## Final Structure367368```text369370MyApp/371├── .editorconfig372├── .gitignore373├── global.json374├── nuget.config375├── MyApp.slnx376├── Directory.Build.props377├── Directory.Build.targets378├── Directory.Packages.props379├── src/380│ ├── MyApp.Core/381│ │ └── MyApp.Core.csproj382│ └── MyApp.Api/383│ ├── MyApp.Api.csproj384│ ├── Program.cs385│ └── appsettings.json386└── tests/387 └── MyApp.UnitTests/388 ├── MyApp.UnitTests.csproj389 └── SampleTest.cs390391```csharp392393---394395## References396397- [.NET Library Design Guidance](https://learn.microsoft.com/en-us/dotnet/standard/library-guidance/)398- [Central Package Management](https://learn.microsoft.com/en-us/nuget/consume-packages/central-package-management)399- [SourceLink](https://learn.microsoft.com/en-us/dotnet/standard/library-guidance/sourcelink)400- [NuGet Audit](https://learn.microsoft.com/en-us/nuget/concepts/auditing-packages)401- [dotnet new Templates](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new)402````403404## Code Navigation (Serena MCP)405406**Primary approach:** Use Serena symbol operations for efficient code navigation:4074081. **Find definitions**: `serena_find_symbol` instead of text search4092. **Understand structure**: `serena_get_symbols_overview` for file organization4103. **Track references**: `serena_find_referencing_symbols` for impact analysis4114. **Precise edits**: `serena_replace_symbol_body` for clean modifications412413**When to use Serena vs traditional tools:**414415- **Use Serena**: Navigation, refactoring, dependency analysis, precise edits416- **Use Read/Grep**: Reading full files, pattern matching, simple text operations417- **Fallback**: If Serena unavailable, traditional tools work fine418419**Example workflow:**420421```text422# Instead of:423Read: src/Services/OrderService.cs424Grep: "public void ProcessOrder"425426# Use:427serena_find_symbol: "OrderService/ProcessOrder"428serena_get_symbols_overview: "src/Services/OrderService.cs"429```