Commit Graph

740 Commits

Author SHA1 Message Date
lucaronin
daae171d6e docs: add VISION.md — core principles and long-term direction 2026-02-28 20:35:15 +01:00
Luca Rossi
324e389fd0 fix: tags in properties — X button doesn't reserve space, fades in on hover without expanding pill (#148)
* fix: tags X button appears on hover without expanding pill width

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: tags in properties — X button doesn't reserve space, fades in on hover without expanding pill

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-28 20:32:58 +01:00
lucaronin
c1a3208485 style: fix rustfmt formatting in lib.rs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:24:35 +01:00
lucaronin
ab4a2437ee fix: shift tab bar right when sidebar+notelist collapsed to avoid traffic lights overlap
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:24:35 +01:00
lucaronin
793c3dceb6 test: add spawn_ws_bridge test to push Rust coverage above 85%
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:18:21 +01:00
lucaronin
2bd9cd91dd docs: update architecture with full MCP server tool surface and auto-registration
- Document all 14 MCP tools with params
- Add auto-registration flow (Claude Code + Cursor configs)
- Document dual WebSocket bridge (tool port 9710, UI port 9711)
- Add Rust MCP module details (spawn, register, upsert)
- Update startup sequence with MCP initialization steps
- Add register_mcp_tools to Tauri IPC commands table

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:18:21 +01:00
lucaronin
d7f1fb31be feat: MCP server foundation with full tool surface and auto-registration
- 14 MCP tools: vault CRUD, search, list, context, link, frontmatter edit, and 4 UI actions
- Auto-registers Laputa in ~/.claude/mcp.json and ~/.cursor/mcp.json on startup
- WebSocket bridge spawned on app start (port 9710 tools, 9711 UI actions)
- Frontend useMcpRegistration hook for vault-aware registration
- Comprehensive tests: 26 vault.js tests covering all 9 exported functions
- Added gray-matter dependency for frontmatter parsing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:18:21 +01:00
lucaronin
9f3c36eade docs: add design file for notes-type-icon-search fix
Shows search results with "Note" type icon and label displayed
consistently alongside other types like Project and Person.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:10:20 +01:00
lucaronin
eb574ca275 fix: show type icon and label for "Note" type in search and autocomplete
The "Note" type was explicitly filtered out with `isA !== 'Note'` in
SearchPanel, NoteAutocomplete, and useNoteSearch, preventing its icon
and label from appearing. Remove this special-casing so all types
display consistently.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:08:55 +01:00
Luca Rossi
cbfcb9d03a fix: show actual type icons in Properties panel TypeSelector (#147)
* fix: parse `type` frontmatter key after is_a→type migration

The migration converts `Is A:` to `type:` in frontmatter, and the
TypeSelector UI writes to key `type`. But the Rust Frontmatter struct
only read `Is A`, so type selection was silently lost after migration
or UI change, falling back to folder inference.

Add serde alias so both `Is A` and `type` keys are parsed. Also add
`type` to SKIP_KEYS so it's not treated as a generic relationship.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: show actual type icons in Properties panel TypeSelector

Replace generic Circle icon with each type's real icon (from
iconRegistry) in the Type dropdown. Icons resolve via getTypeIcon
with custom icon support from Type documents.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 20:01:56 +01:00
lucaronin
75f68a80b4 fix: hide type note from note list, make header clickable to access it
When browsing a type section (e.g. "Book"), the type-defining note
(types/book.md) no longer appears as a PinnedCard in the note list.
Instead, the header title becomes clickable to navigate to the type note.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:44:03 +01:00
lucaronin
e0b8f66bc6 ci: trigger release with GitHub Pages updater endpoint 2026-02-28 19:40:09 +01:00
lucaronin
3e87cd7148 fix: serve latest.json via GitHub Pages for auto-updater endpoint 2026-02-28 19:39:34 +01:00
lucaronin
12f1e1e6e3 fix: expand tilde in vault paths before passing to git and file system ops
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:31:50 +01:00
lucaronin
c2e064000d feat: update app icon (green cloud + home) 2026-02-28 19:26:23 +01:00
lucaronin
fac1fefcf7 feat: type-aware commands in Command Palette (New/List [Type])
Add dynamic "New [Type]" and "List [Type]" commands to the Command
Palette, generated from vault entry types. Typing "new ev" fuzzy-matches
"New Event", typing "list pe" matches "List People".

- extractVaultTypes: scans vault entries for unique isA values
- buildTypeCommands: generates New/List command pairs per type
- pluralizeType: handles Person→People, Responsibility→Responsibilities
- Falls back to default types (Event, Person, Project, Note) when
  vault has no typed notes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:13:29 +01:00
lucaronin
9338356e20 design: command palette type-aware autocomplete mockups
Two frames showing "new ev" and "list pe" autocomplete behavior
in the Command Palette with fuzzy type matching.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 19:06:17 +01:00
Luca Rossi
7a606f0ba6 fix: search results — type icon on left, type label aligned right (#138)
Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 17:33:30 +01:00
lucaronin
184055ccc8 feat: update app icon (tree/house cloud design) 2026-02-28 14:20:32 +01:00
lucaronin
4e93e1ea95 design: merge github-oauth-fix frames into ui-design.pen 2026-02-28 14:05:05 +01:00
Luca Rossi
18cef0b002 fix: inline GitHub OAuth device flow in Connect GitHub modal (#136)
* fix: inline GitHub OAuth device flow in Connect GitHub modal

Previously, clicking "Connect GitHub repo" without a token would redirect
to Settings, forcing the user to authenticate there and then navigate back.
Now the device flow runs directly inside the GitHubVaultModal, showing the
user code and opening the browser inline.

- Extract GitHubDeviceFlow component from SettingsPanel (shared by both)
- Add onGitHubConnected prop to GitHubVaultModal for inline auth
- Update mock defaults to no-token state for testable device flow
- Add tests for inline device flow in modal

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* design: add GitHub OAuth fix wireframes

Three frames showing the fixed modal states:
1. Login button (inline device flow start)
2. Device code waiting (code + URL + spinner)
3. Error/expired state with retry

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:02:38 +01:00
Luca Rossi
074c22286c style: cargo fmt (#135)
* ci: re-enable macOS code signing and notarization

Uncomment the Apple credential env vars in the release workflow
so Tauri's build step signs and notarizes the .app bundle.
This reverses the temporary disable from b03d6df.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* style: cargo fmt

---------

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:33:09 +01:00
lucaronin
9385cbd9f0 fix: use Tauri opener plugin for GitHub OAuth browser launch
Replace window.open() with openExternalUrl() which uses
@tauri-apps/plugin-opener in native mode. Also show the verification
URL in the waiting UI so users can navigate manually, add a copy-code
button, and display a retry button on error/expiry.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:13:42 +01:00
lucaronin
4cf8697812 design: add GitHub OAuth device code UI frames
Two frames showing the device code waiting state (code + copy button +
clickable URL + spinner) and the error state with retry button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:13:42 +01:00
lucaronin
ef3e39785a ci: trigger release with correct Developer ID certificate 2026-02-28 13:11:00 +01:00
lucaronin
b03d6df8a9 ci: temporarily disable notarization (awaiting new certificate) 2026-02-28 13:01:02 +01:00
lucaronin
2aef46709d feat: integrate welcome screen with tests and fix App tests
WelcomeScreen component (14 tests):
- welcome mode: title, buttons, hint, loading, error states
- vault-missing mode: path badge, different button labels

useOnboarding hook (10 tests):
- vault exists → ready, vault missing → welcome
- dismissed + missing → vault-missing
- create vault, open folder, dismiss transitions
- error handling, picker cancellation, command failure fallback

App.test.tsx updated to mock new Tauri commands
(check_vault_exists, get_default_vault_path).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 12:58:21 +01:00
lucaronin
99fcd2775f feat: add Rust backend for Getting Started vault creation
New Tauri commands:
- create_getting_started_vault: creates sample vault with 11 files
  (4 types, 4 notes, 1 project, 1 person, 1 topic)
- check_vault_exists: validates if a vault path exists on disk
- get_default_vault_path: returns ~/Documents/Laputa

Sample notes demonstrate editor formatting, properties, wiki-links,
and relationships — covering all key Laputa features.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 12:57:34 +01:00
lucaronin
54e5b2a5b2 docs: add design file for Getting Started vault welcome screens
Two frames: Welcome Screen (first launch) and Vault Missing Error
(vault path configured but folder deleted). Both follow Laputa design
system colors, spacing, and typography.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 12:57:34 +01:00
lucaronin
33b851c4ab design: merge tags-property-type + zoom-shortcuts frames into ui-design.pen 2026-02-28 12:44:18 +01:00
lucaronin
cc00e7f137 fix: useRef type for debounce timer (TS 5.9 compatibility) 2026-02-28 12:43:18 +01:00
Luca Rossi
fb4896f49f feat: zoom in/out keyboard shortcuts (Cmd+=, Cmd+-, Cmd+0) (#134)
* feat: zoom in/out keyboard shortcuts (Cmd+=, Cmd+-, Cmd+0)

Add zoom control with keyboard shortcuts, native menu items, command
palette integration, and StatusBar zoom indicator with localStorage
persistence (80-150%, 10% step).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: add zoom-shortcuts design file with StatusBar zoom indicator

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* design: zoom-shortcuts — StatusBar zoom indicator + Command Palette entries

---------

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 12:41:57 +01:00
lucaronin
8388029cfb fix: use number | undefined for debounce timer ref (TS strict compat) 2026-02-28 12:38:23 +01:00
Luca Rossi
84c9f26364 feat: add tags (multi-select) property type (#133)
* design: add tags property type wireframes

Three frames showing the Tags multi-select property:
- Display state: colored pills with X to remove, + button to add
- Input state: dropdown with vault suggestions, checkmarks for selected
- Color picker: per-tag color selection row with accent palette

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add tags (multi-select) property type

Adds a new 'tags' display mode for array-valued frontmatter properties.
Includes TagPill components with deterministic color assignment,
inline tag editing with autocomplete from vault-wide values, and
automatic detection for common tag key patterns (tags, keywords,
categories, labels).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: SearchPanel test — fire ArrowDown on document not window

---------

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 12:34:01 +01:00
lucaronin
222a9ff2dd design: merge relationship-x-cosmetic frames into ui-design.pen 2026-02-28 12:09:35 +01:00
Luca Rossi
c3e9804132 fix: useRef type for debounce timer (pre-existing build error on main) (#132)
* design: relationship-x-cosmetic wireframes

* fix: relationship X button appears inline inside pill on hover

X button now renders as a flex child inside the pill (next to the type icon)
instead of being absolutely positioned outside the pill boundary.

- Pill uses inset ring border on hover when bgColor is set
- X appears inline with type icon via flex layout
- Type icon rendered at 50% opacity per design spec
- Updated test selector: .group/link is now the button element itself

* fix: useRef type for debounce timer (pre-existing build error on main)

---------

Co-authored-by: Test <test@test.com>
2026-02-28 12:07:35 +01:00
lucaronin
acd4112c64 fix: remove invalid notarization field from tauri.conf.json (Tauri v2 uses env vars) 2026-02-28 12:03:02 +01:00
lucaronin
89fbe15c9d ci: fix notarization — use Tauri v2 env vars (APPLE_CERTIFICATE + APPLE_SIGNING_IDENTITY) 2026-02-28 11:49:51 +01:00
lucaronin
ce83151e00 ci: trigger release with notarization 2026-02-28 11:32:17 +01:00
lucaronin
3182fbecee ci: add Apple notarization to release workflow (awaiting certificate) 2026-02-28 11:29:57 +01:00
lucaronin
a1ece6f395 feat: sync note title with H1 heading (predictive title)
When the editor's first block is an H1 heading, the note title
automatically stays in sync. Changes are debounced at 500ms.
Manual rename via tab breaks the sync until the tab is switched.

- Show H1 in editor (stop stripping on load, stop reconstructing on save)
- New useHeadingTitleSync hook tracks sync state and debounces title updates
- handleEditorChange keeps frontmatter title: in sync with H1
- Fast path for H1-only content preserves instant new-note interactivity

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:59:05 +01:00
lucaronin
0948bdb4fa fix: property panel responsive layout + status dropdown click regression
- StatusDropdown: change anchor element from <div> to <span> to fix
  invalid HTML nesting inside <span> parents. Browsers auto-correct
  <div> inside <span> by ripping the element out, breaking
  anchorRef.parentElement positioning. JSDOM doesn't auto-correct,
  so tests passed but the real app's dropdown failed to position.

- StatusValue: revert shrink-0 back to min-w-0 so the status pill
  can truncate in narrow panels instead of overflowing.

- PropertyRow: add min-w-0 and gap-2 for proper flex overflow,
  wrap property key in truncate span.

- AddPropertyForm: add flex-wrap, reduce input widths, set
  min-w-[60px] on value inputs for narrow panel support.

- InfoRow/TypeSelector/ReadOnlyType: add min-w-0 and gap-2.

- Tests: increase timeout for 3 Radix Select interaction tests
  that are slow in JSDOM.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:58:23 +01:00
lucaronin
cbbea2c174 fix: properties panel bar height matches breadcrumb bar
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:56:14 +01:00
lucaronin
d889c4f876 fix: search results — type icon on left, type label aligned right
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:55:08 +01:00
lucaronin
e541c1f21f fix: reverse relationships — remove header, arrow prefix, dotted underline on hover
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:55:03 +01:00
lucaronin
c1819c40bb fix: type selector dropdown shows colored icons per type
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:54:37 +01:00
lucaronin
fe79e6131e fix: relationship item input height consistency + X button overlay on hover
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:54:09 +01:00
lucaronin
0cfce651a8 fix: tags X button appears on hover without expanding pill width
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:50:34 +01:00
lucaronin
2f56fad3d7 fix: make new note editor immediately interactive
Extract heading-stripping logic into `extractEditorBody` — fixes a bug
where the regex failed to strip the title heading from newly created
notes (because `splitFrontmatter` left a leading newline that the
regex didn't account for).

Add a fast path in `doSwap` for empty body content: when the body is
empty (common case for new notes), skip the potentially-async
`tryParseMarkdownToBlocks` pipeline entirely and apply a single empty
paragraph block synchronously. This eliminates the multi-second delay
caused by BlockNote's async markdown parser initialization.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:29:28 +01:00
lucaronin
52e1e3f73b fix: multiselect uses only Shift+click; add Cmd+Del/Cmd+E bulk actions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 22:49:29 +01:00