@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,37 +1,63 @@
|
|
|
1
1
|
import ansis from "ansis";
|
|
2
2
|
import { Model } from "../core/model.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { StagingAreaManager } from "../core/staging-area.js";
|
|
4
|
+
import { ChangesetExporter } from "../core/changeset-exporter.js";
|
|
5
|
+
import { StagedChangesetStorage } from "../core/staged-changeset-storage.js";
|
|
6
|
+
import { ValidationFormatter } from "../validators/validation-formatter.js";
|
|
5
7
|
import * as prompts from "@clack/prompts";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import { isTelemetryEnabled, startSpan, endSpan, startActiveSpan } from "../telemetry/index.js";
|
|
10
|
+
import { getErrorMessage } from "../utils/errors.js";
|
|
11
|
+
import { findElementLayer } from "../utils/element-utils.js";
|
|
12
|
+
function generateImportedChangesetId() {
|
|
13
|
+
return `imported-${Date.now()}`;
|
|
14
|
+
}
|
|
6
15
|
async function changesetCreateCommand(name, options) {
|
|
16
|
+
const span = isTelemetryEnabled ? startSpan("changeset.create", {
|
|
17
|
+
"changeset.name": name,
|
|
18
|
+
"changeset.hasDescription": !!options.description
|
|
19
|
+
}) : null;
|
|
7
20
|
try {
|
|
8
|
-
const model = await Model.load(process.cwd(), { lazyLoad: !
|
|
9
|
-
await manager.load(name) && (console.error(ansis.red(`Error: Changeset '${name}' already exists`)), process.exit(1));
|
|
21
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model);
|
|
22
|
+
await manager.load(name) && (console.error(ansis.red(`Error: Changeset '${name}' already exists`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset already exists" }), endSpan(span), process.exit(1));
|
|
10
23
|
let description = options.description;
|
|
11
24
|
if (!description) {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
25
|
+
const isInteractive = process.stdin.isTTY;
|
|
26
|
+
if (isTelemetryEnabled && span && span.setAttribute("cli.interactive", isInteractive), isInteractive) {
|
|
27
|
+
const result = await prompts.text({
|
|
28
|
+
message: "Changeset description (optional)"
|
|
29
|
+
});
|
|
30
|
+
typeof result == "string" && (description = result);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const changeset = await manager.create(name, description || void 0), previouslyActive = await manager.getActiveId();
|
|
34
|
+
if (previouslyActive) {
|
|
35
|
+
const previous = await manager.load(previouslyActive);
|
|
36
|
+
console.log(ansis.yellow(` Deactivating changeset: ${ansis.bold(previous?.name ?? previouslyActive)}`));
|
|
16
37
|
}
|
|
17
|
-
|
|
18
|
-
console.log(ansis.green(`\u2713 Created changeset: ${ansis.bold(name)}`)), changeset.description && console.log(ansis.dim(` ${changeset.description}`)), console.log(ansis.dim(` Path: .dr/changesets/${name.toLowerCase().replace(/\s+/g, "-")}.json`)), console.log();
|
|
38
|
+
await manager.setActive(changeset.id), isTelemetryEnabled && span && (span.setAttribute("changeset.id", changeset.id), span.setStatus({ code: 0 })), console.log(ansis.green(`\u2713 Created and activated changeset: ${ansis.bold(name)}`)), changeset.description && console.log(ansis.dim(` ${changeset.description}`)), console.log(ansis.dim(` Path: documentation-robotics/changesets/${changeset.id}/`)), console.log();
|
|
19
39
|
} catch (error) {
|
|
20
|
-
|
|
40
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
41
|
+
code: 2,
|
|
42
|
+
message: getErrorMessage(error)
|
|
43
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
44
|
+
} finally {
|
|
45
|
+
endSpan(span);
|
|
21
46
|
}
|
|
22
47
|
}
|
|
23
48
|
async function changesetListCommand() {
|
|
49
|
+
const span = isTelemetryEnabled ? startSpan("changeset.list") : null;
|
|
24
50
|
try {
|
|
25
|
-
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), changesets = await new
|
|
26
|
-
if (changesets.length === 0) {
|
|
27
|
-
console.log(ansis.yellow("No changesets found")), console.log();
|
|
51
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), changesets = await new StagingAreaManager(model.rootPath, model).list();
|
|
52
|
+
if (isTelemetryEnabled && span && span.setAttribute("changeset.count", changesets.length), changesets.length === 0) {
|
|
53
|
+
console.log(ansis.yellow("No changesets found")), console.log(), isTelemetryEnabled && span && span.setStatus({ code: 0 }), endSpan(span);
|
|
28
54
|
return;
|
|
29
55
|
}
|
|
30
56
|
console.log(ansis.bold(`
|
|
31
57
|
Changesets (${changesets.length}):
|
|
32
58
|
`));
|
|
33
59
|
for (const changeset of changesets) {
|
|
34
|
-
const statusColor = changeset.status === "
|
|
60
|
+
const statusColor = changeset.status === "committed" ? ansis.green : changeset.status === "discarded" ? ansis.gray : ansis.yellow;
|
|
35
61
|
console.log(`${statusColor(changeset.status.toUpperCase())} ${ansis.bold(changeset.name)}`), changeset.description && console.log(ansis.dim(` ${changeset.description}`)), console.log(ansis.dim(` Changes: ${changeset.getChangeCount()} | Created: ${new Date(changeset.created).toLocaleDateString()}`));
|
|
36
62
|
const changesByType = {
|
|
37
63
|
add: changeset.getChangesByType("add").length,
|
|
@@ -40,92 +66,498 @@ Changesets (${changesets.length}):
|
|
|
40
66
|
}, parts = [];
|
|
41
67
|
changesByType.add > 0 && parts.push(`+${changesByType.add}`), changesByType.update > 0 && parts.push(`~${changesByType.update}`), changesByType.delete > 0 && parts.push(`-${changesByType.delete}`), parts.length > 0 && console.log(ansis.dim(` ${parts.join(" ")}`)), console.log();
|
|
42
68
|
}
|
|
69
|
+
isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
43
70
|
} catch (error) {
|
|
44
|
-
|
|
71
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
72
|
+
code: 2,
|
|
73
|
+
message: getErrorMessage(error)
|
|
74
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
75
|
+
} finally {
|
|
76
|
+
endSpan(span);
|
|
45
77
|
}
|
|
46
78
|
}
|
|
47
|
-
async function changesetApplyCommand(name) {
|
|
79
|
+
async function changesetApplyCommand(name, options) {
|
|
80
|
+
const span = isTelemetryEnabled ? startSpan("changeset.apply", {
|
|
81
|
+
"changeset.name": name,
|
|
82
|
+
"apply.validate": options?.validate !== !1,
|
|
83
|
+
"apply.force": options?.force === !0
|
|
84
|
+
}) : null;
|
|
48
85
|
try {
|
|
49
|
-
const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new
|
|
50
|
-
changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), process.exit(1)), console.log(ansis.bold(`
|
|
86
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model), changeset = await manager.load(name);
|
|
87
|
+
changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), isTelemetryEnabled && span && (span.setAttribute("changeset.id", changeset.id), span.setAttribute("changeset.changeCount", changeset.changes.length)), console.log(ansis.bold(`
|
|
51
88
|
Applying changeset: ${ansis.cyan(name)}
|
|
52
|
-
`)), console.log(ansis.dim(`Changes: ${changeset.
|
|
53
|
-
const
|
|
54
|
-
|
|
89
|
+
`)), console.log(ansis.dim(`Changes: ${changeset.changes.length}`));
|
|
90
|
+
const preApplyStats = ValidationFormatter.calculateStats(model);
|
|
91
|
+
preApplyStats.orphanedElements.length > 0 && console.log(ansis.dim(`Model health before apply: ${preApplyStats.orphanedElements.length} orphaned element(s) \u2014 run 'dr validate --orphans' for details`));
|
|
92
|
+
const changesetId = changeset.id || name;
|
|
93
|
+
changesetId || (console.error(ansis.red("Error: Changeset ID could not be determined") + `
|
|
94
|
+
` + ansis.dim("This indicates a corrupted changeset. The changeset exists but has no ID field.") + `
|
|
95
|
+
` + ansis.dim(`Try:
|
|
96
|
+
`) + ansis.dim(` 1. Run 'dr changeset list' to see available changesets
|
|
97
|
+
`) + ansis.dim(` 2. Delete and recreate the changeset if possible
|
|
98
|
+
`) + ansis.dim(" 3. Contact support if this persists")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset ID missing" }), endSpan(span), process.exit(1));
|
|
99
|
+
const result = await manager.apply(model, changesetId, {
|
|
100
|
+
validate: options?.validate,
|
|
101
|
+
force: options?.force
|
|
102
|
+
});
|
|
103
|
+
if (console.log(), console.log(ansis.green(`\u2713 Applied ${result.committed} change(s) from changeset`)), isTelemetryEnabled && span && (span.setAttribute("apply.committed", result.committed), span.setAttribute("apply.failed", result.failed), span.setAttribute("apply.validationPassed", result.validation.passed)), result.failed > 0) {
|
|
55
104
|
console.log(ansis.red(`\u2717 Failed to apply ${result.failed} change(s):`));
|
|
56
|
-
for (const error of result.errors)
|
|
57
|
-
console.log(ansis.dim(` - ${error
|
|
105
|
+
for (const error of result.validation.errors)
|
|
106
|
+
console.log(ansis.dim(` - ${error}`));
|
|
58
107
|
}
|
|
59
108
|
model.manifest.changeset_history || (model.manifest.changeset_history = []), model.manifest.changeset_history.push({
|
|
60
109
|
name,
|
|
61
|
-
|
|
62
|
-
action: "
|
|
63
|
-
}), await model.saveDirtyLayers(), await model.saveManifest(), result.failed === 0 && console.log(ansis.dim("Changeset marked as
|
|
110
|
+
committed_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
111
|
+
action: "committed"
|
|
112
|
+
}), await model.saveDirtyLayers(), await model.saveManifest(), result.failed === 0 && console.log(ansis.dim("Changeset marked as committed")), isTelemetryEnabled && span && span.setStatus({ code: 0 }), console.log();
|
|
64
113
|
} catch (error) {
|
|
65
|
-
|
|
114
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
115
|
+
code: 2,
|
|
116
|
+
message: getErrorMessage(error)
|
|
117
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
118
|
+
} finally {
|
|
119
|
+
endSpan(span);
|
|
66
120
|
}
|
|
67
121
|
}
|
|
68
122
|
async function changesetRevertCommand(name) {
|
|
123
|
+
const span = isTelemetryEnabled ? startSpan("changeset.revert", {
|
|
124
|
+
"changeset.name": name
|
|
125
|
+
}) : null;
|
|
69
126
|
try {
|
|
70
|
-
const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new
|
|
71
|
-
changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), process.exit(1)), console.log(ansis.bold(`
|
|
127
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model), changeset = await manager.load(name);
|
|
128
|
+
changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), isTelemetryEnabled && span && (span.setAttribute("changeset.id", changeset.id), span.setAttribute("changeset.changeCount", changeset.changes.length)), console.log(ansis.bold(`
|
|
72
129
|
Reverting changeset: ${ansis.cyan(name)}
|
|
73
|
-
`)), console.log(ansis.dim(`Changes to
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
console.log(ansis.red(`\u2717 Failed to revert ${result.failed} change(s):`));
|
|
77
|
-
for (const error of result.errors)
|
|
78
|
-
console.log(ansis.dim(` - ${error.change.elementId} (${error.change.type}): ${error.error}`));
|
|
79
|
-
}
|
|
80
|
-
model.manifest.changeset_history || (model.manifest.changeset_history = []), model.manifest.changeset_history.push({
|
|
81
|
-
name,
|
|
82
|
-
applied_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
83
|
-
action: "reverted"
|
|
84
|
-
}), await model.saveDirtyLayers(), await model.saveManifest(), result.failed === 0 && console.log(ansis.dim("Changeset marked as reverted")), console.log();
|
|
130
|
+
`)), console.log(ansis.dim(`Changes to discard: ${changeset.changes.length}`));
|
|
131
|
+
const changesetId = changeset.id || name;
|
|
132
|
+
changesetId || (console.error(ansis.red("Error: Changeset ID could not be determined")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset ID missing" }), endSpan(span), process.exit(1)), await manager.revert(changesetId), console.log(), console.log(ansis.green(`\u2713 Reverted changeset: ${name}`)), console.log(ansis.dim("Changeset marked as discarded")), isTelemetryEnabled && span && span.setStatus({ code: 0 }), console.log();
|
|
85
133
|
} catch (error) {
|
|
86
|
-
|
|
134
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
135
|
+
code: 2,
|
|
136
|
+
message: getErrorMessage(error)
|
|
137
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
138
|
+
} finally {
|
|
139
|
+
endSpan(span);
|
|
87
140
|
}
|
|
88
141
|
}
|
|
89
142
|
async function changesetActivateCommand(name) {
|
|
143
|
+
const span = isTelemetryEnabled ? startSpan("changeset.activate", {
|
|
144
|
+
"changeset.name": name
|
|
145
|
+
}) : null;
|
|
90
146
|
try {
|
|
91
147
|
const model = await Model.load(process.cwd(), { lazyLoad: !0 });
|
|
92
|
-
await new
|
|
148
|
+
await new StagingAreaManager(model.rootPath, model).setActive(name), console.log(ansis.green(`\u2713 Activated changeset: ${ansis.bold(name)}`)), console.log(ansis.dim(" All model changes will now be tracked in this changeset")), isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
93
149
|
} catch (error) {
|
|
94
|
-
|
|
150
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
151
|
+
code: 2,
|
|
152
|
+
message: getErrorMessage(error)
|
|
153
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
154
|
+
} finally {
|
|
155
|
+
endSpan(span);
|
|
95
156
|
}
|
|
96
157
|
}
|
|
97
158
|
async function changesetDeactivateCommand() {
|
|
159
|
+
const span = isTelemetryEnabled ? startSpan("changeset.deactivate") : null;
|
|
98
160
|
try {
|
|
99
|
-
const model = await Model.load(process.cwd(), { lazyLoad: !0 }),
|
|
161
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), active = await manager.getActiveId();
|
|
100
162
|
if (!active) {
|
|
101
|
-
console.log(ansis.yellow("No active changeset"));
|
|
163
|
+
console.log(ansis.yellow("No active changeset")), isTelemetryEnabled && span && (span.setAttribute("changeset.wasActive", !1), span.setStatus({ code: 0 })), endSpan(span);
|
|
102
164
|
return;
|
|
103
165
|
}
|
|
104
|
-
await
|
|
166
|
+
isTelemetryEnabled && span && (span.setAttribute("changeset.name", active), span.setAttribute("changeset.wasActive", !0)), await manager.clearActive(), console.log(ansis.green(`\u2713 Deactivated changeset: ${ansis.bold(active)}`)), isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
105
167
|
} catch (error) {
|
|
106
|
-
|
|
168
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
169
|
+
code: 2,
|
|
170
|
+
message: getErrorMessage(error)
|
|
171
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
172
|
+
} finally {
|
|
173
|
+
endSpan(span);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async function changesetDeleteCommand(name, options) {
|
|
177
|
+
const span = isTelemetryEnabled ? startSpan("changeset.delete", {
|
|
178
|
+
"changeset.name": name,
|
|
179
|
+
"delete.force": options.force === !0
|
|
180
|
+
}) : null;
|
|
181
|
+
try {
|
|
182
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), changeset = await manager.load(name);
|
|
183
|
+
if (changeset || (console.error(ansis.red(`Error: Changeset '${name}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), await manager.getActiveId() === changeset.id && (console.error(ansis.red(`Error: Cannot delete active changeset '${name}'`)), console.log(ansis.dim(" Run `dr changeset deactivate` first")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Cannot delete active changeset" }), endSpan(span), process.exit(1)), !options.force) {
|
|
184
|
+
const isInteractive = process.stdin.isTTY && process.stdout.isTTY;
|
|
185
|
+
if (isTelemetryEnabled && span && span.setAttribute("cli.interactive", isInteractive), isInteractive) {
|
|
186
|
+
const confirm = await prompts.confirm({
|
|
187
|
+
message: `Delete changeset '${name}'? This cannot be undone.`
|
|
188
|
+
});
|
|
189
|
+
if (!confirm || typeof confirm != "boolean") {
|
|
190
|
+
console.log(ansis.yellow("Deletion cancelled")), isTelemetryEnabled && span && (span.setAttribute("delete.cancelled", !0), span.setStatus({ code: 0 })), endSpan(span);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
} else
|
|
194
|
+
console.error(ansis.red("Error: Cannot confirm deletion in non-interactive environment")), console.log(ansis.dim(" Use --force flag to confirm deletion")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Interactive confirmation required" }), endSpan(span), process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
await manager.delete(name), console.log(ansis.green(`\u2713 Deleted changeset: ${ansis.bold(name)}`)), isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
197
|
+
} catch (error) {
|
|
198
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
199
|
+
code: 2,
|
|
200
|
+
message: getErrorMessage(error)
|
|
201
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
202
|
+
} finally {
|
|
203
|
+
endSpan(span);
|
|
107
204
|
}
|
|
108
205
|
}
|
|
109
206
|
async function changesetStatusCommand() {
|
|
207
|
+
const span = isTelemetryEnabled ? startSpan("changeset.status") : null;
|
|
110
208
|
try {
|
|
111
|
-
const model = await Model.load(process.cwd(), { lazyLoad: !0 }),
|
|
209
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), active = await manager.getActiveId();
|
|
112
210
|
if (!active) {
|
|
113
|
-
console.log(ansis.dim("No active changeset"));
|
|
211
|
+
console.log(ansis.dim("No active changeset")), isTelemetryEnabled && span && (span.setAttribute("changeset.hasActive", !1), span.setStatus({ code: 0 })), endSpan(span);
|
|
114
212
|
return;
|
|
115
213
|
}
|
|
116
|
-
console.log(ansis.bold(`Active changeset: ${ansis.cyan(active)}`));
|
|
117
|
-
const changeset = await
|
|
214
|
+
isTelemetryEnabled && span && (span.setAttribute("changeset.name", active), span.setAttribute("changeset.hasActive", !0)), console.log(ansis.bold(`Active changeset: ${ansis.cyan(active)}`));
|
|
215
|
+
const changeset = await manager.load(active);
|
|
118
216
|
if (changeset) {
|
|
119
|
-
console.log(ansis.dim(` Changes tracked: ${changeset.
|
|
120
|
-
const changesByType =
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
217
|
+
console.log(ansis.dim(` Changes tracked: ${changeset.changes.length}`));
|
|
218
|
+
const changesByType = changeset.stats;
|
|
219
|
+
isTelemetryEnabled && span && (span.setAttribute("changeset.changeCount", changeset.changes.length), span.setAttribute("changeset.adds", changesByType.additions), span.setAttribute("changeset.updates", changesByType.modifications), span.setAttribute("changeset.deletes", changesByType.deletions));
|
|
220
|
+
const parts = [];
|
|
221
|
+
changesByType.additions > 0 && parts.push(`+${changesByType.additions}`), changesByType.modifications > 0 && parts.push(`~${changesByType.modifications}`), changesByType.deletions > 0 && parts.push(`-${changesByType.deletions}`), parts.length > 0 && console.log(ansis.dim(` ${parts.join(" ")}`));
|
|
222
|
+
}
|
|
223
|
+
isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
224
|
+
} catch (error) {
|
|
225
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
226
|
+
code: 2,
|
|
227
|
+
message: getErrorMessage(error)
|
|
228
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
229
|
+
} finally {
|
|
230
|
+
endSpan(span);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async function changesetStagedCommand(options) {
|
|
234
|
+
const span = isTelemetryEnabled ? startSpan("changeset.staged", {
|
|
235
|
+
"staged.layer": options.layer
|
|
236
|
+
}) : null;
|
|
237
|
+
try {
|
|
238
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), activeChangeset = await manager.getActiveId();
|
|
239
|
+
if (!activeChangeset) {
|
|
240
|
+
console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const changeset = await manager.load(activeChangeset);
|
|
244
|
+
changeset || (console.error(ansis.red(`Error: Changeset '${activeChangeset}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1));
|
|
245
|
+
let changes = changeset.changes;
|
|
246
|
+
if (options.layer && (changes = changes.filter((c) => c.layerName === options.layer)), isTelemetryEnabled && span && (span.setAttribute("staged.changeCount", changes.length), span.setAttribute("staged.totalChanges", changeset.changes.length)), changes.length === 0) {
|
|
247
|
+
console.log(ansis.yellow("No staged changes")), isTelemetryEnabled && span && span.setStatus({ code: 0 }), endSpan(span);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
console.log(ansis.bold(`
|
|
251
|
+
Staged Changes (${changes.length}):
|
|
252
|
+
`));
|
|
253
|
+
const tableData = changes.map((c) => ({
|
|
254
|
+
"Element ID": c.elementId,
|
|
255
|
+
Layer: c.layerName,
|
|
256
|
+
Type: c.type,
|
|
257
|
+
Timestamp: new Date(c.timestamp || Date.now()).toISOString()
|
|
258
|
+
}));
|
|
259
|
+
console.table(tableData), isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
260
|
+
} catch (error) {
|
|
261
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
262
|
+
code: 2,
|
|
263
|
+
message: getErrorMessage(error)
|
|
264
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
265
|
+
} finally {
|
|
266
|
+
endSpan(span);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async function changesetExplicitStageCommand(elementId) {
|
|
270
|
+
const span = isTelemetryEnabled ? startSpan("changeset.stage-explicit", { "stage.elementId": elementId }) : null;
|
|
271
|
+
try {
|
|
272
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
|
|
273
|
+
if (!activeChangesetId) {
|
|
274
|
+
console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const layerName = await findElementLayer(model, elementId);
|
|
278
|
+
layerName || (console.error(ansis.red(`Error: Element '${elementId}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Element not found" }), endSpan(span), process.exit(1));
|
|
279
|
+
const element = (await model.getLayer(layerName))?.getElement(elementId);
|
|
280
|
+
if (element || (console.error(ansis.red(`Error: Element '${elementId}' not found in layer '${layerName}'`)), endSpan(span), process.exit(1)), (await manager.load(activeChangesetId))?.changes.some((c) => c.elementId === elementId)) {
|
|
281
|
+
console.warn(ansis.yellow(`Warning: Element '${elementId}' is already staged in the active changeset. Skipping.`)), endSpan(span);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
await manager.stage(activeChangesetId, {
|
|
285
|
+
type: "add",
|
|
286
|
+
elementId,
|
|
287
|
+
layerName,
|
|
288
|
+
after: element.toJSON()
|
|
289
|
+
}), isTelemetryEnabled && span && (span.setAttribute("stage.layerName", layerName), span.setStatus({ code: 0 })), console.log(ansis.green(`\u2713 Staged element: ${ansis.bold(elementId)}`)), console.log(ansis.dim(` Layer: ${layerName} | Changeset: ${activeChangesetId}`));
|
|
290
|
+
} catch (error) {
|
|
291
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({ code: 2, message: getErrorMessage(error) })), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
292
|
+
} finally {
|
|
293
|
+
endSpan(span);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
async function changesetUnstageCommand(elementId) {
|
|
297
|
+
const span = isTelemetryEnabled ? startSpan("changeset.unstage", {
|
|
298
|
+
"unstage.elementId": elementId
|
|
299
|
+
}) : null;
|
|
300
|
+
try {
|
|
301
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
|
|
302
|
+
if (!activeChangesetId) {
|
|
303
|
+
console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const changeset = await manager.load(activeChangesetId);
|
|
307
|
+
changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), process.exit(1));
|
|
308
|
+
const initialCount = changeset.changes.length;
|
|
309
|
+
await manager.unstage(activeChangesetId, elementId);
|
|
310
|
+
const updated = await manager.load(activeChangesetId);
|
|
311
|
+
if (updated && updated.changes.length === initialCount) {
|
|
312
|
+
console.error(ansis.yellow(`Warning: Element '${elementId}' not found in staged changes`)), isTelemetryEnabled && span && (span.setAttribute("unstage.found", !1), span.setStatus({ code: 0 })), endSpan(span);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
isTelemetryEnabled && span && (span.setAttribute("unstage.found", !0), span.setAttribute("unstage.remainingChanges", updated?.getChangeCount() || 0)), console.log(ansis.green(`\u2713 Unstaged element: ${ansis.bold(elementId)}`)), console.log(ansis.dim(` Remaining staged changes: ${updated?.getChangeCount() || 0}`)), isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
316
|
+
} catch (error) {
|
|
317
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
318
|
+
code: 2,
|
|
319
|
+
message: getErrorMessage(error)
|
|
320
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
321
|
+
} finally {
|
|
322
|
+
endSpan(span);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
async function changesetDiscardCommand(elementId) {
|
|
326
|
+
const span = isTelemetryEnabled ? startSpan("changeset.discard", {
|
|
327
|
+
"discard.elementId": elementId,
|
|
328
|
+
"discard.all": !elementId
|
|
329
|
+
}) : null;
|
|
330
|
+
try {
|
|
331
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
|
|
332
|
+
if (!activeChangesetId) {
|
|
333
|
+
console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const changeset = await manager.load(activeChangesetId);
|
|
337
|
+
if (changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), isTelemetryEnabled && span && span.setAttribute("discard.changeCount", changeset.changes.length), elementId) {
|
|
338
|
+
const initialCount = changeset.changes.length;
|
|
339
|
+
await manager.unstage(activeChangesetId, elementId);
|
|
340
|
+
const updated = await manager.load(activeChangesetId);
|
|
341
|
+
if (updated && updated.changes.length === initialCount) {
|
|
342
|
+
console.error(ansis.yellow(`Warning: Element '${elementId}' not found in staged changes`)), isTelemetryEnabled && span && (span.setAttribute("discard.found", !1), span.setStatus({ code: 0 })), endSpan(span);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
isTelemetryEnabled && span && span.setAttribute("discard.found", !0), console.log(ansis.green(`\u2713 Discarded changes for element: ${ansis.bold(elementId)}`));
|
|
346
|
+
} else {
|
|
347
|
+
const isInteractive = process.stdin.isTTY && process.stdout.isTTY;
|
|
348
|
+
if (isTelemetryEnabled && span && span.setAttribute("cli.interactive", isInteractive), isInteractive) {
|
|
349
|
+
const confirmed = await prompts.confirm({
|
|
350
|
+
message: `Discard all ${changeset.changes.length} staged changes? This cannot be undone.`
|
|
351
|
+
});
|
|
352
|
+
if (!confirmed || typeof confirmed != "boolean") {
|
|
353
|
+
console.log(ansis.dim("Cancelled")), isTelemetryEnabled && span && (span.setAttribute("discard.cancelled", !0), span.setStatus({ code: 0 })), endSpan(span);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
} else
|
|
357
|
+
console.error(ansis.red("Error: Cannot confirm discard of all changes in non-interactive environment")), console.log(ansis.dim(" Specify an element ID to discard only that element")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Interactive confirmation required" }), endSpan(span), process.exit(1);
|
|
358
|
+
await manager.discard(activeChangesetId), console.log(ansis.green("\u2713 Discarded all staged changes")), console.log(ansis.dim(" Changeset status: discarded"));
|
|
359
|
+
}
|
|
360
|
+
isTelemetryEnabled && span && span.setStatus({ code: 0 }), console.log();
|
|
361
|
+
} catch (error) {
|
|
362
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
363
|
+
code: 2,
|
|
364
|
+
message: getErrorMessage(error)
|
|
365
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
366
|
+
} finally {
|
|
367
|
+
endSpan(span);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
async function changesetPreviewCommand(options) {
|
|
371
|
+
const span = isTelemetryEnabled ? startSpan("changeset.preview", {
|
|
372
|
+
"preview.layer": options.layer
|
|
373
|
+
}) : null;
|
|
374
|
+
try {
|
|
375
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
|
|
376
|
+
if (!activeChangesetId) {
|
|
377
|
+
console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
const changeset = await manager.load(activeChangesetId);
|
|
381
|
+
changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), console.log(ansis.bold(`
|
|
382
|
+
Preview: Merged Model State (${ansis.cyan("with staged changes")})`)), console.log(ansis.dim(`Changeset: ${changeset.name}`)), console.log();
|
|
383
|
+
const additions = changeset.getChangesByType("add").length, modifications = changeset.getChangesByType("update").length, deletions = changeset.getChangesByType("delete").length;
|
|
384
|
+
if (isTelemetryEnabled && span && (span.setAttribute("preview.additions", additions), span.setAttribute("preview.modifications", modifications), span.setAttribute("preview.deletions", deletions), span.setAttribute("preview.totalChanges", changeset.changes.length)), additions > 0 && console.log(ansis.green(`+ ${additions} additions`)), modifications > 0 && console.log(ansis.yellow(`~ ${modifications} modifications`)), deletions > 0 && console.log(ansis.red(`- ${deletions} deletions`)), console.log(), options.layer) {
|
|
385
|
+
const layerChanges = changeset.changes.filter((c) => c.layerName === options.layer);
|
|
386
|
+
if (layerChanges.length === 0) {
|
|
387
|
+
console.log(ansis.dim(`No staged changes in layer '${options.layer}'`));
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
console.log(ansis.bold(`Layer: ${options.layer}`));
|
|
391
|
+
const tableData = layerChanges.map((c) => ({
|
|
392
|
+
"Element ID": c.elementId + ansis.dim(" (staged)"),
|
|
393
|
+
Type: c.type,
|
|
394
|
+
Status: c.type === "add" ? "new" : c.type === "delete" ? "removed" : "updated"
|
|
395
|
+
}));
|
|
396
|
+
console.table(tableData);
|
|
397
|
+
} else {
|
|
398
|
+
const layerMap = /* @__PURE__ */ new Map();
|
|
399
|
+
changeset.changes.forEach((c) => {
|
|
400
|
+
const existing = layerMap.get(c.layerName) ?? [];
|
|
401
|
+
existing.push(c), layerMap.set(c.layerName, existing);
|
|
402
|
+
}), isTelemetryEnabled && span && span.setAttribute("preview.layerCount", layerMap.size);
|
|
403
|
+
for (const [layerName, changes] of layerMap) {
|
|
404
|
+
console.log(ansis.bold(`Layer: ${layerName}`));
|
|
405
|
+
const tableData = changes.map((c) => ({
|
|
406
|
+
"Element ID": c.elementId,
|
|
407
|
+
Type: c.type,
|
|
408
|
+
Status: c.type === "add" ? "new" : c.type === "delete" ? "removed" : "updated"
|
|
409
|
+
}));
|
|
410
|
+
console.table(tableData), console.log();
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
414
|
+
} catch (error) {
|
|
415
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
416
|
+
code: 2,
|
|
417
|
+
message: getErrorMessage(error)
|
|
418
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
419
|
+
} finally {
|
|
420
|
+
endSpan(span);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
async function changesetDiffCommand(options) {
|
|
424
|
+
const span = isTelemetryEnabled ? startSpan("changeset.diff", {
|
|
425
|
+
"diff.layer": options.layer
|
|
426
|
+
}) : null;
|
|
427
|
+
try {
|
|
428
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !1 }), manager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await manager.getActiveId();
|
|
429
|
+
if (!activeChangesetId) {
|
|
430
|
+
console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "No active changeset" }), endSpan(span);
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
const changeset = await manager.load(activeChangesetId);
|
|
434
|
+
changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset not found" }), endSpan(span), process.exit(1)), console.log(ansis.bold(`
|
|
435
|
+
Diff: Base Model vs Staged Changes
|
|
436
|
+
`));
|
|
437
|
+
const layerMap = /* @__PURE__ */ new Map();
|
|
438
|
+
if (changeset.changes.forEach((c) => {
|
|
439
|
+
if (!options.layer || c.layerName === options.layer) {
|
|
440
|
+
const existing = layerMap.get(c.layerName) ?? [];
|
|
441
|
+
existing.push(c), layerMap.set(c.layerName, existing);
|
|
442
|
+
}
|
|
443
|
+
}), isTelemetryEnabled && span && (span.setAttribute("diff.layerCount", layerMap.size), span.setAttribute("diff.totalChanges", changeset.changes.length)), layerMap.size === 0) {
|
|
444
|
+
console.log(ansis.dim(options.layer ? `No changes in layer '${options.layer}'` : "No staged changes")), isTelemetryEnabled && span && span.setStatus({ code: 0 }), endSpan(span);
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
for (const [layerName, changes] of layerMap) {
|
|
448
|
+
console.log(ansis.bold(`Layer: ${layerName}`));
|
|
449
|
+
for (const change of changes)
|
|
450
|
+
change.type === "add" ? (console.log(ansis.green(`+ ${change.elementId}`)), console.log(ansis.dim(` ${JSON.stringify(change.after || {}, null, 2)}`))) : change.type === "delete" ? (console.log(ansis.red(`- ${change.elementId}`)), console.log(ansis.dim(` ${JSON.stringify(change.before || {}, null, 2)}`))) : change.type === "update" && (console.log(ansis.yellow(`~ ${change.elementId}`)), console.log(ansis.dim(` Before: ${JSON.stringify(change.before || {})}`)), console.log(ansis.dim(` After: ${JSON.stringify(change.after || {})}`)));
|
|
451
|
+
console.log();
|
|
452
|
+
}
|
|
453
|
+
isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
454
|
+
} catch (error) {
|
|
455
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
456
|
+
code: 2,
|
|
457
|
+
message: getErrorMessage(error)
|
|
458
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
459
|
+
} finally {
|
|
460
|
+
endSpan(span);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
async function changesetCommitCommand(options) {
|
|
464
|
+
await startActiveSpan("changeset.commit", async (span) => {
|
|
465
|
+
try {
|
|
466
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !1 }), stagingManager = new StagingAreaManager(model.rootPath, model), activeChangesetId = await stagingManager.getActiveId();
|
|
467
|
+
if (!activeChangesetId) {
|
|
468
|
+
console.error(ansis.red("Error: No active changeset")), isTelemetryEnabled && span.setStatus({ code: 2, message: "No active changeset" });
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
const changeset = await stagingManager.load(activeChangesetId);
|
|
472
|
+
changeset || (console.error(ansis.red(`Error: Changeset '${activeChangesetId}' not found`)), isTelemetryEnabled && span.setStatus({ code: 2, message: "Changeset not found" }), span.end(), process.exit(1));
|
|
473
|
+
const changeCount = changeset.changes.length;
|
|
474
|
+
if (isTelemetryEnabled && (span.setAttribute("changeset.id", activeChangesetId), span.setAttribute("changeset.name", changeset.name), span.setAttribute("changeset.changeCount", changeCount)), changeCount === 0) {
|
|
475
|
+
console.log(ansis.yellow("No staged changes to commit")), isTelemetryEnabled && span.setStatus({ code: 0 });
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
console.log(ansis.bold(`
|
|
479
|
+
Committing changeset: ${ansis.cyan(changeset.name)}`)), console.log(ansis.dim(`Staged changes: ${changeCount}`)), console.log();
|
|
480
|
+
try {
|
|
481
|
+
const result = await stagingManager.commit(model, activeChangesetId, {
|
|
482
|
+
validate: options?.validate !== !1,
|
|
483
|
+
force: options?.force === !0
|
|
484
|
+
});
|
|
485
|
+
if (await stagingManager.clearActive(), console.log(ansis.green(`\u2713 Committed ${result.committed} change(s)`)), (result.skipped ?? 0) > 0) {
|
|
486
|
+
const skipped = result.skipped, details = result.skippedDetails ?? [];
|
|
487
|
+
console.log(ansis.yellow(`\u26A0 Skipped ${skipped} duplicate element(s):`));
|
|
488
|
+
const shown = details.slice(0, 10);
|
|
489
|
+
for (const detail of shown)
|
|
490
|
+
console.log(ansis.dim(` ${detail}`));
|
|
491
|
+
details.length > 10 && console.log(ansis.dim(` ... and ${details.length - 10} more`));
|
|
492
|
+
}
|
|
493
|
+
isTelemetryEnabled && (span.setAttribute("commit.committed", result.committed), span.setAttribute("commit.skipped", result.skipped), span.setAttribute("commit.failed", result.failed), span.setAttribute("commit.validationPassed", result.validation.passed));
|
|
494
|
+
const accountedFor = result.committed + (result.skipped ?? 0) + result.failed;
|
|
495
|
+
if (accountedFor < changeCount) {
|
|
496
|
+
const unaccounted = changeCount - accountedFor;
|
|
497
|
+
console.log(ansis.yellow(`\u26A0 Warning: ${unaccounted} staged change(s) were not applied, skipped, or reported as failed. This is unexpected \u2014 check the changeset log for details.`));
|
|
498
|
+
}
|
|
499
|
+
result.driftWarning && (console.log(ansis.yellow("\u26A0 Warning: Model had drifted since changeset creation (--force was used)")), isTelemetryEnabled && span.setAttribute("commit.driftDetected", !0)), isTelemetryEnabled && span.setStatus({ code: 0 }), console.log();
|
|
500
|
+
} catch (error) {
|
|
501
|
+
throw console.log(ansis.red(`\u2717 Commit failed and rolled back: ${getErrorMessage(error)}`)), isTelemetryEnabled && span.setAttribute("commit.rolledBack", !0), error;
|
|
502
|
+
}
|
|
503
|
+
} catch (error) {
|
|
504
|
+
isTelemetryEnabled && (span.recordException(error), span.setStatus({
|
|
505
|
+
code: 2,
|
|
506
|
+
message: getErrorMessage(error)
|
|
507
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), span.end(), process.exit(1);
|
|
508
|
+
}
|
|
509
|
+
}, {
|
|
510
|
+
"commit.validate": options?.validate !== !1,
|
|
511
|
+
"commit.force": options?.force === !0
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
async function changesetExportCommand(changesetId, options) {
|
|
515
|
+
const format = options.format || "yaml", span = isTelemetryEnabled ? startSpan("changeset.export", {
|
|
516
|
+
"changeset.id": changesetId,
|
|
517
|
+
"export.format": format
|
|
518
|
+
}) : null;
|
|
519
|
+
try {
|
|
520
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !0 }), exporter = new ChangesetExporter(model.rootPath), ext = format === "patch" ? "patch" : format, outputPath = options.output || `${changesetId}.${ext}`, absolutePath = path.isAbsolute(outputPath) ? outputPath : path.join(process.cwd(), outputPath);
|
|
521
|
+
isTelemetryEnabled && span && span.setAttribute("export.outputPath", outputPath), await exporter.exportToFile(changesetId, absolutePath, format), console.log(ansis.green(`\u2713 Exported changeset to ${ansis.cyan(outputPath)}`)), console.log(ansis.dim(` Format: ${format}`)), isTelemetryEnabled && span && span.setStatus({ code: 0 });
|
|
522
|
+
} catch (error) {
|
|
523
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
524
|
+
code: 2,
|
|
525
|
+
message: getErrorMessage(error)
|
|
526
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
527
|
+
} finally {
|
|
528
|
+
endSpan(span);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
async function changesetImportCommand(file, options = {}) {
|
|
532
|
+
const span = isTelemetryEnabled ? startSpan("changeset.import", {
|
|
533
|
+
"import.file": file,
|
|
534
|
+
"import.force": options.force === !0
|
|
535
|
+
}) : null;
|
|
536
|
+
try {
|
|
537
|
+
const model = await Model.load(process.cwd(), { lazyLoad: !1 }), exporter = new ChangesetExporter(model.rootPath), absolutePath = path.isAbsolute(file) ? file : path.join(process.cwd(), file), imported = await exporter.importFromFile(absolutePath);
|
|
538
|
+
isTelemetryEnabled && span && (span.setAttribute("changeset.name", imported.name), span.setAttribute("changeset.changeCount", imported.changes.length));
|
|
539
|
+
const compatibility = await exporter.validateCompatibility(imported, model);
|
|
540
|
+
if (isTelemetryEnabled && span && (span.setAttribute("import.compatible", compatibility.compatible), span.setAttribute("import.baseSnapshotMatch", compatibility.baseSnapshotMatch)), !compatibility.compatible) {
|
|
541
|
+
console.error(ansis.red("\u2717 Import failed: Changeset is incompatible")), console.error(ansis.dim(" Issues:"));
|
|
542
|
+
for (const warning of compatibility.warnings)
|
|
543
|
+
console.error(ansis.dim(` - ${warning}`));
|
|
544
|
+
isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Changeset incompatible" }), endSpan(span), process.exit(1);
|
|
126
545
|
}
|
|
546
|
+
compatibility.baseSnapshotMatch || (options.force || (console.error(ansis.red("Error: Imported changeset has base model drift") + `
|
|
547
|
+
` + ansis.dim("The model has been modified since this changeset was created.") + `
|
|
548
|
+
` + ansis.dim("This may cause conflicts or unexpected behavior when committing.") + `
|
|
549
|
+
|
|
550
|
+
` + ansis.dim("To import anyway, use: --force")), isTelemetryEnabled && span && span.setStatus({ code: 2, message: "Drift detected, force required" }), endSpan(span), process.exit(1)), console.warn(ansis.yellow("\u26A0 Warning: Base model drift detected (--force used)") + `
|
|
551
|
+
` + ansis.dim("Review changes carefully before committing.")), console.log(), isTelemetryEnabled && span && span.setAttribute("import.driftOverridden", !0));
|
|
552
|
+
const newId = generateImportedChangesetId();
|
|
553
|
+
imported.id = newId, await new StagedChangesetStorage(model.rootPath).save(imported), console.log(ansis.green(`\u2713 Imported changeset: ${ansis.cyan(imported.name)}`)), console.log(ansis.dim(` ID: ${newId}`)), console.log(ansis.dim(` Changes: +${imported.stats?.additions || 0} ~${imported.stats?.modifications || 0} -${imported.stats?.deletions || 0}`)), compatibility.baseSnapshotMatch || console.log(ansis.yellow(" \u26A0 Base model drift detected - review before committing")), isTelemetryEnabled && span && (span.setAttribute("changeset.id", newId), span.setStatus({ code: 0 })), console.log();
|
|
127
554
|
} catch (error) {
|
|
128
|
-
|
|
555
|
+
isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
556
|
+
code: 2,
|
|
557
|
+
message: getErrorMessage(error)
|
|
558
|
+
})), console.error(ansis.red(`Error: ${getErrorMessage(error)}`)), endSpan(span), process.exit(1);
|
|
559
|
+
} finally {
|
|
560
|
+
endSpan(span);
|
|
129
561
|
}
|
|
130
562
|
}
|
|
131
563
|
function changesetCommands(program) {
|
|
@@ -139,10 +571,12 @@ Examples:
|
|
|
139
571
|
Examples:
|
|
140
572
|
$ dr changeset list`).action(async () => {
|
|
141
573
|
await changesetListCommand();
|
|
142
|
-
}), changesetGroup.command("apply <name>").description("Apply a changeset to the model").addHelpText("after", `
|
|
574
|
+
}), changesetGroup.command("apply <name>").description("Apply a changeset to the model").option("--no-validate", "Skip validation before applying").option("--force", "Force apply even if base model has drifted").addHelpText("after", `
|
|
143
575
|
Examples:
|
|
144
|
-
$ dr changeset apply "v1.1 migration"
|
|
145
|
-
|
|
576
|
+
$ dr changeset apply "v1.1 migration"
|
|
577
|
+
$ dr changeset apply "v1.1 migration" --no-validate
|
|
578
|
+
$ dr changeset apply "v1.1 migration" --force`).action(async (name, options) => {
|
|
579
|
+
await changesetApplyCommand(name, options);
|
|
146
580
|
}), changesetGroup.command("revert <name>").description("Revert a changeset from the model").addHelpText("after", `
|
|
147
581
|
Examples:
|
|
148
582
|
$ dr changeset revert "v1.1 migration"`).action(async (name) => {
|
|
@@ -159,16 +593,93 @@ Examples:
|
|
|
159
593
|
Examples:
|
|
160
594
|
$ dr changeset status`).action(async () => {
|
|
161
595
|
await changesetStatusCommand();
|
|
162
|
-
})
|
|
596
|
+
}), changesetGroup.command("show [name]").description("Show changeset details (use: status, staged, diff, or preview)").addHelpText("after", `
|
|
597
|
+
To inspect a changeset, use one of:
|
|
598
|
+
$ dr changeset status # Show the active changeset
|
|
599
|
+
$ dr changeset staged # List all staged changes
|
|
600
|
+
$ dr changeset diff [name] # Show a diff of staged changes
|
|
601
|
+
$ dr changeset preview [name] # Preview what will be committed`).action(async (name) => {
|
|
602
|
+
const nameHint = name ? ` '${name}'` : "";
|
|
603
|
+
console.error(`error: 'dr changeset show${nameHint}' is not a valid subcommand.
|
|
604
|
+
|
|
605
|
+
To inspect a changeset, use one of:
|
|
606
|
+
dr changeset status \u2014 show the active changeset
|
|
607
|
+
dr changeset staged \u2014 list all staged changes
|
|
608
|
+
dr changeset diff \u2014 show a diff of staged changes
|
|
609
|
+
dr changeset preview \u2014 preview what will be committed`), process.exit(1);
|
|
610
|
+
}), changesetGroup.command("delete <name>").description("Delete a changeset permanently").option("-f, --force", "Skip confirmation prompt").addHelpText("after", `
|
|
611
|
+
Examples:
|
|
612
|
+
$ dr changeset delete my-feature
|
|
613
|
+
$ dr changeset delete my-feature --force`).action(async (name, options) => {
|
|
614
|
+
await changesetDeleteCommand(name, options);
|
|
615
|
+
}), changesetGroup.command("staged").description("List all staged changes in the active changeset").option("-l, --layer <layer>", "Filter by layer name").addHelpText("after", `
|
|
616
|
+
Examples:
|
|
617
|
+
$ dr changeset staged
|
|
618
|
+
$ dr changeset staged --layer api`).action(async (options) => {
|
|
619
|
+
await changesetStagedCommand(options);
|
|
620
|
+
}), changesetGroup.command("stage <element-id>").description("Stage a specific element into the active changeset").addHelpText("after", `
|
|
621
|
+
Examples:
|
|
622
|
+
$ dr changeset stage api.operation.get-users
|
|
623
|
+
$ dr changeset stage ux.uicomponent.login-form`).action(async (elementId) => {
|
|
624
|
+
await changesetExplicitStageCommand(elementId);
|
|
625
|
+
}), changesetGroup.command("unstage <element-id>").description("Remove specific element from staging area").addHelpText("after", `
|
|
626
|
+
Examples:
|
|
627
|
+
$ dr changeset unstage api-endpoint-create-customer`).action(async (elementId) => {
|
|
628
|
+
await changesetUnstageCommand(elementId);
|
|
629
|
+
}), changesetGroup.command("discard [element-id]").description("Discard all or single staged changes").addHelpText("after", `
|
|
630
|
+
Examples:
|
|
631
|
+
$ dr changeset discard
|
|
632
|
+
$ dr changeset discard api-endpoint-create-customer`).action(async (elementId) => {
|
|
633
|
+
await changesetDiscardCommand(elementId);
|
|
634
|
+
}), changesetGroup.command("preview").description("Preview the merged model state with staged changes applied").option("-l, --layer <layer>", "Preview specific layer only").addHelpText("after", `
|
|
635
|
+
Examples:
|
|
636
|
+
$ dr changeset preview
|
|
637
|
+
$ dr changeset preview --layer application`).action(async (options) => {
|
|
638
|
+
await changesetPreviewCommand(options);
|
|
639
|
+
}), changesetGroup.command("diff").description("Show delta between base model and staged changes").option("-l, --layer <layer>", "Show diff for specific layer only").addHelpText("after", `
|
|
640
|
+
Examples:
|
|
641
|
+
$ dr changeset diff
|
|
642
|
+
$ dr changeset diff --layer api`).action(async (options) => {
|
|
643
|
+
await changesetDiffCommand(options);
|
|
644
|
+
}), changesetGroup.command("commit").description("Apply staged changes to the base model").option("--validate", "Run validation before commit (default: true)", !0).option("--force", "Commit despite drift warnings", !1).addHelpText("after", `
|
|
645
|
+
Examples:
|
|
646
|
+
$ dr changeset commit
|
|
647
|
+
$ dr changeset commit --validate
|
|
648
|
+
$ dr changeset commit --force`).action(async (options) => {
|
|
649
|
+
await changesetCommitCommand(options);
|
|
650
|
+
}), changesetGroup.command("export <changeset-id>").description("Export changeset to portable file").option("-o, --output <file>", "Output file path").option("-f, --format <format>", "Export format (yaml|json|patch)", "yaml").addHelpText("after", `
|
|
651
|
+
Examples:
|
|
652
|
+
$ dr changeset export api-updates
|
|
653
|
+
$ dr changeset export api-updates --output changes.yaml
|
|
654
|
+
$ dr changeset export api-updates --format json --output changes.json
|
|
655
|
+
$ dr changeset export api-updates --format patch --output changes.patch`).action(async (changesetId, options) => {
|
|
656
|
+
await changesetExportCommand(changesetId, options);
|
|
657
|
+
}), changesetGroup.command("import <file>").description("Import changeset from file").option("-f, --force", "Import despite base model drift", !1).addHelpText("after", `
|
|
658
|
+
Examples:
|
|
659
|
+
$ dr changeset import changes.yaml
|
|
660
|
+
$ dr changeset import ../team-changes.json
|
|
661
|
+
$ dr changeset import changes.yaml --force`).action(async (file, options) => {
|
|
662
|
+
await changesetImportCommand(file, options);
|
|
663
|
+
}), changesetGroup.showSuggestionAfterError();
|
|
163
664
|
}
|
|
164
665
|
export {
|
|
165
666
|
changesetActivateCommand,
|
|
166
667
|
changesetApplyCommand,
|
|
167
668
|
changesetCommands,
|
|
669
|
+
changesetCommitCommand,
|
|
168
670
|
changesetCreateCommand,
|
|
169
671
|
changesetDeactivateCommand,
|
|
672
|
+
changesetDeleteCommand,
|
|
673
|
+
changesetDiffCommand,
|
|
674
|
+
changesetDiscardCommand,
|
|
675
|
+
changesetExplicitStageCommand,
|
|
676
|
+
changesetExportCommand,
|
|
677
|
+
changesetImportCommand,
|
|
170
678
|
changesetListCommand,
|
|
679
|
+
changesetPreviewCommand,
|
|
171
680
|
changesetRevertCommand,
|
|
172
|
-
|
|
681
|
+
changesetStagedCommand,
|
|
682
|
+
changesetStatusCommand,
|
|
683
|
+
changesetUnstageCommand
|
|
173
684
|
};
|
|
174
685
|
//# sourceMappingURL=changeset.js.map
|