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 @@
1
+ {"version":3,"file":"tasks.auto-pruning-decision-link.test.js","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-decision-link.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Integration test for v3.5.0 Auto-Pruning feature
3
+ * Tests partial pruning scenario: keeps existing files, removes non-existent ones
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=tasks.auto-pruning-partial.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.auto-pruning-partial.test.d.ts","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-partial.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Integration test for v3.5.0 Auto-Pruning feature
3
+ * Tests partial pruning scenario: keeps existing files, removes non-existent ones
4
+ */
5
+ import { describe, it, beforeEach, afterEach } from 'node:test';
6
+ import assert from 'node:assert/strict';
7
+ import { initializeDatabase, getOrCreateAgent, getOrCreateFile, closeDatabase } from '../database.js';
8
+ import { detectAndTransitionToReview } from '../utils/task-stale-detection.js';
9
+ import fs from 'fs';
10
+ import path from 'path';
11
+ import os from 'os';
12
+ describe('Auto-pruning: Partial file existence', () => {
13
+ let db;
14
+ let tempDir;
15
+ let tempDbPath;
16
+ beforeEach(async () => {
17
+ // Create temp directory for test files and database
18
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sqlew-test-'));
19
+ tempDbPath = path.join(tempDir, 'test.db');
20
+ // Initialize database with Knex adapter
21
+ db = await initializeDatabase({
22
+ databaseType: 'sqlite',
23
+ connection: {
24
+ filename: tempDbPath,
25
+ },
26
+ });
27
+ });
28
+ afterEach(async () => {
29
+ await closeDatabase();
30
+ // Cleanup temp directory
31
+ if (fs.existsSync(tempDir)) {
32
+ fs.rmSync(tempDir, { recursive: true, force: true });
33
+ }
34
+ });
35
+ it('should prune non-existent files and keep existing ones', async () => {
36
+ // 1. Create test task
37
+ const taskId = await createTestTask(db);
38
+ // 2. Create 4 watched files (2 exist, 2 don't)
39
+ const existingFile1 = path.join(tempDir, 'exists1.ts');
40
+ const existingFile2 = path.join(tempDir, 'exists2.ts');
41
+ const nonExistentFile1 = path.join(tempDir, 'missing1.ts');
42
+ const nonExistentFile2 = path.join(tempDir, 'missing2.ts');
43
+ fs.writeFileSync(existingFile1, '// test file 1');
44
+ fs.writeFileSync(existingFile2, '// test file 2');
45
+ // Don't create nonExistentFile1 and nonExistentFile2
46
+ // Add all 4 files to watch list
47
+ await addWatchedFiles(db, taskId, [
48
+ existingFile1,
49
+ existingFile2,
50
+ nonExistentFile1,
51
+ nonExistentFile2,
52
+ ]);
53
+ // Set task to in_progress status and update timestamp to be old enough
54
+ // for auto-transition (older than 15 minutes, which is the default review_idle_minutes)
55
+ const fifteenMinutesAgo = Math.floor(Date.now() / 1000) - (15 * 60 + 10);
56
+ const knex = db.getKnex();
57
+ await knex('t_tasks')
58
+ .where({ id: taskId })
59
+ .update({
60
+ status_id: 2,
61
+ updated_ts: fifteenMinutesAgo,
62
+ });
63
+ // 3. Trigger auto-pruning by detecting ready for review
64
+ // Change cwd to tempDir so file existence checks work correctly
65
+ const originalCwd = process.cwd();
66
+ try {
67
+ process.chdir(tempDir);
68
+ const transitioned = await detectAndTransitionToReview(db);
69
+ // Task should have transitioned
70
+ assert.equal(transitioned, 1, 'Should have transitioned 1 task');
71
+ // 4. Verify results
72
+ // Check watch list - should have only 2 files (the existing ones)
73
+ const watchedFiles = await getWatchedFiles(db, taskId);
74
+ assert.equal(watchedFiles.length, 2, 'Should have 2 files in watch list');
75
+ assert.ok(watchedFiles.includes('exists1.ts'), 'Should keep existing file 1');
76
+ assert.ok(watchedFiles.includes('exists2.ts'), 'Should keep existing file 2');
77
+ // Check pruned files table - should have 2 records
78
+ const prunedFiles = await knex('t_task_pruned_files')
79
+ .where({ task_id: taskId })
80
+ .select('file_path');
81
+ assert.equal(prunedFiles.length, 2, 'Should have 2 pruned file records');
82
+ // Verify pruned files are the correct ones
83
+ const prunedPaths = prunedFiles.map((f) => f.file_path);
84
+ assert.ok(prunedPaths.includes('missing1.ts'), 'Should have pruned missing1.ts');
85
+ assert.ok(prunedPaths.includes('missing2.ts'), 'Should have pruned missing2.ts');
86
+ // Check task status transitioned to waiting_review
87
+ const task = await knex('t_tasks')
88
+ .where({ id: taskId })
89
+ .first('status_id');
90
+ assert.equal(task.status_id, 3, 'Task should be in waiting_review status (3)');
91
+ }
92
+ finally {
93
+ // Restore original cwd
94
+ process.chdir(originalCwd);
95
+ }
96
+ });
97
+ it('should not transition if all files are non-existent', async () => {
98
+ // 1. Create test task
99
+ const taskId = await createTestTask(db);
100
+ // 2. Create 2 watched files that don't exist
101
+ const nonExistentFile1 = path.join(tempDir, 'missing1.ts');
102
+ const nonExistentFile2 = path.join(tempDir, 'missing2.ts');
103
+ // Don't create these files
104
+ // Add files to watch list
105
+ await addWatchedFiles(db, taskId, [nonExistentFile1, nonExistentFile2]);
106
+ // Set task to in_progress status and update timestamp to be old enough
107
+ const fifteenMinutesAgo = Math.floor(Date.now() / 1000) - (15 * 60 + 10);
108
+ const knex = db.getKnex();
109
+ await knex('t_tasks')
110
+ .where({ id: taskId })
111
+ .update({
112
+ status_id: 2,
113
+ updated_ts: fifteenMinutesAgo,
114
+ });
115
+ // 3. Trigger auto-pruning
116
+ const originalCwd = process.cwd();
117
+ try {
118
+ process.chdir(tempDir);
119
+ const transitioned = await detectAndTransitionToReview(db);
120
+ // Task should NOT have transitioned (safety check prevents it)
121
+ assert.equal(transitioned, 0, 'Should not have transitioned any tasks');
122
+ // 4. Verify task is still in in_progress
123
+ const task = await knex('t_tasks')
124
+ .where({ id: taskId })
125
+ .first('status_id');
126
+ assert.equal(task.status_id, 2, 'Task should still be in in_progress (2)');
127
+ // 5. Verify no pruning occurred (safety check blocked it)
128
+ const prunedFiles = await knex('t_task_pruned_files')
129
+ .where({ task_id: taskId })
130
+ .count('* as count')
131
+ .first();
132
+ assert.ok(prunedFiles, 'Should have pruned files result');
133
+ assert.equal(prunedFiles.count, 0, 'Should have 0 pruned records (safety check prevented pruning)');
134
+ }
135
+ finally {
136
+ process.chdir(originalCwd);
137
+ }
138
+ });
139
+ it('should not prune when all files exist', async () => {
140
+ // 1. Create test task
141
+ const taskId = await createTestTask(db);
142
+ // 2. Create 3 watched files that all exist
143
+ const existingFile1 = path.join(tempDir, 'exists1.ts');
144
+ const existingFile2 = path.join(tempDir, 'exists2.ts');
145
+ const existingFile3 = path.join(tempDir, 'exists3.ts');
146
+ fs.writeFileSync(existingFile1, '// test file 1');
147
+ fs.writeFileSync(existingFile2, '// test file 2');
148
+ fs.writeFileSync(existingFile3, '// test file 3');
149
+ // Add files to watch list
150
+ await addWatchedFiles(db, taskId, [
151
+ existingFile1,
152
+ existingFile2,
153
+ existingFile3,
154
+ ]);
155
+ // Set task to in_progress status and update timestamp to be old enough
156
+ const fifteenMinutesAgo = Math.floor(Date.now() / 1000) - (15 * 60 + 10);
157
+ const knex = db.getKnex();
158
+ await knex('t_tasks')
159
+ .where({ id: taskId })
160
+ .update({
161
+ status_id: 2,
162
+ updated_ts: fifteenMinutesAgo,
163
+ });
164
+ // 3. Trigger auto-pruning
165
+ const originalCwd = process.cwd();
166
+ try {
167
+ process.chdir(tempDir);
168
+ const transitioned = await detectAndTransitionToReview(db);
169
+ // Task should have transitioned (all files exist)
170
+ assert.equal(transitioned, 1, 'Should have transitioned 1 task');
171
+ // 4. Verify no pruning occurred
172
+ const prunedFiles = await knex('t_task_pruned_files')
173
+ .where({ task_id: taskId })
174
+ .count('* as count')
175
+ .first();
176
+ assert.ok(prunedFiles, 'Should have pruned files result');
177
+ assert.equal(prunedFiles.count, 0, 'Should have 0 pruned records');
178
+ // 5. Verify all files still in watch list
179
+ const watchedFiles = await getWatchedFiles(db, taskId);
180
+ assert.equal(watchedFiles.length, 3, 'Should still have 3 files in watch list');
181
+ // 6. Verify task transitioned to waiting_review
182
+ const task = await knex('t_tasks')
183
+ .where({ id: taskId })
184
+ .first('status_id');
185
+ assert.equal(task.status_id, 3, 'Task should be in waiting_review status (3)');
186
+ }
187
+ finally {
188
+ process.chdir(originalCwd);
189
+ }
190
+ });
191
+ it('should handle mixed ratios (3 exist, 1 missing)', async () => {
192
+ // 1. Create test task
193
+ const taskId = await createTestTask(db);
194
+ // 2. Create 4 watched files (3 exist, 1 doesn't)
195
+ const existingFile1 = path.join(tempDir, 'exists1.ts');
196
+ const existingFile2 = path.join(tempDir, 'exists2.ts');
197
+ const existingFile3 = path.join(tempDir, 'exists3.ts');
198
+ const nonExistentFile = path.join(tempDir, 'missing.ts');
199
+ fs.writeFileSync(existingFile1, '// test file 1');
200
+ fs.writeFileSync(existingFile2, '// test file 2');
201
+ fs.writeFileSync(existingFile3, '// test file 3');
202
+ // Don't create nonExistentFile
203
+ // Add all files to watch list
204
+ await addWatchedFiles(db, taskId, [
205
+ existingFile1,
206
+ existingFile2,
207
+ existingFile3,
208
+ nonExistentFile,
209
+ ]);
210
+ // Set task to in_progress status and update timestamp to be old enough
211
+ const fifteenMinutesAgo = Math.floor(Date.now() / 1000) - (15 * 60 + 10);
212
+ const knex = db.getKnex();
213
+ await knex('t_tasks')
214
+ .where({ id: taskId })
215
+ .update({
216
+ status_id: 2,
217
+ updated_ts: fifteenMinutesAgo,
218
+ });
219
+ // 3. Trigger auto-pruning
220
+ const originalCwd = process.cwd();
221
+ try {
222
+ process.chdir(tempDir);
223
+ const transitioned = await detectAndTransitionToReview(db);
224
+ // Task should have transitioned
225
+ assert.equal(transitioned, 1, 'Should have transitioned 1 task');
226
+ // 4. Verify results
227
+ const watchedFiles = await getWatchedFiles(db, taskId);
228
+ assert.equal(watchedFiles.length, 3, 'Should have 3 files in watch list');
229
+ const prunedFiles = await knex('t_task_pruned_files')
230
+ .where({ task_id: taskId })
231
+ .select('file_path');
232
+ assert.equal(prunedFiles.length, 1, 'Should have 1 pruned file record');
233
+ assert.equal(prunedFiles[0].file_path, 'missing.ts', 'Should have pruned missing.ts');
234
+ }
235
+ finally {
236
+ process.chdir(originalCwd);
237
+ }
238
+ });
239
+ });
240
+ // Helper functions
241
+ /**
242
+ * Create a test task in in_progress status
243
+ */
244
+ async function createTestTask(db) {
245
+ const agentId = await getOrCreateAgent(db, 'test-agent');
246
+ const knex = db.getKnex();
247
+ const [taskId] = await knex('t_tasks').insert({
248
+ title: 'Test Task for Auto-Pruning',
249
+ status_id: 2,
250
+ priority: 2,
251
+ created_by_agent_id: agentId,
252
+ assigned_agent_id: agentId,
253
+ });
254
+ return taskId;
255
+ }
256
+ /**
257
+ * Add watched files to a task
258
+ */
259
+ async function addWatchedFiles(db, taskId, filePaths) {
260
+ const knex = db.getKnex();
261
+ for (const filePath of filePaths) {
262
+ // Extract just the filename (last segment) for relative paths
263
+ const fileName = path.basename(filePath);
264
+ const fileId = await getOrCreateFile(db, fileName);
265
+ await knex('t_task_file_links')
266
+ .insert({
267
+ task_id: taskId,
268
+ file_id: fileId,
269
+ })
270
+ .onConflict(['task_id', 'file_id'])
271
+ .ignore();
272
+ }
273
+ }
274
+ /**
275
+ * Get watched files for a task
276
+ */
277
+ async function getWatchedFiles(db, taskId) {
278
+ const knex = db.getKnex();
279
+ const files = await knex('t_task_file_links as tfl')
280
+ .join('m_files as mf', 'tfl.file_id', 'mf.id')
281
+ .where('tfl.task_id', taskId)
282
+ .select('mf.path');
283
+ return files.map((row) => row.path);
284
+ }
285
+ //# sourceMappingURL=tasks.auto-pruning-partial.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.auto-pruning-partial.test.js","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-partial.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEtG,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,IAAI,EAAmB,CAAC;IACxB,IAAI,OAAe,CAAC;IACpB,IAAI,UAAkB,CAAC;IAEvB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,oDAAoD;QACpD,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;QAChE,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAE3C,wCAAwC;QACxC,EAAE,GAAG,MAAM,kBAAkB,CAAC;YAC5B,YAAY,EAAE,QAAQ;YACtB,UAAU,EAAE;gBACV,QAAQ,EAAE,UAAU;aACrB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,aAAa,EAAE,CAAC;QACtB,yBAAyB;QACzB,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;QAExC,+CAA+C;QAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAE3D,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAClD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAClD,qDAAqD;QAErD,gCAAgC;QAChC,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE;YAChC,aAAa;YACb,aAAa;YACb,gBAAgB;YAChB,gBAAgB;SACjB,CAAC,CAAC;QAEH,uEAAuE;QACvE,wFAAwF;QACxF,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;aACrB,MAAM,CAAC;YACN,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,iBAAiB;SAC9B,CAAC,CAAC;QAEL,wDAAwD;QACxD,gEAAgE;QAChE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEvB,MAAM,YAAY,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;YAE3D,gCAAgC;YAChC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,iCAAiC,CAAC,CAAC;YAEjE,oBAAoB;YAEpB,kEAAkE;YAClE,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,mCAAmC,CAAC,CAAC;YAC1E,MAAM,CAAC,EAAE,CACP,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EACnC,6BAA6B,CAC9B,CAAC;YACF,MAAM,CAAC,EAAE,CACP,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EACnC,6BAA6B,CAC9B,CAAC;YAEF,mDAAmD;YACnD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC;iBAClD,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;iBAC1B,MAAM,CAAC,WAAW,CAAC,CAAC;YAEvB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,mCAAmC,CAAC,CAAC;YAEzE,2CAA2C;YAC3C,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACxD,MAAM,CAAC,EAAE,CACP,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,EACnC,gCAAgC,CACjC,CAAC;YACF,MAAM,CAAC,EAAE,CACP,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,EACnC,gCAAgC,CACjC,CAAC;YAEF,mDAAmD;YACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;iBAC/B,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;iBACrB,KAAK,CAAC,WAAW,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,SAAS,EACd,CAAC,EACD,6CAA6C,CAC9C,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,uBAAuB;YACvB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;QAExC,6CAA6C;QAC7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC3D,2BAA2B;QAE3B,0BAA0B;QAC1B,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAExE,uEAAuE;QACvE,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;aACrB,MAAM,CAAC;YACN,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,iBAAiB;SAC9B,CAAC,CAAC;QAEL,0BAA0B;QAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEvB,MAAM,YAAY,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;YAE3D,+DAA+D;YAC/D,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,wCAAwC,CAAC,CAAC;YAExE,yCAAyC;YACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;iBAC/B,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;iBACrB,KAAK,CAAC,WAAW,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,yCAAyC,CAAC,CAAC;YAE3E,0DAA0D;YAC1D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC;iBAClD,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;iBAC1B,KAAK,CAAC,YAAY,CAAC;iBACnB,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,iCAAiC,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CACV,WAAW,CAAC,KAAK,EACjB,CAAC,EACD,+DAA+D,CAChE,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;QAExC,2CAA2C;QAC3C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAEvD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAClD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAClD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAElD,0BAA0B;QAC1B,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE;YAChC,aAAa;YACb,aAAa;YACb,aAAa;SACd,CAAC,CAAC;QAEH,uEAAuE;QACvE,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;aACrB,MAAM,CAAC;YACN,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,iBAAiB;SAC9B,CAAC,CAAC;QAEL,0BAA0B;QAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEvB,MAAM,YAAY,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;YAE3D,kDAAkD;YAClD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,iCAAiC,CAAC,CAAC;YAEjE,gCAAgC;YAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC;iBAClD,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;iBAC1B,KAAK,CAAC,YAAY,CAAC;iBACnB,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,iCAAiC,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;YAEnE,0CAA0C;YAC1C,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,yCAAyC,CAAC,CAAC;YAEhF,gDAAgD;YAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;iBAC/B,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;iBACrB,KAAK,CAAC,WAAW,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CACV,IAAI,CAAC,SAAS,EACd,CAAC,EACD,6CAA6C,CAC9C,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;QAExC,iDAAiD;QACjD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAEzD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAClD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAClD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAClD,+BAA+B;QAE/B,8BAA8B;QAC9B,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE;YAChC,aAAa;YACb,aAAa;YACb,aAAa;YACb,eAAe;SAChB,CAAC,CAAC;QAEH,uEAAuE;QACvE,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,SAAS,CAAC;aAClB,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;aACrB,MAAM,CAAC;YACN,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,iBAAiB;SAC9B,CAAC,CAAC;QAEL,0BAA0B;QAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEvB,MAAM,YAAY,GAAG,MAAM,2BAA2B,CAAC,EAAE,CAAC,CAAC;YAE3D,gCAAgC;YAChC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,iCAAiC,CAAC,CAAC;YAEjE,oBAAoB;YACpB,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,mCAAmC,CAAC,CAAC;YAE1E,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC;iBAClD,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;iBAC1B,MAAM,CAAC,WAAW,CAAC,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,kCAAkC,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,CACV,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,EACxB,YAAY,EACZ,+BAA+B,CAChC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,mBAAmB;AAEnB;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,EAAmB;IAC/C,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE1B,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAC5C,KAAK,EAAE,4BAA4B;QACnC,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,CAAC;QACX,mBAAmB,EAAE,OAAO;QAC5B,iBAAiB,EAAE,OAAO;KAC3B,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,EAAmB,EACnB,MAAc,EACd,SAAmB;IAEnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE1B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAEnD,MAAM,IAAI,CAAC,mBAAmB,CAAC;aAC5B,MAAM,CAAC;YACN,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;SAChB,CAAC;aACD,UAAU,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aAClC,MAAM,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,EAAmB,EAAE,MAAc;IAChE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC;SACjD,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE,OAAO,CAAC;SAC7C,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC;SAC5B,MAAM,CAAC,SAAS,CAAC,CAAC;IAErB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Integration tests for v3.5.0 Auto-Pruning persistence
3
+ * Tests audit trail persistence after task archival (no cascade deletion)
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=tasks.auto-pruning-persistence.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.auto-pruning-persistence.test.d.ts","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-persistence.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Integration tests for v3.5.0 Auto-Pruning persistence
3
+ * Tests audit trail persistence after task archival (no cascade deletion)
4
+ */
5
+ import { describe, it, beforeEach, afterEach } from 'node:test';
6
+ import assert from 'node:assert/strict';
7
+ import { initializeDatabase, closeDatabase } from '../database.js';
8
+ import { getOrCreateAgent } from '../database.js';
9
+ /**
10
+ * Test database instance
11
+ */
12
+ let testDb;
13
+ /**
14
+ * Create an in-memory test database with schema and migrations
15
+ */
16
+ async function createTestDatabase() {
17
+ const adapter = await initializeDatabase({
18
+ databaseType: 'sqlite',
19
+ connection: {
20
+ filename: ':memory:',
21
+ },
22
+ });
23
+ // Enable foreign keys for SQLite
24
+ const knex = adapter.getKnex();
25
+ await knex.raw('PRAGMA foreign_keys = ON');
26
+ return adapter;
27
+ }
28
+ /**
29
+ * Helper: Create a test task in 'done' status (ready to archive)
30
+ */
31
+ async function createTestTask(adapter, title) {
32
+ const knex = adapter.getKnex();
33
+ const agentId = await getOrCreateAgent(adapter, 'test-agent');
34
+ const statusId = 5; // done (ready to archive)
35
+ const [taskId] = await knex('t_tasks').insert({
36
+ title,
37
+ status_id: statusId,
38
+ priority: 2,
39
+ created_by_agent_id: agentId,
40
+ assigned_agent_id: agentId,
41
+ });
42
+ return taskId;
43
+ }
44
+ /**
45
+ * Helper: Create a pruned file record in audit table
46
+ */
47
+ async function createPrunedFileRecord(adapter, taskId, filePath) {
48
+ const knex = adapter.getKnex();
49
+ const [id] = await knex('t_task_pruned_files').insert({
50
+ task_id: taskId,
51
+ file_path: filePath,
52
+ pruned_ts: knex.raw('unixepoch()'),
53
+ });
54
+ return id;
55
+ }
56
+ /**
57
+ * Helper: Get task status by ID
58
+ */
59
+ async function getTaskStatus(adapter, taskId) {
60
+ const knex = adapter.getKnex();
61
+ const row = await knex('t_tasks')
62
+ .where({ id: taskId })
63
+ .first('status_id');
64
+ if (!row) {
65
+ throw new Error(`Task not found: ${taskId}`);
66
+ }
67
+ return row.status_id;
68
+ }
69
+ /**
70
+ * Helper: Count pruned file records for a task
71
+ */
72
+ async function countPrunedFiles(adapter, taskId) {
73
+ const knex = adapter.getKnex();
74
+ const row = await knex('t_task_pruned_files')
75
+ .where({ task_id: taskId })
76
+ .count('* as count')
77
+ .first();
78
+ return row?.count || 0;
79
+ }
80
+ /**
81
+ * Helper: Archive a task (test version)
82
+ */
83
+ async function archiveTask(adapter, taskId) {
84
+ const TASK_STATUS_DONE = 5;
85
+ const TASK_STATUS_ARCHIVED = 6;
86
+ const knex = adapter.getKnex();
87
+ return await knex.transaction(async (trx) => {
88
+ // Check if task is in 'done' status
89
+ const taskRow = await trx('t_tasks')
90
+ .where({ id: taskId })
91
+ .first('status_id');
92
+ if (!taskRow) {
93
+ throw new Error(`Task with id ${taskId} not found`);
94
+ }
95
+ if (taskRow.status_id !== TASK_STATUS_DONE) {
96
+ throw new Error(`Task ${taskId} must be in 'done' status to archive`);
97
+ }
98
+ // Update to archived
99
+ await trx('t_tasks')
100
+ .where({ id: taskId })
101
+ .update({ status_id: TASK_STATUS_ARCHIVED });
102
+ return { success: true, task_id: taskId };
103
+ });
104
+ }
105
+ /**
106
+ * Helper: Get pruned files for a task (test version)
107
+ */
108
+ async function getPrunedFiles(adapter, taskId) {
109
+ const knex = adapter.getKnex();
110
+ const rows = await knex('t_task_pruned_files')
111
+ .where({ task_id: taskId })
112
+ .select('file_path', 'pruned_ts')
113
+ .orderBy('pruned_ts', 'desc');
114
+ return {
115
+ success: true,
116
+ count: rows.length,
117
+ pruned_files: rows
118
+ };
119
+ }
120
+ describe('Auto-pruning: Audit trail persistence after archival', () => {
121
+ beforeEach(async () => {
122
+ testDb = await createTestDatabase();
123
+ });
124
+ afterEach(async () => {
125
+ await closeDatabase();
126
+ });
127
+ it('should preserve audit trail after task archival', async () => {
128
+ // 1. Setup: Create task with pruned files
129
+ const taskId = await createTestTask(testDb, 'Task with pruned files');
130
+ // Create multiple pruned file records
131
+ const prunedFileIds = [
132
+ await createPrunedFileRecord(testDb, taskId, '/tmp/file1.ts'),
133
+ await createPrunedFileRecord(testDb, taskId, '/tmp/file2.ts'),
134
+ await createPrunedFileRecord(testDb, taskId, '/tmp/file3.ts')
135
+ ];
136
+ assert.equal(prunedFileIds.length, 3, 'Should create 3 pruned file records');
137
+ // 2. Verify pruned files exist before archival
138
+ const beforeCount = await countPrunedFiles(testDb, taskId);
139
+ assert.equal(beforeCount, 3, 'Should have 3 pruned file records before archival');
140
+ // 3. Archive the task
141
+ const archiveResult = await archiveTask(testDb, taskId);
142
+ assert.ok(archiveResult.success, 'Task archival should succeed');
143
+ assert.equal(archiveResult.task_id, taskId);
144
+ // 4. Verify task is archived
145
+ const taskStatus = await getTaskStatus(testDb, taskId);
146
+ assert.equal(taskStatus, 6, 'Task should be archived (status_id 6)');
147
+ // 5. Verify pruned files still exist (NOT cascade deleted)
148
+ const afterCount = await countPrunedFiles(testDb, taskId);
149
+ assert.equal(afterCount, 3, 'Should still have 3 pruned file records after archival');
150
+ // 6. Verify get_pruned_files works for archived tasks
151
+ const getPrunedResult = await getPrunedFiles(testDb, taskId);
152
+ assert.ok(getPrunedResult.success, 'get_pruned_files should work for archived tasks');
153
+ assert.equal(getPrunedResult.count, 3, 'Should return count of 3 pruned files');
154
+ assert.equal(getPrunedResult.pruned_files.length, 3, 'Should return all 3 pruned files');
155
+ // Verify file paths are preserved
156
+ const filePaths = getPrunedResult.pruned_files.map((f) => f.file_path);
157
+ assert.ok(filePaths.includes('/tmp/file1.ts'), 'Should include file1.ts');
158
+ assert.ok(filePaths.includes('/tmp/file2.ts'), 'Should include file2.ts');
159
+ assert.ok(filePaths.includes('/tmp/file3.ts'), 'Should include file3.ts');
160
+ });
161
+ it('should maintain foreign key integrity after archival', async () => {
162
+ const taskId = await createTestTask(testDb, 'Task for FK test');
163
+ await createPrunedFileRecord(testDb, taskId, '/tmp/test.ts');
164
+ // Archive task
165
+ const archiveResult = await archiveTask(testDb, taskId);
166
+ assert.ok(archiveResult.success, 'Task archival should succeed');
167
+ // Verify foreign key still valid (can JOIN successfully)
168
+ const knex = testDb.getKnex();
169
+ const result = await knex('t_task_pruned_files as tpf')
170
+ .join('t_tasks as t', 'tpf.task_id', 't.id')
171
+ .where('tpf.task_id', taskId)
172
+ .select('tpf.id', 'tpf.task_id', 't.status_id')
173
+ .first();
174
+ assert.ok(result, 'Foreign key join should succeed');
175
+ assert.equal(result.task_id, taskId, 'Task ID should match');
176
+ assert.equal(result.status_id, 6, 'Task status should be archived (6)');
177
+ });
178
+ it('should handle zero pruned files for archived task', async () => {
179
+ const taskId = await createTestTask(testDb, 'Task with no pruned files');
180
+ // Archive without any pruned files
181
+ const archiveResult = await archiveTask(testDb, taskId);
182
+ assert.ok(archiveResult.success);
183
+ // Query pruned files - should return empty array
184
+ const getPrunedResult = await getPrunedFiles(testDb, taskId);
185
+ assert.ok(getPrunedResult.success);
186
+ assert.equal(getPrunedResult.count, 0);
187
+ assert.equal(getPrunedResult.pruned_files.length, 0);
188
+ });
189
+ it('should preserve pruned file timestamps after archival', async () => {
190
+ const taskId = await createTestTask(testDb, 'Task for timestamp test');
191
+ // Create pruned file with explicit timestamp check
192
+ const beforeTs = Math.floor(Date.now() / 1000);
193
+ await createPrunedFileRecord(testDb, taskId, '/tmp/timestamped.ts');
194
+ // Archive task
195
+ await archiveTask(testDb, taskId);
196
+ // Get pruned files and verify timestamp
197
+ const getPrunedResult = await getPrunedFiles(testDb, taskId);
198
+ assert.equal(getPrunedResult.pruned_files.length, 1);
199
+ const prunedFile = getPrunedResult.pruned_files[0];
200
+ assert.ok(prunedFile.pruned_ts, 'Should have pruned_ts timestamp');
201
+ assert.ok(prunedFile.file_path === '/tmp/timestamped.ts', 'File path should match');
202
+ // Verify timestamp is reasonable (within last few seconds)
203
+ const prunedAt = prunedFile.pruned_ts;
204
+ assert.ok(prunedAt >= beforeTs, 'Timestamp should be after or equal to test start');
205
+ assert.ok(prunedAt <= beforeTs + 5, 'Timestamp should be within 5 seconds');
206
+ });
207
+ it('should handle multiple archived tasks with pruned files', async () => {
208
+ // Create multiple tasks with pruned files
209
+ const task1Id = await createTestTask(testDb, 'Task 1');
210
+ const task2Id = await createTestTask(testDb, 'Task 2');
211
+ const task3Id = await createTestTask(testDb, 'Task 3');
212
+ await createPrunedFileRecord(testDb, task1Id, '/tmp/task1-file1.ts');
213
+ await createPrunedFileRecord(testDb, task1Id, '/tmp/task1-file2.ts');
214
+ await createPrunedFileRecord(testDb, task2Id, '/tmp/task2-file1.ts');
215
+ await createPrunedFileRecord(testDb, task3Id, '/tmp/task3-file1.ts');
216
+ await createPrunedFileRecord(testDb, task3Id, '/tmp/task3-file2.ts');
217
+ await createPrunedFileRecord(testDb, task3Id, '/tmp/task3-file3.ts');
218
+ // Archive all tasks
219
+ await archiveTask(testDb, task1Id);
220
+ await archiveTask(testDb, task2Id);
221
+ await archiveTask(testDb, task3Id);
222
+ // Verify each task's pruned files are isolated and preserved
223
+ const task1Pruned = await getPrunedFiles(testDb, task1Id);
224
+ assert.equal(task1Pruned.count, 2, 'Task 1 should have 2 pruned files');
225
+ const task2Pruned = await getPrunedFiles(testDb, task2Id);
226
+ assert.equal(task2Pruned.count, 1, 'Task 2 should have 1 pruned file');
227
+ const task3Pruned = await getPrunedFiles(testDb, task3Id);
228
+ assert.equal(task3Pruned.count, 3, 'Task 3 should have 3 pruned files');
229
+ // Verify file paths are isolated (no cross-contamination)
230
+ const task1Paths = task1Pruned.pruned_files.map((f) => f.file_path);
231
+ assert.ok(!task1Paths.includes('/tmp/task2-file1.ts'), 'Task 1 should not include Task 2 files');
232
+ assert.ok(!task1Paths.includes('/tmp/task3-file1.ts'), 'Task 1 should not include Task 3 files');
233
+ });
234
+ it('should verify CASCADE constraint when task is deleted (not archived)', async () => {
235
+ // This test verifies the ON DELETE CASCADE behavior
236
+ const taskId = await createTestTask(testDb, 'Task for deletion test');
237
+ await createPrunedFileRecord(testDb, taskId, '/tmp/cascade-test.ts');
238
+ // Verify pruned file exists
239
+ const beforeCount = await countPrunedFiles(testDb, taskId);
240
+ assert.equal(beforeCount, 1);
241
+ // DELETE task (not archive) - should cascade delete pruned files
242
+ const knex = testDb.getKnex();
243
+ await knex('t_tasks').where({ id: taskId }).delete();
244
+ // Verify pruned file was cascade deleted
245
+ const afterCount = await countPrunedFiles(testDb, taskId);
246
+ assert.equal(afterCount, 0, 'Pruned files should be CASCADE deleted when task is deleted');
247
+ });
248
+ console.log('\n✅ All auto-pruning persistence tests passed!\n');
249
+ });
250
+ //# sourceMappingURL=tasks.auto-pruning-persistence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.auto-pruning-persistence.test.js","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-persistence.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Integration tests for v3.5.0 Auto-Pruning Safety Check
3
+ * Tests that the system blocks task transition when ALL watched files are non-existent
4
+ *
5
+ * Test Scenario: Zero Work Done Protection
6
+ * - Create task with 3 watched files
7
+ * - Make ALL 3 files non-existent
8
+ * - Trigger detectAndTransitionToReview()
9
+ * - Expected: Error thrown, task status unchanged, transaction rolled back
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=tasks.auto-pruning-safety.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.auto-pruning-safety.test.d.ts","sourceRoot":"","sources":["../../src/tests/tasks.auto-pruning-safety.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}