@memoarchitect/tools 0.4.4
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 +171 -0
- package/package.json +86 -0
- package/packages/tools/lib/__tests__/archetype-parsing.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/archetype-parsing.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/archetype-parsing.test.js +42 -0
- package/packages/tools/lib/__tests__/archetype-parsing.test.js.map +1 -0
- package/packages/tools/lib/__tests__/architecture-discovery.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/architecture-discovery.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/architecture-discovery.test.js +82 -0
- package/packages/tools/lib/__tests__/architecture-discovery.test.js.map +1 -0
- package/packages/tools/lib/__tests__/behavior.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/behavior.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/behavior.test.js +766 -0
- package/packages/tools/lib/__tests__/behavior.test.js.map +1 -0
- package/packages/tools/lib/__tests__/builder.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/builder.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/builder.test.js +728 -0
- package/packages/tools/lib/__tests__/builder.test.js.map +1 -0
- package/packages/tools/lib/__tests__/config-loader.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/config-loader.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/config-loader.test.js +196 -0
- package/packages/tools/lib/__tests__/config-loader.test.js.map +1 -0
- package/packages/tools/lib/__tests__/conformance.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/conformance.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/conformance.test.js +467 -0
- package/packages/tools/lib/__tests__/conformance.test.js.map +1 -0
- package/packages/tools/lib/__tests__/constraint-eval.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/constraint-eval.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/constraint-eval.test.js +195 -0
- package/packages/tools/lib/__tests__/constraint-eval.test.js.map +1 -0
- package/packages/tools/lib/__tests__/constraint-grammar.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/constraint-grammar.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/constraint-grammar.test.js +163 -0
- package/packages/tools/lib/__tests__/constraint-grammar.test.js.map +1 -0
- package/packages/tools/lib/__tests__/constraint-loader.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/constraint-loader.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/constraint-loader.test.js +150 -0
- package/packages/tools/lib/__tests__/constraint-loader.test.js.map +1 -0
- package/packages/tools/lib/__tests__/csv-io.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/csv-io.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/csv-io.test.js +317 -0
- package/packages/tools/lib/__tests__/csv-io.test.js.map +1 -0
- package/packages/tools/lib/__tests__/dhf-doc-store.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/dhf-doc-store.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/dhf-doc-store.test.js +94 -0
- package/packages/tools/lib/__tests__/dhf-doc-store.test.js.map +1 -0
- package/packages/tools/lib/__tests__/dhf-template-resolver.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/dhf-template-resolver.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/dhf-template-resolver.test.js +39 -0
- package/packages/tools/lib/__tests__/dhf-template-resolver.test.js.map +1 -0
- package/packages/tools/lib/__tests__/dhf.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/dhf.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/dhf.test.js +393 -0
- package/packages/tools/lib/__tests__/dhf.test.js.map +1 -0
- package/packages/tools/lib/__tests__/dimension-filter.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/dimension-filter.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/dimension-filter.test.js +85 -0
- package/packages/tools/lib/__tests__/dimension-filter.test.js.map +1 -0
- package/packages/tools/lib/__tests__/dsm.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/dsm.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/dsm.test.js +112 -0
- package/packages/tools/lib/__tests__/dsm.test.js.map +1 -0
- package/packages/tools/lib/__tests__/e2e-workflow.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/e2e-workflow.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/e2e-workflow.test.js +707 -0
- package/packages/tools/lib/__tests__/e2e-workflow.test.js.map +1 -0
- package/packages/tools/lib/__tests__/file-watcher.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/file-watcher.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/file-watcher.test.js +31 -0
- package/packages/tools/lib/__tests__/file-watcher.test.js.map +1 -0
- package/packages/tools/lib/__tests__/impact.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/impact.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/impact.test.js +82 -0
- package/packages/tools/lib/__tests__/impact.test.js.map +1 -0
- package/packages/tools/lib/__tests__/importer.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/importer.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/importer.test.js +336 -0
- package/packages/tools/lib/__tests__/importer.test.js.map +1 -0
- package/packages/tools/lib/__tests__/kind-registry.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/kind-registry.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/kind-registry.test.js +132 -0
- package/packages/tools/lib/__tests__/kind-registry.test.js.map +1 -0
- package/packages/tools/lib/__tests__/llm.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/llm.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/llm.test.js +275 -0
- package/packages/tools/lib/__tests__/llm.test.js.map +1 -0
- package/packages/tools/lib/__tests__/manifest-resolver.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/manifest-resolver.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/manifest-resolver.test.js +97 -0
- package/packages/tools/lib/__tests__/manifest-resolver.test.js.map +1 -0
- package/packages/tools/lib/__tests__/markdown-to-ir.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/markdown-to-ir.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/markdown-to-ir.test.js +74 -0
- package/packages/tools/lib/__tests__/markdown-to-ir.test.js.map +1 -0
- package/packages/tools/lib/__tests__/methodology-scope.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/methodology-scope.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/methodology-scope.test.js +59 -0
- package/packages/tools/lib/__tests__/methodology-scope.test.js.map +1 -0
- package/packages/tools/lib/__tests__/parser.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/parser.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/parser.test.js +938 -0
- package/packages/tools/lib/__tests__/parser.test.js.map +1 -0
- package/packages/tools/lib/__tests__/plugin.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/plugin.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/plugin.test.js +308 -0
- package/packages/tools/lib/__tests__/plugin.test.js.map +1 -0
- package/packages/tools/lib/__tests__/relationship-registry.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/relationship-registry.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/relationship-registry.test.js +96 -0
- package/packages/tools/lib/__tests__/relationship-registry.test.js.map +1 -0
- package/packages/tools/lib/__tests__/rule-registry.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/rule-registry.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/rule-registry.test.js +53 -0
- package/packages/tools/lib/__tests__/rule-registry.test.js.map +1 -0
- package/packages/tools/lib/__tests__/toolchain.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/toolchain.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/toolchain.test.js +94 -0
- package/packages/tools/lib/__tests__/toolchain.test.js.map +1 -0
- package/packages/tools/lib/__tests__/view-deriver-samples.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/view-deriver-samples.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/view-deriver-samples.test.js +39 -0
- package/packages/tools/lib/__tests__/view-deriver-samples.test.js.map +1 -0
- package/packages/tools/lib/__tests__/view-kinds.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/view-kinds.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/view-kinds.test.js +263 -0
- package/packages/tools/lib/__tests__/view-kinds.test.js.map +1 -0
- package/packages/tools/lib/__tests__/view-layout-store.test.d.ts +2 -0
- package/packages/tools/lib/__tests__/view-layout-store.test.d.ts.map +1 -0
- package/packages/tools/lib/__tests__/view-layout-store.test.js +61 -0
- package/packages/tools/lib/__tests__/view-layout-store.test.js.map +1 -0
- package/packages/tools/lib/analysis/dsm.d.ts +47 -0
- package/packages/tools/lib/analysis/dsm.d.ts.map +1 -0
- package/packages/tools/lib/analysis/dsm.js +172 -0
- package/packages/tools/lib/analysis/dsm.js.map +1 -0
- package/packages/tools/lib/analysis/impact.d.ts +35 -0
- package/packages/tools/lib/analysis/impact.d.ts.map +1 -0
- package/packages/tools/lib/analysis/impact.js +97 -0
- package/packages/tools/lib/analysis/impact.js.map +1 -0
- package/packages/tools/lib/bin/memo.d.ts +3 -0
- package/packages/tools/lib/bin/memo.d.ts.map +1 -0
- package/packages/tools/lib/bin/memo.js +461 -0
- package/packages/tools/lib/bin/memo.js.map +1 -0
- package/packages/tools/lib/browser/index.d.ts +13 -0
- package/packages/tools/lib/browser/index.d.ts.map +1 -0
- package/packages/tools/lib/browser/index.js +11 -0
- package/packages/tools/lib/browser/index.js.map +1 -0
- package/packages/tools/lib/commands/archetype-loader.d.ts +15 -0
- package/packages/tools/lib/commands/archetype-loader.d.ts.map +1 -0
- package/packages/tools/lib/commands/archetype-loader.js +31 -0
- package/packages/tools/lib/commands/archetype-loader.js.map +1 -0
- package/packages/tools/lib/commands/ask.d.ts +6 -0
- package/packages/tools/lib/commands/ask.d.ts.map +1 -0
- package/packages/tools/lib/commands/ask.js +79 -0
- package/packages/tools/lib/commands/ask.js.map +1 -0
- package/packages/tools/lib/commands/check.d.ts +6 -0
- package/packages/tools/lib/commands/check.d.ts.map +1 -0
- package/packages/tools/lib/commands/check.js +214 -0
- package/packages/tools/lib/commands/check.js.map +1 -0
- package/packages/tools/lib/commands/create-package.d.ts +12 -0
- package/packages/tools/lib/commands/create-package.d.ts.map +1 -0
- package/packages/tools/lib/commands/create-package.js +293 -0
- package/packages/tools/lib/commands/create-package.js.map +1 -0
- package/packages/tools/lib/commands/dev.d.ts +6 -0
- package/packages/tools/lib/commands/dev.d.ts.map +1 -0
- package/packages/tools/lib/commands/dev.js +316 -0
- package/packages/tools/lib/commands/dev.js.map +1 -0
- package/packages/tools/lib/commands/dhf-draft.d.ts +8 -0
- package/packages/tools/lib/commands/dhf-draft.d.ts.map +1 -0
- package/packages/tools/lib/commands/dhf-draft.js +115 -0
- package/packages/tools/lib/commands/dhf-draft.js.map +1 -0
- package/packages/tools/lib/commands/dhf-init.d.ts +4 -0
- package/packages/tools/lib/commands/dhf-init.d.ts.map +1 -0
- package/packages/tools/lib/commands/dhf-init.js +270 -0
- package/packages/tools/lib/commands/dhf-init.js.map +1 -0
- package/packages/tools/lib/commands/dhf-preview.d.ts +4 -0
- package/packages/tools/lib/commands/dhf-preview.d.ts.map +1 -0
- package/packages/tools/lib/commands/dhf-preview.js +285 -0
- package/packages/tools/lib/commands/dhf-preview.js.map +1 -0
- package/packages/tools/lib/commands/dhf.d.ts +27 -0
- package/packages/tools/lib/commands/dhf.d.ts.map +1 -0
- package/packages/tools/lib/commands/dhf.js +334 -0
- package/packages/tools/lib/commands/dhf.js.map +1 -0
- package/packages/tools/lib/commands/export.d.ts +9 -0
- package/packages/tools/lib/commands/export.d.ts.map +1 -0
- package/packages/tools/lib/commands/export.js +136 -0
- package/packages/tools/lib/commands/export.js.map +1 -0
- package/packages/tools/lib/commands/generate.d.ts +6 -0
- package/packages/tools/lib/commands/generate.d.ts.map +1 -0
- package/packages/tools/lib/commands/generate.js +80 -0
- package/packages/tools/lib/commands/generate.js.map +1 -0
- package/packages/tools/lib/commands/import-ea.d.ts +32 -0
- package/packages/tools/lib/commands/import-ea.d.ts.map +1 -0
- package/packages/tools/lib/commands/import-ea.js +156 -0
- package/packages/tools/lib/commands/import-ea.js.map +1 -0
- package/packages/tools/lib/commands/import-owl.d.ts +19 -0
- package/packages/tools/lib/commands/import-owl.d.ts.map +1 -0
- package/packages/tools/lib/commands/import-owl.js +103 -0
- package/packages/tools/lib/commands/import-owl.js.map +1 -0
- package/packages/tools/lib/commands/import-sysand.d.ts +11 -0
- package/packages/tools/lib/commands/import-sysand.d.ts.map +1 -0
- package/packages/tools/lib/commands/import-sysand.js +87 -0
- package/packages/tools/lib/commands/import-sysand.js.map +1 -0
- package/packages/tools/lib/commands/import.d.ts +30 -0
- package/packages/tools/lib/commands/import.d.ts.map +1 -0
- package/packages/tools/lib/commands/import.js +250 -0
- package/packages/tools/lib/commands/import.js.map +1 -0
- package/packages/tools/lib/commands/init-wizard.d.ts +10 -0
- package/packages/tools/lib/commands/init-wizard.d.ts.map +1 -0
- package/packages/tools/lib/commands/init-wizard.js +69 -0
- package/packages/tools/lib/commands/init-wizard.js.map +1 -0
- package/packages/tools/lib/commands/init.d.ts +30 -0
- package/packages/tools/lib/commands/init.d.ts.map +1 -0
- package/packages/tools/lib/commands/init.js +238 -0
- package/packages/tools/lib/commands/init.js.map +1 -0
- package/packages/tools/lib/commands/install.d.ts +8 -0
- package/packages/tools/lib/commands/install.d.ts.map +1 -0
- package/packages/tools/lib/commands/install.js +238 -0
- package/packages/tools/lib/commands/install.js.map +1 -0
- package/packages/tools/lib/commands/lock.d.ts +2 -0
- package/packages/tools/lib/commands/lock.d.ts.map +1 -0
- package/packages/tools/lib/commands/lock.js +29 -0
- package/packages/tools/lib/commands/lock.js.map +1 -0
- package/packages/tools/lib/commands/ontology.d.ts +14 -0
- package/packages/tools/lib/commands/ontology.d.ts.map +1 -0
- package/packages/tools/lib/commands/ontology.js +464 -0
- package/packages/tools/lib/commands/ontology.js.map +1 -0
- package/packages/tools/lib/commands/pack.d.ts +4 -0
- package/packages/tools/lib/commands/pack.d.ts.map +1 -0
- package/packages/tools/lib/commands/pack.js +89 -0
- package/packages/tools/lib/commands/pack.js.map +1 -0
- package/packages/tools/lib/commands/plugin.d.ts +10 -0
- package/packages/tools/lib/commands/plugin.d.ts.map +1 -0
- package/packages/tools/lib/commands/plugin.js +195 -0
- package/packages/tools/lib/commands/plugin.js.map +1 -0
- package/packages/tools/lib/commands/req.d.ts +10 -0
- package/packages/tools/lib/commands/req.d.ts.map +1 -0
- package/packages/tools/lib/commands/req.js +64 -0
- package/packages/tools/lib/commands/req.js.map +1 -0
- package/packages/tools/lib/commands/roundtrip.d.ts +6 -0
- package/packages/tools/lib/commands/roundtrip.d.ts.map +1 -0
- package/packages/tools/lib/commands/roundtrip.js +162 -0
- package/packages/tools/lib/commands/roundtrip.js.map +1 -0
- package/packages/tools/lib/commands/rules.d.ts +15 -0
- package/packages/tools/lib/commands/rules.d.ts.map +1 -0
- package/packages/tools/lib/commands/rules.js +282 -0
- package/packages/tools/lib/commands/rules.js.map +1 -0
- package/packages/tools/lib/commands/sysand-publish.d.ts +6 -0
- package/packages/tools/lib/commands/sysand-publish.d.ts.map +1 -0
- package/packages/tools/lib/commands/sysand-publish.js +231 -0
- package/packages/tools/lib/commands/sysand-publish.js.map +1 -0
- package/packages/tools/lib/commands/validate.d.ts +6 -0
- package/packages/tools/lib/commands/validate.d.ts.map +1 -0
- package/packages/tools/lib/commands/validate.js +269 -0
- package/packages/tools/lib/commands/validate.js.map +1 -0
- package/packages/tools/lib/completeness/tracker.d.ts +11 -0
- package/packages/tools/lib/completeness/tracker.d.ts.map +1 -0
- package/packages/tools/lib/completeness/tracker.js +86 -0
- package/packages/tools/lib/completeness/tracker.js.map +1 -0
- package/packages/tools/lib/dhf/dhf-config-v2.d.ts +102 -0
- package/packages/tools/lib/dhf/dhf-config-v2.d.ts.map +1 -0
- package/packages/tools/lib/dhf/dhf-config-v2.js +82 -0
- package/packages/tools/lib/dhf/dhf-config-v2.js.map +1 -0
- package/packages/tools/lib/dhf/dhf-config.d.ts +53 -0
- package/packages/tools/lib/dhf/dhf-config.d.ts.map +1 -0
- package/packages/tools/lib/dhf/dhf-config.js +44 -0
- package/packages/tools/lib/dhf/dhf-config.js.map +1 -0
- package/packages/tools/lib/dhf/directive-parser.d.ts +31 -0
- package/packages/tools/lib/dhf/directive-parser.d.ts.map +1 -0
- package/packages/tools/lib/dhf/directive-parser.js +83 -0
- package/packages/tools/lib/dhf/directive-parser.js.map +1 -0
- package/packages/tools/lib/dhf/document-compiler.d.ts +68 -0
- package/packages/tools/lib/dhf/document-compiler.d.ts.map +1 -0
- package/packages/tools/lib/dhf/document-compiler.js +209 -0
- package/packages/tools/lib/dhf/document-compiler.js.map +1 -0
- package/packages/tools/lib/dhf/document-ir.d.ts +170 -0
- package/packages/tools/lib/dhf/document-ir.d.ts.map +1 -0
- package/packages/tools/lib/dhf/document-ir.js +47 -0
- package/packages/tools/lib/dhf/document-ir.js.map +1 -0
- package/packages/tools/lib/dhf/document-registry.d.ts +45 -0
- package/packages/tools/lib/dhf/document-registry.d.ts.map +1 -0
- package/packages/tools/lib/dhf/document-registry.js +342 -0
- package/packages/tools/lib/dhf/document-registry.js.map +1 -0
- package/packages/tools/lib/dhf/export-plugin.d.ts +24 -0
- package/packages/tools/lib/dhf/export-plugin.d.ts.map +1 -0
- package/packages/tools/lib/dhf/export-plugin.js +24 -0
- package/packages/tools/lib/dhf/export-plugin.js.map +1 -0
- package/packages/tools/lib/dhf/exporters/docx-exporter.d.ts +15 -0
- package/packages/tools/lib/dhf/exporters/docx-exporter.d.ts.map +1 -0
- package/packages/tools/lib/dhf/exporters/docx-exporter.js +159 -0
- package/packages/tools/lib/dhf/exporters/docx-exporter.js.map +1 -0
- package/packages/tools/lib/dhf/exporters/html-exporter.d.ts +9 -0
- package/packages/tools/lib/dhf/exporters/html-exporter.d.ts.map +1 -0
- package/packages/tools/lib/dhf/exporters/html-exporter.js +248 -0
- package/packages/tools/lib/dhf/exporters/html-exporter.js.map +1 -0
- package/packages/tools/lib/dhf/exporters/markdown-exporter.d.ts +9 -0
- package/packages/tools/lib/dhf/exporters/markdown-exporter.d.ts.map +1 -0
- package/packages/tools/lib/dhf/exporters/markdown-exporter.js +147 -0
- package/packages/tools/lib/dhf/exporters/markdown-exporter.js.map +1 -0
- package/packages/tools/lib/dhf/index.d.ts +15 -0
- package/packages/tools/lib/dhf/index.d.ts.map +1 -0
- package/packages/tools/lib/dhf/index.js +21 -0
- package/packages/tools/lib/dhf/index.js.map +1 -0
- package/packages/tools/lib/dhf/markdown-to-ir.d.ts +19 -0
- package/packages/tools/lib/dhf/markdown-to-ir.d.ts.map +1 -0
- package/packages/tools/lib/dhf/markdown-to-ir.js +193 -0
- package/packages/tools/lib/dhf/markdown-to-ir.js.map +1 -0
- package/packages/tools/lib/dhf/query-engine.d.ts +61 -0
- package/packages/tools/lib/dhf/query-engine.d.ts.map +1 -0
- package/packages/tools/lib/dhf/query-engine.js +109 -0
- package/packages/tools/lib/dhf/query-engine.js.map +1 -0
- package/packages/tools/lib/dhf/query-executor.d.ts +33 -0
- package/packages/tools/lib/dhf/query-executor.d.ts.map +1 -0
- package/packages/tools/lib/dhf/query-executor.js +222 -0
- package/packages/tools/lib/dhf/query-executor.js.map +1 -0
- package/packages/tools/lib/dhf/script-runner.d.ts +4 -0
- package/packages/tools/lib/dhf/script-runner.d.ts.map +1 -0
- package/packages/tools/lib/dhf/script-runner.js +62 -0
- package/packages/tools/lib/dhf/script-runner.js.map +1 -0
- package/packages/tools/lib/dhf/snapshot.d.ts +60 -0
- package/packages/tools/lib/dhf/snapshot.d.ts.map +1 -0
- package/packages/tools/lib/dhf/snapshot.js +185 -0
- package/packages/tools/lib/dhf/snapshot.js.map +1 -0
- package/packages/tools/lib/dhf/template-engine.d.ts +18 -0
- package/packages/tools/lib/dhf/template-engine.d.ts.map +1 -0
- package/packages/tools/lib/dhf/template-engine.js +339 -0
- package/packages/tools/lib/dhf/template-engine.js.map +1 -0
- package/packages/tools/lib/dhf/template-resolver.d.ts +42 -0
- package/packages/tools/lib/dhf/template-resolver.d.ts.map +1 -0
- package/packages/tools/lib/dhf/template-resolver.js +196 -0
- package/packages/tools/lib/dhf/template-resolver.js.map +1 -0
- package/packages/tools/lib/import/column-mapper.d.ts +35 -0
- package/packages/tools/lib/import/column-mapper.d.ts.map +1 -0
- package/packages/tools/lib/import/column-mapper.js +171 -0
- package/packages/tools/lib/import/column-mapper.js.map +1 -0
- package/packages/tools/lib/import/import-diff.d.ts +49 -0
- package/packages/tools/lib/import/import-diff.d.ts.map +1 -0
- package/packages/tools/lib/import/import-diff.js +102 -0
- package/packages/tools/lib/import/import-diff.js.map +1 -0
- package/packages/tools/lib/import/recipes.d.ts +43 -0
- package/packages/tools/lib/import/recipes.d.ts.map +1 -0
- package/packages/tools/lib/import/recipes.js +133 -0
- package/packages/tools/lib/import/recipes.js.map +1 -0
- package/packages/tools/lib/importer/cameo-importer.d.ts +103 -0
- package/packages/tools/lib/importer/cameo-importer.d.ts.map +1 -0
- package/packages/tools/lib/importer/cameo-importer.js +384 -0
- package/packages/tools/lib/importer/cameo-importer.js.map +1 -0
- package/packages/tools/lib/importer/ea-importer.d.ts +115 -0
- package/packages/tools/lib/importer/ea-importer.d.ts.map +1 -0
- package/packages/tools/lib/importer/ea-importer.js +325 -0
- package/packages/tools/lib/importer/ea-importer.js.map +1 -0
- package/packages/tools/lib/importer/index.d.ts +5 -0
- package/packages/tools/lib/importer/index.d.ts.map +1 -0
- package/packages/tools/lib/importer/index.js +15 -0
- package/packages/tools/lib/importer/index.js.map +1 -0
- package/packages/tools/lib/importer/owl-importer.d.ts +91 -0
- package/packages/tools/lib/importer/owl-importer.d.ts.map +1 -0
- package/packages/tools/lib/importer/owl-importer.js +429 -0
- package/packages/tools/lib/importer/owl-importer.js.map +1 -0
- package/packages/tools/lib/importer/sysand-importer.d.ts +78 -0
- package/packages/tools/lib/importer/sysand-importer.d.ts.map +1 -0
- package/packages/tools/lib/importer/sysand-importer.js +188 -0
- package/packages/tools/lib/importer/sysand-importer.js.map +1 -0
- package/packages/tools/lib/index.d.ts +44 -0
- package/packages/tools/lib/index.d.ts.map +1 -0
- package/packages/tools/lib/index.js +56 -0
- package/packages/tools/lib/index.js.map +1 -0
- package/packages/tools/lib/language/generated/ast.d.ts +629 -0
- package/packages/tools/lib/language/generated/ast.d.ts.map +1 -0
- package/packages/tools/lib/language/generated/ast.js +961 -0
- package/packages/tools/lib/language/generated/ast.js.map +1 -0
- package/packages/tools/lib/language/generated/grammar.d.ts +7 -0
- package/packages/tools/lib/language/generated/grammar.d.ts.map +1 -0
- package/packages/tools/lib/language/generated/grammar.js +5676 -0
- package/packages/tools/lib/language/generated/grammar.js.map +1 -0
- package/packages/tools/lib/language/generated/module.d.ts +14 -0
- package/packages/tools/lib/language/generated/module.d.ts.map +1 -0
- package/packages/tools/lib/language/generated/module.js +21 -0
- package/packages/tools/lib/language/generated/module.js.map +1 -0
- package/packages/tools/lib/language/memo-sysml-module.d.ts +24 -0
- package/packages/tools/lib/language/memo-sysml-module.d.ts.map +1 -0
- package/packages/tools/lib/language/memo-sysml-module.js +20 -0
- package/packages/tools/lib/language/memo-sysml-module.js.map +1 -0
- package/packages/tools/lib/llm/ask-engine.d.ts +17 -0
- package/packages/tools/lib/llm/ask-engine.d.ts.map +1 -0
- package/packages/tools/lib/llm/ask-engine.js +43 -0
- package/packages/tools/lib/llm/ask-engine.js.map +1 -0
- package/packages/tools/lib/llm/draft-engine.d.ts +32 -0
- package/packages/tools/lib/llm/draft-engine.d.ts.map +1 -0
- package/packages/tools/lib/llm/draft-engine.js +270 -0
- package/packages/tools/lib/llm/draft-engine.js.map +1 -0
- package/packages/tools/lib/llm/generate-engine.d.ts +21 -0
- package/packages/tools/lib/llm/generate-engine.d.ts.map +1 -0
- package/packages/tools/lib/llm/generate-engine.js +83 -0
- package/packages/tools/lib/llm/generate-engine.js.map +1 -0
- package/packages/tools/lib/llm/index.d.ts +6 -0
- package/packages/tools/lib/llm/index.d.ts.map +1 -0
- package/packages/tools/lib/llm/index.js +11 -0
- package/packages/tools/lib/llm/index.js.map +1 -0
- package/packages/tools/lib/llm/llm-provider.d.ts +40 -0
- package/packages/tools/lib/llm/llm-provider.d.ts.map +1 -0
- package/packages/tools/lib/llm/llm-provider.js +121 -0
- package/packages/tools/lib/llm/llm-provider.js.map +1 -0
- package/packages/tools/lib/llm/model-context.d.ts +28 -0
- package/packages/tools/lib/llm/model-context.d.ts.map +1 -0
- package/packages/tools/lib/llm/model-context.js +162 -0
- package/packages/tools/lib/llm/model-context.js.map +1 -0
- package/packages/tools/lib/lock.d.ts +43 -0
- package/packages/tools/lib/lock.d.ts.map +1 -0
- package/packages/tools/lib/lock.js +225 -0
- package/packages/tools/lib/lock.js.map +1 -0
- package/packages/tools/lib/model/builder.d.ts +22 -0
- package/packages/tools/lib/model/builder.d.ts.map +1 -0
- package/packages/tools/lib/model/builder.js +708 -0
- package/packages/tools/lib/model/builder.js.map +1 -0
- package/packages/tools/lib/model/config-loader.d.ts +34 -0
- package/packages/tools/lib/model/config-loader.d.ts.map +1 -0
- package/packages/tools/lib/model/config-loader.js +257 -0
- package/packages/tools/lib/model/config-loader.js.map +1 -0
- package/packages/tools/lib/model/config.d.ts +220 -0
- package/packages/tools/lib/model/config.d.ts.map +1 -0
- package/packages/tools/lib/model/config.js +14 -0
- package/packages/tools/lib/model/config.js.map +1 -0
- package/packages/tools/lib/model/content-store.d.ts +8 -0
- package/packages/tools/lib/model/content-store.d.ts.map +1 -0
- package/packages/tools/lib/model/content-store.js +59 -0
- package/packages/tools/lib/model/content-store.js.map +1 -0
- package/packages/tools/lib/model/dimension-filter.d.ts +33 -0
- package/packages/tools/lib/model/dimension-filter.d.ts.map +1 -0
- package/packages/tools/lib/model/dimension-filter.js +57 -0
- package/packages/tools/lib/model/dimension-filter.js.map +1 -0
- package/packages/tools/lib/model/kind-registry.d.ts +72 -0
- package/packages/tools/lib/model/kind-registry.d.ts.map +1 -0
- package/packages/tools/lib/model/kind-registry.js +178 -0
- package/packages/tools/lib/model/kind-registry.js.map +1 -0
- package/packages/tools/lib/model/layer-resolver.d.ts +25 -0
- package/packages/tools/lib/model/layer-resolver.d.ts.map +1 -0
- package/packages/tools/lib/model/layer-resolver.js +82 -0
- package/packages/tools/lib/model/layer-resolver.js.map +1 -0
- package/packages/tools/lib/model/manifest.d.ts +23 -0
- package/packages/tools/lib/model/manifest.d.ts.map +1 -0
- package/packages/tools/lib/model/manifest.js +117 -0
- package/packages/tools/lib/model/manifest.js.map +1 -0
- package/packages/tools/lib/model/methodology-loader.d.ts +56 -0
- package/packages/tools/lib/model/methodology-loader.d.ts.map +1 -0
- package/packages/tools/lib/model/methodology-loader.js +203 -0
- package/packages/tools/lib/model/methodology-loader.js.map +1 -0
- package/packages/tools/lib/model/ontology-loader.d.ts +113 -0
- package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -0
- package/packages/tools/lib/model/ontology-loader.js +901 -0
- package/packages/tools/lib/model/ontology-loader.js.map +1 -0
- package/packages/tools/lib/model/package-registry.d.ts +62 -0
- package/packages/tools/lib/model/package-registry.d.ts.map +1 -0
- package/packages/tools/lib/model/package-registry.js +164 -0
- package/packages/tools/lib/model/package-registry.js.map +1 -0
- package/packages/tools/lib/model/parser-utils.d.ts +23 -0
- package/packages/tools/lib/model/parser-utils.d.ts.map +1 -0
- package/packages/tools/lib/model/parser-utils.js +63 -0
- package/packages/tools/lib/model/parser-utils.js.map +1 -0
- package/packages/tools/lib/model/paths.d.ts +18 -0
- package/packages/tools/lib/model/paths.d.ts.map +1 -0
- package/packages/tools/lib/model/paths.js +26 -0
- package/packages/tools/lib/model/paths.js.map +1 -0
- package/packages/tools/lib/model/relationship-registry.d.ts +64 -0
- package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -0
- package/packages/tools/lib/model/relationship-registry.js +141 -0
- package/packages/tools/lib/model/relationship-registry.js.map +1 -0
- package/packages/tools/lib/model/semantic.d.ts +175 -0
- package/packages/tools/lib/model/semantic.d.ts.map +1 -0
- package/packages/tools/lib/model/semantic.js +61 -0
- package/packages/tools/lib/model/semantic.js.map +1 -0
- package/packages/tools/lib/model/short-id.d.ts +32 -0
- package/packages/tools/lib/model/short-id.d.ts.map +1 -0
- package/packages/tools/lib/model/short-id.js +136 -0
- package/packages/tools/lib/model/short-id.js.map +1 -0
- package/packages/tools/lib/model/toolchain.d.ts +12 -0
- package/packages/tools/lib/model/toolchain.d.ts.map +1 -0
- package/packages/tools/lib/model/toolchain.js +92 -0
- package/packages/tools/lib/model/toolchain.js.map +1 -0
- package/packages/tools/lib/model/view-deriver.d.ts +22 -0
- package/packages/tools/lib/model/view-deriver.d.ts.map +1 -0
- package/packages/tools/lib/model/view-deriver.js +160 -0
- package/packages/tools/lib/model/view-deriver.js.map +1 -0
- package/packages/tools/lib/model/view-kinds.d.ts +29 -0
- package/packages/tools/lib/model/view-kinds.d.ts.map +1 -0
- package/packages/tools/lib/model/view-kinds.js +80 -0
- package/packages/tools/lib/model/view-kinds.js.map +1 -0
- package/packages/tools/lib/ontology/owl-exporter.d.ts +43 -0
- package/packages/tools/lib/ontology/owl-exporter.d.ts.map +1 -0
- package/packages/tools/lib/ontology/owl-exporter.js +70 -0
- package/packages/tools/lib/ontology/owl-exporter.js.map +1 -0
- package/packages/tools/lib/operations/index.d.ts +8 -0
- package/packages/tools/lib/operations/index.d.ts.map +1 -0
- package/packages/tools/lib/operations/index.js +8 -0
- package/packages/tools/lib/operations/index.js.map +1 -0
- package/packages/tools/lib/operations/project-snapshot.d.ts +17 -0
- package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -0
- package/packages/tools/lib/operations/project-snapshot.js +103 -0
- package/packages/tools/lib/operations/project-snapshot.js.map +1 -0
- package/packages/tools/lib/plugin/index.d.ts +5 -0
- package/packages/tools/lib/plugin/index.d.ts.map +1 -0
- package/packages/tools/lib/plugin/index.js +10 -0
- package/packages/tools/lib/plugin/index.js.map +1 -0
- package/packages/tools/lib/plugin/plugin-loader.d.ts +26 -0
- package/packages/tools/lib/plugin/plugin-loader.d.ts.map +1 -0
- package/packages/tools/lib/plugin/plugin-loader.js +216 -0
- package/packages/tools/lib/plugin/plugin-loader.js.map +1 -0
- package/packages/tools/lib/plugin/plugin-registry.d.ts +49 -0
- package/packages/tools/lib/plugin/plugin-registry.d.ts.map +1 -0
- package/packages/tools/lib/plugin/plugin-registry.js +121 -0
- package/packages/tools/lib/plugin/plugin-registry.js.map +1 -0
- package/packages/tools/lib/plugin/plugin-scaffold.d.ts +17 -0
- package/packages/tools/lib/plugin/plugin-scaffold.d.ts.map +1 -0
- package/packages/tools/lib/plugin/plugin-scaffold.js +223 -0
- package/packages/tools/lib/plugin/plugin-scaffold.js.map +1 -0
- package/packages/tools/lib/plugin/plugin-types.d.ts +115 -0
- package/packages/tools/lib/plugin/plugin-types.d.ts.map +1 -0
- package/packages/tools/lib/plugin/plugin-types.js +11 -0
- package/packages/tools/lib/plugin/plugin-types.js.map +1 -0
- package/packages/tools/lib/protocol/messages.d.ts +470 -0
- package/packages/tools/lib/protocol/messages.d.ts.map +1 -0
- package/packages/tools/lib/protocol/messages.js +6 -0
- package/packages/tools/lib/protocol/messages.js.map +1 -0
- package/packages/tools/lib/serializer/csv-io.d.ts +113 -0
- package/packages/tools/lib/serializer/csv-io.d.ts.map +1 -0
- package/packages/tools/lib/serializer/csv-io.js +394 -0
- package/packages/tools/lib/serializer/csv-io.js.map +1 -0
- package/packages/tools/lib/serializer/sysml-generator.d.ts +32 -0
- package/packages/tools/lib/serializer/sysml-generator.d.ts.map +1 -0
- package/packages/tools/lib/serializer/sysml-generator.js +120 -0
- package/packages/tools/lib/serializer/sysml-generator.js.map +1 -0
- package/packages/tools/lib/server/config-resolver.d.ts +14 -0
- package/packages/tools/lib/server/config-resolver.d.ts.map +1 -0
- package/packages/tools/lib/server/config-resolver.js +54 -0
- package/packages/tools/lib/server/config-resolver.js.map +1 -0
- package/packages/tools/lib/server/dev-server.d.ts +17 -0
- package/packages/tools/lib/server/dev-server.d.ts.map +1 -0
- package/packages/tools/lib/server/dev-server.js +939 -0
- package/packages/tools/lib/server/dev-server.js.map +1 -0
- package/packages/tools/lib/server/dhf-doc-store.d.ts +11 -0
- package/packages/tools/lib/server/dhf-doc-store.d.ts.map +1 -0
- package/packages/tools/lib/server/dhf-doc-store.js +181 -0
- package/packages/tools/lib/server/dhf-doc-store.js.map +1 -0
- package/packages/tools/lib/server/file-watcher.d.ts +20 -0
- package/packages/tools/lib/server/file-watcher.d.ts.map +1 -0
- package/packages/tools/lib/server/file-watcher.js +140 -0
- package/packages/tools/lib/server/file-watcher.js.map +1 -0
- package/packages/tools/lib/server/persistor.d.ts +25 -0
- package/packages/tools/lib/server/persistor.d.ts.map +1 -0
- package/packages/tools/lib/server/persistor.js +100 -0
- package/packages/tools/lib/server/persistor.js.map +1 -0
- package/packages/tools/lib/server/view-layout-store.d.ts +8 -0
- package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -0
- package/packages/tools/lib/server/view-layout-store.js +73 -0
- package/packages/tools/lib/server/view-layout-store.js.map +1 -0
- package/packages/tools/lib/types/index.d.ts +4 -0
- package/packages/tools/lib/types/index.d.ts.map +1 -0
- package/packages/tools/lib/types/index.js +6 -0
- package/packages/tools/lib/types/index.js.map +1 -0
- package/packages/tools/lib/validator/behavior-validator.d.ts +12 -0
- package/packages/tools/lib/validator/behavior-validator.d.ts.map +1 -0
- package/packages/tools/lib/validator/behavior-validator.js +124 -0
- package/packages/tools/lib/validator/behavior-validator.js.map +1 -0
- package/packages/tools/lib/validator/constraint-eval.d.ts +90 -0
- package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -0
- package/packages/tools/lib/validator/constraint-eval.js +478 -0
- package/packages/tools/lib/validator/constraint-eval.js.map +1 -0
- package/packages/tools/lib/validator/constraint-loader.d.ts +10 -0
- package/packages/tools/lib/validator/constraint-loader.d.ts.map +1 -0
- package/packages/tools/lib/validator/constraint-loader.js +113 -0
- package/packages/tools/lib/validator/constraint-loader.js.map +1 -0
- package/packages/tools/lib/validator/rule-engine.d.ts +13 -0
- package/packages/tools/lib/validator/rule-engine.d.ts.map +1 -0
- package/packages/tools/lib/validator/rule-engine.js +38 -0
- package/packages/tools/lib/validator/rule-engine.js.map +1 -0
- package/packages/tools/lib/validator/rule-registry.d.ts +61 -0
- package/packages/tools/lib/validator/rule-registry.d.ts.map +1 -0
- package/packages/tools/lib/validator/rule-registry.js +142 -0
- package/packages/tools/lib/validator/rule-registry.js.map +1 -0
- package/packages/tools/lib/validator/types.d.ts +59 -0
- package/packages/tools/lib/validator/types.d.ts.map +1 -0
- package/packages/tools/lib/validator/types.js +3 -0
- package/packages/tools/lib/validator/types.js.map +1 -0
- package/packages/tools/lib/validator/view-validator.d.ts +11 -0
- package/packages/tools/lib/validator/view-validator.d.ts.map +1 -0
- package/packages/tools/lib/validator/view-validator.js +48 -0
- package/packages/tools/lib/validator/view-validator.js.map +1 -0
- package/packages/tools/src/grammar/memo-sysml.langium +450 -0
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
// ─── Model Builder ────────────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Walks Langium AST documents and produces a serializable MemoModel.
|
|
4
|
+
// Maps SysML usages → MemoElements and ConnectionUsages → MemoRelationships.
|
|
5
|
+
//
|
|
6
|
+
// Key design decisions:
|
|
7
|
+
// - usage.type (e.g. "Hazard") is matched against config.kinds for layer info
|
|
8
|
+
// - ConnectionUsage.type (e.g. "Mitigates") → lowercase → matches config.relationshipTypes
|
|
9
|
+
// - PackageRegistry tracks cross-file packages and resolves imports
|
|
10
|
+
// - Connections are deferred until all elements are extracted (two-pass)
|
|
11
|
+
// - Doc comments are extracted from usage bodies
|
|
12
|
+
//
|
|
13
|
+
// Dual-mode resolution (M41):
|
|
14
|
+
// - If KindRegistry is provided, it takes precedence over config.kinds
|
|
15
|
+
// - If RelationshipRegistry is provided, it takes precedence for relationship validation
|
|
16
|
+
// - Falls back to config when registries are not provided or entry not found
|
|
17
|
+
// - Backward compatible: existing callers pass no registries, behavior unchanged
|
|
18
|
+
//
|
|
19
|
+
// Phase 5 additions:
|
|
20
|
+
// - ActionDefinition bodies extract parameters (in/out/inout)
|
|
21
|
+
// - ActionUsage supports composite actions with nested actions
|
|
22
|
+
// - FlowConnectionUsage → MemoRelationship of type "flow" with flowItem
|
|
23
|
+
// - SuccessionUsage → MemoRelationship pairs of type "succession"
|
|
24
|
+
// - AllocateUsage → MemoRelationship of type "allocateTo"
|
|
25
|
+
// - ItemDefinition → MemoElement with construct "item"
|
|
26
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
27
|
+
import { PackageRegistry } from './package-registry.js';
|
|
28
|
+
import { assignSequentialShortIds } from './short-id.js';
|
|
29
|
+
let relationshipCounter = 0;
|
|
30
|
+
/**
|
|
31
|
+
* Resolve a kind definition using registry-first, config-fallback strategy.
|
|
32
|
+
* Returns the KindDefinition and the resolved kind name.
|
|
33
|
+
*/
|
|
34
|
+
function resolveKindDef(typeName, config, registries) {
|
|
35
|
+
// Try registry first
|
|
36
|
+
if (registries?.kindRegistry) {
|
|
37
|
+
const entry = registries.kindRegistry.getKind(typeName);
|
|
38
|
+
if (entry) {
|
|
39
|
+
return {
|
|
40
|
+
kindDef: { label: entry.label, layer: entry.layer, sysmlConstruct: entry.sysmlConstruct },
|
|
41
|
+
resolvedKind: typeName,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Try local part of qualified name
|
|
45
|
+
if (typeName.includes('::')) {
|
|
46
|
+
const localType = typeName.split('::').pop();
|
|
47
|
+
const localEntry = registries.kindRegistry.getKind(localType);
|
|
48
|
+
if (localEntry) {
|
|
49
|
+
return {
|
|
50
|
+
kindDef: { label: localEntry.label, layer: localEntry.layer, sysmlConstruct: localEntry.sysmlConstruct },
|
|
51
|
+
resolvedKind: localType,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Fall back to config (if kinds are present)
|
|
57
|
+
const kinds = config.kinds ?? {};
|
|
58
|
+
const kindDef = kinds[typeName];
|
|
59
|
+
if (kindDef) {
|
|
60
|
+
return { kindDef, resolvedKind: typeName };
|
|
61
|
+
}
|
|
62
|
+
// Try local part of qualified name in config
|
|
63
|
+
if (typeName.includes('::')) {
|
|
64
|
+
const localType = typeName.split('::').pop();
|
|
65
|
+
if (kinds[localType]) {
|
|
66
|
+
return { kindDef: kinds[localType], resolvedKind: localType };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { kindDef: undefined, resolvedKind: typeName };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build a MemoModel from parsed documents and config.
|
|
73
|
+
* Optionally accepts registries for dual-mode resolution (registry-first, config-fallback).
|
|
74
|
+
*/
|
|
75
|
+
export function buildMemoModel(documents, config, parseErrors = [], registries) {
|
|
76
|
+
relationshipCounter = 0;
|
|
77
|
+
const elements = new Map();
|
|
78
|
+
const relationships = [];
|
|
79
|
+
const errors = [...parseErrors];
|
|
80
|
+
const deferredConnections = [];
|
|
81
|
+
const deferredFlows = [];
|
|
82
|
+
const deferredSuccessions = [];
|
|
83
|
+
const deferredAllocates = [];
|
|
84
|
+
// Phase 1: Build package registry from all documents
|
|
85
|
+
const registry = new PackageRegistry();
|
|
86
|
+
registry.buildFromDocuments(documents);
|
|
87
|
+
// Phase 2: Extract elements from all documents (populates registry)
|
|
88
|
+
for (const { document, filePath } of documents) {
|
|
89
|
+
const model = document.parseResult.value;
|
|
90
|
+
extractFromModel(model, filePath, config, elements, deferredConnections, deferredFlows, deferredSuccessions, deferredAllocates, errors, registry, registries);
|
|
91
|
+
}
|
|
92
|
+
// Phase 3: Resolve connections using the registry (all elements now known)
|
|
93
|
+
const allElementIds = new Set(elements.keys());
|
|
94
|
+
for (const { conn, filePath, packageName } of deferredConnections) {
|
|
95
|
+
resolveConnection(conn, filePath, packageName, config, elements, relationships, registry, allElementIds);
|
|
96
|
+
}
|
|
97
|
+
// Phase 3b: Resolve flow connections
|
|
98
|
+
for (const { flow, filePath, packageName, parentActionId } of deferredFlows) {
|
|
99
|
+
resolveFlowConnection(flow, filePath, packageName, parentActionId, relationships, allElementIds);
|
|
100
|
+
}
|
|
101
|
+
// Phase 3c: Resolve successions
|
|
102
|
+
for (const { succession, filePath, packageName, parentActionId } of deferredSuccessions) {
|
|
103
|
+
resolveSuccession(succession, filePath, packageName, parentActionId, relationships, allElementIds);
|
|
104
|
+
}
|
|
105
|
+
// Phase 3d: Resolve allocations
|
|
106
|
+
for (const { allocate, filePath, packageName } of deferredAllocates) {
|
|
107
|
+
resolveAllocate(allocate, filePath, packageName, elements, relationships, registry, allElementIds);
|
|
108
|
+
}
|
|
109
|
+
// Build indexes
|
|
110
|
+
const elementsByKind = new Map();
|
|
111
|
+
const elementsByLayer = new Map();
|
|
112
|
+
for (const el of elements.values()) {
|
|
113
|
+
if (!elementsByKind.has(el.kind))
|
|
114
|
+
elementsByKind.set(el.kind, []);
|
|
115
|
+
elementsByKind.get(el.kind).push(el);
|
|
116
|
+
if (!elementsByLayer.has(el.layer))
|
|
117
|
+
elementsByLayer.set(el.layer, []);
|
|
118
|
+
elementsByLayer.get(el.layer).push(el);
|
|
119
|
+
}
|
|
120
|
+
// Assign sequential short IDs: sort each kind group by element id, then
|
|
121
|
+
// assign PREFIX-1, PREFIX-2, ... Deletion-stable (survivors keep their seq).
|
|
122
|
+
for (const [kind, kindElements] of elementsByKind) {
|
|
123
|
+
const idToShortId = assignSequentialShortIds(kind, kindElements.map(e => e.id));
|
|
124
|
+
for (const el of kindElements) {
|
|
125
|
+
el.shortId = idToShortId.get(el.id);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Phase 4: Validate relationship end types (warnings only).
|
|
129
|
+
// A kind conforms to an end type if it equals it or specializes it
|
|
130
|
+
// (transitively) — e.g. HardwareAssembly conforms to ArchitectureElement.
|
|
131
|
+
if (registries?.relationshipRegistry) {
|
|
132
|
+
const conformsTo = (kind, expected) => {
|
|
133
|
+
let current = kind;
|
|
134
|
+
const seen = new Set();
|
|
135
|
+
while (current && !seen.has(current)) {
|
|
136
|
+
if (current === expected)
|
|
137
|
+
return true;
|
|
138
|
+
seen.add(current);
|
|
139
|
+
current = registries.kindRegistry?.getKind(current)?.superType;
|
|
140
|
+
}
|
|
141
|
+
// Legacy fallback when the kind hierarchy is unknown to the registry
|
|
142
|
+
return kind.endsWith(expected);
|
|
143
|
+
};
|
|
144
|
+
for (const rel of relationships) {
|
|
145
|
+
const regEntry = registries.relationshipRegistry.getRelType(rel.type);
|
|
146
|
+
if (!regEntry || regEntry.ends.length === 0)
|
|
147
|
+
continue;
|
|
148
|
+
const sourceEl = elements.get(rel.sourceId);
|
|
149
|
+
const targetEl = elements.get(rel.targetId);
|
|
150
|
+
// Check if the source/target kinds match the typed ends
|
|
151
|
+
for (const end of regEntry.ends) {
|
|
152
|
+
if (!end.type)
|
|
153
|
+
continue; // untyped ends allow any kind
|
|
154
|
+
// Match end to source or target by position (first end = source, second = target)
|
|
155
|
+
const endIndex = regEntry.ends.indexOf(end);
|
|
156
|
+
const el = endIndex === 0 ? sourceEl : targetEl;
|
|
157
|
+
if (!el)
|
|
158
|
+
continue;
|
|
159
|
+
if (!conformsTo(el.kind, end.type)) {
|
|
160
|
+
errors.push({
|
|
161
|
+
message: `[well-formedness] Relationship "${rel.type}" expects ${end.name} to be ${end.type}, but found ${el.kind}`,
|
|
162
|
+
file: rel.file ?? '',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const relationshipsByType = new Map();
|
|
169
|
+
const outgoing = new Map();
|
|
170
|
+
const incoming = new Map();
|
|
171
|
+
for (const rel of relationships) {
|
|
172
|
+
if (!relationshipsByType.has(rel.type))
|
|
173
|
+
relationshipsByType.set(rel.type, []);
|
|
174
|
+
relationshipsByType.get(rel.type).push(rel);
|
|
175
|
+
if (!outgoing.has(rel.sourceId))
|
|
176
|
+
outgoing.set(rel.sourceId, []);
|
|
177
|
+
outgoing.get(rel.sourceId).push(rel);
|
|
178
|
+
if (!incoming.has(rel.targetId))
|
|
179
|
+
incoming.set(rel.targetId, []);
|
|
180
|
+
incoming.get(rel.targetId).push(rel);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
elements,
|
|
184
|
+
relationships,
|
|
185
|
+
errors,
|
|
186
|
+
elementsByKind,
|
|
187
|
+
elementsByLayer,
|
|
188
|
+
relationshipsByType,
|
|
189
|
+
outgoing,
|
|
190
|
+
incoming,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// ─── AST Walking ────────────────────────────────────────────────────────────
|
|
194
|
+
function extractFromModel(model, filePath, config, elements, deferredConnections, deferredFlows, deferredSuccessions, deferredAllocates, errors, registry, registries) {
|
|
195
|
+
for (const member of model.members) {
|
|
196
|
+
if (member.$type === 'PackageDeclaration') {
|
|
197
|
+
extractFromPackage(member, filePath, '', config, elements, deferredConnections, deferredFlows, deferredSuccessions, deferredAllocates, errors, registry, registries);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function extractFromPackage(pkg, filePath, parentPackage, config, elements, deferredConnections, deferredFlows, deferredSuccessions, deferredAllocates, errors, registry, registries) {
|
|
202
|
+
const packageName = parentPackage ? `${parentPackage}::${pkg.name}` : pkg.name;
|
|
203
|
+
for (const member of pkg.members) {
|
|
204
|
+
switch (member.$type) {
|
|
205
|
+
case 'PackageDeclaration':
|
|
206
|
+
extractFromPackage(member, filePath, packageName, config, elements, deferredConnections, deferredFlows, deferredSuccessions, deferredAllocates, errors, registry, registries);
|
|
207
|
+
break;
|
|
208
|
+
case 'PartUsage':
|
|
209
|
+
extractUsage(member, 'part', filePath, packageName, config, elements, registry, registries);
|
|
210
|
+
break;
|
|
211
|
+
case 'RequirementUsage':
|
|
212
|
+
extractUsage(member, 'requirement', filePath, packageName, config, elements, registry, registries);
|
|
213
|
+
break;
|
|
214
|
+
case 'ActionUsage':
|
|
215
|
+
extractActionUsage(member, filePath, packageName, config, elements, deferredFlows, deferredSuccessions, registry, registries);
|
|
216
|
+
break;
|
|
217
|
+
case 'PortUsage':
|
|
218
|
+
extractUsage(member, 'port', filePath, packageName, config, elements, registry, registries);
|
|
219
|
+
break;
|
|
220
|
+
case 'ViewUsage':
|
|
221
|
+
extractUsage(member, 'view', filePath, packageName, config, elements, registry, registries);
|
|
222
|
+
break;
|
|
223
|
+
case 'ConnectionUsage':
|
|
224
|
+
// Defer connection resolution until all elements are extracted
|
|
225
|
+
deferredConnections.push({
|
|
226
|
+
conn: member,
|
|
227
|
+
filePath,
|
|
228
|
+
packageName,
|
|
229
|
+
});
|
|
230
|
+
break;
|
|
231
|
+
case 'AllocateUsage':
|
|
232
|
+
deferredAllocates.push({
|
|
233
|
+
allocate: member,
|
|
234
|
+
filePath,
|
|
235
|
+
packageName,
|
|
236
|
+
});
|
|
237
|
+
break;
|
|
238
|
+
// ─── Definition members ─────────────────────────────────────
|
|
239
|
+
case 'ActionDefinition':
|
|
240
|
+
extractActionDefinition(member, filePath, packageName, config, elements, registry);
|
|
241
|
+
break;
|
|
242
|
+
case 'ItemDefinition':
|
|
243
|
+
extractItemDefinition(member, filePath, packageName, config, elements, registry);
|
|
244
|
+
break;
|
|
245
|
+
case 'PartDefinition':
|
|
246
|
+
case 'PortDefinition':
|
|
247
|
+
case 'InterfaceDefinition':
|
|
248
|
+
case 'ConnectionDefinition':
|
|
249
|
+
extractDefinitionPorts(member, filePath, packageName, config, elements, registry, registries);
|
|
250
|
+
break;
|
|
251
|
+
// Other definitions (viewpoint def, view def, etc.) inside packages are
|
|
252
|
+
// ontology-level — we don't extract them as model elements in device projects
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function extractUsage(usage, construct, filePath, packageName, config, elements, registry, registries) {
|
|
257
|
+
const id = usage.name;
|
|
258
|
+
const typeName = usage.type; // e.g. "Hazard", "Requirement"
|
|
259
|
+
// Dual-mode resolution: registry first, then config fallback
|
|
260
|
+
const { kindDef: finalKindDef, resolvedKind } = typeName
|
|
261
|
+
? resolveKindDef(typeName, config, registries)
|
|
262
|
+
: { kindDef: undefined, resolvedKind: 'Unknown' };
|
|
263
|
+
const attributes = extractAttributes(usage.body);
|
|
264
|
+
const doc = extractDocComment(usage.body);
|
|
265
|
+
// Nested part members: capture reference bindings (`part viewpoint :> vp;`)
|
|
266
|
+
// and one level of nested part bodies (`part selectionQuery { ... }`) as
|
|
267
|
+
// plain / prefixed attributes, so SysML-modelled views expose their
|
|
268
|
+
// viewpoint binding and selection-query metadata to consumers.
|
|
269
|
+
for (const member of usage.body || []) {
|
|
270
|
+
if (member.$type !== 'PartMember')
|
|
271
|
+
continue;
|
|
272
|
+
const pm = member;
|
|
273
|
+
if (pm.boundRef && pm.name) {
|
|
274
|
+
attributes[pm.name] = pm.boundRef;
|
|
275
|
+
}
|
|
276
|
+
else if (pm.body && pm.name) {
|
|
277
|
+
const nested = extractAttributes(pm.body);
|
|
278
|
+
for (const [k, v] of Object.entries(nested)) {
|
|
279
|
+
attributes[`${pm.name}.${k}`] = v;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Human-readable name: prefer "attribute redefines name" over usage name
|
|
284
|
+
const displayName = attributes['name'] || attributes['title'] || id;
|
|
285
|
+
const element = {
|
|
286
|
+
id,
|
|
287
|
+
name: displayName,
|
|
288
|
+
kind: resolvedKind,
|
|
289
|
+
construct,
|
|
290
|
+
layer: finalKindDef?.layer || 'unknown',
|
|
291
|
+
file: filePath,
|
|
292
|
+
package: packageName || undefined,
|
|
293
|
+
attributes,
|
|
294
|
+
doc,
|
|
295
|
+
};
|
|
296
|
+
// Port-specific fields
|
|
297
|
+
if (construct === 'port') {
|
|
298
|
+
const portNode = usage;
|
|
299
|
+
element.portSpec = {
|
|
300
|
+
type: portNode.type,
|
|
301
|
+
direction: portNode.direction,
|
|
302
|
+
isConjugated: portNode.isConjugated ?? false,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
elements.set(id, element);
|
|
306
|
+
registry.registerElement(id, packageName);
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Extract an ActionDefinition as a MemoElement with parameters.
|
|
310
|
+
*/
|
|
311
|
+
function extractActionDefinition(actionDef, filePath, packageName, config, elements, registry) {
|
|
312
|
+
const id = actionDef.name;
|
|
313
|
+
// Extract parameters from body
|
|
314
|
+
const parameters = [];
|
|
315
|
+
const bodyMembers = actionDef.body || [];
|
|
316
|
+
for (const member of bodyMembers) {
|
|
317
|
+
if (member.$type === 'ActionParameterMember') {
|
|
318
|
+
const param = member;
|
|
319
|
+
parameters.push({
|
|
320
|
+
name: param.name,
|
|
321
|
+
direction: param.direction,
|
|
322
|
+
type: param.type,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const attributes = extractAttributes(bodyMembers);
|
|
327
|
+
const doc = extractDocComment(bodyMembers);
|
|
328
|
+
const behaviorKind = actionDef.behaviorKind ?? 'action';
|
|
329
|
+
const element = {
|
|
330
|
+
id,
|
|
331
|
+
name: id,
|
|
332
|
+
kind: behaviorKind === 'operator' ? 'OperatorDefinition'
|
|
333
|
+
: behaviorKind === 'function' ? 'FunctionDefinition' : 'ActionDefinition',
|
|
334
|
+
construct: 'action',
|
|
335
|
+
layer: 'behavior',
|
|
336
|
+
file: filePath,
|
|
337
|
+
package: packageName || undefined,
|
|
338
|
+
attributes: { ...attributes, behaviorKind },
|
|
339
|
+
doc,
|
|
340
|
+
parameters: parameters.length > 0 ? parameters : undefined,
|
|
341
|
+
};
|
|
342
|
+
elements.set(id, element);
|
|
343
|
+
registry.registerElement(id, packageName);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Extract an ItemDefinition as a MemoElement.
|
|
347
|
+
*/
|
|
348
|
+
function extractItemDefinition(itemDef, filePath, packageName, config, elements, registry) {
|
|
349
|
+
const id = itemDef.name;
|
|
350
|
+
const attributes = extractAttributes(itemDef.body);
|
|
351
|
+
const doc = extractDocComment(itemDef.body);
|
|
352
|
+
const element = {
|
|
353
|
+
id,
|
|
354
|
+
name: id,
|
|
355
|
+
kind: 'ItemDefinition',
|
|
356
|
+
construct: 'item',
|
|
357
|
+
layer: 'behavior',
|
|
358
|
+
file: filePath,
|
|
359
|
+
package: packageName || undefined,
|
|
360
|
+
attributes,
|
|
361
|
+
doc,
|
|
362
|
+
};
|
|
363
|
+
elements.set(id, element);
|
|
364
|
+
registry.registerElement(id, packageName);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Walk a definition body to extract port usages as owned port elements.
|
|
368
|
+
* Sets owner on ports and ownedPorts on the definition.
|
|
369
|
+
*/
|
|
370
|
+
function extractDefinitionPorts(def, filePath, packageName, config, elements, registry, registries) {
|
|
371
|
+
const ownerId = def.name;
|
|
372
|
+
const body = def.body || [];
|
|
373
|
+
const ownedPortIds = [];
|
|
374
|
+
for (const member of body) {
|
|
375
|
+
if (member.$type === 'PortUsage') {
|
|
376
|
+
const portUsage = member;
|
|
377
|
+
extractUsage(portUsage, 'port', filePath, packageName, config, elements, registry, registries);
|
|
378
|
+
const portEl = elements.get(portUsage.name);
|
|
379
|
+
if (portEl) {
|
|
380
|
+
portEl.owner = ownerId;
|
|
381
|
+
ownedPortIds.push(portUsage.name);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (ownedPortIds.length > 0) {
|
|
386
|
+
const ownerEl = elements.get(ownerId);
|
|
387
|
+
if (ownerEl) {
|
|
388
|
+
ownerEl.ownedPorts = ownedPortIds;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Extract an ActionUsage, including nested actions, flows, and successions.
|
|
394
|
+
* Supports both typed (action name : Type;) and composite (action name { ... }) forms.
|
|
395
|
+
*/
|
|
396
|
+
function extractActionUsage(usage, filePath, packageName, config, elements, deferredFlows, deferredSuccessions, registry, registries, parentActionId) {
|
|
397
|
+
const id = usage.name;
|
|
398
|
+
const typeName = usage.type;
|
|
399
|
+
// Dual-mode resolution: registry first, then config fallback. A type
|
|
400
|
+
// that resolves without a real layer is a model-local action def, not an
|
|
401
|
+
// ontology kind — the usage stays an ActionUsage on the behavior layer
|
|
402
|
+
// (the def reference is kept in the actionType attribute below).
|
|
403
|
+
const behaviorKind = usage.behaviorKind ?? 'action';
|
|
404
|
+
let kind = behaviorKind === 'operator' ? 'OperatorUsage'
|
|
405
|
+
: behaviorKind === 'function' ? 'FunctionUsage' : 'ActionUsage';
|
|
406
|
+
let layer = 'behavior';
|
|
407
|
+
if (typeName) {
|
|
408
|
+
const { kindDef, resolvedKind } = resolveKindDef(typeName, config, registries);
|
|
409
|
+
if (kindDef && kindDef.layer && kindDef.layer !== 'unknown') {
|
|
410
|
+
kind = resolvedKind;
|
|
411
|
+
layer = kindDef.layer;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
const bodyMembers = usage.body || [];
|
|
415
|
+
const attributes = extractAttributes(bodyMembers);
|
|
416
|
+
attributes['behaviorKind'] = behaviorKind;
|
|
417
|
+
const doc = extractDocComment(bodyMembers);
|
|
418
|
+
const displayName = attributes['name'] || attributes['title'] || id;
|
|
419
|
+
// Store the action definition type for flow type checking
|
|
420
|
+
if (typeName) {
|
|
421
|
+
attributes['actionType'] = typeName;
|
|
422
|
+
}
|
|
423
|
+
const element = {
|
|
424
|
+
id,
|
|
425
|
+
name: displayName,
|
|
426
|
+
kind,
|
|
427
|
+
construct: 'action',
|
|
428
|
+
layer,
|
|
429
|
+
file: filePath,
|
|
430
|
+
package: packageName || undefined,
|
|
431
|
+
attributes,
|
|
432
|
+
doc,
|
|
433
|
+
parentAction: parentActionId,
|
|
434
|
+
};
|
|
435
|
+
elements.set(id, element);
|
|
436
|
+
registry.registerElement(id, packageName);
|
|
437
|
+
// Walk body for nested behavior members
|
|
438
|
+
for (const member of bodyMembers) {
|
|
439
|
+
switch (member.$type) {
|
|
440
|
+
case 'ActionUsage':
|
|
441
|
+
// Nested action usage — recursive extraction
|
|
442
|
+
extractActionUsage(member, filePath, packageName, config, elements, deferredFlows, deferredSuccessions, registry, registries, id);
|
|
443
|
+
break;
|
|
444
|
+
case 'FlowConnectionUsage':
|
|
445
|
+
deferredFlows.push({
|
|
446
|
+
flow: member,
|
|
447
|
+
filePath,
|
|
448
|
+
packageName,
|
|
449
|
+
parentActionId: id,
|
|
450
|
+
});
|
|
451
|
+
break;
|
|
452
|
+
case 'SuccessionUsage':
|
|
453
|
+
deferredSuccessions.push({
|
|
454
|
+
succession: member,
|
|
455
|
+
filePath,
|
|
456
|
+
packageName,
|
|
457
|
+
parentActionId: id,
|
|
458
|
+
});
|
|
459
|
+
break;
|
|
460
|
+
case 'ControlNodeUsage':
|
|
461
|
+
extractControlNode(member, filePath, packageName, elements, registry, id);
|
|
462
|
+
break;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Extract a fork/join control node. Modeled as a behavior-layer element with
|
|
468
|
+
* `construct: 'action'` so it participates in succession ordering and swimlane
|
|
469
|
+
* layout like any other flow step, but carries a distinct kind
|
|
470
|
+
* (`ForkNode` / `JoinNode`) and a `controlKind` attribute so renderers draw it
|
|
471
|
+
* as a synchronization bar rather than an action card.
|
|
472
|
+
*/
|
|
473
|
+
function extractControlNode(node, filePath, packageName, elements, registry, parentActionId) {
|
|
474
|
+
const id = node.name;
|
|
475
|
+
const kind = node.controlKind === 'fork' ? 'ForkNode' : 'JoinNode';
|
|
476
|
+
elements.set(id, {
|
|
477
|
+
id,
|
|
478
|
+
name: node.controlKind,
|
|
479
|
+
kind,
|
|
480
|
+
construct: 'action',
|
|
481
|
+
layer: 'behavior',
|
|
482
|
+
file: filePath,
|
|
483
|
+
package: packageName || undefined,
|
|
484
|
+
attributes: { controlKind: node.controlKind },
|
|
485
|
+
parentAction: parentActionId,
|
|
486
|
+
});
|
|
487
|
+
registry.registerElement(id, packageName);
|
|
488
|
+
}
|
|
489
|
+
function resolveConnection(conn, filePath, packageName, config, elements, relationships, registry, allElementIds) {
|
|
490
|
+
const typeName = conn.type; // e.g. "Mitigates", "TraceTo"
|
|
491
|
+
if (!typeName)
|
|
492
|
+
return;
|
|
493
|
+
if (!conn.source || !conn.target)
|
|
494
|
+
return;
|
|
495
|
+
// Normalize: "Mitigates" → "mitigates", "TraceTo" → "traceTo"
|
|
496
|
+
const normalizedType = normalizeRelType(typeName);
|
|
497
|
+
// Resolve source and target using registry for cross-file resolution
|
|
498
|
+
const sourceId = resolveEndpointId(conn.source.ref, packageName, registry, allElementIds);
|
|
499
|
+
const targetId = resolveEndpointId(conn.target.ref, packageName, registry, allElementIds);
|
|
500
|
+
if (!sourceId || !targetId)
|
|
501
|
+
return;
|
|
502
|
+
const rel = {
|
|
503
|
+
id: `rel-${++relationshipCounter}`,
|
|
504
|
+
type: normalizedType,
|
|
505
|
+
sourceId,
|
|
506
|
+
sourceEnd: conn.source.endName,
|
|
507
|
+
targetId,
|
|
508
|
+
targetEnd: conn.target.endName,
|
|
509
|
+
file: filePath,
|
|
510
|
+
};
|
|
511
|
+
// Tag port IDs when endpoints reference port elements
|
|
512
|
+
const sourceEl = elements.get(sourceId);
|
|
513
|
+
if (sourceEl?.construct === 'port') {
|
|
514
|
+
rel.sourcePortId = sourceId;
|
|
515
|
+
}
|
|
516
|
+
const targetEl = elements.get(targetId);
|
|
517
|
+
if (targetEl?.construct === 'port') {
|
|
518
|
+
rel.targetPortId = targetId;
|
|
519
|
+
}
|
|
520
|
+
relationships.push(rel);
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Resolve a flow connection usage into a MemoRelationship.
|
|
524
|
+
* Flow endpoints use dot notation: "actionName.paramName"
|
|
525
|
+
*/
|
|
526
|
+
function resolveFlowConnection(flow, filePath, packageName, parentActionId, relationships, allElementIds) {
|
|
527
|
+
const sourceRef = flow.source?.ref;
|
|
528
|
+
const targetRef = flow.target?.ref;
|
|
529
|
+
if (!sourceRef || !targetRef)
|
|
530
|
+
return;
|
|
531
|
+
// Parse dot notation: "receive.prescription" → actionId="receive", port="prescription"
|
|
532
|
+
const sourceParts = sourceRef.split('.');
|
|
533
|
+
const targetParts = targetRef.split('.');
|
|
534
|
+
const sourceActionId = sourceParts[0];
|
|
535
|
+
const sourcePort = sourceParts.length > 1 ? sourceParts.slice(1).join('.') : '';
|
|
536
|
+
const targetActionId = targetParts[0];
|
|
537
|
+
const targetPort = targetParts.length > 1 ? targetParts.slice(1).join('.') : '';
|
|
538
|
+
// Only create relationship if both endpoints reference known elements
|
|
539
|
+
if (!allElementIds.has(sourceActionId) || !allElementIds.has(targetActionId))
|
|
540
|
+
return;
|
|
541
|
+
const rel = {
|
|
542
|
+
id: `rel-${++relationshipCounter}`,
|
|
543
|
+
type: 'flow',
|
|
544
|
+
sourceId: sourceActionId,
|
|
545
|
+
sourceEnd: sourcePort,
|
|
546
|
+
targetId: targetActionId,
|
|
547
|
+
targetEnd: targetPort,
|
|
548
|
+
file: filePath,
|
|
549
|
+
flowItem: flow.itemType || undefined,
|
|
550
|
+
};
|
|
551
|
+
relationships.push(rel);
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Resolve a succession usage into pairs of MemoRelationships.
|
|
555
|
+
* "first start then A then B then done" → (start→A), (A→B), (B→done)
|
|
556
|
+
*/
|
|
557
|
+
function resolveSuccession(succession, filePath, packageName, parentActionId, relationships, allElementIds) {
|
|
558
|
+
const steps = succession.steps || [];
|
|
559
|
+
if (steps.length < 2)
|
|
560
|
+
return;
|
|
561
|
+
for (let i = 0; i < steps.length - 1; i++) {
|
|
562
|
+
const fromRef = steps[i].ref;
|
|
563
|
+
const toRef = steps[i + 1].ref;
|
|
564
|
+
// "start" and "done" are pseudo-elements; use parent action as context
|
|
565
|
+
const sourceId = fromRef === 'start'
|
|
566
|
+
? (parentActionId ? `${parentActionId}__start` : '__start')
|
|
567
|
+
: fromRef;
|
|
568
|
+
const targetId = toRef === 'done'
|
|
569
|
+
? (parentActionId ? `${parentActionId}__done` : '__done')
|
|
570
|
+
: toRef;
|
|
571
|
+
// Skip if neither endpoint is a known element (allow start/done pseudo-elements)
|
|
572
|
+
const sourceKnown = fromRef === 'start' || allElementIds.has(sourceId);
|
|
573
|
+
const targetKnown = toRef === 'done' || allElementIds.has(targetId);
|
|
574
|
+
if (!sourceKnown || !targetKnown)
|
|
575
|
+
continue;
|
|
576
|
+
const rel = {
|
|
577
|
+
id: `rel-${++relationshipCounter}`,
|
|
578
|
+
type: 'succession',
|
|
579
|
+
sourceId,
|
|
580
|
+
sourceEnd: '',
|
|
581
|
+
targetId,
|
|
582
|
+
targetEnd: '',
|
|
583
|
+
file: filePath,
|
|
584
|
+
};
|
|
585
|
+
relationships.push(rel);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Resolve an allocate usage into a MemoRelationship and set allocatedTo on the element.
|
|
590
|
+
*/
|
|
591
|
+
function resolveAllocate(allocate, filePath, packageName, elements, relationships, registry, allElementIds) {
|
|
592
|
+
const sourceRef = allocate.source;
|
|
593
|
+
const targetRef = allocate.target;
|
|
594
|
+
if (!sourceRef || !targetRef)
|
|
595
|
+
return;
|
|
596
|
+
// Resolve references
|
|
597
|
+
const sourceId = resolveEndpointId(sourceRef, packageName, registry, allElementIds);
|
|
598
|
+
const targetId = resolveEndpointId(targetRef, packageName, registry, allElementIds);
|
|
599
|
+
if (!sourceId || !targetId)
|
|
600
|
+
return;
|
|
601
|
+
// Set allocatedTo on the source element
|
|
602
|
+
const sourceEl = elements.get(sourceId);
|
|
603
|
+
if (sourceEl) {
|
|
604
|
+
sourceEl.allocatedTo = targetId;
|
|
605
|
+
}
|
|
606
|
+
const rel = {
|
|
607
|
+
id: `rel-${++relationshipCounter}`,
|
|
608
|
+
type: 'allocateTo',
|
|
609
|
+
sourceId,
|
|
610
|
+
sourceEnd: 'action',
|
|
611
|
+
targetId,
|
|
612
|
+
targetEnd: 'part',
|
|
613
|
+
file: filePath,
|
|
614
|
+
};
|
|
615
|
+
relationships.push(rel);
|
|
616
|
+
}
|
|
617
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
618
|
+
function extractAttributes(body) {
|
|
619
|
+
if (!body)
|
|
620
|
+
return {};
|
|
621
|
+
const attrs = {};
|
|
622
|
+
for (const member of body) {
|
|
623
|
+
if (member.$type === 'AttributeMember') {
|
|
624
|
+
const attr = member;
|
|
625
|
+
if (attr.value) {
|
|
626
|
+
attrs[attr.name] = extractAttributeValue(attr.value);
|
|
627
|
+
}
|
|
628
|
+
else if (attr.type) {
|
|
629
|
+
attrs[attr.name] = `<${attr.type}>`;
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
return attrs;
|
|
634
|
+
}
|
|
635
|
+
function extractAttributeValue(value) {
|
|
636
|
+
if (!value)
|
|
637
|
+
return '';
|
|
638
|
+
switch (value.$type) {
|
|
639
|
+
case 'StringValue':
|
|
640
|
+
return value.value.replace(/^"|"$/g, '');
|
|
641
|
+
case 'IntValue':
|
|
642
|
+
return String(value.value);
|
|
643
|
+
case 'RealValue':
|
|
644
|
+
return String(value.value);
|
|
645
|
+
case 'BooleanValue':
|
|
646
|
+
return value.value;
|
|
647
|
+
case 'EnumValue':
|
|
648
|
+
return value.enumRef;
|
|
649
|
+
case 'SetLiteral':
|
|
650
|
+
// { A, B, "c" } → "A, B, c" — keeps attributes flat and readable
|
|
651
|
+
return (value.elements ?? [])
|
|
652
|
+
.map(el => el.value ?? (el.stringValue ?? '').replace(/^"|"$/g, ''))
|
|
653
|
+
.filter((s) => s.length > 0)
|
|
654
|
+
.join(', ');
|
|
655
|
+
default:
|
|
656
|
+
return String(value);
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
function extractDocComment(body) {
|
|
660
|
+
if (!body)
|
|
661
|
+
return undefined;
|
|
662
|
+
const doc = body.find((m) => m.$type === 'DocComment');
|
|
663
|
+
if (!doc)
|
|
664
|
+
return undefined;
|
|
665
|
+
return doc.content
|
|
666
|
+
.replace(/^doc\s+\/\*\s*/, '')
|
|
667
|
+
.replace(/\s*\*\/$/, '')
|
|
668
|
+
.replace(/\n\s*\*\s?/g, ' ')
|
|
669
|
+
.trim();
|
|
670
|
+
}
|
|
671
|
+
/**
|
|
672
|
+
* Resolve a QualifiedName reference to just the local name.
|
|
673
|
+
* In SysML v2 usages: `control ::> rcFlowRateLimiter` — ref is "rcFlowRateLimiter"
|
|
674
|
+
*/
|
|
675
|
+
function resolveRef(ref) {
|
|
676
|
+
if (!ref)
|
|
677
|
+
return undefined;
|
|
678
|
+
// Take the last segment of a qualified name
|
|
679
|
+
const parts = ref.split('::');
|
|
680
|
+
return parts[parts.length - 1] || undefined;
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
683
|
+
* Resolve a relationship endpoint reference to an element id, including
|
|
684
|
+
* dotted feature chains (`sampleActionFlow.process.processStepB`): elements
|
|
685
|
+
* are registered under their leaf name, so when the full reference is not a
|
|
686
|
+
* known element id, resolve its last dot segment instead.
|
|
687
|
+
*/
|
|
688
|
+
function resolveEndpointId(ref, packageName, registry, allElementIds) {
|
|
689
|
+
const direct = registry.resolveElementId(ref, packageName, allElementIds) || resolveRef(ref);
|
|
690
|
+
if (direct && allElementIds.has(direct))
|
|
691
|
+
return direct;
|
|
692
|
+
if (ref.includes('.')) {
|
|
693
|
+
const leaf = ref.split('.').pop();
|
|
694
|
+
const resolved = registry.resolveElementId(leaf, packageName, allElementIds) || resolveRef(leaf);
|
|
695
|
+
if (resolved && allElementIds.has(resolved))
|
|
696
|
+
return resolved;
|
|
697
|
+
}
|
|
698
|
+
return direct;
|
|
699
|
+
}
|
|
700
|
+
/**
|
|
701
|
+
* Normalize relationship type name:
|
|
702
|
+
* PascalCase → camelCase for matching against config.relationshipTypes[].name
|
|
703
|
+
* "Mitigates" → "mitigates", "TraceTo" → "traceTo", "AllocateTo" → "allocateTo"
|
|
704
|
+
*/
|
|
705
|
+
function normalizeRelType(name) {
|
|
706
|
+
return name.charAt(0).toLowerCase() + name.slice(1);
|
|
707
|
+
}
|
|
708
|
+
//# sourceMappingURL=builder.js.map
|