diff --git a/CLAUDE.md b/CLAUDE.md index 8c6c247..344e0ea 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -57,7 +57,7 @@ The GUI uses Svelte 5 runes mode (`$state`, `$derived`, `$effect`, `$props()`). - **Main panel header**: Hamburger + window controls in top bar; list name (large, bold) + kebab below divider (matching task detail layout). Kebab has Rename, Group by due date, Delete completed, Delete list. - **New task**: FAB button opens bottom toast sheet (outside sliding container for fixed positioning). -### Current state (2026-04-01) +### Current state (2026-04-03) - **Phase 1** (Core + CLI): Complete - **Phase 2** (WebDAV sync): Backend done, CLI done, GUI wired (settings auto-populates credentials) @@ -86,7 +86,7 @@ The GUI uses Svelte 5 runes mode (`$state`, `$derived`, `$effect`, `$props()`). - Setup screen with window dragging + "Open Existing Folder" option - Sync status indicators (last-sync time + upload/download counts chip) - Push/pull/full sync mode selection (session-only, in settings) -- Desktop packaging (Linux: AppImage + .deb) +- Desktop packaging (Linux: AppImage + .deb; Windows: MSI) - Tauri desktop-only deps (notify, keyring) feature-gated for Android compilation - Subtask hierarchy: subtask count shown on parent tasks in list, subtask detail via three-panel slide navigation, inline add at top of subtask list (new subtasks prepend), collapsible completed subtasks section, cascade delete (parent deletion removes all subtasks with confirmation warning) - Custom confirmation dialogs (ConfirmDialog component replaces native confirm()) @@ -95,7 +95,7 @@ The GUI uses Svelte 5 runes mode (`$state`, `$derived`, `$effect`, `$props()`). - Workspace retarget/migrate - Search/filter tasks -- Desktop packaging for Windows and macOS +- Desktop packaging for macOS ## Roadmap diff --git a/PLAN.md b/PLAN.md index 2648619..55d432d 100644 --- a/PLAN.md +++ b/PLAN.md @@ -508,15 +508,15 @@ keyring = "3.0" ### Features -- [ ] WebDAV client implementation in core library -- [ ] Credential storage (platform keychain) -- [ ] Bi-directional sync (push/pull) -- [ ] Conflict resolution (last-write-wins) -- [ ] Offline queue for pending operations -- [ ] CLI: `sync --setup` command -- [ ] CLI: `sync --push` command -- [ ] CLI: `sync --pull` command -- [ ] CLI: `sync --status` command +- [x] WebDAV client implementation in core library +- [x] Credential storage (platform keychain) +- [x] Bi-directional sync (push/pull) +- [x] Conflict resolution (last-write-wins) +- [x] Offline queue for pending operations +- [x] CLI: `sync --setup` command +- [x] CLI: `sync --push` command +- [x] CLI: `sync --pull` command +- [x] CLI: `sync --status` command - [ ] Progress indicators for sync operations ### CLI Usage Examples @@ -590,9 +590,9 @@ Workspace: shared ### Deliverables -- [ ] Working WebDAV sync in backend -- [ ] CLI can sync with remote WebDAV server -- [ ] Reliable conflict resolution +- [x] Working WebDAV sync in backend +- [x] CLI can sync with remote WebDAV server +- [x] Reliable conflict resolution - [ ] Tested with Nextcloud, ownCloud --- @@ -726,12 +726,12 @@ WorkspaceConfig { - [x] Group-by-due-date toggle per list (checkmark toggle in list kebab menu) - [x] Subtask hierarchy (expand/collapse, inline add, cascade toggle/delete) - [ ] Search/filter tasks -- [x] Desktop packaging (Linux: AppImage + .deb; Windows/macOS not yet verified) +- [x] Desktop packaging (Linux: AppImage + .deb; Windows: MSI; macOS not yet verified) - [x] File watcher (notify crate, 500ms debounce, auto-reloads UI on external file changes) ### Deliverables -- [x] Functional desktop GUI app (Linux verified, Wayland native) +- [x] Functional desktop GUI app (Linux verified, Windows MSI packaging added) - [ ] Sub-300ms startup time (not yet measured/optimized) - [x] Clean, minimal UI - [ ] Feature parity with CLI @@ -803,15 +803,15 @@ npm run tauri ios build #### Features -- [ ] Gate file-watcher initialization behind `#[cfg(not(mobile))]` -- [ ] Install Android Studio + NDK, configure env vars -- [ ] Add Android Rust targets -- [ ] `npm run tauri android init` (generates `gen/android/`) -- [ ] Confirm `npm run tauri android build` succeeds +- [x] Gate file-watcher initialization behind `#[cfg(not(mobile))]` +- [x] Install Android Studio + NDK, configure env vars +- [x] Add Android Rust targets +- [x] `npm run tauri android init` (generates `gen/android/`) +- [x] Confirm `npm run tauri android build` succeeds +- [ ] Basic smoke test: app launches, workspace setup, create a task - [ ] Set up macOS CI for iOS builds - [ ] `npm run tauri ios init` (generates `gen/ios/`) - [ ] Confirm `npm run tauri ios build` succeeds on CI -- [ ] Basic smoke test: app launches, workspace setup, create a task --- @@ -1011,6 +1011,6 @@ This project is free and open-source software licensed under GPL v3. --- -**Last Updated**: 2026-04-01 -**Document Version**: 4.1 +**Last Updated**: 2026-04-03 +**Document Version**: 4.2 **Status**: Ready to Implement - Milestone-Driven Plan diff --git a/README.md b/README.md index ed4e075..81b641c 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,9 @@ onyx/ ## Project Status - **Phase 1** (Core + CLI): Complete -- **Phase 2** (WebDAV Sync): Backend and CLI complete, GUI partially wired -- **Phase 3** (GUI MVP): In progress — core task CRUD working, UI polished +- **Phase 2** (WebDAV Sync): Complete — backend, CLI, and GUI all wired +- **Phase 3** (GUI MVP): Complete +- **Phase 4** (Mobile): Tauri Android cfg-gated, needs `tauri android init` + build ### Core Library (`onyx-core`) - Data models (Task, TaskList, AppConfig, WorkspaceConfig) @@ -36,8 +37,9 @@ onyx/ - Local storage with repository pattern - Multiple workspace support - Task ordering and grouping +- Subtask hierarchy (parent_id) - WebDAV sync with three-way diff and offline queue -- Platform keychain credential storage +- Platform keychain credential storage (feature-gated for Android) ### CLI (`onyx-cli`) - Workspace management (init, add, list, switch, remove, retarget, migrate) @@ -52,7 +54,17 @@ onyx/ - Drag-and-drop reordering - Sliding lists drawer, settings popup - Workspace switcher with add/remove -- Dark mode +- Dark mode (GNOME-style neutral grays, cyan-blue accent) +- Due date picker/editor with optional time +- Subtask hierarchy with three-panel slide navigation +- Move tasks between lists +- List rename, group-by-due-date toggle, delete completed tasks +- Keyboard shortcuts (Escape priority chain) +- WebDAV setup flow with credential auto-population +- File watcher (auto-reloads on external changes) +- Sync status indicators and push/pull/full mode selection +- Custom confirmation dialogs +- Desktop packaging (Linux: AppImage + .deb; Windows: MSI) ## Development Setup @@ -199,7 +211,7 @@ cargo test -- --nocapture ## What's Next? - **Phase 4**: Mobile support (iOS & Android via Tauri v2 mobile) -- **Phase 5**: GUI advanced features (subtasks, search, date picker) +- **Phase 5**: GUI advanced features (rich markdown editor, search/filter) - **Phase 6**: Mobile polish and platform-specific integrations - **Phase 7**: Google Tasks importer and unique features diff --git a/docs/API.md b/docs/API.md index 30b69ea..a877d4e 100644 --- a/docs/API.md +++ b/docs/API.md @@ -19,6 +19,7 @@ pub struct Task { pub description: String, pub status: TaskStatus, pub due_date: Option>, + pub has_time: bool, // Whether due_date includes a specific time pub created_at: DateTime, pub updated_at: DateTime, pub parent_id: Option, @@ -106,6 +107,8 @@ Configuration for a single workspace. ```rust pub struct WorkspaceConfig { pub path: PathBuf, + pub webdav_url: Option, + pub last_sync: Option>, } ``` @@ -374,6 +377,9 @@ pub enum Error { WorkspaceNotFound(String), ListNotFound(String), TaskNotFound(String), + WebDav(String), + Sync(String), + Credential(String), } ``` diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index d66428d..13cdca5 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -74,7 +74,8 @@ onyx/ │ │ └── lib/ │ │ ├── screens/ # Full-page views │ │ ├── components/ # Reusable UI components -│ │ └── stores/ # Svelte state (app.svelte.ts) +│ │ ├── stores/ # Svelte state (app.svelte.ts) +│ │ └── types.ts # TypeScript type definitions │ └── src-tauri/ # Rust backend (Tauri commands) │ ├── Cargo.toml │ ├── tauri.conf.json