Dev
031a7dbc0f
docs(phase-02): research permissions phase domain
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 13:25:38 +02:00
Dev
27d654d86a
docs(phase-01): complete phase execution — 11/11 verified, advancing to phase 02
2026-04-02 13:02:50 +02:00
Dev
62a7deb6e9
docs(01-08): complete plan — human visual checkpoint approved, Phase 1 Foundation done
...
- Task 2 (human-verify checkpoint) approved: all 7 visual checks passed
- Updated SUMMARY to document 3 runtime fix commits (DI registration, FR translations)
- STATE.md: plan complete, session updated
- ROADMAP.md: Phase 1 confirmed Complete 8/8
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 12:55:22 +02:00
Dev
0b8a86a58a
fix(01-08): add real French translations (stubs were identical to English)
2026-04-02 12:52:16 +02:00
Dev
6211f65a5e
fix(01-08): provide file paths to ProfileRepository and SettingsRepository via factory registration
2026-04-02 12:47:11 +02:00
Dev
c66efdadfa
fix(01-08): register ProfileRepository and SettingsRepository in DI container
2026-04-02 12:45:59 +02:00
Dev
991c92e83a
docs(01-08): complete phase 1 final verification plan — awaiting human checkpoint
...
- 44/44 non-interactive tests pass, 1 MSAL interactive skip (expected)
- Build: 0 errors, 0 warnings with -warnaserror
- ROADMAP.md: Phase 1 marked Complete (8/8 summaries)
- STATE.md: progress 100%, decisions recorded, checkpoint pause noted
- SUMMARY.md created for 01-08
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 12:43:28 +02:00
Dev
334a5f10ad
chore(01-08): run full test suite — 44 passed, 1 skipped, 0 failed
...
- dotnet build with -warnaserror: 0 warnings, 0 errors
- 44 unit/integration tests pass
- 1 interactive MSAL test skipped (expected)
- Build clean on SharepointToolbox.slnx
2026-04-02 12:41:55 +02:00
Dev
405a013375
docs(01-07): complete ProfileManagementDialog + SettingsView plan
...
- Create 01-07-SUMMARY.md with full documentation
- Update STATE.md: progress 88%, decisions added, session recorded
- Update ROADMAP.md: Phase 1 at 7/8 plans
2026-04-02 12:40:36 +02:00
Dev
0665152e0d
feat(01-07): add SettingsView and wire into MainWindow Settings tab
...
- Create Views/Tabs/SettingsView.xaml (UserControl with language ComboBox en/fr, DataFolder TextBox and Browse button using TranslationSource)
- Create Views/Tabs/SettingsView.xaml.cs (DI constructor injection of SettingsViewModel, LoadAsync on Loaded)
- Update MainWindow.xaml to add xmlns:views namespace and clear placeholder TextBlock from SettingsTabItem
- Register SettingsView as Transient in DI; resolve and set as SettingsTabItem.Content from MainWindow constructor
- All 42 unit tests pass, 0 build errors
2026-04-02 12:38:38 +02:00
Dev
cb7cf93c52
feat(01-07): add ProfileManagementDialog with DI factory wiring
...
- Create Views/Dialogs/ProfileManagementDialog.xaml (modal Window with Name/TenantUrl/ClientId fields and TranslationSource bindings)
- Create Views/Dialogs/ProfileManagementDialog.xaml.cs (DI constructor injection, LoadAsync on Loaded)
- Add OpenProfileManagementDialog factory delegate to MainWindowViewModel
- Wire ManageProfilesCommand to open dialog via factory, reload profiles after close
- Register ProfileManagementDialog as Transient in DI (App.xaml.cs)
- Inject IServiceProvider into MainWindow constructor for DI-resolved dialog factory
2026-04-02 12:38:31 +02:00
Dev
b41599d95a
docs(01-06): complete WPF shell plan — SUMMARY, STATE, ROADMAP updated
...
- 2 tasks completed, 12 files modified
- 6 FeatureViewModelBase unit tests added and passing
- Full WPF shell with FeatureTabBase, MainWindowViewModel, LogPanelSink wiring
2026-04-02 12:34:58 +02:00
Dev
5920d42614
feat(01-06): build WPF shell — MainWindow XAML, ViewModels, LogPanelSink wiring
...
- Add FeatureTabBase UserControl with ProgressBar/TextBlock/CancelButton strip
(Visibility bound to IsRunning, shown only during operations)
- Add MainWindowViewModel with TenantProfiles ObservableCollection, ConnectCommand,
ClearSessionCommand, ManageProfilesCommand, ProgressUpdatedMessage subscription
- Add ProfileManagementViewModel wrapping ProfileService CRUD with input validation
- Add SettingsViewModel (extends FeatureViewModelBase) with language/folder settings
- Update MainWindow.xaml: DockPanel shell with Toolbar, TabControl (8 tabs), 150px
RichTextBox LogPanel, StatusBar (tenant name | ProgressStatus | ProgressPercentage)
- MainWindow.xaml.cs: DI constructor, DataContext=viewModel, LoadProfilesAsync on Loaded
- App.xaml.cs: register all services, wire LogPanelSink after MainWindow resolved,
register DispatcherUnhandledException and UnobservedTaskException global handlers
- App.xaml: add BoolToVisibilityConverter resource
2026-04-02 12:32:41 +02:00
Dev
3c09155648
feat(01-06): implement FeatureViewModelBase with async/cancel/progress pattern
...
- Add ProgressUpdatedMessage ValueChangedMessage for StatusBar live updates
- Add FeatureViewModelBase with CancellationTokenSource lifecycle, IsRunning,
IProgress<OperationProgress>, OperationCanceledException handling
- Add 6 unit tests covering lifecycle, progress, cancellation, error handling
and CanExecute guard
2026-04-02 12:29:38 +02:00
Dev
fcae8f0e49
docs(01-04): complete auth layer plan
...
- 01-04-SUMMARY.md: MsalClientFactory + SessionManager auth layer
- STATE.md: progress updated to 63%, decisions added, session recorded
- ROADMAP.md: phase 1 progress updated (5/8 summaries)
- REQUIREMENTS.md: FOUND-03 and FOUND-04 marked complete
2026-04-02 12:26:55 +02:00
Dev
158aab96b2
feat(01-04): SessionManager singleton holding all ClientContext instances
...
- SessionManager owns all ClientContexts; callers must not store references
- IsAuthenticated(tenantUrl) returns false before auth, true after GetOrCreateContextAsync
- ClearSessionAsync disposes ClientContext and removes state (idempotent for unknown tenants)
- GetOrCreateContextAsync validates null/empty TenantUrl and ClientId (ArgumentException)
- MsalClientFactory.GetCacheHelper() added — exposes helper for PnP tokenCacheCallback wiring
- 8 unit tests pass, 1 interactive-login test skipped (integration-only)
2026-04-02 12:25:01 +02:00
Dev
02955199f6
feat(01-04): MsalClientFactory with per-clientId PCA and MsalCacheHelper
...
- Creates one IPublicClientApplication per ClientId (never shared)
- Persists token cache to configurable directory (default: %AppData%\SharepointToolbox\auth\msal_{clientId}.cache)
- SemaphoreSlim(1,1) prevents duplicate creation under concurrent calls
- CacheDirectory property exposed for test injection
- 4 unit tests: same-instance, different-instance, concurrent, AppData path
2026-04-02 12:22:54 +02:00
Dev
466bef3e87
docs(01-05): complete localization and logging plan
...
- 01-05-SUMMARY.md: TranslationSource + EN/FR resx + Serilog integration tests
- STATE.md: progress 50% (4/8 plans), metrics recorded, decisions added
- ROADMAP.md: phase 1 progress updated (4/8 summaries)
- REQUIREMENTS.md: FOUND-09 marked complete
2026-04-02 12:20:08 +02:00
Dev
1c532d1f6b
feat(01-05): add Serilog integration tests and App.xaml.cs LogPanelSink comment
...
- LoggingIntegrationTests: verifies Serilog writes rolling log file with correct content
- LogPanelSink structural smoke test: confirms type implements ILogEventSink
- App.xaml.cs: added comment for LogPanelSink DI registration deferred to plan 01-06
2026-04-02 12:18:02 +02:00
Dev
a287ed83ab
feat(01-05): implement TranslationSource singleton + EN/FR resx files
...
- TranslationSource singleton with INotifyPropertyChanged indexer binding
- PropertyChanged fires with string.Empty on culture switch (signals all bindings refresh)
- Missing key returns [key] placeholder (prevents null in WPF bindings)
- Strings.resx with 27 Phase 1 UI string keys (EN)
- Strings.fr.resx with same 27 keys stubbed with EN text (FR completeness Phase 5)
- Strings.Designer.cs ResourceManager for dotnet build compatibility
- SharepointToolbox.csproj updated with EmbeddedResource metadata
2026-04-02 12:16:57 +02:00
Dev
8a58140f9b
test(01-05): add failing tests for TranslationSource singleton
...
- Instance singleton test
- EN string lookup test
- FR culture fallback test
- Missing key returns bracketed key
- PropertyChanged fires with empty string on culture switch
- Same culture does not fire PropertyChanged
2026-04-02 12:14:49 +02:00
Dev
dd2f179c2d
docs(01-03): complete persistence layer plan — ProfileService + SettingsService
...
- SUMMARY.md: 7 files, 18 tests, write-then-replace pattern documented
- STATE.md: plan 03 complete, progress 38%, decisions recorded
- ROADMAP.md: phase 1 progress updated (3/8 plans done)
- REQUIREMENTS.md: FOUND-02, FOUND-10, FOUND-12 marked complete
2026-04-02 12:13:35 +02:00
Dev
ac3fa5c8eb
feat(01-03): SettingsRepository and SettingsService with write-then-replace
...
- AppSettings model: DataFolder + Lang with camelCase JSON serialization
- SettingsRepository: SemaphoreSlim write lock + write-then-replace (tmp→validate→move)
- SettingsService: GetSettings/SetLanguage/SetDataFolder; SetLanguage validates en/fr only
- All 8 SettingsServiceTests pass; all 18 Unit tests pass
2026-04-02 12:12:02 +02:00
Dev
769196dabe
feat(01-03): ProfileRepository and ProfileService with write-then-replace
...
- ProfileRepository: SemaphoreSlim write lock + write-then-replace (tmp→validate→move)
- ProfileRepository: camelCase JSON serialization matching existing schema
- ProfileService: CRUD operations (Add/Rename/Delete) with validation
- All 10 ProfileServiceTests pass (round-trip, missing file, corrupt JSON, concurrency, schema check)
2026-04-02 12:10:56 +02:00
Dev
ff29d4ec19
docs(01-02): complete core models and helpers plan — SUMMARY, STATE, ROADMAP updated
...
- 01-02-SUMMARY.md created with 7 files, 2 tasks, 1 auto-fix deviation
- STATE.md: progress 25% (2/8 plans), 2 new decisions added
- ROADMAP.md: phase 1 updated (2/8 summaries, In Progress)
- REQUIREMENTS.md: FOUND-05/06/07/08 marked complete
2026-04-02 12:08:16 +02:00
Dev
c2978016b0
feat(01-02): add SharePointPaginationHelper, ExecuteQueryRetryHelper, LogPanelSink
...
- SharePointPaginationHelper: async iterator with ListItemCollectionPosition loop (bypasses 5k limit); RowLimit=2000; [EnumeratorCancellation] for correct WithCancellation support
- ExecuteQueryRetryHelper: exponential backoff on 429/503/throttle; surfaces retry events via IProgress<OperationProgress>; max 5 retries
- LogPanelSink: custom Serilog ILogEventSink writing color-coded entries to RichTextBox via Dispatcher.InvokeAsync for thread safety
2026-04-02 12:06:39 +02:00
Dev
ddb216b1fb
feat(01-02): add Core models and WeakReferenceMessenger messages
...
- TenantProfile (plain class, mutable, fields match JSON schema: Name/TenantUrl/ClientId)
- OperationProgress (record with Indeterminate factory, used by all feature services via IProgress<T>)
- TenantSwitchedMessage (ValueChangedMessage<TenantProfile>, broadcast-ready)
- LanguageChangedMessage (ValueChangedMessage<string>, broadcast-ready)
2026-04-02 12:05:27 +02:00
Dev
41f8844a16
docs(01-01): complete solution scaffold plan — SUMMARY, STATE, ROADMAP updated
...
- 01-01-SUMMARY.md created with deviations, decisions, and metrics
- STATE.md: progress 13% (1/8 plans), 3 decisions added, metrics recorded
- ROADMAP.md: Phase 1 marked In Progress (1/8 summaries)
- REQUIREMENTS.md: FOUND-01 marked complete
2026-04-02 12:04:19 +02:00
Dev
eac34e3e2c
feat(01-01): add xUnit test project with 7 stub test files
...
- SharepointToolbox.Tests targeting net10.0-windows with UseWPF=true
- Moq 4.20.72 added for future mocking
- 7 stub test files across Services, Auth, ViewModels, Localization, Integration
- All tests marked [Fact(Skip)] referencing implementation plan — 0 failed, 7 skipped
- Solution build: 0 errors, 0 warnings
2026-04-02 12:02:30 +02:00
Dev
f469804810
feat(01-01): create WPF solution with Generic Host entry point and NuGet packages
...
- SharepointToolbox.slnx solution with WPF project
- net10.0-windows target, PublishTrimmed=false, StartupObject set
- App.xaml StartupUri removed, App demoted from ApplicationDefinition to Page
- App.xaml.cs: [STAThread] Main with Host.CreateDefaultBuilder + Serilog rolling file
- All NuGet packages: CommunityToolkit.Mvvm 8.4.2, MSAL 4.83.3, PnP.Framework 1.18.0, Serilog 4.3.1
- Build: 0 errors, 0 warnings
2026-04-02 12:00:47 +02:00
Dev
b4a901e52a
fix(01-foundation): revise plans based on checker feedback
...
- 01-04: wave 3 → 4 (01-03 is also wave 3; parallel executor would race)
- 01-06: wave 4 → 5 (cascades from 01-04 fix); add FeatureTabBase UserControl
for per-tab progress/cancel strip; bind StatusBar middle item to ProgressStatus
instead of ConnectionStatus per locked CONTEXT.md decision
- 01-07: wave 5 → 6 (cascades)
- 01-08: wave 6 → 7 (cascades)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 11:53:41 +02:00
Dev
eeb9a3bcd1
fix(01-foundation): revise plans based on checker feedback
...
- 01-03: wave 2 → wave 3 (depends on 01-02 which is also wave 2; must be wave 3)
- 01-06: add ProgressUpdatedMessage.cs to files_modified; add third StatusBarItem (progress %) to XAML per locked CONTEXT.md decision; add ProgressUpdatedMessage subscription in MainWindowViewModel.OnActivated()
- 01-08: add comment to empty <files> element (auto task with no file output)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 11:44:54 +02:00
Dev
ff5ac94ae2
docs(01-foundation): create phase plan (8 plans, 6 waves)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 11:38:35 +02:00
Dev
f303a60018
docs(phase-1): add research and validation strategy for foundation phase
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 11:29:00 +02:00
Dev
eba593c7ef
docs(01-foundation): research phase 1 foundation
...
Research covering WPF Generic Host wiring, MSAL per-tenant token cache
(MsalCacheHelper), CommunityToolkit.Mvvm async patterns, dynamic resx
localization, Serilog setup, JSON write-then-replace, and ObservableCollection
threading rules. Includes validation architecture and test gap list.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 11:27:50 +02:00
8102994aa5
docs: create roadmap (5 phases), research complete
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-02 10:14:13 +02:00
8a393aa540
docs: define v1 requirements (42 requirements across 8 categories)
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-02 10:11:11 +02:00
0c2e26e597
docs: complete project research for SharePoint Toolbox rewrite
...
Research covers stack (NET10/WPF/PnP.Framework), features (v1 parity + v1.x
differentiators), architecture (MVVM four-layer pattern), and pitfalls
(10 critical pitfalls all addressed in foundation phase). SUMMARY.md
synthesizes findings with phase-structured roadmap implications.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-02 10:07:47 +02:00
d372fc10f2
chore: add project config, update gitignore for .planning/
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-02 09:54:02 +02:00
1619cfbb7d
docs: initialize project
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-02 09:52:41 +02:00
63cf69f114
docs: map existing codebase
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-02 09:28:40 +02:00
10bfe6debc
Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox
Release zip package / release (push) Successful in 1s
v1.0.6.3
2026-04-01 17:12:30 +02:00
945a4e110d
Update TODO.md
2026-04-01 17:12:24 +02:00
109d0d5f1e
Update TODO.md
2026-03-27 09:57:13 +01:00
b4f0fecad2
Merge branch 'main' of https://git.azuze.fr/kawa/Sharepoint-Toolbox
Release zip package / release (push) Successful in 1s
v1.0.6.2
2026-03-27 09:54:11 +01:00
903fa17f8a
Updated workflow to include CSV examples folder
2026-03-27 09:54:01 +01:00
693f21915d
Updated workflow to include CSV examples folder
Release zip package / release (push) Successful in 1s
v1.0.6.1
2026-03-17 11:03:23 +01:00
ab39e55194
Added mass-transfer
Release zip package / release (push) Successful in 1s
v1.0.6
2026-03-17 10:57:11 +01:00
a1edea3007
Cleanup2
Release zip package / release (push) Successful in 1s
v1.0.5
2026-03-17 10:36:59 +01:00
db0f87dc00
Cleanup
2026-03-17 10:36:41 +01:00