kanbango 2.1.0 → 2.5.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
@@ -68,7 +68,7 @@ Read tasks from kanban board. Can list all tasks, filter by column/epic, or get
68
68
  ```json
69
69
  {
70
70
  "operation": "list", // "list" or "show"
71
- "task_id": "PI-014-google-calendar", // Required for "show"
71
+ "task_id": "014", // Required for "show"
72
72
  "col": "planned", // Optional: "active" | "planned" | "icebox" | "done"
73
73
  "epic": "Phase 1" // Optional: filter by epic group
74
74
  }
@@ -95,7 +95,7 @@ Get specific task details:
95
95
  ```json
96
96
  {
97
97
  "operation": "show",
98
- "task_id": "PI-014-google-calendar"
98
+ "task_id": "014"
99
99
  }
100
100
  ```
101
101
 
@@ -103,12 +103,12 @@ Get specific task details:
103
103
  ```json
104
104
  [
105
105
  {
106
- "id": "PI-014-google-calendar",
107
- "title": "PI-014: Google Calendar Integration",
106
+ "id": "014",
107
+ "title": "Google Calendar Integration",
108
108
  "column": "active",
109
109
  "epic_group": "Phase 1",
110
110
  "created": "2026-03-15",
111
- "tasks": [
111
+ "subtasks": [
112
112
  { "done": true, "text": "API authentication" },
113
113
  { "done": false, "text": "Event synchronization" }
114
114
  ]
@@ -119,232 +119,202 @@ Get specific task details:
119
119
  **Response (show):**
120
120
  ```json
121
121
  {
122
- "id": "PI-014-google-calendar",
123
- "title": "PI-014: Google Calendar Integration",
122
+ "id": "014",
123
+ "title": "Google Calendar Integration",
124
124
  "column": "active",
125
125
  "epic_group": "Phase 1",
126
126
  "created": "2026-03-15",
127
- "tasks": [
128
- { "done": true, "text": "API authentication" },
129
- { "done": false, "text": "Event synchronization" }
130
- ]
127
+ "subtasks": [
128
+ { "done": true, "text": "API authentication" },
129
+ { "done": false, "text": "Event synchronization" }
130
+ ]
131
131
  }
132
132
  ```
133
133
 
134
134
  ---
135
135
 
136
- ### 2. kanban_create
137
-
138
- Create a new task on kanban board.
136
+ ### 2. kanban_manage
139
137
 
140
- **Parameters:**
141
- ```json
142
- {
143
- "title": "New feature implementation", // Required
144
- "col": "planned", // Optional: "active" | "planned" | "icebox" | "done" (default: "planned")
145
- "epic": "Phase 1" // Optional: epic group name (default: "—")
146
- }
147
- ```
138
+ Create, move, or patch-update kanban tasks. Single tool for all mutations.
148
139
 
149
- **Examples:**
140
+ **Actions:**
141
+ - `create` - Create a new task with optional rich planning fields
142
+ - `move` - Move a task to a different column
143
+ - `update` - Apply a field-level patch to any task attributes
150
144
 
151
- Create task with defaults:
145
+ **Parameters (create):**
152
146
  ```json
153
147
  {
154
- "title": "Add user authentication"
148
+ "action": "create",
149
+ "title": "New feature", // Required (only hard requirement)
150
+ "col": "planned", // Optional, default "planned"
151
+ "epic": "Phase 1", // Optional, default "—"
152
+ "description": "Context and plan", // Strongly recommended
153
+ "specs": "Technical constraints", // Strongly recommended
154
+ "in_scope": ["What is included"], // Strongly recommended
155
+ "out_of_scope": ["What is excluded"], // Strongly recommended
156
+ "acceptance_criteria": ["Must work"], // Strongly recommended
157
+ "test_cases": ["Verify X"], // Recommended
158
+ "subtasks": [{"text": "Do it", "done": false}],
159
+ "notes": "Freeform notes"
155
160
  }
156
161
  ```
157
162
 
158
- Create task with custom column and epic:
163
+ **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`.
164
+
165
+ **Parameters (move):**
159
166
  ```json
160
167
  {
161
- "title": "Database optimization",
162
- "col": "planned",
163
- "epic": "Performance"
168
+ "action": "move",
169
+ "task_id": "014", // Required
170
+ "column": "done" // Required: target column
164
171
  }
165
172
  ```
166
173
 
167
- **Response:**
174
+ **Parameters (update):**
168
175
  ```json
169
176
  {
170
- "id": "PI-015-database-optimization",
171
- "title": "PI-015: Database optimization",
172
- "column": "planned",
173
- "epic_group": "Performance",
174
- "created": "2026-03-16",
175
- "tasks": []
177
+ "action": "update",
178
+ "task_id": "014", // Required
179
+ "patch": {"description": "New context"}, // Field-level patch object
180
+ "title": "New title", // Shortcut, equivalent to patch.title
181
+ "subtasks": [{"text": "A", "done": true}], // Preferred full subtask list
182
+ "return": "summary" // "none" | "summary" | "full" (default "summary")
176
183
  }
177
184
  ```
178
185
 
179
- ---
180
-
181
- ### 3. kanban_update
182
-
183
- Update existing tasks on kanban board. Can move tasks between columns, toggle subtask completion, or update task details.
184
-
185
- **Operations:**
186
- - `move` - Move task to different column
187
- - `toggle` - Toggle subtask completion
188
- - `update` - Update task title and/or subtask list
186
+ **Examples:**
189
187
 
190
- **Parameters:**
188
+ Create a task:
191
189
  ```json
192
190
  {
193
- "operation": "move", // "move" | "toggle" | "update"
194
- "task_id": "PI-014-google-calendar", // Required
195
- "column": "done", // Required for "move"
196
- "idx": 0, // Required for "toggle"
197
- "title": "Updated title", // Optional for "update"
198
- "tasks": [ // Optional for "update"
199
- { "done": true, "text": "Task 1" },
200
- { "done": false, "text": "Task 2" }
201
- ]
191
+ "action": "create",
192
+ "title": "Database optimization",
193
+ "col": "planned",
194
+ "epic": "Performance",
195
+ "description": "Reduce N+1 queries on board list",
196
+ "specs": "Keep JSON storage; no new deps",
197
+ "in_scope": ["list query path"],
198
+ "out_of_scope": ["GUI redesign"],
199
+ "acceptance_criteria": ["list stays correct under load"]
202
200
  }
203
201
  ```
204
202
 
205
- **Examples:**
206
-
207
203
  Move task to done:
208
204
  ```json
209
205
  {
210
- "operation": "move",
211
- "task_id": "PI-014-google-calendar",
206
+ "action": "move",
207
+ "task_id": "014",
212
208
  "column": "done"
213
209
  }
214
210
  ```
215
211
 
216
- Toggle first subtask:
212
+ Patch-update task fields:
217
213
  ```json
218
214
  {
219
- "operation": "toggle",
220
- "task_id": "PI-014-google-calendar",
221
- "idx": 0
215
+ "action": "update",
216
+ "task_id": "014",
217
+ "patch": {
218
+ "title": "Updated title",
219
+ "description": "New implementation plan",
220
+ "epic_group": "Phase 2",
221
+ "subtasks": [
222
+ { "id": "st-1", "text": "Research", "done": true },
223
+ { "id": "st-2", "text": "Implementation", "done": false }
224
+ ]
225
+ }
222
226
  }
223
227
  ```
224
228
 
225
- Update task title:
226
- ```json
227
- {
228
- "operation": "update",
229
- "task_id": "PI-014-google-calendar",
230
- "title": "Google Calendar API Integration"
231
- }
232
- ```
229
+ ---
233
230
 
234
- Update subtasks:
235
- ```json
236
- {
237
- "operation": "update",
238
- "task_id": "PI-014-google-calendar",
239
- "tasks": [
240
- { "done": true, "text": "API authentication" },
241
- { "done": true, "text": "Event synchronization" },
242
- { "done": false, "text": "Error handling" }
243
- ]
244
- }
245
- ```
231
+ ### 3. kanban_gui
246
232
 
247
- **Response (move):**
248
- ```json
249
- {
250
- "success": true,
251
- "message": "Moved PI-014-google-calendar to done"
252
- }
253
- ```
233
+ Control the web GUI server: start, stop, or check status.
254
234
 
255
- **Response (toggle/update):**
256
- ```json
257
- {
258
- "id": "PI-014-google-calendar",
259
- "title": "PI-014: Google Calendar Integration",
260
- "column": "active",
261
- "epic_group": "Phase 1",
262
- "created": "2026-03-15",
263
- "tasks": [
264
- { "done": false, "text": "API authentication" },
265
- { "done": false, "text": "Event synchronization" }
266
- ]
267
- }
268
- ```
235
+ **Port resolution (start):**
236
+ 1. Explicit `port` argument, if provided
237
+ 2. Else `KANBANGO_GUI_PORT` env
238
+ 3. Else stable hash of project cwd in range `5510–5999`
269
239
 
270
- ---
240
+ 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`).
271
241
 
272
- ### 4. kanban_gui_start
242
+ **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.
273
243
 
274
- Start the web GUI server for the kanban board.
244
+ **Actions:**
245
+ - `start` - Launch the GUI server
246
+ - `stop` - Kill the GUI server
247
+ - `status` - Check if the GUI is running (reads live process or port file)
275
248
 
276
249
  **Parameters:**
277
250
  ```json
278
251
  {
279
- "port": 5500 // Optional: port for GUI (default 5500)
252
+ "action": "start", // "start" | "stop" | "status"
253
+ "port": 5821 // Optional, only for "start"
280
254
  }
281
255
  ```
282
256
 
283
257
  **Examples:**
284
258
 
285
- Start GUI on default port:
259
+ Start GUI (stable project port):
286
260
  ```json
287
- {}
261
+ {
262
+ "action": "start"
263
+ }
288
264
  ```
289
265
 
290
266
  Start GUI on custom port:
291
267
  ```json
292
268
  {
269
+ "action": "start",
293
270
  "port": 8080
294
271
  }
295
272
  ```
296
273
 
297
- **Response:**
274
+ Stop the GUI:
298
275
  ```json
299
276
  {
300
- "status": "started",
301
- "port": 5500,
302
- "pid": 12345,
303
- "url": "http://localhost:5500"
277
+ "action": "stop"
304
278
  }
305
279
  ```
306
280
 
307
- ---
308
-
309
- ### 5. kanban_gui_stop
310
-
311
- Stop the web GUI server if it is running.
312
-
313
- **Parameters:**
281
+ Check status:
314
282
  ```json
315
- {}
283
+ {
284
+ "action": "status"
285
+ }
316
286
  ```
317
287
 
318
- **Response:**
288
+ **Response (start):**
319
289
  ```json
320
290
  {
321
- "status": "stopping",
322
- "port": 5500
291
+ "status": "started",
292
+ "port": 5623,
293
+ "pid": 12345,
294
+ "url": "http://localhost:5623"
323
295
  }
324
296
  ```
325
297
 
326
- ---
327
-
328
- ### 6. kanban_gui_status
329
-
330
- Get status of the web GUI server.
331
-
332
- **Parameters:**
298
+ **Response (stop):**
333
299
  ```json
334
- {}
300
+ {
301
+ "status": "stopping",
302
+ "port": 5623,
303
+ "pid": 12345
304
+ }
335
305
  ```
336
306
 
337
- **Response (running):**
307
+ **Response (status - running):**
338
308
  ```json
339
309
  {
340
310
  "status": "running",
341
- "port": 5500,
311
+ "port": 5623,
342
312
  "pid": 12345,
343
- "url": "http://localhost:5500"
313
+ "url": "http://localhost:5623"
344
314
  }
345
315
  ```
346
316
 
347
- **Response (not running):**
317
+ **Response (status - not running):**
348
318
  ```json
349
319
  {
350
320
  "status": "not_running"
@@ -359,15 +329,24 @@ Get status of the web GUI server.
359
329
 
360
330
  ```json
361
331
  {
362
- "id": "string", // Unique task identifier (e.g., "PI-014-google-calendar")
363
- "title": "string", // Full title with ID prefix
332
+ "id": "string", // Numeric task identifier (e.g., "014")
333
+ "title": "string", // Task title, kept separate from the ID
364
334
  "column": "string", // "active" | "planned" | "icebox" | "done"
365
335
  "epic_group": "string", // Epic group name or "—"
366
336
  "created": "string", // Creation date (YYYY-MM-DD)
367
- "tasks": [
337
+ "description": "string", // High-level context
338
+ "specs": "string", // Technical constraints
339
+ "in_scope": ["string"], // What this task includes
340
+ "out_of_scope": ["string"], // Explicit non-goals
341
+ "acceptance_criteria": ["string"],
342
+ "test_cases": ["string"],
343
+ "notes": "string",
344
+ "subtasks": [
368
345
  {
369
- "done": "boolean", // Subtask completion status
370
- "text": "string" // Subtask description
346
+ "id": "string",
347
+ "done": "boolean",
348
+ "text": "string",
349
+ "description": "string"
371
350
  }
372
351
  ]
373
352
  }
@@ -387,51 +366,62 @@ Get status of the web GUI server.
387
366
  ### Pattern 1: Task Discovery
388
367
 
389
368
  ```json
390
- // List all active tasks
391
- { "operation": "list", "col": "active" }
369
+ { "tool": "kanban_read", "arguments": { "operation": "list", "col": "active" } }
392
370
  ```
393
371
 
394
372
  ### Pattern 2: Task Creation Workflow
395
373
 
396
374
  ```json
397
- // 1. Create task
398
- { "title": "New feature", "col": "planned", "epic": "Phase 1" }
375
+ // 1. Create task with strongly recommended planning fields
376
+ { "tool": "kanban_manage", "arguments": {
377
+ "action": "create",
378
+ "title": "New feature",
379
+ "col": "planned",
380
+ "epic": "Phase 1",
381
+ "description": "Why this exists",
382
+ "specs": "APIs and constraints",
383
+ "in_scope": ["Core path"],
384
+ "out_of_scope": ["Mobile"],
385
+ "acceptance_criteria": ["npm test passes"]
386
+ } }
399
387
 
400
388
  // 2. Get task details to see generated ID
401
- { "operation": "show", "task_id": "PI-015-new-feature" }
389
+ { "tool": "kanban_read", "arguments": { "operation": "show", "task_id": "015" } }
402
390
 
403
391
  // 3. Update with subtasks
404
- {
405
- "operation": "update",
406
- "task_id": "PI-015-new-feature",
407
- "tasks": [
408
- { "done": false, "text": "Research" },
409
- { "done": false, "text": "Implementation" }
410
- ]
411
- }
392
+ { "tool": "kanban_manage", "arguments": { "action": "update", "task_id": "015", "subtasks": [{"done": false, "text": "Research"}, {"done": false, "text": "Implementation"}] } }
412
393
  ```
413
394
 
414
395
  ### Pattern 3: Task Progression
415
396
 
416
397
  ```json
417
398
  // Move from planned → active
418
- { "operation": "move", "task_id": "PI-015", "column": "active" }
399
+ { "tool": "kanban_manage", "arguments": { "action": "move", "task_id": "015", "column": "active" } }
419
400
 
420
- // Mark subtask complete
421
- { "operation": "toggle", "task_id": "PI-015", "idx": 0 }
401
+ // Update subtasks in one call
402
+ { "tool": "kanban_manage", "arguments": { "action": "update", "task_id": "015", "subtasks": [{ "done": true, "text": "Research" }, { "done": false, "text": "Implementation" }] } }
422
403
 
423
404
  // Move from active → done
424
- { "operation": "move", "task_id": "PI-015", "column": "done" }
405
+ { "tool": "kanban_manage", "arguments": { "action": "move", "task_id": "015", "column": "done" } }
425
406
  ```
426
407
 
427
408
  ### Pattern 4: Epic Management
428
409
 
429
410
  ```json
430
411
  // List all tasks in an epic
431
- { "operation": "list", "epic": "Performance" }
412
+ { "tool": "kanban_read", "arguments": { "operation": "list", "epic": "Performance" } }
432
413
 
433
- // Create task in specific epic
434
- { "title": "Cache optimization", "epic": "Performance" }
414
+ // Create task in specific epic (still include recommended fields)
415
+ { "tool": "kanban_manage", "arguments": {
416
+ "action": "create",
417
+ "title": "Cache optimization",
418
+ "epic": "Performance",
419
+ "description": "Reduce repeated board reads",
420
+ "specs": "In-memory cache with TTL",
421
+ "in_scope": ["list endpoint"],
422
+ "out_of_scope": ["distributed cache"],
423
+ "acceptance_criteria": ["p95 list latency down"]
424
+ } }
435
425
  ```
436
426
 
437
427
  ---
@@ -439,30 +429,33 @@ Get status of the web GUI server.
439
429
  ## Best Practices for LLM Agents
440
430
 
441
431
  1. **Always use `kanban_read` first** - Discover existing tasks before creating new ones
442
- 2. **Use `col` filter** - Narrow down to relevant column when listing
443
- 3. **Use `epic` grouping** - Organize tasks by features/phases
444
- 4. **Work through subtasks** - Toggle each subtask as you complete them
445
- 5. **Move tasks through workflow** - planned active done progression
446
- 6. **Use `show` operation** - Get full task details including subtasks
447
- 7. **Handle task IDs** - Always use the full task ID returned from create/show
432
+ 2. **Numeric task lookup** - Task IDs are zero-padded numbers (e.g. `"035"`). Unpadded numbers such as `"35"` also work in any `task_id` parameter.
433
+ 3. **Use `col` filter** - Narrow down to relevant column when listing
434
+ 4. **Use `epic` grouping** - Organize tasks by features/phases
435
+ 5. **Create with planning fields** - Always include description, specs, in_scope, out_of_scope, acceptance_criteria; treat `warnings`/`missing_recommended` as a signal to fill gaps
436
+ 6. **Work through subtasks** - Toggle each subtask as you complete them
437
+ 7. **Move tasks through workflow** - planned active done progression
438
+ 8. **Use `show` operation** - Get full task details including subtasks
439
+ 9. **Handle task IDs** - Always use the full task ID returned from create/show
448
440
 
449
441
  ---
450
442
 
451
443
  ## Error Handling
452
444
 
453
- All tools return error messages in this format:
445
+ All tools return structured error responses:
454
446
 
455
447
  ```json
456
448
  {
457
- "error": "Error message description"
449
+ "error": {
450
+ "code": "TASK_NOT_FOUND",
451
+ "message": "Task 999 was not found",
452
+ "hint": "Call kanban_read with operation=list to discover valid task ids",
453
+ "details": {},
454
+ "retryable": false
455
+ }
458
456
  }
459
457
  ```
460
458
 
461
- Common errors:
462
- - `"Task not found: PI-999"` - Task ID doesn't exist
463
- - `"Failed to move task: PI-999"` - Move operation failed
464
- - `"task_id is required for 'show' operation"` - Missing required parameter
465
-
466
459
  ---
467
460
 
468
461
  ## Installation for Users
package/README.md CHANGED
@@ -25,7 +25,7 @@ npx kanbango --help
25
25
  # Initialize backlog directories
26
26
  kanban init
27
27
 
28
- # Start web GUI at http://localhost:5500
28
+ # Start web GUI (stable project port; prints the real URL)
29
29
  kanban serve
30
30
 
31
31
  # List all tasks
@@ -35,13 +35,13 @@ kanban list --json
35
35
  kanban add "My task" --col planned --epic "Phase 1"
36
36
 
37
37
  # Show details
38
- kanban show PI-001
38
+ kanban show 001
39
39
 
40
40
  # Move between columns (active | planned | icebox | done)
41
- kanban move PI-001 active
41
+ kanban move 001 active
42
42
 
43
- # Toggle subtask completion
44
- kanban toggle PI-001 0
43
+ # Update subtasks in one call
44
+ kanban update 001 '{"subtasks":[{"done":true,"text":"Research"},{"done":false,"text":"Implementation"}]}'
45
45
  ```
46
46
 
47
47
  ### Columns
@@ -59,14 +59,17 @@ Tasks are JSON files in `backlog/<column>/`:
59
59
 
60
60
  ```json
61
61
  {
62
- "id": "PI-001-my-feature",
62
+ "id": "001",
63
63
  "title": "My Feature",
64
64
  "column": "planned",
65
65
  "epic_group": "Phase 1",
66
66
  "created": "2026-07-08",
67
67
  "description": "High-level context.",
68
68
  "specs": "Technical details.",
69
+ "in_scope": ["What this task covers"],
70
+ "out_of_scope": ["What is explicitly excluded"],
69
71
  "acceptance_criteria": ["Works as expected"],
72
+ "test_cases": ["Verify the happy path"],
70
73
  "subtasks": [
71
74
  { "id": "st-1", "text": "First step", "done": false }
72
75
  ]
@@ -96,6 +99,24 @@ Add this to your MCP client config (`.mcp.json`, `opencode.json`, or Claude Desk
96
99
  }
97
100
  ```
98
101
 
102
+ Auto-start the web GUI with MCP (opt-in):
103
+
104
+ ```json
105
+ {
106
+ "mcpServers": {
107
+ "kanbango": {
108
+ "command": "npx",
109
+ "args": ["kanbango", "mcp"],
110
+ "env": {
111
+ "KANBANGO_AUTO_GUI": "1"
112
+ }
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ Optional: pin the port with `KANBANGO_GUI_PORT` (e.g. `"5821"`). Without it, each project gets a stable port in `5510–5999` derived from the project path. The real URL is always available via `kanban_gui` → `status` (and written to `backlog/.kanbango-gui.json` while the GUI runs).
119
+
99
120
  Or generate the config files automatically:
100
121
 
101
122
  ```bash
@@ -109,11 +130,8 @@ Once connected, your agent gets access to these tools:
109
130
  | Tool | What it does |
110
131
  |------|-------------|
111
132
  | `kanban_read` | List tasks, filter by column/epic, show details |
112
- | `kanban_create` | Add new tasks |
113
- | `kanban_update` | Move, edit, toggle subtasks |
114
- | `kanban_gui_start` | Start web GUI from the agent |
115
- | `kanban_gui_stop` | Stop web GUI |
116
- | `kanban_gui_status` | Check if GUI is running |
133
+ | `kanban_manage` | Create, move, patch-update tasks |
134
+ | `kanban_gui` | Start, stop, or check web GUI status (returns the real URL/port) |
117
135
 
118
136
  Your agent stays in sync with your real board — every change is persisted as JSON files.
119
137
 
@@ -122,12 +140,11 @@ Your agent stays in sync with your real board — every change is persisted as J
122
140
  | Command | Description |
123
141
  |---------|-------------|
124
142
  | `kanban init` | Create backlog directory structure |
125
- | `kanban serve [PORT]` | Start web GUI (default 5500) |
143
+ | `kanban serve [PORT]` | Start web GUI (stable project port, or PORT / KANBANGO_GUI_PORT) |
126
144
  | `kanban list [--col <col>] [--json]` | List tasks |
127
145
  | `kanban show <ID>` | Show task details |
128
146
  | `kanban add <TITLE>` | Add a new task |
129
147
  | `kanban move <ID> <COL>` | Move task |
130
- | `kanban toggle <ID> <IDX>` | Toggle subtask |
131
148
  | `kanban mcp-init` | Generate MCP config files |
132
149
 
133
150
  ## Web GUI
@@ -152,4 +169,4 @@ Node.js 16+
152
169
 
153
170
  ## License
154
171
 
155
- MIT
172
+ MIT