sqlew 4.3.1 → 5.0.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 +68 -0
- package/LICENSE +1 -1
- package/NOTICE +2 -2
- package/README.md +112 -42
- package/assets/claude-md-snippets/plan-mode-integration.md +54 -0
- package/assets/claude-md-snippets/queue-monitoring.md +84 -0
- package/dist/backend/backend-factory.d.ts +67 -0
- package/dist/backend/backend-factory.d.ts.map +1 -0
- package/dist/backend/backend-factory.js +171 -0
- package/dist/backend/backend-factory.js.map +1 -0
- package/dist/backend/index.d.ts +12 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +13 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/inference.d.ts +38 -0
- package/dist/backend/inference.d.ts.map +1 -0
- package/dist/backend/inference.js +76 -0
- package/dist/backend/inference.js.map +1 -0
- package/dist/backend/local-backend.d.ts +40 -0
- package/dist/backend/local-backend.d.ts.map +1 -0
- package/dist/backend/local-backend.js +410 -0
- package/dist/backend/local-backend.js.map +1 -0
- package/dist/backend/transforming-backend.d.ts +47 -0
- package/dist/backend/transforming-backend.d.ts.map +1 -0
- package/dist/backend/transforming-backend.js +80 -0
- package/dist/backend/transforming-backend.js.map +1 -0
- package/dist/backend/types.d.ts +58 -0
- package/dist/backend/types.d.ts.map +1 -0
- package/dist/backend/types.js +7 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/cli/db-dump.js +45 -45
- package/dist/cli/db-dump.js.map +1 -1
- package/dist/cli/db-export.js +30 -30
- package/dist/cli/db-export.js.map +1 -1
- package/dist/cli/db-import.d.ts.map +1 -1
- package/dist/cli/db-import.js +32 -33
- package/dist/cli/db-import.js.map +1 -1
- package/dist/cli/hooks/check-completion.d.ts +1 -0
- package/dist/cli/hooks/check-completion.d.ts.map +1 -1
- package/dist/cli/hooks/check-completion.js +15 -26
- package/dist/cli/hooks/check-completion.js.map +1 -1
- package/dist/cli/hooks/mark-done.d.ts +1 -0
- package/dist/cli/hooks/mark-done.d.ts.map +1 -1
- package/dist/cli/hooks/mark-done.js +12 -17
- package/dist/cli/hooks/mark-done.js.map +1 -1
- package/dist/cli/hooks/on-enter-plan.js +2 -2
- package/dist/cli/hooks/on-enter-plan.js.map +1 -1
- package/dist/cli/hooks/on-session-start.d.ts +23 -0
- package/dist/cli/hooks/on-session-start.d.ts.map +1 -0
- package/dist/cli/hooks/on-session-start.js +70 -0
- package/dist/cli/hooks/on-session-start.js.map +1 -0
- package/dist/cli/hooks/on-stop.js +5 -5
- package/dist/cli/hooks/on-stop.js.map +1 -1
- package/dist/cli/hooks/{plan-toml-parser.d.ts → plan-parser.d.ts} +1 -1
- package/dist/cli/hooks/plan-parser.d.ts.map +1 -0
- package/dist/cli/hooks/{plan-toml-parser.js → plan-parser.js} +1 -1
- package/dist/cli/hooks/plan-parser.js.map +1 -0
- package/dist/cli/hooks/plan-pattern-extractor.d.ts.map +1 -1
- package/dist/cli/hooks/plan-pattern-extractor.js +6 -3
- package/dist/cli/hooks/plan-pattern-extractor.js.map +1 -1
- package/dist/cli/hooks/plan-processor.js +1 -1
- package/dist/cli/hooks/plan-processor.js.map +1 -1
- package/dist/cli/hooks/stdin-parser.d.ts +4 -0
- package/dist/cli/hooks/stdin-parser.d.ts.map +1 -1
- package/dist/cli/hooks/stdin-parser.js.map +1 -1
- package/dist/cli/hooks/suggest.js +2 -2
- package/dist/cli/hooks/suggest.js.map +1 -1
- package/dist/cli/hooks/track-plan.d.ts.map +1 -1
- package/dist/cli/hooks/track-plan.js +24 -18
- package/dist/cli/hooks/track-plan.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +72 -72
- package/dist/cli.js.map +1 -1
- package/dist/config/cloud-config-loader.d.ts +107 -0
- package/dist/config/cloud-config-loader.d.ts.map +1 -0
- package/dist/config/cloud-config-loader.js +273 -0
- package/dist/config/cloud-config-loader.js.map +1 -0
- package/dist/config/global-config.d.ts +10 -10
- package/dist/config/global-config.d.ts.map +1 -1
- package/dist/config/global-config.js +12 -12
- package/dist/config/global-config.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +5 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/minimal-generator.d.ts.map +1 -1
- package/dist/config/minimal-generator.js +22 -72
- package/dist/config/minimal-generator.js.map +1 -1
- package/dist/config/types.d.ts +59 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +14 -0
- package/dist/config/types.js.map +1 -1
- package/dist/constants.d.ts +1 -29
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +1 -38
- package/dist/constants.js.map +1 -1
- package/dist/database/initialization/cleanup.d.ts.map +1 -1
- package/dist/database/initialization/cleanup.js +0 -13
- package/dist/database/initialization/cleanup.js.map +1 -1
- package/dist/database/initialization/init.d.ts.map +1 -1
- package/dist/database/initialization/init.js +0 -9
- package/dist/database/initialization/init.js.map +1 -1
- package/dist/database/initialization/schema-version.d.ts +4 -4
- package/dist/database/initialization/schema-version.js +9 -9
- package/dist/database/initialization/schema-version.js.map +1 -1
- package/dist/database/migrations/v4/20260107000000_v5_drop_task_file_tables.d.ts +36 -0
- package/dist/database/migrations/v4/20260107000000_v5_drop_task_file_tables.d.ts.map +1 -0
- package/dist/database/migrations/v4/20260107000000_v5_drop_task_file_tables.js +135 -0
- package/dist/database/migrations/v4/20260107000000_v5_drop_task_file_tables.js.map +1 -0
- package/dist/database/migrations/v4/20260107000001_v5_drop_legacy_tables.d.ts +20 -0
- package/dist/database/migrations/v4/20260107000001_v5_drop_legacy_tables.d.ts.map +1 -0
- package/dist/database/migrations/v4/20260107000001_v5_drop_legacy_tables.js +168 -0
- package/dist/database/migrations/v4/20260107000001_v5_drop_legacy_tables.js.map +1 -0
- package/dist/database/migrations/v4/20260108000000_v5_rename_to_m_t_prefix.d.ts +23 -0
- package/dist/database/migrations/v4/20260108000000_v5_rename_to_m_t_prefix.d.ts.map +1 -0
- package/dist/database/migrations/v4/20260108000000_v5_rename_to_m_t_prefix.js +570 -0
- package/dist/database/migrations/v4/20260108000000_v5_rename_to_m_t_prefix.js.map +1 -0
- package/dist/database/migrations/v4/20260109000000_v5_drop_help_tables.d.ts +29 -0
- package/dist/database/migrations/v4/20260109000000_v5_drop_help_tables.d.ts.map +1 -0
- package/dist/database/migrations/v4/20260109000000_v5_drop_help_tables.js +80 -0
- package/dist/database/migrations/v4/20260109000000_v5_drop_help_tables.js.map +1 -0
- package/dist/database/operations/inserts.js +11 -11
- package/dist/database/operations/inserts.js.map +1 -1
- package/dist/database/operations/queries.js +9 -9
- package/dist/database/operations/queries.js.map +1 -1
- package/dist/formatters/adr-formatter.d.ts +22 -0
- package/dist/formatters/adr-formatter.d.ts.map +1 -0
- package/dist/formatters/adr-formatter.js +127 -0
- package/dist/formatters/adr-formatter.js.map +1 -0
- package/dist/formatters/confluence-formatter.d.ts +26 -0
- package/dist/formatters/confluence-formatter.d.ts.map +1 -0
- package/dist/formatters/confluence-formatter.js +129 -0
- package/dist/formatters/confluence-formatter.js.map +1 -0
- package/dist/formatters/index.d.ts +34 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +57 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/markdown-formatter.d.ts +16 -0
- package/dist/formatters/markdown-formatter.d.ts.map +1 -0
- package/dist/formatters/markdown-formatter.js +110 -0
- package/dist/formatters/markdown-formatter.js.map +1 -0
- package/dist/formatters/notion-formatter.d.ts +29 -0
- package/dist/formatters/notion-formatter.d.ts.map +1 -0
- package/dist/formatters/notion-formatter.js +177 -0
- package/dist/formatters/notion-formatter.js.map +1 -0
- package/dist/formatters/types.d.ts +31 -0
- package/dist/formatters/types.d.ts.map +1 -0
- package/dist/formatters/types.js +6 -0
- package/dist/formatters/types.js.map +1 -0
- package/dist/help-data/_schema.toml +21 -0
- package/dist/help-data/constraint.toml +259 -0
- package/dist/help-data/decision.toml +833 -0
- package/dist/help-data/example.toml +177 -0
- package/dist/help-data/help.toml +246 -0
- package/dist/help-data/queue.toml +134 -0
- package/dist/help-data/suggest.toml +219 -0
- package/dist/help-data/use-cases/_categories.toml +22 -0
- package/dist/help-data/use-cases/constraint-basic.toml +34 -0
- package/dist/help-data/use-cases/cross-tool-workflow.toml +50 -0
- package/dist/help-data/use-cases/decision-intelligence-duplicate.toml +35 -0
- package/dist/help-data/use-cases/decision-intelligence-related.toml +35 -0
- package/dist/help-data/use-cases/decision-tracking-basic.toml +42 -0
- package/dist/help-data/use-cases/decision-tracking-versions.toml +42 -0
- package/dist/help-data/use_case.toml +147 -0
- package/dist/help-loader.d.ts +194 -0
- package/dist/help-loader.d.ts.map +1 -0
- package/dist/help-loader.js +419 -0
- package/dist/help-loader.js.map +1 -0
- package/dist/index.js +15 -10
- package/dist/index.js.map +1 -1
- package/dist/init-rules.d.ts +42 -0
- package/dist/init-rules.d.ts.map +1 -0
- package/dist/init-rules.js +217 -0
- package/dist/init-rules.js.map +1 -0
- package/dist/schema.d.ts +4 -6
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +28 -45
- package/dist/schema.js.map +1 -1
- package/dist/server/setup.d.ts +0 -10
- package/dist/server/setup.d.ts.map +1 -1
- package/dist/server/setup.js +97 -89
- package/dist/server/setup.js.map +1 -1
- package/dist/server/shutdown.d.ts +1 -1
- package/dist/server/shutdown.d.ts.map +1 -1
- package/dist/server/shutdown.js +1 -16
- package/dist/server/shutdown.js.map +1 -1
- package/dist/server/tool-handlers.d.ts +15 -0
- package/dist/server/tool-handlers.d.ts.map +1 -1
- package/dist/server/tool-handlers.js +47 -462
- package/dist/server/tool-handlers.js.map +1 -1
- package/dist/server/tool-registry.d.ts.map +1 -1
- package/dist/server/tool-registry.js +50 -62
- package/dist/server/tool-registry.js.map +1 -1
- package/dist/tests/backend/backend-factory.test.d.ts +7 -0
- package/dist/tests/backend/backend-factory.test.d.ts.map +1 -0
- package/dist/tests/backend/backend-factory.test.js +157 -0
- package/dist/tests/backend/backend-factory.test.js.map +1 -0
- package/dist/tests/backend/inference.test.d.ts +7 -0
- package/dist/tests/backend/inference.test.d.ts.map +1 -0
- package/dist/tests/backend/inference.test.js +142 -0
- package/dist/tests/backend/inference.test.js.map +1 -0
- package/dist/tests/database/multi-project/multi-project.test.js +9 -70
- package/dist/tests/database/multi-project/multi-project.test.js.map +1 -1
- package/dist/tests/database/sql-dump/table-ordering.test.js +14 -14
- package/dist/tests/database/sql-dump/table-ordering.test.js.map +1 -1
- package/dist/tests/docker/cross-database.test.js +32 -32
- package/dist/tests/docker/cross-database.test.js.map +1 -1
- package/dist/tests/docker/dump-import.test.js +55 -55
- package/dist/tests/docker/dump-import.test.js.map +1 -1
- package/dist/tests/docker/fk-constraints.test.js +3 -3
- package/dist/tests/docker/indexes.test.js +34 -34
- package/dist/tests/docker/integration.test.js +33 -33
- package/dist/tests/docker/multi-project-migration.test.js +47 -47
- package/dist/tests/docker/multi-project-migration.test.js.map +1 -1
- package/dist/tests/docker/native/constraint-operations.test.js +49 -49
- package/dist/tests/docker/native/constraint-operations.test.js.map +1 -1
- package/dist/tests/docker/native/db-init.d.ts +3 -1
- package/dist/tests/docker/native/db-init.d.ts.map +1 -1
- package/dist/tests/docker/native/db-init.js +14 -12
- package/dist/tests/docker/native/db-init.js.map +1 -1
- package/dist/tests/docker/native/decision-operations.test.js +91 -91
- package/dist/tests/docker/native/decision-operations.test.js.map +1 -1
- package/dist/tests/docker/native/help-system.test.d.ts +2 -2
- package/dist/tests/docker/native/help-system.test.js +113 -138
- package/dist/tests/docker/native/help-system.test.js.map +1 -1
- package/dist/tests/docker/native/suggest-tool.test.d.ts +2 -2
- package/dist/tests/docker/native/suggest-tool.test.js +35 -35
- package/dist/tests/docker/native/suggest-tool.test.js.map +1 -1
- package/dist/tests/docker/native/test-harness.d.ts +6 -12
- package/dist/tests/docker/native/test-harness.d.ts.map +1 -1
- package/dist/tests/docker/native/test-harness.js +74 -156
- package/dist/tests/docker/native/test-harness.js.map +1 -1
- package/dist/tests/docker/schema-migration.test.js +6 -6
- package/dist/tests/feature/decision/batch-validation-comprehensive.test.d.ts +3 -7
- package/dist/tests/feature/decision/batch-validation-comprehensive.test.d.ts.map +1 -1
- package/dist/tests/feature/decision/batch-validation-comprehensive.test.js +7 -318
- package/dist/tests/feature/decision/batch-validation-comprehensive.test.js.map +1 -1
- package/dist/tests/feature/help/help-system.test.d.ts +6 -6
- package/dist/tests/feature/help/help-system.test.js +166 -124
- package/dist/tests/feature/help/help-system.test.js.map +1 -1
- package/dist/tests/integration/auto-trigger-suggestions.test.js +22 -22
- package/dist/tests/integration/auto-trigger-suggestions.test.js.map +1 -1
- package/dist/tests/integration/decision-intelligence-e2e.test.js +23 -22
- package/dist/tests/integration/decision-intelligence-e2e.test.js.map +1 -1
- package/dist/tests/integration/e2e-workflow1-debug.test.js +3 -3
- package/dist/tests/integration/e2e-workflow1-debug.test.js.map +1 -1
- package/dist/tests/integration/hybrid-similarity-detection.test.js +25 -25
- package/dist/tests/integration/hybrid-similarity-detection.test.js.map +1 -1
- package/dist/tests/integration/suggest-simple.test.js +18 -0
- package/dist/tests/integration/suggest-simple.test.js.map +1 -1
- package/dist/tests/migrations/test-all-versions.js +212 -212
- package/dist/tests/migrations/test-all-versions.js.map +1 -1
- package/dist/tests/migrations/v4/v4-fresh-install.test.js +29 -29
- package/dist/tests/migrations/v4/v4-fresh-install.test.js.map +1 -1
- package/dist/tests/migrations/v4/v4-migrate-data.test.js +20 -20
- package/dist/tests/migrations/v4/v4-migrate-data.test.js.map +1 -1
- package/dist/tests/test-v4-native-rdbms.js +20 -20
- package/dist/tests/test-v4-native-rdbms.js.map +1 -1
- package/dist/tests/unit/config/cloud-config-loader.test.d.ts +2 -0
- package/dist/tests/unit/config/cloud-config-loader.test.d.ts.map +1 -0
- package/dist/tests/unit/config/cloud-config-loader.test.js +103 -0
- package/dist/tests/unit/config/cloud-config-loader.test.js.map +1 -0
- package/dist/tests/unit/config/{plan-toml-cache.test.d.ts → plan-cache.test.d.ts} +1 -1
- package/dist/tests/unit/config/plan-cache.test.d.ts.map +1 -0
- package/dist/tests/unit/config/{plan-toml-cache.test.js → plan-cache.test.js} +32 -32
- package/dist/tests/unit/config/plan-cache.test.js.map +1 -0
- package/dist/tests/unit/hooks/{plan-toml-parser.test.d.ts → plan-parser.test.d.ts} +1 -1
- package/dist/tests/unit/hooks/plan-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/{plan-toml-parser.test.js → plan-parser.test.js} +179 -179
- package/dist/tests/unit/hooks/plan-parser.test.js.map +1 -0
- package/dist/tests/unit/server/tool-handlers.test.d.ts +7 -0
- package/dist/tests/unit/server/tool-handlers.test.d.ts.map +1 -0
- package/dist/tests/unit/server/tool-handlers.test.js +76 -0
- package/dist/tests/unit/server/tool-handlers.test.js.map +1 -0
- package/dist/tests/unit/utils/config-loader.test.js +17 -17
- package/dist/tests/unit/utils/connection-hash.test.d.ts +2 -0
- package/dist/tests/unit/utils/connection-hash.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/connection-hash.test.js +57 -0
- package/dist/tests/unit/utils/connection-hash.test.js.map +1 -0
- package/dist/tests/unit/utils/environment-detector.test.d.ts +2 -0
- package/dist/tests/unit/utils/environment-detector.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/environment-detector.test.js +43 -0
- package/dist/tests/unit/utils/environment-detector.test.js.map +1 -0
- package/dist/tests/unit/utils/path-utils.test.d.ts +2 -0
- package/dist/tests/unit/utils/path-utils.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/path-utils.test.js +72 -0
- package/dist/tests/unit/utils/path-utils.test.js.map +1 -0
- package/dist/tests/unit/utils/project-detector.test.js +14 -13
- package/dist/tests/unit/utils/project-detector.test.js.map +1 -1
- package/dist/tests/unit/validation/parameter-validation.test.d.ts +2 -1
- package/dist/tests/unit/validation/parameter-validation.test.d.ts.map +1 -1
- package/dist/tests/unit/validation/parameter-validation.test.js +5 -133
- package/dist/tests/unit/validation/parameter-validation.test.js.map +1 -1
- package/dist/tests/unit/validation/policy-validation.test.js +15 -15
- package/dist/tests/unit/validation/policy-validation.test.js.map +1 -1
- package/dist/tests/utils/db-schema.js +48 -48
- package/dist/tests/utils/db-seeding.js +11 -11
- package/dist/tests/utils/db-seeding.js.map +1 -1
- package/dist/tests/utils/json-export-import.test.d.ts +6 -0
- package/dist/tests/utils/json-export-import.test.d.ts.map +1 -0
- package/dist/tests/utils/json-export-import.test.js +474 -0
- package/dist/tests/utils/json-export-import.test.js.map +1 -0
- package/dist/tests/utils/test-helpers.js +59 -59
- package/dist/tests/utils/test-helpers.js.map +1 -1
- package/dist/tools/constraints/actions/activate.d.ts +2 -2
- package/dist/tools/constraints/actions/activate.d.ts.map +1 -1
- package/dist/tools/constraints/actions/activate.js +12 -12
- package/dist/tools/constraints/actions/activate.js.map +1 -1
- package/dist/tools/constraints/actions/add.js +3 -3
- package/dist/tools/constraints/actions/add.js.map +1 -1
- package/dist/tools/constraints/actions/deactivate.js +6 -6
- package/dist/tools/constraints/actions/deactivate.js.map +1 -1
- package/dist/tools/constraints/actions/get.d.ts +2 -2
- package/dist/tools/constraints/actions/get.js +9 -9
- package/dist/tools/constraints/actions/get.js.map +1 -1
- package/dist/tools/constraints/actions/suggest-pending.js +2 -2
- package/dist/tools/constraints/actions/suggest-pending.js.map +1 -1
- package/dist/tools/constraints/index.d.ts +1 -1
- package/dist/tools/constraints/index.d.ts.map +1 -1
- package/dist/tools/constraints/index.js +1 -1
- package/dist/tools/constraints/index.js.map +1 -1
- package/dist/tools/context/actions/create-policy.js +3 -3
- package/dist/tools/context/actions/create-policy.js.map +1 -1
- package/dist/tools/context/actions/create-template.js +2 -2
- package/dist/tools/context/actions/create-template.js.map +1 -1
- package/dist/tools/context/actions/export.d.ts +35 -0
- package/dist/tools/context/actions/export.d.ts.map +1 -0
- package/dist/tools/context/actions/export.js +93 -0
- package/dist/tools/context/actions/export.js.map +1 -0
- package/dist/tools/context/actions/hard-delete.js +11 -11
- package/dist/tools/context/actions/hard-delete.js.map +1 -1
- package/dist/tools/context/actions/has-updates.d.ts +1 -1
- package/dist/tools/context/actions/has-updates.d.ts.map +1 -1
- package/dist/tools/context/actions/has-updates.js +5 -13
- package/dist/tools/context/actions/has-updates.js.map +1 -1
- package/dist/tools/context/actions/list-policies.js +1 -1
- package/dist/tools/context/actions/list-policies.js.map +1 -1
- package/dist/tools/context/actions/list-templates.js +2 -2
- package/dist/tools/context/actions/list-templates.js.map +1 -1
- package/dist/tools/context/actions/list.js +1 -1
- package/dist/tools/context/actions/list.js.map +1 -1
- package/dist/tools/context/actions/search-layer.js +8 -8
- package/dist/tools/context/actions/search-layer.js.map +1 -1
- package/dist/tools/context/actions/set-from-policy.js +1 -1
- package/dist/tools/context/actions/set-from-policy.js.map +1 -1
- package/dist/tools/context/actions/set-from-template.js +2 -2
- package/dist/tools/context/actions/set-from-template.js.map +1 -1
- package/dist/tools/context/actions/versions.js +3 -3
- package/dist/tools/context/actions/versions.js.map +1 -1
- package/dist/tools/context/index.d.ts +1 -0
- package/dist/tools/context/index.d.ts.map +1 -1
- package/dist/tools/context/index.js +2 -0
- package/dist/tools/context/index.js.map +1 -1
- package/dist/tools/context/internal/queries.d.ts.map +1 -1
- package/dist/tools/context/internal/queries.js +54 -43
- package/dist/tools/context/internal/queries.js.map +1 -1
- package/dist/tools/context/types.d.ts +1 -1
- package/dist/tools/context/types.d.ts.map +1 -1
- package/dist/tools/example/actions/get.d.ts +8 -3
- package/dist/tools/example/actions/get.d.ts.map +1 -1
- package/dist/tools/example/actions/get.js +29 -30
- package/dist/tools/example/actions/get.js.map +1 -1
- package/dist/tools/example/actions/list-all.d.ts +8 -2
- package/dist/tools/example/actions/list-all.d.ts.map +1 -1
- package/dist/tools/example/actions/list-all.js +37 -29
- package/dist/tools/example/actions/list-all.js.map +1 -1
- package/dist/tools/example/actions/search.d.ts +8 -3
- package/dist/tools/example/actions/search.d.ts.map +1 -1
- package/dist/tools/example/actions/search.js +29 -43
- package/dist/tools/example/actions/search.js.map +1 -1
- package/dist/tools/help/actions/batch-guide.js +5 -5
- package/dist/tools/help/actions/batch-guide.js.map +1 -1
- package/dist/tools/help/actions/query-action.d.ts +7 -3
- package/dist/tools/help/actions/query-action.d.ts.map +1 -1
- package/dist/tools/help/actions/query-action.js +35 -6
- package/dist/tools/help/actions/query-action.js.map +1 -1
- package/dist/tools/help/actions/query-params.d.ts +5 -3
- package/dist/tools/help/actions/query-params.d.ts.map +1 -1
- package/dist/tools/help/actions/query-params.js +28 -6
- package/dist/tools/help/actions/query-params.js.map +1 -1
- package/dist/tools/help/actions/query-tool.d.ts +5 -3
- package/dist/tools/help/actions/query-tool.d.ts.map +1 -1
- package/dist/tools/help/actions/query-tool.js +23 -6
- package/dist/tools/help/actions/query-tool.js.map +1 -1
- package/dist/tools/help/actions/workflow-hints.d.ts +5 -3
- package/dist/tools/help/actions/workflow-hints.d.ts.map +1 -1
- package/dist/tools/help/actions/workflow-hints.js +21 -6
- package/dist/tools/help/actions/workflow-hints.js.map +1 -1
- package/dist/tools/queue/actions/clear.d.ts +19 -0
- package/dist/tools/queue/actions/clear.d.ts.map +1 -0
- package/dist/tools/queue/actions/clear.js +79 -0
- package/dist/tools/queue/actions/clear.js.map +1 -0
- package/dist/tools/queue/actions/list.d.ts +16 -0
- package/dist/tools/queue/actions/list.d.ts.map +1 -0
- package/dist/tools/queue/actions/list.js +95 -0
- package/dist/tools/queue/actions/list.js.map +1 -0
- package/dist/tools/queue/actions/remove.d.ts +19 -0
- package/dist/tools/queue/actions/remove.d.ts.map +1 -0
- package/dist/tools/queue/actions/remove.js +81 -0
- package/dist/tools/queue/actions/remove.js.map +1 -0
- package/dist/tools/queue/index.d.ts +13 -0
- package/dist/tools/queue/index.d.ts.map +1 -0
- package/dist/tools/queue/index.js +13 -0
- package/dist/tools/queue/index.js.map +1 -0
- package/dist/tools/queue/types.d.ts +87 -0
- package/dist/tools/queue/types.d.ts.map +1 -0
- package/dist/tools/queue/types.js +9 -0
- package/dist/tools/queue/types.js.map +1 -0
- package/dist/tools/suggest/actions/by-context.d.ts.map +1 -1
- package/dist/tools/suggest/actions/by-context.js +3 -1
- package/dist/tools/suggest/actions/by-context.js.map +1 -1
- package/dist/tools/suggest/actions/by-key.d.ts.map +1 -1
- package/dist/tools/suggest/actions/by-key.js +3 -1
- package/dist/tools/suggest/actions/by-key.js.map +1 -1
- package/dist/tools/suggest/actions/by-tags.d.ts +2 -2
- package/dist/tools/suggest/actions/by-tags.js +3 -3
- package/dist/tools/suggest/actions/by-tags.js.map +1 -1
- package/dist/tools/suggest/internal/constraint-queries.d.ts +4 -4
- package/dist/tools/suggest/internal/constraint-queries.js +14 -14
- package/dist/tools/suggest/internal/constraint-queries.js.map +1 -1
- package/dist/tools/suggest/internal/queries.d.ts +4 -4
- package/dist/tools/suggest/internal/queries.js +25 -25
- package/dist/tools/suggest/internal/queries.js.map +1 -1
- package/dist/tools/use_case/actions/get.d.ts +5 -3
- package/dist/tools/use_case/actions/get.d.ts.map +1 -1
- package/dist/tools/use_case/actions/get.js +20 -6
- package/dist/tools/use_case/actions/get.js.map +1 -1
- package/dist/tools/use_case/actions/list-all.d.ts +5 -3
- package/dist/tools/use_case/actions/list-all.d.ts.map +1 -1
- package/dist/tools/use_case/actions/list-all.js +36 -6
- package/dist/tools/use_case/actions/list-all.js.map +1 -1
- package/dist/tools/use_case/actions/search.d.ts +6 -3
- package/dist/tools/use_case/actions/search.d.ts.map +1 -1
- package/dist/tools/use_case/actions/search.js +37 -67
- package/dist/tools/use_case/actions/search.js.map +1 -1
- package/dist/tools/use_case/help/example.js +17 -17
- package/dist/tools/use_case/help/example.js.map +1 -1
- package/dist/types.d.ts +82 -153
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -10
- package/dist/types.js.map +1 -1
- package/dist/utils/action-specs/constraint-specs.js +6 -6
- package/dist/utils/action-specs/constraint-specs.js.map +1 -1
- package/dist/utils/action-specs/index.d.ts +0 -2
- package/dist/utils/action-specs/index.d.ts.map +1 -1
- package/dist/utils/action-specs/index.js +0 -6
- package/dist/utils/action-specs/index.js.map +1 -1
- package/dist/utils/batch-validation.d.ts +1 -1
- package/dist/utils/batch-validation.js +3 -3
- package/dist/utils/batch-validation.js.map +1 -1
- package/dist/utils/case-insensitive-validator.d.ts +2 -2
- package/dist/utils/case-insensitive-validator.js +2 -2
- package/dist/utils/connection-hash.d.ts +37 -0
- package/dist/utils/connection-hash.d.ts.map +1 -0
- package/dist/utils/connection-hash.js +55 -0
- package/dist/utils/connection-hash.js.map +1 -0
- package/dist/utils/db-aggregations.js +16 -16
- package/dist/utils/db-aggregations.js.map +1 -1
- package/dist/utils/enum-converter.d.ts +0 -21
- package/dist/utils/enum-converter.d.ts.map +1 -1
- package/dist/utils/enum-converter.js +1 -23
- package/dist/utils/enum-converter.js.map +1 -1
- package/dist/utils/environment-detector.d.ts +30 -0
- package/dist/utils/environment-detector.d.ts.map +1 -0
- package/dist/utils/environment-detector.js +86 -0
- package/dist/utils/environment-detector.js.map +1 -0
- package/dist/utils/example-filter.d.ts +34 -0
- package/dist/utils/example-filter.d.ts.map +1 -0
- package/dist/utils/example-filter.js +45 -0
- package/dist/utils/example-filter.js.map +1 -0
- package/dist/utils/exporter/export.d.ts +2 -16
- package/dist/utils/exporter/export.d.ts.map +1 -1
- package/dist/utils/exporter/export.js +49 -130
- package/dist/utils/exporter/export.js.map +1 -1
- package/dist/utils/hook-queue.d.ts +60 -0
- package/dist/utils/hook-queue.d.ts.map +1 -1
- package/dist/utils/hook-queue.js +114 -11
- package/dist/utils/hook-queue.js.map +1 -1
- package/dist/utils/importer/import.d.ts.map +1 -1
- package/dist/utils/importer/import.js +33 -188
- package/dist/utils/importer/import.js.map +1 -1
- package/dist/utils/importer/master-tables.d.ts +2 -1
- package/dist/utils/importer/master-tables.d.ts.map +1 -1
- package/dist/utils/importer/master-tables.js +35 -81
- package/dist/utils/importer/master-tables.js.map +1 -1
- package/dist/utils/param-normalizer.d.ts +0 -1
- package/dist/utils/param-normalizer.d.ts.map +1 -1
- package/dist/utils/param-normalizer.js +1 -3
- package/dist/utils/param-normalizer.js.map +1 -1
- package/dist/utils/path-utils.d.ts +46 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +74 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/utils/policy-validator.js +1 -1
- package/dist/utils/policy-validator.js.map +1 -1
- package/dist/utils/project-context.d.ts +23 -0
- package/dist/utils/project-context.d.ts.map +1 -1
- package/dist/utils/project-context.js +45 -3
- package/dist/utils/project-context.js.map +1 -1
- package/dist/utils/project-root.d.ts +2 -2
- package/dist/utils/project-root.js +2 -2
- package/dist/utils/sql-dump/core/index-export.js +7 -7
- package/dist/utils/sql-dump/schema/indexes.js +24 -24
- package/dist/utils/sql-dump/schema/tables.js +44 -44
- package/dist/utils/token-logging.js +6 -6
- package/dist/utils/token-logging.js.map +1 -1
- package/dist/utils/validators.js +1 -1
- package/dist/utils/validators.js.map +1 -1
- package/dist/utils/view-queries.d.ts +0 -8
- package/dist/utils/view-queries.d.ts.map +1 -1
- package/dist/utils/view-queries.js +29 -84
- package/dist/utils/view-queries.js.map +1 -1
- package/dist/watcher/index.d.ts +1 -4
- package/dist/watcher/index.d.ts.map +1 -1
- package/dist/watcher/index.js +1 -3
- package/dist/watcher/index.js.map +1 -1
- package/dist/watcher/queue-watcher.d.ts +10 -3
- package/dist/watcher/queue-watcher.d.ts.map +1 -1
- package/dist/watcher/queue-watcher.js +24 -21
- package/dist/watcher/queue-watcher.js.map +1 -1
- package/docs/CONFIGURATION.md +14 -14
- package/docs/DATABASE_AUTH.md +1 -1
- package/docs/HOOKS_GUIDE.md +30 -50
- package/docs/HOW_TO_UNINSTALL.md +199 -0
- package/docs/MIGRATION_CLEANUP_GUIDE.md +212 -0
- package/docs/MIGRATION_TO_SAAS.md +176 -0
- package/docs/SLASH_COMMANDS.md +1 -1
- package/docs/cli/DATABASE_MIGRATION.md +13 -13
- package/docs/cli/DATA_EXPORT_IMPORT.md +71 -69
- package/package.json +10 -8
- package/saas-connector/LICENSE +190 -0
- package/saas-connector/README.md +122 -0
- package/saas-connector/dist/auth/auth-manager.d.ts +6 -0
- package/saas-connector/dist/auth/auth-manager.d.ts.map +1 -0
- package/saas-connector/dist/auth/auth-manager.js +39 -0
- package/saas-connector/dist/auth/auth-manager.js.map +7 -0
- package/saas-connector/dist/backend/saas-backend.d.ts +20 -0
- package/saas-connector/dist/backend/saas-backend.d.ts.map +1 -0
- package/saas-connector/dist/backend/saas-backend.js +104 -0
- package/saas-connector/dist/backend/saas-backend.js.map +7 -0
- package/saas-connector/dist/client/http-client.d.ts +33 -0
- package/saas-connector/dist/client/http-client.d.ts.map +1 -0
- package/saas-connector/dist/client/http-client.js +226 -0
- package/saas-connector/dist/client/http-client.js.map +7 -0
- package/saas-connector/dist/client/types.d.ts +62 -0
- package/saas-connector/dist/client/types.d.ts.map +1 -0
- package/saas-connector/dist/client/types.js +17 -0
- package/saas-connector/dist/client/types.js.map +7 -0
- package/saas-connector/dist/config/constants.d.ts +14 -0
- package/saas-connector/dist/config/constants.d.ts.map +1 -0
- package/saas-connector/dist/config/constants.js +68 -0
- package/saas-connector/dist/config/constants.js.map +7 -0
- package/saas-connector/dist/errors/api-error.d.ts +26 -0
- package/saas-connector/dist/errors/api-error.d.ts.map +1 -0
- package/saas-connector/dist/errors/api-error.js +62 -0
- package/saas-connector/dist/errors/api-error.js.map +7 -0
- package/saas-connector/dist/index.d.ts +18 -0
- package/saas-connector/dist/index.d.ts.map +1 -0
- package/saas-connector/dist/index.js +51 -0
- package/saas-connector/dist/index.js.map +7 -0
- package/saas-connector/package-lock.json +518 -0
- package/saas-connector/package.json +34 -0
- package/scripts/copy-help-data.js +19 -0
- package/assets/config.example.toml +0 -120
- package/assets/kanban-style.png +0 -0
- package/assets/kanban-visualizer.png +0 -0
- package/assets/sample-agents/README.md +0 -36
- package/assets/sample-agents/sqlew-architect.md +0 -321
- package/assets/sample-agents/sqlew-researcher.md +0 -292
- package/assets/sample-agents/sqlew-scrum-master.md +0 -286
- package/assets/sample-commands/README.md +0 -56
- package/assets/sample-commands/sqlew.md +0 -144
- package/assets/sample-skills/sqlew-decision-format/SKILL.md +0 -73
- package/assets/sample-skills/sqlew-plan-guidance/SKILL.md +0 -62
- package/assets/schema.sql +0 -564
- package/dist/cli/hooks/init-hooks.d.ts +0 -35
- package/dist/cli/hooks/init-hooks.d.ts.map +0 -1
- package/dist/cli/hooks/init-hooks.js +0 -517
- package/dist/cli/hooks/init-hooks.js.map +0 -1
- package/dist/cli/hooks/plan-toml-parser.d.ts.map +0 -1
- package/dist/cli/hooks/plan-toml-parser.js.map +0 -1
- package/dist/init-agents.d.ts +0 -7
- package/dist/init-agents.d.ts.map +0 -1
- package/dist/init-agents.js +0 -206
- package/dist/init-agents.js.map +0 -1
- package/dist/init-commands.d.ts +0 -10
- package/dist/init-commands.d.ts.map +0 -1
- package/dist/init-commands.js +0 -46
- package/dist/init-commands.js.map +0 -1
- package/dist/init-skills.d.ts +0 -29
- package/dist/init-skills.d.ts.map +0 -1
- package/dist/init-skills.js +0 -183
- package/dist/init-skills.js.map +0 -1
- package/dist/sync-agents.d.ts +0 -13
- package/dist/sync-agents.d.ts.map +0 -1
- package/dist/sync-agents.js +0 -157
- package/dist/sync-agents.js.map +0 -1
- package/dist/sync-commands.d.ts +0 -13
- package/dist/sync-commands.d.ts.map +0 -1
- package/dist/sync-commands.js +0 -150
- package/dist/sync-commands.js.map +0 -1
- package/dist/sync-gitignore.d.ts +0 -13
- package/dist/sync-gitignore.d.ts.map +0 -1
- package/dist/sync-gitignore.js +0 -60
- package/dist/sync-gitignore.js.map +0 -1
- package/dist/tests/docker/native/task-operations.test.d.ts +0 -16
- package/dist/tests/docker/native/task-operations.test.d.ts.map +0 -1
- package/dist/tests/docker/native/task-operations.test.js +0 -800
- package/dist/tests/docker/native/task-operations.test.js.map +0 -1
- package/dist/tests/feature/decision/batch-validation-integration.test.d.ts +0 -6
- package/dist/tests/feature/decision/batch-validation-integration.test.d.ts.map +0 -1
- package/dist/tests/feature/decision/batch-validation-integration.test.js +0 -193
- package/dist/tests/feature/decision/batch-validation-integration.test.js.map +0 -1
- package/dist/tests/feature/task/auto-pruning-decision-link.test.d.ts +0 -6
- package/dist/tests/feature/task/auto-pruning-decision-link.test.d.ts.map +0 -1
- package/dist/tests/feature/task/auto-pruning-decision-link.test.js +0 -281
- package/dist/tests/feature/task/auto-pruning-decision-link.test.js.map +0 -1
- package/dist/tests/feature/task/auto-pruning-partial.test.d.ts +0 -6
- package/dist/tests/feature/task/auto-pruning-partial.test.d.ts.map +0 -1
- package/dist/tests/feature/task/auto-pruning-partial.test.js +0 -305
- package/dist/tests/feature/task/auto-pruning-partial.test.js.map +0 -1
- package/dist/tests/feature/task/auto-pruning-persistence.test.d.ts +0 -6
- package/dist/tests/feature/task/auto-pruning-persistence.test.d.ts.map +0 -1
- package/dist/tests/feature/task/auto-pruning-persistence.test.js +0 -267
- package/dist/tests/feature/task/auto-pruning-persistence.test.js.map +0 -1
- package/dist/tests/feature/task/auto-pruning-safety.test.d.ts +0 -12
- package/dist/tests/feature/task/auto-pruning-safety.test.d.ts.map +0 -1
- package/dist/tests/feature/task/auto-pruning-safety.test.js +0 -224
- package/dist/tests/feature/task/auto-pruning-safety.test.js.map +0 -1
- package/dist/tests/feature/task/dependencies.test.d.ts +0 -7
- package/dist/tests/feature/task/dependencies.test.d.ts.map +0 -1
- package/dist/tests/feature/task/dependencies.test.js +0 -656
- package/dist/tests/feature/task/dependencies.test.js.map +0 -1
- package/dist/tests/feature/task/file-actions-integration.test.d.ts +0 -10
- package/dist/tests/feature/task/file-actions-integration.test.d.ts.map +0 -1
- package/dist/tests/feature/task/file-actions-integration.test.js +0 -162
- package/dist/tests/feature/task/file-actions-integration.test.js.map +0 -1
- package/dist/tests/feature/task/file-actions-validation.test.d.ts +0 -6
- package/dist/tests/feature/task/file-actions-validation.test.d.ts.map +0 -1
- package/dist/tests/feature/task/file-actions-validation.test.js +0 -228
- package/dist/tests/feature/task/file-actions-validation.test.js.map +0 -1
- package/dist/tests/feature/task/link-file-backward-compat.test.d.ts +0 -6
- package/dist/tests/feature/task/link-file-backward-compat.test.d.ts.map +0 -1
- package/dist/tests/feature/task/link-file-backward-compat.test.js +0 -280
- package/dist/tests/feature/task/link-file-backward-compat.test.js.map +0 -1
- package/dist/tests/feature/task/watch-files-action.test.d.ts +0 -8
- package/dist/tests/feature/task/watch-files-action.test.d.ts.map +0 -1
- package/dist/tests/feature/task/watch-files-action.test.js +0 -402
- package/dist/tests/feature/task/watch-files-action.test.js.map +0 -1
- package/dist/tests/feature/task/watch-files-parameter.test.d.ts +0 -8
- package/dist/tests/feature/task/watch-files-parameter.test.d.ts.map +0 -1
- package/dist/tests/feature/task/watch-files-parameter.test.js +0 -283
- package/dist/tests/feature/task/watch-files-parameter.test.js.map +0 -1
- package/dist/tests/integration/all-features.standalone.d.ts +0 -7
- package/dist/tests/integration/all-features.standalone.d.ts.map +0 -1
- package/dist/tests/integration/all-features.standalone.js +0 -417
- package/dist/tests/integration/all-features.standalone.js.map +0 -1
- package/dist/tests/unit/config/plan-toml-cache.test.d.ts.map +0 -1
- package/dist/tests/unit/config/plan-toml-cache.test.js.map +0 -1
- package/dist/tests/unit/hooks/plan-toml-parser.test.d.ts.map +0 -1
- package/dist/tests/unit/hooks/plan-toml-parser.test.js.map +0 -1
- package/dist/tools/files/actions/check-lock.d.ts +0 -16
- package/dist/tools/files/actions/check-lock.d.ts.map +0 -1
- package/dist/tools/files/actions/check-lock.js +0 -74
- package/dist/tools/files/actions/check-lock.js.map +0 -1
- package/dist/tools/files/actions/get.d.ts +0 -16
- package/dist/tools/files/actions/get.d.ts.map +0 -1
- package/dist/tools/files/actions/get.js +0 -85
- package/dist/tools/files/actions/get.js.map +0 -1
- package/dist/tools/files/actions/record-batch.d.ts +0 -18
- package/dist/tools/files/actions/record-batch.d.ts.map +0 -1
- package/dist/tools/files/actions/record-batch.js +0 -119
- package/dist/tools/files/actions/record-batch.js.map +0 -1
- package/dist/tools/files/actions/record.d.ts +0 -16
- package/dist/tools/files/actions/record.d.ts.map +0 -1
- package/dist/tools/files/actions/record.js +0 -43
- package/dist/tools/files/actions/record.js.map +0 -1
- package/dist/tools/files/actions/sqlite-flush.d.ts +0 -27
- package/dist/tools/files/actions/sqlite-flush.d.ts.map +0 -1
- package/dist/tools/files/actions/sqlite-flush.js +0 -66
- package/dist/tools/files/actions/sqlite-flush.js.map +0 -1
- package/dist/tools/files/help/example.d.ts +0 -5
- package/dist/tools/files/help/example.d.ts.map +0 -1
- package/dist/tools/files/help/example.js +0 -109
- package/dist/tools/files/help/example.js.map +0 -1
- package/dist/tools/files/help/help.d.ts +0 -5
- package/dist/tools/files/help/help.d.ts.map +0 -1
- package/dist/tools/files/help/help.js +0 -35
- package/dist/tools/files/help/help.js.map +0 -1
- package/dist/tools/files/index.d.ts +0 -14
- package/dist/tools/files/index.d.ts.map +0 -1
- package/dist/tools/files/index.js +0 -15
- package/dist/tools/files/index.js.map +0 -1
- package/dist/tools/files/internal/queries.d.ts +0 -18
- package/dist/tools/files/internal/queries.d.ts.map +0 -1
- package/dist/tools/files/internal/queries.js +0 -54
- package/dist/tools/files/internal/queries.js.map +0 -1
- package/dist/tools/files/internal/validation.d.ts +0 -18
- package/dist/tools/files/internal/validation.d.ts.map +0 -1
- package/dist/tools/files/internal/validation.js +0 -39
- package/dist/tools/files/internal/validation.js.map +0 -1
- package/dist/tools/files/types.d.ts +0 -6
- package/dist/tools/files/types.d.ts.map +0 -1
- package/dist/tools/files/types.js +0 -6
- package/dist/tools/files/types.js.map +0 -1
- package/dist/tools/help-queries.d.ts +0 -130
- package/dist/tools/help-queries.d.ts.map +0 -1
- package/dist/tools/help-queries.js +0 -411
- package/dist/tools/help-queries.js.map +0 -1
- package/dist/tools/tasks/actions/add-dependency.d.ts +0 -12
- package/dist/tools/tasks/actions/add-dependency.d.ts.map +0 -1
- package/dist/tools/tasks/actions/add-dependency.js +0 -129
- package/dist/tools/tasks/actions/add-dependency.js.map +0 -1
- package/dist/tools/tasks/actions/archive.d.ts +0 -11
- package/dist/tools/tasks/actions/archive.d.ts.map +0 -1
- package/dist/tools/tasks/actions/archive.js +0 -58
- package/dist/tools/tasks/actions/archive.js.map +0 -1
- package/dist/tools/tasks/actions/create-batch.d.ts +0 -19
- package/dist/tools/tasks/actions/create-batch.d.ts.map +0 -1
- package/dist/tools/tasks/actions/create-batch.js +0 -103
- package/dist/tools/tasks/actions/create-batch.js.map +0 -1
- package/dist/tools/tasks/actions/create.d.ts +0 -16
- package/dist/tools/tasks/actions/create.d.ts.map +0 -1
- package/dist/tools/tasks/actions/create.js +0 -163
- package/dist/tools/tasks/actions/create.js.map +0 -1
- package/dist/tools/tasks/actions/get-dependencies.d.ts +0 -12
- package/dist/tools/tasks/actions/get-dependencies.d.ts.map +0 -1
- package/dist/tools/tasks/actions/get-dependencies.js +0 -41
- package/dist/tools/tasks/actions/get-dependencies.js.map +0 -1
- package/dist/tools/tasks/actions/get-pruned-files.d.ts +0 -13
- package/dist/tools/tasks/actions/get-pruned-files.d.ts.map +0 -1
- package/dist/tools/tasks/actions/get-pruned-files.js +0 -45
- package/dist/tools/tasks/actions/get-pruned-files.js.map +0 -1
- package/dist/tools/tasks/actions/get.d.ts +0 -12
- package/dist/tools/tasks/actions/get.d.ts.map +0 -1
- package/dist/tools/tasks/actions/get.js +0 -84
- package/dist/tools/tasks/actions/get.js.map +0 -1
- package/dist/tools/tasks/actions/link-pruned-file.d.ts +0 -14
- package/dist/tools/tasks/actions/link-pruned-file.d.ts.map +0 -1
- package/dist/tools/tasks/actions/link-pruned-file.js +0 -68
- package/dist/tools/tasks/actions/link-pruned-file.js.map +0 -1
- package/dist/tools/tasks/actions/link.d.ts +0 -14
- package/dist/tools/tasks/actions/link.d.ts.map +0 -1
- package/dist/tools/tasks/actions/link.js +0 -120
- package/dist/tools/tasks/actions/link.js.map +0 -1
- package/dist/tools/tasks/actions/list.d.ts +0 -17
- package/dist/tools/tasks/actions/list.d.ts.map +0 -1
- package/dist/tools/tasks/actions/list.js +0 -100
- package/dist/tools/tasks/actions/list.js.map +0 -1
- package/dist/tools/tasks/actions/move.d.ts +0 -13
- package/dist/tools/tasks/actions/move.d.ts.map +0 -1
- package/dist/tools/tasks/actions/move.js +0 -91
- package/dist/tools/tasks/actions/move.js.map +0 -1
- package/dist/tools/tasks/actions/remove-dependency.d.ts +0 -12
- package/dist/tools/tasks/actions/remove-dependency.d.ts.map +0 -1
- package/dist/tools/tasks/actions/remove-dependency.js +0 -36
- package/dist/tools/tasks/actions/remove-dependency.js.map +0 -1
- package/dist/tools/tasks/actions/update.d.ts +0 -10
- package/dist/tools/tasks/actions/update.d.ts.map +0 -1
- package/dist/tools/tasks/actions/update.js +0 -183
- package/dist/tools/tasks/actions/update.js.map +0 -1
- package/dist/tools/tasks/actions/watch-files.d.ts +0 -14
- package/dist/tools/tasks/actions/watch-files.d.ts.map +0 -1
- package/dist/tools/tasks/actions/watch-files.js +0 -127
- package/dist/tools/tasks/actions/watch-files.js.map +0 -1
- package/dist/tools/tasks/help/example.d.ts +0 -8
- package/dist/tools/tasks/help/example.d.ts.map +0 -1
- package/dist/tools/tasks/help/example.js +0 -225
- package/dist/tools/tasks/help/example.js.map +0 -1
- package/dist/tools/tasks/help/help.d.ts +0 -8
- package/dist/tools/tasks/help/help.d.ts.map +0 -1
- package/dist/tools/tasks/help/help.js +0 -307
- package/dist/tools/tasks/help/help.js.map +0 -1
- package/dist/tools/tasks/help/use-case.d.ts +0 -11
- package/dist/tools/tasks/help/use-case.d.ts.map +0 -1
- package/dist/tools/tasks/help/use-case.js +0 -767
- package/dist/tools/tasks/help/use-case.js.map +0 -1
- package/dist/tools/tasks/index.d.ts +0 -28
- package/dist/tools/tasks/index.d.ts.map +0 -1
- package/dist/tools/tasks/index.js +0 -33
- package/dist/tools/tasks/index.js.map +0 -1
- package/dist/tools/tasks/internal/state-machine.d.ts +0 -16
- package/dist/tools/tasks/internal/state-machine.d.ts.map +0 -1
- package/dist/tools/tasks/internal/state-machine.js +0 -36
- package/dist/tools/tasks/internal/state-machine.js.map +0 -1
- package/dist/tools/tasks/internal/task-queries.d.ts +0 -12
- package/dist/tools/tasks/internal/task-queries.d.ts.map +0 -1
- package/dist/tools/tasks/internal/task-queries.js +0 -53
- package/dist/tools/tasks/internal/task-queries.js.map +0 -1
- package/dist/tools/tasks/internal/validation.d.ts +0 -47
- package/dist/tools/tasks/internal/validation.d.ts.map +0 -1
- package/dist/tools/tasks/internal/validation.js +0 -261
- package/dist/tools/tasks/internal/validation.js.map +0 -1
- package/dist/tools/tasks/types.d.ts +0 -80
- package/dist/tools/tasks/types.d.ts.map +0 -1
- package/dist/tools/tasks/types.js +0 -68
- package/dist/tools/tasks/types.js.map +0 -1
- package/dist/tools/tasks/watcher/status.d.ts +0 -9
- package/dist/tools/tasks/watcher/status.d.ts.map +0 -1
- package/dist/tools/tasks/watcher/status.js +0 -130
- package/dist/tools/tasks/watcher/status.js.map +0 -1
- package/dist/tools/tasks.d.ts +0 -16
- package/dist/tools/tasks.d.ts.map +0 -1
- package/dist/tools/tasks.js +0 -17
- package/dist/tools/tasks.js.map +0 -1
- package/dist/utils/action-specs/file-specs.d.ts +0 -9
- package/dist/utils/action-specs/file-specs.d.ts.map +0 -1
- package/dist/utils/action-specs/file-specs.js +0 -54
- package/dist/utils/action-specs/file-specs.js.map +0 -1
- package/dist/utils/action-specs/task-specs.d.ts +0 -9
- package/dist/utils/action-specs/task-specs.d.ts.map +0 -1
- package/dist/utils/action-specs/task-specs.js +0 -143
- package/dist/utils/action-specs/task-specs.js.map +0 -1
- package/dist/utils/cleanup.d.ts +0 -69
- package/dist/utils/cleanup.d.ts.map +0 -1
- package/dist/utils/cleanup.js +0 -102
- package/dist/utils/cleanup.js.map +0 -1
- package/dist/utils/file-pruning.d.ts +0 -93
- package/dist/utils/file-pruning.d.ts.map +0 -1
- package/dist/utils/file-pruning.js +0 -194
- package/dist/utils/file-pruning.js.map +0 -1
- package/dist/utils/importer/topological-sort.d.ts +0 -61
- package/dist/utils/importer/topological-sort.d.ts.map +0 -1
- package/dist/utils/importer/topological-sort.js +0 -143
- package/dist/utils/importer/topological-sort.js.map +0 -1
- package/dist/utils/retention.d.ts +0 -65
- package/dist/utils/retention.d.ts.map +0 -1
- package/dist/utils/retention.js +0 -156
- package/dist/utils/retention.js.map +0 -1
- package/dist/utils/task-stale-detection.d.ts +0 -98
- package/dist/utils/task-stale-detection.d.ts.map +0 -1
- package/dist/utils/task-stale-detection.js +0 -479
- package/dist/utils/task-stale-detection.js.map +0 -1
- package/dist/watcher/file-watcher.d.ts +0 -131
- package/dist/watcher/file-watcher.d.ts.map +0 -1
- package/dist/watcher/file-watcher.js +0 -730
- package/dist/watcher/file-watcher.js.map +0 -1
- package/dist/watcher/test-executor.d.ts +0 -23
- package/dist/watcher/test-executor.d.ts.map +0 -1
- package/dist/watcher/test-executor.js +0 -226
- package/dist/watcher/test-executor.js.map +0 -1
- package/docs/TASK_SYSTEM_DEPRECATED.md +0 -88
|
@@ -1,800 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task Operations - Native RDBMS Integration Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests task table schema and operations (CRUD, dependencies, status transitions,
|
|
5
|
-
* FK constraints, cascade delete) on fresh MySQL, MariaDB, and PostgreSQL installations.
|
|
6
|
-
*
|
|
7
|
-
* Task #532: Refactor task-operations.test.ts to use direct Knex operations
|
|
8
|
-
*
|
|
9
|
-
* ARCHITECTURE: Native RDBMS tests focus on database layer validation.
|
|
10
|
-
* - NO MCP tool function imports
|
|
11
|
-
* - Direct Knex operations only
|
|
12
|
-
* - Tests database constraints, indexes, views, triggers
|
|
13
|
-
* - Cross-database compatibility validation
|
|
14
|
-
*/
|
|
15
|
-
import { describe, it } from 'node:test';
|
|
16
|
-
import assert from 'node:assert';
|
|
17
|
-
import { runTestsOnAllDatabases, getLayerId, getTagId } from './test-harness.js';
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// Test Helpers
|
|
20
|
-
// ============================================================================
|
|
21
|
-
/**
|
|
22
|
-
* Get task status ID by status name
|
|
23
|
-
*/
|
|
24
|
-
async function getStatusId(db, statusName) {
|
|
25
|
-
const status = await db('v4_task_statuses').where({ name: statusName }).first();
|
|
26
|
-
assert.ok(status, `Status "${statusName}" should exist`);
|
|
27
|
-
return status.id;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Insert a task with required fields (helper for test setup)
|
|
31
|
-
*/
|
|
32
|
-
async function insertTask(db, data) {
|
|
33
|
-
const statusId = await getStatusId(db, data.status || 'todo');
|
|
34
|
-
const layerId = data.layer ? await getLayerId(db, data.layer) : await getLayerId(db, 'business');
|
|
35
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
36
|
-
const insertData = {
|
|
37
|
-
title: data.title,
|
|
38
|
-
status_id: statusId,
|
|
39
|
-
priority: data.priority || 2,
|
|
40
|
-
layer_id: layerId,
|
|
41
|
-
project_id: 1,
|
|
42
|
-
created_ts: timestamp,
|
|
43
|
-
updated_ts: timestamp,
|
|
44
|
-
};
|
|
45
|
-
const result = await db('v4_tasks').insert(insertData);
|
|
46
|
-
// Get the inserted ID (different return format across databases)
|
|
47
|
-
let taskId;
|
|
48
|
-
if (Array.isArray(result) && result.length > 0) {
|
|
49
|
-
taskId = result[0];
|
|
50
|
-
}
|
|
51
|
-
else if (typeof result === 'number') {
|
|
52
|
-
taskId = result;
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
// Fallback: query the last inserted task
|
|
56
|
-
const task = await db('v4_tasks')
|
|
57
|
-
.where({ title: data.title, project_id: 1 })
|
|
58
|
-
.orderBy('id', 'desc')
|
|
59
|
-
.first();
|
|
60
|
-
taskId = task.id;
|
|
61
|
-
}
|
|
62
|
-
// Insert task details if description provided
|
|
63
|
-
if (data.description) {
|
|
64
|
-
await db('v4_task_details').insert({
|
|
65
|
-
task_id: taskId,
|
|
66
|
-
description: data.description,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
return taskId;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Assert task has expected status
|
|
73
|
-
*/
|
|
74
|
-
async function assertTaskHasStatus(db, taskId, expectedStatus) {
|
|
75
|
-
const task = await db('v4_tasks')
|
|
76
|
-
.join('v4_task_statuses', 'v4_tasks.status_id', 'v4_task_statuses.id')
|
|
77
|
-
.where({ 'v4_tasks.id': taskId })
|
|
78
|
-
.select('v4_task_statuses.name as status')
|
|
79
|
-
.first();
|
|
80
|
-
assert.ok(task, `Task ${taskId} should exist`);
|
|
81
|
-
assert.strictEqual(task.status, expectedStatus, `Task ${taskId} status should be ${expectedStatus}`);
|
|
82
|
-
}
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// Test Suite
|
|
85
|
-
// ============================================================================
|
|
86
|
-
runTestsOnAllDatabases('Task Operations', (getDb, dbType) => {
|
|
87
|
-
// ============================================================================
|
|
88
|
-
// Basic CRUD Operations
|
|
89
|
-
// ============================================================================
|
|
90
|
-
describe('Task CRUD', () => {
|
|
91
|
-
it('should insert task with required fields', async () => {
|
|
92
|
-
const db = getDb();
|
|
93
|
-
const taskId = await insertTask(db, {
|
|
94
|
-
title: 'Implement authentication',
|
|
95
|
-
priority: 3,
|
|
96
|
-
layer: 'business',
|
|
97
|
-
});
|
|
98
|
-
assert.ok(taskId, 'Should return task ID');
|
|
99
|
-
// Verify task exists
|
|
100
|
-
const task = await db('v4_tasks').where({ id: taskId, project_id: 1 }).first();
|
|
101
|
-
assert.strictEqual(task.title, 'Implement authentication');
|
|
102
|
-
assert.strictEqual(task.priority, 3);
|
|
103
|
-
await assertTaskHasStatus(db, taskId, 'todo');
|
|
104
|
-
});
|
|
105
|
-
it('should insert task with all optional fields', async () => {
|
|
106
|
-
const db = getDb();
|
|
107
|
-
const taskId = await insertTask(db, {
|
|
108
|
-
title: 'Complex task with all fields',
|
|
109
|
-
description: 'This is a detailed description',
|
|
110
|
-
priority: 4,
|
|
111
|
-
layer: 'infrastructure',
|
|
112
|
-
});
|
|
113
|
-
// Verify core task data
|
|
114
|
-
const task = await db('v4_tasks').where({ id: taskId, project_id: 1 }).first();
|
|
115
|
-
assert.strictEqual(task.title, 'Complex task with all fields');
|
|
116
|
-
assert.strictEqual(task.priority, 4);
|
|
117
|
-
const layerId = await getLayerId(db, 'infrastructure');
|
|
118
|
-
assert.strictEqual(task.layer_id, layerId);
|
|
119
|
-
// Verify task details
|
|
120
|
-
const details = await db('v4_task_details').where({ task_id: taskId }).first();
|
|
121
|
-
assert.ok(details, 'Task details should exist');
|
|
122
|
-
assert.strictEqual(details.description, 'This is a detailed description');
|
|
123
|
-
});
|
|
124
|
-
it('should update task fields', async () => {
|
|
125
|
-
const db = getDb();
|
|
126
|
-
const taskId = await insertTask(db, {
|
|
127
|
-
title: 'Original title',
|
|
128
|
-
priority: 2,
|
|
129
|
-
});
|
|
130
|
-
// Update title and priority
|
|
131
|
-
await db('v4_tasks')
|
|
132
|
-
.where({ id: taskId, project_id: 1 })
|
|
133
|
-
.update({
|
|
134
|
-
title: 'Updated title',
|
|
135
|
-
priority: 4,
|
|
136
|
-
updated_ts: Math.floor(Date.now() / 1000),
|
|
137
|
-
});
|
|
138
|
-
// Verify update
|
|
139
|
-
const task = await db('v4_tasks').where({ id: taskId, project_id: 1 }).first();
|
|
140
|
-
assert.strictEqual(task.title, 'Updated title');
|
|
141
|
-
assert.strictEqual(task.priority, 4);
|
|
142
|
-
});
|
|
143
|
-
it('should delete task', async () => {
|
|
144
|
-
const db = getDb();
|
|
145
|
-
const taskId = await insertTask(db, {
|
|
146
|
-
title: 'Task to delete',
|
|
147
|
-
});
|
|
148
|
-
// Delete task
|
|
149
|
-
await db('v4_tasks').where({ id: taskId, project_id: 1 }).delete();
|
|
150
|
-
// Verify deletion
|
|
151
|
-
const task = await db('v4_tasks').where({ id: taskId, project_id: 1 }).first();
|
|
152
|
-
assert.strictEqual(task, undefined, 'Task should be deleted');
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
// ============================================================================
|
|
156
|
-
// Foreign Key Constraints
|
|
157
|
-
// ============================================================================
|
|
158
|
-
describe('Foreign Key Constraints', () => {
|
|
159
|
-
it('should enforce FK constraint on status_id', async () => {
|
|
160
|
-
const db = getDb();
|
|
161
|
-
const insertPromise = db('v4_tasks').insert({
|
|
162
|
-
title: 'Invalid status task',
|
|
163
|
-
status_id: 99999, // Non-existent status
|
|
164
|
-
priority: 2,
|
|
165
|
-
project_id: 1,
|
|
166
|
-
layer_id: 1,
|
|
167
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
168
|
-
updated_ts: Math.floor(Date.now() / 1000),
|
|
169
|
-
});
|
|
170
|
-
await assert.rejects(insertPromise, {
|
|
171
|
-
message: /foreign key constraint|violates foreign key|Cannot add or update a child row/i,
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
it('should enforce FK constraint on layer_id', async () => {
|
|
175
|
-
const db = getDb();
|
|
176
|
-
const statusId = await getStatusId(db, 'todo');
|
|
177
|
-
const insertPromise = db('v4_tasks').insert({
|
|
178
|
-
title: 'Invalid layer task',
|
|
179
|
-
status_id: statusId,
|
|
180
|
-
priority: 2,
|
|
181
|
-
project_id: 1,
|
|
182
|
-
layer_id: 99999, // Non-existent layer
|
|
183
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
184
|
-
updated_ts: Math.floor(Date.now() / 1000),
|
|
185
|
-
});
|
|
186
|
-
await assert.rejects(insertPromise, {
|
|
187
|
-
message: /foreign key constraint|violates foreign key|Cannot add or update a child row/i,
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
// ============================================================================
|
|
192
|
-
// Task Status Transitions
|
|
193
|
-
// ============================================================================
|
|
194
|
-
describe('Task Status Transitions', () => {
|
|
195
|
-
it('should transition from todo to in_progress', async () => {
|
|
196
|
-
const db = getDb();
|
|
197
|
-
const taskId = await insertTask(db, { title: 'Move to in_progress' });
|
|
198
|
-
await assertTaskHasStatus(db, taskId, 'todo');
|
|
199
|
-
// Move to in_progress
|
|
200
|
-
const inProgressId = await getStatusId(db, 'in_progress');
|
|
201
|
-
await db('v4_tasks')
|
|
202
|
-
.where({ id: taskId })
|
|
203
|
-
.update({
|
|
204
|
-
status_id: inProgressId,
|
|
205
|
-
updated_ts: Math.floor(Date.now() / 1000),
|
|
206
|
-
});
|
|
207
|
-
await assertTaskHasStatus(db, taskId, 'in_progress');
|
|
208
|
-
});
|
|
209
|
-
it('should transition from in_progress to done', async () => {
|
|
210
|
-
const db = getDb();
|
|
211
|
-
const taskId = await insertTask(db, { title: 'Complete task', status: 'in_progress' });
|
|
212
|
-
await assertTaskHasStatus(db, taskId, 'in_progress');
|
|
213
|
-
// Move to done
|
|
214
|
-
const doneId = await getStatusId(db, 'done');
|
|
215
|
-
const completedTs = Math.floor(Date.now() / 1000);
|
|
216
|
-
await db('v4_tasks')
|
|
217
|
-
.where({ id: taskId })
|
|
218
|
-
.update({
|
|
219
|
-
status_id: doneId,
|
|
220
|
-
completed_ts: completedTs,
|
|
221
|
-
updated_ts: completedTs,
|
|
222
|
-
});
|
|
223
|
-
await assertTaskHasStatus(db, taskId, 'done');
|
|
224
|
-
// Verify completed_ts was set
|
|
225
|
-
const task = await db('v4_tasks').where({ id: taskId }).first();
|
|
226
|
-
assert.ok(task.completed_ts, 'completed_ts should be set');
|
|
227
|
-
});
|
|
228
|
-
it('should transition to blocked status', async () => {
|
|
229
|
-
const db = getDb();
|
|
230
|
-
const taskId = await insertTask(db, { title: 'Blocked task' });
|
|
231
|
-
const blockedId = await getStatusId(db, 'blocked');
|
|
232
|
-
await db('v4_tasks')
|
|
233
|
-
.where({ id: taskId })
|
|
234
|
-
.update({
|
|
235
|
-
status_id: blockedId,
|
|
236
|
-
updated_ts: Math.floor(Date.now() / 1000),
|
|
237
|
-
});
|
|
238
|
-
await assertTaskHasStatus(db, taskId, 'blocked');
|
|
239
|
-
});
|
|
240
|
-
it('should transition to archived status', async () => {
|
|
241
|
-
const db = getDb();
|
|
242
|
-
const taskId = await insertTask(db, { title: 'Archive task' });
|
|
243
|
-
const archivedId = await getStatusId(db, 'archived');
|
|
244
|
-
await db('v4_tasks')
|
|
245
|
-
.where({ id: taskId })
|
|
246
|
-
.update({
|
|
247
|
-
status_id: archivedId,
|
|
248
|
-
updated_ts: Math.floor(Date.now() / 1000),
|
|
249
|
-
});
|
|
250
|
-
await assertTaskHasStatus(db, taskId, 'archived');
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
// ============================================================================
|
|
254
|
-
// Task File Links
|
|
255
|
-
// ============================================================================
|
|
256
|
-
describe('Task File Links', () => {
|
|
257
|
-
it('should insert file links for task', async () => {
|
|
258
|
-
const db = getDb();
|
|
259
|
-
const taskId = await insertTask(db, { title: 'Task with files' });
|
|
260
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
261
|
-
// First, create file records in m_files
|
|
262
|
-
const file1Result = await db('v4_files').insert({ project_id: 1, path: 'src/auth/login.ts' });
|
|
263
|
-
const file2Result = await db('v4_files').insert({ project_id: 1, path: 'src/auth/types.ts' });
|
|
264
|
-
const file3Result = await db('v4_files').insert({ project_id: 1, path: 'src/auth/old.ts' });
|
|
265
|
-
// Get file IDs
|
|
266
|
-
const file1 = await db('v4_files').where({ path: 'src/auth/login.ts', project_id: 1 }).first();
|
|
267
|
-
const file2 = await db('v4_files').where({ path: 'src/auth/types.ts', project_id: 1 }).first();
|
|
268
|
-
const file3 = await db('v4_files').where({ path: 'src/auth/old.ts', project_id: 1 }).first();
|
|
269
|
-
// Insert file links
|
|
270
|
-
await db('v4_task_file_links').insert([
|
|
271
|
-
{ task_id: taskId, file_id: file1.id, project_id: 1, linked_ts: timestamp },
|
|
272
|
-
{ task_id: taskId, file_id: file2.id, project_id: 1, linked_ts: timestamp },
|
|
273
|
-
{ task_id: taskId, file_id: file3.id, project_id: 1, linked_ts: timestamp },
|
|
274
|
-
]);
|
|
275
|
-
// Verify file links
|
|
276
|
-
const fileLinks = await db('v4_task_file_links')
|
|
277
|
-
.join('v4_files', 'v4_task_file_links.file_id', 'v4_files.id')
|
|
278
|
-
.where({ 'v4_task_file_links.task_id': taskId })
|
|
279
|
-
.select('v4_task_file_links.*', 'v4_files.path')
|
|
280
|
-
.orderBy('v4_files.path');
|
|
281
|
-
assert.strictEqual(fileLinks.length, 3);
|
|
282
|
-
assert.strictEqual(fileLinks[0].path, 'src/auth/login.ts');
|
|
283
|
-
assert.strictEqual(fileLinks[1].path, 'src/auth/old.ts');
|
|
284
|
-
assert.strictEqual(fileLinks[2].path, 'src/auth/types.ts');
|
|
285
|
-
});
|
|
286
|
-
it('should enforce unique constraint on task-file combination', async () => {
|
|
287
|
-
const db = getDb();
|
|
288
|
-
const taskId = await insertTask(db, { title: 'Unique file link test' });
|
|
289
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
290
|
-
// Create a file record
|
|
291
|
-
await db('v4_files').insert({ project_id: 1, path: 'src/unique-test.ts' });
|
|
292
|
-
const file = await db('v4_files').where({ path: 'src/unique-test.ts', project_id: 1 }).first();
|
|
293
|
-
await db('v4_task_file_links').insert({
|
|
294
|
-
task_id: taskId,
|
|
295
|
-
file_id: file.id,
|
|
296
|
-
project_id: 1,
|
|
297
|
-
linked_ts: timestamp,
|
|
298
|
-
});
|
|
299
|
-
// Try to insert duplicate
|
|
300
|
-
const duplicatePromise = db('v4_task_file_links').insert({
|
|
301
|
-
task_id: taskId,
|
|
302
|
-
file_id: file.id,
|
|
303
|
-
project_id: 1,
|
|
304
|
-
linked_ts: timestamp,
|
|
305
|
-
});
|
|
306
|
-
await assert.rejects(duplicatePromise, {
|
|
307
|
-
message: /UNIQUE constraint|unique constraint|Duplicate entry/i,
|
|
308
|
-
});
|
|
309
|
-
});
|
|
310
|
-
it('should cascade delete file links when task deleted', async () => {
|
|
311
|
-
const db = getDb();
|
|
312
|
-
const taskId = await insertTask(db, { title: 'Cascade delete file links' });
|
|
313
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
314
|
-
// Create a file record
|
|
315
|
-
await db('v4_files').insert({ project_id: 1, path: 'src/cascade-test.ts' });
|
|
316
|
-
const file = await db('v4_files').where({ path: 'src/cascade-test.ts', project_id: 1 }).first();
|
|
317
|
-
await db('v4_task_file_links').insert({
|
|
318
|
-
task_id: taskId,
|
|
319
|
-
file_id: file.id,
|
|
320
|
-
project_id: 1,
|
|
321
|
-
linked_ts: timestamp,
|
|
322
|
-
});
|
|
323
|
-
// Delete task
|
|
324
|
-
await db('v4_tasks').where({ id: taskId }).delete();
|
|
325
|
-
// Verify file links were cascade deleted
|
|
326
|
-
const fileLinks = await db('v4_task_file_links').where({ task_id: taskId });
|
|
327
|
-
assert.strictEqual(fileLinks.length, 0, 'File links should be cascade deleted');
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
// ============================================================================
|
|
331
|
-
// Task Tags
|
|
332
|
-
// ============================================================================
|
|
333
|
-
describe('Task Tags', () => {
|
|
334
|
-
it('should associate tags with task', async () => {
|
|
335
|
-
const db = getDb();
|
|
336
|
-
const taskId = await insertTask(db, { title: 'Tagged task' });
|
|
337
|
-
// Get tag IDs
|
|
338
|
-
const apiTagId = await getTagId(db, 'api');
|
|
339
|
-
const securityTagId = await getTagId(db, 'security');
|
|
340
|
-
const perfTagId = await getTagId(db, 'performance');
|
|
341
|
-
// Insert tag associations (v4_task_tags requires project_id)
|
|
342
|
-
await db('v4_task_tags').insert([
|
|
343
|
-
{ task_id: taskId, tag_id: apiTagId, project_id: 1 },
|
|
344
|
-
{ task_id: taskId, tag_id: securityTagId, project_id: 1 },
|
|
345
|
-
{ task_id: taskId, tag_id: perfTagId, project_id: 1 },
|
|
346
|
-
]);
|
|
347
|
-
// Verify tags
|
|
348
|
-
const tags = await db('v4_task_tags as tt')
|
|
349
|
-
.join('v4_tags as t', 'tt.tag_id', 't.id')
|
|
350
|
-
.where({ 'tt.task_id': taskId })
|
|
351
|
-
.select('t.name as tag_name');
|
|
352
|
-
assert.strictEqual(tags.length, 3);
|
|
353
|
-
const tagNames = tags.map(t => t.tag_name);
|
|
354
|
-
assert.ok(tagNames.includes('api'));
|
|
355
|
-
assert.ok(tagNames.includes('security'));
|
|
356
|
-
assert.ok(tagNames.includes('performance'));
|
|
357
|
-
});
|
|
358
|
-
it('should cascade delete tags when task deleted', async () => {
|
|
359
|
-
const db = getDb();
|
|
360
|
-
const taskId = await insertTask(db, { title: 'Task with tags for cascade' });
|
|
361
|
-
const tagId = await getTagId(db, 'test');
|
|
362
|
-
await db('v4_task_tags').insert({
|
|
363
|
-
task_id: taskId,
|
|
364
|
-
tag_id: tagId,
|
|
365
|
-
project_id: 1,
|
|
366
|
-
});
|
|
367
|
-
// Delete task
|
|
368
|
-
await db('v4_tasks').where({ id: taskId }).delete();
|
|
369
|
-
// Verify tags were cascade deleted
|
|
370
|
-
const tags = await db('v4_task_tags').where({ task_id: taskId });
|
|
371
|
-
assert.strictEqual(tags.length, 0, 'Tags should be cascade deleted');
|
|
372
|
-
});
|
|
373
|
-
});
|
|
374
|
-
// ============================================================================
|
|
375
|
-
// Task Dependencies
|
|
376
|
-
// ============================================================================
|
|
377
|
-
describe('Task Dependencies', () => {
|
|
378
|
-
it('should add dependency between tasks', async () => {
|
|
379
|
-
const db = getDb();
|
|
380
|
-
const blockerTaskId = await insertTask(db, { title: 'Blocker task' });
|
|
381
|
-
const blockedTaskId = await insertTask(db, { title: 'Blocked task' });
|
|
382
|
-
// Add dependency: blocker blocks blocked
|
|
383
|
-
await db('v4_task_dependencies').insert({
|
|
384
|
-
blocker_task_id: blockerTaskId,
|
|
385
|
-
blocked_task_id: blockedTaskId,
|
|
386
|
-
project_id: 1,
|
|
387
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
388
|
-
});
|
|
389
|
-
// Verify dependency exists
|
|
390
|
-
const dependency = await db('v4_task_dependencies')
|
|
391
|
-
.where({ blocker_task_id: blockerTaskId, blocked_task_id: blockedTaskId })
|
|
392
|
-
.first();
|
|
393
|
-
assert.ok(dependency, 'Dependency should exist');
|
|
394
|
-
});
|
|
395
|
-
it('should prevent self-dependency (circular dependency)', async () => {
|
|
396
|
-
const db = getDb();
|
|
397
|
-
const taskId = await insertTask(db, { title: 'Self-blocking task' });
|
|
398
|
-
// Try to create self-dependency
|
|
399
|
-
const selfDepPromise = db('v4_task_dependencies').insert({
|
|
400
|
-
blocker_task_id: taskId,
|
|
401
|
-
blocked_task_id: taskId, // Same task
|
|
402
|
-
project_id: 1,
|
|
403
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
404
|
-
});
|
|
405
|
-
// Should fail (either via trigger or application-level check)
|
|
406
|
-
// Note: Some databases may allow this at schema level but fail at trigger level
|
|
407
|
-
// For now, we just test if it rejects
|
|
408
|
-
const shouldReject = async () => {
|
|
409
|
-
try {
|
|
410
|
-
await selfDepPromise;
|
|
411
|
-
// If insert succeeds, check if there's a trigger that prevents it
|
|
412
|
-
// This is database-specific behavior
|
|
413
|
-
const dep = await db('v4_task_dependencies')
|
|
414
|
-
.where({ blocker_task_id: taskId, blocked_task_id: taskId })
|
|
415
|
-
.first();
|
|
416
|
-
// If dependency was inserted, we need to check if the application
|
|
417
|
-
// layer prevents this. For now, we'll fail the test if it was inserted.
|
|
418
|
-
if (dep) {
|
|
419
|
-
throw new Error('Self-dependency should not be allowed');
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
catch (error) {
|
|
423
|
-
// Expected: trigger or constraint prevents self-dependency
|
|
424
|
-
if (!error.message.includes('should not be allowed')) {
|
|
425
|
-
// This is expected database error
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
throw error;
|
|
429
|
-
}
|
|
430
|
-
};
|
|
431
|
-
// For databases without trigger, this test will pass
|
|
432
|
-
// For databases with trigger, this will throw expected error
|
|
433
|
-
try {
|
|
434
|
-
await shouldReject();
|
|
435
|
-
}
|
|
436
|
-
catch (error) {
|
|
437
|
-
// Acceptable error messages
|
|
438
|
-
if (error.message.includes('circular') ||
|
|
439
|
-
error.message.includes('self') ||
|
|
440
|
-
error.message.includes('should not be allowed')) {
|
|
441
|
-
// Expected behavior
|
|
442
|
-
return;
|
|
443
|
-
}
|
|
444
|
-
throw error;
|
|
445
|
-
}
|
|
446
|
-
});
|
|
447
|
-
it('should detect transitive circular dependency (A→B→A)', async () => {
|
|
448
|
-
const db = getDb();
|
|
449
|
-
const taskA = await insertTask(db, { title: 'Task A' });
|
|
450
|
-
const taskB = await insertTask(db, { title: 'Task B' });
|
|
451
|
-
// Create A blocks B
|
|
452
|
-
await db('v4_task_dependencies').insert({
|
|
453
|
-
blocker_task_id: taskA,
|
|
454
|
-
blocked_task_id: taskB,
|
|
455
|
-
project_id: 1,
|
|
456
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
457
|
-
});
|
|
458
|
-
// Try to create B blocks A (circular)
|
|
459
|
-
// Note: Detection of transitive circular dependencies requires
|
|
460
|
-
// application-level logic or recursive triggers.
|
|
461
|
-
// The schema may allow this at database level.
|
|
462
|
-
// This test documents expected behavior.
|
|
463
|
-
const circularPromise = db('v4_task_dependencies').insert({
|
|
464
|
-
blocker_task_id: taskB,
|
|
465
|
-
blocked_task_id: taskA,
|
|
466
|
-
project_id: 1,
|
|
467
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
468
|
-
});
|
|
469
|
-
// For now, we expect application-level validation to prevent this
|
|
470
|
-
// If the database allows it, we'll just document it
|
|
471
|
-
try {
|
|
472
|
-
await circularPromise;
|
|
473
|
-
// If it succeeds, verify both dependencies exist
|
|
474
|
-
const deps = await db('v4_task_dependencies')
|
|
475
|
-
.whereIn('blocker_task_id', [taskA, taskB])
|
|
476
|
-
.whereIn('blocked_task_id', [taskA, taskB]);
|
|
477
|
-
// Note: Schema allows this, but application should prevent it
|
|
478
|
-
// This documents the current behavior
|
|
479
|
-
if (deps.length === 2) {
|
|
480
|
-
console.log(` ⚠️ [${dbType}] Database allows circular dependencies A→B→A (application must validate)`);
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
catch (error) {
|
|
484
|
-
// If database prevents it, that's good
|
|
485
|
-
if (error.message.includes('circular') || error.message.includes('cycle')) {
|
|
486
|
-
console.log(` ✅ [${dbType}] Database prevents circular dependencies at schema level`);
|
|
487
|
-
}
|
|
488
|
-
else {
|
|
489
|
-
throw error;
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
});
|
|
493
|
-
it('should remove dependency', async () => {
|
|
494
|
-
const db = getDb();
|
|
495
|
-
const blockerTaskId = await insertTask(db, { title: 'Blocker for removal' });
|
|
496
|
-
const blockedTaskId = await insertTask(db, { title: 'Blocked for removal' });
|
|
497
|
-
await db('v4_task_dependencies').insert({
|
|
498
|
-
blocker_task_id: blockerTaskId,
|
|
499
|
-
blocked_task_id: blockedTaskId,
|
|
500
|
-
project_id: 1,
|
|
501
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
502
|
-
});
|
|
503
|
-
// Remove dependency
|
|
504
|
-
await db('v4_task_dependencies')
|
|
505
|
-
.where({ blocker_task_id: blockerTaskId, blocked_task_id: blockedTaskId })
|
|
506
|
-
.delete();
|
|
507
|
-
// Verify removal
|
|
508
|
-
const dependency = await db('v4_task_dependencies')
|
|
509
|
-
.where({ blocker_task_id: blockerTaskId, blocked_task_id: blockedTaskId })
|
|
510
|
-
.first();
|
|
511
|
-
assert.strictEqual(dependency, undefined, 'Dependency should be removed');
|
|
512
|
-
});
|
|
513
|
-
it('should cascade delete dependencies when task deleted', async () => {
|
|
514
|
-
const db = getDb();
|
|
515
|
-
const blockerTaskId = await insertTask(db, { title: 'Blocker for cascade' });
|
|
516
|
-
const blockedTaskId = await insertTask(db, { title: 'Blocked for cascade' });
|
|
517
|
-
await db('v4_task_dependencies').insert({
|
|
518
|
-
blocker_task_id: blockerTaskId,
|
|
519
|
-
blocked_task_id: blockedTaskId,
|
|
520
|
-
project_id: 1,
|
|
521
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
522
|
-
});
|
|
523
|
-
// Delete blocker task
|
|
524
|
-
await db('v4_tasks').where({ id: blockerTaskId }).delete();
|
|
525
|
-
// Verify dependencies were cascade deleted
|
|
526
|
-
const dependencies = await db('v4_task_dependencies')
|
|
527
|
-
.where({ blocker_task_id: blockerTaskId })
|
|
528
|
-
.orWhere({ blocked_task_id: blockerTaskId });
|
|
529
|
-
assert.strictEqual(dependencies.length, 0, 'Dependencies should be cascade deleted');
|
|
530
|
-
});
|
|
531
|
-
it('should get task blocking relationships', async () => {
|
|
532
|
-
const db = getDb();
|
|
533
|
-
const blockerTaskId = await insertTask(db, { title: 'Blocker' });
|
|
534
|
-
const blocked1Id = await insertTask(db, { title: 'Blocked 1' });
|
|
535
|
-
const blocked2Id = await insertTask(db, { title: 'Blocked 2' });
|
|
536
|
-
// Blocker blocks both blocked tasks
|
|
537
|
-
await db('v4_task_dependencies').insert([
|
|
538
|
-
{
|
|
539
|
-
blocker_task_id: blockerTaskId,
|
|
540
|
-
blocked_task_id: blocked1Id,
|
|
541
|
-
project_id: 1,
|
|
542
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
543
|
-
},
|
|
544
|
-
{
|
|
545
|
-
blocker_task_id: blockerTaskId,
|
|
546
|
-
blocked_task_id: blocked2Id,
|
|
547
|
-
project_id: 1,
|
|
548
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
549
|
-
},
|
|
550
|
-
]);
|
|
551
|
-
// Query what blocker is blocking
|
|
552
|
-
const blocking = await db('v4_task_dependencies')
|
|
553
|
-
.where({ blocker_task_id: blockerTaskId })
|
|
554
|
-
.select('blocked_task_id');
|
|
555
|
-
assert.strictEqual(blocking.length, 2);
|
|
556
|
-
const blockedIds = blocking.map(b => b.blocked_task_id);
|
|
557
|
-
assert.ok(blockedIds.includes(blocked1Id));
|
|
558
|
-
assert.ok(blockedIds.includes(blocked2Id));
|
|
559
|
-
});
|
|
560
|
-
it('should get task blocker relationships', async () => {
|
|
561
|
-
const db = getDb();
|
|
562
|
-
const blockedTaskId = await insertTask(db, { title: 'Blocked' });
|
|
563
|
-
const blocker1Id = await insertTask(db, { title: 'Blocker 1' });
|
|
564
|
-
const blocker2Id = await insertTask(db, { title: 'Blocker 2' });
|
|
565
|
-
// Blocked is blocked by both blockers
|
|
566
|
-
await db('v4_task_dependencies').insert([
|
|
567
|
-
{
|
|
568
|
-
blocker_task_id: blocker1Id,
|
|
569
|
-
blocked_task_id: blockedTaskId,
|
|
570
|
-
project_id: 1,
|
|
571
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
572
|
-
},
|
|
573
|
-
{
|
|
574
|
-
blocker_task_id: blocker2Id,
|
|
575
|
-
blocked_task_id: blockedTaskId,
|
|
576
|
-
project_id: 1,
|
|
577
|
-
created_ts: Math.floor(Date.now() / 1000),
|
|
578
|
-
},
|
|
579
|
-
]);
|
|
580
|
-
// Query what is blocking this task
|
|
581
|
-
const blockers = await db('v4_task_dependencies')
|
|
582
|
-
.where({ blocked_task_id: blockedTaskId })
|
|
583
|
-
.select('blocker_task_id');
|
|
584
|
-
assert.strictEqual(blockers.length, 2);
|
|
585
|
-
const blockerIds = blockers.map(b => b.blocker_task_id);
|
|
586
|
-
assert.ok(blockerIds.includes(blocker1Id));
|
|
587
|
-
assert.ok(blockerIds.includes(blocker2Id));
|
|
588
|
-
});
|
|
589
|
-
});
|
|
590
|
-
// ============================================================================
|
|
591
|
-
// Task-Decision Links
|
|
592
|
-
// ============================================================================
|
|
593
|
-
describe('Task-Decision Links', () => {
|
|
594
|
-
it('should link task to decision', async () => {
|
|
595
|
-
const db = getDb();
|
|
596
|
-
const taskId = await insertTask(db, { title: 'Task implementing decision' });
|
|
597
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
598
|
-
// Create a decision
|
|
599
|
-
const layerId = await getLayerId(db, 'business');
|
|
600
|
-
// v4_context_keys has no project_id column
|
|
601
|
-
await db('v4_context_keys').insert({
|
|
602
|
-
key_name: 'test/link-decision',
|
|
603
|
-
});
|
|
604
|
-
const contextKey = await db('v4_context_keys')
|
|
605
|
-
.where({ key_name: 'test/link-decision' })
|
|
606
|
-
.first();
|
|
607
|
-
await db('v4_decisions').insert({
|
|
608
|
-
key_id: contextKey.id,
|
|
609
|
-
project_id: 1,
|
|
610
|
-
value: 'test value',
|
|
611
|
-
version: '1.0.0',
|
|
612
|
-
ts: timestamp,
|
|
613
|
-
layer_id: layerId,
|
|
614
|
-
status: 1, // 1=active (integer enum, not string)
|
|
615
|
-
});
|
|
616
|
-
// Link task to decision (using decision_key_id, not decision_id)
|
|
617
|
-
await db('v4_task_decision_links').insert({
|
|
618
|
-
task_id: taskId,
|
|
619
|
-
decision_key_id: contextKey.id,
|
|
620
|
-
project_id: 1,
|
|
621
|
-
link_type: 'implements',
|
|
622
|
-
linked_ts: timestamp,
|
|
623
|
-
});
|
|
624
|
-
// Verify link
|
|
625
|
-
const link = await db('v4_task_decision_links')
|
|
626
|
-
.where({ task_id: taskId, decision_key_id: contextKey.id })
|
|
627
|
-
.first();
|
|
628
|
-
assert.ok(link, 'Link should exist');
|
|
629
|
-
assert.strictEqual(link.link_type, 'implements');
|
|
630
|
-
});
|
|
631
|
-
it('should cascade delete task-decision links when task deleted', async () => {
|
|
632
|
-
const db = getDb();
|
|
633
|
-
const taskId = await insertTask(db, { title: 'Task for cascade link delete' });
|
|
634
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
635
|
-
// Create decision and link (simplified)
|
|
636
|
-
const layerId = await getLayerId(db, 'business');
|
|
637
|
-
// m_context_keys has no project_id column
|
|
638
|
-
await db('v4_context_keys').insert({ key_name: 'test/cascade-link' });
|
|
639
|
-
const contextKey = await db('v4_context_keys')
|
|
640
|
-
.where({ key_name: 'test/cascade-link' })
|
|
641
|
-
.first();
|
|
642
|
-
await db('v4_decisions').insert({
|
|
643
|
-
key_id: contextKey.id,
|
|
644
|
-
project_id: 1,
|
|
645
|
-
value: 'test',
|
|
646
|
-
version: '1.0.0',
|
|
647
|
-
ts: timestamp,
|
|
648
|
-
layer_id: layerId,
|
|
649
|
-
status: 1, // 1=active (integer enum)
|
|
650
|
-
});
|
|
651
|
-
await db('v4_task_decision_links').insert({
|
|
652
|
-
task_id: taskId,
|
|
653
|
-
decision_key_id: contextKey.id,
|
|
654
|
-
project_id: 1,
|
|
655
|
-
link_type: 'implements',
|
|
656
|
-
linked_ts: timestamp,
|
|
657
|
-
});
|
|
658
|
-
// Delete task
|
|
659
|
-
await db('v4_tasks').where({ id: taskId }).delete();
|
|
660
|
-
// Verify links were cascade deleted
|
|
661
|
-
const links = await db('v4_task_decision_links').where({ task_id: taskId });
|
|
662
|
-
assert.strictEqual(links.length, 0, 'Task-decision links should be cascade deleted');
|
|
663
|
-
});
|
|
664
|
-
});
|
|
665
|
-
// ============================================================================
|
|
666
|
-
// Task-Constraint Links
|
|
667
|
-
// ============================================================================
|
|
668
|
-
describe('Task-Constraint Links', () => {
|
|
669
|
-
it('should link task to constraint', async () => {
|
|
670
|
-
const db = getDb();
|
|
671
|
-
const taskId = await insertTask(db, { title: 'Task with constraint' });
|
|
672
|
-
// Create a constraint
|
|
673
|
-
const layerId = await getLayerId(db, 'business');
|
|
674
|
-
// Get constraint category
|
|
675
|
-
const category = await db('v4_constraint_categories')
|
|
676
|
-
.where({ name: 'architecture' })
|
|
677
|
-
.first();
|
|
678
|
-
const constraintText = 'Test constraint for linking';
|
|
679
|
-
await db('v4_constraints').insert({
|
|
680
|
-
constraint_text: constraintText,
|
|
681
|
-
// Note: v4 schema does not have constraint_text_hash column
|
|
682
|
-
category_id: category.id,
|
|
683
|
-
priority: 2,
|
|
684
|
-
project_id: 1,
|
|
685
|
-
layer_id: layerId,
|
|
686
|
-
ts: Math.floor(Date.now() / 1000),
|
|
687
|
-
active: 1,
|
|
688
|
-
});
|
|
689
|
-
const constraint = await db('v4_constraints')
|
|
690
|
-
.where({ constraint_text: constraintText, project_id: 1 })
|
|
691
|
-
.first();
|
|
692
|
-
// Link task to constraint
|
|
693
|
-
await db('v4_task_constraint_links').insert({
|
|
694
|
-
task_id: taskId,
|
|
695
|
-
constraint_id: constraint.id,
|
|
696
|
-
});
|
|
697
|
-
// Verify link
|
|
698
|
-
const link = await db('v4_task_constraint_links')
|
|
699
|
-
.where({ task_id: taskId, constraint_id: constraint.id })
|
|
700
|
-
.first();
|
|
701
|
-
assert.ok(link, 'Constraint link should exist');
|
|
702
|
-
});
|
|
703
|
-
it('should cascade delete task-constraint links when task deleted', async () => {
|
|
704
|
-
const db = getDb();
|
|
705
|
-
const taskId = await insertTask(db, { title: 'Task for constraint cascade' });
|
|
706
|
-
// Create constraint and link (simplified)
|
|
707
|
-
const layerId = await getLayerId(db, 'business');
|
|
708
|
-
const category = await db('v4_constraint_categories')
|
|
709
|
-
.where({ name: 'architecture' })
|
|
710
|
-
.first();
|
|
711
|
-
const constraintText = 'Cascade test constraint';
|
|
712
|
-
await db('v4_constraints').insert({
|
|
713
|
-
constraint_text: constraintText,
|
|
714
|
-
// Note: v4 schema does not have constraint_text_hash column
|
|
715
|
-
category_id: category.id,
|
|
716
|
-
priority: 2,
|
|
717
|
-
project_id: 1,
|
|
718
|
-
layer_id: layerId,
|
|
719
|
-
ts: Math.floor(Date.now() / 1000),
|
|
720
|
-
active: 1,
|
|
721
|
-
});
|
|
722
|
-
const constraint = await db('v4_constraints')
|
|
723
|
-
.where({ constraint_text: constraintText, project_id: 1 })
|
|
724
|
-
.first();
|
|
725
|
-
await db('v4_task_constraint_links').insert({
|
|
726
|
-
task_id: taskId,
|
|
727
|
-
constraint_id: constraint.id,
|
|
728
|
-
});
|
|
729
|
-
// Delete task
|
|
730
|
-
await db('v4_tasks').where({ id: taskId }).delete();
|
|
731
|
-
// Verify links were cascade deleted
|
|
732
|
-
const links = await db('v4_task_constraint_links').where({ task_id: taskId });
|
|
733
|
-
assert.strictEqual(links.length, 0, 'Task-constraint links should be cascade deleted');
|
|
734
|
-
});
|
|
735
|
-
});
|
|
736
|
-
// ============================================================================
|
|
737
|
-
// Cross-Database Compatibility Tests
|
|
738
|
-
// ============================================================================
|
|
739
|
-
describe(`Cross-database compatibility - ${dbType}`, () => {
|
|
740
|
-
it('should handle long task titles', async () => {
|
|
741
|
-
const db = getDb();
|
|
742
|
-
const longTitle = 'A'.repeat(200);
|
|
743
|
-
const taskId = await insertTask(db, {
|
|
744
|
-
title: longTitle,
|
|
745
|
-
priority: 2,
|
|
746
|
-
});
|
|
747
|
-
const task = await db('v4_tasks').where({ id: taskId, project_id: 1 }).first();
|
|
748
|
-
assert.strictEqual(task.title, longTitle);
|
|
749
|
-
});
|
|
750
|
-
it('should handle special characters in descriptions', async () => {
|
|
751
|
-
const db = getDb();
|
|
752
|
-
const specialDesc = "Description with 'quotes', \"double quotes\", and \\backslashes";
|
|
753
|
-
const taskId = await insertTask(db, {
|
|
754
|
-
title: 'Special chars test',
|
|
755
|
-
description: specialDesc,
|
|
756
|
-
});
|
|
757
|
-
const details = await db('v4_task_details').where({ task_id: taskId }).first();
|
|
758
|
-
assert.strictEqual(details.description, specialDesc);
|
|
759
|
-
});
|
|
760
|
-
it('should handle unicode in task fields', async () => {
|
|
761
|
-
const db = getDb();
|
|
762
|
-
const unicodeTitle = 'タスク 任务 작업 🚀';
|
|
763
|
-
const taskId = await insertTask(db, {
|
|
764
|
-
title: unicodeTitle,
|
|
765
|
-
});
|
|
766
|
-
const task = await db('v4_tasks').where({ id: taskId, project_id: 1 }).first();
|
|
767
|
-
assert.strictEqual(task.title, unicodeTitle);
|
|
768
|
-
});
|
|
769
|
-
it('should handle NULL optional fields', async () => {
|
|
770
|
-
const db = getDb();
|
|
771
|
-
const statusId = await getStatusId(db, 'todo');
|
|
772
|
-
const layerId = await getLayerId(db, 'business');
|
|
773
|
-
// Insert with NULL optional fields (completed_ts is nullable)
|
|
774
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
775
|
-
const result = await db('v4_tasks').insert({
|
|
776
|
-
title: 'Task with NULL completed_ts',
|
|
777
|
-
status_id: statusId,
|
|
778
|
-
priority: 2,
|
|
779
|
-
project_id: 1,
|
|
780
|
-
layer_id: layerId,
|
|
781
|
-
completed_ts: null, // NULL is allowed
|
|
782
|
-
created_ts: timestamp,
|
|
783
|
-
updated_ts: timestamp,
|
|
784
|
-
});
|
|
785
|
-
let taskId;
|
|
786
|
-
if (Array.isArray(result) && result.length > 0) {
|
|
787
|
-
taskId = result[0];
|
|
788
|
-
}
|
|
789
|
-
else {
|
|
790
|
-
const task = await db('v4_tasks')
|
|
791
|
-
.where({ title: 'Task with NULL completed_ts', project_id: 1 })
|
|
792
|
-
.first();
|
|
793
|
-
taskId = task.id;
|
|
794
|
-
}
|
|
795
|
-
const task = await db('v4_tasks').where({ id: taskId, project_id: 1 }).first();
|
|
796
|
-
assert.strictEqual(task.completed_ts, null);
|
|
797
|
-
});
|
|
798
|
-
});
|
|
799
|
-
});
|
|
800
|
-
//# sourceMappingURL=task-operations.test.js.map
|