@dotsetlabs/bellwether 0.10.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 +291 -0
- package/LICENSE +21 -0
- package/README.md +739 -0
- package/dist/auth/credentials.d.ts +64 -0
- package/dist/auth/credentials.js +218 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +6 -0
- package/dist/auth/keychain.d.ts +64 -0
- package/dist/auth/keychain.js +268 -0
- package/dist/baseline/ab-testing.d.ts +80 -0
- package/dist/baseline/ab-testing.js +236 -0
- package/dist/baseline/ai-compatibility-scorer.d.ts +95 -0
- package/dist/baseline/ai-compatibility-scorer.js +606 -0
- package/dist/baseline/calibration.d.ts +77 -0
- package/dist/baseline/calibration.js +136 -0
- package/dist/baseline/category-matching.d.ts +85 -0
- package/dist/baseline/category-matching.js +289 -0
- package/dist/baseline/change-impact-analyzer.d.ts +98 -0
- package/dist/baseline/change-impact-analyzer.js +592 -0
- package/dist/baseline/comparator.d.ts +64 -0
- package/dist/baseline/comparator.js +916 -0
- package/dist/baseline/confidence.d.ts +55 -0
- package/dist/baseline/confidence.js +122 -0
- package/dist/baseline/converter.d.ts +61 -0
- package/dist/baseline/converter.js +585 -0
- package/dist/baseline/dependency-analyzer.d.ts +89 -0
- package/dist/baseline/dependency-analyzer.js +567 -0
- package/dist/baseline/deprecation-tracker.d.ts +133 -0
- package/dist/baseline/deprecation-tracker.js +322 -0
- package/dist/baseline/diff.d.ts +55 -0
- package/dist/baseline/diff.js +1584 -0
- package/dist/baseline/documentation-scorer.d.ts +205 -0
- package/dist/baseline/documentation-scorer.js +466 -0
- package/dist/baseline/embeddings.d.ts +118 -0
- package/dist/baseline/embeddings.js +251 -0
- package/dist/baseline/error-analyzer.d.ts +198 -0
- package/dist/baseline/error-analyzer.js +721 -0
- package/dist/baseline/evaluation/evaluator.d.ts +42 -0
- package/dist/baseline/evaluation/evaluator.js +323 -0
- package/dist/baseline/evaluation/expanded-dataset.d.ts +45 -0
- package/dist/baseline/evaluation/expanded-dataset.js +1164 -0
- package/dist/baseline/evaluation/golden-dataset.d.ts +58 -0
- package/dist/baseline/evaluation/golden-dataset.js +717 -0
- package/dist/baseline/evaluation/index.d.ts +15 -0
- package/dist/baseline/evaluation/index.js +15 -0
- package/dist/baseline/evaluation/types.d.ts +186 -0
- package/dist/baseline/evaluation/types.js +8 -0
- package/dist/baseline/external-dependency-detector.d.ts +181 -0
- package/dist/baseline/external-dependency-detector.js +524 -0
- package/dist/baseline/golden-output.d.ts +162 -0
- package/dist/baseline/golden-output.js +636 -0
- package/dist/baseline/health-scorer.d.ts +174 -0
- package/dist/baseline/health-scorer.js +451 -0
- package/dist/baseline/incremental-checker.d.ts +97 -0
- package/dist/baseline/incremental-checker.js +174 -0
- package/dist/baseline/index.d.ts +31 -0
- package/dist/baseline/index.js +42 -0
- package/dist/baseline/migration-generator.d.ts +137 -0
- package/dist/baseline/migration-generator.js +554 -0
- package/dist/baseline/migrations.d.ts +60 -0
- package/dist/baseline/migrations.js +197 -0
- package/dist/baseline/performance-tracker.d.ts +214 -0
- package/dist/baseline/performance-tracker.js +577 -0
- package/dist/baseline/pr-comment-generator.d.ts +117 -0
- package/dist/baseline/pr-comment-generator.js +546 -0
- package/dist/baseline/response-fingerprint.d.ts +127 -0
- package/dist/baseline/response-fingerprint.js +728 -0
- package/dist/baseline/response-schema-tracker.d.ts +129 -0
- package/dist/baseline/response-schema-tracker.js +420 -0
- package/dist/baseline/risk-scorer.d.ts +54 -0
- package/dist/baseline/risk-scorer.js +434 -0
- package/dist/baseline/saver.d.ts +89 -0
- package/dist/baseline/saver.js +554 -0
- package/dist/baseline/scenario-generator.d.ts +151 -0
- package/dist/baseline/scenario-generator.js +905 -0
- package/dist/baseline/schema-compare.d.ts +86 -0
- package/dist/baseline/schema-compare.js +557 -0
- package/dist/baseline/schema-evolution.d.ts +189 -0
- package/dist/baseline/schema-evolution.js +467 -0
- package/dist/baseline/semantic.d.ts +203 -0
- package/dist/baseline/semantic.js +908 -0
- package/dist/baseline/synonyms.d.ts +60 -0
- package/dist/baseline/synonyms.js +386 -0
- package/dist/baseline/telemetry.d.ts +165 -0
- package/dist/baseline/telemetry.js +294 -0
- package/dist/baseline/test-pruner.d.ts +120 -0
- package/dist/baseline/test-pruner.js +387 -0
- package/dist/baseline/types.d.ts +449 -0
- package/dist/baseline/types.js +5 -0
- package/dist/baseline/version.d.ts +138 -0
- package/dist/baseline/version.js +206 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/response-cache.d.ts +151 -0
- package/dist/cache/response-cache.js +287 -0
- package/dist/ci/index.d.ts +60 -0
- package/dist/ci/index.js +342 -0
- package/dist/cli/commands/auth.d.ts +12 -0
- package/dist/cli/commands/auth.js +352 -0
- package/dist/cli/commands/badge.d.ts +3 -0
- package/dist/cli/commands/badge.js +74 -0
- package/dist/cli/commands/baseline-accept.d.ts +15 -0
- package/dist/cli/commands/baseline-accept.js +178 -0
- package/dist/cli/commands/baseline-migrate.d.ts +12 -0
- package/dist/cli/commands/baseline-migrate.js +164 -0
- package/dist/cli/commands/baseline.d.ts +14 -0
- package/dist/cli/commands/baseline.js +449 -0
- package/dist/cli/commands/beta.d.ts +10 -0
- package/dist/cli/commands/beta.js +231 -0
- package/dist/cli/commands/check.d.ts +11 -0
- package/dist/cli/commands/check.js +820 -0
- package/dist/cli/commands/cloud/badge.d.ts +3 -0
- package/dist/cli/commands/cloud/badge.js +74 -0
- package/dist/cli/commands/cloud/diff.d.ts +6 -0
- package/dist/cli/commands/cloud/diff.js +79 -0
- package/dist/cli/commands/cloud/history.d.ts +6 -0
- package/dist/cli/commands/cloud/history.js +102 -0
- package/dist/cli/commands/cloud/link.d.ts +9 -0
- package/dist/cli/commands/cloud/link.js +119 -0
- package/dist/cli/commands/cloud/login.d.ts +7 -0
- package/dist/cli/commands/cloud/login.js +499 -0
- package/dist/cli/commands/cloud/projects.d.ts +6 -0
- package/dist/cli/commands/cloud/projects.js +44 -0
- package/dist/cli/commands/cloud/shared.d.ts +7 -0
- package/dist/cli/commands/cloud/shared.js +42 -0
- package/dist/cli/commands/cloud/teams.d.ts +8 -0
- package/dist/cli/commands/cloud/teams.js +169 -0
- package/dist/cli/commands/cloud/upload.d.ts +8 -0
- package/dist/cli/commands/cloud/upload.js +181 -0
- package/dist/cli/commands/contract.d.ts +11 -0
- package/dist/cli/commands/contract.js +280 -0
- package/dist/cli/commands/discover.d.ts +3 -0
- package/dist/cli/commands/discover.js +82 -0
- package/dist/cli/commands/eval.d.ts +9 -0
- package/dist/cli/commands/eval.js +187 -0
- package/dist/cli/commands/explore.d.ts +11 -0
- package/dist/cli/commands/explore.js +437 -0
- package/dist/cli/commands/feedback.d.ts +9 -0
- package/dist/cli/commands/feedback.js +174 -0
- package/dist/cli/commands/golden.d.ts +12 -0
- package/dist/cli/commands/golden.js +407 -0
- package/dist/cli/commands/history.d.ts +10 -0
- package/dist/cli/commands/history.js +202 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.js +219 -0
- package/dist/cli/commands/interview.d.ts +3 -0
- package/dist/cli/commands/interview.js +903 -0
- package/dist/cli/commands/link.d.ts +10 -0
- package/dist/cli/commands/link.js +169 -0
- package/dist/cli/commands/login.d.ts +7 -0
- package/dist/cli/commands/login.js +499 -0
- package/dist/cli/commands/preset.d.ts +33 -0
- package/dist/cli/commands/preset.js +297 -0
- package/dist/cli/commands/profile.d.ts +33 -0
- package/dist/cli/commands/profile.js +286 -0
- package/dist/cli/commands/registry.d.ts +11 -0
- package/dist/cli/commands/registry.js +146 -0
- package/dist/cli/commands/shared.d.ts +79 -0
- package/dist/cli/commands/shared.js +196 -0
- package/dist/cli/commands/teams.d.ts +8 -0
- package/dist/cli/commands/teams.js +169 -0
- package/dist/cli/commands/test.d.ts +9 -0
- package/dist/cli/commands/test.js +500 -0
- package/dist/cli/commands/upload.d.ts +8 -0
- package/dist/cli/commands/upload.js +223 -0
- package/dist/cli/commands/validate-config.d.ts +6 -0
- package/dist/cli/commands/validate-config.js +35 -0
- package/dist/cli/commands/verify.d.ts +11 -0
- package/dist/cli/commands/verify.js +283 -0
- package/dist/cli/commands/watch.d.ts +12 -0
- package/dist/cli/commands/watch.js +253 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +178 -0
- package/dist/cli/interactive.d.ts +47 -0
- package/dist/cli/interactive.js +216 -0
- package/dist/cli/output/terminal-reporter.d.ts +19 -0
- package/dist/cli/output/terminal-reporter.js +104 -0
- package/dist/cli/output.d.ts +226 -0
- package/dist/cli/output.js +438 -0
- package/dist/cli/utils/env.d.ts +5 -0
- package/dist/cli/utils/env.js +14 -0
- package/dist/cli/utils/progress.d.ts +59 -0
- package/dist/cli/utils/progress.js +206 -0
- package/dist/cli/utils/server-context.d.ts +10 -0
- package/dist/cli/utils/server-context.js +36 -0
- package/dist/cloud/auth.d.ts +144 -0
- package/dist/cloud/auth.js +374 -0
- package/dist/cloud/client.d.ts +24 -0
- package/dist/cloud/client.js +65 -0
- package/dist/cloud/http-client.d.ts +38 -0
- package/dist/cloud/http-client.js +215 -0
- package/dist/cloud/index.d.ts +23 -0
- package/dist/cloud/index.js +25 -0
- package/dist/cloud/mock-client.d.ts +107 -0
- package/dist/cloud/mock-client.js +545 -0
- package/dist/cloud/types.d.ts +515 -0
- package/dist/cloud/types.js +15 -0
- package/dist/config/defaults.d.ts +160 -0
- package/dist/config/defaults.js +169 -0
- package/dist/config/loader.d.ts +24 -0
- package/dist/config/loader.js +122 -0
- package/dist/config/template.d.ts +42 -0
- package/dist/config/template.js +647 -0
- package/dist/config/validator.d.ts +2112 -0
- package/dist/config/validator.js +658 -0
- package/dist/constants/cloud.d.ts +107 -0
- package/dist/constants/cloud.js +110 -0
- package/dist/constants/core.d.ts +521 -0
- package/dist/constants/core.js +556 -0
- package/dist/constants/testing.d.ts +1283 -0
- package/dist/constants/testing.js +1568 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.js +10 -0
- package/dist/contract/index.d.ts +6 -0
- package/dist/contract/index.js +5 -0
- package/dist/contract/validator.d.ts +177 -0
- package/dist/contract/validator.js +574 -0
- package/dist/cost/index.d.ts +6 -0
- package/dist/cost/index.js +5 -0
- package/dist/cost/tracker.d.ts +134 -0
- package/dist/cost/tracker.js +313 -0
- package/dist/discovery/discovery.d.ts +16 -0
- package/dist/discovery/discovery.js +173 -0
- package/dist/discovery/types.d.ts +51 -0
- package/dist/discovery/types.js +2 -0
- package/dist/docs/agents.d.ts +3 -0
- package/dist/docs/agents.js +995 -0
- package/dist/docs/contract.d.ts +51 -0
- package/dist/docs/contract.js +1681 -0
- package/dist/docs/generator.d.ts +4 -0
- package/dist/docs/generator.js +4 -0
- package/dist/docs/html-reporter.d.ts +9 -0
- package/dist/docs/html-reporter.js +757 -0
- package/dist/docs/index.d.ts +10 -0
- package/dist/docs/index.js +11 -0
- package/dist/docs/junit-reporter.d.ts +18 -0
- package/dist/docs/junit-reporter.js +210 -0
- package/dist/docs/report.d.ts +14 -0
- package/dist/docs/report.js +44 -0
- package/dist/docs/sarif-reporter.d.ts +19 -0
- package/dist/docs/sarif-reporter.js +335 -0
- package/dist/docs/shared.d.ts +35 -0
- package/dist/docs/shared.js +162 -0
- package/dist/docs/templates.d.ts +12 -0
- package/dist/docs/templates.js +76 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.js +6 -0
- package/dist/errors/retry.d.ts +92 -0
- package/dist/errors/retry.js +323 -0
- package/dist/errors/types.d.ts +321 -0
- package/dist/errors/types.js +584 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +32 -0
- package/dist/interview/dependency-resolver.d.ts +11 -0
- package/dist/interview/dependency-resolver.js +32 -0
- package/dist/interview/interviewer.d.ts +232 -0
- package/dist/interview/interviewer.js +1939 -0
- package/dist/interview/mock-response-generator.d.ts +7 -0
- package/dist/interview/mock-response-generator.js +102 -0
- package/dist/interview/orchestrator.d.ts +237 -0
- package/dist/interview/orchestrator.js +1296 -0
- package/dist/interview/rate-limiter.d.ts +15 -0
- package/dist/interview/rate-limiter.js +55 -0
- package/dist/interview/response-validator.d.ts +10 -0
- package/dist/interview/response-validator.js +132 -0
- package/dist/interview/schema-inferrer.d.ts +8 -0
- package/dist/interview/schema-inferrer.js +71 -0
- package/dist/interview/schema-test-generator.d.ts +71 -0
- package/dist/interview/schema-test-generator.js +834 -0
- package/dist/interview/smart-value-generator.d.ts +155 -0
- package/dist/interview/smart-value-generator.js +554 -0
- package/dist/interview/stateful-test-runner.d.ts +19 -0
- package/dist/interview/stateful-test-runner.js +106 -0
- package/dist/interview/types.d.ts +561 -0
- package/dist/interview/types.js +2 -0
- package/dist/llm/anthropic.d.ts +41 -0
- package/dist/llm/anthropic.js +355 -0
- package/dist/llm/client.d.ts +123 -0
- package/dist/llm/client.js +42 -0
- package/dist/llm/factory.d.ts +38 -0
- package/dist/llm/factory.js +145 -0
- package/dist/llm/fallback.d.ts +140 -0
- package/dist/llm/fallback.js +379 -0
- package/dist/llm/index.d.ts +18 -0
- package/dist/llm/index.js +15 -0
- package/dist/llm/ollama.d.ts +37 -0
- package/dist/llm/ollama.js +330 -0
- package/dist/llm/openai.d.ts +25 -0
- package/dist/llm/openai.js +320 -0
- package/dist/llm/token-budget.d.ts +161 -0
- package/dist/llm/token-budget.js +395 -0
- package/dist/logging/logger.d.ts +70 -0
- package/dist/logging/logger.js +130 -0
- package/dist/metrics/collector.d.ts +106 -0
- package/dist/metrics/collector.js +547 -0
- package/dist/metrics/index.d.ts +7 -0
- package/dist/metrics/index.js +7 -0
- package/dist/metrics/prometheus.d.ts +20 -0
- package/dist/metrics/prometheus.js +241 -0
- package/dist/metrics/types.d.ts +209 -0
- package/dist/metrics/types.js +5 -0
- package/dist/persona/builtins.d.ts +54 -0
- package/dist/persona/builtins.js +219 -0
- package/dist/persona/index.d.ts +8 -0
- package/dist/persona/index.js +8 -0
- package/dist/persona/loader.d.ts +30 -0
- package/dist/persona/loader.js +190 -0
- package/dist/persona/types.d.ts +144 -0
- package/dist/persona/types.js +5 -0
- package/dist/persona/validation.d.ts +94 -0
- package/dist/persona/validation.js +332 -0
- package/dist/prompts/index.d.ts +5 -0
- package/dist/prompts/index.js +5 -0
- package/dist/prompts/templates.d.ts +180 -0
- package/dist/prompts/templates.js +431 -0
- package/dist/registry/client.d.ts +49 -0
- package/dist/registry/client.js +191 -0
- package/dist/registry/index.d.ts +7 -0
- package/dist/registry/index.js +6 -0
- package/dist/registry/types.d.ts +140 -0
- package/dist/registry/types.js +6 -0
- package/dist/scenarios/evaluator.d.ts +43 -0
- package/dist/scenarios/evaluator.js +206 -0
- package/dist/scenarios/index.d.ts +10 -0
- package/dist/scenarios/index.js +9 -0
- package/dist/scenarios/loader.d.ts +20 -0
- package/dist/scenarios/loader.js +285 -0
- package/dist/scenarios/types.d.ts +153 -0
- package/dist/scenarios/types.js +8 -0
- package/dist/security/index.d.ts +17 -0
- package/dist/security/index.js +18 -0
- package/dist/security/payloads.d.ts +61 -0
- package/dist/security/payloads.js +268 -0
- package/dist/security/security-tester.d.ts +42 -0
- package/dist/security/security-tester.js +582 -0
- package/dist/security/types.d.ts +166 -0
- package/dist/security/types.js +8 -0
- package/dist/transport/base-transport.d.ts +59 -0
- package/dist/transport/base-transport.js +38 -0
- package/dist/transport/http-transport.d.ts +67 -0
- package/dist/transport/http-transport.js +238 -0
- package/dist/transport/mcp-client.d.ts +141 -0
- package/dist/transport/mcp-client.js +496 -0
- package/dist/transport/sse-transport.d.ts +88 -0
- package/dist/transport/sse-transport.js +316 -0
- package/dist/transport/stdio-transport.d.ts +43 -0
- package/dist/transport/stdio-transport.js +238 -0
- package/dist/transport/types.d.ts +125 -0
- package/dist/transport/types.js +16 -0
- package/dist/utils/concurrency.d.ts +123 -0
- package/dist/utils/concurrency.js +213 -0
- package/dist/utils/formatters.d.ts +16 -0
- package/dist/utils/formatters.js +37 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/jsonpath.d.ts +87 -0
- package/dist/utils/jsonpath.js +326 -0
- package/dist/utils/markdown.d.ts +113 -0
- package/dist/utils/markdown.js +265 -0
- package/dist/utils/network.d.ts +14 -0
- package/dist/utils/network.js +17 -0
- package/dist/utils/sanitize.d.ts +92 -0
- package/dist/utils/sanitize.js +191 -0
- package/dist/utils/semantic.d.ts +194 -0
- package/dist/utils/semantic.js +1051 -0
- package/dist/utils/smart-truncate.d.ts +94 -0
- package/dist/utils/smart-truncate.js +361 -0
- package/dist/utils/timeout.d.ts +153 -0
- package/dist/utils/timeout.js +205 -0
- package/dist/utils/yaml-parser.d.ts +58 -0
- package/dist/utils/yaml-parser.js +86 -0
- package/dist/validation/index.d.ts +32 -0
- package/dist/validation/index.js +32 -0
- package/dist/validation/semantic-test-generator.d.ts +50 -0
- package/dist/validation/semantic-test-generator.js +176 -0
- package/dist/validation/semantic-types.d.ts +66 -0
- package/dist/validation/semantic-types.js +94 -0
- package/dist/validation/semantic-validator.d.ts +38 -0
- package/dist/validation/semantic-validator.js +340 -0
- package/dist/verification/index.d.ts +6 -0
- package/dist/verification/index.js +5 -0
- package/dist/verification/types.d.ts +133 -0
- package/dist/verification/types.js +5 -0
- package/dist/verification/verifier.d.ts +30 -0
- package/dist/verification/verifier.js +309 -0
- package/dist/version.d.ts +19 -0
- package/dist/version.js +48 -0
- package/dist/workflow/auto-generator.d.ts +27 -0
- package/dist/workflow/auto-generator.js +513 -0
- package/dist/workflow/discovery.d.ts +40 -0
- package/dist/workflow/discovery.js +195 -0
- package/dist/workflow/executor.d.ts +82 -0
- package/dist/workflow/executor.js +611 -0
- package/dist/workflow/index.d.ts +10 -0
- package/dist/workflow/index.js +10 -0
- package/dist/workflow/loader.d.ts +24 -0
- package/dist/workflow/loader.js +194 -0
- package/dist/workflow/state-tracker.d.ts +98 -0
- package/dist/workflow/state-tracker.js +424 -0
- package/dist/workflow/types.d.ts +337 -0
- package/dist/workflow/types.js +5 -0
- package/package.json +94 -0
- package/schemas/bellwether-check.schema.json +651 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline format migrations.
|
|
3
|
+
*
|
|
4
|
+
* This module handles upgrading baselines from older CLI versions to the current version.
|
|
5
|
+
* Migrations are triggered when the CLI major version changes.
|
|
6
|
+
*
|
|
7
|
+
* Migration Strategy:
|
|
8
|
+
* - Migrations are keyed by their TARGET major version
|
|
9
|
+
* - Each migration upgrades from the previous major version
|
|
10
|
+
* - Migrations are applied sequentially in version order
|
|
11
|
+
* - Downgrading is not supported
|
|
12
|
+
*/
|
|
13
|
+
import { VERSION } from '../version.js';
|
|
14
|
+
import { parseVersion, compareVersions } from './version.js';
|
|
15
|
+
/**
|
|
16
|
+
* Registry of migrations keyed by target major version.
|
|
17
|
+
*
|
|
18
|
+
* When adding a new migration for CLI v2.0.0:
|
|
19
|
+
* 1. Add an entry with '2' as the key (major version)
|
|
20
|
+
* 2. Implement the migration function to transform from v1.x to v2.x format
|
|
21
|
+
*
|
|
22
|
+
* Example for future migration from v1.x to v2.0.0:
|
|
23
|
+
*
|
|
24
|
+
* '2': (baseline) => {
|
|
25
|
+
* return {
|
|
26
|
+
* ...baseline,
|
|
27
|
+
* version: '2.0.0',
|
|
28
|
+
* // Add new required fields with defaults
|
|
29
|
+
* newField: baseline.newField ?? 'default',
|
|
30
|
+
* // Transform renamed fields
|
|
31
|
+
* renamedField: baseline.oldFieldName,
|
|
32
|
+
* // Remove deprecated fields (just don't include them)
|
|
33
|
+
* };
|
|
34
|
+
* },
|
|
35
|
+
*/
|
|
36
|
+
const MIGRATIONS = {
|
|
37
|
+
// Migration from legacy format version "1.0.0" to CLI version format
|
|
38
|
+
// This handles baselines created before the versioning simplification
|
|
39
|
+
'0': (baseline) => {
|
|
40
|
+
const version = baseline.version;
|
|
41
|
+
// If version looks like old format version (1.0.0), convert to CLI version
|
|
42
|
+
if (version === '1.0.0' || version === '1.0' || version === 1) {
|
|
43
|
+
return {
|
|
44
|
+
...baseline,
|
|
45
|
+
version: VERSION, // Use current CLI version
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return baseline;
|
|
49
|
+
},
|
|
50
|
+
// Future migrations would be added here when CLI major version changes:
|
|
51
|
+
// '1': (baseline) => { ... }, // Migrates v0.x baselines to v1.x format
|
|
52
|
+
// '2': (baseline) => { ... }, // Migrates v1.x baselines to v2.x format
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Get the current CLI major version.
|
|
56
|
+
*/
|
|
57
|
+
function getCurrentMajorVersion() {
|
|
58
|
+
return parseVersion(VERSION).major;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if a version is the legacy format version (before CLI version was used).
|
|
62
|
+
* Legacy format versions were "1.0.0", "1.0", or numeric 1.
|
|
63
|
+
* These need special handling because they're not CLI versions.
|
|
64
|
+
*/
|
|
65
|
+
function isLegacyFormatVersion(version) {
|
|
66
|
+
return version === '1.0.0' || version === '1.0' || version === 1;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if a baseline can be migrated to the current CLI version.
|
|
70
|
+
*
|
|
71
|
+
* Migration is possible if:
|
|
72
|
+
* - Source version has a different major version than current
|
|
73
|
+
* - A migration path exists
|
|
74
|
+
*
|
|
75
|
+
* @param fromVersion - Source version (string, number, or undefined)
|
|
76
|
+
* @returns true if migration is possible
|
|
77
|
+
*/
|
|
78
|
+
export function canMigrate(fromVersion) {
|
|
79
|
+
const from = parseVersion(fromVersion);
|
|
80
|
+
const currentMajor = getCurrentMajorVersion();
|
|
81
|
+
// Same major version - no migration needed
|
|
82
|
+
if (from.major === currentMajor) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
// Check if we have a migration for the current major version
|
|
86
|
+
return MIGRATIONS[String(currentMajor)] !== undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the list of migrations that would be applied.
|
|
90
|
+
*
|
|
91
|
+
* @param fromVersion - Source version
|
|
92
|
+
* @returns Array of major version strings for migrations that would be applied
|
|
93
|
+
*/
|
|
94
|
+
export function getMigrationsToApply(fromVersion) {
|
|
95
|
+
const currentMajor = getCurrentMajorVersion();
|
|
96
|
+
// Legacy format version needs the '0' migration
|
|
97
|
+
if (isLegacyFormatVersion(fromVersion)) {
|
|
98
|
+
return MIGRATIONS['0'] ? ['0'] : [];
|
|
99
|
+
}
|
|
100
|
+
const from = parseVersion(fromVersion);
|
|
101
|
+
// Same major version - no migrations needed
|
|
102
|
+
if (from.major === currentMajor) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
// Return migrations from source major to current major
|
|
106
|
+
const toApply = [];
|
|
107
|
+
for (let major = from.major; major <= currentMajor; major++) {
|
|
108
|
+
if (MIGRATIONS[String(major)]) {
|
|
109
|
+
toApply.push(String(major));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return toApply;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Migrate a baseline to the current CLI version format.
|
|
116
|
+
*
|
|
117
|
+
* @param baseline - The baseline object to migrate (can be any version)
|
|
118
|
+
* @returns Migrated baseline conforming to BehavioralBaseline interface
|
|
119
|
+
* @throws Error if migration is not possible (e.g., downgrade attempt)
|
|
120
|
+
*/
|
|
121
|
+
export function migrateBaseline(baseline) {
|
|
122
|
+
const sourceVersion = baseline.version;
|
|
123
|
+
const current = parseVersion(VERSION);
|
|
124
|
+
// Handle legacy format version specially (not a real CLI version)
|
|
125
|
+
if (isLegacyFormatVersion(sourceVersion)) {
|
|
126
|
+
let migrated = { ...baseline };
|
|
127
|
+
const migration = MIGRATIONS['0'];
|
|
128
|
+
if (migration) {
|
|
129
|
+
migrated = migration(migrated);
|
|
130
|
+
}
|
|
131
|
+
migrated.version = VERSION;
|
|
132
|
+
return migrated;
|
|
133
|
+
}
|
|
134
|
+
const from = parseVersion(sourceVersion);
|
|
135
|
+
// Already at current version
|
|
136
|
+
if (compareVersions(from, current) === 0) {
|
|
137
|
+
return baseline;
|
|
138
|
+
}
|
|
139
|
+
// Same major version - just update the version string
|
|
140
|
+
if (from.major === current.major) {
|
|
141
|
+
return {
|
|
142
|
+
...baseline,
|
|
143
|
+
version: VERSION,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// Cannot downgrade (only applies to actual CLI versions, not legacy format)
|
|
147
|
+
if (from.major > current.major) {
|
|
148
|
+
throw new Error(`Cannot downgrade baseline from v${from.raw} to v${current.raw}. ` +
|
|
149
|
+
`Downgrading baselines is not supported.`);
|
|
150
|
+
}
|
|
151
|
+
// Apply migrations
|
|
152
|
+
let migrated = { ...baseline };
|
|
153
|
+
const migrationsToApply = getMigrationsToApply(sourceVersion);
|
|
154
|
+
for (const majorVersion of migrationsToApply) {
|
|
155
|
+
const migration = MIGRATIONS[majorVersion];
|
|
156
|
+
if (migration) {
|
|
157
|
+
migrated = migration(migrated);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Ensure version is set to current CLI version
|
|
161
|
+
migrated.version = VERSION;
|
|
162
|
+
return migrated;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Check if a baseline needs migration.
|
|
166
|
+
*
|
|
167
|
+
* @param baseline - The baseline to check
|
|
168
|
+
* @returns true if the baseline major version differs from current CLI major version
|
|
169
|
+
*/
|
|
170
|
+
export function needsMigration(baseline) {
|
|
171
|
+
const version = baseline.version;
|
|
172
|
+
const from = parseVersion(version);
|
|
173
|
+
const currentMajor = getCurrentMajorVersion();
|
|
174
|
+
// Check for legacy format version (1.0.0) which needs migration to CLI version
|
|
175
|
+
if (version === '1.0.0' || version === '1.0' || version === 1) {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
return from.major !== currentMajor;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get information about what migrations would be applied.
|
|
182
|
+
*
|
|
183
|
+
* @param baseline - The baseline to analyze
|
|
184
|
+
* @returns Object with migration details
|
|
185
|
+
*/
|
|
186
|
+
export function getMigrationInfo(baseline) {
|
|
187
|
+
const version = baseline.version;
|
|
188
|
+
const from = parseVersion(version);
|
|
189
|
+
return {
|
|
190
|
+
currentVersion: from.raw,
|
|
191
|
+
targetVersion: VERSION,
|
|
192
|
+
needsMigration: needsMigration(baseline),
|
|
193
|
+
migrationsToApply: getMigrationsToApply(version),
|
|
194
|
+
canMigrate: canMigrate(version),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Regression Detection
|
|
3
|
+
*
|
|
4
|
+
* Tracks response times across tool executions and detects performance regressions.
|
|
5
|
+
* Provides percentile-based metrics (p50, p95, p99) for comprehensive latency analysis.
|
|
6
|
+
*/
|
|
7
|
+
import type { BehavioralBaseline, ChangeSeverity, PerformanceConfidence } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Latency trend direction.
|
|
10
|
+
*/
|
|
11
|
+
export type LatencyTrend = 'improving' | 'stable' | 'degrading';
|
|
12
|
+
/**
|
|
13
|
+
* Performance metrics for a single tool.
|
|
14
|
+
*/
|
|
15
|
+
export interface ToolPerformanceMetrics {
|
|
16
|
+
/** Tool name */
|
|
17
|
+
toolName: string;
|
|
18
|
+
/** 50th percentile latency in milliseconds */
|
|
19
|
+
p50Ms: number;
|
|
20
|
+
/** 95th percentile latency in milliseconds */
|
|
21
|
+
p95Ms: number;
|
|
22
|
+
/** 99th percentile latency in milliseconds */
|
|
23
|
+
p99Ms: number;
|
|
24
|
+
/** Success rate (0-1) */
|
|
25
|
+
successRate: number;
|
|
26
|
+
/** Total number of executions */
|
|
27
|
+
sampleCount: number;
|
|
28
|
+
/** Average latency in milliseconds */
|
|
29
|
+
avgMs: number;
|
|
30
|
+
/** Minimum latency in milliseconds */
|
|
31
|
+
minMs: number;
|
|
32
|
+
/** Maximum latency in milliseconds */
|
|
33
|
+
maxMs: number;
|
|
34
|
+
/** Standard deviation of latency */
|
|
35
|
+
stdDevMs: number;
|
|
36
|
+
/** Timestamp of when metrics were collected */
|
|
37
|
+
collectedAt: Date;
|
|
38
|
+
/** Statistical confidence metrics */
|
|
39
|
+
confidence?: PerformanceConfidence;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Performance baseline for a tool (stored in baseline file).
|
|
43
|
+
*/
|
|
44
|
+
export interface PerformanceBaseline {
|
|
45
|
+
/** Tool name */
|
|
46
|
+
toolName: string;
|
|
47
|
+
/** Baseline 50th percentile latency */
|
|
48
|
+
baselineP50: number;
|
|
49
|
+
/** Baseline 95th percentile latency */
|
|
50
|
+
baselineP95: number;
|
|
51
|
+
/** Baseline 99th percentile latency */
|
|
52
|
+
baselineP99: number;
|
|
53
|
+
/** Baseline success rate */
|
|
54
|
+
baselineSuccessRate: number;
|
|
55
|
+
/** Maximum allowed regression percentage (default from config) */
|
|
56
|
+
maxAllowedRegression: number;
|
|
57
|
+
/** When the baseline was established */
|
|
58
|
+
establishedAt: Date;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Performance comparison result for a single tool.
|
|
62
|
+
*/
|
|
63
|
+
export interface PerformanceComparison {
|
|
64
|
+
/** Tool name */
|
|
65
|
+
toolName: string;
|
|
66
|
+
/** Current metrics */
|
|
67
|
+
current: ToolPerformanceMetrics;
|
|
68
|
+
/** Baseline metrics (if available) */
|
|
69
|
+
baseline?: PerformanceBaseline;
|
|
70
|
+
/** Latency trend */
|
|
71
|
+
trend: LatencyTrend;
|
|
72
|
+
/** Regression percentage for p50 (positive = slower, negative = faster) */
|
|
73
|
+
p50RegressionPercent: number | null;
|
|
74
|
+
/** Regression percentage for p95 */
|
|
75
|
+
p95RegressionPercent: number | null;
|
|
76
|
+
/** Regression percentage for p99 */
|
|
77
|
+
p99RegressionPercent: number | null;
|
|
78
|
+
/** Whether this tool has regressed beyond threshold */
|
|
79
|
+
hasRegression: boolean;
|
|
80
|
+
/** Severity of the regression */
|
|
81
|
+
severity: ChangeSeverity;
|
|
82
|
+
/** Human-readable summary */
|
|
83
|
+
summary: string;
|
|
84
|
+
/** Current confidence level */
|
|
85
|
+
confidence?: PerformanceConfidence;
|
|
86
|
+
/** Whether the regression is statistically reliable (based on confidence) */
|
|
87
|
+
isReliable: boolean;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Overall performance report for a baseline comparison.
|
|
91
|
+
*/
|
|
92
|
+
export interface PerformanceReport {
|
|
93
|
+
/** Individual tool comparisons */
|
|
94
|
+
toolComparisons: PerformanceComparison[];
|
|
95
|
+
/** Number of tools with performance regressions */
|
|
96
|
+
regressionCount: number;
|
|
97
|
+
/** Number of tools with improved performance */
|
|
98
|
+
improvementCount: number;
|
|
99
|
+
/** Number of tools with stable performance */
|
|
100
|
+
stableCount: number;
|
|
101
|
+
/** Overall performance trend */
|
|
102
|
+
overallTrend: LatencyTrend;
|
|
103
|
+
/** Overall severity */
|
|
104
|
+
overallSeverity: ChangeSeverity;
|
|
105
|
+
/** Human-readable summary */
|
|
106
|
+
summary: string;
|
|
107
|
+
/** Number of tools with low confidence */
|
|
108
|
+
lowConfidenceCount: number;
|
|
109
|
+
/** Tools with low confidence (names) */
|
|
110
|
+
lowConfidenceTools: string[];
|
|
111
|
+
/** Number of reliable regressions (regressions with good confidence) */
|
|
112
|
+
reliableRegressionCount: number;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Raw latency sample for calculating metrics.
|
|
116
|
+
*/
|
|
117
|
+
export interface LatencySample {
|
|
118
|
+
toolName: string;
|
|
119
|
+
durationMs: number;
|
|
120
|
+
success: boolean;
|
|
121
|
+
timestamp: Date;
|
|
122
|
+
/**
|
|
123
|
+
* Expected outcome of this test.
|
|
124
|
+
* - 'success': Happy path test, expects tool to succeed
|
|
125
|
+
* - 'error': Validation test, expects tool to reject/fail
|
|
126
|
+
* - 'either': Edge case, either outcome is acceptable
|
|
127
|
+
*/
|
|
128
|
+
expectedOutcome?: 'success' | 'error' | 'either';
|
|
129
|
+
/**
|
|
130
|
+
* Whether the outcome was correct based on expectations.
|
|
131
|
+
* True if: (expected success && got success) OR (expected error && got error)
|
|
132
|
+
*/
|
|
133
|
+
outcomeCorrect?: boolean;
|
|
134
|
+
}
|
|
135
|
+
export { PERFORMANCE_TRACKING as PERFORMANCE } from '../constants.js';
|
|
136
|
+
/**
|
|
137
|
+
* Calculate statistical confidence for performance metrics.
|
|
138
|
+
*
|
|
139
|
+
* Confidence is determined by:
|
|
140
|
+
* 1. Sample count - more samples = higher confidence
|
|
141
|
+
* 2. Coefficient of variation (CV) - lower variability = higher confidence
|
|
142
|
+
*
|
|
143
|
+
* Key insight: For confidence calculation, we only count happy_path tests that
|
|
144
|
+
* expect success. Validation tests (expectedOutcome: 'error') are tracked
|
|
145
|
+
* separately because their failure doesn't indicate tool problems.
|
|
146
|
+
*
|
|
147
|
+
* Note: The first sample is excluded from variance calculation because it includes
|
|
148
|
+
* cold-start overhead (JIT compilation, connection establishment, cache warming).
|
|
149
|
+
* This gives more accurate confidence scores for steady-state performance.
|
|
150
|
+
*
|
|
151
|
+
* @param samples - The latency samples to analyze
|
|
152
|
+
* @param options - Optional configuration
|
|
153
|
+
* @returns Performance confidence metrics
|
|
154
|
+
*/
|
|
155
|
+
export declare function calculatePerformanceConfidence(samples: LatencySample[], options?: {
|
|
156
|
+
excludeWarmup?: boolean;
|
|
157
|
+
}): PerformanceConfidence;
|
|
158
|
+
/**
|
|
159
|
+
* Calculate performance confidence from ToolPerformanceMetrics.
|
|
160
|
+
* Use this when you already have calculated metrics but need confidence.
|
|
161
|
+
*
|
|
162
|
+
* Note: This function assumes the metrics are from happy path tests only.
|
|
163
|
+
* For full validation/success separation, use calculatePerformanceConfidence with raw samples.
|
|
164
|
+
*/
|
|
165
|
+
export declare function calculateConfidenceFromMetrics(metrics: ToolPerformanceMetrics, options?: {
|
|
166
|
+
validationSamples?: number;
|
|
167
|
+
totalTests?: number;
|
|
168
|
+
}): PerformanceConfidence;
|
|
169
|
+
/**
|
|
170
|
+
* Format confidence level for display.
|
|
171
|
+
*/
|
|
172
|
+
export declare function formatConfidenceLevel(confidence: PerformanceConfidence, includeIndicator?: boolean): string;
|
|
173
|
+
/**
|
|
174
|
+
* Check if performance data has sufficient confidence for reliable comparisons.
|
|
175
|
+
*/
|
|
176
|
+
export declare function hasReliableConfidence(confidence: PerformanceConfidence): boolean;
|
|
177
|
+
/**
|
|
178
|
+
* Calculate performance metrics from raw latency samples.
|
|
179
|
+
*/
|
|
180
|
+
export declare function calculateMetrics(samples: LatencySample[]): ToolPerformanceMetrics | null;
|
|
181
|
+
/**
|
|
182
|
+
* Create a performance baseline from metrics.
|
|
183
|
+
*/
|
|
184
|
+
export declare function createPerformanceBaseline(metrics: ToolPerformanceMetrics, maxAllowedRegression?: number): PerformanceBaseline;
|
|
185
|
+
/**
|
|
186
|
+
* Extract performance baselines from a behavioral baseline.
|
|
187
|
+
* Uses the performance metrics stored in tool fingerprints.
|
|
188
|
+
*/
|
|
189
|
+
export declare function extractPerformanceBaselines(baseline: BehavioralBaseline, regressionThreshold?: number): Map<string, PerformanceBaseline>;
|
|
190
|
+
/**
|
|
191
|
+
* Compare current metrics against baseline.
|
|
192
|
+
*/
|
|
193
|
+
export declare function comparePerformance(current: ToolPerformanceMetrics, baseline: PerformanceBaseline | undefined, regressionThreshold?: number): PerformanceComparison;
|
|
194
|
+
/**
|
|
195
|
+
* Generate a complete performance report comparing current and baseline.
|
|
196
|
+
*/
|
|
197
|
+
export declare function generatePerformanceReport(currentMetrics: Map<string, ToolPerformanceMetrics>, baselines: Map<string, PerformanceBaseline>, regressionThreshold?: number): PerformanceReport;
|
|
198
|
+
/**
|
|
199
|
+
* Format performance metrics for display.
|
|
200
|
+
*/
|
|
201
|
+
export declare function formatMetrics(metrics: ToolPerformanceMetrics): string;
|
|
202
|
+
/**
|
|
203
|
+
* Format performance comparison for display.
|
|
204
|
+
*/
|
|
205
|
+
export declare function formatComparison(comparison: PerformanceComparison): string;
|
|
206
|
+
/**
|
|
207
|
+
* Check if metrics indicate acceptable performance.
|
|
208
|
+
*/
|
|
209
|
+
export declare function isPerformanceAcceptable(comparison: PerformanceComparison, failOnRegression?: boolean): boolean;
|
|
210
|
+
/**
|
|
211
|
+
* Aggregate multiple samples into metrics grouped by tool.
|
|
212
|
+
*/
|
|
213
|
+
export declare function aggregateSamplesByTool(samples: LatencySample[]): Map<string, ToolPerformanceMetrics>;
|
|
214
|
+
//# sourceMappingURL=performance-tracker.d.ts.map
|