feat: Phase 4 - Notes + Graph + Wikilinks
- Wikilink parser: [[Title]], [[Title|Display]], [[entity_type:Title]] patterns - Notes REST API: CRUD under /api/domains/[domainId]/notes/ with wikilink sync - Note link service: idempotent wikilink resolution, backlinks, outgoing links - Notes list page: search, filter (all/pinned/archived), domain selector - Note editor: TipTap with backlinks panel and outgoing links display - Graph data API: /api/domains/[domainId]/graph and /api/graph - Graph view page: D3 force-directed graph with entity type filters, search, zoom - Keyboard shortcuts: g g → graph, c n → new note - 18 passing wikilink parser tests - All API routes follow AGENTS.md contract (activity + pg_notify)
This commit is contained in:
@@ -43,6 +43,7 @@ export function useKeyboardShortcuts() {
|
||||
if (key === 'h') { router.push('/habits'); e.preventDefault(); return; }
|
||||
if (key === 'p') { router.push('/projects'); e.preventDefault(); return; }
|
||||
if (key === 'n') { router.push('/notes'); e.preventDefault(); return; }
|
||||
if (key === 'g') { router.push('/graph'); e.preventDefault(); return; }
|
||||
if (key === 'r') { router.push('/reports'); e.preventDefault(); return; }
|
||||
if (key === 'c') { router.push('/calendar'); e.preventDefault(); return; }
|
||||
if (key === 'a') { router.push('/analytics'); e.preventDefault(); return; }
|
||||
@@ -83,6 +84,11 @@ export function useKeyboardShortcuts() {
|
||||
document.dispatchEvent(new CustomEvent('open-create-project'));
|
||||
e.preventDefault();
|
||||
}
|
||||
// c n — new note
|
||||
if (window.location.pathname.startsWith('/notes')) {
|
||||
document.dispatchEvent(new CustomEvent('open-create-note'));
|
||||
e.preventDefault();
|
||||
}
|
||||
// c s — new section (on project detail page)
|
||||
if (window.location.pathname.match(/^\/projects\/[^/]+$/)) {
|
||||
document.dispatchEvent(new CustomEvent('open-create-section'));
|
||||
|
||||
Reference in New Issue
Block a user