chore(release): promote 0.16.0 - #533
Conversation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Track bytes sent and received across all HTTP requests for sync history reporting. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instrument syncNow() to create a sync_history entry for each cycle, tracking notes/notebooks/tags pulled and pushed, conflicts, bandwidth, and final status (success/partial/error). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a pure validateConfigValue() function that validates config values against their PluginConfigSchemaField definitions, covering boolean, string, number (with min/max), enum (with options membership), and range (with min/max) types. Includes 15 TDD test cases. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ror display Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace unsafe `Function` type casts with explicit signatures in safePluginWrapper - Add escapeHtml helper to prevent XSS in error marker HTML injection - Change console.debug to console.warn in plugin stores (ESLint no-console) - Use CSS custom properties with fallbacks for error block colors - Add overflow-wrap: anywhere to prevent horizontal overflow on long errors - Add default metadata backward-compatibility tests to both plugin stores Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix race condition in theme restore by subscribing to themeRegistryStore changes via useSyncExternalStore (App.tsx) - Separate data-color-scheme (dark/light) from data-theme (plugin themes) to prevent attribute conflicts between useAppearanceSettings and useThemeOverrides - Persist IPC nativeTheme isDark value to avoid matchMedia fallback on accent/zoom re-applies (useAppearanceSettings.ts) - Fix unnecessary re-renders in useThemeOverrides by using separate subscriptions for activeThemeId and themes instead of creating new object references - Fix type mismatch in preload theme.setSource to use union type - Fix import order in AppearanceSection.tsx per lint rules - Log warning on failed theme registration in PluginRegistry - Replace disallowed console.debug with guarded console.warn in themeRegistryStore - Fix Prettier formatting in SQLiteNoteRepository.ts - Update CSS selectors in tokens.css and code-highlight.css to use data-color-scheme Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…try store Introduce ThemeDefinition type, CORE_THEME_TOKENS whitelist, and validation helpers that reject unknown CSS tokens. Add ThemeRegistry Zustand vanilla store for registering/unregistering themes with active theme management. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…t method Wire theme system into the app: useThemeOverrides applies active theme tokens to document root, and registerTheme lets plugins register full themes through the PluginContext with proper lifecycle cleanup. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wire up Electron's nativeTheme API so the renderer can set the theme source (dark/light/system) and receive system theme change notifications via IPC instead of relying solely on window.matchMedia. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - Clicking or following a `[[wikilink]]` whose title is not in the library now creates that note and opens it. - Same-note `[[#heading]]` / `[[This note#heading]]` still only jumps. - Empty `[[]]` stays a no-op. ## Test plan - [x] `resolveWikilinkClick` unit tests - [ ] Preview: click an existing `[[Note]]` — still opens it - [ ] Preview: click `[[Brand new]]` — creates `# Brand new` in the current notebook and opens it - [ ] Preview: click `[[#Setup]]` on the current note — jumps, does not create
…iew (#508) ## Why Preview ignored \`[[#heading]]\` clicks because \`data-target\` is empty. Existing and missing \`[[wikilinks]]\` also looked the same. ## What - Follow \`[[#heading]]\` from preview (same as the editor Cmd-click). - Resolve titles used in the current note and mark missing ones with a dashed style in preview and the editor. - Highlighter no longer uses a regex (same linear scan as Cmd-click). ## Test - \`findWikilinkSpans\` / \`parseWikilinkAt\` - \`isMissingWikilink\` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Wikilinks are now checked against available notes and visibly marked when unresolved. * Wikilink highlighting updates as note content changes. * Links pointing directly to headings can now be opened successfully. * **Style** * Missing wikilinks use distinct secondary coloring and dashed underlines for clearer visibility. * **Bug Fixes** * Improved case-insensitive matching and handling of empty or whitespace-only wikilinks. * **Tests** * Added coverage for wikilink parsing and missing-link detection. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Why Remaining navigation after the heading/wikilink series: - Follow a \`[[wikilink]]\` only worked with Cmd-click - Palette could jump notebooks and tags, not headings - Copy link only produced \`dripnex://\` ## What - \`Follow Link\` (Mod+Shift+Enter) follows the wikilink under the cursor - \`Jump to Heading\` (Mod+Shift+H) lists the current note's headings - \`Copy Wikilink\` writes \`[[Title]]\` / \`[[Title#Heading]]\` (actions panel + palette) ## Test - \`wikilinkAtOffset\`, \`formatWikilink\`, palette placeholders
## Why Wikilinks can be followed, created if missing, and styled when unresolved. Hovering one still showed nothing about the target. ## What - Hover a \`[[wikilink]]\` in the editor or preview to peek title + excerpt - Missing titles say they are not in the library; click still creates/opens - Delay so the card does not flash while moving the pointer ## Test - \`resolveWikilinkPeek\`
## Why
Inkdrop text annotations are not comments. They restyle \`**bold**\` /
\`_italic_\` for one notebook via user CSS so notes stay GFM. Dripnex
had \`styles.css\` but no notebook hook on the editor.
## What
- \`data-notebook-id\` + \`notebook-{id}\` on the note, editor, and
preview
- Editor marks \`.cm-strong\` / \`.cm-em\` so the same CSS hits source
and preview
- Right-click a notebook → Copy style selector
- Example block in the \`styles.css\` scaffold
## Test
- \`notebookStyle\` unit tests
## Why
Inkdrop plugins get stock \`Button\`, \`Modal\`, and \`Dialog\` from the
component manager. Dripnex had layout zones and notifications, but a
plugin still had to invent overlay UI.
## What
- \`ctx.components\` / \`dripnex.components\`: \`Button\`, \`Modal\`,
\`Dialog\` (\`Title\` / \`Content\` / \`Actions\`)
- \`get('Dialog')\` and \`getComponentClass('Dialog')\` (Inkdrop name)
- Esc + backdrop close, focus restore, token-based styles
- Mount overlays with the existing \`layout.addComponent('modal', …)\`
zone
## Test
- Catalog lookup
- Plugin context exposes \`components\`
## Why
Inkdrop plugins do \`markdownRenderer.remarkPlugins.push(plugin)\`.
Dripnex already had the stores and \`registerRemarkPlugin\`, but not
that object.
## What
- \`ctx.markdownRenderer\` / \`dripnex.markdownRenderer\`
- \`remarkPlugins\` / \`rehypePlugins\` (push or reassign, like Inkdrop
deactivate)
- \`remarkReactComponents\` / \`remarkCodeComponents\`
- \`events.on('a:click' | 'checkbox:change')\` — same handlers as
\`preview.on\`
Backed by the existing stores. \`registerRemarkPlugin\` still works.
## Test
- push/assign remark and rehype
- element and fenced-code maps
## Why Inkdrop plugins reach the editor via \`getActiveEditor().cm\`. Dripnex had a safe subset (\`getContent\` / \`insertAtCursor\`) and \`registerExtensions\`, but not the live view. ## What - \`editor.getView()\` → CodeMirror 6 \`EditorView\` or \`null\` - \`dripnex.getActiveEditor().cm\` is the same object (Inkdrop name) - The safe EditorAPI is unchanged ## Test - \`getView\` null and live <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Editor integrations can now access the live CodeMirror editor view through the editor API. - Active editor information now includes its current editor view, when available. - The API safely reports when an editor view is not mounted. - **Documentation** - Added guidance to the user initialization template describing CodeMirror editor view usage. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Why \`parseDripnexUrl\` lived in main and the renderer. The comment said to keep them in sync. ## What One parser in \`src/shared/parseDripnexUrl.ts\`. Main and renderer re-export it. \`emitLocalDeepLink\` stays in the renderer. ## Test - Shared parser cases - Re-export smokes
## Summary - Scan `styles/*.css` from community plugin packages (same path as `keymaps/` and `menus/`). - Inject the CSS while the plugin is enabled; drop it on deactivate. - CLI `init` scaffolds `styles/index.css`; `pack` includes the folder. ## Test plan - [x] `pnpm --filter @dripnex/plugin-api test` - [x] `pnpm --filter @dripnex/plugin-cli test` - [x] scanner test for `styles/index.css` - [ ] Drop a `styles/index.css` in a linked plugin, reload, confirm the rule applies, disable the plugin, confirm it goes away
## Summary - Next-edit suggestions (Inkdrop NES): ghost text at the cursor from the configured AI provider. - **Manual** by default (\`Alt+\\\`); **Automatic** after idle; **Disabled** off. Settings → AI. - Tab accepts, Escape dismisses. \`editor:trigger-nes\` / \`accept-nes\` / \`dismiss-nes\`. - Prompt and completion are not logged (PHI). ## Test plan - [x] \`extractNesInsertion\` / prompt tests - [x] settings default \`nesMode: manual\` - [x] renderer typecheck - [ ] Set an AI provider, Alt+\\ on a half-written list item, Tab to accept - [ ] Escape dismisses; Tab still indents when no ghost is showing - [ ] Automatic mode fires after a pause; Disabled is a no-op <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added AI-powered next-edit suggestions in the Markdown editor. * Suggestions can be triggered manually, generated automatically after idle time, or disabled. * Added keyboard shortcuts and command palette actions to trigger, accept, or dismiss suggestions. * Added a new settings option to choose the suggestion mode. * **Bug Fixes** * Pressing Escape now dismisses active edit suggestions appropriately. * **Tests** * Added coverage for suggestion parsing and settings persistence. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary - Edit with AI stays in the selection popover. The result replaces the selection; it does not open the AI panel. - \`editor:edit-with-ai\` (Mod+Enter) opens the popover, including with an empty selection (insert at cursor). - Presets: mermaid, table, proofread, reformat, improve, summarize, bullets, tasks, headings. - Shared \`collectChat\` helper with the NES 8s timeout. ## Test plan - [x] inline parse tests - [x] NES parse still passes - [x] renderer typecheck - [ ] Select a paragraph, Mod+Enter, Proofread — selection is replaced in the editor - [ ] Custom prompt in the popover - [ ] No API key shows an error in the popover, not the panel <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added AI-assisted inline editing for selected text. - Added actions to summarize, create bullet points, generate tasks, add headings, and edit Mermaid content. - Added an “Edit with AI” command with a keyboard shortcut and Command Palette access. - Added loading, setup, and error feedback during AI editing. - **Bug Fixes** - Improved streaming AI response handling and request timeouts. - **Tests** - Added coverage for prompts, context handling, Markdown fences, and empty responses. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary - Author \`docs/releases/v0.16.0.md\` for the unpublished 0.16.0. - Covers the mid-August draft plus wikilinks, tables, export, NES, inline AI, and the plugin package surface. - Status stays \`draft\` until the GitHub release is undrafted. This is **not** the promotion PR. That one is \`develop → main\`, titled \`chore(release): promote 0.16.0\`, merge commit, never squash. Say go for that separately. ## Test plan - [x] File matches \`docs/WHATS_NEW.md\` shape (frontmatter, human sections, no issue IDs) - [ ] Read it once as a user before promoting
## Summary - A theme repo is \`manifest.json\` + \`theme.json\` (token layer) + optional \`styles/*.css\`. - No \`main\` / JS required. Appearance already lists anything in the theme registry. - \`dripnex-plugin init \"Paper\" --type theme\` scaffolds it; \`pack\` includes \`theme.json\`. Same contract as Parchment / Wave / Night. ## Test plan - [x] parse + apply theme.json - [x] scanner loads a theme-only package - [x] CLI init --type theme - [ ] \`dripnex-plugin init Paper --type theme && dripnex-plugin link\`, enable in Settings → Plugins, pick the card in Appearance <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added support for theme-only plugins without JavaScript code. * Added theme parsing, validation, registration, and packaging. * Added CLI scaffolding with `--type theme` for creating new themes. * Theme packages can include `theme.json`, styles, and optional theme collections. * **Bug Fixes** * Improved plugin scanning and loading for packages that omit a main entry. * **Tests** * Added coverage for theme creation, validation, scanning, registration, and packaging. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary
- \`dripnex.themes.list() / getActive() / setActive(id) / onDidChange\`
from init.js and plugins.
- \`setActive\` persists the same way Settings → Appearance does.
- Theme tokens may include \`--cm-*\` so a community theme can color the
editor.
\`\`\`js
dripnex.themes.setActive('dripnex-parchment')
\`\`\`
## Test plan
- [x] createThemesApi + token whitelist tests
- [x] plugin-api and renderer typecheck
- [ ] In init.js: \`dripnex.themes.setActive('dripnex-wave')\`, reload
plugins, confirm Appearance and chrome match
## Summary - Sidebar / note-list / editor chrome now share `--chrome-header-height` and `--chrome-header-padding`, so the gear cluster sits on the same row as All Notes. - Sync indicator is 28px (same as `IconButton`) so it does not stretch that row. - Settings uses the same 44px header and traffic lights (`8, 8`) instead of a 52px spacer. ## Test plan - [ ] Open the main window: sync / graph / settings sit on the same baseline as **All Notes** - [ ] Collapse/expand the sidebar; the note-list header does not jump - [ ] Open Settings: traffic lights and empty header match the main chrome height <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added reusable settings controls and cards for a more consistent settings experience. * Added animated icon hover states and improved visual feedback when items are moved to Trash. * **Style** * Improved desktop window header alignment and spacing. * Standardized note, sidebar, sync, and settings layouts with refined borders, sizing, colors, focus states, and scrolling. * Updated settings pages, navigation, groups, rows, disclosures, themes, integrations, devices, and plugins for a more consistent appearance. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Why Inkdrop v6.1 shipped 30 `editor:*` line commands and Enter that continues a list. We had copy/move line only because CodeMirror's default keymap binds them — they were invisible in the palette, and Enter was a plain newline. ## What - Palette + dispatch for the v6.1 set: copy/move line, select line, matching bracket, subword, comments, sort, join, case, find-under, split selection, scroll. - Enter continues bullets, numbered lists (and renumbers), tasks (`- [ ]`), and blockquotes. An empty item outdents / leaves the block. Fences fall through. - `<!-- -->` via `toggleComment` in Markdown (line comments still come from the fenced language). - Multiple selections enabled so "select all occurrences" actually adds cursors. - Keybindings that match Inkdrop where they don't collide: - Alt+↑/↓ move line, Shift+Alt+↑/↓ copy (already in CM) - Mod+L select line, Mod+/ toggle comment, Mod+F3 find under, Alt+F3 select all - F5/F9 sort, Ctrl+J join, Ctrl+Alt+←/→ subword (CM keymap — registry treats Ctrl as Mod) - **Not rebound:** Mod+Enter stays Edit with AI (`insert-blank-line` is palette-only). Mod+Shift+Enter stays follow-link (`insert-line-before` is palette-only). Mod+D stays duplicate note. Independent of #522 and #523. ## Test plan - [ ] `- item` then Enter → new `- ` sibling. Enter on an empty `- ` → leaves the list. - [ ] `1. a` / `2. b`, Enter at the end of a → `2. ` inserted, `b` becomes `3.` - [ ] `> quote` Enter continues `> `. Empty `> ` exits. - [ ] Enter inside a fence is a normal newline. - [ ] Select three lines, Command Palette → Sort Lines. - [ ] Alt+↑ moves the line. Shift+Alt+↓ copies it down. - [ ] Mod+L selects the line. Mod+/ wraps the line in `<!-- -->`. - [ ] Palette → Join Lines on two lines. Ctrl+J does the same. - [ ] Command Palette lists the new editor commands. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added enhanced Markdown editing, including automatic continuation for lists, task lists, blockquotes, and ordered-list numbering. * Added editor commands for selecting, moving, sorting, joining, splitting, and transforming lines and text. * Added search-under, occurrence selection, scrolling, cursor centering, and multiple-selection support. * Added the new editing actions to the command palette with keyboard shortcuts. * **Bug Fixes** * Markdown comments are now recognized correctly. * List continuation is disabled within fenced code blocks and handles empty list items appropriately. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Why The Inkdrop shot with the desk showing through the sidebar is macOS vibrancy plus translucent chrome. Wave is a solid hex. Default stays opaque. ## What - Official **Glass** palette: alpha `--bg-base` / `--bg-surface` so the desktop reads through. - Note windows on macOS use `vibrancy: under-window`; Windows gets acrylic. Linux stays opaque. Settings window is unchanged. - Sidebar and note-list columns get `backdrop-filter`. The editor pane uses `--bg-elevated` so markdown stays readable. - Performance Low already sets `--glass-blur: 0`. Independent of #522–#527. Pick Glass from Settings → Themes (after #525) or Appearance palettes on develop. ## Test plan - [ ] macOS: default theme still looks solid. Switch to Glass — sidebar is frosted, wallpaper shows through. - [ ] Editor text stays readable on Glass. - [ ] Performance → Low: blur goes away. - [ ] Windows/Linux: no crash; Glass is just a translucent dark palette.
## Why Inkdrop Preferences has a **Themes** page of its own and nests **Install** / **Updates** under Plugins. Ours mixed palettes into Appearance, used in-page tabs for Browse, and “Updates” only meant the app updater. ## What - **Themes** is a sidebar page (live palette cards). Appearance keeps base / accent / zoom / performance. - **Plugins** nested like Inkdrop: Installed (click Plugins), **Install** (today’s Browse + `installFromSpec`), **Updates** (community plugins whose registry version is newer). Badge on Updates. Not a store. - **Keybindings** page: live command table + Open keybindings.json. Independent of #522–#524. ## Test plan - [ ] Settings → Themes: pick Parchment / Wave / Default. Appearance still has zoom and accent. - [ ] Settings → Plugins shows installed built-ins. Nested **Install** lists the catalog. Nested **Updates** is empty if everything matches, or offers Update if a community plugin is behind. - [ ] Settings → Keybindings lists chords. Open keybindings.json still works.
## Summary - Strike through checked GFM tasks in the source editor (and preview). - Show the destination URL when hovering a markdown/autolink. - Copy button on fenced blocks when the cursor is inside (preview on hover too). Inkdrop v6 ships these three in the editor; they were the leftover source-mode gaps after line commands (#524). ## Test plan - [x] `pnpm --filter @dripnex/commands test` - [x] `pnpm --filter @dripnex/desktop exec vitest run src/renderer/utils/__tests__/splitCodeLines.test.ts` - [x] `pnpm --filter @dripnex/commands typecheck` + desktop renderer typecheck - [ ] In the editor: `- [x] done` strikes the text; `- [ ]` does not - [ ] Hover `[label](https://dripnex.app)` — tooltip shows the URL - [ ] Place the cursor inside a ` ``` ` fence — Copy appears and copies the inner source - [ ] Preview: hover a code block, Copy works; checked task items are struck
## Why Tab always indented by two spaces. That nests a bullet under `-`, but not under `1.` (needs 3) or `10.` (needs 4). Inkdrop v6.1 fixed this last week; we still had `indentWithTab`. ## What - Tab / Shift-Tab indent a list item by the marker width of the item above (`-` → 2, `1.` → 3, `10.` → 4). Descendants move with the parent. - Numbered lists in the same region are renumbered in the same undo step. - List markers in the editor are colored by nesting level (`--md-list-mark-color`, `--md-list-mark-2-color`, `--md-list-mark-3-color`). Deeper levels cycle. Preview markers stay text-colored unless a theme opts into `--mde-preview-list-marker-*`. - Tables still own Tab inside a cell (plugin keymap is later). Plain lines still fall through to `indentWithTab`. Independent of #522. ## Test plan - [ ] In a note: `1. parent` then `- child`. Tab on the bullet — it should sit three spaces in and render nested. - [ ] Shift-Tab lifts it back. One undo reverts both the indent and any renumber. - [ ] `1. a` / `2. b` / `3. c` — Tab on `2.` → nested `1. b`, outer `2. c`. - [ ] Nested bullets get a second/third marker color in the editor. - [ ] Tab inside a table cell still moves between cells. - [ ] Tab on a non-list line still indents by tab size.
## Why A full-width editor makes lines too long to scan. Inkdrop’s Readable line length caps the column. ## What - Settings → Editor → Readable Line Length (off by default). - Editor scroller and preview shell max-width 46rem, centered. Fence copy chrome stays in the column. Independent of #522–#526. ## Test plan - [ ] Toggle on: editor and preview become a centered column. - [ ] Toggle off: they fill the pane again. - [ ] Copy-code on a fence still sits on the fence, not off to the side.
## Why Cmd+K was a command list. Jump notebook / tag / heading were separate modes. Inkdrop Telescope is one bar: type a prefix, fuzzy-rank the source. ## What - Prefixes in the same palette: `>` commands, `b ` notebooks, `t ` tags, `#` headings. Existing mode commands (Quick Open, Jump to Notebook, …) stay as aliases. - `b work` scopes to notebooks; typing `blog` does not. - Rank by subsequence (prefix hits first), not `includes`. - Esc clears a prefix before closing. Independent of #522–#525. ## Test plan - [ ] Cmd+K, type `b ` — notebooks. Type `t ` — tags. Type `#` — headings. Type `>` — commands. - [ ] `inb` ranks Inbox. `wo` still does not match Weekly. - [ ] Esc with `b foo` in the box clears the query; Esc again closes. - [ ] Jump to Notebook (the old command) still opens scoped to notebooks. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added scoped command palette searches for commands, notebooks, tags, and headings. * Added fuzzy matching that ranks relevant results, including non-contiguous matches. * Updated the search hint to show supported prefixes. * **Bug Fixes** * Improved Escape-key behavior to clear active searches before closing the palette. * Improved filtering, accessibility text, rendering, and keyboard behavior for scoped searches. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
## Summary - Replace leftover raw `Toggle` usages in MCP, Local HTTP, and plugin cards with `SettingToggle`. - Plugin config fields (boolean/string/number/enum/range) use the same settings row components. - `flush` on `SettingRow` so nested rows inside cards do not double-pad. Editor, General, and Updates already used `SettingToggle`. This finishes the rest. ## Test plan - [x] `pnpm --filter @dripnex/desktop typecheck:renderer` - [ ] Settings → Integrations: MCP enable + Allow writes look like other settings rows - [ ] Settings → Integrations: Local HTTP enable is the same switch - [ ] Settings → Plugins: each card has Enabled; plugin config booleans use the same switch
## Summary - Update the 0.16.0 What’s New with line commands, list indent, telescope, Glass, Themes/Plugins/Keybindings, and editor polish. - Mirror the shipped list on the living board. Still **draft**. Promote remains a separate \`chore(release): promote 0.16.0\` PR when you say go. ## Test plan - [ ] Read \`docs/releases/v0.16.0.md\` — no PR numbers, feels like a product note - [ ] Confirm it does not claim attachments, marketplace, or clipper
## Summary Settings chrome, native Glass, frosted palettes, and Vim as a community plugin. **Glass (Electron 30+ / macOS 26)** - Vibrancy only works if `transparent: true` is set when the `BrowserWindow` is created. `setVibrancy` on an opaque window is a no-op. - Clear the whole `contentView` tree (`WebContentsView` defaults to a white fill). - CSS `backdrop-filter` cannot see the desktop. - Appearance → Performance **Low** turns frost off (native vibrancy + solid fills). Auto does not. - Appearance → **Transparency** slider (0–100) for frosted palettes. **Palettes** - Frosted: Glass, Midnight, Ember, Ion (`theme.frosted`). - Light: `--cm-*` tokens so strong/wikilinks are not near-black. Accent follows the palette (`--accent-primary`). - Settings ↔ notes window: `activeThemeId: null` now clears the other window’s registry (Light actually applies). **Vim** - Removed from built-ins. Community plugin at `dripnex/plugin-vim` (local checkout `~/Documents/dripnex-plugin-vim`, not published yet). - Host injects `require()` for React and `@codemirror/*` so a CJS plugin can register CM6 extensions. **Settings chrome (original)** - `SettingToggle` rows do not paint a hover slab. - Font size / family are selects. - Action buttons use `Button`. ## Deploy / follow-up - Producer first: this desktop PR. No server contract. - Catalog lists `dripnex/plugin-vim` — GitHub 404 until `gh repo create dripnex/plugin-vim` + release tarball. - Do not squash-merge a promotion PR; this is a feature PR (squash OK). ## Test plan - [ ] Quit Dripnex fully, restart (constructor transparency). Do not leave DevTools docked. - [ ] Themes → Glass / Midnight / Ember / Ion — desktop shows through sidebar + empty editor. Reduce Transparency off in System Settings. - [ ] Appearance → Transparency slider moves fill. Performance → Low: solid, no frost. High: frost back. - [ ] Appearance → Base → Light: **both** Settings and the notes window go light. Wikilinks are teal, not black. - [ ] Pick Ion: accent (sidebar active, toggles) is violet, not leftover teal. - [ ] Plugins: Vim is not built-in. Linked local plugin loads if present. - [ ] Plugins Enabled row: no gray hover slab. Editor font family/size are dropdowns.
| vi.stubGlobal( | ||
| 'fetch', | ||
| vi.fn(async (url: string, init?: RequestInit) => { | ||
| if (typeof url === 'string' && url.includes('api.resend.com')) { |
| } | ||
|
|
||
| export function stripJsonc(source: string): string { | ||
| return source.replace(/\/\*[\s\S]*?\*\//g, '').replace(/^\s*\/\/.*$/gm, ''); |
| continue; | ||
| } | ||
|
|
||
| const headingMatch = line.match(/^(#{1,6})\s+(.+?)\s*$/); |
| const firstLine = body.split(/\r?\n/).find(line => line.trim().length > 0); | ||
| if (!firstLine) return fallback; | ||
|
|
||
| const heading = firstLine.match(/^#{1,6}\s+(.+)$/); |
|
Important Review skippedToo many files! This PR contains 968 files, which is 868 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (18)
📒 Files selected for processing (968)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Replaced by a promotion branch that merges main (conflicts). See the follow-up PR. |
Promote develop to production for 0.16.0.
What’s New:
docs/releases/v0.16.0.md(status: draft until the GitHubrelease is undrafted). After merge: Actions → Release → Run workflow.
semantic-release owns the version bump and tag — do not bump by hand.
Merge with a merge commit. Do not squash. Squashing drops the
feathistory and semantic-release will not cut 0.16.0.
Community Vim is live: https://github.com/dripnex/plugin-vim/releases/tag/v1.2.0
Packaged verification (edit this PR before merge)
tags is not iterableor[CodeMirror] plugin errordropped IPC send, no uncaught exception, app relauncheslocalStoragekeydripnex-settingshas emptyai.apiKeyopen "dripnex://auth/verify?token=x"right after closing the main window → no crash