@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/changeset.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Changeset Commands - Manage model change tracking and versioning\n */\n\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { StagingAreaManager } from \"../core/staging-area.js\";\nimport { ChangesetExporter } from \"../core/changeset-exporter.js\";\nimport { StagedChangesetStorage } from \"../core/staged-changeset-storage.js\";\nimport { ValidationFormatter } from \"../validators/validation-formatter.js\";\nimport { Command } from \"commander\";\nimport * as prompts from \"@clack/prompts\";\nimport path from \"path\";\nimport { isTelemetryEnabled, startSpan, endSpan, startActiveSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage, handleSuccess, handleInfo, handleWarning } from \"../utils/errors.js\";\nimport { isJson } from \"../utils/globals.js\";\nimport { findElementLayer } from \"../utils/element-utils.js\";\n\n/**\n * Generate a unique ID for imported changesets\n */\nfunction generateImportedChangesetId(): string {\n return `imported-${Date.now()}`;\n}\n\n/**\n * Create a new changeset\n */\nexport async function changesetCreateCommand(\n name: string,\n options: {\n model?: string;\n description?: string;\n }\n): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.create\", {\n \"changeset.name\": name,\n \"changeset.hasDescription\": !!options.description,\n })\n : null;\n\n try {\n // Load with lazyLoad: false to ensure consistent snapshot hashing\n // (base snapshot must include all layers for accurate drift detection)\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n // Check if changeset already exists\n const existing = await manager.load(name);\n if (existing) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: `Changeset '${name}' already exists` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' already exists`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset already exists\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Get description if not provided\n let description = options.description;\n if (!description) {\n const isInteractive = process.stdin.isTTY;\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"cli.interactive\", isInteractive);\n }\n if (isInteractive) {\n const result = await prompts.text({\n message: \"Changeset description (optional)\",\n });\n\n if (typeof result === \"string\") {\n description = result;\n }\n }\n }\n\n const changeset = await manager.create(name, description || undefined);\n\n // Activate immediately so add/update/delete commands stage into this changeset\n const previouslyActive = await manager.getActiveId();\n if (previouslyActive && !isJson()) {\n const previous = await manager.load(previouslyActive);\n console.log(ansis.yellow(` Deactivating changeset: ${ansis.bold(previous?.name ?? previouslyActive)}`));\n }\n await manager.setActive(changeset.id);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.id\", changeset.id);\n (span as any).setStatus({ code: 0 });\n }\n\n const createDetails: Record<string, unknown> = {\n changesetId: changeset.id,\n changesetName: name,\n path: `documentation-robotics/changesets/${changeset.id}/`,\n };\n if (changeset.description) {\n createDetails.description = changeset.description;\n }\n handleSuccess(`Created and activated changeset: ${ansis.bold(name)}`, createDetails, { verbose: true });\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * List all changesets\n */\nexport async function changesetListCommand(options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled ? startSpan(\"changeset.list\") : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const changesets = await manager.list();\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.count\", changesets.length);\n }\n\n if (changesets.length === 0) {\n console.log(ansis.yellow(\"No changesets found\"));\n console.log();\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n console.log(ansis.bold(`\\nChangesets (${changesets.length}):\\n`));\n\n for (const changeset of changesets) {\n const statusColor =\n changeset.status === \"committed\"\n ? ansis.green\n : changeset.status === \"discarded\"\n ? ansis.gray\n : ansis.yellow; // \"staged\" status shows yellow\n\n console.log(`${statusColor(changeset.status.toUpperCase())} ${ansis.bold(changeset.name)}`);\n\n if (changeset.description) {\n console.log(ansis.dim(` ${changeset.description}`));\n }\n\n console.log(\n ansis.dim(\n ` Changes: ${changeset.getChangeCount()} | Created: ${new Date(\n changeset.created\n ).toLocaleDateString()}`\n )\n );\n\n const changesByType = {\n add: changeset.getChangesByType(\"add\").length,\n update: changeset.getChangesByType(\"update\").length,\n delete: changeset.getChangesByType(\"delete\").length,\n };\n\n const parts = [];\n if (changesByType.add > 0) parts.push(`+${changesByType.add}`);\n if (changesByType.update > 0) parts.push(`~${changesByType.update}`);\n if (changesByType.delete > 0) parts.push(`-${changesByType.delete}`);\n\n if (parts.length > 0) {\n console.log(ansis.dim(` ${parts.join(\" \")}`));\n }\n\n console.log();\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Apply a changeset to the model\n */\nexport async function changesetApplyCommand(\n name: string,\n options?: { model?: string; validate?: boolean; force?: boolean }\n): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.apply\", {\n \"changeset.name\": name,\n \"apply.validate\": options?.validate !== false,\n \"apply.force\": options?.force === true,\n })\n : null;\n\n try {\n const model = await Model.load(options?.model || process.cwd(), { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${name}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.id\", changeset.id);\n (span as any).setAttribute(\"changeset.changeCount\", changeset.changes.length);\n }\n\n if (!isJson()) {\n console.log(ansis.bold(`\\nApplying changeset: ${ansis.cyan(name)}\\n`));\n console.log(ansis.dim(`Changes: ${changeset.changes.length}`));\n\n // Show model health snapshot (base model, before this changeset is applied).\n // This intentionally reflects the pre-apply state so agents see what was already\n // present, not what the changeset is about to add.\n const preApplyStats = ValidationFormatter.calculateStats(model);\n if (preApplyStats.orphanedElements.length > 0) {\n console.log(ansis.dim(\n `Model health before apply: ${preApplyStats.orphanedElements.length} orphaned element(s) \u2014 run 'dr validate --orphans' for details`\n ));\n }\n }\n\n const changesetId = changeset.id || name;\n if (!changesetId) {\n const errMsg = \"Changeset ID could not be determined\";\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: errMsg }));\n } else {\n console.error(\n ansis.red(\"Error: \" + errMsg) +\n \"\\n\" +\n ansis.dim(\n \"This indicates a corrupted changeset. The changeset exists but has no ID field.\"\n ) +\n \"\\n\" +\n ansis.dim(`Try:\\n`) +\n ansis.dim(` 1. Run 'dr changeset list' to see available changesets\\n`) +\n ansis.dim(` 2. Delete and recreate the changeset if possible\\n`) +\n ansis.dim(` 3. Contact support if this persists`)\n );\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset ID missing\" });\n }\n endSpan(span);\n process.exit(1);\n }\n const result = await manager.apply(model, changesetId, {\n validate: options?.validate,\n force: options?.force\n });\n\n handleInfo(\"\");\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"apply.committed\", result.committed);\n (span as any).setAttribute(\"apply.failed\", result.failed);\n (span as any).setAttribute(\"apply.validationPassed\", result.validation.passed);\n }\n\n const applyDetails: Record<string, unknown> = {\n changesetName: name,\n changesetId: changeset.id,\n committed: result.committed,\n failed: result.failed,\n validationPassed: result.validation.passed,\n };\n\n if (result.failed > 0) {\n applyDetails.errors = result.validation.errors;\n if (!isJson()) {\n handleInfo(ansis.red(`\u2717 Failed to apply ${result.failed} change(s):`));\n for (const error of result.validation.errors) {\n handleInfo(ansis.dim(` - ${error}`));\n }\n }\n }\n\n // Always show applied message, even if 0 changes\n handleSuccess(`Applied ${result.committed} change(s) from changeset`, applyDetails);\n\n // Add changeset to manifest history\n if (!model.manifest.changeset_history) {\n model.manifest.changeset_history = [];\n }\n model.manifest.changeset_history.push({\n name,\n committed_at: new Date().toISOString(),\n action: \"committed\",\n });\n\n // Always save the model and manifest, even if 0 changes\n // This ensures manifest is updated with changeset metadata\n await model.saveDirtyLayers();\n await model.saveManifest();\n\n if (result.failed === 0) {\n handleInfo(ansis.dim(`Changeset marked as committed`));\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n\n handleInfo(\"\");\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Revert a changeset from the model\n */\nexport async function changesetRevertCommand(name: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.revert\", {\n \"changeset.name\": name,\n })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${name}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.id\", changeset.id);\n (span as any).setAttribute(\"changeset.changeCount\", changeset.changes.length);\n }\n\n if (!isJson()) {\n console.log(ansis.bold(`\\nReverting changeset: ${ansis.cyan(name)}\\n`));\n console.log(ansis.dim(`Changes to discard: ${changeset.changes.length}`));\n }\n\n const changesetId = changeset.id || name;\n if (!changesetId) {\n const errMsg = \"Changeset ID could not be determined\";\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: errMsg }));\n } else {\n console.error(\n ansis.red(\"Error: \" + errMsg) +\n \"\\n\" +\n ansis.dim(\"The changeset must have an ID to proceed with revert.\")\n );\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset ID missing\" });\n }\n endSpan(span);\n process.exit(1);\n }\n await manager.revert(changesetId);\n\n handleInfo(\"\");\n\n // Show reverted message\n handleSuccess(`Reverted changeset: ${name}`, {\n changesetName: name,\n changesetId,\n changesetStatus: \"discarded\",\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n\n handleInfo(\"\");\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Activate a changeset for automatic tracking\n */\nexport async function changesetActivateCommand(name: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.activate\", {\n \"changeset.name\": name,\n })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const changeset = await manager.load(name);\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${name}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n await manager.setActive(name);\n\n handleSuccess(`Activated changeset: ${ansis.bold(name)}`, {\n changesetName: name,\n changesetId: changeset.id,\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Deactivate the current changeset\n */\nexport async function changesetDeactivateCommand(options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled ? startSpan(\"changeset.deactivate\") : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const active = await manager.getActiveId();\n\n if (!active) {\n handleInfo(ansis.yellow(\"No active changeset\"));\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.wasActive\", false);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.name\", active);\n (span as any).setAttribute(\"changeset.wasActive\", true);\n }\n\n const changeset = await manager.load(active);\n await manager.clearActive();\n handleSuccess(`Deactivated changeset: ${ansis.bold(active)}`, {\n changesetId: active,\n name: changeset?.name || active,\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Delete a changeset permanently\n */\nexport async function changesetDeleteCommand(\n name: string,\n options: {\n model?: string;\n force?: boolean;\n }\n): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.delete\", {\n \"changeset.name\": name,\n \"delete.force\": options.force === true,\n })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${name}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Check if changeset is currently active (compare by ID, not user-provided name)\n const active = await manager.getActiveId();\n if (active === changeset.id) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: `Cannot delete active changeset '${name}'` }));\n } else {\n console.error(ansis.red(`Error: Cannot delete active changeset '${name}'`));\n console.log(ansis.dim(\" Run `dr changeset deactivate` first\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Cannot delete active changeset\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Confirm deletion unless --force is used or in non-interactive environment\n if (!options.force) {\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"cli.interactive\", isInteractive);\n }\n if (isInteractive) {\n const confirm = await prompts.confirm({\n message: `Delete changeset '${name}'? This cannot be undone.`,\n });\n\n if (!confirm || typeof confirm !== \"boolean\") {\n handleSuccess(\"Deletion cancelled\", {\n status: \"cancelled\",\n });\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"delete.cancelled\", true);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n } else {\n // In non-interactive environment, require --force flag\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"Cannot confirm deletion in non-interactive environment\" }));\n } else {\n console.error(ansis.red(\"Error: Cannot confirm deletion in non-interactive environment\"));\n console.log(ansis.dim(\" Use --force flag to confirm deletion\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Interactive confirmation required\" });\n }\n endSpan(span);\n process.exit(1);\n }\n }\n\n await manager.delete(name);\n\n handleSuccess(`Deleted changeset: ${ansis.bold(name)}`, {\n changesetName: name,\n changesetId: changeset.id,\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Show the currently active changeset\n */\nexport async function changesetStatusCommand(options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled ? startSpan(\"changeset.status\") : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const active = await manager.getActiveId();\n\n if (!active) {\n console.log(ansis.dim(\"No active changeset\"));\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.hasActive\", false);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.name\", active);\n (span as any).setAttribute(\"changeset.hasActive\", true);\n }\n\n console.log(ansis.bold(`Active changeset: ${ansis.cyan(active)}`));\n\n // Load and show changeset details\n const changeset = await manager.load(active);\n\n if (changeset) {\n console.log(ansis.dim(` Changes tracked: ${changeset.changes.length}`));\n const changesByType = changeset.stats;\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.changeCount\", changeset.changes.length);\n (span as any).setAttribute(\"changeset.adds\", changesByType.additions);\n (span as any).setAttribute(\"changeset.updates\", changesByType.modifications);\n (span as any).setAttribute(\"changeset.deletes\", changesByType.deletions);\n }\n\n const parts = [];\n if (changesByType.additions > 0) parts.push(`+${changesByType.additions}`);\n if (changesByType.modifications > 0) parts.push(`~${changesByType.modifications}`);\n if (changesByType.deletions > 0) parts.push(`-${changesByType.deletions}`);\n if (parts.length > 0) {\n console.log(ansis.dim(` ${parts.join(\" \")}`));\n }\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * List all staged changes in the active changeset\n */\nexport async function changesetStagedCommand(options: { model?: string; layer?: string }): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.staged\", {\n \"staged.layer\": options.layer,\n })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangeset = await manager.getActiveId();\n\n if (!activeChangeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangeset);\n\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${activeChangeset}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${activeChangeset}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n let changes = changeset.changes;\n\n if (options.layer) {\n changes = changes.filter((c: any) => c.layerName === options.layer);\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"staged.changeCount\", changes.length);\n (span as any).setAttribute(\"staged.totalChanges\", changeset.changes.length);\n }\n\n if (changes.length === 0) {\n handleSuccess(\"No staged changes\", {\n changesetId: activeChangeset,\n changeCount: 0,\n changes: [],\n }, { verbose: true });\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (!isJson()) {\n console.log(ansis.bold(`\\nStaged Changes (${changes.length}):\\n`));\n const tableData = changes.map((c: any) => ({\n \"Element ID\": c.elementId,\n Layer: c.layerName,\n Type: c.type,\n Timestamp: new Date(c.timestamp || Date.now()).toISOString(),\n }));\n console.table(tableData);\n }\n\n handleSuccess(`Listed ${changes.length} staged change(s)`, {\n changesetId: activeChangeset,\n changeCount: changes.length,\n changes: changes.map((c: any) => ({\n elementId: c.elementId,\n layer: c.layerName,\n operation: c.type,\n timestamp: new Date(c.timestamp || Date.now()).toISOString(),\n })),\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Remove specific element from staging area\n */\nexport async function changesetExplicitStageCommand(elementId: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.stage-explicit\", { \"stage.elementId\": elementId })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const layerName = await findElementLayer(model, elementId);\n if (!layerName) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Element '${elementId}' not found` }));\n } else {\n console.error(ansis.red(`Error: Element '${elementId}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Element not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n const layer = await model.getLayer(layerName);\n const element = layer?.getElement(elementId);\n if (!element) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Element '${elementId}' not found in layer '${layerName}'` }));\n } else {\n console.error(ansis.red(`Error: Element '${elementId}' not found in layer '${layerName}'`));\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Guard against staging the same element twice\n const activeChangeset = await manager.load(activeChangesetId);\n if (activeChangeset?.changes.some((c: any) => c.elementId === elementId)) {\n console.warn(ansis.yellow(`Warning: Element '${elementId}' is already staged in the active changeset. Skipping.`));\n endSpan(span);\n return;\n }\n\n await manager.stage(activeChangesetId, {\n type: \"add\",\n elementId,\n layerName,\n after: element.toJSON() as unknown as Record<string, unknown>,\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"stage.layerName\", layerName);\n (span as any).setStatus({ code: 0 });\n }\n\n handleSuccess(`Staged element: ${elementId}`, {\n elementId,\n layer: layerName,\n changesetId: activeChangesetId,\n operation: \"add\",\n }, { verbose: true });\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({ code: 2, message: getErrorMessage(error) });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\nexport async function changesetUnstageCommand(elementId: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.unstage\", {\n \"unstage.elementId\": elementId,\n })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangesetId);\n\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${activeChangesetId}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n }\n process.exit(1);\n }\n\n // Check if element exists in changes\n const initialCount = changeset.changes.length;\n\n // Use the manager's unstage method\n await manager.unstage(activeChangesetId, elementId);\n\n // Reload to get updated count\n const updated = await manager.load(activeChangesetId);\n\n if (updated && updated.changes.length === initialCount) {\n handleWarning(`Element '${elementId}' not found in staged changes`);\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"unstage.found\", false);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"unstage.found\", true);\n (span as any).setAttribute(\"unstage.remainingChanges\", updated?.getChangeCount() || 0);\n }\n\n handleSuccess(`Unstaged element: ${elementId}`, {\n changesetId: activeChangesetId,\n elementId,\n remainingChanges: updated?.getChangeCount() || 0,\n }, { verbose: true });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Discard all or single staged changes\n */\nexport async function changesetDiscardCommand(elementId?: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.discard\", {\n \"discard.elementId\": elementId,\n \"discard.all\": !elementId,\n })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangesetId);\n\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${activeChangesetId}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"discard.changeCount\", changeset.changes.length);\n }\n\n if (elementId) {\n // Discard single element\n const initialCount = changeset.changes.length;\n\n // Use the manager's unstage method for single element\n await manager.unstage(activeChangesetId, elementId);\n\n // Reload to verify\n const updated = await manager.load(activeChangesetId);\n\n if (updated && updated.changes.length === initialCount) {\n handleWarning(`Element '${elementId}' not found in staged changes`);\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"discard.found\", false);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"discard.found\", true);\n }\n\n handleSuccess(`Discarded changes for element: ${elementId}`, {\n elementId,\n }, { verbose: true });\n } else {\n // Discard all changes with confirmation\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"cli.interactive\", isInteractive);\n }\n\n if (isInteractive) {\n const confirmed = await prompts.confirm({\n message: `Discard all ${changeset.changes.length} staged changes? This cannot be undone.`,\n });\n\n if (!confirmed || typeof confirmed !== \"boolean\") {\n handleSuccess(\"Discard cancelled\", {\n status: \"cancelled\",\n });\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"discard.cancelled\", true);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n } else {\n // In non-interactive environment, require explicit flag or piped input\n console.error(\n ansis.red(\"Error: Cannot confirm discard of all changes in non-interactive environment\")\n );\n console.log(ansis.dim(\" Specify an element ID to discard only that element\"));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Interactive confirmation required\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Use the manager's discard method for all changes\n await manager.discard(activeChangesetId);\n\n handleSuccess(`Discarded all staged changes`, {\n changesetStatus: \"discarded\",\n }, { verbose: true });\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n\n if (!isJson()) {\n console.log();\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Preview the merged model state with staged changes applied\n */\nexport async function changesetPreviewCommand(options: { model?: string; layer?: string }): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.preview\", {\n \"preview.layer\": options.layer,\n })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n console.error(ansis.red(\"Error: No active changeset\"));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangesetId);\n\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n console.log(ansis.bold(`\\nPreview: Merged Model State (${ansis.cyan(\"with staged changes\")})`));\n console.log(ansis.dim(`Changeset: ${changeset.name}`));\n console.log();\n\n // Show summary of changes\n const additions = changeset.getChangesByType(\"add\").length;\n const modifications = changeset.getChangesByType(\"update\").length;\n const deletions = changeset.getChangesByType(\"delete\").length;\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"preview.additions\", additions);\n (span as any).setAttribute(\"preview.modifications\", modifications);\n (span as any).setAttribute(\"preview.deletions\", deletions);\n (span as any).setAttribute(\"preview.totalChanges\", changeset.changes.length);\n }\n\n if (additions > 0) {\n console.log(ansis.green(`+ ${additions} additions`));\n }\n if (modifications > 0) {\n console.log(ansis.yellow(`~ ${modifications} modifications`));\n }\n if (deletions > 0) {\n console.log(ansis.red(`- ${deletions} deletions`));\n }\n\n console.log();\n\n if (options.layer) {\n // Filter changes by layer\n const layerChanges = changeset.changes.filter((c: any) => c.layerName === options.layer);\n\n if (layerChanges.length === 0) {\n console.log(ansis.dim(`No staged changes in layer '${options.layer}'`));\n return;\n }\n\n console.log(ansis.bold(`Layer: ${options.layer}`));\n const tableData = layerChanges.map((c: any) => ({\n \"Element ID\": c.elementId + ansis.dim(\" (staged)\"),\n Type: c.type,\n Status: c.type === \"add\" ? \"new\" : c.type === \"delete\" ? \"removed\" : \"updated\",\n }));\n console.table(tableData);\n } else {\n // Show all layers with staged changes\n const layerMap = new Map<string, any[]>();\n changeset.changes.forEach((c: any) => {\n const existing = layerMap.get(c.layerName) ?? [];\n existing.push(c);\n layerMap.set(c.layerName, existing);\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"preview.layerCount\", layerMap.size);\n }\n\n for (const [layerName, changes] of layerMap) {\n console.log(ansis.bold(`Layer: ${layerName}`));\n const tableData = changes.map((c: any) => ({\n \"Element ID\": c.elementId,\n Type: c.type,\n Status: c.type === \"add\" ? \"new\" : c.type === \"delete\" ? \"removed\" : \"updated\",\n }));\n console.table(tableData);\n console.log();\n }\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Show delta between base model and staged changes\n */\nexport async function changesetDiffCommand(options: { model?: string; layer?: string }): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.diff\", {\n \"diff.layer\": options.layer,\n })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n console.error(ansis.red(\"Error: No active changeset\"));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangesetId);\n\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n console.log(ansis.bold(\"\\nDiff: Base Model vs Staged Changes\\n\"));\n\n // Group changes by layer\n const layerMap = new Map<string, any[]>();\n changeset.changes.forEach((c: any) => {\n if (!options.layer || c.layerName === options.layer) {\n const existing = layerMap.get(c.layerName) ?? [];\n existing.push(c);\n layerMap.set(c.layerName, existing);\n }\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"diff.layerCount\", layerMap.size);\n (span as any).setAttribute(\"diff.totalChanges\", changeset.changes.length);\n }\n\n if (layerMap.size === 0) {\n console.log(\n ansis.dim(options.layer ? `No changes in layer '${options.layer}'` : \"No staged changes\")\n );\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n // Display changes grouped by layer\n for (const [layerName, changes] of layerMap) {\n console.log(ansis.bold(`Layer: ${layerName}`));\n\n for (const change of changes) {\n if (change.type === \"add\") {\n console.log(ansis.green(`+ ${change.elementId}`));\n console.log(ansis.dim(` ${JSON.stringify(change.after || {}, null, 2)}`));\n } else if (change.type === \"delete\") {\n console.log(ansis.red(`- ${change.elementId}`));\n console.log(ansis.dim(` ${JSON.stringify(change.before || {}, null, 2)}`));\n } else if (change.type === \"update\") {\n console.log(ansis.yellow(`~ ${change.elementId}`));\n console.log(ansis.dim(` Before: ${JSON.stringify(change.before || {})}`));\n console.log(ansis.dim(` After: ${JSON.stringify(change.after || {})}`));\n }\n }\n\n console.log();\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Apply staged changes to the base model\n *\n * Implements atomic commit with validation and rollback on failure.\n * All changes are applied atomically\u2014on any failure, the model is rolled back.\n *\n * @param options - Commit options\n * @param options.validate - Run validation before commit (default: true).\n * When enabled, schema, reference, and semantic validation must pass.\n * Validation errors always block the commit and cannot be overridden with --force.\n * @param options.force - Skip drift detection warnings (default: false).\n * When the base model has changed since the changeset was created, drift is detected.\n * Use --force to commit despite drift. Validation errors always block commit regardless of --force.\n *\n * @throws Error if validation fails, drift detected without --force, or commit fails\n */\nexport async function changesetCommitCommand(options?: {\n model?: string;\n validate?: boolean;\n force?: boolean;\n}): Promise<void> {\n await startActiveSpan(\n \"changeset.commit\",\n async (span) => {\n try {\n const model = await Model.load(options?.model || process.cwd(), { lazyLoad: false });\n const stagingManager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await stagingManager.getActiveId();\n\n if (!activeChangesetId) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n return;\n }\n\n const changeset = await stagingManager.load(activeChangesetId);\n\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${activeChangesetId}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n }\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n span.end();\n process.exit(1);\n }\n\n const changeCount = changeset.changes.length;\n\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"changeset.id\", activeChangesetId);\n (span as any).setAttribute(\"changeset.name\", changeset.name);\n (span as any).setAttribute(\"changeset.changeCount\", changeCount);\n }\n\n if (changeCount === 0) {\n handleSuccess(\"No staged changes to commit\", {\n name: changeset.name,\n changesetId: activeChangesetId,\n stagedChanges: 0,\n }, { verbose: true });\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 0 });\n }\n return;\n }\n\n if (!isJson()) {\n console.log(ansis.bold(`\\nCommitting changeset: ${ansis.cyan(changeset.name)}`));\n console.log(ansis.dim(`Staged changes: ${changeCount}`));\n console.log();\n }\n\n // Execute atomic commit with validation and rollback\n try {\n const result = await stagingManager.commit(model, activeChangesetId, {\n validate: options?.validate !== false,\n force: options?.force === true,\n });\n\n // Deactivate the changeset after successful commit\n await stagingManager.clearActive();\n\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"commit.committed\", result.committed);\n (span as any).setAttribute(\"commit.skipped\", result.skipped);\n (span as any).setAttribute(\"commit.failed\", result.failed);\n (span as any).setAttribute(\"commit.validationPassed\", result.validation.passed);\n }\n\n const commitDetails: Record<string, unknown> = {\n name: changeset.name,\n changesetId: activeChangesetId,\n committedCount: result.committed,\n stagedChanges: changeCount,\n validationPassed: result.validation.passed,\n };\n\n if ((result.skipped ?? 0) > 0) {\n commitDetails.skipped = result.skipped;\n commitDetails.skippedDetails = (result.skippedDetails ?? []).slice(0, 10);\n }\n\n if (result.failed > 0) {\n commitDetails.failed = result.failed;\n }\n\n // Safety net: warn if any staged changes were neither committed, skipped, nor failed\n const accountedFor = result.committed + (result.skipped ?? 0) + result.failed;\n if (accountedFor < changeCount) {\n const unaccounted = changeCount - accountedFor;\n commitDetails.unaccountedChanges = unaccounted;\n if (!isJson()) {\n console.log(\n ansis.yellow(\n `\u26A0 Warning: ${unaccounted} staged change(s) were not applied, skipped, or reported as failed.` +\n ` This is unexpected \u2014 check the changeset log for details.`\n )\n );\n }\n }\n\n if (result.driftWarning) {\n commitDetails.driftDetected = true;\n if (!isJson()) {\n console.log(\n ansis.yellow(`\u26A0 Warning: Model had drifted since changeset creation (--force was used)`)\n );\n }\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"commit.driftDetected\", true);\n }\n }\n\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 0 });\n }\n\n handleSuccess(`Committed ${result.committed} change(s)`, commitDetails, { verbose: true });\n\n if (!isJson()) {\n console.log();\n }\n } catch (error) {\n // Commit failed - error was thrown from StagingAreaManager\n // Model has been automatically rolled back\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: `Commit failed and rolled back: ${getErrorMessage(error)}` }));\n } else {\n console.log(\n ansis.red(\n `\u2717 Commit failed and rolled back: ${getErrorMessage(error)}`\n )\n );\n }\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"commit.rolledBack\", true);\n }\n throw error;\n }\n } catch (error) {\n if (isTelemetryEnabled) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n span.end();\n process.exit(1);\n }\n },\n {\n \"commit.validate\": options?.validate !== false,\n \"commit.force\": options?.force === true,\n }\n );\n}\n\n/**\n * Export changeset to portable file\n */\nexport async function changesetExportCommand(\n changesetId: string,\n options: {\n model?: string;\n output?: string;\n format?: \"yaml\" | \"json\" | \"patch\";\n }\n): Promise<void> {\n const format = options.format || \"yaml\";\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.export\", {\n \"changeset.id\": changesetId,\n \"export.format\": format,\n })\n : null;\n\n try {\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: true });\n const exporter = new ChangesetExporter(model.rootPath);\n\n // Default output filename based on changeset id and format\n const ext = format === \"patch\" ? \"patch\" : format;\n const outputPath = options.output || `${changesetId}.${ext}`;\n\n // Ensure output path is absolute\n const absolutePath = path.isAbsolute(outputPath)\n ? outputPath\n : path.join(process.cwd(), outputPath);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"export.outputPath\", outputPath);\n }\n\n await exporter.exportToFile(changesetId, absolutePath, format);\n\n handleSuccess(`Exported changeset to ${outputPath}`, {\n changesetId,\n outputPath,\n format,\n }, { verbose: true });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Import changeset from portable file\n */\nexport async function changesetImportCommand(\n file: string,\n options: { model?: string; force?: boolean } = {}\n): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.import\", {\n \"import.file\": file,\n \"import.force\": options.force === true,\n })\n : null;\n\n try {\n // Load full model for compatibility validation\n const model = await Model.load(options.model || process.cwd(), { lazyLoad: false });\n const exporter = new ChangesetExporter(model.rootPath);\n\n // Ensure file path is absolute\n const absolutePath = path.isAbsolute(file) ? file : path.join(process.cwd(), file);\n\n // Import changeset\n const imported = await exporter.importFromFile(absolutePath);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.name\", imported.name);\n (span as any).setAttribute(\"changeset.changeCount\", imported.changes.length);\n }\n\n // Validate compatibility with current model\n const compatibility = await exporter.validateCompatibility(imported, model);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"import.compatible\", compatibility.compatible);\n (span as any).setAttribute(\"import.baseSnapshotMatch\", compatibility.baseSnapshotMatch);\n }\n\n // Check for issues\n if (!compatibility.compatible) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"Changeset is incompatible\", warnings: compatibility.warnings }));\n } else {\n console.error(ansis.red(\"\u2717 Import failed: Changeset is incompatible\"));\n console.error(ansis.dim(` Issues:`));\n for (const warning of compatibility.warnings) {\n console.error(ansis.dim(` - ${warning}`));\n }\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset incompatible\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Check for drift and require --force if detected\n if (!compatibility.baseSnapshotMatch) {\n if (!options.force) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"Imported changeset has base model drift\" }));\n } else {\n console.error(\n ansis.red(\"Error: Imported changeset has base model drift\") +\n \"\\n\" +\n ansis.dim(\"The model has been modified since this changeset was created.\") +\n \"\\n\" +\n ansis.dim(\"This may cause conflicts or unexpected behavior when committing.\") +\n \"\\n\\n\" +\n ansis.dim(\"To import anyway, use: --force\")\n );\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Drift detected, force required\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n console.warn(\n ansis.yellow(`\u26A0 Warning: Base model drift detected (--force used)`) +\n \"\\n\" +\n ansis.dim(\"Review changes carefully before committing.\")\n );\n console.log();\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"import.driftOverridden\", true);\n }\n }\n\n // Assign new ID to avoid conflicts\n const newId = generateImportedChangesetId();\n imported.id = newId;\n\n // Save to staging area using storage\n const storage = new StagedChangesetStorage(model.rootPath);\n await storage.save(imported);\n\n const importDetails: Record<string, unknown> = {\n changesetName: imported.name,\n changesetId: newId,\n additions: imported.stats?.additions || 0,\n modifications: imported.stats?.modifications || 0,\n deletions: imported.stats?.deletions || 0,\n };\n\n if (!compatibility.baseSnapshotMatch) {\n importDetails.driftDetected = true;\n }\n\n handleSuccess(`Imported changeset: ${imported.name}`, importDetails, { verbose: true });\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.id\", newId);\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Register changeset subcommands\n */\nexport function changesetCommands(program: Command): void {\n const changesetGroup = program.command(\"changeset\").description(\"Manage changesets\");\n\n changesetGroup\n .command(\"create <name>\")\n .description(\"Create a new changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--description <desc>\", \"Changeset description\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset create \"v1.1 migration\"\n $ dr changeset create \"api-refactoring\" --description \"Refactor API layer endpoints\"`\n )\n .action(async (name, options) => {\n await changesetCreateCommand(name, options);\n });\n\n changesetGroup\n .command(\"list\")\n .description(\"List all changesets\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset list`\n )\n .action(async (options) => {\n await changesetListCommand(options);\n });\n\n changesetGroup\n .command(\"apply <name>\")\n .description(\"Apply a changeset to the model\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--no-validate\", \"Skip validation before applying\")\n .option(\"--force\", \"Force apply even if base model has drifted\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset apply \"v1.1 migration\"\n $ dr changeset apply \"v1.1 migration\" --no-validate\n $ dr changeset apply \"v1.1 migration\" --force`\n )\n .action(async (name, options) => {\n await changesetApplyCommand(name, options);\n });\n\n changesetGroup\n .command(\"revert <name>\")\n .description(\"Revert a changeset from the model\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset revert \"v1.1 migration\"`\n )\n .action(async (name, options) => {\n await changesetRevertCommand(name, options);\n });\n\n changesetGroup\n .command(\"activate <name>\")\n .description(\"Activate a changeset for automatic change tracking\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset activate \"v1.1 migration\"`\n )\n .action(async (name, options) => {\n await changesetActivateCommand(name, options);\n });\n\n changesetGroup\n .command(\"deactivate\")\n .description(\"Deactivate the currently active changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset deactivate`\n )\n .action(async (options) => {\n await changesetDeactivateCommand(options);\n });\n\n changesetGroup\n .command(\"status\")\n .description(\"Show the currently active changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset status`\n )\n .action(async (options) => {\n await changesetStatusCommand(options);\n });\n\n changesetGroup\n .command(\"show [name]\")\n .description(\"Show changeset details (use: status, staged, diff, or preview)\")\n .addHelpText(\n \"after\",\n `\nTo inspect a changeset, use one of:\n $ dr changeset status # Show the active changeset\n $ dr changeset staged # List all staged changes\n $ dr changeset diff [name] # Show a diff of staged changes\n $ dr changeset preview [name] # Preview what will be committed`\n )\n .action(async (name?: string) => {\n const nameHint = name ? ` '${name}'` : \"\";\n console.error(\n `error: 'dr changeset show${nameHint}' is not a valid subcommand.\\n\\n` +\n `To inspect a changeset, use one of:\\n` +\n ` dr changeset status \u2014 show the active changeset\\n` +\n ` dr changeset staged \u2014 list all staged changes\\n` +\n ` dr changeset diff \u2014 show a diff of staged changes\\n` +\n ` dr changeset preview \u2014 preview what will be committed`\n );\n process.exit(1);\n });\n\n changesetGroup\n .command(\"delete <name>\")\n .description(\"Delete a changeset permanently\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-f, --force\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset delete my-feature\n $ dr changeset delete my-feature --force`\n )\n .action(async (name, options) => {\n await changesetDeleteCommand(name, options);\n });\n\n // Staging operation commands\n changesetGroup\n .command(\"staged\")\n .description(\"List all staged changes in the active changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-l, --layer <layer>\", \"Filter by layer name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset staged\n $ dr changeset staged --layer api`\n )\n .action(async (options) => {\n await changesetStagedCommand(options);\n });\n\n changesetGroup\n .command(\"stage <element-id>\")\n .description(\"Stage a specific element into the active changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset stage api.operation.get-users\n $ dr changeset stage ux.uicomponent.login-form`\n )\n .action(async (elementId, options) => {\n await changesetExplicitStageCommand(elementId, options);\n });\n\n changesetGroup\n .command(\"unstage <element-id>\")\n .description(\"Remove specific element from staging area\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset unstage api-endpoint-create-customer`\n )\n .action(async (elementId, options) => {\n await changesetUnstageCommand(elementId, options);\n });\n\n changesetGroup\n .command(\"discard [element-id]\")\n .description(\"Discard all or single staged changes\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset discard\n $ dr changeset discard api-endpoint-create-customer`\n )\n .action(async (elementId, options) => {\n await changesetDiscardCommand(elementId, options);\n });\n\n changesetGroup\n .command(\"preview\")\n .description(\"Preview the merged model state with staged changes applied\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-l, --layer <layer>\", \"Preview specific layer only\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset preview\n $ dr changeset preview --layer application`\n )\n .action(async (options) => {\n await changesetPreviewCommand(options);\n });\n\n changesetGroup\n .command(\"diff\")\n .description(\"Show delta between base model and staged changes\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-l, --layer <layer>\", \"Show diff for specific layer only\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset diff\n $ dr changeset diff --layer api`\n )\n .action(async (options) => {\n await changesetDiffCommand(options);\n });\n\n changesetGroup\n .command(\"commit\")\n .description(\"Apply staged changes to the base model\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--validate\", \"Run validation before commit (default: true)\", true)\n .option(\"--force\", \"Commit despite drift warnings\", false)\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset commit\n $ dr changeset commit --validate\n $ dr changeset commit --force`\n )\n .action(async (options) => {\n await changesetCommitCommand(options);\n });\n\n changesetGroup\n .command(\"export <changeset-id>\")\n .description(\"Export changeset to portable file\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-o, --output <file>\", \"Output file path\")\n .option(\"-f, --format <format>\", \"Export format (yaml|json|patch)\", \"yaml\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset export api-updates\n $ dr changeset export api-updates --output changes.yaml\n $ dr changeset export api-updates --format json --output changes.json\n $ dr changeset export api-updates --format patch --output changes.patch`\n )\n .action(async (changesetId, options) => {\n await changesetExportCommand(changesetId, options);\n });\n\n changesetGroup\n .command(\"import <file>\")\n .description(\"Import changeset from file\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-f, --force\", \"Import despite base model drift\", false)\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset import changes.yaml\n $ dr changeset import ../team-changes.json\n $ dr changeset import changes.yaml --force`\n )\n .action(async (file, options) => {\n await changesetImportCommand(file, options);\n });\n\n changesetGroup.showSuggestionAfterError();\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Changeset Commands - Manage model change tracking and versioning\n */\n\nimport ansis from \"ansis\";\nimport { Model } from \"../core/model.js\";\nimport { StagingAreaManager } from \"../core/staging-area.js\";\nimport { ChangesetExporter } from \"../core/changeset-exporter.js\";\nimport { StagedChangesetStorage } from \"../core/staged-changeset-storage.js\";\nimport { ValidationFormatter } from \"../validators/validation-formatter.js\";\nimport { Command, Option } from \"commander\";\nimport * as prompts from \"@clack/prompts\";\nimport path from \"path\";\nimport { isTelemetryEnabled, startSpan, endSpan, startActiveSpan } from \"../telemetry/index.js\";\nimport { CLIError, ErrorCategory, getErrorMessage, handleSuccess, handleInfo, handleWarning } from \"../utils/errors.js\";\nimport { isJson } from \"../utils/globals.js\";\nimport { findElementLayer } from \"../utils/element-utils.js\";\nimport { changesetVerifyCommand } from \"./changeset-verify.js\";\n\n/**\n * Generate a unique ID for imported changesets\n */\nfunction generateImportedChangesetId(): string {\n return `imported-${Date.now()}`;\n}\n\n/**\n * Create a new changeset\n */\nexport async function changesetCreateCommand(\n name: string,\n options: {\n model?: string;\n description?: string;\n }\n): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.create\", {\n \"changeset.name\": name,\n \"changeset.hasDescription\": !!options.description,\n })\n : null;\n\n try {\n // Load with lazyLoad: false to ensure consistent snapshot hashing\n // (base snapshot must include all layers for accurate drift detection)\n const model = await Model.load(options.model, { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n // Check if changeset already exists\n const existing = await manager.load(name);\n if (existing) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: `Changeset '${name}' already exists` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' already exists`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset already exists\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Get description if not provided\n let description = options.description;\n if (!description) {\n const isInteractive = process.stdin.isTTY;\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"cli.interactive\", isInteractive);\n }\n if (isInteractive) {\n const result = await prompts.text({\n message: \"Changeset description (optional)\",\n });\n\n if (typeof result === \"string\") {\n description = result;\n }\n }\n }\n\n const changeset = await manager.create(name, description || undefined);\n\n // Activate immediately so add/update/delete commands stage into this changeset\n const previouslyActive = await manager.getActiveId();\n if (previouslyActive && !isJson()) {\n const previous = await manager.load(previouslyActive);\n console.log(ansis.yellow(` Deactivating changeset: ${ansis.bold(previous?.name ?? previouslyActive)}`));\n }\n await manager.setActive(changeset.id);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.id\", changeset.id);\n (span as any).setStatus({ code: 0 });\n }\n\n const createDetails: Record<string, unknown> = {\n changesetId: changeset.id,\n changesetName: name,\n path: `documentation-robotics/changesets/${changeset.id}/`,\n };\n if (changeset.description) {\n createDetails.description = changeset.description;\n }\n handleSuccess(`Created and activated changeset: ${ansis.bold(name)}`, createDetails, { verbose: true });\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * List all changesets\n */\nexport async function changesetListCommand(options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled ? startSpan(\"changeset.list\") : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const changesets = await manager.list();\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.count\", changesets.length);\n }\n\n if (changesets.length === 0) {\n console.log(ansis.yellow(\"No changesets found\"));\n console.log();\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n console.log(ansis.bold(`\\nChangesets (${changesets.length}):\\n`));\n\n for (const changeset of changesets) {\n const statusColor =\n changeset.status === \"committed\"\n ? ansis.green\n : changeset.status === \"discarded\"\n ? ansis.gray\n : ansis.yellow; // \"staged\" status shows yellow\n\n console.log(`${statusColor(changeset.status.toUpperCase())} ${ansis.bold(changeset.name)}`);\n\n if (changeset.description) {\n console.log(ansis.dim(` ${changeset.description}`));\n }\n\n console.log(\n ansis.dim(\n ` Changes: ${changeset.getChangeCount()} | Created: ${new Date(\n changeset.created\n ).toLocaleDateString()}`\n )\n );\n\n const changesByType = {\n add: changeset.getChangesByType(\"add\").length,\n update: changeset.getChangesByType(\"update\").length,\n delete: changeset.getChangesByType(\"delete\").length,\n };\n\n const parts = [];\n if (changesByType.add > 0) parts.push(`+${changesByType.add}`);\n if (changesByType.update > 0) parts.push(`~${changesByType.update}`);\n if (changesByType.delete > 0) parts.push(`-${changesByType.delete}`);\n\n if (parts.length > 0) {\n console.log(ansis.dim(` ${parts.join(\" \")}`));\n }\n\n console.log();\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Report how a commit's validation went beyond pass/fail: that it was skipped, or how\n * many errors already in the base model were not counted against the changeset.\n * Adds the fields to `details` and, in text mode, prints a warning line.\n */\nfunction reportCommitValidation(\n result: { validation: { ran?: boolean; preExistingErrors?: number; preExistingSample?: string[] } },\n details: Record<string, unknown>\n): void {\n if (result.validation.ran === false) {\n // Nothing was validated, so there is no pass to report.\n delete details.validationPassed;\n details.validationSkipped = true;\n if (!isJson()) {\n console.log(ansis.yellow(`\u26A0 Validation skipped (--no-validate); run 'dr validate' to check the result`));\n }\n return;\n }\n const preExisting = result.validation.preExistingErrors ?? 0;\n details.preExistingErrors = preExisting;\n if (preExisting > 0) {\n details.preExistingSample = result.validation.preExistingSample ?? [];\n if (!isJson()) {\n console.log(\n ansis.yellow(\n `\u26A0 ${preExisting} validation error(s) already in the base model were ignored; ` +\n `the changeset introduced none. Run 'dr validate' to see them.`\n )\n );\n }\n }\n}\n\n/**\n * Apply a changeset to the model\n */\nexport async function changesetApplyCommand(\n name: string,\n options?: { model?: string; validate?: boolean; force?: boolean }\n): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.apply\", {\n \"changeset.name\": name,\n \"apply.validate\": options?.validate !== false,\n \"apply.force\": options?.force === true,\n })\n : null;\n\n try {\n const model = await Model.load(options?.model, { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${name}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.id\", changeset.id);\n (span as any).setAttribute(\"changeset.changeCount\", changeset.changes.length);\n }\n\n if (!isJson()) {\n console.log(ansis.bold(`\\nApplying changeset: ${ansis.cyan(name)}\\n`));\n console.log(ansis.dim(`Changes: ${changeset.changes.length}`));\n\n // Show model health snapshot (base model, before this changeset is applied).\n // This intentionally reflects the pre-apply state so agents see what was already\n // present, not what the changeset is about to add.\n const preApplyStats = ValidationFormatter.calculateStats(model);\n if (preApplyStats.orphanedElements.length > 0) {\n console.log(ansis.dim(\n `Model health before apply: ${preApplyStats.orphanedElements.length} orphaned element(s) \u2014 run 'dr validate --orphans' for details`\n ));\n }\n }\n\n const changesetId = changeset.id || name;\n if (!changesetId) {\n const errMsg = \"Changeset ID could not be determined\";\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: errMsg }));\n } else {\n console.error(\n ansis.red(\"Error: \" + errMsg) +\n \"\\n\" +\n ansis.dim(\n \"This indicates a corrupted changeset. The changeset exists but has no ID field.\"\n ) +\n \"\\n\" +\n ansis.dim(`Try:\\n`) +\n ansis.dim(` 1. Run 'dr changeset list' to see available changesets\\n`) +\n ansis.dim(` 2. Delete and recreate the changeset if possible\\n`) +\n ansis.dim(` 3. Contact support if this persists`)\n );\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset ID missing\" });\n }\n endSpan(span);\n process.exit(1);\n }\n const result = await manager.apply(model, changesetId, {\n validate: options?.validate,\n force: options?.force\n });\n\n handleInfo(\"\");\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"apply.committed\", result.committed);\n (span as any).setAttribute(\"apply.failed\", result.failed);\n (span as any).setAttribute(\"apply.validationPassed\", result.validation.passed);\n }\n\n const applyDetails: Record<string, unknown> = {\n changesetName: name,\n changesetId: changeset.id,\n committed: result.committed,\n failed: result.failed,\n validationPassed: result.validation.passed,\n };\n reportCommitValidation(result, applyDetails);\n\n if (result.failed > 0) {\n applyDetails.errors = result.validation.errors;\n if (!isJson()) {\n handleInfo(ansis.red(`\u2717 Failed to apply ${result.failed} change(s):`));\n for (const error of result.validation.errors) {\n handleInfo(ansis.dim(` - ${error}`));\n }\n }\n }\n\n // Always show applied message, even if 0 changes\n handleSuccess(`Applied ${result.committed} change(s) from changeset`, applyDetails);\n\n // Add changeset to manifest history\n if (!model.manifest.changeset_history) {\n model.manifest.changeset_history = [];\n }\n model.manifest.changeset_history.push({\n name,\n committed_at: new Date().toISOString(),\n action: \"committed\",\n });\n\n // Always save the model and manifest, even if 0 changes\n // This ensures manifest is updated with changeset metadata\n await model.saveDirtyLayers();\n await model.saveManifest();\n\n if (result.failed === 0) {\n handleInfo(ansis.dim(`Changeset marked as committed`));\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n\n handleInfo(\"\");\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Revert a changeset from the model\n */\nexport async function changesetRevertCommand(name: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.revert\", {\n \"changeset.name\": name,\n })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${name}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.id\", changeset.id);\n (span as any).setAttribute(\"changeset.changeCount\", changeset.changes.length);\n }\n\n if (!isJson()) {\n console.log(ansis.bold(`\\nReverting changeset: ${ansis.cyan(name)}\\n`));\n console.log(ansis.dim(`Changes to discard: ${changeset.changes.length}`));\n }\n\n const changesetId = changeset.id || name;\n if (!changesetId) {\n const errMsg = \"Changeset ID could not be determined\";\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: errMsg }));\n } else {\n console.error(\n ansis.red(\"Error: \" + errMsg) +\n \"\\n\" +\n ansis.dim(\"The changeset must have an ID to proceed with revert.\")\n );\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset ID missing\" });\n }\n endSpan(span);\n process.exit(1);\n }\n await manager.revert(changesetId);\n\n handleInfo(\"\");\n\n // Show reverted message\n handleSuccess(`Reverted changeset: ${name}`, {\n changesetName: name,\n changesetId,\n changesetStatus: \"discarded\",\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n\n handleInfo(\"\");\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Activate a changeset for automatic tracking\n */\nexport async function changesetActivateCommand(name: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.activate\", {\n \"changeset.name\": name,\n })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const changeset = await manager.load(name);\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${name}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n await manager.setActive(name);\n\n handleSuccess(`Activated changeset: ${ansis.bold(name)}`, {\n changesetName: name,\n changesetId: changeset.id,\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Deactivate the current changeset\n */\nexport async function changesetDeactivateCommand(options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled ? startSpan(\"changeset.deactivate\") : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const active = await manager.getActiveId();\n\n if (!active) {\n handleInfo(ansis.yellow(\"No active changeset\"));\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.wasActive\", false);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.name\", active);\n (span as any).setAttribute(\"changeset.wasActive\", true);\n }\n\n const changeset = await manager.load(active);\n await manager.clearActive();\n handleSuccess(`Deactivated changeset: ${ansis.bold(active)}`, {\n changesetId: active,\n name: changeset?.name || active,\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Delete a changeset permanently\n */\nexport async function changesetDeleteCommand(\n name: string,\n options: {\n model?: string;\n force?: boolean;\n }\n): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.delete\", {\n \"changeset.name\": name,\n \"delete.force\": options.force === true,\n })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${name}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Check if changeset is currently active (compare by ID, not user-provided name)\n const active = await manager.getActiveId();\n if (active === changeset.id) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: `Cannot delete active changeset '${name}'` }));\n } else {\n console.error(ansis.red(`Error: Cannot delete active changeset '${name}'`));\n console.log(ansis.dim(\" Run `dr changeset deactivate` first\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Cannot delete active changeset\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Confirm deletion unless --force is used or in non-interactive environment\n if (!options.force) {\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"cli.interactive\", isInteractive);\n }\n if (isInteractive) {\n const confirm = await prompts.confirm({\n message: `Delete changeset '${name}'? This cannot be undone.`,\n });\n\n if (!confirm || typeof confirm !== \"boolean\") {\n handleSuccess(\"Deletion cancelled\", {\n status: \"cancelled\",\n });\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"delete.cancelled\", true);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n } else {\n // In non-interactive environment, require --force flag\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"Cannot confirm deletion in non-interactive environment\" }));\n } else {\n console.error(ansis.red(\"Error: Cannot confirm deletion in non-interactive environment\"));\n console.log(ansis.dim(\" Use --force flag to confirm deletion\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Interactive confirmation required\" });\n }\n endSpan(span);\n process.exit(1);\n }\n }\n\n await manager.delete(name);\n\n handleSuccess(`Deleted changeset: ${ansis.bold(name)}`, {\n changesetName: name,\n changesetId: changeset.id,\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Show the currently active changeset\n */\nexport async function changesetStatusCommand(options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled ? startSpan(\"changeset.status\") : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const active = await manager.getActiveId();\n\n if (!active) {\n console.log(ansis.dim(\"No active changeset\"));\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.hasActive\", false);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.name\", active);\n (span as any).setAttribute(\"changeset.hasActive\", true);\n }\n\n console.log(ansis.bold(`Active changeset: ${ansis.cyan(active)}`));\n\n // Load and show changeset details\n const changeset = await manager.load(active);\n\n if (changeset) {\n console.log(ansis.dim(` Changes tracked: ${changeset.changes.length}`));\n const changesByType = changeset.stats;\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.changeCount\", changeset.changes.length);\n (span as any).setAttribute(\"changeset.adds\", changesByType.additions);\n (span as any).setAttribute(\"changeset.updates\", changesByType.modifications);\n (span as any).setAttribute(\"changeset.deletes\", changesByType.deletions);\n }\n\n const parts = [];\n if (changesByType.additions > 0) parts.push(`+${changesByType.additions}`);\n if (changesByType.modifications > 0) parts.push(`~${changesByType.modifications}`);\n if (changesByType.deletions > 0) parts.push(`-${changesByType.deletions}`);\n if (parts.length > 0) {\n console.log(ansis.dim(` ${parts.join(\" \")}`));\n }\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * List all staged changes in the active changeset\n */\nexport async function changesetStagedCommand(options: { model?: string; layer?: string }): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.staged\", {\n \"staged.layer\": options.layer,\n })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangeset = await manager.getActiveId();\n\n if (!activeChangeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangeset);\n\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${activeChangeset}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${activeChangeset}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n let changes = changeset.changes;\n\n if (options.layer) {\n changes = changes.filter((c: any) => c.layerName === options.layer);\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"staged.changeCount\", changes.length);\n (span as any).setAttribute(\"staged.totalChanges\", changeset.changes.length);\n }\n\n if (changes.length === 0) {\n handleSuccess(\"No staged changes\", {\n changesetId: activeChangeset,\n changeCount: 0,\n changes: [],\n }, { verbose: true });\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (!isJson()) {\n console.log(ansis.bold(`\\nStaged Changes (${changes.length}):\\n`));\n const tableData = changes.map((c: any) => ({\n \"Element ID\": c.elementId,\n Layer: c.layerName,\n Type: c.type,\n Timestamp: new Date(c.timestamp || Date.now()).toISOString(),\n }));\n console.table(tableData);\n }\n\n handleSuccess(`Listed ${changes.length} staged change(s)`, {\n changesetId: activeChangeset,\n changeCount: changes.length,\n changes: changes.map((c: any) => ({\n elementId: c.elementId,\n layer: c.layerName,\n operation: c.type,\n timestamp: new Date(c.timestamp || Date.now()).toISOString(),\n })),\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Remove specific element from staging area\n */\nexport async function changesetExplicitStageCommand(elementId: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.stage-explicit\", { \"stage.elementId\": elementId })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const layerName = await findElementLayer(model, elementId);\n if (!layerName) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Element '${elementId}' not found` }));\n } else {\n console.error(ansis.red(`Error: Element '${elementId}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Element not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n const layer = await model.getLayer(layerName);\n const element = layer?.getElement(elementId);\n if (!element) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Element '${elementId}' not found in layer '${layerName}'` }));\n } else {\n console.error(ansis.red(`Error: Element '${elementId}' not found in layer '${layerName}'`));\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Guard against staging the same element twice\n const activeChangeset = await manager.load(activeChangesetId);\n if (activeChangeset?.changes.some((c: any) => c.elementId === elementId)) {\n console.warn(ansis.yellow(`Warning: Element '${elementId}' is already staged in the active changeset. Skipping.`));\n endSpan(span);\n return;\n }\n\n await manager.stage(activeChangesetId, {\n type: \"add\",\n elementId,\n layerName,\n after: element.toJSON() as unknown as Record<string, unknown>,\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"stage.layerName\", layerName);\n (span as any).setStatus({ code: 0 });\n }\n\n handleSuccess(`Staged element: ${elementId}`, {\n elementId,\n layer: layerName,\n changesetId: activeChangesetId,\n operation: \"add\",\n }, { verbose: true });\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({ code: 2, message: getErrorMessage(error) });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\nexport async function changesetUnstageCommand(elementId: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.unstage\", {\n \"unstage.elementId\": elementId,\n })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangesetId);\n\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${activeChangesetId}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n }\n process.exit(1);\n }\n\n // Check if element exists in changes\n const initialCount = changeset.changes.length;\n\n // Use the manager's unstage method\n await manager.unstage(activeChangesetId, elementId);\n\n // Reload to get updated count\n const updated = await manager.load(activeChangesetId);\n\n if (updated && updated.changes.length === initialCount) {\n handleWarning(`Element '${elementId}' not found in staged changes`);\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"unstage.found\", false);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"unstage.found\", true);\n (span as any).setAttribute(\"unstage.remainingChanges\", updated?.getChangeCount() || 0);\n }\n\n handleSuccess(`Unstaged element: ${elementId}`, {\n changesetId: activeChangesetId,\n elementId,\n remainingChanges: updated?.getChangeCount() || 0,\n }, { verbose: true });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Discard all or single staged changes\n */\nexport async function changesetDiscardCommand(elementId?: string, options: { model?: string } = {}): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.discard\", {\n \"discard.elementId\": elementId,\n \"discard.all\": !elementId,\n })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangesetId);\n\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${activeChangesetId}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"discard.changeCount\", changeset.changes.length);\n }\n\n if (elementId) {\n // Discard single element\n const initialCount = changeset.changes.length;\n\n // Use the manager's unstage method for single element\n await manager.unstage(activeChangesetId, elementId);\n\n // Reload to verify\n const updated = await manager.load(activeChangesetId);\n\n if (updated && updated.changes.length === initialCount) {\n handleWarning(`Element '${elementId}' not found in staged changes`);\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"discard.found\", false);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"discard.found\", true);\n }\n\n handleSuccess(`Discarded changes for element: ${elementId}`, {\n elementId,\n }, { verbose: true });\n } else {\n // Discard all changes with confirmation\n const isInteractive = process.stdin.isTTY && process.stdout.isTTY;\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"cli.interactive\", isInteractive);\n }\n\n if (isInteractive) {\n const confirmed = await prompts.confirm({\n message: `Discard all ${changeset.changes.length} staged changes? This cannot be undone.`,\n });\n\n if (!confirmed || typeof confirmed !== \"boolean\") {\n handleSuccess(\"Discard cancelled\", {\n status: \"cancelled\",\n });\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"discard.cancelled\", true);\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n } else {\n // In non-interactive environment, require explicit flag or piped input\n console.error(\n ansis.red(\"Error: Cannot confirm discard of all changes in non-interactive environment\")\n );\n console.log(ansis.dim(\" Specify an element ID to discard only that element\"));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Interactive confirmation required\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Use the manager's discard method for all changes\n await manager.discard(activeChangesetId);\n\n handleSuccess(`Discarded all staged changes`, {\n changesetStatus: \"discarded\",\n }, { verbose: true });\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n\n if (!isJson()) {\n console.log();\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Preview the merged model state with staged changes applied\n */\nexport async function changesetPreviewCommand(options: { model?: string; layer?: string }): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.preview\", {\n \"preview.layer\": options.layer,\n })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n console.error(ansis.red(\"Error: No active changeset\"));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangesetId);\n\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n console.log(ansis.bold(`\\nPreview: Merged Model State (${ansis.cyan(\"with staged changes\")})`));\n console.log(ansis.dim(`Changeset: ${changeset.name}`));\n console.log();\n\n // Show summary of changes\n const additions = changeset.getChangesByType(\"add\").length;\n const modifications = changeset.getChangesByType(\"update\").length;\n const deletions = changeset.getChangesByType(\"delete\").length;\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"preview.additions\", additions);\n (span as any).setAttribute(\"preview.modifications\", modifications);\n (span as any).setAttribute(\"preview.deletions\", deletions);\n (span as any).setAttribute(\"preview.totalChanges\", changeset.changes.length);\n }\n\n if (additions > 0) {\n console.log(ansis.green(`+ ${additions} additions`));\n }\n if (modifications > 0) {\n console.log(ansis.yellow(`~ ${modifications} modifications`));\n }\n if (deletions > 0) {\n console.log(ansis.red(`- ${deletions} deletions`));\n }\n\n console.log();\n\n if (options.layer) {\n // Filter changes by layer\n const layerChanges = changeset.changes.filter((c: any) => c.layerName === options.layer);\n\n if (layerChanges.length === 0) {\n console.log(ansis.dim(`No staged changes in layer '${options.layer}'`));\n return;\n }\n\n console.log(ansis.bold(`Layer: ${options.layer}`));\n const tableData = layerChanges.map((c: any) => ({\n \"Element ID\": c.elementId + ansis.dim(\" (staged)\"),\n Type: c.type,\n Status: c.type === \"add\" ? \"new\" : c.type === \"delete\" ? \"removed\" : \"updated\",\n }));\n console.table(tableData);\n } else {\n // Show all layers with staged changes\n const layerMap = new Map<string, any[]>();\n changeset.changes.forEach((c: any) => {\n const existing = layerMap.get(c.layerName) ?? [];\n existing.push(c);\n layerMap.set(c.layerName, existing);\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"preview.layerCount\", layerMap.size);\n }\n\n for (const [layerName, changes] of layerMap) {\n console.log(ansis.bold(`Layer: ${layerName}`));\n const tableData = changes.map((c: any) => ({\n \"Element ID\": c.elementId,\n Type: c.type,\n Status: c.type === \"add\" ? \"new\" : c.type === \"delete\" ? \"removed\" : \"updated\",\n }));\n console.table(tableData);\n console.log();\n }\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Show delta between base model and staged changes\n */\nexport async function changesetDiffCommand(options: { model?: string; layer?: string }): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.diff\", {\n \"diff.layer\": options.layer,\n })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await manager.getActiveId();\n\n if (!activeChangesetId) {\n console.error(ansis.red(\"Error: No active changeset\"));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n endSpan(span);\n return;\n }\n\n const changeset = await manager.load(activeChangesetId);\n\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n console.log(ansis.bold(\"\\nDiff: Base Model vs Staged Changes\\n\"));\n\n // Group changes by layer\n const layerMap = new Map<string, any[]>();\n changeset.changes.forEach((c: any) => {\n if (!options.layer || c.layerName === options.layer) {\n const existing = layerMap.get(c.layerName) ?? [];\n existing.push(c);\n layerMap.set(c.layerName, existing);\n }\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"diff.layerCount\", layerMap.size);\n (span as any).setAttribute(\"diff.totalChanges\", changeset.changes.length);\n }\n\n if (layerMap.size === 0) {\n console.log(\n ansis.dim(options.layer ? `No changes in layer '${options.layer}'` : \"No staged changes\")\n );\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n // Display changes grouped by layer\n for (const [layerName, changes] of layerMap) {\n console.log(ansis.bold(`Layer: ${layerName}`));\n\n for (const change of changes) {\n if (change.type === \"add\") {\n console.log(ansis.green(`+ ${change.elementId}`));\n console.log(ansis.dim(` ${JSON.stringify(change.after || {}, null, 2)}`));\n } else if (change.type === \"delete\") {\n console.log(ansis.red(`- ${change.elementId}`));\n console.log(ansis.dim(` ${JSON.stringify(change.before || {}, null, 2)}`));\n } else if (change.type === \"update\") {\n console.log(ansis.yellow(`~ ${change.elementId}`));\n console.log(ansis.dim(` Before: ${JSON.stringify(change.before || {})}`));\n console.log(ansis.dim(` After: ${JSON.stringify(change.after || {})}`));\n }\n }\n\n console.log();\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Apply staged changes to the base model\n *\n * Implements atomic commit with validation and rollback on failure.\n * All changes are applied atomically\u2014on any failure, the model is rolled back.\n *\n * @param options - Commit options\n * @param options.validate - Run validation before commit (default: true; --no-validate skips it).\n * When enabled, errors the changeset introduces (present in the projected model but not\n * the base) block the commit and cannot be overridden with --force; errors the base model\n * already had are counted and reported, not blocking.\n * @param options.force - Skip drift detection warnings (default: false).\n * When the base model has changed since the changeset was created, drift is detected.\n * Use --force to commit despite drift. Validation errors always block commit regardless of --force.\n *\n * @param nameOrId - The changeset to commit (id or name). Defaults to the active one. A named\n * changeset that is not active is activated for the commit; the changeset that was active before\n * is active again afterwards, whether the commit succeeds or not.\n *\n * @throws Error if validation fails, drift detected without --force, or commit fails\n */\nexport async function changesetCommitCommand(\n nameOrId?: string,\n options?: {\n model?: string;\n validate?: boolean;\n force?: boolean;\n }\n): Promise<void> {\n // Set when a named changeset was activated for the commit: what to make active again after it.\n let restoreActive: { rootPath: string; previous: string | null } | null = null;\n const restore = async (): Promise<void> => {\n if (!restoreActive) return;\n const { rootPath, previous } = restoreActive;\n restoreActive = null;\n const probe = await Model.load(rootPath, { lazyLoad: true });\n const manager = new StagingAreaManager(probe.rootPath, probe);\n const prior = previous ? await manager.load(previous) : null;\n if (prior?.status === \"staged\") {\n await manager.setActive(previous!);\n if (!isJson()) console.log(ansis.dim(`Changeset '${prior.name}' is active again.`));\n } else {\n await manager.clearActive();\n }\n };\n\n await startActiveSpan(\n \"changeset.commit\",\n async (span) => {\n try {\n if (nameOrId) {\n const probe = await Model.load(options?.model, { lazyLoad: true });\n const probeManager = new StagingAreaManager(probe.rootPath, probe);\n const target = await probeManager.load(nameOrId);\n if (!target || !target.id) {\n throw new CLIError(`Changeset '${nameOrId}' not found`, ErrorCategory.USER, [\n 'Run \"dr changeset list\" to see changesets by name and id',\n ]);\n }\n if (target.status !== \"staged\") {\n throw new CLIError(\n `Changeset '${target.name}' is ${target.status}; only a staged changeset can be committed`,\n ErrorCategory.USER,\n ['Run \"dr changeset list\" to find a staged changeset']\n );\n }\n const activeId = await probeManager.getActiveId();\n if (activeId !== target.id) {\n // Commit works on the active changeset: the model it loads merges that one's staged changes.\n restoreActive = { rootPath: probe.rootPath, previous: activeId };\n await probeManager.setActive(target.id);\n }\n }\n\n const model = await Model.load(options?.model, { lazyLoad: false });\n const stagingManager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await stagingManager.getActiveId();\n\n if (!activeChangesetId) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"No active changeset\" }));\n } else {\n console.error(ansis.red(\"Error: No active changeset\"));\n }\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 2, message: \"No active changeset\" });\n }\n return;\n }\n\n const changeset = await stagingManager.load(activeChangesetId);\n\n if (!changeset) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 2, message: `Changeset '${activeChangesetId}' not found` }));\n } else {\n console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\n }\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 2, message: \"Changeset not found\" });\n }\n span.end();\n process.exit(1);\n }\n\n const changeCount = changeset.changes.length;\n\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"changeset.id\", activeChangesetId);\n (span as any).setAttribute(\"changeset.name\", changeset.name);\n (span as any).setAttribute(\"changeset.changeCount\", changeCount);\n }\n\n if (changeCount === 0) {\n handleSuccess(\"No staged changes to commit\", {\n name: changeset.name,\n changesetId: activeChangesetId,\n stagedChanges: 0,\n }, { verbose: true });\n await restore();\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 0 });\n }\n return;\n }\n\n if (!isJson()) {\n console.log(ansis.bold(`\\nCommitting changeset: ${ansis.cyan(changeset.name)}`));\n console.log(ansis.dim(`Staged changes: ${changeCount}`));\n console.log();\n }\n\n // Execute atomic commit with validation and rollback\n try {\n const result = await stagingManager.commit(model, activeChangesetId, {\n validate: options?.validate !== false,\n force: options?.force === true,\n });\n\n // Deactivate the changeset after successful commit\n await stagingManager.clearActive();\n\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"commit.committed\", result.committed);\n (span as any).setAttribute(\"commit.skipped\", result.skipped);\n (span as any).setAttribute(\"commit.failed\", result.failed);\n (span as any).setAttribute(\"commit.validationPassed\", result.validation.passed);\n }\n\n const commitDetails: Record<string, unknown> = {\n name: changeset.name,\n changesetId: activeChangesetId,\n committedCount: result.committed,\n stagedChanges: changeCount,\n validationPassed: result.validation.passed,\n };\n reportCommitValidation(result, commitDetails);\n\n if ((result.skipped ?? 0) > 0) {\n commitDetails.skipped = result.skipped;\n commitDetails.skippedDetails = (result.skippedDetails ?? []).slice(0, 10);\n }\n\n if (result.failed > 0) {\n commitDetails.failed = result.failed;\n }\n\n // Safety net: warn if any staged changes were neither committed, skipped, nor failed\n const accountedFor = result.committed + (result.skipped ?? 0) + result.failed;\n if (accountedFor < changeCount) {\n const unaccounted = changeCount - accountedFor;\n commitDetails.unaccountedChanges = unaccounted;\n if (!isJson()) {\n console.log(\n ansis.yellow(\n `\u26A0 Warning: ${unaccounted} staged change(s) were not applied, skipped, or reported as failed.` +\n ` This is unexpected \u2014 check the changeset log for details.`\n )\n );\n }\n }\n\n if (result.driftWarning) {\n commitDetails.driftDetected = true;\n if (!isJson()) {\n console.log(\n ansis.yellow(`\u26A0 Warning: Model had drifted since changeset creation (--force was used)`)\n );\n }\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"commit.driftDetected\", true);\n }\n }\n\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 0 });\n }\n\n handleSuccess(`Committed ${result.committed} change(s)`, commitDetails, { verbose: true });\n await restore();\n\n if (!isJson()) {\n console.log();\n }\n } catch (error) {\n // Commit failed - error was thrown from StagingAreaManager\n // Model has been automatically rolled back\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: `Commit failed and rolled back: ${getErrorMessage(error)}` }));\n } else {\n console.log(\n ansis.red(\n `\u2717 Commit failed and rolled back: ${getErrorMessage(error)}`\n )\n );\n }\n if (isTelemetryEnabled) {\n (span as any).setAttribute(\"commit.rolledBack\", true);\n }\n throw error;\n }\n } catch (error) {\n if (isTelemetryEnabled) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n if (error instanceof CLIError && error.suggestions?.length) {\n for (const suggestion of error.suggestions) console.error(ansis.dim(` ${suggestion}`));\n }\n }\n await restore().catch((restoreError) =>\n console.error(ansis.red(`Error: could not reactivate the previous changeset: ${getErrorMessage(restoreError)}`))\n );\n span.end();\n process.exit(1);\n }\n },\n {\n \"commit.validate\": options?.validate !== false,\n \"commit.force\": options?.force === true,\n }\n );\n}\n\n/**\n * Export changeset to portable file\n */\nexport async function changesetExportCommand(\n changesetId: string,\n options: {\n model?: string;\n output?: string;\n format?: \"yaml\" | \"json\" | \"patch\";\n }\n): Promise<void> {\n const format = options.format || \"yaml\";\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.export\", {\n \"changeset.id\": changesetId,\n \"export.format\": format,\n })\n : null;\n\n try {\n const model = await Model.load(options.model, { lazyLoad: true });\n const exporter = new ChangesetExporter(model.rootPath);\n\n // Default output filename based on changeset id and format\n const ext = format === \"patch\" ? \"patch\" : format;\n const outputPath = options.output || `${changesetId}.${ext}`;\n\n // Ensure output path is absolute\n const absolutePath = path.isAbsolute(outputPath)\n ? outputPath\n : path.join(process.cwd(), outputPath);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"export.outputPath\", outputPath);\n }\n\n await exporter.exportToFile(changesetId, absolutePath, format);\n\n handleSuccess(`Exported changeset to ${outputPath}`, {\n changesetId,\n outputPath,\n format,\n }, { verbose: true });\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: getErrorMessage(error) }));\n } else {\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n }\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Import changeset from portable file\n */\nexport async function changesetImportCommand(\n file: string,\n options: { model?: string; force?: boolean } = {}\n): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"changeset.import\", {\n \"import.file\": file,\n \"import.force\": options.force === true,\n })\n : null;\n\n try {\n // Load full model for compatibility validation\n const model = await Model.load(options.model, { lazyLoad: false });\n const exporter = new ChangesetExporter(model.rootPath);\n\n // Ensure file path is absolute\n const absolutePath = path.isAbsolute(file) ? file : path.join(process.cwd(), file);\n\n // Import changeset\n const imported = await exporter.importFromFile(absolutePath);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.name\", imported.name);\n (span as any).setAttribute(\"changeset.changeCount\", imported.changes.length);\n }\n\n // Validate compatibility with current model\n const compatibility = await exporter.validateCompatibility(imported, model);\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"import.compatible\", compatibility.compatible);\n (span as any).setAttribute(\"import.baseSnapshotMatch\", compatibility.baseSnapshotMatch);\n }\n\n // Check for issues\n if (!compatibility.compatible) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"Changeset is incompatible\", warnings: compatibility.warnings }));\n } else {\n console.error(ansis.red(\"\u2717 Import failed: Changeset is incompatible\"));\n console.error(ansis.dim(` Issues:`));\n for (const warning of compatibility.warnings) {\n console.error(ansis.dim(` - ${warning}`));\n }\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Changeset incompatible\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n // Check for drift and require --force if detected\n if (!compatibility.baseSnapshotMatch) {\n if (!options.force) {\n if (isJson()) {\n console.log(JSON.stringify({ status: \"error\", code: 1, message: \"Imported changeset has base model drift\" }));\n } else {\n console.error(\n ansis.red(\"Error: Imported changeset has base model drift\") +\n \"\\n\" +\n ansis.dim(\"The model has been modified since this changeset was created.\") +\n \"\\n\" +\n ansis.dim(\"This may cause conflicts or unexpected behavior when committing.\") +\n \"\\n\\n\" +\n ansis.dim(\"To import anyway, use: --force\")\n );\n }\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 2, message: \"Drift detected, force required\" });\n }\n endSpan(span);\n process.exit(1);\n }\n\n console.warn(\n ansis.yellow(`\u26A0 Warning: Base model drift detected (--force used)`) +\n \"\\n\" +\n ansis.dim(\"Review changes carefully before committing.\")\n );\n console.log();\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"import.driftOverridden\", true);\n }\n }\n\n // Assign new ID to avoid conflicts\n const newId = generateImportedChangesetId();\n imported.id = newId;\n\n // Save to staging area using storage\n const storage = new StagedChangesetStorage(model.rootPath);\n await storage.save(imported);\n\n const importDetails: Record<string, unknown> = {\n changesetName: imported.name,\n changesetId: newId,\n additions: imported.stats?.additions || 0,\n modifications: imported.stats?.modifications || 0,\n deletions: imported.stats?.deletions || 0,\n };\n\n if (!compatibility.baseSnapshotMatch) {\n importDetails.driftDetected = true;\n }\n\n handleSuccess(`Imported changeset: ${imported.name}`, importDetails, { verbose: true });\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.id\", newId);\n (span as any).setStatus({ code: 0 });\n }\n } catch (error) {\n if (isTelemetryEnabled && span) {\n (span as any).recordException(error as Error);\n (span as any).setStatus({\n code: 2,\n message: getErrorMessage(error),\n });\n }\n console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\n/**\n * Register changeset subcommands\n */\nexport function changesetCommands(program: Command): void {\n const changesetGroup = program.command(\"changeset\").description(\"Manage changesets\");\n\n changesetGroup\n .command(\"create <name>\")\n .description(\"Create a new changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--description <desc>\", \"Changeset description\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset create \"v1.1 migration\"\n $ dr changeset create \"api-refactoring\" --description \"Refactor API layer endpoints\"`\n )\n .action(async (name, options) => {\n await changesetCreateCommand(name, options);\n });\n\n changesetGroup\n .command(\"list\")\n .description(\"List all changesets\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset list`\n )\n .action(async (options) => {\n await changesetListCommand(options);\n });\n\n changesetGroup\n .command(\"apply <name>\")\n .description(\"Apply a changeset to the model\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--no-validate\", \"Skip validation before applying\")\n .option(\"--force\", \"Force apply even if base model has drifted\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset apply \"v1.1 migration\"\n $ dr changeset apply \"v1.1 migration\" --no-validate\n $ dr changeset apply \"v1.1 migration\" --force`\n )\n .action(async (name, options) => {\n await changesetApplyCommand(name, options);\n });\n\n changesetGroup\n .command(\"revert <name>\")\n .description(\"Revert a changeset from the model\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset revert \"v1.1 migration\"`\n )\n .action(async (name, options) => {\n await changesetRevertCommand(name, options);\n });\n\n changesetGroup\n .command(\"activate <name>\")\n .description(\"Activate a changeset for automatic change tracking\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset activate \"v1.1 migration\"`\n )\n .action(async (name, options) => {\n await changesetActivateCommand(name, options);\n });\n\n changesetGroup\n .command(\"deactivate\")\n .description(\"Deactivate the currently active changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset deactivate`\n )\n .action(async (options) => {\n await changesetDeactivateCommand(options);\n });\n\n changesetGroup\n .command(\"status\")\n .description(\"Show the currently active changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset status`\n )\n .action(async (options) => {\n await changesetStatusCommand(options);\n });\n\n changesetGroup\n .command(\"show [name]\")\n .description(\"Show changeset details (use: status, staged, diff, or preview)\")\n .addHelpText(\n \"after\",\n `\nTo inspect a changeset, use one of:\n $ dr changeset status # Show the active changeset\n $ dr changeset staged # List all staged changes\n $ dr changeset diff [name] # Show a diff of staged changes\n $ dr changeset preview [name] # Preview what will be committed`\n )\n .action(async (name?: string) => {\n const nameHint = name ? ` '${name}'` : \"\";\n console.error(\n `error: 'dr changeset show${nameHint}' is not a valid subcommand.\\n\\n` +\n `To inspect a changeset, use one of:\\n` +\n ` dr changeset status \u2014 show the active changeset\\n` +\n ` dr changeset staged \u2014 list all staged changes\\n` +\n ` dr changeset diff \u2014 show a diff of staged changes\\n` +\n ` dr changeset preview \u2014 preview what will be committed`\n );\n process.exit(1);\n });\n\n changesetGroup\n .command(\"delete <name>\")\n .description(\"Delete a changeset permanently\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-f, --force\", \"Skip confirmation prompt\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset delete my-feature\n $ dr changeset delete my-feature --force`\n )\n .action(async (name, options) => {\n await changesetDeleteCommand(name, options);\n });\n\n // Staging operation commands\n changesetGroup\n .command(\"staged\")\n .description(\"List all staged changes in the active changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-l, --layer <layer>\", \"Filter by layer name\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset staged\n $ dr changeset staged --layer api`\n )\n .action(async (options) => {\n await changesetStagedCommand(options);\n });\n\n changesetGroup\n .command(\"stage <element-id>\")\n .description(\"Stage a specific element into the active changeset\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset stage api.operation.get-users\n $ dr changeset stage ux.uicomponent.login-form`\n )\n .action(async (elementId, options) => {\n await changesetExplicitStageCommand(elementId, options);\n });\n\n changesetGroup\n .command(\"unstage <element-id>\")\n .description(\"Remove specific element from staging area\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset unstage api-endpoint-create-customer`\n )\n .action(async (elementId, options) => {\n await changesetUnstageCommand(elementId, options);\n });\n\n changesetGroup\n .command(\"discard [element-id]\")\n .description(\"Discard all or single staged changes\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset discard\n $ dr changeset discard api-endpoint-create-customer`\n )\n .action(async (elementId, options) => {\n await changesetDiscardCommand(elementId, options);\n });\n\n changesetGroup\n .command(\"preview\")\n .description(\"Preview the merged model state with staged changes applied\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-l, --layer <layer>\", \"Preview specific layer only\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset preview\n $ dr changeset preview --layer application`\n )\n .action(async (options) => {\n await changesetPreviewCommand(options);\n });\n\n changesetGroup\n .command(\"diff\")\n .description(\"Show delta between base model and staged changes\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-l, --layer <layer>\", \"Show diff for specific layer only\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset diff\n $ dr changeset diff --layer api`\n )\n .action(async (options) => {\n await changesetDiffCommand(options);\n });\n\n changesetGroup\n .command(\"commit [changeset]\")\n .description(\"Apply a changeset's staged changes to the base model (the active one, or the one named)\")\n .allowExcessArguments(false)\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n // Kept for scripts written against the old help, which listed --validate; validation runs by default.\n .addOption(new Option(\"--validate\", \"Run validation before commit (default)\").hideHelp())\n .option(\n \"--no-validate\",\n \"Skip validation before commit (validation runs by default; only errors the changeset introduces block, errors already in the base model are reported as a count)\"\n )\n .option(\"--force\", \"Commit despite drift warnings (does not skip validation)\", false)\n .addHelpText(\n \"after\",\n `\nValidation compares the model with and without the changeset. Errors the\nchangeset introduces block the commit; errors the base model already had are\nnot counted against it, and the output says how many there were.\n\nA named changeset (id or name) need not be active: it is activated for the\ncommit, and the changeset that was active before is active again afterwards.\n\nExamples:\n $ dr changeset commit\n $ dr changeset commit add-order-api # commit the changeset named add-order-api\n $ dr changeset commit --force # commit despite drift\n $ dr changeset commit --no-validate # skip validation entirely`\n )\n .action(async (name: string | undefined, options) => {\n await changesetCommitCommand(name, options);\n });\n\n changesetGroup\n .command(\"export <changeset-id>\")\n .description(\"Export changeset to portable file\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-o, --output <file>\", \"Output file path\")\n .option(\"-f, --format <format>\", \"Export format (yaml|json|patch)\", \"yaml\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset export api-updates\n $ dr changeset export api-updates --output changes.yaml\n $ dr changeset export api-updates --format json --output changes.json\n $ dr changeset export api-updates --format patch --output changes.patch`\n )\n .action(async (changesetId, options) => {\n await changesetExportCommand(changesetId, options);\n });\n\n changesetGroup\n .command(\"import <file>\")\n .description(\"Import changeset from file\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"-f, --force\", \"Import despite base model drift\", false)\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset import changes.yaml\n $ dr changeset import ../team-changes.json\n $ dr changeset import changes.yaml --force`\n )\n .action(async (file, options) => {\n await changesetImportCommand(file, options);\n });\n\n changesetGroup\n .command(\"verify [planned]\")\n .description(\"Compare a planned changeset with what was built (an as-built changeset, or the base model)\")\n .option(\"--model <path>\", \"Path to model root (contains model/manifest.yaml)\")\n .option(\"--against <changeset>\", \"As-built changeset (ID or name) to compare with\")\n .option(\"--base\", \"Compare with the base model\")\n .option(\n \"--extracted\",\n \"With --base: the as-built side landed from codebase_extract, so planned parts extraction can't observe are unverifiable, not missing\"\n )\n .option(\"--no-match-by-source\", \"Do not match elements by shared source file\")\n .option(\"--json\", \"Output as JSON\")\n .addHelpText(\n \"after\",\n `\nThe planned changeset defaults to the active one.\n\nExamples:\n $ dr changeset verify export-orders --against export-orders-as-built\n $ dr changeset verify export-orders --base --json\n $ dr changeset verify export-orders --base --extracted`\n )\n .action(async (planned, options) => {\n await changesetVerifyCommand(planned, options);\n });\n\n changesetGroup.showSuggestionAfterError();\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/delete.js
CHANGED
|
@@ -5,6 +5,7 @@ import { MutationHandler } from "../core/mutation-handler.js";
|
|
|
5
5
|
import { ReferenceRegistry } from "../core/reference-registry.js";
|
|
6
6
|
import { DependencyTracker, TraceDirection } from "../core/dependency-tracker.js";
|
|
7
7
|
import { findElementLayer } from "../utils/element-utils.js";
|
|
8
|
+
import { elementIdentifiers } from "../core/relationships.js";
|
|
8
9
|
import { CLIError, handleError, handleSuccess, handleInfo, ErrorCategory, ModelNotFoundError } from "../utils/errors.js";
|
|
9
10
|
import { startSpan, endSpan } from "../telemetry/index.js";
|
|
10
11
|
import { getErrorMessage } from "../utils/errors.js";
|
|
@@ -28,7 +29,7 @@ async function deleteCommand(id, options) {
|
|
|
28
29
|
var showDeletionSuccess = showDeletionSuccess2;
|
|
29
30
|
let model;
|
|
30
31
|
try {
|
|
31
|
-
model = await Model.load(options.model
|
|
32
|
+
model = await Model.load(options.model);
|
|
32
33
|
} catch (error) {
|
|
33
34
|
const message = getErrorMessage(error);
|
|
34
35
|
throw message.includes("No DR project") || message.includes("Model not found") ? new ModelNotFoundError() : error;
|
|
@@ -76,7 +77,12 @@ async function deleteCommand(id, options) {
|
|
|
76
77
|
});
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
|
-
const elementsToRemove = options.cascade ? [id, ...dependents] : [id];
|
|
80
|
+
const elementsToRemove = options.cascade ? [id, ...dependents] : [id], relationshipIdentifiers = /* @__PURE__ */ new Set();
|
|
81
|
+
for (const eid of elementsToRemove) {
|
|
82
|
+
const target = eid === id ? element : model.getElementById(eid);
|
|
83
|
+
for (const identifier of elementIdentifiers(target ?? {}, eid))
|
|
84
|
+
relationshipIdentifiers.add(identifier);
|
|
85
|
+
}
|
|
80
86
|
if (options.dryRun) {
|
|
81
87
|
if (handleInfo(""), handleInfo(ansis.yellow("Dry run - not removing")), handleInfo(ansis.dim(`Would remove ${elementsToRemove.length} element(s)`)), options.cascade && dependents.length > 0) {
|
|
82
88
|
handleInfo(""), handleInfo(ansis.dim("Elements that would be removed:")), handleInfo(ansis.dim(` - ${id} (target)`));
|
|
@@ -157,9 +163,9 @@ async function deleteCommand(id, options) {
|
|
|
157
163
|
changesetStatus: "staged",
|
|
158
164
|
changeset: activeChangeset.name,
|
|
159
165
|
totalElementsDeleted: elementsToRemove.length
|
|
160
|
-
}, { verbose: options.verbose }) : (
|
|
166
|
+
}, { verbose: options.verbose }) : (model.relationships.deleteForElement([...relationshipIdentifiers]) > 0 && await model.saveRelationships(), showDeletionSuccess2());
|
|
161
167
|
} else
|
|
162
|
-
|
|
168
|
+
model.relationships.deleteForElement([...relationshipIdentifiers]) > 0 && await model.saveRelationships(), showDeletionSuccess2();
|
|
163
169
|
} catch (error) {
|
|
164
170
|
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({ code: 2, message: error.message })), handleError(error);
|
|
165
171
|
} finally {
|