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
|
@@ -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,30 @@ 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
|
-
// If validation fails, throw structured error
|
|
191
|
+
// If validation fails, throw concise structured error
|
|
187
192
|
if (missingParams.length > 0 || Object.keys(typoSuggestions).length > 0) {
|
|
193
|
+
// Build concise error message
|
|
194
|
+
let errorMsg = '';
|
|
195
|
+
if (missingParams.length > 0) {
|
|
196
|
+
errorMsg = `Missing: ${missingParams.join(', ')}`;
|
|
197
|
+
}
|
|
198
|
+
if (Object.keys(typoSuggestions).length > 0) {
|
|
199
|
+
const typoMsg = Object.entries(typoSuggestions)
|
|
200
|
+
.map(([wrong, correct]) => `${wrong} → ${correct}`)
|
|
201
|
+
.join(', ');
|
|
202
|
+
errorMsg = errorMsg
|
|
203
|
+
? `${errorMsg}. Invalid params: ${typoMsg}`
|
|
204
|
+
: `Invalid params: ${typoMsg}`;
|
|
205
|
+
}
|
|
188
206
|
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`,
|
|
207
|
+
error: errorMsg,
|
|
192
208
|
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" })`
|
|
209
|
+
reference: `${tool}.${action}`, // e.g., "decision.set"
|
|
210
|
+
missing: missingParams.length > 0 ? missingParams : undefined,
|
|
211
|
+
typos: Object.keys(typoSuggestions).length > 0 ? typoSuggestions : undefined,
|
|
212
|
+
hint: spec.hint
|
|
201
213
|
};
|
|
202
|
-
// Throw
|
|
214
|
+
// Throw concise JSON error (significantly reduced token usage)
|
|
203
215
|
throw new Error(JSON.stringify(error, null, 2));
|
|
204
216
|
}
|
|
205
217
|
}
|
|
@@ -217,7 +229,16 @@ export function validateActionParams(tool, action, params) {
|
|
|
217
229
|
export function validateBatchParams(tool, batchParamName, items, itemAction, maxItems = 50) {
|
|
218
230
|
// Check if batch parameter exists and is an array
|
|
219
231
|
if (!items || !Array.isArray(items)) {
|
|
220
|
-
|
|
232
|
+
// Detect if a JSON string was passed instead of a parsed object
|
|
233
|
+
const itemsAsAny = items;
|
|
234
|
+
if (typeof itemsAsAny === 'string' && (itemsAsAny.trim().startsWith('[') || itemsAsAny.trim().startsWith('{'))) {
|
|
235
|
+
throw new Error(`Parameter "${batchParamName}" received as JSON string instead of parsed array. ` +
|
|
236
|
+
`MCP tools require pre-parsed JSON objects, not stringified JSON. ` +
|
|
237
|
+
`The parameter must be a JavaScript array/object, not a string. ` +
|
|
238
|
+
`Received type: ${typeof itemsAsAny}`);
|
|
239
|
+
}
|
|
240
|
+
throw new Error(`Parameter "${batchParamName}" is required and must be an array. ` +
|
|
241
|
+
`Received type: ${typeof itemsAsAny}`);
|
|
221
242
|
}
|
|
222
243
|
// Check array is not empty
|
|
223
244
|
if (items.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameter-validator.js","sourceRoot":"","sources":["../../src/utils/parameter-validator.ts"],"names":[],"mappings":"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
|
|
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,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Root Determination Utility
|
|
3
|
+
*
|
|
4
|
+
* Determines the project root directory with correct priority order:
|
|
5
|
+
* 1. SQLEW_PROJECT_ROOT environment variable (MCP client can set this)
|
|
6
|
+
* 2. CLI --db-path argument (absolute path) → use dirname
|
|
7
|
+
* 3. CLI --config-path argument (absolute path) → use dirname
|
|
8
|
+
* 4. Config file database.path (absolute path) → use dirname
|
|
9
|
+
* 5. Fallback to process.cwd()
|
|
10
|
+
*
|
|
11
|
+
* This prevents issues on Windows when launched from system directories
|
|
12
|
+
* like C:\Windows\System32 (e.g., by MCP hosts like Claude Desktop or Junie AI).
|
|
13
|
+
*
|
|
14
|
+
* Environment Variable Support (Serena-MCP pattern):
|
|
15
|
+
* MCP clients can set SQLEW_PROJECT_ROOT to specify the project directory.
|
|
16
|
+
* This allows project-relative database paths without absolute CLI arguments.
|
|
17
|
+
*/
|
|
18
|
+
export interface ProjectRootOptions {
|
|
19
|
+
/**
|
|
20
|
+
* CLI argument: --db-path
|
|
21
|
+
* If absolute, its directory becomes the project root
|
|
22
|
+
*/
|
|
23
|
+
cliDbPath?: string;
|
|
24
|
+
/**
|
|
25
|
+
* CLI argument: --config-path
|
|
26
|
+
* If absolute, its directory becomes the project root
|
|
27
|
+
*/
|
|
28
|
+
cliConfigPath?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Config file setting: database.path
|
|
31
|
+
* If absolute, its directory becomes the project root
|
|
32
|
+
*/
|
|
33
|
+
configDbPath?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Determines the project root directory based on available path information.
|
|
37
|
+
*
|
|
38
|
+
* Priority order (highest to lowest):
|
|
39
|
+
* 1. SQLEW_PROJECT_ROOT environment variable
|
|
40
|
+
* 2. CLI --db-path (absolute)
|
|
41
|
+
* 3. CLI --config-path (absolute)
|
|
42
|
+
* 4. Config database.path (absolute)
|
|
43
|
+
* 5. process.cwd() (fallback)
|
|
44
|
+
*
|
|
45
|
+
* @param options - Path options from CLI arguments and config file
|
|
46
|
+
* @returns Absolute path to project root directory (forward slashes for cross-platform consistency)
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* // MCP client sets environment variable (Junie, Claude Desktop, etc.)
|
|
51
|
+
* // In Junie config: { "env": { "SQLEW_PROJECT_ROOT": "/path/to/project" } }
|
|
52
|
+
* const root = determineProjectRoot({});
|
|
53
|
+
* // Returns: '/path/to/project' (from environment variable)
|
|
54
|
+
*
|
|
55
|
+
* // User specified: npx sqlew --db-path=/absolute/path/to/.sqlew/db.db
|
|
56
|
+
* const root = determineProjectRoot({ cliDbPath: '/absolute/path/to/.sqlew/db.db' });
|
|
57
|
+
* // Returns: '/absolute/path/to/.sqlew' (not System32!)
|
|
58
|
+
*
|
|
59
|
+
* // User specified: npx sqlew --config-path=C:\Project\.sqlew\config.toml (Windows)
|
|
60
|
+
* const root = determineProjectRoot({ cliConfigPath: 'C:\\Project\\.sqlew\\config.toml' });
|
|
61
|
+
* // Returns: 'C:/Project/.sqlew' (normalized to forward slashes)
|
|
62
|
+
*
|
|
63
|
+
* // No arguments, fallback to execution directory
|
|
64
|
+
* const root = determineProjectRoot({});
|
|
65
|
+
* // Returns: process.cwd() (whatever directory sqlew was launched from)
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare function determineProjectRoot(options?: ProjectRootOptions): string;
|
|
69
|
+
/**
|
|
70
|
+
* Helper function to check if a path looks like it's in a system directory
|
|
71
|
+
* on Windows (e.g., C:\Windows\System32).
|
|
72
|
+
*
|
|
73
|
+
* Useful for warning users if sqlew is being launched from an unexpected location.
|
|
74
|
+
*
|
|
75
|
+
* @param dirPath - Directory path to check
|
|
76
|
+
* @returns True if path appears to be a Windows system directory
|
|
77
|
+
*/
|
|
78
|
+
export declare function isSystemDirectory(dirPath: string): boolean;
|
|
79
|
+
//# sourceMappingURL=project-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../../src/utils/project-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAmC7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAiB1D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Root Determination Utility
|
|
3
|
+
*
|
|
4
|
+
* Determines the project root directory with correct priority order:
|
|
5
|
+
* 1. SQLEW_PROJECT_ROOT environment variable (MCP client can set this)
|
|
6
|
+
* 2. CLI --db-path argument (absolute path) → use dirname
|
|
7
|
+
* 3. CLI --config-path argument (absolute path) → use dirname
|
|
8
|
+
* 4. Config file database.path (absolute path) → use dirname
|
|
9
|
+
* 5. Fallback to process.cwd()
|
|
10
|
+
*
|
|
11
|
+
* This prevents issues on Windows when launched from system directories
|
|
12
|
+
* like C:\Windows\System32 (e.g., by MCP hosts like Claude Desktop or Junie AI).
|
|
13
|
+
*
|
|
14
|
+
* Environment Variable Support (Serena-MCP pattern):
|
|
15
|
+
* MCP clients can set SQLEW_PROJECT_ROOT to specify the project directory.
|
|
16
|
+
* This allows project-relative database paths without absolute CLI arguments.
|
|
17
|
+
*/
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
/**
|
|
20
|
+
* Determines the project root directory based on available path information.
|
|
21
|
+
*
|
|
22
|
+
* Priority order (highest to lowest):
|
|
23
|
+
* 1. SQLEW_PROJECT_ROOT environment variable
|
|
24
|
+
* 2. CLI --db-path (absolute)
|
|
25
|
+
* 3. CLI --config-path (absolute)
|
|
26
|
+
* 4. Config database.path (absolute)
|
|
27
|
+
* 5. process.cwd() (fallback)
|
|
28
|
+
*
|
|
29
|
+
* @param options - Path options from CLI arguments and config file
|
|
30
|
+
* @returns Absolute path to project root directory (forward slashes for cross-platform consistency)
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* // MCP client sets environment variable (Junie, Claude Desktop, etc.)
|
|
35
|
+
* // In Junie config: { "env": { "SQLEW_PROJECT_ROOT": "/path/to/project" } }
|
|
36
|
+
* const root = determineProjectRoot({});
|
|
37
|
+
* // Returns: '/path/to/project' (from environment variable)
|
|
38
|
+
*
|
|
39
|
+
* // User specified: npx sqlew --db-path=/absolute/path/to/.sqlew/db.db
|
|
40
|
+
* const root = determineProjectRoot({ cliDbPath: '/absolute/path/to/.sqlew/db.db' });
|
|
41
|
+
* // Returns: '/absolute/path/to/.sqlew' (not System32!)
|
|
42
|
+
*
|
|
43
|
+
* // User specified: npx sqlew --config-path=C:\Project\.sqlew\config.toml (Windows)
|
|
44
|
+
* const root = determineProjectRoot({ cliConfigPath: 'C:\\Project\\.sqlew\\config.toml' });
|
|
45
|
+
* // Returns: 'C:/Project/.sqlew' (normalized to forward slashes)
|
|
46
|
+
*
|
|
47
|
+
* // No arguments, fallback to execution directory
|
|
48
|
+
* const root = determineProjectRoot({});
|
|
49
|
+
* // Returns: process.cwd() (whatever directory sqlew was launched from)
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export function determineProjectRoot(options = {}) {
|
|
53
|
+
// Priority 1: SQLEW_PROJECT_ROOT environment variable
|
|
54
|
+
// MCP clients (Junie, Claude Desktop, etc.) can set this to specify project directory
|
|
55
|
+
const envProjectRoot = process.env.SQLEW_PROJECT_ROOT;
|
|
56
|
+
if (envProjectRoot && path.isAbsolute(envProjectRoot)) {
|
|
57
|
+
// Normalize to forward slashes for cross-platform consistency
|
|
58
|
+
return envProjectRoot.replace(/\\/g, '/');
|
|
59
|
+
}
|
|
60
|
+
// Priority 2: CLI --db-path argument (absolute path)
|
|
61
|
+
if (options.cliDbPath && path.isAbsolute(options.cliDbPath)) {
|
|
62
|
+
const projectRoot = path.dirname(options.cliDbPath);
|
|
63
|
+
// Normalize to forward slashes for cross-platform consistency
|
|
64
|
+
return projectRoot.replace(/\\/g, '/');
|
|
65
|
+
}
|
|
66
|
+
// Priority 3: CLI --config-path argument (absolute path)
|
|
67
|
+
if (options.cliConfigPath && path.isAbsolute(options.cliConfigPath)) {
|
|
68
|
+
const projectRoot = path.dirname(options.cliConfigPath);
|
|
69
|
+
// Normalize to forward slashes for cross-platform consistency
|
|
70
|
+
return projectRoot.replace(/\\/g, '/');
|
|
71
|
+
}
|
|
72
|
+
// Priority 4: Config file database.path (absolute path)
|
|
73
|
+
if (options.configDbPath && path.isAbsolute(options.configDbPath)) {
|
|
74
|
+
const projectRoot = path.dirname(options.configDbPath);
|
|
75
|
+
// Normalize to forward slashes for cross-platform consistency
|
|
76
|
+
return projectRoot.replace(/\\/g, '/');
|
|
77
|
+
}
|
|
78
|
+
// Priority 5: Fallback to process.cwd()
|
|
79
|
+
// This is the current behavior, but now it's the LAST resort instead of the FIRST
|
|
80
|
+
const cwd = process.cwd();
|
|
81
|
+
// Normalize to forward slashes for cross-platform consistency
|
|
82
|
+
return cwd.replace(/\\/g, '/');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Helper function to check if a path looks like it's in a system directory
|
|
86
|
+
* on Windows (e.g., C:\Windows\System32).
|
|
87
|
+
*
|
|
88
|
+
* Useful for warning users if sqlew is being launched from an unexpected location.
|
|
89
|
+
*
|
|
90
|
+
* @param dirPath - Directory path to check
|
|
91
|
+
* @returns True if path appears to be a Windows system directory
|
|
92
|
+
*/
|
|
93
|
+
export function isSystemDirectory(dirPath) {
|
|
94
|
+
if (process.platform !== 'win32') {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const normalizedPath = dirPath.toLowerCase().replace(/\\/g, '/');
|
|
98
|
+
// Common Windows system directories
|
|
99
|
+
const systemDirs = [
|
|
100
|
+
'/windows/system32',
|
|
101
|
+
'/windows/syswow64',
|
|
102
|
+
'/windows',
|
|
103
|
+
'/program files',
|
|
104
|
+
'/program files (x86)',
|
|
105
|
+
];
|
|
106
|
+
return systemDirs.some(sysDir => normalizedPath.includes(sysDir));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=project-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/utils/project-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAsB7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAA8B,EAAE;IACnE,sDAAsD;IACtD,sFAAsF;IACtF,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACtD,IAAI,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,8DAA8D;QAC9D,OAAO,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,qDAAqD;IACrD,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpD,8DAA8D;QAC9D,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,yDAAyD;IACzD,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxD,8DAA8D;QAC9D,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,wDAAwD;IACxD,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvD,8DAA8D;QAC9D,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,wCAAwC;IACxC,kFAAkF;IAClF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEjE,oCAAoC;IACpC,MAAM,UAAU,GAAG;QACjB,mBAAmB;QACnB,mBAAmB;QACnB,UAAU;QACV,gBAAgB;QAChB,sBAAsB;KACvB,CAAC;IAEF,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACpE,CAAC"}
|