Commit Graph
100 Commits
Author SHA1 Message Date
kawa 057ba80b68 docs(07-01): complete VALID-01 format validation plan
- Add 07-01-SUMMARY.md (registry + Zod regex chaining)
- Update STATE.md with progress, decisions, session
- Update ROADMAP.md phase 7 plan progress
2026-03-31 09:51:25 +02:00
kawa c6d38fa0f1 feat(07-01): extend buildZodSchema() to chain .regex() from field.validate
- Replace simple ternary assignment with let schema pattern
- Chain (schema as z.ZodString).regex() when field.validate is present
- Handle optional fields: z.string() first, then .regex() if needed, then .optional()
- VALID-01 tests all pass (GREEN): azureblob account, s3 region, gcs project_number
2026-03-31 09:50:02 +02:00
kawa 3dea5c8561 feat(07-01): extend FieldDef with validate/tooltipText and add 3 validate rules
- Add validate?: { regex: RegExp; message: string } to FieldDef interface
- Add tooltipText?: string to FieldDef interface (prep for Plan 07-02)
- Add validate rule to azureblob.account: /^[a-z0-9]{3,24}$/
- Add validate rule to s3.region: /^[a-z][a-z0-9-]+[a-z0-9]$/
- Add validate rule to gcs.project_number: /^\d+$/
2026-03-31 09:49:13 +02:00
kawa 10bc1e93ed docs(07-00): complete wave-0 TDD stubs plan
- Create 07-00-SUMMARY.md with deviation documentation and self-check
- Update STATE.md: advance progress, add decisions, record session
- Update ROADMAP.md: phase 7 marked In Progress (1/3 summaries)
- Update REQUIREMENTS.md: VALID-01 and UX-01 marked complete
2026-03-31 09:47:14 +02:00
kawa 327421ed69 test(07-00): add failing stubs for VALID-01 and UX-01
- Add VALID-01 describe block with 7 tests: Azure account name (reject uppercase, reject <3 chars, accept valid), S3 region (reject spaces, accept valid), GCS project_number (reject non-digits, accept valid)
- Add UX-01 describe block with 5 tests: ⓘ button presence on sas_url, SFTP auth section, OneDrive token; tooltip show/hide toggle
- 9 new tests fail (RED state — validate property and tooltipText not on FieldDef yet)
- 3 new acceptance tests pass (absence-of-error condition already met before implementation)
- All 147 pre-existing tests still pass (zero regressions)
2026-03-31 09:45:21 +02:00
kawa 9d02764fa3 docs(07): create phase plan — 3 plans for VALID-01 and UX-01 2026-03-31 09:20:11 +02:00
kawa 78f54e3c9e docs(07): add validation strategy and research 2026-03-31 09:15:01 +02:00
kawaandClaude Sonnet 4.6 31d618309d docs(07): research phase validation and ux polish
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 09:13:53 +02:00
kawa 7d7af6e4c4 docs(state): record phase 7 context session 2026-03-31 09:08:53 +02:00
kawa f86f952266 docs(07): capture phase context 2026-03-31 09:08:48 +02:00
kawa 8d580a964f docs(phase-06): complete phase execution 2026-03-31 09:02:17 +02:00
kawa 31a6d00a67 docs(06-03): complete new backends UI wiring plan
- SUMMARY.md: all 7 backends wired in RemoteConfigStep, human-verified
- STATE.md: progress updated to 100%, decision and metrics recorded
- ROADMAP.md: phase 6 marked Complete (4/4 plans)
2026-03-31 08:59:26 +02:00
kawa 09adff0e67 feat(06-03): extend RemoteConfigStep for all 7 backends
- Add SftpAuthToggle import
- Extend backendLabel record to cover onedrive/sftp/gcs/b2
- Add sftp branch with host/user FieldRenderers + SftpAuthToggle
- onedrive/gcs/b2 render via existing registry loop (no custom branch)
- Full Vitest suite green (147 tests); zero TypeScript errors
2026-03-31 08:53:12 +02:00
kawa 7e9bdd8343 docs(06-02): complete SFTP data layer and SftpAuthToggle plan 2026-03-30 18:16:43 +02:00
kawaandClaude Sonnet 4.6 edce4146f8 docs(06-01): complete OneDrive/GCS/B2 data layer plan
- 06-01-SUMMARY.md: BackendType union extended to 7 types, BACKEND_REGISTRY/BACKEND_SCHEMAS/RCLONE_TYPE_MAP updated
- STATE.md: advanced to 06-01 complete, 92% progress, decisions recorded
- ROADMAP.md: phase 6 progress updated (3/4 summaries)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 18:15:24 +02:00
kawa dde2a1f01f feat(06-02): create SftpAuthToggle.tsx following AzureAuthToggle CSS-hidden pattern
- Password and Private Key tabs using CSS-hidden segmented control
- Both pass and key_pem fields always registered with react-hook-form
- Password tab active by default (authMethod = 'password')
- Active tab: bg-blue-600 text-white; inactive: bg-white text-gray-700 hover:bg-gray-50
- Wired into RemoteConfigStep in Plan 03 (06-03-PLAN.md)
2026-03-30 18:14:01 +02:00
kawa c1d61d380c feat(06-02): add sftp entry to registry, index, and rclone-conf
- Add sftp entry to BACKEND_REGISTRY with host, user, pass, key_pem fields
- Remove placeholder NOTE comment (sftp entry now present)
- Add sftp, onedrive, gcs, b2 to BACKEND_SCHEMAS in index.ts
- Add sftp, onedrive, gcs (google cloud storage), b2 to RCLONE_TYPE_MAP
- All 55 registry and rclone-conf tests pass; zero TypeScript errors
2026-03-30 18:12:39 +02:00
kawa 631470d5ac docs(06-00): complete Wave 0 RED test stubs plan
- Create 06-00-SUMMARY.md with RED state confirmation (27 failing, 49 green)
- Update STATE.md: progress 88%, decisions, session info
- Update ROADMAP.md: phase 6 in progress (1/4 summaries)
- Mark BACK-01 through BACK-04 complete in REQUIREMENTS.md
2026-03-30 18:10:49 +02:00
kawa 6f46f6b135 test(06-00): add failing describe blocks for OneDrive, SFTP, GCS, B2 in RemoteConfigStep (RED)
- BACK-01 (Phase 6): OneDrive — OAuth Token, Drive ID, Drive Type select
- BACK-02 (Phase 6): SFTP — Host, Username, Password tab, Private Key tab, tab-switching CSS-hide, value preservation
- BACK-03 (Phase 6): GCS — Project Number, Service Account JSON
- BACK-04 (Phase 6): Backblaze B2 — Application Key ID, Application Key
- 13 new tests fail RED; 8 existing tests remain green
2026-03-30 18:08:57 +02:00
kawa ad3d3240b1 test(06-00): add failing assertions for 7-backend registry (RED)
- EXPECTED_BACKENDS now includes onedrive, sftp, gcs, b2 (7 total)
- Added describe blocks for OneDrive, SFTP, GCS, Backblaze B2 field assertions
- 9 tests fail RED because registry.ts still has only 3 BackendType values
2026-03-30 17:18:30 +02:00
kawaandClaude Sonnet 4.6 b314e65536 docs(06-new-backends): create phase plan
4 plans across 3 waves: Wave 0 TDD stubs, Wave 1 data layer (parallel: OneDrive/GCS/B2 + SFTP/SftpAuthToggle), Wave 2 RemoteConfigStep wiring.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 13:38:46 +02:00
kawa e9bf449183 docs(06): add research and validation strategy 2026-03-30 13:29:50 +02:00
kawaandClaude Sonnet 4.6 71cd1c6373 docs(06): research phase new-backends
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 13:28:42 +02:00
kawaandClaude Sonnet 4.6 d9c4cd5f2e docs(05-tech-debt): re-verify phase 5 — gap was environment-specific, all 15 truths confirmed green
Re-ran npx vitest run: 12/12 suites pass, 104/104 tests pass, zero act() warnings.
The Vitest v4 runner-initialization failure in the initial verification report was
specific to the verifier agent context and does not reproduce in developer environment.
No code changes needed. Phase 5 is fully complete (15/15 must-haves verified).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 13:19:05 +02:00
kawa 53bbd00533 docs(05-03): complete act()-warning elimination plan
- SUMMARY.md: userEvent v14 migration + vi.useFakeTimers() for ReviewStep
- STATE.md: advanced to completed 05-03, added patterns as decisions
- ROADMAP.md: phase 5 now 4/4 plans complete (Complete status)
- REQUIREMENTS.md: TECH-05 marked complete
2026-03-30 11:44:59 +02:00
kawa 913cbe836e feat(05-03): fix ReviewStep act() warnings with vi.useFakeTimers
- Add afterEach to vitest imports
- Add vi.useFakeTimers() at the start of beforeEach block
- Add afterEach(() => vi.useRealTimers()) to restore timers after each test
- Freezes OutputBlock's setTimeout(setCopied(false), 2000) during tests
2026-03-30 09:43:14 +02:00
kawa 9b6d8a8137 feat(05-03): migrate BackendSelectionStep.test.tsx from fireEvent to userEvent
- Replace fireEvent import with userEvent from @testing-library/user-event
- Add const user = userEvent.setup() inside each test body using interactions
- Replace fireEvent.click(azureButton) with await user.click(azureButton)
- Replace fireEvent.change(nameInput) with await user.clear() + await user.type()
- Make all interaction tests async
2026-03-30 09:42:32 +02:00
kawa d17476858b docs(05-01): complete registry enrichment plan
- 05-01-SUMMARY.md: BACKEND_REGISTRY enriched, BackendSelectionStep wired to registry, BackendFormValues removed
- STATE.md: progress updated, decision logged, session recorded
- ROADMAP.md: phase 5 plan progress updated (3/4 summaries)
2026-03-30 09:39:47 +02:00
kawa fecea60eb0 docs(05-02): complete ReviewStep scriptTargets filtering and Back button plan 2026-03-30 09:38:58 +02:00
kawa 52318d5130 feat(05-01): wire BackendSelectionStep to registry and remove dead export
- Replace hardcoded BACKENDS array with Object.entries(BACKEND_REGISTRY)
- Import BACKEND_REGISTRY in BackendSelectionStep.tsx
- Remove BackendFormValues<T> export from schemas/index.ts (dead code TECH-04)
- TypeScript compiles with zero errors
2026-03-30 09:38:25 +02:00
kawa 214a68e4eb feat(05-02): add scriptTargets filtering and Back button to ReviewStep
- Destructure dispatch from useWizard() alongside state
- Derive showIntune and showRmm booleans from state.deployment.scriptTargets
- Conditionally unmount Intune OutputBlocks (showIntune) and RMM OutputBlock (showRmm)
- rclone.conf OutputBlock always rendered regardless of scriptTargets
- handleDownloadZip builds files array dynamically — filters by showIntune/showRmm
- Add Back button dispatching SET_STEP(2) following DeploymentStep pattern
- All 15 ReviewStep tests green including new TECH-01 and TECH-02 cases
2026-03-30 09:37:25 +02:00
kawa d495552b60 feat(05-01): enrich BACKEND_REGISTRY and update all consumers
- Change BACKEND_REGISTRY shape from Record<BackendType, FieldDef[]> to
  Record<BackendType, { displayName, description, fields: FieldDef[] }>
- Add displayName and description to azureblob, s3, s3-compatible entries
- Update schemas/index.ts buildZodSchema to use .fields access
- Update RemoteConfigStep.tsx two .fields accesses (azureblob.find + map)
2026-03-30 09:37:16 +02:00
kawaandClaude Sonnet 4.6 7ec45896e5 docs(05-00): complete wave-0 TDD stubs plan
- Create 05-00-SUMMARY.md with RED state documentation
- Update STATE.md with plan progress and decisions
- Update ROADMAP.md phase 5 progress (1/4 plans complete)
- Mark TECH-01, TECH-02, TECH-03 requirements complete in REQUIREMENTS.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 09:35:34 +02:00
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 0a0a51b45a docs(05-tech-debt): create phase 5 plan — 4 plans across 2 waves
Wave 0 TDD stubs, Wave 1 parallel (registry + ReviewStep), Wave 2 act() fix.
Covers TECH-01 through TECH-05.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 09:26:17 +02:00
kawaandClaude Sonnet 4.6 c7931621a5 docs(phase-5): add validation strategy
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 09:19:43 +02:00
kawaandClaude Sonnet 4.6 970c9151b7 docs(05): research phase tech-debt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 09:18:44 +02:00
kawa 3726d4e42d docs(05): capture phase context 2026-03-30 09:14:03 +02:00
kawa fecb892a2d docs: create milestone v1.1 roadmap (3 phases) 2026-03-30 09:06:13 +02:00
kawa dccd60031c docs: define milestone v1.1 requirements (11 requirements) 2026-03-30 09:02:06 +02:00
kawa 0fcf03d4b5 docs: start milestone v1.1 Backlog and Tech Debt 2026-03-27 15:40:42 +01:00
kawaandClaude Sonnet 4.6 ef0cd94eb7 chore: archive v1.0 milestone — MVP shipped
4 phases, 18 plans, 24/24 requirements, 98 tests GREEN.
Archived ROADMAP + REQUIREMENTS to milestones/. ROADMAP collapsed.
PROJECT.md evolved with validated requirements and key decisions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 15:36:40 +01:00
kawaandClaude Sonnet 4.6 2d5f8f4a81 docs(phase-04): complete phase execution — all 11 requirements verified
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 15:03:47 +01:00
kawa d82814f53f docs(04-05): complete Phase 4 — human verification approved, all 18 checks passed
- STATE.md updated: progress 100%, decisions recorded, session closed
- ROADMAP.md phase 4 marked Complete (5/5 plans with summaries)
- Requirements CONF-02, CONF-03, DOWN-01-DOWN-06, SECU-01-SECU-03 verified in browser
2026-03-27 14:58:54 +01: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 38fd5683e7 docs(04-05): checkpoint — Phase 4 human verification pending
- Created 04-05-SUMMARY.md for browser end-to-end verification checkpoint
- STATE.md progress updated to 100% (18/18 plans)
- ROADMAP.md phase 4 marked Complete (5/5 summaries)
2026-03-27 11:59:16 +01:00
kawa 08ac356dc9 docs(04-04): complete wizard wiring plan — ReviewStep integrated as step 3
- 04-04-SUMMARY.md: plan complete, 1 task, 2 files modified
- STATE.md: advanced to 17/18 plans (94%), recorded decision and session
- ROADMAP.md: phase 4 progress updated (4/5 summaries)
2026-03-27 11:57:15 +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 e7dcf30c3a docs(04-03): complete ReviewStep plan — 10 req behaviors GREEN, 98/98 tests pass
- 04-03-SUMMARY.md: documents implementation, deviations, and test fixes
- STATE.md: advanced to plan 04, recorded metrics and decisions
- ROADMAP.md: updated phase 4 progress (3/5 summaries)
2026-03-27 11:54:16 +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 6bba008256 docs(04-02): complete download utilities and OutputBlock plan
- 04-02-SUMMARY.md: execution summary for download utilities and OutputBlock
- STATE.md: progress updated to 83%, decisions recorded, session updated
- ROADMAP.md: phase 4 plan progress updated (2/5 summaries)
2026-03-27 11:46:57 +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 6138d6c6a3 docs(04-01): complete Wave 0 TDD RED baseline plan — ReviewStep stubs + SECU-03
- Created 04-01-SUMMARY.md
- STATE.md: progress updated to 78%, decisions recorded, session updated
- REQUIREMENTS.md: CONF-02/03, DOWN-01–06, SECU-01/02/03 marked complete
2026-03-27 11:42:44 +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
kawaandClaude Sonnet 4.6 405bf477b4 docs(04-review-download-security): create phase 4 plan
5 plans across 5 waves: Wave 0 TDD stubs, utilities + OutputBlock,
ReviewStep implementation, App.tsx wiring, human verify checkpoint.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:23:14 +01:00
kawaandClaude Sonnet 4.6 8d5f7090e2 docs(phase-4): add research and validation strategy for Review, Download & Security
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:17:06 +01:00
kawaandClaude Sonnet 4.6 0397bc96c9 docs(04): research phase 4 — review, download & security
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:16:00 +01:00
kawaandClaude Sonnet 4.6 3185e46fd1 docs(phase-03): complete phase execution
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:11:08 +01:00
kawa fe7e17e55b docs(03-05): complete wizard wiring plan — human verify approved
- Updated 03-05-SUMMARY.md: checkpoint approved, plan fully complete
- Updated STATE.md: progress 100%, session recorded, decisions added
2026-03-27 10:04:33 +01:00
kawa d3052a6776 docs(03-05): complete DeploymentStep + StepIndicator + App.tsx wiring plan
- 87 tests GREEN across 11 suites (WIZD-01/02/03/04, BACK-01/02/03)
- WIZD-02: App.tsx routes all 3 steps with StepIndicator breadcrumb
- WIZD-03: back-nav clears params without RESET, deployment preserved
- Human-verify checkpoint pending for end-to-end browser validation
2026-03-27 09:48:03 +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 3155491315 docs(03-04): complete RemoteConfigStep plan
- SUMMARY.md created with TDD commits, deviations, decisions
- STATE.md updated: progress 92%, decisions, session
- ROADMAP.md updated: phase 3 4/5 summaries complete
2026-03-27 09:40:25 +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 97651b5d59 docs(03-03): complete BackendSelectionStep plan
- SUMMARY.md: BackendSelectionStep TDD execution, WIZD-01 + WIZD-04
- STATE.md: progress updated to 85% (11/13), decisions added
- ROADMAP.md: phase 3 plan progress updated (3/5 summaries)
2026-03-27 09:34:53 +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 e1cc3eda3f docs(03-02): complete UI atom components plan
- SUMMARY.md for BackendCard, PasswordField, FieldRenderer, AzureAuthToggle
- STATE.md updated with progress (77%), decisions, metrics
- ROADMAP.md updated (phase 3: 2/5 plans complete)
2026-03-27 09:30:57 +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 a2d4318b45 docs(03-01): complete wave-0 test infrastructure plan
- 03-01-SUMMARY.md: 26 RED stubs for WIZD-01/02/03/04 and BACK-01/02/03
- STATE.md: progress 69%, decisions recorded, session updated
- ROADMAP.md: phase 3 progress updated (1/5 plans complete)
- REQUIREMENTS.md: WIZD-01/02/03/04 and BACK-01/02/03 marked complete
2026-03-27 09:27:50 +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 9eef93775c chore(03-01): configure Vitest jsdom environment
- Add test block to vite.config.ts with environment: 'jsdom'
- Add passWithNoTests: true (established project convention)
2026-03-27 09:25:08 +01:00
kawa ace078d418 docs(03): add validation strategy and research 2026-03-26 14:36:13 +01:00
kawaandClaude Sonnet 4.6 e6883089b4 docs(03): research phase wizard UI
Investigate react-hook-form + Zod v4 + Tailwind v4 patterns for the
multi-step wizard, document registry-driven form rendering, touch-then-live
validation, Azure auth toggle, and breadcrumb navigation approach.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 14:35:08 +01:00
kawa 279bd0a534 docs(state): record phase 3 context session 2026-03-26 14:30:44 +01:00
kawa dc8aa85dcd docs(03): capture phase context 2026-03-26 14:30:40 +01:00
kawa e17419bfd0 docs(phase-02): complete phase execution 2026-03-26 14:12:22 +01:00
kawa 64e25a691c docs(02-03): complete Intune generators plan 2026-03-26 14:08:40 +01:00
kawa 83e48648f4 docs(02-04): complete buildRmmScript plan — phase 2 all generators done
- SUMMARY.md for plan 02-04 (buildRmmScript)
- STATE.md updated: 100% progress, decisions added, session recorded
- ROADMAP.md phase 02 marked Complete (4/4 summaries)
- Requirements DEPL-03, DEPL-04, DEPL-05 satisfied
2026-03-26 14:08:10 +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 41ebd20a93 docs(02-01): complete generator test stubs plan
- SUMMARY.md: RED test stubs for all four generators + barrel
- STATE.md: progress 63%, decisions recorded, session updated
- ROADMAP.md: phase 2 plan progress updated (1/4 summaries)
- REQUIREMENTS.md: CONF-01, DEPL-01-05 marked complete
2026-03-26 10:55:22 +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
kawaandClaude Sonnet 4.6 0722046c32 docs(02-generators): create phase 2 plan — 4 plans in 2 waves
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 10:45:15 +01:00
kawa 0d4c9bd37e docs(02-generators): add research and validation strategy 2026-03-26 10:40:18 +01:00
kawaandClaude Sonnet 4.6 aff2923b14 docs(phase-02): research generators phase
Covers rclone.conf INI generation (type mapping, empty field omission),
PowerShell encoding (UTF-8 no-BOM via UTF8Encoding($false)), Intune
detection script contract (STDERR breaks detection), and RMM SYSTEM
context patterns. All key findings verified against live official sources.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 10:39:12 +01:00
kawaandClaude Sonnet 4.6 bd10a33dab docs(phase-01): complete phase execution
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 10:30:46 +01:00
kawa 77ad5f39b0 docs(01-04): complete WizardState store plan
- 01-04-SUMMARY.md: TDD reducer + Context API store complete, 8 tests green, build clean
- STATE.md: progress 100%, decisions added, session updated
- ROADMAP.md: Phase 01 all 4 plans complete
2026-03-26 10:26:16 +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