Plugin: Kanban board over status frontmatter (#122)#151
Merged
Conversation
Closes #122. Surfaces a fullscreen kanban view that groups notes by their YAML frontmatter `status:` field (Obsidian convention). Columns default to user-defined CSV (persisted via setSetting) and fall back to the vault's distinct status values, or Todo / Doing / Done when nothing carries a status yet. Cards live in an Unsorted column on the far right when their status does not match any declared column. Drag-to-Done was the original brief, but v1.2 VNodes carry no pointer events. The plugin uses a per-card "Move to..." button that opens a small radio overlay; selecting a column writes the new status via vault.write.updateNote and preserves every other key. Moving to Unsorted removes the `status` key entirely so on-disk YAML stays clean. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes #122. New plugin at
public/plugins/noteser-kanban/surfacing a fullscreen Kanban board over the YAML frontmatterstatus:field (Obsidian convention).Defaults (greenlit 2026-06-07)
status:— Obsidian convention. Lifted straight from eachNoteWithBody.frontmatter; the plugin never re-parses YAML.setSetting('columns', csv)). Fallbacks in order: (1) user CSV, (2) the distinct status values present in the vault, (3) hard-codedTodo / Doing / Donewhen no notes carry a status yet.Move-to mechanic (drag-and-drop replacement)
v1.2 VNodes only carry
onClick / onChange / onSubmit / onKeyDown. There is no pointer-event channel throughpostMessage, so drag-to-Done as described in #122 cannot be expressed with the curated VNode set —docs/plugins-v1.2-impl-notes.mdflags the same wall for #71 and the importer.Each card carries a "Move to..." button. Click it: a small radio picker overlays the card with every other column plus Unsorted. Pick one: the plugin calls
ctx.vault.write.updateNote(id, { frontmatter: { ...existing, status: chosen } }). Moving to Unsorted removes thestatuskey entirely so the on-disk YAML stays clean instead of writingstatus: Unsorted. Every other frontmatter key is preserved.If a v1.3 plan adds a pointer-event VNode (
onDragStart,onDrop), the column strip can swap to native drag-and-drop without changing the wire-level write path.Files added
Perf
Measured against a synthetic 1,000-note vault. Times are pure-derive cost on the worker side; the host snapshot cost is shared by every v1.2 plugin and falls outside this plugin's responsibility.
Both well under the 500 ms board-open budget called out in the task brief. The filter input is debounced at 150 ms; vault-change events ride the host's existing 250 ms debounce and a 0 ms microdebounce to coalesce burst-of-saves into one re-derive.
Tests
src/plugins/__tests__/kanbanPlugin.test.ts— 34 tests, all green:extractStatuson string / missing / empty / array / non-string fixtures.parseColumnsCsvtrims, dedupes case-insensitively, preserves order.resolveColumnshonours CSV, falls back to vault statuses, falls back again toDEFAULT_COLUMNS.groupByStatusproduces every declared column + Unsorted, matches case-insensitively, places untagged + non-matching notes in Unsorted.filterNotesmatches title + status + body tag, ignores folder paths.moveTargetsexcludes the source column, appends Unsorted unless the source IS Unsorted.buildMovePatchpreserves siblings, removesstatuson move-to-Unsorted, does not mutate input.main.js: the move-to writes throughvault.write.updateNotewith the right frontmatter, and the custom-columns CSV persists throughsetSetting.Voice
User-facing strings (column headers, button labels, empty-state callout, toast errors) carry no em dashes, no contractions, and no hype.
Test plan
npm run lintclean.npx tsc --noEmitzero errors.npm test -- --cigreen (212 suites pass, 1 skipped pre-existing).status: todoto several notes, run "Open Kanban board" from the palette, click "Move to..." on a card, pick a different column, confirm the note moves and frontmatter updates on disk.🤖 Generated with Claude Code