sqlew 3.2.5 → 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 +288 -1011
- package/README.md +80 -263
- package/assets/config.example.toml +97 -0
- package/assets/schema.sql +6 -1
- 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 +46 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +155 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +86 -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 +44 -122
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +145 -349
- package/dist/database.js.map +1 -1
- package/dist/index.js +223 -175
- 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/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 +26 -12
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +162 -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.d.ts +6 -0
- package/dist/tests/git-aware-completion.test.d.ts.map +1 -0
- package/dist/tests/git-aware-completion.test.js +160 -0
- package/dist/tests/git-aware-completion.test.js.map +1 -0
- 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.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 +264 -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 +285 -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 +250 -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 +217 -0
- package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -0
- 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.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 +247 -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 +372 -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 +260 -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 +326 -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 +9 -4
- package/dist/tools/config.d.ts.map +1 -1
- package/dist/tools/config.js +16 -12
- package/dist/tools/config.js.map +1 -1
- package/dist/tools/constraints.d.ts +9 -3
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +66 -45
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts +35 -16
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +374 -314
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts +11 -4
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +173 -91
- 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 +13 -6
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +217 -129
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/tasks.d.ts +42 -12
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +809 -347
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +13 -5
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +92 -115
- 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/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/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/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/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 +13 -5
- package/dist/utils/retention.d.ts.map +1 -1
- package/dist/utils/retention.js +20 -8
- package/dist/utils/retention.js.map +1 -1
- package/dist/utils/task-stale-detection.d.ts +77 -7
- package/dist/utils/task-stale-detection.d.ts.map +1 -1
- package/dist/utils/task-stale-detection.js +309 -34
- 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/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/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 +54 -4
- package/dist/watcher/file-watcher.d.ts.map +1 -1
- package/dist/watcher/file-watcher.js +329 -33
- 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/BEST_PRACTICES.md +56 -448
- 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/MIGRATION_v3.6.0.md +170 -0
- package/docs/SHARED_CONCEPTS.md +65 -209
- package/docs/TASK_ACTIONS.md +12 -0
- package/docs/TASK_OVERVIEW.md +125 -24
- package/docs/TASK_PRUNING.md +589 -0
- package/docs/TASK_SYSTEM.md +83 -13
- package/docs/TOOL_REFERENCE.md +94 -6
- package/docs/TOOL_SELECTION.md +41 -248
- package/package.json +21 -7
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Help System Test Suite
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive tests for all help query actions to ensure:
|
|
5
|
+
* 1. All help queries return valid data
|
|
6
|
+
* 2. Error handling works correctly
|
|
7
|
+
* 3. Token efficiency targets are met
|
|
8
|
+
* 4. Database queries are performant
|
|
9
|
+
*/
|
|
10
|
+
import { initializeDatabase, getDatabase } from '../database.js';
|
|
11
|
+
import { queryHelpAction, queryHelpParams, queryHelpTool, queryHelpUseCase, queryHelpListUseCases, queryHelpNextActions } from '../tools/help-queries.js';
|
|
12
|
+
import { estimateTokens } from '../utils/token-estimation.js';
|
|
13
|
+
// Test configuration
|
|
14
|
+
const TEST_TOOLS = ['decision', 'task', 'message', 'file', 'constraint', 'config', 'stats'];
|
|
15
|
+
const TEST_ACTIONS = {
|
|
16
|
+
decision: ['set', 'get', 'list'],
|
|
17
|
+
task: ['create'],
|
|
18
|
+
message: ['send', 'get'],
|
|
19
|
+
file: ['record', 'get'],
|
|
20
|
+
constraint: ['add', 'get'],
|
|
21
|
+
config: ['get', 'update'],
|
|
22
|
+
stats: ['layer_summary', 'db_stats', 'clear']
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Test Suite Runner
|
|
26
|
+
*/
|
|
27
|
+
export async function runHelpSystemTests() {
|
|
28
|
+
const results = [];
|
|
29
|
+
let passed = 0;
|
|
30
|
+
let failed = 0;
|
|
31
|
+
// Initialize database
|
|
32
|
+
const dbPath = process.env.DB_PATH || 'src/.sqlew/tmp/test-knex.db';
|
|
33
|
+
await initializeDatabase({
|
|
34
|
+
databaseType: 'sqlite',
|
|
35
|
+
connection: { filename: dbPath }
|
|
36
|
+
});
|
|
37
|
+
const db = getDatabase();
|
|
38
|
+
console.log('\n🧪 Running Help System Test Suite\n');
|
|
39
|
+
// Test 1: help_action queries
|
|
40
|
+
console.log('Test Group 1: help_action queries');
|
|
41
|
+
for (const tool of TEST_TOOLS) {
|
|
42
|
+
const actions = TEST_ACTIONS[tool] || ['set', 'get'];
|
|
43
|
+
for (const action of actions) {
|
|
44
|
+
try {
|
|
45
|
+
const result = queryHelpAction(db, tool, action);
|
|
46
|
+
if ('error' in result) {
|
|
47
|
+
results.push({
|
|
48
|
+
test: `help_action: ${tool}.${action}`,
|
|
49
|
+
status: 'FAIL',
|
|
50
|
+
message: result.error
|
|
51
|
+
});
|
|
52
|
+
failed++;
|
|
53
|
+
console.log(` ❌ ${tool}.${action}: ${result.error}`);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const tokens = estimateTokens(result);
|
|
57
|
+
const isEfficient = tokens >= 50 && tokens <= 450;
|
|
58
|
+
if (isEfficient) {
|
|
59
|
+
results.push({
|
|
60
|
+
test: `help_action: ${tool}.${action}`,
|
|
61
|
+
status: 'PASS',
|
|
62
|
+
tokens
|
|
63
|
+
});
|
|
64
|
+
passed++;
|
|
65
|
+
console.log(` ✅ ${tool}.${action}: ${tokens} tokens`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
results.push({
|
|
69
|
+
test: `help_action: ${tool}.${action}`,
|
|
70
|
+
status: 'FAIL',
|
|
71
|
+
message: `Token count ${tokens} outside target range (50-450)`,
|
|
72
|
+
tokens
|
|
73
|
+
});
|
|
74
|
+
failed++;
|
|
75
|
+
console.log(` ❌ ${tool}.${action}: ${tokens} tokens (outside range)`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
81
|
+
results.push({
|
|
82
|
+
test: `help_action: ${tool}.${action}`,
|
|
83
|
+
status: 'FAIL',
|
|
84
|
+
message
|
|
85
|
+
});
|
|
86
|
+
failed++;
|
|
87
|
+
console.log(` ❌ ${tool}.${action}: ${message}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Test 2: help_params queries
|
|
92
|
+
console.log('\nTest Group 2: help_params queries');
|
|
93
|
+
for (const tool of TEST_TOOLS.slice(0, 3)) { // Test subset
|
|
94
|
+
const actions = TEST_ACTIONS[tool] || ['set'];
|
|
95
|
+
for (const action of actions.slice(0, 1)) {
|
|
96
|
+
try {
|
|
97
|
+
const result = queryHelpParams(db, tool, action);
|
|
98
|
+
if ('error' in result) {
|
|
99
|
+
results.push({
|
|
100
|
+
test: `help_params: ${tool}.${action}`,
|
|
101
|
+
status: 'FAIL',
|
|
102
|
+
message: result.error
|
|
103
|
+
});
|
|
104
|
+
failed++;
|
|
105
|
+
console.log(` ❌ ${tool}.${action}: ${result.error}`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const tokens = estimateTokens(result);
|
|
109
|
+
const isEfficient = tokens >= 30 && tokens <= 350;
|
|
110
|
+
if (isEfficient) {
|
|
111
|
+
results.push({
|
|
112
|
+
test: `help_params: ${tool}.${action}`,
|
|
113
|
+
status: 'PASS',
|
|
114
|
+
tokens
|
|
115
|
+
});
|
|
116
|
+
passed++;
|
|
117
|
+
console.log(` ✅ ${tool}.${action}: ${tokens} tokens`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
results.push({
|
|
121
|
+
test: `help_params: ${tool}.${action}`,
|
|
122
|
+
status: 'FAIL',
|
|
123
|
+
message: `Token count ${tokens} outside target range (30-350)`,
|
|
124
|
+
tokens
|
|
125
|
+
});
|
|
126
|
+
failed++;
|
|
127
|
+
console.log(` ❌ ${tool}.${action}: ${tokens} tokens (outside range)`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
133
|
+
results.push({
|
|
134
|
+
test: `help_params: ${tool}.${action}`,
|
|
135
|
+
status: 'FAIL',
|
|
136
|
+
message
|
|
137
|
+
});
|
|
138
|
+
failed++;
|
|
139
|
+
console.log(` ❌ ${tool}.${action}: ${message}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Test 3: help_tool queries
|
|
144
|
+
console.log('\nTest Group 3: help_tool queries');
|
|
145
|
+
for (const tool of TEST_TOOLS) {
|
|
146
|
+
try {
|
|
147
|
+
const result = queryHelpTool(db, tool);
|
|
148
|
+
if ('error' in result) {
|
|
149
|
+
results.push({
|
|
150
|
+
test: `help_tool: ${tool}`,
|
|
151
|
+
status: 'FAIL',
|
|
152
|
+
message: result.error
|
|
153
|
+
});
|
|
154
|
+
failed++;
|
|
155
|
+
console.log(` ❌ ${tool}: ${result.error}`);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const tokens = estimateTokens(result);
|
|
159
|
+
const isEfficient = tokens >= 80 && tokens <= 300;
|
|
160
|
+
if (isEfficient) {
|
|
161
|
+
results.push({
|
|
162
|
+
test: `help_tool: ${tool}`,
|
|
163
|
+
status: 'PASS',
|
|
164
|
+
tokens
|
|
165
|
+
});
|
|
166
|
+
passed++;
|
|
167
|
+
console.log(` ✅ ${tool}: ${tokens} tokens`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
results.push({
|
|
171
|
+
test: `help_tool: ${tool}`,
|
|
172
|
+
status: 'FAIL',
|
|
173
|
+
message: `Token count ${tokens} outside target range (80-300)`,
|
|
174
|
+
tokens
|
|
175
|
+
});
|
|
176
|
+
failed++;
|
|
177
|
+
console.log(` ❌ ${tool}: ${tokens} tokens (outside range)`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
183
|
+
results.push({
|
|
184
|
+
test: `help_tool: ${tool}`,
|
|
185
|
+
status: 'FAIL',
|
|
186
|
+
message
|
|
187
|
+
});
|
|
188
|
+
failed++;
|
|
189
|
+
console.log(` ❌ ${tool}: ${message}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Test 4: help_use_case queries
|
|
193
|
+
console.log('\nTest Group 4: help_use_case queries');
|
|
194
|
+
const useCaseIds = [1, 2, 3, 10, 20, 30]; // Test various IDs
|
|
195
|
+
for (const id of useCaseIds) {
|
|
196
|
+
try {
|
|
197
|
+
const result = queryHelpUseCase(db, id);
|
|
198
|
+
if ('error' in result) {
|
|
199
|
+
// Expected for non-existent IDs
|
|
200
|
+
if (id > 41) {
|
|
201
|
+
results.push({
|
|
202
|
+
test: `help_use_case: ID ${id} (expected fail)`,
|
|
203
|
+
status: 'PASS'
|
|
204
|
+
});
|
|
205
|
+
passed++;
|
|
206
|
+
console.log(` ✅ ID ${id}: Error handling works`);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
results.push({
|
|
210
|
+
test: `help_use_case: ID ${id}`,
|
|
211
|
+
status: 'FAIL',
|
|
212
|
+
message: result.error
|
|
213
|
+
});
|
|
214
|
+
failed++;
|
|
215
|
+
console.log(` ❌ ID ${id}: ${result.error}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const tokens = estimateTokens(result);
|
|
220
|
+
const isEfficient = tokens >= 80 && tokens <= 350;
|
|
221
|
+
if (isEfficient) {
|
|
222
|
+
results.push({
|
|
223
|
+
test: `help_use_case: ID ${id}`,
|
|
224
|
+
status: 'PASS',
|
|
225
|
+
tokens
|
|
226
|
+
});
|
|
227
|
+
passed++;
|
|
228
|
+
console.log(` ✅ ID ${id}: ${tokens} tokens`);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
results.push({
|
|
232
|
+
test: `help_use_case: ID ${id}`,
|
|
233
|
+
status: 'FAIL',
|
|
234
|
+
message: `Token count ${tokens} outside target range (80-350)`,
|
|
235
|
+
tokens
|
|
236
|
+
});
|
|
237
|
+
failed++;
|
|
238
|
+
console.log(` ❌ ID ${id}: ${tokens} tokens (outside range)`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
244
|
+
results.push({
|
|
245
|
+
test: `help_use_case: ID ${id}`,
|
|
246
|
+
status: 'FAIL',
|
|
247
|
+
message
|
|
248
|
+
});
|
|
249
|
+
failed++;
|
|
250
|
+
console.log(` ❌ ID ${id}: ${message}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Test 5: help_list_use_cases queries
|
|
254
|
+
console.log('\nTest Group 5: help_list_use_cases queries');
|
|
255
|
+
const listTests = [
|
|
256
|
+
{ name: 'all', params: {} },
|
|
257
|
+
{ name: 'by category', params: { category: 'task_management' } },
|
|
258
|
+
{ name: 'by complexity', params: { complexity: 'basic' } },
|
|
259
|
+
{ name: 'pagination', params: { limit: 5, offset: 0 } },
|
|
260
|
+
];
|
|
261
|
+
for (const test of listTests) {
|
|
262
|
+
try {
|
|
263
|
+
const result = queryHelpListUseCases(db, test.params);
|
|
264
|
+
if ('error' in result) {
|
|
265
|
+
results.push({
|
|
266
|
+
test: `help_list_use_cases: ${test.name}`,
|
|
267
|
+
status: 'FAIL',
|
|
268
|
+
message: result.error
|
|
269
|
+
});
|
|
270
|
+
failed++;
|
|
271
|
+
console.log(` ❌ ${test.name}: ${result.error}`);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
const tokens = estimateTokens(result);
|
|
275
|
+
const isEfficient = tokens >= 100 && tokens <= 700;
|
|
276
|
+
if (isEfficient) {
|
|
277
|
+
results.push({
|
|
278
|
+
test: `help_list_use_cases: ${test.name}`,
|
|
279
|
+
status: 'PASS',
|
|
280
|
+
tokens
|
|
281
|
+
});
|
|
282
|
+
passed++;
|
|
283
|
+
console.log(` ✅ ${test.name}: ${tokens} tokens`);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
results.push({
|
|
287
|
+
test: `help_list_use_cases: ${test.name}`,
|
|
288
|
+
status: 'FAIL',
|
|
289
|
+
message: `Token count ${tokens} outside target range (100-700)`,
|
|
290
|
+
tokens
|
|
291
|
+
});
|
|
292
|
+
failed++;
|
|
293
|
+
console.log(` ❌ ${test.name}: ${tokens} tokens (outside range)`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
299
|
+
results.push({
|
|
300
|
+
test: `help_list_use_cases: ${test.name}`,
|
|
301
|
+
status: 'FAIL',
|
|
302
|
+
message
|
|
303
|
+
});
|
|
304
|
+
failed++;
|
|
305
|
+
console.log(` ❌ ${test.name}: ${message}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Test 6: help_next_actions queries
|
|
309
|
+
console.log('\nTest Group 6: help_next_actions queries');
|
|
310
|
+
const nextActionsTests = [
|
|
311
|
+
{ tool: 'decision', action: 'set' },
|
|
312
|
+
{ tool: 'task', action: 'create' },
|
|
313
|
+
{ tool: 'message', action: 'send' }
|
|
314
|
+
];
|
|
315
|
+
for (const test of nextActionsTests) {
|
|
316
|
+
try {
|
|
317
|
+
const result = queryHelpNextActions(db, test.tool, test.action);
|
|
318
|
+
if ('error' in result) {
|
|
319
|
+
results.push({
|
|
320
|
+
test: `help_next_actions: ${test.tool}.${test.action}`,
|
|
321
|
+
status: 'FAIL',
|
|
322
|
+
message: result.error
|
|
323
|
+
});
|
|
324
|
+
failed++;
|
|
325
|
+
console.log(` ❌ ${test.tool}.${test.action}: ${result.error}`);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
const tokens = estimateTokens(result);
|
|
329
|
+
const isEfficient = tokens >= 30 && tokens <= 150;
|
|
330
|
+
if (isEfficient) {
|
|
331
|
+
results.push({
|
|
332
|
+
test: `help_next_actions: ${test.tool}.${test.action}`,
|
|
333
|
+
status: 'PASS',
|
|
334
|
+
tokens
|
|
335
|
+
});
|
|
336
|
+
passed++;
|
|
337
|
+
console.log(` ✅ ${test.tool}.${test.action}: ${tokens} tokens`);
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
results.push({
|
|
341
|
+
test: `help_next_actions: ${test.tool}.${test.action}`,
|
|
342
|
+
status: 'FAIL',
|
|
343
|
+
message: `Token count ${tokens} outside target range (30-150)`,
|
|
344
|
+
tokens
|
|
345
|
+
});
|
|
346
|
+
failed++;
|
|
347
|
+
console.log(` ❌ ${test.tool}.${test.action}: ${tokens} tokens (outside range)`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
353
|
+
results.push({
|
|
354
|
+
test: `help_next_actions: ${test.tool}.${test.action}`,
|
|
355
|
+
status: 'FAIL',
|
|
356
|
+
message
|
|
357
|
+
});
|
|
358
|
+
failed++;
|
|
359
|
+
console.log(` ❌ ${test.tool}.${test.action}: ${message}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// Summary
|
|
363
|
+
console.log('\n' + '='.repeat(60));
|
|
364
|
+
console.log(`Test Summary: ${passed} passed, ${failed} failed`);
|
|
365
|
+
console.log('='.repeat(60) + '\n');
|
|
366
|
+
return { passed, failed, results };
|
|
367
|
+
}
|
|
368
|
+
// Run tests if executed directly
|
|
369
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
370
|
+
runHelpSystemTests().then(result => {
|
|
371
|
+
process.exit(result.failed > 0 ? 1 : 0);
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=help-system.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-system.test.js","sourceRoot":"","sources":["../../src/tests/help-system.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,264 @@
|
|
|
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 { initializeDatabase } from '../database.js';
|
|
8
|
+
import { getOrCreateAgent } from '../database.js';
|
|
9
|
+
import { setDecision } from '../tools/context.js';
|
|
10
|
+
import { getPrunedFiles, linkPrunedFile } from '../tools/tasks.js';
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
/**
|
|
14
|
+
* Test database instance
|
|
15
|
+
*/
|
|
16
|
+
let testDb;
|
|
17
|
+
/**
|
|
18
|
+
* Create an in-memory test database
|
|
19
|
+
*/
|
|
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;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Helper: Create a test task
|
|
35
|
+
*/
|
|
36
|
+
async function createTestTask(adapter, title) {
|
|
37
|
+
const agentId = await getOrCreateAgent(adapter, 'test-agent');
|
|
38
|
+
const statusId = 2; // in_progress
|
|
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;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Helper: Create a pruned file record
|
|
51
|
+
*/
|
|
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;
|
|
60
|
+
}
|
|
61
|
+
describe('Auto-pruning: Decision linking workflow', () => {
|
|
62
|
+
beforeEach(async () => {
|
|
63
|
+
testDb = await createTestDatabase();
|
|
64
|
+
});
|
|
65
|
+
it('should link decisions to pruned files for WHY reasoning', async () => {
|
|
66
|
+
// 1. Setup: Create task with pruned file
|
|
67
|
+
const taskId = await createTestTask(testDb, 'Implement OAuth authentication');
|
|
68
|
+
const prunedFileId = await createPrunedFileRecord(testDb, taskId, 'src/auth/oauth-handler.ts');
|
|
69
|
+
// 2. Create decision explaining why file wasn't created
|
|
70
|
+
const decisionResult = await setDecision({
|
|
71
|
+
key: 'oauth-not-implemented',
|
|
72
|
+
value: 'Decided to use API key auth instead of OAuth for simplicity',
|
|
73
|
+
tags: ['architecture', 'authentication'],
|
|
74
|
+
status: 'active'
|
|
75
|
+
}, testDb);
|
|
76
|
+
assert.ok(decisionResult.success, 'Decision creation should succeed');
|
|
77
|
+
assert.strictEqual(decisionResult.key, 'oauth-not-implemented');
|
|
78
|
+
// 3. Link decision to pruned file
|
|
79
|
+
const linkResult = await linkPrunedFile({
|
|
80
|
+
pruned_file_id: prunedFileId,
|
|
81
|
+
decision_key: 'oauth-not-implemented'
|
|
82
|
+
}, testDb);
|
|
83
|
+
assert.ok(linkResult.success, 'Decision linking should succeed');
|
|
84
|
+
assert.strictEqual(linkResult.pruned_file_id, prunedFileId);
|
|
85
|
+
assert.strictEqual(linkResult.decision_key, 'oauth-not-implemented');
|
|
86
|
+
assert.strictEqual(linkResult.task_id, taskId);
|
|
87
|
+
assert.strictEqual(linkResult.file_path, 'src/auth/oauth-handler.ts');
|
|
88
|
+
// 4. Verify link in database directly
|
|
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();
|
|
94
|
+
assert.ok(linkedDecisionId, 'Pruned file record should exist');
|
|
95
|
+
assert.ok(linkedDecisionId.linked_decision_key_id !== null, 'Decision key ID should be linked');
|
|
96
|
+
// 5. Query pruned files - decision key should be returned
|
|
97
|
+
const getPrunedResult = await getPrunedFiles({
|
|
98
|
+
task_id: taskId,
|
|
99
|
+
limit: 100
|
|
100
|
+
}, testDb);
|
|
101
|
+
assert.ok(getPrunedResult.success, 'get_pruned_files should succeed');
|
|
102
|
+
assert.strictEqual(getPrunedResult.task_id, taskId);
|
|
103
|
+
assert.strictEqual(getPrunedResult.count, 1, 'Should return 1 pruned file');
|
|
104
|
+
assert.strictEqual(getPrunedResult.pruned_files.length, 1, 'pruned_files array should have 1 item');
|
|
105
|
+
const prunedFile = getPrunedResult.pruned_files[0];
|
|
106
|
+
assert.strictEqual(prunedFile.id, prunedFileId, 'Pruned file ID should match');
|
|
107
|
+
assert.strictEqual(prunedFile.file_path, 'src/auth/oauth-handler.ts', 'File path should match');
|
|
108
|
+
assert.ok(prunedFile.pruned_at, 'Should have pruned_at timestamp');
|
|
109
|
+
assert.ok(prunedFile.linked_decision, 'Should have linked_decision key');
|
|
110
|
+
assert.strictEqual(prunedFile.linked_decision, 'oauth-not-implemented', 'Linked decision key should match');
|
|
111
|
+
});
|
|
112
|
+
it('should handle multiple pruned files with different decisions', async () => {
|
|
113
|
+
const taskId = await createTestTask(testDb, 'Feature implementation');
|
|
114
|
+
// Create pruned files
|
|
115
|
+
const prunedFileId1 = await createPrunedFileRecord(testDb, taskId, 'src/oauth-handler.ts');
|
|
116
|
+
const prunedFileId2 = await createPrunedFileRecord(testDb, taskId, 'src/ldap-connector.ts');
|
|
117
|
+
// Create decisions
|
|
118
|
+
await setDecision({
|
|
119
|
+
key: 'no-oauth',
|
|
120
|
+
value: 'OAuth not needed for MVP',
|
|
121
|
+
status: 'active'
|
|
122
|
+
}, testDb);
|
|
123
|
+
await setDecision({
|
|
124
|
+
key: 'no-ldap',
|
|
125
|
+
value: 'LDAP integration deferred to Phase 2',
|
|
126
|
+
status: 'active'
|
|
127
|
+
}, testDb);
|
|
128
|
+
// Link decisions
|
|
129
|
+
await linkPrunedFile({
|
|
130
|
+
pruned_file_id: prunedFileId1,
|
|
131
|
+
decision_key: 'no-oauth'
|
|
132
|
+
}, testDb);
|
|
133
|
+
await linkPrunedFile({
|
|
134
|
+
pruned_file_id: prunedFileId2,
|
|
135
|
+
decision_key: 'no-ldap'
|
|
136
|
+
}, testDb);
|
|
137
|
+
// Verify
|
|
138
|
+
const getPrunedResult = await getPrunedFiles({
|
|
139
|
+
task_id: taskId
|
|
140
|
+
}, testDb);
|
|
141
|
+
assert.strictEqual(getPrunedResult.count, 2, 'Should have 2 pruned files');
|
|
142
|
+
const file1 = getPrunedResult.pruned_files.find((f) => f.file_path === 'src/oauth-handler.ts');
|
|
143
|
+
const file2 = getPrunedResult.pruned_files.find((f) => f.file_path === 'src/ldap-connector.ts');
|
|
144
|
+
assert.ok(file1, 'Should find oauth-handler.ts');
|
|
145
|
+
assert.ok(file2, 'Should find ldap-connector.ts');
|
|
146
|
+
assert.strictEqual(file1?.linked_decision, 'no-oauth');
|
|
147
|
+
assert.strictEqual(file2?.linked_decision, 'no-ldap');
|
|
148
|
+
});
|
|
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({
|
|
153
|
+
task_id: taskId
|
|
154
|
+
}, testDb);
|
|
155
|
+
assert.ok(getPrunedResult.success);
|
|
156
|
+
assert.strictEqual(getPrunedResult.count, 1);
|
|
157
|
+
const prunedFile = getPrunedResult.pruned_files[0];
|
|
158
|
+
assert.strictEqual(prunedFile.linked_decision, null, 'Unlinked file should have null decision');
|
|
159
|
+
});
|
|
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');
|
|
163
|
+
// Attempt to link non-existent decision
|
|
164
|
+
await assert.rejects(async () => {
|
|
165
|
+
await linkPrunedFile({
|
|
166
|
+
pruned_file_id: prunedFileId,
|
|
167
|
+
decision_key: 'does-not-exist'
|
|
168
|
+
}, testDb);
|
|
169
|
+
}, /Decision not found: does-not-exist/, 'Should throw error for non-existent decision');
|
|
170
|
+
});
|
|
171
|
+
it('should handle linking to non-existent pruned file gracefully', async () => {
|
|
172
|
+
// Create decision
|
|
173
|
+
await setDecision({
|
|
174
|
+
key: 'test-decision',
|
|
175
|
+
value: 'Test decision value',
|
|
176
|
+
status: 'active'
|
|
177
|
+
}, testDb);
|
|
178
|
+
// Attempt to link non-existent pruned file
|
|
179
|
+
await assert.rejects(async () => {
|
|
180
|
+
await linkPrunedFile({
|
|
181
|
+
pruned_file_id: 99999,
|
|
182
|
+
decision_key: 'test-decision'
|
|
183
|
+
}, testDb);
|
|
184
|
+
}, /Pruned file record not found: 99999/, 'Should throw error for non-existent pruned file');
|
|
185
|
+
});
|
|
186
|
+
it('should validate required parameters for linkPrunedFile', async () => {
|
|
187
|
+
// Missing pruned_file_id
|
|
188
|
+
await assert.rejects(async () => {
|
|
189
|
+
await linkPrunedFile({
|
|
190
|
+
pruned_file_id: 0,
|
|
191
|
+
decision_key: 'test'
|
|
192
|
+
}, testDb);
|
|
193
|
+
}, /pruned_file_id is required and must be a number/, 'Should throw for invalid pruned_file_id');
|
|
194
|
+
// Missing decision_key
|
|
195
|
+
await assert.rejects(async () => {
|
|
196
|
+
await linkPrunedFile({
|
|
197
|
+
pruned_file_id: 1,
|
|
198
|
+
decision_key: ''
|
|
199
|
+
}, testDb);
|
|
200
|
+
}, /decision_key is required and must be a string/, 'Should throw for empty decision_key');
|
|
201
|
+
});
|
|
202
|
+
it('should validate required parameters for getPrunedFiles', async () => {
|
|
203
|
+
// Missing task_id
|
|
204
|
+
await assert.rejects(async () => {
|
|
205
|
+
await getPrunedFiles({
|
|
206
|
+
task_id: 0
|
|
207
|
+
}, testDb);
|
|
208
|
+
}, /task_id is required and must be a number/, 'Should throw for invalid task_id');
|
|
209
|
+
// Non-existent task
|
|
210
|
+
await assert.rejects(async () => {
|
|
211
|
+
await getPrunedFiles({
|
|
212
|
+
task_id: 99999
|
|
213
|
+
}, testDb);
|
|
214
|
+
}, /Task not found: 99999/, 'Should throw for non-existent task');
|
|
215
|
+
});
|
|
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');
|
|
219
|
+
// Create two decisions
|
|
220
|
+
await setDecision({
|
|
221
|
+
key: 'decision-v1',
|
|
222
|
+
value: 'Initial decision',
|
|
223
|
+
status: 'active'
|
|
224
|
+
}, testDb);
|
|
225
|
+
await setDecision({
|
|
226
|
+
key: 'decision-v2',
|
|
227
|
+
value: 'Updated decision',
|
|
228
|
+
status: 'active'
|
|
229
|
+
}, testDb);
|
|
230
|
+
// Link first decision
|
|
231
|
+
await linkPrunedFile({
|
|
232
|
+
pruned_file_id: prunedFileId,
|
|
233
|
+
decision_key: 'decision-v1'
|
|
234
|
+
}, testDb);
|
|
235
|
+
// Verify first link
|
|
236
|
+
let getPrunedResult = await getPrunedFiles({ task_id: taskId }, testDb);
|
|
237
|
+
assert.strictEqual(getPrunedResult.pruned_files[0].linked_decision, 'decision-v1');
|
|
238
|
+
// Update to second decision
|
|
239
|
+
await linkPrunedFile({
|
|
240
|
+
pruned_file_id: prunedFileId,
|
|
241
|
+
decision_key: 'decision-v2'
|
|
242
|
+
}, testDb);
|
|
243
|
+
// Verify updated link
|
|
244
|
+
getPrunedResult = await getPrunedFiles({ task_id: taskId }, testDb);
|
|
245
|
+
assert.strictEqual(getPrunedResult.pruned_files[0].linked_decision, 'decision-v2');
|
|
246
|
+
});
|
|
247
|
+
it('should respect limit parameter in getPrunedFiles', async () => {
|
|
248
|
+
const taskId = await createTestTask(testDb, 'Task with many pruned files');
|
|
249
|
+
// Create 5 pruned files
|
|
250
|
+
for (let i = 1; i <= 5; i++) {
|
|
251
|
+
await createPrunedFileRecord(testDb, taskId, `src/file${i}.ts`);
|
|
252
|
+
}
|
|
253
|
+
// Query with limit
|
|
254
|
+
const getPrunedResult = await getPrunedFiles({
|
|
255
|
+
task_id: taskId,
|
|
256
|
+
limit: 3
|
|
257
|
+
}, testDb);
|
|
258
|
+
assert.ok(getPrunedResult.success);
|
|
259
|
+
assert.strictEqual(getPrunedResult.count, 3, 'Should respect limit parameter');
|
|
260
|
+
assert.strictEqual(getPrunedResult.pruned_files.length, 3);
|
|
261
|
+
});
|
|
262
|
+
console.log('\n✅ All decision linking to pruned files tests passed!\n');
|
|
263
|
+
});
|
|
264
|
+
//# sourceMappingURL=tasks.auto-pruning-decision-link.test.js.map
|