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,445 @@
1
+ # Database Authentication Configuration
2
+
3
+ This document describes the authentication configuration system for multi-database support in mcp-sqlew v3.7.0+.
4
+
5
+ ## Overview
6
+
7
+ The configuration system supports multiple database backends with various authentication methods:
8
+
9
+ - **SQLite**: Local file-based database (default, no authentication)
10
+ - **PostgreSQL**: Remote PostgreSQL with direct authentication or IAM authentication (planned)
11
+ - **MySQL**: Remote MySQL with direct authentication or IAM authentication (planned)
12
+
13
+ **Note**: SSH tunneling is NOT supported by this software. Users must set up SSH tunnels manually using the `ssh` command and connect to localhost.
14
+
15
+ ## Configuration Structure
16
+
17
+ All configuration is defined in `.sqlew/config.toml` under the `[database]` section.
18
+
19
+ ### SQLite Configuration (Default)
20
+
21
+ The simplest configuration for local development:
22
+
23
+ ```toml
24
+ [database]
25
+ path = ".sqlew/sqlew.db"
26
+ ```
27
+
28
+ ### PostgreSQL/MySQL Configuration
29
+
30
+ Remote databases require three main sections:
31
+
32
+ 1. **Database Type**: Specifies the database system
33
+ 2. **Connection**: Server address and database name
34
+ 3. **Authentication**: Credentials and authentication method
35
+
36
+ ## Configuration Sections
37
+
38
+ ### 1. Database Type
39
+
40
+ ```toml
41
+ [database]
42
+ type = "postgres" # or "mysql" or "sqlite"
43
+ ```
44
+
45
+ Valid values: `sqlite`, `postgres`, `mysql`
46
+
47
+ ### 2. Connection Configuration
48
+
49
+ Required for PostgreSQL and MySQL:
50
+
51
+ ```toml
52
+ [database.connection]
53
+ host = "localhost" # Database server hostname or IP
54
+ port = 5432 # PostgreSQL: 5432, MySQL: 3306
55
+ database = "sqlew" # Database name
56
+ ```
57
+
58
+ **Fields**:
59
+ - `host` (required): Database server hostname or IP address
60
+ - `port` (required): Database server port (1-65535)
61
+ - `database` (required): Target database name
62
+
63
+ ### 3. Authentication Configuration
64
+
65
+ ```toml
66
+ [database.auth]
67
+ type = "direct" # Authentication method
68
+ user = "postgres" # Database username
69
+ password = "your-password" # Database password
70
+ ```
71
+
72
+ **Fields**:
73
+ - `type` (required): Authentication method
74
+ - `direct`: Standard username/password (or localhost connection through manual SSH tunnel)
75
+ - `aws-iam`: AWS RDS IAM authentication (planned)
76
+ - `gcp-iam`: GCP Cloud SQL IAM authentication (planned)
77
+ - `user` (optional): Database username
78
+ - `password` (optional): Database password
79
+
80
+ **Note**: For databases behind bastion hosts, users must set up SSH tunnels manually using the `ssh -L` command, then connect to localhost.
81
+
82
+ ### 4. SSL/TLS Configuration (Optional)
83
+
84
+ For encrypted database connections:
85
+
86
+ ```toml
87
+ [database.auth.ssl]
88
+ ca = "/path/to/ca-cert.pem" # CA certificate
89
+ cert = "/path/to/client-cert.pem" # Client certificate (mutual TLS)
90
+ key = "/path/to/client-key.pem" # Client private key (mutual TLS)
91
+ rejectUnauthorized = true # Reject self-signed certificates
92
+ ```
93
+
94
+ **Fields**:
95
+ - `ca` (optional): Certificate Authority certificate (file path or content)
96
+ - `cert` (optional): Client certificate for mutual TLS (file path or content)
97
+ - `key` (optional): Client private key for mutual TLS (file path or content)
98
+ - `rejectUnauthorized` (optional): Whether to reject unauthorized certificates (default: `true`)
99
+
100
+ **Security Note**: Setting `rejectUnauthorized = false` is not recommended for production.
101
+
102
+ ### 5. Manual SSH Tunnel Setup (For Databases Behind Bastion Hosts)
103
+
104
+ **SSH tunneling is NOT supported by this software.** Users must set up SSH tunnels manually before connecting.
105
+
106
+ **Manual Tunnel Setup:**
107
+
108
+ ```bash
109
+ # Example: Connect to database behind bastion host
110
+ ssh -L 3307:db.internal.example.com:3306 user@bastion.example.com
111
+
112
+ # Then configure sqlew to connect to localhost:
113
+ ```
114
+
115
+ ```toml
116
+ [database]
117
+ type = "mysql"
118
+
119
+ [database.connection]
120
+ host = "localhost" # Connect to tunnel endpoint
121
+ port = 3307 # Forwarded port (not 3306!)
122
+ database = "sqlew_db"
123
+
124
+ [database.auth]
125
+ type = "direct"
126
+ user = "mysql_user"
127
+ password = "db-password"
128
+ ```
129
+
130
+ **SSH Tunnel Command Options:**
131
+ - `-L localport:remotehost:remoteport`: Port forwarding specification
132
+ - `-N`: Don't execute remote command (tunnel only)
133
+ - `-f`: Run in background
134
+ - `-o ServerAliveInterval=60`: Keep connection alive
135
+
136
+ **Example with background tunnel:**
137
+ ```bash
138
+ ssh -f -N -L 3307:db.internal:3306 user@bastion.example.com
139
+ ```
140
+
141
+ ## Complete Examples
142
+
143
+ ### Example 1: PostgreSQL with Direct Authentication
144
+
145
+ ```toml
146
+ [database]
147
+ type = "postgres"
148
+
149
+ [database.connection]
150
+ host = "db.example.com"
151
+ port = 5432
152
+ database = "sqlew_production"
153
+
154
+ [database.auth]
155
+ type = "direct"
156
+ user = "postgres"
157
+ password = "secure-password"
158
+ ```
159
+
160
+ ### Example 2: PostgreSQL with SSL/TLS
161
+
162
+ ```toml
163
+ [database]
164
+ type = "postgres"
165
+
166
+ [database.connection]
167
+ host = "db.example.com"
168
+ port = 5432
169
+ database = "sqlew_production"
170
+
171
+ [database.auth]
172
+ type = "direct"
173
+ user = "postgres"
174
+ password = "secure-password"
175
+
176
+ [database.auth.ssl]
177
+ ca = "/path/to/ca-cert.pem"
178
+ rejectUnauthorized = true
179
+ ```
180
+
181
+ ### Example 3: PostgreSQL via Manual SSH Tunnel
182
+
183
+ **Step 1**: Set up SSH tunnel manually:
184
+ ```bash
185
+ ssh -L 5433:db.internal.example.com:5432 deploy@bastion.example.com
186
+ ```
187
+
188
+ **Step 2**: Configure sqlew to use localhost:
189
+ ```toml
190
+ [database]
191
+ type = "postgres"
192
+
193
+ [database.connection]
194
+ host = "localhost" # Tunnel endpoint
195
+ port = 5433 # Forwarded port (not 5432!)
196
+ database = "sqlew_production"
197
+
198
+ [database.auth]
199
+ type = "direct"
200
+ user = "postgres"
201
+ password = "db-password"
202
+ ```
203
+
204
+ ### Example 4: MySQL via Manual SSH Tunnel with SSL
205
+
206
+ **Step 1**: Set up SSH tunnel manually:
207
+ ```bash
208
+ ssh -f -N -L 53306:mysql.internal.example.com:3306 deploy@jump.example.com
209
+ ```
210
+
211
+ **Step 2**: Configure sqlew with SSL:
212
+ ```toml
213
+ [database]
214
+ type = "mysql"
215
+
216
+ [database.connection]
217
+ host = "localhost" # Tunnel endpoint
218
+ port = 53306 # Forwarded port
219
+ database = "sqlew_db"
220
+
221
+ [database.auth]
222
+ type = "direct"
223
+ user = "mysql_user"
224
+ password = "db-password"
225
+
226
+ [database.auth.ssl]
227
+ ca = "/path/to/ca.pem"
228
+ rejectUnauthorized = true
229
+ ```
230
+
231
+ ### Example 5: MySQL with Inline SSL Certificate
232
+
233
+ ```toml
234
+ [database]
235
+ type = "mysql"
236
+
237
+ [database.connection]
238
+ host = "db.example.com"
239
+ port = 3306
240
+ database = "sqlew_db"
241
+
242
+ [database.auth]
243
+ type = "direct"
244
+ user = "mysql_user"
245
+ password = "db-password"
246
+
247
+ [database.auth.ssl]
248
+ ca = """-----BEGIN CERTIFICATE-----
249
+ MIIEGzCCAwOgAwIBAgIQDKU...
250
+ ...certificate content...
251
+ -----END CERTIFICATE-----"""
252
+ rejectUnauthorized = true
253
+ ```
254
+
255
+ ## Validation Rules
256
+
257
+ The configuration loader validates all settings and provides clear error messages:
258
+
259
+ ### Database Type Validation
260
+ - Must be one of: `sqlite`, `postgres`, `mysql`
261
+
262
+ ### Connection Validation
263
+ - Required for PostgreSQL and MySQL
264
+ - `host`: Must be specified
265
+ - `port`: Must be between 1 and 65535
266
+ - `database`: Must be specified
267
+
268
+ ### Authentication Validation
269
+
270
+ **Direct Authentication**:
271
+ - `user`: Required
272
+ - `password`: Required
273
+
274
+ ### SSL Validation
275
+ - `rejectUnauthorized`: Must be a boolean (if specified)
276
+
277
+ ## Default Values
278
+
279
+ The configuration loader applies sensible defaults:
280
+
281
+ ### SSL Defaults
282
+ - `rejectUnauthorized`: true
283
+
284
+ ## Error Handling
285
+
286
+ ### Configuration Parsing Errors
287
+
288
+ If the TOML file is malformed:
289
+
290
+ ```
291
+ ⚠️ Failed to load config file: .sqlew/config.toml
292
+ Error: Unexpected character at line 5
293
+ Using default configuration
294
+ ```
295
+
296
+ ### Validation Errors
297
+
298
+ If configuration is invalid:
299
+
300
+ ```
301
+ ⚠️ Configuration validation failed: .sqlew/config.toml
302
+ - database.connection.host is required
303
+ - database.auth.user is required for direct authentication
304
+ Using default configuration
305
+ ```
306
+
307
+ ## Loading Configuration
308
+
309
+ The configuration is loaded automatically when the MCP server starts. You can also load it programmatically:
310
+
311
+ ```typescript
312
+ import { loadConfigFile, validateDatabaseConfig } from './config/loader.js';
313
+
314
+ // Load and validate
315
+ const config = loadConfigFile('.sqlew/config.toml');
316
+ const validation = validateDatabaseConfig(config.database);
317
+
318
+ if (!validation.valid) {
319
+ console.error('Invalid configuration:', validation.errors);
320
+ }
321
+ ```
322
+
323
+ ## Backward Compatibility
324
+
325
+ The new authentication system is fully backward compatible:
326
+
327
+ - Existing SQLite configurations continue to work
328
+ - The `path` field in `[database]` is still supported
329
+ - If no configuration is provided, SQLite with default path is used
330
+
331
+ ## Security Best Practices
332
+
333
+ 1. **Use Private Keys**: Prefer SSH private key authentication over passwords
334
+ 2. **Enable SSL**: Use SSL/TLS for all production database connections
335
+ 3. **Validate Certificates**: Keep `rejectUnauthorized = true` in production
336
+ 4. **Secure Credentials**: Never commit config.toml with passwords to version control
337
+ 5. **Restrict Permissions**: Set appropriate file permissions on private keys (chmod 600)
338
+ 6. **Environment Variables**: Consider using environment variables for sensitive data (future enhancement)
339
+
340
+ ## Troubleshooting
341
+
342
+ ### Connection Failures
343
+
344
+ **PostgreSQL connection refused**:
345
+ - Check that PostgreSQL is running
346
+ - Verify host and port are correct
347
+ - Ensure firewall allows connections
348
+ - Check pg_hba.conf for authentication settings
349
+
350
+ **Manual SSH tunnel issues**:
351
+ - Run `ssh -v -L ...` for verbose debugging
352
+ - Check SSH key permissions (`chmod 600 ~/.ssh/id_rsa`)
353
+ - Verify bastion host is reachable
354
+ - Ensure SSH port (usually 22) is open
355
+ - Check if local port is already in use (`netstat -an | grep <port>`)
356
+
357
+ **SSL certificate errors**:
358
+ - Verify CA certificate path is correct
359
+ - Check certificate is not expired
360
+ - Ensure certificate chain is complete
361
+ - For development, temporarily set `rejectUnauthorized = false` (not for production)
362
+
363
+ ### Configuration Validation
364
+
365
+ Use the test suite to validate your configuration:
366
+
367
+ ```bash
368
+ npx tsc
369
+ node dist/tests/config-loader.test.js
370
+ ```
371
+
372
+ ## API Reference
373
+
374
+ ### Functions
375
+
376
+ #### `loadConfigFile(configPath?: string): SqlewConfig`
377
+
378
+ Loads and parses configuration from TOML file.
379
+
380
+ **Parameters**:
381
+ - `configPath` (optional): Path to config file (default: `.sqlew/config.toml`)
382
+
383
+ **Returns**: Parsed and validated configuration
384
+
385
+ **Example**:
386
+ ```typescript
387
+ const config = loadConfigFile('.sqlew/config.toml');
388
+ ```
389
+
390
+ #### `validateDatabaseConfig(config: DatabaseConfig): { valid: boolean; errors: string[] }`
391
+
392
+ Validates database configuration.
393
+
394
+ **Parameters**:
395
+ - `config`: Database configuration object
396
+
397
+ **Returns**: Validation result with errors if any
398
+
399
+ **Example**:
400
+ ```typescript
401
+ const validation = validateDatabaseConfig(config.database);
402
+ if (!validation.valid) {
403
+ console.error('Validation errors:', validation.errors);
404
+ }
405
+ ```
406
+
407
+ #### `normalizeDatabaseConfig(config: DatabaseConfig): DatabaseConfig`
408
+
409
+ Normalizes database configuration by applying defaults.
410
+
411
+ **Parameters**:
412
+ - `config`: Partial database configuration
413
+
414
+ **Returns**: Complete database configuration with defaults
415
+
416
+ **Example**:
417
+ ```typescript
418
+ const normalized = normalizeDatabaseConfig({
419
+ type: 'postgres',
420
+ connection: { host: 'localhost', port: 5432, database: 'test' },
421
+ auth: {
422
+ type: 'direct',
423
+ user: 'postgres',
424
+ password: 'pass',
425
+ ssl: { ca: '/path/to/ca.pem' }
426
+ }
427
+ });
428
+ // normalized.auth.ssl.rejectUnauthorized === true (default applied)
429
+ ```
430
+
431
+ ## Future Enhancements
432
+
433
+ Planned authentication methods:
434
+
435
+ - **AWS RDS IAM Authentication**: Token-based authentication for AWS RDS
436
+ - **GCP Cloud SQL IAM Authentication**: Token-based authentication for GCP Cloud SQL
437
+ - **Environment Variable Substitution**: Reference environment variables in config
438
+ - **Credential Encryption**: Encrypt sensitive fields in config file
439
+
440
+ ## Related Documentation
441
+
442
+ - [Configuration Guide](./CONFIGURATION.md)
443
+ - [Database Setup](./DATABASE_SETUP.md)
444
+ - [Architecture Overview](../ARCHITECTURE.md)
445
+ - [Type Definitions](../src/config/types.ts)
@@ -0,0 +1,247 @@
1
+ # Database Migration Guide
2
+
3
+ This guide explains how to generate complete SQL dumps from your mcp-sqlew database for use with SQLite, MySQL/MariaDB, or PostgreSQL.
4
+
5
+ ## Overview
6
+
7
+ The `db:dump` CLI tool generates complete SQL dumps (CREATE TABLE + INSERT statements) compatible with SQLite, MySQL/MariaDB, and PostgreSQL formats. The generated SQL can be imported directly into an empty database without additional setup.
8
+
9
+ ## Usage
10
+
11
+ ### Basic Syntax
12
+
13
+ ```bash
14
+ npx sqlew db:dump [--from <source>] --format <target> [options]
15
+ ```
16
+
17
+ **Parameters:**
18
+ - `--from <source>`: Source database (sqlite, mysql, postgresql). Default: sqlite
19
+ - `--format <target>`: Target SQL format (sqlite, mysql, postgresql). **Required**
20
+ - `--output <file>`: Output file path (omit for stdout)
21
+ - `--tables <list>`: Comma-separated list of specific tables to dump
22
+ - `--chunk-size <n>`: Rows per INSERT statement (default: 100)
23
+ - `--on-conflict <mode>`: Duplicate key handling (error, ignore, replace). Default: error
24
+ - `--exclude-schema`: Exclude CREATE TABLE statements (data-only dump)
25
+ - `--db-path <path>`: SQLite database path (default: .sqlew/sqlew.db)
26
+
27
+ **Note:** By default, the dump includes both schema (CREATE TABLE) and data (INSERT) for complete migration.
28
+
29
+ ### Generate SQL Dumps
30
+
31
+ **From SQLite (default):**
32
+ ```bash
33
+ npx sqlew db:dump --format mysql --output dump-mysql.sql
34
+ npx sqlew db:dump --format postgresql --output dump-pg.sql
35
+ ```
36
+
37
+ **From MySQL:**
38
+ ```bash
39
+ # Configure connection via environment variables
40
+ export MYSQL_HOST=127.0.0.1
41
+ export MYSQL_PORT=3306
42
+ export MYSQL_USER=youruser
43
+ export MYSQL_PASSWORD=yourpass
44
+ export MYSQL_DATABASE=mcp_context
45
+
46
+ npx sqlew db:dump --from mysql --format sqlite --output dump-sqlite.sql
47
+ npx sqlew db:dump --from mysql --format postgresql --output dump-pg.sql
48
+ ```
49
+
50
+ **From PostgreSQL:**
51
+ ```bash
52
+ # Configure connection via environment variables
53
+ export PG_HOST=localhost
54
+ export PG_PORT=5432
55
+ export PG_USER=postgres
56
+ export PG_PASSWORD=yourpass
57
+ export PG_DATABASE=mcp_context
58
+
59
+ npx sqlew db:dump --from postgresql --format sqlite --output dump-sqlite.sql
60
+ npx sqlew db:dump --from postgresql --format mysql --output dump-mysql.sql
61
+ ```
62
+
63
+ ### Selective Table Export
64
+
65
+ Export only specific tables:
66
+
67
+ ```bash
68
+ npx sqlew db:dump --format mysql --tables t_decisions,t_tasks,m_agents --output partial.sql
69
+ ```
70
+
71
+ ### Custom Chunk Size
72
+
73
+ For large tables, adjust INSERT batch size:
74
+
75
+ ```bash
76
+ npx sqlew db:dump --format mysql --chunk-size 500 --output dump.sql
77
+ ```
78
+
79
+ ### Data-Only Dumps
80
+
81
+ For advanced use cases where you manage schema separately:
82
+
83
+ ```bash
84
+ npx sqlew db:dump --format mysql --exclude-schema --output data-only.sql
85
+ ```
86
+
87
+ This generates INSERT statements without CREATE TABLE, useful for:
88
+ - Importing into databases with existing schema
89
+ - Backup/restore of data only
90
+ - Data transfer between identical schemas
91
+
92
+ ### Conflict Resolution
93
+
94
+ Handle duplicate keys when importing into existing databases:
95
+
96
+ ```bash
97
+ # Ignore duplicates (safe for adding new data)
98
+ npx sqlew db:dump --format mysql --on-conflict ignore --output dump.sql
99
+
100
+ # Update existing rows (sync/overwrite mode)
101
+ npx sqlew db:dump --format mysql --on-conflict replace --output dump.sql
102
+
103
+ # Fail on duplicates (default, strict mode)
104
+ npx sqlew db:dump --format mysql --on-conflict error --output dump.sql
105
+ ```
106
+
107
+ **Modes:**
108
+ - `error` (default): Standard INSERT, fails if duplicate keys exist
109
+ - `ignore`: Skip duplicate rows (INSERT IGNORE / ON CONFLICT DO NOTHING)
110
+ - `replace`: Update existing rows with new values (ON DUPLICATE KEY UPDATE / ON CONFLICT DO UPDATE)
111
+
112
+ **Use cases:**
113
+ - `ignore`: Importing into a database that may already have some data
114
+ - `replace`: Synchronizing data from one database to another
115
+ - `error`: Fresh database migration where duplicates indicate a problem
116
+
117
+ ---
118
+
119
+ ## Supported Migration Paths
120
+
121
+ The `db:dump` tool supports **all 6 migration paths** between SQLite, MySQL/MariaDB, and PostgreSQL:
122
+
123
+ | Source | Target | Command |
124
+ |--------|--------|---------|
125
+ | SQLite | MySQL | `--format mysql` |
126
+ | SQLite | PostgreSQL | `--format postgresql` |
127
+ | MySQL | SQLite | `--from mysql --format sqlite` |
128
+ | PostgreSQL | SQLite | `--from postgresql --format sqlite` |
129
+ | MySQL | PostgreSQL | `--from mysql --format postgresql` |
130
+ | PostgreSQL | MySQL | `--from postgresql --format mysql` |
131
+
132
+ ---
133
+
134
+ ## Data Type Mappings
135
+
136
+ The tool automatically handles database-specific data type conversions:
137
+
138
+ ### Boolean Values
139
+
140
+ | SQLite | MySQL | PostgreSQL |
141
+ |--------|-------|------------|
142
+ | 0/1 | 0/1 (TINYINT) | FALSE/TRUE |
143
+
144
+ ### Binary Data
145
+
146
+ | SQLite | MySQL | PostgreSQL |
147
+ |--------|-------|------------|
148
+ | BLOB (hex) | X'hex' (BLOB) | '\xhex'::bytea |
149
+
150
+ ### Identifiers
151
+
152
+ | SQLite | MySQL | PostgreSQL |
153
+ |--------|-------|------------|
154
+ | "table" | \`table\` | "table" |
155
+
156
+ ### Text and Numeric Types
157
+
158
+ All databases handle TEXT, VARCHAR, INTEGER, and REAL types consistently. The tool preserves:
159
+ - Unix epoch timestamps (stored as INTEGER)
160
+ - UTF-8 text encoding
161
+ - NULL values
162
+
163
+ ---
164
+
165
+ ## Importing Generated SQL
166
+
167
+ The generated SQL is complete and self-contained. Import it directly into an **empty database**:
168
+
169
+ **SQLite:**
170
+ ```bash
171
+ sqlite3 your-database.db < dump-sqlite.sql
172
+ ```
173
+
174
+ **MySQL/MariaDB:**
175
+ ```bash
176
+ # Create empty database first
177
+ mysql -e "CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
178
+ # Import dump
179
+ mysql mydb < dump-mysql.sql
180
+ ```
181
+
182
+ **PostgreSQL:**
183
+ ```bash
184
+ # Create empty database first
185
+ createdb mydb
186
+ # Import dump
187
+ psql -d mydb -f dump-pg.sql
188
+ ```
189
+
190
+ **For existing databases with data:**
191
+ Use `--on-conflict ignore` or `--on-conflict replace` when generating the dump (see Conflict Resolution section above).
192
+
193
+ ## Transaction Safety
194
+
195
+ All generated SQL dumps are wrapped in database transactions:
196
+ - **MySQL/MariaDB**: `START TRANSACTION;` ... `COMMIT;`
197
+ - **PostgreSQL**: `BEGIN;` ... `COMMIT;`
198
+ - **SQLite**: `BEGIN TRANSACTION;` ... `COMMIT;`
199
+
200
+ If the import fails at any point, all changes are automatically rolled back, leaving the database in its original state. This prevents partial imports that would leave the database in an inconsistent state.
201
+
202
+ **Benefits:**
203
+ - Atomic imports: Either all data is imported successfully or nothing is changed
204
+ - Safe to retry: Failed imports don't leave partial data that needs cleanup
205
+ - Consistent state: Database is never left in an intermediate state
206
+
207
+ ---
208
+
209
+ ## Environment Variables
210
+
211
+ ### MySQL Configuration
212
+
213
+ ```bash
214
+ MYSQL_HOST=127.0.0.1 # Default: 127.0.0.1
215
+ MYSQL_PORT=3306 # Default: 3306
216
+ MYSQL_USER=root # Default: root
217
+ MYSQL_PASSWORD= # Default: empty
218
+ MYSQL_DATABASE=mcp_context # Default: mcp_context
219
+ ```
220
+
221
+ ### PostgreSQL Configuration
222
+
223
+ ```bash
224
+ PG_HOST=localhost # Default: localhost
225
+ PG_PORT=5432 # Default: 5432
226
+ PG_USER=postgres # Default: postgres
227
+ PG_PASSWORD= # Default: empty
228
+ PG_DATABASE=mcp_context # Default: mcp_context
229
+ ```
230
+
231
+ ---
232
+
233
+ ## Best Practices
234
+
235
+ 1. **Test on a copy** - Always test migrations on a database copy first
236
+ 2. **Create schema first** - Run Knex migrations before importing data
237
+ 3. **Review SQL before import** - Inspect generated SQL file for correctness
238
+ 4. **Verify row counts** - Compare source and target table row counts after import
239
+ 5. **Backup original data** - Keep backups before performing migrations
240
+
241
+ ---
242
+
243
+ ## Support
244
+
245
+ For issues or questions:
246
+ - GitHub Issues: https://github.com/sin5ddd/mcp-sqlew/issues
247
+ - Documentation: `/docs` directory in repository