kanbango 2.1.0 → 2.4.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 CHANGED
@@ -6,7 +6,7 @@ This document provides build commands, testing procedures, and code style guidel
6
6
 
7
7
  ### Available Scripts
8
8
  ```bash
9
- # Start web GUI (opens http://localhost:5500)
9
+ # Start web GUI (stable project port in 5510-5999, or KANBANGO_GUI_PORT)
10
10
  npm start
11
11
  # or
12
12
  node bin/kanban.js serve
@@ -14,7 +14,7 @@ node bin/kanban.js serve
14
14
  # Start web GUI on custom port
15
15
  node bin/kanban.js serve 8080
16
16
 
17
- # Run MCP server
17
+ # Run MCP server (optional auto-GUI: KANBANGO_AUTO_GUI=1)
18
18
  npm run mcp
19
19
  # or
20
20
  node mcp-server.js
@@ -143,7 +143,7 @@ async function parseEpic(filePath, column) {
143
143
 
144
144
  // Callbacks
145
145
  function shortId(epicId) {
146
- const match = epicId.match(/^(PI-\d+[\w.]*|BUG-\d+|CHORE-\d+)/);
146
+ const match = epicId.match(/^(?:[A-Z]+-)?(\d+)/);
147
147
  return match ? match[1] : epicId;
148
148
  }
149
149
  ```
@@ -387,9 +387,9 @@ const args = process.argv.slice(2); // Skip node and script path
387
387
  const cmd = args[0];
388
388
  const param1 = args[1];
389
389
 
390
- // Example: node bin/kanban.js move PI-001 done
390
+ // Example: node bin/kanban.js move 001 done
391
391
  // args[0] = "move"
392
- // args[1] = "PI-001"
392
+ // args[1] = "001"
393
393
  // args[2] = "done"
394
394
  ```
395
395
 
@@ -560,7 +560,7 @@ After making changes, verify:
560
560
  1. CLI works: `node bin/kanban.js list --json`
561
561
  2. Web GUI starts: `node bin/kanban.js serve` (Ctrl+C to stop)
562
562
  3. MCP server tools: `echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node mcp-server.js`
563
- 4. All three tools work: kanban_read, kanban_create, kanban_update
563
+ 4. All three tools work: kanban_read, kanban_manage, kanban_gui
564
564
 
565
565
  ## Common Patterns to Avoid
566
566
 
@@ -603,4 +603,4 @@ return { content: [{ text: JSON.stringify({ error: error.message }) }], isError:
603
603
  - README.md: https://github.com/k0r81/kanbango#readme
604
604
  - LLM Agents Guide: LLM_AGENTS.md
605
605
  - MCP Server Guide: LLM_AGENTS.md
606
- - Issues: https://github.com/k0r81/kanbango/issues
606
+ - Issues: https://github.com/k0r81/kanbango/issues
package/API.md CHANGED
@@ -42,7 +42,7 @@ Documentation for interacting with local Kanban system (kanban.py).
42
42
  "properties": {
43
43
  "task_id": {
44
44
  "type": "string",
45
- "description": "Task ID (e.g. 'PI-014-google-calendar')"
45
+ "description": "Numeric task ID (e.g. '014')"
46
46
  }
47
47
  },
48
48
  "required": ["task_id"],
@@ -108,8 +108,8 @@ Documentation for interacting with local Kanban system (kanban.py).
108
108
  ```json
109
109
  {
110
110
  "type": "function",
111
- "name": "kanban_toggle",
112
- "description": "Toggle checkbox state for subtask (done/not done).",
111
+ "name": "kanban_update",
112
+ "description": "Update task fields, including the full subtasks list.",
113
113
  "parameters": {
114
114
  "type": "object",
115
115
  "properties": {
@@ -117,12 +117,20 @@ Documentation for interacting with local Kanban system (kanban.py).
117
117
  "type": "string",
118
118
  "description": "Parent task ID"
119
119
  },
120
- "idx": {
121
- "type": "integer",
122
- "description": "Subtask index (starting from 0)"
120
+ "subtasks": {
121
+ "type": "array",
122
+ "items": {
123
+ "type": "object",
124
+ "properties": {
125
+ "id": { "type": "string" },
126
+ "text": { "type": "string" },
127
+ "done": { "type": "boolean" },
128
+ "description": { "type": "string" }
129
+ }
130
+ }
123
131
  }
124
132
  },
125
- "required": ["task_id", "idx"],
133
+ "required": ["task_id", "subtasks"],
126
134
  "additionalProperties": false
127
135
  }
128
136
  }
@@ -138,16 +146,16 @@ python kanban.py list --json
138
146
  python kanban.py list --col active --json
139
147
 
140
148
  # Show task details
141
- python kanban.py show PI-014-google-calendar
149
+ python kanban.py show 014
142
150
 
143
151
  # Add new task
144
152
  python kanban.py add "New function" --col planned --epic "Faza 6"
145
153
 
146
154
  # Move task to different column
147
- python kanban.py move PI-014-google-calendar active
155
+ python kanban.py move 014 active
148
156
 
149
- # Toggle subtask
150
- python kanban.py toggle PI-014-google-calendar 0
157
+ # Update subtasks
158
+ python kanban.py update 014 '{"subtasks":[{"done":true,"text":"Research"},{"done":false,"text":"Implementation"}]}'
151
159
  ```
152
160
 
153
161
  ## Kanban Columns
@@ -167,7 +175,7 @@ python kanban.py toggle PI-014-google-calendar 0
167
175
  "column": "active|planned|icebox|done",
168
176
  "epic_group": "string",
169
177
  "created": "string",
170
- "tasks": [
178
+ "subtasks": [
171
179
  {
172
180
  "done": "boolean",
173
181
  "text": "string"
package/CHANGELOG.md CHANGED
@@ -5,6 +5,38 @@ All notable changes to kanbango will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.4.0] - 2026-07-27
9
+
10
+ ### Added
11
+ - Opt-in GUI auto-start with MCP via `KANBANGO_AUTO_GUI=1`
12
+ - Stable per-project GUI port (hash of cwd in `5510–5999`), overridable with `KANBANGO_GUI_PORT` or `kanban serve [PORT]`
13
+ - `backlog/.kanbango-gui.json` port file so the real URL is always discoverable
14
+ - `kanban_gui status` discovers a running GUI even outside the MCP child-process tracker
15
+
16
+ ### Changed
17
+ - `kanban serve` default port is no longer hard-coded `5500`; uses preferred/stable port resolution
18
+ - `kanban_gui start` waits for the server to publish its actual listen port before returning
19
+
20
+ ## [2.3.0] - 2026-07-27
21
+
22
+ ### Added
23
+ - `in_scope` and `out_of_scope` fields (arrays of strings) for task boundaries in planning/execution/full views
24
+ - MCP `kanban_manage` create/update support for `in_scope` and `out_of_scope`
25
+ - Web GUI edit/view sections for In Scope and Out of Scope (muted styling for exclusions)
26
+ - Markdown migrate support for `## In Scope` / `## Out of Scope` (and PL headings)
27
+
28
+ ### Fixed
29
+ - HTTP API now forwards `test_cases` on create and update (GUI saves were previously dropped)
30
+
31
+ ## [2.2.0] - 2026-07-09
32
+
33
+ ### Changed
34
+ - MCP tools consolidated from 6 to 3:
35
+ - `kanban_create` + `kanban_update` merged into `kanban_manage` with `action` parameter (`create` | `move` | `update`)
36
+ - `kanban_gui_start` + `kanban_gui_stop` + `kanban_gui_status` merged into `kanban_gui` with `action` parameter (`start` | `stop` | `status`)
37
+ - `kanban_read` unchanged
38
+ - `kanban_manage` subtask edits now use full list updates via `update`; `toggle` action removed
39
+
8
40
  ## [2.1.0] - 2026-07-09
9
41
 
10
42
  ### Added
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,195 @@ 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
150
+ "col": "planned", // Optional, default "planned"
151
+ "epic": "Phase 1", // Optional, default "—"
152
+ "description": "Context and plan",
153
+ "specs": "Technical constraints",
154
+ "in_scope": ["What is included"],
155
+ "out_of_scope": ["What is excluded"],
156
+ "acceptance_criteria": ["Must work"],
157
+ "test_cases": ["Verify X"],
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
+ **Parameters (move):**
159
164
  ```json
160
165
  {
161
- "title": "Database optimization",
162
- "col": "planned",
163
- "epic": "Performance"
166
+ "action": "move",
167
+ "task_id": "014", // Required
168
+ "column": "done" // Required: target column
164
169
  }
165
170
  ```
166
171
 
167
- **Response:**
172
+ **Parameters (update):**
168
173
  ```json
169
174
  {
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": []
175
+ "action": "update",
176
+ "task_id": "014", // Required
177
+ "patch": {"description": "New context"}, // Field-level patch object
178
+ "title": "New title", // Shortcut, equivalent to patch.title
179
+ "subtasks": [{"text": "A", "done": true}], // Preferred full subtask list
180
+ "return": "summary" // "none" | "summary" | "full" (default "summary")
176
181
  }
177
182
  ```
178
183
 
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
184
+ **Examples:**
189
185
 
190
- **Parameters:**
186
+ Create a task:
191
187
  ```json
192
188
  {
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
- ]
189
+ "action": "create",
190
+ "title": "Database optimization",
191
+ "col": "planned",
192
+ "epic": "Performance"
202
193
  }
203
194
  ```
204
195
 
205
- **Examples:**
206
-
207
196
  Move task to done:
208
197
  ```json
209
198
  {
210
- "operation": "move",
211
- "task_id": "PI-014-google-calendar",
199
+ "action": "move",
200
+ "task_id": "014",
212
201
  "column": "done"
213
202
  }
214
203
  ```
215
204
 
216
- Toggle first subtask:
205
+ Patch-update task fields:
217
206
  ```json
218
207
  {
219
- "operation": "toggle",
220
- "task_id": "PI-014-google-calendar",
221
- "idx": 0
208
+ "action": "update",
209
+ "task_id": "014",
210
+ "patch": {
211
+ "title": "Updated title",
212
+ "description": "New implementation plan",
213
+ "epic_group": "Phase 2",
214
+ "subtasks": [
215
+ { "id": "st-1", "text": "Research", "done": true },
216
+ { "id": "st-2", "text": "Implementation", "done": false }
217
+ ]
218
+ }
222
219
  }
223
220
  ```
224
221
 
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
- ```
222
+ ---
233
223
 
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
- ```
224
+ ### 3. kanban_gui
246
225
 
247
- **Response (move):**
248
- ```json
249
- {
250
- "success": true,
251
- "message": "Moved PI-014-google-calendar to done"
252
- }
253
- ```
226
+ Control the web GUI server: start, stop, or check status.
254
227
 
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
- ```
228
+ **Port resolution (start):**
229
+ 1. Explicit `port` argument, if provided
230
+ 2. Else `KANBANGO_GUI_PORT` env
231
+ 3. Else stable hash of project cwd in range `5510–5999`
269
232
 
270
- ---
233
+ 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
234
 
272
- ### 4. kanban_gui_start
235
+ **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
236
 
274
- Start the web GUI server for the kanban board.
237
+ **Actions:**
238
+ - `start` - Launch the GUI server
239
+ - `stop` - Kill the GUI server
240
+ - `status` - Check if the GUI is running (reads live process or port file)
275
241
 
276
242
  **Parameters:**
277
243
  ```json
278
244
  {
279
- "port": 5500 // Optional: port for GUI (default 5500)
245
+ "action": "start", // "start" | "stop" | "status"
246
+ "port": 5821 // Optional, only for "start"
280
247
  }
281
248
  ```
282
249
 
283
250
  **Examples:**
284
251
 
285
- Start GUI on default port:
252
+ Start GUI (stable project port):
286
253
  ```json
287
- {}
254
+ {
255
+ "action": "start"
256
+ }
288
257
  ```
289
258
 
290
259
  Start GUI on custom port:
291
260
  ```json
292
261
  {
262
+ "action": "start",
293
263
  "port": 8080
294
264
  }
295
265
  ```
296
266
 
297
- **Response:**
267
+ Stop the GUI:
298
268
  ```json
299
269
  {
300
- "status": "started",
301
- "port": 5500,
302
- "pid": 12345,
303
- "url": "http://localhost:5500"
270
+ "action": "stop"
304
271
  }
305
272
  ```
306
273
 
307
- ---
308
-
309
- ### 5. kanban_gui_stop
310
-
311
- Stop the web GUI server if it is running.
312
-
313
- **Parameters:**
274
+ Check status:
314
275
  ```json
315
- {}
276
+ {
277
+ "action": "status"
278
+ }
316
279
  ```
317
280
 
318
- **Response:**
281
+ **Response (start):**
319
282
  ```json
320
283
  {
321
- "status": "stopping",
322
- "port": 5500
284
+ "status": "started",
285
+ "port": 5623,
286
+ "pid": 12345,
287
+ "url": "http://localhost:5623"
323
288
  }
324
289
  ```
325
290
 
326
- ---
327
-
328
- ### 6. kanban_gui_status
329
-
330
- Get status of the web GUI server.
331
-
332
- **Parameters:**
291
+ **Response (stop):**
333
292
  ```json
334
- {}
293
+ {
294
+ "status": "stopping",
295
+ "port": 5623,
296
+ "pid": 12345
297
+ }
335
298
  ```
336
299
 
337
- **Response (running):**
300
+ **Response (status - running):**
338
301
  ```json
339
302
  {
340
303
  "status": "running",
341
- "port": 5500,
304
+ "port": 5623,
342
305
  "pid": 12345,
343
- "url": "http://localhost:5500"
306
+ "url": "http://localhost:5623"
344
307
  }
345
308
  ```
346
309
 
347
- **Response (not running):**
310
+ **Response (status - not running):**
348
311
  ```json
349
312
  {
350
313
  "status": "not_running"
@@ -359,15 +322,24 @@ Get status of the web GUI server.
359
322
 
360
323
  ```json
361
324
  {
362
- "id": "string", // Unique task identifier (e.g., "PI-014-google-calendar")
363
- "title": "string", // Full title with ID prefix
325
+ "id": "string", // Numeric task identifier (e.g., "014")
326
+ "title": "string", // Task title, kept separate from the ID
364
327
  "column": "string", // "active" | "planned" | "icebox" | "done"
365
328
  "epic_group": "string", // Epic group name or "—"
366
329
  "created": "string", // Creation date (YYYY-MM-DD)
367
- "tasks": [
330
+ "description": "string", // High-level context
331
+ "specs": "string", // Technical constraints
332
+ "in_scope": ["string"], // What this task includes
333
+ "out_of_scope": ["string"], // Explicit non-goals
334
+ "acceptance_criteria": ["string"],
335
+ "test_cases": ["string"],
336
+ "notes": "string",
337
+ "subtasks": [
368
338
  {
369
- "done": "boolean", // Subtask completion status
370
- "text": "string" // Subtask description
339
+ "id": "string",
340
+ "done": "boolean",
341
+ "text": "string",
342
+ "description": "string"
371
343
  }
372
344
  ]
373
345
  }
@@ -387,51 +359,43 @@ Get status of the web GUI server.
387
359
  ### Pattern 1: Task Discovery
388
360
 
389
361
  ```json
390
- // List all active tasks
391
- { "operation": "list", "col": "active" }
362
+ { "tool": "kanban_read", "arguments": { "operation": "list", "col": "active" } }
392
363
  ```
393
364
 
394
365
  ### Pattern 2: Task Creation Workflow
395
366
 
396
367
  ```json
397
368
  // 1. Create task
398
- { "title": "New feature", "col": "planned", "epic": "Phase 1" }
369
+ { "tool": "kanban_manage", "arguments": { "action": "create", "title": "New feature", "col": "planned", "epic": "Phase 1" } }
399
370
 
400
371
  // 2. Get task details to see generated ID
401
- { "operation": "show", "task_id": "PI-015-new-feature" }
372
+ { "tool": "kanban_read", "arguments": { "operation": "show", "task_id": "015" } }
402
373
 
403
374
  // 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
- }
375
+ { "tool": "kanban_manage", "arguments": { "action": "update", "task_id": "015", "subtasks": [{"done": false, "text": "Research"}, {"done": false, "text": "Implementation"}] } }
412
376
  ```
413
377
 
414
378
  ### Pattern 3: Task Progression
415
379
 
416
380
  ```json
417
381
  // Move from planned → active
418
- { "operation": "move", "task_id": "PI-015", "column": "active" }
382
+ { "tool": "kanban_manage", "arguments": { "action": "move", "task_id": "015", "column": "active" } }
419
383
 
420
- // Mark subtask complete
421
- { "operation": "toggle", "task_id": "PI-015", "idx": 0 }
384
+ // Update subtasks in one call
385
+ { "tool": "kanban_manage", "arguments": { "action": "update", "task_id": "015", "subtasks": [{ "done": true, "text": "Research" }, { "done": false, "text": "Implementation" }] } }
422
386
 
423
387
  // Move from active → done
424
- { "operation": "move", "task_id": "PI-015", "column": "done" }
388
+ { "tool": "kanban_manage", "arguments": { "action": "move", "task_id": "015", "column": "done" } }
425
389
  ```
426
390
 
427
391
  ### Pattern 4: Epic Management
428
392
 
429
393
  ```json
430
394
  // List all tasks in an epic
431
- { "operation": "list", "epic": "Performance" }
395
+ { "tool": "kanban_read", "arguments": { "operation": "list", "epic": "Performance" } }
432
396
 
433
397
  // Create task in specific epic
434
- { "title": "Cache optimization", "epic": "Performance" }
398
+ { "tool": "kanban_manage", "arguments": { "action": "create", "title": "Cache optimization", "epic": "Performance" } }
435
399
  ```
436
400
 
437
401
  ---
@@ -439,30 +403,32 @@ Get status of the web GUI server.
439
403
  ## Best Practices for LLM Agents
440
404
 
441
405
  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
406
+ 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.
407
+ 3. **Use `col` filter** - Narrow down to relevant column when listing
408
+ 4. **Use `epic` grouping** - Organize tasks by features/phases
409
+ 5. **Work through subtasks** - Toggle each subtask as you complete them
410
+ 6. **Move tasks through workflow** - planned active done progression
411
+ 7. **Use `show` operation** - Get full task details including subtasks
412
+ 8. **Handle task IDs** - Always use the full task ID returned from create/show
448
413
 
449
414
  ---
450
415
 
451
416
  ## Error Handling
452
417
 
453
- All tools return error messages in this format:
418
+ All tools return structured error responses:
454
419
 
455
420
  ```json
456
421
  {
457
- "error": "Error message description"
422
+ "error": {
423
+ "code": "TASK_NOT_FOUND",
424
+ "message": "Task 999 was not found",
425
+ "hint": "Call kanban_read with operation=list to discover valid task ids",
426
+ "details": {},
427
+ "retryable": false
428
+ }
458
429
  }
459
430
  ```
460
431
 
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
432
  ---
467
433
 
468
434
  ## Installation for Users