kanban-lite 1.0.48 → 1.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.vscodeignore +0 -1
  2. package/AGENTS.md +0 -88
  3. package/CHANGELOG.md +17 -0
  4. package/CONTRIBUTING.md +1 -1
  5. package/README.md +110 -3
  6. package/dist/cli.js +2144 -506
  7. package/dist/extension.js +1896 -327
  8. package/dist/mcp-server.js +1673 -121
  9. package/dist/sdk/index.cjs +1595 -78
  10. package/dist/sdk/index.mjs +1595 -78
  11. package/dist/sdk/sdk/KanbanSDK.d.ts +91 -13
  12. package/dist/sdk/sdk/metaUtils.d.ts +61 -1
  13. package/dist/sdk/sdk/modules/cards.d.ts +15 -2
  14. package/dist/sdk/sdk/modules/context.d.ts +4 -1
  15. package/dist/sdk/shared/config.d.ts +7 -1
  16. package/dist/sdk/shared/types.d.ts +8 -0
  17. package/dist/standalone-webview/{icons-BQC9f0h7.js → icons-DpXY9lyN.js} +57 -52
  18. package/dist/standalone-webview/icons-DpXY9lyN.js.map +1 -0
  19. package/dist/standalone-webview/index.js +71 -69
  20. package/dist/standalone-webview/index.js.map +1 -1
  21. package/dist/standalone-webview/{react-vendor-CXl8NHLV.js → react-vendor-BOUld6Cu.js} +2 -2
  22. package/dist/standalone-webview/{react-vendor-CXl8NHLV.js.map → react-vendor-BOUld6Cu.js.map} +1 -1
  23. package/dist/standalone-webview/style.css +1 -1
  24. package/docs/api.md +34 -7
  25. package/docs/plan/20260318-metadata-fuzzy-search/plan.yaml +642 -0
  26. package/docs/plan/20260318-metadata-fuzzy-search/research_findings_metadata_fuzzy_search.yaml +558 -0
  27. package/docs/plan/20260318-metadata-fuzzy-search/research_findings_metadata_fuzzy_search_v2.yaml +568 -0
  28. package/docs/plan/board-metadata-fields/research_findings_board_metadata_fields.yaml +376 -0
  29. package/docs/plan/column-dnd-reorder/plan.yaml +474 -0
  30. package/docs/plan/column-dnd-reorder/research_findings_column_dnd.yaml +587 -0
  31. package/docs/plan/standalone-vs-webview/research_findings_standalone_vs_webview.yaml +482 -0
  32. package/docs/plan/standalone-vs-webview-cleanup/plan.yaml +383 -0
  33. package/docs/plan/standalone-vs-webview-cleanup/research_findings_T1.yaml +143 -0
  34. package/docs/sdk.md +422 -293
  35. package/package.json +3 -4
  36. package/scripts/generate-api-docs.ts +25 -8
  37. package/src/cli/index.test.ts +118 -0
  38. package/src/cli/index.ts +51 -9
  39. package/src/extension/KanbanPanel.ts +19 -0
  40. package/src/mcp-server/index.ts +46 -8
  41. package/src/sdk/KanbanSDK.ts +177 -14
  42. package/src/sdk/__tests__/KanbanSDK.test.ts +27 -0
  43. package/src/sdk/__tests__/metaUtils.test.ts +146 -1
  44. package/src/sdk/__tests__/metadata.test.ts +167 -0
  45. package/src/sdk/metaUtils.ts +173 -2
  46. package/src/sdk/modules/boards.ts +3 -1
  47. package/src/sdk/modules/cards.ts +99 -6
  48. package/src/sdk/modules/context.ts +11 -1
  49. package/src/shared/config.ts +11 -1
  50. package/src/shared/types.ts +5 -0
  51. package/src/standalone/__tests__/server.integration.test.ts +251 -3
  52. package/src/standalone/server.ts +62 -27
  53. package/src/webview/App.tsx +24 -8
  54. package/src/webview/components/CardEditor.tsx +81 -8
  55. package/src/webview/components/CardItem.tsx +17 -8
  56. package/src/webview/components/CreateCardDialog.tsx +5 -4
  57. package/src/webview/components/KanbanBoard.tsx +87 -10
  58. package/src/webview/components/KanbanColumn.tsx +84 -7
  59. package/src/webview/components/SettingsPanel.tsx +16 -4
  60. package/src/webview/components/Toolbar.tsx +47 -16
  61. package/src/webview/router.tsx +11 -30
  62. package/src/webview/routerHistory.test.ts +14 -0
  63. package/src/webview/routerHistory.ts +8 -0
  64. package/src/webview/routerSearch.test.ts +26 -0
  65. package/src/webview/routerSearch.ts +43 -0
  66. package/src/webview/standalone-shim.ts +16 -5
  67. package/src/webview/store/index.test.ts +209 -0
  68. package/src/webview/store/index.ts +72 -41
  69. package/dist/standalone-webview/icons-BQC9f0h7.js.map +0 -1
  70. package/docs/plans/2026-02-20-kanban-json-config-design.md +0 -74
  71. package/docs/plans/2026-02-20-kanban-json-config.md +0 -690
  72. package/docs/plans/2026-02-24-move-card-to-board-design.md +0 -433
  73. package/docs/plans/2026-02-25-comment-parser-hr-fix-design.md +0 -57
  74. package/docs/plans/2026-02-25-settings-workspace-info-design.md +0 -48
  75. package/docs/plans/2026-02-25-soft-delete-design.md +0 -91
  76. package/docs/plans/2026-02-26-card-actions-design.md +0 -147
  77. package/docs/plans/2026-02-26-card-actions.md +0 -1147
  78. package/docs/plans/2026-02-26-card-format-version-design.md +0 -68
  79. package/docs/plans/2026-02-26-card-format-version.md +0 -233
  80. package/docs/plans/2026-02-26-card-metadata-design.md +0 -831
  81. package/docs/plans/2026-02-26-comment-editor-design.md +0 -90
  82. package/docs/plans/2026-02-26-comment-editor.md +0 -672
  83. package/docs/plans/2026-02-26-label-colors-design.md +0 -174
  84. package/docs/plans/2026-02-26-label-colors-plan.md +0 -789
  85. package/docs/plans/2026-02-26-settings-tabs-design.md +0 -40
  86. package/docs/plans/2026-02-26-settings-tabs.md +0 -166
  87. package/docs/plans/2026-02-27-zoom-settings-design.md +0 -82
  88. package/docs/plans/2026-02-27-zoom-settings.md +0 -395
  89. package/src/webview/index.html +0 -12
  90. package/src/webview/main.tsx +0 -11
  91. package/vite.config.ts +0 -36
package/.vscodeignore CHANGED
@@ -28,7 +28,6 @@ CONTRIBUTING.md
28
28
  skills-lock.json
29
29
  README.md
30
30
  dist/standalone.js
31
- dist/webview/**
32
31
  dist/cli.js
33
32
  dist/mcp-server.js
34
33
  dist/sdk/**
package/AGENTS.md CHANGED
@@ -2,44 +2,6 @@
2
2
 
3
3
  A VSCode extension + standalone server + CLI + MCP server for managing kanban boards stored as markdown files (default) or SQLite.
4
4
 
5
- ## Architecture
6
-
7
- ```
8
- src/
9
- sdk/ # Core SDK (no external dependencies) - KanbanSDK class
10
- shared/ # Shared types (Card, KanbanColumn, CardDisplaySettings) and config module
11
- cli/ # CLI tool (built on SDK)
12
- mcp-server/ # MCP server (built on SDK + config + webhooks)
13
- extension/ # VSCode extension
14
- standalone/ # HTTP server with REST API + WebSocket + file watcher
15
- webview/ # React frontend (shared by extension + standalone)
16
- ```
17
-
18
- ## Key Files
19
-
20
- - `src/sdk/KanbanSDK.ts` - Core card/column CRUD operations
21
- - `src/sdk/storage/types.ts` - StorageEngine interface and BootstrapConfig
22
- - `src/sdk/storage/markdown.ts` - MarkdownStorageEngine (default)
23
- - `src/sdk/storage/sqlite.ts` - SqliteStorageEngine (better-sqlite3)
24
- - `src/sdk/storage/index.ts` - Storage engine factory + readBootstrapConfig
25
- - `src/sdk/parser.ts` - Markdown frontmatter parsing and serialization
26
- - `src/shared/types.ts` - All TypeScript types and enums
27
- - `src/shared/config.ts` - `.kanban.json` config read/write, settings conversion
28
- - `src/standalone/server.ts` - HTTP server with all REST API routes + WebSocket
29
- - `src/standalone/webhooks.ts` - Webhook CRUD and delivery
30
- - `src/cli/index.ts` - All CLI commands
31
- - `src/mcp-server/index.ts` - All MCP tool definitions
32
-
33
- ## Build
34
-
35
- ```bash
36
- npm run build # Build everything
37
- npm run build:cli # CLI only
38
- npm run build:mcp # MCP server only
39
- npm run build:standalone-server # HTTP server only
40
- npx tsc --noEmit # Type-check
41
- npm test # Run tests (vitest)
42
- ```
43
5
 
44
6
  ## Feature Parity
45
7
 
@@ -56,47 +18,6 @@ Always follow this order when adding or modifying any feature:
56
18
 
57
19
  Never implement a feature directly in an interface layer without the SDK method existing first. The SDK is the single source of truth for all business logic.
58
20
 
59
- ## Data Storage
60
-
61
- - Cards (markdown engine): `.kanban/boards/<boardId>/<status>/card-name-YYYY-MM-DD.md`
62
- - Cards (sqlite engine): `.kanban/kanban.db` (configurable via `sqlitePath` in `.kanban.json`)
63
- - Config: `.kanban.json` (boards, columns, display settings, label definitions)
64
- - Webhooks: `.kanban-webhooks.json`
65
- - Logs: `.kanban/boards/<boardId>/<status>/attachments/<cardId>.log` (auto-attached text file)
66
-
67
- ## Storage Engines
68
-
69
- The `StorageEngine` interface (`src/sdk/storage/types.ts`) abstracts all card I/O. Only card data (cards, comments) is engine-dependent — workspace config always lives in `.kanban.json`.
70
-
71
- - **MarkdownStorageEngine** — default; full backward compatibility
72
- - **SqliteStorageEngine** — single DB file; no chokidar watcher needed in server.ts
73
- - Factory: `createStorageEngine(kanbanDir, options?)` in `src/sdk/storage/index.ts`
74
- - Bootstrap: `readBootstrapConfig(workspaceRoot)` reads only `storageEngine`/`sqlitePath` before engine creation (chicken-and-egg resolution)
75
- - SDK migration methods: `migrateToSqlite(dbPath?)` and `migrateToMarkdown()`
76
- - `filePath` is set to `''` for SQLite cards; `sanitizeCard()` strips it from API responses
77
- - **Caution**: JSDoc backticks inside `/** ... */` TypeScript interface comments may contain patterns like `**/` which prematurely close the comment block (e.g. glob patterns). Use prose descriptions instead.
78
-
79
- ## Card Metadata
80
-
81
- Cards support an optional `metadata` field (`Record<string, any>`) for arbitrary user-defined key-value data. Metadata is stored as a native YAML block in the card's frontmatter:
82
-
83
- ```yaml
84
- ---
85
- id: "42"
86
- status: "in-progress"
87
- metadata:
88
- sprint: "2026-Q1"
89
- links:
90
- jira: "PROJ-123"
91
- estimate: 5
92
- ---
93
- ```
94
-
95
- - Parsed with `js-yaml` (only the metadata block; rest of frontmatter uses regex)
96
- - Omitted from frontmatter when undefined or empty `{}`
97
- - Supported across all interfaces: SDK (`createCard`/`updateCard`), CLI (`--metadata '<json>'`), API (JSON body), MCP (`metadata` param)
98
- - UI: key-count chip `{N}` on card grid, collapsible tree view in card detail panel
99
-
100
21
  ## Documentation
101
22
 
102
23
  - **JSDoc:** Always update JSDoc comments when changing any logic, parameters, return types, or behavior of functions, methods, interfaces, or types. JSDoc is the source of truth for `docs/sdk.md`.
@@ -104,15 +25,6 @@ metadata:
104
25
  - **README.md:** Always update `README.md` when adding or modifying user-facing features. Update the relevant Features section, configuration examples, CLI usage examples, REST API tables, and MCP tool table as appropriate.
105
26
  - **CHANGELOG.md:** Always add an entry to `CHANGELOG.md` for every new feature, behaviour change, or bug fix. Place it under an `## [Unreleased]` section at the top (or the current in-progress version block). Follow the existing format: `### Added`, `### Changed`, `### Fixed` subsections with concise bullet points.
106
27
 
107
- ## Conventions
108
-
109
- - Card IDs are auto-generated from title + date
110
- - Partial ID matching is supported across all interfaces
111
- - Fractional indexing (base-62) for card ordering within columns
112
- - `completedAt` is auto-managed when status changes to/from `done`
113
- - `modified` timestamp is auto-updated on any change
114
- - The standalone server uses synchronous `fs` operations; the SDK uses async `fs/promises`
115
-
116
28
  ## Agent execution rules (cost control):
117
29
 
118
30
  1. Do NOT scan or summarize the entire repository.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+ - **Active card lookup**: Added `getActiveCard(boardId?)` to the SDK plus matching REST API, CLI, and MCP support for retrieving the currently active/open card tracked by the UI.
12
+ - **Configurable card panel layout**: Added the `panelMode` setting to switch card creation and detail flows between a right-side drawer and a centered popup.
13
+ - **Adjustable drawer width**: Added the `drawerWidth` setting (20–80%) so drawer mode can be tuned per workspace; board layout and card visibility calculations now respect the configured width.
14
+ - **Clickable label filters**: Clicking a label on a board card or in the card detail panel now applies that label as the active board filter.
15
+ - **Metadata-aware fuzzy search parity**: Added the web UI `Fuzzy` toggle, metadata filter buttons in rendered metadata fields, CLI `kl list --search ... --fuzzy`, REST `q` / `fuzzy` task-list parameters, and MCP `list_cards` `searchQuery` / `fuzzy` inputs with shared metadata-aware semantics.
16
+
17
+ ### Changed
18
+ - **Standalone URL sync**: Browser history and deep links now persist the fuzzy-search state alongside the existing board, card, tab, filter, and search query routing state.
19
+
20
+ ### Fixed
21
+ - **Toolbar search chips**: Mixed search queries in the web UI now render separate removable chips for plain-text terms and each `meta.*` token, so individual constraints can be cleared without wiping the entire query.
22
+
23
+ ### Removed
24
+ - **Legacy webview build path**: Deleted `src/webview/main.tsx`, `src/webview/index.html`, and `vite.config.ts` — these produced `dist/webview/` which was unused since the dual-runtime `standalone-shim.ts` design was introduced. The active build path (`vite.standalone.config.ts` → `dist/standalone-webview/`) is unchanged.
25
+ - **npm scripts**: Removed `build:webview` and `watch:webview`; the `watch` aggregate script now uses `watch:standalone-webview`.
26
+
10
27
  ### Added
11
28
  - **Board logs**: Each board now has its own log file at `.kanban/boards/<boardId>/board.log` for board-level audit trail entries. Board logs share the same `LogEntry` format as card logs (timestamp, source, text, optional JSON object) but are not tied to any card.
12
29
  - **SDK**: `getBoardLogFilePath(boardId?)`, `listBoardLogs(boardId?)`, `addBoardLog(text, options?, boardId?)`, `clearBoardLogs(boardId?)` methods on `KanbanSDK`. Emits `board.log.added` and `board.log.cleared` events.
package/CONTRIBUTING.md CHANGED
@@ -50,7 +50,7 @@ src/
50
50
  ```
51
51
 
52
52
  - **Extension** is bundled with esbuild (`npm run build:extension`)
53
- - **Webview** is bundled with Vite (`npm run build:webview`)
53
+ - **Webview** is bundled with Vite (`npm run build:standalone-webview`)
54
54
 
55
55
  ## Development
56
56
 
package/README.md CHANGED
@@ -45,9 +45,12 @@ kl add --title "My first task" --priority high
45
45
  - **Real-time updates**: WebSocket-powered live sync across clients
46
46
  - **Light & dark mode** support
47
47
  - **Tabbed settings panel**: Settings organized into **General**, **Defaults**, and **Labels** tabs
48
+ - **Flexible panel layouts**: Open card details and creation flows as a right-side drawer or a centered popup
49
+ - **Adjustable drawer width**: Tune drawer mode between 20–80% of the viewport from the Layout settings
48
50
  - **Zoom controls**: Scale the board view and card detail panel independently between 75–150% via settings sliders or keyboard shortcuts
49
51
  - **Column sorting**: Sort cards within a column by priority, due date, or creation date from the column menu
50
52
  - **Smooth scroll to selection**: Board automatically scrolls to the selected card
53
+ - **URL-synced standalone navigation**: In standalone mode, the active board, card, tab, filters, search query, and fuzzy mode persist in browser history and deep links
51
54
  - **Keyboard shortcuts**:
52
55
  - `N` - Create new card
53
56
  - `Esc` - Close dialogs
@@ -71,7 +74,11 @@ kl add --title "My first task" --priority high
71
74
  - **Timestamps**: Created and modified dates tracked automatically
72
75
 
73
76
  ### Filtering & Search
74
- - **Full-text search**: Search across content, IDs, assignees, and labels
77
+ - **Toolbar search with optional fuzzy mode**: Exact search is the default; enable the `Fuzzy` toggle in the web UI to match near-misses across card text and metadata values
78
+ - **Metadata token search**: Use `meta.field: value` tokens for field-scoped searches that behave consistently across the web UI, CLI, REST API, and MCP
79
+ - **Removable search chips**: Mixed searches are split into separate toolbar chips for plain text and each `meta.*` token, so you can remove one constraint without clearing the whole query
80
+ - **Metadata filter buttons**: Click the filter icon next to rendered metadata values in the card detail panel to inject the correct `meta.field: value` token into the shared search box
81
+ - **Clickable label filters**: Click a label on a board card or in the card detail panel to immediately filter the board to that label
75
82
  - **Priority filter**: Show only critical, high, medium, or low items
76
83
  - **Assignee filter**: Filter by team member or show unassigned items
77
84
  - **Label filter**: Filter by specific labels
@@ -99,6 +106,13 @@ kl list
99
106
  # List with filters
100
107
  kl list --status todo --priority high
101
108
 
109
+ # Exact and fuzzy search
110
+ kl list --search "release meta.team: backend"
111
+ kl list --search "meta.team: backnd api plumbng" --fuzzy
112
+
113
+ # Combine fuzzy search with structured metadata filters
114
+ kl list --search "release" --fuzzy --meta sprint=Q1 --meta links.jira=PROJ-123
115
+
102
116
  # Create a card
103
117
  kl add --title "Implement search" --priority high --label "frontend,search"
104
118
 
@@ -108,6 +122,9 @@ kl add --title "Deploy service" --actions "retry,rollback,notify"
108
122
  # Show card details
109
123
  kl show implement-search
110
124
 
125
+ # Show the currently active/open card
126
+ kl active
127
+
111
128
  # Move to a different column
112
129
  kl move implement-search in-progress
113
130
 
@@ -149,6 +166,12 @@ kl board-log add --text "Pipeline passed" \
149
166
  --source ci --object '{"build":"42"}' # With source and data
150
167
  kl board-log clear # Clear all board logs
151
168
 
169
+ # Board Actions
170
+ kl board-actions list --board default # List board-level actions
171
+ kl board-actions add --board default \
172
+ --key deploy --title "Deploy to Production" # Add/update a board action
173
+ kl board-actions fire --board default deploy # Trigger a board action
174
+
152
175
  # Boards
153
176
  kl boards # List boards
154
177
  kl boards add --id bugs --name "Bug Tracker" # Create a board
@@ -244,11 +267,22 @@ All responses follow the format `{ "ok": true, "data": ... }` or `{ "ok": false,
244
267
  | `PUT` | `/api/boards/:boardId` | Update board configuration |
245
268
  | `DELETE` | `/api/boards/:boardId` | Delete an empty board |
246
269
 
270
+ #### Board Actions
271
+
272
+ | Method | Endpoint | Description |
273
+ |--------|----------|-------------|
274
+ | `GET` | `/api/boards/:boardId/actions` | List named board actions |
275
+ | `POST` | `/api/boards/:boardId/actions` | Replace the board action map |
276
+ | `PUT` | `/api/boards/:boardId/actions/:key` | Add or update a single board action title |
277
+ | `DELETE` | `/api/boards/:boardId/actions/:key` | Remove a named board action |
278
+ | `POST` | `/api/boards/:boardId/actions/:key/trigger` | Trigger a board action webhook event |
279
+
247
280
  #### Tasks
248
281
 
249
282
  | Method | Endpoint | Description |
250
283
  |--------|----------|-------------|
251
- | `GET` | `/api/tasks` | List all tasks (query: `?status=&priority=&assignee=&label=`) |
284
+ | `GET` | `/api/tasks` | List all tasks (query: `?q=&fuzzy=&meta.<field>=&status=&priority=&assignee=&label=`) |
285
+ | `GET` | `/api/tasks/active` | Get the currently active/open task |
252
286
  | `GET` | `/api/tasks/:id` | Get a single task |
253
287
  | `POST` | `/api/tasks` | Create a task |
254
288
  | `PUT` | `/api/tasks/:id` | Update task properties |
@@ -257,6 +291,8 @@ All responses follow the format `{ "ok": true, "data": ... }` or `{ "ok": false,
257
291
 
258
292
  Board-scoped equivalents are available at `/api/boards/:boardId/tasks/...`.
259
293
 
294
+ `q` is the free-text search input, `fuzzy=true` enables typo-tolerant matching, and `meta.<field>=value` keeps metadata filtering field-scoped. The same search semantics are shared with `kl list --search ... --fuzzy` and the MCP `list_cards` tool.
295
+
260
296
  #### Transfer
261
297
 
262
298
  | Method | Endpoint | Description |
@@ -338,6 +374,13 @@ curl -X POST http://localhost:3000/api/tasks \
338
374
  -d '{"content": "# My Task\n\nDescription here", "status": "todo", "priority": "high"}'
339
375
  ```
340
376
 
377
+ ### Example: Search tasks via API
378
+
379
+ ```bash
380
+ curl "http://localhost:3000/api/tasks?q=release&fuzzy=true&meta.team=backend"
381
+ curl "http://localhost:3000/api/boards/bugs/tasks?q=meta.team%3A%20backnd&fuzzy=true&meta.region=us-east"
382
+ ```
383
+
341
384
  ## Webhooks
342
385
 
343
386
  Register webhooks to receive HTTP POST notifications when data changes. Webhooks fire from **all interfaces** — REST API, CLI, MCP server, and the web UI — ensuring consistent event delivery regardless of how a mutation is triggered.
@@ -364,6 +407,7 @@ Register webhooks to receive HTTP POST notifications when data changes. Webhooks
364
407
  | `board.created` | A new board is created |
365
408
  | `board.updated` | Board configuration is changed |
366
409
  | `board.deleted` | A board is deleted |
410
+ | `board.action` | A board-level action is triggered from the toolbar, CLI, REST API, or MCP |
367
411
 
368
412
  ### Payload
369
413
 
@@ -487,6 +531,53 @@ curl -X POST http://localhost:3000/api/tasks \
487
531
  - Actions are **fire-and-forget** — no retry logic or delivery guarantees are built in. Implement idempotency and retries in your own webhook handler if needed.
488
532
  - Action strings have no special meaning to Kanban Lite; you define the vocabulary.
489
533
 
534
+ ## Board Actions
535
+
536
+ Board actions are the board-level sibling to card actions. Define them once per board, and they appear in the toolbar **Actions** dropdown for that board.
537
+
538
+ ### How it works
539
+
540
+ 1. **Define actions on the board** in `.kanban.json`:
541
+
542
+ ```json
543
+ {
544
+ "boards": {
545
+ "default": {
546
+ "name": "Default Board",
547
+ "actions": {
548
+ "deploy": "Deploy to Production",
549
+ "announce": "Post release update"
550
+ }
551
+ }
552
+ }
553
+ }
554
+ ```
555
+
556
+ 2. **Trigger them from any interface**:
557
+
558
+ - **UI**: Use the toolbar **Actions** dropdown on a board that defines actions.
559
+ - **CLI**: `kl board-actions fire --board <boardId> <key>`
560
+ - **REST API**: `POST /api/boards/:boardId/actions/:key/trigger`
561
+ - **MCP**: `trigger_board_action`
562
+
563
+ 3. **Receive a webhook event**: triggering a board action emits a `board.action` event containing the board ID, action key, and display title.
564
+
565
+ ### Managing board actions
566
+
567
+ ```bash
568
+ # List existing actions
569
+ kl board-actions list --board default
570
+
571
+ # Add or update a named action
572
+ kl board-actions add --board default --key deploy --title "Deploy to Production"
573
+
574
+ # Remove an action
575
+ kl board-actions remove --board default deploy
576
+
577
+ # Trigger an action
578
+ kl board-actions fire --board default deploy
579
+ ```
580
+
490
581
  ## MCP Server
491
582
 
492
583
  Expose your kanban board to AI agents (Claude, Cursor, etc.) via the [Model Context Protocol](https://modelcontextprotocol.io/).
@@ -526,9 +617,14 @@ kanban-mcp --dir .kanban # Via dedicated binary
526
617
  | `create_board` | Create a new board with optional custom columns |
527
618
  | `get_board` | Get board configuration and details |
528
619
  | `delete_board` | Delete an empty board |
620
+ | `list_board_actions` | List all named actions defined on a board |
621
+ | `add_board_action` | Add or update a named board action |
622
+ | `remove_board_action` | Remove a named board action |
623
+ | `trigger_board_action` | Trigger a board action webhook event |
529
624
  | `transfer_card` | Move a card from one board to another |
530
- | `list_cards` | List/filter cards by status, priority, assignee, or label |
625
+ | `list_cards` | List/filter cards by status, priority, assignee, label, `searchQuery`, `fuzzy`, and `metaFilter` |
531
626
  | `get_card` | Get full details of a card (supports partial ID matching) |
627
+ | `get_active_card` | Get the currently active/open card, or `null` if none is active |
532
628
  | `create_card` | Create a new card with title, body, status, priority, etc. |
533
629
  | `update_card` | Update fields of an existing card |
534
630
  | `move_card` | Move a card to a different status column |
@@ -558,6 +654,8 @@ kanban-mcp --dir .kanban # Via dedicated binary
558
654
  | `update_webhook` | Update a webhook (url, events, secret, active) |
559
655
  | `remove_webhook` | Remove a webhook |
560
656
  | `get_workspace_info` | Get workspace root path, storage engine, and features directory |
657
+
658
+ For agent-driven search, pass `searchQuery` for free text (including inline tokens like `meta.team: backend`), set `fuzzy: true` to widen matching across text and metadata values, or use `metaFilter` when you want structured dot-notation field filters.
561
659
  | `get_storage_status` | Get current storage engine type and configuration |
562
660
  | `migrate_to_sqlite` | Migrate all card data from markdown to SQLite |
563
661
  | `migrate_to_markdown` | Migrate all card data from SQLite back to markdown files |
@@ -581,6 +679,7 @@ await sdk.deleteBoard('bugs')
581
679
 
582
680
  // Cards (all accept optional boardId as last argument)
583
681
  const cards = await sdk.listCards()
682
+ const activeCard = await sdk.getActiveCard()
584
683
  const card = await sdk.createCard({ content: '# My Task', status: 'todo', priority: 'high' })
585
684
  await sdk.moveCard(card.id, 'in-progress')
586
685
  await sdk.updateCard(card.id, { assignee: 'alice' })
@@ -739,6 +838,10 @@ Board configuration is stored in `.kanban.json` at your project root. It support
739
838
  { "id": "review", "name": "Review", "color": "#8b5cf6" },
740
839
  { "id": "done", "name": "Done", "color": "#22c55e" }
741
840
  ],
841
+ "actions": {
842
+ "deploy": "Deploy to Production",
843
+ "announce": "Post release update"
844
+ },
742
845
  "nextCardId": 1,
743
846
  "defaultStatus": "backlog",
744
847
  "defaultPriority": "medium"
@@ -751,6 +854,8 @@ Board configuration is stored in `.kanban.json` at your project root. It support
751
854
  "compactMode": false,
752
855
  "boardZoom": 100,
753
856
  "cardZoom": 100,
857
+ "panelMode": "drawer",
858
+ "drawerWidth": 50,
754
859
  "actionWebhookUrl": "https://example.com/kanban-actions"
755
860
  }
756
861
  ```
@@ -759,6 +864,8 @@ Columns are fully customizable per board — add, remove, rename, or recolor the
759
864
 
760
865
  `boardZoom` and `cardZoom` set the default zoom percentage (75–150) for the board view and card detail panel respectively. They can also be adjusted live in the Settings panel or with `Ctrl/Cmd + =` / `Ctrl/Cmd + -` keyboard shortcuts.
761
866
 
867
+ `panelMode` controls whether card flows open as a centered popup or a right-side drawer. When using drawer mode, `drawerWidth` sets the default width percentage (20–80) for card creation and detail panels.
868
+
762
869
  ## AI Agent Integration
763
870
  - **Claude Code**: Default, Plan, Auto-edit, and Full Auto modes
764
871
  - **Codex**: Suggest, Auto-edit, and Full Auto modes