Commit Graph
82 Commits
Author SHA1 Message Date
kawa 05d23bc3ce test(05-00): update registry.test.ts to use .fields access for TECH-03 shape
- Update BACKEND_REGISTRY[backend].length → .fields.length
- Update iteration to use BACKEND_REGISTRY[backend].fields
- Update field lookups (.find/.map) to go through .fields
- Add new test: each backend has displayName and description metadata (RED)
2026-03-30 09:33:36 +02:00
kawa 8c675813c6 test(05-00): add failing TECH-01 and TECH-02 test cases to ReviewStep.test.tsx
- Add WizardConsumerSetup helper to dispatch SET_DEPLOYMENT in tests
- Add renderWithDeployment helper for scriptTargets-specific rendering
- Add TECH-01-a: intune-only — Intune blocks present, RMM block absent (RED)
- Add TECH-01-b: rmm-only — RMM block present, Intune blocks absent (RED)
- Add TECH-01-c: neither target — only rclone.conf OutputBlock shown (RED)
- Add TECH-01-d: neither target ZIP — downloadZip with 1 file only (RED)
- Add TECH-02: Back button rendered and not disabled (RED)
2026-03-30 09:33:05 +02:00
kawaandClaude Sonnet 4.6 c108741324 fix(deployment-step): style Back and Next navigation buttons
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:55:35 +01:00
kawa 035c17071b feat(04-04): wire ReviewStep as step index 3; add 'Review' label to StepIndicator
- Import ReviewStep in App.tsx and add as steps[3]
- Update STEP_LABELS in StepIndicator.tsx to include 'Review' as fourth entry
- Update comment: 1.Backend > 2.Remote Config > 3.Deployment > 4.Review
- Full npm test suite (98 tests, 12 files) remains GREEN
2026-03-27 11:55:46 +01:00
kawa 259fff6527 feat(04-03): implement ReviewStep — all 10 requirement behaviors GREEN
- ReviewStep.tsx: live rclone.conf preview via useMemo+try/catch (CONF-02)
- Security acknowledgement checkbox gates all download/copy buttons (SECU-01)
- 'No data is sent to any server' privacy notice (SECU-02)
- 4 OutputBlocks with download (DOWN-01–04) and copy (DOWN-06, CONF-03)
- Download All (ZIP) button calls downloadZip with all 4 file entries (DOWN-05)
- Replaced all expect.fail stubs with real assertions — 10/10 tests GREEN
2026-03-27 11:52:07 +01:00
kawa e223e8be23 feat(04-02): add OutputBlock reusable component
- Pre-formatted code block with label, copy button, and optional download button
- Copy button calls navigator.clipboard.writeText with 2s "Copied!" feedback
- Download button calls downloadFile(content, filename) when filename prop provided
- disabled prop gates both copy and download actions (SECU-01 security gate)
2026-03-27 11:45:21 +01:00
kawa f948b86c0e feat(04-02): add downloadFile and downloadZip utility functions
- src/utils/downloadFile.ts: Blob + createObjectURL + anchor click download
- src/utils/downloadZip.ts: JSZip archive builder with same Blob download pattern
- npm install jszip ^3.10.1 (only new runtime dependency in phase 4)
2026-03-27 11:44:41 +01:00
kawa f428630f19 test(04-01): add SECU-03 assertion to reducer.test.ts — storage never written
- Added vi to import for spy capability
- SECU-03: dispatches all action types, asserts setItem never called on
  Storage.prototype (covers both localStorage and sessionStorage)
- All 9 reducer tests GREEN
2026-03-27 11:40:54 +01:00
kawa db4c80f853 test(04-01): add RED stubs for all Phase 4 requirements in ReviewStep.test.tsx
- CONF-02: live rclone.conf preview
- CONF-03: copy rclone.conf to clipboard
- DOWN-01 through DOWN-06: individual and ZIP download buttons
- SECU-01: download gating behind security checkbox
- SECU-02: privacy/no-server message
- Mocks: downloadFile, downloadZip, navigator.clipboard, URL
- All stubs use expect.fail('not yet implemented') — named RED baseline
2026-03-27 11:40:21 +01:00
kawa 8674bb83b3 feat(03-05): wire App.tsx step router and make App.test GREEN
- App.tsx: WizardShell routes to BackendSelectionStep/RemoteConfigStep/DeploymentStep
- App.tsx: StepIndicator renders above every step as persistent breadcrumb
- App.tsx: RemoteConfigStep keyed on backendType to force remount on backend change
- App.test.tsx: all 3 WIZD-02 tests GREEN (step 0, 1, 2 routing verified)
- Full suite: 87 tests GREEN across 11 test files
2026-03-27 09:46:02 +01:00
kawa b00305c9a0 test(03-05): add failing App step routing WIZD-02 tests (RED)
- renders BackendSelectionStep when currentStep is 0
- renders RemoteConfigStep when currentStep is 1
- renders DeploymentStep when currentStep is 2
2026-03-27 09:45:09 +01:00
kawa 273789f704 feat(03-05): implement DeploymentStep and StepIndicator
- DeploymentStep: includeInstall toggle, configPath radio, scriptTargets checkboxes
- DeploymentStep: dispatches SET_DEPLOYMENT live on every control change
- DeploymentStep: Back button (SET_STEP(1)), Next/Review button (SET_STEP(3))
- StepIndicator: 3-step breadcrumb with checkmarks on completed steps
- StepIndicator: clicking step 0 dispatches SET_REMOTE_PARAMS({}) then SET_STEP(0)
- StepIndicator: never dispatches RESET — deployment options preserved
- All 5 WIZD-03 tests GREEN
2026-03-27 09:43:50 +01:00
kawa 7ffccfb7f8 test(03-05): add failing StepIndicator WIZD-03 tests (RED)
- WIZD-03: clicking completed step dispatches SET_STEP
- WIZD-03: clicking back to step 0 dispatches SET_REMOTE_PARAMS({})
- WIZD-03: clicking back to step 0 does NOT dispatch RESET
- WIZD-03: step 0 shows as active when currentStep is 0
- WIZD-03: completed steps are clickable
2026-03-27 09:42:45 +01:00
kawa 45bcc0cc18 feat(03-04): implement RemoteConfigStep — registry-driven backend config form
- BACK-01: Azure Blob form with account FieldRenderer + AzureAuthToggle
- BACK-02: S3 form via BACKEND_REGISTRY loop (provider hidden, region required)
- BACK-03: S3-compatible form includes endpoint field
- mode: onSubmit / reValidateMode: onChange for touch-then-live validation
- Guard: useEffect redirects to step 0 if backendType is null
- All hooks called unconditionally (fallback schema prevents rules-of-hooks violation)
- 8/8 BACK-01/02/03 tests GREEN
2026-03-27 09:38:40 +01:00
kawa a57b2eab1d test(03-04): add failing tests for RemoteConfigStep
- BACK-01: Azure Blob form with account field + AzureAuthToggle
- BACK-02: S3 form fields (access_key_id, secret_access_key, region)
- BACK-03: S3-compatible form includes endpoint field
- renderWithBackend helper dispatches SET_BACKEND_TYPE before render
- @testing-library/user-event installed for value retention test
2026-03-27 09:36:41 +01:00
kawa b47f607224 feat(03-03): implement BackendSelectionStep (WIZD-01, WIZD-04)
- Remote name field with zod validation (mode: onSubmit, reValidateMode: onChange)
- Three backend cards in popularity order: Azure Blob, Amazon S3, S3-Compatible
- Card click validates name first; dispatches SET_REMOTE_NAME + SET_BACKEND_TYPE + SET_REMOTE_PARAMS({}) + SET_STEP(1)
- Does NOT dispatch RESET — preserves deployment options
- All 10 BackendSelectionStep tests GREEN
2026-03-27 09:33:45 +01:00
kawa cf06d72945 test(03-03): add failing tests for BackendSelectionStep (WIZD-01, WIZD-04)
- Replace expect.fail stubs with real test assertions
- Tests cover card render order, card click dispatch, name validation
- RED: component file does not exist yet
2026-03-27 09:32:35 +01:00
kawa 1c9c337d3f feat(03-02): create FieldRenderer and AzureAuthToggle
- FieldRenderer: registry-driven input renderer (text, password, select, hidden provider)
- AzureAuthToggle: segmented SAS/Key toggle, defaults to SAS, both fields always registered via CSS show/hide
- Both fields preserved on toggle (no conditional rendering that would lose react-hook-form state)
2026-03-27 09:29:51 +01:00
kawa cec45e8f17 feat(03-02): create BackendCard and PasswordField UI atoms
- BackendCard: clickable selection card with selected/unselected visual states
- PasswordField: password input with per-instance show/hide toggle (text labels, no emoji)
- Both files in new src/components/ui/ directory
2026-03-27 09:29:08 +01:00
kawa 153bc61f8a test(03-01): add Wave 0 RED baseline stubs for all 7 requirements
- src/App.test.tsx: WIZD-02 step routing (3 stubs)
- src/components/wizard/BackendSelectionStep.test.tsx: WIZD-01, WIZD-04 (10 stubs)
- src/components/wizard/RemoteConfigStep.test.tsx: BACK-01, BACK-02, BACK-03 (8 stubs)
- src/components/wizard/StepIndicator.test.tsx: WIZD-03 (5 stubs)
- All 26 tests fail RED with descriptive 'not yet implemented' messages
2026-03-27 09:26:06 +01:00
kawa 1e1ac25ea3 feat(02-04): implement buildRmmScript pure function
- Imports CONFIG_DIR and buildRcloneInstallBlock from ps-helpers.ts
- Uses \$ErrorActionPreference = 'Stop' for RMM platform exit code surfacing
- Creates config directory idempotently with Test-Path guard
- Writes rclone.conf using [System.IO.File]::WriteAllText UTF-8 no-BOM
- Conditionally includes rclone download block based on includeInstall flag
- All 6 rmm-script.test.ts assertions pass GREEN
2026-03-26 14:06:51 +01:00
kawa 495be0cd11 feat(02-03): implement buildIntuneInstall and buildIntuneDetection
- buildIntuneInstall: UTF-8 no-BOM write via WriteAllText, PS here-string for config, conditional rclone download block
- buildIntuneDetection: no $ErrorActionPreference, Write-Output + exit 0/1 pattern
- Both generators use CONFIG_DIR from ps-helpers for consistent path resolution
- All 15 intune-install and intune-detection tests pass GREEN
2026-03-26 14:06:45 +01:00
kawa 6a7912daae feat(02-03): create ps-helpers.ts shared module
- Export CONFIG_DIR record mapping configPath to Windows paths
- Export buildRcloneInstallBlock for conditional rclone binary download
- machine-wide maps to C:\ProgramData\rclone
- user-profile maps to %APPDATA%\rclone
- Uses -UseBasicParsing for SYSTEM context safety
2026-03-26 10:56:43 +01:00
kawa e3615c446c feat(02-02): implement buildRcloneConf pure function
- Maps BackendType to rclone INI type strings via RCLONE_TYPE_MAP
- s3-compatible correctly maps to type = s3 (not s3-compatible)
- Omits empty param values from output (no 'sas_url =' when blank)
- Throws on null backendType or empty remote name
- All 17 rclone-conf.test.ts assertions pass GREEN
2026-03-26 10:56:42 +01:00
kawa cc53bc014f feat(02-01): create generators barrel index.ts
- Re-exports buildRcloneConf, buildIntuneInstall, buildIntuneDetection, buildRmmScript
- Phase 4 will import all generators from this single entry point
- No implementation logic — purely structural re-exports
2026-03-26 10:53:49 +01:00
kawa 964022b5fc test(02-01): add failing test stubs for all four generators
- rclone-conf.test.ts: azureblob/s3/s3-compatible fixtures, error cases
- intune-install.test.ts: configPath, includeInstall, UTF-8 write, credential safety
- intune-detection.test.ts: configPath, exit codes, stdout only (no STDERR contamination)
- rmm-script.test.ts: configPath, includeInstall, ErrorActionPreference=Stop
2026-03-26 10:53:34 +01:00
kawa 2eef7225da feat(01-04): create WizardContext provider and wire into App
- Create src/store/context.tsx: WizardContext, WizardProvider, useWizard hook
- useWizard throws if used outside WizardProvider (prevents silent undefined state bugs)
- Update src/App.tsx to wrap content in WizardProvider
- npm run build exits 0 with no TypeScript errors
2026-03-26 10:24:32 +01:00
kawa 3fade79ea1 feat(01-04): implement WizardState types and pure reducer
- Create src/store/types.ts: WizardState interface, WizardAction union type, INITIAL_STATE constant
- Create src/store/reducer.ts: pure wizardReducer handling SET_STEP, SET_BACKEND_TYPE, SET_REMOTE_NAME, SET_REMOTE_PARAMS, SET_DEPLOYMENT, RESET
- All 8 reducer tests GREEN
- No localStorage/sessionStorage access (SECU-03 compliant)
2026-03-26 10:23:53 +01:00
kawa eaeae32849 feat(01-03): implement BACKEND_SCHEMAS Zod schema builder
- buildZodSchema derives z.object() from BACKEND_REGISTRY field definitions
- required fields map to z.string().min(1, label) — optional to z.string().optional()
- BACKEND_SCHEMAS exported with entries for azureblob, s3, s3-compatible
- BackendFormValues<T> utility type infers TypeScript type from schema
- No hardcoded field names — all shapes derived from registry loop
- All 8 tests in index.test.ts pass (GREEN)
2026-03-26 10:21:11 +01:00
kawa 9e28bf9ece test(01-02): add Wave 0 TDD stubs for SC-3 (Zod schemas) and SC-4 (wizard reducer)
- src/schemas/index.test.ts: 8 tests defining acceptance criteria for BACKEND_SCHEMAS (Plan 03)
- src/store/reducer.test.ts: 8 tests defining acceptance criteria for wizardReducer (Plan 04)
- Both files fail with "Cannot find module" — correct RED phase, implementation deferred to Plans 03-04
2026-03-26 10:17:35 +01:00
kawa 4c614fc06c feat(01-02): create Backend Schema Registry with rclone-compatible field definitions
- BackendType union: 'azureblob' | 's3' | 's3-compatible'
- FieldDef interface with key (snake_case rclone key), label, inputType, required, and optional fields
- BACKEND_REGISTRY: azureblob (3 fields), s3 (4 fields), s3-compatible (5 fields)
- All FieldDef.key values match rclone INI config key names exactly
- registry.test.ts: 7 tests all passing (GREEN)
2026-03-26 10:16:49 +01:00
kawa 237d06b8f7 feat(01-01): scaffold Vite 6 + React 18 + TypeScript 5 project
- Created Vite 6 project with React 18 and TypeScript 5 template
- Installed zod, react-hook-form, @hookform/resolvers (production)
- Installed tailwindcss @tailwindcss/vite (Tailwind v4 via Vite plugin)
- Installed vitest, @testing-library/react, @testing-library/dom (dev)
- Configured Tailwind v4 via @tailwindcss/vite plugin in vite.config.ts
- Set src/index.css to @import "tailwindcss" (no postcss/tailwind.config.js)
- Created minimal App.tsx with Tailwind classes, .gitignore
- Auto-fix (Rule 1): added src/vite-env.d.ts for CSS module type declarations
2026-03-26 10:12:15 +01:00