@documentation-robotics/cli 0.1.0 → 0.1.5
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/LICENSE +21 -0
- package/README.md +466 -693
- package/dist/analysis/data-model-analyzer.js +189 -0
- package/dist/analysis/data-model-analyzer.js.map +7 -0
- package/dist/analysis/index.js +3 -0
- package/dist/analysis/index.js.map +7 -0
- package/dist/analysis/relationship-classifier.js +181 -0
- package/dist/analysis/relationship-classifier.js.map +7 -0
- package/dist/analyzers/base-analyzer.js +1 -0
- package/dist/analyzers/base-analyzer.js.map +7 -0
- package/dist/analyzers/call-graph-utils.js +39 -0
- package/dist/analyzers/call-graph-utils.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +1205 -0
- package/dist/analyzers/cbm-analyzer.js.map +7 -0
- package/dist/analyzers/heuristic-utils.js +55 -0
- package/dist/analyzers/heuristic-utils.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +146 -0
- package/dist/analyzers/mapping-loader.js.map +7 -0
- package/dist/analyzers/registry.js +124 -0
- package/dist/analyzers/registry.js.map +7 -0
- package/dist/analyzers/session-state.js +176 -0
- package/dist/analyzers/session-state.js.map +7 -0
- package/dist/analyzers/stdio-client.js +206 -0
- package/dist/analyzers/stdio-client.js.map +7 -0
- package/dist/analyzers/types.js +15 -0
- package/dist/analyzers/types.js.map +7 -0
- package/dist/analyzers/verify-engine.js +209 -0
- package/dist/analyzers/verify-engine.js.map +7 -0
- package/dist/analyzers/verify-ignore.js +130 -0
- package/dist/analyzers/verify-ignore.js.map +7 -0
- package/dist/analyzers/version.js +8 -0
- package/dist/analyzers/version.js.map +7 -0
- package/dist/audit/ai/runner.js +41 -0
- package/dist/audit/ai/runner.js.map +7 -0
- package/dist/audit/differential-analyzer.js +183 -0
- package/dist/audit/differential-analyzer.js.map +7 -0
- package/dist/audit/index.js +32 -0
- package/dist/audit/index.js.map +7 -0
- package/dist/audit/nodes/ai/evaluator.js +49 -0
- package/dist/audit/nodes/ai/evaluator.js.map +7 -0
- package/dist/audit/nodes/ai/parser.js +55 -0
- package/dist/audit/nodes/ai/parser.js.map +7 -0
- package/dist/audit/nodes/ai/prompts.js +103 -0
- package/dist/audit/nodes/ai/prompts.js.map +7 -0
- package/dist/audit/nodes/analysis/node-completeness-checker.js +32 -0
- package/dist/audit/nodes/analysis/node-completeness-checker.js.map +7 -0
- package/dist/audit/nodes/analysis/node-definition-analyzer.js +47 -0
- package/dist/audit/nodes/analysis/node-definition-analyzer.js.map +7 -0
- package/dist/audit/nodes/analysis/node-overlap-detector.js +79 -0
- package/dist/audit/nodes/analysis/node-overlap-detector.js.map +7 -0
- package/dist/audit/nodes/model/orchestrator.js +82 -0
- package/dist/audit/nodes/model/orchestrator.js.map +7 -0
- package/dist/audit/nodes/spec/loader.js +116 -0
- package/dist/audit/nodes/spec/loader.js.map +7 -0
- package/dist/audit/nodes/spec/orchestrator.js +68 -0
- package/dist/audit/nodes/spec/orchestrator.js.map +7 -0
- package/dist/audit/nodes/types.js +1 -0
- package/dist/audit/nodes/types.js.map +7 -0
- package/dist/audit/pipeline/index.js +5 -0
- package/dist/audit/pipeline/index.js.map +7 -0
- package/dist/audit/pipeline/pipeline-orchestrator.js +218 -0
- package/dist/audit/pipeline/pipeline-orchestrator.js.map +7 -0
- package/dist/audit/relationships/ai/evaluator.js +235 -0
- package/dist/audit/relationships/ai/evaluator.js.map +7 -0
- package/dist/audit/relationships/ai/parser.js +197 -0
- package/dist/audit/relationships/ai/parser.js.map +7 -0
- package/dist/audit/relationships/ai/prompts.js +274 -0
- package/dist/audit/relationships/ai/prompts.js.map +7 -0
- package/dist/audit/relationships/analysis/balance-assessor.js +115 -0
- package/dist/audit/relationships/analysis/balance-assessor.js.map +7 -0
- package/dist/audit/relationships/analysis/coverage-analyzer.js +99 -0
- package/dist/audit/relationships/analysis/coverage-analyzer.js.map +7 -0
- package/dist/audit/relationships/analysis/duplicate-detector.js +95 -0
- package/dist/audit/relationships/analysis/duplicate-detector.js.map +7 -0
- package/dist/audit/relationships/analysis/gap-analyzer.js +99 -0
- package/dist/audit/relationships/analysis/gap-analyzer.js.map +7 -0
- package/dist/audit/relationships/analysis/layer-templates.js +294 -0
- package/dist/audit/relationships/analysis/layer-templates.js.map +7 -0
- package/dist/audit/relationships/graph/connectivity.js +129 -0
- package/dist/audit/relationships/graph/connectivity.js.map +7 -0
- package/dist/audit/relationships/graph/relationship-graph.js +179 -0
- package/dist/audit/relationships/graph/relationship-graph.js.map +7 -0
- package/dist/audit/relationships/model/balance-assessor.js +49 -0
- package/dist/audit/relationships/model/balance-assessor.js.map +7 -0
- package/dist/audit/relationships/model/coverage-analyzer.js +34 -0
- package/dist/audit/relationships/model/coverage-analyzer.js.map +7 -0
- package/dist/audit/relationships/model/duplicate-detector.js +68 -0
- package/dist/audit/relationships/model/duplicate-detector.js.map +7 -0
- package/dist/audit/relationships/model/gap-analyzer.js +41 -0
- package/dist/audit/relationships/model/gap-analyzer.js.map +7 -0
- package/dist/audit/relationships/model/orchestrator.js +126 -0
- package/dist/audit/relationships/model/orchestrator.js.map +7 -0
- package/dist/audit/relationships/spec/orchestrator.js +157 -0
- package/dist/audit/relationships/spec/orchestrator.js.map +7 -0
- package/dist/audit/reports/index.js +5 -0
- package/dist/audit/reports/index.js.map +7 -0
- package/dist/audit/reports/report-generator.js +118 -0
- package/dist/audit/reports/report-generator.js.map +7 -0
- package/dist/audit/snapshot-storage.js +163 -0
- package/dist/audit/snapshot-storage.js.map +7 -0
- package/dist/audit/types.js +21 -0
- package/dist/audit/types.js.map +7 -0
- package/dist/cli.js +223 -92
- package/dist/cli.js.map +3 -3
- package/dist/coding-agents/agents/claude-code.js +147 -0
- package/dist/coding-agents/agents/claude-code.js.map +7 -0
- package/dist/coding-agents/agents/index.js +5 -0
- package/dist/coding-agents/agents/index.js.map +7 -0
- package/dist/coding-agents/agents/types.js +1 -0
- package/dist/coding-agents/agents/types.js.map +7 -0
- package/dist/coding-agents/base-chat-client.js +45 -0
- package/dist/coding-agents/base-chat-client.js.map +7 -0
- package/dist/coding-agents/chat-utils.js +23 -0
- package/dist/coding-agents/chat-utils.js.map +7 -0
- package/dist/coding-agents/claude-code-client.js +246 -0
- package/dist/coding-agents/claude-code-client.js.map +7 -0
- package/dist/coding-agents/copilot-client.js +209 -0
- package/dist/coding-agents/copilot-client.js.map +7 -0
- package/dist/commands/add.js +95 -33
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +511 -0
- package/dist/commands/analyzer.js.map +7 -0
- package/dist/commands/audit-diff.js +49 -0
- package/dist/commands/audit-diff.js.map +7 -0
- package/dist/commands/audit-snapshots.js +62 -0
- package/dist/commands/audit-snapshots.js.map +7 -0
- package/dist/commands/audit.js +81 -0
- package/dist/commands/audit.js.map +7 -0
- package/dist/commands/catalog.js +248 -0
- package/dist/commands/catalog.js.map +7 -0
- package/dist/commands/changeset.js +577 -66
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/chat.js +106 -83
- package/dist/commands/chat.js.map +2 -2
- package/dist/commands/claude.js +74 -0
- package/dist/commands/claude.js.map +7 -0
- package/dist/commands/conformance.js +71 -68
- package/dist/commands/conformance.js.map +2 -2
- package/dist/commands/copilot.js +75 -0
- package/dist/commands/copilot.js.map +7 -0
- package/dist/commands/delete.js +125 -11
- package/dist/commands/delete.js.map +3 -3
- package/dist/commands/discover-logic.js +44 -0
- package/dist/commands/discover-logic.js.map +7 -0
- package/dist/commands/docs.js +87 -0
- package/dist/commands/docs.js.map +7 -0
- package/dist/commands/element.js +14 -20
- package/dist/commands/element.js.map +2 -2
- package/dist/commands/export.js +13 -3
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/import.js +51 -0
- package/dist/commands/import.js.map +7 -0
- package/dist/commands/info.js +30 -24
- package/dist/commands/info.js.map +2 -2
- package/dist/commands/init.js +27 -11
- package/dist/commands/init.js.map +2 -2
- package/dist/commands/list.js +63 -13
- package/dist/commands/list.js.map +3 -3
- package/dist/commands/relationship.js +225 -37
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/report.js +54 -0
- package/dist/commands/report.js.map +7 -0
- package/dist/commands/reports.js +45 -0
- package/dist/commands/reports.js.map +7 -0
- package/dist/commands/schema.js +135 -0
- package/dist/commands/schema.js.map +7 -0
- package/dist/commands/search.js +40 -12
- package/dist/commands/search.js.map +2 -2
- package/dist/commands/show.js +58 -27
- package/dist/commands/show.js.map +2 -2
- package/dist/commands/stats.js +35 -0
- package/dist/commands/stats.js.map +7 -0
- package/dist/commands/trace.js +39 -16
- package/dist/commands/trace.js.map +2 -2
- package/dist/commands/update.js +141 -14
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +210 -46
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/validate.js +142 -23
- package/dist/commands/validate.js.map +3 -3
- package/dist/commands/version.js +8 -12
- package/dist/commands/version.js.map +2 -2
- package/dist/commands/visualize.js +155 -25
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/base-snapshot-manager.js +84 -0
- package/dist/core/base-snapshot-manager.js.map +7 -0
- package/dist/core/changeset-exporter.js +305 -0
- package/dist/core/changeset-exporter.js.map +7 -0
- package/dist/core/changeset-validator.js +41 -0
- package/dist/core/changeset-validator.js.map +7 -0
- package/dist/core/changeset.js +88 -173
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/dependency-tracker.js +4 -2
- package/dist/core/dependency-tracker.js.map +2 -2
- package/dist/core/element.js +98 -27
- package/dist/core/element.js.map +2 -2
- package/dist/core/golden-copy-cache.js +290 -0
- package/dist/core/golden-copy-cache.js.map +7 -0
- package/dist/core/graph-model.js +266 -0
- package/dist/core/graph-model.js.map +7 -0
- package/dist/core/layer.js +159 -16
- package/dist/core/layer.js.map +2 -2
- package/dist/core/layers.js +32 -0
- package/dist/core/layers.js.map +7 -0
- package/dist/core/manifest.js +32 -11
- package/dist/core/manifest.js.map +2 -2
- package/dist/core/migration-registry.js +56 -1
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model.js +424 -217
- package/dist/core/model.js.map +3 -3
- package/dist/core/mutation-handler.js +179 -0
- package/dist/core/mutation-handler.js.map +7 -0
- package/dist/core/reference-registry.js +29 -21
- package/dist/core/reference-registry.js.map +2 -2
- package/dist/core/relationship-catalog.js +189 -0
- package/dist/core/relationship-catalog.js.map +7 -0
- package/dist/core/relationship-registry.js.map +2 -2
- package/dist/core/relationships.js.map +1 -1
- package/dist/core/report-data-model.js +285 -0
- package/dist/core/report-data-model.js.map +7 -0
- package/dist/core/spec-data-service.js +185 -0
- package/dist/core/spec-data-service.js.map +7 -0
- package/dist/core/spec-loader-types.js +1 -0
- package/dist/core/spec-loader-types.js.map +7 -0
- package/dist/core/spec-loader.js +234 -0
- package/dist/core/spec-loader.js.map +7 -0
- package/dist/core/staged-changeset-storage.js +282 -0
- package/dist/core/staged-changeset-storage.js.map +7 -0
- package/dist/core/staging-area.js +1002 -0
- package/dist/core/staging-area.js.map +7 -0
- package/dist/core/stats-collector.js +169 -0
- package/dist/core/stats-collector.js.map +7 -0
- package/dist/core/virtual-projection.js +443 -0
- package/dist/core/virtual-projection.js.map +7 -0
- package/dist/export/archimate-exporter.js +99 -60
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/export/audit-formatters.js +479 -0
- package/dist/export/audit-formatters.js.map +7 -0
- package/dist/export/diff-formatters.js +99 -0
- package/dist/export/diff-formatters.js.map +7 -0
- package/dist/export/export-manager.js.map +2 -2
- package/dist/export/graphml-exporter.js +44 -27
- package/dist/export/graphml-exporter.js.map +2 -2
- package/dist/export/index.js +4 -0
- package/dist/export/index.js.map +2 -2
- package/dist/export/json-schema-exporter.js +55 -42
- package/dist/export/json-schema-exporter.js.map +2 -2
- package/dist/export/markdown-exporter.js +92 -70
- package/dist/export/markdown-exporter.js.map +2 -2
- package/dist/export/markdown-generator.js +248 -0
- package/dist/export/markdown-generator.js.map +7 -0
- package/dist/export/markdown-utils.js +30 -0
- package/dist/export/markdown-utils.js.map +7 -0
- package/dist/export/mermaid-markdown-exporter.js +37 -0
- package/dist/export/mermaid-markdown-exporter.js.map +7 -0
- package/dist/export/openapi-exporter.js +119 -71
- package/dist/export/openapi-exporter.js.map +2 -2
- package/dist/export/plantuml-exporter.js +104 -39
- package/dist/export/plantuml-exporter.js.map +2 -2
- package/dist/export/report-formatters.js +111 -0
- package/dist/export/report-formatters.js.map +7 -0
- package/dist/export/stats-formatters.js +98 -0
- package/dist/export/stats-formatters.js.map +7 -0
- package/dist/export/types.js +2 -14
- package/dist/export/types.js.map +2 -2
- package/dist/export/verify-formatters.js +153 -0
- package/dist/export/verify-formatters.js.map +7 -0
- package/dist/generated/compiled-validators.js +17 -0
- package/dist/generated/compiled-validators.js.map +7 -0
- package/dist/generated/index.js +31 -0
- package/dist/generated/index.js.map +7 -0
- package/dist/generated/layer-registry.js +190 -0
- package/dist/generated/layer-registry.js.map +7 -0
- package/dist/generated/layer-types.js +7 -0
- package/dist/generated/layer-types.js.map +7 -0
- package/dist/generated/node-types.js +1719 -0
- package/dist/generated/node-types.js.map +7 -0
- package/dist/generated/relationship-index.js +14552 -0
- package/dist/generated/relationship-index.js.map +7 -0
- package/dist/import/archimate-importer.js +166 -0
- package/dist/import/archimate-importer.js.map +7 -0
- package/dist/import/index.js +47 -0
- package/dist/import/index.js.map +7 -0
- package/dist/import/openapi-importer.js +143 -0
- package/dist/import/openapi-importer.js.map +7 -0
- package/dist/import/types.js +1 -0
- package/dist/import/types.js.map +7 -0
- package/dist/integrations/base-manager.js +311 -0
- package/dist/integrations/base-manager.js.map +7 -0
- package/dist/integrations/claude-manager.js +360 -0
- package/dist/integrations/claude-manager.js.map +7 -0
- package/dist/integrations/claude_code/agents/dr-advisor.md +253 -0
- package/dist/integrations/claude_code/agents/dr-architect.md +278 -0
- package/dist/integrations/claude_code/agents/dr-extractor.md +286 -0
- package/dist/integrations/claude_code/commands/dr-changeset.md +657 -0
- package/dist/integrations/claude_code/commands/dr-design.md +373 -0
- package/dist/integrations/claude_code/commands/dr-info.md +132 -0
- package/dist/integrations/claude_code/commands/dr-init.md +251 -0
- package/dist/integrations/claude_code/commands/dr-map.md +936 -0
- package/dist/integrations/claude_code/commands/dr-model.md +493 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +814 -0
- package/dist/integrations/claude_code/commands/dr-sync.md +279 -0
- package/dist/integrations/claude_code/commands/dr-validate.md +654 -0
- package/dist/integrations/claude_code/commands/dr-verify.md +559 -0
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +903 -0
- package/dist/integrations/claude_code/docs/QUICK_START.md +271 -0
- package/dist/integrations/claude_code/docs/README.md +347 -0
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +550 -0
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +620 -0
- package/dist/integrations/claude_code/skills/dr_03_security_layer/SKILL.md +642 -0
- package/dist/integrations/claude_code/skills/dr_04_application_layer/SKILL.md +911 -0
- package/dist/integrations/claude_code/skills/dr_05_technology_layer/SKILL.md +836 -0
- package/dist/integrations/claude_code/skills/dr_06_api_layer/SKILL.md +933 -0
- package/dist/integrations/claude_code/skills/dr_07_data_model_layer/SKILL.md +210 -0
- package/dist/integrations/claude_code/skills/dr_08_dataset_layer/SKILL.md +319 -0
- package/dist/integrations/claude_code/skills/dr_09_ux_layer/SKILL.md +319 -0
- package/dist/integrations/claude_code/skills/dr_10_navigation_layer/SKILL.md +318 -0
- package/dist/integrations/claude_code/skills/dr_11_apm_layer/SKILL.md +273 -0
- package/dist/integrations/claude_code/skills/dr_12_testing_layer/SKILL.md +273 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +187 -0
- package/dist/integrations/claude_code/skills/dr_codebase_memory/SKILL.md +590 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +295 -0
- package/dist/integrations/copilot-manager.js +328 -0
- package/dist/integrations/copilot-manager.js.map +7 -0
- package/dist/integrations/github_copilot/agents/dr-advisor.md +243 -0
- package/dist/integrations/github_copilot/agents/dr-architect.md +1567 -0
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +491 -0
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +539 -0
- package/dist/integrations/github_copilot/skills/dr_03_security_layer/SKILL.md +667 -0
- package/dist/integrations/github_copilot/skills/dr_04_application_layer/SKILL.md +670 -0
- package/dist/integrations/github_copilot/skills/dr_05_technology_layer/SKILL.md +660 -0
- package/dist/integrations/github_copilot/skills/dr_06_api_layer/SKILL.md +855 -0
- package/dist/integrations/github_copilot/skills/dr_07_data_model_layer/SKILL.md +171 -0
- package/dist/integrations/github_copilot/skills/dr_08_dataset_layer/SKILL.md +216 -0
- package/dist/integrations/github_copilot/skills/dr_09_ux_layer/SKILL.md +230 -0
- package/dist/integrations/github_copilot/skills/dr_10_navigation_layer/SKILL.md +228 -0
- package/dist/integrations/github_copilot/skills/dr_11_apm_layer/SKILL.md +234 -0
- package/dist/integrations/github_copilot/skills/dr_12_testing_layer/SKILL.md +230 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +187 -0
- package/dist/integrations/hash-utils.js +51 -0
- package/dist/integrations/hash-utils.js.map +7 -0
- package/dist/integrations/types.js +16 -0
- package/dist/integrations/types.js.map +7 -0
- package/dist/reports/model-layer-report-generator.js +278 -0
- package/dist/reports/model-layer-report-generator.js.map +7 -0
- package/dist/reports/model-report-data.js +57 -0
- package/dist/reports/model-report-data.js.map +7 -0
- package/dist/reports/model-report-orchestrator.js +103 -0
- package/dist/reports/model-report-orchestrator.js.map +7 -0
- package/dist/schemas/bundled/analyzers/cbm.json +595 -0
- package/dist/schemas/bundled/analyzers/manifest.json +9 -0
- package/dist/schemas/bundled/api.json +3411 -0
- package/dist/schemas/bundled/apm.json +2371 -0
- package/dist/schemas/bundled/application.json +1253 -0
- package/dist/schemas/bundled/base.json +1622 -0
- package/dist/schemas/bundled/business.json +1279 -0
- package/dist/schemas/bundled/data-model.json +1298 -0
- package/dist/schemas/bundled/data-store.json +2025 -0
- package/dist/schemas/bundled/manifest.json +93 -0
- package/dist/schemas/bundled/motivation.json +1360 -0
- package/dist/schemas/bundled/navigation.json +1874 -0
- package/dist/schemas/bundled/security.json +3488 -0
- package/dist/schemas/bundled/technology.json +2067 -0
- package/dist/schemas/bundled/testing.json +3120 -0
- package/dist/schemas/bundled/ux.json +3592 -0
- package/dist/server/schemas.js +202 -0
- package/dist/server/schemas.js.map +7 -0
- package/dist/server/server.js +1336 -252
- package/dist/server/server.js.map +3 -3
- package/dist/server/telemetry-middleware.js +22 -15
- package/dist/server/telemetry-middleware.js.map +2 -2
- package/dist/server-entry.js +65 -0
- package/dist/server-entry.js.map +7 -0
- package/dist/telemetry/config.js +89 -0
- package/dist/telemetry/config.js.map +7 -0
- package/dist/telemetry/console-interceptor.js.map +1 -1
- package/dist/telemetry/detect.js +24 -0
- package/dist/telemetry/detect.js.map +7 -0
- package/dist/telemetry/fetch-otlp-exporter.js +112 -0
- package/dist/telemetry/fetch-otlp-exporter.js.map +7 -0
- package/dist/telemetry/index.js +153 -3
- package/dist/telemetry/index.js.map +2 -2
- package/dist/telemetry/resilient-exporter.js +22 -8
- package/dist/telemetry/resilient-exporter.js.map +2 -2
- package/dist/telemetry/resilient-log-exporter.js +17 -8
- package/dist/telemetry/resilient-log-exporter.js.map +2 -2
- package/dist/telemetry/test-instrumentation.js.map +2 -2
- package/dist/types/index.js +84 -0
- package/dist/types/index.js.map +3 -3
- package/dist/types/source-reference.js +1 -0
- package/dist/types/source-reference.js.map +7 -0
- package/dist/utils/chat-logger.js +292 -0
- package/dist/utils/chat-logger.js.map +7 -0
- package/dist/utils/claude-stream.js +8 -0
- package/dist/utils/claude-stream.js.map +7 -0
- package/dist/utils/date-utils.js +7 -0
- package/dist/utils/date-utils.js.map +7 -0
- package/dist/utils/element-utils.js.map +1 -1
- package/dist/utils/errors.js +88 -15
- package/dist/utils/errors.js.map +3 -3
- package/dist/utils/export-python-annotations.js +82 -0
- package/dist/utils/export-python-annotations.js.map +7 -0
- package/dist/utils/file-io.js +7 -2
- package/dist/utils/file-io.js.map +2 -2
- package/dist/utils/file-lock.js +156 -0
- package/dist/utils/file-lock.js.map +7 -0
- package/dist/utils/id-generator.js +18 -0
- package/dist/utils/id-generator.js.map +7 -0
- package/dist/utils/layer-name-formatter.js +16 -0
- package/dist/utils/layer-name-formatter.js.map +7 -0
- package/dist/utils/markdown-anchor.js +7 -0
- package/dist/utils/markdown-anchor.js.map +7 -0
- package/dist/utils/markdown-link.js +12 -0
- package/dist/utils/markdown-link.js.map +7 -0
- package/dist/utils/markdown-table.js +17 -0
- package/dist/utils/markdown-table.js.map +7 -0
- package/dist/utils/mermaid-utils.js +11 -0
- package/dist/utils/mermaid-utils.js.map +7 -0
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +52 -0
- package/dist/utils/source-reference.js.map +7 -0
- package/dist/utils/spec-installer.js +40 -53
- package/dist/utils/spec-installer.js.map +2 -2
- package/dist/utils/spec-version.js +5 -1
- package/dist/utils/spec-version.js.map +2 -2
- package/dist/utils/string-utils.js +12 -0
- package/dist/utils/string-utils.js.map +7 -0
- package/dist/utils/table-formatting.js +19 -0
- package/dist/utils/table-formatting.js.map +7 -0
- package/dist/validators/index.js +4 -0
- package/dist/validators/index.js.map +2 -2
- package/dist/validators/naming-validator.js +20 -23
- package/dist/validators/naming-validator.js.map +2 -2
- package/dist/validators/reference-validator.js +23 -38
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +243 -0
- package/dist/validators/relationship-schema-validator.js.map +7 -0
- package/dist/validators/schema-validator.js +168 -68
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/semantic-validator.js +36 -60
- package/dist/validators/semantic-validator.js.map +2 -2
- package/dist/validators/types.js.map +2 -2
- package/dist/validators/validation-formatter.js +159 -0
- package/dist/validators/validation-formatter.js.map +7 -0
- package/dist/validators/validator.js +24 -38
- package/dist/validators/validator.js.map +2 -2
- package/dist/viewer/README.md +139 -0
- package/dist/viewer/assets/main-CY0Xufuj.css +1 -0
- package/dist/viewer/assets/main-DtgErnwF.js +81 -0
- package/dist/viewer/assets/vendor-CxKvDp2x.js +17 -0
- package/dist/viewer/favicon.svg +11 -0
- package/dist/viewer/fonts/inter/Inter-Black.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Bold.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-ExtraBold.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Light.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Medium.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Regular.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-SemiBold.woff2 +0 -0
- package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2 +0 -0
- package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
- package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2 +0 -0
- package/dist/viewer/index.html +15 -0
- package/dist/viewer/manifest.json +99 -0
- package/dist/viewer/version.json +1 -0
- package/package.json +37 -13
- package/PYTHON_CLI_PARITY.md +0 -265
- package/PYTHON_CLI_STRUCTURE_UPDATE.md +0 -246
- package/biome.json +0 -42
- package/bunfig.toml +0 -3
- package/dist/ai/claude-client.js +0 -71
- package/dist/ai/claude-client.js.map +0 -7
- package/dist/ai/context-provider.js +0 -129
- package/dist/ai/context-provider.js.map +0 -7
- package/dist/ai/tools.js +0 -231
- package/dist/ai/tools.js.map +0 -7
- package/dist/commands/migrate.js +0 -36
- package/dist/commands/migrate.js.map +0 -7
- package/dist/commands/project.js +0 -74
- package/dist/commands/project.js.map +0 -7
- package/dist/core/active-changeset.js +0 -52
- package/dist/core/active-changeset.js.map +0 -7
- package/dist/core/projection-engine.js +0 -288
- package/dist/core/projection-engine.js.map +0 -7
- package/dist/schemas/bundled/01-motivation-layer.schema.json +0 -942
- package/dist/schemas/bundled/02-business-layer.schema.json +0 -1293
- package/dist/schemas/bundled/03-security-layer.schema.json +0 -2177
- package/dist/schemas/bundled/04-application-layer.schema.json +0 -1328
- package/dist/schemas/bundled/05-technology-layer.schema.json +0 -1465
- package/dist/schemas/bundled/06-api-layer.schema.json +0 -1743
- package/dist/schemas/bundled/07-data-model-layer.schema.json +0 -1253
- package/dist/schemas/bundled/08-datastore-layer.schema.json +0 -892
- package/dist/schemas/bundled/09-ux-layer.schema.json +0 -1506
- package/dist/schemas/bundled/10-navigation-layer.schema.json +0 -843
- package/dist/schemas/bundled/11-apm-observability-layer.schema.json +0 -1430
- package/dist/schemas/bundled/12-testing-layer.schema.json +0 -1091
- package/dist/schemas/bundled/common/layer-extensions.schema.json +0 -266
- package/dist/schemas/bundled/common/predicates.schema.json +0 -493
- package/dist/schemas/bundled/common/relationships.schema.json +0 -791
- package/dist/schemas/bundled/common/source-references.schema.json +0 -71
- package/dist/schemas/bundled/link-registry.json +0 -1839
- package/dist/schemas/bundled/link-registry.schema.json +0 -339
- package/dist/schemas/bundled/relationship-catalog.json +0 -1302
- package/dist/schemas/bundled/relationship-type.schema.json +0 -221
- package/dist/utils/model-path.js +0 -22
- package/dist/utils/model-path.js.map +0 -7
- package/docs/TEST-INSTRUMENTATION.md +0 -405
- package/docs/telemetry.md +0 -427
- package/test-debug.js +0 -33
- package/test-special.mjs +0 -46
- package/test_runner.ts +0 -7
|
@@ -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 { ChangesetManager } from '../core/changeset.js';\nimport { ActiveChangesetContext } from '../core/active-changeset.js';\nimport { Command } from 'commander';\nimport * as prompts from '@clack/prompts';\n\n/**\n * Create a new changeset\n */\nexport async function changesetCreateCommand(name: string, options: {\n description?: string;\n}): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const manager = new ChangesetManager(model.rootPath);\n\n // Check if changeset already exists\n const existing = await manager.load(name);\n if (existing) {\n console.error(ansis.red(`Error: Changeset '${name}' already exists`));\n process.exit(1);\n }\n\n // Get description if not provided\n let description = options.description;\n if (!description) {\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 const changeset = await manager.create(name, description || undefined);\n\n console.log(\n ansis.green(`\u2713 Created changeset: ${ansis.bold(name)}`)\n );\n if (changeset.description) {\n console.log(ansis.dim(` ${changeset.description}`));\n }\n console.log(\n ansis.dim(` Path: .dr/changesets/${name.toLowerCase().replace(/\\s+/g, '-')}.json`)\n );\n console.log();\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * List all changesets\n */\nexport async function changesetListCommand(): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const manager = new ChangesetManager(model.rootPath);\n const changesets = await manager.list();\n\n if (changesets.length === 0) {\n console.log(ansis.yellow('No changesets found'));\n console.log();\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 === 'applied'\n ? ansis.green\n : changeset.status === 'reverted'\n ? ansis.gray\n : ansis.yellow;\n\n console.log(\n `${statusColor(changeset.status.toUpperCase())} ${ansis.bold(\n changeset.name\n )}`\n );\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 } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Apply a changeset to the model\n */\nexport async function changesetApplyCommand(name: string): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: false });\n const manager = new ChangesetManager(model.rootPath);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n process.exit(1);\n }\n\n console.log(\n ansis.bold(`\\nApplying changeset: ${ansis.cyan(name)}\\n`)\n );\n console.log(\n ansis.dim(`Changes: ${changeset.getChangeCount()}`)\n );\n\n const result = await manager.apply(model, name);\n\n console.log();\n\n // Always show applied message, even if 0 changes\n console.log(\n ansis.green(`\u2713 Applied ${result.applied} change(s) from changeset`)\n );\n\n if (result.failed > 0) {\n console.log(ansis.red(`\u2717 Failed to apply ${result.failed} change(s):`));\n for (const error of result.errors) {\n console.log(\n ansis.dim(\n ` - ${error.change.elementId} (${error.change.type}): ${\n error.error\n }`\n )\n );\n }\n }\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 applied_at: new Date().toISOString(),\n action: 'applied'\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 console.log(ansis.dim(`Changeset marked as applied`));\n }\n\n console.log();\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Revert a changeset from the model\n */\nexport async function changesetRevertCommand(name: string): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: false });\n const manager = new ChangesetManager(model.rootPath);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${name}' not found`));\n process.exit(1);\n }\n\n console.log(\n ansis.bold(`\\nReverting changeset: ${ansis.cyan(name)}\\n`)\n );\n console.log(\n ansis.dim(`Changes to revert: ${changeset.getChangeCount()}`)\n );\n\n const result = await manager.revert(model, name);\n\n console.log();\n\n // Always show reverted message, even if 0 changes\n console.log(\n ansis.green(`\u2713 Reverted ${result.reverted} change(s)`)\n );\n\n if (result.failed > 0) {\n console.log(ansis.red(`\u2717 Failed to revert ${result.failed} change(s):`));\n for (const error of result.errors) {\n console.log(\n ansis.dim(\n ` - ${error.change.elementId} (${error.change.type}): ${\n error.error\n }`\n )\n );\n }\n }\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 applied_at: new Date().toISOString(),\n action: 'reverted'\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 console.log(ansis.dim(`Changeset marked as reverted`));\n }\n\n console.log();\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Activate a changeset for automatic tracking\n */\nexport async function changesetActivateCommand(name: string): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const context = new ActiveChangesetContext(model.rootPath);\n await context.setActive(name);\n\n console.log(ansis.green(`\u2713 Activated changeset: ${ansis.bold(name)}`));\n console.log(ansis.dim(' All model changes will now be tracked in this changeset'));\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Deactivate the current changeset\n */\nexport async function changesetDeactivateCommand(): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const context = new ActiveChangesetContext(model.rootPath);\n const active = await context.getActive();\n\n if (!active) {\n console.log(ansis.yellow('No active changeset'));\n return;\n }\n\n await context.clearActive();\n console.log(ansis.green(`\u2713 Deactivated changeset: ${ansis.bold(active)}`));\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Show the currently active changeset\n */\nexport async function changesetStatusCommand(): Promise<void> {\n try {\n const model = await Model.load(process.cwd(), { lazyLoad: true });\n const context = new ActiveChangesetContext(model.rootPath);\n const active = await context.getActive();\n\n if (!active) {\n console.log(ansis.dim('No active changeset'));\n return;\n }\n\n console.log(ansis.bold(`Active changeset: ${ansis.cyan(active)}`));\n\n // Load and show changeset details\n const manager = new ChangesetManager(model.rootPath);\n const changeset = await manager.load(active);\n\n if (changeset) {\n console.log(ansis.dim(` Changes tracked: ${changeset.getChangeCount()}`));\n const changesByType = {\n add: changeset.getChangesByType('add').length,\n update: changeset.getChangesByType('update').length,\n delete: changeset.getChangesByType('delete').length,\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 if (parts.length > 0) {\n console.log(ansis.dim(` ${parts.join(' ')}`));\n }\n }\n } catch (error) {\n console.error(\n ansis.red(\n `Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * Register changeset subcommands\n */\nexport function changesetCommands(program: Command): void {\n const changesetGroup = program\n .command('changeset')\n .description('Manage changesets');\n\n changesetGroup\n .command('create <name>')\n .description('Create a new changeset')\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 .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset list`\n )\n .action(async () => {\n await changesetListCommand();\n });\n\n changesetGroup\n .command('apply <name>')\n .description('Apply a changeset to the model')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset apply \"v1.1 migration\"`\n )\n .action(async (name) => {\n await changesetApplyCommand(name);\n });\n\n changesetGroup\n .command('revert <name>')\n .description('Revert a changeset from the model')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset revert \"v1.1 migration\"`\n )\n .action(async (name) => {\n await changesetRevertCommand(name);\n });\n\n changesetGroup\n .command('activate <name>')\n .description('Activate a changeset for automatic change tracking')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset activate \"v1.1 migration\"`\n )\n .action(async (name) => {\n await changesetActivateCommand(name);\n });\n\n changesetGroup\n .command('deactivate')\n .description('Deactivate the currently active changeset')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset deactivate`\n )\n .action(async () => {\n await changesetDeactivateCommand();\n });\n\n changesetGroup\n .command('status')\n .description('Show the currently active changeset')\n .addHelpText(\n 'after',\n `\nExamples:\n $ dr changeset status`\n )\n .action(async () => {\n await changesetStatusCommand();\n });\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 } from \"commander\";\nimport * as prompts from \"@clack/prompts\";\nimport path from \"path\";\nimport { isTelemetryEnabled, startSpan, endSpan, startActiveSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.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 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(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 console.error(ansis.red(`Error: Changeset '${name}' already exists`));\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) {\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 console.log(ansis.green(`\u2713 Created and activated changeset: ${ansis.bold(name)}`));\n if (changeset.description) {\n console.log(ansis.dim(` ${changeset.description}`));\n }\n console.log(ansis.dim(` Path: documentation-robotics/changesets/${changeset.id}/`));\n console.log();\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 * List all changesets\n */\nexport async function changesetListCommand(): Promise<void> {\n const span = isTelemetryEnabled ? startSpan(\"changeset.list\") : null;\n\n try {\n const model = await Model.load(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 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 a changeset to the model\n */\nexport async function changesetApplyCommand(\n name: string,\n options?: { 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(process.cwd(), { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${name}' 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 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 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 const changesetId = changeset.id || name;\n if (!changesetId) {\n console.error(\n ansis.red(\"Error: Changeset ID could not be determined\") +\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 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 console.log();\n\n // Always show applied message, even if 0 changes\n console.log(ansis.green(`\u2713 Applied ${result.committed} change(s) from changeset`));\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 if (result.failed > 0) {\n console.log(ansis.red(`\u2717 Failed to apply ${result.failed} change(s):`));\n for (const error of result.validation.errors) {\n console.log(ansis.dim(` - ${error}`));\n }\n }\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 console.log(ansis.dim(`Changeset marked as committed`));\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n\n console.log();\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 * Revert a changeset from the model\n */\nexport async function changesetRevertCommand(name: 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(process.cwd(), { lazyLoad: false });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${name}' 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 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 console.log(ansis.bold(`\\nReverting changeset: ${ansis.cyan(name)}\\n`));\n console.log(ansis.dim(`Changes to discard: ${changeset.changes.length}`));\n\n const changesetId = changeset.id || name;\n if (!changesetId) {\n console.error(ansis.red(\"Error: Changeset ID could not be determined\"));\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 console.log();\n\n // Show reverted message\n console.log(ansis.green(`\u2713 Reverted changeset: ${name}`));\n console.log(ansis.dim(`Changeset marked as discarded`));\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n\n console.log();\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 * Activate a changeset for automatic tracking\n */\nexport async function changesetActivateCommand(name: 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(process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n await manager.setActive(name);\n\n console.log(ansis.green(`\u2713 Activated changeset: ${ansis.bold(name)}`));\n console.log(ansis.dim(\" All model changes will now be tracked in this changeset\"));\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 * Deactivate the current changeset\n */\nexport async function changesetDeactivateCommand(): Promise<void> {\n const span = isTelemetryEnabled ? startSpan(\"changeset.deactivate\") : null;\n\n try {\n const model = await Model.load(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.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 await manager.clearActive();\n console.log(ansis.green(`\u2713 Deactivated changeset: ${ansis.bold(active)}`));\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 * Delete a changeset permanently\n */\nexport async function changesetDeleteCommand(\n name: string,\n options: {\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(process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n\n const changeset = await manager.load(name);\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${name}' 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 // 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 console.error(ansis.red(`Error: Cannot delete active changeset '${name}'`));\n console.log(ansis.dim(\" Run `dr changeset deactivate` first\"));\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 console.log(ansis.yellow(\"Deletion cancelled\"));\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 console.error(ansis.red(\"Error: Cannot confirm deletion in non-interactive environment\"));\n console.log(ansis.dim(\" Use --force flag to confirm deletion\"));\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 console.log(ansis.green(`\u2713 Deleted changeset: ${ansis.bold(name)}`));\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 the currently active changeset\n */\nexport async function changesetStatusCommand(): Promise<void> {\n const span = isTelemetryEnabled ? startSpan(\"changeset.status\") : null;\n\n try {\n const model = await Model.load(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 console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\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: { 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(process.cwd(), { lazyLoad: true });\n const manager = new StagingAreaManager(model.rootPath, model);\n const activeChangeset = await manager.getActiveId();\n\n if (!activeChangeset) {\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(activeChangeset);\n\n if (!changeset) {\n console.error(ansis.red(`Error: Changeset '${activeChangeset}' 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 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 console.log(ansis.yellow(\"No staged changes\"));\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n endSpan(span);\n return;\n }\n\n console.log(ansis.bold(`\\nStaged Changes (${changes.length}):\\n`));\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\n console.table(tableData);\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 * Remove specific element from staging area\n */\nexport async function changesetExplicitStageCommand(elementId: 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(process.cwd(), { lazyLoad: true });\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 layerName = await findElementLayer(model, elementId);\n if (!layerName) {\n console.error(ansis.red(`Error: Element '${elementId}' not found`));\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 console.error(ansis.red(`Error: Element '${elementId}' not found in layer '${layerName}'`));\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 console.log(ansis.green(`\u2713 Staged element: ${ansis.bold(elementId)}`));\n console.log(ansis.dim(` Layer: ${layerName} | Changeset: ${activeChangesetId}`));\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 console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\n endSpan(span);\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n\nexport async function changesetUnstageCommand(elementId: 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(process.cwd(), { lazyLoad: true });\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 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 console.error(ansis.yellow(`Warning: 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 console.log(ansis.green(`\u2713 Unstaged element: ${ansis.bold(elementId)}`));\n console.log(ansis.dim(` Remaining staged changes: ${updated?.getChangeCount() || 0}`));\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 * Discard all or single staged changes\n */\nexport async function changesetDiscardCommand(elementId?: 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(process.cwd(), { lazyLoad: true });\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 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 console.error(ansis.yellow(`Warning: 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 console.log(ansis.green(`\u2713 Discarded changes for element: ${ansis.bold(elementId)}`));\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 console.log(ansis.dim(\"Cancelled\"));\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 console.log(ansis.green(`\u2713 Discarded all staged changes`));\n console.log(ansis.dim(` Changeset status: discarded`));\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setStatus({ code: 0 });\n }\n\n console.log();\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 * Preview the merged model state with staged changes applied\n */\nexport async function changesetPreviewCommand(options: { 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(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: { 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(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 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(process.cwd(), { lazyLoad: false });\n const stagingManager = new StagingAreaManager(model.rootPath, model);\n const activeChangesetId = await stagingManager.getActiveId();\n\n if (!activeChangesetId) {\n console.error(ansis.red(\"Error: No active changeset\"));\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 console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`));\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 console.log(ansis.yellow(\"No staged changes to commit\"));\n if (isTelemetryEnabled) {\n (span as any).setStatus({ code: 0 });\n }\n return;\n }\n\n console.log(ansis.bold(`\\nCommitting changeset: ${ansis.cyan(changeset.name)}`));\n console.log(ansis.dim(`Staged changes: ${changeCount}`));\n console.log();\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 // Show results\n console.log(ansis.green(`\u2713 Committed ${result.committed} change(s)`));\n\n if ((result.skipped ?? 0) > 0) {\n const skipped = result.skipped!;\n const details = result.skippedDetails ?? [];\n console.log(ansis.yellow(`\u26A0 Skipped ${skipped} duplicate element(s):`));\n const shown = details.slice(0, 10);\n for (const detail of shown) {\n console.log(ansis.dim(` ${detail}`));\n }\n if (details.length > 10) {\n console.log(ansis.dim(` ... and ${details.length - 10} more`));\n }\n }\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 // 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 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 if (result.driftWarning) {\n console.log(\n ansis.yellow(`\u26A0 Warning: Model had drifted since changeset creation (--force was used)`)\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 console.log();\n } catch (error) {\n // Commit failed - error was thrown from StagingAreaManager\n // Model has been automatically rolled back\n console.log(\n ansis.red(\n `\u2717 Commit failed and rolled back: ${getErrorMessage(error)}`\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 console.error(ansis.red(`Error: ${getErrorMessage(error)}`));\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 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(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 console.log(ansis.green(`\u2713 Exported changeset to ${ansis.cyan(outputPath)}`));\n console.log(ansis.dim(` Format: ${format}`));\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 * Import changeset from portable file\n */\nexport async function changesetImportCommand(\n file: string,\n options: { 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(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 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 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 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 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 console.log(ansis.green(`\u2713 Imported changeset: ${ansis.cyan(imported.name)}`));\n console.log(ansis.dim(` ID: ${newId}`));\n console.log(\n ansis.dim(\n ` Changes: +${imported.stats?.additions || 0} ~${imported.stats?.modifications || 0} -${imported.stats?.deletions || 0}`\n )\n );\n\n if (!compatibility.baseSnapshotMatch) {\n console.log(ansis.yellow(` \u26A0 Base model drift detected - review before committing`));\n }\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"changeset.id\", newId);\n (span as any).setStatus({ code: 0 });\n }\n\n console.log();\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(\"--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 .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset list`\n )\n .action(async () => {\n await changesetListCommand();\n });\n\n changesetGroup\n .command(\"apply <name>\")\n .description(\"Apply a changeset to the model\")\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 .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset revert \"v1.1 migration\"`\n )\n .action(async (name) => {\n await changesetRevertCommand(name);\n });\n\n changesetGroup\n .command(\"activate <name>\")\n .description(\"Activate a changeset for automatic change tracking\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset activate \"v1.1 migration\"`\n )\n .action(async (name) => {\n await changesetActivateCommand(name);\n });\n\n changesetGroup\n .command(\"deactivate\")\n .description(\"Deactivate the currently active changeset\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset deactivate`\n )\n .action(async () => {\n await changesetDeactivateCommand();\n });\n\n changesetGroup\n .command(\"status\")\n .description(\"Show the currently active changeset\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset status`\n )\n .action(async () => {\n await changesetStatusCommand();\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(\"-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(\"-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 .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) => {\n await changesetExplicitStageCommand(elementId);\n });\n\n changesetGroup\n .command(\"unstage <element-id>\")\n .description(\"Remove specific element from staging area\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset unstage api-endpoint-create-customer`\n )\n .action(async (elementId) => {\n await changesetUnstageCommand(elementId);\n });\n\n changesetGroup\n .command(\"discard [element-id]\")\n .description(\"Discard all or single staged changes\")\n .addHelpText(\n \"after\",\n `\nExamples:\n $ dr changeset discard\n $ dr changeset discard api-endpoint-create-customer`\n )\n .action(async (elementId) => {\n await changesetDiscardCommand(elementId);\n });\n\n changesetGroup\n .command(\"preview\")\n .description(\"Preview the merged model state with staged changes applied\")\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(\"-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(\"--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(\"-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(\"-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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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/chat.js
CHANGED
|
@@ -1,82 +1,72 @@
|
|
|
1
1
|
import ansis from "ansis";
|
|
2
|
-
import { text, intro, outro } from "@clack/prompts";
|
|
2
|
+
import { text, intro, outro, select } from "@clack/prompts";
|
|
3
3
|
import { Model } from "../core/model.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
import { detectAvailableClients } from "../coding-agents/chat-utils.js";
|
|
5
|
+
import { initializeChatLogger, getChatLogger } from "../utils/chat-logger.js";
|
|
6
|
+
import { CLIError, getErrorMessage } from "../utils/errors.js";
|
|
7
|
+
import { isTelemetryEnabled, startSpan, endSpan, emitLog, SeverityNumber } from "../telemetry/index.js";
|
|
8
|
+
function mapCliNameToClientName(cliName) {
|
|
9
|
+
return {
|
|
10
|
+
"github-copilot": "GitHub Copilot",
|
|
11
|
+
copilot: "GitHub Copilot",
|
|
12
|
+
"claude-code": "Claude Code",
|
|
13
|
+
claude: "Claude Code"
|
|
14
|
+
}[cliName.toLowerCase()] || cliName;
|
|
14
15
|
}
|
|
15
|
-
async function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"dr-architect",
|
|
22
|
-
"--print",
|
|
23
|
-
"--dangerously-skip-permissions",
|
|
24
|
-
"--verbose",
|
|
25
|
-
"--output-format",
|
|
26
|
-
"stream-json"
|
|
27
|
-
],
|
|
28
|
-
cwd: modelPath,
|
|
29
|
-
stdin: "pipe",
|
|
30
|
-
stdout: "pipe",
|
|
31
|
-
stderr: "pipe"
|
|
32
|
-
});
|
|
33
|
-
proc.stdin?.write(new TextEncoder().encode(message)), proc.stdin?.end();
|
|
34
|
-
let buffer = "";
|
|
35
|
-
const stdoutReader = proc.stdout.getReader(), decoder = new TextDecoder(), readLoop = async () => {
|
|
36
|
-
try {
|
|
37
|
-
for (; ; ) {
|
|
38
|
-
const { done, value } = await stdoutReader.read();
|
|
39
|
-
if (done)
|
|
40
|
-
break;
|
|
41
|
-
const chunk = decoder.decode(value, { stream: !0 });
|
|
42
|
-
buffer += chunk;
|
|
43
|
-
const lines = buffer.split(`
|
|
44
|
-
`);
|
|
45
|
-
buffer = lines.pop() || "";
|
|
46
|
-
for (const line of lines)
|
|
47
|
-
if (line.trim())
|
|
48
|
-
try {
|
|
49
|
-
const event = JSON.parse(line);
|
|
50
|
-
if (event.type === "assistant") {
|
|
51
|
-
const content = event.message?.content || [];
|
|
52
|
-
for (const block of content)
|
|
53
|
-
block.type === "text" ? process.stdout.write(block.text) : block.type === "tool_use" && process.stdout.write(ansis.dim(`
|
|
54
|
-
[Using tool: ${block.name}]
|
|
55
|
-
`));
|
|
56
|
-
}
|
|
57
|
-
} catch {
|
|
58
|
-
process.stdout.write(line + `
|
|
59
|
-
`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
buffer.trim() && process.stdout.write(buffer);
|
|
63
|
-
} catch (error) {
|
|
64
|
-
reject(error);
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
proc.exited.then((exitCode) => {
|
|
68
|
-
readLoop().then(() => {
|
|
69
|
-
exitCode === 0 ? resolve() : reject(new Error(`Claude process exited with code ${exitCode}`));
|
|
70
|
-
}).catch(reject);
|
|
71
|
-
}).catch(reject);
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
async function chatCommand() {
|
|
16
|
+
async function chatCommand(explicitClient, withDanger) {
|
|
17
|
+
const span = isTelemetryEnabled ? startSpan("chat.session", {
|
|
18
|
+
"chat.hasExplicitClient": !!explicitClient,
|
|
19
|
+
"chat.explicitClient": explicitClient,
|
|
20
|
+
"chat.dangerMode": withDanger === !0
|
|
21
|
+
}) : null;
|
|
75
22
|
try {
|
|
76
|
-
await checkClaudeAvailable() || (console.error(ansis.red("Error: Claude Code CLI not found.")), console.error(ansis.dim("Install Claude Code to enable chat functionality.")), console.error(ansis.dim("Visit: https://claude.ai")), process.exit(1));
|
|
77
23
|
const model = await Model.load(process.cwd());
|
|
78
|
-
|
|
79
|
-
|
|
24
|
+
if (!model)
|
|
25
|
+
throw new CLIError("Could not load architecture model", 1);
|
|
26
|
+
const logger = initializeChatLogger(model.rootPath);
|
|
27
|
+
await logger.ensureLogDirectory(), await logger.logEvent("chat_session_started", {
|
|
28
|
+
workingDirectory: model.rootPath,
|
|
29
|
+
withDanger
|
|
30
|
+
});
|
|
31
|
+
const availableClients = await detectAvailableClients();
|
|
32
|
+
if (isTelemetryEnabled && span && (span.setAttribute("chat.availableClients", availableClients.length), span.setAttribute("chat.clientNames", availableClients.map((c) => c.getClientName()).join(","))), availableClients.length === 0) {
|
|
33
|
+
const errorMsg = "No AI chat CLI available.";
|
|
34
|
+
isTelemetryEnabled && span && emitLog(SeverityNumber.ERROR, "No AI chat clients available"), await logger.logError(errorMsg), console.error(ansis.red(`Error: ${errorMsg}`)), console.error(ansis.dim("Install one of the following:")), console.error(ansis.dim(" - Claude Code: https://claude.ai")), console.error(ansis.dim(" - GitHub Copilot: gh extension install github/gh-copilot")), process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
let selectedClient;
|
|
37
|
+
if (explicitClient) {
|
|
38
|
+
const requestedClientName = mapCliNameToClientName(explicitClient), requestedClient = availableClients.find((c) => c.getClientName() === requestedClientName);
|
|
39
|
+
if (!requestedClient) {
|
|
40
|
+
const errorMsg = `Requested client "${requestedClientName}" is not available.`;
|
|
41
|
+
await logger.logError(errorMsg), console.error(ansis.red(`Error: ${errorMsg}`)), console.error(ansis.dim("Available clients:")), availableClients.forEach((c) => {
|
|
42
|
+
console.error(ansis.dim(` - ${c.getClientName()}`));
|
|
43
|
+
}), process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
selectedClient = requestedClient;
|
|
46
|
+
} else if (availableClients.length === 1)
|
|
47
|
+
selectedClient = availableClients[0];
|
|
48
|
+
else {
|
|
49
|
+
const choice = await select({
|
|
50
|
+
message: "Select AI chat client:",
|
|
51
|
+
options: availableClients.map((c) => ({
|
|
52
|
+
value: c.getClientName(),
|
|
53
|
+
label: c.getClientName()
|
|
54
|
+
}))
|
|
55
|
+
});
|
|
56
|
+
if (typeof choice != "string") {
|
|
57
|
+
console.log(""), await logger.logEvent("chat_session_cancelled"), outro(ansis.yellow("Chat cancelled"));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
selectedClient = availableClients.find((c) => c.getClientName() === choice);
|
|
61
|
+
}
|
|
62
|
+
await logger.logEvent("client_selected", {
|
|
63
|
+
client: selectedClient.getClientName(),
|
|
64
|
+
sessionId: logger.getSessionId()
|
|
65
|
+
}), isTelemetryEnabled && span && (span.setAttribute("chat.selectedClient", selectedClient.getClientName()), span.setAttribute("chat.sessionId", logger.getSessionId())), intro(ansis.bold(ansis.cyan("Documentation Robotics Chat"))), console.log(ansis.dim(`Powered by ${selectedClient.getClientName()}`)), console.log(ansis.dim(`Session ID: ${logger.getSessionId()}`)), console.log(ansis.dim(`Logs: ${logger.getSessionLogPath()}`)), console.log(withDanger ? ansis.yellow(`\u26A0\uFE0F Danger mode enabled - permissions will be skipped
|
|
66
|
+
`) : "");
|
|
67
|
+
const agentName = "dr-architect";
|
|
68
|
+
let messageCount = 0;
|
|
69
|
+
for (; ; ) {
|
|
80
70
|
let userInput;
|
|
81
71
|
try {
|
|
82
72
|
userInput = await text({
|
|
@@ -84,25 +74,58 @@ async function chatCommand() {
|
|
|
84
74
|
placeholder: 'Ask about the architecture (or "exit" to quit)'
|
|
85
75
|
});
|
|
86
76
|
} catch {
|
|
87
|
-
console.log(""), outro(ansis.green("Goodbye!"));
|
|
77
|
+
console.log(""), isTelemetryEnabled && span && (span.setAttribute("chat.messageCount", messageCount), span.setAttribute("chat.exitReason", "interrupted")), await logger.logEvent("chat_session_interrupted"), outro(ansis.green("Goodbye!"));
|
|
88
78
|
break;
|
|
89
79
|
}
|
|
90
|
-
if (userInput.toLowerCase() === "exit" || userInput.toLowerCase() === "quit" || userInput.toLowerCase() === "q") {
|
|
91
|
-
console.log(""),
|
|
80
|
+
if (userInput.toLowerCase() === "exit" || userInput.toLowerCase() === "quit" || userInput.toLowerCase() === "q" || userInput.toLowerCase() === "/exit" || userInput.toLowerCase() === "/quit" || userInput.toLowerCase() === "/q") {
|
|
81
|
+
console.log(""), isTelemetryEnabled && span && (span.setAttribute("chat.messageCount", messageCount), span.setAttribute("chat.exitReason", "user_exit")), await logger.logEvent("chat_session_ended", {
|
|
82
|
+
messageCount
|
|
83
|
+
}), outro(ansis.green("Goodbye!"));
|
|
92
84
|
break;
|
|
93
85
|
}
|
|
94
|
-
if (userInput.trim())
|
|
86
|
+
if (userInput.trim()) {
|
|
87
|
+
messageCount++;
|
|
95
88
|
try {
|
|
96
|
-
process.stdout.write(ansis.cyan(
|
|
89
|
+
if (process.stdout.write(ansis.cyan(`${selectedClient.getClientName()}: `)), await selectedClient.sendMessage(userInput, {
|
|
90
|
+
workingDirectory: model.rootPath,
|
|
91
|
+
agent: agentName,
|
|
92
|
+
withDanger,
|
|
93
|
+
sessionId: logger.getSessionId()
|
|
94
|
+
}), console.log(`
|
|
95
|
+
`), isTelemetryEnabled)
|
|
96
|
+
try {
|
|
97
|
+
const { flushTelemetry } = await import("../telemetry/index.js");
|
|
98
|
+
await flushTelemetry();
|
|
99
|
+
} catch (flushError) {
|
|
100
|
+
process.env.DR_TELEMETRY_DEBUG && process.stderr.write(`[TELEMETRY] Flush failed: ${flushError instanceof Error ? flushError.message : String(flushError)}
|
|
97
101
|
`);
|
|
102
|
+
}
|
|
98
103
|
} catch (error) {
|
|
99
|
-
const message =
|
|
100
|
-
|
|
104
|
+
const message = getErrorMessage(error);
|
|
105
|
+
isTelemetryEnabled && span && emitLog(SeverityNumber.ERROR, "Message send failed", {
|
|
106
|
+
"error.message": message,
|
|
107
|
+
"chat.messageCount": messageCount
|
|
108
|
+
}), console.error(ansis.red(`Error: ${message}`)), await logger.logError(message, {
|
|
109
|
+
messageCount
|
|
110
|
+
});
|
|
101
111
|
}
|
|
112
|
+
}
|
|
102
113
|
}
|
|
114
|
+
isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
103
115
|
} catch (error) {
|
|
104
|
-
|
|
105
|
-
|
|
116
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
117
|
+
code: 2,
|
|
118
|
+
message: getErrorMessage(error)
|
|
119
|
+
}));
|
|
120
|
+
const message = getErrorMessage(error);
|
|
121
|
+
console.error(ansis.red(`Error: ${message}`));
|
|
122
|
+
const logger = getChatLogger();
|
|
123
|
+
logger && await logger.logError(message, {
|
|
124
|
+
fatal: !0,
|
|
125
|
+
stack: error instanceof Error ? error.stack : void 0
|
|
126
|
+
}), process.exit(1);
|
|
127
|
+
} finally {
|
|
128
|
+
endSpan(span);
|
|
106
129
|
}
|
|
107
130
|
}
|
|
108
131
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/chat.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Chat Command - Interactive chat with
|
|
5
|
-
"mappings": "AAKA,OAAO,WAAW;AAClB,SAAS,MAAM,OAAO,
|
|
4
|
+
"sourcesContent": ["/**\n * Chat Command - Interactive chat with AI about the architecture model\n * Supports Claude Code CLI and GitHub Copilot CLI with auto-detection\n */\n\nimport ansis from \"ansis\";\nimport { text, intro, outro, select } from \"@clack/prompts\";\nimport { Model } from \"../core/model.js\";\nimport { BaseChatClient } from \"../coding-agents/base-chat-client.js\";\nimport { detectAvailableClients } from \"../coding-agents/chat-utils.js\";\nimport { initializeChatLogger, getChatLogger } from \"../utils/chat-logger.js\";\nimport { CLIError, getErrorMessage } from \"../utils/errors.js\";\nimport {\n isTelemetryEnabled,\n startSpan,\n endSpan,\n emitLog,\n SeverityNumber,\n} from \"../telemetry/index.js\";\n\n\n/**\n * Map CLI-friendly client names to internal client names\n * @param cliName The CLI-friendly name (e.g., \"github-copilot\", \"claude-code\")\n * @returns The internal client name (e.g., \"GitHub Copilot\", \"Claude Code\")\n */\nfunction mapCliNameToClientName(cliName: string): string {\n const mapping: Record<string, string> = {\n \"github-copilot\": \"GitHub Copilot\",\n copilot: \"GitHub Copilot\",\n \"claude-code\": \"Claude Code\",\n claude: \"Claude Code\",\n };\n return mapping[cliName.toLowerCase()] || cliName;\n}\n\n/**\n * Chat command implementation\n * Launches an interactive conversation with an AI chat client\n * Supports Claude Code CLI and GitHub Copilot CLI with auto-detection\n *\n * @param explicitClient Optional client name explicitly specified by user\n * @param withDanger Optional flag to enable dangerous mode (skip permissions)\n */\nexport async function chatCommand(explicitClient?: string, withDanger?: boolean): Promise<void> {\n const span = isTelemetryEnabled\n ? startSpan(\"chat.session\", {\n \"chat.hasExplicitClient\": !!explicitClient,\n \"chat.explicitClient\": explicitClient,\n \"chat.dangerMode\": withDanger === true,\n })\n : null;\n\n try {\n // Load the model to verify it exists\n const model = await Model.load(process.cwd());\n if (!model) {\n throw new CLIError(\"Could not load architecture model\", 1);\n }\n\n // Initialize chat logger\n const logger = initializeChatLogger(model.rootPath);\n await logger.ensureLogDirectory();\n await logger.logEvent(\"chat_session_started\", {\n workingDirectory: model.rootPath,\n withDanger,\n });\n\n // Detect available clients\n const availableClients = await detectAvailableClients();\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"chat.availableClients\", availableClients.length);\n (span as any).setAttribute(\n \"chat.clientNames\",\n availableClients.map((c) => c.getClientName()).join(\",\")\n );\n }\n\n if (availableClients.length === 0) {\n const errorMsg = \"No AI chat CLI available.\";\n if (isTelemetryEnabled && span) {\n emitLog(SeverityNumber.ERROR, \"No AI chat clients available\");\n }\n await logger.logError(errorMsg);\n console.error(ansis.red(`Error: ${errorMsg}`));\n console.error(ansis.dim(\"Install one of the following:\"));\n console.error(ansis.dim(\" - Claude Code: https://claude.ai\"));\n console.error(ansis.dim(\" - GitHub Copilot: gh extension install github/gh-copilot\"));\n process.exit(1);\n }\n\n // Select the client to use\n let selectedClient: BaseChatClient;\n\n // If user explicitly specified a client\n if (explicitClient) {\n const requestedClientName = mapCliNameToClientName(explicitClient);\n const requestedClient = availableClients.find(\n (c) => c.getClientName() === requestedClientName\n );\n\n if (!requestedClient) {\n const errorMsg = `Requested client \"${requestedClientName}\" is not available.`;\n await logger.logError(errorMsg);\n console.error(ansis.red(`Error: ${errorMsg}`));\n console.error(ansis.dim(\"Available clients:\"));\n availableClients.forEach((c) => {\n console.error(ansis.dim(` - ${c.getClientName()}`));\n });\n process.exit(1);\n }\n\n selectedClient = requestedClient;\n } else {\n // Auto-select based on availability\n if (availableClients.length === 1) {\n selectedClient = availableClients[0];\n } else {\n // Multiple clients available - ask user to choose\n const choice = await select({\n message: \"Select AI chat client:\",\n options: availableClients.map((c) => ({\n value: c.getClientName(),\n label: c.getClientName(),\n })),\n });\n\n if (typeof choice !== \"string\") {\n console.log(\"\");\n await logger.logEvent(\"chat_session_cancelled\");\n outro(ansis.yellow(\"Chat cancelled\"));\n return;\n }\n\n selectedClient = availableClients.find((c) => c.getClientName() === choice)!;\n }\n }\n\n // Log client selection\n await logger.logEvent(\"client_selected\", {\n client: selectedClient.getClientName(),\n sessionId: logger.getSessionId(),\n });\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"chat.selectedClient\", selectedClient.getClientName());\n (span as any).setAttribute(\"chat.sessionId\", logger.getSessionId());\n }\n\n // Show intro\n intro(ansis.bold(ansis.cyan(\"Documentation Robotics Chat\")));\n console.log(ansis.dim(`Powered by ${selectedClient.getClientName()}`));\n console.log(ansis.dim(`Session ID: ${logger.getSessionId()}`));\n console.log(ansis.dim(`Logs: ${logger.getSessionLogPath()}`));\n if (withDanger) {\n console.log(ansis.yellow(\"\u26A0\uFE0F Danger mode enabled - permissions will be skipped\\n\"));\n } else {\n console.log(\"\");\n }\n\n // Use dr-architect agent for all clients\n const agentName = \"dr-architect\";\n\n // Start conversation loop\n let messageCount = 0;\n while (true) {\n // Get user input\n let userInput: string;\n try {\n userInput = (await text({\n message: ansis.cyan(\"You:\"),\n placeholder: 'Ask about the architecture (or \"exit\" to quit)',\n })) as string;\n } catch (e) {\n // Handle Ctrl+C or other input errors gracefully\n console.log(\"\");\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"chat.messageCount\", messageCount);\n (span as any).setAttribute(\"chat.exitReason\", \"interrupted\");\n }\n await logger.logEvent(\"chat_session_interrupted\");\n outro(ansis.green(\"Goodbye!\"));\n break;\n }\n\n // Check for exit\n if (\n userInput.toLowerCase() === \"exit\" ||\n userInput.toLowerCase() === \"quit\" ||\n userInput.toLowerCase() === \"q\" ||\n userInput.toLowerCase() === \"/exit\" ||\n userInput.toLowerCase() === \"/quit\" ||\n userInput.toLowerCase() === \"/q\"\n ) {\n console.log(\"\");\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"chat.messageCount\", messageCount);\n (span as any).setAttribute(\"chat.exitReason\", \"user_exit\");\n }\n await logger.logEvent(\"chat_session_ended\", {\n messageCount,\n });\n outro(ansis.green(\"Goodbye!\"));\n break;\n }\n\n if (!userInput.trim()) {\n continue;\n }\n\n messageCount++;\n\n try {\n // Stream the response\n process.stdout.write(ansis.cyan(`${selectedClient.getClientName()}: `));\n await selectedClient.sendMessage(userInput, {\n workingDirectory: model.rootPath,\n agent: agentName,\n withDanger,\n sessionId: logger.getSessionId(),\n });\n console.log(\"\\n\");\n\n // Flush telemetry after message completes to ensure spans are exported\n // during long chat sessions (not just at shutdown)\n if (isTelemetryEnabled) {\n try {\n const { flushTelemetry } = await import(\"../telemetry/index.js\");\n await flushTelemetry(); // Blocking flush\n } catch (flushError) {\n // Log flush failures for debugging, but don't break chat\n if (process.env.DR_TELEMETRY_DEBUG) {\n process.stderr.write(\n `[TELEMETRY] Flush failed: ${flushError instanceof Error ? flushError.message : String(flushError)}\\n`\n );\n }\n }\n }\n } catch (error) {\n const message = getErrorMessage(error);\n if (isTelemetryEnabled && span) {\n emitLog(SeverityNumber.ERROR, \"Message send failed\", {\n \"error.message\": message,\n \"chat.messageCount\": messageCount,\n });\n }\n console.error(ansis.red(`Error: ${message}`));\n await logger.logError(message, {\n messageCount,\n });\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 const message = getErrorMessage(error);\n console.error(ansis.red(`Error: ${message}`));\n\n // Log fatal error if logger is available\n const logger = getChatLogger();\n if (logger) {\n await logger.logError(message, {\n fatal: true,\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n\n process.exit(1);\n } finally {\n endSpan(span);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|