sqlew 3.5.3 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +247 -1772
- package/README.md +70 -304
- package/assets/config.example.toml +97 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +21 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mysql-adapter.d.ts +31 -0
- package/dist/adapters/mysql-adapter.d.ts.map +1 -0
- package/dist/adapters/mysql-adapter.js +63 -0
- package/dist/adapters/mysql-adapter.js.map +1 -0
- package/dist/adapters/postgresql-adapter.d.ts +31 -0
- package/dist/adapters/postgresql-adapter.d.ts.map +1 -0
- package/dist/adapters/postgresql-adapter.js +63 -0
- package/dist/adapters/postgresql-adapter.js.map +1 -0
- package/dist/adapters/sqlite-adapter.d.ts +37 -0
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
- package/dist/adapters/sqlite-adapter.js +129 -0
- package/dist/adapters/sqlite-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +33 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli.js +55 -54
- package/dist/cli.js.map +1 -1
- package/dist/config/example-generator.d.ts +11 -0
- package/dist/config/example-generator.d.ts.map +1 -0
- package/dist/config/example-generator.js +48 -0
- package/dist/config/example-generator.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +4 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +9 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database.d.ts +44 -122
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +145 -416
- package/dist/database.js.map +1 -1
- package/dist/index.js +215 -185
- package/dist/index.js.map +1 -1
- package/dist/knexfile.d.ts +6 -0
- package/dist/knexfile.d.ts.map +1 -0
- package/dist/knexfile.js +85 -0
- package/dist/knexfile.js.map +1 -0
- package/dist/migrations/add-help-system-tables.d.ts +35 -0
- package/dist/migrations/add-help-system-tables.d.ts.map +1 -0
- package/dist/migrations/add-help-system-tables.js +206 -0
- package/dist/migrations/add-help-system-tables.js.map +1 -0
- package/dist/migrations/add-token-tracking.d.ts +28 -0
- package/dist/migrations/add-token-tracking.d.ts.map +1 -0
- package/dist/migrations/add-token-tracking.js +108 -0
- package/dist/migrations/add-token-tracking.js.map +1 -0
- package/dist/migrations/index.d.ts +25 -12
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +147 -20
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/knex/20251025020452_create_master_tables.d.ts +4 -0
- package/dist/migrations/knex/20251025020452_create_master_tables.d.ts.map +1 -0
- package/dist/migrations/knex/20251025020452_create_master_tables.js +65 -0
- package/dist/migrations/knex/20251025020452_create_master_tables.js.map +1 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts +4 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts.map +1 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.js +235 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.js.map +1 -0
- package/dist/migrations/knex/20251025021351_create_indexes.d.ts +4 -0
- package/dist/migrations/knex/20251025021351_create_indexes.d.ts.map +1 -0
- package/dist/migrations/knex/20251025021351_create_indexes.js +62 -0
- package/dist/migrations/knex/20251025021351_create_indexes.js.map +1 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.d.ts +4 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.d.ts.map +1 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.js +58 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.js.map +1 -0
- package/dist/migrations/knex/20251025070349_create_views.d.ts +4 -0
- package/dist/migrations/knex/20251025070349_create_views.d.ts.map +1 -0
- package/dist/migrations/knex/20251025070349_create_views.js +143 -0
- package/dist/migrations/knex/20251025070349_create_views.js.map +1 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts +4 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js +15 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts +8 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js +12 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js.map +1 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts +19 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts.map +1 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.js +115 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.js.map +1 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts +13 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js +377 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts +15 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts.map +1 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.js +253 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.js.map +1 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts +16 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js +276 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js.map +1 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts +8 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js +64 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
- package/dist/migrations/seed-help-data.d.ts +48 -0
- package/dist/migrations/seed-help-data.d.ts.map +1 -0
- package/dist/migrations/seed-help-data.js +1466 -0
- package/dist/migrations/seed-help-data.js.map +1 -0
- package/dist/migrations/seed-tool-metadata.d.ts +24 -0
- package/dist/migrations/seed-tool-metadata.d.ts.map +1 -0
- package/dist/migrations/seed-tool-metadata.js +392 -0
- package/dist/migrations/seed-tool-metadata.js.map +1 -0
- package/dist/migrations/v3.6.0-help-system-refactor.d.ts +46 -0
- package/dist/migrations/v3.6.0-help-system-refactor.d.ts.map +1 -0
- package/dist/migrations/v3.6.0-help-system-refactor.js +223 -0
- package/dist/migrations/v3.6.0-help-system-refactor.js.map +1 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -1
- package/dist/tests/git-aware-completion.test.js +89 -70
- package/dist/tests/git-aware-completion.test.js.map +1 -1
- package/dist/tests/help-system.test.d.ts +23 -0
- package/dist/tests/help-system.test.d.ts.map +1 -0
- package/dist/tests/help-system.test.js +374 -0
- package/dist/tests/help-system.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.js +92 -78
- package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -1
- package/dist/tests/tasks.auto-pruning-partial.test.js +106 -95
- package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -1
- package/dist/tests/tasks.auto-pruning-persistence.test.js +115 -97
- package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -1
- package/dist/tests/tasks.auto-pruning-safety.test.js +124 -103
- package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -1
- package/dist/tests/tasks.dependencies.test.js +338 -307
- package/dist/tests/tasks.dependencies.test.js.map +1 -1
- package/dist/tests/tasks.link-file-backward-compat.test.js +116 -104
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
- package/dist/tests/tasks.watch-files-action.test.js +122 -101
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
- package/dist/tests/tasks.watch-files-parameter.test.js +105 -94
- package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -1
- package/dist/tests/two-step-git-completion.test.js +176 -133
- package/dist/tests/two-step-git-completion.test.js.map +1 -1
- package/dist/tests/vcs-staging.test.js +1 -1
- package/dist/tests/vcs-staging.test.js.map +1 -1
- package/dist/tools/config.d.ts +9 -6
- package/dist/tools/config.d.ts.map +1 -1
- package/dist/tools/config.js +16 -14
- package/dist/tools/config.js.map +1 -1
- package/dist/tools/constraints.d.ts +10 -7
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +66 -48
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts +36 -33
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +374 -330
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts +12 -9
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +173 -95
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/help-queries.d.ts +130 -0
- package/dist/tools/help-queries.d.ts.map +1 -0
- package/dist/tools/help-queries.js +393 -0
- package/dist/tools/help-queries.js.map +1 -0
- package/dist/tools/messaging.d.ts +14 -11
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +217 -133
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/tasks.d.ts +18 -16
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +513 -439
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +14 -11
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +86 -121
- package/dist/tools/utils.js.map +1 -1
- package/dist/utils/activity-logging.d.ts +114 -0
- package/dist/utils/activity-logging.d.ts.map +1 -0
- package/dist/utils/activity-logging.js +162 -0
- package/dist/utils/activity-logging.js.map +1 -0
- package/dist/utils/batch.d.ts +2 -2
- package/dist/utils/batch.d.ts.map +1 -1
- package/dist/utils/batch.js +8 -8
- package/dist/utils/batch.js.map +1 -1
- package/dist/utils/cleanup.d.ts +21 -13
- package/dist/utils/cleanup.d.ts.map +1 -1
- package/dist/utils/cleanup.js +31 -24
- package/dist/utils/cleanup.js.map +1 -1
- package/dist/utils/debug-logger.d.ts +44 -0
- package/dist/utils/debug-logger.d.ts.map +1 -0
- package/dist/utils/debug-logger.js +116 -0
- package/dist/utils/debug-logger.js.map +1 -0
- package/dist/utils/help-tracking.d.ts +55 -0
- package/dist/utils/help-tracking.d.ts.map +1 -0
- package/dist/utils/help-tracking.js +88 -0
- package/dist/utils/help-tracking.js.map +1 -0
- package/dist/utils/retention.d.ts +7 -7
- package/dist/utils/retention.d.ts.map +1 -1
- package/dist/utils/retention.js +12 -12
- package/dist/utils/retention.js.map +1 -1
- package/dist/utils/task-stale-detection.d.ts +15 -13
- package/dist/utils/task-stale-detection.d.ts.map +1 -1
- package/dist/utils/task-stale-detection.js +100 -302
- package/dist/utils/task-stale-detection.js.map +1 -1
- package/dist/utils/token-estimation.d.ts +72 -0
- package/dist/utils/token-estimation.d.ts.map +1 -0
- package/dist/utils/token-estimation.js +71 -0
- package/dist/utils/token-estimation.js.map +1 -0
- package/dist/utils/token-logging.d.ts +48 -0
- package/dist/utils/token-logging.d.ts.map +1 -0
- package/dist/utils/token-logging.js +112 -0
- package/dist/utils/token-logging.js.map +1 -0
- package/dist/utils/view-queries.d.ts +34 -0
- package/dist/utils/view-queries.d.ts.map +1 -0
- package/dist/utils/view-queries.js +192 -0
- package/dist/utils/view-queries.js.map +1 -0
- package/dist/watcher/file-watcher.d.ts.map +1 -1
- package/dist/watcher/file-watcher.js +25 -11
- package/dist/watcher/file-watcher.js.map +1 -1
- package/docs/BEST_PRACTICES.md +56 -448
- package/docs/MIGRATION_v3.6.0.md +170 -0
- package/docs/SHARED_CONCEPTS.md +63 -208
- package/docs/TASK_OVERVIEW.md +2 -2
- package/docs/TOOL_SELECTION.md +41 -248
- package/package.json +16 -4
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { describe, it, beforeEach } from 'node:test';
|
|
6
6
|
import assert from 'node:assert/strict';
|
|
7
|
-
import
|
|
8
|
-
import { initializeSchema } from '../schema.js';
|
|
9
|
-
import { runAllMigrations } from '../migrations/index.js';
|
|
7
|
+
import { initializeDatabase } from '../database.js';
|
|
10
8
|
import { getOrCreateAgent } from '../database.js';
|
|
11
9
|
import { setDecision } from '../tools/context.js';
|
|
12
10
|
import { getPrunedFiles, linkPrunedFile } from '../tools/tasks.js';
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
13
|
/**
|
|
14
14
|
* Test database instance
|
|
15
15
|
*/
|
|
@@ -17,45 +17,57 @@ let testDb;
|
|
|
17
17
|
/**
|
|
18
18
|
* Create an in-memory test database
|
|
19
19
|
*/
|
|
20
|
-
function createTestDatabase() {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
async function createTestDatabase() {
|
|
21
|
+
// Use unique temp file for each test run to ensure clean state
|
|
22
|
+
const tmpDir = path.join(process.cwd(), 'src', '.sqlew', 'tmp');
|
|
23
|
+
if (!fs.existsSync(tmpDir)) {
|
|
24
|
+
fs.mkdirSync(tmpDir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
const dbPath = path.join(tmpDir, `test-auto-pruning-${Date.now()}.db`);
|
|
27
|
+
const adapter = await initializeDatabase({
|
|
28
|
+
databaseType: 'sqlite',
|
|
29
|
+
connection: { filename: dbPath }
|
|
30
|
+
});
|
|
31
|
+
return adapter;
|
|
26
32
|
}
|
|
27
33
|
/**
|
|
28
34
|
* Helper: Create a test task
|
|
29
35
|
*/
|
|
30
|
-
function createTestTask(
|
|
31
|
-
const agentId = getOrCreateAgent(
|
|
36
|
+
async function createTestTask(adapter, title) {
|
|
37
|
+
const agentId = await getOrCreateAgent(adapter, 'test-agent');
|
|
32
38
|
const statusId = 2; // in_progress
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
const knex = adapter.getKnex();
|
|
40
|
+
const [id] = await knex('t_tasks').insert({
|
|
41
|
+
title,
|
|
42
|
+
status_id: statusId,
|
|
43
|
+
priority: 2,
|
|
44
|
+
created_by_agent_id: agentId,
|
|
45
|
+
assigned_agent_id: agentId
|
|
46
|
+
});
|
|
47
|
+
return id;
|
|
38
48
|
}
|
|
39
49
|
/**
|
|
40
50
|
* Helper: Create a pruned file record
|
|
41
51
|
*/
|
|
42
|
-
function createPrunedFileRecord(
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
52
|
+
async function createPrunedFileRecord(adapter, taskId, filePath) {
|
|
53
|
+
const knex = adapter.getKnex();
|
|
54
|
+
const [id] = await knex('t_task_pruned_files').insert({
|
|
55
|
+
task_id: taskId,
|
|
56
|
+
file_path: filePath,
|
|
57
|
+
pruned_ts: knex.raw('unixepoch()')
|
|
58
|
+
});
|
|
59
|
+
return id;
|
|
48
60
|
}
|
|
49
61
|
describe('Auto-pruning: Decision linking workflow', () => {
|
|
50
|
-
beforeEach(() => {
|
|
51
|
-
testDb = createTestDatabase();
|
|
62
|
+
beforeEach(async () => {
|
|
63
|
+
testDb = await createTestDatabase();
|
|
52
64
|
});
|
|
53
|
-
it('should link decisions to pruned files for WHY reasoning', () => {
|
|
65
|
+
it('should link decisions to pruned files for WHY reasoning', async () => {
|
|
54
66
|
// 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');
|
|
67
|
+
const taskId = await createTestTask(testDb, 'Implement OAuth authentication');
|
|
68
|
+
const prunedFileId = await createPrunedFileRecord(testDb, taskId, 'src/auth/oauth-handler.ts');
|
|
57
69
|
// 2. Create decision explaining why file wasn't created
|
|
58
|
-
const decisionResult = setDecision({
|
|
70
|
+
const decisionResult = await setDecision({
|
|
59
71
|
key: 'oauth-not-implemented',
|
|
60
72
|
value: 'Decided to use API key auth instead of OAuth for simplicity',
|
|
61
73
|
tags: ['architecture', 'authentication'],
|
|
@@ -64,7 +76,7 @@ describe('Auto-pruning: Decision linking workflow', () => {
|
|
|
64
76
|
assert.ok(decisionResult.success, 'Decision creation should succeed');
|
|
65
77
|
assert.strictEqual(decisionResult.key, 'oauth-not-implemented');
|
|
66
78
|
// 3. Link decision to pruned file
|
|
67
|
-
const linkResult = linkPrunedFile({
|
|
79
|
+
const linkResult = await linkPrunedFile({
|
|
68
80
|
pruned_file_id: prunedFileId,
|
|
69
81
|
decision_key: 'oauth-not-implemented'
|
|
70
82
|
}, testDb);
|
|
@@ -74,13 +86,15 @@ describe('Auto-pruning: Decision linking workflow', () => {
|
|
|
74
86
|
assert.strictEqual(linkResult.task_id, taskId);
|
|
75
87
|
assert.strictEqual(linkResult.file_path, 'src/auth/oauth-handler.ts');
|
|
76
88
|
// 4. Verify link in database directly
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
89
|
+
const knex = testDb.getKnex();
|
|
90
|
+
const linkedDecisionId = await knex('t_task_pruned_files')
|
|
91
|
+
.where({ id: prunedFileId })
|
|
92
|
+
.select('linked_decision_key_id')
|
|
93
|
+
.first();
|
|
80
94
|
assert.ok(linkedDecisionId, 'Pruned file record should exist');
|
|
81
95
|
assert.ok(linkedDecisionId.linked_decision_key_id !== null, 'Decision key ID should be linked');
|
|
82
96
|
// 5. Query pruned files - decision key should be returned
|
|
83
|
-
const getPrunedResult = getPrunedFiles({
|
|
97
|
+
const getPrunedResult = await getPrunedFiles({
|
|
84
98
|
task_id: taskId,
|
|
85
99
|
limit: 100
|
|
86
100
|
}, testDb);
|
|
@@ -95,33 +109,33 @@ describe('Auto-pruning: Decision linking workflow', () => {
|
|
|
95
109
|
assert.ok(prunedFile.linked_decision, 'Should have linked_decision key');
|
|
96
110
|
assert.strictEqual(prunedFile.linked_decision, 'oauth-not-implemented', 'Linked decision key should match');
|
|
97
111
|
});
|
|
98
|
-
it('should handle multiple pruned files with different decisions', () => {
|
|
99
|
-
const taskId = createTestTask(testDb, 'Feature implementation');
|
|
112
|
+
it('should handle multiple pruned files with different decisions', async () => {
|
|
113
|
+
const taskId = await createTestTask(testDb, 'Feature implementation');
|
|
100
114
|
// Create pruned files
|
|
101
|
-
const prunedFileId1 = createPrunedFileRecord(testDb, taskId, 'src/oauth-handler.ts');
|
|
102
|
-
const prunedFileId2 = createPrunedFileRecord(testDb, taskId, 'src/ldap-connector.ts');
|
|
115
|
+
const prunedFileId1 = await createPrunedFileRecord(testDb, taskId, 'src/oauth-handler.ts');
|
|
116
|
+
const prunedFileId2 = await createPrunedFileRecord(testDb, taskId, 'src/ldap-connector.ts');
|
|
103
117
|
// Create decisions
|
|
104
|
-
setDecision({
|
|
118
|
+
await setDecision({
|
|
105
119
|
key: 'no-oauth',
|
|
106
120
|
value: 'OAuth not needed for MVP',
|
|
107
121
|
status: 'active'
|
|
108
122
|
}, testDb);
|
|
109
|
-
setDecision({
|
|
123
|
+
await setDecision({
|
|
110
124
|
key: 'no-ldap',
|
|
111
125
|
value: 'LDAP integration deferred to Phase 2',
|
|
112
126
|
status: 'active'
|
|
113
127
|
}, testDb);
|
|
114
128
|
// Link decisions
|
|
115
|
-
linkPrunedFile({
|
|
129
|
+
await linkPrunedFile({
|
|
116
130
|
pruned_file_id: prunedFileId1,
|
|
117
131
|
decision_key: 'no-oauth'
|
|
118
132
|
}, testDb);
|
|
119
|
-
linkPrunedFile({
|
|
133
|
+
await linkPrunedFile({
|
|
120
134
|
pruned_file_id: prunedFileId2,
|
|
121
135
|
decision_key: 'no-ldap'
|
|
122
136
|
}, testDb);
|
|
123
137
|
// Verify
|
|
124
|
-
const getPrunedResult = getPrunedFiles({
|
|
138
|
+
const getPrunedResult = await getPrunedFiles({
|
|
125
139
|
task_id: taskId
|
|
126
140
|
}, testDb);
|
|
127
141
|
assert.strictEqual(getPrunedResult.count, 2, 'Should have 2 pruned files');
|
|
@@ -132,10 +146,10 @@ describe('Auto-pruning: Decision linking workflow', () => {
|
|
|
132
146
|
assert.strictEqual(file1?.linked_decision, 'no-oauth');
|
|
133
147
|
assert.strictEqual(file2?.linked_decision, 'no-ldap');
|
|
134
148
|
});
|
|
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({
|
|
149
|
+
it('should handle pruned files without linked decisions', async () => {
|
|
150
|
+
const taskId = await createTestTask(testDb, 'Task with unlinked pruned files');
|
|
151
|
+
await createPrunedFileRecord(testDb, taskId, 'src/temp-file.ts');
|
|
152
|
+
const getPrunedResult = await getPrunedFiles({
|
|
139
153
|
task_id: taskId
|
|
140
154
|
}, testDb);
|
|
141
155
|
assert.ok(getPrunedResult.success);
|
|
@@ -143,101 +157,101 @@ describe('Auto-pruning: Decision linking workflow', () => {
|
|
|
143
157
|
const prunedFile = getPrunedResult.pruned_files[0];
|
|
144
158
|
assert.strictEqual(prunedFile.linked_decision, null, 'Unlinked file should have null decision');
|
|
145
159
|
});
|
|
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');
|
|
160
|
+
it('should handle linking to non-existent decision gracefully', async () => {
|
|
161
|
+
const taskId = await createTestTask(testDb, 'Task for error test');
|
|
162
|
+
const prunedFileId = await createPrunedFileRecord(testDb, taskId, 'src/test.ts');
|
|
149
163
|
// Attempt to link non-existent decision
|
|
150
|
-
assert.
|
|
151
|
-
linkPrunedFile({
|
|
164
|
+
await assert.rejects(async () => {
|
|
165
|
+
await linkPrunedFile({
|
|
152
166
|
pruned_file_id: prunedFileId,
|
|
153
167
|
decision_key: 'does-not-exist'
|
|
154
168
|
}, testDb);
|
|
155
169
|
}, /Decision not found: does-not-exist/, 'Should throw error for non-existent decision');
|
|
156
170
|
});
|
|
157
|
-
it('should handle linking to non-existent pruned file gracefully', () => {
|
|
171
|
+
it('should handle linking to non-existent pruned file gracefully', async () => {
|
|
158
172
|
// Create decision
|
|
159
|
-
setDecision({
|
|
173
|
+
await setDecision({
|
|
160
174
|
key: 'test-decision',
|
|
161
175
|
value: 'Test decision value',
|
|
162
176
|
status: 'active'
|
|
163
177
|
}, testDb);
|
|
164
178
|
// Attempt to link non-existent pruned file
|
|
165
|
-
assert.
|
|
166
|
-
linkPrunedFile({
|
|
179
|
+
await assert.rejects(async () => {
|
|
180
|
+
await linkPrunedFile({
|
|
167
181
|
pruned_file_id: 99999,
|
|
168
182
|
decision_key: 'test-decision'
|
|
169
183
|
}, testDb);
|
|
170
184
|
}, /Pruned file record not found: 99999/, 'Should throw error for non-existent pruned file');
|
|
171
185
|
});
|
|
172
|
-
it('should validate required parameters for linkPrunedFile', () => {
|
|
186
|
+
it('should validate required parameters for linkPrunedFile', async () => {
|
|
173
187
|
// Missing pruned_file_id
|
|
174
|
-
assert.
|
|
175
|
-
linkPrunedFile({
|
|
188
|
+
await assert.rejects(async () => {
|
|
189
|
+
await linkPrunedFile({
|
|
176
190
|
pruned_file_id: 0,
|
|
177
191
|
decision_key: 'test'
|
|
178
192
|
}, testDb);
|
|
179
193
|
}, /pruned_file_id is required and must be a number/, 'Should throw for invalid pruned_file_id');
|
|
180
194
|
// Missing decision_key
|
|
181
|
-
assert.
|
|
182
|
-
linkPrunedFile({
|
|
195
|
+
await assert.rejects(async () => {
|
|
196
|
+
await linkPrunedFile({
|
|
183
197
|
pruned_file_id: 1,
|
|
184
198
|
decision_key: ''
|
|
185
199
|
}, testDb);
|
|
186
200
|
}, /decision_key is required and must be a string/, 'Should throw for empty decision_key');
|
|
187
201
|
});
|
|
188
|
-
it('should validate required parameters for getPrunedFiles', () => {
|
|
202
|
+
it('should validate required parameters for getPrunedFiles', async () => {
|
|
189
203
|
// Missing task_id
|
|
190
|
-
assert.
|
|
191
|
-
getPrunedFiles({
|
|
204
|
+
await assert.rejects(async () => {
|
|
205
|
+
await getPrunedFiles({
|
|
192
206
|
task_id: 0
|
|
193
207
|
}, testDb);
|
|
194
208
|
}, /task_id is required and must be a number/, 'Should throw for invalid task_id');
|
|
195
209
|
// Non-existent task
|
|
196
|
-
assert.
|
|
197
|
-
getPrunedFiles({
|
|
210
|
+
await assert.rejects(async () => {
|
|
211
|
+
await getPrunedFiles({
|
|
198
212
|
task_id: 99999
|
|
199
213
|
}, testDb);
|
|
200
214
|
}, /Task not found: 99999/, 'Should throw for non-existent task');
|
|
201
215
|
});
|
|
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');
|
|
216
|
+
it('should allow updating linked decision for a pruned file', async () => {
|
|
217
|
+
const taskId = await createTestTask(testDb, 'Task for update test');
|
|
218
|
+
const prunedFileId = await createPrunedFileRecord(testDb, taskId, 'src/feature.ts');
|
|
205
219
|
// Create two decisions
|
|
206
|
-
setDecision({
|
|
220
|
+
await setDecision({
|
|
207
221
|
key: 'decision-v1',
|
|
208
222
|
value: 'Initial decision',
|
|
209
223
|
status: 'active'
|
|
210
224
|
}, testDb);
|
|
211
|
-
setDecision({
|
|
225
|
+
await setDecision({
|
|
212
226
|
key: 'decision-v2',
|
|
213
227
|
value: 'Updated decision',
|
|
214
228
|
status: 'active'
|
|
215
229
|
}, testDb);
|
|
216
230
|
// Link first decision
|
|
217
|
-
linkPrunedFile({
|
|
231
|
+
await linkPrunedFile({
|
|
218
232
|
pruned_file_id: prunedFileId,
|
|
219
233
|
decision_key: 'decision-v1'
|
|
220
234
|
}, testDb);
|
|
221
235
|
// Verify first link
|
|
222
|
-
let getPrunedResult = getPrunedFiles({ task_id: taskId }, testDb);
|
|
236
|
+
let getPrunedResult = await getPrunedFiles({ task_id: taskId }, testDb);
|
|
223
237
|
assert.strictEqual(getPrunedResult.pruned_files[0].linked_decision, 'decision-v1');
|
|
224
238
|
// Update to second decision
|
|
225
|
-
linkPrunedFile({
|
|
239
|
+
await linkPrunedFile({
|
|
226
240
|
pruned_file_id: prunedFileId,
|
|
227
241
|
decision_key: 'decision-v2'
|
|
228
242
|
}, testDb);
|
|
229
243
|
// Verify updated link
|
|
230
|
-
getPrunedResult = getPrunedFiles({ task_id: taskId }, testDb);
|
|
244
|
+
getPrunedResult = await getPrunedFiles({ task_id: taskId }, testDb);
|
|
231
245
|
assert.strictEqual(getPrunedResult.pruned_files[0].linked_decision, 'decision-v2');
|
|
232
246
|
});
|
|
233
|
-
it('should respect limit parameter in getPrunedFiles', () => {
|
|
234
|
-
const taskId = createTestTask(testDb, 'Task with many pruned files');
|
|
247
|
+
it('should respect limit parameter in getPrunedFiles', async () => {
|
|
248
|
+
const taskId = await createTestTask(testDb, 'Task with many pruned files');
|
|
235
249
|
// Create 5 pruned files
|
|
236
250
|
for (let i = 1; i <= 5; i++) {
|
|
237
|
-
createPrunedFileRecord(testDb, taskId, `src/file${i}.ts`);
|
|
251
|
+
await createPrunedFileRecord(testDb, taskId, `src/file${i}.ts`);
|
|
238
252
|
}
|
|
239
253
|
// Query with limit
|
|
240
|
-
const getPrunedResult = getPrunedFiles({
|
|
254
|
+
const getPrunedResult = await getPrunedFiles({
|
|
241
255
|
task_id: taskId,
|
|
242
256
|
limit: 3
|
|
243
257
|
}, testDb);
|
|
@@ -1 +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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,
|
|
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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"}
|