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.
- package/CHANGELOG.md +398 -1
- package/README.md +58 -39
- package/assets/config.example.toml +93 -0
- package/assets/kanban-visualizer.png +0 -0
- package/assets/sample-agents/sqlew-architect.md +32 -13
- package/assets/sample-agents/sqlew-researcher.md +70 -17
- package/assets/sample-agents/sqlew-scrum-master.md +60 -25
- package/assets/schema.sql +2 -2
- package/dist/adapters/auth/auth-factory.d.ts +86 -0
- package/dist/adapters/auth/auth-factory.d.ts.map +1 -0
- package/dist/adapters/auth/auth-factory.js +103 -0
- package/dist/adapters/auth/auth-factory.js.map +1 -0
- package/dist/adapters/auth/auth-types.d.ts +30 -0
- package/dist/adapters/auth/auth-types.d.ts.map +1 -0
- package/dist/adapters/auth/auth-types.js +30 -0
- package/dist/adapters/auth/auth-types.js.map +1 -0
- package/dist/adapters/auth/base-auth-provider.d.ts +327 -0
- package/dist/adapters/auth/base-auth-provider.d.ts.map +1 -0
- package/dist/adapters/auth/base-auth-provider.js +111 -0
- package/dist/adapters/auth/base-auth-provider.js.map +1 -0
- package/dist/adapters/auth/direct-auth-provider.d.ts +356 -0
- package/dist/adapters/auth/direct-auth-provider.d.ts.map +1 -0
- package/dist/adapters/auth/direct-auth-provider.js +406 -0
- package/dist/adapters/auth/direct-auth-provider.js.map +1 -0
- package/dist/adapters/base-adapter.d.ts +638 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +557 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +13 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +27 -5
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/mysql-adapter.d.ts +547 -6
- package/dist/adapters/mysql-adapter.d.ts.map +1 -1
- package/dist/adapters/mysql-adapter.js +651 -32
- package/dist/adapters/mysql-adapter.js.map +1 -1
- package/dist/adapters/postgresql-adapter.d.ts +15 -4
- package/dist/adapters/postgresql-adapter.d.ts.map +1 -1
- package/dist/adapters/postgresql-adapter.js +19 -2
- package/dist/adapters/postgresql-adapter.js.map +1 -1
- package/dist/adapters/sqlite-adapter.d.ts +35 -5
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -1
- package/dist/adapters/sqlite-adapter.js +57 -18
- package/dist/adapters/sqlite-adapter.js.map +1 -1
- package/dist/cli/db-dump.d.ts +32 -0
- package/dist/cli/db-dump.d.ts.map +1 -0
- package/dist/cli/db-dump.js +409 -0
- package/dist/cli/db-dump.js.map +1 -0
- package/dist/cli.js +24 -14
- package/dist/cli.js.map +1 -1
- package/dist/config/example-generator.d.ts.map +1 -1
- package/dist/config/example-generator.js +4 -3
- package/dist/config/example-generator.js.map +1 -1
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.js +7 -2
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.js +49 -50
- package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021351_create_indexes.d.ts.map +1 -0
- package/dist/config/knex/bootstrap/20251025021351_create_indexes.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.js +11 -6
- package/dist/config/knex/bootstrap/20251025021416_seed_master_data.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025070349_create_views.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.js +66 -14
- package/dist/config/knex/bootstrap/20251025070349_create_views.js.map +1 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +22 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
- package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +1 -0
- package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.js +6 -0
- package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.js.map +1 -0
- package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js +6 -0
- package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
- package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.js +6 -0
- package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.js.map +1 -0
- package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +1 -0
- package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js +7 -0
- package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js +62 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +1 -0
- package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +1 -0
- package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.js +6 -0
- package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.js.map +1 -0
- package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.js +6 -0
- package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.js.map +1 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts +13 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js +48 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js.map +1 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts +24 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js +189 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js.map +1 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts +16 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js +65 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js.map +1 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts +23 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js +118 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js.map +1 -0
- package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +1 -0
- package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +1 -0
- package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +1 -0
- package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +1 -0
- package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +1 -0
- package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +1 -0
- package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +1 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts +49 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js +864 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js.map +1 -0
- package/dist/config/loader.d.ts +23 -3
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +155 -8
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +261 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config/writer.d.ts +65 -0
- package/dist/config/writer.d.ts.map +1 -0
- package/dist/config/writer.js +139 -0
- package/dist/config/writer.js.map +1 -0
- package/dist/database.d.ts +11 -2
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +65 -8
- package/dist/database.js.map +1 -1
- package/dist/index.js +186 -32
- package/dist/index.js.map +1 -1
- package/dist/knexfile.d.ts.map +1 -1
- package/dist/knexfile.js +88 -12
- package/dist/knexfile.js.map +1 -1
- package/dist/tests/all-features.test.js +15 -3
- package/dist/tests/all-features.test.js.map +1 -1
- package/dist/tests/config-loader.test.d.ts +6 -0
- package/dist/tests/config-loader.test.d.ts.map +1 -0
- package/dist/tests/config-loader.test.js +201 -0
- package/dist/tests/config-loader.test.js.map +1 -0
- package/dist/tests/connection-manager-integration.test.d.ts +2 -0
- package/dist/tests/connection-manager-integration.test.d.ts.map +1 -0
- package/dist/tests/connection-manager-integration.test.js +431 -0
- package/dist/tests/connection-manager-integration.test.js.map +1 -0
- package/dist/tests/connection-manager.test.d.ts +2 -0
- package/dist/tests/connection-manager.test.d.ts.map +1 -0
- package/dist/tests/connection-manager.test.js +361 -0
- package/dist/tests/connection-manager.test.js.map +1 -0
- package/dist/tests/dump-import.test.d.ts +15 -0
- package/dist/tests/dump-import.test.d.ts.map +1 -0
- package/dist/tests/dump-import.test.js +430 -0
- package/dist/tests/dump-import.test.js.map +1 -0
- package/dist/tests/migration-idempotency.test.d.ts +2 -0
- package/dist/tests/migration-idempotency.test.d.ts.map +1 -0
- package/dist/tests/migration-idempotency.test.js +330 -0
- package/dist/tests/migration-idempotency.test.js.map +1 -0
- package/dist/tests/migration-upgrade-paths.test.d.ts +2 -0
- package/dist/tests/migration-upgrade-paths.test.d.ts.map +1 -0
- package/dist/tests/migration-upgrade-paths.test.js +248 -0
- package/dist/tests/migration-upgrade-paths.test.js.map +1 -0
- package/dist/tests/multi-project-migration.test.d.ts +17 -0
- package/dist/tests/multi-project-migration.test.d.ts.map +1 -0
- package/dist/tests/multi-project-migration.test.js +399 -0
- package/dist/tests/multi-project-migration.test.js.map +1 -0
- package/dist/tests/multi-project.test.d.ts +5 -0
- package/dist/tests/multi-project.test.d.ts.map +1 -0
- package/dist/tests/multi-project.test.js +238 -0
- package/dist/tests/multi-project.test.js.map +1 -0
- package/dist/tests/schema-migration.test.d.ts +8 -0
- package/dist/tests/schema-migration.test.d.ts.map +1 -0
- package/dist/tests/schema-migration.test.js +108 -0
- package/dist/tests/schema-migration.test.js.map +1 -0
- package/dist/tests/sql-dump-converters.test.d.ts +7 -0
- package/dist/tests/sql-dump-converters.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-converters.test.js +314 -0
- package/dist/tests/sql-dump-converters.test.js.map +1 -0
- package/dist/tests/sql-dump-cross-database.test.d.ts +21 -0
- package/dist/tests/sql-dump-cross-database.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-cross-database.test.js +314 -0
- package/dist/tests/sql-dump-cross-database.test.js.map +1 -0
- package/dist/tests/sql-dump-default-conversions.test.d.ts +8 -0
- package/dist/tests/sql-dump-default-conversions.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-default-conversions.test.js +141 -0
- package/dist/tests/sql-dump-default-conversions.test.js.map +1 -0
- package/dist/tests/sql-dump-fk-constraints.test.d.ts +13 -0
- package/dist/tests/sql-dump-fk-constraints.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-fk-constraints.test.js +381 -0
- package/dist/tests/sql-dump-fk-constraints.test.js.map +1 -0
- package/dist/tests/sql-dump-indexes.test.d.ts +12 -0
- package/dist/tests/sql-dump-indexes.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-indexes.test.js +269 -0
- package/dist/tests/sql-dump-indexes.test.js.map +1 -0
- package/dist/tests/sql-dump-integration.test.d.ts +16 -0
- package/dist/tests/sql-dump-integration.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-integration.test.js +342 -0
- package/dist/tests/sql-dump-integration.test.js.map +1 -0
- package/dist/tests/sql-dump-table-ordering.test.d.ts +8 -0
- package/dist/tests/sql-dump-table-ordering.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-table-ordering.test.js +253 -0
- package/dist/tests/sql-dump-table-ordering.test.js.map +1 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js +11 -1
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
- package/dist/tests/tasks.watch-files-action.test.js +11 -1
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
- package/dist/tests/type-conversion.test.d.ts +8 -0
- package/dist/tests/type-conversion.test.d.ts.map +1 -0
- package/dist/tests/type-conversion.test.js +312 -0
- package/dist/tests/type-conversion.test.js.map +1 -0
- package/dist/tests/utils/test-helpers.d.ts +93 -0
- package/dist/tests/utils/test-helpers.d.ts.map +1 -0
- package/dist/tests/utils/test-helpers.js +407 -0
- package/dist/tests/utils/test-helpers.js.map +1 -0
- package/dist/tools/config.d.ts +58 -0
- package/dist/tools/config.d.ts.map +1 -0
- package/dist/tools/config.js +281 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +138 -122
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +216 -109
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +123 -102
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +583 -521
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +5 -0
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +176 -122
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +9 -26
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cleanup.d.ts +3 -0
- package/dist/utils/cleanup.d.ts.map +1 -1
- package/dist/utils/cleanup.js +14 -2
- package/dist/utils/cleanup.js.map +1 -1
- package/dist/utils/connection-manager.d.ts +59 -0
- package/dist/utils/connection-manager.d.ts.map +1 -0
- package/dist/utils/connection-manager.js +178 -0
- package/dist/utils/connection-manager.js.map +1 -0
- package/dist/utils/debug-logger.d.ts +8 -4
- package/dist/utils/debug-logger.d.ts.map +1 -1
- package/dist/utils/debug-logger.js +27 -7
- package/dist/utils/debug-logger.js.map +1 -1
- package/dist/utils/error-handler.d.ts +12 -2
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +22 -21
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/parameter-validator.d.ts.map +1 -1
- package/dist/utils/parameter-validator.js +36 -15
- package/dist/utils/parameter-validator.js.map +1 -1
- package/dist/utils/project-context.d.ts +111 -0
- package/dist/utils/project-context.d.ts.map +1 -0
- package/dist/utils/project-context.js +187 -0
- package/dist/utils/project-context.js.map +1 -0
- package/dist/utils/project-root.d.ts +79 -0
- package/dist/utils/project-root.d.ts.map +1 -0
- package/dist/utils/project-root.js +108 -0
- package/dist/utils/project-root.js.map +1 -0
- package/dist/utils/sql-dump-converters.d.ts +188 -0
- package/dist/utils/sql-dump-converters.d.ts.map +1 -0
- package/dist/utils/sql-dump-converters.js +311 -0
- package/dist/utils/sql-dump-converters.js.map +1 -0
- package/dist/utils/sql-dump.d.ts +102 -0
- package/dist/utils/sql-dump.d.ts.map +1 -0
- package/dist/utils/sql-dump.js +1550 -0
- package/dist/utils/sql-dump.js.map +1 -0
- package/dist/utils/vcs-adapter.d.ts +42 -0
- package/dist/utils/vcs-adapter.d.ts.map +1 -1
- package/dist/utils/vcs-adapter.js +154 -0
- package/dist/utils/vcs-adapter.js.map +1 -1
- package/dist/watcher/file-watcher.d.ts.map +1 -1
- package/dist/watcher/file-watcher.js +48 -49
- package/dist/watcher/file-watcher.js.map +1 -1
- package/dist/watcher/gitignore-parser.d.ts.map +1 -1
- package/dist/watcher/gitignore-parser.js +2 -1
- package/dist/watcher/gitignore-parser.js.map +1 -1
- package/docs/BASEADAPTER_IMPLEMENTATION.md +399 -0
- package/docs/DATABASE_AUTH.md +445 -0
- package/docs/DATABASE_MIGRATION.md +247 -0
- package/docs/MULTI_PROJECT_ARCHITECTURE.md +497 -0
- package/package.json +12 -4
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025070349_create_views.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025070349_create_views.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +0 -15
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js +0 -34
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +0 -1
- /package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.js +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts +0 -0
- /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
|