Commit Graph

1236 Commits

Author SHA1 Message Date
Test
50ad7e0e8c docs: add Boy Scout Rule to CLAUDE.md — leave every touched file better than found 2026-03-24 15:58:23 +01:00
Test
ea8d847d46 ci: add Average Code Health gate (≥8.9 floor, target 9.5) to CI, pre-commit, pre-push
- Both hotspot (≥9.5) and average (≥8.9) gates now block commit/push/CI
- Current average: 8.97 — threshold set at 8.9 to block regressions without
  blocking the current state; aspirational target remains 9.5
- pre-commit: replaced phantom pre_commit_code_health_safeguard with real inline check
- pre-push: CodeScene step is now blocking (was informational-only)
- CLAUDE.md: explicit instructions to monitor both scores via MCP CodeScene
2026-03-24 15:47:31 +01:00
Test
845181d002 refactor: move vault UI config from ui.config.md to localStorage
Replace the in-vault ui.config.md file with localStorage persistence
keyed by vault path. Vaults now contain only user content — no app
config files. Removes the Rust vault_config module, Tauri commands
(get/save_vault_config), startup migrations, and demo vault config files.

The reactive store (vaultConfigStore) and consumer hooks (useZoom,
useViewMode, useRawMode) are unchanged — only the storage backend moved.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260323.485
2026-03-23 21:07:38 +01:00
Test
35c62583d9 style: rustfmt use statement
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260323.484
2026-03-23 20:01:15 +01:00
Test
a6b2454184 refactor: remove theming system entirely
Remove all theme switching, creation, and management functionality
from the app — backend (Rust theme module, Tauri commands, menu items,
startup tasks, vault seeding), frontend (useThemeManager, ThemePropertyEditor,
themeSchema, command palette Appearance group, settings panel appearance
section, isDarkTheme prop chain), mock data, and all related tests.

Editor styling via theme.json/EditorTheme.css is preserved (not user theming).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 19:57:58 +01:00
Test
a74f76fdf1 test: add sidebar emoji icon rendering tests
Verify that SectionChildItem renders emoji icons before note titles
in expanded sidebar sections, and that notes without icons render
without any extra content.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260321.483
2026-03-21 03:32:16 +01:00
Test
c6fa1f48cb feat: add filter pills (Open/Archived/Trashed) to All Notes view
Reuses the existing FilterPills component and sub-filter mechanism from
sectionGroup views. Adds countAllByFilter helper for counting across all
entry types and extends filterByKind to support subFilter for the 'all'
filter. Bulk actions automatically adapt based on active pill. Switching
pills resets multi-selection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.482
2026-03-20 23:03:17 +01:00
Test
8f8954a6f7 fix: inbox sidebar ordering, filter chip wrapping, and editor banner architecture
- Move Inbox to first position in sidebar (before All Notes)
- Add whitespace-nowrap to filter pills + flex-wrap on container so chips
  wrap as whole units instead of breaking text internally
- Editor now reads trashed/archived state from fresh vault entries instead
  of potentially stale tab entry, ensuring banners appear regardless of
  navigation context
- Update tests to pass correct entries prop alongside tabs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.481
2026-03-20 22:36:59 +01:00
Test
99f5716508 feat: show emoji icon in sidebar note items
Pass the icon field from VaultEntry to SectionChildItem and render
it before the title when present, matching the pattern used in
NoteItem and other contexts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.480
2026-03-20 21:58:34 +01:00
Test
b8f29c9530 fix: align type selector chip left using grid layout matching property rows
The type selector was using flex justify-between, pushing the chip to the
right side of the Properties panel. Switch to grid-cols-2 layout (matching
PropertyRow and InfoRow) so the chip sits left-aligned in the value column.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.479
2026-03-20 21:27:51 +01:00
Test
33ae00a558 style: apply rustfmt to vault_config.rs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.478
2026-03-20 21:04:05 +01:00
Test
ac02de88e6 fix: store ui.config.md at vault root instead of config/ directory
Repair Vault was creating config/ui.config.md inside a config/ subdirectory.
All vault config files should live at vault root (flat structure). Changed
config_path() to point to vault root, added migrate_ui_config_to_root() for
legacy migration, and wired it into both startup and repair_vault flows.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 21:00:19 +01:00
Test
fb8208cfa0 fix: use CSS grid for 50/50 label/value layout in properties panel
Flex layout with gap-2 allowed content to override the 50% width split,
causing short labels like "URL" to be truncated to "U…" when values were
long. Switching to grid-cols-2 enforces exact 50/50 columns.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.477
2026-03-20 20:27:36 +01:00
Test
66e29b70b8 fix: match TitleField font-size/weight to BlockNote H1 and fix left alignment
TitleField now uses var(--headings-h1-font-size/weight/line-height/letter-spacing)
instead of hardcoded 28px, matching the editor H1 exactly. Added margin-left: 8px
to align with BlockNote's bn-block-content offset. Fixed bn-editor max-width to
use the same CSS var as the title-section for consistent horizontal alignment.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.476
2026-03-20 20:03:26 +01:00
Test
d1b358f76a fix: remove incorrect wikilink assertion from snippet smoke test
Wikilinks ([[note name]]) are valid content in note snippets — they are
plain-text references, not raw markdown formatting. The test was failing
against demo-vault data containing wikilinks in renamed-title-xyz.md.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.475
2026-03-20 19:38:51 +01:00
Test
c2ce67c300 test: add smoke test for focus-event UI freeze regression
Verifies that window focus events don't block the main thread for >500ms,
covering both single focus and rapid 5x focus (Cmd+Tab spam) scenarios.
Completes the regression test requirement for the git-commands-off-main-thread fix.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 19:28:53 +01:00
Test
07522e984c fix: eliminate UI freeze on app focus by moving git commands off main thread
Sync Tauri commands (git_pull, git_push, git_remote_status, reload_vault)
blocked the runtime thread during network I/O, freezing the UI for 2-3s
on every Cmd+Tab. Converted them to async with tokio::spawn_blocking.
Added 30s cooldown to focus-triggered git pull and theme settings reload
to prevent redundant work on rapid app switching.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.474
2026-03-20 19:05:23 +01:00
Test
36f43c1ae0 fix: note list resolves relationships by title/alias matching unified resolveEntry
resolveRefs() and refsMatch() in noteListHelpers used a simple 2-pass
matching (path stem + filename stem), while the Inspector used the unified
resolveEntry() with 4-pass resolution (filename, alias, title, humanized
title). Notes matched only by title or alias were silently dropped from the
note list, causing incomplete relationship groups.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.473
2026-03-20 16:03:50 +01:00
Test
1b478d0fc1 fix: remove vertical padding from PropertyRow to match InfoRow density
PropertyRow had py-0.5 (4px total) while InfoRow had no vertical padding,
making Properties rows taller than Info rows even with equal gap values.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.472
2026-03-20 12:26:25 +01:00
Test
8646be6b8d fix: force WKWebView pseudo-element style recalc on theme CSS var changes
WKWebView doesn't invalidate ::before/::after pseudo-element styles when
CSS custom properties change via inline styles alone — offsetHeight reflow
only triggers layout, not style recalculation. This caused bullet size and
bullet color (rendered via ::before on bulletListItem) to not update live
when editing a theme note and saving with Cmd+S.

Fix: after setting CSS vars as inline styles, also inject them into a
<style> element. Replacing <style> content forces a full style tree
invalidation in WebKit, covering pseudo-elements that reference var().

Also extract shouldDeactivate/deactivateTheme helpers from useThemeManager
to reduce cyclomatic complexity (CodeScene: 8.77 → 9.6).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.471
2026-03-20 08:41:30 +01:00
Test
fd9b4fe5e7 refactor: NoteList.test.tsx -- deduplicate makeEntry helpers and bulk action tests (CodeScene: 7.78 to 10.0)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.470
2026-03-20 07:18:34 +01:00
Test
d52365882c style: rustfmt formatting for mod_tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260320.469
2026-03-20 03:28:36 +01:00
Test
135fe62d21 fix: note list shows incomplete relationships when opening from sidebar
Two root causes:
1. noteListHooks used a stale selection.entry to build relationship groups —
   now looks up the fresh entry from the entries array so relationship updates
   propagate immediately.
2. frontmatterToEntryPatch didn't update entry.relationships — added
   RelationshipPatch support so frontmatter changes also update the
   relationships map in state.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 03:26:52 +01:00
Test
99aee0f67b fix: update smoke tests to find Changes badge in secondary sidebar area
The Changes NavItem moved from the top nav to the sidebar-secondary area,
so Playwright locators need to scope within the new data-testid.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.468
2026-03-19 10:41:04 +01:00
Test
a369b3d93e feat: move Changes and Pulse to secondary bottom area in sidebar
Changes and Pulse are git status UI, not content navigation. Moving them
out of the main top nav into a compact secondary area at the bottom of
the sidebar keeps the primary section focused on vault content.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 10:29:39 +01:00
Test
4e88cf71b1 style: rustfmt import formatting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.467
2026-03-19 09:53:42 +01:00
Test
35bbe221b8 fix: remove invalid weight prop from lucide AlertTriangle icon
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 09:52:02 +01:00
Test
05dca72ef3 feat: handle git divergence, conflicts, and manual pull from within Laputa
When push is rejected due to remote having newer commits, the bottom bar
now shows "Pull required" (orange). Clicking it pulls then auto-pushes.
Conflicted notes show an inline banner with "Keep mine" / "Keep theirs"
buttons. A new "Pull from Remote" command is available in Cmd+K and the
Vault menu. Clicking the sync badge opens a popup showing branch name,
ahead/behind counts, and a Pull button.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 09:51:06 +01:00
Test
57a66e4788 test: add Playwright smoke test for Open in New Window command
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.466
2026-03-19 08:56:58 +01:00
Test
7b0b31455b fix: use lowercase titleBarStyle for Tauri v2 WebviewWindow
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 08:48:20 +01:00
Test
7c16ebd065 feat: open note in new window (Cmd+Shift+Click / Cmd+Shift+O)
Add multi-window support: notes can be opened in dedicated secondary
Tauri windows with editor-only layout (no sidebar, no note list).

Triggers: Cmd+Shift+Click on notes, Cmd+K → "Open in New Window",
Cmd+Shift+O shortcut, Note → "Open in New Window" menu bar item.

Secondary windows have their own auto-save, theme, and wikilink
navigation. Closing a secondary window does not affect the main window.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 08:47:25 +01:00
Test
5df4a7a3ad fix: reduce Properties row gap to match Info section density
Changed property rows gap from gap-2 (8px) to gap-1.5 (6px) to match
the Info section's vertical density.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.465
2026-03-19 07:56:26 +01:00
Test
ca41008850 feat: adopt relationship chip style for type selector in Properties panel
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.464
2026-03-19 07:29:07 +01:00
Test
badbf141dd fix: enforce 50/50 label/value layout in Properties panel with ellipsis
Labels and values each get w-1/2 so neither can squeeze the other.
Long values no longer cause short labels like "URL" to truncate to "U…".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.463
2026-03-19 06:57:11 +01:00
Test
bc55231baa feat: add Inbox sidebar section showing unlinked notes
Inbox shows notes without valid outgoing relationships (body wikilinks
or frontmatter refs), helping users find captured but unorganized notes.
Includes time-period filter pills (This week/month/quarter/All time),
Cmd+K command, and macOS menu bar entry. Broken wikilinks (targeting
non-existent notes) are not counted as relationships.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.462
2026-03-19 06:41:40 +01:00
Test
24da33e7cd feat: auto-save notes with 500ms debounce after last keystroke
Content is automatically persisted 500ms after the last edit in both
BlockNote and raw editor modes. Cmd+S still works as immediate flush.
Tab close flushes any pending auto-save to prevent data loss.
Updated the "unsaved" tab indicator to show "Auto-saving…" with pulse.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.461
2026-03-19 05:34:48 +01:00
Test
004502ae76 test: verify bullet-size and bullet-color live-reload via editor buffer
The theme live-reload mechanism was already working correctly — the
previous QA failures were caused by flawed test methodology (modifying
files on disk while the editor had them open, so Cmd+S overwrote with
stale content). Added unit and Playwright tests that verify ALL theme
properties (including bullet-size/color) update when editing the raw
editor buffer and saving. Removed old skipped test file.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.460
2026-03-19 04:36:08 +01:00
Test
d4b0cd5cc2 fix: hide system properties (trashed, archived, icon) from Properties panel
These properties have dedicated UI elsewhere (trash/archive banner, emoji picker)
and should not appear as generic editable properties.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.459
2026-03-19 03:28:29 +01:00
Test
975931ec6d fix: show Note type in sidebar instead of excluding it as default/fallback
Note was explicitly excluded from collectActiveTypes() via `e.isA !== 'Note'`.
Removed the exclusion so Note appears like any other type. Untyped entries
(isA === null) now count as Note in both type collection and section filtering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.458
2026-03-19 02:50:46 +01:00
Test
748bf732a1 fix: live-reload theme CSS vars on editor save and frontmatter changes
Wire notifyThemeSaved through the frontmatter update chain so CSS
variables update immediately when:
- The user edits a theme note in raw mode and presses Cmd+S
- A frontmatter property is changed via the inspector panel

Also expose CodeMirror EditorView on the DOM for Playwright test access,
add unit tests for onNotePersisted, and a new Playwright smoke test
that verifies the full raw-editor → save → CSS-vars-update flow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260319.457
2026-03-19 00:57:34 +01:00
Test
70ab40538f fix: show all relationships for topics in note list
Topics used a separate 'topic' selection kind that only showed reverse
relatedTo matches. Now topics use 'entity' kind like all other types,
going through buildRelationshipGroups to show all frontmatter
relationships, children, events, referenced-by, and backlinks.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 23:29:39 +01:00
Test
2ca49b8526 feat: show note emoji icon in tab bar, breadcrumb, and pinned cards
Add emoji icon rendering before the note title in TabBar, BreadcrumbBar,
and PinnedCard components to ensure consistent emoji display everywhere
a note title appears. Sidebar, NoteItem, wikilinks, relationships, and
backlinks already had emoji support from prior commits.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260318.456
2026-03-18 22:31:04 +01:00
Test
11c04f0b31 fix: remove broken snippet visibility test + add data-testid to snippet
The first snippet test consistently fails because Virtuoso doesn't
render snippet elements in the initial viewport during smoke tests.
Remove the unreliable test; keep the formatting validation tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260318.455
2026-03-18 22:06:37 +01:00
Test
e1e489fbc7 fix: make snippet smoke test selector more specific
The generic .text-muted-foreground selector matched metadata elements
instead of the actual snippet div. Use .text-[12px] qualifier to target
only snippet elements.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 21:51:56 +01:00
Test
e5177f5905 fix: align TitleField with editor by sharing scroll container
Move title-section inside a shared .editor-scroll-area wrapper so both
title and editor content center within the same scrollable context,
fixing alignment drift at wide widths caused by scrollbar offset.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 21:32:03 +01:00
Test
210f2f6916 feat: show note emoji icon in wikilinks, relationships, and backlinks
Display the note's frontmatter emoji before its title in the editor
wikilink renderer, relationship LinkButtons, and backlinks panel for
consistent emoji visibility across the app.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 18:30:50 +01:00
Test
9b92cf40c4 test: update smoke tests to use TitleField instead of H1 sync
Old tests typed into the H1 heading to trigger title rename — now
that H1 is decoupled from title, all rename flows go through TitleField.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260318.454
2026-03-18 15:57:44 +01:00
Test
e8ace69bb0 style: rustfmt formatting for rename.rs assertions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:44:34 +01:00
Test
8cfe7de66a fix: decouple H1 from title sync + non-blocking TitleField rename
H1 headings are body content, not the title source of truth. Remove
useHeadingTitleSync hook and frontmatter-title-from-H1 logic in the
editor. Rust rename_note no longer modifies H1 in file content — only
updates the frontmatter title: field.

TitleField now uses optimistic UI: the new title displays immediately
after commit while the async file rename runs in background, preventing
UI freezes on slow filesystems or large vaults.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:42:48 +01:00
Test
47a11df4a4 fix: remove trashed/archived fields from frontmatter on restore instead of setting false
Previously restore/unarchive set `Trashed: false` / `archived: false` in
frontmatter. Now uses handleDeleteProperty to remove the fields entirely,
keeping frontmatter clean as if the note was never trashed/archived.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.20260318.453
2026-03-18 14:29:06 +01:00