@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,187 @@
|
|
|
1
|
+
# Changeset Reviewer Skill
|
|
2
|
+
|
|
3
|
+
When the user works with changesets or asks for review:
|
|
4
|
+
|
|
5
|
+
1. List current changeset with `dr changeset list`
|
|
6
|
+
2. Show changes with `dr changeset diff`
|
|
7
|
+
3. Review additions/removals for naming consistency, reference validity, and layer-appropriate properties
|
|
8
|
+
4. Suggest improvements before applying
|
|
9
|
+
|
|
10
|
+
## When to Activate
|
|
11
|
+
|
|
12
|
+
This skill should activate when:
|
|
13
|
+
|
|
14
|
+
- User mentions "changeset", "review changes", or "diff"
|
|
15
|
+
- User is about to apply a changeset
|
|
16
|
+
- User asks "what changed" or "what did I add"
|
|
17
|
+
- User requests review before applying changes
|
|
18
|
+
- After making multiple changes in a changeset
|
|
19
|
+
|
|
20
|
+
## Tools Available
|
|
21
|
+
|
|
22
|
+
- Bash (for `dr changeset *` commands: list, diff, apply, discard)
|
|
23
|
+
- Read (to examine changeset files and understand context)
|
|
24
|
+
- Grep (to check naming patterns and find similar elements)
|
|
25
|
+
|
|
26
|
+
## Workflow
|
|
27
|
+
|
|
28
|
+
1. **Show current changeset:**
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
dr changeset list
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
2. **Display diff:**
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
dr changeset diff
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
3. **Review each change:**
|
|
41
|
+
- **Additions:** Check naming, required properties, valid references
|
|
42
|
+
- **Modifications:** Ensure changes make sense, don't break links
|
|
43
|
+
- **Deletions:** Verify no dangling references remain
|
|
44
|
+
|
|
45
|
+
4. **Check for issues:**
|
|
46
|
+
- Naming consistency (follows existing patterns?)
|
|
47
|
+
- Reference validity (all referenced elements exist?)
|
|
48
|
+
- Layer-appropriate properties (right properties for the layer?)
|
|
49
|
+
- Relationship validation (cross-layer references valid in layer schemas?)
|
|
50
|
+
|
|
51
|
+
5. **Suggest improvements:**
|
|
52
|
+
- Better naming conventions
|
|
53
|
+
- Missing properties that should be added
|
|
54
|
+
- Potential relationships that should be validated
|
|
55
|
+
- Elements that might need to be added to support the change
|
|
56
|
+
|
|
57
|
+
6. **Recommend action:**
|
|
58
|
+
- Apply if everything looks good
|
|
59
|
+
- Fix issues first if problems found
|
|
60
|
+
- Discard if changes are no longer needed
|
|
61
|
+
|
|
62
|
+
## Example Interaction
|
|
63
|
+
|
|
64
|
+
**User:** "Can you review my changeset before I apply it?"
|
|
65
|
+
|
|
66
|
+
**Assistant:** [Skill activates] Let me check what's in your current changeset...
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
dr changeset list
|
|
70
|
+
dr changeset diff
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Changeset:** explore-caching (active)
|
|
74
|
+
|
|
75
|
+
**Changes:**
|
|
76
|
+
|
|
77
|
+
**Additions (3):**
|
|
78
|
+
|
|
79
|
+
1. ✅ `application/cache-service`
|
|
80
|
+
- Type: service
|
|
81
|
+
- Description: "Caching layer for API responses"
|
|
82
|
+
- Status: proposed
|
|
83
|
+
- **Good:** Clear description, appropriate status
|
|
84
|
+
|
|
85
|
+
2. ⚠️ `technology/redis`
|
|
86
|
+
- Type: technology
|
|
87
|
+
- Description: "Redis cache"
|
|
88
|
+
- **Issue:** Missing version property (recommended for technology layer)
|
|
89
|
+
- **Suggestion:** Add `"version": "7.0"` or latest
|
|
90
|
+
|
|
91
|
+
3. ❌ `api/cache-endpoint`
|
|
92
|
+
- References: `application/cache-service`, `data/cache-store`
|
|
93
|
+
- **Issue:** References `data/cache-store` but this element doesn't exist
|
|
94
|
+
- **Fix:** Either create `data/cache-store` or remove the reference
|
|
95
|
+
|
|
96
|
+
**Modifications (1):**
|
|
97
|
+
|
|
98
|
+
1. ✅ `api/user-profile-endpoint`
|
|
99
|
+
- Added reference to `application/cache-service`
|
|
100
|
+
- **Good:** Makes sense to integrate caching
|
|
101
|
+
|
|
102
|
+
**Deletions (0):**
|
|
103
|
+
None
|
|
104
|
+
|
|
105
|
+
**Missing Elements:**
|
|
106
|
+
|
|
107
|
+
- `data/cache-store` - Referenced by api/cache-endpoint but not created
|
|
108
|
+
|
|
109
|
+
**Cross-Layer Relationships:**
|
|
110
|
+
|
|
111
|
+
- ⚠️ New cross-layer relationships need validation:
|
|
112
|
+
- application/cache-service → technology/redis
|
|
113
|
+
- api/cache-endpoint → application/cache-service
|
|
114
|
+
|
|
115
|
+
**Recommendations:**
|
|
116
|
+
|
|
117
|
+
1. Add version to technology/redis
|
|
118
|
+
2. Create data/cache-store element
|
|
119
|
+
3. Validate cross-layer relationships
|
|
120
|
+
4. Consider adding motivation/improve-performance to justify caching
|
|
121
|
+
|
|
122
|
+
Would you like me to:
|
|
123
|
+
|
|
124
|
+
- Help you fix these issues before applying?
|
|
125
|
+
- Apply anyway (some issues are warnings, not blockers)?
|
|
126
|
+
- Show you how to add the missing elements?
|
|
127
|
+
|
|
128
|
+
## Review Checklist
|
|
129
|
+
|
|
130
|
+
For each addition, check:
|
|
131
|
+
|
|
132
|
+
- [ ] Naming follows conventions (kebab-case, descriptive)
|
|
133
|
+
- [ ] Required properties present (id, type, description, status)
|
|
134
|
+
- [ ] Layer-appropriate properties used
|
|
135
|
+
- [ ] References point to existing elements
|
|
136
|
+
- [ ] Status is valid for the element type
|
|
137
|
+
|
|
138
|
+
For each modification, check:
|
|
139
|
+
|
|
140
|
+
- [ ] Changes make logical sense
|
|
141
|
+
- [ ] Don't break existing links
|
|
142
|
+
- [ ] Updated properties are valid
|
|
143
|
+
- [ ] Description updated if behavior changed
|
|
144
|
+
|
|
145
|
+
For each deletion, check:
|
|
146
|
+
|
|
147
|
+
- [ ] No elements reference this one
|
|
148
|
+
- [ ] Links are updated/removed
|
|
149
|
+
- [ ] Deletion is intentional (not accidental)
|
|
150
|
+
|
|
151
|
+
For the changeset overall:
|
|
152
|
+
|
|
153
|
+
- [ ] Changes are cohesive (related to single feature/idea)
|
|
154
|
+
- [ ] Naming is consistent across new elements
|
|
155
|
+
- [ ] Cross-layer links are registered
|
|
156
|
+
- [ ] No orphaned references
|
|
157
|
+
|
|
158
|
+
## Common Issues
|
|
159
|
+
|
|
160
|
+
**Issue 1: Broken references**
|
|
161
|
+
|
|
162
|
+
- New element references non-existent element
|
|
163
|
+
- **Fix:** Create the referenced element or remove reference
|
|
164
|
+
|
|
165
|
+
**Issue 2: Missing link registration**
|
|
166
|
+
|
|
167
|
+
- Cross-layer references not in link registry
|
|
168
|
+
- **Fix:** Register links with `dr update ...`
|
|
169
|
+
|
|
170
|
+
**Issue 3: Inconsistent naming**
|
|
171
|
+
|
|
172
|
+
- New elements don't follow existing patterns
|
|
173
|
+
- **Fix:** Rename to match conventions
|
|
174
|
+
|
|
175
|
+
**Issue 4: Incomplete feature**
|
|
176
|
+
|
|
177
|
+
- Elements added across some layers but not others
|
|
178
|
+
- **Fix:** Complete the traceability chain (e.g., add business justification)
|
|
179
|
+
|
|
180
|
+
## Best Practices
|
|
181
|
+
|
|
182
|
+
- Review changesets before applying, not after
|
|
183
|
+
- Check that the changeset is focused (single feature/experiment)
|
|
184
|
+
- Verify all cross-layer references are valid
|
|
185
|
+
- Suggest improvements, but don't be overly strict
|
|
186
|
+
- Explain WHY something might be an issue
|
|
187
|
+
- After applying, always validate the full model
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { createReadStream } from "node:fs";
|
|
3
|
+
import { readdir } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
async function computeFileHash(filePath) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const hash = createHash("sha256"), stream = createReadStream(filePath);
|
|
9
|
+
stream.on("data", (data) => {
|
|
10
|
+
hash.update(data);
|
|
11
|
+
}), stream.on("end", () => {
|
|
12
|
+
const fullHash = hash.digest("hex");
|
|
13
|
+
resolve(fullHash.substring(0, 8));
|
|
14
|
+
}), stream.on("error", (error) => {
|
|
15
|
+
reject(error);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async function computeDirectoryHashes(baseDir, prefix) {
|
|
20
|
+
const hashes = /* @__PURE__ */ new Map();
|
|
21
|
+
if (!existsSync(baseDir))
|
|
22
|
+
return hashes;
|
|
23
|
+
async function scanDir(dir, relativePrefix = "") {
|
|
24
|
+
try {
|
|
25
|
+
const entries = await readdir(dir, { withFileTypes: !0 });
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
const fullPath = join(dir, entry.name), relativePath = relativePrefix ? join(relativePrefix, entry.name) : entry.name;
|
|
28
|
+
if (entry.isDirectory())
|
|
29
|
+
await scanDir(fullPath, relativePath);
|
|
30
|
+
else if (entry.isFile()) {
|
|
31
|
+
if (prefix && !entry.name.startsWith(prefix))
|
|
32
|
+
continue;
|
|
33
|
+
try {
|
|
34
|
+
const hash = await computeFileHash(fullPath);
|
|
35
|
+
hashes.set(relativePath, hash);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error(`Failed to hash file ${fullPath}:`, error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
} catch (error) {
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return await scanDir(baseDir), hashes;
|
|
46
|
+
}
|
|
47
|
+
export {
|
|
48
|
+
computeDirectoryHashes,
|
|
49
|
+
computeFileHash
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=hash-utils.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/integrations/hash-utils.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * File Hashing Utilities\n *\n * Provides SHA256-based file hashing for change detection in integration files.\n * Uses streaming for memory efficiency when handling large files.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\n/**\n * Compute SHA256 hash of a file, truncated to 8 characters\n *\n * Uses streaming to efficiently handle files of any size without loading\n * them entirely into memory. Matches Python implementation using the same\n * truncation length (8 characters) for consistency.\n *\n * @param filePath - Absolute path to file to hash\n * @returns Promise resolving to 8-character hex hash\n * @throws Error if file cannot be read\n *\n * @example\n * const hash = await computeFileHash('/path/to/file.ts');\n * // Returns: 'a1b2c3d4'\n */\nexport async function computeFileHash(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = createHash(\"sha256\");\n const stream = createReadStream(filePath);\n\n stream.on(\"data\", (data: Buffer) => {\n hash.update(data);\n });\n\n stream.on(\"end\", () => {\n const fullHash = hash.digest(\"hex\");\n resolve(fullHash.substring(0, 8));\n });\n\n stream.on(\"error\", (error: Error) => {\n reject(error);\n });\n });\n}\n\n/**\n * Compute hashes for all files in a directory recursively\n *\n * Scans the directory tree and computes hashes for all files, optionally\n * filtering by a filename prefix. Returns a map of relative paths to hashes,\n * enabling efficient comparison of installed vs. source files.\n *\n * @param baseDir - Base directory to scan\n * @param prefix - Optional prefix filter (only include files matching prefix)\n * @returns Promise resolving to Map of relative paths to 8-character hashes\n * @throws Error if directory cannot be read\n *\n * @example\n * const hashes = await computeDirectoryHashes('/path/to/dir', 'dr-');\n * // Returns: Map { 'dr-file1.md' => 'a1b2c3d4', 'subdir/dr-file2.md' => 'e5f6g7h8' }\n */\nexport async function computeDirectoryHashes(\n baseDir: string,\n prefix?: string\n): Promise<Map<string, string>> {\n const hashes = new Map<string, string>();\n\n // Return empty map if directory doesn't exist\n if (!existsSync(baseDir)) {\n return hashes;\n }\n\n async function scanDir(dir: string, relativePrefix: string = \"\"): Promise<void> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relativePath = relativePrefix ? join(relativePrefix, entry.name) : entry.name;\n\n if (entry.isDirectory()) {\n // Recursively scan subdirectories\n await scanDir(fullPath, relativePath);\n } else if (entry.isFile()) {\n // Check prefix filter\n if (prefix && !entry.name.startsWith(prefix)) {\n continue;\n }\n\n // Compute hash for file\n try {\n const hash = await computeFileHash(fullPath);\n hashes.set(relativePath, hash);\n } catch (error) {\n // Log error but continue processing other files\n console.error(`Failed to hash file ${fullPath}:`, error);\n }\n }\n }\n } catch (error) {\n // Re-throw directory read errors\n throw error;\n }\n }\n\n await scanDir(baseDir);\n return hashes;\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AACjC,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAiB3B,eAAsB,gBAAgB,UAAgB;AACpD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAU;AACrC,UAAM,OAAO,WAAW,QAAQ,GAC1B,SAAS,iBAAiB,QAAQ;AAExC,WAAO,GAAG,QAAQ,CAAC,SAAgB;AACjC,WAAK,OAAO,IAAI;IAClB,CAAC,GAED,OAAO,GAAG,OAAO,MAAK;AACpB,YAAM,WAAW,KAAK,OAAO,KAAK;AAClC,cAAQ,SAAS,UAAU,GAAG,CAAC,CAAC;IAClC,CAAC,GAED,OAAO,GAAG,SAAS,CAAC,UAAgB;AAClC,aAAO,KAAK;IACd,CAAC;EACH,CAAC;AACH;AAkBA,eAAsB,uBACpB,SACA,QAAe;AAEf,QAAM,SAAS,oBAAI,IAAG;AAGtB,MAAI,CAAC,WAAW,OAAO;AACrB,WAAO;AAGT,iBAAe,QAAQ,KAAa,iBAAyB,IAAE;AAC7D,QAAI;AACF,YAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,GAAI,CAAE;AAE1D,iBAAW,SAAS,SAAS;AAC3B,cAAM,WAAW,KAAK,KAAK,MAAM,IAAI,GAC/B,eAAe,iBAAiB,KAAK,gBAAgB,MAAM,IAAI,IAAI,MAAM;AAE/E,YAAI,MAAM,YAAW;AAEnB,gBAAM,QAAQ,UAAU,YAAY;iBAC3B,MAAM,OAAM,GAAI;AAEzB,cAAI,UAAU,CAAC,MAAM,KAAK,WAAW,MAAM;AACzC;AAIF,cAAI;AACF,kBAAM,OAAO,MAAM,gBAAgB,QAAQ;AAC3C,mBAAO,IAAI,cAAc,IAAI;UAC/B,SAAS,OAAO;AAEd,oBAAQ,MAAM,uBAAuB,QAAQ,KAAK,KAAK;UACzD;QACF;MACF;IACF,SAAS,OAAO;AAEd,YAAM;IACR;EACF;AAEA,eAAM,QAAQ,OAAO,GACd;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function validateVersionData(data) {
|
|
2
|
+
if (typeof data != "object" || data === null)
|
|
3
|
+
throw new Error("Version data must be an object");
|
|
4
|
+
const obj = data;
|
|
5
|
+
if (typeof obj.version != "string")
|
|
6
|
+
throw new Error('Missing or invalid "version" field in version file');
|
|
7
|
+
if (typeof obj.installed_at != "string")
|
|
8
|
+
throw new Error('Missing or invalid "installed_at" field in version file');
|
|
9
|
+
if (typeof obj.components != "object" || obj.components === null)
|
|
10
|
+
throw new Error('Missing or invalid "components" field in version file');
|
|
11
|
+
return obj;
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
validateVersionData
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/integrations/types.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Integration Management Types\n *\n * Defines the core data structures for managing Claude Code and GitHub Copilot\n * integrations, matching the Python CLI's integration manager patterns.\n */\n\n/**\n * Component configuration matching Python COMPONENTS dict structure\n * Describes how a component should be copied from source to target\n */\nexport interface ComponentConfig {\n /** Source directory name in integrations/{integration}/ */\n source: string;\n\n /** Target directory in project (.claude/ or .github/) */\n target: string;\n\n /** Human-readable description of this component */\n description: string;\n\n /** Optional file prefix filter (e.g., \"dr-\" to only copy dr-*.md) */\n prefix?: string;\n\n /** Whether component contains individual files or subdirectories */\n type: \"files\" | \"dirs\";\n\n /**\n * Whether this component is DR-owned (tracked in version file for updates)\n * Set to false for user-customizable components like templates\n * Defaults to true if not specified\n */\n tracked?: boolean;\n}\n\n/**\n * Version file YAML schema (.dr-version, .dr-copilot-version)\n * Tracks installation metadata and file hashes for change detection\n */\nexport interface VersionData {\n /** CLI version that installed this integration */\n version: string;\n\n /** ISO 8601 timestamp when integration was installed/updated */\n installed_at: string;\n\n /** Mapping of component names to their installed file hashes */\n components: {\n [componentName: string]: {\n [fileName: string]: {\n /** SHA256 hash truncated to 8 characters */\n hash: string;\n\n /** True if installed file differs from the source (user-modified or hash unreadable) */\n modified: boolean;\n };\n };\n };\n}\n\n/**\n * Validate VersionData deserialization result\n *\n * Ensures that the YAML-deserialized object has the required structure\n * and types. Catches corrupted version files early.\n *\n * @param data Deserialized object from YAML\n * @returns VersionData if valid\n * @throws Error if validation fails\n */\nexport function validateVersionData(data: unknown): VersionData {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"Version data must be an object\");\n }\n\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.version !== \"string\") {\n throw new Error('Missing or invalid \"version\" field in version file');\n }\n\n if (typeof obj.installed_at !== \"string\") {\n throw new Error('Missing or invalid \"installed_at\" field in version file');\n }\n\n if (typeof obj.components !== \"object\" || obj.components === null) {\n throw new Error('Missing or invalid \"components\" field in version file');\n }\n\n // Basic structure validation - deeper structure verified on access\n return obj as unknown as VersionData;\n}\n\n/**\n * File change detected during update operation\n * Used to categorize and report changes between installed and source versions\n */\nexport interface FileChange {\n /** Relative path to file within target directory */\n path: string;\n\n /** Component name this file belongs to */\n component: string;\n\n /** Type of change detected */\n changeType: \"added\" | \"modified\" | \"deleted\" | \"user-modified\" | \"conflict\";\n\n /** Hash of source file (if it exists in source) */\n sourceHash?: string;\n\n /** Hash of installed file (if it exists in target) */\n installedHash?: string;\n}\n\n/**\n * Obsolete file detected during cleanup\n * Represents a file in the installed integration that no longer exists in source\n */\nexport interface ObsoleteFile {\n /** Relative path to file within target directory */\n path: string;\n\n /** Component name this file belonged to */\n component: string;\n}\n"],
|
|
5
|
+
"mappings": "AAsEM,SAAU,oBAAoB,MAAa;AAC/C,MAAI,OAAO,QAAS,YAAY,SAAS;AACvC,UAAM,IAAI,MAAM,gCAAgC;AAGlD,QAAM,MAAM;AAEZ,MAAI,OAAO,IAAI,WAAY;AACzB,UAAM,IAAI,MAAM,oDAAoD;AAGtE,MAAI,OAAO,IAAI,gBAAiB;AAC9B,UAAM,IAAI,MAAM,yDAAyD;AAG3E,MAAI,OAAO,IAAI,cAAe,YAAY,IAAI,eAAe;AAC3D,UAAM,IAAI,MAAM,uDAAuD;AAIzE,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { formatLayerName } from "../utils/layer-name-formatter.js";
|
|
2
|
+
import { formatMarkdownTable } from "../utils/markdown-table.js";
|
|
3
|
+
import { sanitizeMermaidId, escapeMermaidLabel } from "../utils/mermaid-utils.js";
|
|
4
|
+
import { createAnchor } from "../utils/markdown-anchor.js";
|
|
5
|
+
import { escapeMarkdown, getLayerDescription, valueToMarkdown } from "../export/markdown-utils.js";
|
|
6
|
+
import { getLayerOrder, CANONICAL_LAYER_NAMES } from "../core/layers.js";
|
|
7
|
+
import { getValidRelationships } from "../generated/relationship-index.js";
|
|
8
|
+
class ModelLayerReportGenerator {
|
|
9
|
+
modelVersion;
|
|
10
|
+
generatedAt;
|
|
11
|
+
constructor(modelVersion, generatedAt) {
|
|
12
|
+
this.modelVersion = modelVersion, this.generatedAt = generatedAt;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate complete layer report markdown
|
|
16
|
+
*/
|
|
17
|
+
generate(data) {
|
|
18
|
+
const lines = [];
|
|
19
|
+
return lines.push(this.generateHeader(data)), lines.push(this.generateTableOfContents(data)), lines.push(this.generateLayerIntroduction(data)), lines.push(this.generateIntraLayerDiagram(data)), lines.push(this.generateInterLayerDiagram(data)), lines.push(this.generateInterLayerTable(data)), lines.push(this.generateElementReference(data)), lines.push(this.generateFooter()), lines.join("");
|
|
20
|
+
}
|
|
21
|
+
generateHeader(data) {
|
|
22
|
+
const lines = [];
|
|
23
|
+
return lines.push(`# ${formatLayerName(data.layerName)}
|
|
24
|
+
`), lines.push(`
|
|
25
|
+
`), lines.push(`${getLayerDescription(data.layerName)}
|
|
26
|
+
`), lines.push(`
|
|
27
|
+
`), lines.join("");
|
|
28
|
+
}
|
|
29
|
+
generateTableOfContents(data) {
|
|
30
|
+
const lines = [];
|
|
31
|
+
return lines.push(`## Report Index
|
|
32
|
+
`), lines.push(`
|
|
33
|
+
`), lines.push(`- [Layer Introduction](#layer-introduction)
|
|
34
|
+
`), lines.push(`- [Intra-Layer Relationships](#intra-layer-relationships)
|
|
35
|
+
`), lines.push(`- [Inter-Layer Dependencies](#inter-layer-dependencies)
|
|
36
|
+
`), data.interRelationships.length > 0 && lines.push(`- [Inter-Layer Relationships Table](#inter-layer-relationships-table)
|
|
37
|
+
`), data.elements.length > 0 && lines.push(`- [Element Reference](#element-reference)
|
|
38
|
+
`), lines.push(`
|
|
39
|
+
`), lines.join("");
|
|
40
|
+
}
|
|
41
|
+
generateLayerIntroduction(data) {
|
|
42
|
+
const lines = [];
|
|
43
|
+
lines.push(`## Layer Introduction
|
|
44
|
+
`), lines.push(`
|
|
45
|
+
`);
|
|
46
|
+
const headers = ["Metric", "Count"], rows = [
|
|
47
|
+
["Elements", String(data.statistics.elementCount)],
|
|
48
|
+
["Intra-Layer Relationships", String(data.statistics.intraRelationshipCount)],
|
|
49
|
+
["Inter-Layer Relationships", String(data.statistics.interRelationshipCount)],
|
|
50
|
+
["Inbound Relationships", String(data.statistics.inboundRelationshipCount)],
|
|
51
|
+
["Outbound Relationships", String(data.statistics.outboundRelationshipCount)]
|
|
52
|
+
], table = formatMarkdownTable(headers, rows);
|
|
53
|
+
if (lines.push(table), lines.push(`
|
|
54
|
+
`), data.upstreamLayers.length > 0 || data.downstreamLayers.length > 0) {
|
|
55
|
+
if (lines.push(`**Cross-Layer References**:
|
|
56
|
+
`), lines.push(`
|
|
57
|
+
`), data.upstreamLayers.length > 0) {
|
|
58
|
+
const upstreamLinks = data.upstreamLayers.map((layerName) => this.createLayerLink(layerName)).join(", ");
|
|
59
|
+
lines.push(`- **Upstream layers**: ${upstreamLinks}
|
|
60
|
+
`);
|
|
61
|
+
}
|
|
62
|
+
if (data.downstreamLayers.length > 0) {
|
|
63
|
+
const downstreamLinks = data.downstreamLayers.map((layerName) => this.createLayerLink(layerName)).join(", ");
|
|
64
|
+
lines.push(`- **Downstream layers**: ${downstreamLinks}
|
|
65
|
+
`);
|
|
66
|
+
}
|
|
67
|
+
lines.push(`
|
|
68
|
+
`);
|
|
69
|
+
}
|
|
70
|
+
return lines.join("");
|
|
71
|
+
}
|
|
72
|
+
generateIntraLayerDiagram(data) {
|
|
73
|
+
const lines = [];
|
|
74
|
+
if (lines.push(`## Intra-Layer Relationships
|
|
75
|
+
`), lines.push(`
|
|
76
|
+
`), data.elements.length === 0)
|
|
77
|
+
return lines.push(`No elements in this layer.
|
|
78
|
+
`), lines.push(`
|
|
79
|
+
`), lines.join("");
|
|
80
|
+
if (data.elements.length > 30) {
|
|
81
|
+
lines.push(`*This layer has >30 elements. Summary table shown instead of diagram.*
|
|
82
|
+
`), lines.push(`
|
|
83
|
+
`);
|
|
84
|
+
const headers = ["Element", "Type", "Relationships"], rows = [];
|
|
85
|
+
for (const element of data.elements) {
|
|
86
|
+
const relCount = data.intraRelationships.filter((rel) => rel.source === element.path || rel.target === element.path).length;
|
|
87
|
+
rows.push([
|
|
88
|
+
`\`${escapeMarkdown(element.path)}\``,
|
|
89
|
+
`\`${escapeMarkdown(element.type)}\``,
|
|
90
|
+
String(relCount)
|
|
91
|
+
]);
|
|
92
|
+
}
|
|
93
|
+
const table = formatMarkdownTable(headers, rows);
|
|
94
|
+
return lines.push(table), lines.push(`
|
|
95
|
+
`), lines.join("");
|
|
96
|
+
}
|
|
97
|
+
lines.push("```mermaid\n"), lines.push(`flowchart LR
|
|
98
|
+
`), lines.push(` subgraph ${sanitizeMermaidId(data.layerName)}
|
|
99
|
+
`);
|
|
100
|
+
for (const element of data.elements) {
|
|
101
|
+
const nodeId = sanitizeMermaidId(element.path), label = escapeMermaidLabel(element.name);
|
|
102
|
+
lines.push(` ${nodeId}["${label}"]
|
|
103
|
+
`);
|
|
104
|
+
}
|
|
105
|
+
const sortedRelationships = [...data.intraRelationships].sort((a, b) => {
|
|
106
|
+
const aKey = `${a.source}-${a.predicate}-${a.target}`, bKey = `${b.source}-${b.predicate}-${b.target}`;
|
|
107
|
+
return aKey.localeCompare(bKey);
|
|
108
|
+
});
|
|
109
|
+
for (const rel of sortedRelationships) {
|
|
110
|
+
const sourceId = sanitizeMermaidId(rel.source), targetId = sanitizeMermaidId(rel.target), predicate = escapeMermaidLabel(rel.predicate);
|
|
111
|
+
lines.push(` ${sourceId} -->|${predicate}| ${targetId}
|
|
112
|
+
`);
|
|
113
|
+
}
|
|
114
|
+
return lines.push(` end
|
|
115
|
+
`), lines.push("```\n"), lines.push(`
|
|
116
|
+
`), lines.join("");
|
|
117
|
+
}
|
|
118
|
+
generateInterLayerDiagram(data) {
|
|
119
|
+
const lines = [];
|
|
120
|
+
if (lines.push(`## Inter-Layer Dependencies
|
|
121
|
+
`), lines.push(`
|
|
122
|
+
`), data.elements.length === 0)
|
|
123
|
+
return lines.push(`No elements in this layer.
|
|
124
|
+
`), lines.push(`
|
|
125
|
+
`), lines.join("");
|
|
126
|
+
lines.push("```mermaid\n"), lines.push(`flowchart TB
|
|
127
|
+
`), lines.push(` classDef current fill:#f9f,stroke:#333,stroke-width:2px
|
|
128
|
+
`);
|
|
129
|
+
for (const layerName of CANONICAL_LAYER_NAMES) {
|
|
130
|
+
const layerId = sanitizeMermaidId(layerName), label = formatLayerName(layerName);
|
|
131
|
+
lines.push(` ${layerId}["${label}"]
|
|
132
|
+
`);
|
|
133
|
+
}
|
|
134
|
+
const addedRelationships = /* @__PURE__ */ new Set(), layerRelationships = [];
|
|
135
|
+
for (const rel of data.interRelationships)
|
|
136
|
+
if (rel.layer !== rel.targetLayer && rel.targetLayer) {
|
|
137
|
+
const key = `${rel.layer}-${rel.targetLayer}`;
|
|
138
|
+
if (!addedRelationships.has(key)) {
|
|
139
|
+
const sourceId = sanitizeMermaidId(rel.layer), destId = sanitizeMermaidId(rel.targetLayer);
|
|
140
|
+
layerRelationships.push({ sourceId, destId }), addedRelationships.add(key);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const sortedLayerRels = layerRelationships.sort((a, b) => {
|
|
144
|
+
const aKey = `${a.sourceId}-${a.destId}`, bKey = `${b.sourceId}-${b.destId}`;
|
|
145
|
+
return aKey.localeCompare(bKey);
|
|
146
|
+
});
|
|
147
|
+
for (const { sourceId, destId } of sortedLayerRels)
|
|
148
|
+
lines.push(` ${sourceId} --> ${destId}
|
|
149
|
+
`);
|
|
150
|
+
const currentLayerId = sanitizeMermaidId(data.layerName);
|
|
151
|
+
return lines.push(` class ${currentLayerId} current
|
|
152
|
+
`), lines.push("```\n"), lines.push(`
|
|
153
|
+
`), lines.join("");
|
|
154
|
+
}
|
|
155
|
+
generateInterLayerTable(data) {
|
|
156
|
+
const lines = [];
|
|
157
|
+
if (data.interRelationships.length === 0)
|
|
158
|
+
return "";
|
|
159
|
+
lines.push(`## Inter-Layer Relationships Table
|
|
160
|
+
`), lines.push(`
|
|
161
|
+
`);
|
|
162
|
+
const sortedRels = [...data.interRelationships].sort((a, b) => {
|
|
163
|
+
const aKey = `${a.source}-${a.predicate}-${a.target}`, bKey = `${b.source}-${b.predicate}-${b.target}`;
|
|
164
|
+
return aKey.localeCompare(bKey);
|
|
165
|
+
}), headers = ["Relationship ID", "Source Node", "Dest Node", "Dest Layer", "Predicate", "Cardinality", "Strength"], rows = [];
|
|
166
|
+
for (const rel of sortedRels) {
|
|
167
|
+
const sourceType = this.extractElementType(rel.source), targetType = this.extractElementType(rel.target), specs = getValidRelationships(sourceType, rel.predicate, targetType), cardinality = specs.length > 0 ? specs[0].cardinality : "unknown", strength = specs.length > 0 ? specs[0].strength : "unknown", relationshipId = specs.length > 0 ? specs[0].id : `${rel.source}-${rel.predicate}-${rel.target}`;
|
|
168
|
+
rows.push([
|
|
169
|
+
`\`${escapeMarkdown(relationshipId)}\``,
|
|
170
|
+
`\`${escapeMarkdown(rel.source)}\``,
|
|
171
|
+
`\`${escapeMarkdown(rel.target)}\``,
|
|
172
|
+
rel.targetLayer ? `\`${escapeMarkdown(rel.targetLayer)}\`` : "\u2014",
|
|
173
|
+
`\`${escapeMarkdown(rel.predicate)}\``,
|
|
174
|
+
cardinality,
|
|
175
|
+
strength
|
|
176
|
+
]);
|
|
177
|
+
}
|
|
178
|
+
const table = formatMarkdownTable(headers, rows);
|
|
179
|
+
return lines.push(table), lines.push(`
|
|
180
|
+
`), lines.join("");
|
|
181
|
+
}
|
|
182
|
+
generateElementReference(data) {
|
|
183
|
+
const lines = [];
|
|
184
|
+
if (data.elements.length === 0)
|
|
185
|
+
return "";
|
|
186
|
+
lines.push(`## Element Reference
|
|
187
|
+
`), lines.push(`
|
|
188
|
+
`);
|
|
189
|
+
for (const element of data.elements) {
|
|
190
|
+
const anchor = createAnchor(element.name);
|
|
191
|
+
if (lines.push(`### ${escapeMarkdown(element.name)} {#${anchor}}
|
|
192
|
+
`), lines.push(`
|
|
193
|
+
`), lines.push(`**ID**: \`${escapeMarkdown(element.path)}\`
|
|
194
|
+
|
|
195
|
+
`), lines.push(`**Type**: \`${escapeMarkdown(element.type)}\`
|
|
196
|
+
|
|
197
|
+
`), element.description && lines.push(`${escapeMarkdown(element.description)}
|
|
198
|
+
|
|
199
|
+
`), Object.keys(element.attributes).length > 0) {
|
|
200
|
+
lines.push(`#### Attributes
|
|
201
|
+
|
|
202
|
+
`);
|
|
203
|
+
const attrHeaders = ["Name", "Value"], attrRows = [], sortedAttrs = Object.entries(element.attributes).sort((a, b) => a[0].localeCompare(b[0]));
|
|
204
|
+
for (const [name, value] of sortedAttrs) {
|
|
205
|
+
const valueStr = valueToMarkdown(value);
|
|
206
|
+
attrRows.push([name, valueStr]);
|
|
207
|
+
}
|
|
208
|
+
const attrTable = formatMarkdownTable(attrHeaders, attrRows);
|
|
209
|
+
lines.push(attrTable), lines.push(`
|
|
210
|
+
`);
|
|
211
|
+
}
|
|
212
|
+
const elementRels = this.getElementRelationships(data, element.path);
|
|
213
|
+
if (elementRels.length > 0) {
|
|
214
|
+
lines.push(`#### Relationships
|
|
215
|
+
|
|
216
|
+
`);
|
|
217
|
+
const relHeaders = ["Type", "Related Element", "Predicate", "Direction"], relRows = [], sortedElementRels = [...elementRels].sort((a, b) => {
|
|
218
|
+
const aKey = `${a.relType}-${a.rel.source}-${a.rel.predicate}-${a.rel.target}`, bKey = `${b.relType}-${b.rel.source}-${b.rel.predicate}-${b.rel.target}`;
|
|
219
|
+
return aKey.localeCompare(bKey);
|
|
220
|
+
});
|
|
221
|
+
for (const { rel, relType } of sortedElementRels) {
|
|
222
|
+
const relatedElement = rel.source === element.path ? rel.target : rel.source, direction = rel.source === element.path ? "outbound" : "inbound";
|
|
223
|
+
relRows.push([
|
|
224
|
+
relType,
|
|
225
|
+
`\`${escapeMarkdown(relatedElement)}\``,
|
|
226
|
+
`\`${escapeMarkdown(rel.predicate)}\``,
|
|
227
|
+
direction
|
|
228
|
+
]);
|
|
229
|
+
}
|
|
230
|
+
const relTable = formatMarkdownTable(relHeaders, relRows);
|
|
231
|
+
lines.push(relTable), lines.push(`
|
|
232
|
+
`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return lines.join("");
|
|
236
|
+
}
|
|
237
|
+
generateFooter() {
|
|
238
|
+
const lines = [];
|
|
239
|
+
return lines.push(`---
|
|
240
|
+
`), lines.push(`
|
|
241
|
+
`), lines.push(`Generated: ${this.generatedAt} | Model Version: ${this.modelVersion}
|
|
242
|
+
`), lines.join("");
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Create a markdown link to a layer report
|
|
246
|
+
*/
|
|
247
|
+
createLayerLink(layerName) {
|
|
248
|
+
const layerNumber = getLayerOrder(layerName);
|
|
249
|
+
if (layerNumber === -1)
|
|
250
|
+
return layerName;
|
|
251
|
+
const filename = `./${String(layerNumber).padStart(2, "0")}-${layerName}-layer-report.md`;
|
|
252
|
+
return `[${formatLayerName(layerName)}](${filename})`;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get relationships involving a specific element
|
|
256
|
+
*/
|
|
257
|
+
getElementRelationships(data, elementPath) {
|
|
258
|
+
const rels = [];
|
|
259
|
+
for (const rel of data.intraRelationships)
|
|
260
|
+
(rel.source === elementPath || rel.target === elementPath) && rels.push({ rel, relType: "intra-layer" });
|
|
261
|
+
for (const rel of data.interRelationships)
|
|
262
|
+
(rel.source === elementPath || rel.target === elementPath) && rels.push({ rel, relType: "inter-layer" });
|
|
263
|
+
return rels;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Extract element type from element path in layer.type format
|
|
267
|
+
* Example: "motivation.goal.customer-satisfaction" -> "motivation.goal"
|
|
268
|
+
* This format matches the keys in RELATIONSHIPS_BY_SOURCE map.
|
|
269
|
+
*/
|
|
270
|
+
extractElementType(elementPath) {
|
|
271
|
+
const parts = elementPath.split(".");
|
|
272
|
+
return parts.length >= 2 ? parts.slice(0, 2).join(".") : elementPath;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
export {
|
|
276
|
+
ModelLayerReportGenerator
|
|
277
|
+
};
|
|
278
|
+
//# sourceMappingURL=model-layer-report-generator.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/reports/model-layer-report-generator.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Model Layer Report Generator\n *\n * Generates markdown documentation for a single architecture layer with:\n * - Mermaid intra-layer and inter-layer diagrams\n * - Relationship tables\n * - Element reference documentation\n * - Navigation and metadata\n *\n * Mirrors LayerReportGenerator from spec script but renders element instances\n * instead of type schemas.\n */\n\nimport type { ModelLayerReportData } from './model-report-data.js';\nimport type { Relationship } from '../core/relationships.js';\nimport { formatLayerName } from '../utils/layer-name-formatter.js';\nimport { formatMarkdownTable } from '../utils/markdown-table.js';\nimport { sanitizeMermaidId, escapeMermaidLabel } from '../utils/mermaid-utils.js';\nimport { createAnchor } from '../utils/markdown-anchor.js';\nimport { escapeMarkdown, getLayerDescription, valueToMarkdown } from '../export/markdown-utils.js';\nimport { getLayerOrder, CANONICAL_LAYER_NAMES } from '../core/layers.js';\nimport { getValidRelationships } from '../generated/relationship-index.js';\n\nexport class ModelLayerReportGenerator {\n constructor(private modelVersion: string, private generatedAt: string) {}\n\n /**\n * Generate complete layer report markdown\n */\n generate(data: ModelLayerReportData): string {\n const lines: string[] = [];\n\n // Document header\n lines.push(this.generateHeader(data));\n\n // Report Index (table of contents)\n lines.push(this.generateTableOfContents(data));\n\n // Layer Introduction + Statistics\n lines.push(this.generateLayerIntroduction(data));\n\n // Intra-Layer Relationships diagram\n lines.push(this.generateIntraLayerDiagram(data));\n\n // Inter-Layer Dependencies diagram\n lines.push(this.generateInterLayerDiagram(data));\n\n // Inter-Layer Relationships Table\n lines.push(this.generateInterLayerTable(data));\n\n // Element Reference section\n lines.push(this.generateElementReference(data));\n\n // Footer\n lines.push(this.generateFooter());\n\n return lines.join('');\n }\n\n private generateHeader(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push(`# ${formatLayerName(data.layerName)}\\n`);\n lines.push('\\n');\n lines.push(`${getLayerDescription(data.layerName)}\\n`);\n lines.push('\\n');\n return lines.join('');\n }\n\n private generateTableOfContents(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push('## Report Index\\n');\n lines.push('\\n');\n\n lines.push('- [Layer Introduction](#layer-introduction)\\n');\n lines.push('- [Intra-Layer Relationships](#intra-layer-relationships)\\n');\n lines.push('- [Inter-Layer Dependencies](#inter-layer-dependencies)\\n');\n\n if (data.interRelationships.length > 0) {\n lines.push('- [Inter-Layer Relationships Table](#inter-layer-relationships-table)\\n');\n }\n\n if (data.elements.length > 0) {\n lines.push('- [Element Reference](#element-reference)\\n');\n }\n\n lines.push('\\n');\n return lines.join('');\n }\n\n private generateLayerIntroduction(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push('## Layer Introduction\\n');\n lines.push('\\n');\n\n // Statistics table\n const headers = ['Metric', 'Count'];\n const rows = [\n ['Elements', String(data.statistics.elementCount)],\n ['Intra-Layer Relationships', String(data.statistics.intraRelationshipCount)],\n ['Inter-Layer Relationships', String(data.statistics.interRelationshipCount)],\n ['Inbound Relationships', String(data.statistics.inboundRelationshipCount)],\n ['Outbound Relationships', String(data.statistics.outboundRelationshipCount)],\n ];\n\n const table = formatMarkdownTable(headers, rows);\n lines.push(table);\n lines.push('\\n');\n\n // Upstream and downstream layers\n if (data.upstreamLayers.length > 0 || data.downstreamLayers.length > 0) {\n lines.push('**Cross-Layer References**:\\n');\n lines.push('\\n');\n\n if (data.upstreamLayers.length > 0) {\n const upstreamLinks = data.upstreamLayers\n .map((layerName) => this.createLayerLink(layerName))\n .join(', ');\n lines.push(`- **Upstream layers**: ${upstreamLinks}\\n`);\n }\n\n if (data.downstreamLayers.length > 0) {\n const downstreamLinks = data.downstreamLayers\n .map((layerName) => this.createLayerLink(layerName))\n .join(', ');\n lines.push(`- **Downstream layers**: ${downstreamLinks}\\n`);\n }\n\n lines.push('\\n');\n }\n\n return lines.join('');\n }\n\n private generateIntraLayerDiagram(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push('## Intra-Layer Relationships\\n');\n lines.push('\\n');\n\n // Empty layer handling\n if (data.elements.length === 0) {\n lines.push('No elements in this layer.\\n');\n lines.push('\\n');\n return lines.join('');\n }\n\n // Large layer fallback: For >30 elements, use summary table instead of Mermaid\n // to prevent rendering failures\n if (data.elements.length > 30) {\n lines.push('*This layer has >30 elements. Summary table shown instead of diagram.*\\n');\n lines.push('\\n');\n\n const headers = ['Element', 'Type', 'Relationships'];\n const rows: string[][] = [];\n\n for (const element of data.elements) {\n const relCount = data.intraRelationships.filter(\n (rel) => rel.source === element.path || rel.target === element.path\n ).length;\n\n rows.push([\n `\\`${escapeMarkdown(element.path)}\\``,\n `\\`${escapeMarkdown(element.type)}\\``,\n String(relCount),\n ]);\n }\n\n const table = formatMarkdownTable(headers, rows);\n lines.push(table);\n lines.push('\\n');\n\n return lines.join('');\n }\n\n // Generate mermaid diagram for layers with \u226430 elements\n lines.push('```mermaid\\n');\n lines.push('flowchart LR\\n');\n lines.push(` subgraph ${sanitizeMermaidId(data.layerName)}\\n`);\n\n // Add all elements as nodes (use escapeMermaidLabel for correct Mermaid escaping)\n for (const element of data.elements) {\n const nodeId = sanitizeMermaidId(element.path);\n const label = escapeMermaidLabel(element.name);\n lines.push(` ${nodeId}[\"${label}\"]\\n`);\n }\n\n // Add intra-layer relationships (sorted for deterministic output)\n const sortedRelationships = [...data.intraRelationships].sort((a, b) => {\n const aKey = `${a.source}-${a.predicate}-${a.target}`;\n const bKey = `${b.source}-${b.predicate}-${b.target}`;\n return aKey.localeCompare(bKey);\n });\n\n for (const rel of sortedRelationships) {\n const sourceId = sanitizeMermaidId(rel.source);\n const targetId = sanitizeMermaidId(rel.target);\n const predicate = escapeMermaidLabel(rel.predicate);\n lines.push(` ${sourceId} -->|${predicate}| ${targetId}\\n`);\n }\n\n lines.push(' end\\n');\n lines.push('```\\n');\n lines.push('\\n');\n\n return lines.join('');\n }\n\n private generateInterLayerDiagram(data: ModelLayerReportData): string {\n const lines: string[] = [];\n lines.push('## Inter-Layer Dependencies\\n');\n lines.push('\\n');\n\n // Empty layer handling\n if (data.elements.length === 0) {\n lines.push('No elements in this layer.\\n');\n lines.push('\\n');\n return lines.join('');\n }\n\n lines.push('```mermaid\\n');\n lines.push('flowchart TB\\n');\n lines.push(' classDef current fill:#f9f,stroke:#333,stroke-width:2px\\n');\n\n // Add all layers as nodes\n for (const layerName of CANONICAL_LAYER_NAMES) {\n const layerId = sanitizeMermaidId(layerName);\n const label = formatLayerName(layerName);\n lines.push(` ${layerId}[\"${label}\"]\\n`);\n }\n\n // Add layer-to-layer relationships for inter-layer dependencies\n const addedRelationships = new Set<string>();\n const layerRelationships: Array<{ sourceId: string; destId: string }> = [];\n\n for (const rel of data.interRelationships) {\n // Only include inter-layer relationships\n if (rel.layer !== rel.targetLayer && rel.targetLayer) {\n const key = `${rel.layer}-${rel.targetLayer}`;\n if (!addedRelationships.has(key)) {\n const sourceId = sanitizeMermaidId(rel.layer);\n const destId = sanitizeMermaidId(rel.targetLayer);\n layerRelationships.push({ sourceId, destId });\n addedRelationships.add(key);\n }\n }\n }\n\n // Sort and output relationships for deterministic ordering\n const sortedLayerRels = layerRelationships.sort((a, b) => {\n const aKey = `${a.sourceId}-${a.destId}`;\n const bKey = `${b.sourceId}-${b.destId}`;\n return aKey.localeCompare(bKey);\n });\n\n for (const { sourceId, destId } of sortedLayerRels) {\n lines.push(` ${sourceId} --> ${destId}\\n`);\n }\n\n // Highlight current layer\n const currentLayerId = sanitizeMermaidId(data.layerName);\n lines.push(` class ${currentLayerId} current\\n`);\n\n lines.push('```\\n');\n lines.push('\\n');\n\n return lines.join('');\n }\n\n private generateInterLayerTable(data: ModelLayerReportData): string {\n const lines: string[] = [];\n\n if (data.interRelationships.length === 0) {\n return '';\n }\n\n lines.push('## Inter-Layer Relationships Table\\n');\n lines.push('\\n');\n\n // Sort relationships for deterministic output\n const sortedRels = [...data.interRelationships].sort((a, b) => {\n const aKey = `${a.source}-${a.predicate}-${a.target}`;\n const bKey = `${b.source}-${b.predicate}-${b.target}`;\n return aKey.localeCompare(bKey);\n });\n\n const headers = ['Relationship ID', 'Source Node', 'Dest Node', 'Dest Layer', 'Predicate', 'Cardinality', 'Strength'];\n const rows: string[][] = [];\n\n for (const rel of sortedRels) {\n // Extract element types from paths (e.g., \"motivation.goal.customer-satisfaction\" -> \"motivation.goal\")\n const sourceType = this.extractElementType(rel.source);\n const targetType = this.extractElementType(rel.target);\n\n // Look up spec-level relationship properties\n const specs = getValidRelationships(sourceType, rel.predicate, targetType);\n const cardinality = specs.length > 0 ? specs[0].cardinality : 'unknown';\n const strength = specs.length > 0 ? specs[0].strength : 'unknown';\n\n // Use spec relationship ID when available, fall back to concatenated form\n const relationshipId = specs.length > 0 ? specs[0].id : `${rel.source}-${rel.predicate}-${rel.target}`;\n\n rows.push([\n `\\`${escapeMarkdown(relationshipId)}\\``,\n `\\`${escapeMarkdown(rel.source)}\\``,\n `\\`${escapeMarkdown(rel.target)}\\``,\n rel.targetLayer ? `\\`${escapeMarkdown(rel.targetLayer)}\\`` : '\u2014',\n `\\`${escapeMarkdown(rel.predicate)}\\``,\n cardinality,\n strength,\n ]);\n }\n\n const table = formatMarkdownTable(headers, rows);\n lines.push(table);\n lines.push('\\n');\n\n return lines.join('');\n }\n\n private generateElementReference(data: ModelLayerReportData): string {\n const lines: string[] = [];\n\n if (data.elements.length === 0) {\n return '';\n }\n\n lines.push('## Element Reference\\n');\n lines.push('\\n');\n\n for (const element of data.elements) {\n const anchor = createAnchor(element.name);\n lines.push(`### ${escapeMarkdown(element.name)} {#${anchor}}\\n`);\n lines.push('\\n');\n\n // ID and type\n lines.push(`**ID**: \\`${escapeMarkdown(element.path)}\\`\\n\\n`);\n lines.push(`**Type**: \\`${escapeMarkdown(element.type)}\\`\\n\\n`);\n\n // Description if available\n if (element.description) {\n lines.push(`${escapeMarkdown(element.description)}\\n\\n`);\n }\n\n // Attributes if available\n if (Object.keys(element.attributes).length > 0) {\n lines.push('#### Attributes\\n\\n');\n const attrHeaders = ['Name', 'Value'];\n const attrRows: string[][] = [];\n\n // Sort attributes for deterministic output\n const sortedAttrs = Object.entries(element.attributes).sort((a, b) =>\n a[0].localeCompare(b[0])\n );\n\n for (const [name, value] of sortedAttrs) {\n const valueStr = valueToMarkdown(value);\n attrRows.push([name, valueStr]);\n }\n\n const attrTable = formatMarkdownTable(attrHeaders, attrRows);\n lines.push(attrTable);\n lines.push('\\n');\n }\n\n // Relationships involving this element\n const elementRels = this.getElementRelationships(data, element.path);\n if (elementRels.length > 0) {\n lines.push('#### Relationships\\n\\n');\n const relHeaders = ['Type', 'Related Element', 'Predicate', 'Direction'];\n const relRows: string[][] = [];\n\n // Sort for deterministic output\n const sortedElementRels = [...elementRels].sort((a, b) => {\n const aKey = `${a.relType}-${a.rel.source}-${a.rel.predicate}-${a.rel.target}`;\n const bKey = `${b.relType}-${b.rel.source}-${b.rel.predicate}-${b.rel.target}`;\n return aKey.localeCompare(bKey);\n });\n\n for (const { rel, relType } of sortedElementRels) {\n const relatedElement = rel.source === element.path ? rel.target : rel.source;\n const direction = rel.source === element.path ? 'outbound' : 'inbound';\n\n relRows.push([\n relType,\n `\\`${escapeMarkdown(relatedElement)}\\``,\n `\\`${escapeMarkdown(rel.predicate)}\\``,\n direction,\n ]);\n }\n\n const relTable = formatMarkdownTable(relHeaders, relRows);\n lines.push(relTable);\n lines.push('\\n');\n }\n }\n\n return lines.join('');\n }\n\n private generateFooter(): string {\n const lines: string[] = [];\n lines.push('---\\n');\n lines.push('\\n');\n lines.push(`Generated: ${this.generatedAt} | Model Version: ${this.modelVersion}\\n`);\n return lines.join('');\n }\n\n /**\n * Create a markdown link to a layer report\n */\n private createLayerLink(layerName: string): string {\n const layerNumber = getLayerOrder(layerName);\n if (layerNumber === -1) {\n return layerName;\n }\n const filename = `./${String(layerNumber).padStart(2, '0')}-${layerName}-layer-report.md`;\n return `[${formatLayerName(layerName)}](${filename})`;\n }\n\n /**\n * Get relationships involving a specific element\n */\n private getElementRelationships(\n data: ModelLayerReportData,\n elementPath: string\n ): Array<{ rel: Relationship; relType: 'intra-layer' | 'inter-layer' }> {\n const rels: Array<{ rel: Relationship; relType: 'intra-layer' | 'inter-layer' }> = [];\n\n // Intra-layer relationships\n for (const rel of data.intraRelationships) {\n if (rel.source === elementPath || rel.target === elementPath) {\n rels.push({ rel, relType: 'intra-layer' });\n }\n }\n\n // Inter-layer relationships\n for (const rel of data.interRelationships) {\n if (rel.source === elementPath || rel.target === elementPath) {\n rels.push({ rel, relType: 'inter-layer' });\n }\n }\n\n return rels;\n }\n\n /**\n * Extract element type from element path in layer.type format\n * Example: \"motivation.goal.customer-satisfaction\" -> \"motivation.goal\"\n * This format matches the keys in RELATIONSHIPS_BY_SOURCE map.\n */\n private extractElementType(elementPath: string): string {\n const parts = elementPath.split('.');\n if (parts.length >= 2) {\n return parts.slice(0, 2).join('.');\n }\n return elementPath;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|