@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,554 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Guide Generator
|
|
3
|
+
*
|
|
4
|
+
* Auto-generates migration guides for breaking changes between baselines.
|
|
5
|
+
* Provides step-by-step instructions, code examples, and effort estimates.
|
|
6
|
+
*/
|
|
7
|
+
import { analyzeSchemaChanges, } from './change-impact-analyzer.js';
|
|
8
|
+
import { MIGRATION_GUIDE } from '../constants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Generate a migration guide from two baselines.
|
|
11
|
+
*/
|
|
12
|
+
export function generateMigrationGuide(oldBaseline, newBaseline, diff) {
|
|
13
|
+
const breakingChanges = [];
|
|
14
|
+
const steps = [];
|
|
15
|
+
const warnings = [];
|
|
16
|
+
const changesByType = {};
|
|
17
|
+
let stepNumber = 0;
|
|
18
|
+
// Process removed tools
|
|
19
|
+
const removedTools = diff?.toolsRemoved ?? findRemovedTools(oldBaseline, newBaseline);
|
|
20
|
+
for (const toolName of removedTools) {
|
|
21
|
+
const oldTool = oldBaseline.tools.find(t => t.name === toolName);
|
|
22
|
+
if (oldTool) {
|
|
23
|
+
breakingChanges.push({
|
|
24
|
+
toolName,
|
|
25
|
+
changeType: 'parameter_removed',
|
|
26
|
+
parameterPath: toolName,
|
|
27
|
+
before: oldTool,
|
|
28
|
+
after: null,
|
|
29
|
+
description: `Tool "${toolName}" has been removed`,
|
|
30
|
+
severity: 'breaking',
|
|
31
|
+
});
|
|
32
|
+
steps.push({
|
|
33
|
+
stepNumber: ++stepNumber,
|
|
34
|
+
type: 'tool_removal',
|
|
35
|
+
toolName,
|
|
36
|
+
title: `Remove usage of "${toolName}"`,
|
|
37
|
+
description: `The tool "${toolName}" has been removed from the server. Update all code that calls this tool to use an alternative or remove the functionality.`,
|
|
38
|
+
isBreaking: true,
|
|
39
|
+
codeExamples: generateToolRemovalExamples(toolName),
|
|
40
|
+
});
|
|
41
|
+
changesByType['parameter_removed'] = (changesByType['parameter_removed'] || 0) + 1;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Process added tools (non-breaking, but noteworthy)
|
|
45
|
+
const addedTools = diff?.toolsAdded ?? findAddedTools(oldBaseline, newBaseline);
|
|
46
|
+
for (const toolName of addedTools) {
|
|
47
|
+
const newTool = newBaseline.tools.find(t => t.name === toolName);
|
|
48
|
+
if (newTool) {
|
|
49
|
+
steps.push({
|
|
50
|
+
stepNumber: ++stepNumber,
|
|
51
|
+
type: 'tool_addition',
|
|
52
|
+
toolName,
|
|
53
|
+
title: `New tool available: "${toolName}"`,
|
|
54
|
+
description: `A new tool "${toolName}" is now available. ${newTool.description}`,
|
|
55
|
+
isBreaking: false,
|
|
56
|
+
codeExamples: generateToolAdditionExamples(toolName, newTool.inputSchema),
|
|
57
|
+
});
|
|
58
|
+
changesByType['parameter_added'] = (changesByType['parameter_added'] || 0) + 1;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Process modified tools
|
|
62
|
+
const modifiedToolNames = diff?.toolsModified.map(t => t.tool) ?? findModifiedTools(oldBaseline, newBaseline);
|
|
63
|
+
for (const toolName of modifiedToolNames) {
|
|
64
|
+
const oldTool = oldBaseline.tools.find(t => t.name === toolName);
|
|
65
|
+
const newTool = newBaseline.tools.find(t => t.name === toolName);
|
|
66
|
+
if (oldTool && newTool) {
|
|
67
|
+
const schemaChanges = analyzeSchemaChanges(oldTool.inputSchema, newTool.inputSchema);
|
|
68
|
+
for (const change of schemaChanges) {
|
|
69
|
+
// Track change type
|
|
70
|
+
changesByType[change.type] = (changesByType[change.type] || 0) + 1;
|
|
71
|
+
if (change.breaking) {
|
|
72
|
+
breakingChanges.push({
|
|
73
|
+
toolName,
|
|
74
|
+
changeType: change.type,
|
|
75
|
+
parameterPath: change.parameterPath,
|
|
76
|
+
before: change.before,
|
|
77
|
+
after: change.after,
|
|
78
|
+
description: change.description,
|
|
79
|
+
severity: 'breaking',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// Generate migration step
|
|
83
|
+
const step = generateMigrationStep(toolName, change, ++stepNumber);
|
|
84
|
+
if (step) {
|
|
85
|
+
steps.push(step);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Check for deprecation changes
|
|
89
|
+
if (!oldTool.deprecated && newTool.deprecated) {
|
|
90
|
+
warnings.push(`Tool "${toolName}" has been deprecated. ${newTool.deprecationNotice || ''}`);
|
|
91
|
+
if (newTool.replacementTool) {
|
|
92
|
+
warnings.push(`Consider migrating to "${newTool.replacementTool}".`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Limit steps
|
|
98
|
+
const limitedSteps = steps.slice(0, MIGRATION_GUIDE.MAX_MIGRATION_STEPS);
|
|
99
|
+
if (steps.length > MIGRATION_GUIDE.MAX_MIGRATION_STEPS) {
|
|
100
|
+
warnings.push(`Migration guide truncated: ${steps.length - MIGRATION_GUIDE.MAX_MIGRATION_STEPS} additional steps not shown.`);
|
|
101
|
+
}
|
|
102
|
+
// Calculate effort
|
|
103
|
+
const estimatedEffort = estimateEffort(breakingChanges.length);
|
|
104
|
+
// Generate summary
|
|
105
|
+
const summary = generateSummary(breakingChanges.length, removedTools.length, addedTools.length, estimatedEffort);
|
|
106
|
+
// Generate general code examples
|
|
107
|
+
const codeExamples = generateGeneralExamples(breakingChanges);
|
|
108
|
+
return {
|
|
109
|
+
fromVersion: oldBaseline.version,
|
|
110
|
+
toVersion: newBaseline.version,
|
|
111
|
+
dateRange: {
|
|
112
|
+
from: oldBaseline.createdAt,
|
|
113
|
+
to: newBaseline.createdAt,
|
|
114
|
+
},
|
|
115
|
+
breakingChanges,
|
|
116
|
+
steps: limitedSteps,
|
|
117
|
+
codeExamples,
|
|
118
|
+
estimatedEffort,
|
|
119
|
+
stats: {
|
|
120
|
+
breakingChangesCount: breakingChanges.length,
|
|
121
|
+
toolsAffected: new Set([...removedTools, ...addedTools, ...modifiedToolNames]).size,
|
|
122
|
+
stepsCount: limitedSteps.length,
|
|
123
|
+
changesByType: changesByType,
|
|
124
|
+
},
|
|
125
|
+
summary,
|
|
126
|
+
removedTools,
|
|
127
|
+
addedTools,
|
|
128
|
+
warnings,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Find tools that were removed.
|
|
133
|
+
*/
|
|
134
|
+
function findRemovedTools(oldBaseline, newBaseline) {
|
|
135
|
+
const newToolNames = new Set(newBaseline.tools.map(t => t.name));
|
|
136
|
+
return oldBaseline.tools.filter(t => !newToolNames.has(t.name)).map(t => t.name);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Find tools that were added.
|
|
140
|
+
*/
|
|
141
|
+
function findAddedTools(oldBaseline, newBaseline) {
|
|
142
|
+
const oldToolNames = new Set(oldBaseline.tools.map(t => t.name));
|
|
143
|
+
return newBaseline.tools.filter(t => !oldToolNames.has(t.name)).map(t => t.name);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Find tools that were modified.
|
|
147
|
+
*/
|
|
148
|
+
function findModifiedTools(oldBaseline, newBaseline) {
|
|
149
|
+
const modified = [];
|
|
150
|
+
const oldToolMap = new Map(oldBaseline.tools.map(t => [t.name, t]));
|
|
151
|
+
for (const newTool of newBaseline.tools) {
|
|
152
|
+
const oldTool = oldToolMap.get(newTool.name);
|
|
153
|
+
if (oldTool && oldTool.schemaHash !== newTool.schemaHash) {
|
|
154
|
+
modified.push(newTool.name);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return modified;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Generate a migration step for a schema change.
|
|
161
|
+
*/
|
|
162
|
+
function generateMigrationStep(toolName, change, stepNumber) {
|
|
163
|
+
const { type, parameterPath, before, after, description, breaking } = change;
|
|
164
|
+
switch (type) {
|
|
165
|
+
case 'parameter_removed':
|
|
166
|
+
return {
|
|
167
|
+
stepNumber,
|
|
168
|
+
type: 'remove_parameter',
|
|
169
|
+
toolName,
|
|
170
|
+
parameterPath,
|
|
171
|
+
title: `Remove parameter "${parameterPath}" from ${toolName}`,
|
|
172
|
+
description: `The parameter "${parameterPath}" has been removed. Update all calls to "${toolName}" that use this parameter.`,
|
|
173
|
+
isBreaking: breaking,
|
|
174
|
+
codeExamples: generateParameterRemovalExamples(toolName, parameterPath),
|
|
175
|
+
schemaChange: change,
|
|
176
|
+
};
|
|
177
|
+
case 'parameter_required_added':
|
|
178
|
+
return {
|
|
179
|
+
stepNumber,
|
|
180
|
+
type: 'add_parameter',
|
|
181
|
+
toolName,
|
|
182
|
+
parameterPath,
|
|
183
|
+
title: `Add required parameter "${parameterPath}" to ${toolName}`,
|
|
184
|
+
description: `A new required parameter "${parameterPath}" has been added. All calls to "${toolName}" must now include this parameter.`,
|
|
185
|
+
isBreaking: breaking,
|
|
186
|
+
codeExamples: generateRequiredParameterExamples(toolName, parameterPath, after),
|
|
187
|
+
schemaChange: change,
|
|
188
|
+
};
|
|
189
|
+
case 'parameter_added':
|
|
190
|
+
return {
|
|
191
|
+
stepNumber,
|
|
192
|
+
type: 'add_parameter',
|
|
193
|
+
toolName,
|
|
194
|
+
parameterPath,
|
|
195
|
+
title: `New optional parameter "${parameterPath}" available for ${toolName}`,
|
|
196
|
+
description: `A new optional parameter "${parameterPath}" is now available. You can use it to ${description.toLowerCase()}.`,
|
|
197
|
+
isBreaking: false,
|
|
198
|
+
codeExamples: [],
|
|
199
|
+
schemaChange: change,
|
|
200
|
+
};
|
|
201
|
+
case 'parameter_type_changed':
|
|
202
|
+
return {
|
|
203
|
+
stepNumber,
|
|
204
|
+
type: 'change_type',
|
|
205
|
+
toolName,
|
|
206
|
+
parameterPath,
|
|
207
|
+
title: `Update type of "${parameterPath}" in ${toolName}`,
|
|
208
|
+
description: `The type of "${parameterPath}" has changed from ${before} to ${after}. Update all values passed to this parameter.`,
|
|
209
|
+
isBreaking: breaking,
|
|
210
|
+
codeExamples: generateTypeChangeExamples(toolName, parameterPath, before, after),
|
|
211
|
+
schemaChange: change,
|
|
212
|
+
};
|
|
213
|
+
case 'enum_value_removed':
|
|
214
|
+
return {
|
|
215
|
+
stepNumber,
|
|
216
|
+
type: 'update_enum',
|
|
217
|
+
toolName,
|
|
218
|
+
parameterPath,
|
|
219
|
+
title: `Update enum values for "${parameterPath}" in ${toolName}`,
|
|
220
|
+
description: `The enum value "${before}" has been removed from "${parameterPath}". Update any code using this value.`,
|
|
221
|
+
isBreaking: breaking,
|
|
222
|
+
codeExamples: generateEnumChangeExamples(toolName, parameterPath, before),
|
|
223
|
+
schemaChange: change,
|
|
224
|
+
};
|
|
225
|
+
case 'constraint_tightened':
|
|
226
|
+
return {
|
|
227
|
+
stepNumber,
|
|
228
|
+
type: 'update_constraint',
|
|
229
|
+
toolName,
|
|
230
|
+
parameterPath,
|
|
231
|
+
title: `Update values for "${parameterPath}" in ${toolName}`,
|
|
232
|
+
description: `The constraint for "${parameterPath}" has been tightened. Ensure all values meet the new constraint: ${after}.`,
|
|
233
|
+
isBreaking: breaking,
|
|
234
|
+
codeExamples: [],
|
|
235
|
+
schemaChange: change,
|
|
236
|
+
};
|
|
237
|
+
default:
|
|
238
|
+
// For non-critical changes, return a generic step
|
|
239
|
+
if (breaking) {
|
|
240
|
+
return {
|
|
241
|
+
stepNumber,
|
|
242
|
+
type: 'update_constraint',
|
|
243
|
+
toolName,
|
|
244
|
+
parameterPath,
|
|
245
|
+
title: `Update "${parameterPath}" in ${toolName}`,
|
|
246
|
+
description,
|
|
247
|
+
isBreaking: true,
|
|
248
|
+
codeExamples: [],
|
|
249
|
+
schemaChange: change,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Estimate migration effort based on breaking changes.
|
|
257
|
+
*/
|
|
258
|
+
function estimateEffort(breakingCount) {
|
|
259
|
+
if (breakingCount <= MIGRATION_GUIDE.EFFORT_THRESHOLDS.trivial) {
|
|
260
|
+
return 'trivial';
|
|
261
|
+
}
|
|
262
|
+
if (breakingCount <= MIGRATION_GUIDE.EFFORT_THRESHOLDS.minor) {
|
|
263
|
+
return 'minor';
|
|
264
|
+
}
|
|
265
|
+
if (breakingCount <= MIGRATION_GUIDE.EFFORT_THRESHOLDS.moderate) {
|
|
266
|
+
return 'moderate';
|
|
267
|
+
}
|
|
268
|
+
return 'major';
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Generate summary text.
|
|
272
|
+
*/
|
|
273
|
+
function generateSummary(breakingCount, removedCount, addedCount, effort) {
|
|
274
|
+
const parts = [];
|
|
275
|
+
if (breakingCount === 0) {
|
|
276
|
+
parts.push('This migration contains no breaking changes.');
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
parts.push(`This migration contains ${breakingCount} breaking change(s).`);
|
|
280
|
+
}
|
|
281
|
+
if (removedCount > 0) {
|
|
282
|
+
parts.push(`${removedCount} tool(s) have been removed.`);
|
|
283
|
+
}
|
|
284
|
+
if (addedCount > 0) {
|
|
285
|
+
parts.push(`${addedCount} new tool(s) are available.`);
|
|
286
|
+
}
|
|
287
|
+
parts.push(`Estimated effort: ${effort.toUpperCase()}.`);
|
|
288
|
+
return parts.join(' ');
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Generate examples for tool removal.
|
|
292
|
+
*/
|
|
293
|
+
function generateToolRemovalExamples(toolName) {
|
|
294
|
+
return [{
|
|
295
|
+
language: 'typescript',
|
|
296
|
+
title: `Remove calls to ${toolName}`,
|
|
297
|
+
before: `// Old code using the removed tool
|
|
298
|
+
const result = await mcp.callTool('${toolName}', {
|
|
299
|
+
param: 'value'
|
|
300
|
+
});`,
|
|
301
|
+
after: `// The tool has been removed
|
|
302
|
+
// Option 1: Remove the functionality
|
|
303
|
+
// Option 2: Use an alternative tool if available
|
|
304
|
+
// Option 3: Implement the functionality differently`,
|
|
305
|
+
}];
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Generate examples for tool addition.
|
|
309
|
+
*/
|
|
310
|
+
function generateToolAdditionExamples(toolName, schema) {
|
|
311
|
+
const params = schema?.properties
|
|
312
|
+
? Object.keys(schema.properties).slice(0, 3).join(', ')
|
|
313
|
+
: 'param1, param2';
|
|
314
|
+
return [{
|
|
315
|
+
language: 'typescript',
|
|
316
|
+
title: `Use the new ${toolName} tool`,
|
|
317
|
+
before: `// Tool was not available before`,
|
|
318
|
+
after: `// New tool is now available
|
|
319
|
+
const result = await mcp.callTool('${toolName}', {
|
|
320
|
+
${params.split(', ').map(p => `${p}: /* value */`).join(',\n ')}
|
|
321
|
+
});`,
|
|
322
|
+
}];
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Generate examples for parameter removal.
|
|
326
|
+
*/
|
|
327
|
+
function generateParameterRemovalExamples(toolName, parameterPath) {
|
|
328
|
+
return [{
|
|
329
|
+
language: 'typescript',
|
|
330
|
+
title: `Remove "${parameterPath}" from ${toolName} calls`,
|
|
331
|
+
before: `const result = await mcp.callTool('${toolName}', {
|
|
332
|
+
${parameterPath}: 'value', // This parameter is being removed
|
|
333
|
+
otherParam: 'other'
|
|
334
|
+
});`,
|
|
335
|
+
after: `const result = await mcp.callTool('${toolName}', {
|
|
336
|
+
// ${parameterPath} has been removed
|
|
337
|
+
otherParam: 'other'
|
|
338
|
+
});`,
|
|
339
|
+
}];
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Generate examples for required parameter addition.
|
|
343
|
+
*/
|
|
344
|
+
function generateRequiredParameterExamples(toolName, parameterPath, newSchema) {
|
|
345
|
+
const typeHint = typeof newSchema === 'object' && newSchema !== null && 'type' in newSchema
|
|
346
|
+
? newSchema.type
|
|
347
|
+
: 'string';
|
|
348
|
+
return [{
|
|
349
|
+
language: 'typescript',
|
|
350
|
+
title: `Add required "${parameterPath}" to ${toolName} calls`,
|
|
351
|
+
before: `const result = await mcp.callTool('${toolName}', {
|
|
352
|
+
existingParam: 'value'
|
|
353
|
+
});`,
|
|
354
|
+
after: `const result = await mcp.callTool('${toolName}', {
|
|
355
|
+
existingParam: 'value',
|
|
356
|
+
${parameterPath}: /* ${typeHint} - REQUIRED */
|
|
357
|
+
});`,
|
|
358
|
+
}];
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Generate examples for type changes.
|
|
362
|
+
*/
|
|
363
|
+
function generateTypeChangeExamples(toolName, parameterPath, oldType, newType) {
|
|
364
|
+
return [{
|
|
365
|
+
language: 'typescript',
|
|
366
|
+
title: `Update "${parameterPath}" type in ${toolName} calls`,
|
|
367
|
+
before: `const result = await mcp.callTool('${toolName}', {
|
|
368
|
+
${parameterPath}: /* ${oldType} */
|
|
369
|
+
});`,
|
|
370
|
+
after: `const result = await mcp.callTool('${toolName}', {
|
|
371
|
+
${parameterPath}: /* ${newType} - type changed! */
|
|
372
|
+
});`,
|
|
373
|
+
}];
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Generate examples for enum changes.
|
|
377
|
+
*/
|
|
378
|
+
function generateEnumChangeExamples(toolName, parameterPath, removedValue) {
|
|
379
|
+
return [{
|
|
380
|
+
language: 'typescript',
|
|
381
|
+
title: `Update enum value for "${parameterPath}" in ${toolName}`,
|
|
382
|
+
before: `const result = await mcp.callTool('${toolName}', {
|
|
383
|
+
${parameterPath}: '${removedValue}' // This value is no longer valid
|
|
384
|
+
});`,
|
|
385
|
+
after: `const result = await mcp.callTool('${toolName}', {
|
|
386
|
+
${parameterPath}: /* use a different valid value */
|
|
387
|
+
});`,
|
|
388
|
+
}];
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Generate general code examples based on breaking changes.
|
|
392
|
+
*/
|
|
393
|
+
function generateGeneralExamples(breakingChanges) {
|
|
394
|
+
const examples = [];
|
|
395
|
+
// Group by tool
|
|
396
|
+
const byTool = new Map();
|
|
397
|
+
for (const change of breakingChanges) {
|
|
398
|
+
const existing = byTool.get(change.toolName) || [];
|
|
399
|
+
existing.push(change);
|
|
400
|
+
byTool.set(change.toolName, existing);
|
|
401
|
+
}
|
|
402
|
+
// Generate combined example for tools with multiple changes
|
|
403
|
+
for (const [toolName, changes] of byTool) {
|
|
404
|
+
if (changes.length > 1 && examples.length < MIGRATION_GUIDE.MAX_CODE_EXAMPLES_PER_STEP) {
|
|
405
|
+
const beforeParams = changes.map(c => ` ${c.parameterPath}: /* old */`).join(',\n');
|
|
406
|
+
const afterParams = changes.map(c => ` ${c.parameterPath}: /* updated */`).join(',\n');
|
|
407
|
+
examples.push({
|
|
408
|
+
language: 'typescript',
|
|
409
|
+
title: `Update multiple parameters in ${toolName}`,
|
|
410
|
+
before: `const result = await mcp.callTool('${toolName}', {\n${beforeParams}\n});`,
|
|
411
|
+
after: `const result = await mcp.callTool('${toolName}', {\n${afterParams}\n});`,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return examples;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Format migration guide as markdown.
|
|
419
|
+
*/
|
|
420
|
+
export function formatMigrationGuideMarkdown(guide) {
|
|
421
|
+
const lines = [];
|
|
422
|
+
lines.push(`# Migration Guide: ${guide.fromVersion} → ${guide.toVersion}`);
|
|
423
|
+
lines.push('');
|
|
424
|
+
lines.push(`**Date Range:** ${guide.dateRange.from.toISOString().split('T')[0]} to ${guide.dateRange.to.toISOString().split('T')[0]}`);
|
|
425
|
+
lines.push(`**Estimated Effort:** ${guide.estimatedEffort.toUpperCase()}`);
|
|
426
|
+
lines.push('');
|
|
427
|
+
lines.push('## Summary');
|
|
428
|
+
lines.push('');
|
|
429
|
+
lines.push(guide.summary);
|
|
430
|
+
lines.push('');
|
|
431
|
+
// Statistics
|
|
432
|
+
lines.push('## Statistics');
|
|
433
|
+
lines.push('');
|
|
434
|
+
lines.push(`- **Breaking Changes:** ${guide.stats.breakingChangesCount}`);
|
|
435
|
+
lines.push(`- **Tools Affected:** ${guide.stats.toolsAffected}`);
|
|
436
|
+
lines.push(`- **Migration Steps:** ${guide.stats.stepsCount}`);
|
|
437
|
+
lines.push('');
|
|
438
|
+
// Warnings
|
|
439
|
+
if (guide.warnings.length > 0) {
|
|
440
|
+
lines.push('## ⚠️ Warnings');
|
|
441
|
+
lines.push('');
|
|
442
|
+
for (const warning of guide.warnings) {
|
|
443
|
+
lines.push(`- ${warning}`);
|
|
444
|
+
}
|
|
445
|
+
lines.push('');
|
|
446
|
+
}
|
|
447
|
+
// Breaking changes
|
|
448
|
+
if (guide.breakingChanges.length > 0) {
|
|
449
|
+
lines.push('## Breaking Changes');
|
|
450
|
+
lines.push('');
|
|
451
|
+
for (const change of guide.breakingChanges) {
|
|
452
|
+
lines.push(`### ${change.toolName}: ${change.parameterPath}`);
|
|
453
|
+
lines.push('');
|
|
454
|
+
lines.push(`**Type:** ${change.changeType}`);
|
|
455
|
+
lines.push('');
|
|
456
|
+
lines.push(change.description);
|
|
457
|
+
lines.push('');
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
// Migration steps
|
|
461
|
+
if (guide.steps.length > 0) {
|
|
462
|
+
lines.push('## Migration Steps');
|
|
463
|
+
lines.push('');
|
|
464
|
+
for (const step of guide.steps) {
|
|
465
|
+
const breakingBadge = step.isBreaking ? ' ⚠️' : '';
|
|
466
|
+
lines.push(`### Step ${step.stepNumber}: ${step.title}${breakingBadge}`);
|
|
467
|
+
lines.push('');
|
|
468
|
+
lines.push(step.description);
|
|
469
|
+
lines.push('');
|
|
470
|
+
for (const example of step.codeExamples) {
|
|
471
|
+
lines.push(`**${example.title}**`);
|
|
472
|
+
lines.push('');
|
|
473
|
+
lines.push('Before:');
|
|
474
|
+
lines.push('```' + example.language);
|
|
475
|
+
lines.push(example.before);
|
|
476
|
+
lines.push('```');
|
|
477
|
+
lines.push('');
|
|
478
|
+
lines.push('After:');
|
|
479
|
+
lines.push('```' + example.language);
|
|
480
|
+
lines.push(example.after);
|
|
481
|
+
lines.push('```');
|
|
482
|
+
lines.push('');
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
// Added tools
|
|
487
|
+
if (guide.addedTools.length > 0) {
|
|
488
|
+
lines.push('## New Tools Available');
|
|
489
|
+
lines.push('');
|
|
490
|
+
for (const tool of guide.addedTools) {
|
|
491
|
+
lines.push(`- \`${tool}\``);
|
|
492
|
+
}
|
|
493
|
+
lines.push('');
|
|
494
|
+
}
|
|
495
|
+
// Removed tools
|
|
496
|
+
if (guide.removedTools.length > 0) {
|
|
497
|
+
lines.push('## Removed Tools');
|
|
498
|
+
lines.push('');
|
|
499
|
+
for (const tool of guide.removedTools) {
|
|
500
|
+
lines.push(`- \`${tool}\``);
|
|
501
|
+
}
|
|
502
|
+
lines.push('');
|
|
503
|
+
}
|
|
504
|
+
return lines.join('\n');
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Format migration guide for console output.
|
|
508
|
+
*/
|
|
509
|
+
export function formatMigrationGuideText(guide) {
|
|
510
|
+
const lines = [];
|
|
511
|
+
lines.push(`Migration Guide: ${guide.fromVersion} → ${guide.toVersion}`);
|
|
512
|
+
lines.push('═'.repeat(60));
|
|
513
|
+
lines.push('');
|
|
514
|
+
lines.push(guide.summary);
|
|
515
|
+
lines.push('');
|
|
516
|
+
lines.push(`Estimated Effort: ${guide.estimatedEffort.toUpperCase()}`);
|
|
517
|
+
lines.push(`Breaking Changes: ${guide.stats.breakingChangesCount}`);
|
|
518
|
+
lines.push(`Tools Affected: ${guide.stats.toolsAffected}`);
|
|
519
|
+
lines.push('');
|
|
520
|
+
if (guide.warnings.length > 0) {
|
|
521
|
+
lines.push('Warnings:');
|
|
522
|
+
for (const warning of guide.warnings) {
|
|
523
|
+
lines.push(` ⚠️ ${warning}`);
|
|
524
|
+
}
|
|
525
|
+
lines.push('');
|
|
526
|
+
}
|
|
527
|
+
if (guide.steps.length > 0) {
|
|
528
|
+
lines.push('Migration Steps:');
|
|
529
|
+
lines.push('─'.repeat(40));
|
|
530
|
+
for (const step of guide.steps.filter(s => s.isBreaking)) {
|
|
531
|
+
const icon = step.isBreaking ? '!' : ' ';
|
|
532
|
+
lines.push(` ${icon} Step ${step.stepNumber}: ${step.title}`);
|
|
533
|
+
}
|
|
534
|
+
lines.push('');
|
|
535
|
+
}
|
|
536
|
+
return lines.join('\n');
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Check if a migration guide contains breaking changes that require action.
|
|
540
|
+
*/
|
|
541
|
+
export function hasBreakingMigrationChanges(guide) {
|
|
542
|
+
return guide.breakingChanges.length > 0;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Get breaking tools from guide.
|
|
546
|
+
*/
|
|
547
|
+
export function getBreakingTools(guide) {
|
|
548
|
+
const tools = new Set();
|
|
549
|
+
for (const change of guide.breakingChanges) {
|
|
550
|
+
tools.add(change.toolName);
|
|
551
|
+
}
|
|
552
|
+
return Array.from(tools);
|
|
553
|
+
}
|
|
554
|
+
//# sourceMappingURL=migration-generator.js.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline format migrations.
|
|
3
|
+
*
|
|
4
|
+
* This module handles upgrading baselines from older CLI versions to the current version.
|
|
5
|
+
* Migrations are triggered when the CLI major version changes.
|
|
6
|
+
*
|
|
7
|
+
* Migration Strategy:
|
|
8
|
+
* - Migrations are keyed by their TARGET major version
|
|
9
|
+
* - Each migration upgrades from the previous major version
|
|
10
|
+
* - Migrations are applied sequentially in version order
|
|
11
|
+
* - Downgrading is not supported
|
|
12
|
+
*/
|
|
13
|
+
import type { BehavioralBaseline } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Check if a baseline can be migrated to the current CLI version.
|
|
16
|
+
*
|
|
17
|
+
* Migration is possible if:
|
|
18
|
+
* - Source version has a different major version than current
|
|
19
|
+
* - A migration path exists
|
|
20
|
+
*
|
|
21
|
+
* @param fromVersion - Source version (string, number, or undefined)
|
|
22
|
+
* @returns true if migration is possible
|
|
23
|
+
*/
|
|
24
|
+
export declare function canMigrate(fromVersion: string | number | undefined): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get the list of migrations that would be applied.
|
|
27
|
+
*
|
|
28
|
+
* @param fromVersion - Source version
|
|
29
|
+
* @returns Array of major version strings for migrations that would be applied
|
|
30
|
+
*/
|
|
31
|
+
export declare function getMigrationsToApply(fromVersion: string | number | undefined): string[];
|
|
32
|
+
/**
|
|
33
|
+
* Migrate a baseline to the current CLI version format.
|
|
34
|
+
*
|
|
35
|
+
* @param baseline - The baseline object to migrate (can be any version)
|
|
36
|
+
* @returns Migrated baseline conforming to BehavioralBaseline interface
|
|
37
|
+
* @throws Error if migration is not possible (e.g., downgrade attempt)
|
|
38
|
+
*/
|
|
39
|
+
export declare function migrateBaseline(baseline: Record<string, unknown>): BehavioralBaseline;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a baseline needs migration.
|
|
42
|
+
*
|
|
43
|
+
* @param baseline - The baseline to check
|
|
44
|
+
* @returns true if the baseline major version differs from current CLI major version
|
|
45
|
+
*/
|
|
46
|
+
export declare function needsMigration(baseline: Record<string, unknown>): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Get information about what migrations would be applied.
|
|
49
|
+
*
|
|
50
|
+
* @param baseline - The baseline to analyze
|
|
51
|
+
* @returns Object with migration details
|
|
52
|
+
*/
|
|
53
|
+
export declare function getMigrationInfo(baseline: Record<string, unknown>): {
|
|
54
|
+
currentVersion: string;
|
|
55
|
+
targetVersion: string;
|
|
56
|
+
needsMigration: boolean;
|
|
57
|
+
migrationsToApply: string[];
|
|
58
|
+
canMigrate: boolean;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=migrations.d.ts.map
|