+ );
+ }
+ ```
+
+ After writing the file, run tests and fix any assertion mismatches:
+ - If a test expects a specific button text, match it exactly
+ - If a test queries by role or label, ensure the rendered output has matching accessible text
+ - Update test stubs to real assertions as you implement (replace `expect.fail('not yet implemented')` with actual assertions matching the rendered output)
+
+ PITFALL — buildRcloneConf throws on incomplete state: Always use try/catch in useMemo. Show PLACEHOLDER string when thrown. This prevents the component from crashing during navigation with partial state.
+
+ PITFALL — useMemo dependency: Pass `[state]` (the full state object) as the dependency array. WizardContext re-renders on every dispatch, so this will update on every form change (satisfies CONF-02).
+
+
+ npm test -- src/components/wizard/ReviewStep.test.tsx 2>&1 | tail -20
+
+ All test stubs in ReviewStep.test.tsx are replaced with real assertions and pass GREEN. npm test shows 0 failing tests for this file. All pre-existing tests in other files remain GREEN.
+
+
+
+
+
+`npm test` full suite passes GREEN. ReviewStep.test.tsx: all CONF-02, CONF-03, DOWN-01 through DOWN-06, SECU-01, SECU-02 assertions pass. reducer.test.ts SECU-03 passes. All Phase 1–3 tests still GREEN.
+
+
+
+- src/components/wizard/ReviewStep.tsx exists and exports ReviewStep
+- All 10 requirement behaviors tested in ReviewStep.test.tsx pass GREEN
+- No TypeScript errors in the component
+- Full test suite green
+
+
+
diff --git a/.planning/phases/04-review-download-security/04-04-PLAN.md b/.planning/phases/04-review-download-security/04-04-PLAN.md
new file mode 100644
index 0000000..a9699b8
--- /dev/null
+++ b/.planning/phases/04-review-download-security/04-04-PLAN.md
@@ -0,0 +1,129 @@
+---
+phase: 04-review-download-security
+plan: 04
+type: execute
+wave: 4
+depends_on: [04-03]
+files_modified:
+ - src/App.tsx
+ - src/components/wizard/StepIndicator.tsx
+autonomous: true
+requirements: [CONF-02, CONF-03, DOWN-01, DOWN-02, DOWN-03, DOWN-04, DOWN-05, DOWN-06, SECU-01, SECU-02, SECU-03]
+
+must_haves:
+ truths:
+ - "App.tsx renders ReviewStep when currentStep is 3"
+ - "StepIndicator shows 4 labels: Backend, Remote Config, Deployment, Review"
+ - "Navigating to step 3 via StepIndicator dispatch renders the ReviewStep component"
+ - "Full npm test suite remains GREEN after wiring"
+ artifacts:
+ - path: "src/App.tsx"
+ provides: "Wired ReviewStep as step index 3 in the steps array"
+ contains: "ReviewStep"
+ - path: "src/components/wizard/StepIndicator.tsx"
+ provides: "STEP_LABELS updated with fourth entry 'Review'"
+ contains: "Review"
+ key_links:
+ - from: "src/App.tsx"
+ to: "src/components/wizard/ReviewStep.tsx"
+ via: "import { ReviewStep }"
+ pattern: "ReviewStep"
+ - from: "src/components/wizard/StepIndicator.tsx"
+ to: "STEP_LABELS array"
+ via: "array entry at index 3"
+ pattern: "'Review'"
+---
+
+
+Wire ReviewStep into the running application: add it as step index 3 in App.tsx and add 'Review' as the fourth entry in StepIndicator's STEP_LABELS array.
+
+Purpose: ReviewStep is fully implemented and tested in isolation (Plan 03). This plan completes the integration so the full 4-step wizard flow is navigable end-to-end.
+Output: Updated App.tsx and StepIndicator.tsx. No new files.
+
+
+
+@C:/Users/SebastienQUEROL/.claude/get-shit-done/workflows/execute-plan.md
+@C:/Users/SebastienQUEROL/.claude/get-shit-done/templates/summary.md
+
+
+
+@.planning/phases/04-review-download-security/04-RESEARCH.md
+@src/App.tsx
+@src/components/wizard/StepIndicator.tsx
+@src/App.test.tsx
+
+
+
+
+
+From src/App.tsx (current — step 3 add point annotated in comments):
+```typescript
+// Guard: clamp to valid range (phase 4 will add step 3 for review/download)
+const stepIndex = Math.min(state.currentStep, steps.length - 1);
+// steps array currently has indices 0, 1, 2
+```
+
+From src/components/wizard/StepIndicator.tsx (current):
+```typescript
+const STEP_LABELS = ['Backend', 'Remote Config', 'Deployment'];
+// Add 'Review' as index 3
+```
+
+The App.tsx clamp logic (`Math.min(state.currentStep, steps.length - 1)`) already handles step 3 correctly once ReviewStep is in the array — no logic changes needed, only array population.
+
+
+
+
+
+ Task 1: Wire ReviewStep into App.tsx and add 'Review' label to StepIndicator
+ src/App.tsx, src/components/wizard/StepIndicator.tsx
+
+ Edit src/App.tsx:
+ 1. Add import: `import { ReviewStep } from './components/wizard/ReviewStep';`
+ 2. Add ReviewStep as the fourth element in the steps array:
+ ```typescript
+ const steps = [
+ ,
+ ,
+ ,
+ , // step index 3 — Phase 4
+ ];
+ ```
+ 3. Remove or update the comment "phase 4 will add step 3 for review/download" — it is now implemented.
+ 4. The `Math.min(state.currentStep, steps.length - 1)` clamp requires NO change — it automatically works with 4 steps.
+
+ Edit src/components/wizard/StepIndicator.tsx:
+ 1. Update STEP_LABELS to include 'Review' as the fourth entry:
+ ```typescript
+ const STEP_LABELS = ['Backend', 'Remote Config', 'Deployment', 'Review'];
+ ```
+ 2. Update the header comment to reflect the new step: `// 1.Backend > 2.Remote Config > 3.Deployment > 4.Review`
+ 3. No other logic changes needed — the map over STEP_LABELS automatically renders the fourth step.
+
+ After edits, run `npm test` to verify:
+ - App.test.tsx (existing step routing tests) must remain GREEN
+ - StepIndicator.test.tsx must remain GREEN
+ - All other tests must remain GREEN
+
+
+ npm test 2>&1 | tail -20
+
+ App.tsx imports and renders ReviewStep at step index 3. StepIndicator shows 4 step labels including 'Review'. Full npm test suite GREEN. TypeScript compilation clean.
+
+
+
+
+
+`npm run build` succeeds. `npm test` full suite GREEN. The app wires ReviewStep without breaking any existing step routing, StepIndicator navigation, or prior test assertions.
+
+
+
+- src/App.tsx imports ReviewStep and includes it as steps[3]
+- src/components/wizard/StepIndicator.tsx STEP_LABELS has 4 entries ending with 'Review'
+- All existing tests (App.test.tsx, StepIndicator.test.tsx, all Phase 1–3 tests) remain GREEN
+- `npm run build` produces no errors
+
+
+
diff --git a/.planning/phases/04-review-download-security/04-05-PLAN.md b/.planning/phases/04-review-download-security/04-05-PLAN.md
new file mode 100644
index 0000000..68bcaf6
--- /dev/null
+++ b/.planning/phases/04-review-download-security/04-05-PLAN.md
@@ -0,0 +1,116 @@
+---
+phase: 04-review-download-security
+plan: 05
+type: checkpoint
+wave: 5
+depends_on: [04-04]
+files_modified: []
+autonomous: false
+requirements: [CONF-02, CONF-03, DOWN-01, DOWN-02, DOWN-03, DOWN-04, DOWN-05, DOWN-06, SECU-01, SECU-02, SECU-03]
+
+must_haves:
+ truths:
+ - "IT admin can navigate the full 4-step wizard end-to-end in a real browser"
+ - "Security checkbox gate prevents downloads until acknowledged"
+ - "All four individual file downloads work in the browser"
+ - "ZIP bundle downloads and contains all 4 files"
+ - "Copy-to-clipboard works for each output block"
+ - "No data is written to localStorage or sessionStorage at any point"
+ artifacts:
+ - path: "src/components/wizard/ReviewStep.tsx"
+ provides: "Visually verified step 3 component"
+ - path: "src/utils/downloadFile.ts"
+ provides: "Verified individual download helper"
+ - path: "src/utils/downloadZip.ts"
+ provides: "Verified ZIP bundle helper"
+ key_links:
+ - from: "Browser navigation (steps 0→3)"
+ to: "ReviewStep rendered at step 3"
+ via: "App.tsx step router"
+ pattern: "n/a"
+---
+
+
+Human verification of the complete Phase 4 feature set in a running browser. All automated tests pass, but ZIP content, actual file downloads, and clipboard paste cannot be verified by jsdom.
+
+Purpose: Confirm the full IT admin workflow — complete wizard, review generated files, acknowledge security warning, download individually and as ZIP, copy to clipboard — works correctly end-to-end.
+Output: Human approval that Phase 4 is shippable.
+
+
+
+@C:/Users/SebastienQUEROL/.claude/get-shit-done/workflows/execute-plan.md
+@C:/Users/SebastienQUEROL/.claude/get-shit-done/templates/summary.md
+
+
+
+@.planning/ROADMAP.md
+
+
+
+
+
+
+ Complete Phase 4 feature set:
+ - ReviewStep (step 3) with live rclone.conf preview
+ - Security acknowledgement checkbox gate (all downloads disabled until checked)
+ - "No data sent to server" client-side notice
+ - Individual download buttons for rclone.conf, intune-install.ps1, intune-detection.ps1, rmm-script.ps1
+ - Copy-to-clipboard button per output block
+ - "Download All (ZIP)" button producing rclone-deployment.zip with all 4 files
+ - 4-label StepIndicator (Backend > Remote Config > Deployment > Review)
+ - Full automated test suite GREEN (including SECU-03 localStorage spy)
+
+
+ Run the dev server: `npm run dev` then open http://localhost:5173
+
+ Step 1 — Navigate the full wizard:
+ 1. Select a backend (e.g., Azure Blob)
+ 2. Enter a remote name and fill in all required fields (storage account, SAS token or access key)
+ 3. Proceed to Deployment Options, leave defaults or adjust, click Next
+ 4. Confirm you reach step 4 "Review" with StepIndicator showing "1. Backend › 2. Remote Config › 3. Deployment › 4. Review"
+
+ Step 2 — Verify the live preview (CONF-02):
+ 5. The rclone.conf output block shows a populated INI-format config reflecting your entered values
+ 6. Go back to step 2, change a field value, return to step 4 — verify the preview updated
+
+ Step 3 — Verify security gate (SECU-01, SECU-02):
+ 7. Before checking the checkbox: confirm all Download and Copy buttons appear disabled/greyed out
+ 8. Confirm the "No data is sent to any server" notice is visible
+ 9. Check the acknowledgement checkbox — confirm all buttons become active
+
+ Step 4 — Individual downloads (DOWN-01 through DOWN-04):
+ 10. Click "Download" on the rclone.conf block — verify rclone.conf file saved to Downloads
+ 11. Click "Download" on Intune Install Script — verify intune-install.ps1 saved
+ 12. Click "Download" on Intune Detection Script — verify intune-detection.ps1 saved
+ 13. Click "Download" on RMM Script — verify rmm-script.ps1 saved
+
+ Step 5 — Clipboard copy (CONF-03, DOWN-06):
+ 14. Click "Copy" on the rclone.conf block — paste into a text editor, verify content matches displayed preview
+ 15. Click "Copy" on at least one script block — verify clipboard content matches displayed script
+
+ Step 6 — ZIP bundle (DOWN-05):
+ 16. Click "Download All (ZIP)" — verify rclone-deployment.zip saved to Downloads
+ 17. Open the ZIP file with your OS ZIP tool — verify it contains exactly 4 files: rclone.conf, intune-install.ps1, intune-detection.ps1, rmm-script.ps1
+
+ Step 7 — SECU-03 (no storage writes):
+ 18. Open DevTools → Application → Local Storage and Session Storage
+ 19. Navigate the full wizard end-to-end — verify both storage areas remain empty at all times
+
+ Type "approved" if all checks pass, or describe which checks failed with details
+
+
+
+
+
+Human approval received. All 7 verification steps confirmed passing. Phase 4 requirements CONF-02, CONF-03, DOWN-01–DOWN-06, SECU-01, SECU-02, SECU-03 verified in a real browser.
+
+
+
+- Human has confirmed "approved" after completing all 18 verification steps
+- No failures reported for any requirement behavior
+- Phase 4 declared complete
+
+
+