From 7e9bdd83431334428e85800d67f036d1615ec66b Mon Sep 17 00:00:00 2001 From: Kawa Date: Mon, 30 Mar 2026 18:16:43 +0200 Subject: [PATCH] docs(06-02): complete SFTP data layer and SftpAuthToggle plan --- .planning/STATE.md | 13 +- .../phases/06-new-backends/06-02-SUMMARY.md | 116 ++++++++++++++++++ 2 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 .planning/phases/06-new-backends/06-02-SUMMARY.md diff --git a/.planning/STATE.md b/.planning/STATE.md index 920b40a..569274b 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,14 +3,14 @@ gsd_state_version: 1.0 milestone: v1.1 milestone_name: Backlog & Tech Debt status: planning -stopped_at: Completed 06-new-backends 06-01-PLAN.md -last_updated: "2026-03-30T16:14:54.046Z" +stopped_at: Completed 06-new-backends 06-02-PLAN.md +last_updated: "2026-03-30T16:15:00Z" last_activity: 2026-03-27 — v1.1 roadmap created, 11 requirements mapped across 3 phases progress: total_phases: 3 completed_phases: 1 total_plans: 8 - completed_plans: 6 + completed_plans: 7 percent: 88 --- @@ -70,6 +70,7 @@ Progress: [░░░░░░░░░░] 0% (v1.1) | Phase 05-tech-debt P03 | 3 | 2 tasks | 2 files | | Phase 06-new-backends P00 | 5min | 3 tasks | 3 files | | Phase 06-new-backends P01 | 5min | 2 tasks | 3 files | +| Phase 06-new-backends P02 | 4min | 2 tasks | 4 files | ## Accumulated Context @@ -94,6 +95,8 @@ Recent decisions affecting v1.1 work: - [Phase 06-new-backends]: SFTP CSS-hide tab toggle pattern follows AzureAuthToggle convention (div.hidden/div.block) - [Phase 06-new-backends]: GCS rclone type = 'google cloud storage' (with spaces) not 'gcs' — critical for correct rclone.conf output, test asserts not.toContain('type = gcs') - [Phase 06-new-backends]: OneDrive uses paste-based OAuth token (JSON token field), GCS uses service_account_credentials (paste JSON), B2 uses account + key — all follow stateless browser-paste pattern +- [Phase 06-new-backends]: SftpAuthToggle follows AzureAuthToggle CSS-hidden pattern: both pass and key_pem always registered with react-hook-form, tab visibility via div.block/div.hidden +- [Phase 06-new-backends]: RCLONE_TYPE_MAP and BACKEND_SCHEMAS extended for all 7 backends in plan 02 (not just sftp) to fix failing onedrive/gcs/b2 test assertions ### Pending Todos @@ -108,6 +111,6 @@ None yet. ## Session Continuity -Last session: 2026-03-30T16:14:54.042Z -Stopped at: Completed 06-new-backends 06-01-PLAN.md +Last session: 2026-03-30T16:15:00Z +Stopped at: Completed 06-new-backends 06-02-PLAN.md Resume file: None diff --git a/.planning/phases/06-new-backends/06-02-SUMMARY.md b/.planning/phases/06-new-backends/06-02-SUMMARY.md new file mode 100644 index 0000000..3f387aa --- /dev/null +++ b/.planning/phases/06-new-backends/06-02-SUMMARY.md @@ -0,0 +1,116 @@ +--- +phase: 06-new-backends +plan: "02" +subsystem: ui +tags: [sftp, rclone, react, typescript, react-hook-form, css-hidden-toggle] + +# Dependency graph +requires: + - phase: 06-00 + provides: BackendType union with sftp, BACKEND_REGISTRY stub with sftp placeholder comment +provides: + - sftp entry in BACKEND_REGISTRY with host, user, pass, key_pem fields + - sftp in BACKEND_SCHEMAS and RCLONE_TYPE_MAP + - SftpAuthToggle.tsx component following AzureAuthToggle CSS-hidden pattern + - onedrive, gcs, b2 entries added to BACKEND_SCHEMAS and RCLONE_TYPE_MAP +affects: [06-03, 06-04] + +# Tech tracking +tech-stack: + added: [] + patterns: + - "SftpAuthToggle CSS-hidden tab toggle: both fields always registered with react-hook-form, visibility controlled via div.block/div.hidden" + - "RCLONE_TYPE_MAP maps gcs to 'google cloud storage' (with spaces) — rclone native type string" + +key-files: + created: + - src/components/wizard/SftpAuthToggle.tsx + modified: + - src/schemas/registry.ts + - src/schemas/index.ts + - src/generators/rclone-conf.ts + +key-decisions: + - "sftp key_pem field name matches rclone SFTP config key (not key_file) — verified against registry" + - "SftpAuthToggle follows AzureAuthToggle CSS-hidden pattern exactly (div.block/div.hidden, both fields always registered)" + - "BACKEND_SCHEMAS extended with all 7 backends in this plan (not just sftp) — avoids partial state" + - "RCLONE_TYPE_MAP also extended with onedrive, gcs, b2 in this plan — all 7 backends now complete" + +patterns-established: + - "Auth toggle pattern: CSS-hidden (not conditional render) preserves field values across tab switches" + - "SftpAuthToggle tab labels: 'Password' and 'Private Key' (exact text required by RemoteConfigStep tests)" + +requirements-completed: [BACK-02] + +# Metrics +duration: 4min +completed: 2026-03-30 +--- + +# Phase 06 Plan 02: SFTP Data Layer and SftpAuthToggle Summary + +**SFTP registry entry with host/user/pass/key_pem added to all three data layers plus SftpAuthToggle.tsx component using CSS-hidden tab pattern matching AzureAuthToggle** + +## Performance + +- **Duration:** ~4 min +- **Started:** 2026-03-30T16:11:00Z +- **Completed:** 2026-03-30T16:14:20Z +- **Tasks:** 2 +- **Files modified:** 4 + +## Accomplishments + +- Added sftp entry to BACKEND_REGISTRY with all four rclone field keys (host, user, pass, key_pem) +- Extended BACKEND_SCHEMAS and RCLONE_TYPE_MAP to cover all 7 backends (sftp, onedrive, gcs, b2 added) +- Created SftpAuthToggle.tsx with CSS-hidden Password/Private Key tab toggle, both fields always registered with react-hook-form +- All 55 registry and rclone-conf tests pass; zero TypeScript errors + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: Add sftp entry to registry.ts, index.ts, and rclone-conf.ts** - `c1d61d3` (feat) +2. **Task 2: Create SftpAuthToggle.tsx** - `dde2a1f` (feat) + +## Files Created/Modified + +- `src/schemas/registry.ts` - Added sftp entry with host, user, pass, key_pem fields; removed placeholder NOTE comment +- `src/schemas/index.ts` - Added sftp, onedrive, gcs, b2 to BACKEND_SCHEMAS +- `src/generators/rclone-conf.ts` - Added sftp, onedrive, gcs (google cloud storage), b2 to RCLONE_TYPE_MAP +- `src/components/wizard/SftpAuthToggle.tsx` - New component: Password/Private Key tab toggle following AzureAuthToggle CSS-hidden pattern + +## Decisions Made + +- BACKEND_SCHEMAS and RCLONE_TYPE_MAP were extended for all 7 backends in this plan (not just sftp) — the test stubs for onedrive, gcs, b2 were already failing and all 3 required the same data layer wiring +- SftpAuthToggle button text: "Password" (exact) and "Private Key" — matches RemoteConfigStep test assertions for `{ selector: 'button' }` pattern matching + +## Deviations from Plan + +**1. [Rule 1 - Bug] Extended BACKEND_SCHEMAS and RCLONE_TYPE_MAP for all 7 backends, not just sftp** + +- **Found during:** Task 1 (running rclone-conf.test.ts) +- **Issue:** Tests for onedrive, gcs, b2 were failing (type = undefined) because RCLONE_TYPE_MAP and BACKEND_SCHEMAS only had 3 entries. These backends were added to BACKEND_REGISTRY in the same phase (06-01) but their downstream entries were missing. +- **Fix:** Added onedrive, gcs (google cloud storage), b2 to both RCLONE_TYPE_MAP and BACKEND_SCHEMAS in the same task +- **Files modified:** src/schemas/index.ts, src/generators/rclone-conf.ts +- **Verification:** All 55 registry and rclone-conf tests pass +- **Committed in:** c1d61d3 (Task 1 commit) + +--- + +**Total deviations:** 1 auto-fixed (Rule 1 - Bug) +**Impact on plan:** Required for test correctness. No scope creep — these entries were already needed by Plan 01's backends. + +## Issues Encountered + +- RemoteConfigStep.test.tsx SFTP toggle tests (4 tests) remain failing — expected per plan (Plan 03 wires SftpAuthToggle into RemoteConfigStep). The component exists and is importable; wiring is deferred to 06-03. + +## Next Phase Readiness + +- SftpAuthToggle.tsx ready to be imported by RemoteConfigStep in Plan 03 +- All 7 backend data layers complete (registry, schemas, rclone type map) +- Plan 03 (06-03) can wire SftpAuthToggle into RemoteConfigStep and add remaining backend forms + +--- +*Phase: 06-new-backends* +*Completed: 2026-03-30*