kanbango 3.8.0 → 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
- - steps on create/plan_create → subtasks (no forced TDD); runner optional; optional plan_*: plan_create → plan_advance → plan_evidence (diff|summary|test_command) → 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
@@ -31,8 +31,9 @@ kanban config
31
31
  # Start web GUI (stable project port; prints the real URL)
32
32
  kanban serve
33
33
 
34
- # List all tasks
34
+ # List tasks (hides column=done unless --col done)
35
35
  kanban list --json
36
+ kanban list --col done --json
36
37
 
37
38
  # Add an epic (initiative container), then a task under it
38
39
  kanban epic add "Phase 1" --description "Why this initiative" --goals "Ship X"
@@ -52,7 +53,7 @@ kanban rm 001
52
53
  # Show details
53
54
  kanban show 001
54
55
 
55
- # Move between columns (active | planned | icebox | done)
56
+ # Move between columns (active | planned | icebox | testing | review | done)
56
57
  kanban move 001 active
57
58
 
58
59
  # Update subtasks in one call
@@ -76,21 +77,22 @@ Epic status is **derived** from child task columns (not a board column).
76
77
  | `active` | In progress (keep to 1–2 tasks) |
77
78
  | `planned` | Ready to implement |
78
79
  | `icebox` | Nice-to-have / frozen |
79
- | `testing` | Optional QA gate (default on) |
80
- | `review` | Optional review gate (default on) |
80
+ | `testing` | Optional project gate (default off) |
81
+ | `review` | Optional project gate (default off) |
81
82
  | `done` | Completed |
82
83
 
83
84
  ### Project config (`backlog/kanbango.json`)
84
85
 
85
- Optional. Missing file = six columns, workflow agents off.
86
+ Optional. Missing file = core board only: `icebox`, `planned`, `active`, and `done`.
87
+ Workflow gates and agents are opt-in project configuration.
86
88
 
87
- On a **TTY**, `kanban init` / `kanban mcp-init` open a checkbox wizard when the file is missing (defaults: testing + qa-tester + review + temida all on). 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).
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).
88
90
 
89
91
  ```json
90
92
  {
91
93
  "columns": {
92
- "testing": { "enabled": false, "label": "QA" },
93
- "review": { "enabled": true, "label": "Review" }
94
+ "testing": { "enabled": false, "label": "Testing" },
95
+ "review": { "enabled": false, "label": "Review" }
94
96
  },
95
97
  "workflow": {
96
98
  "enabled": true,
@@ -102,7 +104,7 @@ On a **TTY**, `kanban init` / `kanban mcp-init` open a checkbox wizard when the
102
104
 
103
105
  - Only `testing` and `review` are configurable (core columns stay on).
104
106
  - `enabled: false` on a gate column hides it and moves existing cards in that column to `planned`.
105
- - Agent `enabled: false` keeps the column as a **manual** gate (no auto spawn).
107
+ - Agent `enabled: false` keeps an explicitly enabled column as a **manual** gate (no auto spawn).
106
108
  - Legacy string agent names still work: `"testing_agent": "qa-tester"`.
107
109
 
108
110
  ## Data Structure
@@ -181,11 +183,11 @@ Once connected, your agent gets access to these tools:
181
183
 
182
184
  | Tool | What it does |
183
185
  |------|-------------|
184
- | `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` |
185
187
  | `kanban_manage` | Create, move, update, plan_* workflow |
186
188
  | `kanban_gui` | Start / status / stop (stop only kills GUI this MCP started) |
187
189
 
188
- **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).
189
191
 
190
192
  Your agent stays in sync with your real board — every change is persisted as JSON files.
191
193
 
@@ -196,7 +198,7 @@ Your agent stays in sync with your real board — every change is persisted as J
196
198
  | `kanban init` | Create backlog dirs; TTY wizard if `kanbango.json` missing |
197
199
  | `kanban config` | Interactive project config wizard (`backlog/kanbango.json`) |
198
200
  | `kanban serve [PORT]` | Start web GUI (stable project port, or PORT / KANBANGO_GUI_PORT) |
199
- | `kanban list [--col <col>] [--json]` | List tasks |
201
+ | `kanban list [--col <col>] [--json]` | List tasks (hides `done` unless `--col done`) |
200
202
  | `kanban show <ID>` | Show task details |
201
203
  | `kanban add <TITLE>` | Add a new task |
202
204
  | `kanban move <ID> <COL>` | Move task |
@@ -209,14 +211,14 @@ Your agent stays in sync with your real board — every change is persisted as J
209
211
  ```bash
210
212
  kanban serve
211
213
  ```
212
- - Swimlanes grouped by epic
213
- - Drag-and-drop between columns
214
- - 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
215
217
 
216
218
  ## Using as a Node.js module
217
219
 
218
220
  ```js
219
- const kanban = require('kanbango');
221
+ const { kanban } = require('kanbango');
220
222
  const tasks = await kanban.allTasks();
221
223
  ```
222
224