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,8 +4,7 @@
|
|
|
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';
|
|
7
|
+
import { initializeDatabase } from '../database.js';
|
|
9
8
|
import { getOrCreateAgent, getOrCreateFile } from '../database.js';
|
|
10
9
|
/**
|
|
11
10
|
* Test database instance
|
|
@@ -14,46 +13,55 @@ let testDb;
|
|
|
14
13
|
/**
|
|
15
14
|
* Create an in-memory test database
|
|
16
15
|
*/
|
|
17
|
-
function createTestDatabase() {
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
async function createTestDatabase() {
|
|
17
|
+
const adapter = await initializeDatabase({
|
|
18
|
+
databaseType: 'sqlite',
|
|
19
|
+
connection: { filename: ':memory:' }
|
|
20
|
+
});
|
|
21
|
+
return adapter;
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* Inline implementation of createTask with watch_files for testing
|
|
25
25
|
*/
|
|
26
|
-
function createTaskWithWatchFiles(
|
|
27
|
-
const
|
|
26
|
+
async function createTaskWithWatchFiles(adapter, params) {
|
|
27
|
+
const knex = adapter.getKnex();
|
|
28
|
+
const agentId = await getOrCreateAgent(adapter, params.created_by_agent || 'system');
|
|
28
29
|
const statusId = 1; // todo
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
const [taskId] = await knex('t_tasks').insert({
|
|
31
|
+
title: params.title,
|
|
32
|
+
status_id: statusId,
|
|
33
|
+
priority: params.priority || 2,
|
|
34
|
+
created_by_agent_id: agentId,
|
|
35
|
+
assigned_agent_id: agentId
|
|
36
|
+
});
|
|
34
37
|
// Add description if provided
|
|
35
38
|
if (params.description || params.acceptance_criteria) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
await knex('t_task_details').insert({
|
|
40
|
+
task_id: taskId,
|
|
41
|
+
description: params.description || null,
|
|
42
|
+
acceptance_criteria: params.acceptance_criteria || null
|
|
43
|
+
});
|
|
40
44
|
}
|
|
41
45
|
// Add tags if provided
|
|
42
46
|
if (params.tags && params.tags.length > 0) {
|
|
43
|
-
const insertTagLink = db.prepare('INSERT OR IGNORE INTO t_task_tags (task_id, tag_id) VALUES (?, ?)');
|
|
44
47
|
for (const tag of params.tags) {
|
|
45
|
-
|
|
46
|
-
const tagResult =
|
|
47
|
-
|
|
48
|
+
await knex('m_tags').insert({ name: tag }).onConflict('name').ignore();
|
|
49
|
+
const tagResult = await knex('m_tags').where({ name: tag }).first('id');
|
|
50
|
+
await knex('t_task_tags').insert({
|
|
51
|
+
task_id: taskId,
|
|
52
|
+
tag_id: tagResult.id
|
|
53
|
+
}).onConflict().ignore();
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
56
|
// Add watch_files if provided
|
|
51
57
|
const watchedFiles = [];
|
|
52
58
|
if (params.watch_files && params.watch_files.length > 0) {
|
|
53
59
|
for (const filePath of params.watch_files) {
|
|
54
|
-
const fileId = getOrCreateFile(
|
|
55
|
-
|
|
56
|
-
|
|
60
|
+
const fileId = await getOrCreateFile(adapter, filePath);
|
|
61
|
+
await knex('t_task_file_links').insert({
|
|
62
|
+
task_id: taskId,
|
|
63
|
+
file_id: fileId
|
|
64
|
+
}).onConflict().ignore();
|
|
57
65
|
watchedFiles.push(filePath);
|
|
58
66
|
}
|
|
59
67
|
}
|
|
@@ -68,17 +76,20 @@ function createTaskWithWatchFiles(db, params) {
|
|
|
68
76
|
/**
|
|
69
77
|
* Inline implementation of updateTask with watch_files for testing
|
|
70
78
|
*/
|
|
71
|
-
function updateTaskWithWatchFiles(
|
|
72
|
-
const
|
|
79
|
+
async function updateTaskWithWatchFiles(adapter, params) {
|
|
80
|
+
const knex = adapter.getKnex();
|
|
81
|
+
const task = await knex('t_tasks').where({ id: params.task_id }).first('id');
|
|
73
82
|
if (!task) {
|
|
74
83
|
throw new Error(`Task #${params.task_id} not found`);
|
|
75
84
|
}
|
|
76
85
|
const watchedFiles = [];
|
|
77
86
|
if (params.watch_files && params.watch_files.length > 0) {
|
|
78
87
|
for (const filePath of params.watch_files) {
|
|
79
|
-
const fileId = getOrCreateFile(
|
|
80
|
-
|
|
81
|
-
|
|
88
|
+
const fileId = await getOrCreateFile(adapter, filePath);
|
|
89
|
+
await knex('t_task_file_links').insert({
|
|
90
|
+
task_id: params.task_id,
|
|
91
|
+
file_id: fileId
|
|
92
|
+
}).onConflict().ignore();
|
|
82
93
|
watchedFiles.push(filePath);
|
|
83
94
|
}
|
|
84
95
|
}
|
|
@@ -89,11 +100,11 @@ function updateTaskWithWatchFiles(db, params) {
|
|
|
89
100
|
};
|
|
90
101
|
}
|
|
91
102
|
describe('Task watch_files parameter tests', () => {
|
|
92
|
-
beforeEach(() => {
|
|
93
|
-
testDb = createTestDatabase();
|
|
103
|
+
beforeEach(async () => {
|
|
104
|
+
testDb = await createTestDatabase();
|
|
94
105
|
});
|
|
95
|
-
it('should create task with watch_files parameter', () => {
|
|
96
|
-
const result = createTaskWithWatchFiles(testDb, {
|
|
106
|
+
it('should create task with watch_files parameter', async () => {
|
|
107
|
+
const result = await createTaskWithWatchFiles(testDb, {
|
|
97
108
|
title: 'Test Task with File Watching',
|
|
98
109
|
description: 'Testing watch_files parameter',
|
|
99
110
|
watch_files: ['src/index.ts', 'src/database.ts'],
|
|
@@ -105,112 +116,111 @@ describe('Task watch_files parameter tests', () => {
|
|
|
105
116
|
assert.strictEqual(result.task_id, 1, 'First task should have ID 1');
|
|
106
117
|
assert.deepStrictEqual(result.watched_files, ['src/index.ts', 'src/database.ts'], 'Should return watched files list');
|
|
107
118
|
});
|
|
108
|
-
it('should link files in database', () => {
|
|
109
|
-
createTaskWithWatchFiles(testDb, {
|
|
119
|
+
it('should link files in database', async () => {
|
|
120
|
+
await createTaskWithWatchFiles(testDb, {
|
|
110
121
|
title: 'Task with files',
|
|
111
122
|
watch_files: ['src/index.ts', 'src/database.ts']
|
|
112
123
|
});
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
`).all();
|
|
124
|
+
const knex = testDb.getKnex();
|
|
125
|
+
const links = await knex('t_task_file_links as tfl')
|
|
126
|
+
.join('m_files as f', 'tfl.file_id', 'f.id')
|
|
127
|
+
.where('tfl.task_id', 1)
|
|
128
|
+
.select('f.path')
|
|
129
|
+
.orderBy('f.path');
|
|
120
130
|
assert.strictEqual(links.length, 2, 'Should have 2 file links');
|
|
121
131
|
assert.strictEqual(links[0].path, 'src/database.ts');
|
|
122
132
|
assert.strictEqual(links[1].path, 'src/index.ts');
|
|
123
133
|
});
|
|
124
|
-
it('should register files in m_files table', () => {
|
|
125
|
-
createTaskWithWatchFiles(testDb, {
|
|
134
|
+
it('should register files in m_files table', async () => {
|
|
135
|
+
await createTaskWithWatchFiles(testDb, {
|
|
126
136
|
title: 'Task with files',
|
|
127
137
|
watch_files: ['src/index.ts', 'src/database.ts']
|
|
128
138
|
});
|
|
129
|
-
const
|
|
139
|
+
const knex = testDb.getKnex();
|
|
140
|
+
const files = await knex('m_files').select('path').orderBy('path');
|
|
130
141
|
assert.ok(files.length >= 2, 'Should have at least 2 files registered');
|
|
131
142
|
const paths = files.map(f => f.path);
|
|
132
143
|
assert.ok(paths.includes('src/index.ts'));
|
|
133
144
|
assert.ok(paths.includes('src/database.ts'));
|
|
134
145
|
});
|
|
135
|
-
it('should handle empty watch_files array', () => {
|
|
136
|
-
const result = createTaskWithWatchFiles(testDb, {
|
|
146
|
+
it('should handle empty watch_files array', async () => {
|
|
147
|
+
const result = await createTaskWithWatchFiles(testDb, {
|
|
137
148
|
title: 'Task without file watching',
|
|
138
149
|
watch_files: []
|
|
139
150
|
});
|
|
140
151
|
assert.ok(result.success);
|
|
141
152
|
assert.strictEqual(result.watched_files, undefined, 'Should not have watched_files in response');
|
|
142
|
-
const
|
|
153
|
+
const knex = testDb.getKnex();
|
|
154
|
+
const links = await knex('t_task_file_links').where('task_id', 1);
|
|
143
155
|
assert.strictEqual(links.length, 0, 'Should have no file links');
|
|
144
156
|
});
|
|
145
|
-
it('should handle missing watch_files parameter', () => {
|
|
146
|
-
const result = createTaskWithWatchFiles(testDb, {
|
|
157
|
+
it('should handle missing watch_files parameter', async () => {
|
|
158
|
+
const result = await createTaskWithWatchFiles(testDb, {
|
|
147
159
|
title: 'Task without watch_files param'
|
|
148
160
|
});
|
|
149
161
|
assert.ok(result.success);
|
|
150
162
|
assert.strictEqual(result.watched_files, undefined, 'Should not have watched_files in response');
|
|
151
|
-
const
|
|
163
|
+
const knex = testDb.getKnex();
|
|
164
|
+
const links = await knex('t_task_file_links').where('task_id', 1);
|
|
152
165
|
assert.strictEqual(links.length, 0, 'Should have no file links');
|
|
153
166
|
});
|
|
154
|
-
it('should update task to add watch_files', () => {
|
|
155
|
-
const task = createTaskWithWatchFiles(testDb, {
|
|
167
|
+
it('should update task to add watch_files', async () => {
|
|
168
|
+
const task = await createTaskWithWatchFiles(testDb, {
|
|
156
169
|
title: 'Task without files initially'
|
|
157
170
|
});
|
|
158
|
-
const result = updateTaskWithWatchFiles(testDb, {
|
|
171
|
+
const result = await updateTaskWithWatchFiles(testDb, {
|
|
159
172
|
task_id: task.task_id,
|
|
160
173
|
watch_files: ['src/tools/tasks.ts', 'src/schema.ts']
|
|
161
174
|
});
|
|
162
175
|
assert.ok(result.success);
|
|
163
176
|
assert.deepStrictEqual(result.watched_files, ['src/tools/tasks.ts', 'src/schema.ts']);
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
`).all(task.task_id);
|
|
177
|
+
const knex = testDb.getKnex();
|
|
178
|
+
const links = await knex('t_task_file_links as tfl')
|
|
179
|
+
.join('m_files as f', 'tfl.file_id', 'f.id')
|
|
180
|
+
.where('tfl.task_id', task.task_id)
|
|
181
|
+
.select('f.path')
|
|
182
|
+
.orderBy('f.path');
|
|
171
183
|
assert.strictEqual(links.length, 2, 'Should have 2 file links after update');
|
|
172
184
|
});
|
|
173
|
-
it('should append new watch_files to existing ones', () => {
|
|
174
|
-
const task = createTaskWithWatchFiles(testDb, {
|
|
185
|
+
it('should append new watch_files to existing ones', async () => {
|
|
186
|
+
const task = await createTaskWithWatchFiles(testDb, {
|
|
175
187
|
title: 'Task with initial files',
|
|
176
188
|
watch_files: ['src/index.ts', 'src/database.ts']
|
|
177
189
|
});
|
|
178
|
-
updateTaskWithWatchFiles(testDb, {
|
|
190
|
+
await updateTaskWithWatchFiles(testDb, {
|
|
179
191
|
task_id: task.task_id,
|
|
180
192
|
watch_files: ['src/utils/validators.ts']
|
|
181
193
|
});
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
`).all(task.task_id);
|
|
194
|
+
const knex = testDb.getKnex();
|
|
195
|
+
const links = await knex('t_task_file_links as tfl')
|
|
196
|
+
.join('m_files as f', 'tfl.file_id', 'f.id')
|
|
197
|
+
.where('tfl.task_id', task.task_id)
|
|
198
|
+
.select('f.path')
|
|
199
|
+
.orderBy('f.path');
|
|
189
200
|
assert.strictEqual(links.length, 3, 'Should have 3 file links total');
|
|
190
201
|
const paths = links.map(l => l.path);
|
|
191
202
|
assert.ok(paths.includes('src/index.ts'));
|
|
192
203
|
assert.ok(paths.includes('src/database.ts'));
|
|
193
204
|
assert.ok(paths.includes('src/utils/validators.ts'));
|
|
194
205
|
});
|
|
195
|
-
it('should handle duplicate file paths correctly (idempotent)', () => {
|
|
196
|
-
const task = createTaskWithWatchFiles(testDb, {
|
|
206
|
+
it('should handle duplicate file paths correctly (idempotent)', async () => {
|
|
207
|
+
const task = await createTaskWithWatchFiles(testDb, {
|
|
197
208
|
title: 'Task with files',
|
|
198
209
|
watch_files: ['src/index.ts']
|
|
199
210
|
});
|
|
200
|
-
updateTaskWithWatchFiles(testDb, {
|
|
211
|
+
await updateTaskWithWatchFiles(testDb, {
|
|
201
212
|
task_id: task.task_id,
|
|
202
213
|
watch_files: ['src/index.ts'] // Duplicate
|
|
203
214
|
});
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
`).all(task.task_id);
|
|
215
|
+
const knex = testDb.getKnex();
|
|
216
|
+
const links = await knex('t_task_file_links as tfl')
|
|
217
|
+
.join('m_files as f', 'tfl.file_id', 'f.id')
|
|
218
|
+
.where('tfl.task_id', task.task_id)
|
|
219
|
+
.select('f.path');
|
|
210
220
|
assert.strictEqual(links.length, 1, 'Should not create duplicate links');
|
|
211
221
|
});
|
|
212
|
-
it('should handle various path formats', () => {
|
|
213
|
-
const result = createTaskWithWatchFiles(testDb, {
|
|
222
|
+
it('should handle various path formats', async () => {
|
|
223
|
+
const result = await createTaskWithWatchFiles(testDb, {
|
|
214
224
|
title: 'Task with various paths',
|
|
215
225
|
watch_files: [
|
|
216
226
|
'package.json',
|
|
@@ -219,28 +229,29 @@ describe('Task watch_files parameter tests', () => {
|
|
|
219
229
|
]
|
|
220
230
|
});
|
|
221
231
|
assert.strictEqual(result.watched_files?.length, 3);
|
|
222
|
-
const
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
`).all(result.task_id);
|
|
232
|
+
const knex = testDb.getKnex();
|
|
233
|
+
const links = await knex('t_task_file_links as tfl')
|
|
234
|
+
.join('m_files as f', 'tfl.file_id', 'f.id')
|
|
235
|
+
.where('tfl.task_id', result.task_id)
|
|
236
|
+
.select('f.path')
|
|
237
|
+
.orderBy('f.path');
|
|
229
238
|
assert.strictEqual(links.length, 3);
|
|
230
239
|
assert.strictEqual(links[0].path, 'docs/README.md');
|
|
231
240
|
assert.strictEqual(links[1].path, 'package.json');
|
|
232
241
|
assert.strictEqual(links[2].path, 'src/types.ts');
|
|
233
242
|
});
|
|
234
|
-
it('should work with acceptance_criteria', () => {
|
|
235
|
-
const result = createTaskWithWatchFiles(testDb, {
|
|
243
|
+
it('should work with acceptance_criteria', async () => {
|
|
244
|
+
const result = await createTaskWithWatchFiles(testDb, {
|
|
236
245
|
title: 'Task with auto-completion criteria',
|
|
237
246
|
acceptance_criteria: 'All tests passing',
|
|
238
247
|
watch_files: ['src/tests/tasks.watch-files-parameter.test.ts']
|
|
239
248
|
});
|
|
240
249
|
assert.ok(result.success);
|
|
241
250
|
assert.strictEqual(result.watched_files?.length, 1);
|
|
242
|
-
const
|
|
243
|
-
|
|
251
|
+
const knex = testDb.getKnex();
|
|
252
|
+
const details = await knex('t_task_details')
|
|
253
|
+
.where({ task_id: result.task_id })
|
|
254
|
+
.first('acceptance_criteria');
|
|
244
255
|
assert.ok(details);
|
|
245
256
|
assert.strictEqual(details.acceptance_criteria, 'All tests passing');
|
|
246
257
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.watch-files-parameter.test.js","sourceRoot":"","sources":["../../src/tests/tasks.watch-files-parameter.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.watch-files-parameter.test.js","sourceRoot":"","sources":["../../src/tests/tasks.watch-files-parameter.test.ts"],"names":[],"mappings":"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"}
|