A local-first note taking app

Support [[wikilinks]]: parsing, resolution, navigation, completion master

Wikilinks were not just missing but actively mis-rendered: @lezer/markdown parsed `[[Foo]]` as an inner Link covering `[Foo]`, so linkDecoration styled `Foo` blue, hid the inner brackets, left the outer ones visible, and produced something unclickable (no URL child for linkUrlAt to return). Adds `[[Note]]`, `[[Note|Alias]]` and `[[Note#Heading]]`: rendered as links, resolved against the vault, visibly distinguished when unresolved, created and opened on click when missing, and completed as you type `[[`. Three design notes: - The parser is a real MarkdownConfig inline parser registered `before: 'Link'`, not regex in the builder. That ordering keeps Escape and InlineCode ahead of us (so an escaped or code-spanned `[[x]]` stays literal) while Link/Image never see the interior, and fenced code is excluded for free. Because addElement advances past the whole element, a matched wikilink emits no inner Link node, so linkDecoration needed no guard — pinned by a regression test. - Vault knowledge reaches the pure EditorState builders through a Facet, the same trick editorModeFacet uses, swapped at runtime via a Compartment so cursor/scroll/history survive. A null facet means "index not loaded" and renders neutral, so a cold open never flashes links as broken. It also makes the builder testable by injecting a fake vault — no React, no filesystem. - Resolution attaches at DocumentSlotView, alongside the relative-link resolution already there, so it reaches every workspace including Zen without per-workspace wiring. Resolved links reuse the entryId verbatim from the provider listing rather than rebuilding a path, so tab dedup (an exact providerId+entryId match) hits instead of opening a second tab for an already-open note. Create-on-click goes through createFile explicitly, because a missing file's ENOENT loses its `code` across the Electron IPC boundary — relying on open-on-missing would yield a buffer backed by nothing on disk. The completion popup needs explicit styling on three counts, all documented at the CSS: CodeMirror's base theme hardcodes a monospace list font; the app's global 320ms colour/background transition (meant for theme switches) has to be suppressed across the whole popup subtree or the selection smears while arrowing through it; and CodeMirror's own light/dark colours never activate because no CM theme extension is configured, so the popup would stay white-on-white in dark mode. Those rules also have to out-specify CM's generated base-theme selectors, which is why they carry the extra `.cm-editor`. Not covered by tests: click-to-open, create-on-click, popup rendering and the compartment repaint all need DOM/geometry that the node-environment suite cannot reach. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>