@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,434 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression Risk Scorer.
|
|
3
|
+
*
|
|
4
|
+
* Calculates weighted risk scores for detected changes to help prioritize fixes.
|
|
5
|
+
* Considers multiple factors: breaking changes, tool importance, error rates,
|
|
6
|
+
* performance regressions, and security posture.
|
|
7
|
+
*/
|
|
8
|
+
import { REGRESSION_RISK } from '../constants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Calculate regression risk score from a behavioral diff.
|
|
11
|
+
*/
|
|
12
|
+
export function calculateRiskScore(diff) {
|
|
13
|
+
const factors = [];
|
|
14
|
+
// Factor 1: Breaking Change Severity
|
|
15
|
+
const breakingFactor = scoreBreakingChanges(diff);
|
|
16
|
+
factors.push(breakingFactor);
|
|
17
|
+
// Factor 2: Affected Tool Importance
|
|
18
|
+
const importanceFactor = scoreToolImportance(diff);
|
|
19
|
+
factors.push(importanceFactor);
|
|
20
|
+
// Factor 3: Error Rate Delta
|
|
21
|
+
const errorFactor = scoreErrorDelta(diff);
|
|
22
|
+
factors.push(errorFactor);
|
|
23
|
+
// Factor 4: Performance Regression
|
|
24
|
+
const performanceFactor = scorePerformanceRegression(diff);
|
|
25
|
+
factors.push(performanceFactor);
|
|
26
|
+
// Factor 5: Security Posture
|
|
27
|
+
const securityFactor = scoreSecurityChange(diff);
|
|
28
|
+
factors.push(securityFactor);
|
|
29
|
+
// Calculate overall score
|
|
30
|
+
const overallScore = Math.round(factors.reduce((sum, f) => sum + f.weightedScore, 0));
|
|
31
|
+
// Determine risk level
|
|
32
|
+
const level = getRiskLevel(overallScore);
|
|
33
|
+
// Generate recommendation
|
|
34
|
+
const recommendation = generateRecommendation(overallScore, factors, diff);
|
|
35
|
+
// Build change summary
|
|
36
|
+
const changeSummary = {
|
|
37
|
+
breaking: diff.breakingCount,
|
|
38
|
+
warning: diff.warningCount,
|
|
39
|
+
info: diff.infoCount,
|
|
40
|
+
toolsRemoved: diff.toolsRemoved.length,
|
|
41
|
+
toolsAdded: diff.toolsAdded.length,
|
|
42
|
+
toolsModified: diff.toolsModified.length,
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
score: overallScore,
|
|
46
|
+
level,
|
|
47
|
+
factors,
|
|
48
|
+
recommendation,
|
|
49
|
+
changeSummary,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Score breaking changes based on type and count.
|
|
54
|
+
*/
|
|
55
|
+
function scoreBreakingChanges(diff) {
|
|
56
|
+
const weight = REGRESSION_RISK.WEIGHTS.breakingChangeSeverity;
|
|
57
|
+
let score = 0;
|
|
58
|
+
const details = [];
|
|
59
|
+
// Score removed tools (most severe)
|
|
60
|
+
if (diff.toolsRemoved.length > 0) {
|
|
61
|
+
score = Math.max(score, REGRESSION_RISK.BREAKING_SCORES.toolRemoved);
|
|
62
|
+
details.push(`${diff.toolsRemoved.length} tool(s) removed`);
|
|
63
|
+
}
|
|
64
|
+
// Score breaking behavior changes
|
|
65
|
+
for (const change of diff.behaviorChanges) {
|
|
66
|
+
if (change.severity === 'breaking') {
|
|
67
|
+
const changeScore = getChangeScore(change);
|
|
68
|
+
score = Math.max(score, changeScore);
|
|
69
|
+
details.push(`${change.aspect}: ${change.description.slice(0, 50)}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Compound score based on count
|
|
73
|
+
if (diff.breakingCount > 1) {
|
|
74
|
+
score = Math.min(100, score + (diff.breakingCount - 1) * 10);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
name: 'Breaking Changes',
|
|
78
|
+
weight,
|
|
79
|
+
score,
|
|
80
|
+
weightedScore: score * weight,
|
|
81
|
+
details: details.length > 0 ? details.join('; ') : 'No breaking changes',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get score for a specific change type.
|
|
86
|
+
*/
|
|
87
|
+
function getChangeScore(change) {
|
|
88
|
+
const description = change.description.toLowerCase();
|
|
89
|
+
if (description.includes('removed') && description.includes('required')) {
|
|
90
|
+
return REGRESSION_RISK.BREAKING_SCORES.requiredParamRemoved;
|
|
91
|
+
}
|
|
92
|
+
if (description.includes('type') && description.includes('changed')) {
|
|
93
|
+
return REGRESSION_RISK.BREAKING_SCORES.typeChanged;
|
|
94
|
+
}
|
|
95
|
+
if (description.includes('enum') && description.includes('removed')) {
|
|
96
|
+
return REGRESSION_RISK.BREAKING_SCORES.enumValueRemoved;
|
|
97
|
+
}
|
|
98
|
+
if (description.includes('constraint') && description.includes('tightened')) {
|
|
99
|
+
return REGRESSION_RISK.BREAKING_SCORES.constraintTightened;
|
|
100
|
+
}
|
|
101
|
+
if (description.includes('required') && description.includes('added')) {
|
|
102
|
+
return REGRESSION_RISK.BREAKING_SCORES.requiredParamAdded;
|
|
103
|
+
}
|
|
104
|
+
// Default score for unrecognized breaking changes
|
|
105
|
+
return 50;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Score based on importance of affected tools.
|
|
109
|
+
*/
|
|
110
|
+
function scoreToolImportance(diff) {
|
|
111
|
+
const weight = REGRESSION_RISK.WEIGHTS.toolImportance;
|
|
112
|
+
let score = 0;
|
|
113
|
+
const details = [];
|
|
114
|
+
// Analyze affected tools
|
|
115
|
+
const affectedTools = [
|
|
116
|
+
...diff.toolsRemoved,
|
|
117
|
+
...diff.toolsModified.map(t => t.tool),
|
|
118
|
+
];
|
|
119
|
+
let highImportanceCount = 0;
|
|
120
|
+
let lowImportanceCount = 0;
|
|
121
|
+
for (const toolDiff of diff.toolsModified) {
|
|
122
|
+
const description = toolDiff.previous?.description || toolDiff.current?.description || '';
|
|
123
|
+
// Check for high importance indicators
|
|
124
|
+
const isHighImportance = REGRESSION_RISK.IMPORTANCE_PATTERNS.highFrequency.some(pattern => pattern.test(description));
|
|
125
|
+
// Check for low importance indicators
|
|
126
|
+
const isLowImportance = REGRESSION_RISK.IMPORTANCE_PATTERNS.lowFrequency.some(pattern => pattern.test(description));
|
|
127
|
+
if (isHighImportance) {
|
|
128
|
+
highImportanceCount++;
|
|
129
|
+
}
|
|
130
|
+
else if (isLowImportance) {
|
|
131
|
+
lowImportanceCount++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Calculate score based on importance distribution
|
|
135
|
+
const totalAffected = affectedTools.length;
|
|
136
|
+
if (totalAffected > 0) {
|
|
137
|
+
const importanceRatio = highImportanceCount / totalAffected;
|
|
138
|
+
score = Math.round(importanceRatio * 100);
|
|
139
|
+
if (highImportanceCount > 0) {
|
|
140
|
+
details.push(`${highImportanceCount} high-importance tool(s) affected`);
|
|
141
|
+
}
|
|
142
|
+
if (lowImportanceCount > 0 && lowImportanceCount === totalAffected) {
|
|
143
|
+
score = Math.max(0, score - 20);
|
|
144
|
+
details.push('Only low-importance tools affected');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Minimum score if there are any breaking changes in any tools
|
|
148
|
+
if (diff.breakingCount > 0 && score < 30) {
|
|
149
|
+
score = 30;
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
name: 'Tool Importance',
|
|
153
|
+
weight,
|
|
154
|
+
score,
|
|
155
|
+
weightedScore: score * weight,
|
|
156
|
+
details: details.length > 0 ? details.join('; ') : 'No high-importance tools affected',
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Score based on error rate changes.
|
|
161
|
+
*/
|
|
162
|
+
function scoreErrorDelta(diff) {
|
|
163
|
+
const weight = REGRESSION_RISK.WEIGHTS.errorRateDelta;
|
|
164
|
+
let score = 0;
|
|
165
|
+
const details = [];
|
|
166
|
+
// Check error trend report if available
|
|
167
|
+
if (diff.errorTrendReport) {
|
|
168
|
+
const report = diff.errorTrendReport;
|
|
169
|
+
// Score based on new error categories
|
|
170
|
+
if (report.newCategories.length > 0) {
|
|
171
|
+
score = Math.max(score, 70);
|
|
172
|
+
details.push(`${report.newCategories.length} new error category(s)`);
|
|
173
|
+
}
|
|
174
|
+
// Score based on increasing error rates
|
|
175
|
+
for (const trend of report.trends) {
|
|
176
|
+
if (trend.trend === 'increasing') {
|
|
177
|
+
if (trend.changePercent >= REGRESSION_RISK.ERROR_RATE.CRITICAL_INCREASE) {
|
|
178
|
+
score = Math.max(score, 90);
|
|
179
|
+
details.push(`${trend.category}: +${Math.round(trend.changePercent)}%`);
|
|
180
|
+
}
|
|
181
|
+
else if (trend.changePercent >= REGRESSION_RISK.ERROR_RATE.SIGNIFICANT_INCREASE) {
|
|
182
|
+
score = Math.max(score, 60);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Fallback to behavior changes for error patterns
|
|
188
|
+
const errorChanges = diff.behaviorChanges.filter(c => c.aspect === 'error_pattern');
|
|
189
|
+
if (errorChanges.length > 0 && score === 0) {
|
|
190
|
+
score = REGRESSION_RISK.ERROR_RATE.BASE_SCORE;
|
|
191
|
+
details.push(`${errorChanges.length} error pattern change(s)`);
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
name: 'Error Rate',
|
|
195
|
+
weight,
|
|
196
|
+
score,
|
|
197
|
+
weightedScore: score * weight,
|
|
198
|
+
details: details.length > 0 ? details.join('; ') : 'No error rate changes',
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Score based on performance regressions.
|
|
203
|
+
*/
|
|
204
|
+
function scorePerformanceRegression(diff) {
|
|
205
|
+
const weight = REGRESSION_RISK.WEIGHTS.performanceRegression;
|
|
206
|
+
let score = 0;
|
|
207
|
+
const details = [];
|
|
208
|
+
if (!diff.performanceReport) {
|
|
209
|
+
return {
|
|
210
|
+
name: 'Performance',
|
|
211
|
+
weight,
|
|
212
|
+
score: 0,
|
|
213
|
+
weightedScore: 0,
|
|
214
|
+
details: 'No performance data available',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const report = diff.performanceReport;
|
|
218
|
+
if (!report.hasRegressions) {
|
|
219
|
+
if (report.improvementCount > 0) {
|
|
220
|
+
details.push(`${report.improvementCount} tool(s) improved`);
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
name: 'Performance',
|
|
224
|
+
weight,
|
|
225
|
+
score: 0,
|
|
226
|
+
weightedScore: 0,
|
|
227
|
+
details: details.length > 0 ? details.join('; ') : 'No performance regressions',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// Score each regression
|
|
231
|
+
for (const regression of report.regressions) {
|
|
232
|
+
if (!regression.exceedsThreshold)
|
|
233
|
+
continue;
|
|
234
|
+
const percent = regression.regressionPercent;
|
|
235
|
+
let regressionScore;
|
|
236
|
+
if (percent >= REGRESSION_RISK.PERFORMANCE.CRITICAL_REGRESSION) {
|
|
237
|
+
regressionScore = REGRESSION_RISK.PERFORMANCE.SCORES.critical;
|
|
238
|
+
details.push(`${regression.toolName}: +${Math.round(percent)}% (critical)`);
|
|
239
|
+
}
|
|
240
|
+
else if (percent >= REGRESSION_RISK.PERFORMANCE.MAJOR_REGRESSION) {
|
|
241
|
+
regressionScore = REGRESSION_RISK.PERFORMANCE.SCORES.major;
|
|
242
|
+
details.push(`${regression.toolName}: +${Math.round(percent)}% (major)`);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
regressionScore = REGRESSION_RISK.PERFORMANCE.SCORES.minor;
|
|
246
|
+
}
|
|
247
|
+
score = Math.max(score, regressionScore);
|
|
248
|
+
}
|
|
249
|
+
// Compound for multiple regressions
|
|
250
|
+
if (report.regressionCount > 1) {
|
|
251
|
+
score = Math.min(100, score + (report.regressionCount - 1) * 5);
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
name: 'Performance',
|
|
255
|
+
weight,
|
|
256
|
+
score,
|
|
257
|
+
weightedScore: score * weight,
|
|
258
|
+
details: details.length > 0 ? details.join('; ') : `${report.regressionCount} regression(s)`,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Score based on security posture changes.
|
|
263
|
+
*/
|
|
264
|
+
function scoreSecurityChange(diff) {
|
|
265
|
+
const weight = REGRESSION_RISK.WEIGHTS.securityPosture;
|
|
266
|
+
let score = 0;
|
|
267
|
+
const details = [];
|
|
268
|
+
if (!diff.securityReport) {
|
|
269
|
+
return {
|
|
270
|
+
name: 'Security',
|
|
271
|
+
weight,
|
|
272
|
+
score: 0,
|
|
273
|
+
weightedScore: 0,
|
|
274
|
+
details: 'No security testing data',
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
const report = diff.securityReport;
|
|
278
|
+
// Score new vulnerabilities
|
|
279
|
+
if (report.newFindings && report.newFindings.length > 0) {
|
|
280
|
+
const criticalCount = report.newFindings.filter(f => f.riskLevel === 'critical').length;
|
|
281
|
+
const highCount = report.newFindings.filter(f => f.riskLevel === 'high').length;
|
|
282
|
+
if (criticalCount > 0) {
|
|
283
|
+
score = REGRESSION_RISK.SECURITY.NEW_VULNERABILITY;
|
|
284
|
+
details.push(`${criticalCount} new critical vulnerability(ies)`);
|
|
285
|
+
}
|
|
286
|
+
else if (highCount > 0) {
|
|
287
|
+
score = Math.max(score, 80);
|
|
288
|
+
details.push(`${highCount} new high severity finding(s)`);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
score = Math.max(score, 50);
|
|
292
|
+
details.push(`${report.newFindings.length} new security finding(s)`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Credit resolved vulnerabilities
|
|
296
|
+
if (report.resolvedFindings && report.resolvedFindings.length > 0) {
|
|
297
|
+
score = Math.max(0, score + REGRESSION_RISK.SECURITY.RESOLVED_VULNERABILITY);
|
|
298
|
+
details.push(`${report.resolvedFindings.length} resolved`);
|
|
299
|
+
}
|
|
300
|
+
// Score severity increases
|
|
301
|
+
if (report.riskScoreChange && report.riskScoreChange > 0) {
|
|
302
|
+
score = Math.max(score, REGRESSION_RISK.SECURITY.SEVERITY_INCREASE);
|
|
303
|
+
details.push('Overall security risk score increased');
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
name: 'Security',
|
|
307
|
+
weight,
|
|
308
|
+
score: Math.max(0, score),
|
|
309
|
+
weightedScore: Math.max(0, score) * weight,
|
|
310
|
+
details: details.length > 0 ? details.join('; ') : 'No security changes',
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get risk level from score.
|
|
315
|
+
*/
|
|
316
|
+
function getRiskLevel(score) {
|
|
317
|
+
if (score >= REGRESSION_RISK.LEVEL_THRESHOLDS.critical)
|
|
318
|
+
return 'critical';
|
|
319
|
+
if (score >= REGRESSION_RISK.LEVEL_THRESHOLDS.high)
|
|
320
|
+
return 'high';
|
|
321
|
+
if (score >= REGRESSION_RISK.LEVEL_THRESHOLDS.medium)
|
|
322
|
+
return 'medium';
|
|
323
|
+
if (score >= REGRESSION_RISK.LEVEL_THRESHOLDS.low)
|
|
324
|
+
return 'low';
|
|
325
|
+
return 'info';
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Generate recommendation based on risk analysis.
|
|
329
|
+
*/
|
|
330
|
+
function generateRecommendation(score, factors, diff) {
|
|
331
|
+
const level = getRiskLevel(score);
|
|
332
|
+
// Find highest contributing factor
|
|
333
|
+
const sortedFactors = [...factors].sort((a, b) => b.weightedScore - a.weightedScore);
|
|
334
|
+
const topFactor = sortedFactors[0];
|
|
335
|
+
switch (level) {
|
|
336
|
+
case 'critical':
|
|
337
|
+
if (diff.toolsRemoved.length > 0) {
|
|
338
|
+
return 'CRITICAL: Tools were removed. Ensure consumers are migrated before releasing.';
|
|
339
|
+
}
|
|
340
|
+
if (topFactor.name === 'Security') {
|
|
341
|
+
return 'CRITICAL: Security vulnerabilities introduced. Address before any deployment.';
|
|
342
|
+
}
|
|
343
|
+
return 'CRITICAL: Major breaking changes detected. Requires thorough review and migration plan.';
|
|
344
|
+
case 'high':
|
|
345
|
+
if (topFactor.name === 'Performance') {
|
|
346
|
+
return 'HIGH RISK: Significant performance regressions. Profile and optimize before release.';
|
|
347
|
+
}
|
|
348
|
+
if (topFactor.name === 'Error Rate') {
|
|
349
|
+
return 'HIGH RISK: Error rates increased substantially. Investigate new failure modes.';
|
|
350
|
+
}
|
|
351
|
+
return 'HIGH RISK: Multiple breaking changes. Create deprecation notices and migration guides.';
|
|
352
|
+
case 'medium':
|
|
353
|
+
if (topFactor.name === 'Tool Importance') {
|
|
354
|
+
return 'MEDIUM RISK: Changes affect important tools. Stage release with deprecation warnings.';
|
|
355
|
+
}
|
|
356
|
+
return 'MEDIUM RISK: Notable changes detected. Test with key consumers before release.';
|
|
357
|
+
case 'low':
|
|
358
|
+
if (diff.warningCount > 0) {
|
|
359
|
+
return 'LOW RISK: Minor changes with warnings. Review before release but likely safe.';
|
|
360
|
+
}
|
|
361
|
+
return 'LOW RISK: Changes are minor. Standard release process should be sufficient.';
|
|
362
|
+
default:
|
|
363
|
+
if (diff.infoCount > 0) {
|
|
364
|
+
return 'MINIMAL RISK: Only informational changes. Safe to release.';
|
|
365
|
+
}
|
|
366
|
+
return 'NO RISK: No significant changes detected.';
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Generate markdown report for risk score.
|
|
371
|
+
*/
|
|
372
|
+
export function generateRiskScoreMarkdown(riskScore) {
|
|
373
|
+
const lines = [];
|
|
374
|
+
// Risk level badge
|
|
375
|
+
const levelEmoji = {
|
|
376
|
+
critical: '🔴',
|
|
377
|
+
high: '🟠',
|
|
378
|
+
medium: '🟡',
|
|
379
|
+
low: '🟢',
|
|
380
|
+
info: '⚪',
|
|
381
|
+
};
|
|
382
|
+
lines.push('## Regression Risk Assessment');
|
|
383
|
+
lines.push('');
|
|
384
|
+
lines.push(`**Risk Level: ${levelEmoji[riskScore.level]} ${riskScore.level.toUpperCase()}** (Score: ${riskScore.score}/100)`);
|
|
385
|
+
lines.push('');
|
|
386
|
+
lines.push(`> ${riskScore.recommendation}`);
|
|
387
|
+
lines.push('');
|
|
388
|
+
// Factor breakdown
|
|
389
|
+
lines.push('### Risk Factors');
|
|
390
|
+
lines.push('');
|
|
391
|
+
lines.push('| Factor | Score | Weight | Details |');
|
|
392
|
+
lines.push('|--------|-------|--------|---------|');
|
|
393
|
+
for (const factor of riskScore.factors) {
|
|
394
|
+
const bar = generateScoreBar(factor.score);
|
|
395
|
+
const weightPercent = Math.round(factor.weight * 100);
|
|
396
|
+
lines.push(`| ${factor.name} | ${bar} ${factor.score}/100 | ${weightPercent}% | ${factor.details} |`);
|
|
397
|
+
}
|
|
398
|
+
lines.push('');
|
|
399
|
+
// Change summary
|
|
400
|
+
lines.push('### Change Summary');
|
|
401
|
+
lines.push('');
|
|
402
|
+
const summary = riskScore.changeSummary;
|
|
403
|
+
if (summary.breaking > 0 || summary.warning > 0 || summary.info > 0) {
|
|
404
|
+
lines.push('| Type | Count |');
|
|
405
|
+
lines.push('|------|-------|');
|
|
406
|
+
if (summary.breaking > 0)
|
|
407
|
+
lines.push(`| Breaking | ${summary.breaking} |`);
|
|
408
|
+
if (summary.warning > 0)
|
|
409
|
+
lines.push(`| Warnings | ${summary.warning} |`);
|
|
410
|
+
if (summary.info > 0)
|
|
411
|
+
lines.push(`| Info | ${summary.info} |`);
|
|
412
|
+
if (summary.toolsRemoved > 0)
|
|
413
|
+
lines.push(`| Tools Removed | ${summary.toolsRemoved} |`);
|
|
414
|
+
if (summary.toolsAdded > 0)
|
|
415
|
+
lines.push(`| Tools Added | ${summary.toolsAdded} |`);
|
|
416
|
+
if (summary.toolsModified > 0)
|
|
417
|
+
lines.push(`| Tools Modified | ${summary.toolsModified} |`);
|
|
418
|
+
lines.push('');
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
lines.push('No changes detected.');
|
|
422
|
+
lines.push('');
|
|
423
|
+
}
|
|
424
|
+
return lines.join('\n');
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Generate ASCII score bar.
|
|
428
|
+
*/
|
|
429
|
+
function generateScoreBar(score, width = 10) {
|
|
430
|
+
const filled = Math.round((score / 100) * width);
|
|
431
|
+
const empty = width - filled;
|
|
432
|
+
return '[' + 'â–ˆ'.repeat(filled) + 'â–‘'.repeat(empty) + ']';
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=risk-scorer.js.map
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline save/load functionality.
|
|
3
|
+
*/
|
|
4
|
+
import type { InterviewResult } from '../interview/types.js';
|
|
5
|
+
import type { BehavioralBaseline, BehavioralDiff } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Options for loading a baseline.
|
|
8
|
+
*/
|
|
9
|
+
export interface LoadBaselineOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Automatically migrate old baseline formats to the current version.
|
|
12
|
+
* If false and the baseline is outdated, a warning will be logged but
|
|
13
|
+
* the baseline will still be loaded (with potential compatibility issues).
|
|
14
|
+
* @default true
|
|
15
|
+
*/
|
|
16
|
+
migrate?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Skip integrity hash verification.
|
|
19
|
+
* Use with caution - only for debugging or when you know the file was modified intentionally.
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
skipIntegrityCheck?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create a behavioral baseline from interview results.
|
|
26
|
+
*
|
|
27
|
+
* Baselines can only be created from check mode results.
|
|
28
|
+
* Explore mode results are for documentation only.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createBaseline(result: InterviewResult, serverCommand: string): BehavioralBaseline;
|
|
31
|
+
/**
|
|
32
|
+
* Save baseline to a file.
|
|
33
|
+
*/
|
|
34
|
+
export declare function saveBaseline(baseline: BehavioralBaseline, path: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Load baseline from a file.
|
|
37
|
+
* Validates against Zod schema to prevent malicious JSON injection.
|
|
38
|
+
*
|
|
39
|
+
* @param path - Path to the baseline file
|
|
40
|
+
* @param options - Load options
|
|
41
|
+
* @returns Loaded baseline (migrated to current version if needed)
|
|
42
|
+
*/
|
|
43
|
+
export declare function loadBaseline(path: string, options?: LoadBaselineOptions): BehavioralBaseline;
|
|
44
|
+
/**
|
|
45
|
+
* Verify baseline integrity.
|
|
46
|
+
*/
|
|
47
|
+
export declare function verifyIntegrity(baseline: BehavioralBaseline): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Recalculate and update the integrity hash for a baseline.
|
|
50
|
+
* Useful after migration or manual modifications.
|
|
51
|
+
*/
|
|
52
|
+
export declare function recalculateIntegrityHash(baseline: Omit<BehavioralBaseline, 'integrityHash'>): BehavioralBaseline;
|
|
53
|
+
/**
|
|
54
|
+
* Check if a baseline file exists.
|
|
55
|
+
* Returns false for directories - baselines must be files.
|
|
56
|
+
*/
|
|
57
|
+
export declare function baselineExists(path: string): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Options for accepting drift.
|
|
60
|
+
*/
|
|
61
|
+
export interface AcceptDriftOptions {
|
|
62
|
+
/** Who is accepting the drift (for audit trail) */
|
|
63
|
+
acceptedBy?: string;
|
|
64
|
+
/** Reason for accepting the drift */
|
|
65
|
+
reason?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Accept drift by updating a baseline with drift acceptance metadata.
|
|
69
|
+
*
|
|
70
|
+
* This marks the current state of the server as the new expected baseline,
|
|
71
|
+
* acknowledging that the detected changes were intentional.
|
|
72
|
+
*
|
|
73
|
+
* @param currentBaseline - The new baseline from the current server state
|
|
74
|
+
* @param diff - The diff that is being accepted
|
|
75
|
+
* @param options - Acceptance options (reason, acceptedBy)
|
|
76
|
+
* @returns The baseline with acceptance metadata attached
|
|
77
|
+
*/
|
|
78
|
+
export declare function acceptDrift(currentBaseline: BehavioralBaseline, diff: BehavioralDiff, options?: AcceptDriftOptions): BehavioralBaseline;
|
|
79
|
+
/**
|
|
80
|
+
* Check if a baseline has acceptance metadata.
|
|
81
|
+
*/
|
|
82
|
+
export declare function hasAcceptance(baseline: BehavioralBaseline): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Clear acceptance metadata from a baseline.
|
|
85
|
+
* Useful when re-running checks after the accepted changes are no longer relevant.
|
|
86
|
+
* Returns a new baseline without acceptance, with recalculated integrity hash.
|
|
87
|
+
*/
|
|
88
|
+
export declare function clearAcceptance(baseline: BehavioralBaseline): BehavioralBaseline;
|
|
89
|
+
//# sourceMappingURL=saver.d.ts.map
|