@documentation-robotics/cli 0.1.0 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +466 -693
- package/dist/analysis/data-model-analyzer.js +189 -0
- package/dist/analysis/data-model-analyzer.js.map +7 -0
- package/dist/analysis/index.js +3 -0
- package/dist/analysis/index.js.map +7 -0
- package/dist/analysis/relationship-classifier.js +181 -0
- package/dist/analysis/relationship-classifier.js.map +7 -0
- package/dist/analyzers/base-analyzer.js +1 -0
- package/dist/analyzers/base-analyzer.js.map +7 -0
- package/dist/analyzers/call-graph-utils.js +39 -0
- package/dist/analyzers/call-graph-utils.js.map +7 -0
- package/dist/analyzers/cbm-analyzer.js +1205 -0
- package/dist/analyzers/cbm-analyzer.js.map +7 -0
- package/dist/analyzers/heuristic-utils.js +55 -0
- package/dist/analyzers/heuristic-utils.js.map +7 -0
- package/dist/analyzers/mapping-loader.js +146 -0
- package/dist/analyzers/mapping-loader.js.map +7 -0
- package/dist/analyzers/registry.js +124 -0
- package/dist/analyzers/registry.js.map +7 -0
- package/dist/analyzers/session-state.js +176 -0
- package/dist/analyzers/session-state.js.map +7 -0
- package/dist/analyzers/stdio-client.js +206 -0
- package/dist/analyzers/stdio-client.js.map +7 -0
- package/dist/analyzers/types.js +15 -0
- package/dist/analyzers/types.js.map +7 -0
- package/dist/analyzers/verify-engine.js +209 -0
- package/dist/analyzers/verify-engine.js.map +7 -0
- package/dist/analyzers/verify-ignore.js +130 -0
- package/dist/analyzers/verify-ignore.js.map +7 -0
- package/dist/analyzers/version.js +8 -0
- package/dist/analyzers/version.js.map +7 -0
- package/dist/audit/ai/runner.js +41 -0
- package/dist/audit/ai/runner.js.map +7 -0
- package/dist/audit/differential-analyzer.js +183 -0
- package/dist/audit/differential-analyzer.js.map +7 -0
- package/dist/audit/index.js +32 -0
- package/dist/audit/index.js.map +7 -0
- package/dist/audit/nodes/ai/evaluator.js +49 -0
- package/dist/audit/nodes/ai/evaluator.js.map +7 -0
- package/dist/audit/nodes/ai/parser.js +55 -0
- package/dist/audit/nodes/ai/parser.js.map +7 -0
- package/dist/audit/nodes/ai/prompts.js +103 -0
- package/dist/audit/nodes/ai/prompts.js.map +7 -0
- package/dist/audit/nodes/analysis/node-completeness-checker.js +32 -0
- package/dist/audit/nodes/analysis/node-completeness-checker.js.map +7 -0
- package/dist/audit/nodes/analysis/node-definition-analyzer.js +47 -0
- package/dist/audit/nodes/analysis/node-definition-analyzer.js.map +7 -0
- package/dist/audit/nodes/analysis/node-overlap-detector.js +79 -0
- package/dist/audit/nodes/analysis/node-overlap-detector.js.map +7 -0
- package/dist/audit/nodes/model/orchestrator.js +82 -0
- package/dist/audit/nodes/model/orchestrator.js.map +7 -0
- package/dist/audit/nodes/spec/loader.js +116 -0
- package/dist/audit/nodes/spec/loader.js.map +7 -0
- package/dist/audit/nodes/spec/orchestrator.js +68 -0
- package/dist/audit/nodes/spec/orchestrator.js.map +7 -0
- package/dist/audit/nodes/types.js +1 -0
- package/dist/audit/nodes/types.js.map +7 -0
- package/dist/audit/pipeline/index.js +5 -0
- package/dist/audit/pipeline/index.js.map +7 -0
- package/dist/audit/pipeline/pipeline-orchestrator.js +218 -0
- package/dist/audit/pipeline/pipeline-orchestrator.js.map +7 -0
- package/dist/audit/relationships/ai/evaluator.js +235 -0
- package/dist/audit/relationships/ai/evaluator.js.map +7 -0
- package/dist/audit/relationships/ai/parser.js +197 -0
- package/dist/audit/relationships/ai/parser.js.map +7 -0
- package/dist/audit/relationships/ai/prompts.js +274 -0
- package/dist/audit/relationships/ai/prompts.js.map +7 -0
- package/dist/audit/relationships/analysis/balance-assessor.js +115 -0
- package/dist/audit/relationships/analysis/balance-assessor.js.map +7 -0
- package/dist/audit/relationships/analysis/coverage-analyzer.js +99 -0
- package/dist/audit/relationships/analysis/coverage-analyzer.js.map +7 -0
- package/dist/audit/relationships/analysis/duplicate-detector.js +95 -0
- package/dist/audit/relationships/analysis/duplicate-detector.js.map +7 -0
- package/dist/audit/relationships/analysis/gap-analyzer.js +99 -0
- package/dist/audit/relationships/analysis/gap-analyzer.js.map +7 -0
- package/dist/audit/relationships/analysis/layer-templates.js +294 -0
- package/dist/audit/relationships/analysis/layer-templates.js.map +7 -0
- package/dist/audit/relationships/graph/connectivity.js +129 -0
- package/dist/audit/relationships/graph/connectivity.js.map +7 -0
- package/dist/audit/relationships/graph/relationship-graph.js +179 -0
- package/dist/audit/relationships/graph/relationship-graph.js.map +7 -0
- package/dist/audit/relationships/model/balance-assessor.js +49 -0
- package/dist/audit/relationships/model/balance-assessor.js.map +7 -0
- package/dist/audit/relationships/model/coverage-analyzer.js +34 -0
- package/dist/audit/relationships/model/coverage-analyzer.js.map +7 -0
- package/dist/audit/relationships/model/duplicate-detector.js +68 -0
- package/dist/audit/relationships/model/duplicate-detector.js.map +7 -0
- package/dist/audit/relationships/model/gap-analyzer.js +41 -0
- package/dist/audit/relationships/model/gap-analyzer.js.map +7 -0
- package/dist/audit/relationships/model/orchestrator.js +126 -0
- package/dist/audit/relationships/model/orchestrator.js.map +7 -0
- package/dist/audit/relationships/spec/orchestrator.js +157 -0
- package/dist/audit/relationships/spec/orchestrator.js.map +7 -0
- package/dist/audit/reports/index.js +5 -0
- package/dist/audit/reports/index.js.map +7 -0
- package/dist/audit/reports/report-generator.js +118 -0
- package/dist/audit/reports/report-generator.js.map +7 -0
- package/dist/audit/snapshot-storage.js +163 -0
- package/dist/audit/snapshot-storage.js.map +7 -0
- package/dist/audit/types.js +21 -0
- package/dist/audit/types.js.map +7 -0
- package/dist/cli.js +223 -92
- package/dist/cli.js.map +3 -3
- package/dist/coding-agents/agents/claude-code.js +147 -0
- package/dist/coding-agents/agents/claude-code.js.map +7 -0
- package/dist/coding-agents/agents/index.js +5 -0
- package/dist/coding-agents/agents/index.js.map +7 -0
- package/dist/coding-agents/agents/types.js +1 -0
- package/dist/coding-agents/agents/types.js.map +7 -0
- package/dist/coding-agents/base-chat-client.js +45 -0
- package/dist/coding-agents/base-chat-client.js.map +7 -0
- package/dist/coding-agents/chat-utils.js +23 -0
- package/dist/coding-agents/chat-utils.js.map +7 -0
- package/dist/coding-agents/claude-code-client.js +246 -0
- package/dist/coding-agents/claude-code-client.js.map +7 -0
- package/dist/coding-agents/copilot-client.js +209 -0
- package/dist/coding-agents/copilot-client.js.map +7 -0
- package/dist/commands/add.js +95 -33
- package/dist/commands/add.js.map +2 -2
- package/dist/commands/analyzer.js +511 -0
- package/dist/commands/analyzer.js.map +7 -0
- package/dist/commands/audit-diff.js +49 -0
- package/dist/commands/audit-diff.js.map +7 -0
- package/dist/commands/audit-snapshots.js +62 -0
- package/dist/commands/audit-snapshots.js.map +7 -0
- package/dist/commands/audit.js +81 -0
- package/dist/commands/audit.js.map +7 -0
- package/dist/commands/catalog.js +248 -0
- package/dist/commands/catalog.js.map +7 -0
- package/dist/commands/changeset.js +577 -66
- package/dist/commands/changeset.js.map +2 -2
- package/dist/commands/chat.js +106 -83
- package/dist/commands/chat.js.map +2 -2
- package/dist/commands/claude.js +74 -0
- package/dist/commands/claude.js.map +7 -0
- package/dist/commands/conformance.js +71 -68
- package/dist/commands/conformance.js.map +2 -2
- package/dist/commands/copilot.js +75 -0
- package/dist/commands/copilot.js.map +7 -0
- package/dist/commands/delete.js +125 -11
- package/dist/commands/delete.js.map +3 -3
- package/dist/commands/discover-logic.js +44 -0
- package/dist/commands/discover-logic.js.map +7 -0
- package/dist/commands/docs.js +87 -0
- package/dist/commands/docs.js.map +7 -0
- package/dist/commands/element.js +14 -20
- package/dist/commands/element.js.map +2 -2
- package/dist/commands/export.js +13 -3
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/import.js +51 -0
- package/dist/commands/import.js.map +7 -0
- package/dist/commands/info.js +30 -24
- package/dist/commands/info.js.map +2 -2
- package/dist/commands/init.js +27 -11
- package/dist/commands/init.js.map +2 -2
- package/dist/commands/list.js +63 -13
- package/dist/commands/list.js.map +3 -3
- package/dist/commands/relationship.js +225 -37
- package/dist/commands/relationship.js.map +2 -2
- package/dist/commands/report.js +54 -0
- package/dist/commands/report.js.map +7 -0
- package/dist/commands/reports.js +45 -0
- package/dist/commands/reports.js.map +7 -0
- package/dist/commands/schema.js +135 -0
- package/dist/commands/schema.js.map +7 -0
- package/dist/commands/search.js +40 -12
- package/dist/commands/search.js.map +2 -2
- package/dist/commands/show.js +58 -27
- package/dist/commands/show.js.map +2 -2
- package/dist/commands/stats.js +35 -0
- package/dist/commands/stats.js.map +7 -0
- package/dist/commands/trace.js +39 -16
- package/dist/commands/trace.js.map +2 -2
- package/dist/commands/update.js +141 -14
- package/dist/commands/update.js.map +2 -2
- package/dist/commands/upgrade.js +210 -46
- package/dist/commands/upgrade.js.map +3 -3
- package/dist/commands/validate.js +142 -23
- package/dist/commands/validate.js.map +3 -3
- package/dist/commands/version.js +8 -12
- package/dist/commands/version.js.map +2 -2
- package/dist/commands/visualize.js +155 -25
- package/dist/commands/visualize.js.map +2 -2
- package/dist/core/base-snapshot-manager.js +84 -0
- package/dist/core/base-snapshot-manager.js.map +7 -0
- package/dist/core/changeset-exporter.js +305 -0
- package/dist/core/changeset-exporter.js.map +7 -0
- package/dist/core/changeset-validator.js +41 -0
- package/dist/core/changeset-validator.js.map +7 -0
- package/dist/core/changeset.js +88 -173
- package/dist/core/changeset.js.map +2 -2
- package/dist/core/dependency-tracker.js +4 -2
- package/dist/core/dependency-tracker.js.map +2 -2
- package/dist/core/element.js +98 -27
- package/dist/core/element.js.map +2 -2
- package/dist/core/golden-copy-cache.js +290 -0
- package/dist/core/golden-copy-cache.js.map +7 -0
- package/dist/core/graph-model.js +266 -0
- package/dist/core/graph-model.js.map +7 -0
- package/dist/core/layer.js +159 -16
- package/dist/core/layer.js.map +2 -2
- package/dist/core/layers.js +32 -0
- package/dist/core/layers.js.map +7 -0
- package/dist/core/manifest.js +32 -11
- package/dist/core/manifest.js.map +2 -2
- package/dist/core/migration-registry.js +56 -1
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model.js +424 -217
- package/dist/core/model.js.map +3 -3
- package/dist/core/mutation-handler.js +179 -0
- package/dist/core/mutation-handler.js.map +7 -0
- package/dist/core/reference-registry.js +29 -21
- package/dist/core/reference-registry.js.map +2 -2
- package/dist/core/relationship-catalog.js +189 -0
- package/dist/core/relationship-catalog.js.map +7 -0
- package/dist/core/relationship-registry.js.map +2 -2
- package/dist/core/relationships.js.map +1 -1
- package/dist/core/report-data-model.js +285 -0
- package/dist/core/report-data-model.js.map +7 -0
- package/dist/core/spec-data-service.js +185 -0
- package/dist/core/spec-data-service.js.map +7 -0
- package/dist/core/spec-loader-types.js +1 -0
- package/dist/core/spec-loader-types.js.map +7 -0
- package/dist/core/spec-loader.js +234 -0
- package/dist/core/spec-loader.js.map +7 -0
- package/dist/core/staged-changeset-storage.js +282 -0
- package/dist/core/staged-changeset-storage.js.map +7 -0
- package/dist/core/staging-area.js +1002 -0
- package/dist/core/staging-area.js.map +7 -0
- package/dist/core/stats-collector.js +169 -0
- package/dist/core/stats-collector.js.map +7 -0
- package/dist/core/virtual-projection.js +443 -0
- package/dist/core/virtual-projection.js.map +7 -0
- package/dist/export/archimate-exporter.js +99 -60
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/export/audit-formatters.js +479 -0
- package/dist/export/audit-formatters.js.map +7 -0
- package/dist/export/diff-formatters.js +99 -0
- package/dist/export/diff-formatters.js.map +7 -0
- package/dist/export/export-manager.js.map +2 -2
- package/dist/export/graphml-exporter.js +44 -27
- package/dist/export/graphml-exporter.js.map +2 -2
- package/dist/export/index.js +4 -0
- package/dist/export/index.js.map +2 -2
- package/dist/export/json-schema-exporter.js +55 -42
- package/dist/export/json-schema-exporter.js.map +2 -2
- package/dist/export/markdown-exporter.js +92 -70
- package/dist/export/markdown-exporter.js.map +2 -2
- package/dist/export/markdown-generator.js +248 -0
- package/dist/export/markdown-generator.js.map +7 -0
- package/dist/export/markdown-utils.js +30 -0
- package/dist/export/markdown-utils.js.map +7 -0
- package/dist/export/mermaid-markdown-exporter.js +37 -0
- package/dist/export/mermaid-markdown-exporter.js.map +7 -0
- package/dist/export/openapi-exporter.js +119 -71
- package/dist/export/openapi-exporter.js.map +2 -2
- package/dist/export/plantuml-exporter.js +104 -39
- package/dist/export/plantuml-exporter.js.map +2 -2
- package/dist/export/report-formatters.js +111 -0
- package/dist/export/report-formatters.js.map +7 -0
- package/dist/export/stats-formatters.js +98 -0
- package/dist/export/stats-formatters.js.map +7 -0
- package/dist/export/types.js +2 -14
- package/dist/export/types.js.map +2 -2
- package/dist/export/verify-formatters.js +153 -0
- package/dist/export/verify-formatters.js.map +7 -0
- package/dist/generated/compiled-validators.js +17 -0
- package/dist/generated/compiled-validators.js.map +7 -0
- package/dist/generated/index.js +31 -0
- package/dist/generated/index.js.map +7 -0
- package/dist/generated/layer-registry.js +190 -0
- package/dist/generated/layer-registry.js.map +7 -0
- package/dist/generated/layer-types.js +7 -0
- package/dist/generated/layer-types.js.map +7 -0
- package/dist/generated/node-types.js +1719 -0
- package/dist/generated/node-types.js.map +7 -0
- package/dist/generated/relationship-index.js +14552 -0
- package/dist/generated/relationship-index.js.map +7 -0
- package/dist/import/archimate-importer.js +166 -0
- package/dist/import/archimate-importer.js.map +7 -0
- package/dist/import/index.js +47 -0
- package/dist/import/index.js.map +7 -0
- package/dist/import/openapi-importer.js +143 -0
- package/dist/import/openapi-importer.js.map +7 -0
- package/dist/import/types.js +1 -0
- package/dist/import/types.js.map +7 -0
- package/dist/integrations/base-manager.js +311 -0
- package/dist/integrations/base-manager.js.map +7 -0
- package/dist/integrations/claude-manager.js +360 -0
- package/dist/integrations/claude-manager.js.map +7 -0
- package/dist/integrations/claude_code/agents/dr-advisor.md +253 -0
- package/dist/integrations/claude_code/agents/dr-architect.md +278 -0
- package/dist/integrations/claude_code/agents/dr-extractor.md +286 -0
- package/dist/integrations/claude_code/commands/dr-changeset.md +657 -0
- package/dist/integrations/claude_code/commands/dr-design.md +373 -0
- package/dist/integrations/claude_code/commands/dr-info.md +132 -0
- package/dist/integrations/claude_code/commands/dr-init.md +251 -0
- package/dist/integrations/claude_code/commands/dr-map.md +936 -0
- package/dist/integrations/claude_code/commands/dr-model.md +493 -0
- package/dist/integrations/claude_code/commands/dr-relate.md +814 -0
- package/dist/integrations/claude_code/commands/dr-sync.md +279 -0
- package/dist/integrations/claude_code/commands/dr-validate.md +654 -0
- package/dist/integrations/claude_code/commands/dr-verify.md +559 -0
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +903 -0
- package/dist/integrations/claude_code/docs/QUICK_START.md +271 -0
- package/dist/integrations/claude_code/docs/README.md +347 -0
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +550 -0
- package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +620 -0
- package/dist/integrations/claude_code/skills/dr_03_security_layer/SKILL.md +642 -0
- package/dist/integrations/claude_code/skills/dr_04_application_layer/SKILL.md +911 -0
- package/dist/integrations/claude_code/skills/dr_05_technology_layer/SKILL.md +836 -0
- package/dist/integrations/claude_code/skills/dr_06_api_layer/SKILL.md +933 -0
- package/dist/integrations/claude_code/skills/dr_07_data_model_layer/SKILL.md +210 -0
- package/dist/integrations/claude_code/skills/dr_08_dataset_layer/SKILL.md +319 -0
- package/dist/integrations/claude_code/skills/dr_09_ux_layer/SKILL.md +319 -0
- package/dist/integrations/claude_code/skills/dr_10_navigation_layer/SKILL.md +318 -0
- package/dist/integrations/claude_code/skills/dr_11_apm_layer/SKILL.md +273 -0
- package/dist/integrations/claude_code/skills/dr_12_testing_layer/SKILL.md +273 -0
- package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +187 -0
- package/dist/integrations/claude_code/skills/dr_codebase_memory/SKILL.md +590 -0
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +295 -0
- package/dist/integrations/copilot-manager.js +328 -0
- package/dist/integrations/copilot-manager.js.map +7 -0
- package/dist/integrations/github_copilot/agents/dr-advisor.md +243 -0
- package/dist/integrations/github_copilot/agents/dr-architect.md +1567 -0
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +491 -0
- package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +539 -0
- package/dist/integrations/github_copilot/skills/dr_03_security_layer/SKILL.md +667 -0
- package/dist/integrations/github_copilot/skills/dr_04_application_layer/SKILL.md +670 -0
- package/dist/integrations/github_copilot/skills/dr_05_technology_layer/SKILL.md +660 -0
- package/dist/integrations/github_copilot/skills/dr_06_api_layer/SKILL.md +855 -0
- package/dist/integrations/github_copilot/skills/dr_07_data_model_layer/SKILL.md +171 -0
- package/dist/integrations/github_copilot/skills/dr_08_dataset_layer/SKILL.md +216 -0
- package/dist/integrations/github_copilot/skills/dr_09_ux_layer/SKILL.md +230 -0
- package/dist/integrations/github_copilot/skills/dr_10_navigation_layer/SKILL.md +228 -0
- package/dist/integrations/github_copilot/skills/dr_11_apm_layer/SKILL.md +234 -0
- package/dist/integrations/github_copilot/skills/dr_12_testing_layer/SKILL.md +230 -0
- package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +187 -0
- package/dist/integrations/hash-utils.js +51 -0
- package/dist/integrations/hash-utils.js.map +7 -0
- package/dist/integrations/types.js +16 -0
- package/dist/integrations/types.js.map +7 -0
- package/dist/reports/model-layer-report-generator.js +278 -0
- package/dist/reports/model-layer-report-generator.js.map +7 -0
- package/dist/reports/model-report-data.js +57 -0
- package/dist/reports/model-report-data.js.map +7 -0
- package/dist/reports/model-report-orchestrator.js +103 -0
- package/dist/reports/model-report-orchestrator.js.map +7 -0
- package/dist/schemas/bundled/analyzers/cbm.json +595 -0
- package/dist/schemas/bundled/analyzers/manifest.json +9 -0
- package/dist/schemas/bundled/api.json +3411 -0
- package/dist/schemas/bundled/apm.json +2371 -0
- package/dist/schemas/bundled/application.json +1253 -0
- package/dist/schemas/bundled/base.json +1622 -0
- package/dist/schemas/bundled/business.json +1279 -0
- package/dist/schemas/bundled/data-model.json +1298 -0
- package/dist/schemas/bundled/data-store.json +2025 -0
- package/dist/schemas/bundled/manifest.json +93 -0
- package/dist/schemas/bundled/motivation.json +1360 -0
- package/dist/schemas/bundled/navigation.json +1874 -0
- package/dist/schemas/bundled/security.json +3488 -0
- package/dist/schemas/bundled/technology.json +2067 -0
- package/dist/schemas/bundled/testing.json +3120 -0
- package/dist/schemas/bundled/ux.json +3592 -0
- package/dist/server/schemas.js +202 -0
- package/dist/server/schemas.js.map +7 -0
- package/dist/server/server.js +1336 -252
- package/dist/server/server.js.map +3 -3
- package/dist/server/telemetry-middleware.js +22 -15
- package/dist/server/telemetry-middleware.js.map +2 -2
- package/dist/server-entry.js +65 -0
- package/dist/server-entry.js.map +7 -0
- package/dist/telemetry/config.js +89 -0
- package/dist/telemetry/config.js.map +7 -0
- package/dist/telemetry/console-interceptor.js.map +1 -1
- package/dist/telemetry/detect.js +24 -0
- package/dist/telemetry/detect.js.map +7 -0
- package/dist/telemetry/fetch-otlp-exporter.js +112 -0
- package/dist/telemetry/fetch-otlp-exporter.js.map +7 -0
- package/dist/telemetry/index.js +153 -3
- package/dist/telemetry/index.js.map +2 -2
- package/dist/telemetry/resilient-exporter.js +22 -8
- package/dist/telemetry/resilient-exporter.js.map +2 -2
- package/dist/telemetry/resilient-log-exporter.js +17 -8
- package/dist/telemetry/resilient-log-exporter.js.map +2 -2
- package/dist/telemetry/test-instrumentation.js.map +2 -2
- package/dist/types/index.js +84 -0
- package/dist/types/index.js.map +3 -3
- package/dist/types/source-reference.js +1 -0
- package/dist/types/source-reference.js.map +7 -0
- package/dist/utils/chat-logger.js +292 -0
- package/dist/utils/chat-logger.js.map +7 -0
- package/dist/utils/claude-stream.js +8 -0
- package/dist/utils/claude-stream.js.map +7 -0
- package/dist/utils/date-utils.js +7 -0
- package/dist/utils/date-utils.js.map +7 -0
- package/dist/utils/element-utils.js.map +1 -1
- package/dist/utils/errors.js +88 -15
- package/dist/utils/errors.js.map +3 -3
- package/dist/utils/export-python-annotations.js +82 -0
- package/dist/utils/export-python-annotations.js.map +7 -0
- package/dist/utils/file-io.js +7 -2
- package/dist/utils/file-io.js.map +2 -2
- package/dist/utils/file-lock.js +156 -0
- package/dist/utils/file-lock.js.map +7 -0
- package/dist/utils/id-generator.js +18 -0
- package/dist/utils/id-generator.js.map +7 -0
- package/dist/utils/layer-name-formatter.js +16 -0
- package/dist/utils/layer-name-formatter.js.map +7 -0
- package/dist/utils/markdown-anchor.js +7 -0
- package/dist/utils/markdown-anchor.js.map +7 -0
- package/dist/utils/markdown-link.js +12 -0
- package/dist/utils/markdown-link.js.map +7 -0
- package/dist/utils/markdown-table.js +17 -0
- package/dist/utils/markdown-table.js.map +7 -0
- package/dist/utils/mermaid-utils.js +11 -0
- package/dist/utils/mermaid-utils.js.map +7 -0
- package/dist/utils/project-paths.js.map +2 -2
- package/dist/utils/source-reference.js +52 -0
- package/dist/utils/source-reference.js.map +7 -0
- package/dist/utils/spec-installer.js +40 -53
- package/dist/utils/spec-installer.js.map +2 -2
- package/dist/utils/spec-version.js +5 -1
- package/dist/utils/spec-version.js.map +2 -2
- package/dist/utils/string-utils.js +12 -0
- package/dist/utils/string-utils.js.map +7 -0
- package/dist/utils/table-formatting.js +19 -0
- package/dist/utils/table-formatting.js.map +7 -0
- package/dist/validators/index.js +4 -0
- package/dist/validators/index.js.map +2 -2
- package/dist/validators/naming-validator.js +20 -23
- package/dist/validators/naming-validator.js.map +2 -2
- package/dist/validators/reference-validator.js +23 -38
- package/dist/validators/reference-validator.js.map +2 -2
- package/dist/validators/relationship-schema-validator.js +243 -0
- package/dist/validators/relationship-schema-validator.js.map +7 -0
- package/dist/validators/schema-validator.js +168 -68
- package/dist/validators/schema-validator.js.map +2 -2
- package/dist/validators/semantic-validator.js +36 -60
- package/dist/validators/semantic-validator.js.map +2 -2
- package/dist/validators/types.js.map +2 -2
- package/dist/validators/validation-formatter.js +159 -0
- package/dist/validators/validation-formatter.js.map +7 -0
- package/dist/validators/validator.js +24 -38
- package/dist/validators/validator.js.map +2 -2
- package/dist/viewer/README.md +139 -0
- package/dist/viewer/assets/main-CY0Xufuj.css +1 -0
- package/dist/viewer/assets/main-DtgErnwF.js +81 -0
- package/dist/viewer/assets/vendor-CxKvDp2x.js +17 -0
- package/dist/viewer/favicon.svg +11 -0
- package/dist/viewer/fonts/inter/Inter-Black.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Bold.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-ExtraBold.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Light.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Medium.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-Regular.woff2 +0 -0
- package/dist/viewer/fonts/inter/Inter-SemiBold.woff2 +0 -0
- package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2 +0 -0
- package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
- package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2 +0 -0
- package/dist/viewer/index.html +15 -0
- package/dist/viewer/manifest.json +99 -0
- package/dist/viewer/version.json +1 -0
- package/package.json +37 -13
- package/PYTHON_CLI_PARITY.md +0 -265
- package/PYTHON_CLI_STRUCTURE_UPDATE.md +0 -246
- package/biome.json +0 -42
- package/bunfig.toml +0 -3
- package/dist/ai/claude-client.js +0 -71
- package/dist/ai/claude-client.js.map +0 -7
- package/dist/ai/context-provider.js +0 -129
- package/dist/ai/context-provider.js.map +0 -7
- package/dist/ai/tools.js +0 -231
- package/dist/ai/tools.js.map +0 -7
- package/dist/commands/migrate.js +0 -36
- package/dist/commands/migrate.js.map +0 -7
- package/dist/commands/project.js +0 -74
- package/dist/commands/project.js.map +0 -7
- package/dist/core/active-changeset.js +0 -52
- package/dist/core/active-changeset.js.map +0 -7
- package/dist/core/projection-engine.js +0 -288
- package/dist/core/projection-engine.js.map +0 -7
- package/dist/schemas/bundled/01-motivation-layer.schema.json +0 -942
- package/dist/schemas/bundled/02-business-layer.schema.json +0 -1293
- package/dist/schemas/bundled/03-security-layer.schema.json +0 -2177
- package/dist/schemas/bundled/04-application-layer.schema.json +0 -1328
- package/dist/schemas/bundled/05-technology-layer.schema.json +0 -1465
- package/dist/schemas/bundled/06-api-layer.schema.json +0 -1743
- package/dist/schemas/bundled/07-data-model-layer.schema.json +0 -1253
- package/dist/schemas/bundled/08-datastore-layer.schema.json +0 -892
- package/dist/schemas/bundled/09-ux-layer.schema.json +0 -1506
- package/dist/schemas/bundled/10-navigation-layer.schema.json +0 -843
- package/dist/schemas/bundled/11-apm-observability-layer.schema.json +0 -1430
- package/dist/schemas/bundled/12-testing-layer.schema.json +0 -1091
- package/dist/schemas/bundled/common/layer-extensions.schema.json +0 -266
- package/dist/schemas/bundled/common/predicates.schema.json +0 -493
- package/dist/schemas/bundled/common/relationships.schema.json +0 -791
- package/dist/schemas/bundled/common/source-references.schema.json +0 -71
- package/dist/schemas/bundled/link-registry.json +0 -1839
- package/dist/schemas/bundled/link-registry.schema.json +0 -339
- package/dist/schemas/bundled/relationship-catalog.json +0 -1302
- package/dist/schemas/bundled/relationship-type.schema.json +0 -221
- package/dist/utils/model-path.js +0 -22
- package/dist/utils/model-path.js.map +0 -7
- package/docs/TEST-INSTRUMENTATION.md +0 -405
- package/docs/telemetry.md +0 -427
- package/test-debug.js +0 -33
- package/test-special.mjs +0 -46
- package/test_runner.ts +0 -7
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
import { readFile } from "fs/promises";
|
|
2
|
-
import { parse as parseYAML } from "yaml";
|
|
3
|
-
import { Element } from "./element.js";
|
|
4
|
-
class PropertyTransformer {
|
|
5
|
-
config;
|
|
6
|
-
constructor(config) {
|
|
7
|
-
this.config = config;
|
|
8
|
-
}
|
|
9
|
-
apply(value) {
|
|
10
|
-
if (value == null)
|
|
11
|
-
return null;
|
|
12
|
-
const strValue = String(value);
|
|
13
|
-
switch (this.config.type) {
|
|
14
|
-
case "uppercase":
|
|
15
|
-
return strValue.toUpperCase();
|
|
16
|
-
case "lowercase":
|
|
17
|
-
return strValue.toLowerCase();
|
|
18
|
-
case "kebab":
|
|
19
|
-
return toKebabCase(strValue);
|
|
20
|
-
case "snake":
|
|
21
|
-
return toSnakeCase(strValue);
|
|
22
|
-
case "pascal":
|
|
23
|
-
return toPascalCase(strValue);
|
|
24
|
-
case "prefix":
|
|
25
|
-
return `${this.config.value}${strValue}`;
|
|
26
|
-
case "suffix":
|
|
27
|
-
return `${strValue}${this.config.value}`;
|
|
28
|
-
case "template":
|
|
29
|
-
return this.config.value?.replace("{value}", strValue) ?? strValue;
|
|
30
|
-
default:
|
|
31
|
-
return value;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
class ConditionEvaluator {
|
|
36
|
-
config;
|
|
37
|
-
constructor(config) {
|
|
38
|
-
this.config = config;
|
|
39
|
-
}
|
|
40
|
-
evaluate(element) {
|
|
41
|
-
const fieldValue = getNestedProperty(element, this.config.field);
|
|
42
|
-
switch (this.config.operator) {
|
|
43
|
-
case "exists":
|
|
44
|
-
return fieldValue != null;
|
|
45
|
-
case "equals":
|
|
46
|
-
return fieldValue === this.config.value;
|
|
47
|
-
case "not_equals":
|
|
48
|
-
return fieldValue !== this.config.value;
|
|
49
|
-
case "contains":
|
|
50
|
-
return fieldValue ? String(fieldValue).includes(String(this.config.value)) : !1;
|
|
51
|
-
case "matches":
|
|
52
|
-
return fieldValue && this.config.pattern ? new RegExp(this.config.pattern).test(String(fieldValue)) : !1;
|
|
53
|
-
case "gt":
|
|
54
|
-
return fieldValue > this.config.value;
|
|
55
|
-
case "lt":
|
|
56
|
-
return fieldValue < this.config.value;
|
|
57
|
-
case "in":
|
|
58
|
-
return Array.isArray(this.config.value) ? this.config.value.includes(fieldValue) : !1;
|
|
59
|
-
default:
|
|
60
|
-
return !1;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
class ProjectionEngine {
|
|
65
|
-
model;
|
|
66
|
-
rules = [];
|
|
67
|
-
registry;
|
|
68
|
-
constructor(model, rulesPath) {
|
|
69
|
-
this.model = model, rulesPath && this.loadRulesSync(rulesPath);
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Set reference registry for element registration
|
|
73
|
-
*/
|
|
74
|
-
setRegistry(registry) {
|
|
75
|
-
this.registry = registry;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Load projection rules from YAML file
|
|
79
|
-
*/
|
|
80
|
-
async loadRules(path) {
|
|
81
|
-
try {
|
|
82
|
-
const content = await readFile(path, "utf-8"), data = parseYAML(content);
|
|
83
|
-
if (!data.projections || !Array.isArray(data.projections))
|
|
84
|
-
throw new Error("Invalid projection rules file: missing projections array");
|
|
85
|
-
this.rules = data.projections.map((proj) => this.parseProjectionRule(proj));
|
|
86
|
-
} catch (error) {
|
|
87
|
-
throw new Error(`Failed to load projection rules from ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Synchronous version for constructor
|
|
92
|
-
*/
|
|
93
|
-
loadRulesSync(_path) {
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Add a projection rule programmatically
|
|
97
|
-
*/
|
|
98
|
-
addRule(rule) {
|
|
99
|
-
this.rules.push(rule);
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Get all loaded rules
|
|
103
|
-
*/
|
|
104
|
-
getRules() {
|
|
105
|
-
return [...this.rules];
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Clear all rules
|
|
109
|
-
*/
|
|
110
|
-
clearRules() {
|
|
111
|
-
this.rules = [];
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Parse YAML projection definition into ProjectionRule
|
|
115
|
-
*/
|
|
116
|
-
parseProjectionRule(data) {
|
|
117
|
-
const [from_layer, from_type] = data.from.split("."), [to_layer, to_type] = data.to.split("."), ruleData = Array.isArray(data.rules) ? data.rules[0] : data.rules, conditions = (data.conditions || []).map((c) => ({
|
|
118
|
-
field: c.field,
|
|
119
|
-
operator: c.operator,
|
|
120
|
-
value: c.value,
|
|
121
|
-
pattern: c.pattern
|
|
122
|
-
})), property_mappings = [];
|
|
123
|
-
if (ruleData.properties) {
|
|
124
|
-
for (const [target, mapping] of Object.entries(ruleData.properties))
|
|
125
|
-
if (typeof mapping == "string")
|
|
126
|
-
property_mappings.push({ source: mapping, target });
|
|
127
|
-
else if (typeof mapping == "object") {
|
|
128
|
-
const m = mapping;
|
|
129
|
-
property_mappings.push({
|
|
130
|
-
source: m.source,
|
|
131
|
-
target,
|
|
132
|
-
default: m.default,
|
|
133
|
-
required: m.required ?? !1,
|
|
134
|
-
transform: m.transform
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return {
|
|
139
|
-
name: data.name,
|
|
140
|
-
from_layer,
|
|
141
|
-
from_type,
|
|
142
|
-
to_layer,
|
|
143
|
-
to_type,
|
|
144
|
-
name_template: ruleData.name_template,
|
|
145
|
-
property_mappings,
|
|
146
|
-
conditions,
|
|
147
|
-
template_file: ruleData.template,
|
|
148
|
-
create_bidirectional: ruleData.create_bidirectional ?? !0
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Find rules applicable to a source element
|
|
153
|
-
*/
|
|
154
|
-
findApplicableRules(source, targetLayer) {
|
|
155
|
-
return this.rules.filter((rule) => {
|
|
156
|
-
if (rule.from_layer !== source.layer || rule.from_type && rule.from_type !== source.type || targetLayer && rule.to_layer !== targetLayer)
|
|
157
|
-
return !1;
|
|
158
|
-
if (rule.conditions) {
|
|
159
|
-
for (const condition of rule.conditions)
|
|
160
|
-
if (!new ConditionEvaluator(condition).evaluate(source))
|
|
161
|
-
return !1;
|
|
162
|
-
}
|
|
163
|
-
return !0;
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Project a single element to target layer
|
|
168
|
-
*/
|
|
169
|
-
async projectElement(source, targetLayer, rule, dryRun = !1) {
|
|
170
|
-
if (!rule) {
|
|
171
|
-
const applicableRules = this.findApplicableRules(source, targetLayer);
|
|
172
|
-
if (applicableRules.length === 0)
|
|
173
|
-
throw new Error(`No applicable projection rule found for element ${source.id} to layer ${targetLayer}`);
|
|
174
|
-
rule = applicableRules[0];
|
|
175
|
-
}
|
|
176
|
-
const projected = this.buildProjectedElement(source, rule);
|
|
177
|
-
if (!dryRun) {
|
|
178
|
-
const layer = await this.model.getLayer(rule.to_layer);
|
|
179
|
-
if (!layer)
|
|
180
|
-
throw new Error(`Target layer ${rule.to_layer} not found`);
|
|
181
|
-
layer.addElement(projected), this.registry && this.registry.registerElement(projected);
|
|
182
|
-
}
|
|
183
|
-
return projected;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Build projected element from source and rule
|
|
187
|
-
*/
|
|
188
|
-
buildProjectedElement(source, rule) {
|
|
189
|
-
const name = this.renderTemplate(rule.name_template, source), data = {
|
|
190
|
-
id: generateElementId(rule.to_layer, rule.to_type, name),
|
|
191
|
-
name,
|
|
192
|
-
type: rule.to_type,
|
|
193
|
-
layer: rule.to_layer
|
|
194
|
-
};
|
|
195
|
-
for (const mapping of rule.property_mappings) {
|
|
196
|
-
let value;
|
|
197
|
-
if (mapping.source.includes("{") || mapping.source.includes("{{") ? value = this.renderTemplate(mapping.source, source) : value = this.getSourceValue(source, mapping.source), value == null) {
|
|
198
|
-
if (mapping.required)
|
|
199
|
-
throw new Error(`Required property ${mapping.target} is missing from source ${source.id}`);
|
|
200
|
-
value = mapping.default;
|
|
201
|
-
}
|
|
202
|
-
mapping.transform && value !== null && value !== void 0 && (value = new PropertyTransformer(mapping.transform).apply(value)), value != null && setNestedProperty(data, mapping.target, value);
|
|
203
|
-
}
|
|
204
|
-
return rule.create_bidirectional !== !1 && (data.properties || (data.properties = {}), data.properties.realizes = source.id), new Element(data);
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Get value from source element (supports dot notation)
|
|
208
|
-
*/
|
|
209
|
-
getSourceValue(source, path) {
|
|
210
|
-
return path === "id" ? source.id : path === "name" ? source.name : path === "type" ? source.type : path === "layer" ? source.layer : path === "description" ? source.description : getNestedProperty(source, path);
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Render template string with source element data
|
|
214
|
-
*/
|
|
215
|
-
renderTemplate(template, source) {
|
|
216
|
-
const context = {
|
|
217
|
-
id: source.id,
|
|
218
|
-
name: source.name,
|
|
219
|
-
type: source.type,
|
|
220
|
-
layer: source.layer,
|
|
221
|
-
description: source.description,
|
|
222
|
-
properties: source.properties || {},
|
|
223
|
-
name_pascal: toPascalCase(source.name),
|
|
224
|
-
name_kebab: toKebabCase(source.name),
|
|
225
|
-
name_snake: toSnakeCase(source.name)
|
|
226
|
-
};
|
|
227
|
-
let result = template;
|
|
228
|
-
const regex = /\{source\.(\w+)\}/g;
|
|
229
|
-
return result = result.replace(regex, (match, prop) => context[prop] !== void 0 ? String(context[prop]) : match), result;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Project all elements that match rules
|
|
233
|
-
*/
|
|
234
|
-
async projectAll(fromLayer, toLayer, dryRun = !1) {
|
|
235
|
-
const projected = [], layers = fromLayer ? [await this.model.getLayer(fromLayer)] : Array.from(this.model.layers.values());
|
|
236
|
-
for (const layer of layers)
|
|
237
|
-
if (layer)
|
|
238
|
-
for (const element of layer.listElements()) {
|
|
239
|
-
const applicableRules = this.findApplicableRules(element, toLayer);
|
|
240
|
-
for (const rule of applicableRules)
|
|
241
|
-
try {
|
|
242
|
-
const projectedElement = await this.projectElement(element, rule.to_layer, rule, dryRun);
|
|
243
|
-
projected.push(projectedElement);
|
|
244
|
-
} catch (error) {
|
|
245
|
-
console.warn(`Warning: Failed to project ${element.id} with rule ${rule.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
return projected;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
function getNestedProperty(obj, path) {
|
|
252
|
-
const parts = path.split(".");
|
|
253
|
-
let current = obj;
|
|
254
|
-
for (const part of parts)
|
|
255
|
-
if (current && typeof current == "object")
|
|
256
|
-
current = current[part];
|
|
257
|
-
else
|
|
258
|
-
return;
|
|
259
|
-
return current;
|
|
260
|
-
}
|
|
261
|
-
function setNestedProperty(obj, path, value) {
|
|
262
|
-
const parts = path.split(".");
|
|
263
|
-
let current = obj;
|
|
264
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
265
|
-
const part = parts[i];
|
|
266
|
-
(!current[part] || typeof current[part] != "object") && (current[part] = {}), current = current[part];
|
|
267
|
-
}
|
|
268
|
-
current[parts[parts.length - 1]] = value;
|
|
269
|
-
}
|
|
270
|
-
function toKebabCase(text) {
|
|
271
|
-
return text.toLowerCase().replace(/\s+/g, "-").replace(/_/g, "-");
|
|
272
|
-
}
|
|
273
|
-
function toSnakeCase(text) {
|
|
274
|
-
return text.toLowerCase().replace(/\s+/g, "_").replace(/-/g, "_");
|
|
275
|
-
}
|
|
276
|
-
function toPascalCase(text) {
|
|
277
|
-
return text.replace(/-/g, " ").replace(/_/g, " ").split(/\s+/).map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join("");
|
|
278
|
-
}
|
|
279
|
-
function generateElementId(layer, type, name) {
|
|
280
|
-
const kebabName = toKebabCase(name);
|
|
281
|
-
return `${layer}.${type}.${kebabName}`;
|
|
282
|
-
}
|
|
283
|
-
export {
|
|
284
|
-
ConditionEvaluator,
|
|
285
|
-
ProjectionEngine,
|
|
286
|
-
PropertyTransformer
|
|
287
|
-
};
|
|
288
|
-
//# sourceMappingURL=projection-engine.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/core/projection-engine.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Projection Engine - Python CLI Compatible Implementation\n *\n * Automatically creates elements across layers based on projection rules\n * with property transformations, conditional logic, and template rendering.\n *\n * Spec: cli-validation/projection-engine-spec.md\n */\n\nimport { readFile } from 'fs/promises';\nimport { parse as parseYAML } from 'yaml';\nimport { Model } from './model.js';\nimport { Element } from './element.js';\nimport { ReferenceRegistry } from './reference-registry.js';\n\n/**\n * Transform types for property mapping\n */\nexport type TransformType =\n | 'uppercase'\n | 'lowercase'\n | 'kebab'\n | 'snake'\n | 'pascal'\n | 'prefix'\n | 'suffix'\n | 'template';\n\n/**\n * Condition operators for filtering\n */\nexport type ConditionOperator =\n | 'exists'\n | 'equals'\n | 'not_equals'\n | 'contains'\n | 'matches'\n | 'gt'\n | 'lt'\n | 'in';\n\n/**\n * Property transformation configuration\n */\nexport interface PropertyTransform {\n type: TransformType;\n value?: string; // For prefix/suffix/template\n}\n\n/**\n * Condition for filtering source elements\n */\nexport interface ProjectionCondition {\n field: string;\n operator: ConditionOperator;\n value?: any;\n pattern?: string; // For regex matching\n}\n\n/**\n * Property mapping from source to target\n */\nexport interface PropertyMapping {\n source: string;\n target: string;\n default?: any;\n required?: boolean;\n transform?: PropertyTransform;\n}\n\n/**\n * Projection rule definition\n */\nexport interface ProjectionRule {\n name: string;\n from_layer: string;\n from_type: string;\n to_layer: string;\n to_type: string;\n name_template: string;\n property_mappings: PropertyMapping[];\n conditions?: ProjectionCondition[];\n template_file?: string;\n create_bidirectional?: boolean;\n}\n\n/**\n * Helper class for property transformations\n */\nexport class PropertyTransformer {\n constructor(private config: PropertyTransform) {}\n\n apply(value: any): any {\n if (value === null || value === undefined) return null;\n\n const strValue = String(value);\n\n switch (this.config.type) {\n case 'uppercase':\n return strValue.toUpperCase();\n\n case 'lowercase':\n return strValue.toLowerCase();\n\n case 'kebab':\n return toKebabCase(strValue);\n\n case 'snake':\n return toSnakeCase(strValue);\n\n case 'pascal':\n return toPascalCase(strValue);\n\n case 'prefix':\n return `${this.config.value}${strValue}`;\n\n case 'suffix':\n return `${strValue}${this.config.value}`;\n\n case 'template':\n return this.config.value?.replace('{value}', strValue) ?? strValue;\n\n default:\n return value;\n }\n }\n}\n\n/**\n * Helper class for condition evaluation\n */\nexport class ConditionEvaluator {\n constructor(private config: ProjectionCondition) {}\n\n evaluate(element: any): boolean {\n const fieldValue = getNestedProperty(element, this.config.field);\n\n switch (this.config.operator) {\n case 'exists':\n return fieldValue !== null && fieldValue !== undefined;\n\n case 'equals':\n return fieldValue === this.config.value;\n\n case 'not_equals':\n return fieldValue !== this.config.value;\n\n case 'contains':\n return fieldValue\n ? String(fieldValue).includes(String(this.config.value))\n : false;\n\n case 'matches':\n return fieldValue && this.config.pattern\n ? new RegExp(this.config.pattern).test(String(fieldValue))\n : false;\n\n case 'gt':\n return fieldValue > this.config.value;\n\n case 'lt':\n return fieldValue < this.config.value;\n\n case 'in':\n return Array.isArray(this.config.value)\n ? this.config.value.includes(fieldValue)\n : false;\n\n default:\n return false;\n }\n }\n}\n\n/**\n * Projection Engine - Creates elements across layers based on rules\n */\nexport class ProjectionEngine {\n private rules: ProjectionRule[] = [];\n private registry?: ReferenceRegistry;\n\n constructor(private model: Model, rulesPath?: string) {\n if (rulesPath) {\n this.loadRulesSync(rulesPath);\n }\n }\n\n /**\n * Set reference registry for element registration\n */\n setRegistry(registry: ReferenceRegistry): void {\n this.registry = registry;\n }\n\n /**\n * Load projection rules from YAML file\n */\n async loadRules(path: string): Promise<void> {\n try {\n const content = await readFile(path, 'utf-8');\n const data = parseYAML(content);\n\n if (!data.projections || !Array.isArray(data.projections)) {\n throw new Error('Invalid projection rules file: missing projections array');\n }\n\n this.rules = data.projections.map((proj: any) =>\n this.parseProjectionRule(proj)\n );\n } catch (error) {\n throw new Error(\n `Failed to load projection rules from ${path}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Synchronous version for constructor\n */\n private loadRulesSync(_path: string): void {\n // For now, rules must be loaded async via loadRules()\n // This is a placeholder for backward compatibility\n }\n\n /**\n * Add a projection rule programmatically\n */\n addRule(rule: ProjectionRule): void {\n this.rules.push(rule);\n }\n\n /**\n * Get all loaded rules\n */\n getRules(): ProjectionRule[] {\n return [...this.rules];\n }\n\n /**\n * Clear all rules\n */\n clearRules(): void {\n this.rules = [];\n }\n\n /**\n * Parse YAML projection definition into ProjectionRule\n */\n private parseProjectionRule(data: any): ProjectionRule {\n // Split from/to into layer.type\n const [from_layer, from_type] = data.from.split('.');\n const [to_layer, to_type] = data.to.split('.');\n\n // Get first rule definition (simplified - Python CLI could support multiple)\n const ruleData = Array.isArray(data.rules) ? data.rules[0] : data.rules;\n\n // Parse conditions\n const conditions: ProjectionCondition[] = (data.conditions || []).map(\n (c: any) => ({\n field: c.field,\n operator: c.operator,\n value: c.value,\n pattern: c.pattern,\n })\n );\n\n // Parse property mappings\n const property_mappings: PropertyMapping[] = [];\n if (ruleData.properties) {\n for (const [target, mapping] of Object.entries(ruleData.properties)) {\n if (typeof mapping === 'string') {\n // Simple format: { target: source }\n property_mappings.push({ source: mapping as string, target });\n } else if (typeof mapping === 'object') {\n // Advanced format with transform\n const m = mapping as any;\n property_mappings.push({\n source: m.source,\n target,\n default: m.default,\n required: m.required ?? false,\n transform: m.transform,\n });\n }\n }\n }\n\n return {\n name: data.name,\n from_layer,\n from_type,\n to_layer,\n to_type,\n name_template: ruleData.name_template,\n property_mappings,\n conditions,\n template_file: ruleData.template,\n create_bidirectional: ruleData.create_bidirectional ?? true,\n };\n }\n\n /**\n * Find rules applicable to a source element\n */\n findApplicableRules(\n source: Element,\n targetLayer?: string\n ): ProjectionRule[] {\n return this.rules.filter((rule) => {\n // Check layer match\n if (rule.from_layer !== source.layer) return false;\n\n // Check type match (if specified)\n if (rule.from_type && rule.from_type !== source.type) return false;\n\n // Check target layer filter (if specified)\n if (targetLayer && rule.to_layer !== targetLayer) return false;\n\n // Evaluate all conditions (ALL must be true)\n if (rule.conditions) {\n for (const condition of rule.conditions) {\n const evaluator = new ConditionEvaluator(condition);\n if (!evaluator.evaluate(source)) {\n return false;\n }\n }\n }\n\n return true;\n });\n }\n\n /**\n * Project a single element to target layer\n */\n async projectElement(\n source: Element,\n targetLayer: string,\n rule?: ProjectionRule,\n dryRun: boolean = false\n ): Promise<Element> {\n // Find rule if not provided\n if (!rule) {\n const applicableRules = this.findApplicableRules(source, targetLayer);\n if (applicableRules.length === 0) {\n throw new Error(\n `No applicable projection rule found for element ${source.id} to layer ${targetLayer}`\n );\n }\n rule = applicableRules[0];\n }\n\n // Build projected element\n const projected = this.buildProjectedElement(source, rule);\n\n // If not dry run, add to model\n if (!dryRun) {\n const layer = await this.model.getLayer(rule.to_layer);\n if (!layer) {\n throw new Error(`Target layer ${rule.to_layer} not found`);\n }\n\n // Add element to layer\n layer.addElement(projected);\n\n // Register with reference registry if available\n if (this.registry) {\n this.registry.registerElement(projected);\n }\n }\n\n return projected;\n }\n\n /**\n * Build projected element from source and rule\n */\n private buildProjectedElement(\n source: Element,\n rule: ProjectionRule\n ): Element {\n // Render element name\n const name = this.renderTemplate(rule.name_template, source);\n\n // Generate element ID\n const id = generateElementId(rule.to_layer, rule.to_type, name);\n\n // Initialize element data\n const data: any = {\n id,\n name,\n type: rule.to_type,\n layer: rule.to_layer,\n };\n\n // Map properties\n for (const mapping of rule.property_mappings) {\n let value: any;\n\n // Get source value\n if (mapping.source.includes('{') || mapping.source.includes('{{')) {\n // Template string\n value = this.renderTemplate(mapping.source, source);\n } else {\n // Direct property or nested property\n value = this.getSourceValue(source, mapping.source);\n }\n\n // Use default if null\n if (value === null || value === undefined) {\n if (mapping.required) {\n throw new Error(\n `Required property ${mapping.target} is missing from source ${source.id}`\n );\n }\n value = mapping.default;\n }\n\n // Apply transformation if specified\n if (mapping.transform && value !== null && value !== undefined) {\n const transformer = new PropertyTransformer(mapping.transform);\n value = transformer.apply(value);\n }\n\n // Set target property\n if (value !== null && value !== undefined) {\n setNestedProperty(data, mapping.target, value);\n }\n }\n\n // Add bidirectional reference if enabled\n if (rule.create_bidirectional !== false) {\n if (!data.properties) data.properties = {};\n data.properties.realizes = source.id;\n }\n\n // Create Element instance\n return new Element(data);\n }\n\n /**\n * Get value from source element (supports dot notation)\n */\n private getSourceValue(source: Element, path: string): any {\n // Check for direct element properties\n if (path === 'id') return source.id;\n if (path === 'name') return source.name;\n if (path === 'type') return source.type;\n if (path === 'layer') return source.layer;\n if (path === 'description') return source.description;\n\n // Check nested properties\n return getNestedProperty(source, path);\n }\n\n /**\n * Render template string with source element data\n */\n private renderTemplate(template: string, source: Element): string {\n // Build context\n const context: any = {\n id: source.id,\n name: source.name,\n type: source.type,\n layer: source.layer,\n description: source.description,\n properties: (source as any).properties || {},\n name_pascal: toPascalCase(source.name),\n name_kebab: toKebabCase(source.name),\n name_snake: toSnakeCase(source.name),\n };\n\n // Simple template replacement for {source.xxx}\n let result = template;\n const regex = /\\{source\\.(\\w+)\\}/g;\n result = result.replace(regex, (match, prop) => {\n return context[prop] !== undefined ? String(context[prop]) : match;\n });\n\n return result;\n }\n\n /**\n * Project all elements that match rules\n */\n async projectAll(\n fromLayer?: string,\n toLayer?: string,\n dryRun: boolean = false\n ): Promise<Element[]> {\n const projected: Element[] = [];\n\n // Get source elements\n const layers = fromLayer\n ? [await this.model.getLayer(fromLayer)]\n : Array.from(this.model.layers.values());\n\n for (const layer of layers) {\n if (!layer) continue;\n\n for (const element of layer.listElements()) {\n // Find applicable rules\n const applicableRules = this.findApplicableRules(\n element,\n toLayer\n );\n\n // Project with each applicable rule\n for (const rule of applicableRules) {\n try {\n const projectedElement = await this.projectElement(\n element,\n rule.to_layer,\n rule,\n dryRun\n );\n projected.push(projectedElement);\n } catch (error) {\n // Log warning and continue\n console.warn(\n `Warning: Failed to project ${element.id} with rule ${rule.name}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n }\n\n return projected;\n }\n}\n\n/**\n * Helper: Get nested property from object\n */\nfunction getNestedProperty(obj: any, path: string): any {\n const parts = path.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (current && typeof current === 'object') {\n current = current[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Helper: Set nested property on object\n */\nfunction setNestedProperty(obj: any, path: string, value: any): void {\n const parts = path.split('.');\n let current = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!current[part] || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part];\n }\n\n current[parts[parts.length - 1]] = value;\n}\n\n/**\n * Helper: Convert to kebab-case\n */\nfunction toKebabCase(text: string): string {\n return text\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/_/g, '-');\n}\n\n/**\n * Helper: Convert to snake_case\n */\nfunction toSnakeCase(text: string): string {\n return text\n .toLowerCase()\n .replace(/\\s+/g, '_')\n .replace(/-/g, '_');\n}\n\n/**\n * Helper: Convert to PascalCase\n */\nfunction toPascalCase(text: string): string {\n const words = text\n .replace(/-/g, ' ')\n .replace(/_/g, ' ')\n .split(/\\s+/);\n return words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('');\n}\n\n/**\n * Helper: Generate element ID\n */\nfunction generateElementId(layer: string, type: string, name: string): string {\n const kebabName = toKebabCase(name);\n return `${layer}.${type}.${kebabName}`;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|