Commit Graph

600 Commits

Author SHA1 Message Date
Luca Rossi
b5f69fa58c Merge pull request #66 from refactoringhq/task/person-mention
feat: person mention — @mention autocomplete linking to Person entries
2026-02-25 16:39:21 +01:00
lucaronin
af2932c918 test: add tests for @mention autocomplete
- 8 unit tests for filterPersonMentions utility
- 6 integration tests for @ trigger in Editor component
- Verifies Person-only filtering, wikilink insertion, type badges

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:31:45 +01:00
lucaronin
f047f8e3c9 feat: add @mention autocomplete for Person entries
- Type @ in editor to trigger person-specific autocomplete
- Filters vault entries to show only Person type notes
- Inserts standard [[Person Name]] wikilink on selection
- Lower query threshold (1 char vs 2) since person list is smaller
- Add 3 more Person entries to mock data for testing
- Reuses existing WikilinkSuggestionMenu component

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:31:45 +01:00
lucaronin
d2cb395f65 design: person-mention wireframes
Three UI states for @mention autocomplete:
- Autocomplete open with person suggestions
- No results state
- After selection showing inserted wikilink

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:31:45 +01:00
Luca Rossi
1d23c1ac05 feat: add optimistic error recovery for note creation (#69)
Note creation was already optimistic (UI updates before disk write) but
errors were silently swallowed. Now if the disk write fails, the
optimistic entry is reverted (tab closed, entry removed) and the user
sees an error toast. Each note creation is independent, so one failure
in rapid Cmd+N presses doesn't affect the others.

- Add removeEntry to useVaultLoader for reverting optimistic adds
- Refactor persistNewNote to return a Promise for error handling
- Extract navigateWikilink, persistOptimistic, createAndPersist,
  and runFrontmatterAndApply helpers to reduce hook complexity
- Add tests for error recovery: single note, type, success path,
  and rapid creation with partial failure
- Code health: 8.93→9.01 (CC fixed: 10→7, primitive obsession improved)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 15:11:59 +00:00
Luca Rossi
d79b677119 fix: relation chips now show type color instead of default blue (#68)
* fix: relation chips now display correct type color instead of default blue

Root cause: resolveRef matched entries by path/filename only, while
wiki-links used findEntryByTarget (title, filename, aliases). When a
wikilink target used the note title (differing from filename), resolveRef
failed → null type → default blue.

Changes:
- resolveRef now calls findEntryByTarget first (title/alias match)
- Default color for typeless notes changed from blue to neutral grey
- TypeSelector passes custom color key from Type entries
- DynamicPropertiesPanel refactored to reduce cyclomatic complexity

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

* design: add before/after visual for relations type color fix

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

* docs: add task completion summary

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 14:02:33 +00:00
Luca Rossi
6e038a5310 refactor: split mock-tauri.ts into focused modules (8.81 → 10.0) (#65)
* refactor: split mock-tauri.ts into focused modules

The monolithic mock-tauri.ts (1927 lines, Code Health 8.8) is now split
into 5 cohesive modules under src/mock-tauri/:

- index.ts (barrel, isTauri, simplified mockInvoke) — 10.0
- mock-content.ts (markdown test data) — 10.0
- mock-entries.ts (VaultEntry[] + bulk generator) — 10.0
- mock-handlers.ts (command handlers + state) — 9.68
- vault-api.ts (vault API detection + proxy) — 10.0

Key improvements:
- mockInvoke complexity reduced from cc=17 to trivial (vault API
  extracted to tryVaultApi, conditional routing via data-driven map)
- save_settings complexity reduced via trimOrNull helper
- All 726 tests pass unchanged, coverage remains above 70%
- Public API surface is identical (no import changes needed)

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

* style: cargo fmt

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:12:23 +00:00
Luca Rossi
a2ed06dcf6 refactor: improve code health in github.rs, mock-tauri.ts, lib.rs (#63)
* refactor: reduce code duplication and assertion blocks in github.rs

Extract shared mock helpers (mock_json, mock_poll, mock_user, mock_list_repos,
mock_create_repo, mock_device_start) to eliminate repeated server setup.
Use PartialEq-based struct comparison for assertion blocks. Remove
redundant CreateRepoResponse struct in favor of GithubRepo.

Code health: 6.49 → 8.54

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

* refactor: reduce complexity in mock-tauri.ts mockInvoke and save_settings

Replace nested if-chains in mockInvoke with data-driven VAULT_API_ROUTES
lookup table and extracted tryVaultApi function. Extract trimOrNull helper
to reduce cyclomatic complexity in save_settings.

Code health: 8.81 → 9.38

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

* refactor: extract startup tasks from run() in lib.rs

Move vault purge and migration logic into run_startup_tasks() with a
shared log_startup_result helper. Eliminates Bumpy Road and Large Method
code smells from the main run() function.

Code health: 9.14 → 9.68

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:31:25 +01:00
Luca Rossi
ae3657d19c refactor: extract hooks from App.tsx to improve code health (#62)
Extract vault management (useVaultSwitcher), git history loading
(useGitHistory), dialog state (useDialogs), and keyboard/command
setup (useAppCommands) into dedicated hooks. App.tsx code health
improves from 8.95 to 10.0 — all extracted hooks also score 10.0.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:31:19 +01:00
lucaronin
2b8e1a5967 design: merge full-text-search frames into ui-design.pen 2026-02-25 00:35:21 +01:00
Luca Rossi
0fd56da5d6 Merge pull request #61 from refactoringhq/task/command-palette
feat: command palette (Cmd+K) — quick actions and navigation
2026-02-25 00:05:11 +01:00
Luca Rossi
7ebaf464cb Merge pull request #60 from refactoringhq/task/autocomplete-flat-list
feat: flat list autocomplete with type badge
2026-02-25 00:05:07 +01:00
Luca Rossi
6e14996301 Merge pull request #59 from refactoringhq/task/word-count-title-fix
fix: exclude title heading and wikilinks from word count
2026-02-25 00:03:55 +01:00
Luca Rossi
6ac505c8c9 Merge pull request #53 from refactoringhq/task/vista-changes-fix
fix: pass modifiedFiles to NoteList so Changes view filters correctly
2026-02-25 00:03:51 +01:00
lucaronin
f7c4e16be9 fix: exclude title heading and wikilinks from word count
countWords() was including the title line (# Heading) in the count,
inflating it by ~2-3 words. Now strips the first H1 heading and
[[wikilinks]] before counting, so only body prose is tallied.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:03:44 +01:00
lucaronin
62c8d0f7a8 fix: pass modifiedFiles to NoteList so Changes view filters correctly
App.tsx passed getNoteStatus but not modifiedFiles to NoteList.
The Changes view uses modifiedPathSet (derived from modifiedFiles) to
filter entries, so it was always empty — showing "no pending changes"
even with modifications present.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:03:40 +01:00
Luca Rossi
b5eb7e4098 Merge pull request #58 from refactoringhq/task/nuova-nota-lenta
fix: debounce Cmd+N to prevent slow note creation on rapid keystrokes
2026-02-25 00:03:00 +01:00
Luca Rossi
08ce58b8e5 Merge pull request #57 from refactoringhq/task/properties-indent
fix: align Type row padding with other property rows in Properties panel
2026-02-25 00:02:56 +01:00
Luca Rossi
a8a72b54d2 Merge pull request #56 from refactoringhq/task/url-text-size
fix: apply text-[12px] to URL values in Properties panel
2026-02-25 00:02:53 +01:00
Luca Rossi
a24a9735c4 Merge pull request #55 from refactoringhq/task/rename-nota-vuota
fix: rename fails on empty notes — handle empty frontmatter block
2026-02-25 00:02:49 +01:00
Luca Rossi
db87806ffc Merge pull request #51 from refactoringhq/task/url-property-click-fix
fix: use Tauri opener plugin for URL property clicks
2026-02-25 00:02:46 +01:00
lucaronin
75f7e4fa4f fix: use Tauri opener plugin for URL property clicks
Replace window.open() with Tauri's opener plugin (openUrl) so that
clicking a URL property in the Properties panel opens the system
browser instead of failing silently or triggering edit mode.

- Install @tauri-apps/plugin-opener (npm + Cargo + capabilities)
- Add openExternalUrl() utility with Tauri/browser fallback
- Add stopPropagation to prevent accidental edit mode activation
- Add double-click guard (500ms debounce via ref)
- Update tests to mock openExternalUrl instead of window.open
- Add explicit test that URL click does not trigger onStartEdit

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:02:09 +01:00
lucaronin
1d0e1284ed fix: debounce Cmd+N to prevent slow note creation on rapid keystrokes
- Add deduplication to handleCreateNoteImmediate to prevent rapid calls from creating multiple notes
- Use pending set to track in-flight create operations
- Tests: rapid triple-call dedup, default type, custom type
- Refs: useNoteActions, useTabManagement, useVaultLoader updated
2026-02-25 00:01:52 +01:00
lucaronin
49704bc76d fix: align Type row padding with other property rows in Properties panel
ReadOnlyType and TypeSelector containers were missing px-1.5, causing the
Type label to sit flush-left while all other property/info rows were
indented 6px.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:01:51 +01:00
lucaronin
49ebc3e71e fix: apply text-[12px] to URL values in Properties panel
The PR #43 text-size reduction missed the UrlValue component — both its
display span and edit input kept the old larger size. Align them with
the 12px used by EditableValue.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:01:50 +01:00
lucaronin
0f4484b28a fix: apply rustfmt formatting 2026-02-25 00:01:48 +01:00
lucaronin
a98b4c6aad fix: use strip_prefix instead of manual slice to satisfy clippy::manual_strip 2026-02-25 00:01:48 +01:00
lucaronin
873fb4d434 wip: fix rename for empty notes + add regression tests (uncommitted on process death) 2026-02-25 00:01:48 +01:00
lucaronin
8a08fb67a3 test: add command palette and fuzzy match tests
Tests for CommandPalette component (rendering, filtering, keyboard
navigation, grouped results, shortcuts display), useCommandRegistry
hook (contextual actions, archive toggle, git availability), fuzzyMatch
utility, and Cmd+K shortcut.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:43:58 +01:00
lucaronin
5d09e32b08 docs: add design file for flat list autocomplete UI
Shows the new flat suggestion menu layout: note titles on the left,
discrete type badges with accent colors on the right, no group headers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:43:21 +01:00
lucaronin
7736d20b9f feat: replace grouped autocomplete with flat list and type badge
Switch wiki-link autocomplete from BlockNote's default grouped suggestion
menu to a custom flat list sorted by relevance. Each item shows the note
type (with its accent color) discretely on the right side. Reduce
MAX_RESULTS from 20 to 10 for a cleaner, more focused list.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:42:09 +01:00
lucaronin
9bcc1776cc feat: add command palette with Cmd+K shortcut
Raycast-style command palette with fuzzy search across all app actions.
Groups commands by category (Navigation, Note, Git, View, Settings)
with keyboard shortcuts displayed inline. Contextual actions (trash,
archive, save) are only available when a note is open.

Extracts fuzzyMatch into shared utility for reuse.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:41:54 +01:00
lucaronin
576ce1f294 design: command-palette wireframes
Three frames: empty state with grouped actions, search results
with fuzzy filtering, and no-results state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:38:25 +01:00
Luca Rossi
9a5b37f602 Merge pull request #52 from refactoringhq/task/pallino-persistenza
fix: derive green pallino from git status instead of in-memory tracker
2026-02-24 23:29:01 +01:00
lucaronin
8b44ebbc22 fix: derive green pallino from git status instead of in-memory tracker
The green dot (new note indicator) was disappearing after Cmd+S because
markSaved cleared it from the in-memory newPaths set. Now resolveNoteStatus
derives "new" status from git status (untracked/added files) so the green
dot persists until the note is committed. The in-memory tracker is only
used for the brief window between note creation and first save to disk.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:15:37 +01:00
Luca Rossi
3ea175eec5 fix: deduplicate autocomplete suggestions and disambiguate same-title notes (#54)
BlockNote's SuggestionMenu uses item.title as React key, causing duplicate
rendering and broken arrow-key navigation when multiple notes share the
same title. Fix by:
- Adding path-based deduplication to filter out duplicate entries
- Disambiguating same-title notes with parent folder name (e.g. "Standup (work)")
- Deduplicating aliases within each item (filename vs entry.aliases overlap)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 22:12:35 +00:00
Luca Rossi
2e2224865c Merge pull request #50 from refactoringhq/task/relations-colori
fix: use type-defined colors and icons in Relations/Backlinks/ReferencedBy panels
2026-02-24 22:43:06 +01:00
Luca Rossi
7e586eccb0 fix: use type-defined colors and icons in Relations/Backlinks/ReferencedBy panels (#49)
The inspector panels were calling getTypeColor/getTypeLightColor/getTypeIcon
without passing the custom color/icon overrides from the Type entry, causing
all notes to render with the default blue color regardless of their type.

Now builds a typeEntryMap in Inspector and threads it through to all panels,
matching how NoteList correctly resolves type colors and icons.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 21:30:15 +00:00
lucaronin
a7abcc21b3 fix: use type-defined colors and icons in Relations/Backlinks/ReferencedBy panels
The inspector panels were calling getTypeColor/getTypeLightColor/getTypeIcon
without passing the custom color/icon overrides from the Type entry, causing
all notes to render with the default blue color regardless of their type.

Now builds a typeEntryMap in Inspector and threads it through to all panels,
matching how NoteList correctly resolves type colors and icons.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 22:15:41 +01:00
lucaronin
d65eba8096 docs: add current state snapshot to VISION.md 2026-02-24 19:13:22 +01:00
lucaronin
45a0098f5c docs: add product vision document 2026-02-24 18:58:13 +01:00
lucaronin
99535cc0da design: merge differenzia-pallino frames into ui-design.pen 2026-02-24 17:31:58 +01:00
Luca Rossi
31d8bfb843 Merge pull request #48 from refactoringhq/task/differenzia-pallino
feat: distinguish new notes (green dot) from modified notes (orange dot)
2026-02-24 17:13:58 +01:00
lucaronin
e7e4dccd3f fix: restore modifiedFiles/changes-filter support alongside getNoteStatus
The previous commit replaced modifiedFiles with getNoteStatus, but main
had tests for the 'changes filter' view that depend on modifiedFiles.

This commit restores full backward compat:
- Both modifiedFiles and getNoteStatus props are accepted
- getNoteStatus takes precedence when provided (used by App.tsx)
- modifiedFiles automatically derives status='modified' when getNoteStatus
  is not provided (used by tests and legacy callers)
- isChangesView / 'Changes' header / changes filter all restored

NoteItem continues to use noteStatus prop (new | modified | clean),
so both green (new) and orange (modified) dots work correctly.
2026-02-24 17:02:22 +01:00
lucaronin
9a8b2d930a feat: distinguish new notes (green dot) from modified notes (orange dot)
New notes created in-session show a green dot; existing notes with
uncommitted git changes show an orange dot. Saving a new note clears
the green dot; git commit clears the orange dot.

Introduces NoteStatus type ('new' | 'modified' | 'clean'), extracts
useNewNoteTracker hook and resolveNoteStatus pure function, and adds
onNoteSaved callback to useEditorSave for clearing new-note tracking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 17:02:22 +01:00
lucaronin
bacd4e17a2 design: merge vista-changes frames into ui-design.pen 2026-02-24 16:01:41 +01:00
Luca Rossi
8276e4225d Merge pull request #47 from refactoringhq/task/icon-picker-sezioni
feat: expand icon picker to 290 Phosphor icons with search and scroll
2026-02-24 16:00:42 +01:00
Luca Rossi
6a63768892 Merge pull request #45 from refactoringhq/task/vista-changes
feat: Changes view — clicking N pending shows modified notes
2026-02-24 16:00:37 +01:00
Luca Rossi
49a4ba2491 Merge pull request #43 from refactoringhq/task/properties-text-size
fix: use consistent 12px text size for property values in Properties panel
2026-02-24 15:39:59 +01:00
lucaronin
e607859c5b design: icon-picker-sezioni wireframes (3 frames)
- Frame 1: Full grid view with 8 color swatches and scrollable icon grid
- Frame 2: Search filtered state (searching "book")
- Frame 3: Empty state (no matching icons)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:36:11 +01:00