diff --git a/.planning/HANDOFF.json b/.planning/HANDOFF.json deleted file mode 100644 index dba6f63..0000000 --- a/.planning/HANDOFF.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "1.0", - "timestamp": "2026-06-25T10:36:54.489Z", - "phase": "06", - "phase_name": "desktop-client-ci-cd", - "phase_dir": ".planning/phases/06-desktop-client-ci-cd", - "plan": 3, - "task": 4, - "total_plans": 3, - "completed_plans": ["06-01"], - "in_progress_plans": ["06-03"], - "remaining_plans": ["06-02"], - "status": "in_progress", - "stopped_at": "Plan 06-03 Task 4 — CI pipeline verification pending (Run #87)", - "resume_command": "/gsd-execute-phase 6", - "blockers": [], - "human_actions_pending": [ - "Check CI pipeline Run #87 result at https://git.vicolab.de/schalli/tessera-ctl/actions", - "If pipeline still fails, check type-check step — prisma generate postinstall was added" - ], - "decisions": [ - "Gitea user: schalli, repo: schalli/tessera-ctl (private)", - "Gitea URL: https://git.vicolab.de", - "Git remote uses embedded token credentials in URL", - "act_runner already existed as Docker container, reused instead of creating new", - "Replaced pnpm/action-setup@v4 with corepack for Gitea Actions compatibility", - "Added prisma generate postinstall to apps/api for CI type-check" - ] -} diff --git a/.planning/STATE.md b/.planning/STATE.md index 95f312b..ac316e1 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -2,16 +2,16 @@ gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone -status: executing -stopped_at: context exhaustion at 76% (2026-06-25) -last_updated: "2026-06-25T09:55:59.913Z" -last_activity: 2026-06-25 -- Phase 06 execution started +status: complete +stopped_at: all phases complete +last_updated: "2026-06-25T12:00:00.000Z" +last_activity: 2026-06-25 -- Phase 06 all plans complete progress: total_phases: 6 - completed_phases: 4 + completed_phases: 6 total_plans: 24 - completed_plans: 22 - percent: 67 + completed_plans: 24 + percent: 100 --- # Project State @@ -25,12 +25,12 @@ See: .planning/PROJECT.md (updated 2026-06-18) ## Current Position -Phase: 06 (desktop-client-ci-cd) — EXECUTING +Phase: 06 (desktop-client-ci-cd) — COMPLETE Plan: 3 of 3 -Status: Ready to execute -Last activity: 2026-06-25 -- Phase 06 execution started +Status: All plans complete +Last activity: 2026-06-25 -- Phase 06 complete (CI green, AppImage built) -Progress: [████████░░] 86% +Progress: [██████████] 100% ## Performance Metrics @@ -115,6 +115,6 @@ Items acknowledged and carried forward from previous milestone close: ## Session Continuity -Last session: 2026-06-25T09:55:59.905Z -Stopped at: context exhaustion at 76% (2026-06-25) +Last session: 2026-06-25T12:00:00Z +Stopped at: All 6 phases complete — v1.0 milestone done Resume file: None diff --git a/.planning/phases/05-dashboard-calendar/.continue-here.md b/.planning/phases/05-dashboard-calendar/.continue-here.md deleted file mode 100644 index c9bbd51..0000000 --- a/.planning/phases/05-dashboard-calendar/.continue-here.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -context: phase -phase: 05-dashboard-calendar -task: null -total_tasks: null -status: complete -last_updated: 2026-06-24T20:40:58.014Z ---- - - -Phase 05 Dashboard & Calendar is COMPLETE. All 5 plans executed, verified, and approved by human. -ROADMAP status updated to Complete. No remaining work in this phase. - - - - -Session Work (2026-06-24): -- Plan-phase finalized: checker verification, wave fix (05-04 wave 3→4, 05-05 wave 4→5), ROADMAP corrected (was showing 4 plans, Phase 6 had stale 05-xx refs), all gates passed (10/10 reqs, 22/22 decisions, 32/32 gap analysis) -- 05-01 executed: Dashboard foundation — Prisma models, CRUD API, react-grid-layout grid, ClockWidget, widget-registry, Zustand store, settings shell, header link, i18n (5 commits) -- 05-02 executed: Search + Notes widgets, SearchProvider backend, widget settings panel (5 commits, session limit interrupted — continued with fresh agent) -- 05-03 executed: Calendar backend — CalendarSource model, AES-256-GCM CryptoService, CalDAV/ICS/Exchange providers, event aggregation with cache (5 commits) -- 05-04 executed: Calendar frontend — calendar widget, settings UI, API client (5 commits) -- 05-05 verified: Pre-flight (46 tests green, tsc clean), human checkpoint approved after 2 fixes -- Fix: CALENDAR_ENCRYPTION_KEY dev default added to docker-compose.yml -- Fix: i18n flat dot-keys converted to nested structure for next-intl compatibility - - - -No remaining work for Phase 05. Next milestone work: -- Phase 06: Desktop Client & CI/CD (not yet planned — run /gsd-plan-phase 06) - - - -- Worktree isolation degraded to sequential (origin/HEAD unresolvable) — all plans ran sequentially on main tree -- CALENDAR_ENCRYPTION_KEY: generated dev default hardcoded in docker-compose.yml fallback (production should use .env) -- i18n structure: converted flat dot-keys to nested objects (next-intl requires nested for useTranslations namespace scoping) - - - -None. - - -## Infrastructure State -- Docker stack running (api healthy, db healthy, web up) -- CALENDAR_ENCRYPTION_KEY set via docker-compose.yml dev default -- 46 web tests passing, API tsc clean - - -Run `/gsd-plan-phase 06` to plan Phase 6: Desktop Client & CI/CD (Tauri wrapper + Gitea integration). - diff --git a/.planning/phases/06-desktop-client-ci-cd/.continue-here.md b/.planning/phases/06-desktop-client-ci-cd/.continue-here.md deleted file mode 100644 index eb71348..0000000 --- a/.planning/phases/06-desktop-client-ci-cd/.continue-here.md +++ /dev/null @@ -1,49 +0,0 @@ -# Continue Here — Phase 06: Desktop Client & CI/CD - -**Paused:** 2026-06-25T10:36Z -**Resume:** `/gsd-execute-phase 6` - -## Current State - -### Plan 06-01: Tauri Desktop Wrapper ✅ COMPLETE -- Toolchain installed (rustc 1.96.0, WebKitGTK 2.52.3) -- apps/desktop scaffolded as @tessera/desktop, cargo check passes -- First-run setup.html with server URL persistence -- Commits: 48e3a69, d944aaa, f41e673 - -### Plan 06-03: Gitea CI/CD ⏳ IN PROGRESS (Task 4/4) -- Gitea user `schalli` created, repo `schalli/tessera-ctl` (private) -- Remote: `origin` → `https://git.vicolab.de/schalli/tessera-ctl.git` (token in URL) -- act_runner: existing Docker container reused (gitea-docker-runner-1, v0.6.1) -- docker-compose.ci.yml + docs/ci-cd-setup.md created (c0e3293) -- .gitea/workflows/ci.yml created (756925b) -- **CI fixes pushed:** corepack statt pnpm/action-setup (e5d45e1), prisma generate postinstall (faff50b) -- **Pending:** Run #87 Ergebnis pruefen — type-check sollte jetzt passen - -### Plan 06-02: Native Desktop Features ❌ NOT STARTED (Wave 2) -- Depends on 06-01 (complete) -- Tray, close-to-tray, window-state, autostart, notifications, version check, icons, bundles - -## Human Actions Before Resume - -1. Check Pipeline Run #87: https://git.vicolab.de/schalli/tessera-ctl/actions -2. If still failing, paste the error — likely needs another CI fix - -## Key Infrastructure - -- **Gitea:** https://git.vicolab.de — User: schalli, Token in git remote URL -- **Runner Token:** SK5NCGjVMTxg6NYleLeOlc3qAuLrDxbvlENGIixJ -- **MCP Token:** cdfaa3668ec21439bc6acd2243abd6df701177e8 (updated in .claude.json, needs restart to take effect) - -## Uncommitted Files - -- .planning/STATE.md (modified) -- apps/desktop/src-tauri/Cargo.lock (untracked, should be committed) -- apps/desktop/src-tauri/gen/ (untracked, Tauri generated) - -## Critical Anti-Patterns - -| Anti-Pattern | Severity | Detail | -|-------------|----------|--------| -| pnpm/action-setup incompatible with Gitea Actions | advisory | Use corepack instead — already fixed | -| Prisma types missing in CI | advisory | postinstall added — verify Run #87 | diff --git a/.planning/phases/06-desktop-client-ci-cd/06-02-SUMMARY.md b/.planning/phases/06-desktop-client-ci-cd/06-02-SUMMARY.md new file mode 100644 index 0000000..5f8cf50 --- /dev/null +++ b/.planning/phases/06-desktop-client-ci-cd/06-02-SUMMARY.md @@ -0,0 +1,87 @@ +--- +phase: 06-desktop-client-ci-cd +plan: 02 +subsystem: desktop +tags: [tauri, tray, autostart, window-state, notification, version-check, appimage] + +requires: + - phase: 06-desktop-client-ci-cd + plan: 01 + provides: Tauri scaffold with server URL persistence +provides: + - System tray with close-to-tray behavior + - Window state persistence (size/position) + - Autostart plugin registration + - Startup version check with native notification + - GET /health/version API endpoint + - AppImage production bundle +affects: [desktop user experience, API health module] + +tech-stack: + added: [tauri-plugin-notification, tauri-plugin-autostart, tauri-plugin-window-state, reqwest] + patterns: [close-to-tray, prevent-exit, async-version-check] + +key-files: + modified: + - apps/desktop/src-tauri/src/lib.rs + - apps/desktop/src-tauri/Cargo.toml + - apps/desktop/src-tauri/capabilities/default.json + - apps/api/src/health/health.controller.ts + created: + - apps/desktop/src-tauri/icons/icon.png + - apps/desktop/src-tauri/icons/icon.ico + - apps/desktop/src-tauri/icons/128x128.png + +key-decisions: + - "Both prevent_close (CloseRequested) AND prevent_exit (ExitRequested) per Pitfall 2" + - "Async version check via reqwest — non-blocking, fire-and-forget" + - "German tray labels: Oeffnen / Beenden" + - "ImageMagick for icon generation (tauri icon not available headless)" + - "NSIS target configured but only AppImage built (no Windows cross-compile toolchain)" + +patterns-established: + - "Close-to-tray: on_window_event hide + prevent_close, RunEvent::ExitRequested prevent_exit, tray quit -> app.exit(0)" + - "Version check: spawn async task in setup, GET {server_url}/health/version, compare CARGO_PKG_VERSION" + +requirements-completed: [DESK-01, DESK-02] + +duration: 8min +completed: 2026-06-25 +--- + +# Phase 06 Plan 02: Native Desktop Features Summary + +**Tray, close-to-tray, window-state, autostart, version check, branded icons, AppImage bundle** + +## Performance + +- **Duration:** 8 min +- **Commit:** c65ada0 +- **Tasks:** 4 completed (3 auto + 1 build verification) +- **Files modified:** 4, icons generated: 3 + +## Accomplishments + +- API GET /health/version endpoint (public, no auth) +- Tray icon with context menu (Oeffnen/Beenden) and left-click show +- Close-to-tray with both prevent_close and prevent_exit guards +- Window state persistence via tauri-plugin-window-state +- Autostart plugin registered with capability permissions +- Async startup version check with native notification on mismatch +- Tessera-branded icon (yellow T on dark bg, OKLCH palette) +- AppImage built: Tessera_0.0.1_amd64.AppImage + +## Deviations from Plan + +- Icons generated with ImageMagick instead of `tauri icon` (headless environment) +- NSIS bundle configured but not built (no Windows cross-compile toolchain on Linux host) + +## Self-Check: PASSED + +- cargo check passes with all 4 plugins +- API type-check passes +- AppImage produced at target/release/bundle/appimage/ + +--- +*Phase: 06-desktop-client-ci-cd* +*Completed: 2026-06-25*