Commit graph

181 commits

Author SHA1 Message Date
Tristan Michael d03cc92a53 Use reqwest with rustls-tls and disable default features
Enable rustls TLS support and disable reqwest's default features to
avoid pulling in unwanted native TLS dependencies. This ensures the
application uses rustls for TLS connections and keeps the build more
portable and consistent across platforms.
2026-04-03 10:11:40 -07:00
Tristan Michael ef266f9b0d Relax reqwest features in Cargo.toml
Remove the custom default-features and rustls-tls feature flags for
reqwest in Cargo.toml. This simplifies the dependency specification and
avoids potential TLS configuration or feature mismatch issues that could
make HTTP requests behave unexpectedly (e.g., reachability or URL
formatting issues). The change restores reqwest to its simpler default
feature set to resolve connectivity confusion.
2026-04-03 10:11:40 -07:00
Tristan Michael 2a2e362a8f fix: WebDAV sync — Onyx subfolder, timeouts, error display, light theme 2026-04-03 10:11:40 -07:00
Tristan Michael 12afc91110 feat: setup mode selection, per-workspace settings in kebab menu
Setup screen now offers Local vs WebDAV mode choice with cancel button
when workspaces exist. Settings moved from drawer bottom into workspace
kebab menu, scoped per-workspace. WebDAV section hidden for local
workspaces, theme dropdown replaces dark mode toggle.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 04:02:39 -07:00
Tristan Michael a1e97bc0fe feat: per-workspace theme system with 5 theme options
Replaces in-memory darkMode toggle with persisted per-workspace theme
selection. Adds dark, nord, dracula, and solarized CSS theme definitions.
Theme is applied via data-theme attribute and derived isDark class.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 04:02:39 -07:00
Tristan Michael a60b1a997b feat: add WorkspaceMode (local/webdav) and per-workspace theme to config
Introduces WorkspaceMode enum with local and webdav variants, plus a
theme field on WorkspaceConfig. Adds set_workspace_theme and
add_webdav_workspace Tauri commands. WebDAV workspaces auto-manage
local files in app data dir.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 04:02:39 -07:00
SteelDynamite 4483a6450f
Merge pull request #24 from SteelDynamite/docs/audit-update
docs: audit and update all markdown files to reflect current progress
2026-04-03 11:58:19 +01:00
Tristan Michael 52de450a0f docs: audit and update all markdown files to reflect current progress
Phase 2 (WebDAV sync) and Phase 3 (GUI MVP) are complete but docs still
showed them as in-progress. Phase 4 Android steps 1-4 are done. Windows
MSI packaging was added. Multiple doc inaccuracies fixed: missing Error
variants, stale struct definitions, wrong filenames in directory trees.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 03:52:58 -07:00
SteelDynamite 1b8febcb45
Merge pull request #23 from SteelDynamite/packaging/windows-msi
Packaging/windows msi
2026-04-03 11:50:28 +01:00
Tristan Michael 27e6c07fb3 refactor: rename onyx-tauri to onyx-tasks, add onyx-standalone binary
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 03:48:25 -07:00
Tristan Michael 2a1866112c feat: add MSI to Windows bundle targets
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 03:48:21 -07:00
SteelDynamite 45cfa8e5ec
Merge pull request #22 from SteelDynamite/audit/fixes
audit/fixes
2026-04-02 17:39:00 +01:00
Tristan Michael ab71de9110 docs: update stale documentation after audit fixes
Fix outdated thread safety note in API.md — Storage trait now requires
Send + Sync and Tauri uses Mutex<AppState>. Mark completed Phase 5
features in PLAN.md (subtasks, due dates, move tasks, keyboard shortcuts).
Fix CLAUDE.md formatting.
2026-04-02 09:37:43 -07:00
Tristan Michael 7fde1a09f9 fix: harden frontend — toggle race guard, fresh debounce snapshot, error surfacing
Add toggling guard to TaskItem preventing double-toggle from rapid clicks
or swipes. Fix debounced save in TaskDetailView to read task at timeout
time instead of capturing a stale snapshot at call time. Remove unused
_unlistenFs variable. Surface reorder_task and watch_workspace errors
instead of silently swallowing them.
2026-04-02 09:37:43 -07:00
Tristan Michael 3c11539f02 fix: harden Tauri backend — replace unwrap panics, fix watcher lifecycle, strengthen CSP
Replace all .unwrap() calls on repo with repo_ref()/repo_mut() helpers
that return error strings instead of panicking. Stop the old file watcher
before starting a new one on workspace switch to prevent accumulation.
Add object-src and base-uri directives to CSP.
2026-04-02 09:37:43 -07:00
Tristan Michael e0c7292a7e fix: harden sync safety — conflict backup, timestamp parsing, credential zeroization
Back up local files before overwriting during ConflictRemoteWins so data
is never silently lost. Fix false-positive change detection by parsing
timestamps before comparing (different formats like RFC3339 vs HTTP date
were never equal as strings). Add zeroize crate to zero WebDAV credentials
in memory on drop, preventing exposure in core dumps.
2026-04-02 09:37:43 -07:00
Tristan Michael fa1125bfeb fix: harden core data integrity — move_task rollback, path traversal, migration safety
Add rollback to move_task: if delete-from-source fails after write-to-
destination, clean up the duplicate. Reject list names with path separators
or '..' to prevent traversal; canonicalize() failures now return errors
instead of silently falling back to unchecked paths. Add validation and
rollback to CLI workspace migration: check destination is empty, track
moved files, and reverse on failure.
2026-04-02 09:37:43 -07:00
Tristan Michael de11e0a8c3 chore: remove Flutter GUI entirely, Tauri is the sole frontend
Flutter (apps/flutter/) was at feature parity but maintaining two GUI
frontends doubles effort. Consolidate on Tauri v2 which handles both
desktop and mobile. Remove all Flutter source, config, and documentation
references.
2026-04-02 09:37:43 -07:00
Tristan Michael 0b2abe1b55 chore: remove orphaned bevy-tasks-cli crate
This crate references a non-existent bevy-tasks-core dependency and is
an artifact from the project's predecessor. It is not in the workspace
members list and cannot compile.
2026-04-02 09:35:38 -07:00
Tristan Michael 54836f14e7 fix: improve frontend accessibility, consistency, and resource cleanup
Fix nested interactive elements in TaskItem (button inside button) by
restructuring as div + button with aria-label. Replace native confirm()
with ConfirmDialog for workspace removal. Store fs-changed event unlisten
function for cleanup. Log file watcher errors instead of swallowing them.
Fix var usage to const. Add Firefox scrollbar-width support.
2026-04-02 09:35:38 -07:00
Tristan Michael 056cd8ee49 fix: harden sync file validation and offline queue corruption handling
Restrict is_syncable() to validate path depth: .md files and .listdata.json
must be at depth 2 (inside list dirs), .metadata.json only at depth 1 (root).
Prevents syncing arbitrary files at unexpected depths. Back up corrupted
sync queue files before resetting, and log warnings on parse failures
instead of silently dropping queued operations.
2026-04-02 09:35:38 -07:00
Tristan Michael 3b2cb12272 fix: replace panicking unwrap/expect calls with graceful error handling
Replace .expect() in config path resolution with a fallback default.
Replace all .lock().unwrap() on Tauri AppState mutex with a helper that
converts poisoned locks into error strings. Replace .expect() on Android
app data dir with proper error propagation. Handle LAST_WRITE and WATCHER
global mutex locks gracefully. Propagate subtask cascade delete errors
instead of silently ignoring them.
2026-04-02 09:35:38 -07:00
Tristan Michael 68f1bff93b fix: prevent path traversal, enable CSP, and harden URL domain extraction
Validate that resolved list paths stay within the workspace root to prevent
directory traversal via malicious list names. Enable Content Security Policy
in Tauri config instead of leaving it null. Fix CLI domain extraction to
strip userinfo (user:pass@) from URLs before using as keyring service name.
2026-04-02 09:35:38 -07:00
SteelDynamite 40142cb1ca
Merge pull request #21 from SteelDynamite/remove-flutter
remove flutter
2026-04-02 16:11:05 +01:00
Tristan Michael ddf3829cda remove flutter 2026-04-02 08:10:30 -07:00
SteelDynamite b101c8f28c
Merge pull request #20 from SteelDynamite/tauri-android
Fix Android crash: resolve config path via Tauri app data dir
2026-04-02 16:10:21 +01:00
Tristan Michael e709d6e4f1 Fix Android crash: resolve config path via Tauri app data dir 2026-04-02 07:51:38 -07:00
SteelDynamite 0294711d1d
Merge pull request #19 from SteelDynamite/feat/subtask-ux-overhaul
feat/subtask-ux-overhaul
2026-04-02 15:24:26 +01:00
Tristan Michael b2765a3242 docs: update CLAUDE.md with subtask UX and main panel header changes 2026-04-02 07:22:46 -07:00
Tristan Michael 2f2327e4ca feat: overhaul subtask UX with three-panel navigation, custom confirmations, and main panel header redesign
- Remove subtask expand/collapse foldout from main task list
- Add three-panel slide navigation (task list → task detail → subtask detail) via taskStack
- Create ConfirmDialog component replacing native confirm() dialogs
- Cascade delete: deleting a task with subtasks warns and deletes all children
- Subtask detail view: no nested subtasks, collapsible completed section, inline add at top
- Redesign Move To as inline list in kebab menu (no overflow submenu)
- Main panel header: list name + kebab below divider (matching task detail layout)
- Move list management kebab from drawer to main panel; drawer shows chevrons
- Add Delete Completed to both main panel and subtask kebab menus
- Fix debouncedSave stale reference by snapshotting task before timer
- New subtasks prepend to top of list
2026-04-02 07:22:41 -07:00
SteelDynamite e8500e57f1
Merge pull request #18 from SteelDynamite/claude/review-project-plan-GNI5v
feat: add subtask hierarchy UI to Tauri GUI
2026-04-02 13:54:40 +01:00
Claude f7691e2d80
docs: mark subtask hierarchy as done in PLAN.md and CLAUDE.md
https://claude.ai/code/session_01XWcSekaCAJ7qnr4hN3tgL8
2026-04-02 12:15:24 +00:00
Claude 45b7cc57de
feat: add subtask hierarchy UI to Tauri GUI
Wire up the existing parent_id data model into a full subtask UI:
- Backend: create_task accepts parent_id, cascade delete/toggle for subtasks
- Store: subtask-aware derived state (root tasks only in pending/completed),
  childrenMap for O(1) subtask lookup, createTask accepts parentId
- TaskItem: depth-based indentation, subtask completion counter badge
- TasksScreen: expand/collapse chevron for parent tasks, indented subtask
  rendering with left border, subtasks shown under completed parents
- TaskDetailView: "Add subtask" inline input, subtask list with toggleable
  checkboxes, parent task breadcrumb for subtasks

https://claude.ai/code/session_01XWcSekaCAJ7qnr4hN3tgL8
2026-04-02 12:14:56 +00:00
SteelDynamite aa61f85d5f
Merge pull request #17 from SteelDynamite/tauri-android-gating
tauri-android-gating
2026-04-01 17:49:35 -07:00
Tristan Michael 2c16ee04b5 docs: update CLAUDE.md for Tauri Android gating 2026-04-01 17:48:41 -07:00
Tristan Michael 326ebd83d8 Gate desktop-only deps for Tauri Android compilation
Make keyring optional behind keyring-storage feature in onyx-core.
Make notify/notify-debouncer-mini optional behind desktop feature in Tauri.
Gate all file watcher code behind #[cfg(not(target_os = "android"))].
Provide env-var-only credential fallbacks when keyring is disabled.
2026-04-01 17:35:57 -07:00
SteelDynamite 6aa87b6df9
Merge pull request #16 from SteelDynamite/sync-selective-modes-last-sync-has-time
sync-selective-modes-last-sync-has-time
2026-04-01 01:38:47 -07:00
Tristan Michael 12b500ef6f docs: update CLAUDE.md and PLAN.md to reflect Phase 3 completion
Mark all Phase 3 features complete: has_time, sync status indicators,
push/pull mode, desktop packaging (Linux), and Flutter GUI parity.
Update current state date and feature lists.
2026-04-01 01:38:18 -07:00
Tristan Michael 95ba90d2c1 DateTimePicker: simplify onTap handler for close icon
Remove the redundant call to _done() in the close icon's onTap handler
and simplify the callback to a single-expression setState. The change
keeps behavior focused on hiding the time view (_showTime = false) and
avoids invoking _done() on close, which aligns with the intended UI flow
signaled by the task notification that the Flutter app relaunch
completed successfully.
2026-04-01 01:35:32 -07:00
Tristan Michael d0af0e80a8 Clear time without closing toast
Previously clicking the clear-time button set includeTime to false and
also called done(), which closed the surrounding toast. This change
removes the done() call so clearing the time only clears the time input
state (includeTime = false) without dismissing the toast UI.
2026-04-01 01:33:30 -07:00
Tristan Michael a13008bb71 Separate time toggle from foldout UI
Replace using a foldout state to indicate time presence with an explicit
time section and a simple "Set time" trigger. This makes the UI
semantics clearer (foldouts shouldn't represent function) and mirrors
the Tauri approach: show a compact "Set time" label when time is hidden,
expand inline time controls when shown, and provide a close icon to
dismiss and apply the time. Minor spacing adjustments were applied to
improve alignment.
2026-04-01 01:31:58 -07:00
Tristan Michael 908ac41a6c DateTimePicker: clear time and emit done on unset
Users couldn't clear the time part of a task's due date because the
"clear time" button only toggled includeTime=false without signalling
the picker to finish. Call done() when clearing the time so the picker
closes/emits the updated value, ensuring the task's has_time state is
updated and the UI reflects a date-only value.
2026-04-01 01:29:08 -07:00
Tristan Michael 6ccc167239 Settings: add WebDAV sync UI and syncing backend
Add WebDAV configuration, credential storage/testing, and sync controls
across Flutter UI and Rust API. This implements a stateful Settings
screen with fields to enter server URL, username, and password, plus
Test and Save actions; persist/load credentials and workspace WebDAV URL
via the Rust API; add sync mode selection, a Sync Now action, and a sync
status indicator in Tasks screen; thread has_time through date/time
pickers, new task creation, task detail updates, and task DTOs;
implement async Rust functions for testing connections, storing/loading
credentials, setting workspace WebDAV config, and triggering workspace
sync with a SyncResult mapped back to Flutter; add tokio runtime
dependency. These changes were needed to enable full WebDAV-based
synchronization and provide users controls and feedback for configuring
and running syncs from the Flutter app.
2026-04-01 01:29:08 -07:00
Tristan Michael 39239fadc3 Style: make sync mode dropdown follow dark theme
Ensure the sync mode <select> uses theme-aware background and text
colors so it matches the application's dark theme. The change adds
appearance-none, explicit light-theme surface/text classes and dark:
variants (dark:bg-surface-dark dark:text-text-dark) so the dropdown no
longer appears white in dark mode and conforms to the rest of the themed
UI.
2026-04-01 01:10:45 -07:00
Tristan Michael a7709f80cc chore: restrict bundle targets to appimage and deb, remove bad schema
Remove the incorrect $schema pointing to a NiceGUI URL. Change bundle
targets from "all" to ["appimage", "deb"] to avoid rpm build failures
on machines without rpm tools.
2026-04-01 01:06:10 -07:00
Tristan Michael 70d519de64 feat: sync status indicators and push/pull mode selection
Add workspace_name and mode params to sync_workspace Tauri command.
After each sync, persist last_sync to WorkspaceConfig and save config.
Frontend gains lastSyncResult and syncMode state; triggerSync reloads
config post-sync and stores the result. SettingsScreen shows a sync
direction selector (Full/Push/Pull) and a last-sync status line.
TasksScreen shows an upload/download count chip after sync completes.
2026-04-01 01:06:10 -07:00
Tristan Michael 72475a552a fix: use has_time flag for due date time tracking
Replace the hours==0 && minutes==0 heuristic with an explicit has_time
bool field on Task. Existing files without the field deserialize as false
(date-only), preserving current behavior. Frontend components pass and
receive has_time through DateTimePicker's onchange callback.
2026-04-01 01:06:10 -07:00
SteelDynamite 970ed9aa1d
Merge pull request #15 from SteelDynamite/plan-phase4-mobile-builds
Mobile support: expand plan with Flutter + Tauri details
2026-04-01 01:05:56 -07:00
Tristan Michael 376191aee2 Mobile support: expand plan with Flutter + Tauri details
Clarify mobile phase goals and add concrete, actionable steps to get
both Flutter and Tauri GUIs building on Android and iOS. The update
highlights iOS requiring macOS, lists known blockers (desktop-only
packages and incompatible crates), provides Android/iOS prerequisites
and build commands, and adds feature checklists and deliverables to
guide implementation and CI setup.
2026-04-01 00:59:20 -07:00
SteelDynamite 120b5bf83c
Merge pull request #14 from SteelDynamite/phase3-mvp
phase3-mvp
2026-03-31 13:38:24 -07:00