diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index a4bb6b0..b98ff20 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -19,7 +19,7 @@ Requirements for initial release. Each maps to roadmap phases. - [x] **FOUND-08**: Structured logging for diagnostics (Serilog or equivalent) - [x] **FOUND-09**: Localization system supporting English and French with dynamic language switching - [x] **FOUND-10**: JSON-based local storage for profiles, settings, and templates (compatible with current app's format for migration) -- [ ] **FOUND-11**: Self-contained single EXE distribution — no .NET runtime dependency for end users +- [x] **FOUND-11**: Self-contained single EXE distribution — no .NET runtime dependency for end users - [x] **FOUND-12**: Configurable data output folder for exports ### Permissions @@ -125,7 +125,7 @@ Which phases cover which requirements. Updated during roadmap creation. | FOUND-08 | Phase 1 | Complete | | FOUND-09 | Phase 1 | Complete | | FOUND-10 | Phase 1 | Complete | -| FOUND-11 | Phase 5 | Pending | +| FOUND-11 | Phase 5 | Complete | | FOUND-12 | Phase 1 | Complete | | PERM-01 | Phase 2 | Complete | | PERM-02 | Phase 2 | Complete | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 7c60f0b..cc8223c 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -144,4 +144,4 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 | 2. Permissions | 7/7 | Complete | 2026-04-02 | | 3. Storage and File Operations | 8/8 | Complete | 2026-04-02 | | 4. Bulk Operations and Provisioning | 10/10 | Complete | 2026-04-03 | -| 5. Distribution and Hardening | 0/3 | Not started | - | +| 5. Distribution and Hardening | 2/3 | In Progress| | diff --git a/.planning/STATE.md b/.planning/STATE.md index 585c232..6f4fe6f 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,14 +3,14 @@ gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone status: verifying -stopped_at: "Completed 04-bulk-operations-and-provisioning-04-10-PLAN.md (checkpoint:human-verify pending)" -last_updated: "2026-04-03T11:52:22.847Z" +stopped_at: Completed 05-distribution-and-hardening-05-01-PLAN.md +last_updated: "2026-04-03T14:37:22.588Z" last_activity: 2026-04-03 — Plan 04-10 complete — all 5 Phase 4 tabs wired in MainWindow progress: total_phases: 5 completed_phases: 4 - total_plans: 33 - completed_plans: 33 + total_plans: 36 + completed_plans: 35 percent: 100 --- @@ -92,6 +92,8 @@ Progress: [██████████] 100% | Phase 04-bulk-operations-and-provisioning P07 | 15 | 2 tasks | 11 files | | Phase 04-bulk-operations-and-provisioning P08 | 20min | 2 tasks | 6 files | | Phase 04-bulk-operations-and-provisioning P10 | 25min | 2 tasks | 7 files | +| Phase 05-distribution-and-hardening P02 | 3min | 2 tasks | 2 files | +| Phase 05-distribution-and-hardening P01 | 2min | 2 tasks | 5 files | ## Accumulated Context @@ -180,6 +182,10 @@ Recent decisions affecting current work: - [Phase 04-bulk-operations-and-provisioning 04-09]: Duplicate standalone converter files (EnumBoolConverter.cs etc.) removed — already defined in IndentConverter.cs which is the established project pattern for all converters - [Phase 04-bulk-operations-and-provisioning]: TemplatesView uses RenameInputDialog (custom WPF Window) instead of Microsoft.VisualBasic.Interaction.InputBox — avoids additional framework dependency - [Phase 04-bulk-operations-and-provisioning]: All value converters (EnumBoolConverter, StringToVisibilityConverter, ListToStringConverter) added to IndentConverter.cs — consistent co-location pattern +- [Phase 05-distribution-and-hardening]: PublishSingleFile PropertyGroup is conditional on '' == 'true' — regular dotnet build and dotnet test are unaffected +- [Phase 05-distribution-and-hardening]: IncludeNativeLibrariesForSelfExtract=true required — PnP.Framework has native binaries that must bundle into the EXE +- [Phase 05-distribution-and-hardening]: IsThrottleException only checks top-level Message (not InnerException) — documented via nested-throttle test asserting false +- [Phase 05-distribution-and-hardening]: FR diacritics already present in Strings.fr.resx — FrStrings_ContainExpectedDiacritics test passes immediately (no diacritic repair needed for those 5 keys) ### Pending Todos @@ -192,6 +198,6 @@ None yet. ## Session Continuity -Last session: 2026-04-03T08:26:10.563Z -Stopped at: Completed 04-bulk-operations-and-provisioning-04-10-PLAN.md (checkpoint:human-verify pending) +Last session: 2026-04-03T14:37:22.584Z +Stopped at: Completed 05-distribution-and-hardening-05-01-PLAN.md Resume file: None diff --git a/.planning/phases/05-distribution-and-hardening/05-02-SUMMARY.md b/.planning/phases/05-distribution-and-hardening/05-02-SUMMARY.md new file mode 100644 index 0000000..3c5a69b --- /dev/null +++ b/.planning/phases/05-distribution-and-hardening/05-02-SUMMARY.md @@ -0,0 +1,102 @@ +--- +phase: 05-distribution-and-hardening +plan: 02 +subsystem: ui +tags: [resx, localization, french, publish, single-file, win-x64] + +# Dependency graph +requires: + - phase: 04-bulk-operations-and-provisioning + provides: Phase 4 UI strings (Transfer, BulkMembers, BulkSites, FolderStruct, Templates) all added to Strings.fr.resx without accents +provides: + - Corrected French locale with proper diacritics for all 27 Phase 4 string keys + - Single-file self-contained publish configuration (win-x64, ~200 MB EXE, zero loose DLLs) +affects: [05-distribution-and-hardening, deployment, QA] + +# Tech tracking +tech-stack: + added: [] + patterns: + - "Conditional PropertyGroup for publish-only MSBuild properties — avoids polluting regular build/test with RuntimeIdentifier" + +key-files: + created: [] + modified: + - SharepointToolbox/Localization/Strings.fr.resx + - SharepointToolbox/SharepointToolbox.csproj + +key-decisions: + - "PublishSingleFile PropertyGroup is conditional on '$(PublishSingleFile)' == 'true' — regular dotnet build and dotnet test are unaffected" + - "IncludeNativeLibrariesForSelfExtract=true required — PnP.Framework has native binaries that must bundle into the EXE" + - "PublishTrimmed remains false — PnP.Framework and MSAL use reflection; trimming breaks at runtime" + +patterns-established: + - "Conditional PropertyGroup pattern for publish-only properties — activate via CLI flag, not default build" + +requirements-completed: [FOUND-11] + +# Metrics +duration: 3min +completed: 2026-04-03 +--- + +# Phase 5 Plan 02: French Locale Fix and Single-File Publish Summary + +**27 French diacritic corrections across all Phase 4 UI string keys, plus conditional win-x64 single-file publish producing one ~200 MB EXE with zero loose DLLs** + +## Performance + +- **Duration:** ~3 min +- **Started:** 2026-04-03T11:53:46Z +- **Completed:** 2026-04-03T11:56:06Z +- **Tasks:** 2 +- **Files modified:** 2 + +## Accomplishments + +- Fixed all 27 French strings missing diacritics (accents, cedillas) across Transfer, BulkMembers, BulkSites, FolderStruct, Templates, and shared bulk-operation keys +- Added conditional `` to csproj enabling `dotnet publish -p:PublishSingleFile=true` to produce a single self-contained EXE for win-x64 +- Full test suite remains green: 134 pass, 22 skip (interactive MSAL tests — expected) + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: Fix French diacritic-missing strings** - `f7829f0` (fix) +2. **Task 2: Add self-contained single-file publish configuration** - `39517d8` (feat) + +## Files Created/Modified + +- `SharepointToolbox/Localization/Strings.fr.resx` — 27 string values corrected with proper French diacritics +- `SharepointToolbox/SharepointToolbox.csproj` — Added conditional PropertyGroup for PublishSingleFile + SelfContained + IncludeNativeLibrariesForSelfExtract + +## Decisions Made + +- `PublishSingleFile` PropertyGroup uses condition `'$(PublishSingleFile)' == 'true'` so normal builds and test runs are unaffected — no RuntimeIdentifier lock-in during development +- `IncludeNativeLibrariesForSelfExtract=true` is necessary because PnP.Framework includes native binaries that must be bundled +- `PublishTrimmed` stays false (pre-established project decision — PnP.Framework and MSAL rely on reflection) + +## Deviations from Plan + +None - plan executed exactly as written. + +Also corrected `bulk.confirm.title` ("Confirmer l'operation" -> "Confirmer l'opération") and `templates.empty` ("Aucun modele enregistre." -> "Aucun modèle enregistré.") and `templates.opt.settings` ("Parametres du site" -> "Paramètres du site") which were not in the plan's numbered list but were clearly broken diacritics in the same file. These fell under Rule 1 (auto-fix bugs) as they were defects in the same file being edited. + +## Issues Encountered + +None. + +## User Setup Required + +None - no external service configuration required. + +## Next Phase Readiness + +- French locale is now complete with proper diacritics across all 4 phases of UI strings +- Single-file publish is ready: `dotnet publish SharepointToolbox/SharepointToolbox.csproj -c Release -p:PublishSingleFile=true -o ./publish` +- Two Phase 5 success criteria (French locale + single EXE) now satisfied +- Remaining Phase 5 work: Plan 01 (tests), Plan 03 (installer/README), Plan 04 (final QA) + +--- +*Phase: 05-distribution-and-hardening* +*Completed: 2026-04-03*