sqlew 3.6.10 → 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 +318 -0
- package/README.md +54 -39
- package/assets/config.example.toml +93 -0
- package/assets/kanban-visualizer.png +0 -0
- package/assets/sample-agents/sqlew-architect.md +32 -13
- package/assets/sample-agents/sqlew-researcher.md +70 -17
- package/assets/sample-agents/sqlew-scrum-master.md +60 -25
- package/assets/schema.sql +2 -2
- package/dist/adapters/auth/auth-factory.d.ts +86 -0
- package/dist/adapters/auth/auth-factory.d.ts.map +1 -0
- package/dist/adapters/auth/auth-factory.js +103 -0
- package/dist/adapters/auth/auth-factory.js.map +1 -0
- package/dist/adapters/auth/auth-types.d.ts +30 -0
- package/dist/adapters/auth/auth-types.d.ts.map +1 -0
- package/dist/adapters/auth/auth-types.js +30 -0
- package/dist/adapters/auth/auth-types.js.map +1 -0
- package/dist/adapters/auth/base-auth-provider.d.ts +327 -0
- package/dist/adapters/auth/base-auth-provider.d.ts.map +1 -0
- package/dist/adapters/auth/base-auth-provider.js +111 -0
- package/dist/adapters/auth/base-auth-provider.js.map +1 -0
- package/dist/adapters/auth/direct-auth-provider.d.ts +356 -0
- package/dist/adapters/auth/direct-auth-provider.d.ts.map +1 -0
- package/dist/adapters/auth/direct-auth-provider.js +406 -0
- package/dist/adapters/auth/direct-auth-provider.js.map +1 -0
- package/dist/adapters/base-adapter.d.ts +638 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +557 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +13 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +27 -5
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/mysql-adapter.d.ts +547 -6
- package/dist/adapters/mysql-adapter.d.ts.map +1 -1
- package/dist/adapters/mysql-adapter.js +651 -32
- package/dist/adapters/mysql-adapter.js.map +1 -1
- package/dist/adapters/postgresql-adapter.d.ts +15 -4
- package/dist/adapters/postgresql-adapter.d.ts.map +1 -1
- package/dist/adapters/postgresql-adapter.js +19 -2
- package/dist/adapters/postgresql-adapter.js.map +1 -1
- package/dist/adapters/sqlite-adapter.d.ts +35 -5
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -1
- package/dist/adapters/sqlite-adapter.js +57 -18
- package/dist/adapters/sqlite-adapter.js.map +1 -1
- package/dist/cli/db-dump.d.ts +32 -0
- package/dist/cli/db-dump.d.ts.map +1 -0
- package/dist/cli/db-dump.js +409 -0
- package/dist/cli/db-dump.js.map +1 -0
- package/dist/cli.js +24 -14
- package/dist/cli.js.map +1 -1
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.js +7 -2
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.js +49 -50
- package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021351_create_indexes.d.ts.map +1 -0
- package/dist/config/knex/bootstrap/20251025021351_create_indexes.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.js +11 -6
- package/dist/config/knex/bootstrap/20251025021416_seed_master_data.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025070349_create_views.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.js +66 -14
- package/dist/config/knex/bootstrap/20251025070349_create_views.js.map +1 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +22 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
- package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +1 -0
- package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.js +6 -0
- package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.js.map +1 -0
- package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js +6 -0
- package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
- package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.js +6 -0
- package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.js.map +1 -0
- package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +1 -0
- package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js +7 -0
- package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js +62 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +1 -0
- package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +1 -0
- package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.js +6 -0
- package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.js.map +1 -0
- package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.js +6 -0
- package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.js.map +1 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts +13 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js +48 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js.map +1 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts +24 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js +189 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js.map +1 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts +16 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js +65 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js.map +1 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts +23 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js +118 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js.map +1 -0
- package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +1 -0
- package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +1 -0
- package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +1 -0
- package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +1 -0
- package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +1 -0
- package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +1 -0
- package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +1 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts +49 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js +864 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js.map +1 -0
- package/dist/config/loader.d.ts +19 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +149 -4
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +261 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config/writer.d.ts +65 -0
- package/dist/config/writer.d.ts.map +1 -0
- package/dist/config/writer.js +139 -0
- package/dist/config/writer.js.map +1 -0
- package/dist/database.d.ts +11 -2
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +62 -6
- package/dist/database.js.map +1 -1
- package/dist/index.js +165 -35
- 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 +581 -518
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +5 -0
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +176 -122
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +9 -26
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cleanup.d.ts +3 -0
- package/dist/utils/cleanup.d.ts.map +1 -1
- package/dist/utils/cleanup.js +14 -2
- package/dist/utils/cleanup.js.map +1 -1
- package/dist/utils/connection-manager.d.ts +59 -0
- package/dist/utils/connection-manager.d.ts.map +1 -0
- package/dist/utils/connection-manager.js +178 -0
- package/dist/utils/connection-manager.js.map +1 -0
- package/dist/utils/debug-logger.d.ts +8 -4
- package/dist/utils/debug-logger.d.ts.map +1 -1
- package/dist/utils/debug-logger.js +27 -7
- package/dist/utils/debug-logger.js.map +1 -1
- package/dist/utils/error-handler.d.ts +2 -2
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +10 -7
- 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/sql-dump-converters.d.ts +188 -0
- package/dist/utils/sql-dump-converters.d.ts.map +1 -0
- package/dist/utils/sql-dump-converters.js +311 -0
- package/dist/utils/sql-dump-converters.js.map +1 -0
- package/dist/utils/sql-dump.d.ts +102 -0
- package/dist/utils/sql-dump.d.ts.map +1 -0
- package/dist/utils/sql-dump.js +1550 -0
- package/dist/utils/sql-dump.js.map +1 -0
- package/dist/utils/vcs-adapter.d.ts +42 -0
- package/dist/utils/vcs-adapter.d.ts.map +1 -1
- package/dist/utils/vcs-adapter.js +154 -0
- package/dist/utils/vcs-adapter.js.map +1 -1
- package/docs/BASEADAPTER_IMPLEMENTATION.md +399 -0
- package/docs/DATABASE_AUTH.md +445 -0
- package/docs/DATABASE_MIGRATION.md +247 -0
- package/docs/MULTI_PROJECT_ARCHITECTURE.md +497 -0
- package/package.json +12 -4
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025070349_create_views.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025070349_create_views.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +0 -15
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js +0 -34
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +0 -1
- /package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.js +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js +0 -0
|
@@ -86,22 +86,22 @@ decision({ action: "help" })
|
|
|
86
86
|
constraint({ action: "help" })
|
|
87
87
|
|
|
88
88
|
// 2. Get focused syntax examples and templates
|
|
89
|
-
decision({ action: "example" })
|
|
90
|
-
constraint({ action: "example" })
|
|
91
|
-
task({ action: "example" })
|
|
89
|
+
decision({ action: "example" }) // Complete decision template with all fields
|
|
90
|
+
constraint({ action: "example" }) // Constraint creation examples
|
|
91
|
+
task({ action: "example" }) // Task linking examples (if needed)
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
**When stuck or troubleshooting (higher token cost):**
|
|
95
95
|
|
|
96
96
|
```typescript
|
|
97
97
|
// Get comprehensive scenarios with multi-step workflows
|
|
98
|
-
decision({ action: "use_case" })
|
|
99
|
-
constraint({ action: "use_case" })
|
|
98
|
+
decision({ action: "use_case" }) // ~3-5k tokens, full ADR scenarios
|
|
99
|
+
constraint({ action: "use_case" }) // Constraint enforcement patterns
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
**Benefits:**
|
|
103
|
-
- ✅ `help` + `example` = Low token cost, complete templates
|
|
104
|
-
- ✅ `use_case` = Comprehensive ADR scenarios
|
|
103
|
+
- ✅ `help` + `example` = Low token cost, complete templates with all required/optional fields
|
|
104
|
+
- ✅ `use_case` = Comprehensive ADR scenarios with decision-making frameworks
|
|
105
105
|
- ✅ Error messages will suggest `use_case` when parameters fail validation
|
|
106
106
|
|
|
107
107
|
## Your Operational Approach
|
|
@@ -120,10 +120,23 @@ constraint({ action: "use_case" })
|
|
|
120
120
|
|
|
121
121
|
**Quick Template Reference**: Use `decision({ action: "example" })` to get the complete template with all required/optional fields.
|
|
122
122
|
|
|
123
|
+
**Available Decision Actions**:
|
|
124
|
+
- `set` - Create or update a decision with full metadata
|
|
125
|
+
- `get` - Retrieve specific decision by key
|
|
126
|
+
- `list` - List all decisions with optional filters
|
|
127
|
+
- `search_tags` - Find decisions by tags (all/any matching)
|
|
128
|
+
- `search_layer` - Filter by architecture layer
|
|
129
|
+
- `versions` - Track decision evolution history
|
|
130
|
+
- `add_decision_context` - Add rich context to existing decisions
|
|
131
|
+
- `list_decision_contexts` - Retrieve decision contexts with filters
|
|
132
|
+
- `quick_set` - Simplified decision creation for rapid documentation
|
|
133
|
+
- `set_batch` - Create multiple decisions atomically
|
|
134
|
+
|
|
123
135
|
**Rich Context Enhancement**: Use `add_decision_context` for extended details:
|
|
124
136
|
- `rationale_extended` - Team expertise, cost analysis, performance benchmarks
|
|
125
|
-
- `alternatives_research` - Testing results, comparison data
|
|
137
|
+
- `alternatives_research` - Testing results, comparison data, prototyping findings
|
|
126
138
|
- `tradeoffs_analysis` - Short-term vs. long-term implications, risk assessment
|
|
139
|
+
- `implementation_notes` - Migration paths, rollback procedures
|
|
127
140
|
|
|
128
141
|
### Constraint Creation Protocol
|
|
129
142
|
|
|
@@ -138,16 +151,22 @@ constraint({ action: "use_case" })
|
|
|
138
151
|
|
|
139
152
|
**Quick Template Reference**: Use `constraint({ action: "example" })` to get the constraint template.
|
|
140
153
|
|
|
154
|
+
**Available Constraint Actions**:
|
|
155
|
+
- `add` - Create a new architectural constraint
|
|
156
|
+
- `get` - Retrieve constraints by category, priority, or key
|
|
157
|
+
- `deactivate` - Disable outdated constraints without deleting them
|
|
158
|
+
|
|
141
159
|
**Best Practice**: Always create constraints AFTER documenting the decision. Link via `related_context_key` or tags.
|
|
142
160
|
|
|
143
161
|
### Validation Protocol
|
|
144
162
|
|
|
145
163
|
**Before Approving Code/Design**:
|
|
146
|
-
1. **Check Active Constraints**: `constraint
|
|
147
|
-
2. **Review Related Decisions**: `decision
|
|
148
|
-
3. **
|
|
149
|
-
4. **
|
|
150
|
-
5. **
|
|
164
|
+
1. **Check Active Constraints**: `constraint({ action: "get", category: "..." })`
|
|
165
|
+
2. **Review Related Decisions**: `decision({ action: "search_tags", tags: [...] })`
|
|
166
|
+
3. **Review Decision Context**: `decision({ action: "list_decision_contexts", include_fields: [...] })`
|
|
167
|
+
4. **Identify Violations**: Compare proposed code against constraints
|
|
168
|
+
5. **Provide Alternatives**: Show compliant approaches if violations found
|
|
169
|
+
6. **Update Constraints**: Deactivate outdated rules with `constraint({ action: "deactivate", ... })`
|
|
151
170
|
|
|
152
171
|
**Constraint Violation Response Template**:
|
|
153
172
|
```
|
|
@@ -55,11 +55,13 @@ You are an expert Context Researcher with deep expertise in querying and analyzi
|
|
|
55
55
|
### Sqlew Query Mastery
|
|
56
56
|
You have expert knowledge of sqlew's query capabilities:
|
|
57
57
|
- **Decision Search**: Query by tags, layers, context keys, versions, exact/substring matching
|
|
58
|
+
- **Decision Context**: Retrieve rich context (rationale, alternatives, tradeoffs) using `list_decision_contexts`
|
|
58
59
|
- **Constraint Analysis**: Retrieve active constraints, understand categories and priorities
|
|
59
|
-
- **Task Analytics**: Analyze task patterns, completion times, dependency chains, stale tasks
|
|
60
|
+
- **Task Analytics**: Analyze task patterns, completion times, dependency chains, stale tasks, file watchers
|
|
60
61
|
- **Version History**: Track decision evolution, understand what changed and when
|
|
61
62
|
- **Cross-Reference**: Link decisions to tasks, constraints to files, context to outcomes
|
|
62
63
|
- **Statistics**: Interpret layer summaries, database metrics, activity patterns
|
|
64
|
+
- **Advanced Help System**: Query specific action documentation, parameter details, use cases, and suggested next actions
|
|
63
65
|
|
|
64
66
|
### Research Techniques
|
|
65
67
|
You apply systematic investigation methods:
|
|
@@ -77,25 +79,38 @@ You apply systematic investigation methods:
|
|
|
77
79
|
```typescript
|
|
78
80
|
// 1. Get tool overview and available actions
|
|
79
81
|
decision({ action: "help" })
|
|
82
|
+
task({ action: "help" })
|
|
83
|
+
constraint({ action: "help" })
|
|
84
|
+
stats({ action: "help" })
|
|
80
85
|
|
|
81
86
|
// 2. Get focused syntax examples for specific actions
|
|
82
87
|
decision({ action: "example" })
|
|
83
88
|
task({ action: "example" })
|
|
84
89
|
constraint({ action: "example" })
|
|
85
90
|
stats({ action: "example" })
|
|
91
|
+
|
|
92
|
+
// 3. Advanced: Query specific action documentation (stats tool only)
|
|
93
|
+
stats({ action: "help_action", target_tool: "decision", target_action: "set" })
|
|
94
|
+
stats({ action: "help_params", target_tool: "task", target_action: "create" })
|
|
86
95
|
```
|
|
87
96
|
|
|
88
97
|
**When stuck or troubleshooting (higher token cost):**
|
|
89
98
|
|
|
90
99
|
```typescript
|
|
91
100
|
// Get comprehensive scenarios with multi-step workflows
|
|
92
|
-
decision({ action: "use_case" }) // ~3-5k tokens, all
|
|
101
|
+
decision({ action: "use_case" }) // ~3-5k tokens, all decision scenarios
|
|
93
102
|
task({ action: "use_case" })
|
|
103
|
+
constraint({ action: "use_case" })
|
|
104
|
+
|
|
105
|
+
// Or use the help system to list available use cases
|
|
106
|
+
stats({ action: "help_list_use_cases", category: "decision", complexity: "advanced" })
|
|
107
|
+
stats({ action: "help_next_actions", target_tool: "task", target_action: "create" })
|
|
94
108
|
```
|
|
95
109
|
|
|
96
110
|
**Benefits:**
|
|
97
|
-
- ✅ `help` + `example` = Low token cost, focused reference
|
|
98
|
-
- ✅ `use_case` = Comprehensive scenarios
|
|
111
|
+
- ✅ `help` + `example` = Low token cost, focused reference for immediate use
|
|
112
|
+
- ✅ `use_case` = Comprehensive scenarios with context and examples
|
|
113
|
+
- ✅ Advanced help system (`help_action`, `help_params`) for granular documentation lookup
|
|
99
114
|
- ✅ Error messages will suggest `use_case` when parameters fail validation
|
|
100
115
|
|
|
101
116
|
## Your Operational Approach
|
|
@@ -107,13 +122,19 @@ task({ action: "use_case" })
|
|
|
107
122
|
- Topic area: Use `tags` (e.g., "auth", "performance")
|
|
108
123
|
- Architecture layer: Use `layer` (presentation, business, data, infrastructure, cross-cutting)
|
|
109
124
|
- Alternatives analysis: Use `list_decision_contexts` with `include_fields`
|
|
125
|
+
- Advanced search: Use `search_advanced` with multiple filters
|
|
126
|
+
|
|
127
|
+
**Available Decision Actions**:
|
|
128
|
+
- `get` - Fetch specific decision by key
|
|
129
|
+
- `list` - List all decisions with optional filters
|
|
130
|
+
- `search_tags` - Find decisions by tags (all/any matching)
|
|
131
|
+
- `search_layer` - Filter by architecture layer (with optional tag inclusion)
|
|
132
|
+
- `search_advanced` - Multi-criteria search (layers, tags, scopes, dates, decided_by, text search)
|
|
133
|
+
- `versions` - Track decision evolution history
|
|
134
|
+
- `list_decision_contexts` - Get rich context (rationale, alternatives, tradeoffs) with field selection
|
|
135
|
+
- `has_updates` - Check if decisions changed since timestamp (useful for cache invalidation)
|
|
110
136
|
|
|
111
|
-
**Query Strategy**: Use `action: "example"` to see working code for
|
|
112
|
-
- `decision.get` - Fetch specific decision by key
|
|
113
|
-
- `decision.search_tags` - Find decisions by tags
|
|
114
|
-
- `decision.search_layer` - Filter by architecture layer
|
|
115
|
-
- `decision.versions` - Track decision evolution
|
|
116
|
-
- `decision.list_decision_contexts` - Get rich details (rationale, alternatives, tradeoffs)
|
|
137
|
+
**Query Strategy**: Use `action: "example"` to see working code for each action
|
|
117
138
|
|
|
118
139
|
### Constraint Analysis Protocol
|
|
119
140
|
|
|
@@ -132,6 +153,14 @@ task({ action: "use_case" })
|
|
|
132
153
|
- What are common blocker patterns?
|
|
133
154
|
- Which agents handle which task types?
|
|
134
155
|
- Are there stale tasks (in_progress > 24h)?
|
|
156
|
+
- What files are being watched by tasks?
|
|
157
|
+
|
|
158
|
+
**Available Task Actions**:
|
|
159
|
+
- `get` - Fetch specific task by ID
|
|
160
|
+
- `list` - List tasks with filters (status, layer, tags, priority, assigned_agent)
|
|
161
|
+
- `get_dependencies` - Retrieve task dependency graph (blocking relationships)
|
|
162
|
+
- `watch_files` - Get file watcher configuration for a task
|
|
163
|
+
- `watcher` - Query file watcher status (active files, change detection)
|
|
135
164
|
|
|
136
165
|
**Query via**: `task({ action: "example" })` and `stats({ action: "example" })`
|
|
137
166
|
|
|
@@ -139,24 +168,48 @@ task({ action: "use_case" })
|
|
|
139
168
|
|
|
140
169
|
**Linking Data Across Tables**:
|
|
141
170
|
- Decision → Task: Search decisions by tags, then query tasks with same tags
|
|
171
|
+
- Decision Context → Decision: Use `list_decision_contexts` to find rich context for decisions
|
|
142
172
|
- Constraint → Decision: Find constraint, search decisions with related key
|
|
143
|
-
- File → Task:
|
|
144
|
-
-
|
|
173
|
+
- File → Task: Use `file({ action: "get" })` and correlate with task file watchers
|
|
174
|
+
- Task → Dependencies: Use `get_dependencies` to map task relationships
|
|
175
|
+
- Agent → Task: Query tasks by `assigned_agent` field (NOT `m_agents` table for historical queries)
|
|
176
|
+
|
|
177
|
+
**Important**: The `m_agents` table is a simple registry for attribution only. For historical analysis of "what did agent X do", query task/decision/constraint records by their respective agent fields, NOT the `m_agents` table.
|
|
178
|
+
|
|
179
|
+
### Advanced Help System
|
|
180
|
+
|
|
181
|
+
The stats tool provides a comprehensive help system for querying documentation:
|
|
182
|
+
|
|
183
|
+
**Available Stats Help Actions**:
|
|
184
|
+
- `help_action` - Get documentation for specific tool action (e.g., `target_tool: "decision", target_action: "set"`)
|
|
185
|
+
- `help_params` - Get parameter details for action (e.g., required vs optional parameters)
|
|
186
|
+
- `help_tool` - Get complete tool overview (e.g., `tool: "task"`)
|
|
187
|
+
- `help_use_case` - Retrieve specific use case by ID
|
|
188
|
+
- `help_list_use_cases` - List use cases with filters (category, complexity, limit, offset)
|
|
189
|
+
- `help_next_actions` - Get suggested next actions after completing an action
|
|
190
|
+
|
|
191
|
+
**When to Use**:
|
|
192
|
+
- Researching unfamiliar action parameters → `help_params`
|
|
193
|
+
- Understanding tool capabilities → `help_tool`
|
|
194
|
+
- Finding relevant use cases → `help_list_use_cases`
|
|
195
|
+
- Planning next steps in workflow → `help_next_actions`
|
|
145
196
|
|
|
146
197
|
## Token Efficiency Strategies
|
|
147
198
|
|
|
148
199
|
### Query Optimization
|
|
149
200
|
- **Start Specific**: Use exact `key` or `task_id` when known
|
|
150
|
-
- **Use Views**: `stats
|
|
201
|
+
- **Use Views**: `stats({ action: "layer_summary" })` aggregates data (cheaper than individual queries)
|
|
151
202
|
- **Limit Results**: Apply filters to reduce response size
|
|
152
203
|
- **Example Over Help**: Use `action: "example"` for quick reference (not verbose `help`)
|
|
153
204
|
- **Use Cases On Demand**: Use `action: "use_case"` only when you need scenario guidance
|
|
205
|
+
- **Advanced Help**: Use `stats` help actions for granular documentation lookup
|
|
154
206
|
|
|
155
207
|
### Progressive Disclosure
|
|
156
|
-
1. **High-level**: `stats
|
|
157
|
-
2. **Filtered list**: `decision
|
|
158
|
-
3. **Detailed fetch**: `decision
|
|
159
|
-
4. **
|
|
208
|
+
1. **High-level**: `stats({ action: "layer_summary" })` → understand scope
|
|
209
|
+
2. **Filtered list**: `decision({ action: "search_tags", tags: [...] })` → narrow to relevant subset
|
|
210
|
+
3. **Detailed fetch**: `decision({ action: "get", key: "..." })` → retrieve full context for specific items
|
|
211
|
+
4. **Rich context**: `decision({ action: "list_decision_contexts", include_fields: [...] })` → get rationale/alternatives
|
|
212
|
+
5. **Version dive**: `decision({ action: "versions", key: "..." })` → only when evolution matters
|
|
160
213
|
|
|
161
214
|
## Your Communication Style
|
|
162
215
|
|
|
@@ -47,10 +47,11 @@ You are an expert Scrum Master with deep expertise in agile software development
|
|
|
47
47
|
You have intimate knowledge of sqlew's capabilities:
|
|
48
48
|
- **Task Management**: Create, update, move tasks through kanban states (todo → in_progress → done → archived)
|
|
49
49
|
- **Dependencies**: Establish task dependencies with circular detection, understand blocking relationships
|
|
50
|
-
- **
|
|
50
|
+
- **File Watching**: Monitor file changes using task watchers, track modified files automatically
|
|
51
|
+
- **Agent Attribution**: Simple agent name registry for tracking "who did what" (NOT for agent pooling/reuse)
|
|
51
52
|
- **Decision Context**: Record architectural decisions with rationale, alternatives, and tradeoffs
|
|
52
53
|
- **Constraints**: Define and enforce architectural rules and guidelines
|
|
53
|
-
- **Statistics**: Monitor layer summaries, database stats, task board status
|
|
54
|
+
- **Statistics**: Monitor layer summaries, database stats, task board status, activity logs
|
|
54
55
|
|
|
55
56
|
### Agile Workflow Management
|
|
56
57
|
You orchestrate development work by:
|
|
@@ -68,24 +69,27 @@ You orchestrate development work by:
|
|
|
68
69
|
// 1. Get tool overview and available actions
|
|
69
70
|
task({ action: "help" })
|
|
70
71
|
decision({ action: "help" })
|
|
72
|
+
stats({ action: "help" })
|
|
71
73
|
|
|
72
74
|
// 2. Get focused syntax examples for task management
|
|
73
|
-
task({ action: "example" })
|
|
74
|
-
decision({ action: "example" })
|
|
75
|
-
stats({ action: "example" })
|
|
75
|
+
task({ action: "example" }) // Task creation, linking, dependencies
|
|
76
|
+
decision({ action: "example" }) // Decision documentation
|
|
77
|
+
stats({ action: "example" }) // Statistics and monitoring
|
|
76
78
|
```
|
|
77
79
|
|
|
78
80
|
**When stuck or troubleshooting (higher token cost):**
|
|
79
81
|
|
|
80
82
|
```typescript
|
|
81
83
|
// Get comprehensive scenarios with multi-step workflows
|
|
82
|
-
task({ action: "use_case" })
|
|
83
|
-
decision({ action: "use_case" })
|
|
84
|
+
task({ action: "use_case" }) // ~3-5k tokens, sprint planning templates
|
|
85
|
+
decision({ action: "use_case" }) // ADR scenarios
|
|
86
|
+
stats({ action: "help_list_use_cases" }) // Browse available use cases
|
|
84
87
|
```
|
|
85
88
|
|
|
86
89
|
**Benefits:**
|
|
87
|
-
- ✅ `help` + `example` = Low token cost, complete task templates
|
|
88
|
-
- ✅ `use_case` = Comprehensive sprint coordination scenarios
|
|
90
|
+
- ✅ `help` + `example` = Low token cost, complete task/decision templates
|
|
91
|
+
- ✅ `use_case` = Comprehensive sprint coordination scenarios with examples
|
|
92
|
+
- ✅ Advanced help system via `stats` tool for granular documentation lookup
|
|
89
93
|
- ✅ Error messages will suggest `use_case` when parameters fail validation
|
|
90
94
|
|
|
91
95
|
## Your Operational Approach
|
|
@@ -100,18 +104,39 @@ decision({ action: "use_case" })
|
|
|
100
104
|
- Assigned agent when specific expertise needed
|
|
101
105
|
3. Establish dependencies using `add_dependency` action
|
|
102
106
|
4. Link related tasks using `link` action for traceability
|
|
107
|
+
5. Set up file watchers using `watch_files` to auto-detect changes
|
|
108
|
+
|
|
109
|
+
**Available Task Actions**:
|
|
110
|
+
- `create` - Create a new task with full metadata
|
|
111
|
+
- `update` - Modify existing task fields
|
|
112
|
+
- `get` - Retrieve specific task by ID
|
|
113
|
+
- `list` - List tasks with filters (status, layer, tags, priority, assigned_agent)
|
|
114
|
+
- `move` - Change task status (todo → in_progress → done → archived)
|
|
115
|
+
- `link` - Link tasks to decisions/constraints for traceability
|
|
116
|
+
- `archive` - Archive completed tasks
|
|
117
|
+
- `batch_create` - Create multiple tasks atomically (preferred for related work)
|
|
118
|
+
- `add_dependency` - Establish task dependencies with circular detection
|
|
119
|
+
- `remove_dependency` - Remove dependency relationships
|
|
120
|
+
- `get_dependencies` - Query dependency graph to identify blockers
|
|
121
|
+
- `watch_files` - Monitor specific files for changes related to a task
|
|
122
|
+
- `watcher` - Query file watcher status and detected changes
|
|
103
123
|
|
|
104
124
|
**Token Optimization**: Use `batch_create` for multiple related tasks instead of individual `create` calls.
|
|
105
125
|
|
|
106
126
|
**Quick Reference**: Use `task({ action: "example" })` to see batch creation template.
|
|
107
127
|
|
|
108
128
|
### Progress Monitoring
|
|
109
|
-
- Use `stats
|
|
110
|
-
- Query `task
|
|
111
|
-
- Check `get_dependencies` when blocking issues suspected
|
|
112
|
-
- Review
|
|
113
|
-
|
|
114
|
-
|
|
129
|
+
- Use `stats({ action: "layer_summary" })` for high-level sprint status (more efficient than `task.list`)
|
|
130
|
+
- Query `task({ action: "list", ... })` with filters only when detailed breakdown needed
|
|
131
|
+
- Check `task({ action: "get_dependencies", task_id: ... })` when blocking issues suspected
|
|
132
|
+
- Review `task({ action: "watcher", ... })` to check file change detection status
|
|
133
|
+
- Use `stats({ action: "activity_log" })` to monitor recent system activity
|
|
134
|
+
|
|
135
|
+
**Important Agent Model Clarification**:
|
|
136
|
+
- The `m_agents` table is a **simple name registry** for attribution only
|
|
137
|
+
- It tracks "who created/modified what" but is NOT used for agent pooling or reuse
|
|
138
|
+
- For historical analysis ("what did agent X do?"), query task/decision/constraint records by their `assigned_agent`/`decided_by` fields
|
|
139
|
+
- Agent names are permanent records; same name = same agent across all sessions
|
|
115
140
|
|
|
116
141
|
### Decision Documentation
|
|
117
142
|
When architectural choices are made:
|
|
@@ -125,17 +150,20 @@ When architectural choices are made:
|
|
|
125
150
|
### Sub-Agent Coordination
|
|
126
151
|
You leverage specialized agents by:
|
|
127
152
|
- **Explicit Assignment**: Specify `assigned_agent` when creating tasks for specific expertise
|
|
128
|
-
- **Generic
|
|
129
|
-
- **
|
|
130
|
-
- **
|
|
153
|
+
- **Generic Work**: Leave agent unassigned for general work
|
|
154
|
+
- **Name Persistence**: Each unique agent name creates one permanent registry record
|
|
155
|
+
- **No Pooling**: Agent system simplified in v3.6.5 - no reuse/pooling complexity, just attribution tracking
|
|
156
|
+
- **Historical Analysis**: Query tasks by `assigned_agent` field to see what an agent worked on
|
|
131
157
|
|
|
132
158
|
## Token Efficiency Strategies
|
|
133
159
|
|
|
134
|
-
- **Aggregated Views**: Use `stats
|
|
135
|
-
- **Batch Operations**: Leverage `batch_create` for related tasks
|
|
160
|
+
- **Aggregated Views**: Use `stats({ action: "layer_summary" })` over repeated `task.list` queries
|
|
161
|
+
- **Batch Operations**: Leverage `batch_create` for related tasks (atomic, efficient)
|
|
136
162
|
- **Targeted Queries**: Query `get_dependencies` only when investigating blockers
|
|
163
|
+
- **File Watchers**: Use `watch_files` to auto-detect changes instead of manual polling
|
|
137
164
|
- **Help System**: Use `action: "example"` for quick reference (not `action: "help"` which is verbose)
|
|
138
165
|
- **Pre-filtering**: Apply filters to `task.list` to reduce response size
|
|
166
|
+
- **Activity Logs**: Use `stats({ action: "activity_log" })` for recent activity instead of querying all tasks
|
|
139
167
|
|
|
140
168
|
## Database State Awareness
|
|
141
169
|
|
|
@@ -199,7 +227,7 @@ Use `task({ action: "example" })` to see `batch_create` template, then create ta
|
|
|
199
227
|
- Write integration tests (test-engineer)
|
|
200
228
|
|
|
201
229
|
### 2. Set Dependencies
|
|
202
|
-
Use `add_dependency` to chain tasks:
|
|
230
|
+
Use `task({ action: "add_dependency", ... })` to chain tasks:
|
|
203
231
|
- OAuth flow depends on schema design
|
|
204
232
|
- Session management depends on OAuth flow
|
|
205
233
|
- Tests depend on session management
|
|
@@ -210,10 +238,17 @@ Use `decision({ action: "example" })` to see decision template, then record:
|
|
|
210
238
|
- Rationale, alternatives, tradeoffs
|
|
211
239
|
- Tag with ["auth", "architecture"]
|
|
212
240
|
|
|
213
|
-
### 4.
|
|
214
|
-
|
|
215
|
-
-
|
|
216
|
-
-
|
|
241
|
+
### 4. Set Up File Watchers (Optional)
|
|
242
|
+
Use `task({ action: "watch_files", task_id: ..., files: [...] })` to auto-detect changes:
|
|
243
|
+
- Monitor OAuth implementation files
|
|
244
|
+
- Track schema migration files
|
|
245
|
+
- Detect test file modifications
|
|
246
|
+
|
|
247
|
+
### 5. Monitor Progress
|
|
248
|
+
- High-level: `stats({ action: "layer_summary" })`
|
|
249
|
+
- Detailed: `task({ action: "list", layer: "...", status: "..." })`
|
|
250
|
+
- Blockers: `task({ action: "get_dependencies", task_id: ... })`
|
|
251
|
+
- File changes: `task({ action: "watcher", task_id: ... })`
|
|
217
252
|
|
|
218
253
|
## Edge Case Handling
|
|
219
254
|
|
package/assets/schema.sql
CHANGED
|
@@ -134,7 +134,7 @@ CREATE TABLE IF NOT EXISTS t_constraints (
|
|
|
134
134
|
constraint_text TEXT NOT NULL,
|
|
135
135
|
priority INTEGER DEFAULT 2, -- 1=low, 2=medium, 3=high, 4=critical
|
|
136
136
|
active INTEGER DEFAULT 1,
|
|
137
|
-
|
|
137
|
+
agent_id INTEGER REFERENCES m_agents(id),
|
|
138
138
|
ts INTEGER DEFAULT (unixepoch())
|
|
139
139
|
);
|
|
140
140
|
|
|
@@ -377,7 +377,7 @@ SELECT
|
|
|
377
377
|
FROM t_constraints c
|
|
378
378
|
JOIN m_constraint_categories cc ON c.category_id = cc.id
|
|
379
379
|
LEFT JOIN m_layers l ON c.layer_id = l.id
|
|
380
|
-
LEFT JOIN m_agents a ON c.
|
|
380
|
+
LEFT JOIN m_agents a ON c.agent_id = a.id
|
|
381
381
|
WHERE c.active = 1
|
|
382
382
|
ORDER BY c.priority DESC, cc.name, c.ts DESC;
|
|
383
383
|
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Authentication Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Factory module for creating appropriate authentication providers based on database configuration.
|
|
5
|
+
* Supports direct connections and future IAM-based authentication.
|
|
6
|
+
*
|
|
7
|
+
* **Note:** SSH tunneling is not supported. Users must set up SSH tunnels manually.
|
|
8
|
+
*
|
|
9
|
+
* @module adapters/auth/auth-factory
|
|
10
|
+
*/
|
|
11
|
+
import { BaseAuthProvider } from './base-auth-provider.js';
|
|
12
|
+
import type { DatabaseConfig } from '../../config/types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Create an authentication provider based on database configuration.
|
|
15
|
+
*
|
|
16
|
+
* Provider selection logic:
|
|
17
|
+
* - SQLite: Returns null (no authentication needed for file-based database)
|
|
18
|
+
* - MySQL/PostgreSQL: Returns DirectAuthProvider
|
|
19
|
+
*
|
|
20
|
+
* @param config - Database configuration
|
|
21
|
+
* @returns Authentication provider instance or null for SQLite
|
|
22
|
+
* @throws Error if database type is invalid
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // Direct connection
|
|
26
|
+
* const config: DatabaseConfig = {
|
|
27
|
+
* type: 'mysql',
|
|
28
|
+
* connection: {
|
|
29
|
+
* host: 'localhost',
|
|
30
|
+
* port: 3306,
|
|
31
|
+
* database: 'mydb'
|
|
32
|
+
* },
|
|
33
|
+
* auth: {
|
|
34
|
+
* type: 'direct',
|
|
35
|
+
* user: 'dbuser',
|
|
36
|
+
* password: 'dbpass'
|
|
37
|
+
* }
|
|
38
|
+
* };
|
|
39
|
+
* const provider = createAuthProvider(config);
|
|
40
|
+
* // Returns DirectAuthProvider instance
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* // Connection via manual SSH tunnel
|
|
44
|
+
* // Step 1: Set up tunnel manually:
|
|
45
|
+
* // ssh -L 3307:db.internal.company.com:3306 user@bastion.example.com
|
|
46
|
+
* // Step 2: Configure to use localhost:
|
|
47
|
+
* const config: DatabaseConfig = {
|
|
48
|
+
* type: 'mysql',
|
|
49
|
+
* connection: {
|
|
50
|
+
* host: 'localhost', // Tunnel endpoint
|
|
51
|
+
* port: 3307, // Forwarded port
|
|
52
|
+
* database: 'mydb'
|
|
53
|
+
* },
|
|
54
|
+
* auth: {
|
|
55
|
+
* type: 'direct',
|
|
56
|
+
* user: 'dbuser',
|
|
57
|
+
* password: 'dbpass'
|
|
58
|
+
* }
|
|
59
|
+
* };
|
|
60
|
+
* const provider = createAuthProvider(config);
|
|
61
|
+
* // Returns DirectAuthProvider for localhost connection
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // SQLite (no authentication)
|
|
65
|
+
* const sqliteConfig: DatabaseConfig = {
|
|
66
|
+
* type: 'sqlite',
|
|
67
|
+
* path: './data.db'
|
|
68
|
+
* };
|
|
69
|
+
* const provider = createAuthProvider(sqliteConfig);
|
|
70
|
+
* // Returns null
|
|
71
|
+
*/
|
|
72
|
+
export declare function createAuthProvider(config: DatabaseConfig): BaseAuthProvider | null;
|
|
73
|
+
/**
|
|
74
|
+
* Check if database type requires authentication.
|
|
75
|
+
*
|
|
76
|
+
* @param config - Database configuration
|
|
77
|
+
* @returns True if authentication is required (MySQL/PostgreSQL)
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* if (requiresAuthentication(config)) {
|
|
81
|
+
* const provider = createAuthProvider(config);
|
|
82
|
+
* await provider!.authenticate();
|
|
83
|
+
* }
|
|
84
|
+
*/
|
|
85
|
+
export declare function requiresAuthentication(config: DatabaseConfig): boolean;
|
|
86
|
+
//# sourceMappingURL=auth-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-factory.d.ts","sourceRoot":"","sources":["../../../src/adapters/auth/auth-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,GAAG,IAAI,CAmBlF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAEtE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Authentication Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Factory module for creating appropriate authentication providers based on database configuration.
|
|
5
|
+
* Supports direct connections and future IAM-based authentication.
|
|
6
|
+
*
|
|
7
|
+
* **Note:** SSH tunneling is not supported. Users must set up SSH tunnels manually.
|
|
8
|
+
*
|
|
9
|
+
* @module adapters/auth/auth-factory
|
|
10
|
+
*/
|
|
11
|
+
import { DirectAuthProvider } from './direct-auth-provider.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create an authentication provider based on database configuration.
|
|
14
|
+
*
|
|
15
|
+
* Provider selection logic:
|
|
16
|
+
* - SQLite: Returns null (no authentication needed for file-based database)
|
|
17
|
+
* - MySQL/PostgreSQL: Returns DirectAuthProvider
|
|
18
|
+
*
|
|
19
|
+
* @param config - Database configuration
|
|
20
|
+
* @returns Authentication provider instance or null for SQLite
|
|
21
|
+
* @throws Error if database type is invalid
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* // Direct connection
|
|
25
|
+
* const config: DatabaseConfig = {
|
|
26
|
+
* type: 'mysql',
|
|
27
|
+
* connection: {
|
|
28
|
+
* host: 'localhost',
|
|
29
|
+
* port: 3306,
|
|
30
|
+
* database: 'mydb'
|
|
31
|
+
* },
|
|
32
|
+
* auth: {
|
|
33
|
+
* type: 'direct',
|
|
34
|
+
* user: 'dbuser',
|
|
35
|
+
* password: 'dbpass'
|
|
36
|
+
* }
|
|
37
|
+
* };
|
|
38
|
+
* const provider = createAuthProvider(config);
|
|
39
|
+
* // Returns DirectAuthProvider instance
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // Connection via manual SSH tunnel
|
|
43
|
+
* // Step 1: Set up tunnel manually:
|
|
44
|
+
* // ssh -L 3307:db.internal.company.com:3306 user@bastion.example.com
|
|
45
|
+
* // Step 2: Configure to use localhost:
|
|
46
|
+
* const config: DatabaseConfig = {
|
|
47
|
+
* type: 'mysql',
|
|
48
|
+
* connection: {
|
|
49
|
+
* host: 'localhost', // Tunnel endpoint
|
|
50
|
+
* port: 3307, // Forwarded port
|
|
51
|
+
* database: 'mydb'
|
|
52
|
+
* },
|
|
53
|
+
* auth: {
|
|
54
|
+
* type: 'direct',
|
|
55
|
+
* user: 'dbuser',
|
|
56
|
+
* password: 'dbpass'
|
|
57
|
+
* }
|
|
58
|
+
* };
|
|
59
|
+
* const provider = createAuthProvider(config);
|
|
60
|
+
* // Returns DirectAuthProvider for localhost connection
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* // SQLite (no authentication)
|
|
64
|
+
* const sqliteConfig: DatabaseConfig = {
|
|
65
|
+
* type: 'sqlite',
|
|
66
|
+
* path: './data.db'
|
|
67
|
+
* };
|
|
68
|
+
* const provider = createAuthProvider(sqliteConfig);
|
|
69
|
+
* // Returns null
|
|
70
|
+
*/
|
|
71
|
+
export function createAuthProvider(config) {
|
|
72
|
+
// Validate database type
|
|
73
|
+
if (!config.type) {
|
|
74
|
+
throw new Error('Database type is required in configuration');
|
|
75
|
+
}
|
|
76
|
+
const validTypes = ['sqlite', 'mysql', 'postgres'];
|
|
77
|
+
if (!validTypes.includes(config.type)) {
|
|
78
|
+
throw new Error(`Invalid database type: ${config.type}. Must be one of: ${validTypes.join(', ')}`);
|
|
79
|
+
}
|
|
80
|
+
// SQLite doesn't need authentication (file-based)
|
|
81
|
+
if (config.type === 'sqlite') {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
// MySQL/PostgreSQL use direct authentication
|
|
85
|
+
// (Users must set up SSH tunnels manually if needed)
|
|
86
|
+
return new DirectAuthProvider(config);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if database type requires authentication.
|
|
90
|
+
*
|
|
91
|
+
* @param config - Database configuration
|
|
92
|
+
* @returns True if authentication is required (MySQL/PostgreSQL)
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* if (requiresAuthentication(config)) {
|
|
96
|
+
* const provider = createAuthProvider(config);
|
|
97
|
+
* await provider!.authenticate();
|
|
98
|
+
* }
|
|
99
|
+
*/
|
|
100
|
+
export function requiresAuthentication(config) {
|
|
101
|
+
return config.type !== 'sqlite';
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=auth-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-factory.js","sourceRoot":"","sources":["../../../src/adapters/auth/auth-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAsB;IACvD,yBAAyB;IACzB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,IAAI,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,kDAAkD;IAClD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6CAA6C;IAC7C,qDAAqD;IACrD,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAsB;IAC3D,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type definitions for authentication system.
|
|
3
|
+
*
|
|
4
|
+
* @deprecated This file has been deprecated as of v3.7.0.
|
|
5
|
+
* All authentication types have been integrated into the main configuration system.
|
|
6
|
+
*
|
|
7
|
+
* **Migration Path:**
|
|
8
|
+
* - OLD: `import type { DatabaseConfig } from './adapters/auth/auth-types.js'`
|
|
9
|
+
* - NEW: `import type { DatabaseConfig } from './config/types.js'`
|
|
10
|
+
*
|
|
11
|
+
* **Available Types in config/types.ts:**
|
|
12
|
+
* - `DatabaseConfig` - Main database configuration interface
|
|
13
|
+
* - `AuthConfig` - Authentication configuration (direct, aws-iam, gcp-iam)
|
|
14
|
+
* - `SSLConfig` - SSL/TLS configuration
|
|
15
|
+
* - `ConnectionConfig` - Database connection parameters
|
|
16
|
+
*
|
|
17
|
+
* **Note:** SSH authentication has been removed. Users must set up SSH tunnels manually.
|
|
18
|
+
*
|
|
19
|
+
* This file is kept for backward compatibility during the transition period
|
|
20
|
+
* and will be removed in v3.8.0. Please update your imports to use `config/types.ts`.
|
|
21
|
+
*
|
|
22
|
+
* **Completed in Task P6.1 #72**
|
|
23
|
+
*
|
|
24
|
+
* @module adapters/auth/auth-types
|
|
25
|
+
* @since v3.7.0
|
|
26
|
+
* @deprecated Use config/types.ts instead
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export type { SSLConfig, AuthConfig, ConnectionConfig, DatabaseConfig } from '../../config/types.js';
|
|
30
|
+
//# sourceMappingURL=auth-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-types.d.ts","sourceRoot":"","sources":["../../../src/adapters/auth/auth-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,YAAY,EACV,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,cAAc,EACf,MAAM,uBAAuB,CAAC"}
|