sqlew 3.1.1 → 3.2.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 (51) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/README.md +12 -2
  3. package/assets/schema.sql +28 -1
  4. package/dist/database.d.ts +65 -0
  5. package/dist/database.d.ts.map +1 -1
  6. package/dist/database.js +190 -0
  7. package/dist/database.js.map +1 -1
  8. package/dist/index.js +36 -6
  9. package/dist/index.js.map +1 -1
  10. package/dist/migrations/add-decision-context.d.ts +28 -0
  11. package/dist/migrations/add-decision-context.d.ts.map +1 -0
  12. package/dist/migrations/add-decision-context.js +125 -0
  13. package/dist/migrations/add-decision-context.js.map +1 -0
  14. package/dist/migrations/add-task-dependencies.d.ts +26 -0
  15. package/dist/migrations/add-task-dependencies.d.ts.map +1 -0
  16. package/dist/migrations/add-task-dependencies.js +94 -0
  17. package/dist/migrations/add-task-dependencies.js.map +1 -0
  18. package/dist/migrations/index.d.ts +3 -1
  19. package/dist/migrations/index.d.ts.map +1 -1
  20. package/dist/migrations/index.js +32 -2
  21. package/dist/migrations/index.js.map +1 -1
  22. package/dist/schema.js +2 -2
  23. package/dist/schema.js.map +1 -1
  24. package/dist/tests/migrations/test-v3.2-migration.d.ts +6 -0
  25. package/dist/tests/migrations/test-v3.2-migration.d.ts.map +1 -0
  26. package/dist/tests/migrations/test-v3.2-migration.js +191 -0
  27. package/dist/tests/migrations/test-v3.2-migration.js.map +1 -0
  28. package/dist/tests/tasks.dependencies.test.d.ts +7 -0
  29. package/dist/tests/tasks.dependencies.test.d.ts.map +1 -0
  30. package/dist/tests/tasks.dependencies.test.js +613 -0
  31. package/dist/tests/tasks.dependencies.test.js.map +1 -0
  32. package/dist/tools/context.d.ts +21 -2
  33. package/dist/tools/context.d.ts.map +1 -1
  34. package/dist/tools/context.js +110 -3
  35. package/dist/tools/context.js.map +1 -1
  36. package/dist/tools/tasks.d.ts +23 -0
  37. package/dist/tools/tasks.d.ts.map +1 -1
  38. package/dist/tools/tasks.js +298 -8
  39. package/dist/tools/tasks.js.map +1 -1
  40. package/dist/tools/utils.d.ts.map +1 -1
  41. package/dist/tools/utils.js +44 -21
  42. package/dist/tools/utils.js.map +1 -1
  43. package/dist/types.d.ts +26 -0
  44. package/dist/types.d.ts.map +1 -1
  45. package/docs/AI_AGENT_GUIDE.md +25 -3
  46. package/docs/DECISION_CONTEXT.md +474 -0
  47. package/docs/TASK_ACTIONS.md +311 -10
  48. package/docs/TASK_DEPENDENCIES.md +748 -0
  49. package/docs/TASK_LINKING.md +188 -8
  50. package/docs/WORKFLOWS.md +25 -3
  51. package/package.json +4 -2
@@ -0,0 +1,613 @@
1
+ /**
2
+ * Unit tests for Task Dependency feature
3
+ * Tests add_dependency, remove_dependency, get_dependencies actions
4
+ * and enhanced list/get actions with dependency support
5
+ */
6
+ import { describe, it, beforeEach } from 'node:test';
7
+ import assert from 'node:assert/strict';
8
+ import Database from 'better-sqlite3';
9
+ import { initializeSchema } from '../schema.js';
10
+ import { migrateToTaskDependencies } from '../migrations/add-task-dependencies.js';
11
+ import { getOrCreateAgent, transaction } from '../database.js';
12
+ /**
13
+ * Test database instance
14
+ */
15
+ let testDb;
16
+ /**
17
+ * Create an in-memory test database
18
+ */
19
+ function createTestDatabase() {
20
+ const db = new Database(':memory:');
21
+ db.pragma('foreign_keys = ON');
22
+ // Initialize schema
23
+ initializeSchema(db);
24
+ // Run task dependencies migration
25
+ const migrationResult = migrateToTaskDependencies(db);
26
+ if (!migrationResult.success) {
27
+ throw new Error(`Migration failed: ${migrationResult.message}`);
28
+ }
29
+ return db;
30
+ }
31
+ /**
32
+ * Helper: Create a test task
33
+ */
34
+ function createTestTask(db, title, status = 'todo') {
35
+ const agentId = getOrCreateAgent(db, 'test-agent');
36
+ const statusIdMap = {
37
+ 'todo': 1,
38
+ 'in_progress': 2,
39
+ 'waiting_review': 3,
40
+ 'blocked': 4,
41
+ 'done': 5,
42
+ 'archived': 6
43
+ };
44
+ const statusId = statusIdMap[status];
45
+ const result = db.prepare(`
46
+ INSERT INTO t_tasks (title, status_id, priority, created_by_agent_id, assigned_agent_id)
47
+ VALUES (?, ?, 2, ?, ?)
48
+ `).run(title, statusId, agentId, agentId);
49
+ return result.lastInsertRowid;
50
+ }
51
+ /**
52
+ * Inline implementation of addDependency for testing (avoiding module dependency)
53
+ */
54
+ function addDependencyTest(db, params) {
55
+ if (!params.blocker_task_id) {
56
+ throw new Error('Parameter "blocker_task_id" is required');
57
+ }
58
+ if (!params.blocked_task_id) {
59
+ throw new Error('Parameter "blocked_task_id" is required');
60
+ }
61
+ return transaction(db, () => {
62
+ const TASK_STATUS_ARCHIVED = 6;
63
+ // Validation 1: No self-dependencies
64
+ if (params.blocker_task_id === params.blocked_task_id) {
65
+ throw new Error('Self-dependency not allowed');
66
+ }
67
+ // Validation 2: Both tasks must exist and check if archived
68
+ const blockerTask = db.prepare('SELECT id, status_id FROM t_tasks WHERE id = ?').get(params.blocker_task_id);
69
+ const blockedTask = db.prepare('SELECT id, status_id FROM t_tasks WHERE id = ?').get(params.blocked_task_id);
70
+ if (!blockerTask) {
71
+ throw new Error(`Blocker task #${params.blocker_task_id} not found`);
72
+ }
73
+ if (!blockedTask) {
74
+ throw new Error(`Blocked task #${params.blocked_task_id} not found`);
75
+ }
76
+ // Validation 3: Neither task is archived
77
+ if (blockerTask.status_id === TASK_STATUS_ARCHIVED) {
78
+ throw new Error(`Cannot add dependency: Task #${params.blocker_task_id} is archived`);
79
+ }
80
+ if (blockedTask.status_id === TASK_STATUS_ARCHIVED) {
81
+ throw new Error(`Cannot add dependency: Task #${params.blocked_task_id} is archived`);
82
+ }
83
+ // Validation 4: No direct circular (reverse relationship)
84
+ const reverseExists = db.prepare(`
85
+ SELECT 1 FROM t_task_dependencies
86
+ WHERE blocker_task_id = ? AND blocked_task_id = ?
87
+ `).get(params.blocked_task_id, params.blocker_task_id);
88
+ if (reverseExists) {
89
+ throw new Error(`Circular dependency detected: Task #${params.blocked_task_id} already blocks Task #${params.blocker_task_id}`);
90
+ }
91
+ // Validation 5: No transitive circular (check if adding this would create a cycle)
92
+ const cycleCheck = db.prepare(`
93
+ WITH RECURSIVE dependency_chain AS (
94
+ -- Start from the task that would be blocked
95
+ SELECT blocked_task_id as task_id, 1 as depth
96
+ FROM t_task_dependencies
97
+ WHERE blocker_task_id = ?
98
+
99
+ UNION ALL
100
+
101
+ -- Follow the chain of dependencies
102
+ SELECT d.blocked_task_id, dc.depth + 1
103
+ FROM t_task_dependencies d
104
+ JOIN dependency_chain dc ON d.blocker_task_id = dc.task_id
105
+ WHERE dc.depth < 100
106
+ )
107
+ SELECT task_id FROM dependency_chain WHERE task_id = ?
108
+ `).get(params.blocked_task_id, params.blocker_task_id);
109
+ if (cycleCheck) {
110
+ // Build cycle path for error message
111
+ const cyclePathResult = db.prepare(`
112
+ WITH RECURSIVE dependency_chain AS (
113
+ SELECT blocked_task_id as task_id, 1 as depth,
114
+ CAST(blocked_task_id AS TEXT) as path
115
+ FROM t_task_dependencies
116
+ WHERE blocker_task_id = ?
117
+
118
+ UNION ALL
119
+
120
+ SELECT d.blocked_task_id, dc.depth + 1,
121
+ dc.path || ' → ' || d.blocked_task_id
122
+ FROM t_task_dependencies d
123
+ JOIN dependency_chain dc ON d.blocker_task_id = dc.task_id
124
+ WHERE dc.depth < 100
125
+ )
126
+ SELECT path FROM dependency_chain WHERE task_id = ? ORDER BY depth DESC LIMIT 1
127
+ `).get(params.blocked_task_id, params.blocker_task_id);
128
+ const cyclePath = cyclePathResult?.path || `#${params.blocked_task_id} → ... → #${params.blocker_task_id}`;
129
+ throw new Error(`Circular dependency detected: Task #${params.blocker_task_id} → #${cyclePath} → #${params.blocker_task_id}`);
130
+ }
131
+ // All validations passed - insert dependency
132
+ const insertStmt = db.prepare(`
133
+ INSERT INTO t_task_dependencies (blocker_task_id, blocked_task_id)
134
+ VALUES (?, ?)
135
+ `);
136
+ insertStmt.run(params.blocker_task_id, params.blocked_task_id);
137
+ return {
138
+ success: true,
139
+ message: `Dependency added: Task #${params.blocker_task_id} blocks Task #${params.blocked_task_id}`
140
+ };
141
+ });
142
+ }
143
+ /**
144
+ * Inline implementation of removeDependency for testing
145
+ */
146
+ function removeDependencyTest(db, params) {
147
+ if (!params.blocker_task_id) {
148
+ throw new Error('Parameter "blocker_task_id" is required');
149
+ }
150
+ if (!params.blocked_task_id) {
151
+ throw new Error('Parameter "blocked_task_id" is required');
152
+ }
153
+ const deleteStmt = db.prepare(`
154
+ DELETE FROM t_task_dependencies
155
+ WHERE blocker_task_id = ? AND blocked_task_id = ?
156
+ `);
157
+ deleteStmt.run(params.blocker_task_id, params.blocked_task_id);
158
+ return {
159
+ success: true,
160
+ message: `Dependency removed: Task #${params.blocker_task_id} no longer blocks Task #${params.blocked_task_id}`
161
+ };
162
+ }
163
+ /**
164
+ * Inline implementation of getDependencies for testing
165
+ */
166
+ function getDependenciesTest(db, params) {
167
+ if (!params.task_id) {
168
+ throw new Error('Parameter "task_id" is required');
169
+ }
170
+ const includeDetails = params.include_details || false;
171
+ // Check if task exists
172
+ const taskExists = db.prepare('SELECT id FROM t_tasks WHERE id = ?').get(params.task_id);
173
+ if (!taskExists) {
174
+ throw new Error(`Task with id ${params.task_id} not found`);
175
+ }
176
+ // Build query based on include_details flag
177
+ let selectFields;
178
+ if (includeDetails) {
179
+ selectFields = `
180
+ t.id,
181
+ t.title,
182
+ s.name as status,
183
+ t.priority,
184
+ aa.name as assigned_to,
185
+ t.created_ts,
186
+ t.updated_ts,
187
+ td.description
188
+ `;
189
+ }
190
+ else {
191
+ selectFields = `
192
+ t.id,
193
+ t.title,
194
+ s.name as status,
195
+ t.priority
196
+ `;
197
+ }
198
+ // Get blockers (tasks that block this task)
199
+ const blockersQuery = `
200
+ SELECT ${selectFields}
201
+ FROM t_tasks t
202
+ JOIN t_task_dependencies d ON t.id = d.blocker_task_id
203
+ LEFT JOIN m_task_statuses s ON t.status_id = s.id
204
+ LEFT JOIN m_agents aa ON t.assigned_agent_id = aa.id
205
+ ${includeDetails ? 'LEFT JOIN t_task_details td ON t.id = td.task_id' : ''}
206
+ WHERE d.blocked_task_id = ?
207
+ `;
208
+ const blockers = db.prepare(blockersQuery).all(params.task_id);
209
+ // Get blocking (tasks this task blocks)
210
+ const blockingQuery = `
211
+ SELECT ${selectFields}
212
+ FROM t_tasks t
213
+ JOIN t_task_dependencies d ON t.id = d.blocked_task_id
214
+ LEFT JOIN m_task_statuses s ON t.status_id = s.id
215
+ LEFT JOIN m_agents aa ON t.assigned_agent_id = aa.id
216
+ ${includeDetails ? 'LEFT JOIN t_task_details td ON t.id = td.task_id' : ''}
217
+ WHERE d.blocker_task_id = ?
218
+ `;
219
+ const blocking = db.prepare(blockingQuery).all(params.task_id);
220
+ return {
221
+ task_id: params.task_id,
222
+ blockers,
223
+ blocking
224
+ };
225
+ }
226
+ /**
227
+ * Setup before each test
228
+ */
229
+ beforeEach(() => {
230
+ // Create fresh database for each test
231
+ testDb = createTestDatabase();
232
+ });
233
+ // ============================================================================
234
+ // Task #66: Unit Tests for add_dependency Validation
235
+ // ============================================================================
236
+ describe('add_dependency - Success Cases', () => {
237
+ it('should add valid dependency', () => {
238
+ // Arrange
239
+ const task1 = createTestTask(testDb, 'Task 1');
240
+ const task2 = createTestTask(testDb, 'Task 2');
241
+ // Act
242
+ const result = addDependencyTest(testDb, {
243
+ blocker_task_id: task1,
244
+ blocked_task_id: task2
245
+ });
246
+ // Assert
247
+ assert.strictEqual(result.success, true);
248
+ assert.match(result.message, /Dependency added/);
249
+ // Verify in database
250
+ const deps = testDb.prepare(`
251
+ SELECT * FROM t_task_dependencies
252
+ WHERE blocker_task_id = ? AND blocked_task_id = ?
253
+ `).get(task1, task2);
254
+ assert.ok(deps);
255
+ });
256
+ it('should add valid dependency and verify via get_dependencies', () => {
257
+ // Arrange
258
+ const task1 = createTestTask(testDb, 'Task 1');
259
+ const task2 = createTestTask(testDb, 'Task 2');
260
+ // Act
261
+ addDependencyTest(testDb, {
262
+ blocker_task_id: task1,
263
+ blocked_task_id: task2
264
+ });
265
+ const result = getDependenciesTest(testDb, { task_id: task2 });
266
+ // Assert
267
+ assert.strictEqual(result.task_id, task2);
268
+ assert.strictEqual(result.blockers.length, 1);
269
+ assert.strictEqual(result.blockers[0].id, task1);
270
+ assert.strictEqual(result.blocking.length, 0);
271
+ });
272
+ });
273
+ describe('add_dependency - Validation: Self-Dependency', () => {
274
+ it('should reject self-dependency', () => {
275
+ // Arrange
276
+ const task1 = createTestTask(testDb, 'Task 1');
277
+ // Act & Assert
278
+ assert.throws(() => {
279
+ addDependencyTest(testDb, {
280
+ blocker_task_id: task1,
281
+ blocked_task_id: task1
282
+ });
283
+ }, {
284
+ message: /Self-dependency not allowed/
285
+ });
286
+ });
287
+ });
288
+ describe('add_dependency - Validation: Direct Circular', () => {
289
+ it('should reject direct circular dependency', () => {
290
+ // Arrange
291
+ const taskA = createTestTask(testDb, 'Task A');
292
+ const taskB = createTestTask(testDb, 'Task B');
293
+ // Add A blocks B
294
+ addDependencyTest(testDb, {
295
+ blocker_task_id: taskA,
296
+ blocked_task_id: taskB
297
+ });
298
+ // Act & Assert - Try to add B blocks A
299
+ assert.throws(() => {
300
+ addDependencyTest(testDb, {
301
+ blocker_task_id: taskB,
302
+ blocked_task_id: taskA
303
+ });
304
+ }, {
305
+ message: /Circular dependency detected/
306
+ });
307
+ });
308
+ });
309
+ describe('add_dependency - Validation: Transitive Circular', () => {
310
+ it('should reject transitive circular dependency (A→B→C→A)', () => {
311
+ // Arrange
312
+ const taskA = createTestTask(testDb, 'Task A');
313
+ const taskB = createTestTask(testDb, 'Task B');
314
+ const taskC = createTestTask(testDb, 'Task C');
315
+ // Add A blocks B
316
+ addDependencyTest(testDb, {
317
+ blocker_task_id: taskA,
318
+ blocked_task_id: taskB
319
+ });
320
+ // Add B blocks C
321
+ addDependencyTest(testDb, {
322
+ blocker_task_id: taskB,
323
+ blocked_task_id: taskC
324
+ });
325
+ // Act & Assert - Try to add C blocks A (would create cycle)
326
+ assert.throws(() => {
327
+ addDependencyTest(testDb, {
328
+ blocker_task_id: taskC,
329
+ blocked_task_id: taskA
330
+ });
331
+ }, {
332
+ message: /Circular dependency detected/
333
+ });
334
+ });
335
+ it('should reject transitive circular with cycle path in error message', () => {
336
+ // Arrange
337
+ const task1 = createTestTask(testDb, 'Task 1');
338
+ const task2 = createTestTask(testDb, 'Task 2');
339
+ const task3 = createTestTask(testDb, 'Task 3');
340
+ // Create chain: 1 → 2 → 3
341
+ addDependencyTest(testDb, {
342
+ blocker_task_id: task1,
343
+ blocked_task_id: task2
344
+ });
345
+ addDependencyTest(testDb, {
346
+ blocker_task_id: task2,
347
+ blocked_task_id: task3
348
+ });
349
+ // Act & Assert - Try to add 3 → 1
350
+ let errorMessage = '';
351
+ try {
352
+ addDependencyTest(testDb, {
353
+ blocker_task_id: task3,
354
+ blocked_task_id: task1
355
+ });
356
+ }
357
+ catch (error) {
358
+ errorMessage = error instanceof Error ? error.message : '';
359
+ }
360
+ // Verify error message contains cycle path
361
+ assert.match(errorMessage, /Circular dependency detected/);
362
+ // The error message should contain task IDs (may have # prefix or not depending on path formatting)
363
+ assert.match(errorMessage, new RegExp(`${task3}`));
364
+ assert.match(errorMessage, new RegExp(`${task2}`));
365
+ assert.match(errorMessage, new RegExp(`Task #${task3}`)); // Verify the main task ID has # prefix
366
+ });
367
+ });
368
+ describe('add_dependency - Validation: Non-Existent Tasks', () => {
369
+ it('should reject dependency with non-existent blocker', () => {
370
+ // Arrange
371
+ const task1 = createTestTask(testDb, 'Task 1');
372
+ // Act & Assert
373
+ assert.throws(() => {
374
+ addDependencyTest(testDb, {
375
+ blocker_task_id: 999,
376
+ blocked_task_id: task1
377
+ });
378
+ }, {
379
+ message: /Blocker task #999 not found/
380
+ });
381
+ });
382
+ it('should reject dependency with non-existent blocked', () => {
383
+ // Arrange
384
+ const task1 = createTestTask(testDb, 'Task 1');
385
+ // Act & Assert
386
+ assert.throws(() => {
387
+ addDependencyTest(testDb, {
388
+ blocker_task_id: task1,
389
+ blocked_task_id: 999
390
+ });
391
+ }, {
392
+ message: /Blocked task #999 not found/
393
+ });
394
+ });
395
+ });
396
+ describe('add_dependency - Validation: Archived Tasks', () => {
397
+ it('should reject dependency with archived blocker', () => {
398
+ // Arrange
399
+ const task1 = createTestTask(testDb, 'Task 1', 'archived');
400
+ const task2 = createTestTask(testDb, 'Task 2');
401
+ // Act & Assert
402
+ assert.throws(() => {
403
+ addDependencyTest(testDb, {
404
+ blocker_task_id: task1,
405
+ blocked_task_id: task2
406
+ });
407
+ }, {
408
+ message: /Cannot add dependency: Task #\d+ is archived/
409
+ });
410
+ });
411
+ it('should reject dependency with archived blocked', () => {
412
+ // Arrange
413
+ const task1 = createTestTask(testDb, 'Task 1');
414
+ const task2 = createTestTask(testDb, 'Task 2', 'archived');
415
+ // Act & Assert
416
+ assert.throws(() => {
417
+ addDependencyTest(testDb, {
418
+ blocker_task_id: task1,
419
+ blocked_task_id: task2
420
+ });
421
+ }, {
422
+ message: /Cannot add dependency: Task #\d+ is archived/
423
+ });
424
+ });
425
+ });
426
+ // ============================================================================
427
+ // Task #67: Unit Tests for remove_dependency and get_dependencies
428
+ // ============================================================================
429
+ describe('remove_dependency', () => {
430
+ it('should remove existing dependency', () => {
431
+ // Arrange
432
+ const task1 = createTestTask(testDb, 'Task 1');
433
+ const task2 = createTestTask(testDb, 'Task 2');
434
+ addDependencyTest(testDb, {
435
+ blocker_task_id: task1,
436
+ blocked_task_id: task2
437
+ });
438
+ // Verify it exists
439
+ const beforeDeps = getDependenciesTest(testDb, { task_id: task2 });
440
+ assert.strictEqual(beforeDeps.blockers.length, 1);
441
+ // Act
442
+ const result = removeDependencyTest(testDb, {
443
+ blocker_task_id: task1,
444
+ blocked_task_id: task2
445
+ });
446
+ // Assert
447
+ assert.strictEqual(result.success, true);
448
+ assert.match(result.message, /Dependency removed/);
449
+ // Verify it no longer exists
450
+ const afterDeps = getDependenciesTest(testDb, { task_id: task2 });
451
+ assert.strictEqual(afterDeps.blockers.length, 0);
452
+ });
453
+ it('should succeed silently when removing non-existent dependency (idempotent)', () => {
454
+ // Arrange
455
+ const task1 = createTestTask(testDb, 'Task 1');
456
+ const task2 = createTestTask(testDb, 'Task 2');
457
+ // Act - Remove dependency that doesn't exist
458
+ const result = removeDependencyTest(testDb, {
459
+ blocker_task_id: task1,
460
+ blocked_task_id: task2
461
+ });
462
+ // Assert
463
+ assert.strictEqual(result.success, true);
464
+ assert.match(result.message, /Dependency removed/);
465
+ });
466
+ });
467
+ describe('get_dependencies - Metadata Only', () => {
468
+ it('should return blockers and blocking (metadata-only)', () => {
469
+ // Arrange
470
+ const taskA = createTestTask(testDb, 'Task A');
471
+ const taskB = createTestTask(testDb, 'Task B');
472
+ const taskC = createTestTask(testDb, 'Task C');
473
+ // A blocks B, B blocks C
474
+ addDependencyTest(testDb, {
475
+ blocker_task_id: taskA,
476
+ blocked_task_id: taskB
477
+ });
478
+ addDependencyTest(testDb, {
479
+ blocker_task_id: taskB,
480
+ blocked_task_id: taskC
481
+ });
482
+ // Act - Get dependencies for B
483
+ const result = getDependenciesTest(testDb, { task_id: taskB });
484
+ // Assert
485
+ assert.strictEqual(result.task_id, taskB);
486
+ // B is blocked by A
487
+ assert.strictEqual(result.blockers.length, 1);
488
+ assert.strictEqual(result.blockers[0].id, taskA);
489
+ assert.strictEqual(result.blockers[0].title, 'Task A');
490
+ // B blocks C
491
+ assert.strictEqual(result.blocking.length, 1);
492
+ assert.strictEqual(result.blocking[0].id, taskC);
493
+ assert.strictEqual(result.blocking[0].title, 'Task C');
494
+ // Verify metadata-only (no description field)
495
+ assert.strictEqual(result.blockers[0].description, undefined);
496
+ assert.strictEqual(result.blocking[0].description, undefined);
497
+ });
498
+ it('should return empty arrays for task with no dependencies', () => {
499
+ // Arrange
500
+ const task1 = createTestTask(testDb, 'Task 1');
501
+ // Act
502
+ const result = getDependenciesTest(testDb, { task_id: task1 });
503
+ // Assert
504
+ assert.strictEqual(result.task_id, task1);
505
+ assert.strictEqual(result.blockers.length, 0);
506
+ assert.strictEqual(result.blocking.length, 0);
507
+ });
508
+ });
509
+ describe('get_dependencies - With Details', () => {
510
+ it('should return full details when include_details=true', () => {
511
+ // Arrange
512
+ const task1 = createTestTask(testDb, 'Task 1');
513
+ const task2 = createTestTask(testDb, 'Task 2');
514
+ // Add description to task1
515
+ testDb.prepare(`
516
+ INSERT INTO t_task_details (task_id, description)
517
+ VALUES (?, ?)
518
+ `).run(task1, 'This is task 1 description');
519
+ // Add dependency
520
+ addDependencyTest(testDb, {
521
+ blocker_task_id: task1,
522
+ blocked_task_id: task2
523
+ });
524
+ // Act
525
+ const result = getDependenciesTest(testDb, {
526
+ task_id: task2,
527
+ include_details: true
528
+ });
529
+ // Assert
530
+ assert.strictEqual(result.blockers.length, 1);
531
+ assert.strictEqual(result.blockers[0].id, task1);
532
+ assert.strictEqual(result.blockers[0].description, 'This is task 1 description');
533
+ });
534
+ it('should not include description by default', () => {
535
+ // Arrange
536
+ const task1 = createTestTask(testDb, 'Task 1');
537
+ const task2 = createTestTask(testDb, 'Task 2');
538
+ // Add description
539
+ testDb.prepare(`
540
+ INSERT INTO t_task_details (task_id, description)
541
+ VALUES (?, ?)
542
+ `).run(task1, 'This is task 1 description');
543
+ addDependencyTest(testDb, {
544
+ blocker_task_id: task1,
545
+ blocked_task_id: task2
546
+ });
547
+ // Act
548
+ const result = getDependenciesTest(testDb, { task_id: task2 });
549
+ // Assert
550
+ assert.strictEqual(result.blockers[0].description, undefined);
551
+ });
552
+ });
553
+ describe('get_dependencies - Error Handling', () => {
554
+ it('should throw error for non-existent task', () => {
555
+ // Act & Assert
556
+ assert.throws(() => {
557
+ getDependenciesTest(testDb, { task_id: 999 });
558
+ }, {
559
+ message: /Task with id 999 not found/
560
+ });
561
+ });
562
+ });
563
+ describe('CASCADE Deletion', () => {
564
+ it('should cascade delete dependencies when task deleted', () => {
565
+ // Arrange
566
+ const taskA = createTestTask(testDb, 'Task A');
567
+ const taskB = createTestTask(testDb, 'Task B');
568
+ // Add A blocks B
569
+ addDependencyTest(testDb, {
570
+ blocker_task_id: taskA,
571
+ blocked_task_id: taskB
572
+ });
573
+ // Verify dependency exists
574
+ const beforeDeps = getDependenciesTest(testDb, { task_id: taskB });
575
+ assert.strictEqual(beforeDeps.blockers.length, 1);
576
+ // Act - Delete task A
577
+ testDb.prepare('DELETE FROM t_tasks WHERE id = ?').run(taskA);
578
+ // Assert - Dependency should be deleted
579
+ const depsInDb = testDb.prepare(`
580
+ SELECT * FROM t_task_dependencies
581
+ WHERE blocker_task_id = ? OR blocked_task_id = ?
582
+ `).all(taskA, taskA);
583
+ assert.strictEqual(depsInDb.length, 0);
584
+ // Verify B still exists
585
+ const taskBExists = testDb.prepare('SELECT id FROM t_tasks WHERE id = ?').get(taskB);
586
+ assert.ok(taskBExists);
587
+ // Verify B has no dependencies anymore
588
+ const afterDeps = getDependenciesTest(testDb, { task_id: taskB });
589
+ assert.strictEqual(afterDeps.blockers.length, 0);
590
+ });
591
+ it('should cascade delete when blocked task is deleted', () => {
592
+ // Arrange
593
+ const taskA = createTestTask(testDb, 'Task A');
594
+ const taskB = createTestTask(testDb, 'Task B');
595
+ addDependencyTest(testDb, {
596
+ blocker_task_id: taskA,
597
+ blocked_task_id: taskB
598
+ });
599
+ // Act - Delete task B
600
+ testDb.prepare('DELETE FROM t_tasks WHERE id = ?').run(taskB);
601
+ // Assert - Dependency should be deleted
602
+ const depsInDb = testDb.prepare(`
603
+ SELECT * FROM t_task_dependencies
604
+ WHERE blocked_task_id = ?
605
+ `).all(taskB);
606
+ assert.strictEqual(depsInDb.length, 0);
607
+ // Verify A still exists with no dependencies
608
+ const afterDeps = getDependenciesTest(testDb, { task_id: taskA });
609
+ assert.strictEqual(afterDeps.blocking.length, 0);
610
+ });
611
+ });
612
+ console.log('✓ All task dependency tests defined');
613
+ //# sourceMappingURL=tasks.dependencies.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.dependencies.test.js","sourceRoot":"","sources":["../../src/tests/tasks.dependencies.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EACL,gBAAgB,EAChB,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAGxB;;GAEG;AACH,IAAI,MAAoB,CAAC;AAEzB;;GAEG;AACH,SAAS,kBAAkB;IACzB,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;IACpC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,oBAAoB;IACpB,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAErB,kCAAkC;IAClC,MAAM,eAAe,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,qBAAqB,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,EAAgB,EAAE,KAAa,EAAE,SAAiB,MAAM;IAC9E,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,WAAW,GAA2B;QAC1C,MAAM,EAAE,CAAC;QACT,aAAa,EAAE,CAAC;QAChB,gBAAgB,EAAE,CAAC;QACnB,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,CAAC;QACT,UAAU,EAAE,CAAC;KACd,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGzB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,MAAM,CAAC,eAAyB,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,EAAgB,EAAE,MAG5C;IACC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE;QAC1B,MAAM,oBAAoB,GAAG,CAAC,CAAC;QAE/B,qCAAqC;QACrC,IAAI,MAAM,CAAC,eAAe,KAAK,MAAM,CAAC,eAAe,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,4DAA4D;QAC5D,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAkD,CAAC;QAC9J,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAkD,CAAC;QAE9J,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,CAAC,eAAe,YAAY,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,CAAC,eAAe,YAAY,CAAC,CAAC;QACvE,CAAC;QAED,yCAAyC;QACzC,IAAI,WAAW,CAAC,SAAS,KAAK,oBAAoB,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,eAAe,cAAc,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,WAAW,CAAC,SAAS,KAAK,oBAAoB,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,eAAe,cAAc,CAAC,CAAC;QACxF,CAAC;QAED,0DAA0D;QAC1D,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGhC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;QAEvD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,eAAe,yBAAyB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QAClI,CAAC;QAED,mFAAmF;QACnF,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;KAgB7B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAoC,CAAC;QAE1F,IAAI,UAAU,EAAE,CAAC;YACf,qCAAqC;YACrC,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;OAgBlC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAiC,CAAC;YAEvF,MAAM,SAAS,GAAG,eAAe,EAAE,IAAI,IAAI,IAAI,MAAM,CAAC,eAAe,aAAa,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3G,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,eAAe,OAAO,SAAS,OAAO,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QAChI,CAAC;QAED,6CAA6C;QAC7C,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,2BAA2B,MAAM,CAAC,eAAe,iBAAiB,MAAM,CAAC,eAAe,EAAE;SACpG,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,EAAgB,EAAE,MAG/C;IACC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAG7B,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAE/D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,6BAA6B,MAAM,CAAC,eAAe,2BAA2B,MAAM,CAAC,eAAe,EAAE;KAChH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,EAAgB,EAAE,MAG9C;IACC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC;IAEvD,uBAAuB;IACvB,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC;IAC9D,CAAC;IAED,4CAA4C;IAC5C,IAAI,YAAoB,CAAC;IACzB,IAAI,cAAc,EAAE,CAAC;QACnB,YAAY,GAAG;;;;;;;;;KASd,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,YAAY,GAAG;;;;;KAKd,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,MAAM,aAAa,GAAG;aACX,YAAY;;;;;MAKnB,cAAc,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE;;GAE3E,CAAC;IAEF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE/D,wCAAwC;IACxC,MAAM,aAAa,GAAG;aACX,YAAY;;;;;MAKnB,cAAc,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE;;GAE3E,CAAC;IAEF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE/D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ;QACR,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,UAAU,CAAC,GAAG,EAAE;IACd,sCAAsC;IACtC,MAAM,GAAG,kBAAkB,EAAE,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,qDAAqD;AACrD,+EAA+E;AAE/E,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,MAAM;QACN,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE;YACvC,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QAEjD,qBAAqB;QACrB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;;KAG3B,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAErB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,MAAM;QACN,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAE/D,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,eAAe;QACf,MAAM,CAAC,MAAM,CACX,GAAG,EAAE;YACH,iBAAiB,CAAC,MAAM,EAAE;gBACxB,eAAe,EAAE,KAAK;gBACtB,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;QACL,CAAC,EACD;YACE,OAAO,EAAE,6BAA6B;SACvC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,iBAAiB;QACjB,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,CAAC,MAAM,CACX,GAAG,EAAE;YACH,iBAAiB,CAAC,MAAM,EAAE;gBACxB,eAAe,EAAE,KAAK;gBACtB,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;QACL,CAAC,EACD;YACE,OAAO,EAAE,8BAA8B;SACxC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,iBAAiB;QACjB,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,iBAAiB;QACjB,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,4DAA4D;QAC5D,MAAM,CAAC,MAAM,CACX,GAAG,EAAE;YACH,iBAAiB,CAAC,MAAM,EAAE;gBACxB,eAAe,EAAE,KAAK;gBACtB,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;QACL,CAAC,EACD;YACE,OAAO,EAAE,8BAA8B;SACxC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,0BAA0B;QAC1B,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,kCAAkC;QAClC,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,iBAAiB,CAAC,MAAM,EAAE;gBACxB,eAAe,EAAE,KAAK;gBACtB,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,CAAC;QAED,2CAA2C;QAC3C,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,8BAA8B,CAAC,CAAC;QAC3D,oGAAoG;QACpG,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,MAAM,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,uCAAuC;IACnG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC/D,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,eAAe;QACf,MAAM,CAAC,MAAM,CACX,GAAG,EAAE;YACH,iBAAiB,CAAC,MAAM,EAAE;gBACxB,eAAe,EAAE,GAAG;gBACpB,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;QACL,CAAC,EACD;YACE,OAAO,EAAE,6BAA6B;SACvC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,eAAe;QACf,MAAM,CAAC,MAAM,CACX,GAAG,EAAE;YACH,iBAAiB,CAAC,MAAM,EAAE;gBACxB,eAAe,EAAE,KAAK;gBACtB,eAAe,EAAE,GAAG;aACrB,CAAC,CAAC;QACL,CAAC,EACD;YACE,OAAO,EAAE,6BAA6B;SACvC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,eAAe;QACf,MAAM,CAAC,MAAM,CACX,GAAG,EAAE;YACH,iBAAiB,CAAC,MAAM,EAAE;gBACxB,eAAe,EAAE,KAAK;gBACtB,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;QACL,CAAC,EACD;YACE,OAAO,EAAE,8CAA8C;SACxD,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE3D,eAAe;QACf,MAAM,CAAC,MAAM,CACX,GAAG,EAAE;YACH,iBAAiB,CAAC,MAAM,EAAE;gBACxB,eAAe,EAAE,KAAK;gBACtB,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;QACL,CAAC,EACD;YACE,OAAO,EAAE,8CAA8C;SACxD,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,kEAAkE;AAClE,+EAA+E;AAE/E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAElD,MAAM;QACN,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE;YAC1C,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAEnD,6BAA6B;QAC7B,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,6CAA6C;QAC7C,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE;YAC1C,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,yBAAyB;QACzB,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,+BAA+B;QAC/B,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAE/D,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAE1C,oBAAoB;QACpB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEvD,aAAa;QACb,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEvD,8CAA8C;QAC9C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,MAAM;QACN,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAE/D,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,2BAA2B;QAC3B,MAAM,CAAC,OAAO,CAAC;;;KAGd,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;QAE5C,iBAAiB;QACjB,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,MAAM;QACN,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE;YACzC,OAAO,EAAE,KAAK;YACd,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QAEH,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,kBAAkB;QAClB,MAAM,CAAC,OAAO,CAAC;;;KAGd,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;QAE5C,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,MAAM;QACN,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAE/D,SAAS;QACT,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,eAAe;QACf,MAAM,CAAC,MAAM,CACX,GAAG,EAAE;YACH,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAChD,CAAC,EACD;YACE,OAAO,EAAE,4BAA4B;SACtC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,iBAAiB;QACjB,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAElD,sBAAsB;QACtB,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE9D,wCAAwC;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;;;KAG/B,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAErB,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAEvC,wBAAwB;QACxB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrF,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAEvB,uCAAuC;QACvC,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,UAAU;QACV,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE/C,iBAAiB,CAAC,MAAM,EAAE;YACxB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE9D,wCAAwC;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;;;KAG/B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEd,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAEvC,6CAA6C;QAC7C,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC"}
@@ -24,11 +24,14 @@ export declare function getContext(params?: GetContextParams): GetContextRespons
24
24
  /**
25
25
  * Get a specific decision by key
26
26
  * Returns full metadata including tags, layer, scopes, version
27
+ * Optionally includes decision context (v3.2.2)
27
28
  *
28
- * @param params - Decision key
29
+ * @param params - Decision key and optional include_context flag
29
30
  * @returns Decision details or not found
30
31
  */
31
- export declare function getDecision(params: GetDecisionParams): GetDecisionResponse;
32
+ export declare function getDecision(params: GetDecisionParams & {
33
+ include_context?: boolean;
34
+ }): GetDecisionResponse;
32
35
  /**
33
36
  * Search for t_decisions by m_tags with AND/OR logic
34
37
  * Provides flexible tag-based filtering with status and layer support
@@ -159,4 +162,20 @@ export declare function listTemplates(params?: ListTemplatesParams): ListTemplat
159
162
  * @returns Response with success status
160
163
  */
161
164
  export declare function hardDeleteDecision(params: HardDeleteDecisionParams): HardDeleteDecisionResponse;
165
+ /**
166
+ * Add decision context action
167
+ * Adds rich context (rationale, alternatives, tradeoffs) to a decision
168
+ *
169
+ * @param params - Context parameters
170
+ * @returns Response with success status
171
+ */
172
+ export declare function addDecisionContextAction(params: any): any;
173
+ /**
174
+ * List decision contexts action
175
+ * Query decision contexts with optional filters
176
+ *
177
+ * @param params - Filter parameters
178
+ * @returns Array of decision contexts
179
+ */
180
+ export declare function listDecisionContextsAction(params: any): any;
162
181
  //# sourceMappingURL=context.d.ts.map