@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,74 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { createCloudClient } from '../../../cloud/client.js';
|
|
3
|
+
import { getLinkedProject } from '../../../cloud/auth.js';
|
|
4
|
+
import { EXIT_CODES } from '../../../constants.js';
|
|
5
|
+
import * as output from '../../output.js';
|
|
6
|
+
export const badgeCommand = new Command('badge')
|
|
7
|
+
.description('Get embeddable badge for your project')
|
|
8
|
+
.option('-p, --project <id>', 'Project ID (uses linked project if not specified)')
|
|
9
|
+
.option('--json', 'Output as JSON')
|
|
10
|
+
.option('--markdown', 'Output markdown only')
|
|
11
|
+
.option('--url', 'Output badge URL only')
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
// Get project ID
|
|
14
|
+
let projectId = options.project;
|
|
15
|
+
if (!projectId) {
|
|
16
|
+
const link = getLinkedProject();
|
|
17
|
+
if (!link) {
|
|
18
|
+
output.error('No project specified and no linked project found.');
|
|
19
|
+
output.error('Run `bellwether link <project>` first or use --project <id>');
|
|
20
|
+
process.exit(EXIT_CODES.ERROR);
|
|
21
|
+
}
|
|
22
|
+
projectId = link.projectId;
|
|
23
|
+
}
|
|
24
|
+
// Create cloud client
|
|
25
|
+
const client = createCloudClient();
|
|
26
|
+
try {
|
|
27
|
+
const badge = await client.getBadgeInfo(projectId);
|
|
28
|
+
if (!badge) {
|
|
29
|
+
output.error(`Project not found: ${projectId}`);
|
|
30
|
+
process.exit(EXIT_CODES.ERROR);
|
|
31
|
+
}
|
|
32
|
+
if (options.json) {
|
|
33
|
+
output.info(JSON.stringify(badge, null, 2));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (options.markdown) {
|
|
37
|
+
output.info(badge.markdown);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (options.url) {
|
|
41
|
+
output.info(badge.badgeUrl);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Default: formatted output
|
|
45
|
+
output.info('');
|
|
46
|
+
output.info(`Project: ${badge.projectName}`);
|
|
47
|
+
output.info(`Status: ${badge.statusText}`);
|
|
48
|
+
if (badge.lastVerified) {
|
|
49
|
+
output.info(`Verified: ${new Date(badge.lastVerified).toLocaleString()}`);
|
|
50
|
+
}
|
|
51
|
+
if (badge.latestVersion) {
|
|
52
|
+
output.info(`Version: v${badge.latestVersion}`);
|
|
53
|
+
}
|
|
54
|
+
output.info('');
|
|
55
|
+
output.info('Badge URL:');
|
|
56
|
+
output.info(` ${badge.badgeUrl}`);
|
|
57
|
+
output.info('');
|
|
58
|
+
output.info('Add to your README.md:');
|
|
59
|
+
output.info('');
|
|
60
|
+
output.info(` ${badge.markdown}`);
|
|
61
|
+
output.info('');
|
|
62
|
+
output.info('Or with HTML:');
|
|
63
|
+
output.info('');
|
|
64
|
+
// Extract base URL from badge URL for consistency
|
|
65
|
+
const baseUrl = badge.badgeUrl.replace(/\/badge\/.*$/, '');
|
|
66
|
+
output.info(` <a href="${baseUrl}/projects/${projectId}"><img src="${badge.badgeUrl}" alt="Bellwether"></a>`);
|
|
67
|
+
output.info('');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
output.error('Failed to get badge info: ' + (error instanceof Error ? error.message : String(error)));
|
|
71
|
+
process.exit(EXIT_CODES.ERROR);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff command for comparing specific versions.
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { EXIT_CODES } from '../../../constants.js';
|
|
6
|
+
import { loadConfigOrExit, getSessionTokenOrExit, createAuthenticatedClient, resolveProjectId } from './shared.js';
|
|
7
|
+
import * as output from '../../output.js';
|
|
8
|
+
export const diffCommand = new Command('diff')
|
|
9
|
+
.description('Compare two baseline versions')
|
|
10
|
+
.argument('<from>', 'From version number')
|
|
11
|
+
.argument('<to>', 'To version number')
|
|
12
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
13
|
+
.option('-p, --project <id>', 'Project ID (uses linked project if not specified)')
|
|
14
|
+
.option('--json', 'Output as JSON')
|
|
15
|
+
.option('--session <session>', 'Session token (overrides stored/env session)')
|
|
16
|
+
.action(async (fromArg, toArg, options) => {
|
|
17
|
+
const config = loadConfigOrExit(options.config);
|
|
18
|
+
// Get session
|
|
19
|
+
const sessionToken = getSessionTokenOrExit(options.session);
|
|
20
|
+
// Determine project ID
|
|
21
|
+
const projectId = resolveProjectId(undefined, options.project);
|
|
22
|
+
if (!projectId) {
|
|
23
|
+
output.error('No project specified. Use --project <id> or run `bellwether link`.');
|
|
24
|
+
process.exit(EXIT_CODES.ERROR);
|
|
25
|
+
}
|
|
26
|
+
// Parse versions
|
|
27
|
+
const fromVersion = parseInt(fromArg, 10);
|
|
28
|
+
const toVersion = parseInt(toArg, 10);
|
|
29
|
+
if (isNaN(fromVersion) || isNaN(toVersion)) {
|
|
30
|
+
output.error('Invalid version numbers. Provide integers (e.g., `bellwether diff 1 2`).');
|
|
31
|
+
process.exit(EXIT_CODES.ERROR);
|
|
32
|
+
}
|
|
33
|
+
// Create client and fetch diff
|
|
34
|
+
const client = createAuthenticatedClient(sessionToken);
|
|
35
|
+
try {
|
|
36
|
+
const diff = await client.getDiff(projectId, fromVersion, toVersion);
|
|
37
|
+
const outputJson = options.json ? true : config.history.json;
|
|
38
|
+
if (outputJson) {
|
|
39
|
+
output.info(JSON.stringify(diff, null, 2));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
output.info(`Comparing v${fromVersion} → v${toVersion}\n`);
|
|
43
|
+
const severityIcon = {
|
|
44
|
+
none: '✓',
|
|
45
|
+
info: 'ℹ',
|
|
46
|
+
warning: '⚠',
|
|
47
|
+
breaking: '✗',
|
|
48
|
+
};
|
|
49
|
+
output.info(`Severity: ${severityIcon[diff.severity] ?? '?'} ${diff.severity.toUpperCase()}`);
|
|
50
|
+
output.info('');
|
|
51
|
+
if (diff.toolsAdded > 0) {
|
|
52
|
+
output.info(`Tools added: +${diff.toolsAdded}`);
|
|
53
|
+
}
|
|
54
|
+
if (diff.toolsRemoved > 0) {
|
|
55
|
+
output.info(`Tools removed: -${diff.toolsRemoved}`);
|
|
56
|
+
}
|
|
57
|
+
if (diff.toolsModified > 0) {
|
|
58
|
+
output.info(`Tools modified: ~${diff.toolsModified}`);
|
|
59
|
+
}
|
|
60
|
+
if (diff.behaviorChanges > 0) {
|
|
61
|
+
output.info(`Behavior changes: ${diff.behaviorChanges}`);
|
|
62
|
+
}
|
|
63
|
+
if (diff.toolsAdded === 0 &&
|
|
64
|
+
diff.toolsRemoved === 0 &&
|
|
65
|
+
diff.toolsModified === 0 &&
|
|
66
|
+
diff.behaviorChanges === 0) {
|
|
67
|
+
output.info('No changes detected between these versions.');
|
|
68
|
+
}
|
|
69
|
+
if (diff.severity === 'breaking') {
|
|
70
|
+
output.info('\n⚠️ Breaking changes detected!');
|
|
71
|
+
output.info(' Tools were removed or modified in incompatible ways.');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
output.error('Failed to fetch diff: ' + (error instanceof Error ? error.message : String(error)));
|
|
76
|
+
process.exit(EXIT_CODES.ERROR);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History command for viewing baseline history in Bellwether Cloud.
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { formatDateLocale } from '../../../utils/index.js';
|
|
6
|
+
import { EXIT_CODES } from '../../../constants.js';
|
|
7
|
+
import { getSeverityIcon } from '../../output.js';
|
|
8
|
+
import { loadConfigOrExit, getSessionTokenOrExit, createAuthenticatedClient, resolveProjectId } from './shared.js';
|
|
9
|
+
import * as output from '../../output.js';
|
|
10
|
+
export const historyCommand = new Command('history')
|
|
11
|
+
.description('View baseline history for a project')
|
|
12
|
+
.argument('[project-id]', 'Project ID (uses linked project if not specified)')
|
|
13
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
14
|
+
.option('-n, --limit <n>', 'Number of versions to show')
|
|
15
|
+
.option('--json', 'Output as JSON')
|
|
16
|
+
.option('--session <session>', 'Session token (overrides stored/env session)')
|
|
17
|
+
.action(async (projectIdArg, options) => {
|
|
18
|
+
const config = loadConfigOrExit(options.config);
|
|
19
|
+
// Get session
|
|
20
|
+
const sessionToken = getSessionTokenOrExit(options.session);
|
|
21
|
+
// Determine project ID
|
|
22
|
+
const projectId = resolveProjectId(projectIdArg);
|
|
23
|
+
if (!projectId) {
|
|
24
|
+
output.error('No project specified.');
|
|
25
|
+
output.error('\nEither:');
|
|
26
|
+
output.error(' - Provide a project ID as argument');
|
|
27
|
+
output.error(' - Run `bellwether link` to link this directory to a project');
|
|
28
|
+
process.exit(EXIT_CODES.ERROR);
|
|
29
|
+
}
|
|
30
|
+
// Create client and fetch history
|
|
31
|
+
const client = createAuthenticatedClient(sessionToken);
|
|
32
|
+
const limit = parseInt(options.limit ?? String(config.history.limit), 10);
|
|
33
|
+
try {
|
|
34
|
+
const history = await client.getHistory(projectId, limit);
|
|
35
|
+
const outputJson = options.json ? true : config.history.json;
|
|
36
|
+
if (outputJson) {
|
|
37
|
+
output.info(JSON.stringify(history, null, 2));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (history.length === 0) {
|
|
41
|
+
output.info('No baselines uploaded yet.');
|
|
42
|
+
output.info('\nRun `bellwether check <server> --save-baseline` then `bellwether upload`.');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Get project info for display
|
|
46
|
+
const project = await client.getProject(projectId);
|
|
47
|
+
const projectName = project?.name ?? projectId;
|
|
48
|
+
output.info(`Baseline History: ${projectName}`);
|
|
49
|
+
output.info(`Showing ${history.length} version(s)\n`);
|
|
50
|
+
output.info('Ver Uploaded CLI Version Hash');
|
|
51
|
+
output.info('─── ─────────────────────── ─────────── ────────────────');
|
|
52
|
+
for (const baseline of history) {
|
|
53
|
+
const date = formatDateLocale(baseline.uploadedAt);
|
|
54
|
+
const cliVersion = baseline.cliVersion.padEnd(11);
|
|
55
|
+
const hash = baseline.hash.slice(0, 16);
|
|
56
|
+
output.info(`${baseline.version.toString().padStart(3)} ` +
|
|
57
|
+
`${date.padEnd(23)} ` +
|
|
58
|
+
`${cliVersion} ` +
|
|
59
|
+
hash);
|
|
60
|
+
}
|
|
61
|
+
// Show diff summary if multiple versions
|
|
62
|
+
if (history.length >= 2) {
|
|
63
|
+
output.info('\nLatest changes:');
|
|
64
|
+
try {
|
|
65
|
+
const diff = await client.getLatestDiff(projectId);
|
|
66
|
+
if (diff) {
|
|
67
|
+
printDiffSummary(diff);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Diff failed, just skip
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
output.error('Failed to fetch history: ' + (error instanceof Error ? error.message : String(error)));
|
|
77
|
+
process.exit(EXIT_CODES.ERROR);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
function printDiffSummary(diff) {
|
|
81
|
+
const parts = [];
|
|
82
|
+
if (diff.toolsAdded > 0) {
|
|
83
|
+
parts.push(`+${diff.toolsAdded} tools`);
|
|
84
|
+
}
|
|
85
|
+
if (diff.toolsRemoved > 0) {
|
|
86
|
+
parts.push(`-${diff.toolsRemoved} tools`);
|
|
87
|
+
}
|
|
88
|
+
if (diff.toolsModified > 0) {
|
|
89
|
+
parts.push(`~${diff.toolsModified} modified`);
|
|
90
|
+
}
|
|
91
|
+
if (diff.behaviorChanges > 0) {
|
|
92
|
+
parts.push(`${diff.behaviorChanges} behavior changes`);
|
|
93
|
+
}
|
|
94
|
+
if (parts.length === 0) {
|
|
95
|
+
output.info(' No changes from previous version');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const icon = getSeverityIcon(diff.severity);
|
|
99
|
+
output.info(` ${icon} ${diff.severity}: ${parts.join(', ')}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link command for connecting current directory to a Bellwether Cloud project.
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
export declare const linkCommand: Command;
|
|
6
|
+
/**
|
|
7
|
+
* Projects command for listing projects.
|
|
8
|
+
*/
|
|
9
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link command for connecting current directory to a Bellwether Cloud project.
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { basename } from 'path';
|
|
6
|
+
import { getLinkedProject, saveProjectLink, removeProjectLink, getActiveTeam, getTeamId, } from '../../../cloud/auth.js';
|
|
7
|
+
import { EXIT_CODES } from '../../../constants.js';
|
|
8
|
+
import { loadConfigOrExit, getSessionTokenOrExit, createAuthenticatedClient } from './shared.js';
|
|
9
|
+
import * as output from '../../output.js';
|
|
10
|
+
export const linkCommand = new Command('link')
|
|
11
|
+
.description('Link current directory to a Bellwether Cloud project')
|
|
12
|
+
.argument('[project-id]', 'Project ID to link to (creates new if not specified)')
|
|
13
|
+
.option('-n, --name <name>', 'Project name (for new projects)')
|
|
14
|
+
.option('-c, --command <cmd>', 'Server command (for new projects)')
|
|
15
|
+
.option('--config <path>', 'Path to config file')
|
|
16
|
+
.option('--unlink', 'Remove the project link from current directory')
|
|
17
|
+
.option('--status', 'Show current link status')
|
|
18
|
+
.action(async (projectIdArg, options) => {
|
|
19
|
+
const config = loadConfigOrExit(options.config);
|
|
20
|
+
// Handle --status
|
|
21
|
+
if (options.status) {
|
|
22
|
+
showLinkStatus();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Handle --unlink
|
|
26
|
+
if (options.unlink) {
|
|
27
|
+
if (removeProjectLink()) {
|
|
28
|
+
output.info('Project link removed.');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
output.info('No project link to remove.');
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Check authentication
|
|
36
|
+
const sessionToken = getSessionTokenOrExit();
|
|
37
|
+
const client = createAuthenticatedClient(sessionToken);
|
|
38
|
+
let project;
|
|
39
|
+
if (projectIdArg) {
|
|
40
|
+
// Link to existing project
|
|
41
|
+
output.info(`Looking up project ${projectIdArg}...`);
|
|
42
|
+
project = await client.getProject(projectIdArg);
|
|
43
|
+
if (!project) {
|
|
44
|
+
output.error(`Project not found: ${projectIdArg}`);
|
|
45
|
+
output.error('\nUse `bellwether link` without an ID to create a new project.');
|
|
46
|
+
process.exit(EXIT_CODES.ERROR);
|
|
47
|
+
}
|
|
48
|
+
output.info(`Found project: ${project.name}`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// Create new project
|
|
52
|
+
const projectName = options.name ?? inferProjectName();
|
|
53
|
+
const serverCommand = options.command ?? config.link.defaultServerCommand;
|
|
54
|
+
output.info(`Creating project "${projectName}"...`);
|
|
55
|
+
try {
|
|
56
|
+
project = await client.createProject(projectName, serverCommand);
|
|
57
|
+
output.info(`Project created: ${project.id}`);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
output.error('Failed to create project: ' + (error instanceof Error ? error.message : String(error)));
|
|
61
|
+
process.exit(EXIT_CODES.ERROR);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Get active team for the link
|
|
65
|
+
const activeTeam = getActiveTeam();
|
|
66
|
+
const teamId = getTeamId();
|
|
67
|
+
// Save link with team context
|
|
68
|
+
const link = {
|
|
69
|
+
projectId: project.id,
|
|
70
|
+
projectName: project.name,
|
|
71
|
+
linkedAt: new Date().toISOString(),
|
|
72
|
+
teamId,
|
|
73
|
+
teamName: activeTeam?.name,
|
|
74
|
+
};
|
|
75
|
+
saveProjectLink(link);
|
|
76
|
+
output.info(`\nLinked to project: ${project.name}`);
|
|
77
|
+
output.info(`Project ID: ${project.id}`);
|
|
78
|
+
if (activeTeam) {
|
|
79
|
+
output.info(`Team: ${activeTeam.name}`);
|
|
80
|
+
}
|
|
81
|
+
output.info(`Server command: ${project.serverCommand}`);
|
|
82
|
+
output.info('\nSaved to .bellwether/link.json');
|
|
83
|
+
output.info('\nYou can now run:');
|
|
84
|
+
output.info(' bellwether check <server> --save-baseline');
|
|
85
|
+
output.info(' bellwether upload');
|
|
86
|
+
});
|
|
87
|
+
/**
|
|
88
|
+
* Infer project name from current directory.
|
|
89
|
+
*/
|
|
90
|
+
function inferProjectName() {
|
|
91
|
+
return basename(process.cwd());
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Show current link status.
|
|
95
|
+
*/
|
|
96
|
+
function showLinkStatus() {
|
|
97
|
+
const link = getLinkedProject();
|
|
98
|
+
if (!link) {
|
|
99
|
+
output.info('Not linked to any project.');
|
|
100
|
+
output.info('\nRun `bellwether link` to create or link to a project.');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
output.info('Project Link Status');
|
|
104
|
+
output.info('───────────────────');
|
|
105
|
+
output.info(`Project: ${link.projectName}`);
|
|
106
|
+
output.info(`ID: ${link.projectId}`);
|
|
107
|
+
if (link.teamName) {
|
|
108
|
+
output.info(`Team: ${link.teamName}`);
|
|
109
|
+
}
|
|
110
|
+
if (link.teamId) {
|
|
111
|
+
output.info(`Team ID: ${link.teamId}`);
|
|
112
|
+
}
|
|
113
|
+
output.info(`Linked: ${new Date(link.linkedAt).toLocaleString()}`);
|
|
114
|
+
output.info(`Config: .bellwether/link.json`);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Projects command for listing projects.
|
|
118
|
+
*/
|
|
119
|
+
//# sourceMappingURL=link.js.map
|