Commit Graph

877 Commits

Author SHA1 Message Date
Test
458898f632 fix: suggested property slots now reliably open editor after click
Replace setTimeout-based editingKey activation with a useEffect that
watches propertyEntries. When the newly added property appears in
propertyEntries (after the async backend write completes), the effect
sets editingKey, ensuring the editor/picker opens regardless of timing.

The old setTimeout(fn, 0) approach raced with the async frontmatter
write — editingKey was set before the property existed in the DOM,
so the editing state had no matching PropertyRow to activate.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:31:51 +02:00
Test
c0df2124ff fix: sync custom properties to VaultEntry on frontmatter changes
View filters that reference custom properties (e.g. "Trashed", "Priority")
were not reactively updating because contentToEntryPatch and
frontmatterToEntryPatch only synced known fields (type, status, etc.)
to the VaultEntry. Custom frontmatter keys were silently dropped.

Now frontmatterToEntryPatch produces a propertiesPatch for unknown keys,
and contentToEntryPatch includes them in the properties field. This
ensures evaluateView sees up-to-date custom property values when
re-filtering the note list.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:10:02 +02:00
Test
f02bb68021 feat: add note count chips to sidebar view entries
Each view in the sidebar now shows a count chip displaying the number of
notes matching its filters, consistent with type section count chips.
Count updates reactively as vault entries change.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 15:29:54 +02:00
Test
94d07f0d47 fix: stabilize flaky SearchPanel keyboard tests with act() wrapping
Wrap fireEvent.keyDown calls in act() and assertions in waitFor() so
React state updates flush before checking side effects.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:41:59 +02:00
Test
e366c84b65 fix: add hasH1 to mock entries for build compatibility
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 13:22:38 +02:00
Test
7daf6898c1 feat: auto-rename untitled notes + Rust title resolution tests
- Add auto_rename_untitled Rust command: one-shot rename of untitled-*
  files based on H1 heading, with collision handling (-2, -3)
- Wire auto-rename into frontend save flow (useAppSave.ts)
- Update Rust tests: extract_title now uses H1 > frontmatter > filename
- Add extract_h1_title tests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 13:14:43 +02:00
Test
377a3f8d0e feat: H1-as-title — title resolution, TitleField hiding, breadcrumb filename
- Rust: extract_title now prioritizes H1 > frontmatter > filename
- Rust: add has_h1 field to VaultEntry for frontend TitleField control
- Frontend: hide TitleField + icon picker when note has H1 in body
- Frontend: breadcrumb shows filename stem instead of display title
- Frontend: new notes use untitled-{type}-{timestamp}.md, no title in frontmatter
- CSS: only hide first H1 in BlockNote when TitleField is visible
- Updated all tests for new title resolution and note creation behavior

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 13:08:17 +02:00
Test
901326d06f fix: change AI panel shortcut from Cmd+Option+I to Cmd+Shift+L
The previous shortcut (Cmd+Option+I) conflicted with the editor's
italics shortcut (Cmd+I) on some keyboard layouts. Cmd+Shift+L has
no conflicts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 12:52:25 +02:00
Test
d378e488f1 fix: remove remaining trash navigation command and header title
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 12:27:15 +02:00
Test
e581ad3691 refactor: remove Trash system — delete is now permanent with confirm modal
Remove all vestiges of the abandoned Trash system: trashed/trashedAt fields
from types, frontmatter parsing, sidebar filtering, editor banners, inspector
components, mock data, and all related tests. Delete is already permanent via
useDeleteActions with a confirmation dialog. Notes with trashed:true in
existing vault frontmatter are now treated as normal notes (the flag is
ignored by the parser).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 12:21:56 +02:00
Test
09f7498e86 fix: Cmd+Option+arrow navigation now follows the visible note list order
The keyboard navigation was computing its own note list with hardcoded
sortByModified, which didn't match the actual UI order (Inbox sorts by
createdAt, custom types use configurable sorts, etc.). Now the NoteList
component writes its sorted list to a shared ref that the navigation
hook reads directly, ensuring navigation always matches visual order.

Also fixes navigation not wrapping at list boundaries per spec.

Syncs CodeScene thresholds with current remote scores.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 10:29:27 +02:00
Test
7443b9a468 fix: show Add button immediately in suggested relationship slots
Remove the collapsed/expanded toggle from SuggestedRelationshipSlot so
the InlineAddNote "Add" button with dashed border is visible without
a click. Also change relationship label font-size from font-mono-overline
(10px) to text-[12px] to match property names in the Inspector.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:59:34 +02:00
Test
12f8fad0f0 fix: align suggested property slots with real properties in Inspector
Add text-left to the suggested property button (browsers default buttons
to text-align: center) and remove text-right from the em-dash placeholder
so both label and value columns match the real property row alignment.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:27:08 +02:00
Test
c90b1d6694 fix: add bottom padding to Favorites list matching top padding
Added paddingBottom: 4 to the expanded Favorites list container,
consistent with the ViewsSection pattern. This creates symmetric
spacing above the first and below the last favorite item.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:09:29 +02:00
Test
806b552d47 fix: default sidebar section to Inbox on app launch and vault switch
Changed DEFAULT_SELECTION from 'all' (All Notes) to 'inbox' so the
app always opens on the Inbox section. During a session the user's
navigation is preserved; on next launch or vault switch it resets
to Inbox.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:44:18 +02:00
Test
46106da47a fix: pass forceRawMode through ActiveTabBreadcrumb to BreadcrumbBar
TypeScript error: forceRawMode was set in the props object but not
declared in the ActiveTabBreadcrumb type or forwarded to BreadcrumbBar.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:15:11 +02:00
Test
0051559b8e fix: hide Raw toggle for non-markdown files forced into raw editor
Non-markdown text files (.yml, .yaml, .json, etc.) are already forced
into raw editor mode via effectiveRawMode. This hides the Raw toggle
button in the breadcrumb bar for those files since toggling is not
applicable. Adds tests for classify_file_kind and forceRawMode behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 12:59:19 +02:00
Test
3f19528cb6 fix: wikilink filter values now match frontmatter format with alias support
The FilterBuilder autocomplete now stores wikilinks as [[stem|title]]
(e.g., [[monday-112|Monday 112]]) instead of just [[title]]. The view
filter comparison uses wikilinkEquals() to match any combination of
path and alias parts, so [[monday-112|Monday 112]] matches
[[monday-112|Monday #112]] via the shared path "monday-112".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 12:29:14 +02:00
Test
24e5b537d6 fix: wikilink autocomplete in FilterBuilder no longer clipped by dialog
The dropdown was position:absolute inside a scrollable container with
overflow-y:auto, causing it to be clipped. Now uses createPortal to
render to document.body with position:fixed, escaping the dialog's
overflow. Also adds proper CSS for menu items (font-size 12px, aligned
icon+text, compact padding) via .wikilink-menu--filter modifier.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 11:58:08 +02:00
Test
f8f6e3d003 fix: always show note title in breadcrumb bar when raw/diff mode active
Use prop-driven data-title-hidden attribute in BreadcrumbBar when rawMode or
diffMode is true. This avoids the timing issue where the useEffect DOM mutation
fired after paint with a null ref, causing the title to never appear.

The IntersectionObserver-based scroll detection is preserved for normal editor
mode (title shows in breadcrumb when title section scrolls out of view).
2026-04-05 11:07:53 +02:00
Test
ba9b5c7c31 fix: make Select scroll buttons functional by using overflow-hidden on Content
The SelectContent had overflow-y-auto which caused the browser to handle
scrolling instead of Radix UI's internal scroll mechanism. This made the
SelectScrollDownButton (chevron ▼) non-functional. Changing to
overflow-hidden lets Radix's Viewport manage scrolling, making the
scroll buttons work as intended.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 11:07:02 +02:00
Test
1930e7132b fix: show types with 0 notes in sidebar by iterating typeEntryMap
Types created via "Create Type" now appear in the sidebar immediately,
even before any notes of that type exist. The buildDynamicSections
function now adds all active (non-trashed/archived) type definitions
from typeEntryMap to the active types set, using name === entry.title
guard to avoid duplicate entries from lowercase aliases.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 10:31:47 +02:00
Test
8a51ff5f3c fix: wrap title + editor in editor-content-wrapper for consistent horizontal padding 2026-04-05 10:05:26 +02:00
Test
fe44153ac6 fix: exclude non-markdown files from Inbox view
Added isMarkdown check to isInboxEntry so .yml, .json, and binary files
no longer appear in the Inbox. All other views (All Notes, Archive,
Trash, Sections, Views) already filter by markdown. FOLDERS still shows
all file types.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 04:53:52 +02:00
Test
45249bade4 feat: replace native date picker with shadcn/ui Calendar + Popover in filter builder
Native <input type="date"> replaced with styled Calendar + Popover component
that matches Laputa's design language. Date values serialize to ISO strings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 03:30:46 +02:00
Test
917773bc4c feat: GitHub Desktop-style Changes view — filenames, status icons, auto-diff
In Changes view, the note list now shows:
- Filesystem filename (e.g. `my-note.md`) instead of the note title
- Change type icon on the right: · (modified), + (added/untracked), − (deleted), R (renamed)
- Clicking a file auto-triggers diff mode via the existing diffToggleRef

Other views (Inbox, All Notes, types, folders) are unaffected.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 02:58:26 +02:00
Test
d39d691ccd feat: disable BlockNote/Mantine editor animations and transitions
Adds a scoped wildcard CSS override on .editor__blocknote-container
that sets transition: none and animation: none on all child elements.
Only affects the editor internals — app-wide UI (dialogs, sidebar,
breadcrumb, icon buttons) retains its animations.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 02:17:17 +02:00
Test
98effa9637 fix: resolve TypeScript errors in Sidebar and NoteList
Remove unused entries/selection/onSelect props from TypesSection caller.
Add kind narrowing guard for selection.type access in NoteList.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 01:38:18 +02:00
Test
e966f3a14b feat: remove AI Provider Keys section from Settings
The OpenAI and Google AI key fields were unused — no feature reads them.
Removes the UI section, KeyField component, and all related state/storage
code across frontend (types, hooks, mock handlers, tests) and Rust backend.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 01:34:30 +02:00
Test
4ac2d994c1 feat: reactive vault state — editor changes propagate immediately to all UI
Add title and sidebar_label mappings to contentToEntryPatch so editing
these frontmatter fields in the raw editor immediately updates the note
list, breadcrumb bar, sidebar sections, and inspector.

Also trigger reloadViews() when .yml view files are saved, so sidebar
view names update without a full vault reload.

ADR-0043 documents the reactive update model.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 00:06:52 +02:00
Test
09e8d03851 test: update Sidebar test to match new behavior — types with 0 notes shown
The buildDynamicSections now includes type definitions with 0 instances.
Update the 'does not show section for type with zero active entries' test
to assert the new intended behavior: types with 0 notes appear in the
sidebar as long as their Type definition entry exists (not trashed/archived).
2026-04-04 23:08:39 +02:00
Test
9fa1c52a96 fix: wrap SearchPanel Enter keyDown in act() to prevent flaky test
The 'selects result on Enter' test could fail intermittently because
fireEvent.keyDown(window) fired before the useEffect re-registered
the keyboard handler after results loaded. Wrapping in act() ensures
effects are flushed before the event dispatches.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 22:25:55 +02:00
Test
6b2d34fec4 feat: add organized toggle to breadcrumb bar and command palette
- CheckCircle button in breadcrumb bar toggles _organized property
- Green filled icon when organized, gray outline when not
- Command palette: "Mark as Organized" / "Mark as Unorganized"
- _organized hidden from Properties panel
- Handler follows favorite toggle pattern with optimistic updates

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 20:54:16 +02:00
Test
6693615791 refactor: replace relationship-based inbox logic with _organized property
Inbox now uses an explicit _organized frontmatter property instead of
inferring organization from relationships. This is simpler and gives
users direct control over inbox membership.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 20:45:25 +02:00
Test
e47c653b8b feat: add + button to TYPES header for creating new types
Matches the existing pattern in VIEWS and FOLDERS sections. The button
triggers onCreateNewType which opens the CreateTypeDialog.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 19:49:50 +02:00
Test
60ecc4dd0e fix: use full vault reload after view create/delete for reliable FOLDERS update
The previous approach used reload_vault_entry + addEntry wrapped in a
try/catch, which silently swallowed failures and left the .yml file
invisible in the FOLDERS view. Replace with reloadVault() which does a
full rescan and is guaranteed to include the new/deleted file.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 19:38:39 +02:00
Test
a007b37089 feat: add per-file discard changes in Changes view
Right-click a file in the Changes view to discard its uncommitted changes.
Shows a confirmation dialog before executing. Handles modified (git checkout),
untracked (delete), and deleted (git restore) files. Includes path traversal
safety checks in the Rust backend.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 18:16:52 +02:00
Test
3c4f6ccabd fix: coerce claudeCodeStatus/Version null→undefined for AppCommandsConfig 2026-04-04 16:46:25 +02:00
Test
313b11fb0e fix: add claudeCodeStatus/claudeCodeVersion to AppCommandsConfig (TS error) 2026-04-04 16:40:15 +02:00
Test
2b419b48a0 feat: add Claude Code detected/missing badge to status bar
Uses the existing check_claude_cli Tauri command to detect the claude
binary at app startup and shows a status badge — green/neutral when
found, orange warning when missing with a click-to-install link.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 16:31:05 +02:00
Test
f8d080e678 feat: add body content filter for Views (contains/does not contain)
Adds 'body' as a built-in filter field that searches note snippet text
(case-insensitive). Visually separated from property fields in the
FilterBuilder dropdown with a separator. Combines with other filters via AND.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 16:13:21 +02:00
Test
9f905169cb feat: add suggested property/relationship slots in Inspector
Properties panel shows Status/Date/URL slots as muted clickable rows when
not already present. Relationships panel shows Belongs to/Related to/Has
slots. Clicking a slot adds the property and auto-focuses the value field.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 15:42:10 +02:00
Test
ef0288268c feat: move Info section below Backlinks in Inspector, add Phosphor icon
Reorders Inspector sections to: Properties → Relationships → Backlinks → Info → History.
Extracts NoteInfoPanel into its own component with Info icon matching other section headers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 15:15:43 +02:00
Test
1d3927ca2b fix: rename "Link existing" to "Add relationship" in Inspector
Aligns relationship button label with the "Add property" pattern used
elsewhere in the Inspector panel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 14:45:02 +02:00
Test
f384b6fad3 feat: redesign welcome screen with three vault options
Shows "Create a new vault" (empty + git init), "Open existing vault"
(folder picker), and "Get started with a template" (Getting Started
vault). Adds create_empty_vault Rust command for the new-vault flow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 14:25:52 +02:00
Test
de122ad045 feat: include Type definitions in command palette's dynamic commands
extractVaultTypes now also reads entries where isA === 'Type' and adds
their title, so "New <Type>" commands appear as soon as a Type is
defined — not only after an instance of that type exists.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:55:42 +02:00
Test
9db5f5cbed fix: add listPropertiesDisplay to remaining VaultEntry literals
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 13:05:39 +02:00
Test
13c0802395 fix: add listPropertiesDisplay to mock entries for type check
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 12:59:18 +02:00
Test
4c44f8e966 feat: add type-specific property chips in note list
Parse _list_properties_display from type file frontmatter and render
property/relationship values as chips below note snippets. Add a
SlidersHorizontal config popover in the note list header (sectionGroup
views only) with checkboxes and drag-to-reorder via dnd-kit. Changes
are saved back to the type file's frontmatter immediately.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 12:52:54 +02:00
Test
2b135d208e fix: remove Update channel from Settings, keep only Release channel
Update channel (Stable/Canary) was redundant since builds are flat.
Removed the UI dropdown, canary update logic in useUpdater, and
update_channel field from Settings type (TS + Rust). Release channel
(Alpha/Beta/Stable) remains as the sole selector.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 12:11:26 +02:00