kanbango 3.6.2 → 5.1.0

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.
package/LLM_AGENTS.md CHANGED
@@ -1,20 +1,12 @@
1
1
  # MCP Server Guide for LLM Agents
2
2
 
3
- Human-oriented setup guide. **Agents do not load this file automatically.**
3
+ Human-oriented setup. **Agents do not load this file.** Rules live in `agent-playbook.js`.
4
+ `tools/list` is short; full playbook is `kanban_read` `operation=help`.
4
5
 
5
- Canonical usage rules live in code (`agent-playbook.js`) and are injected into MCP
6
- `tools/list` descriptions. After install, the agent only needs the MCP server —
7
- not this markdown.
6
+ ## Config
8
7
 
9
- Optional refresh in-session: `kanban_read` with `operation: "help"`.
8
+ **Claude Desktop / generic MCP:**
10
9
 
11
- ## Quick Integration
12
-
13
- ### Configuration
14
-
15
- Add to your MCP client configuration:
16
-
17
- **Claude Desktop:**
18
10
  ```json
19
11
  {
20
12
  "mcpServers": {
@@ -26,507 +18,34 @@ Add to your MCP client configuration:
26
18
  }
27
19
  ```
28
20
 
29
- **General MCP:**
30
- ```json
31
- {
32
- "mcpServers": {
33
- "kanbango": {
34
- "command": "node",
35
- "args": ["path/to/mcp-server.js"]
36
- }
37
- }
38
- }
39
- ```
40
-
41
- ### Project Automation (Claude Code + OpenCode)
42
-
43
- Generate project configs automatically in the current folder:
44
-
45
- ```bash
46
- # Local install (recommended)
47
- npx kanbango mcp-init
48
-
49
- # Use npx-based command in configs
50
- npx kanbango mcp-init --npx
51
-
52
- # Only Claude Code config
53
- npx kanbango mcp-init --claude
54
-
55
- # Only OpenCode config
56
- npx kanbango mcp-init --opencode
57
- ```
58
-
59
- This creates:
60
- - `.mcp.json` for Claude Code (project-scoped MCP servers)
61
- - `opencode.json` for OpenCode (project-scoped MCP servers)
62
-
63
- ## Available Tools
64
-
65
- ### 1. kanban_read
66
-
67
- Read tasks from kanban board. Can list all tasks, filter by column/epic, or get details of a specific task.
68
-
69
- **Operations:**
70
- - `list` - Get all tasks (with optional filters)
71
- - `show` - Get specific task details
72
- - `help` - Return token playbook from `agent-playbook.js` (no board I/O)
73
-
74
- **Parameters:**
75
- ```json
76
- {
77
- "operation": "list", // "list" | "show" | "help"
78
- "task_id": "014", // Required for "show"
79
- "col": "planned", // Optional: "active" | "planned" | "icebox" | "done"
80
- "epic": "Phase 1" // Optional: filter by epic group
81
- }
82
- ```
83
-
84
- **Examples:**
85
-
86
- List all tasks:
87
- ```json
88
- {
89
- "operation": "list"
90
- }
91
- ```
92
-
93
- List tasks in active column:
94
- ```json
95
- {
96
- "operation": "list",
97
- "col": "active"
98
- }
99
- ```
100
-
101
- Get specific task details:
102
- ```json
103
- {
104
- "operation": "show",
105
- "task_id": "014"
106
- }
107
- ```
108
-
109
- **Response (list):**
110
- ```json
111
- [
112
- {
113
- "id": "014",
114
- "title": "Google Calendar Integration",
115
- "column": "active",
116
- "epic_group": "Phase 1",
117
- "created": "2026-03-15",
118
- "subtasks": [
119
- { "done": true, "text": "API authentication" },
120
- { "done": false, "text": "Event synchronization" }
121
- ]
122
- }
123
- ]
124
- ```
125
-
126
- **Response (show):**
127
- ```json
128
- {
129
- "id": "014",
130
- "title": "Google Calendar Integration",
131
- "column": "active",
132
- "epic_group": "Phase 1",
133
- "created": "2026-03-15",
134
- "subtasks": [
135
- { "done": true, "text": "API authentication" },
136
- { "done": false, "text": "Event synchronization" }
137
- ]
138
- }
139
- ```
140
-
141
- ---
142
-
143
- ### 2. kanban_manage
144
-
145
- Create, move, or patch-update kanban tasks. Single tool for all mutations.
146
-
147
- **Actions:**
148
- - `create` - Create a new task with optional rich planning fields
149
- - `move` - Move a task to a different column
150
- - `update` - Apply a field-level patch to any task attributes
151
-
152
- **Parameters (create):**
153
- ```json
154
- {
155
- "action": "create",
156
- "title": "New feature", // Required (only hard requirement)
157
- "col": "planned", // Optional, default "planned"
158
- "epic": "Phase 1", // Optional, default "—"
159
- "description": "Context and plan", // Strongly recommended
160
- "specs": "Technical constraints", // Strongly recommended
161
- "in_scope": ["What is included"], // Strongly recommended
162
- "out_of_scope": ["What is excluded"], // Strongly recommended
163
- "acceptance_criteria": ["Must work"], // Strongly recommended
164
- "test_cases": ["Verify X"], // Recommended
165
- "subtasks": [{"text": "Do it", "done": false}],
166
- "notes": "Freeform notes"
167
- }
168
- ```
169
-
170
- **Create field policy:** only `title` is hard-required (GUI/CLI quick-add stays usable). For agent work, always send the strongly recommended fields. If any are missing, create still succeeds and the response includes `warnings` + `missing_recommended`.
171
-
172
- **Parameters (move):**
173
- ```json
174
- {
175
- "action": "move",
176
- "task_id": "014", // Required
177
- "column": "done" // Required: target column
178
- }
179
- ```
180
-
181
- **Parameters (update):**
182
- ```json
183
- {
184
- "action": "update",
185
- "task_id": "014", // Required
186
- "patch": {"description": "New context"}, // Field-level patch object
187
- "title": "New title", // Shortcut, equivalent to patch.title
188
- "subtasks": [{"text": "A", "done": true}], // Preferred full subtask list
189
- "return": "summary" // "none" | "summary" | "full" (default "summary")
190
- }
191
- ```
192
-
193
- **Examples:**
194
-
195
- Create a task:
196
- ```json
197
- {
198
- "action": "create",
199
- "title": "Database optimization",
200
- "col": "planned",
201
- "epic": "Performance",
202
- "description": "Reduce N+1 queries on board list",
203
- "specs": "Keep JSON storage; no new deps",
204
- "in_scope": ["list query path"],
205
- "out_of_scope": ["GUI redesign"],
206
- "acceptance_criteria": ["list stays correct under load"]
207
- }
208
- ```
209
-
210
- Move task to done:
211
- ```json
212
- {
213
- "action": "move",
214
- "task_id": "014",
215
- "column": "done"
216
- }
217
- ```
218
-
219
- Patch-update task fields:
220
- ```json
221
- {
222
- "action": "update",
223
- "task_id": "014",
224
- "patch": {
225
- "title": "Updated title",
226
- "description": "New implementation plan",
227
- "epic_group": "Phase 2",
228
- "subtasks": [
229
- { "id": "st-1", "text": "Research", "done": true },
230
- { "id": "st-2", "text": "Implementation", "done": false }
231
- ]
232
- }
233
- }
234
- ```
235
-
236
- ---
21
+ Generate project files: `npx kanbango mcp-init` (optional `--npx`, `--claude`, `--opencode`).
22
+ Writes `.mcp.json` and/or `opencode.json`.
237
23
 
238
- ### 3. kanban_gui
24
+ Auto-GUI: set `KANBANGO_AUTO_GUI=1`. Pin port with `KANBANGO_GUI_PORT`. Label with `KANBANGO_PROJECT_NAME`.
239
25
 
240
- Control the web GUI server: start, stop, or check status.
26
+ ## Tools
241
27
 
242
- **Ownership (important):**
243
- - `stop` only sends SIGTERM to a GUI **spawned by this MCP process** (`owned: true`).
244
- - If the GUI was started elsewhere (CLI `kanban serve`, another MCP), `stop` returns `external_running` and does **not** kill that PID.
245
- - `status` distinguishes `running` (owned), `external_running` (discovered via port file), and `not_running`.
28
+ | Tool | Role |
29
+ |------|------|
30
+ | `kanban_read` | Omit operation = context (wake). list `view=summary`. `operation=help` for the playbook |
31
+ | `kanban_manage` | create / move / update / delete / epic_* / plan_*. Writes default `return=none` |
32
+ | `kanban_gui` | `status` before `start`. `stop` only owned. `external_running` = do not kill |
246
33
 
247
- **Port resolution (start):**
248
- 1. Explicit `port` argument, if provided
249
- 2. Else `KANBANGO_GUI_PORT` env
250
- 3. Else stable hash of project cwd in range `5510–5999`
34
+ Create returns `{ok, id, missing?}`. List hides `column=done` and tasks under done/archived epics unless you pass `include_done` / `include_archived` / `col=done`.
251
35
 
252
- If the preferred port is busy, the server picks the next free port. Always trust the returned `url` / `port` (also written to `backlog/.kanbango-gui.json`). Responses also include `project` (basename of project cwd, or `KANBANGO_PROJECT_NAME`) so agents and humans can tell boards apart; the GUI tab title and header show the same label.
36
+ Kanbango core does not require QA, review agents, OpenCode, or another runner. Testing/review gates and agent spawns are optional project configuration.
253
37
 
254
- **Auto-start with MCP:** set `KANBANGO_AUTO_GUI=1` in the MCP server env. GUI starts when MCP starts; use `status` to read the URL.
38
+ Wake: one `kanban_read` (no operation). Then `show` with `view=planning` or `view=execution`. Do not re-list the full board after every write. Context skips blocked active work, surfaces failed/blocked gates and manual testing/review, and only starts the next unblocked planned task. Writes (`create`/`move`/`update`/`plan_*`) default `return=none` no full card, subtasks, or evidence echo. Cost probe: `node benchmarks/agent-workflow.js --size 0 --size 10 --size 1000` (MCP JSON bytes ≠ tokens).
255
39
 
256
- **Actions:**
257
- - `start` - Launch the GUI server (or report already_running owned/external)
258
- - `stop` - Stop only MCP-owned GUI
259
- - `status` - Check GUI state
40
+ ## Errors
260
41
 
261
- **Parameters:**
262
- ```json
263
- {
264
- "action": "start", // "start" | "stop" | "status"
265
- "port": 5821 // Optional, only for "start"
266
- }
267
- ```
268
-
269
- **Examples:**
270
-
271
- Start GUI (stable project port):
272
- ```json
273
- {
274
- "action": "start"
275
- }
276
- ```
277
-
278
- Start GUI on custom port:
279
- ```json
280
- {
281
- "action": "start",
282
- "port": 8080
283
- }
284
- ```
285
-
286
- Stop the GUI:
287
- ```json
288
- {
289
- "action": "stop"
290
- }
291
- ```
292
-
293
- Check status:
294
- ```json
295
- {
296
- "action": "status"
297
- }
298
- ```
299
-
300
- **Response (start):**
301
- ```json
302
- {
303
- "status": "started",
304
- "owned": true,
305
- "port": 5623,
306
- "pid": 12345,
307
- "url": "http://localhost:5623"
308
- }
309
- ```
310
-
311
- **Response (stop - owned):**
312
- ```json
313
- {
314
- "status": "stopping",
315
- "owned": true,
316
- "port": 5623,
317
- "pid": 12345
318
- }
319
- ```
320
-
321
- **Response (stop - external refused):**
322
- ```json
323
- {
324
- "status": "external_running",
325
- "owned": false,
326
- "port": 5623,
327
- "pid": 12345,
328
- "url": "http://localhost:5623",
329
- "hint": "GUI was not started by this MCP process; stop refused."
330
- }
331
- ```
332
-
333
- **Response (status - running owned):**
334
- ```json
335
- {
336
- "status": "running",
337
- "owned": true,
338
- "port": 5623,
339
- "pid": 12345,
340
- "url": "http://localhost:5623"
341
- }
342
- ```
343
-
344
- **Response (status - external):**
345
- ```json
346
- {
347
- "status": "external_running",
348
- "owned": false,
349
- "port": 5623,
350
- "pid": 99999,
351
- "url": "http://localhost:5623"
352
- }
353
- ```
354
-
355
- **Response (status - not running):**
356
- ```json
357
- {
358
- "status": "not_running"
359
- }
360
- ```
361
-
362
- ---
363
-
364
- ## Data Structure
365
-
366
- ### Task Object
367
-
368
- ```json
369
- {
370
- "id": "string", // Numeric task identifier (e.g., "014")
371
- "title": "string", // Task title, kept separate from the ID
372
- "column": "string", // "active" | "planned" | "icebox" | "done"
373
- "epic_group": "string", // Epic group name or "—"
374
- "created": "string", // Creation date (YYYY-MM-DD)
375
- "description": "string", // High-level context
376
- "specs": "string", // Technical constraints
377
- "in_scope": ["string"], // What this task includes
378
- "out_of_scope": ["string"], // Explicit non-goals
379
- "acceptance_criteria": ["string"],
380
- "test_cases": ["string"],
381
- "notes": "string",
382
- "subtasks": [
383
- {
384
- "id": "string",
385
- "done": "boolean",
386
- "text": "string",
387
- "description": "string"
388
- }
389
- ]
390
- }
391
- ```
392
-
393
- ### Columns
394
-
395
- - `active` - In progress (max 1-2 tasks recommended)
396
- - `planned` - Planned for implementation
397
- - `icebox` - Frozen / nice-to-have
398
- - `done` - Completed
399
-
400
- ---
401
-
402
- ## Usage Patterns
403
-
404
- ### Pattern 1: Task Discovery
405
-
406
- ```json
407
- { "tool": "kanban_read", "arguments": { "operation": "list", "col": "active" } }
408
- ```
409
-
410
- ### Pattern 2: Task Creation Workflow
411
-
412
- ```json
413
- // 1. Create task with strongly recommended planning fields
414
- { "tool": "kanban_manage", "arguments": {
415
- "action": "create",
416
- "title": "New feature",
417
- "col": "planned",
418
- "epic": "Phase 1",
419
- "description": "Why this exists",
420
- "specs": "APIs and constraints",
421
- "in_scope": ["Core path"],
422
- "out_of_scope": ["Mobile"],
423
- "acceptance_criteria": ["npm test passes"]
424
- } }
425
-
426
- // 2. Get task details to see generated ID
427
- { "tool": "kanban_read", "arguments": { "operation": "show", "task_id": "015" } }
428
-
429
- // 3. Update with subtasks
430
- { "tool": "kanban_manage", "arguments": { "action": "update", "task_id": "015", "subtasks": [{"done": false, "text": "Research"}, {"done": false, "text": "Implementation"}] } }
431
- ```
432
-
433
- ### Pattern 3: Task Progression
434
-
435
- ```json
436
- // Move from planned → active
437
- { "tool": "kanban_manage", "arguments": { "action": "move", "task_id": "015", "column": "active" } }
438
-
439
- // Update subtasks in one call
440
- { "tool": "kanban_manage", "arguments": { "action": "update", "task_id": "015", "subtasks": [{ "done": true, "text": "Research" }, { "done": false, "text": "Implementation" }] } }
441
-
442
- // Move from active → done
443
- { "tool": "kanban_manage", "arguments": { "action": "move", "task_id": "015", "column": "done" } }
444
- ```
445
-
446
- ### Pattern 4: Epic Management
447
-
448
- ```json
449
- // List all tasks in an epic
450
- { "tool": "kanban_read", "arguments": { "operation": "list", "epic": "Performance" } }
451
-
452
- // Create task in specific epic (still include recommended fields)
453
- { "tool": "kanban_manage", "arguments": {
454
- "action": "create",
455
- "title": "Cache optimization",
456
- "epic": "Performance",
457
- "description": "Reduce repeated board reads",
458
- "specs": "In-memory cache with TTL",
459
- "in_scope": ["list endpoint"],
460
- "out_of_scope": ["distributed cache"],
461
- "acceptance_criteria": ["p95 list latency down"]
462
- } }
463
- ```
464
-
465
- ---
466
-
467
- ## Token-efficient playbook (source of truth)
468
-
469
- **Edit `agent-playbook.js` only.** MCP tool descriptions and `operation=help` are built from it.
470
-
471
- At runtime agents already receive the rules via tool descriptions. Humans can also call:
472
-
473
- ```json
474
- { "operation": "help" }
475
- ```
476
-
477
- on `kanban_read` (no board I/O).
478
-
479
- ### Drop-in for project `AGENTS.md` (optional)
480
-
481
- Same bullets as `DROP_IN_RULE` in `agent-playbook.js` — copy if you want them outside MCP:
482
-
483
- ```text
484
- Kanbango MCP — token rules:
485
- - list: col filter, view=summary; keep task_ids; no full-board re-list after writes
486
- - show: view=execution while coding; full only if needed
487
- - create once with description,specs,in_scope,out_of_scope,acceptance_criteria
488
- - move/update: return=none; subtasks=full array replace
489
- - non-trivial: plan_create → plan_advance → plan_evidence (real tests, truncated logs) → plan_done
490
- - gui: status before start; stop only owned; external_running = do not kill
491
- ```
492
-
493
- ### Columns
494
- `planned` → `active` (few at a time) → `done`. Use `icebox` for parked work.
495
-
496
- ---
497
-
498
- ## Error Handling
499
-
500
- All tools return structured error responses:
501
-
502
- ```json
503
- {
504
- "error": {
505
- "code": "TASK_NOT_FOUND",
506
- "message": "Task 999 was not found",
507
- "hint": "Call kanban_read with operation=list to discover valid task ids",
508
- "details": {},
509
- "retryable": false
510
- }
511
- }
512
- ```
513
-
514
- ---
515
-
516
- ## Installation for Users
517
-
518
- Tell users to run:
519
-
520
- ```bash
521
- npm install -g kanbango
522
- ```
42
+ Structured `{error:{code,message,hint,details,retryable}}`. `next_tool_call` only when the repair is unique (`TASK_NOT_FOUND`, `INVALID_TRANSITION`). Concurrent writers on one local board may receive `BOARD_LOCKED` (`retryable=true`); retry the mutation. No lock across machines or shared/network storage. Corrupt task/epic JSON on list or context is `PARSE_ERROR` (`details.file`); never a partial board.
523
43
 
524
- Then add to their MCP configuration using the examples above.
44
+ ## Concurrency
525
45
 
526
- ---
46
+ One local `backlog/` only. MCP, CLI, and GUI share `backlog/.board.lock`. Not a distributed store.
527
47
 
528
48
  ## Support
529
49
 
50
+ - API map: [API.md](./API.md)
530
51
  - GitHub: https://github.com/k0r81/kanbango
531
- - Issues: https://github.com/k0r81/kanbango/issues
532
- - Full docs: https://github.com/k0r81/kanbango#readme
package/README.md CHANGED
@@ -22,14 +22,18 @@ npx kanbango --help
22
22
  ## Quick Start
23
23
 
24
24
  ```bash
25
- # Initialize backlog directories
25
+ # Initialize backlog directories (TTY: config wizard for QA/review gates)
26
26
  kanban init
27
27
 
28
+ # Re-open project config wizard (writes backlog/kanbango.json)
29
+ kanban config
30
+
28
31
  # Start web GUI (stable project port; prints the real URL)
29
32
  kanban serve
30
33
 
31
- # List all tasks
34
+ # List tasks (hides column=done unless --col done)
32
35
  kanban list --json
36
+ kanban list --col done --json
33
37
 
34
38
  # Add an epic (initiative container), then a task under it
35
39
  kanban epic add "Phase 1" --description "Why this initiative" --goals "Ship X"
@@ -49,7 +53,7 @@ kanban rm 001
49
53
  # Show details
50
54
  kanban show 001
51
55
 
52
- # Move between columns (active | planned | icebox | done)
56
+ # Move between columns (active | planned | icebox | testing | review | done)
53
57
  kanban move 001 active
54
58
 
55
59
  # Update subtasks in one call
@@ -73,8 +77,36 @@ Epic status is **derived** from child task columns (not a board column).
73
77
  | `active` | In progress (keep to 1–2 tasks) |
74
78
  | `planned` | Ready to implement |
75
79
  | `icebox` | Nice-to-have / frozen |
80
+ | `testing` | Optional project gate (default off) |
81
+ | `review` | Optional project gate (default off) |
76
82
  | `done` | Completed |
77
83
 
84
+ ### Project config (`backlog/kanbango.json`)
85
+
86
+ Optional. Missing file = core board only: `icebox`, `planned`, `active`, and `done`.
87
+ Workflow gates and agents are opt-in project configuration.
88
+
89
+ On a **TTY**, `kanban init` / `kanban mcp-init` open a checkbox wizard when the file is missing. The default is the core board with gates and agents off. Non-TTY (CI, pipes, MCP) never blocks or creates a config; it prints a hint to run `kanban config` in a terminal. `kanban config` always opens the wizard (TTY required); invalid existing JSON is **not** overwritten (error + fix/remove).
90
+
91
+ ```json
92
+ {
93
+ "columns": {
94
+ "testing": { "enabled": false, "label": "Testing" },
95
+ "review": { "enabled": false, "label": "Review" }
96
+ },
97
+ "workflow": {
98
+ "enabled": true,
99
+ "testing_agent": { "enabled": true, "name": "qa-tester" },
100
+ "review_agent": { "enabled": false, "name": "temida" }
101
+ }
102
+ }
103
+ ```
104
+
105
+ - Only `testing` and `review` are configurable (core columns stay on).
106
+ - `enabled: false` on a gate column hides it and moves existing cards in that column to `planned`.
107
+ - Agent `enabled: false` keeps an explicitly enabled column as a **manual** gate (no auto spawn).
108
+ - Legacy string agent names still work: `"testing_agent": "qa-tester"`.
109
+
78
110
  ## Data Structure
79
111
 
80
112
  Tasks are JSON files in `backlog/<column>/`:
@@ -151,11 +183,11 @@ Once connected, your agent gets access to these tools:
151
183
 
152
184
  | Tool | What it does |
153
185
  |------|-------------|
154
- | `kanban_read` | List/show tasks (`view=summary` by default cheap) |
186
+ | `kanban_read` | Omit operation = context (wake: unblocked active / gate / next planned). list `view=summary`; playbook via `operation=help` |
155
187
  | `kanban_manage` | Create, move, update, plan_* workflow |
156
188
  | `kanban_gui` | Start / status / stop (stop only kills GUI this MCP started) |
157
189
 
158
- **Token tip for agents:** rules ship inside MCP tool descriptions (`agent-playbook.js`). Optional: `kanban_read` `operation: "help"`. Human setup notes: [LLM_AGENTS.md](./LLM_AGENTS.md).
190
+ **Token tip for agents:** `tools/list` is short. Full rules: `kanban_read` `operation: "help"` (`agent-playbook.js`). Wake = context + one `show` (planning/execution), not `list` + `full`. Writes default `return=none`. Cost probe: `node benchmarks/agent-workflow.js`. Human setup: [LLM_AGENTS.md](./LLM_AGENTS.md).
159
191
 
160
192
  Your agent stays in sync with your real board — every change is persisted as JSON files.
161
193
 
@@ -163,14 +195,15 @@ Your agent stays in sync with your real board — every change is persisted as J
163
195
 
164
196
  | Command | Description |
165
197
  |---------|-------------|
166
- | `kanban init` | Create backlog directory structure |
198
+ | `kanban init` | Create backlog dirs; TTY wizard if `kanbango.json` missing |
199
+ | `kanban config` | Interactive project config wizard (`backlog/kanbango.json`) |
167
200
  | `kanban serve [PORT]` | Start web GUI (stable project port, or PORT / KANBANGO_GUI_PORT) |
168
- | `kanban list [--col <col>] [--json]` | List tasks |
201
+ | `kanban list [--col <col>] [--json]` | List tasks (hides `done` unless `--col done`) |
169
202
  | `kanban show <ID>` | Show task details |
170
203
  | `kanban add <TITLE>` | Add a new task |
171
204
  | `kanban move <ID> <COL>` | Move task |
172
205
  | `kanban mcp` | Start MCP server (stdio) |
173
- | `kanban mcp-init` | Generate MCP config files |
206
+ | `kanban mcp-init` | Generate MCP config files; TTY wizard if project config is missing |
174
207
  | `kanban plan <action> --json '{...}'` | Accepted-plan workflow (create/advance/evidence/done/status) |
175
208
 
176
209
  ## Web GUI
@@ -178,14 +211,14 @@ Your agent stays in sync with your real board — every change is persisted as J
178
211
  ```bash
179
212
  kanban serve
180
213
  ```
181
- - Swimlanes grouped by epic
182
- - Drag-and-drop between columns
183
- - Inline editing and subtask checkboxes
214
+ - Epic rail + NOW panel (`next_action` from `/api/context`)
215
+ - Cards show blocked-by dependency ids
216
+ - Drag-and-drop between columns; inline edit and subtask checkboxes
184
217
 
185
218
  ## Using as a Node.js module
186
219
 
187
220
  ```js
188
- const kanban = require('kanbango');
221
+ const { kanban } = require('kanbango');
189
222
  const tasks = await kanban.allTasks();
190
223
  ```
191
224