@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,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init command - creates a bellwether.yaml configuration file.
|
|
3
|
+
*
|
|
4
|
+
* The generated config includes ALL possible options with comments,
|
|
5
|
+
* making it self-documenting. Users can customize by editing the file.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { writeFileSync, existsSync, readFileSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import * as readline from 'readline';
|
|
11
|
+
import { generateConfigTemplate, generatePresetConfig, PRESETS } from '../../config/template.js';
|
|
12
|
+
import { CONFIG_DEFAULTS } from '../../config/defaults.js';
|
|
13
|
+
import { EXIT_CODES, PATHS } from '../../constants.js';
|
|
14
|
+
import * as output from '../output.js';
|
|
15
|
+
/**
|
|
16
|
+
* Detect environment variables from .env.example or .env.sample files.
|
|
17
|
+
* Returns an array of variable names found.
|
|
18
|
+
*/
|
|
19
|
+
function detectEnvVars(cwd) {
|
|
20
|
+
const envExampleFiles = [
|
|
21
|
+
'.env.example',
|
|
22
|
+
'.env.sample',
|
|
23
|
+
'env.example',
|
|
24
|
+
'env.sample',
|
|
25
|
+
];
|
|
26
|
+
for (const filename of envExampleFiles) {
|
|
27
|
+
const filepath = join(cwd, filename);
|
|
28
|
+
if (existsSync(filepath)) {
|
|
29
|
+
try {
|
|
30
|
+
const content = readFileSync(filepath, 'utf-8');
|
|
31
|
+
const envVars = [];
|
|
32
|
+
for (const line of content.split('\n')) {
|
|
33
|
+
// Skip comments and empty lines
|
|
34
|
+
const trimmed = line.trim();
|
|
35
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Parse VAR=value or VAR= patterns
|
|
39
|
+
const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=/i);
|
|
40
|
+
if (match) {
|
|
41
|
+
envVars.push(match[1]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return envVars;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Ignore read errors
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Prompt for user input.
|
|
55
|
+
*/
|
|
56
|
+
async function prompt(question) {
|
|
57
|
+
const rl = readline.createInterface({
|
|
58
|
+
input: process.stdin,
|
|
59
|
+
output: process.stdout,
|
|
60
|
+
});
|
|
61
|
+
return new Promise((resolve) => {
|
|
62
|
+
rl.question(question, (answer) => {
|
|
63
|
+
rl.close();
|
|
64
|
+
resolve(answer.trim());
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
export const initCommand = new Command('init')
|
|
69
|
+
.description('Initialize a bellwether.yaml configuration file')
|
|
70
|
+
.argument('[server-command]', 'MCP server command (e.g., "npx @mcp/server")')
|
|
71
|
+
.option('-f, --force', 'Overwrite existing config file')
|
|
72
|
+
.option('--preset <name>', `Use a preset configuration (${Object.keys(PRESETS).join(', ')})`)
|
|
73
|
+
.option('--provider <provider>', 'LLM provider for explore command (ollama, openai, anthropic)', CONFIG_DEFAULTS.llm.provider)
|
|
74
|
+
.option('-y, --yes', 'Skip prompts, use defaults')
|
|
75
|
+
.action(async (serverCommandArg, options) => {
|
|
76
|
+
const configPath = join(process.cwd(), PATHS.DEFAULT_CONFIG_FILENAME);
|
|
77
|
+
// Check for existing config
|
|
78
|
+
if (existsSync(configPath) && !options.force) {
|
|
79
|
+
output.error(`Config file already exists: ${configPath}`);
|
|
80
|
+
output.error('Use --force to overwrite.');
|
|
81
|
+
process.exit(EXIT_CODES.ERROR);
|
|
82
|
+
}
|
|
83
|
+
// Validate preset if provided
|
|
84
|
+
if (options.preset && !PRESETS[options.preset]) {
|
|
85
|
+
output.error(`Unknown preset: ${options.preset}`);
|
|
86
|
+
output.error(`Available presets: ${Object.keys(PRESETS).join(', ')}`);
|
|
87
|
+
process.exit(EXIT_CODES.ERROR);
|
|
88
|
+
}
|
|
89
|
+
// Determine server command
|
|
90
|
+
let serverCommand = '';
|
|
91
|
+
let serverArgs = [];
|
|
92
|
+
// Parse server command argument if provided
|
|
93
|
+
if (serverCommandArg) {
|
|
94
|
+
const parts = serverCommandArg.split(/\s+/);
|
|
95
|
+
serverCommand = parts[0];
|
|
96
|
+
serverArgs = parts.slice(1);
|
|
97
|
+
}
|
|
98
|
+
// If no server command and not using --yes, prompt for it
|
|
99
|
+
if (!serverCommand && !options.yes && process.stdin.isTTY) {
|
|
100
|
+
output.info('Bellwether Configuration Setup');
|
|
101
|
+
output.info('==============================');
|
|
102
|
+
output.newline();
|
|
103
|
+
const answer = await prompt('MCP server command (press Enter to skip): ');
|
|
104
|
+
if (answer) {
|
|
105
|
+
// Parse command and args
|
|
106
|
+
const parts = answer.split(/\s+/);
|
|
107
|
+
serverCommand = parts[0];
|
|
108
|
+
serverArgs = parts.slice(1);
|
|
109
|
+
}
|
|
110
|
+
output.newline();
|
|
111
|
+
}
|
|
112
|
+
// Detect environment variables from .env.example
|
|
113
|
+
const envVars = detectEnvVars(process.cwd());
|
|
114
|
+
// Generate config content
|
|
115
|
+
let content;
|
|
116
|
+
if (options.preset) {
|
|
117
|
+
content = generatePresetConfig(options.preset, {
|
|
118
|
+
serverCommand,
|
|
119
|
+
serverArgs,
|
|
120
|
+
envVars,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
content = generateConfigTemplate({
|
|
125
|
+
serverCommand,
|
|
126
|
+
serverArgs,
|
|
127
|
+
provider: options.provider,
|
|
128
|
+
envVars,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
// Write config file
|
|
132
|
+
writeFileSync(configPath, content);
|
|
133
|
+
// Show success message
|
|
134
|
+
output.success(`Created: ${configPath}`);
|
|
135
|
+
output.newline();
|
|
136
|
+
// Show info about detected env vars
|
|
137
|
+
if (envVars.length > 0) {
|
|
138
|
+
output.info(`Detected ${envVars.length} environment variable(s) from .env.example:`);
|
|
139
|
+
output.info(` ${envVars.join(', ')}`);
|
|
140
|
+
output.newline();
|
|
141
|
+
output.info('These have been added to bellwether.yaml with ${VAR} interpolation syntax.');
|
|
142
|
+
output.info('Make sure to set these in your environment or .env file before running commands.');
|
|
143
|
+
output.newline();
|
|
144
|
+
}
|
|
145
|
+
// Show guidance for using both commands
|
|
146
|
+
output.info('Configuration created for bellwether check and explore commands.');
|
|
147
|
+
output.newline();
|
|
148
|
+
output.info('Next steps:');
|
|
149
|
+
if (!serverCommand) {
|
|
150
|
+
output.info(' 1. Edit bellwether.yaml and set your server command:');
|
|
151
|
+
output.info(' server:');
|
|
152
|
+
output.info(' command: "npx @your/mcp-server"');
|
|
153
|
+
output.newline();
|
|
154
|
+
}
|
|
155
|
+
const step = serverCommand ? 1 : 2;
|
|
156
|
+
output.info(` ${step}. Run schema validation (free, fast, no LLM):`);
|
|
157
|
+
output.info(' bellwether check');
|
|
158
|
+
output.newline();
|
|
159
|
+
output.info(` ${step + 1}. Save a baseline for drift detection:`);
|
|
160
|
+
output.info(' bellwether baseline save');
|
|
161
|
+
output.newline();
|
|
162
|
+
output.info(` ${step + 2}. Run LLM-powered behavioral exploration:`);
|
|
163
|
+
output.info(' bellwether explore');
|
|
164
|
+
output.newline();
|
|
165
|
+
// Show LLM setup instructions based on provider
|
|
166
|
+
const provider = options.preset ? PRESETS[options.preset].provider : options.provider;
|
|
167
|
+
if (provider === 'ollama') {
|
|
168
|
+
output.info('For explore command, ensure Ollama is running:');
|
|
169
|
+
output.info(' ollama serve');
|
|
170
|
+
output.info(' ollama pull qwen3:8b');
|
|
171
|
+
}
|
|
172
|
+
else if (provider === 'openai') {
|
|
173
|
+
output.info('For explore command, set up your OpenAI API key:');
|
|
174
|
+
output.info(' bellwether auth');
|
|
175
|
+
output.info(' # or: export OPENAI_API_KEY=sk-xxx');
|
|
176
|
+
}
|
|
177
|
+
else if (provider === 'anthropic') {
|
|
178
|
+
output.info('For explore command, set up your Anthropic API key:');
|
|
179
|
+
output.info(' bellwether auth');
|
|
180
|
+
output.info(' # or: export ANTHROPIC_API_KEY=sk-ant-xxx');
|
|
181
|
+
}
|
|
182
|
+
// Show env var hint only if no env vars were auto-detected
|
|
183
|
+
if (envVars.length === 0) {
|
|
184
|
+
output.newline();
|
|
185
|
+
output.info('Note: If your server requires environment variables, add them to bellwether.yaml:');
|
|
186
|
+
output.info(' server:');
|
|
187
|
+
output.info(' env:');
|
|
188
|
+
output.info(' MY_VAR: "${MY_VAR}" # pulls from .env or shell');
|
|
189
|
+
}
|
|
190
|
+
output.newline();
|
|
191
|
+
output.info('For more information: https://docs.bellwether.sh');
|
|
192
|
+
// Show preset-specific info
|
|
193
|
+
if (options.preset) {
|
|
194
|
+
output.newline();
|
|
195
|
+
output.info(`Preset "${options.preset}" applied:`);
|
|
196
|
+
switch (options.preset) {
|
|
197
|
+
case 'ci':
|
|
198
|
+
output.info(' - Optimized for bellwether check in CI/CD');
|
|
199
|
+
output.info(' - Fails on drift detection');
|
|
200
|
+
output.info(' - Minimal logging');
|
|
201
|
+
break;
|
|
202
|
+
case 'security':
|
|
203
|
+
output.info(' - Optimized for bellwether explore with security focus');
|
|
204
|
+
output.info(' - Multiple personas (technical, security, QA)');
|
|
205
|
+
output.info(' - 5 questions per tool');
|
|
206
|
+
break;
|
|
207
|
+
case 'thorough':
|
|
208
|
+
output.info(' - Optimized for bellwether explore with all personas');
|
|
209
|
+
output.info(' - Parallel persona execution');
|
|
210
|
+
output.info(' - Workflow discovery enabled');
|
|
211
|
+
break;
|
|
212
|
+
case 'local':
|
|
213
|
+
output.info(' - Optimized for bellwether explore with local Ollama');
|
|
214
|
+
output.info(' - Free, private, no API keys');
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
//# sourceMappingURL=init.js.map
|