sqlew 2.1.4 → 3.0.2

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.
Files changed (84) hide show
  1. package/CHANGELOG.md +891 -605
  2. package/README.md +302 -690
  3. package/assets/kanban-style.png +0 -0
  4. package/assets/schema.sql +531 -402
  5. package/dist/database.d.ts +9 -0
  6. package/dist/database.d.ts.map +1 -1
  7. package/dist/database.js +33 -34
  8. package/dist/database.js.map +1 -1
  9. package/dist/index.js +1024 -213
  10. package/dist/index.js.map +1 -1
  11. package/dist/migrations/add-task-tables.d.ts +47 -0
  12. package/dist/migrations/add-task-tables.d.ts.map +1 -0
  13. package/dist/migrations/add-task-tables.js +285 -0
  14. package/dist/migrations/add-task-tables.js.map +1 -0
  15. package/dist/migrations/index.d.ts +96 -0
  16. package/dist/migrations/index.d.ts.map +1 -0
  17. package/dist/migrations/index.js +239 -0
  18. package/dist/migrations/index.js.map +1 -0
  19. package/dist/migrations/migrate-decisions-to-tasks.d.ts +61 -0
  20. package/dist/migrations/migrate-decisions-to-tasks.d.ts.map +1 -0
  21. package/dist/migrations/migrate-decisions-to-tasks.js +442 -0
  22. package/dist/migrations/migrate-decisions-to-tasks.js.map +1 -0
  23. package/dist/schema.d.ts.map +1 -1
  24. package/dist/schema.js +14 -3
  25. package/dist/schema.js.map +1 -1
  26. package/dist/tools/constraints.d.ts +4 -0
  27. package/dist/tools/constraints.d.ts.map +1 -1
  28. package/dist/tools/constraints.js +6 -27
  29. package/dist/tools/constraints.js.map +1 -1
  30. package/dist/tools/context.d.ts +17 -1
  31. package/dist/tools/context.d.ts.map +1 -1
  32. package/dist/tools/context.js +195 -190
  33. package/dist/tools/context.js.map +1 -1
  34. package/dist/tools/files.d.ts.map +1 -1
  35. package/dist/tools/files.js +113 -166
  36. package/dist/tools/files.js.map +1 -1
  37. package/dist/tools/messaging.d.ts +2 -9
  38. package/dist/tools/messaging.d.ts.map +1 -1
  39. package/dist/tools/messaging.js +67 -126
  40. package/dist/tools/messaging.js.map +1 -1
  41. package/dist/tools/tasks.d.ts +90 -0
  42. package/dist/tools/tasks.d.ts.map +1 -0
  43. package/dist/tools/tasks.js +732 -0
  44. package/dist/tools/tasks.js.map +1 -0
  45. package/dist/tools/utils.d.ts +8 -1
  46. package/dist/tools/utils.d.ts.map +1 -1
  47. package/dist/tools/utils.js +50 -21
  48. package/dist/tools/utils.js.map +1 -1
  49. package/dist/types.d.ts +14 -0
  50. package/dist/types.d.ts.map +1 -1
  51. package/dist/utils/batch.d.ts +69 -0
  52. package/dist/utils/batch.d.ts.map +1 -0
  53. package/dist/utils/batch.js +148 -0
  54. package/dist/utils/batch.js.map +1 -0
  55. package/dist/utils/query-builder.d.ts +68 -0
  56. package/dist/utils/query-builder.d.ts.map +1 -0
  57. package/dist/utils/query-builder.js +116 -0
  58. package/dist/utils/query-builder.js.map +1 -0
  59. package/dist/utils/task-stale-detection.d.ts +28 -0
  60. package/dist/utils/task-stale-detection.d.ts.map +1 -0
  61. package/dist/utils/task-stale-detection.js +92 -0
  62. package/dist/utils/task-stale-detection.js.map +1 -0
  63. package/dist/utils/validators.d.ts +57 -0
  64. package/dist/utils/validators.d.ts.map +1 -0
  65. package/dist/utils/validators.js +117 -0
  66. package/dist/utils/validators.js.map +1 -0
  67. package/docs/AI_AGENT_GUIDE.md +1471 -648
  68. package/{ARCHITECTURE.md → docs/ARCHITECTURE.md} +636 -636
  69. package/docs/BEST_PRACTICES.md +481 -0
  70. package/docs/DECISION_TO_TASK_MIGRATION_GUIDE.md +457 -0
  71. package/docs/MIGRATION_CHAIN.md +280 -0
  72. package/{MIGRATION_v2.md → docs/MIGRATION_v2.md} +538 -538
  73. package/docs/SHARED_CONCEPTS.md +339 -0
  74. package/docs/TASK_ACTIONS.md +854 -0
  75. package/docs/TASK_LINKING.md +729 -0
  76. package/docs/TASK_MIGRATION.md +701 -0
  77. package/docs/TASK_OVERVIEW.md +363 -0
  78. package/docs/TASK_SYSTEM.md +1244 -0
  79. package/docs/TOOL_REFERENCE.md +471 -0
  80. package/docs/TOOL_SELECTION.md +279 -0
  81. package/docs/WORKFLOWS.md +602 -0
  82. package/docs/refactoring-summary-2025-10-17.md +365 -0
  83. package/docs/requirement-2025-10-17.md +508 -0
  84. package/package.json +64 -64
package/dist/index.js CHANGED
@@ -8,12 +8,13 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
8
8
  import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
9
9
  import { initializeDatabase, closeDatabase, setConfigValue, getAllConfig } from './database.js';
10
10
  import { CONFIG_KEYS } from './constants.js';
11
- import { setDecision, getContext, getDecision, searchByTags, getVersions, searchByLayer, quickSetDecision, searchAdvanced, setDecisionBatch, hasUpdates, setFromTemplate, createTemplate, listTemplates } from './tools/context.js';
11
+ import { setDecision, getContext, getDecision, searchByTags, getVersions, searchByLayer, quickSetDecision, searchAdvanced, setDecisionBatch, hasUpdates, setFromTemplate, createTemplate, listTemplates, hardDeleteDecision } from './tools/context.js';
12
12
  import { sendMessage, getMessages, markRead, sendMessageBatch } from './tools/messaging.js';
13
13
  import { recordFileChange, getFileChanges, checkFileLock, recordFileChangeBatch } from './tools/files.js';
14
14
  import { addConstraint, getConstraints, deactivateConstraint } from './tools/constraints.js';
15
- import { getLayerSummary, clearOldData, getStats, getActivityLog } from './tools/utils.js';
15
+ import { getLayerSummary, clearOldData, getStats, getActivityLog, flushWAL } from './tools/utils.js';
16
16
  import { getConfig, updateConfig } from './tools/config.js';
17
+ import { createTask, updateTask, getTask, listTasks, moveTask, linkTask, archiveTask, batchCreateTasks, taskHelp } from './tools/tasks.js';
17
18
  // Parse command-line arguments
18
19
  const args = process.argv.slice(2);
19
20
  const parsedArgs = {};
@@ -80,8 +81,8 @@ catch (error) {
80
81
  }
81
82
  // Create MCP server
82
83
  const server = new Server({
83
- name: 'mcp-sklew',
84
- version: '2.1.4',
84
+ name: 'mcp-sqlew',
85
+ version: '3.0.0',
85
86
  }, {
86
87
  capabilities: {
87
88
  tools: {},
@@ -93,52 +94,19 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
93
94
  tools: [
94
95
  {
95
96
  name: 'decision',
96
- description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
97
-
98
- Context Management - Store decisions with metadata (tags, layers, versions, scopes)
99
-
100
- ## Quick Examples
101
- - Set decision: {action: "set", key: "auth_method", value: "jwt", layer: "business", tags: ["security"]}
102
- - Get decision: {action: "get", key: "auth_method"}
103
- - List decisions: {action: "list", status: "active", layer: "business"}
104
-
105
- ## Parameter Requirements by Action
106
-
107
- | Action | Required Parameters | Optional Parameters |
108
- |--------|-------------------|---------------------|
109
- | set | action, key, value, layer | agent, version, status, tags, scopes |
110
- | get | action, key | version |
111
- | list | action | status, layer, tags, scope, tag_match, limit, offset |
112
- | search_tags | action, tags | match_mode, status, layer |
113
- | search_layer | action, layer | status, include_tags |
114
- | versions | action, key | - |
115
- | quick_set | action, key, value | agent, layer, version, status, tags, scopes |
116
- | search_advanced | action | layers, tags_all, tags_any, exclude_tags, scopes, updated_after, updated_before, decided_by, statuses, search_text, sort_by, sort_order, limit, offset |
117
- | set_batch | action, decisions | atomic |
118
- | has_updates | action, agent_name, since_timestamp | - |
119
- | set_from_template | action, template, key, value, layer | agent, version, status, tags, scopes |
120
- | create_template | action, name, defaults | required_fields, created_by |
121
- | list_templates | action | - |
122
-
123
- ## Common Errors & Fixes
124
- - "Unknown action: undefined" → Add action parameter (REQUIRED!)
125
- - "Parameter \\"value\\" is required" → Provide value parameter directly (not nested in defaults)
126
- - "Invalid layer" → Use: presentation, business, data, infrastructure, cross-cutting
127
- - "Invalid status" → Use: active, deprecated, draft
128
-
129
- ## Valid Values
130
- - **layer**: presentation | business | data | infrastructure | cross-cutting
131
- - **status**: active | deprecated | draft
132
- - **tag_match**: AND | OR
133
-
134
- Use action: "help" for detailed documentation.`,
97
+ description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
98
+
99
+ Context Management - Store decisions with metadata (tags, layers, versions, scopes)
100
+
101
+ Use action: "help" for detailed documentation.
102
+ Use action: "example" for comprehensive usage examples.`,
135
103
  inputSchema: {
136
104
  type: 'object',
137
105
  properties: {
138
106
  action: {
139
107
  type: 'string',
140
108
  description: 'Action',
141
- enum: ['set', 'get', 'list', 'search_tags', 'search_layer', 'versions', 'quick_set', 'search_advanced', 'set_batch', 'has_updates', 'set_from_template', 'create_template', 'list_templates', 'help']
109
+ enum: ['set', 'get', 'list', 'search_tags', 'search_layer', 'versions', 'quick_set', 'search_advanced', 'set_batch', 'has_updates', 'set_from_template', 'create_template', 'list_templates', 'hard_delete', 'help', 'example']
142
110
  },
143
111
  key: { type: 'string' },
144
112
  value: { type: ['string', 'number'] },
@@ -179,41 +147,16 @@ Use action: "help" for detailed documentation.`,
179
147
  },
180
148
  {
181
149
  name: 'message',
182
- description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
183
-
184
- Agent Messaging - Send messages between agents with priority levels and read tracking
185
-
186
- ## Quick Examples
187
- - Send message: {action: "send", from_agent: "bot1", msg_type: "info", message: "Task complete"}
188
- - Get messages: {action: "get", agent_name: "bot1", unread_only: true}
189
- - Mark as read: {action: "mark_read", agent_name: "bot1", message_ids: [1, 2, 3]}
190
-
191
- ## Parameter Requirements by Action
192
-
193
- | Action | Required Parameters | Optional Parameters |
194
- |--------|-------------------|---------------------|
195
- | send | action, from_agent, msg_type, message | to_agent, priority, payload |
196
- | get | action, agent_name | unread_only, priority_filter, msg_type_filter, limit |
197
- | mark_read | action, agent_name, message_ids | - |
198
- | send_batch | action, messages | atomic |
199
-
200
- ## Common Errors & Fixes
201
- - "Unknown action: undefined" → Add action parameter (REQUIRED!)
202
- - "Invalid msg_type" → Use: decision, warning, request, info
203
- - "Invalid priority" → Use: low, medium, high, critical
204
- - "message_ids array cannot be empty" → Provide at least one message ID
205
-
206
- ## Valid Values
207
- - **msg_type**: decision | warning | request | info
208
- - **priority**: low | medium | high | critical (default: medium)
209
- - **to_agent**: agent name or null for broadcast
210
- - **atomic** (batch): true (all-or-nothing) | false (best-effort, recommended for AI agents)
211
-
212
- Use action: "help" for detailed documentation.`,
150
+ description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
151
+
152
+ Agent Messaging - Send messages between agents with priority levels and read tracking
153
+
154
+ Use action: "help" for detailed documentation.
155
+ Use action: "example" for comprehensive usage examples.`,
213
156
  inputSchema: {
214
157
  type: 'object',
215
158
  properties: {
216
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['send', 'get', 'mark_read', 'send_batch', 'help'] },
159
+ action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['send', 'get', 'mark_read', 'send_batch', 'help', 'example'] },
217
160
  agent_name: { type: 'string' },
218
161
  from_agent: { type: 'string' },
219
162
  to_agent: { type: ['string', 'null'] },
@@ -235,41 +178,16 @@ Use action: "help" for detailed documentation.`,
235
178
  },
236
179
  {
237
180
  name: 'file',
238
- description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
239
-
240
- File Change Tracking - Track file changes with layer classification and lock detection
241
-
242
- ## Quick Examples
243
- - Record change: {action: "record", file_path: "src/index.ts", agent_name: "bot1", change_type: "modified", layer: "infrastructure"}
244
- - Get changes: {action: "get", agent_name: "bot1", layer: "infrastructure", limit: 10}
245
- - Check lock: {action: "check_lock", file_path: "src/index.ts", lock_duration: 300}
246
-
247
- ## Parameter Requirements by Action
248
-
249
- | Action | Required Parameters | Optional Parameters |
250
- |--------|-------------------|---------------------|
251
- | record | action, file_path, agent_name, change_type | layer, description |
252
- | get | action | file_path, agent_name, layer, change_type, since, limit |
253
- | check_lock | action, file_path | lock_duration |
254
- | record_batch | action, file_changes | atomic |
255
-
256
- ## Common Errors & Fixes
257
- - "Unknown action: undefined" → Add action parameter (REQUIRED!)
258
- - "Invalid change_type" → Use: created, modified, deleted
259
- - "Invalid layer" → Use: presentation, business, data, infrastructure, cross-cutting
260
- - "Parameter \\"file_changes\\" must contain at least one item" → Provide non-empty array
261
-
262
- ## Valid Values
263
- - **change_type**: created | modified | deleted
264
- - **layer**: presentation | business | data | infrastructure | cross-cutting
265
- - **lock_duration**: seconds (default: 300 = 5 minutes)
266
- - **atomic** (batch): true (all-or-nothing) | false (best-effort, recommended for AI agents)
267
-
268
- Use action: "help" for detailed documentation.`,
181
+ description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
182
+
183
+ File Change Tracking - Track file changes with layer classification and lock detection
184
+
185
+ Use action: "help" for detailed documentation.
186
+ Use action: "example" for comprehensive usage examples.`,
269
187
  inputSchema: {
270
188
  type: 'object',
271
189
  properties: {
272
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['record', 'get', 'check_lock', 'record_batch', 'help'] },
190
+ action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['record', 'get', 'check_lock', 'record_batch', 'help', 'example'] },
273
191
  file_path: { type: 'string' },
274
192
  agent_name: { type: 'string' },
275
193
  change_type: { type: 'string', enum: ['created', 'modified', 'deleted'] },
@@ -287,44 +205,16 @@ Use action: "help" for detailed documentation.`,
287
205
  },
288
206
  {
289
207
  name: 'constraint',
290
- description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
291
-
292
- Constraint Management - Manage architectural rules and requirements
293
-
294
- ## What are Constraints vs Decisions?
295
- - **Decision**: Documents a choice that was made ("We chose JWT over sessions")
296
- - **Constraint**: Enforces a rule that must be followed ("API response time must be <100ms")
297
-
298
- ## Quick Examples
299
- - Add constraint: {action: "add", category: "performance", constraint_text: "API response <100ms", priority: "high", layer: "business"}
300
- - Get constraints: {action: "get", category: "performance", active_only: true}
301
- - Deactivate: {action: "deactivate", constraint_id: 5}
302
-
303
- ## Parameter Requirements by Action
304
-
305
- | Action | Required Parameters | Optional Parameters |
306
- |--------|-------------------|---------------------|
307
- | add | action, category, constraint_text | priority, layer, tags, created_by |
308
- | get | action | category, layer, priority, tags, active_only, limit |
309
- | deactivate | action, constraint_id | - |
310
-
311
- ## Common Errors & Fixes
312
- - "Unknown action: undefined" → Add action parameter (REQUIRED!)
313
- - "Invalid category" → Use: performance, architecture, security
314
- - "category and constraint_text are required" → Provide both required fields
315
- - "constraint_id is required" → Provide valid constraint ID number
316
-
317
- ## Valid Values
318
- - **category**: performance | architecture | security
319
- - **priority**: low | medium | high | critical (default: medium)
320
- - **layer**: presentation | business | data | infrastructure | cross-cutting
321
- - **active_only**: true (default) | false
322
-
323
- Use action: "help" for detailed documentation.`,
208
+ description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
209
+
210
+ Constraint Management - Manage architectural rules and requirements
211
+
212
+ Use action: "help" for detailed documentation.
213
+ Use action: "example" for comprehensive usage examples.`,
324
214
  inputSchema: {
325
215
  type: 'object',
326
216
  properties: {
327
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['add', 'get', 'deactivate', 'help'] },
217
+ action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['add', 'get', 'deactivate', 'help', 'example'] },
328
218
  constraint_id: { type: 'number' },
329
219
  category: { type: 'string', enum: ['performance', 'architecture', 'security'] },
330
220
  constraint_text: { type: 'string' },
@@ -340,43 +230,16 @@ Use action: "help" for detailed documentation.`,
340
230
  },
341
231
  {
342
232
  name: 'stats',
343
- description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
344
-
345
- Statistics & Utilities - View stats, activity logs, and manage data cleanup
346
-
347
- ## Quick Examples
348
- - Layer summary: {action: "layer_summary"}
349
- - DB statistics: {action: "db_stats"}
350
- - Clear old data: {action: "clear", messages_older_than_hours: 48, file_changes_older_than_days: 14}
351
- - Activity log: {action: "activity_log", since: "1h", agent_names: ["bot1"], limit: 50}
352
-
353
- ## Parameter Requirements by Action
354
-
355
- | Action | Required Parameters | Optional Parameters |
356
- |--------|-------------------|---------------------|
357
- | layer_summary | action | - |
358
- | db_stats | action | - |
359
- | clear | action | messages_older_than_hours, file_changes_older_than_days |
360
- | activity_log | action | since, agent_names, actions, limit |
361
-
362
- ## Common Errors & Fixes
363
- - "Unknown action: undefined" → Add action parameter (REQUIRED!)
364
- - "Invalid 'since' parameter" → Use relative format (5m, 1h, 2d) or ISO timestamp
365
-
366
- ## Valid Values
367
- - **since**: Relative time (5m, 1h, 2d) or ISO 8601 timestamp
368
- - **agent_names**: Array of agent names or ["*"] for all
369
- - **limit**: Number (default: 100 for activity_log)
370
-
371
- ## Clear Action Behavior
372
- - **Without parameters**: Uses config-based weekend-aware retention
373
- - **With parameters**: Overrides config, no weekend-awareness
374
-
375
- Use action: "help" for detailed documentation.`,
233
+ description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
234
+
235
+ Statistics & Utilities - View stats, activity logs, manage data cleanup, and WAL checkpoints
236
+
237
+ Use action: "help" for detailed documentation.
238
+ Use action: "example" for comprehensive usage examples.`,
376
239
  inputSchema: {
377
240
  type: 'object',
378
241
  properties: {
379
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['layer_summary', 'db_stats', 'clear', 'activity_log', 'help'] },
242
+ action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['layer_summary', 'db_stats', 'clear', 'activity_log', 'flush', 'help', 'example'] },
380
243
  messages_older_than_hours: { type: 'number' },
381
244
  file_changes_older_than_days: { type: 'number' },
382
245
  since: { type: 'string', description: 'Time filter (e.g., "5m", "1h", "2d" or ISO timestamp)' },
@@ -389,40 +252,16 @@ Use action: "help" for detailed documentation.`,
389
252
  },
390
253
  {
391
254
  name: 'config',
392
- description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
393
-
394
- Configuration - Manage auto-deletion settings with weekend-aware retention
395
-
396
- ## Quick Examples
397
- - Get config: {action: "get"}
398
- - Update config: {action: "update", ignoreWeekend: true, messageRetentionHours: 48, fileHistoryRetentionDays: 10}
399
-
400
- ## Parameter Requirements by Action
401
-
402
- | Action | Required Parameters | Optional Parameters |
403
- |--------|-------------------|---------------------|
404
- | get | action | - |
405
- | update | action | ignoreWeekend, messageRetentionHours, fileHistoryRetentionDays |
406
-
407
- ## Common Errors & Fixes
408
- - "Unknown action: undefined" → Add action parameter (REQUIRED!)
409
- - "messageRetentionHours must be between 1 and 168" → Use value 1-168 (1 week max)
410
- - "fileHistoryRetentionDays must be between 1 and 90" → Use value 1-90
411
-
412
- ## Valid Values
413
- - **ignoreWeekend**: true (skip weekends in retention calculation) | false (standard time-based)
414
- - **messageRetentionHours**: 1-168 (default: 24)
415
- - **fileHistoryRetentionDays**: 1-90 (default: 7)
416
-
417
- ## Weekend-Aware Behavior
418
- - **ignoreWeekend=false**: 24h = 24 hours ago (standard)
419
- - **ignoreWeekend=true**: 24h on Monday = Friday (skips Sat/Sun)
420
-
421
- Use action: "help" for detailed documentation.`,
255
+ description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
256
+
257
+ Configuration - Manage auto-deletion settings with weekend-aware retention
258
+
259
+ Use action: "help" for detailed documentation.
260
+ Use action: "example" for comprehensive usage examples.`,
422
261
  inputSchema: {
423
262
  type: 'object',
424
263
  properties: {
425
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['get', 'update', 'help'] },
264
+ action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['get', 'update', 'help', 'example'] },
426
265
  ignoreWeekend: { type: 'boolean' },
427
266
  messageRetentionHours: { type: 'number', minimum: 1, maximum: 168 },
428
267
  fileHistoryRetentionDays: { type: 'number', minimum: 1, maximum: 90 },
@@ -430,6 +269,42 @@ Use action: "help" for detailed documentation.`,
430
269
  required: ['action'],
431
270
  },
432
271
  },
272
+ {
273
+ name: 'task',
274
+ description: `**REQUIRED PARAMETER**: action (must be specified in ALL calls)
275
+
276
+ Kanban Task Watcher - AI-optimized task management with auto-stale detection
277
+
278
+ Use action: "help" for detailed documentation.
279
+ Use action: "example" for comprehensive usage examples.`,
280
+ inputSchema: {
281
+ type: 'object',
282
+ properties: {
283
+ action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['create', 'update', 'get', 'list', 'move', 'link', 'archive', 'batch_create', 'help', 'example'] },
284
+ task_id: { type: 'number' },
285
+ title: { type: 'string' },
286
+ description: { type: 'string' },
287
+ acceptance_criteria: { type: 'string' },
288
+ notes: { type: 'string' },
289
+ priority: { type: 'number', minimum: 1, maximum: 4 },
290
+ assigned_agent: { type: 'string' },
291
+ created_by_agent: { type: 'string' },
292
+ layer: { type: 'string', enum: ['presentation', 'business', 'data', 'infrastructure', 'cross-cutting'] },
293
+ tags: { type: 'array', items: { type: 'string' } },
294
+ status: { type: 'string', enum: ['todo', 'in_progress', 'waiting_review', 'blocked', 'done', 'archived'] },
295
+ new_status: { type: 'string', enum: ['todo', 'in_progress', 'waiting_review', 'blocked', 'done', 'archived'] },
296
+ link_type: { type: 'string', enum: ['decision', 'constraint', 'file'] },
297
+ target_id: { type: ['string', 'number'] },
298
+ link_relation: { type: 'string' },
299
+ limit: { type: 'number', default: 50 },
300
+ offset: { type: 'number', default: 0 },
301
+ // batch_create parameters
302
+ tasks: { type: 'array', description: 'Array of tasks for batch operation (max: 50)' },
303
+ atomic: { type: 'boolean', description: 'Atomic mode - all succeed or all fail (default: true)' },
304
+ },
305
+ required: ['action'],
306
+ },
307
+ },
433
308
  ],
434
309
  };
435
310
  });
@@ -496,10 +371,59 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
496
371
  case 'list_templates':
497
372
  result = listTemplates(params);
498
373
  break;
374
+ case 'hard_delete':
375
+ result = hardDeleteDecision(params);
376
+ break;
499
377
  case 'help':
500
378
  result = {
501
379
  tool: 'decision',
502
380
  description: 'Manage decisions with metadata (tags, layers, versions, scopes)',
381
+ purpose: {
382
+ title: '⚠️ CRITICAL: Store WHY and REASON, Not WHAT',
383
+ principle: 'Decisions table is for ARCHITECTURAL CONTEXT and REASONING, NOT implementation logs or task completion status',
384
+ what_to_store: {
385
+ correct: [
386
+ 'WHY a design choice was made (e.g., "Chose JWT over sessions because stateless auth scales better for our microservice architecture")',
387
+ 'REASONING behind architecture decisions (e.g., "Moved oscillator_type to MonophonicSynthConfig to separate synthesis methods - FM operators use different config")',
388
+ 'PROBLEM ANALYSIS and solution rationale (e.g., "Nested transaction bug: setDecision wraps in transaction, batch also wraps → solution: extract internal helper without transaction wrapper")',
389
+ 'DESIGN TRADE-OFFS and alternatives considered (e.g., "Query builder limited to simple filters, kept domain-specific logic inline for maintainability")',
390
+ 'CONSTRAINTS and requirements reasoning (e.g., "API response must be <100ms because mobile clients timeout at 200ms")',
391
+ 'BREAKING CHANGES with migration rationale (e.g., "Removed /v1/users endpoint - clients must use /v2/users with pagination for scalability")'
392
+ ],
393
+ incorrect: [
394
+ '❌ Task completion logs (e.g., "Task 5 completed", "Refactoring done", "Tests passing") → Use tasks tool instead',
395
+ '❌ Implementation status (e.g., "Added validators.ts", "Fixed bug in batch_create", "Updated README") → These are WHAT, not WHY',
396
+ '❌ Test results (e.g., "All tests passing", "Integration tests complete", "v3.0.2 testing verified") → Temporary status, not architectural context',
397
+ '❌ Git commit summaries (e.g., "Released v3.0.2", "Created git commit 2bf55a0") → Belongs in git history',
398
+ '❌ Documentation updates (e.g., "README reorganized", "Help actions enhanced") → Implementation logs, not decisions',
399
+ '❌ Build status (e.g., "Build succeeded", "TypeScript compiled with zero errors") → Temporary status'
400
+ ]
401
+ },
402
+ analogy: {
403
+ git_history: 'WHAT changed (files, lines, commits)',
404
+ code_comments: 'HOW it works (implementation details, algorithms)',
405
+ sqlew_decisions: 'WHY it was changed (reasoning, trade-offs, context)',
406
+ sqlew_tasks: 'WHAT needs to be done (work items, status, completion)'
407
+ },
408
+ examples: [
409
+ {
410
+ key: 'api/auth/jwt-choice',
411
+ value: 'Chose JWT over session-based auth because: (1) Stateless design scales horizontally, (2) Mobile clients can cache tokens, (3) Microservice architecture requires distributed auth. Trade-off: Revocation requires token blacklist, but acceptable for 15-min token lifetime.',
412
+ explanation: 'Explains WHY JWT was chosen, considers trade-offs, provides architectural context'
413
+ },
414
+ {
415
+ key: 'database/postgresql-choice',
416
+ value: 'Selected PostgreSQL over MongoDB because: (1) Complex relational queries required for reporting, (2) ACID compliance critical for financial data, (3) Team has strong SQL expertise. Trade-off: Less flexible schema, but data integrity more important than schema flexibility for our use case.',
417
+ explanation: 'Documents database choice with reasoning, alternatives considered, and trade-offs'
418
+ },
419
+ {
420
+ key: 'security/encryption-at-rest',
421
+ value: 'Implementing AES-256 encryption for all PII in database because: (1) GDPR compliance requires encryption at rest, (2) Recent security audit identified unencrypted sensitive data, (3) Performance impact <5ms per query acceptable. Alternative considered: Database-level encryption rejected due to backup/restore complexity.',
422
+ explanation: 'Explains security decision with compliance reasoning and performance considerations'
423
+ }
424
+ ],
425
+ cleanup_rule: 'Delete decisions that start with "COMPLETED:", contain task status, test results, or implementation logs. Keep only architectural reasoning and design rationale.'
426
+ },
503
427
  actions: {
504
428
  set: 'Set/update a decision. Params: key (required), value (required), agent, layer, version, status, tags, scopes',
505
429
  get: 'Get specific decision by key. Params: key (required)',
@@ -513,7 +437,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
513
437
  has_updates: 'Check for updates since timestamp (FR-003 Phase A - Lightweight Polling). Params: agent_name (required), since_timestamp (required, ISO 8601 format like "2025-10-14T08:00:00Z"). Returns: {has_updates: boolean, counts: {decisions: N, messages: N, files: N}}. Token cost: ~5-10 tokens per check. Uses COUNT queries on t_decisions, t_agent_messages, t_file_changes with timestamp filtering. Enables efficient polling without full data retrieval.',
514
438
  set_from_template: 'Set decision using template (FR-006). Params: template (required, template name), key (required), value (required), agent, layer (override), version, status (override), tags (override), scopes, plus any template-required fields. Applies template defaults (layer, status, tags) while allowing overrides. Validates required fields if specified by template. Returns: {success, key, key_id, version, template_used, applied_defaults, message}. Built-in templates: breaking_change, security_vulnerability, performance_optimization, deprecation, architecture_decision.',
515
439
  create_template: 'Create new decision template (FR-006). Params: name (required, unique), defaults (required, object with layer/status/tags/priority), required_fields (optional, array of field names), created_by (optional, agent name). Returns: {success, template_id, template_name, message}. Example defaults: {"layer":"business","status":"active","tags":["breaking"]}. Validates layer/status values.',
516
- list_templates: 'List all decision templates (FR-006). No params required. Returns: {templates: [{id, name, defaults, required_fields, created_by, created_at}], count}. Shows both built-in and custom templates.'
440
+ list_templates: 'List all decision templates (FR-006). No params required. Returns: {templates: [{id, name, defaults, required_fields, created_by, created_at}], count}. Shows both built-in and custom templates.',
441
+ hard_delete: 'Permanently delete a decision (hard delete). Params: key (required). WARNING: IRREVERSIBLE - removes all records including version history, tags, scopes. Use cases: manual cleanup after decision-to-task migration, remove test/debug decisions, purge sensitive data. Unlike soft delete (status=deprecated), this completely removes from database. Idempotent - safe to call even if already deleted. Returns: {success, key, message}.'
517
442
  },
518
443
  examples: {
519
444
  set: '{ action: "set", key: "auth_method", value: "jwt", tags: ["security"] }',
@@ -526,7 +451,146 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
526
451
  has_updates: '{ action: "has_updates", agent_name: "my-agent", since_timestamp: "2025-10-14T08:00:00Z" }',
527
452
  set_from_template: '{ action: "set_from_template", template: "breaking_change", key: "oscillator-type-moved", value: "oscillator_type moved to MonophonicSynthConfig" }',
528
453
  create_template: '{ action: "create_template", name: "bug_fix", defaults: {"layer":"business","tags":["bug","fix"],"status":"active"}, created_by: "my-agent" }',
529
- list_templates: '{ action: "list_templates" }'
454
+ list_templates: '{ action: "list_templates" }',
455
+ hard_delete: '{ action: "hard_delete", key: "task_old_authentication_refactor" }'
456
+ },
457
+ documentation: {
458
+ tool_selection: 'docs/TOOL_SELECTION.md - Decision tree, tool comparison, when to use each tool (236 lines, ~12k tokens)',
459
+ tool_reference: 'docs/TOOL_REFERENCE.md - Parameter requirements, batch operations, templates (471 lines, ~24k tokens)',
460
+ workflows: 'docs/WORKFLOWS.md - Multi-step workflow examples, multi-agent coordination (602 lines, ~30k tokens)',
461
+ best_practices: 'docs/BEST_PRACTICES.md - Common errors, best practices, troubleshooting (345 lines, ~17k tokens)',
462
+ shared_concepts: 'docs/SHARED_CONCEPTS.md - Layer definitions, enum values (status/layer/priority), atomic mode (339 lines, ~17k tokens)'
463
+ }
464
+ };
465
+ break;
466
+ case 'example':
467
+ result = {
468
+ tool: 'decision',
469
+ description: 'Comprehensive decision tool examples without needing WebFetch access',
470
+ scenarios: {
471
+ basic_usage: {
472
+ title: 'Basic Decision Management',
473
+ examples: [
474
+ {
475
+ scenario: 'Record API design decision',
476
+ request: '{ action: "set", key: "api_auth_method", value: "JWT with refresh tokens", layer: "business", tags: ["api", "security", "authentication"] }',
477
+ explanation: 'Documents the choice of authentication method for the API'
478
+ },
479
+ {
480
+ scenario: 'Retrieve a decision',
481
+ request: '{ action: "get", key: "api_auth_method" }',
482
+ response_structure: '{ key, value, layer, status, version, tags, scopes, decided_by, updated_at }'
483
+ },
484
+ {
485
+ scenario: 'List all active decisions',
486
+ request: '{ action: "list", status: "active", limit: 20 }',
487
+ explanation: 'Returns active decisions with metadata for browsing'
488
+ }
489
+ ]
490
+ },
491
+ advanced_filtering: {
492
+ title: 'Advanced Search and Filtering',
493
+ examples: [
494
+ {
495
+ scenario: 'Find all security-related decisions in business layer',
496
+ request: '{ action: "search_advanced", layers: ["business"], tags_any: ["security", "authentication"], status: ["active"], sort_by: "updated", sort_order: "desc" }',
497
+ explanation: 'Combines layer filtering, tag matching, and sorting'
498
+ },
499
+ {
500
+ scenario: 'Search within API scope with multiple tags',
501
+ request: '{ action: "search_advanced", scopes: ["api/*"], tags_all: ["breaking", "v2.0"], updated_after: "2025-01-01" }',
502
+ explanation: 'Uses scope wildcards and timestamp filtering for recent breaking changes'
503
+ }
504
+ ]
505
+ },
506
+ versioning_workflow: {
507
+ title: 'Version Management',
508
+ steps: [
509
+ {
510
+ step: 1,
511
+ action: 'Create initial decision',
512
+ request: '{ action: "set", key: "database_choice", value: "PostgreSQL", layer: "data", version: "1.0.0", tags: ["database"] }'
513
+ },
514
+ {
515
+ step: 2,
516
+ action: 'Update decision (creates new version)',
517
+ request: '{ action: "set", key: "database_choice", value: "PostgreSQL with read replicas", layer: "data", version: "1.1.0", tags: ["database", "scaling"] }'
518
+ },
519
+ {
520
+ step: 3,
521
+ action: 'View version history',
522
+ request: '{ action: "versions", key: "database_choice" }',
523
+ result: 'Returns all versions with timestamps and changes'
524
+ }
525
+ ]
526
+ },
527
+ batch_operations: {
528
+ title: 'Batch Decision Management',
529
+ examples: [
530
+ {
531
+ scenario: 'Record multiple related decisions atomically',
532
+ request: '{ action: "set_batch", decisions: [{"key": "cache_layer", "value": "Redis", "layer": "infrastructure"}, {"key": "cache_ttl", "value": "3600", "layer": "infrastructure"}], atomic: true }',
533
+ explanation: 'All decisions succeed or all fail together (atomic mode)'
534
+ },
535
+ {
536
+ scenario: 'Best-effort batch insert',
537
+ request: '{ action: "set_batch", decisions: [{...}, {...}, {...}], atomic: false }',
538
+ explanation: 'Each decision processed independently - partial success allowed'
539
+ }
540
+ ]
541
+ },
542
+ templates: {
543
+ title: 'Using Decision Templates',
544
+ examples: [
545
+ {
546
+ scenario: 'Use built-in breaking_change template',
547
+ request: '{ action: "set_from_template", template: "breaking_change", key: "api_remove_legacy_endpoint", value: "Removed /v1/users endpoint - migrate to /v2/users" }',
548
+ explanation: 'Automatically applies layer=business, tags=["breaking"], status=active'
549
+ },
550
+ {
551
+ scenario: 'Create custom template',
552
+ request: '{ action: "create_template", name: "feature_flag", defaults: {"layer": "presentation", "tags": ["feature-flag"], "status": "draft"}, created_by: "backend-team" }',
553
+ explanation: 'Define reusable templates for common decision patterns'
554
+ }
555
+ ]
556
+ },
557
+ quick_set_inference: {
558
+ title: 'Quick Set with Smart Defaults',
559
+ examples: [
560
+ {
561
+ scenario: 'Auto-infer layer from key prefix',
562
+ request: '{ action: "quick_set", key: "api/instruments/oscillator-refactor", value: "Moved oscillator_type to MonophonicSynthConfig" }',
563
+ inferred: 'layer=presentation (from api/*), tags=["instruments", "oscillator-refactor"], scope=api/instruments'
564
+ },
565
+ {
566
+ scenario: 'Database decision with auto-inference',
567
+ request: '{ action: "quick_set", key: "db/users/add-email-index", value: "Added index on email column" }',
568
+ inferred: 'layer=data (from db/*), tags=["users", "add-email-index"]'
569
+ }
570
+ ]
571
+ }
572
+ },
573
+ best_practices: {
574
+ key_naming: [
575
+ 'Use hierarchical keys: "api/users/authentication"',
576
+ 'Prefix with layer hint: api/* → presentation, db/* → data, service/* → business',
577
+ 'Use descriptive names that explain the decision context'
578
+ ],
579
+ tagging: [
580
+ 'Tag with relevant categories: security, performance, breaking, etc.',
581
+ 'Include version tags for release-specific decisions',
582
+ 'Use consistent tag naming conventions across team'
583
+ ],
584
+ versioning: [
585
+ 'Use semantic versioning: 1.0.0, 1.1.0, 2.0.0',
586
+ 'Increment major version for breaking changes',
587
+ 'Document rationale in decision value text'
588
+ ],
589
+ cleanup: [
590
+ 'Mark deprecated decisions with status="deprecated"',
591
+ 'Use hard_delete only for sensitive data or migration cleanup',
592
+ 'Link related decisions using scopes'
593
+ ]
530
594
  }
531
595
  };
532
596
  break;
@@ -562,6 +626,115 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
562
626
  get: '{ action: "get", agent_name: "bot1", unread_only: true }',
563
627
  mark_read: '{ action: "mark_read", agent_name: "bot1", message_ids: [1, 2, 3] }',
564
628
  send_batch: '{ action: "send_batch", messages: [{"from_agent": "bot1", "msg_type": "info", "message": "Task 1 done"}, {"from_agent": "bot1", "msg_type": "info", "message": "Task 2 done"}], atomic: true }'
629
+ },
630
+ documentation: {
631
+ workflows: 'docs/WORKFLOWS.md - Multi-agent coordination, messaging patterns, cross-session handoffs (602 lines, ~30k tokens)',
632
+ tool_reference: 'docs/TOOL_REFERENCE.md - Message tool parameters, batch operations (471 lines, ~24k tokens)',
633
+ shared_concepts: 'docs/SHARED_CONCEPTS.md - Enum values (msg_type/priority), atomic mode (339 lines, ~17k tokens)',
634
+ best_practices: 'docs/BEST_PRACTICES.md - Common errors, messaging best practices (345 lines, ~17k tokens)'
635
+ }
636
+ };
637
+ break;
638
+ case 'example':
639
+ result = {
640
+ tool: 'message',
641
+ description: 'Comprehensive messaging examples for multi-agent coordination',
642
+ scenarios: {
643
+ basic_messaging: {
644
+ title: 'Basic Agent Communication',
645
+ examples: [
646
+ {
647
+ scenario: 'Send info message between agents',
648
+ request: '{ action: "send", from_agent: "backend-agent", to_agent: "frontend-agent", msg_type: "info", message: "API endpoint /users is ready" }',
649
+ explanation: 'Direct message from one agent to another'
650
+ },
651
+ {
652
+ scenario: 'Broadcast message to all agents',
653
+ request: '{ action: "send", from_agent: "coordinator", to_agent: null, msg_type: "info", message: "Deployment starting in 5 minutes", priority: "high" }',
654
+ explanation: 'null to_agent broadcasts to all agents'
655
+ },
656
+ {
657
+ scenario: 'Get unread messages',
658
+ request: '{ action: "get", agent_name: "frontend-agent", unread_only: true }',
659
+ explanation: 'Retrieve only unread messages for an agent'
660
+ }
661
+ ]
662
+ },
663
+ priority_messaging: {
664
+ title: 'Priority-Based Communication',
665
+ examples: [
666
+ {
667
+ scenario: 'Critical error notification',
668
+ request: '{ action: "send", from_agent: "monitoring-agent", msg_type: "warning", message: "Database connection lost", priority: "critical" }',
669
+ explanation: 'High-priority messages for urgent issues'
670
+ },
671
+ {
672
+ scenario: 'Filter by priority',
673
+ request: '{ action: "get", agent_name: "ops-agent", priority_filter: "critical" }',
674
+ explanation: 'Get only critical priority messages'
675
+ }
676
+ ]
677
+ },
678
+ workflow_coordination: {
679
+ title: 'Multi-Step Workflow',
680
+ steps: [
681
+ {
682
+ step: 1,
683
+ action: 'Agent A requests work from Agent B',
684
+ request: '{ action: "send", from_agent: "agent-a", to_agent: "agent-b", msg_type: "request", message: "Please process user data batch-123" }'
685
+ },
686
+ {
687
+ step: 2,
688
+ action: 'Agent B checks messages',
689
+ request: '{ action: "get", agent_name: "agent-b", msg_type_filter: "request", unread_only: true }'
690
+ },
691
+ {
692
+ step: 3,
693
+ action: 'Agent B marks as read and processes',
694
+ request: '{ action: "mark_read", agent_name: "agent-b", message_ids: [123] }'
695
+ },
696
+ {
697
+ step: 4,
698
+ action: 'Agent B sends completion notification',
699
+ request: '{ action: "send", from_agent: "agent-b", to_agent: "agent-a", msg_type: "info", message: "Batch-123 processing complete" }'
700
+ }
701
+ ]
702
+ },
703
+ batch_messaging: {
704
+ title: 'Batch Message Operations',
705
+ examples: [
706
+ {
707
+ scenario: 'Send multiple status updates atomically',
708
+ request: '{ action: "send_batch", messages: [{"from_agent": "worker-1", "msg_type": "info", "message": "Task 1 done"}, {"from_agent": "worker-1", "msg_type": "info", "message": "Task 2 done"}], atomic: true }',
709
+ explanation: 'All messages sent or none (atomic mode)'
710
+ },
711
+ {
712
+ scenario: 'Best-effort batch sending',
713
+ request: '{ action: "send_batch", messages: [{...}, {...}], atomic: false }',
714
+ explanation: 'Each message sent independently - partial success allowed'
715
+ }
716
+ ]
717
+ }
718
+ },
719
+ best_practices: {
720
+ message_types: [
721
+ 'Use "decision" for recording important choices',
722
+ 'Use "warning" for errors or issues requiring attention',
723
+ 'Use "request" for work requests between agents',
724
+ 'Use "info" for status updates and notifications'
725
+ ],
726
+ priority_usage: [
727
+ 'critical: System failures, data loss, security breaches',
728
+ 'high: Important but not emergency (deployment notifications)',
729
+ 'medium: Regular coordination messages (default)',
730
+ 'low: Optional information, logging'
731
+ ],
732
+ coordination_patterns: [
733
+ 'Always mark messages as read after processing',
734
+ 'Use broadcast (to_agent=null) for system-wide announcements',
735
+ 'Filter by msg_type when checking for specific message categories',
736
+ 'Include context in message text or payload for debugging'
737
+ ]
565
738
  }
566
739
  };
567
740
  break;
@@ -597,6 +770,106 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
597
770
  get: '{ action: "get", agent_name: "refactor-bot", layer: "infrastructure", limit: 10 }',
598
771
  check_lock: '{ action: "check_lock", file_path: "src/index.ts", lock_duration: 300 }',
599
772
  record_batch: '{ action: "record_batch", file_changes: [{"file_path": "src/types.ts", "agent_name": "bot1", "change_type": "modified", "layer": "data"}, {"file_path": "src/index.ts", "agent_name": "bot1", "change_type": "modified", "layer": "infrastructure"}], atomic: true }'
773
+ },
774
+ documentation: {
775
+ workflows: 'docs/WORKFLOWS.md - File locking patterns, concurrent file access workflows (602 lines, ~30k tokens)',
776
+ tool_reference: 'docs/TOOL_REFERENCE.md - File tool parameters, batch operations (471 lines, ~24k tokens)',
777
+ shared_concepts: 'docs/SHARED_CONCEPTS.md - Layer definitions, enum values (change_type), atomic mode (339 lines, ~17k tokens)',
778
+ best_practices: 'docs/BEST_PRACTICES.md - File tracking best practices (345 lines, ~17k tokens)'
779
+ }
780
+ };
781
+ break;
782
+ case 'example':
783
+ result = {
784
+ tool: 'file',
785
+ description: 'Comprehensive file tracking examples for multi-agent coordination',
786
+ scenarios: {
787
+ basic_tracking: {
788
+ title: 'Basic File Change Tracking',
789
+ examples: [
790
+ {
791
+ scenario: 'Record file modification',
792
+ request: '{ action: "record", file_path: "src/api/users.ts", agent_name: "refactor-agent", change_type: "modified", layer: "business", description: "Added email validation" }',
793
+ explanation: 'Track changes with layer and description'
794
+ },
795
+ {
796
+ scenario: 'Get recent changes by agent',
797
+ request: '{ action: "get", agent_name: "refactor-agent", limit: 10 }',
798
+ explanation: 'View what an agent has been working on'
799
+ },
800
+ {
801
+ scenario: 'Track changes to specific file',
802
+ request: '{ action: "get", file_path: "src/api/users.ts" }',
803
+ explanation: 'See all modifications to a particular file'
804
+ }
805
+ ]
806
+ },
807
+ file_locking: {
808
+ title: 'Concurrent Access Prevention',
809
+ workflow: [
810
+ {
811
+ step: 1,
812
+ action: 'Check if file is locked',
813
+ request: '{ action: "check_lock", file_path: "src/database/schema.sql", lock_duration: 300 }',
814
+ result: '{ locked: false } or { locked: true, locked_by: "agent-name", locked_at: "timestamp" }'
815
+ },
816
+ {
817
+ step: 2,
818
+ action: 'If not locked, record change (creates lock)',
819
+ request: '{ action: "record", file_path: "src/database/schema.sql", agent_name: "migration-agent", change_type: "modified" }'
820
+ },
821
+ {
822
+ step: 3,
823
+ action: 'Lock expires after 5 minutes (default) or specified duration'
824
+ }
825
+ ]
826
+ },
827
+ layer_organization: {
828
+ title: 'Tracking by Architecture Layer',
829
+ examples: [
830
+ {
831
+ scenario: 'Get all presentation layer changes',
832
+ request: '{ action: "get", layer: "presentation", limit: 20 }',
833
+ explanation: 'View frontend/UI changes across agents'
834
+ },
835
+ {
836
+ scenario: 'Track infrastructure changes',
837
+ request: '{ action: "get", layer: "infrastructure", change_type: "modified" }',
838
+ explanation: 'Monitor config and deployment file changes'
839
+ }
840
+ ]
841
+ },
842
+ batch_tracking: {
843
+ title: 'Batch File Operations',
844
+ examples: [
845
+ {
846
+ scenario: 'Record multiple file changes atomically',
847
+ request: '{ action: "record_batch", file_changes: [{"file_path": "src/api.ts", "agent_name": "bot1", "change_type": "modified", "layer": "presentation"}, {"file_path": "src/types.ts", "agent_name": "bot1", "change_type": "modified", "layer": "data"}], atomic: true }',
848
+ explanation: 'All changes recorded or none (transaction)'
849
+ }
850
+ ]
851
+ }
852
+ },
853
+ best_practices: {
854
+ change_tracking: [
855
+ 'Always specify layer for better organization',
856
+ 'Include description for non-obvious changes',
857
+ 'Use check_lock before modifying shared files',
858
+ 'Track both creation and deletion of files'
859
+ ],
860
+ lock_management: [
861
+ 'Default lock duration is 300 seconds (5 minutes)',
862
+ 'Locks prevent concurrent modifications',
863
+ 'Locks auto-expire - no manual unlock needed',
864
+ 'Use appropriate lock_duration for operation complexity'
865
+ ],
866
+ layer_assignment: [
867
+ 'presentation: UI components, API controllers',
868
+ 'business: Services, domain logic',
869
+ 'data: Models, repositories, migrations',
870
+ 'infrastructure: Config, deployment, CI/CD',
871
+ 'cross-cutting: Utilities used across layers'
872
+ ]
600
873
  }
601
874
  };
602
875
  break;
@@ -627,6 +900,148 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
627
900
  add: '{ action: "add", category: "performance", constraint_text: "API response time <100ms", priority: "high", tags: ["api"] }',
628
901
  get: '{ action: "get", category: "performance", active_only: true }',
629
902
  deactivate: '{ action: "deactivate", constraint_id: 5 }'
903
+ },
904
+ documentation: {
905
+ tool_selection: 'docs/TOOL_SELECTION.md - Decision tree, constraint vs decision comparison (236 lines, ~12k tokens)',
906
+ workflows: 'docs/WORKFLOWS.md - Constraint validation workflows, requirement tracking (602 lines, ~30k tokens)',
907
+ shared_concepts: 'docs/SHARED_CONCEPTS.md - Layer definitions, enum values (category/priority) (339 lines, ~17k tokens)',
908
+ best_practices: 'docs/BEST_PRACTICES.md - When to use constraints, common patterns (345 lines, ~17k tokens)'
909
+ }
910
+ };
911
+ break;
912
+ case 'example':
913
+ result = {
914
+ tool: 'constraint',
915
+ description: 'Comprehensive constraint examples for various use cases',
916
+ categories: {
917
+ performance: {
918
+ description: 'Performance-related constraints for response times, throughput, resource usage',
919
+ examples: [
920
+ {
921
+ scenario: 'API Response Time',
922
+ example: '{ action: "add", category: "performance", constraint_text: "All API endpoints must respond within 100ms for 95th percentile", priority: "high", layer: "business", tags: ["api", "latency"] }',
923
+ rationale: 'Ensures fast user experience and prevents timeout issues'
924
+ },
925
+ {
926
+ scenario: 'Database Query Performance',
927
+ example: '{ action: "add", category: "performance", constraint_text: "Database queries must complete within 50ms", priority: "high", layer: "data", tags: ["database", "query"] }',
928
+ rationale: 'Prevents database bottlenecks and ensures scalability'
929
+ },
930
+ {
931
+ scenario: 'Memory Usage',
932
+ example: '{ action: "add", category: "performance", constraint_text: "Peak memory usage must not exceed 512MB per instance", priority: "critical", layer: "infrastructure", tags: ["memory", "resource"] }',
933
+ rationale: 'Prevents out-of-memory errors in containerized environments'
934
+ }
935
+ ]
936
+ },
937
+ architecture: {
938
+ description: 'Architectural constraints for code structure, dependencies, patterns',
939
+ examples: [
940
+ {
941
+ scenario: 'Layer Dependency Rules',
942
+ example: '{ action: "add", category: "architecture", constraint_text: "Presentation layer must not directly access data layer - use business layer only", priority: "critical", layer: "cross-cutting", tags: ["layering", "separation"] }',
943
+ rationale: 'Enforces clean architecture and separation of concerns'
944
+ },
945
+ {
946
+ scenario: 'Dependency Injection',
947
+ example: '{ action: "add", category: "architecture", constraint_text: "All service classes must use constructor-based dependency injection", priority: "medium", layer: "business", tags: ["di", "testability"] }',
948
+ rationale: 'Improves testability and reduces coupling'
949
+ },
950
+ {
951
+ scenario: 'API Versioning',
952
+ example: '{ action: "add", category: "architecture", constraint_text: "All public APIs must include version prefix (e.g., /v1/, /v2/)", priority: "high", layer: "presentation", tags: ["api", "versioning"] }',
953
+ rationale: 'Enables backward compatibility and smooth API evolution'
954
+ }
955
+ ]
956
+ },
957
+ security: {
958
+ description: 'Security constraints for authentication, authorization, data protection',
959
+ examples: [
960
+ {
961
+ scenario: 'Authentication Required',
962
+ example: '{ action: "add", category: "security", constraint_text: "All non-public endpoints must require JWT authentication", priority: "critical", layer: "presentation", tags: ["auth", "jwt"] }',
963
+ rationale: 'Prevents unauthorized access to protected resources'
964
+ },
965
+ {
966
+ scenario: 'Data Encryption',
967
+ example: '{ action: "add", category: "security", constraint_text: "All PII (Personally Identifiable Information) must be encrypted at rest using AES-256", priority: "critical", layer: "data", tags: ["encryption", "pii"] }',
968
+ rationale: 'Protects sensitive data and ensures compliance'
969
+ },
970
+ {
971
+ scenario: 'Input Validation',
972
+ example: '{ action: "add", category: "security", constraint_text: "All user inputs must be validated and sanitized before processing", priority: "critical", layer: "presentation", tags: ["validation", "injection-prevention"] }',
973
+ rationale: 'Prevents injection attacks (SQL, XSS, etc.)'
974
+ }
975
+ ]
976
+ }
977
+ },
978
+ workflows: {
979
+ constraint_validation: {
980
+ description: 'Workflow for validating code against constraints',
981
+ steps: [
982
+ {
983
+ step: 1,
984
+ action: 'Retrieve active constraints for layer',
985
+ example: '{ action: "get", layer: "business", active_only: true }'
986
+ },
987
+ {
988
+ step: 2,
989
+ action: 'Check code changes against constraints',
990
+ example: 'Review file changes and verify compliance with each constraint'
991
+ },
992
+ {
993
+ step: 3,
994
+ action: 'Report violations',
995
+ example: 'Use message tool to send warnings for constraint violations'
996
+ },
997
+ {
998
+ step: 4,
999
+ action: 'Link violations to tasks',
1000
+ example: 'Create tasks to fix violations and link to relevant constraints'
1001
+ }
1002
+ ]
1003
+ },
1004
+ requirement_tracking: {
1005
+ description: 'Workflow for tracking requirements as constraints',
1006
+ steps: [
1007
+ {
1008
+ step: 1,
1009
+ action: 'Add requirement as constraint',
1010
+ example: '{ action: "add", category: "performance", constraint_text: "System must handle 1000 concurrent users", priority: "high", tags: ["requirement", "load"] }'
1011
+ },
1012
+ {
1013
+ step: 2,
1014
+ action: 'Link related decisions',
1015
+ example: 'Use decision tool to record architectural decisions that address the constraint'
1016
+ },
1017
+ {
1018
+ step: 3,
1019
+ action: 'Create implementation tasks',
1020
+ example: 'Use task tool to break down implementation and link to constraint'
1021
+ },
1022
+ {
1023
+ step: 4,
1024
+ action: 'Validate compliance',
1025
+ example: 'Test implementation against constraint criteria'
1026
+ }
1027
+ ]
1028
+ }
1029
+ },
1030
+ best_practices: {
1031
+ writing_constraints: [
1032
+ 'Be specific and measurable (use numbers, percentages, time limits)',
1033
+ 'Include rationale in tags or separate documentation',
1034
+ 'Use appropriate priority (critical for must-have, high for important, medium/low for nice-to-have)',
1035
+ 'Assign to correct layer (where constraint is enforced)',
1036
+ 'Tag comprehensively for easy retrieval'
1037
+ ],
1038
+ managing_constraints: [
1039
+ 'Review constraints regularly and deactivate outdated ones',
1040
+ 'Link constraints to related decisions and tasks',
1041
+ 'Use constraints for both technical and business requirements',
1042
+ 'Validate code changes against active constraints',
1043
+ 'Document constraint violations and remediation plans'
1044
+ ]
630
1045
  }
631
1046
  };
632
1047
  break;
@@ -652,21 +1067,132 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
652
1067
  limit: params.limit,
653
1068
  });
654
1069
  break;
1070
+ case 'flush':
1071
+ result = flushWAL();
1072
+ break;
655
1073
  case 'help':
656
1074
  result = {
657
1075
  tool: 'stats',
658
- description: 'View database statistics, activity logs, and manage data cleanup',
1076
+ description: 'View database statistics, activity logs, manage data cleanup, and WAL checkpoints',
659
1077
  actions: {
660
1078
  layer_summary: 'Get summary by layer. No params required',
661
1079
  db_stats: 'Get database statistics. No params required',
662
1080
  clear: 'Clear old data. Params: messages_older_than_hours, file_changes_older_than_days',
663
- activity_log: 'Get activity log (v3.0.0). Params: since (e.g., "5m", "1h", "2d"), agent_names (array or ["*"]), actions (filter by action types), limit (default: 100)'
1081
+ activity_log: 'Get activity log (v3.0.0). Params: since (e.g., "5m", "1h", "2d"), agent_names (array or ["*"]), actions (filter by action types), limit (default: 100)',
1082
+ flush: 'Force WAL checkpoint to flush pending transactions to main database file. No params required. Uses TRUNCATE mode for complete flush. Useful before git commits to ensure database file is up-to-date.'
664
1083
  },
665
1084
  examples: {
666
1085
  layer_summary: '{ action: "layer_summary" }',
667
1086
  db_stats: '{ action: "db_stats" }',
668
1087
  clear: '{ action: "clear", messages_older_than_hours: 48, file_changes_older_than_days: 14 }',
669
- activity_log: '{ action: "activity_log", since: "1h", agent_names: ["bot1", "bot2"], limit: 50 }'
1088
+ activity_log: '{ action: "activity_log", since: "1h", agent_names: ["bot1", "bot2"], limit: 50 }',
1089
+ flush: '{ action: "flush" }'
1090
+ },
1091
+ documentation: {
1092
+ workflows: 'docs/WORKFLOWS.md - Activity monitoring, automatic cleanup workflows (602 lines, ~30k tokens)',
1093
+ best_practices: 'docs/BEST_PRACTICES.md - Database health, cleanup strategies (345 lines, ~17k tokens)',
1094
+ shared_concepts: 'docs/SHARED_CONCEPTS.md - Layer definitions for layer_summary (339 lines, ~17k tokens)',
1095
+ architecture: 'docs/ARCHITECTURE.md - Database schema, views, statistics tables'
1096
+ }
1097
+ };
1098
+ break;
1099
+ case 'example':
1100
+ result = {
1101
+ tool: 'stats',
1102
+ description: 'Database statistics and maintenance examples',
1103
+ scenarios: {
1104
+ layer_analysis: {
1105
+ title: 'Architecture Layer Summary',
1106
+ example: {
1107
+ request: '{ action: "layer_summary" }',
1108
+ response_structure: '{ layer: string, decision_count: number, file_changes: number, active_constraints: number }[]',
1109
+ use_case: 'Understand which layers have most activity and decisions'
1110
+ }
1111
+ },
1112
+ database_health: {
1113
+ title: 'Database Statistics',
1114
+ example: {
1115
+ request: '{ action: "db_stats" }',
1116
+ response_structure: '{ decisions: N, messages: N, file_changes: N, constraints: N, db_size_mb: N }',
1117
+ use_case: 'Monitor database growth and table sizes'
1118
+ }
1119
+ },
1120
+ activity_monitoring: {
1121
+ title: 'Activity Log Queries',
1122
+ examples: [
1123
+ {
1124
+ scenario: 'Recent activity (last hour)',
1125
+ request: '{ action: "activity_log", since: "1h", limit: 50 }',
1126
+ explanation: 'View all agent activity in the past hour'
1127
+ },
1128
+ {
1129
+ scenario: 'Specific agent activity',
1130
+ request: '{ action: "activity_log", since: "24h", agent_names: ["backend-agent", "frontend-agent"] }',
1131
+ explanation: 'Track what specific agents have been doing'
1132
+ },
1133
+ {
1134
+ scenario: 'Filter by action type',
1135
+ request: '{ action: "activity_log", since: "2d", actions: ["set_decision", "create_task"] }',
1136
+ explanation: 'See only specific types of actions'
1137
+ }
1138
+ ]
1139
+ },
1140
+ data_cleanup: {
1141
+ title: 'Maintenance and Cleanup',
1142
+ examples: [
1143
+ {
1144
+ scenario: 'Manual cleanup with specific retention',
1145
+ request: '{ action: "clear", messages_older_than_hours: 48, file_changes_older_than_days: 14 }',
1146
+ explanation: 'Override config and delete old data'
1147
+ },
1148
+ {
1149
+ scenario: 'Config-based automatic cleanup',
1150
+ request: '{ action: "clear" }',
1151
+ explanation: 'Use configured retention settings (respects weekend-aware mode)'
1152
+ }
1153
+ ]
1154
+ },
1155
+ wal_management: {
1156
+ title: 'WAL Checkpoint (Git Workflow)',
1157
+ workflow: [
1158
+ {
1159
+ step: 1,
1160
+ action: 'Make changes to context (decisions, tasks, etc.)',
1161
+ explanation: 'SQLite WAL mode keeps changes in separate file'
1162
+ },
1163
+ {
1164
+ step: 2,
1165
+ action: 'Before git commit, flush WAL',
1166
+ request: '{ action: "flush" }',
1167
+ explanation: 'Merges WAL changes into main .db file'
1168
+ },
1169
+ {
1170
+ step: 3,
1171
+ action: 'Commit database file',
1172
+ explanation: 'Database file now contains all changes for version control'
1173
+ }
1174
+ ]
1175
+ }
1176
+ },
1177
+ best_practices: {
1178
+ monitoring: [
1179
+ 'Check layer_summary regularly to identify hotspots',
1180
+ 'Monitor db_stats to prevent database bloat',
1181
+ 'Use activity_log for debugging multi-agent issues',
1182
+ 'Set appropriate retention periods based on project needs'
1183
+ ],
1184
+ cleanup: [
1185
+ 'Run periodic cleanup to manage database size',
1186
+ 'Use weekend-aware mode for business hour retention',
1187
+ 'Consider longer retention for important decisions',
1188
+ 'Test cleanup with manual parameters before automating'
1189
+ ],
1190
+ wal_checkpoints: [
1191
+ 'Always flush before git commits for clean diffs',
1192
+ 'WAL mode improves concurrent access performance',
1193
+ 'Checkpoint automatically happens on shutdown',
1194
+ 'Manual flush ensures immediate persistence'
1195
+ ]
670
1196
  }
671
1197
  };
672
1198
  break;
@@ -692,6 +1218,291 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
692
1218
  examples: {
693
1219
  get: '{ action: "get" }',
694
1220
  update: '{ action: "update", ignoreWeekend: true, messageRetentionHours: 48 }'
1221
+ },
1222
+ documentation: {
1223
+ shared_concepts: 'docs/SHARED_CONCEPTS.md - Weekend-aware retention behavior explained (339 lines, ~17k tokens)',
1224
+ best_practices: 'docs/BEST_PRACTICES.md - Retention strategies, cleanup timing (345 lines, ~17k tokens)',
1225
+ architecture: 'docs/ARCHITECTURE.md - Auto-cleanup architecture, configuration system'
1226
+ }
1227
+ };
1228
+ break;
1229
+ case 'example':
1230
+ result = {
1231
+ tool: 'config',
1232
+ description: 'Configuration management examples',
1233
+ scenarios: {
1234
+ view_config: {
1235
+ title: 'Current Configuration',
1236
+ example: {
1237
+ request: '{ action: "get" }',
1238
+ response: '{ ignoreWeekend: boolean, messageRetentionHours: number, fileHistoryRetentionDays: number }',
1239
+ explanation: 'View current auto-deletion settings'
1240
+ }
1241
+ },
1242
+ standard_retention: {
1243
+ title: 'Standard Time-Based Retention',
1244
+ example: {
1245
+ request: '{ action: "update", ignoreWeekend: false, messageRetentionHours: 24, fileHistoryRetentionDays: 7 }',
1246
+ explanation: 'Messages deleted after 24 hours, file history after 7 days (strict time-based)'
1247
+ }
1248
+ },
1249
+ weekend_aware: {
1250
+ title: 'Weekend-Aware Retention',
1251
+ example: {
1252
+ request: '{ action: "update", ignoreWeekend: true, messageRetentionHours: 24, fileHistoryRetentionDays: 7 }',
1253
+ explanation: 'On Monday, 24h retention = Friday (skips weekend)',
1254
+ scenario: 'Useful for business-hour contexts where weekend messages should persist'
1255
+ }
1256
+ },
1257
+ extended_retention: {
1258
+ title: 'Long-Term Project Retention',
1259
+ example: {
1260
+ request: '{ action: "update", messageRetentionHours: 168, fileHistoryRetentionDays: 90 }',
1261
+ explanation: '1 week message retention, 90 days file history (max allowed)',
1262
+ use_case: 'Long-running projects needing extended context'
1263
+ }
1264
+ }
1265
+ },
1266
+ retention_behavior: {
1267
+ ignoreWeekend_false: {
1268
+ description: 'Standard time-based retention',
1269
+ examples: [
1270
+ '24h on Monday = 24 hours ago (Sunday)',
1271
+ '24h on Friday = 24 hours ago (Thursday)',
1272
+ 'Straightforward chronological deletion'
1273
+ ]
1274
+ },
1275
+ ignoreWeekend_true: {
1276
+ description: 'Business-hours retention (skips Sat/Sun)',
1277
+ examples: [
1278
+ '24h on Monday = Friday (skips Sat/Sun)',
1279
+ '24h on Tuesday = Monday',
1280
+ '24h on Friday = Thursday',
1281
+ '24h on Saturday/Sunday = Friday',
1282
+ 'Preserves weekend messages until Monday cleanup'
1283
+ ]
1284
+ }
1285
+ },
1286
+ best_practices: {
1287
+ choosing_retention: [
1288
+ 'Short projects: 24h messages, 7d file history',
1289
+ 'Medium projects: 72h messages, 14d file history',
1290
+ 'Long projects: 168h (1 week) messages, 30-90d file history',
1291
+ 'Use ignoreWeekend=true for business-hour focused work'
1292
+ ],
1293
+ limits: [
1294
+ 'messageRetentionHours: 1-168 (1 hour to 1 week)',
1295
+ 'fileHistoryRetentionDays: 1-90',
1296
+ 'Choose based on your projects needs and database size constraints'
1297
+ ],
1298
+ cli_override: [
1299
+ 'Can override config at server startup via CLI args',
1300
+ '--autodelete-ignore-weekend, --autodelete-message-hours, --autodelete-file-history-days',
1301
+ 'Runtime updates via config tool take precedence over CLI'
1302
+ ]
1303
+ }
1304
+ };
1305
+ break;
1306
+ default: throw new Error(`Unknown action: ${params.action}`);
1307
+ }
1308
+ break;
1309
+ case 'task':
1310
+ switch (params.action) {
1311
+ case 'create':
1312
+ result = createTask(params);
1313
+ break;
1314
+ case 'update':
1315
+ result = updateTask(params);
1316
+ break;
1317
+ case 'get':
1318
+ result = getTask(params);
1319
+ break;
1320
+ case 'list':
1321
+ result = listTasks(params);
1322
+ break;
1323
+ case 'move':
1324
+ result = moveTask(params);
1325
+ break;
1326
+ case 'link':
1327
+ result = linkTask(params);
1328
+ break;
1329
+ case 'archive':
1330
+ result = archiveTask(params);
1331
+ break;
1332
+ case 'batch_create':
1333
+ result = batchCreateTasks({ tasks: params.tasks, atomic: params.atomic });
1334
+ break;
1335
+ case 'help':
1336
+ result = taskHelp();
1337
+ break;
1338
+ case 'example':
1339
+ result = {
1340
+ tool: 'task',
1341
+ description: 'Comprehensive task management examples for Kanban-style workflow',
1342
+ scenarios: {
1343
+ basic_task_management: {
1344
+ title: 'Creating and Managing Tasks',
1345
+ examples: [
1346
+ {
1347
+ scenario: 'Create a new task',
1348
+ request: '{ action: "create", title: "Implement user authentication", description: "Add JWT-based auth to API", priority: 3, assigned_agent: "backend-agent", layer: "business", tags: ["authentication", "security"] }',
1349
+ explanation: 'Creates task in todo status with high priority'
1350
+ },
1351
+ {
1352
+ scenario: 'Get task details',
1353
+ request: '{ action: "get", task_id: 5 }',
1354
+ response: 'Full task details including metadata, links, and timestamps'
1355
+ },
1356
+ {
1357
+ scenario: 'List tasks by status',
1358
+ request: '{ action: "list", status: "in_progress", limit: 20 }',
1359
+ explanation: 'View all in-progress tasks'
1360
+ }
1361
+ ]
1362
+ },
1363
+ status_workflow: {
1364
+ title: 'Task Lifecycle (Status Transitions)',
1365
+ workflow: [
1366
+ {
1367
+ step: 1,
1368
+ status: 'todo',
1369
+ action: '{ action: "create", title: "...", status: "todo" }',
1370
+ description: 'Task created and waiting to be started'
1371
+ },
1372
+ {
1373
+ step: 2,
1374
+ status: 'in_progress',
1375
+ action: '{ action: "move", task_id: 1, new_status: "in_progress" }',
1376
+ description: 'Agent starts working on task'
1377
+ },
1378
+ {
1379
+ step: 3,
1380
+ status: 'waiting_review',
1381
+ action: '{ action: "move", task_id: 1, new_status: "waiting_review" }',
1382
+ description: 'Work complete, awaiting review/approval'
1383
+ },
1384
+ {
1385
+ step: 4,
1386
+ status: 'done',
1387
+ action: '{ action: "move", task_id: 1, new_status: "done" }',
1388
+ description: 'Task reviewed and completed'
1389
+ },
1390
+ {
1391
+ step: 5,
1392
+ status: 'archived',
1393
+ action: '{ action: "archive", task_id: 1 }',
1394
+ description: 'Task archived for historical record'
1395
+ }
1396
+ ],
1397
+ blocked_status: {
1398
+ description: 'Use "blocked" when task cannot proceed due to dependencies',
1399
+ example: '{ action: "move", task_id: 1, new_status: "blocked" }'
1400
+ }
1401
+ },
1402
+ auto_stale_detection: {
1403
+ title: 'Automatic Stale Task Management',
1404
+ behavior: [
1405
+ {
1406
+ rule: 'in_progress > 2 hours → waiting_review',
1407
+ explanation: 'Tasks stuck in progress auto-move to waiting_review',
1408
+ rationale: 'Prevents tasks from being forgotten while in progress'
1409
+ },
1410
+ {
1411
+ rule: 'waiting_review > 24 hours → todo',
1412
+ explanation: 'Unreviewed tasks return to todo queue',
1413
+ rationale: 'Ensures waiting tasks dont accumulate indefinitely'
1414
+ }
1415
+ ],
1416
+ configuration: {
1417
+ keys: ['task_stale_hours_in_progress', 'task_stale_hours_waiting_review', 'task_auto_stale_enabled'],
1418
+ note: 'Configure via config table in database'
1419
+ }
1420
+ },
1421
+ task_linking: {
1422
+ title: 'Linking Tasks to Context',
1423
+ examples: [
1424
+ {
1425
+ scenario: 'Link task to decision',
1426
+ request: '{ action: "link", task_id: 5, link_type: "decision", target_id: "api_auth_method", link_relation: "implements" }',
1427
+ explanation: 'Track which tasks implement specific decisions'
1428
+ },
1429
+ {
1430
+ scenario: 'Link task to constraint',
1431
+ request: '{ action: "link", task_id: 5, link_type: "constraint", target_id: 3, link_relation: "addresses" }',
1432
+ explanation: 'Show task addresses a performance/architecture/security constraint'
1433
+ },
1434
+ {
1435
+ scenario: 'Link task to file',
1436
+ request: '{ action: "link", task_id: 5, link_type: "file", target_id: "src/api/auth.ts", link_relation: "modifies" }',
1437
+ explanation: 'Indicate which files the task will modify'
1438
+ }
1439
+ ]
1440
+ },
1441
+ batch_operations: {
1442
+ title: 'Batch Task Creation',
1443
+ examples: [
1444
+ {
1445
+ scenario: 'Create multiple related tasks',
1446
+ request: '{ action: "batch_create", tasks: [{"title": "Design API", "priority": 3}, {"title": "Implement API", "priority": 3}, {"title": "Write tests", "priority": 2}], atomic: false }',
1447
+ explanation: 'Create task breakdown - use atomic:false for best-effort'
1448
+ }
1449
+ ]
1450
+ },
1451
+ filtering_queries: {
1452
+ title: 'Advanced Task Queries',
1453
+ examples: [
1454
+ {
1455
+ scenario: 'Find high-priority tasks for agent',
1456
+ request: '{ action: "list", assigned_agent: "backend-agent", priority: 3, status: "todo" }',
1457
+ note: 'Priority is numeric: 1=low, 2=medium, 3=high, 4=critical'
1458
+ },
1459
+ {
1460
+ scenario: 'Get all security-related tasks',
1461
+ request: '{ action: "list", tags: ["security"], limit: 50 }',
1462
+ explanation: 'Filter by tags for topic-based views'
1463
+ },
1464
+ {
1465
+ scenario: 'View infrastructure layer tasks',
1466
+ request: '{ action: "list", layer: "infrastructure" }',
1467
+ explanation: 'See all DevOps/config related tasks'
1468
+ }
1469
+ ]
1470
+ }
1471
+ },
1472
+ valid_transitions: {
1473
+ from_todo: ['in_progress', 'blocked', 'done', 'archived'],
1474
+ from_in_progress: ['waiting_review', 'blocked', 'todo'],
1475
+ from_waiting_review: ['done', 'in_progress', 'todo'],
1476
+ from_blocked: ['todo', 'in_progress'],
1477
+ from_done: ['archived', 'todo'],
1478
+ from_archived: []
1479
+ },
1480
+ best_practices: {
1481
+ task_creation: [
1482
+ 'Use descriptive titles (200 char max)',
1483
+ 'Set appropriate priority: 1=low, 2=medium (default), 3=high, 4=critical',
1484
+ 'Assign to layer where work will be done',
1485
+ 'Tag comprehensively for easy filtering',
1486
+ 'Include acceptance_criteria for complex tasks'
1487
+ ],
1488
+ status_management: [
1489
+ 'Move to in_progress when starting work',
1490
+ 'Use waiting_review for completed but unverified work',
1491
+ 'Set to blocked with notes explaining dependency',
1492
+ 'Archive done tasks periodically for cleaner views'
1493
+ ],
1494
+ linking: [
1495
+ 'Link tasks to decisions they implement',
1496
+ 'Link to constraints they address',
1497
+ 'Link to files they will modify',
1498
+ 'Use descriptive link_relation values'
1499
+ ],
1500
+ coordination: [
1501
+ 'Use assigned_agent for clear ownership',
1502
+ 'Filter by status for Kanban board views',
1503
+ 'Monitor auto-stale transitions for stuck work',
1504
+ 'Use tags for cross-cutting concerns (security, performance, etc.)'
1505
+ ]
695
1506
  }
696
1507
  };
697
1508
  break;