@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,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification module for the Verified by Bellwether program.
|
|
3
|
+
*/
|
|
4
|
+
import type { VerificationResult, VerificationReport, VerificationBadge, VerificationConfig } from './types.js';
|
|
5
|
+
import type { InterviewResult } from '../interview/types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate a verification result from an interview result.
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateVerificationResult(interview: InterviewResult, config: VerificationConfig): VerificationResult;
|
|
10
|
+
/**
|
|
11
|
+
* Generate a full verification report.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateVerificationReport(interview: InterviewResult, config: VerificationConfig): VerificationReport;
|
|
14
|
+
/**
|
|
15
|
+
* Generate a verification badge for embedding.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateVerificationBadge(result: VerificationResult): VerificationBadge;
|
|
18
|
+
/**
|
|
19
|
+
* Generate a Shields.io compatible badge URL.
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateBadgeUrl(result: VerificationResult): string;
|
|
22
|
+
/**
|
|
23
|
+
* Generate a verification badge markdown.
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateBadgeMarkdown(result: VerificationResult, reportUrl?: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a verification result is still valid.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isVerificationValid(result: VerificationResult): boolean;
|
|
30
|
+
//# sourceMappingURL=verifier.d.ts.map
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification module for the Verified by Bellwether program.
|
|
3
|
+
*/
|
|
4
|
+
import { createHash } from 'crypto';
|
|
5
|
+
import { getLogger } from '../logging/logger.js';
|
|
6
|
+
import { VERSION } from '../version.js';
|
|
7
|
+
import { TIME_CONSTANTS, DISPLAY_LIMITS, VERIFICATION_TIERS } from '../constants.js';
|
|
8
|
+
const logger = getLogger('verification');
|
|
9
|
+
/** Verification validity period in days */
|
|
10
|
+
const VERIFICATION_VALIDITY_DAYS = TIME_CONSTANTS.VERIFICATION_VALIDITY_DAYS;
|
|
11
|
+
/**
|
|
12
|
+
* Generate a verification result from an interview result.
|
|
13
|
+
*/
|
|
14
|
+
export function generateVerificationResult(interview, config) {
|
|
15
|
+
const now = new Date();
|
|
16
|
+
const expiresAt = new Date(now.getTime() + VERIFICATION_VALIDITY_DAYS * TIME_CONSTANTS.MS_PER_DAY);
|
|
17
|
+
// Calculate test statistics
|
|
18
|
+
const { testsPassed, testsTotal } = calculateTestStats(interview);
|
|
19
|
+
const passRate = testsTotal > 0 ? Math.round((testsPassed / testsTotal) * 100) : 0;
|
|
20
|
+
// Determine tier based on coverage and pass rate
|
|
21
|
+
const tier = determineTier(interview, passRate);
|
|
22
|
+
// Determine status
|
|
23
|
+
const status = determineStatus(passRate, tier, config.targetTier);
|
|
24
|
+
// Generate report hash
|
|
25
|
+
const reportHash = generateReportHash(interview);
|
|
26
|
+
const result = {
|
|
27
|
+
serverId: config.serverId,
|
|
28
|
+
version: config.version ?? interview.discovery.serverInfo.version,
|
|
29
|
+
status,
|
|
30
|
+
tier: status === 'verified' ? tier : undefined,
|
|
31
|
+
verifiedAt: now.toISOString(),
|
|
32
|
+
expiresAt: expiresAt.toISOString(),
|
|
33
|
+
toolsVerified: interview.toolProfiles.length,
|
|
34
|
+
testsPassed,
|
|
35
|
+
testsTotal,
|
|
36
|
+
passRate,
|
|
37
|
+
reportHash,
|
|
38
|
+
bellwetherVersion: VERSION,
|
|
39
|
+
};
|
|
40
|
+
logger.info({
|
|
41
|
+
serverId: result.serverId,
|
|
42
|
+
status: result.status,
|
|
43
|
+
tier: result.tier,
|
|
44
|
+
passRate: result.passRate,
|
|
45
|
+
}, 'Verification result generated');
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generate a full verification report.
|
|
50
|
+
*/
|
|
51
|
+
export function generateVerificationReport(interview, config) {
|
|
52
|
+
const result = generateVerificationResult(interview, config);
|
|
53
|
+
// Build tool verification details
|
|
54
|
+
const tools = interview.toolProfiles.map(profile => {
|
|
55
|
+
const passed = profile.interactions.filter(i => !i.error && !i.response?.isError).length;
|
|
56
|
+
const errors = profile.interactions
|
|
57
|
+
.filter(i => i.error || i.response?.isError)
|
|
58
|
+
.map(i => i.error ?? 'Tool returned error');
|
|
59
|
+
return {
|
|
60
|
+
name: profile.name,
|
|
61
|
+
testsRun: profile.interactions.length,
|
|
62
|
+
testsPassed: passed,
|
|
63
|
+
errors,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
// Build prompt verification details
|
|
67
|
+
const prompts = interview.promptProfiles?.map(profile => {
|
|
68
|
+
const passed = profile.interactions.filter(i => !i.error).length;
|
|
69
|
+
const errors = profile.interactions
|
|
70
|
+
.filter(i => i.error)
|
|
71
|
+
.map(i => i.error ?? 'Prompt returned error');
|
|
72
|
+
return {
|
|
73
|
+
name: profile.name,
|
|
74
|
+
testsRun: profile.interactions.length,
|
|
75
|
+
testsPassed: passed,
|
|
76
|
+
errors,
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
// Build resource verification details
|
|
80
|
+
const resources = interview.resourceProfiles?.map(profile => {
|
|
81
|
+
const passed = profile.interactions.filter(i => !i.error).length;
|
|
82
|
+
const errors = profile.interactions
|
|
83
|
+
.filter(i => i.error)
|
|
84
|
+
.map(i => i.error ?? 'Resource read error');
|
|
85
|
+
return {
|
|
86
|
+
uri: profile.uri,
|
|
87
|
+
name: profile.name,
|
|
88
|
+
testsRun: profile.interactions.length,
|
|
89
|
+
testsPassed: passed,
|
|
90
|
+
errors,
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
result,
|
|
95
|
+
serverInfo: {
|
|
96
|
+
name: interview.discovery.serverInfo.name,
|
|
97
|
+
version: interview.discovery.serverInfo.version,
|
|
98
|
+
description: interview.summary,
|
|
99
|
+
},
|
|
100
|
+
tools,
|
|
101
|
+
prompts,
|
|
102
|
+
resources,
|
|
103
|
+
environment: {
|
|
104
|
+
os: process.platform,
|
|
105
|
+
nodeVersion: process.version,
|
|
106
|
+
bellwetherVersion: VERSION,
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Generate a verification badge for embedding.
|
|
112
|
+
*/
|
|
113
|
+
export function generateVerificationBadge(result) {
|
|
114
|
+
const badge = {
|
|
115
|
+
label: 'bellwether',
|
|
116
|
+
message: 'not verified',
|
|
117
|
+
color: 'lightgrey',
|
|
118
|
+
};
|
|
119
|
+
switch (result.status) {
|
|
120
|
+
case 'verified':
|
|
121
|
+
badge.message = result.tier ?? 'verified';
|
|
122
|
+
badge.color = getTierColor(result.tier);
|
|
123
|
+
badge.icon = getTierIcon(result.tier);
|
|
124
|
+
badge.verifiedAt = result.verifiedAt;
|
|
125
|
+
break;
|
|
126
|
+
case 'pending':
|
|
127
|
+
badge.message = 'pending';
|
|
128
|
+
badge.color = 'yellow';
|
|
129
|
+
break;
|
|
130
|
+
case 'failed':
|
|
131
|
+
badge.message = 'failed';
|
|
132
|
+
badge.color = 'red';
|
|
133
|
+
break;
|
|
134
|
+
case 'expired':
|
|
135
|
+
badge.message = 'expired';
|
|
136
|
+
badge.color = 'orange';
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
return badge;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Generate a Shields.io compatible badge URL.
|
|
143
|
+
*/
|
|
144
|
+
export function generateBadgeUrl(result) {
|
|
145
|
+
const badge = generateVerificationBadge(result);
|
|
146
|
+
const encodedLabel = encodeURIComponent(badge.label);
|
|
147
|
+
const encodedMessage = encodeURIComponent(badge.message);
|
|
148
|
+
const encodedColor = encodeURIComponent(badge.color);
|
|
149
|
+
return `https://img.shields.io/badge/${encodedLabel}-${encodedMessage}-${encodedColor}`;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Generate a verification badge markdown.
|
|
153
|
+
*/
|
|
154
|
+
export function generateBadgeMarkdown(result, reportUrl) {
|
|
155
|
+
const badgeUrl = generateBadgeUrl(result);
|
|
156
|
+
const altText = `Bellwether ${result.status}: ${result.tier ?? result.status}`;
|
|
157
|
+
if (reportUrl) {
|
|
158
|
+
return `[](${reportUrl})`;
|
|
159
|
+
}
|
|
160
|
+
return ``;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if a verification result is still valid.
|
|
164
|
+
*/
|
|
165
|
+
export function isVerificationValid(result) {
|
|
166
|
+
const expiresAt = new Date(result.expiresAt);
|
|
167
|
+
return result.status === 'verified' && expiresAt > new Date();
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Calculate test statistics from interview results.
|
|
171
|
+
*/
|
|
172
|
+
function calculateTestStats(interview) {
|
|
173
|
+
let testsPassed = 0;
|
|
174
|
+
let testsTotal = 0;
|
|
175
|
+
const toolStats = new Map();
|
|
176
|
+
// Count tool tests
|
|
177
|
+
for (const profile of interview.toolProfiles) {
|
|
178
|
+
const total = profile.interactions.length;
|
|
179
|
+
const passed = profile.interactions.filter(i => !i.error && !i.response?.isError).length;
|
|
180
|
+
toolStats.set(profile.name, { passed, total });
|
|
181
|
+
testsPassed += passed;
|
|
182
|
+
testsTotal += total;
|
|
183
|
+
}
|
|
184
|
+
// Count prompt tests
|
|
185
|
+
if (interview.promptProfiles) {
|
|
186
|
+
for (const profile of interview.promptProfiles) {
|
|
187
|
+
const total = profile.interactions.length;
|
|
188
|
+
const passed = profile.interactions.filter(i => !i.error).length;
|
|
189
|
+
testsPassed += passed;
|
|
190
|
+
testsTotal += total;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Count resource tests
|
|
194
|
+
if (interview.resourceProfiles) {
|
|
195
|
+
for (const profile of interview.resourceProfiles) {
|
|
196
|
+
const total = profile.interactions.length;
|
|
197
|
+
const passed = profile.interactions.filter(i => !i.error).length;
|
|
198
|
+
testsPassed += passed;
|
|
199
|
+
testsTotal += total;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Count scenario tests
|
|
203
|
+
if (interview.scenarioResults) {
|
|
204
|
+
for (const result of interview.scenarioResults) {
|
|
205
|
+
testsTotal++;
|
|
206
|
+
if (result.passed) {
|
|
207
|
+
testsPassed++;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return { testsPassed, testsTotal, toolStats };
|
|
212
|
+
}
|
|
213
|
+
function determineTier(interview, passRate) {
|
|
214
|
+
const hasSecurityTesting = interview.metadata.personas?.some(p => p.name.toLowerCase().includes('security'));
|
|
215
|
+
const personaCount = interview.metadata.personas?.length ?? 1;
|
|
216
|
+
const hasPrompts = (interview.promptProfiles?.length ?? 0) > 0;
|
|
217
|
+
const hasResources = (interview.resourceProfiles?.length ?? 0) > 0;
|
|
218
|
+
// Platinum: Security testing + all personas + high pass rate
|
|
219
|
+
if (hasSecurityTesting &&
|
|
220
|
+
personaCount >= VERIFICATION_TIERS.PLATINUM.MIN_PERSONAS &&
|
|
221
|
+
passRate >= VERIFICATION_TIERS.PLATINUM.MIN_PASS_RATE) {
|
|
222
|
+
return 'platinum';
|
|
223
|
+
}
|
|
224
|
+
// Gold: Multiple personas + good coverage + high pass rate
|
|
225
|
+
if (personaCount >= VERIFICATION_TIERS.GOLD.MIN_PERSONAS &&
|
|
226
|
+
passRate >= VERIFICATION_TIERS.GOLD.MIN_PASS_RATE &&
|
|
227
|
+
(hasPrompts || hasResources)) {
|
|
228
|
+
return 'gold';
|
|
229
|
+
}
|
|
230
|
+
// Silver: Error handling tested + decent pass rate
|
|
231
|
+
if (personaCount >= VERIFICATION_TIERS.SILVER.MIN_PERSONAS &&
|
|
232
|
+
passRate >= VERIFICATION_TIERS.SILVER.MIN_PASS_RATE) {
|
|
233
|
+
return 'silver';
|
|
234
|
+
}
|
|
235
|
+
// Bronze: Basic testing
|
|
236
|
+
return 'bronze';
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Determine verification status based on results.
|
|
240
|
+
*/
|
|
241
|
+
function determineStatus(passRate, achievedTier, targetTier) {
|
|
242
|
+
// Minimum pass rate for verification
|
|
243
|
+
if (passRate < VERIFICATION_TIERS.MIN_PASS_RATE_FOR_VERIFICATION) {
|
|
244
|
+
return 'failed';
|
|
245
|
+
}
|
|
246
|
+
// Check if target tier is met
|
|
247
|
+
if (targetTier) {
|
|
248
|
+
const tierOrder = ['bronze', 'silver', 'gold', 'platinum'];
|
|
249
|
+
const achievedIndex = tierOrder.indexOf(achievedTier);
|
|
250
|
+
const targetIndex = tierOrder.indexOf(targetTier);
|
|
251
|
+
if (achievedIndex < targetIndex) {
|
|
252
|
+
return 'failed';
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return 'verified';
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Generate a hash of the interview results for verification.
|
|
259
|
+
*/
|
|
260
|
+
function generateReportHash(interview) {
|
|
261
|
+
const data = {
|
|
262
|
+
serverName: interview.discovery.serverInfo.name,
|
|
263
|
+
serverVersion: interview.discovery.serverInfo.version,
|
|
264
|
+
toolCount: interview.toolProfiles.length,
|
|
265
|
+
toolNames: interview.toolProfiles.map(p => p.name).sort(),
|
|
266
|
+
promptCount: interview.promptProfiles?.length ?? 0,
|
|
267
|
+
resourceCount: interview.resourceProfiles?.length ?? 0,
|
|
268
|
+
timestamp: interview.metadata.startTime.toISOString(),
|
|
269
|
+
};
|
|
270
|
+
return createHash('sha256')
|
|
271
|
+
.update(JSON.stringify(data))
|
|
272
|
+
.digest('hex')
|
|
273
|
+
.substring(0, DISPLAY_LIMITS.HASH_DISPLAY_LENGTH);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get color for a verification tier.
|
|
277
|
+
*/
|
|
278
|
+
function getTierColor(tier) {
|
|
279
|
+
switch (tier) {
|
|
280
|
+
case 'platinum':
|
|
281
|
+
return '00CED1'; // Dark cyan
|
|
282
|
+
case 'gold':
|
|
283
|
+
return 'FFD700'; // Gold
|
|
284
|
+
case 'silver':
|
|
285
|
+
return 'C0C0C0'; // Silver
|
|
286
|
+
case 'bronze':
|
|
287
|
+
return 'CD7F32'; // Bronze
|
|
288
|
+
default:
|
|
289
|
+
return 'brightgreen';
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Get icon for a verification tier.
|
|
294
|
+
*/
|
|
295
|
+
function getTierIcon(tier) {
|
|
296
|
+
switch (tier) {
|
|
297
|
+
case 'platinum':
|
|
298
|
+
return '💎';
|
|
299
|
+
case 'gold':
|
|
300
|
+
return '🥇';
|
|
301
|
+
case 'silver':
|
|
302
|
+
return '🥈';
|
|
303
|
+
case 'bronze':
|
|
304
|
+
return '🥉';
|
|
305
|
+
default:
|
|
306
|
+
return '✓';
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=verifier.js.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized version management.
|
|
3
|
+
*
|
|
4
|
+
* All version references should import from this module rather than
|
|
5
|
+
* hardcoding the version string.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The current Bellwether version.
|
|
9
|
+
*/
|
|
10
|
+
export declare const VERSION: string;
|
|
11
|
+
/**
|
|
12
|
+
* Package name.
|
|
13
|
+
*/
|
|
14
|
+
export declare const PACKAGE_NAME = "@dotsetlabs/bellwether";
|
|
15
|
+
/**
|
|
16
|
+
* User-Agent string for HTTP requests.
|
|
17
|
+
*/
|
|
18
|
+
export declare const USER_AGENT: string;
|
|
19
|
+
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized version management.
|
|
3
|
+
*
|
|
4
|
+
* All version references should import from this module rather than
|
|
5
|
+
* hardcoding the version string.
|
|
6
|
+
*/
|
|
7
|
+
import { dirname, join } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { readFileSync } from 'fs';
|
|
10
|
+
/**
|
|
11
|
+
* Get the package version.
|
|
12
|
+
*
|
|
13
|
+
* This reads from package.json at runtime, which works correctly
|
|
14
|
+
* whether running in development or as an installed global package.
|
|
15
|
+
*/
|
|
16
|
+
function getPackageVersion() {
|
|
17
|
+
try {
|
|
18
|
+
// First try npm_package_version (works when run via npm scripts)
|
|
19
|
+
if (process.env.npm_package_version) {
|
|
20
|
+
return process.env.npm_package_version;
|
|
21
|
+
}
|
|
22
|
+
// Otherwise read from package.json relative to this module
|
|
23
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
24
|
+
const __dirname = dirname(__filename);
|
|
25
|
+
// In dist/, we need to go up one level to find package.json
|
|
26
|
+
// In src/, we also need to go up one level
|
|
27
|
+
const packagePath = join(__dirname, '..', 'package.json');
|
|
28
|
+
const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
29
|
+
return packageJson.version;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Fallback version - should match package.json
|
|
33
|
+
return '0.10.0';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The current Bellwether version.
|
|
38
|
+
*/
|
|
39
|
+
export const VERSION = getPackageVersion();
|
|
40
|
+
/**
|
|
41
|
+
* Package name.
|
|
42
|
+
*/
|
|
43
|
+
export const PACKAGE_NAME = '@dotsetlabs/bellwether';
|
|
44
|
+
/**
|
|
45
|
+
* User-Agent string for HTTP requests.
|
|
46
|
+
*/
|
|
47
|
+
export const USER_AGENT = `bellwether/${VERSION}`;
|
|
48
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow auto-generator - generates workflow YAML from discovered tools.
|
|
3
|
+
*
|
|
4
|
+
* This module analyzes tool descriptions and schemas to automatically
|
|
5
|
+
* generate test workflows that represent common usage patterns.
|
|
6
|
+
* Unlike the LLM-powered WorkflowDiscoverer, this uses heuristics
|
|
7
|
+
* for deterministic workflow generation in check mode.
|
|
8
|
+
*/
|
|
9
|
+
import type { MCPTool } from '../transport/types.js';
|
|
10
|
+
import type { Workflow, WorkflowDiscoveryOptions } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Generate workflows from available tools using pattern matching.
|
|
13
|
+
*
|
|
14
|
+
* This function analyzes tool names, descriptions, and schemas to
|
|
15
|
+
* identify common workflow patterns like CRUD operations, auth flows,
|
|
16
|
+
* and chained data processing.
|
|
17
|
+
*
|
|
18
|
+
* @param tools - Available MCP tools
|
|
19
|
+
* @param options - Generation options
|
|
20
|
+
* @returns Array of generated workflows
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateWorkflowsFromTools(tools: MCPTool[], options?: WorkflowDiscoveryOptions): Workflow[];
|
|
23
|
+
/**
|
|
24
|
+
* Generate YAML content for workflows.
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateWorkflowYamlContent(workflows: Workflow[]): string;
|
|
27
|
+
//# sourceMappingURL=auto-generator.d.ts.map
|