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/AGENTS.md +25 -18
- package/API.md +58 -170
- package/CHANGELOG.md +76 -0
- package/LLM_AGENTS.md +21 -502
- package/README.md +45 -12
- package/agent-playbook.js +27 -49
- package/bin/kanban.js +395 -300
- package/config-wizard.js +441 -0
- package/index.html +124 -36
- package/kanban.js +892 -263
- package/mcp-server.js +319 -196
- package/package.json +1 -1
- package/plan.js +39 -40
- package/plugins/tui-kanban-controller.js +117 -0
- package/plugins/tui-kanban.tsx +314 -0
- package/workflow.js +368 -21
- package/.ai/lessons.jsonl +0 -9
- package/.ai/retro/close.json +0 -1
- package/.ai/retro/last-run.json +0 -1
- package/.ait-quality.yml +0 -25
- package/bin/kanban-cmd.js +0 -40
- package/kan2.md +0 -76
- package/kanbango.md +0 -48
- package/planv2.md +0 -317
- package/tests/fixtures/fake-opencode.js +0 -69
- package/tests/index.js +0 -19
- package/tests/kanban-cli.js +0 -118
- package/tests/kanban.js +0 -104
- package/tests/run.js +0 -33
package/LLM_AGENTS.md
CHANGED
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
# MCP Server Guide for LLM Agents
|
|
2
2
|
|
|
3
|
-
Human-oriented setup
|
|
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
|
-
|
|
6
|
-
`tools/list` descriptions. After install, the agent only needs the MCP server —
|
|
7
|
-
not this markdown.
|
|
6
|
+
## Config
|
|
8
7
|
|
|
9
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
24
|
+
Auto-GUI: set `KANBANGO_AUTO_GUI=1`. Pin port with `KANBANGO_GUI_PORT`. Label with `KANBANGO_PROJECT_NAME`.
|
|
239
25
|
|
|
240
|
-
|
|
26
|
+
## Tools
|
|
241
27
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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` |
|
|
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
|
|
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
|
|
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
|
-
-
|
|
182
|
-
-
|
|
183
|
-
-
|
|
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
|
|