mirror of
https://github.com/PR0M3TH3AN/SeedPass.git
synced 2025-09-09 07:48:57 +00:00
8.7 KiB
8.7 KiB
SeedPass v2 Roadmap — CLI → Desktop GUI
Guiding principles
- Core-first – a headless, testable Python package (
seedpass.core) that is 100 % GUI-agnostic.- Thin adapters – CLI, GUI, and future mobile layers merely call the core API.
- Stateless UI – all persistence lives in core services; UI never touches vault files directly.
- Parity at every step – CLI must keep working while GUI evolves.
Phase 0 • Tooling Baseline
| # | Task | Rationale |
|---|---|---|
| 0.1 | ✅ Adopt poetry (or hatch) for builds & dependency pins. |
Single-source version + lockfile. |
| 0.2 | ✅ GitHub Actions: lint (ruff), type-check (mypy), tests (pytest -q), coverage gate ≥ 85 %. | Prevent regressions. |
| 0.3 | ✅ Pre-commit hooks: ruff –fix, black, isort. | Uniform style. |
Phase 1 • Finalize Core Refactor (CLI still primary)
Most of this is already drafted – here’s what must ship before GUI work starts.
| # | Component | Must-have work |
|---|---|---|
| 1.1 | kinds.py registry + per-kind handler modules |
import-safe; handler signature (data,fingerprint,**svc) |
| 1.2 | StateManager |
JSON file w/ fcntl lock keys: last_bip85_idx, last_sync_ts |
| 1.3 | Checksum inside entry metadata | sha256(json.dumps(data,sort_keys=True)) |
| 1.4 | Replaceable Nostr events (kind 31111, d tag = "{kindtag}{entry_num}") |
publish/update/delete tombstone |
| 1.5 | Per-entry EntryManager / BackupManager |
Save / load / backup / restore individual encrypted files |
| 1.6 | CLI rewritten with Typer | Typer commands map 1-to-1 with core service methods; preserves colours. |
| 1.7 | Legacy index migration command | seedpass migrate-legacy – idempotent, uses add_entry() under the hood. |
| 1.8 | bcrypt + NFKD master password hash | Stored per fingerprint. |
Exit-criteria: end-to-end flow (
add → list → sync → restore) green in CI and covered by tests.
Phase 2 • Core API Hardening (prep for GUI)
| # | Task | Deliverable |
|---|---|---|
| 2.1 | Public Service Layer (seedpass.api) |
Facade classes:VaultService, ProfileService, SyncService – no CLI / UI imports. |
| 2.2 | Thread-safe gate | Re-entrancy locks so GUI threads can call core safely. |
| 2.3 | Fast in-process event bus | Simple pubsub.py (observer pattern) for GUI to receive progress callbacks (e.g. sync progress, long ops). |
| 2.4 | Docstrings + pydantic models | Typed request/response objects → eases RPC later (e.g. REST, gRPC). |
| 2.5 | Library packaging | python -m pip install . gives importable seedpass. |
Phase 3 • Desktop GUI MVP
| # | Decision | Notes |
|---|---|---|
| 3.0 | Framework: PySide 6 (Qt 6) | ✓ LGPL, ✓ native look, ✓ Python-first, ✓ WebEngine if needed. |
| 3.1 | Process model | Same process; GUI thread ↔ core API via signals/slots. (If we outgrow this, swap to a local gRPC server later.) |
| 3.2 | UI Skeleton (milestone “Hello Vault”) | |
| – | LoginWindow |
master-password prompt → opens default profile |
| – | VaultWindow |
sidebar (Profiles, Entries, Backups) + stacked views |
| – | EntryTableView |
QTableView bound to VaultService.list_entries() |
| – | EntryEditorDialog |
Add / Edit forms – field set driven by kinds.py |
| – | SyncStatusBar |
pulse animation + last-sync timestamp |
| 3.3 | Icons / theming | Start with Qt-built-in icons; later swap to SVG set. |
| 3.4 | Packaging | PyInstaller --onefile for Win / macOS / Linux AppImage; GitHub Actions matrix build. |
| 3.5 | GUI E2E tests | PyTest + pytest-qt (QtBot) smoke flows; run headless in CI (Xvfb). |
Stretch option: wrap the same UI in Tauri later for a lighter binary (~5 MB), reusing the core API through a local websocket RPC.
Phase 4 • Unified Workflows & Coverage
| # | Task |
|---|---|
| 4.1 | Extend GitHub Actions to build GUI artifacts on every tag. |
| 4.2 | Add synthetic coverage for GUI code paths (QtBot). |
| 4.3 | Nightly job: spin up headless GUI, run sync against test relay, assert no exceptions. |
Phase 5 • Future-Proofing (post-GUI v1)
| Idea | Sketch |
|---|---|
| Background daemon | Optional seedpassd exposing Unix socket + JSON-RPC; both CLI & GUI become thin clients. |
| Hardware-wallet unlock | Replace master password with HWW + SLIP-39 share; requires PyUSB bridge. |
| Mobile companion app | Reuse core via BeeWare or Flutter FFI; sync over Nostr only (no local vault). |
| End-to-end test farm | dedicated relay docker-compose + pytest-subprocess to fake flaky relays. |
Deliverables Checklist
- Core refactor merged, tests ≥ 85 % coverage
seedpassinstalls and passespython -m seedpass.cli --helpseedpass-guibinary opens vault, lists entries, adds & edits, syncs- GitHub Actions builds binaries for Win/macOS/Linux on tag
docs/ARCHITECTURE.mddiagrams core ↔ CLI ↔ GUI layers
When the above are ✅ we can ship v2.0.0-beta.1 and invite early desktop testers.
🔑 Key Takeaways
- Keep all state & crypto in the core package.
- Expose a clean Python API first – GUI is “just another client.”
- Checksum + replaceable Nostr events give rock-solid sync & conflict handling.
- Lock files and StateManager prevent index reuse and vault corruption.
- The GUI sprint starts only after Phase 1 + 2 are fully green in CI.