Commit Graph

759 Commits

Author SHA1 Message Date
Test
bd7feb94e7 docs: add keyboard-first principle — every feature must be testable without mouse 2026-03-01 12:15:06 +01:00
Test
de7b624902 fix: remove http:default capability (plugin not installed) 2026-03-01 12:00:19 +01:00
Test
7e1057482e fix: switch to newly created theme after createTheme (New Theme command had no visible feedback) 2026-03-01 11:55:49 +01:00
Luca Rossi
7aa4bf7efe fix: add http:default capability to allow fetch to external APIs (Anthropic CORS fix) (#157)
Co-authored-by: Test <test@test.com>
2026-03-01 11:49:04 +01:00
Test
6e99bf7d03 fix(test): mock WebSocket in executeToolViaWs test to avoid jsdom/undici unhandled rejection
jsdom's WebSocket implementation internally throws InvalidArgumentError ('invalid onError method')
via undici when a connection fails, causing Vitest to catch it as an unhandled rejection and fail
the test suite. Replace the real WebSocket with a mock that fires onerror via setTimeout,
properly exercising the error path without triggering the jsdom internals.
v0.20260301.220
2026-03-01 11:32:05 +01:00
Luca Rossi
669d473a64 fix: make 'New theme' command work in Tauri app (#156)
Three root causes fixed:
1. _themes/ directory was never auto-seeded for existing vaults -
   list_themes now seeds built-in themes if the directory is missing
2. Creating a theme produced no visible feedback - now switches to
   the newly created theme after creation
3. No live reload when theme files are edited externally - added
   focus-based theme reload so edits are picked up when the window
   regains focus

Also adds seed_default_themes to run_startup_tasks for the default
vault, ensuring themes are available on first launch.

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>
v0.20260228.219
2026-03-01 00:32:32 +01:00
Luca Rossi
ba1404b808 fix: call Anthropic API directly instead of /api/* dev proxy (#155)
The AI panel called /api/ai/agent and /api/ai/chat — relative HTTP
endpoints that only exist in the Vite dev server. In the Tauri app
there is no local HTTP server, so requests failed with "The string
did not match the expected pattern".

Replace with direct calls to https://api.anthropic.com/v1/messages
with proper headers (x-api-key, anthropic-version). Tauri's webview
allows fetch() to external URLs without CORS issues.

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 00:32:18 +01:00
Test
98314c5106 docs: require QA on pnpm tauri dev, not browser mode v0.20260228.217 2026-02-28 23:47:56 +01:00
Test
bac5a911c1 design: merge theming-system frames into ui-design.pen v0.20260228.216 2026-02-28 23:07:22 +01:00
Luca Rossi
67155db9ab feat: vault-native theming system with live reload (#154)
* feat: add theming system design file with 3 frames

Design frames for Settings > Appearance panel, Command Palette
theme switching, and live theme editing flow visualization.

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

* feat: add Rust backend for vault-native theming system

Theme files live in _themes/*.json with colors, typography, and spacing
sections. Vault-level settings (.laputa/settings.json) store the active
theme. Built-in themes (default, dark, minimal) are seeded on vault
creation. All 6 Tauri commands registered: list_themes, get_theme,
get_vault_settings, save_vault_settings, set_active_theme, create_theme.

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

* feat: add frontend theme engine, settings UI, and command palette integration

Wire up useThemeManager hook to load themes via Tauri IPC, apply CSS
custom properties to :root, and support switching/creating themes.
Add Appearance section to Settings panel with color swatches and theme
cards. Register theme switch and create commands in the command registry.

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

* fix: use .to_string() instead of format! for string literal (clippy)

* style: cargo fmt on theme.rs

---------

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:05:14 +01:00
Test
b42a4d3608 fix: resolve TypeScript build errors in AI agent files
Fix const assertion on ternary, unused parameter, and readonly array
assignment that caused tsc to fail during pnpm build.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 22:23:06 +01:00
Test
e29be460c3 feat: wire AiPanel into EditorRightPanel with undo + coverage exclusions
Replace AIChatPanel with AiPanel in EditorRightPanel, pass onOpenNote
for vault navigation. Add partial undo (delete created notes). Add
coverage exclusions for AI agent files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 22:21:42 +01:00
Test
bcfbc8e00e feat: wire AI agent panel to Claude API with tool calling
- Add ai-agent.ts: tool definitions (14 MCP tools), agent loop with
  tool_use handling, WebSocket bridge execution (port 9710)
- Add useAiAgent hook: state machine (idle/thinking/tool-executing/done),
  message management, abort support, undo tracking
- Update AiPanel.tsx: replace mock messages with real hook, add model
  selector, input bar, empty state
- Add /api/ai/agent Vite proxy: non-streaming Anthropic endpoint for
  tool-use loop
- Add design/ai-agent-wiring.pen with state machine diagram

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 22:16:06 +01:00
Luca Rossi
95bcf3b25a fix: resolve wikilink paths and show entry title in Getting Started vault (#153)
* fix: resolve wikilink paths and show entry title in Getting Started vault

- Add path suffix matching in findEntryByTarget() so path-based targets
  like 'note/welcome-to-laputa' match entries at /note/welcome-to-laputa.md
- Add resolveDisplayText() in editorSchema to show entry title instead of raw path
- Priority: pipe display text > entry title > humanized path stem
- 6 new test cases covering path-based matching and color resolution

* style: fix rustfmt formatting in mcp.rs

---------

Co-authored-by: Test <test@test.com>
v0.20260228.214
2026-02-28 22:03:38 +01:00
Luca Rossi
3fff794d9b feat: seed AGENTS.md in Getting Started vault and expose via vault_context MCP tool (#152)
* feat: seed AGENTS.md in Getting Started vault and expose via vault_context MCP tool

Every new Laputa vault now gets an AGENTS.md file in its root, providing
AI agents with vault structure, frontmatter conventions, and relationship
semantics. The vault_context() MCP tool response is extended to include
the AGENTS.md content. Design file with 2 frames showing sidebar placement
and editor view.

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

* style: fix rustfmt formatting in mcp.rs

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>
v0.20260228.213
2026-02-28 21:43:16 +01:00
Luca Rossi
de6023547f feat: auto-initialize git repo on Getting Started vault creation (#151)
* feat: auto-initialize git repo on Getting Started vault creation

When a Getting Started vault is created, automatically run git init,
stage all sample files, and create an initial commit so the vault
starts with a clean git history from the very first moment.

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

* style: fix rustfmt formatting in mcp.rs

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>
v0.20260228.212
2026-02-28 21:37:23 +01:00
Luca Rossi
0effc563dc fix: drag-and-drop images into editor — add drop overlay and copy-to-attachments (#150)
* feat: add copy_image_to_vault Rust command for native drag-drop

Adds a new Tauri command that copies an image file from a source path
(provided by Tauri's drag-drop event) directly into vault/attachments/.
More efficient than base64 encoding for filesystem drag-drop.

Also adds core:webview:allow-on-drag-drop-event permission.

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

* feat: handle Tauri native drag-drop for filesystem images

Listen for Tauri's onDragDropEvent to intercept OS-level file drops
that bypass the webview's HTML5 DnD API. When image files are dropped:
1. Copy to vault/attachments via copy_image_to_vault command
2. Insert image block into BlockNote at cursor position

Also passes vaultPath through Editor → EditorContent → SingleEditorView
so the hook can invoke the Tauri command.

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

* fix: remove nonexistent drag-drop permission from capabilities

The onDragDropEvent API works through core:event:default (included
in core:default), not a separate webview permission.

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

* fix: correct DragDropEvent type handling for 'over' events

Tauri's DragDropEvent discriminated union only provides `paths` on 'drop'
events, not 'over'. Show drag overlay unconditionally on 'over' since we
can't filter by image paths at that stage.

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

* design: drag-drop-images wireframes (idle + drag-over overlay)

* style: rustfmt mcp.rs and image.rs

---------

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>
v0.20260228.211
2026-02-28 21:31:47 +01:00
Luca Rossi
37ac70f720 feat: AI agent panel UI — 3-layer panel with action cards and WebSocket activity hook (#149)
* feat: AI agent panel UI — 3-layer panel with action cards and WebSocket activity hook

* style: rustfmt mcp.rs

---------

Co-authored-by: Test <test@test.com>
2026-02-28 21:30:47 +01:00
Test
222f697873 fix: derive sidebar type sections dynamically from vault entries
Sidebar previously showed all 8 hardcoded BUILT_IN_SECTION_GROUPS regardless
of whether any notes of those types existed in the vault. Now sections are
derived from actual vault entries — only types with ≥1 active (non-trashed,
non-archived) note appear. BUILT_IN_SECTION_GROUPS is retained as metadata
lookup for icons/labels, not as the source of sections to display.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.20260228.209
2026-02-28 20:48:58 +01:00
Test
681554af58 docs: add VISION.md — core principles and long-term direction v0.20260228.208 2026-02-28 20:35:15 +01:00
Luca Rossi
87bce9d4cc 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
Test
248774ed13 style: fix rustfmt formatting in lib.rs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.20260228.206
2026-02-28 20:24:35 +01:00
Test
6363e84402 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
Test
8106eb86a8 test: add spawn_ws_bridge test to push Rust coverage above 85%
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.20260228.205
2026-02-28 20:18:21 +01:00
Test
7feae25d45 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
Test
cc08055e0a 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
Test
c789b49bef 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>
v0.20260228.204
2026-02-28 20:10:20 +01:00
Test
bccc0ceed4 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
b924ec9b95 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>
v0.20260228.203
2026-02-28 20:01:56 +01:00
Test
c56a8c0e7f 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>
v0.20260228.202
2026-02-28 19:44:03 +01:00
Test
c5bcbecf1f ci: trigger release with GitHub Pages updater endpoint v0.20260228.201 2026-02-28 19:40:09 +01:00
Test
5ef4f2d642 fix: serve latest.json via GitHub Pages for auto-updater endpoint 2026-02-28 19:39:34 +01:00
Test
f52ce5c618 fix: expand tilde in vault paths before passing to git and file system ops
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.20260228.199
2026-02-28 19:31:50 +01:00
Test
d83fef67f0 feat: update app icon (green cloud + home) v0.20260228.198 2026-02-28 19:26:23 +01:00
Test
8a91d25395 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
Test
77f76a33a4 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
d8aa615ea3 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>
v0.20260228.196
2026-02-28 17:33:30 +01:00
Test
82dafe9334 feat: update app icon (tree/house cloud design) v0.20260228.195 2026-02-28 14:20:32 +01:00
Test
aff56af6aa design: merge github-oauth-fix frames into ui-design.pen v0.20260228.194 2026-02-28 14:05:05 +01:00
Luca Rossi
4e2fa0d374 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
465a80d3e1 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 ee42731.

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>
v0.20260228.192
2026-02-28 13:33:09 +01:00
Test
ce12e3cd6f 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>
v0.20260228.191
2026-02-28 13:13:42 +01:00
Test
e67eb5e85e 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
Test
c11184b24a ci: trigger release with correct Developer ID certificate v0.20260228.190 2026-02-28 13:11:00 +01:00
Test
ee42731ecc ci: temporarily disable notarization (awaiting new certificate) v0.20260228.189 2026-02-28 13:01:02 +01:00
Test
3c57b0ff1a 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
Test
bd0576c593 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
Test
57f0378bab 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
Test
1ff342ae60 design: merge tags-property-type + zoom-shortcuts frames into ui-design.pen 2026-02-28 12:44:18 +01:00
Test
da55318979 fix: useRef type for debounce timer (TS 5.9 compatibility) 2026-02-28 12:43:18 +01:00