@documentation-robotics/cli 0.2.0 → 0.4.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/README.md +46 -16
- package/dist/analysis/relationship-classifier.js +2 -9
- package/dist/analysis/relationship-classifier.js.map +2 -2
- package/dist/analyzers/active-analyzer.js +62 -0
- package/dist/analyzers/active-analyzer.js.map +7 -0
- package/dist/analyzers/call-graph-utils.js +2 -2
- package/dist/analyzers/call-graph-utils.js.map +2 -2
- package/dist/analyzers/cards/build.js +191 -0
- package/dist/analyzers/cards/build.js.map +7 -0
- package/dist/analyzers/cards/classify.js +42 -0
- package/dist/analyzers/cards/classify.js.map +7 -0
- package/dist/analyzers/cards/edge-index.js +44 -0
- package/dist/analyzers/cards/edge-index.js.map +7 -0
- package/dist/analyzers/cards/extract.js +138 -0
- package/dist/analyzers/cards/extract.js.map +7 -0
- package/dist/analyzers/cards/facts.js +46 -0
- package/dist/analyzers/cards/facts.js.map +7 -0
- package/dist/analyzers/cards/graph.js +42 -0
- package/dist/analyzers/cards/graph.js.map +7 -0
- package/dist/analyzers/cards/index.js +8 -0
- package/dist/analyzers/cards/index.js.map +7 -0
- package/dist/analyzers/cards/routes.js +96 -0
- package/dist/analyzers/cards/routes.js.map +7 -0
- package/dist/analyzers/cards/tier0.js +18 -0
- package/dist/analyzers/cards/tier0.js.map +7 -0
- package/dist/analyzers/cards/types.js +1 -0
- package/dist/analyzers/cards/types.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +270 -174
- package/dist/analyzers/cbm-analyzer.js.map +2 -2
- package/dist/analyzers/cbm-responses.js +342 -0
- package/dist/analyzers/cbm-responses.js.map +7 -0
- package/dist/analyzers/code-changes.js +159 -0
- package/dist/analyzers/code-changes.js.map +7 -0
- package/dist/analyzers/edge-relationships.js +49 -0
- package/dist/analyzers/edge-relationships.js.map +7 -0
- package/dist/analyzers/extraction-plan.js +541 -0
- package/dist/analyzers/extraction-plan.js.map +7 -0
- package/dist/analyzers/index-job.js +229 -0
- package/dist/analyzers/index-job.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +9 -0
- package/dist/analyzers/mapping-loader.js.map +2 -2
- package/dist/analyzers/tier0-rules.js +153 -0
- package/dist/analyzers/tier0-rules.js.map +7 -0
- package/dist/analyzers/types.js.map +1 -1
- package/dist/audit/relationships/ai/prompts.js +10 -10
- package/dist/audit/relationships/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/analysis/layer-templates.js +52 -52
- package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
- package/dist/cli.js +23 -11
- package/dist/cli.js.map +2 -2
- package/dist/coding-agents/default-permissions.js +31 -1
- package/dist/coding-agents/default-permissions.js.map +2 -2
- package/dist/coding-agents/drbot-mcp.js +269 -0
- package/dist/coding-agents/drbot-mcp.js.map +7 -0
- package/dist/commands/add.js +7 -4
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +143 -40
- package/dist/commands/analyzer.js.map +2 -2
- package/dist/commands/changeset-verify.js +63 -0
- package/dist/commands/changeset-verify.js.map +7 -0
- package/dist/commands/changeset.js +80 -29
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/delete.js +10 -4
- package/dist/commands/delete.js.map +2 -2
- package/dist/commands/farm.js +176 -60
- package/dist/commands/farm.js.map +2 -2
- package/dist/commands/init.js +9 -26
- package/dist/commands/init.js.map +2 -2
- package/dist/commands/mcp.js +40 -21
- package/dist/commands/mcp.js.map +3 -3
- package/dist/commands/relationship.js +208 -37
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/reports.js +3 -3
- package/dist/commands/reports.js.map +2 -2
- package/dist/commands/update.js +52 -32
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +99 -103
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/validate.js +19 -3
- package/dist/commands/validate.js.map +2 -2
- package/dist/commands/version.js +1 -1
- package/dist/commands/visualize.js +34 -15
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/annotation-store.js +15 -5
- package/dist/core/annotation-store.js.map +2 -2
- package/dist/core/catalog-migration.js +34 -0
- package/dist/core/catalog-migration.js.map +7 -0
- package/dist/core/changeset-analysis.js +421 -0
- package/dist/core/changeset-analysis.js.map +7 -0
- package/dist/core/changeset-base-index.js +160 -0
- package/dist/core/changeset-base-index.js.map +7 -0
- package/dist/core/changeset-brief-compact.js +256 -0
- package/dist/core/changeset-brief-compact.js.map +7 -0
- package/dist/core/changeset-brief-delta.js +102 -0
- package/dist/core/changeset-brief-delta.js.map +7 -0
- package/dist/core/changeset-graph.js +281 -0
- package/dist/core/changeset-graph.js.map +7 -0
- package/dist/core/changeset-only-guard.js +32 -0
- package/dist/core/changeset-only-guard.js.map +7 -0
- package/dist/core/changeset-summary.js +68 -0
- package/dist/core/changeset-summary.js.map +7 -0
- package/dist/core/changeset-validator.js +66 -20
- package/dist/core/changeset-validator.js.map +2 -2
- package/dist/core/changeset-verify.js +848 -0
- package/dist/core/changeset-verify.js.map +7 -0
- package/dist/core/changeset.js +56 -9
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/element-type-migration.js +145 -0
- package/dist/core/element-type-migration.js.map +7 -0
- package/dist/core/extraction-observability.js +161 -0
- package/dist/core/extraction-observability.js.map +7 -0
- package/dist/core/farm-manifest.js +12 -6
- package/dist/core/farm-manifest.js.map +2 -2
- package/dist/core/farm-sync-engine.js +1 -1
- package/dist/core/farm-sync-engine.js.map +2 -2
- package/dist/core/farm-sync-state.js +10 -2
- package/dist/core/farm-sync-state.js.map +2 -2
- package/dist/core/migration-registry.js +88 -47
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model-upgrade.js +102 -0
- package/dist/core/model-upgrade.js.map +7 -0
- package/dist/core/model.js +82 -30
- package/dist/core/model.js.map +2 -2
- package/dist/core/mutation-handler.js +71 -6
- package/dist/core/mutation-handler.js.map +2 -2
- package/dist/core/project-init.js +53 -0
- package/dist/core/project-init.js.map +7 -0
- package/dist/core/relationship-migration-table.js +6639 -0
- package/dist/core/relationship-migration-table.js.map +7 -0
- package/dist/core/relationship-migration.js +272 -0
- package/dist/core/relationship-migration.js.map +7 -0
- package/dist/core/relationship-prune.js +49 -0
- package/dist/core/relationship-prune.js.map +7 -0
- package/dist/core/relationship-staging.js +161 -0
- package/dist/core/relationship-staging.js.map +7 -0
- package/dist/core/relationships.js +26 -4
- package/dist/core/relationships.js.map +2 -2
- package/dist/core/report-data-model.js +7 -13
- package/dist/core/report-data-model.js.map +2 -2
- package/dist/core/staged-changeset-storage.js +145 -18
- package/dist/core/staged-changeset-storage.js.map +2 -2
- package/dist/core/staged-source-reference.js +28 -0
- package/dist/core/staged-source-reference.js.map +7 -0
- package/dist/core/staging-area.js +166 -24
- package/dist/core/staging-area.js.map +2 -2
- package/dist/core/upgrade-plan.js +117 -0
- package/dist/core/upgrade-plan.js.map +7 -0
- package/dist/core/virtual-projection.js +13 -5
- package/dist/core/virtual-projection.js.map +2 -2
- package/dist/export/archimate-exporter.js +1 -0
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/generated/compiled-validators.js +2 -2
- package/dist/generated/compiled-validators.js.map +2 -2
- package/dist/generated/layer-registry.js +16 -16
- package/dist/generated/layer-registry.js.map +2 -2
- package/dist/generated/node-types.js +186 -168
- package/dist/generated/node-types.js.map +2 -2
- package/dist/generated/relationship-index.js +2468 -7913
- package/dist/generated/relationship-index.js.map +2 -2
- package/dist/integrations/claude_code/.claude-plugin/plugin.json +24 -0
- package/dist/integrations/claude_code/agents/dr-architect.md +30 -3
- package/dist/integrations/claude_code/agents/dr-extractor.md +8 -2
- package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
- package/dist/integrations/claude_code/commands/dr-changeset.md +2 -1
- package/dist/integrations/claude_code/commands/dr-map.md +20 -1
- package/dist/integrations/claude_code/commands/dr-plan.md +66 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
- package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
- package/dist/integrations/claude_code/docs/MCP_SERVER.md +47 -26
- package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
- package/dist/integrations/claude_code/docs/README.md +68 -2
- package/dist/integrations/claude_code/plugin-agents/dr-advisor.md +255 -0
- package/dist/integrations/claude_code/plugin-agents/dr-architect.md +306 -0
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
- package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
- package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
- package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
- package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
- package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
- package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
- package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
- package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
- package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
- package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
- package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +95 -15
- package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +178 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +8 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +6 -1
- package/dist/integrations/github_copilot/agents/dr-architect.md +3 -1
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
- package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
- package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
- package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
- package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
- package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
- package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
- package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
- package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
- package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
- package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
- package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +225 -102
- package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +177 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
- package/dist/integrations/hash-utils.js.map +2 -2
- package/dist/mcp/api-key-manager.js +14 -1
- package/dist/mcp/api-key-manager.js.map +2 -2
- package/dist/mcp/changeset-only.js +45 -0
- package/dist/mcp/changeset-only.js.map +7 -0
- package/dist/mcp/project-root.js +85 -0
- package/dist/mcp/project-root.js.map +7 -0
- package/dist/mcp/server-instructions.js +27 -0
- package/dist/mcp/server-instructions.js.map +7 -0
- package/dist/mcp/strict-schema.js +52 -0
- package/dist/mcp/strict-schema.js.map +7 -0
- package/dist/mcp/tool-registry.js +55 -5
- package/dist/mcp/tool-registry.js.map +2 -2
- package/dist/mcp/tools/changeset-analysis-tools.js +98 -0
- package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
- package/dist/mcp/tools/changeset-commit.js +224 -0
- package/dist/mcp/tools/changeset-commit.js.map +7 -0
- package/dist/mcp/tools/changeset-editing.js +260 -0
- package/dist/mcp/tools/changeset-editing.js.map +7 -0
- package/dist/mcp/tools/changeset-lifecycle.js +83 -0
- package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
- package/dist/mcp/tools/changeset-shared.js +31 -0
- package/dist/mcp/tools/changeset-shared.js.map +7 -0
- package/dist/mcp/tools/changeset-show.js +17 -1
- package/dist/mcp/tools/changeset-show.js.map +2 -2
- package/dist/mcp/tools/changeset-verify.js +49 -0
- package/dist/mcp/tools/changeset-verify.js.map +7 -0
- package/dist/mcp/tools/codebase-extract.js +836 -0
- package/dist/mcp/tools/codebase-extract.js.map +7 -0
- package/dist/mcp/tools/codebase-index.js +125 -0
- package/dist/mcp/tools/codebase-index.js.map +7 -0
- package/dist/mcp/tools/codebase-shared.js +265 -0
- package/dist/mcp/tools/codebase-shared.js.map +7 -0
- package/dist/mcp/tools/codebase-verify.js +48 -0
- package/dist/mcp/tools/codebase-verify.js.map +7 -0
- package/dist/mcp/tools/index.js +34 -1
- package/dist/mcp/tools/index.js.map +2 -2
- package/dist/mcp/tools/model-add.js +191 -74
- package/dist/mcp/tools/model-add.js.map +2 -2
- package/dist/mcp/tools/model-delete.js +2 -2
- package/dist/mcp/tools/model-delete.js.map +2 -2
- package/dist/mcp/tools/model-search.js +14 -0
- package/dist/mcp/tools/model-search.js.map +2 -2
- package/dist/mcp/tools/model-show.js +29 -2
- package/dist/mcp/tools/model-show.js.map +2 -2
- package/dist/mcp/tools/model-trace.js +93 -30
- package/dist/mcp/tools/model-trace.js.map +2 -2
- package/dist/mcp/tools/model-update.js +46 -26
- package/dist/mcp/tools/model-update.js.map +2 -2
- package/dist/mcp/tools/model-validate.js +46 -4
- package/dist/mcp/tools/model-validate.js.map +2 -2
- package/dist/mcp/tools/project-status-collectors.js +381 -0
- package/dist/mcp/tools/project-status-collectors.js.map +7 -0
- package/dist/mcp/tools/project-status.js +237 -0
- package/dist/mcp/tools/project-status.js.map +7 -0
- package/dist/mcp/tools/project-tools.js +505 -0
- package/dist/mcp/tools/project-tools.js.map +7 -0
- package/dist/mcp/tools/relationship-tools.js +167 -0
- package/dist/mcp/tools/relationship-tools.js.map +7 -0
- package/dist/mcp/tools/review-open.js +210 -0
- package/dist/mcp/tools/review-open.js.map +7 -0
- package/dist/mcp/tools/shared.js +35 -4
- package/dist/mcp/tools/shared.js.map +2 -2
- package/dist/mcp/tools/spec-type.js +90 -0
- package/dist/mcp/tools/spec-type.js.map +7 -0
- package/dist/reports/model-report-orchestrator.js +31 -2
- package/dist/reports/model-report-orchestrator.js.map +2 -2
- package/dist/schemas/bundled/analyzers/cbm.json +1200 -70
- package/dist/schemas/bundled/analyzers/manifest.json +2 -2
- package/dist/schemas/bundled/api.json +1029 -1658
- package/dist/schemas/bundled/apm.json +499 -734
- package/dist/schemas/bundled/application.json +735 -371
- package/dist/schemas/bundled/base.json +3 -220
- package/dist/schemas/bundled/business.json +452 -366
- package/dist/schemas/bundled/data-model.json +395 -411
- package/dist/schemas/bundled/data-store.json +334 -558
- package/dist/schemas/bundled/manifest.json +18 -18
- package/dist/schemas/bundled/motivation.json +349 -368
- package/dist/schemas/bundled/navigation.json +415 -731
- package/dist/schemas/bundled/product.json +325 -159
- package/dist/schemas/bundled/security.json +864 -1232
- package/dist/schemas/bundled/technology.json +574 -703
- package/dist/schemas/bundled/testing.json +865 -1646
- package/dist/schemas/bundled/ux.json +739 -1352
- package/dist/server/schemas.js +8 -0
- package/dist/server/schemas.js.map +2 -2
- package/dist/server/server.js +686 -231
- package/dist/server/server.js.map +3 -3
- package/dist/server/viewer-registry.js +264 -0
- package/dist/server/viewer-registry.js.map +7 -0
- package/dist/server-entry.js +2 -1
- package/dist/server-entry.js.map +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/utils/ansi-suppressor.js +6 -8
- package/dist/utils/ansi-suppressor.js.map +2 -2
- package/dist/utils/attribute-patch.js +41 -0
- package/dist/utils/attribute-patch.js.map +7 -0
- package/dist/utils/error-hints.js +29 -0
- package/dist/utils/error-hints.js.map +7 -0
- package/dist/utils/errors.js +9 -3
- package/dist/utils/errors.js.map +2 -2
- package/dist/utils/id-generator.js +5 -2
- package/dist/utils/id-generator.js.map +2 -2
- package/dist/utils/project-paths.js +26 -1
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +64 -31
- package/dist/utils/source-reference.js.map +2 -2
- package/dist/utils/spec-version.js +2 -2
- package/dist/utils/spec-version.js.map +1 -1
- package/dist/validators/composed-reference-validator.js +5 -27
- package/dist/validators/composed-reference-validator.js.map +2 -2
- package/dist/validators/model-warnings.js +28 -0
- package/dist/validators/model-warnings.js.map +7 -0
- package/dist/validators/reference-validator.js +0 -7
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +3 -3
- package/dist/validators/relationship-schema-validator.js.map +2 -2
- package/dist/validators/schema-validator.js +27 -9
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/types.js.map +1 -1
- package/dist/viewer/README.md +6 -6
- package/dist/viewer/assets/main-CUOQGGRA.css +1 -0
- package/dist/viewer/assets/main-DvH3gYrI.js +84 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/manifest.json +10 -10
- package/dist/viewer/version.json +1 -1
- package/package.json +2 -1
- package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
- package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/update.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Update an element\n */\n\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { MutationHandler } from \"../core/mutation-handler.js\";\nimport { StagingAreaManager } from \"../core/staging-area.js\";\nimport { StagedChangesetStorage } from \"../core/staged-changeset-storage.js\";\nimport { findElementLayer } from \"../utils/element-utils.js\";\nimport { CLIError, handleError, handleSuccess, handleInfo, findSimilar, formatValidOptions } from \"../utils/errors.js\";\nimport { isValidNodeType, getNodeTypesForLayer, normalizeNodeType } from \"../generated/node-types.js\";\nimport { Element } from \"../core/element.js\";\nimport { Layer } from \"../core/layer.js\";\nimport { SchemaValidator } from \"../validators/schema-validator.js\";\nimport { validateSourceReferenceOptions, buildSourceReference } from \"../utils/source-reference.js\";\nimport { startSpan, endSpan } from \"../telemetry/index.js\";\n\ndeclare const TELEMETRY_ENABLED: boolean | undefined;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\nexport interface UpdateOptions {\n model?: string;\n name?: string;\n description?: string;\n type?: string;\n attributes?: string;\n sourceFile?: string;\n sourceSymbol?: string;\n sourceProvenance?: string;\n sourceRepoRemote?: string;\n sourceRepoCommit?: string;\n clearSourceReference?: boolean;\n verbose?: boolean;\n debug?: boolean;\n}\n\n/**\n * Validate update-specific source reference options\n */\nfunction validateUpdateSourceReferenceOptions(options: UpdateOptions): void {\n const hasSourceOptions =\n options.sourceFile ||\n options.sourceSymbol ||\n options.sourceProvenance ||\n options.sourceRepoRemote ||\n options.sourceRepoCommit;\n\n if (options.clearSourceReference && hasSourceOptions) {\n throw new CLIError(\n \"Cannot use --clear-source-reference with other source reference options\",\n 1,\n [\"Specify either --clear-source-reference or other source options, not both\"]\n );\n }\n\n // Use shared validation for source reference options if any are provided\n if (hasSourceOptions) {\n validateSourceReferenceOptions(options);\n }\n}\n\nexport async function updateCommand(id: string, options: UpdateOptions): Promise<void> {\n const changedFields: string[] = [];\n if (options.name) changedFields.push(\"name\");\n if (options.description) changedFields.push(\"description\");\n if (options.type) changedFields.push(\"type\");\n if (options.attributes) changedFields.push(\"attributes\");\n if (options.sourceFile || options.clearSourceReference) changedFields.push(\"sourceReference\");\n\n const span = isTelemetryEnabled\n ? startSpan(\"element.update\", {\n \"element.id\": id,\n \"element.changed_fields\": changedFields.join(\",\"),\n })\n : null;\n\n try {\n // Validate source reference options\n validateUpdateSourceReferenceOptions(options);\n\n // Load model\n const model = await Model.load(options.model || process.cwd());\n\n // Find element\n const layerName = await findElementLayer(model, id);\n if (!layerName) {\n // Not in committed model \u2014 check active changeset for a staged ADD\n const stagingManager = new StagingAreaManager(model.rootPath, model);\n const storage = new StagedChangesetStorage(model.rootPath);\n const activeId = await stagingManager.getActiveId();\n\n if (activeId) {\n const changeset = await storage.load(activeId);\n if (changeset) {\n const addChange = changeset.changes.find(\n (c) => c.type === \"add\" && c.elementId === id\n );\n if (addChange && addChange.after) {\n const hasUpdates =\n options.name ||\n options.description !== undefined ||\n options.attributes ||\n options.sourceFile ||\n options.clearSourceReference ||\n options.type;\n\n if (!hasUpdates) {\n handleInfo(ansis.yellow(\"No fields specified for update\"));\n return;\n }\n\n const after: Record<string, unknown> = { ...addChange.after };\n\n if (options.type) {\n const stagedLayerName = addChange.layerName;\n if (!isValidNodeType(stagedLayerName, options.type)) {\n const validNodeTypes = getNodeTypesForLayer(stagedLayerName);\n const typeNames = validNodeTypes.map((t) => t.type).sort();\n const similar = findSimilar(options.type, typeNames, 3);\n const suggestions: string[] = [`Valid types for ${stagedLayerName}: ${formatValidOptions(typeNames)}`];\n if (similar.length > 0) suggestions.unshift(`Did you mean: ${similar.join(\" or \")}?`);\n throw new CLIError(`Invalid element type \"${options.type}\" for layer \"${stagedLayerName}\"`, 1, suggestions);\n }\n const resolvedNewType = normalizeNodeType(stagedLayerName, options.type);\n after.type = resolvedNewType;\n after.spec_node_id = `${stagedLayerName}.${resolvedNewType}`;\n }\n if (options.name) after.name = options.name;\n if (options.description !== undefined) {\n after.description = options.description || undefined;\n }\n if (options.attributes) {\n try {\n const parsed = JSON.parse(options.attributes);\n after.attributes = parsed;\n } catch {\n throw new CLIError(\"Invalid JSON in --attributes\", 1, [\n \"Ensure your JSON is valid and properly formatted\",\n ]);\n }\n }\n if (options.clearSourceReference) {\n delete after.source_reference;\n } else if (options.sourceFile) {\n const newRef = buildSourceReference(options);\n if (newRef) after.source_reference = newRef;\n }\n\n // Validate schema if type or attributes changed in staged element\n if (options.type || options.attributes) {\n const stagedLayerName = addChange.layerName;\n const tempElem = Element.fromSpecNode({\n id: String(after.id ?? addChange.elementId ?? \"staged\"),\n path: String(after.path ?? addChange.elementId ?? \"\"),\n spec_node_id: String(after.spec_node_id ?? \"\"),\n type: String(after.type ?? \"\"),\n layer_id: String(after.layer_id ?? stagedLayerName),\n name: String(after.name ?? \"\"),\n attributes: (after.attributes as Record<string, unknown>) || {},\n });\n const schemaValidator = new SchemaValidator();\n const tempLayer = new Layer(stagedLayerName);\n tempLayer.addElement(tempElem);\n const attrValidation = await schemaValidator.validateLayer(tempLayer);\n if (!attrValidation.isValid()) {\n const errorMessages = attrValidation.errors\n .map((e) => ` ${e.message}`)\n .join(\"\\n\");\n throw new CLIError(\n `Updated attributes fail schema validation:\\n${errorMessages}`,\n 1,\n [\n options.type\n ? `Incompatible attributes must be manually cleaned up before changing type. Run \"dr schema ${stagedLayerName} ${after.type}\" to see the required attributes`\n : `Run \"dr schema ${stagedLayerName} ${after.type}\" to see the required attributes`,\n ]\n );\n }\n }\n\n await storage.updateChange(activeId, id, {\n type: addChange.type,\n elementId: addChange.elementId,\n layerName: addChange.layerName,\n before: addChange.before,\n after,\n });\n\n handleSuccess(`Updated staged element ${ansis.bold(id)}`, {\n elementId: id,\n layer: addChange.layerName,\n changesetStatus: \"staged\",\n }, { verbose: options.verbose });\n return;\n }\n }\n }\n\n throw new CLIError(`Element ${id} not found`, 1);\n }\n\n const layer = await model.getLayer(layerName);\n if (!layer) {\n throw new CLIError(`Layer ${layerName} not found`, 1);\n }\n\n const element = layer.getElement(id);\n if (!element) {\n throw new CLIError(`Element ${id} not found`, 1);\n }\n\n // Validate that at least one field is specified\n const hasUpdates =\n options.name ||\n options.description !== undefined ||\n options.type ||\n options.attributes ||\n options.sourceFile ||\n options.clearSourceReference;\n\n if (!hasUpdates) {\n handleInfo(ansis.yellow(\"No fields specified for update\"));\n return;\n }\n\n // Single unified mutation handler for update\n const handler = new MutationHandler(model, id, layerName);\n\n // Execute update through unified path (handles staging and base model consistently)\n // The mutator function applies all updates in a single pass with validated JSON parsing\n await handler.executeUpdate(element, async (elem, after) => {\n // Resolve new type (validate name only \u2014 don't mutate live elem yet)\n let resolvedNewType: string | undefined;\n if (options.type) {\n if (!isValidNodeType(layerName, options.type)) {\n const validNodeTypes = getNodeTypesForLayer(layerName);\n const typeNames = validNodeTypes.map((t) => t.type).sort();\n const similar = findSimilar(options.type, typeNames, 3);\n const suggestions: string[] = [`Valid types for ${layerName}: ${formatValidOptions(typeNames)}`];\n if (similar.length > 0) suggestions.unshift(`Did you mean: ${similar.join(\" or \")}?`);\n throw new CLIError(`Invalid element type \"${options.type}\" for layer \"${layerName}\"`, 1, suggestions);\n }\n resolvedNewType = normalizeNodeType(layerName, options.type);\n }\n\n // Parse attributes (don't mutate yet)\n let parsedAttributes: Record<string, unknown> | undefined;\n if (options.attributes) {\n try {\n parsedAttributes = JSON.parse(options.attributes) as Record<string, unknown>;\n } catch (e) {\n throw new CLIError(\"Invalid JSON in --attributes\", 1, [\n \"Ensure your JSON is valid and properly formatted\",\n ]);\n }\n }\n\n // Validate against schema using a temp element BEFORE mutating the live elem\n if (resolvedNewType || parsedAttributes) {\n const candidateType = resolvedNewType ?? elem.type;\n const tempElem = new Element({\n ...elem.toJSON(),\n type: candidateType,\n spec_node_id: `${layerName}.${candidateType}`,\n attributes: parsedAttributes ?? elem.attributes,\n });\n const schemaValidator = new SchemaValidator();\n const tempLayer = new Layer(layerName);\n tempLayer.addElement(tempElem);\n const attrValidation = await schemaValidator.validateLayer(tempLayer);\n if (!attrValidation.isValid()) {\n const errorMessages = attrValidation.errors\n .map((e) => ` ${e.message}`)\n .join(\"\\n\");\n throw new CLIError(\n `Updated attributes fail schema validation:\\n${errorMessages}`,\n 1,\n [\n resolvedNewType\n ? `Incompatible attributes must be manually cleaned up before changing type. Run \"dr schema ${layerName} ${candidateType}\" to see the required attributes`\n : `Run \"dr schema ${layerName} ${elem.type}\" to see the required attributes`,\n ]\n );\n }\n }\n\n // Validation passed \u2014 apply all mutations to live element\n if (resolvedNewType) {\n elem.type = resolvedNewType;\n after.type = resolvedNewType;\n elem.spec_node_id = `${layerName}.${resolvedNewType}`;\n after.spec_node_id = `${layerName}.${resolvedNewType}`;\n }\n\n if (options.name) {\n elem.name = options.name;\n after.name = options.name;\n }\n\n if (options.description !== undefined) {\n elem.description = options.description || undefined;\n after.description = options.description || undefined;\n }\n\n if (parsedAttributes) {\n elem.attributes = parsedAttributes;\n after.attributes = parsedAttributes;\n }\n\n if (options.clearSourceReference) {\n elem.setSourceReference(undefined);\n after.sourceReference = undefined;\n } else if (options.sourceFile) {\n const newRef = buildSourceReference(options);\n if (newRef) {\n elem.setSourceReference(newRef);\n after.sourceReference = newRef;\n }\n }\n\n // Update element in layer graph to persist mutations\n layer.updateElement(elem);\n });\n\n const changes: Record<string, unknown> = {};\n if (options.type) changes.type = options.type;\n if (options.name) changes.name = options.name;\n if (options.description !== undefined) changes.description = options.description;\n if (options.sourceFile) changes.source = options.sourceFile;\n if (options.clearSourceReference) changes.source = \"cleared\";\n\n const details: Record<string, unknown> = {\n elementId: id,\n layer: layerName,\n name: element.name,\n changes,\n };\n\n handleSuccess(`Updated element ${ansis.bold(id)}`, details, { verbose: options.verbose });\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({ code: 2, message: (error as Error).message });\n }\n handleError(error);\n } finally {\n if (isTelemetryEnabled) {\n endSpan(span);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "AAIA,OAAO,WAAW;AAClB,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,8BAA8B;AACvC,SAAS,wBAAwB;AACjC,SAAS,UAAU,aAAa,eAAe,YAAY,aAAa,0BAA0B;
|
|
4
|
+
"sourcesContent": ["/**\n * Update an element\n */\n\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { MutationHandler } from \"../core/mutation-handler.js\";\nimport { setStagedSourceReference, stagedSourceReference } from \"../core/staged-source-reference.js\";\nimport { StagingAreaManager } from \"../core/staging-area.js\";\nimport { StagedChangesetStorage } from \"../core/staged-changeset-storage.js\";\nimport { changedFields as snapshotChangedFields } from \"../core/changeset-summary.js\";\nimport { findElementLayer } from \"../utils/element-utils.js\";\nimport { CLIError, handleError, handleSuccess, handleInfo, handleWarning, findSimilar, formatValidOptions } from \"../utils/errors.js\";\nimport { isValidNodeType, getNodeTypesForLayer, normalizeNodeType } from \"../generated/node-types.js\";\nimport { Element } from \"../core/element.js\";\nimport { Layer } from \"../core/layer.js\";\nimport { SchemaValidator, suggestNodeTypes } from \"../validators/schema-validator.js\";\nimport {\n resolveSourceReferenceOptions,\n buildSourceReference,\n precheckUpdateSourceReferenceOptions,\n} from \"../utils/source-reference.js\";\nimport { schemaLookupHint, undefinedTypeWarning } from \"../utils/error-hints.js\";\nimport { effectiveAttributePatch, parseJsonObjectOption, resolveAttributeUpdate } from \"../utils/attribute-patch.js\";\n\n/**\n * When the element's type (after any requested type change) is one the spec does not define, the\n * warning and type-change hint to give instead of refusing the update; undefined when the type is\n * valid.\n */\nfunction undefinedTypeCheck(\n layer: string,\n elementId: string,\n type: string\n): { message: string; hint: string } | undefined {\n if (isValidNodeType(layer, type)) return undefined;\n return undefinedTypeWarning(\"cli\", layer, elementId, type, suggestNodeTypes(layer, type));\n}\nimport { startSpan, endSpan } from \"../telemetry/index.js\";\n\ndeclare const TELEMETRY_ENABLED: boolean | undefined;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\nexport interface UpdateOptions {\n model?: string;\n name?: string;\n description?: string;\n type?: string;\n attributes?: string;\n /** JSON object merged into the element's current attributes; a null value removes a key. */\n attributePatch?: string;\n sourceFile?: string;\n sourceSymbol?: string;\n sourceProvenance?: string;\n sourceRepoRemote?: string;\n sourceRepoCommit?: string;\n clearSourceReference?: boolean;\n verbose?: boolean;\n debug?: boolean;\n}\n\n/**\n * Validate update-specific source reference options\n */\nfunction validateUpdateSourceReferenceOptions(options: UpdateOptions): void {\n const hasSourceOptions =\n options.sourceFile ||\n options.sourceSymbol ||\n options.sourceProvenance ||\n options.sourceRepoRemote ||\n options.sourceRepoCommit;\n\n if (options.clearSourceReference && hasSourceOptions) {\n throw new CLIError(\n \"Cannot use --clear-source-reference with other source reference options\",\n 1,\n [\"Specify either --clear-source-reference or other source options, not both\"]\n );\n }\n\n // Refuse what cannot be settled; the partial forms are settled against the element's current\n // reference once it is found.\n if (hasSourceOptions) {\n precheckUpdateSourceReferenceOptions(options);\n }\n}\n\nexport async function updateCommand(id: string, options: UpdateOptions): Promise<void> {\n const changedFields: string[] = [];\n if (options.name) changedFields.push(\"name\");\n if (options.description) changedFields.push(\"description\");\n if (options.type) changedFields.push(\"type\");\n if (options.attributes || options.attributePatch) changedFields.push(\"attributes\");\n if (options.sourceFile || options.sourceSymbol || options.sourceProvenance || options.clearSourceReference) {\n changedFields.push(\"sourceReference\");\n }\n\n const span = isTelemetryEnabled\n ? startSpan(\"element.update\", {\n \"element.id\": id,\n \"element.changed_fields\": changedFields.join(\",\"),\n })\n : null;\n\n try {\n // Validate source reference options\n validateUpdateSourceReferenceOptions(options);\n\n // --attribute-patch must be a JSON object, and cannot be combined with --attributes.\n const parsedPatch =\n options.attributePatch !== undefined ? parseJsonObjectOption(options.attributePatch, \"--attribute-patch\") : undefined;\n const attributeFlags = { attributes: \"--attributes\", attributePatch: \"--attribute-patch\" };\n if (options.attributes !== undefined && parsedPatch !== undefined) {\n resolveAttributeUpdate(undefined, { attributes: {}, attributePatch: parsedPatch }, attributeFlags);\n }\n // An empty patch names no key: it is not an update.\n const attributePatch = effectiveAttributePatch(parsedPatch);\n\n // Load model\n const model = await Model.load(options.model);\n\n // Find element\n const layerName = await findElementLayer(model, id);\n if (!layerName) {\n // Not in committed model \u2014 check active changeset for a staged ADD\n const stagingManager = new StagingAreaManager(model.rootPath, model);\n const storage = new StagedChangesetStorage(model.rootPath);\n const activeId = await stagingManager.getActiveId();\n\n if (activeId) {\n const changeset = await storage.load(activeId);\n if (changeset) {\n const addChange = changeset.changes.find(\n (c) => c.type === \"add\" && c.elementId === id\n );\n if (addChange && addChange.after) {\n const after: Record<string, unknown> = { ...addChange.after };\n // Settle partial source fields first: one that is ignored (with a warning) is not an update.\n const currentStaged = stagedSourceReference(after);\n const stagedSource = resolveSourceReferenceOptions(options, \"cli\", currentStaged);\n stagedSource.warnings.forEach((warning) => console.warn(ansis.yellow(`Warning: ${warning}`)));\n\n const hasUpdates =\n options.name ||\n options.description !== undefined ||\n options.attributes ||\n attributePatch ||\n stagedSource.options.sourceProvenance ||\n options.clearSourceReference ||\n options.type;\n\n if (!hasUpdates) {\n handleInfo(ansis.yellow(stagedSource.warnings.length > 0 ? \"Nothing left to update\" : \"No fields specified for update\"));\n return;\n }\n\n\n if (options.type) {\n const stagedLayerName = addChange.layerName;\n if (!isValidNodeType(stagedLayerName, options.type)) {\n const validNodeTypes = getNodeTypesForLayer(stagedLayerName);\n const typeNames = validNodeTypes.map((t) => t.type).sort();\n const similar = findSimilar(options.type, typeNames, 3);\n const suggestions: string[] = [`Valid types for ${stagedLayerName}: ${formatValidOptions(typeNames)}`];\n if (similar.length > 0) suggestions.unshift(`Did you mean: ${similar.join(\" or \")}?`);\n throw new CLIError(`Invalid element type \"${options.type}\" for layer \"${stagedLayerName}\"`, 1, suggestions);\n }\n const resolvedNewType = normalizeNodeType(stagedLayerName, options.type);\n after.type = resolvedNewType;\n after.spec_node_id = `${stagedLayerName}.${resolvedNewType}`;\n }\n if (options.name) after.name = options.name;\n if (options.description !== undefined) {\n after.description = options.description || undefined;\n }\n if (options.attributes) {\n try {\n const parsed = JSON.parse(options.attributes);\n after.attributes = parsed;\n } catch {\n throw new CLIError(\"Invalid JSON in --attributes\", 1, [\n \"Ensure your JSON is valid and properly formatted\",\n ]);\n }\n } else if (attributePatch) {\n after.attributes = resolveAttributeUpdate(\n after.attributes as Record<string, unknown> | undefined,\n { attributePatch },\n attributeFlags\n );\n }\n if (options.clearSourceReference) {\n setStagedSourceReference(after, undefined);\n } else {\n const newRef = buildSourceReference(stagedSource.options, currentStaged);\n if (newRef) setStagedSourceReference(after, newRef);\n }\n\n // Validate schema if type or attributes changed in staged element\n if (options.type || options.attributes || attributePatch) {\n const stagedLayerName = addChange.layerName;\n const tempElem = Element.fromSpecNode({\n id: String(after.id ?? addChange.elementId ?? \"staged\"),\n path: String(after.path ?? addChange.elementId ?? \"\"),\n spec_node_id: String(after.spec_node_id ?? \"\"),\n type: String(after.type ?? \"\"),\n layer_id: String(after.layer_id ?? stagedLayerName),\n name: String(after.name ?? \"\"),\n attributes: (after.attributes as Record<string, unknown>) || {},\n });\n const schemaValidator = new SchemaValidator();\n const tempLayer = new Layer(stagedLayerName);\n tempLayer.addElement(tempElem);\n const attrValidation = await schemaValidator.validateLayer(tempLayer);\n const undefinedTypeHint = undefinedTypeCheck(stagedLayerName, id, String(after.type ?? \"\"));\n const blocking = undefinedTypeHint\n ? attrValidation.errors.filter((e) => e.location !== \"/type\")\n : attrValidation.errors;\n if (blocking.length > 0) {\n const errorMessages = blocking\n .map((e) => ` ${e.message}`)\n .join(\"\\n\");\n throw new CLIError(\n `Updated attributes fail schema validation:\\n${errorMessages}`,\n 1,\n [\n undefinedTypeHint\n ? undefinedTypeHint.hint\n : (options.type\n ? \"Incompatible attributes must be manually cleaned up before changing type. \"\n : \"\") + schemaLookupHint(\"cli\", stagedLayerName, String(after.type)),\n ]\n );\n }\n if (undefinedTypeHint) handleWarning(undefinedTypeHint.message, [undefinedTypeHint.hint]);\n }\n\n await storage.updateChange(activeId, id, {\n type: addChange.type,\n elementId: addChange.elementId,\n layerName: addChange.layerName,\n before: addChange.before,\n after,\n });\n\n handleSuccess(`Updated staged element ${ansis.bold(id)}`, {\n elementId: id,\n layer: addChange.layerName,\n changesetStatus: \"staged\",\n changedFields: snapshotChangedFields(addChange.after, after),\n }, { verbose: options.verbose });\n return;\n }\n }\n }\n\n throw new CLIError(`Element ${id} not found`, 1);\n }\n\n const layer = await model.getLayer(layerName);\n if (!layer) {\n throw new CLIError(`Layer ${layerName} not found`, 1);\n }\n\n const element = layer.getElement(id);\n if (!element) {\n throw new CLIError(`Element ${id} not found`, 1);\n }\n\n // Settle partial source fields first: one that is ignored (with a warning) is not an update.\n const currentSource = element.getSourceReference();\n const source = resolveSourceReferenceOptions(options, \"cli\", currentSource);\n source.warnings.forEach((warning) => console.warn(ansis.yellow(`Warning: ${warning}`)));\n\n // Validate that at least one field is specified\n const hasUpdates =\n options.name ||\n options.description !== undefined ||\n options.type ||\n options.attributes ||\n attributePatch ||\n source.options.sourceProvenance ||\n options.clearSourceReference;\n\n if (!hasUpdates) {\n handleInfo(ansis.yellow(source.warnings.length > 0 ? \"Nothing left to update\" : \"No fields specified for update\"));\n return;\n }\n\n // Single unified mutation handler for update\n const handler = new MutationHandler(model, id, layerName);\n\n // Execute update through unified path (handles staging and base model consistently)\n // The mutator function applies all updates in a single pass with validated JSON parsing\n await handler.executeUpdate(element, async (elem, after) => {\n // Resolve new type (validate name only \u2014 don't mutate live elem yet)\n let resolvedNewType: string | undefined;\n if (options.type) {\n if (!isValidNodeType(layerName, options.type)) {\n const validNodeTypes = getNodeTypesForLayer(layerName);\n const typeNames = validNodeTypes.map((t) => t.type).sort();\n const similar = findSimilar(options.type, typeNames, 3);\n const suggestions: string[] = [`Valid types for ${layerName}: ${formatValidOptions(typeNames)}`];\n if (similar.length > 0) suggestions.unshift(`Did you mean: ${similar.join(\" or \")}?`);\n throw new CLIError(`Invalid element type \"${options.type}\" for layer \"${layerName}\"`, 1, suggestions);\n }\n resolvedNewType = normalizeNodeType(layerName, options.type);\n }\n\n // Parse attributes (don't mutate yet)\n let parsedAttributes: Record<string, unknown> | undefined;\n if (options.attributes) {\n try {\n parsedAttributes = JSON.parse(options.attributes) as Record<string, unknown>;\n } catch (e) {\n throw new CLIError(\"Invalid JSON in --attributes\", 1, [\n \"Ensure your JSON is valid and properly formatted\",\n ]);\n }\n } else if (attributePatch) {\n // The element is the projected one when a changeset is active, so this merges over staged values.\n parsedAttributes = resolveAttributeUpdate(elem.attributes, { attributePatch }, attributeFlags);\n }\n\n // Validate against schema using a temp element BEFORE mutating the live elem\n if (resolvedNewType || parsedAttributes) {\n const candidateType = resolvedNewType ?? elem.type;\n const tempElem = new Element({\n ...elem.toJSON(),\n type: candidateType,\n spec_node_id: `${layerName}.${candidateType}`,\n attributes: parsedAttributes ?? elem.attributes,\n });\n const schemaValidator = new SchemaValidator();\n const tempLayer = new Layer(layerName);\n tempLayer.addElement(tempElem);\n const attrValidation = await schemaValidator.validateLayer(tempLayer);\n const undefinedTypeHint = undefinedTypeCheck(layerName, id, candidateType);\n const blocking = undefinedTypeHint\n ? attrValidation.errors.filter((e) => e.location !== \"/type\")\n : attrValidation.errors;\n if (blocking.length > 0) {\n const errorMessages = blocking\n .map((e) => ` ${e.message}`)\n .join(\"\\n\");\n throw new CLIError(\n `Updated attributes fail schema validation:\\n${errorMessages}`,\n 1,\n [\n undefinedTypeHint\n ? undefinedTypeHint.hint\n : resolvedNewType\n ? \"Incompatible attributes must be manually cleaned up before changing type. \" +\n schemaLookupHint(\"cli\", layerName, candidateType)\n : schemaLookupHint(\"cli\", layerName, elem.type),\n ]\n );\n }\n if (undefinedTypeHint) handleWarning(undefinedTypeHint.message, [undefinedTypeHint.hint]);\n }\n\n // Validation passed \u2014 apply all mutations to live element\n if (resolvedNewType) {\n elem.type = resolvedNewType;\n after.type = resolvedNewType;\n elem.spec_node_id = `${layerName}.${resolvedNewType}`;\n after.spec_node_id = `${layerName}.${resolvedNewType}`;\n }\n\n if (options.name) {\n elem.name = options.name;\n after.name = options.name;\n }\n\n if (options.description !== undefined) {\n elem.description = options.description || undefined;\n after.description = options.description || undefined;\n }\n\n if (parsedAttributes) {\n elem.attributes = parsedAttributes;\n after.attributes = parsedAttributes;\n }\n\n if (options.clearSourceReference) {\n elem.setSourceReference(undefined);\n setStagedSourceReference(after, undefined);\n } else if (source.options.sourceProvenance) {\n const newRef = buildSourceReference(source.options, currentSource);\n if (newRef) {\n elem.setSourceReference(newRef);\n setStagedSourceReference(after, newRef);\n }\n }\n\n // Update element in layer graph to persist mutations\n layer.updateElement(elem);\n });\n\n const changes: Record<string, unknown> = {};\n if (options.type) changes.type = options.type;\n if (options.name) changes.name = options.name;\n if (options.description !== undefined) changes.description = options.description;\n if (options.sourceFile) changes.source = options.sourceFile;\n if (options.clearSourceReference) changes.source = \"cleared\";\n\n const details: Record<string, unknown> = {\n elementId: id,\n layer: layerName,\n name: element.name,\n changes,\n changedFields: handler.getChangedFields(),\n // The active changeset adds this element: the update was folded into that add.\n ...(handler.wasFoldedIntoAdd() ? { foldedIntoAdd: true } : {}),\n };\n\n handleSuccess(\n `Updated ${handler.wasFoldedIntoAdd() ? \"staged \" : \"\"}element ${ansis.bold(id)}` +\n (handler.getChangedFields().length > 0 ? ` (${handler.getChangedFields().join(\", \")})` : \"\"),\n details,\n { verbose: options.verbose }\n );\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({ code: 2, message: (error as Error).message });\n }\n handleError(error);\n } finally {\n if (isTelemetryEnabled) {\n endSpan(span);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import ansis from "ansis";
|
|
2
2
|
import { confirm } from "@clack/prompts";
|
|
3
|
-
import { findProjectRoot
|
|
4
|
-
import { getCliVersion, getCliBundledSpecVersion
|
|
5
|
-
import {
|
|
3
|
+
import { findProjectRoot } from "../utils/project-paths.js";
|
|
4
|
+
import { getCliVersion, getCliBundledSpecVersion } from "../utils/spec-version.js";
|
|
5
|
+
import { scanUpgrades, UpgradeScanError } from "../core/upgrade-plan.js";
|
|
6
|
+
import { upgradeModel } from "../core/model-upgrade.js";
|
|
7
|
+
import { summarizeRelationshipChanges } from "../core/relationship-migration.js";
|
|
6
8
|
import { installSpecReference } from "../utils/spec-installer.js";
|
|
7
|
-
import { Model } from "../core/model.js";
|
|
8
9
|
import { ClaudeIntegrationManager } from "../integrations/claude-manager.js";
|
|
9
10
|
import { CopilotIntegrationManager } from "../integrations/copilot-manager.js";
|
|
10
11
|
import { getErrorMessage } from "../utils/errors.js";
|
|
@@ -82,103 +83,37 @@ Scanning for available upgrades...
|
|
|
82
83
|
message: error.message
|
|
83
84
|
}), commandSpan.setAttribute("upgrade.result", "no_project")), console.error(ansis.red("Error: No DR project found")), console.error(ansis.dim('Run "dr init" to create a new project')), error;
|
|
84
85
|
}
|
|
85
|
-
const bundledSpecVersion = getCliBundledSpecVersion(), cliVersion = getCliVersion()
|
|
86
|
-
let
|
|
87
|
-
if (!drPath)
|
|
88
|
-
actions.push({
|
|
89
|
-
type: "spec",
|
|
90
|
-
description: "Install spec reference",
|
|
91
|
-
toVersion: bundledSpecVersion,
|
|
92
|
-
details: [
|
|
93
|
-
"Create .dr/ folder",
|
|
94
|
-
"Install schema files",
|
|
95
|
-
`Set spec version to ${bundledSpecVersion}`
|
|
96
|
-
]
|
|
97
|
-
});
|
|
98
|
-
else {
|
|
99
|
-
let installedSpecVersion = null;
|
|
100
|
-
try {
|
|
101
|
-
installedSpecVersion = await getInstalledSpecVersion(drPath);
|
|
102
|
-
} catch (error) {
|
|
103
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
104
|
-
throw console.error(ansis.red(`Error: ${message}`)), error;
|
|
105
|
-
}
|
|
106
|
-
currentSpecVersion = installedSpecVersion, installedSpecVersion ? (installedSpecVersion !== bundledSpecVersion || options.force) && actions.push({
|
|
107
|
-
type: "spec",
|
|
108
|
-
description: installedSpecVersion !== bundledSpecVersion ? "Upgrade spec reference" : "Reinstall spec reference (forced)",
|
|
109
|
-
fromVersion: installedSpecVersion,
|
|
110
|
-
toVersion: bundledSpecVersion,
|
|
111
|
-
details: ["Update schema files", "Update .dr/manifest.json"]
|
|
112
|
-
}) : actions.push({
|
|
113
|
-
type: "spec",
|
|
114
|
-
description: "Reinstall spec reference (manifest missing)",
|
|
115
|
-
toVersion: bundledSpecVersion,
|
|
116
|
-
details: [
|
|
117
|
-
"Recreate .dr/manifest.json",
|
|
118
|
-
"Update schema files",
|
|
119
|
-
`Set spec version to ${bundledSpecVersion}`
|
|
120
|
-
]
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
const modelPath = await getModelPath();
|
|
124
|
-
if (!modelPath) {
|
|
125
|
-
if (console.log(ansis.yellow("\u26A0 No model found")), console.log(ansis.dim(` Run "dr init" to create a model
|
|
126
|
-
`)), actions.length > 0) {
|
|
127
|
-
const { actions: integrationActions2, upToDate: integrationUpToDate2 } = await buildIntegrationActions(cliVersion, options.force ?? !1);
|
|
128
|
-
actions.push(...integrationActions2), await handleUpgrade(projectRoot, actions, options, integrationUpToDate2, commandSpan);
|
|
129
|
-
}
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
let modelSpecVersion = null;
|
|
86
|
+
const bundledSpecVersion = getCliBundledSpecVersion(), cliVersion = getCliVersion();
|
|
87
|
+
let scan;
|
|
133
88
|
try {
|
|
134
|
-
|
|
89
|
+
scan = await scanUpgrades(projectRoot, { force: options.force });
|
|
135
90
|
} catch (error) {
|
|
136
|
-
|
|
137
|
-
throw console.error(ansis.red(`Error: ${message}`)), error;
|
|
91
|
+
throw error instanceof UpgradeScanError && console.error(ansis.red(`Error: ${error.message}`)), error;
|
|
138
92
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
93
|
+
const actions = [...scan.actions], currentSpecVersion = scan.installedSpecVersion;
|
|
94
|
+
if (scan.model.state !== "found") {
|
|
95
|
+
if (scan.model.state === "missing" ? (console.log(ansis.yellow("\u26A0 No model found")), console.log(ansis.dim(` Run "dr init" to create a model
|
|
96
|
+
`))) : (console.log(ansis.yellow("\u26A0 Model manifest.yaml not found or missing specVersion")), console.log(ansis.dim(` Check documentation_robotics/model/manifest.yaml
|
|
97
|
+
`))), actions.length > 0) {
|
|
142
98
|
const { actions: integrationActions2, upToDate: integrationUpToDate2 } = await buildIntegrationActions(cliVersion, options.force ?? !1);
|
|
143
99
|
actions.push(...integrationActions2), await handleUpgrade(projectRoot, actions, options, integrationUpToDate2, commandSpan);
|
|
144
100
|
}
|
|
145
101
|
return;
|
|
146
102
|
}
|
|
147
|
-
const
|
|
148
|
-
if (
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
fromVersion: modelSpecVersion,
|
|
156
|
-
toVersion: targetSpecVersion,
|
|
157
|
-
details: ["Update manifest.yaml specVersion (no data changes needed)"],
|
|
158
|
-
versionBumpOnly: !0
|
|
159
|
-
});
|
|
160
|
-
else {
|
|
161
|
-
const error = new Error(`No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`);
|
|
162
|
-
commandSpan && (commandSpan.recordException(error), commandSpan.setStatus({
|
|
163
|
-
code: 2,
|
|
164
|
-
// SpanStatusCode.ERROR
|
|
165
|
-
message: error.message
|
|
166
|
-
}), commandSpan.setAttribute("upgrade.result", "no_migration_path")), console.log(ansis.yellow(`\u26A0 No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`)), console.log(ansis.dim(`
|
|
103
|
+
const modelSpecVersion = scan.model.specVersion;
|
|
104
|
+
if (scan.noMigrationPath) {
|
|
105
|
+
const { from, to, available } = scan.noMigrationPath, error = new Error(`No migration path found from model v${from} to v${to}`);
|
|
106
|
+
commandSpan && (commandSpan.recordException(error), commandSpan.setStatus({
|
|
107
|
+
code: 2,
|
|
108
|
+
// SpanStatusCode.ERROR
|
|
109
|
+
message: error.message
|
|
110
|
+
}), commandSpan.setAttribute("upgrade.result", "no_migration_path")), console.log(ansis.yellow(`\u26A0 No migration path found from model v${from} to v${to}`)), console.log(ansis.dim(`
|
|
167
111
|
Available migrations:`));
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
throw console.log(), error;
|
|
172
|
-
}
|
|
173
|
-
const migrationDetails = summary.migrations.map((m) => `${m.from} \u2192 ${m.to}: ${m.description}`);
|
|
174
|
-
actions.push({
|
|
175
|
-
type: "model",
|
|
176
|
-
description: "Migrate model data",
|
|
177
|
-
fromVersion: modelSpecVersion,
|
|
178
|
-
toVersion: targetSpecVersion,
|
|
179
|
-
details: migrationDetails
|
|
180
|
-
});
|
|
112
|
+
for (const migration of available)
|
|
113
|
+
console.log(ansis.dim(` \u2022 ${migration.from} \u2192 ${migration.to}: ${migration.description}`));
|
|
114
|
+
throw console.log(), error;
|
|
181
115
|
}
|
|
116
|
+
scan.catalogCheckError !== void 0 && console.log(ansis.yellow(`\u26A0 Could not check the model against the catalog: ${scan.catalogCheckError}`));
|
|
182
117
|
const { actions: integrationActions, upToDate: integrationUpToDate } = await buildIntegrationActions(cliVersion, options.force ?? !1);
|
|
183
118
|
if (actions.push(...integrationActions), actions.length === 0) {
|
|
184
119
|
commandSpan && (commandSpan.setAttribute("upgrade.result", "up_to_date"), commandSpan.setAttribute("upgrade.actions_count", 0)), console.log(ansis.green(`\u2713 Everything is up to date!
|
|
@@ -234,7 +169,7 @@ Upgrade cancelled
|
|
|
234
169
|
Executing upgrades...
|
|
235
170
|
`));
|
|
236
171
|
for (const action of actions)
|
|
237
|
-
action.type === "spec" ? await executeSpecUpgrade(projectRoot, action) : action.type === "model" ? await executeModelMigration(action, options) : action.type === "integration" && await executeIntegrationUpdate(action.description, async () => {
|
|
172
|
+
action.type === "spec" ? await executeSpecUpgrade(projectRoot, action) : action.type === "model" ? await executeModelMigration(projectRoot, action, options) : action.type === "integration" && await executeIntegrationUpdate(action.description, async () => {
|
|
238
173
|
action.integrationName === "claude" ? await new ClaudeIntegrationManager().upgrade({ force: !0 }) : await new CopilotIntegrationManager().upgrade({ force: !0 });
|
|
239
174
|
});
|
|
240
175
|
console.log(ansis.green(`
|
|
@@ -259,7 +194,7 @@ async function executeSpecUpgrade(projectRoot, action) {
|
|
|
259
194
|
endSpan(operationSpan);
|
|
260
195
|
}
|
|
261
196
|
}
|
|
262
|
-
async function executeModelMigration(action, options) {
|
|
197
|
+
async function executeModelMigration(projectRoot, action, options) {
|
|
263
198
|
const operationSpan = isTelemetryEnabled ? startSpan("upgrade.model", {
|
|
264
199
|
"upgrade.model.from_version": action.fromVersion || "unknown",
|
|
265
200
|
"upgrade.model.to_version": action.toVersion,
|
|
@@ -269,20 +204,24 @@ async function executeModelMigration(action, options) {
|
|
|
269
204
|
try {
|
|
270
205
|
if (action.versionBumpOnly) {
|
|
271
206
|
console.log(ansis.dim(`Bumping model spec version from v${action.fromVersion} to v${action.toVersion}...`));
|
|
272
|
-
const
|
|
273
|
-
|
|
207
|
+
const result2 = await upgradeModel(projectRoot, {
|
|
208
|
+
fromVersion: action.fromVersion,
|
|
209
|
+
toVersion: action.toVersion,
|
|
210
|
+
versionBumpOnly: !0
|
|
211
|
+
});
|
|
212
|
+
console.log(ansis.green(`\u2713 Model spec version updated to v${action.toVersion}`)), printChangesetRebaseline(result2.changesets), operationSpan && (operationSpan.setAttribute("upgrade.model.result", "version_bumped"), operationSpan.setAttribute("upgrade.model.changesets_rebaselined", result2.changesets.rebaselined.length));
|
|
274
213
|
return;
|
|
275
214
|
}
|
|
276
|
-
console.log(ansis.dim(`Migrating model from v${action.fromVersion} to v${action.toVersion}...`));
|
|
277
|
-
const
|
|
215
|
+
console.log(ansis.dim(action.catalogOnly ? `Applying catalog changes to the model (v${action.toVersion})...` : `Migrating model from v${action.fromVersion} to v${action.toVersion}...`));
|
|
216
|
+
const result = await upgradeModel(projectRoot, {
|
|
278
217
|
fromVersion: action.fromVersion,
|
|
279
218
|
toVersion: action.toVersion,
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
});
|
|
283
|
-
for (const
|
|
284
|
-
console.log(ansis.green(` \u2713 ${
|
|
285
|
-
|
|
219
|
+
validate: !options.force,
|
|
220
|
+
catalogOnly: action.catalogOnly
|
|
221
|
+
}), applied = result.migration?.applied ?? [];
|
|
222
|
+
for (const migration of applied)
|
|
223
|
+
console.log(ansis.green(` \u2713 ${migration.from} \u2192 ${migration.to}: ${migration.description}`)), migration.changes?.filesModified && console.log(ansis.dim(` Files modified: ${migration.changes.filesModified}`)), printElementTypeChanges(migration.changes?.details?.elementTypeChanges), printRelationshipChanges(migration.changes?.details?.relationshipChanges), printStagedRelationshipChanges(migration.changes?.details?.stagedRelationshipChanges);
|
|
224
|
+
console.log(ansis.green(action.catalogOnly ? `\u2713 Model in line with the v${action.toVersion} catalog` : `\u2713 Model migrated to v${action.toVersion}`)), printChangesetRebaseline(result.changesets), operationSpan && (operationSpan.setAttribute("upgrade.model.result", "migrated"), operationSpan.setAttribute("upgrade.model.migrations_applied", applied.length), operationSpan.setAttribute("upgrade.model.changesets_rebaselined", result.changesets.rebaselined.length));
|
|
286
225
|
} catch (error) {
|
|
287
226
|
throw operationSpan && (operationSpan.recordException(error), operationSpan.setStatus({
|
|
288
227
|
code: 2,
|
|
@@ -293,6 +232,63 @@ async function executeModelMigration(action, options) {
|
|
|
293
232
|
endSpan(operationSpan);
|
|
294
233
|
}
|
|
295
234
|
}
|
|
235
|
+
function printElementTypeChanges(changes) {
|
|
236
|
+
if (!Array.isArray(changes) || changes.length === 0)
|
|
237
|
+
return;
|
|
238
|
+
const byType = /* @__PURE__ */ new Map();
|
|
239
|
+
for (const c of changes) {
|
|
240
|
+
const key = `${c.fromType} \u2192 ${c.toType}`;
|
|
241
|
+
byType.set(key, (byType.get(key) ?? 0) + 1);
|
|
242
|
+
}
|
|
243
|
+
for (const [key, n] of byType)
|
|
244
|
+
console.log(ansis.dim(` Renamed ${n} element(s): ${key}`));
|
|
245
|
+
}
|
|
246
|
+
function printRelationshipChanges(changes) {
|
|
247
|
+
if (!Array.isArray(changes) || changes.length === 0)
|
|
248
|
+
return;
|
|
249
|
+
const relationshipChanges = changes;
|
|
250
|
+
console.log(ansis.dim(` ${summarizeRelationshipChanges(relationshipChanges)}`));
|
|
251
|
+
for (const change of relationshipChanges)
|
|
252
|
+
change.action === "dropped-duplicate" && change.after ? console.log(ansis.dim(` dropped ${formatRelationship(change.before)} (now the same as ${formatRelationship(change.after)})`)) : change.action === "dropped" && console.log(ansis.dim(` dropped ${formatRelationship(change.before)} (no replacement in the catalog)`));
|
|
253
|
+
}
|
|
254
|
+
function printStagedRelationshipChanges(changes) {
|
|
255
|
+
if (!Array.isArray(changes) || changes.length === 0)
|
|
256
|
+
return;
|
|
257
|
+
const byChangeset = /* @__PURE__ */ new Map();
|
|
258
|
+
for (const change of changes)
|
|
259
|
+
byChangeset.set(change.changeset, [...byChangeset.get(change.changeset) ?? [], change]);
|
|
260
|
+
for (const [changeset, staged] of byChangeset) {
|
|
261
|
+
console.log(ansis.dim(` ${summarizeRelationshipChanges(staged, `changeset ${changeset}, staged relationships`)}`));
|
|
262
|
+
for (const change of staged) {
|
|
263
|
+
if (change.action === "rewritten")
|
|
264
|
+
continue;
|
|
265
|
+
const kind = change.stagedAs === "relationship-add" ? "add" : "delete";
|
|
266
|
+
console.log(ansis.dim(` dropped staged ${kind} of ${formatRelationship(change.before)} (${stagedDropReason(change)})`));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function stagedDropReason(change) {
|
|
271
|
+
if (change.action === "dropped" || !change.after)
|
|
272
|
+
return "no replacement in the catalog";
|
|
273
|
+
const sameAs = `now the same as ${formatRelationship(change.after)}`;
|
|
274
|
+
switch (change.duplicateOf) {
|
|
275
|
+
case "model":
|
|
276
|
+
return `${sameAs}, already in the model`;
|
|
277
|
+
case "kept":
|
|
278
|
+
return `${sameAs}, which also stands for a relationship the changeset keeps`;
|
|
279
|
+
default:
|
|
280
|
+
return change.stagedAs === "relationship-add" ? `${sameAs}, which the changeset already adds` : `${sameAs}, which the changeset already deletes`;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function formatRelationship(rel) {
|
|
284
|
+
return `${rel.source} --[${rel.predicate}]--> ${rel.target}`;
|
|
285
|
+
}
|
|
286
|
+
function printChangesetRebaseline(result) {
|
|
287
|
+
const names = (refs) => refs.map((ref) => ref.name).join(", "), count = (n) => `${n} staged changeset${n === 1 ? "" : "s"}`;
|
|
288
|
+
result.rebaselined.length > 0 && console.log(ansis.green(`\u2713 Re-baselined ${count(result.rebaselined.length)} on the upgraded model: ${names(result.rebaselined)}`)), result.drifted.length > 0 && console.log(ansis.yellow(`\u26A0 ${count(result.drifted.length)} had drifted from the model before the upgrade and still ${result.drifted.length === 1 ? "needs" : "need"} --force to commit: ${names(result.drifted)}`));
|
|
289
|
+
for (const error of result.errors)
|
|
290
|
+
console.log(ansis.yellow(`\u26A0 ${error}`));
|
|
291
|
+
}
|
|
296
292
|
async function executeIntegrationUpdate(label, updateFn) {
|
|
297
293
|
const operationSpan = isTelemetryEnabled ? startSpan("upgrade.integration", {
|
|
298
294
|
"upgrade.integration.label": label,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/upgrade.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Upgrade Command - Manages spec reference and model upgrades\n *\n * Scans the filesystem to determine what needs upgrading:\n * 1. .dr/ (spec reference) - if CLI has newer bundled version\n * 2. Model data - if model spec version doesn't match spec reference\n *\n * Shows upgrade plan and prompts for confirmation before proceeding.\n */\n\nimport ansis from \"ansis\";\nimport { confirm } from \"@clack/prompts\";\nimport { findProjectRoot, getSpecReferencePath, getModelPath } from \"../utils/project-paths.js\";\nimport {\n getCliVersion,\n getCliBundledSpecVersion,\n getInstalledSpecVersion,\n getModelSpecVersion,\n} from \"../utils/spec-version.js\";\nimport { MigrationRegistry } from \"../core/migration-registry.js\";\nimport { installSpecReference } from \"../utils/spec-installer.js\";\nimport { Model } from \"../core/model.js\";\nimport { ClaudeIntegrationManager } from \"../integrations/claude-manager.js\";\nimport { CopilotIntegrationManager } from \"../integrations/copilot-manager.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { startSpan, endSpan } from \"../telemetry/index.js\";\nimport { hasLayerReports, regenerateLayerReports } from \"./reports.js\";\n\n// Build-time constant for telemetry feature detection\ndeclare const TELEMETRY_ENABLED: boolean | undefined;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\nexport interface UpgradeOptions {\n yes?: boolean;\n dryRun?: boolean;\n force?: boolean;\n}\n\ninterface UpgradeAction {\n type: \"spec\" | \"model\" | \"integration\";\n description: string;\n fromVersion?: string;\n toVersion: string;\n details?: string[];\n integrationName?: \"claude\" | \"copilot\";\n versionBumpOnly?: boolean;\n}\n\n/**\n * Build integration upgrade actions and collect up-to-date status lines\n */\nasync function buildIntegrationActions(\n cliVersion: string,\n force: boolean\n): Promise<{ actions: UpgradeAction[]; upToDate: string[] }> {\n const actions: UpgradeAction[] = [];\n const upToDate: string[] = [];\n\n // Check Claude integration\n const claudeManager = new ClaudeIntegrationManager();\n if (await claudeManager.isInstalled()) {\n const claudeVersion = await claudeManager.loadVersionFile();\n const installedVersion = claudeVersion?.version;\n const needsUpgrade = installedVersion && installedVersion !== cliVersion;\n\n if (force || needsUpgrade) {\n actions.push({\n type: \"integration\",\n description: force\n ? \"Reinstall Claude Code integration (forced)\"\n : \"Upgrade Claude Code integration\",\n fromVersion: installedVersion,\n toVersion: cliVersion,\n integrationName: \"claude\",\n });\n } else if (installedVersion) {\n upToDate.push(\n ` ${ansis.green(\"\u2713\")} Claude Code integration up to date (v${installedVersion})`\n );\n }\n }\n\n // Check Copilot integration\n const copilotManager = new CopilotIntegrationManager();\n if (await copilotManager.isInstalled()) {\n const copilotVersion = await copilotManager.loadVersionFile();\n const installedVersion = copilotVersion?.version;\n const needsUpgrade = installedVersion && installedVersion !== cliVersion;\n\n if (force || needsUpgrade) {\n actions.push({\n type: \"integration\",\n description: force\n ? \"Reinstall GitHub Copilot integration (forced)\"\n : \"Upgrade GitHub Copilot integration\",\n fromVersion: installedVersion,\n toVersion: cliVersion,\n integrationName: \"copilot\",\n });\n } else if (installedVersion) {\n upToDate.push(\n ` ${ansis.green(\"\u2713\")} GitHub Copilot integration up to date (v${installedVersion})`\n );\n }\n }\n\n return { actions, upToDate };\n}\n\n/**\n * Check if layer reports exist; if not, offer to generate them.\n * Defaults to generating (yes) \u2014 including in non-interactive/programmatic mode.\n */\nasync function checkAndGenerateReports(\n projectRoot: string,\n options: UpgradeOptions\n): Promise<void> {\n if (await hasLayerReports(projectRoot)) {\n return;\n }\n\n console.log(ansis.yellow(\"\\n\u26A0 No layer reports found\"));\n\n if (options.dryRun) {\n console.log(ansis.yellow(\"[DRY RUN] Would generate all 13 layer reports\\n\"));\n return;\n }\n\n // Determine whether to generate: default is yes\n let shouldGenerate: boolean;\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (options.yes) {\n shouldGenerate = true;\n } else if (isInteractive) {\n const response = await confirm({\n message: \"Generate layer reports?\",\n initialValue: true,\n });\n shouldGenerate = response === true;\n } else {\n // Non-interactive / programmatic: auto-generate since default is yes\n shouldGenerate = true;\n }\n\n if (!shouldGenerate) {\n console.log(ansis.dim(\"Skipping report generation\\n\"));\n return;\n }\n\n try {\n console.log();\n await regenerateLayerReports(projectRoot);\n } catch (error) {\n // Warn but don't block upgrade success\n console.warn(ansis.yellow(`\\n\u26A0 Failed to generate reports: ${getErrorMessage(error)}\\n`));\n }\n}\n\nexport async function upgradeCommand(options: UpgradeOptions = {}): Promise<void> {\n const commandSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.execute\", {\n \"upgrade.yes\": options.yes || false,\n \"upgrade.dry_run\": options.dryRun || false,\n \"upgrade.force\": options.force || false,\n })\n : null;\n\n try {\n console.log(ansis.bold(\"\\nScanning for available upgrades...\\n\"));\n\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n const error = new Error(\"No DR project found. Run \\\"dr init\\\" to create a new project\");\n if (commandSpan) {\n commandSpan.recordException(error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n commandSpan.setAttribute(\"upgrade.result\", \"no_project\");\n }\n console.error(ansis.red(\"Error: No DR project found\"));\n console.error(ansis.dim('Run \"dr init\" to create a new project'));\n throw error;\n }\n\n const bundledSpecVersion = getCliBundledSpecVersion();\n const cliVersion = getCliVersion();\n const actions: UpgradeAction[] = [];\n\n // ============================================================================\n // STEP 1: Check spec reference (.dr/ folder)\n // ============================================================================\n\n const drPath = await getSpecReferencePath();\n let currentSpecVersion: string | null = null;\n\n if (!drPath) {\n actions.push({\n type: \"spec\",\n description: \"Install spec reference\",\n toVersion: bundledSpecVersion,\n details: [\n \"Create .dr/ folder\",\n \"Install schema files\",\n `Set spec version to ${bundledSpecVersion}`,\n ],\n });\n } else {\n let installedSpecVersion: string | null = null;\n try {\n installedSpecVersion = await getInstalledSpecVersion(drPath);\n } catch (error) {\n // Manifest file exists but is corrupted or unreadable\n const message = error instanceof Error ? error.message : String(error);\n console.error(ansis.red(`Error: ${message}`));\n throw error;\n }\n currentSpecVersion = installedSpecVersion;\n\n if (!installedSpecVersion) {\n actions.push({\n type: \"spec\",\n description: \"Reinstall spec reference (manifest missing)\",\n toVersion: bundledSpecVersion,\n details: [\n \"Recreate .dr/manifest.json\",\n \"Update schema files\",\n `Set spec version to ${bundledSpecVersion}`,\n ],\n });\n } else if (installedSpecVersion !== bundledSpecVersion || options.force) {\n actions.push({\n type: \"spec\",\n description: installedSpecVersion !== bundledSpecVersion\n ? \"Upgrade spec reference\"\n : \"Reinstall spec reference (forced)\",\n fromVersion: installedSpecVersion,\n toVersion: bundledSpecVersion,\n details: [\"Update schema files\", \"Update .dr/manifest.json\"],\n });\n }\n }\n\n // ============================================================================\n // STEP 2: Check model upgrade\n // ============================================================================\n\n const modelPath = await getModelPath();\n if (!modelPath) {\n console.log(ansis.yellow(\"\u26A0 No model found\"));\n console.log(ansis.dim(' Run \"dr init\" to create a model\\n'));\n\n // If only spec needs upgrade, handle it\n if (actions.length > 0) {\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n }\n // No model loaded \u2014 report generation not applicable\n return;\n }\n\n let modelSpecVersion: string | null = null;\n try {\n modelSpecVersion = await getModelSpecVersion(modelPath);\n } catch (error) {\n // Manifest file exists but is corrupted or unreadable\n const message = error instanceof Error ? error.message : String(error);\n console.error(ansis.red(`Error: ${message}`));\n throw error;\n }\n\n if (!modelSpecVersion) {\n console.log(ansis.yellow(\"\u26A0 Model manifest.yaml not found or missing specVersion\"));\n console.log(ansis.dim(\" Check documentation_robotics/model/manifest.yaml\\n\"));\n\n // If only spec needs upgrade, handle it\n if (actions.length > 0) {\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n }\n // No readable model manifest \u2014 report generation not applicable\n return;\n }\n\n // Determine target spec version for model\n const targetSpecVersion = currentSpecVersion || bundledSpecVersion;\n\n if (modelSpecVersion !== targetSpecVersion) {\n // Check if we have a migration path\n const registry = new MigrationRegistry();\n const summary = registry.getMigrationSummary(modelSpecVersion, targetSpecVersion);\n\n if (summary.migrationsNeeded === 0) {\n if (options.force) {\n // No migration path exists, but --force allows bumping the model version directly.\n // This is safe for additive spec changes (new node types / relationships) that\n // require no structural data changes.\n actions.push({\n type: \"model\",\n description: \"Force-update model spec version (no migration required)\",\n fromVersion: modelSpecVersion,\n toVersion: targetSpecVersion,\n details: [\"Update manifest.yaml specVersion (no data changes needed)\"],\n versionBumpOnly: true,\n });\n } else {\n const error = new Error(\n `No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`\n );\n if (commandSpan) {\n commandSpan.recordException(error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n commandSpan.setAttribute(\"upgrade.result\", \"no_migration_path\");\n }\n console.log(\n ansis.yellow(\n `\u26A0 No migration path found from model v${modelSpecVersion} to v${targetSpecVersion}`\n )\n );\n console.log(ansis.dim(\"\\nAvailable migrations:\"));\n const allMigrations = registry.getMigrationSummary(\"0.5.0\").migrations;\n for (const migration of allMigrations) {\n console.log(\n ansis.dim(` \u2022 ${migration.from} \u2192 ${migration.to}: ${migration.description}`)\n );\n }\n console.log();\n throw error;\n }\n }\n\n const migrationDetails = summary.migrations.map(\n (m) => `${m.from} \u2192 ${m.to}: ${m.description}`\n );\n\n actions.push({\n type: \"model\",\n description: \"Migrate model data\",\n fromVersion: modelSpecVersion,\n toVersion: targetSpecVersion,\n details: migrationDetails,\n });\n }\n\n // ============================================================================\n // STEP 3: Check integration versions\n // ============================================================================\n\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n\n // ============================================================================\n // STEP 4: Display upgrade plan and execute\n // ============================================================================\n\n if (actions.length === 0) {\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.result\", \"up_to_date\");\n commandSpan.setAttribute(\"upgrade.actions_count\", 0);\n }\n console.log(ansis.green(\"\u2713 Everything is up to date!\\n\"));\n console.log(ansis.dim(` Spec reference: v${currentSpecVersion || bundledSpecVersion}`));\n console.log(ansis.dim(` Model: v${modelSpecVersion}\\n`));\n await checkAndGenerateReports(projectRoot, options);\n return;\n }\n\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.actions_count\", actions.length);\n commandSpan.setAttribute(\n \"upgrade.has_spec_upgrade\",\n actions.some((a) => a.type === \"spec\")\n );\n commandSpan.setAttribute(\n \"upgrade.has_model_migration\",\n actions.some((a) => a.type === \"model\")\n );\n commandSpan.setAttribute(\n \"upgrade.has_integration_upgrade\",\n actions.some((a) => a.type === \"integration\")\n );\n }\n\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n await checkAndGenerateReports(projectRoot, options);\n\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.result\", \"success\");\n }\n } catch (error) {\n if (commandSpan) {\n commandSpan.recordException(error as Error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n commandSpan.setAttribute(\"upgrade.result\", \"error\");\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n throw error;\n } finally {\n endSpan(commandSpan);\n }\n}\n\n/**\n * Handle the upgrade process\n */\nasync function handleUpgrade(\n projectRoot: string,\n actions: UpgradeAction[],\n options: UpgradeOptions,\n integrationUpToDate: string[] = [],\n parentSpan: any = null\n): Promise<void> {\n // Display upgrade plan\n if (actions.length > 0) {\n console.log(ansis.bold(\"Upgrade Plan:\\n\"));\n\n for (const action of actions) {\n const versionChange = action.fromVersion\n ? `${action.fromVersion} \u2192 ${action.toVersion}`\n : `v${action.toVersion}`;\n\n const icon = action.type === \"spec\" ? \"\uD83D\uDCE6\" : action.type === \"integration\" ? \"\uD83D\uDD0C\" : \"\uD83D\uDD04\";\n console.log(ansis.yellow(`${icon} ${action.description}`));\n console.log(ansis.dim(` Version: ${versionChange}`));\n\n if (action.details && action.details.length > 0) {\n for (const detail of action.details) {\n console.log(ansis.dim(` \u2022 ${detail}`));\n }\n }\n console.log();\n }\n }\n\n // Display integration status for up-to-date integrations\n if (integrationUpToDate.length > 0) {\n console.log(ansis.bold(\"Integration Status:\"));\n integrationUpToDate.forEach((msg) => console.log(msg));\n console.log();\n }\n\n // Handle dry-run mode\n if (options.dryRun) {\n console.log(ansis.yellow(\"[DRY RUN] No changes will be made\\n\"));\n if (parentSpan) {\n parentSpan.setAttribute(\"upgrade.dry_run_completed\", true);\n }\n return;\n }\n\n // Prompt for confirmation unless --yes flag is set\n let shouldProceed = options.yes;\n if (!shouldProceed) {\n // Check if we're in an interactive terminal\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (isInteractive) {\n const response = await confirm({\n message: \"Proceed with upgrade?\",\n });\n shouldProceed = response === true;\n } else {\n const error = new Error(\"Non-interactive mode requires --yes flag to proceed with upgrade\");\n if (parentSpan) {\n parentSpan.recordException(error);\n parentSpan.setAttribute(\"upgrade.result\", \"non_interactive_abort\");\n }\n console.error(\n ansis.red(\"Error: Non-interactive mode requires --yes flag to proceed with upgrade\")\n );\n throw error;\n }\n }\n\n if (!shouldProceed) {\n console.log(ansis.dim(\"\\nUpgrade cancelled\\n\"));\n if (parentSpan) {\n parentSpan.setAttribute(\"upgrade.user_cancelled\", true);\n }\n return;\n }\n\n console.log(ansis.bold(\"\\nExecuting upgrades...\\n\"));\n\n // Execute actions in order: spec, model, then integrations\n for (const action of actions) {\n if (action.type === \"spec\") {\n await executeSpecUpgrade(projectRoot, action);\n } else if (action.type === \"model\") {\n await executeModelMigration(action, options);\n } else if (action.type === \"integration\") {\n await executeIntegrationUpdate(action.description, async () => {\n if (action.integrationName === \"claude\") {\n const m = new ClaudeIntegrationManager();\n await m.upgrade({ force: true }); // force=true skips internal prompts (user confirmed above)\n } else {\n const m = new CopilotIntegrationManager();\n await m.upgrade({ force: true });\n }\n });\n }\n }\n\n console.log(ansis.green(\"\\n\u2713 All upgrades completed successfully!\\n\"));\n}\n\n/**\n * Execute spec reference upgrade\n */\nasync function executeSpecUpgrade(projectRoot: string, action: UpgradeAction): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.spec\", {\n \"upgrade.spec.from_version\": action.fromVersion || \"none\",\n \"upgrade.spec.to_version\": action.toVersion,\n \"upgrade.spec.is_reinstall\": !action.fromVersion,\n })\n : null;\n\n try {\n console.log(ansis.dim(`Installing spec reference v${action.toVersion}...`));\n await installSpecReference(projectRoot, true);\n console.log(ansis.green(`\u2713 Spec reference upgraded to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.spec.result\", \"success\");\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.spec.result\", \"error\");\n }\n console.error(\n ansis.red(\n `Error upgrading spec reference: ${getErrorMessage(error)}`\n )\n );\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n\n/**\n * Execute model migration\n */\nasync function executeModelMigration(\n action: UpgradeAction,\n options: UpgradeOptions\n): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.model\", {\n \"upgrade.model.from_version\": action.fromVersion || \"unknown\",\n \"upgrade.model.to_version\": action.toVersion,\n \"upgrade.model.version_bump_only\": action.versionBumpOnly || false,\n \"upgrade.model.validate\": !options.force,\n })\n : null;\n\n try {\n if (action.versionBumpOnly) {\n console.log(\n ansis.dim(`Bumping model spec version from v${action.fromVersion} to v${action.toVersion}...`)\n );\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n model.manifest.specVersion = action.toVersion;\n await model.saveManifest();\n console.log(ansis.green(`\u2713 Model spec version updated to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"version_bumped\");\n }\n return;\n }\n\n console.log(\n ansis.dim(`Migrating model from v${action.fromVersion} to v${action.toVersion}...`)\n );\n\n // Load the model\n const model = await Model.load(process.cwd(), { lazyLoad: false });\n\n // Apply migrations\n const registry = new MigrationRegistry();\n const result = await registry.applyMigrations(model, {\n fromVersion: action.fromVersion!,\n toVersion: action.toVersion,\n dryRun: false,\n validate: !options.force,\n });\n\n // Display migration results\n for (const applied of result.applied) {\n console.log(ansis.green(` \u2713 ${applied.from} \u2192 ${applied.to}: ${applied.description}`));\n if (applied.changes?.filesModified) {\n console.log(ansis.dim(` Files modified: ${applied.changes.filesModified}`));\n }\n }\n\n // Save changes\n await model.saveManifest();\n await model.saveDirtyLayers();\n\n console.log(ansis.green(`\u2713 Model migrated to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"migrated\");\n operationSpan.setAttribute(\"upgrade.model.migrations_applied\", result.applied.length);\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.model.result\", \"error\");\n }\n console.error(\n ansis.red(`Error migrating model: ${getErrorMessage(error)}`)\n );\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n\n/**\n * Execute integration update\n */\nasync function executeIntegrationUpdate(\n label: string,\n updateFn: () => Promise<void>\n): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.integration\", {\n \"upgrade.integration.label\": label,\n \"upgrade.integration.type\": label.includes(\"Claude\")\n ? \"claude\"\n : label.includes(\"Copilot\")\n ? \"copilot\"\n : \"unknown\",\n })\n : null;\n\n try {\n console.log(ansis.dim(`${label}...`));\n await updateFn();\n console.log(ansis.green(`\u2713 ${label}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.integration.result\", \"success\");\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.integration.result\", \"error\");\n }\n console.error(ansis.red(`Error: ${label} failed: ${getErrorMessage(error)}`));\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["integrationActions", "integrationUpToDate", "
|
|
4
|
+
"sourcesContent": ["/**\n * Upgrade Command - Manages spec reference and model upgrades\n *\n * Scans the filesystem to determine what needs upgrading:\n * 1. .dr/ (spec reference) - if CLI has newer bundled version\n * 2. Model data - if model spec version doesn't match spec reference\n *\n * Shows upgrade plan and prompts for confirmation before proceeding.\n */\n\nimport ansis from \"ansis\";\nimport { confirm } from \"@clack/prompts\";\nimport { findProjectRoot } from \"../utils/project-paths.js\";\nimport { getCliVersion, getCliBundledSpecVersion } from \"../utils/spec-version.js\";\nimport { scanUpgrades, UpgradeScanError, type UpgradeAction, type UpgradeScan } from \"../core/upgrade-plan.js\";\nimport {\n upgradeModel,\n type ChangesetRebaselineResult,\n type ChangesetRef,\n} from \"../core/model-upgrade.js\";\nimport {\n summarizeRelationshipChanges,\n type RelationshipRewriteChange,\n type StagedRelationshipRewriteChange,\n} from \"../core/relationship-migration.js\";\nimport { installSpecReference } from \"../utils/spec-installer.js\";\nimport { ClaudeIntegrationManager } from \"../integrations/claude-manager.js\";\nimport { CopilotIntegrationManager } from \"../integrations/copilot-manager.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { startSpan, endSpan } from \"../telemetry/index.js\";\nimport { hasLayerReports, regenerateLayerReports } from \"./reports.js\";\n\n// Build-time constant for telemetry feature detection\ndeclare const TELEMETRY_ENABLED: boolean | undefined;\nconst isTelemetryEnabled = typeof TELEMETRY_ENABLED !== \"undefined\" ? TELEMETRY_ENABLED : false;\n\nexport interface UpgradeOptions {\n yes?: boolean;\n dryRun?: boolean;\n force?: boolean;\n}\n\n/**\n * Build integration upgrade actions and collect up-to-date status lines\n */\nasync function buildIntegrationActions(\n cliVersion: string,\n force: boolean\n): Promise<{ actions: UpgradeAction[]; upToDate: string[] }> {\n const actions: UpgradeAction[] = [];\n const upToDate: string[] = [];\n\n // Check Claude integration\n const claudeManager = new ClaudeIntegrationManager();\n if (await claudeManager.isInstalled()) {\n const claudeVersion = await claudeManager.loadVersionFile();\n const installedVersion = claudeVersion?.version;\n const needsUpgrade = installedVersion && installedVersion !== cliVersion;\n\n if (force || needsUpgrade) {\n actions.push({\n type: \"integration\",\n description: force\n ? \"Reinstall Claude Code integration (forced)\"\n : \"Upgrade Claude Code integration\",\n fromVersion: installedVersion,\n toVersion: cliVersion,\n integrationName: \"claude\",\n });\n } else if (installedVersion) {\n upToDate.push(\n ` ${ansis.green(\"\u2713\")} Claude Code integration up to date (v${installedVersion})`\n );\n }\n }\n\n // Check Copilot integration\n const copilotManager = new CopilotIntegrationManager();\n if (await copilotManager.isInstalled()) {\n const copilotVersion = await copilotManager.loadVersionFile();\n const installedVersion = copilotVersion?.version;\n const needsUpgrade = installedVersion && installedVersion !== cliVersion;\n\n if (force || needsUpgrade) {\n actions.push({\n type: \"integration\",\n description: force\n ? \"Reinstall GitHub Copilot integration (forced)\"\n : \"Upgrade GitHub Copilot integration\",\n fromVersion: installedVersion,\n toVersion: cliVersion,\n integrationName: \"copilot\",\n });\n } else if (installedVersion) {\n upToDate.push(\n ` ${ansis.green(\"\u2713\")} GitHub Copilot integration up to date (v${installedVersion})`\n );\n }\n }\n\n return { actions, upToDate };\n}\n\n/**\n * Check if layer reports exist; if not, offer to generate them.\n * Defaults to generating (yes) \u2014 including in non-interactive/programmatic mode.\n */\nasync function checkAndGenerateReports(\n projectRoot: string,\n options: UpgradeOptions\n): Promise<void> {\n if (await hasLayerReports(projectRoot)) {\n return;\n }\n\n console.log(ansis.yellow(\"\\n\u26A0 No layer reports found\"));\n\n if (options.dryRun) {\n console.log(ansis.yellow(\"[DRY RUN] Would generate all 13 layer reports\\n\"));\n return;\n }\n\n // Determine whether to generate: default is yes\n let shouldGenerate: boolean;\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (options.yes) {\n shouldGenerate = true;\n } else if (isInteractive) {\n const response = await confirm({\n message: \"Generate layer reports?\",\n initialValue: true,\n });\n shouldGenerate = response === true;\n } else {\n // Non-interactive / programmatic: auto-generate since default is yes\n shouldGenerate = true;\n }\n\n if (!shouldGenerate) {\n console.log(ansis.dim(\"Skipping report generation\\n\"));\n return;\n }\n\n try {\n console.log();\n await regenerateLayerReports(projectRoot);\n } catch (error) {\n // Warn but don't block upgrade success\n console.warn(ansis.yellow(`\\n\u26A0 Failed to generate reports: ${getErrorMessage(error)}\\n`));\n }\n}\n\nexport async function upgradeCommand(options: UpgradeOptions = {}): Promise<void> {\n const commandSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.execute\", {\n \"upgrade.yes\": options.yes || false,\n \"upgrade.dry_run\": options.dryRun || false,\n \"upgrade.force\": options.force || false,\n })\n : null;\n\n try {\n console.log(ansis.bold(\"\\nScanning for available upgrades...\\n\"));\n\n // Find project root\n const projectRoot = await findProjectRoot();\n if (!projectRoot) {\n const error = new Error(\"No DR project found. Run \\\"dr init\\\" to create a new project\");\n if (commandSpan) {\n commandSpan.recordException(error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n commandSpan.setAttribute(\"upgrade.result\", \"no_project\");\n }\n console.error(ansis.red(\"Error: No DR project found\"));\n console.error(ansis.dim('Run \"dr init\" to create a new project'));\n throw error;\n }\n\n const bundledSpecVersion = getCliBundledSpecVersion();\n const cliVersion = getCliVersion();\n\n // ============================================================================\n // STEPS 1-2: Check the spec reference (.dr/ folder) and the model\n // ============================================================================\n\n let scan: UpgradeScan;\n try {\n scan = await scanUpgrades(projectRoot, { force: options.force });\n } catch (error) {\n // The spec reference or model manifest exists but is corrupted or unreadable\n if (error instanceof UpgradeScanError) {\n console.error(ansis.red(`Error: ${error.message}`));\n }\n throw error;\n }\n const actions: UpgradeAction[] = [...scan.actions];\n const currentSpecVersion = scan.installedSpecVersion;\n\n if (scan.model.state !== \"found\") {\n if (scan.model.state === \"missing\") {\n console.log(ansis.yellow(\"\u26A0 No model found\"));\n console.log(ansis.dim(' Run \"dr init\" to create a model\\n'));\n } else {\n console.log(ansis.yellow(\"\u26A0 Model manifest.yaml not found or missing specVersion\"));\n console.log(ansis.dim(\" Check documentation_robotics/model/manifest.yaml\\n\"));\n }\n\n // If only spec needs upgrade, handle it\n if (actions.length > 0) {\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n }\n // No readable model \u2014 report generation not applicable\n return;\n }\n\n const modelSpecVersion = scan.model.specVersion;\n\n if (scan.noMigrationPath) {\n const { from, to, available } = scan.noMigrationPath;\n const error = new Error(`No migration path found from model v${from} to v${to}`);\n if (commandSpan) {\n commandSpan.recordException(error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: error.message,\n });\n commandSpan.setAttribute(\"upgrade.result\", \"no_migration_path\");\n }\n console.log(ansis.yellow(`\u26A0 No migration path found from model v${from} to v${to}`));\n console.log(ansis.dim(\"\\nAvailable migrations:\"));\n for (const migration of available) {\n console.log(ansis.dim(` \u2022 ${migration.from} \u2192 ${migration.to}: ${migration.description}`));\n }\n console.log();\n throw error;\n }\n\n if (scan.catalogCheckError !== undefined) {\n console.log(ansis.yellow(`\u26A0 Could not check the model against the catalog: ${scan.catalogCheckError}`));\n }\n\n // ============================================================================\n // STEP 3: Check integration versions\n // ============================================================================\n\n const { actions: integrationActions, upToDate: integrationUpToDate } =\n await buildIntegrationActions(cliVersion, options.force ?? false);\n actions.push(...integrationActions);\n\n // ============================================================================\n // STEP 4: Display upgrade plan and execute\n // ============================================================================\n\n if (actions.length === 0) {\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.result\", \"up_to_date\");\n commandSpan.setAttribute(\"upgrade.actions_count\", 0);\n }\n console.log(ansis.green(\"\u2713 Everything is up to date!\\n\"));\n console.log(ansis.dim(` Spec reference: v${currentSpecVersion || bundledSpecVersion}`));\n console.log(ansis.dim(` Model: v${modelSpecVersion}\\n`));\n await checkAndGenerateReports(projectRoot, options);\n return;\n }\n\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.actions_count\", actions.length);\n commandSpan.setAttribute(\n \"upgrade.has_spec_upgrade\",\n actions.some((a) => a.type === \"spec\")\n );\n commandSpan.setAttribute(\n \"upgrade.has_model_migration\",\n actions.some((a) => a.type === \"model\")\n );\n commandSpan.setAttribute(\n \"upgrade.has_integration_upgrade\",\n actions.some((a) => a.type === \"integration\")\n );\n }\n\n await handleUpgrade(projectRoot, actions, options, integrationUpToDate, commandSpan);\n await checkAndGenerateReports(projectRoot, options);\n\n if (commandSpan) {\n commandSpan.setAttribute(\"upgrade.result\", \"success\");\n }\n } catch (error) {\n if (commandSpan) {\n commandSpan.recordException(error as Error);\n commandSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n commandSpan.setAttribute(\"upgrade.result\", \"error\");\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n throw error;\n } finally {\n endSpan(commandSpan);\n }\n}\n\n/**\n * Handle the upgrade process\n */\nasync function handleUpgrade(\n projectRoot: string,\n actions: UpgradeAction[],\n options: UpgradeOptions,\n integrationUpToDate: string[] = [],\n parentSpan: any = null\n): Promise<void> {\n // Display upgrade plan\n if (actions.length > 0) {\n console.log(ansis.bold(\"Upgrade Plan:\\n\"));\n\n for (const action of actions) {\n const versionChange = action.fromVersion\n ? `${action.fromVersion} \u2192 ${action.toVersion}`\n : `v${action.toVersion}`;\n\n const icon = action.type === \"spec\" ? \"\uD83D\uDCE6\" : action.type === \"integration\" ? \"\uD83D\uDD0C\" : \"\uD83D\uDD04\";\n console.log(ansis.yellow(`${icon} ${action.description}`));\n console.log(ansis.dim(` Version: ${versionChange}`));\n\n if (action.details && action.details.length > 0) {\n for (const detail of action.details) {\n console.log(ansis.dim(` \u2022 ${detail}`));\n }\n }\n console.log();\n }\n }\n\n // Display integration status for up-to-date integrations\n if (integrationUpToDate.length > 0) {\n console.log(ansis.bold(\"Integration Status:\"));\n integrationUpToDate.forEach((msg) => console.log(msg));\n console.log();\n }\n\n // Handle dry-run mode\n if (options.dryRun) {\n console.log(ansis.yellow(\"[DRY RUN] No changes will be made\\n\"));\n if (parentSpan) {\n parentSpan.setAttribute(\"upgrade.dry_run_completed\", true);\n }\n return;\n }\n\n // Prompt for confirmation unless --yes flag is set\n let shouldProceed = options.yes;\n if (!shouldProceed) {\n // Check if we're in an interactive terminal\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (isInteractive) {\n const response = await confirm({\n message: \"Proceed with upgrade?\",\n });\n shouldProceed = response === true;\n } else {\n const error = new Error(\"Non-interactive mode requires --yes flag to proceed with upgrade\");\n if (parentSpan) {\n parentSpan.recordException(error);\n parentSpan.setAttribute(\"upgrade.result\", \"non_interactive_abort\");\n }\n console.error(\n ansis.red(\"Error: Non-interactive mode requires --yes flag to proceed with upgrade\")\n );\n throw error;\n }\n }\n\n if (!shouldProceed) {\n console.log(ansis.dim(\"\\nUpgrade cancelled\\n\"));\n if (parentSpan) {\n parentSpan.setAttribute(\"upgrade.user_cancelled\", true);\n }\n return;\n }\n\n console.log(ansis.bold(\"\\nExecuting upgrades...\\n\"));\n\n // Execute actions in order: spec, model, then integrations\n for (const action of actions) {\n if (action.type === \"spec\") {\n await executeSpecUpgrade(projectRoot, action);\n } else if (action.type === \"model\") {\n await executeModelMigration(projectRoot, action, options);\n } else if (action.type === \"integration\") {\n await executeIntegrationUpdate(action.description, async () => {\n if (action.integrationName === \"claude\") {\n const m = new ClaudeIntegrationManager();\n await m.upgrade({ force: true }); // force=true skips internal prompts (user confirmed above)\n } else {\n const m = new CopilotIntegrationManager();\n await m.upgrade({ force: true });\n }\n });\n }\n }\n\n console.log(ansis.green(\"\\n\u2713 All upgrades completed successfully!\\n\"));\n}\n\n/**\n * Execute spec reference upgrade\n */\nasync function executeSpecUpgrade(projectRoot: string, action: UpgradeAction): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.spec\", {\n \"upgrade.spec.from_version\": action.fromVersion || \"none\",\n \"upgrade.spec.to_version\": action.toVersion,\n \"upgrade.spec.is_reinstall\": !action.fromVersion,\n })\n : null;\n\n try {\n console.log(ansis.dim(`Installing spec reference v${action.toVersion}...`));\n await installSpecReference(projectRoot, true);\n console.log(ansis.green(`\u2713 Spec reference upgraded to v${action.toVersion}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.spec.result\", \"success\");\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.spec.result\", \"error\");\n }\n console.error(\n ansis.red(\n `Error upgrading spec reference: ${getErrorMessage(error)}`\n )\n );\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n\n/**\n * Execute model migration\n */\nasync function executeModelMigration(\n projectRoot: string,\n action: UpgradeAction,\n options: UpgradeOptions\n): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.model\", {\n \"upgrade.model.from_version\": action.fromVersion || \"unknown\",\n \"upgrade.model.to_version\": action.toVersion,\n \"upgrade.model.version_bump_only\": action.versionBumpOnly || false,\n \"upgrade.model.validate\": !options.force,\n })\n : null;\n\n try {\n if (action.versionBumpOnly) {\n console.log(\n ansis.dim(`Bumping model spec version from v${action.fromVersion} to v${action.toVersion}...`)\n );\n const result = await upgradeModel(projectRoot, {\n fromVersion: action.fromVersion!,\n toVersion: action.toVersion,\n versionBumpOnly: true,\n });\n console.log(ansis.green(`\u2713 Model spec version updated to v${action.toVersion}`));\n printChangesetRebaseline(result.changesets);\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"version_bumped\");\n operationSpan.setAttribute(\n \"upgrade.model.changesets_rebaselined\",\n result.changesets.rebaselined.length\n );\n }\n return;\n }\n\n console.log(\n ansis.dim(\n action.catalogOnly\n ? `Applying catalog changes to the model (v${action.toVersion})...`\n : `Migrating model from v${action.fromVersion} to v${action.toVersion}...`\n )\n );\n\n // Apply migrations, save the model and re-baseline staged changesets on it\n const result = await upgradeModel(projectRoot, {\n fromVersion: action.fromVersion!,\n toVersion: action.toVersion,\n validate: !options.force,\n catalogOnly: action.catalogOnly,\n });\n const applied = result.migration?.applied ?? [];\n\n // Display migration results\n for (const migration of applied) {\n console.log(ansis.green(` \u2713 ${migration.from} \u2192 ${migration.to}: ${migration.description}`));\n if (migration.changes?.filesModified) {\n console.log(ansis.dim(` Files modified: ${migration.changes.filesModified}`));\n }\n printElementTypeChanges(migration.changes?.details?.elementTypeChanges);\n printRelationshipChanges(migration.changes?.details?.relationshipChanges);\n printStagedRelationshipChanges(migration.changes?.details?.stagedRelationshipChanges);\n }\n\n console.log(\n ansis.green(\n action.catalogOnly\n ? `\u2713 Model in line with the v${action.toVersion} catalog`\n : `\u2713 Model migrated to v${action.toVersion}`\n )\n );\n printChangesetRebaseline(result.changesets);\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.model.result\", \"migrated\");\n operationSpan.setAttribute(\"upgrade.model.migrations_applied\", applied.length);\n operationSpan.setAttribute(\n \"upgrade.model.changesets_rebaselined\",\n result.changesets.rebaselined.length\n );\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.model.result\", \"error\");\n }\n console.error(\n ansis.red(`Error migrating model: ${getErrorMessage(error)}`)\n );\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n\n/**\n * Report elements whose type a catalog migration renamed\n */\nfunction printElementTypeChanges(changes: unknown): void {\n if (!Array.isArray(changes) || changes.length === 0) {\n return;\n }\n const byType = new Map<string, number>();\n for (const c of changes as Array<{ fromType: string; toType: string }>) {\n const key = `${c.fromType} \u2192 ${c.toType}`;\n byType.set(key, (byType.get(key) ?? 0) + 1);\n }\n for (const [key, n] of byType) {\n console.log(ansis.dim(` Renamed ${n} element(s): ${key}`));\n }\n}\n\n/**\n * Report relationships a catalog migration rewrote, listing each one it dropped\n */\nfunction printRelationshipChanges(changes: unknown): void {\n if (!Array.isArray(changes) || changes.length === 0) {\n return;\n }\n const relationshipChanges = changes as RelationshipRewriteChange[];\n\n console.log(ansis.dim(` ${summarizeRelationshipChanges(relationshipChanges)}`));\n for (const change of relationshipChanges) {\n if (change.action === \"dropped-duplicate\" && change.after) {\n console.log(\n ansis.dim(\n ` dropped ${formatRelationship(change.before)} (now the same as ${formatRelationship(change.after)})`\n )\n );\n } else if (change.action === \"dropped\") {\n console.log(\n ansis.dim(` dropped ${formatRelationship(change.before)} (no replacement in the catalog)`)\n );\n }\n }\n}\n\n/**\n * Report staged changeset changes a catalog migration rewrote, per changeset, listing each one\n * it removed from its changeset\n */\nfunction printStagedRelationshipChanges(changes: unknown): void {\n if (!Array.isArray(changes) || changes.length === 0) {\n return;\n }\n const byChangeset = new Map<string, StagedRelationshipRewriteChange[]>();\n for (const change of changes as StagedRelationshipRewriteChange[]) {\n byChangeset.set(change.changeset, [...(byChangeset.get(change.changeset) ?? []), change]);\n }\n\n for (const [changeset, staged] of byChangeset) {\n console.log(\n ansis.dim(` ${summarizeRelationshipChanges(staged, `changeset ${changeset}, staged relationships`)}`)\n );\n for (const change of staged) {\n if (change.action === \"rewritten\") {\n continue;\n }\n const kind = change.stagedAs === \"relationship-add\" ? \"add\" : \"delete\";\n console.log(\n ansis.dim(\n ` dropped staged ${kind} of ${formatRelationship(change.before)} (${stagedDropReason(change)})`\n )\n );\n }\n }\n}\n\nfunction stagedDropReason(change: StagedRelationshipRewriteChange): string {\n if (change.action === \"dropped\" || !change.after) {\n return \"no replacement in the catalog\";\n }\n const sameAs = `now the same as ${formatRelationship(change.after)}`;\n switch (change.duplicateOf) {\n case \"model\":\n return `${sameAs}, already in the model`;\n case \"kept\":\n return `${sameAs}, which also stands for a relationship the changeset keeps`;\n default:\n return change.stagedAs === \"relationship-add\"\n ? `${sameAs}, which the changeset already adds`\n : `${sameAs}, which the changeset already deletes`;\n }\n}\n\nfunction formatRelationship(rel: { source: string; predicate: string; target: string }): string {\n return `${rel.source} --[${rel.predicate}]--> ${rel.target}`;\n}\n\n/**\n * Report the staged changesets re-baselined on the upgraded model, and those left on their old\n * base snapshot because they had drifted before the upgrade\n */\nfunction printChangesetRebaseline(result: ChangesetRebaselineResult): void {\n const names = (refs: ChangesetRef[]) => refs.map((ref) => ref.name).join(\", \");\n const count = (n: number) => `${n} staged changeset${n === 1 ? \"\" : \"s\"}`;\n\n if (result.rebaselined.length > 0) {\n console.log(\n ansis.green(\n `\u2713 Re-baselined ${count(result.rebaselined.length)} on the upgraded model: ${names(result.rebaselined)}`\n )\n );\n }\n if (result.drifted.length > 0) {\n console.log(\n ansis.yellow(\n `\u26A0 ${count(result.drifted.length)} had drifted from the model before the upgrade and still ${result.drifted.length === 1 ? \"needs\" : \"need\"} --force to commit: ${names(result.drifted)}`\n )\n );\n }\n for (const error of result.errors) {\n console.log(ansis.yellow(`\u26A0 ${error}`));\n }\n}\n\n/**\n * Execute integration update\n */\nasync function executeIntegrationUpdate(\n label: string,\n updateFn: () => Promise<void>\n): Promise<void> {\n const operationSpan = isTelemetryEnabled\n ? startSpan(\"upgrade.integration\", {\n \"upgrade.integration.label\": label,\n \"upgrade.integration.type\": label.includes(\"Claude\")\n ? \"claude\"\n : label.includes(\"Copilot\")\n ? \"copilot\"\n : \"unknown\",\n })\n : null;\n\n try {\n console.log(ansis.dim(`${label}...`));\n await updateFn();\n console.log(ansis.green(`\u2713 ${label}`));\n\n if (operationSpan) {\n operationSpan.setAttribute(\"upgrade.integration.result\", \"success\");\n }\n } catch (error) {\n if (operationSpan) {\n operationSpan.recordException(error as Error);\n operationSpan.setStatus({\n code: 2, // SpanStatusCode.ERROR\n message: getErrorMessage(error),\n });\n operationSpan.setAttribute(\"upgrade.integration.result\", \"error\");\n }\n console.error(ansis.red(`Error: ${label} failed: ${getErrorMessage(error)}`));\n throw error;\n } finally {\n endSpan(operationSpan);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["integrationActions", "integrationUpToDate", "result"]
|
|
7
7
|
}
|