@documentation-robotics/cli 0.1.0 → 0.1.7
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 +208 -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 +162 -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 +42 -16
- 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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/export/audit-formatters.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Audit report formatters\n * Supports JSON and Markdown output formats for relationship and node audit reports\n */\n\nimport ansis from \"ansis\";\nimport { AuditReport, CoverageMetrics, DuplicateCandidate, GapCandidate, BalanceAssessment } from \"../audit/types.js\";\nimport type { NodeAuditReport, NodeLayerSummary, NodeDefinitionQuality, SemanticOverlapCandidate, SchemaCompletenessIssue, LayerAIReview } from \"../audit/nodes/types.js\";\nimport { escapeMarkdown } from \"./markdown-utils.js\";\nimport { formatDate } from \"../utils/date-utils.js\";\n\nexport type AuditReportFormat = \"text\" | \"json\" | \"markdown\";\n\nexport interface AuditFormatterOptions {\n format: AuditReportFormat;\n verbose?: boolean;\n}\n\n/**\n * Format audit report for output\n */\nexport function formatAuditReport(report: AuditReport, options: AuditFormatterOptions): string {\n switch (options.format) {\n case \"json\":\n return formatAuditJSON(report);\n case \"markdown\":\n return formatAuditMarkdown(report, options);\n case \"text\":\n default:\n return formatAuditText(report, options);\n }\n}\n\n/**\n * Format as JSON\n */\nfunction formatAuditJSON(report: AuditReport): string {\n return JSON.stringify(report, null, 2) + \"\\n\";\n}\n\n/**\n * Format as plain text (default)\n */\nfunction formatAuditText(report: AuditReport, options: AuditFormatterOptions): string {\n const lines: string[] = [];\n\n // Header\n lines.push(\"\");\n lines.push(ansis.bold(`\uD83D\uDD0D Relationship Audit Report: ${ansis.cyan(report.model.name)}`));\n lines.push(ansis.dim(\"=\".repeat(80)));\n lines.push(\"\");\n lines.push(`Generated: ${formatDate(report.timestamp)}`);\n lines.push(`Version: ${report.model.version}`);\n lines.push(\"\");\n\n // Executive Summary\n formatExecutiveSummaryText(lines, report);\n lines.push(\"\");\n\n // Coverage Summary\n formatCoverageTextSummary(lines, report.coverage as CoverageMetrics[]);\n lines.push(\"\");\n\n // Duplicates Summary\n formatDuplicatesTextSummary(lines, report.duplicates as DuplicateCandidate[]);\n lines.push(\"\");\n\n // Gaps Summary\n formatGapsTextSummary(lines, report.gaps as GapCandidate[]);\n lines.push(\"\");\n\n // Balance Summary\n formatBalanceTextSummary(lines, report.balance as BalanceAssessment[]);\n lines.push(\"\");\n\n // Connectivity Summary\n formatConnectivityTextSummary(lines, report.connectivity);\n lines.push(\"\");\n\n // Detailed sections (verbose mode)\n if (options.verbose) {\n formatCoverageTextDetailed(lines, report.coverage as CoverageMetrics[]);\n lines.push(\"\");\n formatDuplicatesTextDetailed(lines, report.duplicates as DuplicateCandidate[]);\n lines.push(\"\");\n formatGapsTextDetailed(lines, report.gaps as GapCandidate[]);\n lines.push(\"\");\n formatBalanceTextDetailed(lines, report.balance as BalanceAssessment[]);\n lines.push(\"\");\n formatConnectivityTextDetailed(lines, report.connectivity);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format as Markdown\n */\nfunction formatAuditMarkdown(report: AuditReport, _options: AuditFormatterOptions): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# Relationship Audit Report: ${escapeMarkdown(report.model.name)}`);\n lines.push(\"\");\n lines.push(`**Generated:** ${formatDate(report.timestamp)}`);\n lines.push(`**Version:** ${escapeMarkdown(report.model.version)}`);\n lines.push(\"\");\n\n // Table of Contents\n lines.push(\"## Contents\");\n lines.push(\"- [Executive Summary](#executive-summary)\");\n lines.push(\"- [Coverage Analysis](#coverage-analysis)\");\n lines.push(\"- [Duplicate Detection](#duplicate-detection)\");\n lines.push(\"- [Gap Analysis](#gap-analysis)\");\n lines.push(\"- [Balance Assessment](#balance-assessment)\");\n lines.push(\"- [Connectivity Analysis](#connectivity-analysis)\");\n lines.push(\"\");\n\n // Executive Summary\n formatExecutiveSummaryMarkdown(lines, report);\n lines.push(\"\");\n\n // Coverage Analysis\n formatCoverageMarkdown(lines, report.coverage as CoverageMetrics[]);\n lines.push(\"\");\n\n // Duplicate Detection\n formatDuplicatesMarkdown(lines, report.duplicates as DuplicateCandidate[]);\n lines.push(\"\");\n\n // Gap Analysis\n formatGapsMarkdown(lines, report.gaps as GapCandidate[]);\n lines.push(\"\");\n\n // Balance Assessment\n formatBalanceMarkdown(lines, report.balance as BalanceAssessment[]);\n lines.push(\"\");\n\n // Connectivity Analysis\n formatConnectivityMarkdown(lines, report.connectivity);\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format executive summary for markdown\n */\nfunction formatExecutiveSummaryMarkdown(lines: string[], report: AuditReport): void {\n lines.push(\"## Executive Summary\");\n lines.push(\"\");\n\n const totalNodeTypes = report.coverage.reduce((sum, c) => sum + c.nodeTypeCount, 0);\n const totalIntra = report.coverage.reduce((sum, c) => sum + c.relationshipCount, 0);\n const totalInter = report.coverage.reduce((sum, c) => sum + c.interLayerRelationshipCount, 0);\n const totalRelationships = totalIntra + totalInter;\n const totalIsolated = report.coverage.reduce((sum, c) => sum + c.isolatedNodeTypes.length, 0);\n const avgUtilization = report.coverage.length > 0\n ? report.coverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) / report.coverage.length\n : 0;\n\n lines.push(\"| Metric | Value |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Total Node Types | ${totalNodeTypes} |`);\n lines.push(`| Total Relationships | ${totalRelationships} (${totalIntra} intra-layer, ${totalInter} inter-layer) |`);\n lines.push(`| Isolated Node Types | ${totalIsolated} (${totalNodeTypes > 0 ? ((totalIsolated / totalNodeTypes) * 100).toFixed(1) : \"0.0\"}%) |`);\n lines.push(`| Average Predicate Utilization | ${avgUtilization.toFixed(1)}% |`);\n lines.push(`| Duplicate Candidates | ${report.duplicates.length} |`);\n lines.push(`| Gap Candidates | ${report.gaps.length} |`);\n lines.push(`| Balance Issues | ${report.balance.filter(b => b.status !== \"balanced\").length} |`);\n lines.push(`| Connected Components | ${report.connectivity.stats.connectedComponents} |`);\n lines.push(\"\");\n}\n\n/**\n * Format executive summary for text output\n */\nfunction formatExecutiveSummaryText(lines: string[], report: AuditReport): void {\n lines.push(ansis.bold.yellow(\"EXECUTIVE SUMMARY\"));\n lines.push(ansis.dim(\"\u2500\".repeat(60)));\n lines.push(\"\");\n\n const totalNodeTypes = report.coverage.reduce((sum, c) => sum + c.nodeTypeCount, 0);\n const totalIntra = report.coverage.reduce((sum, c) => sum + c.relationshipCount, 0);\n const totalInter = report.coverage.reduce((sum, c) => sum + c.interLayerRelationshipCount, 0);\n const totalRelationships = totalIntra + totalInter;\n const totalIsolated = report.coverage.reduce((sum, c) => sum + c.isolatedNodeTypes.length, 0);\n const avgUtilization = report.coverage.length > 0\n ? report.coverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) / report.coverage.length\n : 0;\n\n lines.push(ansis.bold(\"Key Metrics:\"));\n lines.push(` Total Node Types: ${totalNodeTypes}`);\n lines.push(` Total Relationships: ${totalRelationships} (${totalIntra} intra-layer, ${totalInter} inter-layer)`);\n lines.push(` Isolated Node Types: ${totalIsolated} (${totalNodeTypes > 0 ? ((totalIsolated / totalNodeTypes) * 100).toFixed(1) : \"0.0\"}%)`);\n lines.push(` Avg Predicate Utilization: ${avgUtilization.toFixed(1)}%`);\n lines.push(` Duplicate Candidates: ${report.duplicates.length}`);\n lines.push(` Gap Candidates: ${report.gaps.length}`);\n lines.push(` Balance Issues: ${report.balance.filter(b => b.status !== \"balanced\").length}`);\n lines.push(` Connected Components: ${report.connectivity.stats.connectedComponents}`);\n}\n\n/**\n * Format coverage summary for text output\n */\nfunction formatCoverageTextSummary(lines: string[], coverage: CoverageMetrics[]): void {\n lines.push(ansis.bold(\"Coverage Analysis Summary:\"));\n\n const totalNodeTypes = coverage.reduce((sum, c) => sum + c.nodeTypeCount, 0);\n const totalIntra = coverage.reduce((sum, c) => sum + c.relationshipCount, 0);\n const totalInter = coverage.reduce((sum, c) => sum + c.interLayerRelationshipCount, 0);\n const totalRelationships = totalIntra + totalInter;\n const totalIsolated = coverage.reduce((sum, c) => sum + c.isolatedNodeTypes.length, 0);\n const avgUtilization = coverage.length > 0\n ? coverage.reduce((sum, c) => sum + c.utilizationPercentage, 0) / coverage.length\n : 0;\n\n lines.push(` Total Node Types: ${totalNodeTypes}`);\n lines.push(` Total Relationships: ${totalRelationships} (${totalIntra} intra-layer, ${totalInter} inter-layer)`);\n lines.push(` Isolated Node Types: ${totalIsolated} (${totalNodeTypes > 0 ? ((totalIsolated / totalNodeTypes) * 100).toFixed(1) : \"0.0\"}%)`);\n lines.push(` Avg Predicate Utilization: ${avgUtilization.toFixed(1)}%`);\n\n // Highlight layers with zero relationships (both intra and inter must be zero)\n const zeroLayers = coverage.filter(c => c.relationshipCount === 0 && c.interLayerRelationshipCount === 0);\n if (zeroLayers.length > 0) {\n lines.push(\"\");\n lines.push(ansis.yellow(` \u26A0\uFE0F Layers with zero relationships: ${zeroLayers.map(l => l.layer).join(\", \")}`));\n }\n}\n\n/**\n * Format coverage detailed for text output\n */\nfunction formatCoverageTextDetailed(lines: string[], coverage: CoverageMetrics[]): void {\n lines.push(ansis.bold(\"Coverage Analysis (Detailed):\"));\n lines.push(\"\");\n\n for (const layer of coverage) {\n const layerTotal = layer.relationshipCount + layer.interLayerRelationshipCount;\n lines.push(ansis.bold(` ${layer.layer}:`));\n lines.push(` Node Types: ${layer.nodeTypeCount}`);\n lines.push(` Relationships: ${layerTotal} total (${layer.relationshipCount} intra-layer, ${layer.interLayerRelationshipCount} inter-layer)`);\n lines.push(` Isolated Types: ${layer.isolatedNodeTypes.length} (${layer.isolationPercentage.toFixed(1)}%)`);\n lines.push(` Predicate Usage: ${layer.usedPredicates.length}/${layer.availablePredicates.length} (${layer.utilizationPercentage.toFixed(1)}%)`);\n lines.push(` Density: ${layer.relationshipsPerNodeType.toFixed(2)} rel/type`);\n\n if (layer.standardAlignment) {\n lines.push(` Standard Alignment: ${layer.standardAlignment.standard}`);\n lines.push(` Expected: ${layer.standardAlignment.expectedRelationships}`);\n lines.push(` Missing: ${layer.standardAlignment.missingFromStandard.length}`);\n }\n\n if (layer.isolatedNodeTypes.length > 0 && layer.isolatedNodeTypes.length <= 10) {\n lines.push(` Isolated: ${layer.isolatedNodeTypes.join(\", \")}`);\n }\n lines.push(\"\");\n }\n}\n\n/**\n * Format coverage for markdown\n */\nfunction formatCoverageMarkdown(lines: string[], coverage: CoverageMetrics[]): void {\n lines.push(\"## Coverage Analysis\");\n lines.push(\"\");\n lines.push(\"### By Layer\");\n lines.push(\"\");\n lines.push(\"| Layer | Node Types | Intra-Layer | Inter-Layer | Total | Isolated | Predicate Usage | Density |\");\n lines.push(\"|-------|------------|-------------|-------------|-------|----------|-----------------|---------|\");\n\n for (const layer of coverage) {\n const layerTotal = layer.relationshipCount + layer.interLayerRelationshipCount;\n const isolated = `${layer.isolatedNodeTypes.length} (${layer.isolationPercentage.toFixed(0)}%)`;\n const predicates = `${layer.usedPredicates.length}/${layer.availablePredicates.length} (${layer.utilizationPercentage.toFixed(0)}%)`;\n const density = layer.relationshipsPerNodeType.toFixed(2);\n\n lines.push(`| ${escapeMarkdown(layer.layer)} | ${layer.nodeTypeCount} | ${layer.relationshipCount} | ${layer.interLayerRelationshipCount} | ${layerTotal} | ${isolated} | ${predicates} | ${density} |`);\n }\n lines.push(\"\");\n\n // Standard alignment details\n const alignedLayers = coverage.filter(c => c.standardAlignment);\n if (alignedLayers.length > 0) {\n lines.push(\"### Standard Alignment\");\n lines.push(\"\");\n lines.push(\"| Layer | Standard | Expected | Missing |\");\n lines.push(\"|-------|----------|----------|---------|\");\n for (const layer of alignedLayers) {\n if (layer.standardAlignment) {\n lines.push(`| ${escapeMarkdown(layer.layer)} | ${escapeMarkdown(layer.standardAlignment.standard)} | ${layer.standardAlignment.expectedRelationships} | ${layer.standardAlignment.missingFromStandard.length} |`);\n }\n }\n lines.push(\"\");\n }\n}\n\n/**\n * Format duplicates summary for text output\n */\nfunction formatDuplicatesTextSummary(lines: string[], duplicates: DuplicateCandidate[]): void {\n lines.push(ansis.bold(\"Duplicate Detection Summary:\"));\n\n const byConfidence = {\n high: duplicates.filter(d => d.confidence === \"high\").length,\n medium: duplicates.filter(d => d.confidence === \"medium\").length,\n low: duplicates.filter(d => d.confidence === \"low\").length,\n };\n\n lines.push(` Total Candidates: ${duplicates.length}`);\n lines.push(` High Confidence: ${byConfidence.high}`);\n lines.push(` Medium Confidence: ${byConfidence.medium}`);\n lines.push(` Low Confidence: ${byConfidence.low}`);\n\n if (byConfidence.high > 0) {\n lines.push(\"\");\n lines.push(ansis.yellow(` \u26A0\uFE0F ${byConfidence.high} high-confidence duplicates require review`));\n }\n}\n\n/**\n * Format duplicates detailed for text output\n */\nfunction formatDuplicatesTextDetailed(lines: string[], duplicates: DuplicateCandidate[]): void {\n lines.push(ansis.bold(\"Duplicate Detection (Detailed):\"));\n lines.push(\"\");\n\n if (duplicates.length === 0) {\n lines.push(\" No duplicate candidates detected.\");\n lines.push(\"\");\n return;\n }\n\n // Show high confidence first\n const sorted = [...duplicates].sort((a, b) => {\n const order = { high: 0, medium: 1, low: 2 };\n return order[a.confidence] - order[b.confidence];\n });\n\n for (const dup of sorted.slice(0, 20)) {\n const confidenceColor = dup.confidence === \"high\" ? ansis.red : dup.confidence === \"medium\" ? ansis.yellow : ansis.gray;\n lines.push(confidenceColor(` [${dup.confidence.toUpperCase()}] ${dup.sourceNodeType} \u2192 ${dup.destinationNodeType}`));\n lines.push(` Predicates: ${dup.predicates[0]} / ${dup.predicates[1]}`);\n lines.push(` Reason: ${dup.reason}`);\n lines.push(\"\");\n }\n\n if (duplicates.length > 20) {\n lines.push(ansis.dim(` ... and ${duplicates.length - 20} more`));\n lines.push(\"\");\n }\n}\n\n/**\n * Format duplicates for markdown\n */\nfunction formatDuplicatesMarkdown(lines: string[], duplicates: DuplicateCandidate[]): void {\n lines.push(\"## Duplicate Detection\");\n lines.push(\"\");\n\n if (duplicates.length === 0) {\n lines.push(\"No duplicate candidates detected.\");\n lines.push(\"\");\n return;\n }\n\n const byConfidence = {\n high: duplicates.filter(d => d.confidence === \"high\"),\n medium: duplicates.filter(d => d.confidence === \"medium\"),\n low: duplicates.filter(d => d.confidence === \"low\"),\n };\n\n lines.push(\"### Summary\");\n lines.push(\"\");\n lines.push(\"| Confidence | Count |\");\n lines.push(\"|------------|-------|\");\n lines.push(`| High | ${byConfidence.high.length} |`);\n lines.push(`| Medium | ${byConfidence.medium.length} |`);\n lines.push(`| Low | ${byConfidence.low.length} |`);\n lines.push(\"\");\n\n // High confidence duplicates\n if (byConfidence.high.length > 0) {\n lines.push(\"### High Confidence Duplicates\");\n lines.push(\"\");\n lines.push(\"| Source \u2192 Destination | Predicates | Reason |\");\n lines.push(\"|----------------------|------------|--------|\");\n for (const dup of byConfidence.high) {\n const route = `${escapeMarkdown(dup.sourceNodeType)} \u2192 ${escapeMarkdown(dup.destinationNodeType)}`;\n const predicates = `${escapeMarkdown(dup.predicates[0])} / ${escapeMarkdown(dup.predicates[1])}`;\n lines.push(`| ${route} | ${predicates} | ${escapeMarkdown(dup.reason)} |`);\n }\n lines.push(\"\");\n }\n\n // Medium confidence duplicates\n if (byConfidence.medium.length > 0) {\n lines.push(\"### Medium Confidence Duplicates\");\n lines.push(\"\");\n lines.push(\"| Source \u2192 Destination | Predicates | Reason |\");\n lines.push(\"|----------------------|------------|--------|\");\n for (const dup of byConfidence.medium) {\n const route = `${escapeMarkdown(dup.sourceNodeType)} \u2192 ${escapeMarkdown(dup.destinationNodeType)}`;\n const predicates = `${escapeMarkdown(dup.predicates[0])} / ${escapeMarkdown(dup.predicates[1])}`;\n lines.push(`| ${route} | ${predicates} | ${escapeMarkdown(dup.reason)} |`);\n }\n lines.push(\"\");\n }\n}\n\n/**\n * Format gaps summary for text output\n */\nfunction formatGapsTextSummary(lines: string[], gaps: GapCandidate[]): void {\n lines.push(ansis.bold(\"Gap Analysis Summary:\"));\n\n const byPriority = {\n high: gaps.filter(g => g.priority === \"high\").length,\n medium: gaps.filter(g => g.priority === \"medium\").length,\n low: gaps.filter(g => g.priority === \"low\").length,\n };\n\n lines.push(` Total Gaps: ${gaps.length}`);\n lines.push(` High Priority: ${byPriority.high}`);\n lines.push(` Medium Priority: ${byPriority.medium}`);\n lines.push(` Low Priority: ${byPriority.low}`);\n\n if (byPriority.high > 0) {\n lines.push(\"\");\n lines.push(ansis.red(` \uD83D\uDEA8 ${byPriority.high} high-priority gaps detected`));\n }\n\n if (byPriority.medium > 50) {\n lines.push(\"\");\n lines.push(ansis.yellow(` \u26A0 ${byPriority.medium} medium-priority gaps \u2014 model coverage is partially complete`));\n lines.push(ansis.dim(` Run /dr-relate to wire up architectural connections`));\n }\n}\n\n/**\n * Format gaps detailed for text output\n */\nfunction formatGapsTextDetailed(lines: string[], gaps: GapCandidate[]): void {\n lines.push(ansis.bold(\"Gap Analysis (Detailed):\"));\n lines.push(\"\");\n\n if (gaps.length === 0) {\n lines.push(\" No gaps detected.\");\n lines.push(\"\");\n return;\n }\n\n // Show high priority first\n const sorted = [...gaps].sort((a, b) => {\n const order = { high: 0, medium: 1, low: 2 };\n return order[a.priority] - order[b.priority];\n });\n\n for (const gap of sorted.slice(0, 20)) {\n const priorityColor = gap.priority === \"high\" ? ansis.red : gap.priority === \"medium\" ? ansis.yellow : ansis.gray;\n lines.push(priorityColor(` [${gap.priority.toUpperCase()}] ${gap.sourceNodeType} \u2192 ${gap.destinationNodeType}`));\n lines.push(` Suggested: ${gap.suggestedPredicate}`);\n lines.push(` Reason: ${gap.reason}`);\n if (gap.standardReference) {\n lines.push(` Reference: ${gap.standardReference}`);\n }\n lines.push(\"\");\n }\n\n if (gaps.length > 20) {\n lines.push(ansis.dim(` ... and ${gaps.length - 20} more`));\n lines.push(\"\");\n }\n}\n\n/**\n * Format gaps for markdown\n */\nfunction formatGapsMarkdown(lines: string[], gaps: GapCandidate[]): void {\n lines.push(\"## Gap Analysis\");\n lines.push(\"\");\n\n if (gaps.length === 0) {\n lines.push(\"No relationship gaps detected.\");\n lines.push(\"\");\n return;\n }\n\n const byPriority = {\n high: gaps.filter(g => g.priority === \"high\"),\n medium: gaps.filter(g => g.priority === \"medium\"),\n low: gaps.filter(g => g.priority === \"low\"),\n };\n\n lines.push(\"### Summary\");\n lines.push(\"\");\n lines.push(\"| Priority | Count |\");\n lines.push(\"|----------|-------|\");\n lines.push(`| High | ${byPriority.high.length} |`);\n lines.push(`| Medium | ${byPriority.medium.length} |`);\n lines.push(`| Low | ${byPriority.low.length} |`);\n lines.push(\"\");\n\n // High priority gaps\n if (byPriority.high.length > 0) {\n lines.push(\"### High Priority Gaps\");\n lines.push(\"\");\n lines.push(\"| Source \u2192 Destination | Suggested Predicate | Reason | Reference |\");\n lines.push(\"|----------------------|---------------------|--------|-----------|\");\n for (const gap of byPriority.high) {\n const route = `${escapeMarkdown(gap.sourceNodeType)} \u2192 ${escapeMarkdown(gap.destinationNodeType)}`;\n const predicate = escapeMarkdown(gap.suggestedPredicate);\n const reason = escapeMarkdown(gap.reason);\n const ref = gap.standardReference ? escapeMarkdown(gap.standardReference) : \"-\";\n lines.push(`| ${route} | ${predicate} | ${reason} | ${ref} |`);\n }\n lines.push(\"\");\n }\n\n // Medium priority gaps\n if (byPriority.medium.length > 0) {\n lines.push(\"### Medium Priority Gaps\");\n lines.push(\"\");\n lines.push(\"| Source \u2192 Destination | Suggested Predicate | Reason | Reference |\");\n lines.push(\"|----------------------|---------------------|--------|-----------|\");\n for (const gap of byPriority.medium) {\n const route = `${escapeMarkdown(gap.sourceNodeType)} \u2192 ${escapeMarkdown(gap.destinationNodeType)}`;\n const predicate = escapeMarkdown(gap.suggestedPredicate);\n const reason = escapeMarkdown(gap.reason);\n const ref = gap.standardReference ? escapeMarkdown(gap.standardReference) : \"-\";\n lines.push(`| ${route} | ${predicate} | ${reason} | ${ref} |`);\n }\n lines.push(\"\");\n\n if (byPriority.medium.length > 50) {\n lines.push(`> **Note:** ${byPriority.medium.length} medium-priority gaps \u2014 model coverage is partially complete. Run \\`/dr-relate\\` to wire architectural connections.`);\n lines.push(\"\");\n }\n }\n}\n\n/**\n * Format balance summary for text output\n */\nfunction formatBalanceTextSummary(lines: string[], balance: BalanceAssessment[]): void {\n lines.push(ansis.bold(\"Balance Assessment Summary:\"));\n\n const byStatus = {\n under: balance.filter(b => b.status === \"under\").length,\n balanced: balance.filter(b => b.status === \"balanced\").length,\n over: balance.filter(b => b.status === \"over\").length,\n };\n\n lines.push(` Total Assessed: ${balance.length}`);\n lines.push(` Under-connected: ${byStatus.under}`);\n lines.push(` Balanced: ${byStatus.balanced}`);\n lines.push(` Over-connected: ${byStatus.over}`);\n\n const issueCount = byStatus.under + byStatus.over;\n if (issueCount > 0) {\n lines.push(\"\");\n lines.push(ansis.yellow(` \u26A0\uFE0F ${issueCount} node types have relationship density issues`));\n }\n}\n\n/**\n * Format balance detailed for text output\n */\nfunction formatBalanceTextDetailed(lines: string[], balance: BalanceAssessment[]): void {\n lines.push(ansis.bold(\"Balance Assessment (Detailed):\"));\n lines.push(\"\");\n\n if (balance.length === 0) {\n lines.push(\" All assessed node types are balanced.\");\n lines.push(\"\");\n return;\n }\n\n // Show issues first\n const issues = balance.filter(b => b.status !== \"balanced\");\n const sorted = [...issues].sort((a, b) => {\n if (a.status === \"under\" && b.status !== \"under\") return -1;\n if (a.status !== \"under\" && b.status === \"under\") return 1;\n return 0;\n });\n\n for (const item of sorted.slice(0, 20)) {\n const statusColor = item.status === \"under\" ? ansis.red : item.status === \"over\" ? ansis.yellow : ansis.green;\n const statusLabel = item.status.toUpperCase();\n lines.push(statusColor(` [${statusLabel}] ${item.nodeType} (${item.layer})`));\n lines.push(` Category: ${item.category}`);\n lines.push(` Current: ${item.currentCount} relationships`);\n lines.push(` Target: ${item.targetRange[0]}-${item.targetRange[1]} relationships`);\n if (item.recommendation) {\n lines.push(` Advice: ${item.recommendation}`);\n }\n lines.push(\"\");\n }\n\n if (issues.length > 20) {\n lines.push(ansis.dim(` ... and ${issues.length - 20} more`));\n lines.push(\"\");\n }\n}\n\n/**\n * Format balance for markdown\n */\nfunction formatBalanceMarkdown(lines: string[], balance: BalanceAssessment[]): void {\n lines.push(\"## Balance Assessment\");\n lines.push(\"\");\n\n if (balance.length === 0) {\n lines.push(\"No balance assessments available.\");\n lines.push(\"\");\n return;\n }\n\n const byStatus = {\n under: balance.filter(b => b.status === \"under\"),\n balanced: balance.filter(b => b.status === \"balanced\"),\n over: balance.filter(b => b.status === \"over\"),\n };\n\n lines.push(\"### Summary\");\n lines.push(\"\");\n lines.push(\"| Status | Count |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Under-connected | ${byStatus.under.length} |`);\n lines.push(`| Balanced | ${byStatus.balanced.length} |`);\n lines.push(`| Over-connected | ${byStatus.over.length} |`);\n lines.push(\"\");\n\n // Under-connected types\n if (byStatus.under.length > 0) {\n lines.push(\"### Under-connected Node Types\");\n lines.push(\"\");\n lines.push(\"| Node Type | Layer | Category | Current | Target | Recommendation |\");\n lines.push(\"|-----------|-------|----------|---------|--------|----------------|\");\n for (const item of byStatus.under) {\n const target = `${item.targetRange[0]}-${item.targetRange[1]}`;\n const rec = item.recommendation ? escapeMarkdown(item.recommendation) : \"-\";\n lines.push(`| ${escapeMarkdown(item.nodeType)} | ${escapeMarkdown(item.layer)} | ${item.category} | ${item.currentCount} | ${target} | ${rec} |`);\n }\n lines.push(\"\");\n }\n\n // Over-connected types\n if (byStatus.over.length > 0) {\n lines.push(\"### Over-connected Node Types\");\n lines.push(\"\");\n lines.push(\"| Node Type | Layer | Category | Current | Target | Recommendation |\");\n lines.push(\"|-----------|-------|----------|---------|--------|----------------|\");\n for (const item of byStatus.over) {\n const target = `${item.targetRange[0]}-${item.targetRange[1]}`;\n const rec = item.recommendation ? escapeMarkdown(item.recommendation) : \"-\";\n lines.push(`| ${escapeMarkdown(item.nodeType)} | ${escapeMarkdown(item.layer)} | ${item.category} | ${item.currentCount} | ${target} | ${rec} |`);\n }\n lines.push(\"\");\n }\n}\n\n/**\n * Format connectivity summary for text output\n */\nfunction formatConnectivityTextSummary(lines: string[], connectivity: AuditReport[\"connectivity\"]): void {\n lines.push(ansis.bold(\"Connectivity Analysis Summary:\"));\n\n const stats = connectivity.stats;\n\n lines.push(` Total Nodes: ${stats.totalNodes}`);\n lines.push(` Total Edges: ${stats.totalEdges}`);\n lines.push(` Connected Components: ${stats.connectedComponents}`);\n lines.push(` Largest Component: ${stats.largestComponentSize} nodes`);\n lines.push(` Isolated Nodes: ${stats.isolatedNodes}`);\n lines.push(` Average Degree: ${stats.averageDegree.toFixed(2)}`);\n lines.push(` Transitive Chains: ${stats.transitiveChainCount}`);\n\n if (stats.connectedComponents > 1) {\n lines.push(\"\");\n lines.push(ansis.yellow(` \u26A0\uFE0F Graph is fragmented into ${stats.connectedComponents} components`));\n }\n}\n\n/**\n * Format connectivity detailed for text output\n */\nfunction formatConnectivityTextDetailed(lines: string[], connectivity: AuditReport[\"connectivity\"]): void {\n lines.push(ansis.bold(\"Connectivity Analysis (Detailed):\"));\n lines.push(\"\");\n\n // Connected components\n if (connectivity.components.length > 1) {\n lines.push(ansis.bold(\" Connected Components:\"));\n const sorted = [...connectivity.components].sort((a, b) => b.nodes.length - a.nodes.length);\n for (let i = 0; i < Math.min(5, sorted.length); i++) {\n const comp = sorted[i];\n lines.push(` Component ${i + 1}: ${comp.nodes.length} nodes`);\n if (comp.nodes.length <= 5) {\n lines.push(` ${comp.nodes.join(\", \")}`);\n }\n }\n lines.push(\"\");\n }\n\n // Top connected nodes\n if (connectivity.degrees.length > 0) {\n lines.push(ansis.bold(\" Top Connected Nodes:\"));\n const sorted = [...connectivity.degrees].sort((a, b) => b.totalDegree - a.totalDegree);\n for (const node of sorted.slice(0, 10)) {\n lines.push(` ${node.nodeType.padEnd(40)} Total: ${String(node.totalDegree).padStart(3)} (In: ${node.inDegree}, Out: ${node.outDegree})`);\n }\n lines.push(\"\");\n }\n\n // Transitive chains\n if (connectivity.transitiveChains.length > 0) {\n lines.push(ansis.bold(\" Transitive Chains:\"));\n const sorted = [...connectivity.transitiveChains].sort((a, b) => b.chain.length - a.chain.length);\n for (const chain of sorted.slice(0, 5)) {\n lines.push(` [${chain.predicate}] ${chain.chain.join(\" \u2192 \")} (${chain.chain.length} hops)`);\n }\n lines.push(\"\");\n }\n}\n\n/**\n * Format connectivity for markdown\n */\nfunction formatConnectivityMarkdown(lines: string[], connectivity: AuditReport[\"connectivity\"]): void {\n lines.push(\"## Connectivity Analysis\");\n lines.push(\"\");\n\n const stats = connectivity.stats;\n\n lines.push(\"### Summary\");\n lines.push(\"\");\n lines.push(\"| Metric | Value |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Total Nodes | ${stats.totalNodes} |`);\n lines.push(`| Total Edges | ${stats.totalEdges} |`);\n lines.push(`| Connected Components | ${stats.connectedComponents} |`);\n lines.push(`| Largest Component | ${stats.largestComponentSize} nodes |`);\n lines.push(`| Isolated Nodes | ${stats.isolatedNodes} |`);\n lines.push(`| Average Degree | ${stats.averageDegree.toFixed(2)} |`);\n lines.push(`| Transitive Chains | ${stats.transitiveChainCount} |`);\n lines.push(\"\");\n\n // Connected components\n if (connectivity.components.length > 1) {\n lines.push(\"### Connected Components\");\n lines.push(\"\");\n lines.push(\"| Component | Size | Sample Nodes |\");\n lines.push(\"|-----------|------|--------------|\");\n const sorted = [...connectivity.components].sort((a, b) => b.nodes.length - a.nodes.length);\n for (let i = 0; i < Math.min(10, sorted.length); i++) {\n const comp = sorted[i];\n const sample = comp.nodes.slice(0, 3).map(escapeMarkdown).join(\", \");\n const sampleText = comp.nodes.length > 3 ? `${sample}...` : sample;\n lines.push(`| ${i + 1} | ${comp.nodes.length} | ${sampleText} |`);\n }\n lines.push(\"\");\n }\n\n // Top connected nodes\n if (connectivity.degrees.length > 0) {\n lines.push(\"### Top Connected Nodes\");\n lines.push(\"\");\n lines.push(\"| Node Type | In-Degree | Out-Degree | Total |\");\n lines.push(\"|-----------|-----------|------------|-------|\");\n const sorted = [...connectivity.degrees].sort((a, b) => b.totalDegree - a.totalDegree);\n for (const node of sorted.slice(0, 20)) {\n lines.push(`| ${escapeMarkdown(node.nodeType)} | ${node.inDegree} | ${node.outDegree} | ${node.totalDegree} |`);\n }\n lines.push(\"\");\n }\n\n // Transitive chains\n if (connectivity.transitiveChains.length > 0) {\n lines.push(\"### Transitive Chains\");\n lines.push(\"\");\n lines.push(\"| Predicate | Chain | Length |\");\n lines.push(\"|-----------|-------|--------|\");\n const sorted = [...connectivity.transitiveChains].sort((a, b) => b.chain.length - a.chain.length);\n for (const chain of sorted.slice(0, 20)) {\n const chainStr = chain.chain.map(escapeMarkdown).join(\" \u2192 \");\n lines.push(`| ${escapeMarkdown(chain.predicate)} | ${chainStr} | ${chain.chain.length} |`);\n }\n lines.push(\"\");\n }\n}\n\n// =============================================================================\n// Node Audit Formatters\n// =============================================================================\n\n/**\n * Format a node audit report in the requested format\n */\nexport function formatNodeAuditReport(report: NodeAuditReport, options: AuditFormatterOptions): string {\n switch (options.format) {\n case \"json\":\n return JSON.stringify(report, null, 2) + \"\\n\";\n case \"markdown\":\n return formatNodeAuditMarkdown(report, options);\n default:\n return formatNodeAuditText(report, options);\n }\n}\n\n/**\n * Format node audit report as plain text\n */\nfunction formatNodeAuditText(report: NodeAuditReport, options: AuditFormatterOptions): string {\n const lines: string[] = [];\n\n // Header\n lines.push(\"\");\n lines.push(ansis.bold(`\uD83D\uDD0D Node Audit Report \u2014 Spec v${ansis.cyan(report.spec.version)}`));\n lines.push(ansis.dim(\"=\".repeat(80)));\n lines.push(\"\");\n lines.push(`Generated: ${formatDate(report.timestamp)}`);\n lines.push(`Total Node Types: ${report.spec.totalNodeTypes} | Layers: ${report.spec.totalLayers}`);\n lines.push(\"\");\n\n // Executive Summary\n formatNodeExecutiveSummaryText(lines, report);\n lines.push(\"\");\n\n // Layer summary table\n formatNodeLayerSummaryText(lines, report.layerSummaries);\n lines.push(\"\");\n\n // Definition quality issues (errors and warnings always shown)\n formatNodeDefinitionIssuesText(lines, report.definitionQuality, options.verbose ?? false);\n lines.push(\"\");\n\n // Semantic overlaps\n formatNodeOverlapsText(lines, report.overlaps);\n lines.push(\"\");\n\n // Completeness issues\n formatNodeCompletenessText(lines, report.completenessIssues);\n lines.push(\"\");\n\n // AI evaluation (when present)\n if (report.aiReviews) {\n formatNodeAIReviewsText(lines, report.aiReviews, options.verbose ?? false);\n lines.push(\"\");\n }\n\n // Verbose: per-node details\n if (options.verbose) {\n formatNodeDetailsVerboseText(lines, report.definitionQuality);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatNodeExecutiveSummaryText(lines: string[], report: NodeAuditReport): void {\n lines.push(ansis.bold.yellow(\"EXECUTIVE SUMMARY\"));\n lines.push(ansis.dim(\"\u2500\".repeat(60)));\n lines.push(\"\");\n\n const totalErrors = report.layerSummaries.reduce((s, l) => s + l.errorCount, 0);\n const totalWarnings = report.layerSummaries.reduce((s, l) => s + l.warningCount, 0);\n const totalEmpty = report.layerSummaries.reduce((s, l) => s + l.emptyDescriptionCount, 0);\n const totalGeneric = report.layerSummaries.reduce((s, l) => s + l.genericDescriptionCount, 0);\n const totalGood = report.layerSummaries.reduce((s, l) => s + l.goodDescriptionCount, 0);\n const highOverlaps = report.overlaps.filter((o) => o.confidence === \"high\").length;\n const completenessErrors = report.completenessIssues.filter((i) => i.issueType === \"missing_schema\").length;\n const avgScore = report.layerSummaries.length > 0\n ? report.layerSummaries.reduce((s, l) => s + l.avgQualityScore, 0) / report.layerSummaries.length\n : 0;\n\n lines.push(ansis.bold(\"Key Metrics:\"));\n lines.push(` Total Node Types: ${report.spec.totalNodeTypes}`);\n lines.push(` Avg Quality Score: ${avgScore.toFixed(1)}/100`);\n lines.push(` Empty Descriptions: ${totalEmpty}`);\n lines.push(` Generic Descriptions: ${totalGeneric}`);\n lines.push(` Good Descriptions: ${totalGood}`);\n lines.push(` Definition Errors: ${totalErrors}`);\n lines.push(` Definition Warnings: ${totalWarnings}`);\n lines.push(` Semantic Overlaps: ${report.overlaps.length} (${highOverlaps} high-confidence)`);\n lines.push(` Completeness Issues: ${report.completenessIssues.length} (${completenessErrors} missing schemas)`);\n}\n\nfunction formatNodeLayerSummaryText(lines: string[], summaries: NodeLayerSummary[]): void {\n lines.push(ansis.bold(\"Layer Summary:\"));\n lines.push(\"\");\n\n const header = [\n \"Layer\".padEnd(14),\n \"Types\".padStart(6),\n \"Avg Score\".padStart(10),\n \"Empty\".padStart(6),\n \"Generic\".padStart(8),\n \"Good\".padStart(6),\n \"Errors\".padStart(7),\n \"Warns\".padStart(6),\n ].join(\" \");\n lines.push(\" \" + ansis.dim(header));\n lines.push(\" \" + ansis.dim(\"\u2500\".repeat(header.length)));\n\n for (const s of summaries) {\n const scoreColor = s.avgQualityScore >= 80\n ? ansis.green\n : s.avgQualityScore >= 60\n ? ansis.yellow\n : ansis.red;\n\n // Pad the plain value first, then apply color so ANSI escape sequences\n // don't inflate the string length and break column alignment.\n const scoreStr = s.avgQualityScore.toFixed(1).padStart(10);\n const emptyStr = String(s.emptyDescriptionCount).padStart(6);\n const errorStr = String(s.errorCount).padStart(7);\n const warnStr = String(s.warningCount).padStart(6);\n\n const row = [\n s.layerId.padEnd(14),\n String(s.totalNodeTypes).padStart(6),\n scoreColor(scoreStr),\n s.emptyDescriptionCount > 0 ? ansis.red(emptyStr) : emptyStr,\n String(s.genericDescriptionCount).padStart(8),\n String(s.goodDescriptionCount).padStart(6),\n s.errorCount > 0 ? ansis.red(errorStr) : errorStr,\n s.warningCount > 0 ? ansis.yellow(warnStr) : warnStr,\n ].join(\" \");\n lines.push(\" \" + row);\n }\n}\n\nfunction formatNodeDefinitionIssuesText(\n lines: string[],\n quality: NodeDefinitionQuality[],\n verbose: boolean\n): void {\n const allIssues = quality.flatMap((q) =>\n q.issues.map((issue) => ({ ...issue, specNodeId: q.specNodeId }))\n );\n\n const errors = allIssues.filter((i) => i.severity === \"error\");\n const warnings = allIssues.filter((i) => i.severity === \"warning\");\n const infos = allIssues.filter((i) => i.severity === \"info\");\n\n lines.push(ansis.bold(\"Definition Quality Issues:\"));\n lines.push(` Errors: ${errors.length} Warnings: ${warnings.length} Info: ${infos.length}`);\n\n if (errors.length > 0) {\n lines.push(\"\");\n lines.push(ansis.red.bold(\" Errors:\"));\n for (const issue of errors.slice(0, 20)) {\n lines.push(ansis.red(` [ERROR] ${issue.message}`));\n }\n if (errors.length > 20) {\n lines.push(ansis.dim(` ... and ${errors.length - 20} more`));\n }\n }\n\n if (warnings.length > 0) {\n lines.push(\"\");\n lines.push(ansis.yellow.bold(\" Warnings:\"));\n const shown = verbose ? warnings : warnings.slice(0, 10);\n for (const issue of shown) {\n lines.push(ansis.yellow(` [WARN] ${issue.message}`));\n }\n if (!verbose && warnings.length > 10) {\n lines.push(ansis.dim(` ... and ${warnings.length - 10} more (use --verbose to see all)`));\n }\n }\n\n if (verbose && infos.length > 0) {\n lines.push(\"\");\n lines.push(ansis.dim.bold(\" Info:\"));\n for (const issue of infos) {\n lines.push(ansis.dim(` [INFO] ${issue.message}`));\n }\n }\n}\n\nfunction formatNodeOverlapsText(lines: string[], overlaps: SemanticOverlapCandidate[]): void {\n lines.push(ansis.bold(\"Semantic Overlap Detection:\"));\n\n const high = overlaps.filter((o) => o.confidence === \"high\");\n const medium = overlaps.filter((o) => o.confidence === \"medium\");\n const low = overlaps.filter((o) => o.confidence === \"low\");\n\n lines.push(` Total Candidates: ${overlaps.length} (High: ${high.length}, Medium: ${medium.length}, Low: ${low.length})`);\n\n if (high.length > 0) {\n lines.push(\"\");\n lines.push(ansis.yellow(\" High-confidence overlaps:\"));\n for (const o of high.slice(0, 10)) {\n lines.push(ansis.yellow(` ${o.nodeTypeA} \u2194 ${o.nodeTypeB}`));\n lines.push(ansis.dim(` ${o.reason}`));\n }\n if (high.length > 10) {\n lines.push(ansis.dim(` ... and ${high.length - 10} more`));\n }\n }\n}\n\nfunction formatNodeCompletenessText(lines: string[], issues: SchemaCompletenessIssue[]): void {\n lines.push(ansis.bold(\"Schema Completeness:\"));\n\n if (issues.length === 0) {\n lines.push(ansis.green(\" \u2713 All schema files match layer.json declarations \u2014 no issues found.\"));\n return;\n }\n\n const missing = issues.filter((i) => i.issueType === \"missing_schema\");\n const orphaned = issues.filter((i) => i.issueType === \"orphaned_schema\");\n\n lines.push(` Issues: ${issues.length} (Missing: ${missing.length}, Orphaned: ${orphaned.length})`);\n\n for (const issue of issues.slice(0, 20)) {\n const label = issue.issueType === \"missing_schema\" ? ansis.red(\"[MISSING]\") : ansis.yellow(\"[ORPHANED]\");\n lines.push(` ${label} ${issue.detail}`);\n }\n if (issues.length > 20) {\n lines.push(ansis.dim(` ... and ${issues.length - 20} more`));\n }\n}\n\nfunction formatNodeDetailsVerboseText(lines: string[], quality: NodeDefinitionQuality[]): void {\n lines.push(ansis.bold(\"Per-Node Details (verbose):\"));\n lines.push(\"\");\n\n // Group by layer\n const byLayer = new Map<string, NodeDefinitionQuality[]>();\n for (const q of quality) {\n const group = byLayer.get(q.layerId) ?? [];\n group.push(q);\n byLayer.set(q.layerId, group);\n }\n\n for (const [layerId, layerQuality] of byLayer) {\n lines.push(ansis.bold(` ${layerId}:`));\n for (const q of layerQuality) {\n const scoreColor = q.score >= 80 ? ansis.green : q.score >= 60 ? ansis.yellow : ansis.red;\n lines.push(` ${q.specNodeId.padEnd(45)} ${scoreColor(`${q.score}/100`)}`);\n }\n lines.push(\"\");\n }\n}\n\nfunction formatNodeAIReviewsText(lines: string[], reviews: LayerAIReview[], verbose: boolean): void {\n lines.push(ansis.bold(\"AI Evaluation:\"));\n lines.push(ansis.dim(\"\u2500\".repeat(60)));\n lines.push(\"\");\n\n // Summary table header\n const header = [\n \"Layer\".padEnd(14),\n \"Alignment\".padStart(10),\n \"Documentation\".padStart(14),\n \"Nodes\".padStart(6),\n ].join(\" \");\n lines.push(\" \" + ansis.dim(header));\n lines.push(\" \" + ansis.dim(\"\u2500\".repeat(header.length)));\n\n for (const review of reviews) {\n const alignColor = review.avgAlignmentScore >= 70 ? ansis.green : review.avgAlignmentScore >= 50 ? ansis.yellow : ansis.red;\n const docColor = review.avgDocumentationScore >= 65 ? ansis.green : review.avgDocumentationScore >= 45 ? ansis.yellow : ansis.red;\n\n const row = [\n review.layerId.padEnd(14),\n alignColor(review.avgAlignmentScore.toFixed(1).padStart(10)),\n docColor(review.avgDocumentationScore.toFixed(1).padStart(14)),\n String(review.nodeEvaluations.length).padStart(6),\n ].join(\" \");\n lines.push(\" \" + row);\n }\n\n // Verbose: per-node scores and suggestions\n if (verbose) {\n lines.push(\"\");\n lines.push(ansis.bold(\" Per-node AI details:\"));\n for (const review of reviews) {\n lines.push(\"\");\n lines.push(ansis.bold(` ${review.layerId} (${review.standard}):`));\n for (const ev of review.nodeEvaluations) {\n const alignColor = ev.alignmentScore >= 70 ? ansis.green : ev.alignmentScore >= 50 ? ansis.yellow : ansis.red;\n const docColor = ev.documentationScore >= 65 ? ansis.green : ev.documentationScore >= 45 ? ansis.yellow : ansis.red;\n lines.push(\n ` ${ev.specNodeId.padEnd(45)} align: ${alignColor(String(ev.alignmentScore).padStart(3))} doc: ${docColor(String(ev.documentationScore).padStart(3))}`\n );\n if (ev.suggestions.length > 0) {\n for (const s of ev.suggestions) {\n lines.push(ansis.dim(` \u2192 ${s}`));\n }\n }\n }\n }\n }\n}\n\nfunction formatNodeAIReviewsMarkdown(lines: string[], reviews: LayerAIReview[]): void {\n lines.push(\"## AI Evaluation\");\n lines.push(\"\");\n lines.push(\"### Summary by Layer\");\n lines.push(\"\");\n lines.push(\"| Layer | Standard | Alignment | Documentation | Nodes |\");\n lines.push(\"|-------|----------|-----------|---------------|-------|\");\n for (const review of reviews) {\n lines.push(\n `| ${escapeMarkdown(review.layerId)} | ${escapeMarkdown(review.standard)} | ${review.avgAlignmentScore.toFixed(1)} | ${review.avgDocumentationScore.toFixed(1)} | ${review.nodeEvaluations.length} |`\n );\n }\n lines.push(\"\");\n\n for (const review of reviews) {\n if (review.nodeEvaluations.length === 0) continue;\n lines.push(`### ${escapeMarkdown(review.layerId)} \u2014 ${escapeMarkdown(review.standard)}`);\n lines.push(\"\");\n lines.push(\"| Node Type | Alignment | Alignment Reasoning | Documentation | Doc Reasoning | Suggestions |\");\n lines.push(\"|-----------|-----------|---------------------|---------------|---------------|-------------|\");\n for (const ev of review.nodeEvaluations) {\n const suggestions = ev.suggestions.length > 0\n ? ev.suggestions.map(escapeMarkdown).join(\"; \")\n : \"-\";\n lines.push(\n `| ${escapeMarkdown(ev.specNodeId)} | ${ev.alignmentScore} | ${escapeMarkdown(ev.alignmentReasoning)} | ${ev.documentationScore} | ${escapeMarkdown(ev.documentationReasoning)} | ${suggestions} |`\n );\n }\n lines.push(\"\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Node Audit \u2014 Markdown formatter\n// ---------------------------------------------------------------------------\n\nfunction formatNodeAuditMarkdown(report: NodeAuditReport, _options: AuditFormatterOptions): string {\n const lines: string[] = [];\n\n lines.push(`# Node Audit Report \u2014 Spec v${escapeMarkdown(report.spec.version)}`);\n lines.push(\"\");\n lines.push(`**Generated:** ${formatDate(report.timestamp)}`);\n lines.push(`**Total Node Types:** ${report.spec.totalNodeTypes} | **Layers:** ${report.spec.totalLayers}`);\n lines.push(\"\");\n\n // TOC\n lines.push(\"## Contents\");\n lines.push(\"- [Executive Summary](#executive-summary)\");\n lines.push(\"- [Layer Summary](#layer-summary)\");\n lines.push(\"- [Definition Quality Issues](#definition-quality-issues)\");\n lines.push(\"- [Semantic Overlaps](#semantic-overlaps)\");\n lines.push(\"- [Schema Completeness](#schema-completeness)\");\n if (report.aiReviews) {\n lines.push(\"- [AI Evaluation](#ai-evaluation)\");\n }\n lines.push(\"\");\n\n // Executive Summary\n lines.push(\"## Executive Summary\");\n lines.push(\"\");\n const totalErrors = report.layerSummaries.reduce((s, l) => s + l.errorCount, 0);\n const totalWarnings = report.layerSummaries.reduce((s, l) => s + l.warningCount, 0);\n const totalEmpty = report.layerSummaries.reduce((s, l) => s + l.emptyDescriptionCount, 0);\n const totalGeneric = report.layerSummaries.reduce((s, l) => s + l.genericDescriptionCount, 0);\n const avgScore = report.layerSummaries.length > 0\n ? report.layerSummaries.reduce((s, l) => s + l.avgQualityScore, 0) / report.layerSummaries.length\n : 0;\n const highOverlaps = report.overlaps.filter((o) => o.confidence === \"high\").length;\n\n lines.push(\"| Metric | Value |\");\n lines.push(\"|--------|-------|\");\n lines.push(`| Total Node Types | ${report.spec.totalNodeTypes} |`);\n lines.push(`| Avg Quality Score | ${avgScore.toFixed(1)}/100 |`);\n lines.push(`| Empty Descriptions | ${totalEmpty} |`);\n lines.push(`| Generic Descriptions | ${totalGeneric} |`);\n lines.push(`| Definition Errors | ${totalErrors} |`);\n lines.push(`| Definition Warnings | ${totalWarnings} |`);\n lines.push(`| Semantic Overlaps | ${report.overlaps.length} (${highOverlaps} high) |`);\n lines.push(`| Completeness Issues | ${report.completenessIssues.length} |`);\n lines.push(\"\");\n\n // Layer Summary\n lines.push(\"## Layer Summary\");\n lines.push(\"\");\n lines.push(\"| Layer | Types | Avg Score | Empty | Generic | Good | Errors | Warnings |\");\n lines.push(\"|-------|-------|-----------|-------|---------|------|--------|----------|\");\n for (const s of report.layerSummaries) {\n lines.push(\n `| ${escapeMarkdown(s.layerId)} | ${s.totalNodeTypes} | ${s.avgQualityScore.toFixed(1)} | ${s.emptyDescriptionCount} | ${s.genericDescriptionCount} | ${s.goodDescriptionCount} | ${s.errorCount} | ${s.warningCount} |`\n );\n }\n lines.push(\"\");\n\n // Definition Quality Issues\n lines.push(\"## Definition Quality Issues\");\n lines.push(\"\");\n const allIssues = report.definitionQuality.flatMap((q) =>\n q.issues.map((issue) => ({ ...issue, specNodeId: q.specNodeId, layerId: q.layerId }))\n );\n\n const errors = allIssues.filter((i) => i.severity === \"error\");\n const warnings = allIssues.filter((i) => i.severity === \"warning\");\n\n if (errors.length === 0 && warnings.length === 0) {\n lines.push(\"No definition quality issues found.\");\n } else {\n if (errors.length > 0) {\n lines.push(\"### Errors\");\n lines.push(\"\");\n lines.push(\"| Node Type | Issue |\");\n lines.push(\"|-----------|-------|\");\n for (const issue of errors) {\n lines.push(`| ${escapeMarkdown(issue.specNodeId)} | ${escapeMarkdown(issue.message)} |`);\n }\n lines.push(\"\");\n }\n if (warnings.length > 0) {\n lines.push(\"### Warnings\");\n lines.push(\"\");\n lines.push(\"| Node Type | Issue |\");\n lines.push(\"|-----------|-------|\");\n for (const issue of warnings.slice(0, 50)) {\n lines.push(`| ${escapeMarkdown(issue.specNodeId)} | ${escapeMarkdown(issue.message)} |`);\n }\n if (warnings.length > 50) {\n lines.push(\"\");\n lines.push(`*... and ${warnings.length - 50} more warnings*`);\n }\n lines.push(\"\");\n }\n }\n\n // Semantic Overlaps\n lines.push(\"## Semantic Overlaps\");\n lines.push(\"\");\n if (report.overlaps.length === 0) {\n lines.push(\"No semantic overlap candidates detected.\");\n } else {\n lines.push(\"| Node Type A | Node Type B | Layer | Confidence | Type | Reason |\");\n lines.push(\"|-------------|-------------|-------|------------|------|--------|\");\n for (const o of report.overlaps) {\n lines.push(\n `| ${escapeMarkdown(o.nodeTypeA)} | ${escapeMarkdown(o.nodeTypeB)} | ${escapeMarkdown(o.layerId)} | ${o.confidence} | ${o.overlapType} | ${escapeMarkdown(o.reason)} |`\n );\n }\n }\n lines.push(\"\");\n\n // Schema Completeness\n lines.push(\"## Schema Completeness\");\n lines.push(\"\");\n if (report.completenessIssues.length === 0) {\n lines.push(\"\u2713 All schema files match layer.json declarations.\");\n } else {\n lines.push(\"| Layer | Node Type | Issue | Detail |\");\n lines.push(\"|-------|-----------|-------|--------|\");\n for (const issue of report.completenessIssues) {\n lines.push(\n `| ${escapeMarkdown(issue.layerId)} | ${escapeMarkdown(issue.specNodeId)} | ${issue.issueType} | ${escapeMarkdown(issue.detail)} |`\n );\n }\n }\n lines.push(\"\");\n\n // AI Evaluation\n if (report.aiReviews) {\n formatNodeAIReviewsMarkdown(lines, report.aiReviews);\n }\n\n return lines.join(\"\\n\");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import ansis from "ansis";
|
|
2
|
+
import { formatDate } from "../utils/date-utils.js";
|
|
3
|
+
function formatDifferentialAnalysis(analysis, options) {
|
|
4
|
+
switch (options.format) {
|
|
5
|
+
case "json":
|
|
6
|
+
return formatJson(analysis);
|
|
7
|
+
case "markdown":
|
|
8
|
+
return formatMarkdown(analysis, options);
|
|
9
|
+
case "text":
|
|
10
|
+
default:
|
|
11
|
+
return formatText(analysis, options);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function formatJson(analysis) {
|
|
15
|
+
const coverageByLayer = {};
|
|
16
|
+
analysis.detailed.coverageByLayer.forEach((value, key) => {
|
|
17
|
+
coverageByLayer[key] = value;
|
|
18
|
+
});
|
|
19
|
+
const jsonOutput = {
|
|
20
|
+
summary: analysis.summary,
|
|
21
|
+
detailed: {
|
|
22
|
+
coverageByLayer,
|
|
23
|
+
gapChanges: analysis.detailed.gapChanges,
|
|
24
|
+
duplicateChanges: analysis.detailed.duplicateChanges,
|
|
25
|
+
balanceChanges: analysis.detailed.balanceChanges,
|
|
26
|
+
connectivityChanges: analysis.detailed.connectivityChanges
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
return JSON.stringify(jsonOutput, null, 2);
|
|
30
|
+
}
|
|
31
|
+
function formatText(analysis, options) {
|
|
32
|
+
const lines = [];
|
|
33
|
+
lines.push(ansis.bold.cyan(`
|
|
34
|
+
\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550`)), lines.push(ansis.bold.cyan(" AUDIT DIFFERENTIAL ANALYSIS")), lines.push(ansis.bold.cyan("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550")), lines.push(""), lines.push(ansis.bold("Comparison Period:")), lines.push(` Before: ${ansis.dim(formatDate(options.beforeTimestamp))}`), lines.push(` After: ${ansis.dim(formatDate(options.afterTimestamp))}`), lines.push(""), lines.push(ansis.bold.yellow("EXECUTIVE SUMMARY")), lines.push(ansis.dim("\u2500".repeat(60)));
|
|
35
|
+
const { summary } = analysis;
|
|
36
|
+
if (lines.push(""), lines.push(ansis.bold("Overall Changes:")), summary.relationshipsAdded > 0 && lines.push(` ${ansis.green("+")} ${ansis.bold(summary.relationshipsAdded)} relationships added`), summary.gapsResolved > 0 && lines.push(` ${ansis.green("\u2713")} ${ansis.bold(summary.gapsResolved)} gaps resolved`), summary.duplicatesResolved > 0 && lines.push(` ${ansis.green("\u2713")} ${ansis.bold(summary.duplicatesResolved)} duplicates eliminated`), summary.remainingGaps > 0 && lines.push(` ${ansis.yellow("!")} ${ansis.bold(summary.remainingGaps)} gaps remaining`), summary.balanceImprovements.length > 0) {
|
|
37
|
+
lines.push(""), lines.push(ansis.bold("Balance Improvements:"));
|
|
38
|
+
for (const improvement of summary.balanceImprovements)
|
|
39
|
+
lines.push(` ${ansis.green("\u2713")} ${improvement}`);
|
|
40
|
+
}
|
|
41
|
+
lines.push(""), lines.push(ansis.bold.yellow("COVERAGE CHANGES BY LAYER")), lines.push(ansis.dim("\u2500".repeat(60)));
|
|
42
|
+
for (const change of summary.coverageChanges) {
|
|
43
|
+
lines.push(""), lines.push(ansis.bold(`Layer: ${change.layer}`));
|
|
44
|
+
const isolationDelta = change.delta.isolation, isolationSymbol = isolationDelta < 0 ? ansis.green("\u2193") : isolationDelta > 0 ? ansis.red("\u2191") : ansis.dim("="), isolationColor = isolationDelta < 0 ? ansis.green : isolationDelta > 0 ? ansis.red : ansis.dim;
|
|
45
|
+
lines.push(` Isolation: ${change.before.isolation.toFixed(1)}% \u2192 ${change.after.isolation.toFixed(1)}% ${isolationSymbol} ${isolationColor(Math.abs(isolationDelta).toFixed(1) + "%")}`);
|
|
46
|
+
const densityDelta = change.delta.density, densitySymbol = densityDelta > 0 ? ansis.green("\u2191") : densityDelta < 0 ? ansis.red("\u2193") : ansis.dim("="), densityColor = densityDelta > 0 ? ansis.green : densityDelta < 0 ? ansis.red : ansis.dim;
|
|
47
|
+
lines.push(` Density: ${change.before.density.toFixed(2)} \u2192 ${change.after.density.toFixed(2)} ${densitySymbol} ${densityColor(Math.abs(densityDelta).toFixed(2))}`);
|
|
48
|
+
}
|
|
49
|
+
if (options.verbose) {
|
|
50
|
+
lines.push(""), lines.push(ansis.bold.yellow("DETAILED ANALYSIS")), lines.push(ansis.dim("\u2500".repeat(60)));
|
|
51
|
+
const { gapChanges } = analysis.detailed;
|
|
52
|
+
if (lines.push(""), lines.push(ansis.bold("Gap Analysis:")), lines.push(` Total before: ${gapChanges.before.length}`), lines.push(` Total after: ${gapChanges.after.length}`), lines.push(` ${ansis.green("Resolved:")} ${gapChanges.resolved.length} (${gapChanges.resolutionRate.toFixed(1)}%)`), lines.push(` ${ansis.yellow("New gaps:")} ${gapChanges.newGaps.length}`), lines.push(` ${ansis.dim("Persistent:")} ${gapChanges.persistent.length}`), gapChanges.resolved.length > 0) {
|
|
53
|
+
lines.push(""), lines.push(ansis.dim(" Resolved gaps (sample):"));
|
|
54
|
+
for (const gap of gapChanges.resolved.slice(0, 5))
|
|
55
|
+
lines.push(ansis.dim(` \u2022 ${gap.sourceNodeType} \u2192 ${gap.destinationNodeType} [${gap.suggestedPredicate}]`));
|
|
56
|
+
gapChanges.resolved.length > 5 && lines.push(ansis.dim(` ... and ${gapChanges.resolved.length - 5} more`));
|
|
57
|
+
}
|
|
58
|
+
const { duplicateChanges } = analysis.detailed;
|
|
59
|
+
lines.push(""), lines.push(ansis.bold("Duplicate Analysis:")), lines.push(` Total before: ${duplicateChanges.before.length}`), lines.push(` Total after: ${duplicateChanges.after.length}`), lines.push(` ${ansis.green("Resolved:")} ${duplicateChanges.resolved.length} (${duplicateChanges.eliminationRate.toFixed(1)}%)`), lines.push(` ${ansis.yellow("New:")} ${duplicateChanges.newDuplicates.length}`), lines.push(` ${ansis.dim("Persistent:")} ${duplicateChanges.persistent.length}`);
|
|
60
|
+
const { balanceChanges } = analysis.detailed;
|
|
61
|
+
lines.push(""), lines.push(ansis.bold("Balance Analysis:")), lines.push(` Improvements: ${balanceChanges.improvements.length}`), lines.push(` Regressions: ${balanceChanges.regressions.length}`), lines.push(` Newly balanced: ${balanceChanges.newlyBalanced.length}`);
|
|
62
|
+
const { connectivityChanges } = analysis.detailed;
|
|
63
|
+
lines.push(""), lines.push(ansis.bold("Connectivity Analysis:")), lines.push(` Components: ${connectivityChanges.before.componentCount} \u2192 ${connectivityChanges.after.componentCount} (${connectivityChanges.deltas.componentChange >= 0 ? "+" : ""}${connectivityChanges.deltas.componentChange})`), lines.push(` Isolated nodes: ${connectivityChanges.before.isolatedNodes} \u2192 ${connectivityChanges.after.isolatedNodes} (${connectivityChanges.deltas.isolationChange >= 0 ? "+" : ""}${connectivityChanges.deltas.isolationChange})`), lines.push(` Avg degree: ${connectivityChanges.before.averageDegree.toFixed(2)} \u2192 ${connectivityChanges.after.averageDegree.toFixed(2)} (${connectivityChanges.deltas.degreeChange >= 0 ? "+" : ""}${connectivityChanges.deltas.degreeChange.toFixed(2)})`);
|
|
64
|
+
}
|
|
65
|
+
return lines.push(""), lines.push(ansis.dim("\u2500".repeat(60))), lines.join(`
|
|
66
|
+
`);
|
|
67
|
+
}
|
|
68
|
+
function formatMarkdown(analysis, options) {
|
|
69
|
+
const lines = [];
|
|
70
|
+
lines.push("# Audit Differential Analysis"), lines.push(""), lines.push("## Comparison Period"), lines.push(""), lines.push(`- **Before:** ${formatDate(options.beforeTimestamp)}`), lines.push(`- **After:** ${formatDate(options.afterTimestamp)}`), lines.push(""), lines.push("## Executive Summary"), lines.push("");
|
|
71
|
+
const { summary } = analysis;
|
|
72
|
+
if (lines.push("### Overall Changes"), lines.push(""), lines.push(`- \u2705 **${summary.relationshipsAdded}** relationships added`), lines.push(`- \u2705 **${summary.gapsResolved}** gaps resolved`), lines.push(`- \u2705 **${summary.duplicatesResolved}** duplicates eliminated`), lines.push(`- \u26A0\uFE0F **${summary.remainingGaps}** gaps remaining`), summary.balanceImprovements.length > 0) {
|
|
73
|
+
lines.push(""), lines.push("### Balance Improvements"), lines.push("");
|
|
74
|
+
for (const improvement of summary.balanceImprovements)
|
|
75
|
+
lines.push(`- ${improvement}`);
|
|
76
|
+
}
|
|
77
|
+
lines.push(""), lines.push("## Coverage Changes by Layer"), lines.push(""), lines.push("| Layer | Isolation Before | Isolation After | \u0394 | Density Before | Density After | \u0394 |"), lines.push("|-------|------------------|-----------------|---|----------------|---------------|---|");
|
|
78
|
+
for (const change of summary.coverageChanges) {
|
|
79
|
+
const isolationDelta = change.delta.isolation >= 0 ? `+${change.delta.isolation.toFixed(1)}%` : `${change.delta.isolation.toFixed(1)}%`, densityDelta = change.delta.density >= 0 ? `+${change.delta.density.toFixed(2)}` : `${change.delta.density.toFixed(2)}`;
|
|
80
|
+
lines.push(`| ${change.layer} | ${change.before.isolation.toFixed(1)}% | ${change.after.isolation.toFixed(1)}% | ${isolationDelta} | ${change.before.density.toFixed(2)} | ${change.after.density.toFixed(2)} | ${densityDelta} |`);
|
|
81
|
+
}
|
|
82
|
+
if (options.verbose) {
|
|
83
|
+
lines.push(""), lines.push("## Detailed Analysis");
|
|
84
|
+
const { gapChanges } = analysis.detailed;
|
|
85
|
+
lines.push(""), lines.push("### Gap Analysis"), lines.push(""), lines.push(`- **Total before:** ${gapChanges.before.length}`), lines.push(`- **Total after:** ${gapChanges.after.length}`), lines.push(`- **Resolved:** ${gapChanges.resolved.length} (${gapChanges.resolutionRate.toFixed(1)}%)`), lines.push(`- **New gaps:** ${gapChanges.newGaps.length}`), lines.push(`- **Persistent:** ${gapChanges.persistent.length}`);
|
|
86
|
+
const { duplicateChanges } = analysis.detailed;
|
|
87
|
+
lines.push(""), lines.push("### Duplicate Analysis"), lines.push(""), lines.push(`- **Total before:** ${duplicateChanges.before.length}`), lines.push(`- **Total after:** ${duplicateChanges.after.length}`), lines.push(`- **Resolved:** ${duplicateChanges.resolved.length} (${duplicateChanges.eliminationRate.toFixed(1)}%)`), lines.push(`- **New duplicates:** ${duplicateChanges.newDuplicates.length}`), lines.push(`- **Persistent:** ${duplicateChanges.persistent.length}`);
|
|
88
|
+
const { balanceChanges } = analysis.detailed;
|
|
89
|
+
lines.push(""), lines.push("### Balance Analysis"), lines.push(""), lines.push(`- **Improvements:** ${balanceChanges.improvements.length}`), lines.push(`- **Regressions:** ${balanceChanges.regressions.length}`), lines.push(`- **Newly balanced:** ${balanceChanges.newlyBalanced.length}`);
|
|
90
|
+
const { connectivityChanges } = analysis.detailed;
|
|
91
|
+
lines.push(""), lines.push("### Connectivity Analysis"), lines.push(""), lines.push(`- **Components:** ${connectivityChanges.before.componentCount} \u2192 ${connectivityChanges.after.componentCount} (${connectivityChanges.deltas.componentChange >= 0 ? "+" : ""}${connectivityChanges.deltas.componentChange})`), lines.push(`- **Isolated nodes:** ${connectivityChanges.before.isolatedNodes} \u2192 ${connectivityChanges.after.isolatedNodes} (${connectivityChanges.deltas.isolationChange >= 0 ? "+" : ""}${connectivityChanges.deltas.isolationChange})`), lines.push(`- **Average degree:** ${connectivityChanges.before.averageDegree.toFixed(2)} \u2192 ${connectivityChanges.after.averageDegree.toFixed(2)} (${connectivityChanges.deltas.degreeChange >= 0 ? "+" : ""}${connectivityChanges.deltas.degreeChange.toFixed(2)})`);
|
|
92
|
+
}
|
|
93
|
+
return lines.push(""), lines.join(`
|
|
94
|
+
`);
|
|
95
|
+
}
|
|
96
|
+
export {
|
|
97
|
+
formatDifferentialAnalysis
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=diff-formatters.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/export/diff-formatters.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Formatters for differential audit analysis\n *\n * Provides text, JSON, and markdown output for before/after comparisons\n */\n\nimport ansis from \"ansis\";\nimport { DifferentialAnalysis } from \"../audit/differential-analyzer.js\";\nimport { formatDate } from \"../utils/date-utils.js\";\n\nexport interface DiffFormatterOptions {\n format: \"text\" | \"json\" | \"markdown\";\n verbose: boolean;\n beforeTimestamp: string;\n afterTimestamp: string;\n}\n\n/**\n * Format differential analysis with specified format\n */\nexport function formatDifferentialAnalysis(\n analysis: DifferentialAnalysis,\n options: DiffFormatterOptions,\n): string {\n switch (options.format) {\n case \"json\":\n return formatJson(analysis);\n case \"markdown\":\n return formatMarkdown(analysis, options);\n case \"text\":\n default:\n return formatText(analysis, options);\n }\n}\n\n/**\n * Format as JSON\n */\nfunction formatJson(analysis: DifferentialAnalysis): string {\n // Convert Map to object for JSON serialization\n const coverageByLayer: Record<string, unknown> = {};\n analysis.detailed.coverageByLayer.forEach((value, key) => {\n coverageByLayer[key] = value;\n });\n\n const jsonOutput = {\n summary: analysis.summary,\n detailed: {\n coverageByLayer,\n gapChanges: analysis.detailed.gapChanges,\n duplicateChanges: analysis.detailed.duplicateChanges,\n balanceChanges: analysis.detailed.balanceChanges,\n connectivityChanges: analysis.detailed.connectivityChanges,\n },\n };\n\n return JSON.stringify(jsonOutput, null, 2);\n}\n\n/**\n * Format as text with ANSI colors\n */\nfunction formatText(\n analysis: DifferentialAnalysis,\n options: DiffFormatterOptions,\n): string {\n const lines: string[] = [];\n\n // Header\n lines.push(ansis.bold.cyan(\"\\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\"));\n lines.push(ansis.bold.cyan(\" AUDIT DIFFERENTIAL ANALYSIS\"));\n lines.push(ansis.bold.cyan(\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\"));\n\n // Comparison period\n lines.push(\"\");\n lines.push(ansis.bold(\"Comparison Period:\"));\n lines.push(\n ` Before: ${ansis.dim(formatDate(options.beforeTimestamp))}`,\n );\n lines.push(\n ` After: ${ansis.dim(formatDate(options.afterTimestamp))}`,\n );\n\n // Executive Summary\n lines.push(\"\");\n lines.push(ansis.bold.yellow(\"EXECUTIVE SUMMARY\"));\n lines.push(ansis.dim(\"\u2500\".repeat(60)));\n\n const { summary } = analysis;\n\n // Overall metrics\n lines.push(\"\");\n lines.push(ansis.bold(\"Overall Changes:\"));\n\n if (summary.relationshipsAdded > 0) {\n lines.push(\n ` ${ansis.green(\"+\")} ${ansis.bold(summary.relationshipsAdded)} relationships added`,\n );\n }\n\n if (summary.gapsResolved > 0) {\n lines.push(\n ` ${ansis.green(\"\u2713\")} ${ansis.bold(summary.gapsResolved)} gaps resolved`,\n );\n }\n\n if (summary.duplicatesResolved > 0) {\n lines.push(\n ` ${ansis.green(\"\u2713\")} ${ansis.bold(summary.duplicatesResolved)} duplicates eliminated`,\n );\n }\n\n if (summary.remainingGaps > 0) {\n lines.push(\n ` ${ansis.yellow(\"!\")} ${ansis.bold(summary.remainingGaps)} gaps remaining`,\n );\n }\n\n // Balance improvements\n if (summary.balanceImprovements.length > 0) {\n lines.push(\"\");\n lines.push(ansis.bold(\"Balance Improvements:\"));\n for (const improvement of summary.balanceImprovements) {\n lines.push(` ${ansis.green(\"\u2713\")} ${improvement}`);\n }\n }\n\n // Coverage changes by layer\n lines.push(\"\");\n lines.push(ansis.bold.yellow(\"COVERAGE CHANGES BY LAYER\"));\n lines.push(ansis.dim(\"\u2500\".repeat(60)));\n\n for (const change of summary.coverageChanges) {\n lines.push(\"\");\n lines.push(ansis.bold(`Layer: ${change.layer}`));\n\n // Isolation\n const isolationDelta = change.delta.isolation;\n const isolationSymbol = isolationDelta < 0 ? ansis.green(\"\u2193\") : isolationDelta > 0 ? ansis.red(\"\u2191\") : ansis.dim(\"=\");\n const isolationColor = isolationDelta < 0 ? ansis.green : isolationDelta > 0 ? ansis.red : ansis.dim;\n lines.push(\n ` Isolation: ${change.before.isolation.toFixed(1)}% \u2192 ${change.after.isolation.toFixed(1)}% ` +\n `${isolationSymbol} ${isolationColor(Math.abs(isolationDelta).toFixed(1) + \"%\")}`,\n );\n\n // Density\n const densityDelta = change.delta.density;\n const densitySymbol = densityDelta > 0 ? ansis.green(\"\u2191\") : densityDelta < 0 ? ansis.red(\"\u2193\") : ansis.dim(\"=\");\n const densityColor = densityDelta > 0 ? ansis.green : densityDelta < 0 ? ansis.red : ansis.dim;\n lines.push(\n ` Density: ${change.before.density.toFixed(2)} \u2192 ${change.after.density.toFixed(2)} ` +\n `${densitySymbol} ${densityColor(Math.abs(densityDelta).toFixed(2))}`,\n );\n }\n\n // Detailed analysis (verbose mode)\n if (options.verbose) {\n lines.push(\"\");\n lines.push(ansis.bold.yellow(\"DETAILED ANALYSIS\"));\n lines.push(ansis.dim(\"\u2500\".repeat(60)));\n\n // Gap changes\n const { gapChanges } = analysis.detailed;\n lines.push(\"\");\n lines.push(ansis.bold(\"Gap Analysis:\"));\n lines.push(` Total before: ${gapChanges.before.length}`);\n lines.push(` Total after: ${gapChanges.after.length}`);\n lines.push(\n ` ${ansis.green(\"Resolved:\")} ${gapChanges.resolved.length} (${gapChanges.resolutionRate.toFixed(1)}%)`,\n );\n lines.push(` ${ansis.yellow(\"New gaps:\")} ${gapChanges.newGaps.length}`);\n lines.push(` ${ansis.dim(\"Persistent:\")} ${gapChanges.persistent.length}`);\n\n if (gapChanges.resolved.length > 0) {\n lines.push(\"\");\n lines.push(ansis.dim(\" Resolved gaps (sample):\"));\n for (const gap of gapChanges.resolved.slice(0, 5)) {\n lines.push(\n ansis.dim(\n ` \u2022 ${gap.sourceNodeType} \u2192 ${gap.destinationNodeType} [${gap.suggestedPredicate}]`,\n ),\n );\n }\n if (gapChanges.resolved.length > 5) {\n lines.push(\n ansis.dim(` ... and ${gapChanges.resolved.length - 5} more`),\n );\n }\n }\n\n // Duplicate changes\n const { duplicateChanges } = analysis.detailed;\n lines.push(\"\");\n lines.push(ansis.bold(\"Duplicate Analysis:\"));\n lines.push(` Total before: ${duplicateChanges.before.length}`);\n lines.push(` Total after: ${duplicateChanges.after.length}`);\n lines.push(\n ` ${ansis.green(\"Resolved:\")} ${duplicateChanges.resolved.length} (${duplicateChanges.eliminationRate.toFixed(1)}%)`,\n );\n lines.push(` ${ansis.yellow(\"New:\")} ${duplicateChanges.newDuplicates.length}`);\n lines.push(\n ` ${ansis.dim(\"Persistent:\")} ${duplicateChanges.persistent.length}`,\n );\n\n // Balance changes\n const { balanceChanges } = analysis.detailed;\n lines.push(\"\");\n lines.push(ansis.bold(\"Balance Analysis:\"));\n lines.push(` Improvements: ${balanceChanges.improvements.length}`);\n lines.push(` Regressions: ${balanceChanges.regressions.length}`);\n lines.push(` Newly balanced: ${balanceChanges.newlyBalanced.length}`);\n\n // Connectivity changes\n const { connectivityChanges } = analysis.detailed;\n lines.push(\"\");\n lines.push(ansis.bold(\"Connectivity Analysis:\"));\n lines.push(\n ` Components: ${connectivityChanges.before.componentCount} \u2192 ${connectivityChanges.after.componentCount} ` +\n `(${connectivityChanges.deltas.componentChange >= 0 ? \"+\" : \"\"}${connectivityChanges.deltas.componentChange})`,\n );\n lines.push(\n ` Isolated nodes: ${connectivityChanges.before.isolatedNodes} \u2192 ${connectivityChanges.after.isolatedNodes} ` +\n `(${connectivityChanges.deltas.isolationChange >= 0 ? \"+\" : \"\"}${connectivityChanges.deltas.isolationChange})`,\n );\n lines.push(\n ` Avg degree: ${connectivityChanges.before.averageDegree.toFixed(2)} \u2192 ${connectivityChanges.after.averageDegree.toFixed(2)} ` +\n `(${connectivityChanges.deltas.degreeChange >= 0 ? \"+\" : \"\"}${connectivityChanges.deltas.degreeChange.toFixed(2)})`,\n );\n }\n\n lines.push(\"\");\n lines.push(ansis.dim(\"\u2500\".repeat(60)));\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format as markdown\n */\nfunction formatMarkdown(\n analysis: DifferentialAnalysis,\n options: DiffFormatterOptions,\n): string {\n const lines: string[] = [];\n\n // Header\n lines.push(\"# Audit Differential Analysis\");\n lines.push(\"\");\n lines.push(\"## Comparison Period\");\n lines.push(\"\");\n lines.push(\n `- **Before:** ${formatDate(options.beforeTimestamp)}`,\n );\n lines.push(\n `- **After:** ${formatDate(options.afterTimestamp)}`,\n );\n\n // Executive Summary\n lines.push(\"\");\n lines.push(\"## Executive Summary\");\n lines.push(\"\");\n\n const { summary } = analysis;\n\n lines.push(\"### Overall Changes\");\n lines.push(\"\");\n lines.push(`- \u2705 **${summary.relationshipsAdded}** relationships added`);\n lines.push(`- \u2705 **${summary.gapsResolved}** gaps resolved`);\n lines.push(`- \u2705 **${summary.duplicatesResolved}** duplicates eliminated`);\n lines.push(`- \u26A0\uFE0F **${summary.remainingGaps}** gaps remaining`);\n\n // Balance improvements\n if (summary.balanceImprovements.length > 0) {\n lines.push(\"\");\n lines.push(\"### Balance Improvements\");\n lines.push(\"\");\n for (const improvement of summary.balanceImprovements) {\n lines.push(`- ${improvement}`);\n }\n }\n\n // Coverage changes\n lines.push(\"\");\n lines.push(\"## Coverage Changes by Layer\");\n lines.push(\"\");\n lines.push(\n \"| Layer | Isolation Before | Isolation After | \u0394 | Density Before | Density After | \u0394 |\",\n );\n lines.push(\"|-------|------------------|-----------------|---|----------------|---------------|---|\");\n\n for (const change of summary.coverageChanges) {\n const isolationDelta =\n change.delta.isolation >= 0\n ? `+${change.delta.isolation.toFixed(1)}%`\n : `${change.delta.isolation.toFixed(1)}%`;\n const densityDelta =\n change.delta.density >= 0\n ? `+${change.delta.density.toFixed(2)}`\n : `${change.delta.density.toFixed(2)}`;\n\n lines.push(\n `| ${change.layer} | ${change.before.isolation.toFixed(1)}% | ${change.after.isolation.toFixed(1)}% | ${isolationDelta} | ` +\n `${change.before.density.toFixed(2)} | ${change.after.density.toFixed(2)} | ${densityDelta} |`,\n );\n }\n\n // Detailed analysis\n if (options.verbose) {\n lines.push(\"\");\n lines.push(\"## Detailed Analysis\");\n\n // Gap changes\n const { gapChanges } = analysis.detailed;\n lines.push(\"\");\n lines.push(\"### Gap Analysis\");\n lines.push(\"\");\n lines.push(`- **Total before:** ${gapChanges.before.length}`);\n lines.push(`- **Total after:** ${gapChanges.after.length}`);\n lines.push(\n `- **Resolved:** ${gapChanges.resolved.length} (${gapChanges.resolutionRate.toFixed(1)}%)`,\n );\n lines.push(`- **New gaps:** ${gapChanges.newGaps.length}`);\n lines.push(`- **Persistent:** ${gapChanges.persistent.length}`);\n\n // Duplicate changes\n const { duplicateChanges } = analysis.detailed;\n lines.push(\"\");\n lines.push(\"### Duplicate Analysis\");\n lines.push(\"\");\n lines.push(`- **Total before:** ${duplicateChanges.before.length}`);\n lines.push(`- **Total after:** ${duplicateChanges.after.length}`);\n lines.push(\n `- **Resolved:** ${duplicateChanges.resolved.length} (${duplicateChanges.eliminationRate.toFixed(1)}%)`,\n );\n lines.push(`- **New duplicates:** ${duplicateChanges.newDuplicates.length}`);\n lines.push(`- **Persistent:** ${duplicateChanges.persistent.length}`);\n\n // Balance changes\n const { balanceChanges } = analysis.detailed;\n lines.push(\"\");\n lines.push(\"### Balance Analysis\");\n lines.push(\"\");\n lines.push(`- **Improvements:** ${balanceChanges.improvements.length}`);\n lines.push(`- **Regressions:** ${balanceChanges.regressions.length}`);\n lines.push(`- **Newly balanced:** ${balanceChanges.newlyBalanced.length}`);\n\n // Connectivity changes\n const { connectivityChanges } = analysis.detailed;\n lines.push(\"\");\n lines.push(\"### Connectivity Analysis\");\n lines.push(\"\");\n lines.push(\n `- **Components:** ${connectivityChanges.before.componentCount} \u2192 ${connectivityChanges.after.componentCount} ` +\n `(${connectivityChanges.deltas.componentChange >= 0 ? \"+\" : \"\"}${connectivityChanges.deltas.componentChange})`,\n );\n lines.push(\n `- **Isolated nodes:** ${connectivityChanges.before.isolatedNodes} \u2192 ${connectivityChanges.after.isolatedNodes} ` +\n `(${connectivityChanges.deltas.isolationChange >= 0 ? \"+\" : \"\"}${connectivityChanges.deltas.isolationChange})`,\n );\n lines.push(\n `- **Average degree:** ${connectivityChanges.before.averageDegree.toFixed(2)} \u2192 ${connectivityChanges.after.averageDegree.toFixed(2)} ` +\n `(${connectivityChanges.deltas.degreeChange >= 0 ? \"+\" : \"\"}${connectivityChanges.deltas.degreeChange.toFixed(2)})`,\n );\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/export/export-manager.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport type { Exporter, ExportOptions, ExportFormatInfo } from \"./types.js\";\n\n/**\n * ExportManager - Registry and dispatcher for format-specific exporters\n */\nexport class ExportManager {\n private exporters: Map<string, Exporter> = new Map();\n private formatInfo: Map<string, ExportFormatInfo> = new Map();\n\n /**\n * Register an exporter for a specific format\n */\n register(\n format: string,\n exporter: Exporter,\n info: Omit<ExportFormatInfo,
|
|
5
|
-
"mappings": "AAMM,MAAO,cAAa;EAChB,YAAmC,oBAAI,IAAG;EAC1C,aAA4C,oBAAI,IAAG;;;;EAK3D,SACE,QACA,UACA,MAAmE;AAEnE,SAAK,UAAU,IAAI,QAAQ,QAAQ,GACnC,KAAK,WAAW,IAAI,QAAQ;MAC1B;MACA,MAAM,SAAS;MACf,iBAAiB,SAAS;MAC1B,GAAG;KACJ;EACH;;;;EAKA,UAAU,QAAc;AACtB,WAAO,KAAK,UAAU,IAAI,MAAM;EAClC;;;;EAKA,MAAM,
|
|
4
|
+
"sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport type { Exporter, ExportOptions, ExportFormatInfo } from \"./types.js\";\n\n/**\n * ExportManager - Registry and dispatcher for format-specific exporters\n */\nexport class ExportManager {\n private exporters: Map<string, Exporter> = new Map();\n private formatInfo: Map<string, ExportFormatInfo> = new Map();\n\n /**\n * Register an exporter for a specific format\n */\n register(\n format: string,\n exporter: Exporter,\n info: Omit<ExportFormatInfo, \"format\" | \"name\" | \"supportedLayers\">\n ): void {\n this.exporters.set(format, exporter);\n this.formatInfo.set(format, {\n format,\n name: exporter.name,\n supportedLayers: exporter.supportedLayers,\n ...info,\n });\n }\n\n /**\n * Check if a format is registered\n */\n hasFormat(format: string): boolean {\n return this.exporters.has(format);\n }\n\n /**\n * Export model to specified format\n */\n async export(model: Model, format: string, options: ExportOptions = {}): Promise<string> {\n const exporter = this.exporters.get(format);\n if (!exporter) {\n throw new Error(`Unknown export format: ${format}`);\n }\n\n // Validate that requested layers are supported\n if (options.layers) {\n const unsupported = options.layers.filter(\n (layer) => !exporter.supportedLayers.includes(layer)\n );\n if (unsupported.length > 0) {\n throw new Error(\n `Format '${format}' does not support layers: ${unsupported.join(\", \")}. ` +\n `Supported layers: ${exporter.supportedLayers.join(\", \")}`\n );\n }\n }\n\n return await exporter.export(model, options);\n }\n\n /**\n * Get list of available formats\n */\n listFormats(): string[] {\n return Array.from(this.exporters.keys()).sort();\n }\n\n /**\n * Get metadata about a format\n */\n getFormatInfo(format: string): ExportFormatInfo | undefined {\n return this.formatInfo.get(format);\n }\n\n /**\n * Get supported layers for a format\n */\n getSupportedLayers(format: string): string[] {\n const exporter = this.exporters.get(format);\n return exporter?.supportedLayers ?? [];\n }\n\n /**\n * Get all registered formats with metadata\n */\n getAllFormats(): ExportFormatInfo[] {\n return Array.from(this.formatInfo.values()).sort((a, b) => a.format.localeCompare(b.format));\n }\n}\n"],
|
|
5
|
+
"mappings": "AAMM,MAAO,cAAa;EAChB,YAAmC,oBAAI,IAAG;EAC1C,aAA4C,oBAAI,IAAG;;;;EAK3D,SACE,QACA,UACA,MAAmE;AAEnE,SAAK,UAAU,IAAI,QAAQ,QAAQ,GACnC,KAAK,WAAW,IAAI,QAAQ;MAC1B;MACA,MAAM,SAAS;MACf,iBAAiB,SAAS;MAC1B,GAAG;KACJ;EACH;;;;EAKA,UAAU,QAAc;AACtB,WAAO,KAAK,UAAU,IAAI,MAAM;EAClC;;;;EAKA,MAAM,OAAO,OAAc,QAAgB,UAAyB,CAAA,GAAE;AACpE,UAAM,WAAW,KAAK,UAAU,IAAI,MAAM;AAC1C,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,0BAA0B,MAAM,EAAE;AAIpD,QAAI,QAAQ,QAAQ;AAClB,YAAM,cAAc,QAAQ,OAAO,OACjC,CAAC,UAAU,CAAC,SAAS,gBAAgB,SAAS,KAAK,CAAC;AAEtD,UAAI,YAAY,SAAS;AACvB,cAAM,IAAI,MACR,WAAW,MAAM,8BAA8B,YAAY,KAAK,IAAI,CAAC,uBAC9C,SAAS,gBAAgB,KAAK,IAAI,CAAC,EAAE;IAGlE;AAEA,WAAO,MAAM,SAAS,OAAO,OAAO,OAAO;EAC7C;;;;EAKA,cAAW;AACT,WAAO,MAAM,KAAK,KAAK,UAAU,KAAI,CAAE,EAAE,KAAI;EAC/C;;;;EAKA,cAAc,QAAc;AAC1B,WAAO,KAAK,WAAW,IAAI,MAAM;EACnC;;;;EAKA,mBAAmB,QAAc;AAE/B,WADiB,KAAK,UAAU,IAAI,MAAM,GACzB,mBAAmB,CAAA;EACtC;;;;EAKA,gBAAa;AACX,WAAO,MAAM,KAAK,KAAK,WAAW,OAAM,CAAE,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;EAC7F;;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,36 +1,53 @@
|
|
|
1
1
|
import { ALL_LAYERS, LAYER_COLORS, escapeXml } from "./types.js";
|
|
2
|
+
import { isTelemetryEnabled, startSpan, endSpan } from "../telemetry/index.js";
|
|
3
|
+
import { getErrorMessage } from "../utils/errors.js";
|
|
2
4
|
class GraphMLExporter {
|
|
3
5
|
name = "GraphML";
|
|
4
6
|
supportedLayers = ALL_LAYERS;
|
|
5
7
|
async export(model, options = {}) {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
8
|
+
const span = isTelemetryEnabled ? startSpan("export.format.graphml", {
|
|
9
|
+
"export.layerCount": options.layers?.length || this.supportedLayers.length
|
|
10
|
+
}) : null;
|
|
11
|
+
try {
|
|
12
|
+
const lines = [];
|
|
13
|
+
lines.push('<?xml version="1.0" encoding="UTF-8"?>'), lines.push('<graphml xmlns="http://graphml.graphdrawing.org/xmlns"'), lines.push(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'), lines.push(' xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd"'), lines.push(' edgedefault="directed">'), lines.push(' <key id="node_description" for="node" attr.name="description" attr.type="string"/>'), lines.push(' <key id="node_layer" for="node" attr.name="layer" attr.type="string"/>'), lines.push(' <key id="node_type" for="node" attr.name="type" attr.type="string"/>'), lines.push(' <key id="edge_type" for="edge" attr.name="type" attr.type="string"/>'), lines.push(' <graph id="model" edgedefault="directed">'), lines.push(` <data key="name">${escapeXml(model.manifest.name)}</data>`);
|
|
14
|
+
const layersToExport = options.layers || this.supportedLayers, elementMap = /* @__PURE__ */ new Map();
|
|
15
|
+
for (const layerName of layersToExport) {
|
|
16
|
+
const layer = await model.getLayer(layerName);
|
|
17
|
+
if (layer)
|
|
18
|
+
for (const element of layer.listElements()) {
|
|
19
|
+
const color = `#${LAYER_COLORS[layerName] || "FFFFFF"}`, elementId = element.path || element.id;
|
|
20
|
+
lines.push(` <node id="${elementId}">`), lines.push(` <data key="name">${escapeXml(element.name)}</data>`), lines.push(` <data key="node_layer">${layerName}</data>`), lines.push(` <data key="node_type">${element.type}</data>`), element.description && lines.push(` <data key="node_description">${escapeXml(element.description)}</data>`), lines.push(` <graphics x="0" y="0" w="150" h="50" fill="${color}" type="rectangle"/>`), lines.push(' <data key="d6">'), lines.push(" <y:ShapeNode>"), lines.push(` <y:NodeLabel>${escapeXml(element.name)}</y:NodeLabel>`), lines.push(" </y:ShapeNode>"), lines.push(" </data>"), lines.push(" </node>"), elementMap.set(elementId, {
|
|
21
|
+
layer: layerName,
|
|
22
|
+
type: element.type,
|
|
23
|
+
description: element.description
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
let edgeCounter = 0;
|
|
28
|
+
for (const layerName of layersToExport) {
|
|
29
|
+
const layer = await model.getLayer(layerName);
|
|
30
|
+
if (layer)
|
|
31
|
+
for (const element of layer.listElements()) {
|
|
32
|
+
const elementId = element.path || element.id;
|
|
33
|
+
for (const ref of element.references)
|
|
34
|
+
elementMap.has(ref.target) && (lines.push(` <edge id="e${edgeCounter}" source="${elementId}" target="${ref.target}">`), lines.push(` <data key="edge_type">${ref.type}</data>`), lines.push(` <data key="name">${escapeXml(ref.type)}</data>`), ref.description && lines.push(` <data key="description">${escapeXml(ref.description)}</data>`), lines.push(" </edge>"), edgeCounter++);
|
|
35
|
+
for (const rel of element.relationships)
|
|
36
|
+
elementMap.has(rel.target) && (lines.push(` <edge id="e${edgeCounter}" source="${elementId}" target="${rel.target}">`), lines.push(` <data key="edge_type">${rel.predicate}</data>`), lines.push(` <data key="name">${escapeXml(rel.predicate)}</data>`), lines.push(" </edge>"), edgeCounter++);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
lines.push(" </graph>"), lines.push("</graphml>");
|
|
40
|
+
const result = lines.join(`
|
|
33
41
|
`);
|
|
42
|
+
return isTelemetryEnabled && span && (span.setAttribute("export.nodeCount", elementMap.size), span.setAttribute("export.edgeCount", edgeCounter), span.setAttribute("export.size", result.length), span.setStatus({ code: 0 })), result;
|
|
43
|
+
} catch (error) {
|
|
44
|
+
throw isTelemetryEnabled && span && (span.recordException(error), span.setStatus({
|
|
45
|
+
code: 2,
|
|
46
|
+
message: getErrorMessage(error)
|
|
47
|
+
})), error;
|
|
48
|
+
} finally {
|
|
49
|
+
endSpan(span);
|
|
50
|
+
}
|
|
34
51
|
}
|
|
35
52
|
}
|
|
36
53
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/export/graphml-exporter.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport type { Exporter, ExportOptions } from \"./types.js\";\nimport { ALL_LAYERS, LAYER_COLORS, escapeXml } from \"./types.js\";\n\n/**\n * GraphML Exporter - generates GraphML format for graph visualization tools\n * GraphML is an XML-based format supported by tools like yEd, Cytoscape, etc.\n */\nexport class GraphMLExporter implements Exporter {\n name = \"GraphML\";\n supportedLayers = ALL_LAYERS;\n\n async export(model: Model, options: ExportOptions = {}): Promise<string> {\n const lines: string[] = [];\n\n
|
|
5
|
-
"mappings": "AAEA,SAAS,YAAY,cAAc,iBAAiB;
|
|
4
|
+
"sourcesContent": ["import type { Model } from \"../core/model.js\";\nimport type { Exporter, ExportOptions } from \"./types.js\";\nimport { ALL_LAYERS, LAYER_COLORS, escapeXml } from \"./types.js\";\nimport { isTelemetryEnabled, startSpan, endSpan } from \"../telemetry/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\n\n/**\n * GraphML Exporter - generates GraphML format for graph visualization tools\n * GraphML is an XML-based format supported by tools like yEd, Cytoscape, etc.\n */\nexport class GraphMLExporter implements Exporter {\n name = \"GraphML\";\n supportedLayers = ALL_LAYERS;\n\n async export(model: Model, options: ExportOptions = {}): Promise<string> {\n const span = isTelemetryEnabled\n ? startSpan(\"export.format.graphml\", {\n \"export.layerCount\": options.layers?.length || this.supportedLayers.length,\n })\n : null;\n\n try {\n const lines: string[] = [];\n\n // XML declaration\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n\n // GraphML root element\n lines.push('<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\"');\n lines.push(' xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"');\n lines.push(\n ' xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\"'\n );\n lines.push(' edgedefault=\"directed\">');\n\n // Define graph attributes\n lines.push(\n ' <key id=\"node_description\" for=\"node\" attr.name=\"description\" attr.type=\"string\"/>'\n );\n lines.push(' <key id=\"node_layer\" for=\"node\" attr.name=\"layer\" attr.type=\"string\"/>');\n lines.push(' <key id=\"node_type\" for=\"node\" attr.name=\"type\" attr.type=\"string\"/>');\n lines.push(' <key id=\"edge_type\" for=\"edge\" attr.name=\"type\" attr.type=\"string\"/>');\n\n // Create main graph\n lines.push(` <graph id=\"model\" edgedefault=\"directed\">`);\n lines.push(` <data key=\"name\">${escapeXml(model.manifest.name)}</data>`);\n\n const layersToExport = options.layers || this.supportedLayers;\n const elementMap = new Map<string, { layer: string; type: string; description?: string }>();\n\n // Add all nodes (elements)\n for (const layerName of layersToExport) {\n const layer = await model.getLayer(layerName);\n if (!layer) continue;\n\n for (const element of layer.listElements()) {\n const color = `#${LAYER_COLORS[layerName] || \"FFFFFF\"}`;\n const elementId = element.path || element.id;\n\n lines.push(` <node id=\"${elementId}\">`);\n lines.push(` <data key=\"name\">${escapeXml(element.name)}</data>`);\n lines.push(` <data key=\"node_layer\">${layerName}</data>`);\n lines.push(` <data key=\"node_type\">${element.type}</data>`);\n\n if (element.description) {\n lines.push(\n ` <data key=\"node_description\">${escapeXml(element.description)}</data>`\n );\n }\n\n // Add visualization hints using yEd extensions (optional)\n lines.push(\n ` <graphics x=\"0\" y=\"0\" w=\"150\" h=\"50\" fill=\"${color}\" type=\"rectangle\"/>`\n );\n lines.push(` <data key=\"d6\">`);\n lines.push(` <y:ShapeNode>`);\n lines.push(` <y:NodeLabel>${escapeXml(element.name)}</y:NodeLabel>`);\n lines.push(` </y:ShapeNode>`);\n lines.push(` </data>`);\n\n lines.push(` </node>`);\n\n elementMap.set(elementId, {\n layer: layerName,\n type: element.type,\n description: element.description,\n });\n }\n }\n\n // Add all edges (relationships and references)\n let edgeCounter = 0;\n\n for (const layerName of layersToExport) {\n const layer = await model.getLayer(layerName);\n if (!layer) continue;\n\n for (const element of layer.listElements()) {\n const elementId = element.path || element.id;\n // Cross-layer references\n for (const ref of element.references) {\n if (!elementMap.has(ref.target)) {\n // Log warning for dangling reference (in verbose mode this could be extended)\n continue;\n }\n lines.push(\n ` <edge id=\"e${edgeCounter}\" source=\"${elementId}\" target=\"${ref.target}\">`\n );\n lines.push(` <data key=\"edge_type\">${ref.type}</data>`);\n lines.push(` <data key=\"name\">${escapeXml(ref.type)}</data>`);\n\n if (ref.description) {\n lines.push(` <data key=\"description\">${escapeXml(ref.description)}</data>`);\n }\n\n lines.push(` </edge>`);\n edgeCounter++;\n }\n\n // Intra-layer relationships\n for (const rel of element.relationships) {\n if (!elementMap.has(rel.target)) {\n // Skip relationships to non-existent targets\n continue;\n }\n lines.push(\n ` <edge id=\"e${edgeCounter}\" source=\"${elementId}\" target=\"${rel.target}\">`\n );\n lines.push(` <data key=\"edge_type\">${rel.predicate}</data>`);\n lines.push(` <data key=\"name\">${escapeXml(rel.predicate)}</data>`);\n lines.push(` </edge>`);\n edgeCounter++;\n }\n }\n }\n\n lines.push(` </graph>`);\n lines.push(`</graphml>`);\n\n const result = lines.join(\"\\n\");\n\n if (isTelemetryEnabled && span) {\n (span as any).setAttribute(\"export.nodeCount\", elementMap.size);\n (span as any).setAttribute(\"export.edgeCount\", edgeCounter);\n (span as any).setAttribute(\"export.size\", result.length);\n (span as any).setStatus({ code: 0 });\n }\n\n return result;\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 throw error;\n } finally {\n endSpan(span);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/export/index.js
CHANGED
|
@@ -5,12 +5,16 @@ import { JsonSchemaExporter } from "./json-schema-exporter.js";
|
|
|
5
5
|
import { PlantUMLExporter } from "./plantuml-exporter.js";
|
|
6
6
|
import { GraphMLExporter } from "./graphml-exporter.js";
|
|
7
7
|
import { MarkdownExporter } from "./markdown-exporter.js";
|
|
8
|
+
import { MermaidMarkdownExporter } from "./mermaid-markdown-exporter.js";
|
|
9
|
+
import { MarkdownGenerator } from "./markdown-generator.js";
|
|
8
10
|
export {
|
|
9
11
|
ArchiMateExporter,
|
|
10
12
|
ExportManager,
|
|
11
13
|
GraphMLExporter,
|
|
12
14
|
JsonSchemaExporter,
|
|
13
15
|
MarkdownExporter,
|
|
16
|
+
MarkdownGenerator,
|
|
17
|
+
MermaidMarkdownExporter,
|
|
14
18
|
OpenAPIExporter,
|
|
15
19
|
PlantUMLExporter
|
|
16
20
|
};
|
package/dist/export/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/export/index.ts"],
|
|
4
|
-
"sourcesContent": ["export { ExportManager } from \"./export-manager.js\";\nexport type { Exporter, ExportOptions, ExportFormatInfo } from \"./types.js\";\nexport { ArchiMateExporter } from \"./archimate-exporter.js\";\nexport { OpenAPIExporter } from \"./openapi-exporter.js\";\nexport { JsonSchemaExporter } from \"./json-schema-exporter.js\";\nexport { PlantUMLExporter } from \"./plantuml-exporter.js\";\nexport { GraphMLExporter } from \"./graphml-exporter.js\";\nexport { MarkdownExporter } from \"./markdown-exporter.js\";\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,qBAAqB;AAE9B,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;",
|
|
4
|
+
"sourcesContent": ["export { ExportManager } from \"./export-manager.js\";\nexport type { Exporter, ExportOptions, ExportFormatInfo } from \"./types.js\";\nexport { ArchiMateExporter } from \"./archimate-exporter.js\";\nexport { OpenAPIExporter } from \"./openapi-exporter.js\";\nexport { JsonSchemaExporter } from \"./json-schema-exporter.js\";\nexport { PlantUMLExporter } from \"./plantuml-exporter.js\";\nexport { GraphMLExporter } from \"./graphml-exporter.js\";\nexport { MarkdownExporter } from \"./markdown-exporter.js\";\nexport { MermaidMarkdownExporter } from \"./mermaid-markdown-exporter.js\";\nexport { MarkdownGenerator, type MarkdownGeneratorOptions } from \"./markdown-generator.js\";\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,qBAAqB;AAE9B,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,+BAA+B;AACxC,SAAS,yBAAwD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|