Commit graph

213 commits

Author SHA1 Message Date
Tristan Michael a0c183df82 Hide subtask counter when parent subtask shown
When "show subtasks" is enabled, the UI could display both the parent
subtask and its counter, leading to redundant information. Hide the
subtask counter under a parent subtask when the parent itself is shown
to reduce visual clutter and avoid duplicate counts.

This change ensures a cleaner presentation of tasks and subtasks by
preventing the counter from appearing alongside the visible parent
subtask.
if I drag a task in this mode, I would love to be able to drag it anywhere and have the task update its date

- Added `date: Date | null` to TaskGroup (null = Overdue or No Date, Date = the group's calendar day)
- Cross-group drops now update the task's due_date to the target group's date; preserves time-of-day when has_time is set; clears due_date when dropping into No Date
- Dropping INTO Overdue is still blocked (it's a computed group); dragging OUT of Overdue to any other group works
- Within-group drops still just reorder
Close open submenus when clicking outside

When submenu elements (like the kebab menu or workspace picker) were
open, clicking elsewhere in the app did not close them and allowed
interacting with underlying UI. This change adds a full-screen invisible
overlay element whenever either menu is open that captures outside
clicks and closes the menus, and removes the previous window-level
mousedown handler and related element bindings. This ensures that
clicking outside a submenu only closes it and prevents accidental
interactions with other parts of the app.
Prevent task clicks when closing dropdown menus

When the list menu or workspace picker is open, clicking outside should
close the menu but not also trigger underlying task click handlers. Add
a mouse down handler that closes dropdowns when clicking outside and a
capture-phase click handler that swallows the click immediately after a
menu close to avoid propagation to task elements. This avoids accidental
task activation right after closing a menu.
Prevent clicks reaching background when menus open

Stop clicks on the main task area from interacting with underlying
elements when the workspace picker or list menu are open. Previously a
global mousedown/click handler attempted to close menus and prevent a
single stray click from propagating; this change replaces that logic by
adding overlay divs inside the drawer and task list panels that capture
clicks and close the respective menus. This simplifies interaction
handling and fixes a bug where clicking menu items also triggered task
clicks.
the kebab menu calls the date on tasks a due date, but it's not a due date... it's just a date. can we make sure the codebase, documentation and everything is consistent about this?

- Renamed `due_date` field on Task struct to `date` (Rust, TypeScript, all usages)
- Renamed `group_by_due_date` field on TaskList/ListMetadata to `group_by_date`
- Renamed `set_group_by_due_date`/`get_group_by_due_date` methods to `set_group_by_date`/`get_group_by_date` in repository, Tauri commands, and JS store
- Renamed `with_due_date()` builder method to `with_date()`
- Renamed `parse_due_date` CLI function to `parse_date`
- Updated UI text "Group by due date" → "Group by date" in TasksScreen.svelte kebab menu
- Renamed JS variables `dueDate`/`dueDateHasTime` → `date`/`dateHasTime` in NewTaskInput.svelte
- Updated all test names and assertions across models.rs and repository.rs
- Updated CLAUDE.md documentation to use "date" terminology consistently
2026-04-14 06:51:56 -07:00
SteelDynamite 105ed1ef62
Merge pull request #40 from SteelDynamite/tm-branch-3
Group pending tasks by due date
2026-04-14 15:16:27 +01:00
SteelDynamite 105d46775c
Merge pull request #39 from SteelDynamite/ink-theme-eink-css-cleanup
ink-theme-eink-css-cleanup
2026-04-14 14:31:23 +01:00
Tristan Michael 67eb90c2a0 Introduce windowDecorations enum with three options
Replace the previous boolean systemDecorations with a windowDecorations
enum ("custom", "none", "system") to allow three distinct decoration
modes. Update UI to use a select control in Settings, adapt App.svelte
conditionals to check for the "custom" value when applying custom
borders/rounded styles, and rename localStorage key to persist the new
enum. Also ensure the native system decorations are enabled when the
setting is "system" and export the new setter name setWindowDecorations
in the store.
Enable setting window decorations

Add the "core🪟allow-set-decorations" capability to allow the app
to control window decorations (e.g., system titlebar). This fixes the
issue where the system titlebar was not working by permitting the code
to modify decoration state.

Also ensure the capability list remains properly comma-separated after
insertion.
Add outline support for borderless mode

Allow border outline in non-system decoration modes on Linux. The change
updates the condition for applying the linux-window-border class so the
outline is applied when window decorations are custom or any non-system
mode, enabling an outline for borderless windows while keeping
system-decorated windows unaffected.
Respect borderless mode: remove rounded corners

Remove rounded corners from popups and overlays when window decorations
are disabled. The App component now passes the windowDecorations state
into the root div via a data-decorations attribute, and the CSS adds a
rule that forces square corners for all elements under
[data-decorations="none"] to ensure borderless mode yields true square
UI without rounded popups/toasts.
Do not override button/input/select border-radius in borderless mode

Prevent borderless mode from removing rounded corners on interactive
form elements. The previous selector applied border-radius: 0 to all
descendants, unintentionally flattening buttons, inputs, and selects.
Restrict the rule so it excludes button, input, and select elements to
preserve their expected styling.
Strengthen dropdown drop-shadows

Make the kebab and other dropdown menu shadows more pronounced by
replacing the tailwind shadow-lg class with shadow-2xl across
TaskDetailView.svelte and TasksScreen.svelte. This improves visual
contrast and makes menus stand out more clearly against the background,
addressing the request to make the dropshadow on the kebab menus
stronger.
Use consistent menu shadow class

Replace multiple inline shadow utility classes with a shared
"menu-shadow" class for dropdown and context menus across
TaskDetailView, SettingsScreen, and TasksScreen. This unifies styling,
reduces duplication, and allows easier tweaks to the menu drop-shadow
(potentially addressing blurry rendering) by centralizing the shadow
definition.
Add subtle shadow for dropdown/kebab menus

Soften dropdown/kebab menu appearance by adding a subtle box-shadow
utility and a darker variant for dark mode. Also refine the borderless
mode rule to avoid overriding elements that use rounded-full classes so
those intentional circular controls keep their shape.
Make dropdown buttons square-cornered in borderless mode

Ensure dropdown menu buttons use square corners when decorations are
disabled. The CSS update adds a selector to force border-radius: 0 for
buttons inside .dropdown-menu under [data-decorations="none"]. Several
dropdown container divs across TaskDetailView, SettingsScreen,
TasksScreen, and related components are given a .dropdown-menu class so
the new rule applies consistently and makes dropdown buttons match the
rest of the borderless UI.
when workspace settings is up, can we make it so I can drag the header to move the app around?

- Added data-tauri-drag-region to the header and title in SettingsScreen.svelte so the settings header can be used to drag/move the window
<task-notification>
<task-id>bzp4p2vsp</task-id>
<summary>Monitor event: "Tauri rebuild — Finished or error"</summary>
<event>[Monitor timed out — re-arm if needed.]</event>
</task-notification>


Apply decorations-none class for borderless mode

Ensure the "decorations-none" CSS class is applied/removed on the
document root when window decorations are set to "none" so borderless
mode styles take effect. The CSS selector was also adjusted to
explicitly list rounded utility classes so the rule targets known
rounded elements while keeping dropdown-menu buttons included.
2026-04-14 06:02:30 -07:00
Tristan Michael 6be1ee93c0 on linux, when I click the new task button, the toast and the dimming of the background don't respect the visual borders of the app
- Changed `fixed` to `absolute` positioning in NewTaskInput.svelte backdrop div so the overlay respects the app's visual container bounds on Linux (where a p-2 padded, rounded-xl container creates visual borders)
it looks mostly good now, except that when the toast slides up, it's causing the rest of the app content to jitter

- Added `overflow-hidden` to the outer wrapper div in NewTaskInput.svelte to contain the translate-y-full animation within its own layer and prevent repaint jitter on sibling content
when workspace settings is up, can we make it so I can drag the header to move the app around?

- Added data-tauri-drag-region to the header and title in SettingsScreen.svelte so the settings header can be used to drag/move the window
2026-04-14 06:23:10 -07:00
Tristan Michael f98f8492b5 Group pending tasks by due date
Add grouping of pending tasks into Overdue/Today/Tomorrow/This
Week/Later/No Date buckets when the active list has group_by_due_date
enabled. This provides a grouped view in TasksScreen (section headers,
no drag-and-drop) and a new derived store groupedPendingTasks exported
from the app store to supply the UI. Dated groups are sorted by due_date
while the No Date group preserves the custom order.
Few changes: lets make the date chip red when in the overdue section. In all other sections, lets hide the date chip for individual tasks. Then, for the Later section, lets break that up into individual days.

- Replaced single "Later" group with per-day groups (e.g. "Mon, Apr 20"), each sorted by due_date
- Added `dateChipStyle` prop to TaskItem ("normal" | "overdue" | "hidden"), default "normal"
- Date chip is red (border-red-400 text-red-400) in "overdue" style, hidden in "hidden" style
- TasksScreen passes dateChipStyle="overdue" for Overdue group, "hidden" for all others
Fix date chips and include year in future group labels

Replace dynamic ternary class strings with explicit {#if} blocks for the
date chip so Tailwind v4's scanner picks up the classes and theme tokens
are respected. Use text-danger and border-danger for overdue chips and
proper border/token classes for non-overdue chips to fix the overdue
chip appearance and prevent chips from showing in sections that should
be hidden.

Also include the year in per-day group labels when the date is not in
the current year (e.g. "Mon, Apr 20, 2027") by passing the appropriate
Intl.DateTimeFormat options, so tasks scheduled in future years display
an unambiguous header.
yes (remove This Week, extend per-day grouping to everything beyond tomorrow)

- Removed "This Week" group entirely
- Everything beyond tomorrow now gets a per-day group label (same as what "Later" was doing), giving a consistent Overdue → Today → Tomorrow → [per-day] → No Date structure
Respect manual order within same-day groups

Ensure tasks that fall on the same day keep the user's manual ordering
by using a task_order index as a tiebreaker when sorting. Also add
drag-and-drop group tracking so drags and drops are confined to their
originating group and wire full DnD handlers into the grouped view.

- Use a taskOrderIndex map in sortByDue to break ties when due dates are equal so same-day tasks respect manual order.
- Add dragGroup state and record it on handleDragStart; ignore dragOver/drop events when the event group differs from the originating dragGroup to prevent cross-group drops.
- Reset dragGroup on drag end.
- Wrap grouped TaskItem entries with draggable divs and hook up dragstart/dragover/dragend/drop to match the flat view's DnD behavior.
Update drag-and-drop to set task due dates

Support dragging tasks between date-grouped columns by updating the
task's due_date to the target group's date (or clearing it when dropped
into No Date). Preserve the task's time-of-day when has_time is set,
block dropping into the computed Overdue group, and allow dragging out
of Overdue. Also add TaskGroup.date to the grouping data and expose a
showSubtaskCount prop and optional subtask rendering in the task list
UI.
fix null taskId error when reordering after cross-group drag

- Capture dragId and dragGroup into local variables at the top of handleDrop before any awaits — prevents the race where dragend fires during updateTask and nulls out dragId before reorderTask is called
Allow dragging tasks to update date groups

Add date handling to task groups so dragging a task into another group
updates its due_date. Introduce date: Date | null for TaskGroup (null
represents Overdue/No Date), update cross-group drops to set or clear a
task's due_date based on the target group while preserving time-of-day
for tasks with has_time, and keep within-group drops as reorders. Also
ensure Overdue remains a computed-only target (cannot drop into it)
while allowing dragging out.

Additionally, add GoogleTasks workspace support fields
(WorkspaceMode::GoogleTasks and an optional google_account) and include
the new field in WorkspaceConfig::new to initialize google_account to
None.
2026-04-14 06:01:19 -07:00
Tristan Michael 34d7e8b17d Add Linux system window decorations setting
Expose a per-user setting to toggle system window decorations on Linux
and apply it to the UI and window behavior.

- Add a SettingsScreen option (Linux-only) to toggle "System window decorations" and bind it to the app store.
- Track the preference in app store with persistent localStorage key and getter/setter (setSystemDecorations) that updates the Tauri window decorations via getCurrentWindow().setDecorations().
- Respect the setting when rendering the main App.svelte by disabling rounded corners and custom Linux window border when system decorations are enabled. This change is needed to let Linux users choose native title bar/window chrome for better integration with their desktop environment.
2026-04-14 05:58:17 -07:00
Tristan Michael 31af983640 Add ink theme and remove onyx border class
Add an "Ink" theme for e-ink displays and remove the previously applied
onyx-border class from the App container. The new theme defines
high-contrast monochrome variables, suppresses shadows and decorative
effects, adjusts scrollbars and select options, and adds a subtle
linux-window-border color suitable for e-ink screens. The onyx border
CSS was removed and the App.svelte container no longer toggles the
onyx-border class; the Settings screen now includes the Ink option in
the theme selector.
Remove unnecessary blank line in app.css

Remove an unneeded blank line in the Tauri app stylesheet. The extra
line was left behind when considering a mode elimination and is not
required, so this cleans up the CSS file to keep it tidy and consistent.
2026-04-14 05:27:21 -07:00
SteelDynamite fdc556ddd5
Merge pull request #38 from SteelDynamite/tm-branch-2
tm-branch-2
2026-04-06 17:32:27 -07:00
Tristan Michael 9071f46050 Rename Onyx theme to Black and Gold
Update displayed theme name from "Onyx" to "Black and Gold" in the
settings UI so the theme matches the requested branding. This change
ensures users see the new theme name in the theme selector and aligns
the UI with the prompt to call the theme Black and Gold.
2026-04-06 17:32:00 -07:00
Tristan Michael 58e205a024 Fix visibility of completed checkmarks on onyx theme
Ensure checkmarks under the "completed" state are visible on the
near-white primary background for the onyx theme. The change adjusts
selector scoping so dark text and icons (including elements with
.text-white inside .bg-primary) are explicitly styled with a dark color,
preventing white-on-near-white contrast issues.
2026-04-06 17:30:43 -07:00
Tristan Michael 5756e19ceb Desaturate onyx theme gold tones
Tweak several onyx theme color variables to slightly desaturate the gold
accents so the UI appears less saturated and more balanced. Update text,
option, and FAB colors, hover/background and border RGBA values, and add
a new thicker onyx-border utility for a prominent gold window border.
2026-04-06 17:29:49 -07:00
Tristan Michael b83a54328e Brighten dividers and submenu outlines
Make the divider and submenu outline colors a brighter gold to improve
contrast and visual clarity. Updated CSS variables --color-border-light
and --color-border-dark from a dark brown (#2a2418) to a warmer
gold-brown (#5c4d2e). This change enhances the UI by making separators
and submenu outlines more visible and consistent with the app's gold
text accents.
2026-04-06 17:28:29 -07:00
Tristan Michael 42ef8584ab Make large "+ new task" FAB use text gold
Make the prominent "+ new task" floating action button match the primary
text gold color in the Onyx theme. The FAB previously used the cream
primary color; this change sets its background to #d4bc72 so the button
visually aligns with other gold text elements in the UI.
2026-04-06 17:25:46 -07:00
Tristan Michael c4d6d28e12 Lighten onyx gold shades
Adjust onyx theme gold tones to be slightly lighter and warmer for
improved contrast and visual clarity. This updates primary text,
secondary text, scrollbar, select option text, checkbox borders,
hover/focus highlight backgrounds, and the Linux window border to use
the new lighter gold color values so the UI reads better against dark
surfaces.
2026-04-06 17:25:02 -07:00
Tristan Michael c13fbde1b8 Tweak onyx theme colors to warmer gold tones
Give the onyx theme a warmer, gold-accented look and slightly lighten
deep blacks to improve contrast and legibility. Replace pure white
primary colors with a soft yellow/gold, adjust surface and card blacks
to be a bit lighter, and update related elements (select options,
primary button text, checkbox borders, hover/focus highlights, and Linux
window border) so interactive elements read clearly against the new
palette.
2026-04-06 17:23:25 -07:00
Tristan Michael 973d575b51 feat: add onyx dark theme support
Add onyx theme as a new dark theme option. Register it in the dark
themes set, add the theme option to the settings dropdown, and define
complete color variables and scrollbar styling for the onyx theme.

Also improve sync error handling to gracefully skip upload and conflict
resolution actions when files are missing, preventing sync failures due
to files moved or deleted between action computation and execution.
2026-04-06 17:17:00 -07:00
SteelDynamite c40cf15f08
Merge pull request #37 from SteelDynamite/mobile-iteration
mobile-iteration
2026-04-06 11:35:18 -07:00
Tristan Michael 5e5773d146 fix: add safe area padding to scrollable content
Add safe area padding to scrollable main content areas and
adjust drawer footer padding to prevent content from being
hidden behind notches and home indicators on mobile devices.
This ensures proper spacing on devices with safe area insets.
2026-04-06 11:21:29 -07:00
Tristan Michael c772e3251a fix: add safe area bottom padding to DateTimePicker
Add bottom padding to DateTimePicker component to prevent content
from being obscured by notches or home indicators on mobile devices.
Uses CSS max() function to ensure minimum 0.75rem spacing while
respecting device safe area insets.
2026-04-06 11:21:29 -07:00
Tristan Michael a705a5ca26 feat: add Claude tool hooks configuration
Add .claude/settings.json to configure pre and post tool use
hooks for Edit, MultiEdit, and Write operations. These hooks
integrate with the but CLI to execute validation and cleanup
commands before and after file modifications, and on stop
events.
2026-04-06 11:21:29 -07:00
Tristan Michael 9a9dc80e26 fix: set fixed height on calendar grid
Add content-start alignment and fixed 192px height to the
calendar grid to prevent layout shift when switching between
months with different numbers of weeks. This ensures consistent
spacing and prevents the calendar from changing size based on
the month being displayed.
2026-04-06 11:21:29 -07:00
Tristan Michael e9f7f7ab69 feat: move Onyx header above card and enlarge on setup screen 2026-04-06 11:21:29 -07:00
Tristan Michael 3d65aaf502 feat: left-edge swipe gesture for drawer and back navigation on mobile 2026-04-06 10:30:36 -07:00
SteelDynamite a508879fab
Merge pull request #36 from SteelDynamite/fix-bugs
fix-bugs
2026-04-06 09:37:52 -07:00
Tristan Michael 50800f0c2d feat: add separate sync interval for unfocused state
Introduce a new sync interval configuration for when the app is
in the background, allowing users to set a longer sync period to
reduce resource usage. Replace the fixed focus threshold with
dynamic interval switching based on app focus state. Add
syncIntervalUnfocused setting to the UI with a new background
sync interval selector. Refactor sync interval management into
a restartSyncInterval function to handle both focused and
unfocused intervals consistently.
2026-04-06 09:37:06 -07:00
Tristan Michael f5295b5980 fix: reset tasks and remount screen on workspace change
Reset the tasks array when switching workspaces to prevent stale
task data from persisting. Wrap TasksScreen in a keyed block to
force remounting when the current workspace changes, ensuring a
clean state for each workspace.

Configure line endings to use LF across all files for consistency.
2026-04-06 09:10:36 -07:00
SteelDynamite 8772338e0e
Merge pull request #35 from SteelDynamite/claude/audit-consistency-A816f
Fix documentation and code inconsistencies found during audit
2026-04-06 05:09:27 -07:00
Claude 7c6001291c
Fix documentation and code inconsistencies found during audit
- CLAUDE.md: Fix drawer width unit (80vw -> 80cqi), clarify group-by-due-date
  is toggle-only (sorting not yet implemented), clarify Phase 4 status
- PLAN.md: Fix conflict resolution label (last-write-wins -> remote wins),
  add username to keyring key format, mark fallback credential storage as
  not yet implemented
- sync.rs: Fix comment table to say "conflict" instead of "last-write-wins"
  for both-modified and both-added cases (matches actual Conflict action)
- config.rs: Add temp file cleanup on atomic write rename failure to match
  the pattern already used in storage.rs

https://claude.ai/code/session_01YWvxpzeT3hEUxD9aNvfNuL
2026-04-06 12:08:22 +00:00
SteelDynamite fd1ebce9ce
Merge pull request #34 from SteelDynamite/claude/audit-test-coverage-6gTRR
Add tests for models.rs, error.rs, and repository.rs edge cases
2026-04-06 04:59:01 -07:00
Claude ba7ac15d0c
Add tests for models.rs, error.rs, and repository.rs edge cases
Addresses critical test coverage gaps in onyx-core:
- models.rs: 20 tests for Task, TaskList, TaskStatus (builder, serde, CRUD)
- error.rs: 15 tests for Display impls and From conversions
- repository.rs: 5 new tests for version increment, move_task errors,
  subtask creation, multi-list independence

Total: 122 -> 162 tests passing.

https://claude.ai/code/session_01XiAFtZ7CAvm9FhrNCwAwsr
2026-04-06 11:50:52 +00:00
SteelDynamite 36fa591799
Merge pull request #33 from SteelDynamite/claude/audit-project-report-qoEsr
Fix critical and high-severity issues from project audit
2026-04-06 04:44:32 -07:00
Claude 7eec8e22c8
Add tests for audit fixes: 15 new tests covering security and data integrity
New sync tests:
- validate_sync_path rejects backslashes and .. components
- validate_sync_path allows valid paths
- SyncLock prevents concurrent access
- SyncLock released on drop, lock file cleaned up
- SyncState save leaves no .tmp files
- OfflineQueue save leaves no .tmp files
- parse_frontmatter_for_conflict rejects oversized YAML (>64KB)

New storage tests:
- Deduplication with equal versions uses mtime tiebreaker
- Frontmatter parsing rejects oversized YAML (>64KB)
- Frontmatter parsing accepts normal-sized content
- Version saturates at u64::MAX (no panic or wrap)
- Delete task removes from metadata before file
- atomic_write leaves no .tmp files

https://claude.ai/code/session_01AJoK28N4vqLqzskq6ybGri
2026-04-06 11:09:35 +00:00
Claude 7e9d35d6d6
Update documentation to reflect audit fixes
- CLAUDE.md: Document sync lock, temp cleanup on failure, metadata-first
  deletes, YAML 64KB limit, mtime dedup tiebreaker, saturating version,
  watcher-error event, and accessibility features
- docs/API.md: Add YAML frontmatter row to size limits table, document
  sync lock and delete ordering in sync strategy, update path traversal
  and atomic write descriptions
- PLAN.md: Update version field comment to note saturating behavior

https://claude.ai/code/session_01AJoK28N4vqLqzskq6ybGri
2026-04-06 11:07:29 +00:00
Claude 6174836b7f
Fix critical and high-severity issues from project audit
Security:
- Fix path traversal via backslash bypass in sync validate_sync_path()
- Replace silent HTTP client fallback with proper error propagation
- Add 64KB YAML frontmatter size limit to prevent DoS via crafted files

Data integrity:
- Reorder delete operations: update metadata before removing files to
  prevent orphaned metadata entries on crash
- Fix task deduplication to use file mtime as tiebreaker when versions
  are equal, preventing non-deterministic data loss
- Add rollback on conflict recovery failure (remove orphaned duplicate
  files when metadata update fails)
- Clean up temp files on atomic write rename failure
- Add file-based sync lock to prevent concurrent sync operations
- Use saturating_add for task version to prevent overflow

Error handling:
- Surface move_task rollback failures as structured errors instead of
  silent warnings
- Log WebDAV parallel request failures instead of silently swallowing
- Emit watcher-error events to frontend instead of only printing to stderr

Frontend:
- Fix focus listener leak in auto-sync (clean up if stopAutoSync called
  while promise pending)
- Add prefers-reduced-motion CSS media query for accessibility
- Add ARIA labels, roles, and keyboard handlers to TaskItem, BottomSheet,
  and ConfirmDialog components
- Replace BottomSheet children: any with Snippet type

https://claude.ai/code/session_01AJoK28N4vqLqzskq6ybGri
2026-04-06 11:03:11 +00:00
SteelDynamite bcc301525c
Merge pull request #32 from SteelDynamite/claude/audit-project-geahs
Audit fixes: panic safety, path hardening, code quality
2026-04-06 03:49:14 -07:00
Claude b690aad4d7
Remove stale AUDIT.md
The audit document was significantly outdated — 9 of 12 findings
already fixed in code but still listed as open. Audit findings are
better tracked as actionable code changes than a static document.

https://claude.ai/code/session_01EnSrQsowc64rAwzD9BnJpc
2026-04-06 10:48:50 +00:00
Claude 85748f4c95
Audit fixes: panic safety, path hardening, code quality
- Replace 2 production unwrap() calls in workspace.rs with proper error
  handling to prevent panics on inconsistent state
- Add AppState::save_config() helper to eliminate 11 duplicated
  save_to_file patterns in Tauri lib.rs
- Log file watcher errors instead of silently swallowing them
- Harden path traversal check in storage.rs: re-verify after
  canonicalization to catch symlink escapes
- Add Windows reserved device name handling (CON, NUL, etc.) to
  sanitize_filename
- Clean up stale .tmp files from interrupted atomic writes on startup

All 107 core tests pass.

https://claude.ai/code/session_01EnSrQsowc64rAwzD9BnJpc
2026-04-06 10:41:03 +00:00
SteelDynamite 4de300cb76
Merge pull request #31 from SteelDynamite/claude/audit-docs-quality-5dXc8
Add comprehensive project audit document
2026-04-06 03:22:11 -07:00
Claude e471534b58
Docs: update for new safety features and fix SyncMode enum names
- CLAUDE.md: document atomic writes, input size limits, path validation,
  file download size cap, workspace path validation, taskStack auto-cleanup
- API.md: add Input Validation & Safety section with size limits table,
  atomic writes list, and path safety documentation
- API.md: fix SyncMode enum names (PushOnly/PullOnly -> Push/Pull)
- API.md: add missing on_progress parameter to sync_workspace examples
- Update current state date to 2026-04-06

https://claude.ai/code/session_01F67yfLLmSaBtT7aKKNus1M
2026-04-06 10:20:39 +00:00
Claude a12deb5182
Harden codebase: fix security, quality, and maintainability issues
- Replace dangerous unwrap() with proper error handling (storage.rs, webdav.rs)
- Add atomic writes (temp + rename) for config, sync state, and metadata files
- Add path traversal validation in sync executor
- Add workspace path validation in Tauri commands
- Add input size limits for task titles, descriptions, and list names
- Add file download size limit (10MB) to WebDAV get_file
- Fix move_task rollback to log failures instead of silently ignoring
- Fix JSON serialization unwrap in Tauri create_remote_workspace
- Fix swallowed errors in sync queue backup, metadata writes, sync state load
- Extract hardcoded strings into named constants (filenames, extensions, limits)
- Use REQUEST_TIMEOUT/CONNECT_TIMEOUT constants in WebDAV client builder
- Fix frontend: clear taskStack when viewed task is deleted or list is switched
- Fix frontend: surface credential loading and focus listener errors

https://claude.ai/code/session_01F67yfLLmSaBtT7aKKNus1M
2026-04-06 10:17:30 +00:00
Claude b45f39c96c
Add comprehensive project audit document
Full codebase audit covering security, data integrity, code quality,
testing, frontend, and dependencies. 67 findings identified across
5 severity levels with prioritized recommendations in 4 phases.

https://claude.ai/code/session_01F67yfLLmSaBtT7aKKNus1M
2026-04-06 10:01:11 +00:00
SteelDynamite ee8721e71a
Merge pull request #30 from SteelDynamite/workspace-settings-overhaul
workspace-settings-overhaul
2026-04-05 19:24:27 -07:00
Tristan Michael aac43d77d2 Docs: update frontmatter examples and Task struct for version counter
Remove created/updated timestamps from Task struct docs and frontmatter
examples in PLAN.md, README.md, docs/API.md. Add version field. Update
CLAUDE.md on-disk format section to document version counter, default
behavior for legacy files, and self-healing dedup in list_tasks.
2026-04-05 19:23:52 -07:00
Tristan Michael 5e33416b22 Slim task frontmatter: remove timestamps, add version counter + self-healing dedup
Remove created_at/updated_at from Task struct and frontmatter. Add a
version counter (u64) that increments on every write, defaults to 1 for
old files. list_tasks now groups by UUID and auto-deletes stale
duplicates (keeping highest version), preventing sync-induced dupes from
surfacing in the UI. has_time and parent are omitted from frontmatter
when false/null.

Update CLI, Tauri frontend types, and Svelte components to match.
2026-04-05 19:22:10 -07:00
Tristan Michael eaab66609c Docs: update all markdown files to reflect workspace-settings-overhaul changes
Update CLAUDE.md, PLAN.md, README.md, docs/API.md, and docs/DEVELOPMENT.md
to reflect UUID-keyed workspaces, checksum-based conflict resolution,
auto-sync lifecycle, tauri-plugin-credentials, .onyx-workspace.json rename,
and new GUI features (remote folder browsing, workspace rename, sync
interval, loading screen, safe area insets, task dedup).
2026-04-05 19:21:54 -07:00
Tristan Michael 7cc899470f Polish: suppress error banner for transient sync failures and sort remote folders
Only show the error banner for non-transient sync failures; connectivity
issues (timeout, refused, unreachable) just update the status dot. Sort
workspace entries above regular folders in the remote folder browser.
2026-04-05 19:11:10 -07:00
Tristan Michael fbf1ba69ef Fix task list UX: deduplicate tasks and clear on list switch
Deduplicate tasks by ID in loadTasks since sync conflicts can produce
files with the same UUID. Clear the task array immediately on list
switch to prevent showing stale content from the previous list.
2026-04-05 19:10:57 -07:00
Tristan Michael 2c52afa8d7 Add initial sync loading screen for new WebDAV workspaces
Show a spinner while the first sync runs after adding a WebDAV workspace
so the user doesn't land on an empty task list. The screen transitions
to tasks only after sync completes or fails.
2026-04-05 19:10:49 -07:00
Tristan Michael ca52ed9fee Rework safe area insets with CSS variables and per-element spacers
Replace container-level env(safe-area-inset-*) inline padding with
--safe-top/--safe-bottom CSS variables applied per-element: drawer,
task list panel, detail panels, FAB, settings overlay, error banner,
and setup screen. Wrap task list in {#key app.activeListId} to force
re-render on list switch (co-located with FAB safe-bottom fix).
2026-04-05 19:10:37 -07:00