---
phase: 01-foundation
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- SharepointToolbox/SharepointToolbox.csproj
- SharepointToolbox/App.xaml
- SharepointToolbox/App.xaml.cs
- SharepointToolbox.Tests/SharepointToolbox.Tests.csproj
- SharepointToolbox.Tests/Services/ProfileServiceTests.cs
- SharepointToolbox.Tests/Services/SettingsServiceTests.cs
- SharepointToolbox.Tests/Auth/MsalClientFactoryTests.cs
- SharepointToolbox.Tests/Auth/SessionManagerTests.cs
- SharepointToolbox.Tests/ViewModels/FeatureViewModelBaseTests.cs
- SharepointToolbox.Tests/Localization/TranslationSourceTests.cs
- SharepointToolbox.Tests/Integration/LoggingIntegrationTests.cs
- SharepointToolbox.sln
autonomous: true
requirements:
- FOUND-01
must_haves:
truths:
- "dotnet build produces zero errors"
- "dotnet test produces zero test failures (all tests pending/skipped)"
- "Solution contains two projects: SharepointToolbox (WPF) and SharepointToolbox.Tests (xUnit)"
- "App.xaml has no StartupUri — Generic Host entry point is wired"
artifacts:
- path: "SharepointToolbox/SharepointToolbox.csproj"
provides: "WPF .NET 10 project with all NuGet packages"
contains: "PublishTrimmed>false"
- path: "SharepointToolbox/App.xaml.cs"
provides: "Generic Host entry point with [STAThread]"
contains: "Host.CreateDefaultBuilder"
- path: "SharepointToolbox.Tests/SharepointToolbox.Tests.csproj"
provides: "xUnit test project"
contains: "xunit"
- path: "SharepointToolbox.sln"
provides: "Solution file with both projects"
key_links:
- from: "SharepointToolbox/App.xaml.cs"
to: "SharepointToolbox/App.xaml"
via: "x:Class reference + StartupUri removed"
pattern: "StartupUri"
- from: "SharepointToolbox/SharepointToolbox.csproj"
to: "App.xaml"
via: "Page include replacing ApplicationDefinition"
pattern: "ApplicationDefinition"
---
Create the solution scaffold: WPF .NET 10 project with all NuGet packages wired, Generic Host entry point, and xUnit test project with stub test files that compile but have no passing tests yet.
Purpose: Every subsequent plan builds on a compiling, test-wired foundation. Getting the Generic Host + WPF STA threading right here prevents the most common startup crash.
Output: SharepointToolbox.sln with two projects, zero build errors, zero test failures on first run.
@C:/Users/SebastienQUEROL/.claude/get-shit-done/workflows/execute-plan.md
@C:/Users/SebastienQUEROL/.claude/get-shit-done/templates/summary.md
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/phases/01-foundation/01-CONTEXT.md
@.planning/phases/01-foundation/01-RESEARCH.md
Task 1: Create solution and WPF project with all NuGet packages
SharepointToolbox.sln,
SharepointToolbox/SharepointToolbox.csproj,
SharepointToolbox/App.xaml,
SharepointToolbox/App.xaml.cs,
SharepointToolbox/MainWindow.xaml,
SharepointToolbox/MainWindow.xaml.cs
Run from the repo root:
```
dotnet new sln -n SharepointToolbox
dotnet new wpf -n SharepointToolbox -f net10.0-windows
dotnet sln add SharepointToolbox/SharepointToolbox.csproj
```
Edit SharepointToolbox/SharepointToolbox.csproj:
- Set `net10.0-windows`
- Add `enable`, `enable`
- Add `false` (critical — PnP.Framework + MSAL use reflection)
- Add `SharepointToolbox.App`
- Add NuGet packages:
- `CommunityToolkit.Mvvm` version 8.4.2
- `Microsoft.Extensions.Hosting` version 10.x (latest 10.x)
- `Microsoft.Identity.Client` version 4.83.1
- `Microsoft.Identity.Client.Extensions.Msal` version 4.83.3
- `Microsoft.Identity.Client.Broker` version 4.82.1
- `PnP.Framework` version 1.18.0
- `Serilog` version 4.3.1
- `Serilog.Sinks.File` (latest)
- `Serilog.Extensions.Hosting` (latest)
- Change `` and `` to demote App.xaml from ApplicationDefinition
Edit App.xaml: Remove `StartupUri="MainWindow.xaml"`. Keep `x:Class="SharepointToolbox.App"`.
Edit App.xaml.cs: Replace default App class with Generic Host entry point pattern:
```csharp
public partial class App : Application
{
[STAThread]
public static void Main(string[] args)
{
using IHost host = Host.CreateDefaultBuilder(args)
.UseSerilog((ctx, cfg) => cfg
.WriteTo.File(
Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"SharepointToolbox", "logs", "app-.log"),
rollingInterval: RollingInterval.Day,
retainedFileCountLimit: 30))
.ConfigureServices(RegisterServices)
.Build();
host.Start();
App app = new();
app.InitializeComponent();
app.MainWindow = host.Services.GetRequiredService();
app.MainWindow.Visibility = Visibility.Visible;
app.Run();
}
private static void RegisterServices(HostBuilderContext ctx, IServiceCollection services)
{
// Placeholder — services registered in subsequent plans
services.AddSingleton();
}
}
```
Leave MainWindow.xaml and MainWindow.xaml.cs as the default WPF template output — they will be replaced in plan 01-06.
Run `dotnet build SharepointToolbox/SharepointToolbox.csproj` and fix any errors before moving to Task 2.
cd "C:\Users\dev\Documents\projets\Sharepoint" && dotnet build SharepointToolbox/SharepointToolbox.csproj --no-incremental 2>&1 | tail -5
Build output shows "Build succeeded" with 0 errors. App.xaml has no StartupUri. csproj contains PublishTrimmed=false and StartupObject.
Task 2: Create xUnit test project with stub test files
SharepointToolbox.Tests/SharepointToolbox.Tests.csproj,
SharepointToolbox.Tests/Services/ProfileServiceTests.cs,
SharepointToolbox.Tests/Services/SettingsServiceTests.cs,
SharepointToolbox.Tests/Auth/MsalClientFactoryTests.cs,
SharepointToolbox.Tests/Auth/SessionManagerTests.cs,
SharepointToolbox.Tests/ViewModels/FeatureViewModelBaseTests.cs,
SharepointToolbox.Tests/Localization/TranslationSourceTests.cs,
SharepointToolbox.Tests/Integration/LoggingIntegrationTests.cs
Run from the repo root:
```
dotnet new xunit -n SharepointToolbox.Tests -f net10.0
dotnet sln add SharepointToolbox.Tests/SharepointToolbox.Tests.csproj
dotnet add SharepointToolbox.Tests/SharepointToolbox.Tests.csproj reference SharepointToolbox/SharepointToolbox.csproj
```
Edit SharepointToolbox.Tests/SharepointToolbox.Tests.csproj:
- Add `Moq` (latest) NuGet package
- Add `Microsoft.NET.Test.Sdk` (already included in xunit template)
- Add `enable`, `enable`
Create stub test files — each file compiles but has a single `[Fact(Skip = "Not implemented yet")]` test so the suite passes (no failures, just skips):
**SharepointToolbox.Tests/Services/ProfileServiceTests.cs**
```csharp
namespace SharepointToolbox.Tests.Services;
public class ProfileServiceTests
{
[Fact(Skip = "Wave 0 stub — implemented in plan 01-03")]
public void SaveAndLoad_RoundTrips_Profiles() { }
}
```
Create identical stub pattern for:
- `SettingsServiceTests.cs` — class `SettingsServiceTests`, skip reason "plan 01-03"
- `MsalClientFactoryTests.cs` — class `MsalClientFactoryTests`, skip reason "plan 01-04"
- `SessionManagerTests.cs` — class `SessionManagerTests`, skip reason "plan 01-04"
- `FeatureViewModelBaseTests.cs` — class `FeatureViewModelBaseTests`, skip reason "plan 01-06"
- `TranslationSourceTests.cs` — class `TranslationSourceTests`, skip reason "plan 01-05"
- `LoggingIntegrationTests.cs` — class `LoggingIntegrationTests`, skip reason "plan 01-05"
Run `dotnet test SharepointToolbox.Tests/SharepointToolbox.Tests.csproj --no-build` after building to confirm all tests are skipped (0 failed).
cd "C:\Users\dev\Documents\projets\Sharepoint" && dotnet test SharepointToolbox.Tests/SharepointToolbox.Tests.csproj 2>&1 | tail -10
dotnet test shows 0 failed, 7 skipped (or similar). All stub test files exist in correct subdirectories.
- `dotnet build SharepointToolbox.sln` succeeds with 0 errors
- `dotnet test SharepointToolbox.Tests/SharepointToolbox.Tests.csproj` shows 0 failures
- App.xaml contains no StartupUri attribute
- SharepointToolbox.csproj contains `false`
- SharepointToolbox.csproj contains `SharepointToolbox.App`
- App.xaml.cs Main method is decorated with `[STAThread]`
Solution compiles cleanly. Both projects in the solution. Test runner executes without failures. Generic Host wiring is correct (most critical risk for this plan — wrong STA threading causes runtime crash).