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