sqlew 3.6.10 → 3.7.1
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 +346 -0
- package/README.md +54 -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/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 +19 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +149 -4
- 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 +62 -6
- package/dist/database.js.map +1 -1
- package/dist/index.js +173 -39
- 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/migrations/test-all-versions-real.js +3 -0
- package/dist/tests/migrations/test-all-versions-real.js.map +1 -1
- 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 +593 -518
- 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 +6 -4
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +34 -9
- 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 +50 -16
- 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/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/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
|
@@ -168,7 +168,12 @@ export function validateActionParams(tool, action, params) {
|
|
|
168
168
|
// Get action specification
|
|
169
169
|
const spec = getActionSpec(tool, action);
|
|
170
170
|
if (!spec) {
|
|
171
|
-
|
|
171
|
+
// Suggest similar actions if available
|
|
172
|
+
const suggestions = suggestSimilarActions(tool, action);
|
|
173
|
+
const suggestionMsg = suggestions.length > 0
|
|
174
|
+
? ` Did you mean: ${suggestions.join(', ')}?`
|
|
175
|
+
: '';
|
|
176
|
+
throw new Error(`Unknown action "${action}".${suggestionMsg} See: ${tool}.help`);
|
|
172
177
|
}
|
|
173
178
|
// Check for missing required parameters
|
|
174
179
|
const missingParams = [];
|
|
@@ -183,23 +188,43 @@ export function validateActionParams(tool, action, params) {
|
|
|
183
188
|
const allValidParams = [...spec.required, ...spec.optional];
|
|
184
189
|
// Find typo suggestions
|
|
185
190
|
const typoSuggestions = findTypoSuggestions(providedParams, allValidParams);
|
|
186
|
-
//
|
|
187
|
-
|
|
191
|
+
// Check for unexpected/invalid parameters (not in valid list and no typo suggestion)
|
|
192
|
+
const unexpectedParams = [];
|
|
193
|
+
for (const provided of providedParams) {
|
|
194
|
+
if (!allValidParams.includes(provided) && !typoSuggestions[provided]) {
|
|
195
|
+
unexpectedParams.push(provided);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// If validation fails, throw concise structured error
|
|
199
|
+
if (missingParams.length > 0 || Object.keys(typoSuggestions).length > 0 || unexpectedParams.length > 0) {
|
|
200
|
+
// Build concise error message
|
|
201
|
+
let errorMsg = '';
|
|
202
|
+
if (missingParams.length > 0) {
|
|
203
|
+
errorMsg = `Missing: ${missingParams.join(', ')}`;
|
|
204
|
+
}
|
|
205
|
+
if (Object.keys(typoSuggestions).length > 0) {
|
|
206
|
+
const typoMsg = Object.entries(typoSuggestions)
|
|
207
|
+
.map(([wrong, correct]) => `${wrong} → ${correct}`)
|
|
208
|
+
.join(', ');
|
|
209
|
+
errorMsg = errorMsg
|
|
210
|
+
? `${errorMsg}. Invalid params: ${typoMsg}`
|
|
211
|
+
: `Invalid params: ${typoMsg}`;
|
|
212
|
+
}
|
|
213
|
+
if (unexpectedParams.length > 0) {
|
|
214
|
+
const unexpectedMsg = `Unexpected params: ${unexpectedParams.join(', ')}. Valid params: ${allValidParams.join(', ')}`;
|
|
215
|
+
errorMsg = errorMsg
|
|
216
|
+
? `${errorMsg}. ${unexpectedMsg}`
|
|
217
|
+
: unexpectedMsg;
|
|
218
|
+
}
|
|
188
219
|
const error = {
|
|
189
|
-
error:
|
|
190
|
-
? `Missing required parameter${missingParams.length > 1 ? 's' : ''} for action '${action}': ${missingParams.join(', ')}`
|
|
191
|
-
: `Invalid parameter name${Object.keys(typoSuggestions).length > 1 ? 's' : ''} detected`,
|
|
220
|
+
error: errorMsg,
|
|
192
221
|
action: action,
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
did_you_mean: Object.keys(typoSuggestions).length > 0 ? typoSuggestions : undefined,
|
|
198
|
-
example: spec.example,
|
|
199
|
-
hint: spec.hint,
|
|
200
|
-
need_help: `For comprehensive scenarios and examples, try: ${tool}({ action: "use_case" })`
|
|
222
|
+
reference: `${tool}.${action}`, // e.g., "decision.set"
|
|
223
|
+
missing: missingParams.length > 0 ? missingParams : undefined,
|
|
224
|
+
typos: Object.keys(typoSuggestions).length > 0 ? typoSuggestions : undefined,
|
|
225
|
+
hint: spec.hint
|
|
201
226
|
};
|
|
202
|
-
// Throw
|
|
227
|
+
// Throw concise JSON error (significantly reduced token usage)
|
|
203
228
|
throw new Error(JSON.stringify(error, null, 2));
|
|
204
229
|
}
|
|
205
230
|
}
|
|
@@ -217,7 +242,16 @@ export function validateActionParams(tool, action, params) {
|
|
|
217
242
|
export function validateBatchParams(tool, batchParamName, items, itemAction, maxItems = 50) {
|
|
218
243
|
// Check if batch parameter exists and is an array
|
|
219
244
|
if (!items || !Array.isArray(items)) {
|
|
220
|
-
|
|
245
|
+
// Detect if a JSON string was passed instead of a parsed object
|
|
246
|
+
const itemsAsAny = items;
|
|
247
|
+
if (typeof itemsAsAny === 'string' && (itemsAsAny.trim().startsWith('[') || itemsAsAny.trim().startsWith('{'))) {
|
|
248
|
+
throw new Error(`Parameter "${batchParamName}" received as JSON string instead of parsed array. ` +
|
|
249
|
+
`MCP tools require pre-parsed JSON objects, not stringified JSON. ` +
|
|
250
|
+
`The parameter must be a JavaScript array/object, not a string. ` +
|
|
251
|
+
`Received type: ${typeof itemsAsAny}`);
|
|
252
|
+
}
|
|
253
|
+
throw new Error(`Parameter "${batchParamName}" is required and must be an array. ` +
|
|
254
|
+
`Received type: ${typeof itemsAsAny}`);
|
|
221
255
|
}
|
|
222
256
|
// Check array is not empty
|
|
223
257
|
if (items.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameter-validator.js","sourceRoot":"","sources":["../../src/utils/parameter-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAYxE;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,CAAS,EAAE,CAAS;IAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IAEpC,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,oBAAoB;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,cAAc;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACrB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe;gBACzC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAM,YAAY;gBACtC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAM,WAAW;iBACtC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,oBAAoB,GAA6B;IACrD,IAAI,EAAE,CAAC,aAAa,CAAC;IACrB,GAAG,EAAE,CAAC,OAAO,CAAC;IACd,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,GAAG,EAAE,CAAC,UAAU,CAAC;IACjB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,GAAG,EAAE,CAAC,SAAS,CAAC;IAChB,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAC9B,GAAG,EAAE,CAAC,UAAU,CAAC;IACjB,GAAG,EAAE,CAAC,UAAU,CAAC;IACjB,KAAK,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC9B,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IACjC,IAAI,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC;IAChC,IAAI,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;IAC9B,IAAI,EAAE,CAAC,aAAa,CAAC;IACrB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,GAAG,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAC5B,IAAI,EAAE,CAAC,cAAc,CAAC;IACtB,GAAG,EAAE,CAAC,YAAY,CAAC;IACnB,GAAG,EAAE,CAAC,WAAW,CAAC;IAClB,GAAG,EAAE,CAAC,SAAS,CAAC;IAChB,EAAE,EAAE,CAAC,UAAU,CAAC;CACjB,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,QAAgB,EAAE,WAAqB;IAChE,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAE7C,4BAA4B;IAC5B,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC;QACxC,KAAK,MAAM,QAAQ,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3D,uDAAuD;YACvD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;YAC9B,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;YAC7C,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAE,sCAAsC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,mBAAmB,CAC1B,cAAwB,EACxB,WAAqB;IAErB,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,yCAAyC;QACzC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,iCAAiC;QACjC,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,SAAS;QACX,CAAC;QAED,4DAA4D;QAC5D,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACnE,IAAI,iBAAiB,EAAE,CAAC;YACtB,WAAW,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,wDAAwD;QACxD,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,YAAY,GAAG,QAAQ,CAAC;QAE5B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAClF,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;gBAC7C,YAAY,GAAG,QAAQ,CAAC;gBACxB,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,MAAyH,EACzH,MAAW;IAEX,mCAAmC;IACnC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa;QAC3D,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;IAC/F,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,
|
|
1
|
+
{"version":3,"file":"parameter-validator.js","sourceRoot":"","sources":["../../src/utils/parameter-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectContext Singleton - Manages current project identity for multi-project support
|
|
3
|
+
*
|
|
4
|
+
* Satisfies constraints:
|
|
5
|
+
* - #41 (CRITICAL): Caches project_id after first detection, no repeated DB queries
|
|
6
|
+
* - #44, #30 (HIGH): Provides getProjectId() and getProjectName() methods
|
|
7
|
+
* - #47 (HIGH): Provides reset() for test isolation
|
|
8
|
+
* - #23, #24 (CRITICAL): Config.toml as source of truth, auto-write on first run
|
|
9
|
+
*/
|
|
10
|
+
import type { Knex } from 'knex';
|
|
11
|
+
export interface ProjectMetadata {
|
|
12
|
+
id: number;
|
|
13
|
+
name: string;
|
|
14
|
+
display_name?: string;
|
|
15
|
+
detection_source: 'cli' | 'config' | 'git' | 'metadata' | 'directory';
|
|
16
|
+
project_root_path?: string;
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* ProjectContext singleton - manages current project identity
|
|
21
|
+
*
|
|
22
|
+
* Design:
|
|
23
|
+
* - Single instance per MCP server session
|
|
24
|
+
* - Lazy initialization on first access
|
|
25
|
+
* - Caches project_id and project_name in memory
|
|
26
|
+
* - Never queries database after initialization
|
|
27
|
+
* - Reset capability for test isolation
|
|
28
|
+
*/
|
|
29
|
+
export declare class ProjectContext {
|
|
30
|
+
private static instance;
|
|
31
|
+
private projectMetadata;
|
|
32
|
+
private initialized;
|
|
33
|
+
/**
|
|
34
|
+
* Private constructor enforces singleton pattern
|
|
35
|
+
*/
|
|
36
|
+
private constructor();
|
|
37
|
+
/**
|
|
38
|
+
* Get singleton instance
|
|
39
|
+
*/
|
|
40
|
+
static getInstance(): ProjectContext;
|
|
41
|
+
/**
|
|
42
|
+
* Reset singleton state (for testing only)
|
|
43
|
+
* Satisfies Constraint #47: Test isolation
|
|
44
|
+
*/
|
|
45
|
+
static reset(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Ensure project is initialized and cached
|
|
48
|
+
*
|
|
49
|
+
* @param knex - Database connection
|
|
50
|
+
* @param projectName - Project name from config or detection
|
|
51
|
+
* @param detectionSource - How the project name was detected
|
|
52
|
+
* @param options - Optional metadata
|
|
53
|
+
* @returns Project metadata with cached ID
|
|
54
|
+
*
|
|
55
|
+
* Satisfies Constraints:
|
|
56
|
+
* - #41: Query once per session, cache in memory
|
|
57
|
+
* - #23: Register project in database if doesn't exist
|
|
58
|
+
*/
|
|
59
|
+
ensureProject(knex: Knex, projectName: string, detectionSource: 'cli' | 'config' | 'git' | 'metadata' | 'directory', options?: {
|
|
60
|
+
displayName?: string;
|
|
61
|
+
projectRootPath?: string;
|
|
62
|
+
metadata?: Record<string, unknown>;
|
|
63
|
+
}): Promise<ProjectMetadata>;
|
|
64
|
+
/**
|
|
65
|
+
* Get cached project ID
|
|
66
|
+
*
|
|
67
|
+
* @throws Error if project not initialized
|
|
68
|
+
* @returns Project ID
|
|
69
|
+
*
|
|
70
|
+
* Satisfies Constraint #44: Provide getProjectId() method
|
|
71
|
+
*/
|
|
72
|
+
getProjectId(): number;
|
|
73
|
+
/**
|
|
74
|
+
* Get cached project name
|
|
75
|
+
*
|
|
76
|
+
* @throws Error if project not initialized
|
|
77
|
+
* @returns Project name
|
|
78
|
+
*
|
|
79
|
+
* Satisfies Constraint #44: Provide getProjectName() method
|
|
80
|
+
*/
|
|
81
|
+
getProjectName(): string;
|
|
82
|
+
/**
|
|
83
|
+
* Get all cached project metadata
|
|
84
|
+
*
|
|
85
|
+
* @throws Error if project not initialized
|
|
86
|
+
* @returns Complete project metadata
|
|
87
|
+
*/
|
|
88
|
+
getProjectMetadata(): ProjectMetadata;
|
|
89
|
+
/**
|
|
90
|
+
* Check if project context is initialized
|
|
91
|
+
*
|
|
92
|
+
* @returns true if initialized, false otherwise
|
|
93
|
+
*/
|
|
94
|
+
isInitialized(): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Validate project name according to security constraints
|
|
97
|
+
*
|
|
98
|
+
* @param projectName - Project name to validate
|
|
99
|
+
* @throws Error if project name is invalid
|
|
100
|
+
*
|
|
101
|
+
* Satisfies Constraint #37: Alphanumeric + hyphens/underscores only, max 64 chars
|
|
102
|
+
*/
|
|
103
|
+
private validateProjectName;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Convenience function to get the singleton instance
|
|
107
|
+
*
|
|
108
|
+
* @returns ProjectContext singleton instance
|
|
109
|
+
*/
|
|
110
|
+
export declare function getProjectContext(): ProjectContext;
|
|
111
|
+
//# sourceMappingURL=project-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../src/utils/project-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC;IACtE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;;GASG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IACtD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACH,OAAO;IAEP;;OAEG;WACW,WAAW,IAAI,cAAc;IAO3C;;;OAGG;WACW,KAAK,IAAI,IAAI;IAQ3B;;;;;;;;;;;;OAYG;IACU,aAAa,CACxB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,EACpE,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GACA,OAAO,CAAC,eAAe,CAAC;IAsE3B;;;;;;;OAOG;IACI,YAAY,IAAI,MAAM;IAS7B;;;;;;;OAOG;IACI,cAAc,IAAI,MAAM;IAS/B;;;;;OAKG;IACI,kBAAkB,IAAI,eAAe;IAS5C;;;;OAIG;IACI,aAAa,IAAI,OAAO;IAI/B;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;CAqB5B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAElD"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectContext Singleton - Manages current project identity for multi-project support
|
|
3
|
+
*
|
|
4
|
+
* Satisfies constraints:
|
|
5
|
+
* - #41 (CRITICAL): Caches project_id after first detection, no repeated DB queries
|
|
6
|
+
* - #44, #30 (HIGH): Provides getProjectId() and getProjectName() methods
|
|
7
|
+
* - #47 (HIGH): Provides reset() for test isolation
|
|
8
|
+
* - #23, #24 (CRITICAL): Config.toml as source of truth, auto-write on first run
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* ProjectContext singleton - manages current project identity
|
|
12
|
+
*
|
|
13
|
+
* Design:
|
|
14
|
+
* - Single instance per MCP server session
|
|
15
|
+
* - Lazy initialization on first access
|
|
16
|
+
* - Caches project_id and project_name in memory
|
|
17
|
+
* - Never queries database after initialization
|
|
18
|
+
* - Reset capability for test isolation
|
|
19
|
+
*/
|
|
20
|
+
export class ProjectContext {
|
|
21
|
+
static instance = null;
|
|
22
|
+
projectMetadata = null;
|
|
23
|
+
initialized = false;
|
|
24
|
+
/**
|
|
25
|
+
* Private constructor enforces singleton pattern
|
|
26
|
+
*/
|
|
27
|
+
constructor() { }
|
|
28
|
+
/**
|
|
29
|
+
* Get singleton instance
|
|
30
|
+
*/
|
|
31
|
+
static getInstance() {
|
|
32
|
+
if (!ProjectContext.instance) {
|
|
33
|
+
ProjectContext.instance = new ProjectContext();
|
|
34
|
+
}
|
|
35
|
+
return ProjectContext.instance;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Reset singleton state (for testing only)
|
|
39
|
+
* Satisfies Constraint #47: Test isolation
|
|
40
|
+
*/
|
|
41
|
+
static reset() {
|
|
42
|
+
if (ProjectContext.instance) {
|
|
43
|
+
ProjectContext.instance.projectMetadata = null;
|
|
44
|
+
ProjectContext.instance.initialized = false;
|
|
45
|
+
}
|
|
46
|
+
ProjectContext.instance = null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Ensure project is initialized and cached
|
|
50
|
+
*
|
|
51
|
+
* @param knex - Database connection
|
|
52
|
+
* @param projectName - Project name from config or detection
|
|
53
|
+
* @param detectionSource - How the project name was detected
|
|
54
|
+
* @param options - Optional metadata
|
|
55
|
+
* @returns Project metadata with cached ID
|
|
56
|
+
*
|
|
57
|
+
* Satisfies Constraints:
|
|
58
|
+
* - #41: Query once per session, cache in memory
|
|
59
|
+
* - #23: Register project in database if doesn't exist
|
|
60
|
+
*/
|
|
61
|
+
async ensureProject(knex, projectName, detectionSource, options) {
|
|
62
|
+
// Return cached metadata if already initialized
|
|
63
|
+
if (this.initialized && this.projectMetadata) {
|
|
64
|
+
return this.projectMetadata;
|
|
65
|
+
}
|
|
66
|
+
// Validate project name (Constraint #37)
|
|
67
|
+
this.validateProjectName(projectName);
|
|
68
|
+
// Query database for existing project or create new one
|
|
69
|
+
// Uses Knex query builder (Constraint #49, #50)
|
|
70
|
+
let project = await knex('m_projects')
|
|
71
|
+
.where({ name: projectName })
|
|
72
|
+
.first();
|
|
73
|
+
if (!project) {
|
|
74
|
+
// Insert new project using Knex query builder (Constraint #49)
|
|
75
|
+
// Set timestamps in application code for cross-DB compatibility
|
|
76
|
+
const now = Math.floor(Date.now() / 1000);
|
|
77
|
+
await knex('m_projects').insert({
|
|
78
|
+
name: projectName,
|
|
79
|
+
display_name: options?.displayName || projectName,
|
|
80
|
+
detection_source: detectionSource,
|
|
81
|
+
project_root_path: options?.projectRootPath || null,
|
|
82
|
+
created_ts: now,
|
|
83
|
+
last_active_ts: now,
|
|
84
|
+
metadata: options?.metadata ? JSON.stringify(options.metadata) : null,
|
|
85
|
+
});
|
|
86
|
+
// Fetch the newly created project by name
|
|
87
|
+
// (Avoids cross-database inconsistencies with .returning())
|
|
88
|
+
project = await knex('m_projects')
|
|
89
|
+
.where({ name: projectName })
|
|
90
|
+
.first();
|
|
91
|
+
if (!project) {
|
|
92
|
+
throw new Error(`Failed to create project: ${projectName}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Cache project metadata in memory (Constraint #41)
|
|
96
|
+
this.projectMetadata = {
|
|
97
|
+
id: project.id,
|
|
98
|
+
name: project.name,
|
|
99
|
+
display_name: project.display_name || undefined,
|
|
100
|
+
detection_source: project.detection_source,
|
|
101
|
+
project_root_path: project.project_root_path || undefined,
|
|
102
|
+
metadata: project.metadata ? JSON.parse(project.metadata) : undefined,
|
|
103
|
+
};
|
|
104
|
+
this.initialized = true;
|
|
105
|
+
return this.projectMetadata;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get cached project ID
|
|
109
|
+
*
|
|
110
|
+
* @throws Error if project not initialized
|
|
111
|
+
* @returns Project ID
|
|
112
|
+
*
|
|
113
|
+
* Satisfies Constraint #44: Provide getProjectId() method
|
|
114
|
+
*/
|
|
115
|
+
getProjectId() {
|
|
116
|
+
if (!this.initialized || !this.projectMetadata) {
|
|
117
|
+
throw new Error('ProjectContext not initialized. Call ensureProject() first during server startup.');
|
|
118
|
+
}
|
|
119
|
+
return this.projectMetadata.id;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get cached project name
|
|
123
|
+
*
|
|
124
|
+
* @throws Error if project not initialized
|
|
125
|
+
* @returns Project name
|
|
126
|
+
*
|
|
127
|
+
* Satisfies Constraint #44: Provide getProjectName() method
|
|
128
|
+
*/
|
|
129
|
+
getProjectName() {
|
|
130
|
+
if (!this.initialized || !this.projectMetadata) {
|
|
131
|
+
throw new Error('ProjectContext not initialized. Call ensureProject() first during server startup.');
|
|
132
|
+
}
|
|
133
|
+
return this.projectMetadata.name;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get all cached project metadata
|
|
137
|
+
*
|
|
138
|
+
* @throws Error if project not initialized
|
|
139
|
+
* @returns Complete project metadata
|
|
140
|
+
*/
|
|
141
|
+
getProjectMetadata() {
|
|
142
|
+
if (!this.initialized || !this.projectMetadata) {
|
|
143
|
+
throw new Error('ProjectContext not initialized. Call ensureProject() first during server startup.');
|
|
144
|
+
}
|
|
145
|
+
return { ...this.projectMetadata }; // Return copy to prevent mutations
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if project context is initialized
|
|
149
|
+
*
|
|
150
|
+
* @returns true if initialized, false otherwise
|
|
151
|
+
*/
|
|
152
|
+
isInitialized() {
|
|
153
|
+
return this.initialized && this.projectMetadata !== null;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Validate project name according to security constraints
|
|
157
|
+
*
|
|
158
|
+
* @param projectName - Project name to validate
|
|
159
|
+
* @throws Error if project name is invalid
|
|
160
|
+
*
|
|
161
|
+
* Satisfies Constraint #37: Alphanumeric + hyphens/underscores only, max 64 chars
|
|
162
|
+
*/
|
|
163
|
+
validateProjectName(projectName) {
|
|
164
|
+
// Max 64 characters
|
|
165
|
+
if (projectName.length > 64) {
|
|
166
|
+
throw new Error(`Project name exceeds maximum length of 64 characters: ${projectName.length}`);
|
|
167
|
+
}
|
|
168
|
+
// Alphanumeric + hyphens/underscores only
|
|
169
|
+
const validPattern = /^[a-zA-Z0-9_-]+$/;
|
|
170
|
+
if (!validPattern.test(projectName)) {
|
|
171
|
+
throw new Error(`Invalid project name: ${projectName}. Only alphanumeric characters, hyphens, and underscores are allowed.`);
|
|
172
|
+
}
|
|
173
|
+
// Additional check: must not be empty
|
|
174
|
+
if (projectName.trim().length === 0) {
|
|
175
|
+
throw new Error('Project name cannot be empty');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Convenience function to get the singleton instance
|
|
181
|
+
*
|
|
182
|
+
* @returns ProjectContext singleton instance
|
|
183
|
+
*/
|
|
184
|
+
export function getProjectContext() {
|
|
185
|
+
return ProjectContext.getInstance();
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=project-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/utils/project-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
export type DatabaseFormat = 'mysql' | 'postgresql' | 'sqlite';
|
|
2
|
+
/**
|
|
3
|
+
* Convert identifier quotes between database formats
|
|
4
|
+
*
|
|
5
|
+
* Database-specific identifier quoting:
|
|
6
|
+
* - MySQL: backticks `identifier`
|
|
7
|
+
* - PostgreSQL: double quotes "identifier"
|
|
8
|
+
* - SQLite: double quotes "identifier" (also supports backticks)
|
|
9
|
+
*
|
|
10
|
+
* @param sql - SQL statement
|
|
11
|
+
* @param targetFormat - Target database format
|
|
12
|
+
* @returns SQL with converted identifier quotes
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // SQLite → MySQL
|
|
16
|
+
* convertIdentifierQuotes('CREATE TABLE "users" ("id" INTEGER)', 'mysql')
|
|
17
|
+
* // Returns: 'CREATE TABLE `users` (`id` INTEGER)'
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // MySQL → PostgreSQL
|
|
21
|
+
* convertIdentifierQuotes('CREATE TABLE `users` (`id` INT)', 'postgresql')
|
|
22
|
+
* // Returns: 'CREATE TABLE "users" ("id" INT)'
|
|
23
|
+
*/
|
|
24
|
+
export declare function convertIdentifierQuotes(sql: string, targetFormat: DatabaseFormat): string;
|
|
25
|
+
/**
|
|
26
|
+
* Convert autoincrement syntax between databases
|
|
27
|
+
*
|
|
28
|
+
* Autoincrement variations:
|
|
29
|
+
* - SQLite: AUTOINCREMENT (with INTEGER PRIMARY KEY)
|
|
30
|
+
* - MySQL: AUTO_INCREMENT
|
|
31
|
+
* - PostgreSQL: SERIAL / GENERATED BY DEFAULT AS IDENTITY / GENERATED ALWAYS AS IDENTITY
|
|
32
|
+
*
|
|
33
|
+
* @param sql - SQL statement
|
|
34
|
+
* @param sourceFormat - Source database format
|
|
35
|
+
* @param targetFormat - Target database format
|
|
36
|
+
* @returns SQL with converted autoincrement syntax
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* // SQLite → MySQL
|
|
40
|
+
* convertAutoIncrement('id INTEGER PRIMARY KEY AUTOINCREMENT', 'sqlite', 'mysql')
|
|
41
|
+
* // Returns: 'id INTEGER PRIMARY KEY AUTO_INCREMENT'
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* // SQLite → PostgreSQL (allow explicit ID values during import)
|
|
45
|
+
* convertAutoIncrement('id INTEGER AUTOINCREMENT', 'sqlite', 'postgresql')
|
|
46
|
+
* // Returns: 'id INTEGER GENERATED BY DEFAULT AS IDENTITY'
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* // MySQL → SQLite
|
|
50
|
+
* convertAutoIncrement('id INT AUTO_INCREMENT', 'mysql', 'sqlite')
|
|
51
|
+
* // Returns: 'id INT AUTOINCREMENT'
|
|
52
|
+
*/
|
|
53
|
+
export declare function convertAutoIncrement(sql: string, sourceFormat: DatabaseFormat, targetFormat: DatabaseFormat): string;
|
|
54
|
+
/**
|
|
55
|
+
* Convert timestamp/datetime functions between databases
|
|
56
|
+
*
|
|
57
|
+
* Timestamp function variations:
|
|
58
|
+
* - SQLite: unixepoch(), datetime(ts, 'unixepoch')
|
|
59
|
+
* - MySQL: UNIX_TIMESTAMP(), FROM_UNIXTIME(ts)
|
|
60
|
+
* - PostgreSQL: extract(epoch from now()), to_timestamp(ts)
|
|
61
|
+
*
|
|
62
|
+
* @param sql - SQL statement
|
|
63
|
+
* @param targetFormat - Target database format
|
|
64
|
+
* @returns SQL with converted timestamp functions
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* // SQLite → MySQL
|
|
68
|
+
* convertTimestampFunctions("SELECT unixepoch(), datetime(ts, 'unixepoch')", 'mysql')
|
|
69
|
+
* // Returns: "SELECT UNIX_TIMESTAMP(), FROM_UNIXTIME(ts)"
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* // SQLite → PostgreSQL
|
|
73
|
+
* convertTimestampFunctions("SELECT unixepoch()", 'postgresql')
|
|
74
|
+
* // Returns: "SELECT extract(epoch from now())::integer"
|
|
75
|
+
*/
|
|
76
|
+
export declare function convertTimestampFunctions(sql: string, targetFormat: DatabaseFormat): string;
|
|
77
|
+
/**
|
|
78
|
+
* Convert boolean default values between databases
|
|
79
|
+
*
|
|
80
|
+
* Boolean default variations:
|
|
81
|
+
* - SQLite: 0/1 or '0'/'1' (stored as INTEGER or TEXT)
|
|
82
|
+
* - MySQL: 0/1 or FALSE/TRUE (TINYINT or BOOLEAN)
|
|
83
|
+
* - PostgreSQL: false/true or FALSE/TRUE (native BOOLEAN)
|
|
84
|
+
*
|
|
85
|
+
* @param sql - SQL statement
|
|
86
|
+
* @param targetFormat - Target database format
|
|
87
|
+
* @returns SQL with converted boolean defaults
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* // SQLite → PostgreSQL
|
|
91
|
+
* convertBooleanDefaults("is_active BOOLEAN default '0'", 'postgresql')
|
|
92
|
+
* // Returns: "is_active BOOLEAN default false"
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* // SQLite → PostgreSQL (numeric)
|
|
96
|
+
* convertBooleanDefaults("is_active BOOLEAN default 1", 'postgresql')
|
|
97
|
+
* // Returns: "is_active BOOLEAN default true"
|
|
98
|
+
*/
|
|
99
|
+
export declare function convertBooleanDefaults(sql: string, targetFormat: DatabaseFormat): string;
|
|
100
|
+
/**
|
|
101
|
+
* Convert data type keywords between databases
|
|
102
|
+
*
|
|
103
|
+
* Type conversions:
|
|
104
|
+
* - SQLite TEXT → MySQL VARCHAR(255) (when used with DEFAULT or NOT NULL)
|
|
105
|
+
* - SQLite TEXT PRIMARY KEY → MySQL VARCHAR(191) PRIMARY KEY (MariaDB 10.5 compatibility)
|
|
106
|
+
* - SQLite TEXT UNIQUE → MySQL VARCHAR(191) UNIQUE (indexes require VARCHAR)
|
|
107
|
+
* - SQLite TEXT NOT NULL → MySQL VARCHAR(255) NOT NULL (for FK columns)
|
|
108
|
+
* - SQLite datetime → PostgreSQL TIMESTAMP
|
|
109
|
+
* - MySQL TEXT → VARCHAR for compatibility
|
|
110
|
+
*
|
|
111
|
+
* MySQL/MariaDB limitations:
|
|
112
|
+
* - TEXT columns cannot be used in PRIMARY KEY, UNIQUE, or indexes without prefix length
|
|
113
|
+
* - TEXT columns cannot have DEFAULT values
|
|
114
|
+
* - VARCHAR(191) is safe max for utf8mb4 with InnoDB index prefix limit (768 bytes ÷ 4 bytes/char)
|
|
115
|
+
*
|
|
116
|
+
* @param sql - SQL statement
|
|
117
|
+
* @param targetFormat - Target database format
|
|
118
|
+
* @returns SQL with converted data types
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* // SQLite → MySQL (TEXT with DEFAULT not allowed in MySQL)
|
|
122
|
+
* convertDataTypes("name TEXT NOT NULL default 'anonymous'", 'mysql')
|
|
123
|
+
* // Returns: "name VARCHAR(255) NOT NULL default 'anonymous'"
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* // SQLite → MySQL (TEXT PRIMARY KEY not allowed in MariaDB 10.5)
|
|
127
|
+
* convertDataTypes("tool_name TEXT PRIMARY KEY", 'mysql')
|
|
128
|
+
* // Returns: "tool_name VARCHAR(191) PRIMARY KEY"
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* // SQLite → MySQL (TEXT UNIQUE not allowed in MySQL)
|
|
132
|
+
* convertDataTypes("category_name TEXT UNIQUE NOT NULL", 'mysql')
|
|
133
|
+
* // Returns: "category_name VARCHAR(191) UNIQUE NOT NULL"
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* // SQLite → MySQL (TEXT NOT NULL for FK columns)
|
|
137
|
+
* convertDataTypes("tool_name TEXT NOT NULL", 'mysql')
|
|
138
|
+
* // Returns: "tool_name VARCHAR(255) NOT NULL"
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* // SQLite → PostgreSQL
|
|
142
|
+
* convertDataTypes("created_at datetime", 'postgresql')
|
|
143
|
+
* // Returns: "created_at TIMESTAMP"
|
|
144
|
+
*/
|
|
145
|
+
export declare function convertDataTypes(sql: string, targetFormat: DatabaseFormat): string;
|
|
146
|
+
/**
|
|
147
|
+
* Remove CHECK constraints (not well-supported in some databases)
|
|
148
|
+
*
|
|
149
|
+
* CHECK constraints with nested parentheses (e.g., `col` IN ('a', 'b'))
|
|
150
|
+
* are not consistently supported across all databases, especially MariaDB 10.5.
|
|
151
|
+
*
|
|
152
|
+
* Pattern matches: CHECK (...) including nested parentheses
|
|
153
|
+
* Example: check (`status` in ('active', 'inactive'))
|
|
154
|
+
*
|
|
155
|
+
* @param sql - SQL statement
|
|
156
|
+
* @returns SQL with CHECK constraints removed
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* removeCheckConstraints("CREATE TABLE t (status TEXT check (status in ('a', 'b')))")
|
|
160
|
+
* // Returns: "CREATE TABLE t (status TEXT )"
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* // Complex nested parentheses
|
|
164
|
+
* removeCheckConstraints("id INT check (id > 0), name TEXT check (length(name) > 0)")
|
|
165
|
+
* // Returns: "id INT , name TEXT "
|
|
166
|
+
*/
|
|
167
|
+
export declare function removeCheckConstraints(sql: string): string;
|
|
168
|
+
/**
|
|
169
|
+
* Remove SQLite-specific DEFAULT functions (strftime, etc.)
|
|
170
|
+
*
|
|
171
|
+
* SQLite supports complex DEFAULT expressions using functions like strftime(),
|
|
172
|
+
* which are not portable to MySQL/PostgreSQL. These are replaced with simple defaults.
|
|
173
|
+
*
|
|
174
|
+
* @param sql - SQL statement
|
|
175
|
+
* @returns SQL with SQLite DEFAULT functions replaced with 'default 0'
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* // Parenthesized strftime
|
|
179
|
+
* removeSqliteDefaultFunctions("created_at INTEGER default (strftime('%s', 'now'))")
|
|
180
|
+
* // Returns: "created_at INTEGER default 0"
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* // Bare strftime
|
|
184
|
+
* removeSqliteDefaultFunctions("created_at INTEGER default strftime('%s', 'now')")
|
|
185
|
+
* // Returns: "created_at INTEGER default 0"
|
|
186
|
+
*/
|
|
187
|
+
export declare function removeSqliteDefaultFunctions(sql: string): string;
|
|
188
|
+
//# sourceMappingURL=sql-dump-converters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-dump-converters.d.ts","sourceRoot":"","sources":["../../src/utils/sql-dump-converters.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,GAAG,MAAM,CAYzF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,cAAc,EAC5B,YAAY,EAAE,cAAc,GAC3B,MAAM,CA6BR;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,GAAG,MAAM,CA0B3F;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,GAAG,MAAM,CAWxF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,GAAG,MAAM,CA4BlF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhE"}
|