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.
- package/CHANGELOG.md +100 -0
- package/README.md +12 -2
- package/assets/schema.sql +28 -1
- package/dist/database.d.ts +65 -0
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +190 -0
- package/dist/database.js.map +1 -1
- package/dist/index.js +36 -6
- package/dist/index.js.map +1 -1
- package/dist/migrations/add-decision-context.d.ts +28 -0
- package/dist/migrations/add-decision-context.d.ts.map +1 -0
- package/dist/migrations/add-decision-context.js +125 -0
- package/dist/migrations/add-decision-context.js.map +1 -0
- package/dist/migrations/add-task-dependencies.d.ts +26 -0
- package/dist/migrations/add-task-dependencies.d.ts.map +1 -0
- package/dist/migrations/add-task-dependencies.js +94 -0
- package/dist/migrations/add-task-dependencies.js.map +1 -0
- package/dist/migrations/index.d.ts +3 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +32 -2
- package/dist/migrations/index.js.map +1 -1
- package/dist/schema.js +2 -2
- package/dist/schema.js.map +1 -1
- package/dist/tests/migrations/test-v3.2-migration.d.ts +6 -0
- package/dist/tests/migrations/test-v3.2-migration.d.ts.map +1 -0
- package/dist/tests/migrations/test-v3.2-migration.js +191 -0
- package/dist/tests/migrations/test-v3.2-migration.js.map +1 -0
- package/dist/tests/tasks.dependencies.test.d.ts +7 -0
- package/dist/tests/tasks.dependencies.test.d.ts.map +1 -0
- package/dist/tests/tasks.dependencies.test.js +613 -0
- package/dist/tests/tasks.dependencies.test.js.map +1 -0
- package/dist/tools/context.d.ts +21 -2
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +110 -3
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/tasks.d.ts +23 -0
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +298 -8
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +44 -21
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/AI_AGENT_GUIDE.md +25 -3
- package/docs/DECISION_CONTEXT.md +474 -0
- package/docs/TASK_ACTIONS.md +311 -10
- package/docs/TASK_DEPENDENCIES.md +748 -0
- package/docs/TASK_LINKING.md +188 -8
- package/docs/WORKFLOWS.md +25 -3
- 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":"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"}
|
package/dist/tools/context.d.ts
CHANGED
|
@@ -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
|
|
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
|