sqlew 3.6.9 → 3.7.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 (383) hide show
  1. package/CHANGELOG.md +398 -1
  2. package/README.md +58 -39
  3. package/assets/config.example.toml +93 -0
  4. package/assets/kanban-visualizer.png +0 -0
  5. package/assets/sample-agents/sqlew-architect.md +32 -13
  6. package/assets/sample-agents/sqlew-researcher.md +70 -17
  7. package/assets/sample-agents/sqlew-scrum-master.md +60 -25
  8. package/assets/schema.sql +2 -2
  9. package/dist/adapters/auth/auth-factory.d.ts +86 -0
  10. package/dist/adapters/auth/auth-factory.d.ts.map +1 -0
  11. package/dist/adapters/auth/auth-factory.js +103 -0
  12. package/dist/adapters/auth/auth-factory.js.map +1 -0
  13. package/dist/adapters/auth/auth-types.d.ts +30 -0
  14. package/dist/adapters/auth/auth-types.d.ts.map +1 -0
  15. package/dist/adapters/auth/auth-types.js +30 -0
  16. package/dist/adapters/auth/auth-types.js.map +1 -0
  17. package/dist/adapters/auth/base-auth-provider.d.ts +327 -0
  18. package/dist/adapters/auth/base-auth-provider.d.ts.map +1 -0
  19. package/dist/adapters/auth/base-auth-provider.js +111 -0
  20. package/dist/adapters/auth/base-auth-provider.js.map +1 -0
  21. package/dist/adapters/auth/direct-auth-provider.d.ts +356 -0
  22. package/dist/adapters/auth/direct-auth-provider.d.ts.map +1 -0
  23. package/dist/adapters/auth/direct-auth-provider.js +406 -0
  24. package/dist/adapters/auth/direct-auth-provider.js.map +1 -0
  25. package/dist/adapters/base-adapter.d.ts +638 -0
  26. package/dist/adapters/base-adapter.d.ts.map +1 -0
  27. package/dist/adapters/base-adapter.js +557 -0
  28. package/dist/adapters/base-adapter.js.map +1 -0
  29. package/dist/adapters/index.d.ts +13 -2
  30. package/dist/adapters/index.d.ts.map +1 -1
  31. package/dist/adapters/index.js +27 -5
  32. package/dist/adapters/index.js.map +1 -1
  33. package/dist/adapters/mysql-adapter.d.ts +547 -6
  34. package/dist/adapters/mysql-adapter.d.ts.map +1 -1
  35. package/dist/adapters/mysql-adapter.js +651 -32
  36. package/dist/adapters/mysql-adapter.js.map +1 -1
  37. package/dist/adapters/postgresql-adapter.d.ts +15 -4
  38. package/dist/adapters/postgresql-adapter.d.ts.map +1 -1
  39. package/dist/adapters/postgresql-adapter.js +19 -2
  40. package/dist/adapters/postgresql-adapter.js.map +1 -1
  41. package/dist/adapters/sqlite-adapter.d.ts +35 -5
  42. package/dist/adapters/sqlite-adapter.d.ts.map +1 -1
  43. package/dist/adapters/sqlite-adapter.js +57 -18
  44. package/dist/adapters/sqlite-adapter.js.map +1 -1
  45. package/dist/cli/db-dump.d.ts +32 -0
  46. package/dist/cli/db-dump.d.ts.map +1 -0
  47. package/dist/cli/db-dump.js +409 -0
  48. package/dist/cli/db-dump.js.map +1 -0
  49. package/dist/cli.js +24 -14
  50. package/dist/cli.js.map +1 -1
  51. package/dist/config/example-generator.d.ts.map +1 -1
  52. package/dist/config/example-generator.js +4 -3
  53. package/dist/config/example-generator.js.map +1 -1
  54. package/dist/config/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +1 -0
  55. package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.js +7 -2
  56. package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js.map +1 -0
  57. package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +1 -0
  58. package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.js +49 -50
  59. package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.js.map +1 -0
  60. package/dist/config/knex/bootstrap/20251025021351_create_indexes.d.ts.map +1 -0
  61. package/dist/config/knex/bootstrap/20251025021351_create_indexes.js.map +1 -0
  62. package/dist/config/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +1 -0
  63. package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.js +11 -6
  64. package/dist/config/knex/bootstrap/20251025021416_seed_master_data.js.map +1 -0
  65. package/dist/config/knex/bootstrap/20251025070349_create_views.d.ts.map +1 -0
  66. package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.js +66 -14
  67. package/dist/config/knex/bootstrap/20251025070349_create_views.js.map +1 -0
  68. package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
  69. package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +22 -0
  70. package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
  71. package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
  72. package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +1 -0
  73. package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +1 -0
  74. package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.js +6 -0
  75. package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.js.map +1 -0
  76. package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
  77. package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js +6 -0
  78. package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
  79. package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +1 -0
  80. package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.js +6 -0
  81. package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.js.map +1 -0
  82. package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
  83. package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +1 -0
  84. package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
  85. package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js +7 -0
  86. package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
  87. package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +1 -0
  88. package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js +62 -0
  89. package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +1 -0
  90. package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +1 -0
  91. package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +1 -0
  92. package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +1 -0
  93. package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.js +6 -0
  94. package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.js.map +1 -0
  95. package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +1 -0
  96. package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.js +6 -0
  97. package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.js.map +1 -0
  98. package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts +13 -0
  99. package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts.map +1 -0
  100. package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js +48 -0
  101. package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js.map +1 -0
  102. package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts +24 -0
  103. package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts.map +1 -0
  104. package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js +189 -0
  105. package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js.map +1 -0
  106. package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts +16 -0
  107. package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts.map +1 -0
  108. package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js +65 -0
  109. package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js.map +1 -0
  110. package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts +23 -0
  111. package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts.map +1 -0
  112. package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js +118 -0
  113. package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js.map +1 -0
  114. package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +1 -0
  115. package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +1 -0
  116. package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +1 -0
  117. package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +1 -0
  118. package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +1 -0
  119. package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +1 -0
  120. package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +1 -0
  121. package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +1 -0
  122. package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +1 -0
  123. package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +1 -0
  124. package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +1 -0
  125. package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +1 -0
  126. package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +1 -0
  127. package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +1 -0
  128. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts +49 -0
  129. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts.map +1 -0
  130. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js +864 -0
  131. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js.map +1 -0
  132. package/dist/config/loader.d.ts +23 -3
  133. package/dist/config/loader.d.ts.map +1 -1
  134. package/dist/config/loader.js +155 -8
  135. package/dist/config/loader.js.map +1 -1
  136. package/dist/config/types.d.ts +261 -2
  137. package/dist/config/types.d.ts.map +1 -1
  138. package/dist/config/types.js.map +1 -1
  139. package/dist/config/writer.d.ts +65 -0
  140. package/dist/config/writer.d.ts.map +1 -0
  141. package/dist/config/writer.js +139 -0
  142. package/dist/config/writer.js.map +1 -0
  143. package/dist/database.d.ts +11 -2
  144. package/dist/database.d.ts.map +1 -1
  145. package/dist/database.js +65 -8
  146. package/dist/database.js.map +1 -1
  147. package/dist/index.js +186 -32
  148. package/dist/index.js.map +1 -1
  149. package/dist/knexfile.d.ts.map +1 -1
  150. package/dist/knexfile.js +88 -12
  151. package/dist/knexfile.js.map +1 -1
  152. package/dist/tests/all-features.test.js +15 -3
  153. package/dist/tests/all-features.test.js.map +1 -1
  154. package/dist/tests/config-loader.test.d.ts +6 -0
  155. package/dist/tests/config-loader.test.d.ts.map +1 -0
  156. package/dist/tests/config-loader.test.js +201 -0
  157. package/dist/tests/config-loader.test.js.map +1 -0
  158. package/dist/tests/connection-manager-integration.test.d.ts +2 -0
  159. package/dist/tests/connection-manager-integration.test.d.ts.map +1 -0
  160. package/dist/tests/connection-manager-integration.test.js +431 -0
  161. package/dist/tests/connection-manager-integration.test.js.map +1 -0
  162. package/dist/tests/connection-manager.test.d.ts +2 -0
  163. package/dist/tests/connection-manager.test.d.ts.map +1 -0
  164. package/dist/tests/connection-manager.test.js +361 -0
  165. package/dist/tests/connection-manager.test.js.map +1 -0
  166. package/dist/tests/dump-import.test.d.ts +15 -0
  167. package/dist/tests/dump-import.test.d.ts.map +1 -0
  168. package/dist/tests/dump-import.test.js +430 -0
  169. package/dist/tests/dump-import.test.js.map +1 -0
  170. package/dist/tests/migration-idempotency.test.d.ts +2 -0
  171. package/dist/tests/migration-idempotency.test.d.ts.map +1 -0
  172. package/dist/tests/migration-idempotency.test.js +330 -0
  173. package/dist/tests/migration-idempotency.test.js.map +1 -0
  174. package/dist/tests/migration-upgrade-paths.test.d.ts +2 -0
  175. package/dist/tests/migration-upgrade-paths.test.d.ts.map +1 -0
  176. package/dist/tests/migration-upgrade-paths.test.js +248 -0
  177. package/dist/tests/migration-upgrade-paths.test.js.map +1 -0
  178. package/dist/tests/multi-project-migration.test.d.ts +17 -0
  179. package/dist/tests/multi-project-migration.test.d.ts.map +1 -0
  180. package/dist/tests/multi-project-migration.test.js +399 -0
  181. package/dist/tests/multi-project-migration.test.js.map +1 -0
  182. package/dist/tests/multi-project.test.d.ts +5 -0
  183. package/dist/tests/multi-project.test.d.ts.map +1 -0
  184. package/dist/tests/multi-project.test.js +238 -0
  185. package/dist/tests/multi-project.test.js.map +1 -0
  186. package/dist/tests/schema-migration.test.d.ts +8 -0
  187. package/dist/tests/schema-migration.test.d.ts.map +1 -0
  188. package/dist/tests/schema-migration.test.js +108 -0
  189. package/dist/tests/schema-migration.test.js.map +1 -0
  190. package/dist/tests/sql-dump-converters.test.d.ts +7 -0
  191. package/dist/tests/sql-dump-converters.test.d.ts.map +1 -0
  192. package/dist/tests/sql-dump-converters.test.js +314 -0
  193. package/dist/tests/sql-dump-converters.test.js.map +1 -0
  194. package/dist/tests/sql-dump-cross-database.test.d.ts +21 -0
  195. package/dist/tests/sql-dump-cross-database.test.d.ts.map +1 -0
  196. package/dist/tests/sql-dump-cross-database.test.js +314 -0
  197. package/dist/tests/sql-dump-cross-database.test.js.map +1 -0
  198. package/dist/tests/sql-dump-default-conversions.test.d.ts +8 -0
  199. package/dist/tests/sql-dump-default-conversions.test.d.ts.map +1 -0
  200. package/dist/tests/sql-dump-default-conversions.test.js +141 -0
  201. package/dist/tests/sql-dump-default-conversions.test.js.map +1 -0
  202. package/dist/tests/sql-dump-fk-constraints.test.d.ts +13 -0
  203. package/dist/tests/sql-dump-fk-constraints.test.d.ts.map +1 -0
  204. package/dist/tests/sql-dump-fk-constraints.test.js +381 -0
  205. package/dist/tests/sql-dump-fk-constraints.test.js.map +1 -0
  206. package/dist/tests/sql-dump-indexes.test.d.ts +12 -0
  207. package/dist/tests/sql-dump-indexes.test.d.ts.map +1 -0
  208. package/dist/tests/sql-dump-indexes.test.js +269 -0
  209. package/dist/tests/sql-dump-indexes.test.js.map +1 -0
  210. package/dist/tests/sql-dump-integration.test.d.ts +16 -0
  211. package/dist/tests/sql-dump-integration.test.d.ts.map +1 -0
  212. package/dist/tests/sql-dump-integration.test.js +342 -0
  213. package/dist/tests/sql-dump-integration.test.js.map +1 -0
  214. package/dist/tests/sql-dump-table-ordering.test.d.ts +8 -0
  215. package/dist/tests/sql-dump-table-ordering.test.d.ts.map +1 -0
  216. package/dist/tests/sql-dump-table-ordering.test.js +253 -0
  217. package/dist/tests/sql-dump-table-ordering.test.js.map +1 -0
  218. package/dist/tests/tasks.link-file-backward-compat.test.js +11 -1
  219. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
  220. package/dist/tests/tasks.watch-files-action.test.js +11 -1
  221. package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
  222. package/dist/tests/type-conversion.test.d.ts +8 -0
  223. package/dist/tests/type-conversion.test.d.ts.map +1 -0
  224. package/dist/tests/type-conversion.test.js +312 -0
  225. package/dist/tests/type-conversion.test.js.map +1 -0
  226. package/dist/tests/utils/test-helpers.d.ts +93 -0
  227. package/dist/tests/utils/test-helpers.d.ts.map +1 -0
  228. package/dist/tests/utils/test-helpers.js +407 -0
  229. package/dist/tests/utils/test-helpers.js.map +1 -0
  230. package/dist/tools/config.d.ts +58 -0
  231. package/dist/tools/config.d.ts.map +1 -0
  232. package/dist/tools/config.js +281 -0
  233. package/dist/tools/config.js.map +1 -0
  234. package/dist/tools/constraints.d.ts.map +1 -1
  235. package/dist/tools/constraints.js +138 -122
  236. package/dist/tools/constraints.js.map +1 -1
  237. package/dist/tools/context.d.ts.map +1 -1
  238. package/dist/tools/context.js +216 -109
  239. package/dist/tools/context.js.map +1 -1
  240. package/dist/tools/files.d.ts.map +1 -1
  241. package/dist/tools/files.js +123 -102
  242. package/dist/tools/files.js.map +1 -1
  243. package/dist/tools/tasks.d.ts.map +1 -1
  244. package/dist/tools/tasks.js +583 -521
  245. package/dist/tools/tasks.js.map +1 -1
  246. package/dist/tools/utils.d.ts +5 -0
  247. package/dist/tools/utils.d.ts.map +1 -1
  248. package/dist/tools/utils.js +176 -122
  249. package/dist/tools/utils.js.map +1 -1
  250. package/dist/types.d.ts +9 -26
  251. package/dist/types.d.ts.map +1 -1
  252. package/dist/utils/cleanup.d.ts +3 -0
  253. package/dist/utils/cleanup.d.ts.map +1 -1
  254. package/dist/utils/cleanup.js +14 -2
  255. package/dist/utils/cleanup.js.map +1 -1
  256. package/dist/utils/connection-manager.d.ts +59 -0
  257. package/dist/utils/connection-manager.d.ts.map +1 -0
  258. package/dist/utils/connection-manager.js +178 -0
  259. package/dist/utils/connection-manager.js.map +1 -0
  260. package/dist/utils/debug-logger.d.ts +8 -4
  261. package/dist/utils/debug-logger.d.ts.map +1 -1
  262. package/dist/utils/debug-logger.js +27 -7
  263. package/dist/utils/debug-logger.js.map +1 -1
  264. package/dist/utils/error-handler.d.ts +12 -2
  265. package/dist/utils/error-handler.d.ts.map +1 -1
  266. package/dist/utils/error-handler.js +22 -21
  267. package/dist/utils/error-handler.js.map +1 -1
  268. package/dist/utils/parameter-validator.d.ts.map +1 -1
  269. package/dist/utils/parameter-validator.js +36 -15
  270. package/dist/utils/parameter-validator.js.map +1 -1
  271. package/dist/utils/project-context.d.ts +111 -0
  272. package/dist/utils/project-context.d.ts.map +1 -0
  273. package/dist/utils/project-context.js +187 -0
  274. package/dist/utils/project-context.js.map +1 -0
  275. package/dist/utils/project-root.d.ts +79 -0
  276. package/dist/utils/project-root.d.ts.map +1 -0
  277. package/dist/utils/project-root.js +108 -0
  278. package/dist/utils/project-root.js.map +1 -0
  279. package/dist/utils/sql-dump-converters.d.ts +188 -0
  280. package/dist/utils/sql-dump-converters.d.ts.map +1 -0
  281. package/dist/utils/sql-dump-converters.js +311 -0
  282. package/dist/utils/sql-dump-converters.js.map +1 -0
  283. package/dist/utils/sql-dump.d.ts +102 -0
  284. package/dist/utils/sql-dump.d.ts.map +1 -0
  285. package/dist/utils/sql-dump.js +1550 -0
  286. package/dist/utils/sql-dump.js.map +1 -0
  287. package/dist/utils/vcs-adapter.d.ts +42 -0
  288. package/dist/utils/vcs-adapter.d.ts.map +1 -1
  289. package/dist/utils/vcs-adapter.js +154 -0
  290. package/dist/utils/vcs-adapter.js.map +1 -1
  291. package/dist/watcher/file-watcher.d.ts.map +1 -1
  292. package/dist/watcher/file-watcher.js +48 -49
  293. package/dist/watcher/file-watcher.js.map +1 -1
  294. package/dist/watcher/gitignore-parser.d.ts.map +1 -1
  295. package/dist/watcher/gitignore-parser.js +2 -1
  296. package/dist/watcher/gitignore-parser.js.map +1 -1
  297. package/docs/BASEADAPTER_IMPLEMENTATION.md +399 -0
  298. package/docs/DATABASE_AUTH.md +445 -0
  299. package/docs/DATABASE_MIGRATION.md +247 -0
  300. package/docs/MULTI_PROJECT_ARCHITECTURE.md +497 -0
  301. package/package.json +12 -4
  302. package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +0 -1
  303. package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.js.map +0 -1
  304. package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +0 -1
  305. package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.js.map +0 -1
  306. package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.d.ts.map +0 -1
  307. package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.js.map +0 -1
  308. package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +0 -1
  309. package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.js.map +0 -1
  310. package/dist/migrations/knex/bootstrap/20251025070349_create_views.d.ts.map +0 -1
  311. package/dist/migrations/knex/bootstrap/20251025070349_create_views.js.map +0 -1
  312. package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +0 -1
  313. package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +0 -15
  314. package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +0 -1
  315. package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +0 -1
  316. package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +0 -1
  317. package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +0 -1
  318. package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.js.map +0 -1
  319. package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +0 -1
  320. package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +0 -1
  321. package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +0 -1
  322. package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.js.map +0 -1
  323. package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +0 -1
  324. package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +0 -1
  325. package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +0 -1
  326. package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +0 -1
  327. package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +0 -1
  328. package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js +0 -34
  329. package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +0 -1
  330. package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +0 -1
  331. package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +0 -1
  332. package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +0 -1
  333. package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.js.map +0 -1
  334. package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +0 -1
  335. package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js.map +0 -1
  336. package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +0 -1
  337. package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +0 -1
  338. package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +0 -1
  339. package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +0 -1
  340. package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +0 -1
  341. package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +0 -1
  342. package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +0 -1
  343. package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +0 -1
  344. package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +0 -1
  345. package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +0 -1
  346. package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +0 -1
  347. package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +0 -1
  348. package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +0 -1
  349. package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +0 -1
  350. /package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.d.ts +0 -0
  351. /package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.d.ts +0 -0
  352. /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.d.ts +0 -0
  353. /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.js +0 -0
  354. /package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.d.ts +0 -0
  355. /package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.d.ts +0 -0
  356. /package/dist/{migrations → config}/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts +0 -0
  357. /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts +0 -0
  358. /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.js +0 -0
  359. /package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.d.ts +0 -0
  360. /package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts +0 -0
  361. /package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.d.ts +0 -0
  362. /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts +0 -0
  363. /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.js +0 -0
  364. /package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts +0 -0
  365. /package/dist/{migrations → config}/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts +0 -0
  366. /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts +0 -0
  367. /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js +0 -0
  368. /package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.d.ts +0 -0
  369. /package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.d.ts +0 -0
  370. /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts +0 -0
  371. /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js +0 -0
  372. /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts +0 -0
  373. /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js +0 -0
  374. /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts +0 -0
  375. /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js +0 -0
  376. /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts +0 -0
  377. /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js +0 -0
  378. /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts +0 -0
  379. /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js +0 -0
  380. /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts +0 -0
  381. /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js +0 -0
  382. /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts +0 -0
  383. /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js +0 -0
@@ -0,0 +1,330 @@
1
+ import { describe, it, before, after } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import knex from 'knex';
4
+ import path from 'path';
5
+ import fs from 'fs/promises';
6
+ /**
7
+ * Migration Idempotency Tests
8
+ *
9
+ * Tests that all migrations can be safely run multiple times without errors.
10
+ * This validates idempotency checks in migration code and catches errors like:
11
+ * - "duplicate column name"
12
+ * - "table already exists"
13
+ * - "UNIQUE constraint failed"
14
+ * - "index already exists"
15
+ *
16
+ * Critical Scenarios:
17
+ * - Running same migration twice
18
+ * - Partial schema states (some objects exist, others don't)
19
+ * - knex_migrations table mismatch (schema exists but migration not recorded)
20
+ * - Migration recovery after error
21
+ */
22
+ describe('Migration Idempotency Tests', () => {
23
+ let testDbPath;
24
+ let db;
25
+ before(async () => {
26
+ // Create temporary test database directory
27
+ const tmpDir = path.join(process.cwd(), '.tmp-test-idempotency');
28
+ await fs.mkdir(tmpDir, { recursive: true });
29
+ testDbPath = path.join(tmpDir, 'idempotency-test.db');
30
+ });
31
+ after(async () => {
32
+ // Cleanup
33
+ if (db) {
34
+ await db.destroy();
35
+ }
36
+ try {
37
+ await fs.unlink(testDbPath);
38
+ }
39
+ catch (error) {
40
+ // Ignore if file doesn't exist
41
+ }
42
+ });
43
+ /**
44
+ * Test: Bootstrap Migrations Idempotency
45
+ *
46
+ * Tests that all bootstrap migrations can be run twice without errors.
47
+ */
48
+ it('should allow running bootstrap migrations twice', async () => {
49
+ console.log(' 🔄 Testing bootstrap migration idempotency...');
50
+ // Remove existing database
51
+ try {
52
+ await fs.unlink(testDbPath);
53
+ }
54
+ catch (error) {
55
+ // Ignore if doesn't exist
56
+ }
57
+ // Initialize database
58
+ db = knex({
59
+ client: 'better-sqlite3',
60
+ connection: {
61
+ filename: testDbPath,
62
+ },
63
+ useNullAsDefault: true,
64
+ migrations: {
65
+ directory: path.join(process.cwd(), 'dist/config/knex'),
66
+ loadExtensions: ['.js'],
67
+ },
68
+ });
69
+ const bootstrapMigrations = [
70
+ '20251025020452_create_master_tables',
71
+ '20251025021152_create_transaction_tables',
72
+ '20251025021351_create_indexes',
73
+ '20251025021416_seed_master_data',
74
+ '20251025070349_create_views',
75
+ ];
76
+ // Run migrations first time
77
+ for (const migrationName of bootstrapMigrations) {
78
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'bootstrap', `${migrationName}.js`);
79
+ const migration = await import(migrationPath);
80
+ await migration.up(db);
81
+ console.log(` ✓ Applied ${migrationName} (1st run)`);
82
+ }
83
+ // Run migrations second time - should skip with idempotency checks
84
+ for (const migrationName of bootstrapMigrations) {
85
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'bootstrap', `${migrationName}.js`);
86
+ // Clear require cache to force re-import
87
+ const cacheBuster = `?t=${Date.now()}`;
88
+ const migration = await import(migrationPath + cacheBuster);
89
+ // Should not throw errors
90
+ await migration.up(db);
91
+ console.log(` ✓ Re-ran ${migrationName} (2nd run - idempotent)`);
92
+ }
93
+ // Verify schema is intact
94
+ const tables = await db.raw(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);
95
+ const tableNames = tables.map((t) => t.name);
96
+ assert.ok(tableNames.includes('m_agents'), 'Should have m_agents table');
97
+ assert.ok(tableNames.includes('t_decisions'), 'Should have t_decisions table');
98
+ assert.ok(tableNames.includes('t_tasks'), 'Should have t_tasks table');
99
+ console.log(` ✅ Bootstrap migrations are idempotent`);
100
+ });
101
+ /**
102
+ * Test: Enhancement Migrations Idempotency
103
+ *
104
+ * Tests that all enhancement migrations can be run twice without errors.
105
+ * This specifically catches the errors user encountered:
106
+ * - "duplicate column name: link_type"
107
+ * - "table m_help_tools already exists"
108
+ * - "UNIQUE constraint failed"
109
+ */
110
+ it('should allow running enhancement migrations twice', async () => {
111
+ console.log(' 🔄 Testing enhancement migration idempotency...');
112
+ const enhancementMigrations = [
113
+ '20251025081221_add_link_type_to_task_decision_links',
114
+ '20251025082220_fix_task_dependencies_columns',
115
+ '20251025090000_create_help_system_tables',
116
+ '20251025090100_seed_help_categories_and_use_cases',
117
+ '20251025100000_seed_help_metadata',
118
+ '20251025100100_seed_remaining_use_cases',
119
+ '20251025120000_add_cascade_to_task_dependencies',
120
+ '20251027000000_add_agent_reuse_system',
121
+ '20251027010000_add_task_constraint_to_decision_context',
122
+ '20251027020000_update_agent_reusability',
123
+ '20251028000000_simplify_agent_system',
124
+ '20251031000000_drop_orphaned_message_view',
125
+ ];
126
+ // Run migrations first time
127
+ for (const migrationName of enhancementMigrations) {
128
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'enhancements', `${migrationName}.js`);
129
+ const migration = await import(migrationPath);
130
+ await migration.up(db);
131
+ console.log(` ✓ Applied ${migrationName} (1st run)`);
132
+ }
133
+ // Run migrations second time - should skip with idempotency checks
134
+ for (const migrationName of enhancementMigrations) {
135
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'enhancements', `${migrationName}.js`);
136
+ // Clear require cache
137
+ const cacheBuster = `?t=${Date.now()}`;
138
+ const migration = await import(migrationPath + cacheBuster);
139
+ // Should not throw errors (this is where user's errors occurred)
140
+ await migration.up(db);
141
+ console.log(` ✓ Re-ran ${migrationName} (2nd run - idempotent)`);
142
+ }
143
+ // Verify v3.6 schema
144
+ const tables = await db.raw(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);
145
+ const tableNames = tables.map((t) => t.name);
146
+ assert.ok(tableNames.includes('m_help_tools'), 'Should have help tables');
147
+ // Verify link_type column exists (user's "duplicate column name" error)
148
+ const hasLinkType = await db.schema.hasColumn('t_task_decision_links', 'link_type');
149
+ assert.ok(hasLinkType, 'Should have link_type column');
150
+ console.log(` ✅ Enhancement migrations are idempotent`);
151
+ });
152
+ /**
153
+ * Test: Upgrade Migrations Idempotency
154
+ *
155
+ * Tests that all upgrade migrations can be run twice without errors.
156
+ * Note: v3.7.0 migrations were consolidated into a single migration.
157
+ */
158
+ it('should allow running upgrade migrations twice', async () => {
159
+ console.log(' 🔄 Testing upgrade migration idempotency...');
160
+ const upgradeMigrations = [
161
+ '20251104000000_add_multi_project_v3_7_0',
162
+ ];
163
+ // Run migrations first time
164
+ for (const migrationName of upgradeMigrations) {
165
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'upgrades', `${migrationName}.js`);
166
+ const migration = await import(migrationPath);
167
+ await migration.up(db);
168
+ console.log(` ✓ Applied ${migrationName} (1st run)`);
169
+ }
170
+ // Run migrations second time - should skip with idempotency checks
171
+ for (const migrationName of upgradeMigrations) {
172
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'upgrades', `${migrationName}.js`);
173
+ // Clear require cache
174
+ const cacheBuster = `?t=${Date.now()}`;
175
+ const migration = await import(migrationPath + cacheBuster);
176
+ // Should not throw errors
177
+ await migration.up(db);
178
+ console.log(` ✓ Re-ran ${migrationName} (2nd run - idempotent)`);
179
+ }
180
+ // Verify v3.7 schema
181
+ const tables = await db.raw(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);
182
+ const tableNames = tables.map((t) => t.name);
183
+ assert.ok(tableNames.includes('m_projects'), 'Should have m_projects table');
184
+ // Verify project_id column exists
185
+ const hasProjectId = await db.schema.hasColumn('t_decisions', 'project_id');
186
+ assert.ok(hasProjectId, 'Should have project_id column in t_decisions');
187
+ console.log(` ✅ Upgrade migrations are idempotent`);
188
+ });
189
+ /**
190
+ * Test: m_config Structure Validation
191
+ *
192
+ * Tests that m_config table has correct PRIMARY KEY structure after consolidated migration.
193
+ * Note: m_config enhancement logic was merged into the consolidated v3.7.0 migration.
194
+ */
195
+ it('should have correct m_config structure after consolidated migration', async () => {
196
+ console.log(' 🔍 Validating m_config structure...');
197
+ // Verify m_config structure (user's "nullable PRIMARY KEY" error should be fixed)
198
+ const configSchema = await db.raw(`SELECT sql FROM sqlite_master WHERE type='table' AND name='m_config'`);
199
+ const configSql = configSchema[0]?.sql || '';
200
+ assert.ok(configSql.includes('primary key (`key`)'), 'm_config should have single-column PRIMARY KEY');
201
+ assert.ok(!configSql.includes('primary key (`key`, `project_id`)'), 'm_config should NOT have composite PRIMARY KEY');
202
+ // Verify project_id column exists and is nullable
203
+ const hasProjectId = await db.schema.hasColumn('m_config', 'project_id');
204
+ assert.ok(hasProjectId, 'm_config should have project_id column');
205
+ console.log(` ✅ m_config structure is correct (single-column PRIMARY KEY, nullable project_id)`);
206
+ });
207
+ /**
208
+ * Test: Partial Schema State Recovery
209
+ *
210
+ * Simulates user's scenario: database has schema objects but knex_migrations
211
+ * table doesn't record all migrations. Tests that migrations can detect
212
+ * existing objects and skip gracefully.
213
+ */
214
+ it('should handle partial schema states (missing knex_migrations records)', async () => {
215
+ console.log(' 🔄 Testing partial schema state recovery...');
216
+ // Simulate user's scenario: delete knex_migrations table
217
+ // (schema exists, but Knex thinks migrations weren't run)
218
+ await db.schema.dropTableIfExists('knex_migrations');
219
+ await db.schema.dropTableIfExists('knex_migrations_lock');
220
+ console.log(` ⚠️ Simulated missing knex_migrations table`);
221
+ // Re-run all migrations - should skip existing objects
222
+ // Note: v3.7.0 migrations were consolidated into a single migration
223
+ const allMigrations = [
224
+ // Bootstrap
225
+ { folder: 'bootstrap', name: '20251025020452_create_master_tables' },
226
+ { folder: 'bootstrap', name: '20251025021152_create_transaction_tables' },
227
+ { folder: 'bootstrap', name: '20251025021351_create_indexes' },
228
+ { folder: 'bootstrap', name: '20251025021416_seed_master_data' },
229
+ { folder: 'bootstrap', name: '20251025070349_create_views' },
230
+ // Enhancements
231
+ { folder: 'enhancements', name: '20251025081221_add_link_type_to_task_decision_links' },
232
+ { folder: 'enhancements', name: '20251025082220_fix_task_dependencies_columns' },
233
+ { folder: 'enhancements', name: '20251025090000_create_help_system_tables' },
234
+ { folder: 'enhancements', name: '20251025090100_seed_help_categories_and_use_cases' },
235
+ { folder: 'enhancements', name: '20251025100000_seed_help_metadata' },
236
+ { folder: 'enhancements', name: '20251025120000_add_cascade_to_task_dependencies' },
237
+ { folder: 'enhancements', name: '20251027000000_add_agent_reuse_system' },
238
+ { folder: 'enhancements', name: '20251027020000_update_agent_reusability' },
239
+ { folder: 'enhancements', name: '20251028000000_simplify_agent_system' },
240
+ { folder: 'enhancements', name: '20251031000000_drop_orphaned_message_view' },
241
+ // Upgrades - v3.7.0 consolidated migration
242
+ { folder: 'upgrades', name: '20251104000000_add_multi_project_v3_7_0' },
243
+ ];
244
+ for (const { folder, name } of allMigrations) {
245
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', folder, `${name}.js`);
246
+ const cacheBuster = `?t=${Date.now()}`;
247
+ const migration = await import(migrationPath + cacheBuster);
248
+ // Should not throw errors - idempotency checks should skip existing objects
249
+ await migration.up(db);
250
+ console.log(` ✓ Recovered ${name}`);
251
+ }
252
+ // Verify schema is still intact
253
+ const tables = await db.raw(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);
254
+ const tableNames = tables.map((t) => t.name);
255
+ assert.ok(tableNames.includes('m_projects'), 'Should still have m_projects');
256
+ assert.ok(tableNames.includes('m_help_tools'), 'Should still have help tables');
257
+ assert.ok(tableNames.includes('t_decisions'), 'Should still have t_decisions');
258
+ console.log(` ✅ Partial schema state recovery successful`);
259
+ });
260
+ /**
261
+ * Test: Data Preservation During Re-runs
262
+ *
263
+ * Tests that data is not lost or duplicated when migrations run twice.
264
+ */
265
+ it('should preserve data when migrations run twice', async () => {
266
+ console.log(' 📝 Testing data preservation during re-runs...');
267
+ // Insert test data
268
+ const now = Math.floor(Date.now() / 1000);
269
+ await db('m_context_keys').insert({
270
+ id: 888,
271
+ key: 'test-idempotency-key',
272
+ });
273
+ await db('t_decisions').insert({
274
+ key_id: 888,
275
+ project_id: 1,
276
+ value: 'test value should not duplicate',
277
+ ts: now,
278
+ });
279
+ // Count decisions before re-run
280
+ const countBefore = await db('t_decisions').where({ key_id: 888 }).count('* as count').first();
281
+ assert.strictEqual(countBefore?.count, 1, 'Should have 1 decision before re-run');
282
+ // Re-run a few migrations
283
+ const testMigrations = [
284
+ { folder: 'enhancements', name: '20251025090000_create_help_system_tables' },
285
+ { folder: 'enhancements', name: '20251025090100_seed_help_categories_and_use_cases' },
286
+ ];
287
+ for (const { folder, name } of testMigrations) {
288
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', folder, `${name}.js`);
289
+ const cacheBuster = `?t=${Date.now()}`;
290
+ const migration = await import(migrationPath + cacheBuster);
291
+ await migration.up(db);
292
+ }
293
+ // Verify data still exists and wasn't duplicated
294
+ const countAfter = await db('t_decisions').where({ key_id: 888 }).count('* as count').first();
295
+ assert.strictEqual(countAfter?.count, 1, 'Should still have 1 decision after re-run');
296
+ const decision = await db('t_decisions').where({ key_id: 888 }).first();
297
+ assert.strictEqual(decision?.value, 'test value should not duplicate', 'Data should be preserved');
298
+ console.log(` ✅ Data preservation verified`);
299
+ });
300
+ /**
301
+ * Test: down() Migration Idempotency
302
+ *
303
+ * Tests that down() migrations can be run safely (for rollback scenarios).
304
+ */
305
+ it('should allow running down() migrations safely', async () => {
306
+ console.log(' 🔄 Testing down() migration idempotency...');
307
+ // Test down() migrations that were fixed
308
+ const testDownMigrations = [
309
+ { folder: 'enhancements', name: '20251028000000_simplify_agent_system' },
310
+ { folder: 'enhancements', name: '20251031000000_drop_orphaned_message_view' },
311
+ ];
312
+ for (const { folder, name } of testDownMigrations) {
313
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', folder, `${name}.js`);
314
+ const migration = await import(migrationPath);
315
+ // Run down() first time
316
+ await migration.down(db);
317
+ console.log(` ✓ Rolled back ${name} (1st run)`);
318
+ // Run down() second time - should skip existing objects
319
+ const cacheBuster = `?t=${Date.now()}`;
320
+ const migration2 = await import(migrationPath + cacheBuster);
321
+ await migration2.down(db);
322
+ console.log(` ✓ Re-ran rollback ${name} (2nd run - idempotent)`);
323
+ // Run up() again to restore state
324
+ await migration.up(db);
325
+ console.log(` ✓ Restored ${name}`);
326
+ }
327
+ console.log(` ✅ down() migrations are idempotent`);
328
+ });
329
+ });
330
+ //# sourceMappingURL=migration-idempotency.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-idempotency.test.js","sourceRoot":"","sources":["../../src/tests/migration-idempotency.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAc,MAAM,MAAM,CAAC;AAClC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7B;;;;;;;;;;;;;;;GAeG;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,IAAI,UAAkB,CAAC;IACvB,IAAI,EAAQ,CAAC;IAEb,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,2CAA2C;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,UAAU;QACV,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+BAA+B;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QAEjE,2BAA2B;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0BAA0B;QAC5B,CAAC;QAED,sBAAsB;QACtB,EAAE,GAAG,IAAI,CAAC;YACR,MAAM,EAAE,gBAAgB;YACxB,UAAU,EAAE;gBACV,QAAQ,EAAE,UAAU;aACrB;YACD,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE;gBACV,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC;gBACvD,cAAc,EAAE,CAAC,KAAK,CAAC;aACxB;SACF,CAAC,CAAC;QAEH,MAAM,mBAAmB,GAAG;YAC1B,qCAAqC;YACrC,0CAA0C;YAC1C,+BAA+B;YAC/B,iCAAiC;YACjC,6BAA6B;SAC9B,CAAC;QAEF,4BAA4B;QAC5B,KAAK,MAAM,aAAa,IAAI,mBAAmB,EAAE,CAAC;YAChD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,EAClB,WAAW,EACX,GAAG,aAAa,KAAK,CACtB,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,aAAa,YAAY,CAAC,CAAC;QAC5D,CAAC;QAED,mEAAmE;QACnE,KAAK,MAAM,aAAa,IAAI,mBAAmB,EAAE,CAAC;YAChD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,EAClB,WAAW,EACX,GAAG,aAAa,KAAK,CACtB,CAAC;YAEF,yCAAyC;YACzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC;YAE5D,0BAA0B;YAC1B,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,kBAAkB,aAAa,yBAAyB,CAAC,CAAC;QACxE,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/F,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAElD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,4BAA4B,CAAC,CAAC;QACzE,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,+BAA+B,CAAC,CAAC;QAC/E,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAEvE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH;;;;;;;;OAQG;IACH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QAEnE,MAAM,qBAAqB,GAAG;YAC5B,qDAAqD;YACrD,8CAA8C;YAC9C,0CAA0C;YAC1C,mDAAmD;YACnD,mCAAmC;YACnC,yCAAyC;YACzC,iDAAiD;YACjD,uCAAuC;YACvC,wDAAwD;YACxD,yCAAyC;YACzC,sCAAsC;YACtC,2CAA2C;SAC5C,CAAC;QAEF,4BAA4B;QAC5B,KAAK,MAAM,aAAa,IAAI,qBAAqB,EAAE,CAAC;YAClD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,EAClB,cAAc,EACd,GAAG,aAAa,KAAK,CACtB,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,aAAa,YAAY,CAAC,CAAC;QAC5D,CAAC;QAED,mEAAmE;QACnE,KAAK,MAAM,aAAa,IAAI,qBAAqB,EAAE,CAAC;YAClD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,EAClB,cAAc,EACd,GAAG,aAAa,KAAK,CACtB,CAAC;YAEF,sBAAsB;YACtB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC;YAE5D,iEAAiE;YACjE,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,kBAAkB,aAAa,yBAAyB,CAAC,CAAC;QACxE,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/F,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAElD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAE1E,wEAAwE;QACxE,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;QACpF,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,8BAA8B,CAAC,CAAC;QAEvD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH;;;;;OAKG;IACH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAE/D,MAAM,iBAAiB,GAAG;YACxB,yCAAyC;SAC1C,CAAC;QAEF,4BAA4B;QAC5B,KAAK,MAAM,aAAa,IAAI,iBAAiB,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,EAClB,UAAU,EACV,GAAG,aAAa,KAAK,CACtB,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,aAAa,YAAY,CAAC,CAAC;QAC5D,CAAC;QAED,mEAAmE;QACnE,KAAK,MAAM,aAAa,IAAI,iBAAiB,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,EAClB,UAAU,EACV,GAAG,aAAa,KAAK,CACtB,CAAC;YAEF,sBAAsB;YACtB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC;YAE5D,0BAA0B;YAC1B,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,kBAAkB,aAAa,yBAAyB,CAAC,CAAC;QACxE,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/F,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAElD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,8BAA8B,CAAC,CAAC;QAE7E,kCAAkC;QAClC,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAC5E,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,8CAA8C,CAAC,CAAC;QAExE,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH;;;;;OAKG;IACH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAEvD,kFAAkF;QAClF,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QAC1G,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;QAE7C,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,gDAAgD,CAAC,CAAC;QACvG,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,gDAAgD,CAAC,CAAC;QAEtH,kDAAkD;QAClD,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACzE,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,wCAAwC,CAAC,CAAC;QAElE,OAAO,CAAC,GAAG,CAAC,sFAAsF,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;IAEH;;;;;;OAMG;IACH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAE/D,yDAAyD;QACzD,0DAA0D;QAC1D,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;QACrD,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;QAE1D,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QAEjE,uDAAuD;QACvD,oEAAoE;QACpE,MAAM,aAAa,GAAG;YACpB,YAAY;YACZ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,qCAAqC,EAAE;YACpE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,0CAA0C,EAAE;YACzE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,+BAA+B,EAAE;YAC9D,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,iCAAiC,EAAE;YAChE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,6BAA6B,EAAE;YAC5D,eAAe;YACf,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,qDAAqD,EAAE;YACvF,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,8CAA8C,EAAE;YAChF,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,0CAA0C,EAAE;YAC5E,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,mDAAmD,EAAE;YACrF,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,mCAAmC,EAAE;YACrE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,iDAAiD,EAAE;YACnF,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,uCAAuC,EAAE;YACzE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,yCAAyC,EAAE;YAC3E,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,sCAAsC,EAAE;YACxE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,2CAA2C,EAAE;YAC7E,2CAA2C;YAC3C,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,yCAAyC,EAAE;SACxE,CAAC;QAEF,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,aAAa,EAAE,CAAC;YAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,EAClB,MAAM,EACN,GAAG,IAAI,KAAK,CACb,CAAC;YAEF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC;YAE5D,4EAA4E;YAC5E,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,gCAAgC;QAChC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/F,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAElD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,8BAA8B,CAAC,CAAC;QAC7E,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,+BAA+B,CAAC,CAAC;QAChF,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,+BAA+B,CAAC,CAAC;QAE/E,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAElE,mBAAmB;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE1C,MAAM,EAAE,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC;YAChC,EAAE,EAAE,GAAG;YACP,GAAG,EAAE,sBAAsB;SAC5B,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;YAC7B,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,iCAAiC;YACxC,EAAE,EAAE,GAAG;SACR,CAAC,CAAC;QAEH,gCAAgC;QAChC,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/F,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,sCAAsC,CAAC,CAAC;QAElF,0BAA0B;QAC1B,MAAM,cAAc,GAAG;YACrB,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,0CAA0C,EAAE;YAC5E,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,mDAAmD,EAAE;SACtF,CAAC;QAEF,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,cAAc,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,EAClB,MAAM,EACN,GAAG,IAAI,KAAK,CACb,CAAC;YAEF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC;YAC5D,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;QAED,iDAAiD;QACjD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC;QAC9F,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,2CAA2C,CAAC,CAAC;QAEtF,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACxE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,iCAAiC,EAAE,0BAA0B,CAAC,CAAC;QAEnG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAE9D,yCAAyC;QACzC,MAAM,kBAAkB,GAAG;YACzB,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,sCAAsC,EAAE;YACxE,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,2CAA2C,EAAE;SAC9E,CAAC;QAEF,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,kBAAkB,EAAE,CAAC;YAClD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,EAClB,MAAM,EACN,GAAG,IAAI,KAAK,CACb,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAE9C,wBAAwB;YACxB,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,YAAY,CAAC,CAAC;YAErD,wDAAwD;YACxD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC;YAC7D,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,yBAAyB,CAAC,CAAC;YAEtE,kCAAkC;YAClC,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=migration-upgrade-paths.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-upgrade-paths.test.d.ts","sourceRoot":"","sources":["../../src/tests/migration-upgrade-paths.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,248 @@
1
+ import { describe, it, before, after } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import knex from 'knex';
4
+ import path from 'path';
5
+ import fs from 'fs/promises';
6
+ /**
7
+ * Migration Upgrade Path Tests
8
+ *
9
+ * Tests incremental version upgrades to catch migration errors that only
10
+ * appear when upgrading from older versions (not fresh installations).
11
+ *
12
+ * Critical Scenarios:
13
+ * - v3.5 → v3.6 (help system tables added)
14
+ * - v3.6 → v3.7 (multi-project support added)
15
+ * - v3.5 → v3.7 (direct upgrade path)
16
+ * - Failed migration recovery (run again after error)
17
+ *
18
+ * These tests validate idempotency and catch errors like:
19
+ * - "duplicate column name"
20
+ * - "table already exists"
21
+ * - "UNIQUE constraint failed"
22
+ */
23
+ describe('Migration Upgrade Path Tests', () => {
24
+ let testDbPath;
25
+ let db;
26
+ before(async () => {
27
+ // Create temporary test database directory
28
+ const tmpDir = path.join(process.cwd(), '.tmp-test-migrations');
29
+ await fs.mkdir(tmpDir, { recursive: true });
30
+ testDbPath = path.join(tmpDir, 'upgrade-test.db');
31
+ });
32
+ after(async () => {
33
+ // Cleanup
34
+ if (db) {
35
+ await db.destroy();
36
+ }
37
+ try {
38
+ await fs.unlink(testDbPath);
39
+ }
40
+ catch (error) {
41
+ // Ignore if file doesn't exist
42
+ }
43
+ });
44
+ /**
45
+ * Test: Fresh v3.5 Installation
46
+ *
47
+ * Creates a v3.5 schema to use as baseline for upgrade tests.
48
+ * Runs all migrations up to (but not including) v3.6.0 help system.
49
+ */
50
+ it('should create v3.5 schema from migrations', async () => {
51
+ console.log(' 📦 Creating v3.5 baseline schema...');
52
+ // Remove existing database
53
+ try {
54
+ await fs.unlink(testDbPath);
55
+ }
56
+ catch (error) {
57
+ // Ignore if doesn't exist
58
+ }
59
+ // Initialize database
60
+ db = knex({
61
+ client: 'better-sqlite3',
62
+ connection: {
63
+ filename: testDbPath,
64
+ },
65
+ useNullAsDefault: true,
66
+ migrations: {
67
+ directory: path.join(process.cwd(), 'dist/config/knex'),
68
+ loadExtensions: ['.js'],
69
+ },
70
+ });
71
+ // Run migrations up to v3.5 (before help system and multi-project)
72
+ // List of migrations to run for v3.5:
73
+ const v3_5_migrations = [
74
+ // Bootstrap
75
+ '20251025020452_create_master_tables',
76
+ '20251025021152_create_transaction_tables',
77
+ '20251025021351_create_indexes',
78
+ '20251025021416_seed_master_data',
79
+ '20251025070349_create_views',
80
+ // Enhancements
81
+ '20251025081221_add_link_type_to_task_decision_links',
82
+ '20251025082220_fix_task_dependencies_columns',
83
+ '20251025120000_add_cascade_to_task_dependencies',
84
+ ];
85
+ // Run specific migrations by manually executing them
86
+ for (const migrationName of v3_5_migrations) {
87
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'enhancements', `${migrationName}.js`);
88
+ // Check if file exists in enhancements folder
89
+ try {
90
+ await fs.access(migrationPath);
91
+ const migration = await import(migrationPath);
92
+ await migration.up(db);
93
+ console.log(` ✓ Applied ${migrationName}`);
94
+ }
95
+ catch (error) {
96
+ // Try bootstrap folder
97
+ const bootstrapPath = path.join(process.cwd(), 'dist/config/knex', 'bootstrap', `${migrationName}.js`);
98
+ try {
99
+ await fs.access(bootstrapPath);
100
+ const migration = await import(bootstrapPath);
101
+ await migration.up(db);
102
+ console.log(` ✓ Applied ${migrationName}`);
103
+ }
104
+ catch (bootstrapError) {
105
+ console.error(` ❌ Failed to find migration: ${migrationName}`);
106
+ throw bootstrapError;
107
+ }
108
+ }
109
+ }
110
+ // Verify v3.5 schema
111
+ const tables = await db.raw(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);
112
+ const tableNames = tables.map((t) => t.name);
113
+ assert.ok(tableNames.includes('m_agents'), 'Should have m_agents table');
114
+ assert.ok(tableNames.includes('t_decisions'), 'Should have t_decisions table');
115
+ assert.ok(tableNames.includes('t_tasks'), 'Should have t_tasks table');
116
+ assert.ok(!tableNames.includes('m_help_tools'), 'Should NOT have help tables in v3.5');
117
+ assert.ok(!tableNames.includes('m_projects'), 'Should NOT have m_projects in v3.5');
118
+ console.log(` ✅ v3.5 baseline created (${tableNames.length} tables)`);
119
+ });
120
+ /**
121
+ * Test: v3.5 → v3.6 Upgrade
122
+ *
123
+ * Tests upgrade from v3.5 to v3.6 (help system added).
124
+ * This should catch errors like:
125
+ * - "table m_help_tools already exists"
126
+ * - "UNIQUE constraint failed on help metadata"
127
+ */
128
+ it('should upgrade from v3.5 to v3.6 without errors', async () => {
129
+ console.log(' 🔄 Upgrading v3.5 → v3.6...');
130
+ // Apply v3.6 migrations (help system)
131
+ const v3_6_migrations = [
132
+ '20251025090000_create_help_system_tables',
133
+ '20251025090100_seed_help_categories_and_use_cases',
134
+ '20251025100000_seed_help_metadata',
135
+ '20251025100100_seed_remaining_use_cases',
136
+ '20251027000000_add_agent_reuse_system',
137
+ '20251027010000_add_task_constraint_to_decision_context',
138
+ '20251027020000_update_agent_reusability',
139
+ '20251028000000_simplify_agent_system',
140
+ '20251031000000_drop_orphaned_message_view',
141
+ ];
142
+ for (const migrationName of v3_6_migrations) {
143
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'enhancements', `${migrationName}.js`);
144
+ const migration = await import(migrationPath);
145
+ await migration.up(db);
146
+ console.log(` ✓ Applied ${migrationName}`);
147
+ }
148
+ // Verify v3.6 schema
149
+ const tables = await db.raw(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);
150
+ const tableNames = tables.map((t) => t.name);
151
+ assert.ok(tableNames.includes('m_help_tools'), 'Should have m_help_tools after v3.6');
152
+ assert.ok(tableNames.includes('m_help_actions'), 'Should have m_help_actions after v3.6');
153
+ assert.ok(!tableNames.includes('t_agent_messages'), 'Should NOT have t_agent_messages (dropped in v3.6.5)');
154
+ // Check help metadata was seeded
155
+ const toolCount = await db('m_help_tools').count('* as count').first();
156
+ assert.ok(toolCount && Number(toolCount.count) > 0, 'Should have seeded help tools');
157
+ console.log(` ✅ v3.6 upgrade successful (${tableNames.length} tables)`);
158
+ });
159
+ /**
160
+ * Test: v3.6 → v3.7 Upgrade
161
+ *
162
+ * Tests upgrade from v3.6 to v3.7 (multi-project support added).
163
+ * This should catch errors like:
164
+ * - "duplicate column name: project_id"
165
+ * - "All parts of PRIMARY KEY must be NOT NULL"
166
+ */
167
+ it('should upgrade from v3.6 to v3.7 without errors', async () => {
168
+ console.log(' 🔄 Upgrading v3.6 → v3.7...');
169
+ // Apply v3.7 consolidated migration (multi-project support)
170
+ // Note: 4 separate migrations were consolidated into 1 for v3.7.0
171
+ const v3_7_migrations = [
172
+ '20251104000000_add_multi_project_v3_7_0',
173
+ ];
174
+ for (const migrationName of v3_7_migrations) {
175
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'upgrades', `${migrationName}.js`);
176
+ const migration = await import(migrationPath);
177
+ await migration.up(db);
178
+ console.log(` ✓ Applied ${migrationName}`);
179
+ }
180
+ // Verify v3.7 schema
181
+ const tables = await db.raw(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);
182
+ const tableNames = tables.map((t) => t.name);
183
+ assert.ok(tableNames.includes('m_projects'), 'Should have m_projects after v3.7');
184
+ // Verify project_id was added to transaction tables
185
+ const hasProjectId = await db.schema.hasColumn('t_decisions', 'project_id');
186
+ assert.ok(hasProjectId, 'Should have project_id column in t_decisions');
187
+ // Verify m_config PRIMARY KEY structure (should be single-column, not composite)
188
+ const configSchema = await db.raw(`SELECT sql FROM sqlite_master WHERE type='table' AND name='m_config'`);
189
+ const configSql = configSchema[0]?.sql || '';
190
+ assert.ok(configSql.includes('primary key (`key`)'), 'm_config should have single-column PRIMARY KEY on key');
191
+ assert.ok(!configSql.includes('primary key (`key`, `project_id`)'), 'm_config should NOT have composite PRIMARY KEY');
192
+ console.log(` ✅ v3.7 upgrade successful (${tableNames.length} tables)`);
193
+ });
194
+ /**
195
+ * Test: Migration Idempotency
196
+ *
197
+ * Tests that running migrations twice doesn't cause errors.
198
+ * This catches issues where migrations don't check for existing objects.
199
+ */
200
+ it('should allow running v3.7 migrations again (idempotency test)', async () => {
201
+ console.log(' 🔄 Testing migration idempotency (re-running v3.7)...');
202
+ // Re-run v3.7 consolidated migration - should skip existing objects
203
+ const v3_7_migrations = [
204
+ '20251104000000_add_multi_project_v3_7_0',
205
+ ];
206
+ for (const migrationName of v3_7_migrations) {
207
+ const migrationPath = path.join(process.cwd(), 'dist/config/knex', 'upgrades', `${migrationName}.js`);
208
+ // Re-import to get fresh module (clear cache)
209
+ const cacheBuster = `?t=${Date.now()}`;
210
+ const migration = await import(migrationPath + cacheBuster);
211
+ await migration.up(db);
212
+ console.log(` ✓ Re-ran ${migrationName} (should skip existing objects)`);
213
+ }
214
+ // Verify schema is still intact
215
+ const tables = await db.raw(`SELECT name FROM sqlite_master WHERE type='table' ORDER BY name`);
216
+ const tableNames = tables.map((t) => t.name);
217
+ assert.ok(tableNames.includes('m_projects'), 'Should still have m_projects');
218
+ assert.ok(tableNames.includes('m_help_tools'), 'Should still have help tables');
219
+ console.log(` ✅ Idempotency test passed - no duplicate errors`);
220
+ });
221
+ /**
222
+ * Test: Seed Data and Upgrade
223
+ *
224
+ * Tests that seeded data is preserved during upgrades.
225
+ */
226
+ it('should preserve data during upgrades', async () => {
227
+ console.log(' 📝 Testing data preservation during upgrades...');
228
+ // Insert test data
229
+ const now = Math.floor(Date.now() / 1000);
230
+ // Insert into v3.5 tables
231
+ await db('m_context_keys').insert({
232
+ id: 999,
233
+ key: 'test-upgrade-key',
234
+ });
235
+ await db('t_decisions').insert({
236
+ key_id: 999,
237
+ project_id: 1, // Default project from migration
238
+ value: 'test value preserved across upgrade',
239
+ ts: now,
240
+ });
241
+ // Verify data exists
242
+ const decision = await db('t_decisions').where({ key_id: 999 }).first();
243
+ assert.ok(decision, 'Test decision should exist');
244
+ assert.strictEqual(decision.value, 'test value preserved across upgrade');
245
+ console.log(` ✅ Data preservation verified`);
246
+ });
247
+ });
248
+ //# sourceMappingURL=migration-upgrade-paths.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-upgrade-paths.test.js","sourceRoot":"","sources":["../../src/tests/migration-upgrade-paths.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Multi-Project Schema Migration Tests (v3.7.0)
3
+ *
4
+ * Tests comprehensive cross-database migration following user requirements:
5
+ * 1. Initialize SQLite, MySQL, MariaDB, PostgreSQL with migrations
6
+ * 2. Seed each database with multi-project test data
7
+ * 3. Export each database using sql-dump
8
+ * 4. Drop all schemas
9
+ * 5. Test whether dump SQL can be imported to all databases
10
+ *
11
+ * Uses DRY shared test utilities from test-helpers.ts
12
+ *
13
+ * NOTE: These tests require Docker containers (MySQL, MariaDB, PostgreSQL)
14
+ * Set SKIP_DOCKER_TESTS=true or CI=true to skip in CI environments
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=multi-project-migration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-project-migration.test.d.ts","sourceRoot":"","sources":["../../src/tests/multi-project-migration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}