sqlew 3.2.5 → 3.5.3
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 +815 -13
- package/README.md +53 -2
- package/assets/schema.sql +6 -1
- package/dist/config/loader.d.ts +46 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +151 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +77 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +28 -0
- package/dist/config/types.js.map +1 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -1
- package/dist/database.d.ts +1 -1
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +77 -10
- package/dist/database.js.map +1 -1
- package/dist/index.js +21 -3
- package/dist/index.js.map +1 -1
- package/dist/migrations/add-v3.5.0-pruned-files.d.ts +26 -0
- package/dist/migrations/add-v3.5.0-pruned-files.d.ts.map +1 -0
- package/dist/migrations/add-v3.5.0-pruned-files.js +107 -0
- package/dist/migrations/add-v3.5.0-pruned-files.js.map +1 -0
- package/dist/migrations/index.d.ts +2 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +16 -1
- package/dist/migrations/index.js.map +1 -1
- package/dist/tests/git-aware-completion.test.d.ts +6 -0
- package/dist/tests/git-aware-completion.test.d.ts.map +1 -0
- package/dist/tests/git-aware-completion.test.js +141 -0
- package/dist/tests/git-aware-completion.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.js +250 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-partial.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-partial.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-partial.test.js +274 -0
- package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.js +232 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-safety.test.d.ts +12 -0
- package/dist/tests/tasks.auto-pruning-safety.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-safety.test.js +196 -0
- package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -0
- package/dist/tests/tasks.link-file-backward-compat.test.d.ts +6 -0
- package/dist/tests/tasks.link-file-backward-compat.test.d.ts.map +1 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js +235 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -0
- package/dist/tests/tasks.watch-files-action.test.d.ts +6 -0
- package/dist/tests/tasks.watch-files-action.test.d.ts.map +1 -0
- package/dist/tests/tasks.watch-files-action.test.js +351 -0
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -0
- package/dist/tests/tasks.watch-files-parameter.test.d.ts +6 -0
- package/dist/tests/tasks.watch-files-parameter.test.d.ts.map +1 -0
- package/dist/tests/tasks.watch-files-parameter.test.js +249 -0
- package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -0
- package/dist/tests/two-step-git-completion.test.d.ts +6 -0
- package/dist/tests/two-step-git-completion.test.d.ts.map +1 -0
- package/dist/tests/two-step-git-completion.test.js +283 -0
- package/dist/tests/two-step-git-completion.test.js.map +1 -0
- package/dist/tests/vcs-staging.test.d.ts +6 -0
- package/dist/tests/vcs-staging.test.d.ts.map +1 -0
- package/dist/tests/vcs-staging.test.js +137 -0
- package/dist/tests/vcs-staging.test.js.map +1 -0
- package/dist/tools/config.d.ts +4 -2
- package/dist/tools/config.d.ts.map +1 -1
- package/dist/tools/config.js +13 -11
- package/dist/tools/config.js.map +1 -1
- package/dist/tools/constraints.d.ts +7 -4
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +19 -16
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts +33 -17
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +84 -68
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts +9 -5
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +19 -15
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/messaging.d.ts +9 -5
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +20 -16
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/tasks.d.ts +40 -12
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +475 -87
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +11 -6
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +56 -44
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/file-pruning.d.ts +69 -0
- package/dist/utils/file-pruning.d.ts.map +1 -0
- package/dist/utils/file-pruning.js +185 -0
- package/dist/utils/file-pruning.js.map +1 -0
- package/dist/utils/quality-checks.d.ts +60 -0
- package/dist/utils/quality-checks.d.ts.map +1 -0
- package/dist/utils/quality-checks.js +228 -0
- package/dist/utils/quality-checks.js.map +1 -0
- package/dist/utils/retention.d.ts +8 -0
- package/dist/utils/retention.d.ts.map +1 -1
- package/dist/utils/retention.js +12 -0
- package/dist/utils/retention.js.map +1 -1
- package/dist/utils/task-stale-detection.d.ts +69 -1
- package/dist/utils/task-stale-detection.d.ts.map +1 -1
- package/dist/utils/task-stale-detection.js +494 -17
- package/dist/utils/task-stale-detection.js.map +1 -1
- package/dist/utils/vcs-adapter.d.ts +68 -0
- package/dist/utils/vcs-adapter.d.ts.map +1 -0
- package/dist/utils/vcs-adapter.js +187 -0
- package/dist/utils/vcs-adapter.js.map +1 -0
- package/dist/watcher/file-watcher.d.ts +54 -4
- package/dist/watcher/file-watcher.d.ts.map +1 -1
- package/dist/watcher/file-watcher.js +312 -30
- package/dist/watcher/file-watcher.js.map +1 -1
- package/dist/watcher/gitignore-parser.d.ts +70 -0
- package/dist/watcher/gitignore-parser.d.ts.map +1 -0
- package/dist/watcher/gitignore-parser.js +191 -0
- package/dist/watcher/gitignore-parser.js.map +1 -0
- package/dist/watcher/index.d.ts +1 -0
- package/dist/watcher/index.d.ts.map +1 -1
- package/dist/watcher/index.js +1 -0
- package/dist/watcher/index.js.map +1 -1
- package/docs/AI_AGENT_GUIDE.md +1 -1
- package/docs/ARCHITECTURE.md +12 -0
- package/docs/AUTO_FILE_TRACKING.md +486 -82
- package/docs/CONFIGURATION.md +908 -0
- package/docs/GIT_AWARE_AUTO_COMPLETE.md +645 -0
- package/docs/MIGRATION_v3.3.md +602 -0
- package/docs/SHARED_CONCEPTS.md +2 -1
- package/docs/TASK_ACTIONS.md +12 -0
- package/docs/TASK_OVERVIEW.md +124 -23
- package/docs/TASK_PRUNING.md +589 -0
- package/docs/TASK_SYSTEM.md +83 -13
- package/docs/TOOL_REFERENCE.md +94 -6
- package/package.json +8 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-aware-completion.test.js","sourceRoot":"","sources":["../../src/tests/git-aware-completion.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for Decision Linking to Pruned Files (v3.5.0 Auto-Pruning)
|
|
3
|
+
* Tests the workflow of linking decisions to pruned files for WHY reasoning (project archaeology)
|
|
4
|
+
*/
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=tasks.auto-pruning-decision-link.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.auto-pruning-decision-link.test.d.ts","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-decision-link.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for Decision Linking to Pruned Files (v3.5.0 Auto-Pruning)
|
|
3
|
+
* Tests the workflow of linking decisions to pruned files for WHY reasoning (project archaeology)
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, beforeEach } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
import { initializeSchema } from '../schema.js';
|
|
9
|
+
import { runAllMigrations } from '../migrations/index.js';
|
|
10
|
+
import { getOrCreateAgent } from '../database.js';
|
|
11
|
+
import { setDecision } from '../tools/context.js';
|
|
12
|
+
import { getPrunedFiles, linkPrunedFile } from '../tools/tasks.js';
|
|
13
|
+
/**
|
|
14
|
+
* Test database instance
|
|
15
|
+
*/
|
|
16
|
+
let testDb;
|
|
17
|
+
/**
|
|
18
|
+
* Create an in-memory test database
|
|
19
|
+
*/
|
|
20
|
+
function createTestDatabase() {
|
|
21
|
+
const db = new Database(':memory:');
|
|
22
|
+
db.pragma('foreign_keys = ON');
|
|
23
|
+
initializeSchema(db);
|
|
24
|
+
runAllMigrations(db);
|
|
25
|
+
return db;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Helper: Create a test task
|
|
29
|
+
*/
|
|
30
|
+
function createTestTask(db, title) {
|
|
31
|
+
const agentId = getOrCreateAgent(db, 'test-agent');
|
|
32
|
+
const statusId = 2; // in_progress
|
|
33
|
+
const result = db.prepare(`
|
|
34
|
+
INSERT INTO t_tasks (title, status_id, priority, created_by_agent_id, assigned_agent_id)
|
|
35
|
+
VALUES (?, ?, 2, ?, ?)
|
|
36
|
+
`).run(title, statusId, agentId, agentId);
|
|
37
|
+
return result.lastInsertRowid;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Helper: Create a pruned file record
|
|
41
|
+
*/
|
|
42
|
+
function createPrunedFileRecord(db, taskId, filePath) {
|
|
43
|
+
const result = db.prepare(`
|
|
44
|
+
INSERT INTO t_task_pruned_files (task_id, file_path, pruned_ts)
|
|
45
|
+
VALUES (?, ?, unixepoch())
|
|
46
|
+
`).run(taskId, filePath);
|
|
47
|
+
return result.lastInsertRowid;
|
|
48
|
+
}
|
|
49
|
+
describe('Auto-pruning: Decision linking workflow', () => {
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
testDb = createTestDatabase();
|
|
52
|
+
});
|
|
53
|
+
it('should link decisions to pruned files for WHY reasoning', () => {
|
|
54
|
+
// 1. Setup: Create task with pruned file
|
|
55
|
+
const taskId = createTestTask(testDb, 'Implement OAuth authentication');
|
|
56
|
+
const prunedFileId = createPrunedFileRecord(testDb, taskId, 'src/auth/oauth-handler.ts');
|
|
57
|
+
// 2. Create decision explaining why file wasn't created
|
|
58
|
+
const decisionResult = setDecision({
|
|
59
|
+
key: 'oauth-not-implemented',
|
|
60
|
+
value: 'Decided to use API key auth instead of OAuth for simplicity',
|
|
61
|
+
tags: ['architecture', 'authentication'],
|
|
62
|
+
status: 'active'
|
|
63
|
+
}, testDb);
|
|
64
|
+
assert.ok(decisionResult.success, 'Decision creation should succeed');
|
|
65
|
+
assert.strictEqual(decisionResult.key, 'oauth-not-implemented');
|
|
66
|
+
// 3. Link decision to pruned file
|
|
67
|
+
const linkResult = linkPrunedFile({
|
|
68
|
+
pruned_file_id: prunedFileId,
|
|
69
|
+
decision_key: 'oauth-not-implemented'
|
|
70
|
+
}, testDb);
|
|
71
|
+
assert.ok(linkResult.success, 'Decision linking should succeed');
|
|
72
|
+
assert.strictEqual(linkResult.pruned_file_id, prunedFileId);
|
|
73
|
+
assert.strictEqual(linkResult.decision_key, 'oauth-not-implemented');
|
|
74
|
+
assert.strictEqual(linkResult.task_id, taskId);
|
|
75
|
+
assert.strictEqual(linkResult.file_path, 'src/auth/oauth-handler.ts');
|
|
76
|
+
// 4. Verify link in database directly
|
|
77
|
+
const linkedDecisionId = testDb.prepare(`
|
|
78
|
+
SELECT linked_decision_key_id FROM t_task_pruned_files WHERE id = ?
|
|
79
|
+
`).get(prunedFileId);
|
|
80
|
+
assert.ok(linkedDecisionId, 'Pruned file record should exist');
|
|
81
|
+
assert.ok(linkedDecisionId.linked_decision_key_id !== null, 'Decision key ID should be linked');
|
|
82
|
+
// 5. Query pruned files - decision key should be returned
|
|
83
|
+
const getPrunedResult = getPrunedFiles({
|
|
84
|
+
task_id: taskId,
|
|
85
|
+
limit: 100
|
|
86
|
+
}, testDb);
|
|
87
|
+
assert.ok(getPrunedResult.success, 'get_pruned_files should succeed');
|
|
88
|
+
assert.strictEqual(getPrunedResult.task_id, taskId);
|
|
89
|
+
assert.strictEqual(getPrunedResult.count, 1, 'Should return 1 pruned file');
|
|
90
|
+
assert.strictEqual(getPrunedResult.pruned_files.length, 1, 'pruned_files array should have 1 item');
|
|
91
|
+
const prunedFile = getPrunedResult.pruned_files[0];
|
|
92
|
+
assert.strictEqual(prunedFile.id, prunedFileId, 'Pruned file ID should match');
|
|
93
|
+
assert.strictEqual(prunedFile.file_path, 'src/auth/oauth-handler.ts', 'File path should match');
|
|
94
|
+
assert.ok(prunedFile.pruned_at, 'Should have pruned_at timestamp');
|
|
95
|
+
assert.ok(prunedFile.linked_decision, 'Should have linked_decision key');
|
|
96
|
+
assert.strictEqual(prunedFile.linked_decision, 'oauth-not-implemented', 'Linked decision key should match');
|
|
97
|
+
});
|
|
98
|
+
it('should handle multiple pruned files with different decisions', () => {
|
|
99
|
+
const taskId = createTestTask(testDb, 'Feature implementation');
|
|
100
|
+
// Create pruned files
|
|
101
|
+
const prunedFileId1 = createPrunedFileRecord(testDb, taskId, 'src/oauth-handler.ts');
|
|
102
|
+
const prunedFileId2 = createPrunedFileRecord(testDb, taskId, 'src/ldap-connector.ts');
|
|
103
|
+
// Create decisions
|
|
104
|
+
setDecision({
|
|
105
|
+
key: 'no-oauth',
|
|
106
|
+
value: 'OAuth not needed for MVP',
|
|
107
|
+
status: 'active'
|
|
108
|
+
}, testDb);
|
|
109
|
+
setDecision({
|
|
110
|
+
key: 'no-ldap',
|
|
111
|
+
value: 'LDAP integration deferred to Phase 2',
|
|
112
|
+
status: 'active'
|
|
113
|
+
}, testDb);
|
|
114
|
+
// Link decisions
|
|
115
|
+
linkPrunedFile({
|
|
116
|
+
pruned_file_id: prunedFileId1,
|
|
117
|
+
decision_key: 'no-oauth'
|
|
118
|
+
}, testDb);
|
|
119
|
+
linkPrunedFile({
|
|
120
|
+
pruned_file_id: prunedFileId2,
|
|
121
|
+
decision_key: 'no-ldap'
|
|
122
|
+
}, testDb);
|
|
123
|
+
// Verify
|
|
124
|
+
const getPrunedResult = getPrunedFiles({
|
|
125
|
+
task_id: taskId
|
|
126
|
+
}, testDb);
|
|
127
|
+
assert.strictEqual(getPrunedResult.count, 2, 'Should have 2 pruned files');
|
|
128
|
+
const file1 = getPrunedResult.pruned_files.find((f) => f.file_path === 'src/oauth-handler.ts');
|
|
129
|
+
const file2 = getPrunedResult.pruned_files.find((f) => f.file_path === 'src/ldap-connector.ts');
|
|
130
|
+
assert.ok(file1, 'Should find oauth-handler.ts');
|
|
131
|
+
assert.ok(file2, 'Should find ldap-connector.ts');
|
|
132
|
+
assert.strictEqual(file1?.linked_decision, 'no-oauth');
|
|
133
|
+
assert.strictEqual(file2?.linked_decision, 'no-ldap');
|
|
134
|
+
});
|
|
135
|
+
it('should handle pruned files without linked decisions', () => {
|
|
136
|
+
const taskId = createTestTask(testDb, 'Task with unlinked pruned files');
|
|
137
|
+
createPrunedFileRecord(testDb, taskId, 'src/temp-file.ts');
|
|
138
|
+
const getPrunedResult = getPrunedFiles({
|
|
139
|
+
task_id: taskId
|
|
140
|
+
}, testDb);
|
|
141
|
+
assert.ok(getPrunedResult.success);
|
|
142
|
+
assert.strictEqual(getPrunedResult.count, 1);
|
|
143
|
+
const prunedFile = getPrunedResult.pruned_files[0];
|
|
144
|
+
assert.strictEqual(prunedFile.linked_decision, null, 'Unlinked file should have null decision');
|
|
145
|
+
});
|
|
146
|
+
it('should handle linking to non-existent decision gracefully', () => {
|
|
147
|
+
const taskId = createTestTask(testDb, 'Task for error test');
|
|
148
|
+
const prunedFileId = createPrunedFileRecord(testDb, taskId, 'src/test.ts');
|
|
149
|
+
// Attempt to link non-existent decision
|
|
150
|
+
assert.throws(() => {
|
|
151
|
+
linkPrunedFile({
|
|
152
|
+
pruned_file_id: prunedFileId,
|
|
153
|
+
decision_key: 'does-not-exist'
|
|
154
|
+
}, testDb);
|
|
155
|
+
}, /Decision not found: does-not-exist/, 'Should throw error for non-existent decision');
|
|
156
|
+
});
|
|
157
|
+
it('should handle linking to non-existent pruned file gracefully', () => {
|
|
158
|
+
// Create decision
|
|
159
|
+
setDecision({
|
|
160
|
+
key: 'test-decision',
|
|
161
|
+
value: 'Test decision value',
|
|
162
|
+
status: 'active'
|
|
163
|
+
}, testDb);
|
|
164
|
+
// Attempt to link non-existent pruned file
|
|
165
|
+
assert.throws(() => {
|
|
166
|
+
linkPrunedFile({
|
|
167
|
+
pruned_file_id: 99999,
|
|
168
|
+
decision_key: 'test-decision'
|
|
169
|
+
}, testDb);
|
|
170
|
+
}, /Pruned file record not found: 99999/, 'Should throw error for non-existent pruned file');
|
|
171
|
+
});
|
|
172
|
+
it('should validate required parameters for linkPrunedFile', () => {
|
|
173
|
+
// Missing pruned_file_id
|
|
174
|
+
assert.throws(() => {
|
|
175
|
+
linkPrunedFile({
|
|
176
|
+
pruned_file_id: 0,
|
|
177
|
+
decision_key: 'test'
|
|
178
|
+
}, testDb);
|
|
179
|
+
}, /pruned_file_id is required and must be a number/, 'Should throw for invalid pruned_file_id');
|
|
180
|
+
// Missing decision_key
|
|
181
|
+
assert.throws(() => {
|
|
182
|
+
linkPrunedFile({
|
|
183
|
+
pruned_file_id: 1,
|
|
184
|
+
decision_key: ''
|
|
185
|
+
}, testDb);
|
|
186
|
+
}, /decision_key is required and must be a string/, 'Should throw for empty decision_key');
|
|
187
|
+
});
|
|
188
|
+
it('should validate required parameters for getPrunedFiles', () => {
|
|
189
|
+
// Missing task_id
|
|
190
|
+
assert.throws(() => {
|
|
191
|
+
getPrunedFiles({
|
|
192
|
+
task_id: 0
|
|
193
|
+
}, testDb);
|
|
194
|
+
}, /task_id is required and must be a number/, 'Should throw for invalid task_id');
|
|
195
|
+
// Non-existent task
|
|
196
|
+
assert.throws(() => {
|
|
197
|
+
getPrunedFiles({
|
|
198
|
+
task_id: 99999
|
|
199
|
+
}, testDb);
|
|
200
|
+
}, /Task not found: 99999/, 'Should throw for non-existent task');
|
|
201
|
+
});
|
|
202
|
+
it('should allow updating linked decision for a pruned file', () => {
|
|
203
|
+
const taskId = createTestTask(testDb, 'Task for update test');
|
|
204
|
+
const prunedFileId = createPrunedFileRecord(testDb, taskId, 'src/feature.ts');
|
|
205
|
+
// Create two decisions
|
|
206
|
+
setDecision({
|
|
207
|
+
key: 'decision-v1',
|
|
208
|
+
value: 'Initial decision',
|
|
209
|
+
status: 'active'
|
|
210
|
+
}, testDb);
|
|
211
|
+
setDecision({
|
|
212
|
+
key: 'decision-v2',
|
|
213
|
+
value: 'Updated decision',
|
|
214
|
+
status: 'active'
|
|
215
|
+
}, testDb);
|
|
216
|
+
// Link first decision
|
|
217
|
+
linkPrunedFile({
|
|
218
|
+
pruned_file_id: prunedFileId,
|
|
219
|
+
decision_key: 'decision-v1'
|
|
220
|
+
}, testDb);
|
|
221
|
+
// Verify first link
|
|
222
|
+
let getPrunedResult = getPrunedFiles({ task_id: taskId }, testDb);
|
|
223
|
+
assert.strictEqual(getPrunedResult.pruned_files[0].linked_decision, 'decision-v1');
|
|
224
|
+
// Update to second decision
|
|
225
|
+
linkPrunedFile({
|
|
226
|
+
pruned_file_id: prunedFileId,
|
|
227
|
+
decision_key: 'decision-v2'
|
|
228
|
+
}, testDb);
|
|
229
|
+
// Verify updated link
|
|
230
|
+
getPrunedResult = getPrunedFiles({ task_id: taskId }, testDb);
|
|
231
|
+
assert.strictEqual(getPrunedResult.pruned_files[0].linked_decision, 'decision-v2');
|
|
232
|
+
});
|
|
233
|
+
it('should respect limit parameter in getPrunedFiles', () => {
|
|
234
|
+
const taskId = createTestTask(testDb, 'Task with many pruned files');
|
|
235
|
+
// Create 5 pruned files
|
|
236
|
+
for (let i = 1; i <= 5; i++) {
|
|
237
|
+
createPrunedFileRecord(testDb, taskId, `src/file${i}.ts`);
|
|
238
|
+
}
|
|
239
|
+
// Query with limit
|
|
240
|
+
const getPrunedResult = getPrunedFiles({
|
|
241
|
+
task_id: taskId,
|
|
242
|
+
limit: 3
|
|
243
|
+
}, testDb);
|
|
244
|
+
assert.ok(getPrunedResult.success);
|
|
245
|
+
assert.strictEqual(getPrunedResult.count, 3, 'Should respect limit parameter');
|
|
246
|
+
assert.strictEqual(getPrunedResult.pruned_files.length, 3);
|
|
247
|
+
});
|
|
248
|
+
console.log('\n✅ All decision linking to pruned files tests passed!\n');
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=tasks.auto-pruning-decision-link.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.auto-pruning-decision-link.test.js","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-decision-link.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.auto-pruning-partial.test.d.ts","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-partial.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test for v3.5.0 Auto-Pruning feature
|
|
3
|
+
* Tests partial pruning scenario: keeps existing files, removes non-existent ones
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
6
|
+
import assert from 'node:assert/strict';
|
|
7
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
import { initializeSchema } from '../schema.js';
|
|
9
|
+
import { runAllMigrations } from '../migrations/index.js';
|
|
10
|
+
import { detectAndTransitionToReview } from '../utils/task-stale-detection.js';
|
|
11
|
+
import { getOrCreateAgent, getOrCreateFile } from '../database.js';
|
|
12
|
+
import fs from 'fs';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import os from 'os';
|
|
15
|
+
describe('Auto-pruning: Partial file existence', () => {
|
|
16
|
+
let db;
|
|
17
|
+
let tempDir;
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
db = new Database(':memory:');
|
|
20
|
+
db.pragma('foreign_keys = ON');
|
|
21
|
+
initializeSchema(db);
|
|
22
|
+
runAllMigrations(db);
|
|
23
|
+
// Skip the explicit migration result check
|
|
24
|
+
if (false) {
|
|
25
|
+
throw new Error(`Migration failed`);
|
|
26
|
+
}
|
|
27
|
+
// Create temp directory for test files
|
|
28
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sqlew-test-'));
|
|
29
|
+
});
|
|
30
|
+
afterEach(() => {
|
|
31
|
+
db.close();
|
|
32
|
+
// Cleanup temp directory
|
|
33
|
+
if (fs.existsSync(tempDir)) {
|
|
34
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
it('should prune non-existent files and keep existing ones', async () => {
|
|
38
|
+
// 1. Create test task
|
|
39
|
+
const taskId = createTestTask(db);
|
|
40
|
+
// 2. Create 4 watched files (2 exist, 2 don't)
|
|
41
|
+
const existingFile1 = path.join(tempDir, 'exists1.ts');
|
|
42
|
+
const existingFile2 = path.join(tempDir, 'exists2.ts');
|
|
43
|
+
const nonExistentFile1 = path.join(tempDir, 'missing1.ts');
|
|
44
|
+
const nonExistentFile2 = path.join(tempDir, 'missing2.ts');
|
|
45
|
+
fs.writeFileSync(existingFile1, '// test file 1');
|
|
46
|
+
fs.writeFileSync(existingFile2, '// test file 2');
|
|
47
|
+
// Don't create nonExistentFile1 and nonExistentFile2
|
|
48
|
+
// Add all 4 files to watch list
|
|
49
|
+
addWatchedFiles(db, taskId, [
|
|
50
|
+
existingFile1,
|
|
51
|
+
existingFile2,
|
|
52
|
+
nonExistentFile1,
|
|
53
|
+
nonExistentFile2,
|
|
54
|
+
]);
|
|
55
|
+
// Set task to in_progress status and update timestamp to be old enough
|
|
56
|
+
// for auto-transition (older than 15 minutes, which is the default review_idle_minutes)
|
|
57
|
+
const fifteenMinutesAgo = Math.floor(Date.now() / 1000) - (15 * 60 + 10);
|
|
58
|
+
db.prepare(`
|
|
59
|
+
UPDATE t_tasks
|
|
60
|
+
SET status_id = 2, updated_ts = ?
|
|
61
|
+
WHERE id = ?
|
|
62
|
+
`).run(fifteenMinutesAgo, taskId);
|
|
63
|
+
// 3. Trigger auto-pruning by detecting ready for review
|
|
64
|
+
// Change cwd to tempDir so file existence checks work correctly
|
|
65
|
+
const originalCwd = process.cwd();
|
|
66
|
+
try {
|
|
67
|
+
process.chdir(tempDir);
|
|
68
|
+
const transitioned = await detectAndTransitionToReview(db);
|
|
69
|
+
// Task should have transitioned
|
|
70
|
+
assert.equal(transitioned, 1, 'Should have transitioned 1 task');
|
|
71
|
+
// 4. Verify results
|
|
72
|
+
// Check watch list - should have only 2 files (the existing ones)
|
|
73
|
+
const watchedFiles = getWatchedFiles(db, taskId);
|
|
74
|
+
assert.equal(watchedFiles.length, 2, 'Should have 2 files in watch list');
|
|
75
|
+
assert.ok(watchedFiles.includes('exists1.ts'), 'Should keep existing file 1');
|
|
76
|
+
assert.ok(watchedFiles.includes('exists2.ts'), 'Should keep existing file 2');
|
|
77
|
+
// Check pruned files table - should have 2 records
|
|
78
|
+
const prunedFiles = db
|
|
79
|
+
.prepare(`
|
|
80
|
+
SELECT file_path FROM t_task_pruned_files WHERE task_id = ?
|
|
81
|
+
`)
|
|
82
|
+
.all(taskId);
|
|
83
|
+
assert.equal(prunedFiles.length, 2, 'Should have 2 pruned file records');
|
|
84
|
+
// Verify pruned files are the correct ones
|
|
85
|
+
const prunedPaths = prunedFiles.map((f) => f.file_path);
|
|
86
|
+
assert.ok(prunedPaths.includes('missing1.ts'), 'Should have pruned missing1.ts');
|
|
87
|
+
assert.ok(prunedPaths.includes('missing2.ts'), 'Should have pruned missing2.ts');
|
|
88
|
+
// Check task status transitioned to waiting_review
|
|
89
|
+
const task = db
|
|
90
|
+
.prepare('SELECT status_id FROM t_tasks WHERE id = ?')
|
|
91
|
+
.get(taskId);
|
|
92
|
+
assert.equal(task.status_id, 3, 'Task should be in waiting_review status (3)');
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
// Restore original cwd
|
|
96
|
+
process.chdir(originalCwd);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
it('should not transition if all files are non-existent', async () => {
|
|
100
|
+
// 1. Create test task
|
|
101
|
+
const taskId = createTestTask(db);
|
|
102
|
+
// 2. Create 2 watched files that don't exist
|
|
103
|
+
const nonExistentFile1 = path.join(tempDir, 'missing1.ts');
|
|
104
|
+
const nonExistentFile2 = path.join(tempDir, 'missing2.ts');
|
|
105
|
+
// Don't create these files
|
|
106
|
+
// Add files to watch list
|
|
107
|
+
addWatchedFiles(db, taskId, [nonExistentFile1, nonExistentFile2]);
|
|
108
|
+
// Set task to in_progress status and update timestamp to be old enough
|
|
109
|
+
const fifteenMinutesAgo = Math.floor(Date.now() / 1000) - (15 * 60 + 10);
|
|
110
|
+
db.prepare(`
|
|
111
|
+
UPDATE t_tasks
|
|
112
|
+
SET status_id = 2, updated_ts = ?
|
|
113
|
+
WHERE id = ?
|
|
114
|
+
`).run(fifteenMinutesAgo, taskId);
|
|
115
|
+
// 3. Trigger auto-pruning
|
|
116
|
+
const originalCwd = process.cwd();
|
|
117
|
+
try {
|
|
118
|
+
process.chdir(tempDir);
|
|
119
|
+
const transitioned = await detectAndTransitionToReview(db);
|
|
120
|
+
// Task should NOT have transitioned (safety check prevents it)
|
|
121
|
+
assert.equal(transitioned, 0, 'Should not have transitioned any tasks');
|
|
122
|
+
// 4. Verify task is still in in_progress
|
|
123
|
+
const task = db
|
|
124
|
+
.prepare('SELECT status_id FROM t_tasks WHERE id = ?')
|
|
125
|
+
.get(taskId);
|
|
126
|
+
assert.equal(task.status_id, 2, 'Task should still be in in_progress (2)');
|
|
127
|
+
// 5. Verify no pruning occurred (safety check blocked it)
|
|
128
|
+
const prunedFiles = db
|
|
129
|
+
.prepare('SELECT COUNT(*) as count FROM t_task_pruned_files WHERE task_id = ?')
|
|
130
|
+
.get(taskId);
|
|
131
|
+
assert.equal(prunedFiles.count, 0, 'Should have 0 pruned records (safety check prevented pruning)');
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
process.chdir(originalCwd);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
it('should not prune when all files exist', async () => {
|
|
138
|
+
// 1. Create test task
|
|
139
|
+
const taskId = createTestTask(db);
|
|
140
|
+
// 2. Create 3 watched files that all exist
|
|
141
|
+
const existingFile1 = path.join(tempDir, 'exists1.ts');
|
|
142
|
+
const existingFile2 = path.join(tempDir, 'exists2.ts');
|
|
143
|
+
const existingFile3 = path.join(tempDir, 'exists3.ts');
|
|
144
|
+
fs.writeFileSync(existingFile1, '// test file 1');
|
|
145
|
+
fs.writeFileSync(existingFile2, '// test file 2');
|
|
146
|
+
fs.writeFileSync(existingFile3, '// test file 3');
|
|
147
|
+
// Add files to watch list
|
|
148
|
+
addWatchedFiles(db, taskId, [
|
|
149
|
+
existingFile1,
|
|
150
|
+
existingFile2,
|
|
151
|
+
existingFile3,
|
|
152
|
+
]);
|
|
153
|
+
// Set task to in_progress status and update timestamp to be old enough
|
|
154
|
+
const fifteenMinutesAgo = Math.floor(Date.now() / 1000) - (15 * 60 + 10);
|
|
155
|
+
db.prepare(`
|
|
156
|
+
UPDATE t_tasks
|
|
157
|
+
SET status_id = 2, updated_ts = ?
|
|
158
|
+
WHERE id = ?
|
|
159
|
+
`).run(fifteenMinutesAgo, taskId);
|
|
160
|
+
// 3. Trigger auto-pruning
|
|
161
|
+
const originalCwd = process.cwd();
|
|
162
|
+
try {
|
|
163
|
+
process.chdir(tempDir);
|
|
164
|
+
const transitioned = await detectAndTransitionToReview(db);
|
|
165
|
+
// Task should have transitioned (all files exist)
|
|
166
|
+
assert.equal(transitioned, 1, 'Should have transitioned 1 task');
|
|
167
|
+
// 4. Verify no pruning occurred
|
|
168
|
+
const prunedFiles = db
|
|
169
|
+
.prepare('SELECT COUNT(*) as count FROM t_task_pruned_files WHERE task_id = ?')
|
|
170
|
+
.get(taskId);
|
|
171
|
+
assert.equal(prunedFiles.count, 0, 'Should have 0 pruned records');
|
|
172
|
+
// 5. Verify all files still in watch list
|
|
173
|
+
const watchedFiles = getWatchedFiles(db, taskId);
|
|
174
|
+
assert.equal(watchedFiles.length, 3, 'Should still have 3 files in watch list');
|
|
175
|
+
// 6. Verify task transitioned to waiting_review
|
|
176
|
+
const task = db
|
|
177
|
+
.prepare('SELECT status_id FROM t_tasks WHERE id = ?')
|
|
178
|
+
.get(taskId);
|
|
179
|
+
assert.equal(task.status_id, 3, 'Task should be in waiting_review status (3)');
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
process.chdir(originalCwd);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
it('should handle mixed ratios (3 exist, 1 missing)', async () => {
|
|
186
|
+
// 1. Create test task
|
|
187
|
+
const taskId = createTestTask(db);
|
|
188
|
+
// 2. Create 4 watched files (3 exist, 1 doesn't)
|
|
189
|
+
const existingFile1 = path.join(tempDir, 'exists1.ts');
|
|
190
|
+
const existingFile2 = path.join(tempDir, 'exists2.ts');
|
|
191
|
+
const existingFile3 = path.join(tempDir, 'exists3.ts');
|
|
192
|
+
const nonExistentFile = path.join(tempDir, 'missing.ts');
|
|
193
|
+
fs.writeFileSync(existingFile1, '// test file 1');
|
|
194
|
+
fs.writeFileSync(existingFile2, '// test file 2');
|
|
195
|
+
fs.writeFileSync(existingFile3, '// test file 3');
|
|
196
|
+
// Don't create nonExistentFile
|
|
197
|
+
// Add all files to watch list
|
|
198
|
+
addWatchedFiles(db, taskId, [
|
|
199
|
+
existingFile1,
|
|
200
|
+
existingFile2,
|
|
201
|
+
existingFile3,
|
|
202
|
+
nonExistentFile,
|
|
203
|
+
]);
|
|
204
|
+
// Set task to in_progress status and update timestamp to be old enough
|
|
205
|
+
const fifteenMinutesAgo = Math.floor(Date.now() / 1000) - (15 * 60 + 10);
|
|
206
|
+
db.prepare(`
|
|
207
|
+
UPDATE t_tasks
|
|
208
|
+
SET status_id = 2, updated_ts = ?
|
|
209
|
+
WHERE id = ?
|
|
210
|
+
`).run(fifteenMinutesAgo, taskId);
|
|
211
|
+
// 3. Trigger auto-pruning
|
|
212
|
+
const originalCwd = process.cwd();
|
|
213
|
+
try {
|
|
214
|
+
process.chdir(tempDir);
|
|
215
|
+
const transitioned = await detectAndTransitionToReview(db);
|
|
216
|
+
// Task should have transitioned
|
|
217
|
+
assert.equal(transitioned, 1, 'Should have transitioned 1 task');
|
|
218
|
+
// 4. Verify results
|
|
219
|
+
const watchedFiles = getWatchedFiles(db, taskId);
|
|
220
|
+
assert.equal(watchedFiles.length, 3, 'Should have 3 files in watch list');
|
|
221
|
+
const prunedFiles = db
|
|
222
|
+
.prepare('SELECT file_path FROM t_task_pruned_files WHERE task_id = ?')
|
|
223
|
+
.all(taskId);
|
|
224
|
+
assert.equal(prunedFiles.length, 1, 'Should have 1 pruned file record');
|
|
225
|
+
assert.equal(prunedFiles[0].file_path, 'missing.ts', 'Should have pruned missing.ts');
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
process.chdir(originalCwd);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
// Helper functions
|
|
233
|
+
/**
|
|
234
|
+
* Create a test task in in_progress status
|
|
235
|
+
*/
|
|
236
|
+
function createTestTask(db) {
|
|
237
|
+
const agentId = getOrCreateAgent(db, 'test-agent');
|
|
238
|
+
const result = db
|
|
239
|
+
.prepare(`
|
|
240
|
+
INSERT INTO t_tasks (title, status_id, priority, created_by_agent_id, assigned_agent_id)
|
|
241
|
+
VALUES (?, 2, 2, ?, ?)
|
|
242
|
+
`)
|
|
243
|
+
.run('Test Task for Auto-Pruning', agentId, agentId);
|
|
244
|
+
return result.lastInsertRowid;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Add watched files to a task
|
|
248
|
+
*/
|
|
249
|
+
function addWatchedFiles(db, taskId, filePaths) {
|
|
250
|
+
const insertFileLinkStmt = db.prepare(`
|
|
251
|
+
INSERT OR IGNORE INTO t_task_file_links (task_id, file_id)
|
|
252
|
+
VALUES (?, ?)
|
|
253
|
+
`);
|
|
254
|
+
for (const filePath of filePaths) {
|
|
255
|
+
// Extract just the filename (last segment) for relative paths
|
|
256
|
+
const fileName = path.basename(filePath);
|
|
257
|
+
const fileId = getOrCreateFile(db, fileName);
|
|
258
|
+
insertFileLinkStmt.run(taskId, fileId);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get watched files for a task
|
|
263
|
+
*/
|
|
264
|
+
function getWatchedFiles(db, taskId) {
|
|
265
|
+
return db
|
|
266
|
+
.prepare(`
|
|
267
|
+
SELECT mf.path
|
|
268
|
+
FROM t_task_file_links tfl
|
|
269
|
+
JOIN m_files mf ON tfl.file_id = mf.id
|
|
270
|
+
WHERE tfl.task_id = ?
|
|
271
|
+
`)
|
|
272
|
+
.all(taskId).map((row) => row.path);
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=tasks.auto-pruning-partial.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.auto-pruning-partial.test.js","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-partial.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.auto-pruning-persistence.test.d.ts","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-persistence.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|