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.
Files changed (291) hide show
  1. package/CHANGELOG.md +288 -1011
  2. package/README.md +80 -263
  3. package/assets/config.example.toml +97 -0
  4. package/assets/schema.sql +6 -1
  5. package/dist/adapters/index.d.ts +11 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +21 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/mysql-adapter.d.ts +31 -0
  10. package/dist/adapters/mysql-adapter.d.ts.map +1 -0
  11. package/dist/adapters/mysql-adapter.js +63 -0
  12. package/dist/adapters/mysql-adapter.js.map +1 -0
  13. package/dist/adapters/postgresql-adapter.d.ts +31 -0
  14. package/dist/adapters/postgresql-adapter.d.ts.map +1 -0
  15. package/dist/adapters/postgresql-adapter.js +63 -0
  16. package/dist/adapters/postgresql-adapter.js.map +1 -0
  17. package/dist/adapters/sqlite-adapter.d.ts +37 -0
  18. package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
  19. package/dist/adapters/sqlite-adapter.js +129 -0
  20. package/dist/adapters/sqlite-adapter.js.map +1 -0
  21. package/dist/adapters/types.d.ts +33 -0
  22. package/dist/adapters/types.d.ts.map +1 -0
  23. package/dist/adapters/types.js +2 -0
  24. package/dist/adapters/types.js.map +1 -0
  25. package/dist/cli.js +55 -54
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config/example-generator.d.ts +11 -0
  28. package/dist/config/example-generator.d.ts.map +1 -0
  29. package/dist/config/example-generator.js +48 -0
  30. package/dist/config/example-generator.js.map +1 -0
  31. package/dist/config/loader.d.ts +46 -0
  32. package/dist/config/loader.d.ts.map +1 -0
  33. package/dist/config/loader.js +155 -0
  34. package/dist/config/loader.js.map +1 -0
  35. package/dist/config/types.d.ts +86 -0
  36. package/dist/config/types.d.ts.map +1 -0
  37. package/dist/config/types.js +28 -0
  38. package/dist/config/types.js.map +1 -0
  39. package/dist/constants.d.ts +9 -0
  40. package/dist/constants.d.ts.map +1 -1
  41. package/dist/constants.js +10 -0
  42. package/dist/constants.js.map +1 -1
  43. package/dist/database.d.ts +44 -122
  44. package/dist/database.d.ts.map +1 -1
  45. package/dist/database.js +145 -349
  46. package/dist/database.js.map +1 -1
  47. package/dist/index.js +223 -175
  48. package/dist/index.js.map +1 -1
  49. package/dist/knexfile.d.ts +6 -0
  50. package/dist/knexfile.d.ts.map +1 -0
  51. package/dist/knexfile.js +85 -0
  52. package/dist/knexfile.js.map +1 -0
  53. package/dist/migrations/add-help-system-tables.d.ts +35 -0
  54. package/dist/migrations/add-help-system-tables.d.ts.map +1 -0
  55. package/dist/migrations/add-help-system-tables.js +206 -0
  56. package/dist/migrations/add-help-system-tables.js.map +1 -0
  57. package/dist/migrations/add-token-tracking.d.ts +28 -0
  58. package/dist/migrations/add-token-tracking.d.ts.map +1 -0
  59. package/dist/migrations/add-token-tracking.js +108 -0
  60. package/dist/migrations/add-token-tracking.js.map +1 -0
  61. package/dist/migrations/add-v3.5.0-pruned-files.d.ts +26 -0
  62. package/dist/migrations/add-v3.5.0-pruned-files.d.ts.map +1 -0
  63. package/dist/migrations/add-v3.5.0-pruned-files.js +107 -0
  64. package/dist/migrations/add-v3.5.0-pruned-files.js.map +1 -0
  65. package/dist/migrations/index.d.ts +26 -12
  66. package/dist/migrations/index.d.ts.map +1 -1
  67. package/dist/migrations/index.js +162 -20
  68. package/dist/migrations/index.js.map +1 -1
  69. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts +4 -0
  70. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts.map +1 -0
  71. package/dist/migrations/knex/20251025020452_create_master_tables.js +65 -0
  72. package/dist/migrations/knex/20251025020452_create_master_tables.js.map +1 -0
  73. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts +4 -0
  74. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts.map +1 -0
  75. package/dist/migrations/knex/20251025021152_create_transaction_tables.js +235 -0
  76. package/dist/migrations/knex/20251025021152_create_transaction_tables.js.map +1 -0
  77. package/dist/migrations/knex/20251025021351_create_indexes.d.ts +4 -0
  78. package/dist/migrations/knex/20251025021351_create_indexes.d.ts.map +1 -0
  79. package/dist/migrations/knex/20251025021351_create_indexes.js +62 -0
  80. package/dist/migrations/knex/20251025021351_create_indexes.js.map +1 -0
  81. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts +4 -0
  82. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts.map +1 -0
  83. package/dist/migrations/knex/20251025021416_seed_master_data.js +58 -0
  84. package/dist/migrations/knex/20251025021416_seed_master_data.js.map +1 -0
  85. package/dist/migrations/knex/20251025070349_create_views.d.ts +4 -0
  86. package/dist/migrations/knex/20251025070349_create_views.d.ts.map +1 -0
  87. package/dist/migrations/knex/20251025070349_create_views.js +143 -0
  88. package/dist/migrations/knex/20251025070349_create_views.js.map +1 -0
  89. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts +4 -0
  90. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
  91. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js +15 -0
  92. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
  93. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts +8 -0
  94. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
  95. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js +12 -0
  96. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js.map +1 -0
  97. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts +19 -0
  98. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts.map +1 -0
  99. package/dist/migrations/knex/20251025090000_create_help_system_tables.js +115 -0
  100. package/dist/migrations/knex/20251025090000_create_help_system_tables.js.map +1 -0
  101. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts +13 -0
  102. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
  103. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js +377 -0
  104. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
  105. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts +15 -0
  106. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts.map +1 -0
  107. package/dist/migrations/knex/20251025100000_seed_help_metadata.js +253 -0
  108. package/dist/migrations/knex/20251025100000_seed_help_metadata.js.map +1 -0
  109. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts +16 -0
  110. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
  111. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js +276 -0
  112. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js.map +1 -0
  113. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts +8 -0
  114. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
  115. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js +64 -0
  116. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
  117. package/dist/migrations/seed-help-data.d.ts +48 -0
  118. package/dist/migrations/seed-help-data.d.ts.map +1 -0
  119. package/dist/migrations/seed-help-data.js +1466 -0
  120. package/dist/migrations/seed-help-data.js.map +1 -0
  121. package/dist/migrations/seed-tool-metadata.d.ts +24 -0
  122. package/dist/migrations/seed-tool-metadata.d.ts.map +1 -0
  123. package/dist/migrations/seed-tool-metadata.js +392 -0
  124. package/dist/migrations/seed-tool-metadata.js.map +1 -0
  125. package/dist/migrations/v3.6.0-help-system-refactor.d.ts +46 -0
  126. package/dist/migrations/v3.6.0-help-system-refactor.d.ts.map +1 -0
  127. package/dist/migrations/v3.6.0-help-system-refactor.js +223 -0
  128. package/dist/migrations/v3.6.0-help-system-refactor.js.map +1 -0
  129. package/dist/schema.d.ts.map +1 -1
  130. package/dist/schema.js +2 -0
  131. package/dist/schema.js.map +1 -1
  132. package/dist/tests/git-aware-completion.test.d.ts +6 -0
  133. package/dist/tests/git-aware-completion.test.d.ts.map +1 -0
  134. package/dist/tests/git-aware-completion.test.js +160 -0
  135. package/dist/tests/git-aware-completion.test.js.map +1 -0
  136. package/dist/tests/help-system.test.d.ts +23 -0
  137. package/dist/tests/help-system.test.d.ts.map +1 -0
  138. package/dist/tests/help-system.test.js +374 -0
  139. package/dist/tests/help-system.test.js.map +1 -0
  140. package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts +6 -0
  141. package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts.map +1 -0
  142. package/dist/tests/tasks.auto-pruning-decision-link.test.js +264 -0
  143. package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -0
  144. package/dist/tests/tasks.auto-pruning-partial.test.d.ts +6 -0
  145. package/dist/tests/tasks.auto-pruning-partial.test.d.ts.map +1 -0
  146. package/dist/tests/tasks.auto-pruning-partial.test.js +285 -0
  147. package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -0
  148. package/dist/tests/tasks.auto-pruning-persistence.test.d.ts +6 -0
  149. package/dist/tests/tasks.auto-pruning-persistence.test.d.ts.map +1 -0
  150. package/dist/tests/tasks.auto-pruning-persistence.test.js +250 -0
  151. package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -0
  152. package/dist/tests/tasks.auto-pruning-safety.test.d.ts +12 -0
  153. package/dist/tests/tasks.auto-pruning-safety.test.d.ts.map +1 -0
  154. package/dist/tests/tasks.auto-pruning-safety.test.js +217 -0
  155. package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -0
  156. package/dist/tests/tasks.dependencies.test.js +338 -307
  157. package/dist/tests/tasks.dependencies.test.js.map +1 -1
  158. package/dist/tests/tasks.link-file-backward-compat.test.d.ts +6 -0
  159. package/dist/tests/tasks.link-file-backward-compat.test.d.ts.map +1 -0
  160. package/dist/tests/tasks.link-file-backward-compat.test.js +247 -0
  161. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -0
  162. package/dist/tests/tasks.watch-files-action.test.d.ts +6 -0
  163. package/dist/tests/tasks.watch-files-action.test.d.ts.map +1 -0
  164. package/dist/tests/tasks.watch-files-action.test.js +372 -0
  165. package/dist/tests/tasks.watch-files-action.test.js.map +1 -0
  166. package/dist/tests/tasks.watch-files-parameter.test.d.ts +6 -0
  167. package/dist/tests/tasks.watch-files-parameter.test.d.ts.map +1 -0
  168. package/dist/tests/tasks.watch-files-parameter.test.js +260 -0
  169. package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -0
  170. package/dist/tests/two-step-git-completion.test.d.ts +6 -0
  171. package/dist/tests/two-step-git-completion.test.d.ts.map +1 -0
  172. package/dist/tests/two-step-git-completion.test.js +326 -0
  173. package/dist/tests/two-step-git-completion.test.js.map +1 -0
  174. package/dist/tests/vcs-staging.test.d.ts +6 -0
  175. package/dist/tests/vcs-staging.test.d.ts.map +1 -0
  176. package/dist/tests/vcs-staging.test.js +137 -0
  177. package/dist/tests/vcs-staging.test.js.map +1 -0
  178. package/dist/tools/config.d.ts +9 -4
  179. package/dist/tools/config.d.ts.map +1 -1
  180. package/dist/tools/config.js +16 -12
  181. package/dist/tools/config.js.map +1 -1
  182. package/dist/tools/constraints.d.ts +9 -3
  183. package/dist/tools/constraints.d.ts.map +1 -1
  184. package/dist/tools/constraints.js +66 -45
  185. package/dist/tools/constraints.js.map +1 -1
  186. package/dist/tools/context.d.ts +35 -16
  187. package/dist/tools/context.d.ts.map +1 -1
  188. package/dist/tools/context.js +374 -314
  189. package/dist/tools/context.js.map +1 -1
  190. package/dist/tools/files.d.ts +11 -4
  191. package/dist/tools/files.d.ts.map +1 -1
  192. package/dist/tools/files.js +173 -91
  193. package/dist/tools/files.js.map +1 -1
  194. package/dist/tools/help-queries.d.ts +130 -0
  195. package/dist/tools/help-queries.d.ts.map +1 -0
  196. package/dist/tools/help-queries.js +393 -0
  197. package/dist/tools/help-queries.js.map +1 -0
  198. package/dist/tools/messaging.d.ts +13 -6
  199. package/dist/tools/messaging.d.ts.map +1 -1
  200. package/dist/tools/messaging.js +217 -129
  201. package/dist/tools/messaging.js.map +1 -1
  202. package/dist/tools/tasks.d.ts +42 -12
  203. package/dist/tools/tasks.d.ts.map +1 -1
  204. package/dist/tools/tasks.js +809 -347
  205. package/dist/tools/tasks.js.map +1 -1
  206. package/dist/tools/utils.d.ts +13 -5
  207. package/dist/tools/utils.d.ts.map +1 -1
  208. package/dist/tools/utils.js +92 -115
  209. package/dist/tools/utils.js.map +1 -1
  210. package/dist/types.d.ts +4 -0
  211. package/dist/types.d.ts.map +1 -1
  212. package/dist/utils/activity-logging.d.ts +114 -0
  213. package/dist/utils/activity-logging.d.ts.map +1 -0
  214. package/dist/utils/activity-logging.js +162 -0
  215. package/dist/utils/activity-logging.js.map +1 -0
  216. package/dist/utils/batch.d.ts +2 -2
  217. package/dist/utils/batch.d.ts.map +1 -1
  218. package/dist/utils/batch.js +8 -8
  219. package/dist/utils/batch.js.map +1 -1
  220. package/dist/utils/cleanup.d.ts +21 -13
  221. package/dist/utils/cleanup.d.ts.map +1 -1
  222. package/dist/utils/cleanup.js +31 -24
  223. package/dist/utils/cleanup.js.map +1 -1
  224. package/dist/utils/debug-logger.d.ts +44 -0
  225. package/dist/utils/debug-logger.d.ts.map +1 -0
  226. package/dist/utils/debug-logger.js +116 -0
  227. package/dist/utils/debug-logger.js.map +1 -0
  228. package/dist/utils/file-pruning.d.ts +69 -0
  229. package/dist/utils/file-pruning.d.ts.map +1 -0
  230. package/dist/utils/file-pruning.js +185 -0
  231. package/dist/utils/file-pruning.js.map +1 -0
  232. package/dist/utils/help-tracking.d.ts +55 -0
  233. package/dist/utils/help-tracking.d.ts.map +1 -0
  234. package/dist/utils/help-tracking.js +88 -0
  235. package/dist/utils/help-tracking.js.map +1 -0
  236. package/dist/utils/quality-checks.d.ts +60 -0
  237. package/dist/utils/quality-checks.d.ts.map +1 -0
  238. package/dist/utils/quality-checks.js +228 -0
  239. package/dist/utils/quality-checks.js.map +1 -0
  240. package/dist/utils/retention.d.ts +13 -5
  241. package/dist/utils/retention.d.ts.map +1 -1
  242. package/dist/utils/retention.js +20 -8
  243. package/dist/utils/retention.js.map +1 -1
  244. package/dist/utils/task-stale-detection.d.ts +77 -7
  245. package/dist/utils/task-stale-detection.d.ts.map +1 -1
  246. package/dist/utils/task-stale-detection.js +309 -34
  247. package/dist/utils/task-stale-detection.js.map +1 -1
  248. package/dist/utils/token-estimation.d.ts +72 -0
  249. package/dist/utils/token-estimation.d.ts.map +1 -0
  250. package/dist/utils/token-estimation.js +71 -0
  251. package/dist/utils/token-estimation.js.map +1 -0
  252. package/dist/utils/token-logging.d.ts +48 -0
  253. package/dist/utils/token-logging.d.ts.map +1 -0
  254. package/dist/utils/token-logging.js +112 -0
  255. package/dist/utils/token-logging.js.map +1 -0
  256. package/dist/utils/vcs-adapter.d.ts +68 -0
  257. package/dist/utils/vcs-adapter.d.ts.map +1 -0
  258. package/dist/utils/vcs-adapter.js +187 -0
  259. package/dist/utils/vcs-adapter.js.map +1 -0
  260. package/dist/utils/view-queries.d.ts +34 -0
  261. package/dist/utils/view-queries.d.ts.map +1 -0
  262. package/dist/utils/view-queries.js +192 -0
  263. package/dist/utils/view-queries.js.map +1 -0
  264. package/dist/watcher/file-watcher.d.ts +54 -4
  265. package/dist/watcher/file-watcher.d.ts.map +1 -1
  266. package/dist/watcher/file-watcher.js +329 -33
  267. package/dist/watcher/file-watcher.js.map +1 -1
  268. package/dist/watcher/gitignore-parser.d.ts +70 -0
  269. package/dist/watcher/gitignore-parser.d.ts.map +1 -0
  270. package/dist/watcher/gitignore-parser.js +191 -0
  271. package/dist/watcher/gitignore-parser.js.map +1 -0
  272. package/dist/watcher/index.d.ts +1 -0
  273. package/dist/watcher/index.d.ts.map +1 -1
  274. package/dist/watcher/index.js +1 -0
  275. package/dist/watcher/index.js.map +1 -1
  276. package/docs/AI_AGENT_GUIDE.md +1 -1
  277. package/docs/ARCHITECTURE.md +12 -0
  278. package/docs/AUTO_FILE_TRACKING.md +486 -82
  279. package/docs/BEST_PRACTICES.md +56 -448
  280. package/docs/CONFIGURATION.md +908 -0
  281. package/docs/GIT_AWARE_AUTO_COMPLETE.md +645 -0
  282. package/docs/MIGRATION_v3.3.md +602 -0
  283. package/docs/MIGRATION_v3.6.0.md +170 -0
  284. package/docs/SHARED_CONCEPTS.md +65 -209
  285. package/docs/TASK_ACTIONS.md +12 -0
  286. package/docs/TASK_OVERVIEW.md +125 -24
  287. package/docs/TASK_PRUNING.md +589 -0
  288. package/docs/TASK_SYSTEM.md +83 -13
  289. package/docs/TOOL_REFERENCE.md +94 -6
  290. package/docs/TOOL_SELECTION.md +41 -248
  291. 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