@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,901 @@
|
|
|
1
|
+
// ─── Ontology Loader ──────────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Pipeline: parse ontology SysML → populate KindRegistry + RelationshipRegistry.
|
|
4
|
+
// Walks the config `extends` chain to find ontology packages, locates their
|
|
5
|
+
// `sysml/` directories, parses all SysML files, and populates registries.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// const registries = await loadOntologyRegistries(configPath);
|
|
9
|
+
// const model = buildMemoModel(documents, config, errors, registries);
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
12
|
+
import { resolve, dirname, join, basename } from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
14
|
+
import { KindRegistry } from './kind-registry.js';
|
|
15
|
+
import { RelationshipRegistry } from './relationship-registry.js';
|
|
16
|
+
import { parseFiles } from './parser-utils.js';
|
|
17
|
+
import { VENDOR_ONTOLOGY_DIR, VENDOR_ONTOLOGY_PACKAGES_DIR } from './paths.js';
|
|
18
|
+
import { discoverMemoManifests, findMemoManifests, resolveManifestPath } from './manifest.js';
|
|
19
|
+
/** Layer color palette (mirrors web constants) */
|
|
20
|
+
const LAYER_COLORS = {
|
|
21
|
+
// ontology-core layers
|
|
22
|
+
purpose: '#6366F1', operational: '#8B5CF6', system: '#7C3AED',
|
|
23
|
+
requirements: '#EC4899', functional: '#F59E0B', logical: '#06B6D4',
|
|
24
|
+
hardware: '#10B981', physical: '#10B981',
|
|
25
|
+
software: '#3B82F6', interfaces: '#14B8A6', analysis: '#F97316',
|
|
26
|
+
verification: '#84CC16', relationships: '#9CA3AF',
|
|
27
|
+
// ontology-medical layers
|
|
28
|
+
risk: '#EF4444', safety: '#F97316', 'design-control': '#8B5CF6',
|
|
29
|
+
operations: '#10B981', ui: '#EC4899', clinical: '#06B6D4',
|
|
30
|
+
// ontology-qms layers
|
|
31
|
+
qms: '#6B7280', 'design-control-qms': '#8B5CF6',
|
|
32
|
+
// ontology-iec62304 layers
|
|
33
|
+
'software-lifecycle': '#3B82F6',
|
|
34
|
+
// ontology-cybersecurity layers
|
|
35
|
+
cybersecurity: '#EF4444', privacy: '#6366F1',
|
|
36
|
+
// ontology-ros layers
|
|
37
|
+
middleware: '#0EA5E9',
|
|
38
|
+
// compliance layer
|
|
39
|
+
compliance: '#7C3AED',
|
|
40
|
+
// artifact dimension
|
|
41
|
+
artifacts: '#D97706',
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Parse SysML constructs (part def, requirement def, action def, connection def)
|
|
45
|
+
* from a single SysML file, extracting specialization and doc comments.
|
|
46
|
+
*/
|
|
47
|
+
function parseConstructsInFile(filePath) {
|
|
48
|
+
const kinds = [];
|
|
49
|
+
const relationships = [];
|
|
50
|
+
try {
|
|
51
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
52
|
+
// Match kind definitions with optional :> (specializes) and preceding doc comments
|
|
53
|
+
// Pattern: [doc /* ... */] <construct> def Name [:> SuperType] { ... }
|
|
54
|
+
const kindRegex = /(?:doc\s+\/\*\s*([\s\S]*?)\s*\*\/\s*)?^\s*(?:part|requirement|action|attribute|item|abstract part)\s+def\s+(\w+)(?:\s*(?::>|specializes)\s+(\w+))?/gm;
|
|
55
|
+
for (const m of content.matchAll(kindRegex)) {
|
|
56
|
+
const construct = m[0].match(/(?:abstract\s+)?(part|requirement|action|attribute|item)\s+def/)?.[0]?.trim() ?? 'part def';
|
|
57
|
+
kinds.push({
|
|
58
|
+
name: m[2],
|
|
59
|
+
construct,
|
|
60
|
+
derivesFrom: m[3] || undefined,
|
|
61
|
+
description: m[1]?.replace(/\s+/g, ' ').trim() || undefined,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Match connection defs with endpoint type annotations
|
|
65
|
+
// Pattern: connection def Name { end name : TypeName [mult]; end name : TypeName [mult]; }
|
|
66
|
+
const connBlockRegex = /(?:connection|binding|allocation)\s+def\s+(\w+)\s*\{([^}]*)\}/g;
|
|
67
|
+
for (const m of content.matchAll(connBlockRegex)) {
|
|
68
|
+
const name = m[1];
|
|
69
|
+
const body = m[2];
|
|
70
|
+
// Extract typed ends: `end <name> : <TypeName> [` — ignore untyped ends like `end subject[1]`
|
|
71
|
+
const endRegex = /end\s+\w+\s*:\s*(\w+)\s*\[/g;
|
|
72
|
+
const typedEnds = [];
|
|
73
|
+
for (const em of body.matchAll(endRegex))
|
|
74
|
+
typedEnds.push(em[1]);
|
|
75
|
+
relationships.push({
|
|
76
|
+
name,
|
|
77
|
+
sourceKind: typedEnds[0],
|
|
78
|
+
targetKind: typedEnds[1],
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch { /* skip */ }
|
|
83
|
+
return { kinds, relationships };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Build layer info by scanning the sysml/ directory tree.
|
|
87
|
+
* Apollo-11 convention: sysml/<layer>/<file>.sysml
|
|
88
|
+
*
|
|
89
|
+
* Files under <layer>/ are collected recursively, so both flat
|
|
90
|
+
* (`<layer>/file.sysml`) and nested (`<layer>/<sublayer>/file.sysml`)
|
|
91
|
+
* layouts load. The first directory under sysmlDir is the layer id.
|
|
92
|
+
*/
|
|
93
|
+
export function buildLayers(sysmlDir) {
|
|
94
|
+
const layers = [];
|
|
95
|
+
if (!existsSync(sysmlDir))
|
|
96
|
+
return layers;
|
|
97
|
+
// First pass: collect all kinds across all layers
|
|
98
|
+
const allParsedKinds = [];
|
|
99
|
+
try {
|
|
100
|
+
for (const entry of readdirSync(sysmlDir, { withFileTypes: true })) {
|
|
101
|
+
if (!entry.isDirectory())
|
|
102
|
+
continue;
|
|
103
|
+
const layerId = entry.name;
|
|
104
|
+
const layerDir = join(sysmlDir, layerId);
|
|
105
|
+
const layerKinds = [];
|
|
106
|
+
for (const filePath of collectSysmlFiles(layerDir)) {
|
|
107
|
+
const { kinds } = parseConstructsInFile(filePath);
|
|
108
|
+
// The on-disk tree mirrors the memo:: namespace, so the first
|
|
109
|
+
// sub-directory under a layer is the namespace sub-group
|
|
110
|
+
// (e.g. architecture/<context|risk|…>/, compliance/<iso14971|…>/).
|
|
111
|
+
const rel = filePath.replace(/\\/g, '/').substring(layerDir.replace(/\\/g, '/').length + 1);
|
|
112
|
+
const firstSeg = rel.split('/')[0];
|
|
113
|
+
const group = firstSeg && !firstSeg.endsWith('.sysml') ? firstSeg : undefined;
|
|
114
|
+
// A compliance sub-group that names a regulatory standard also
|
|
115
|
+
// surfaces as `standard` (the rest — artifacts, change, … — do not).
|
|
116
|
+
const standard = layerId === 'compliance' && group && /^(iso|iec|fda|en|astm|ul|nist|cfr|mdr)/i.test(group)
|
|
117
|
+
? group
|
|
118
|
+
: undefined;
|
|
119
|
+
for (const k of kinds) {
|
|
120
|
+
allParsedKinds.push({ ...k, layer: layerId });
|
|
121
|
+
layerKinds.push({
|
|
122
|
+
name: k.name,
|
|
123
|
+
label: k.name.replace(/([A-Z])/g, ' $1').trim(),
|
|
124
|
+
construct: k.construct,
|
|
125
|
+
layer: layerId,
|
|
126
|
+
instanceCount: 0,
|
|
127
|
+
viewpoints: [],
|
|
128
|
+
description: k.description,
|
|
129
|
+
derivesFrom: k.derivesFrom,
|
|
130
|
+
group,
|
|
131
|
+
standard,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
layers.push({
|
|
136
|
+
id: layerId,
|
|
137
|
+
label: layerId.charAt(0).toUpperCase() + layerId.slice(1).replace(/-/g, ' '),
|
|
138
|
+
color: LAYER_COLORS[layerId] ?? '#6B7280',
|
|
139
|
+
kindCount: layerKinds.length,
|
|
140
|
+
kinds: layerKinds,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch { /* skip */ }
|
|
145
|
+
// Second pass: compute derivedBy (reverse lookup of derivesFrom)
|
|
146
|
+
const derivedByMap = new Map();
|
|
147
|
+
for (const k of allParsedKinds) {
|
|
148
|
+
if (k.derivesFrom) {
|
|
149
|
+
if (!derivedByMap.has(k.derivesFrom))
|
|
150
|
+
derivedByMap.set(k.derivesFrom, []);
|
|
151
|
+
derivedByMap.get(k.derivesFrom).push(k.name);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
for (const layer of layers) {
|
|
155
|
+
for (const kind of layer.kinds) {
|
|
156
|
+
kind.derivedBy = derivedByMap.get(kind.name);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return layers;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Collect all connection def relationship types from a sysml/ directory tree.
|
|
163
|
+
* Scans all layers (subdirectories) and collects connection def endpoint info.
|
|
164
|
+
*/
|
|
165
|
+
function buildRelationshipTypes(sysmlDir) {
|
|
166
|
+
const result = [];
|
|
167
|
+
if (!existsSync(sysmlDir))
|
|
168
|
+
return result;
|
|
169
|
+
try {
|
|
170
|
+
for (const entry of readdirSync(sysmlDir, { withFileTypes: true })) {
|
|
171
|
+
if (!entry.isDirectory())
|
|
172
|
+
continue;
|
|
173
|
+
const layerDir = join(sysmlDir, entry.name);
|
|
174
|
+
for (const filePath of collectSysmlFiles(layerDir)) {
|
|
175
|
+
const { relationships } = parseConstructsInFile(filePath);
|
|
176
|
+
for (const r of relationships)
|
|
177
|
+
result.push(r);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch { /* skip */ }
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Read a YAML file and extract a simple string field.
|
|
186
|
+
*/
|
|
187
|
+
function readYamlField(content, field) {
|
|
188
|
+
const m = content.match(new RegExp(`^${field}:\\s*["']?([^"'\\n]+)["']?`, 'm'));
|
|
189
|
+
return m ? m[1].trim() : '';
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Read the `methodology:` field from a project config.
|
|
193
|
+
* Returns a Set of package names: the methodology pkg + every pkg on its
|
|
194
|
+
* extends chain. Used to mark them as selected in getPackageMetadata.
|
|
195
|
+
*/
|
|
196
|
+
function readMethodologyChain(configPath) {
|
|
197
|
+
const out = new Set();
|
|
198
|
+
let methodologyName;
|
|
199
|
+
try {
|
|
200
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
201
|
+
const m = content.match(/^methodology:\s*"?([^"\s#]+)"?/m);
|
|
202
|
+
if (!m)
|
|
203
|
+
return out;
|
|
204
|
+
const raw = m[1];
|
|
205
|
+
const lastAt = raw.lastIndexOf('@');
|
|
206
|
+
methodologyName = lastAt > 0 ? raw.slice(0, lastAt) : raw;
|
|
207
|
+
if (!methodologyName.startsWith('@memoarchitect/'))
|
|
208
|
+
methodologyName = `@memoarchitect/${methodologyName}`;
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return out;
|
|
212
|
+
}
|
|
213
|
+
if (!methodologyName)
|
|
214
|
+
return out;
|
|
215
|
+
// Walk the extends chain starting at the methodology pkg.
|
|
216
|
+
const stack = [methodologyName];
|
|
217
|
+
const visited = new Set();
|
|
218
|
+
while (stack.length) {
|
|
219
|
+
const pkgName = stack.pop();
|
|
220
|
+
if (visited.has(pkgName))
|
|
221
|
+
continue;
|
|
222
|
+
visited.add(pkgName);
|
|
223
|
+
out.add(pkgName);
|
|
224
|
+
const pkgCfg = resolvePackageConfig(pkgName, dirname(configPath));
|
|
225
|
+
if (!pkgCfg)
|
|
226
|
+
continue;
|
|
227
|
+
let content = '';
|
|
228
|
+
try {
|
|
229
|
+
content = readFileSync(pkgCfg, 'utf-8');
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const single = content.match(/^extends:\s*"?(@memo\/[\w-]+)"?/m);
|
|
235
|
+
if (single) {
|
|
236
|
+
stack.push(single[1]);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
const arr = content.match(/^extends:\s*\n((?:\s+-\s+.+\n?)+)/m);
|
|
240
|
+
if (arr) {
|
|
241
|
+
for (const em of arr[1].matchAll(/^\s+-\s+"?(@memo\/[\w-]+)"?/gm))
|
|
242
|
+
stack.push(em[1]);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return out;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get the list of selected ontology package names from a project config file.
|
|
249
|
+
*/
|
|
250
|
+
function readSelectedOntologies(configPath) {
|
|
251
|
+
const selected = new Set();
|
|
252
|
+
try {
|
|
253
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
254
|
+
const section = content.split(/^ontologies:/m)[1];
|
|
255
|
+
if (section) {
|
|
256
|
+
const matches = section.matchAll(/^\s*-\s*name:\s*["']?([\w@\/-]+)["']?/gm);
|
|
257
|
+
for (const m of matches)
|
|
258
|
+
selected.add(m[1]);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch { /* skip */ }
|
|
262
|
+
return selected;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Build OntologyPackageInfo for a single package directory.
|
|
266
|
+
*/
|
|
267
|
+
function buildPackageInfo(pkgDir, selected) {
|
|
268
|
+
const configCandidates = ['memo.package.yaml', 'memo.package.yml', 'memo.config.yaml', 'memo.config.yml'];
|
|
269
|
+
let configContent = '';
|
|
270
|
+
for (const name of configCandidates) {
|
|
271
|
+
const p = join(pkgDir, name);
|
|
272
|
+
if (existsSync(p)) {
|
|
273
|
+
configContent = readFileSync(p, 'utf-8');
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (!configContent)
|
|
278
|
+
return null;
|
|
279
|
+
const name = readYamlField(configContent, 'name') || basename(pkgDir);
|
|
280
|
+
const version = readYamlField(configContent, 'version') || '0.0.0';
|
|
281
|
+
const rawType = readYamlField(configContent, 'type') || 'ontology';
|
|
282
|
+
const type = (['ontology', 'profile', 'extension', 'methodology'].includes(rawType) ? rawType : 'ontology');
|
|
283
|
+
const description = readYamlField(configContent, 'description') || '';
|
|
284
|
+
const extendsField = readYamlField(configContent, 'extends') || undefined;
|
|
285
|
+
const sysmlDirOverride = readYamlField(configContent, 'sysmlDir');
|
|
286
|
+
const sysmlDir = sysmlDirOverride
|
|
287
|
+
? resolve(pkgDir, sysmlDirOverride)
|
|
288
|
+
: join(pkgDir, 'sysml');
|
|
289
|
+
const layers = buildLayers(sysmlDir);
|
|
290
|
+
const kindCount = layers.reduce((s, l) => s + l.kindCount, 0);
|
|
291
|
+
const relationshipTypes = buildRelationshipTypes(sysmlDir);
|
|
292
|
+
const optionalModules = readOptionalModulesList(configContent);
|
|
293
|
+
return {
|
|
294
|
+
name, version, type, description, extends: extendsField, layers, kindCount,
|
|
295
|
+
relationshipCount: relationshipTypes.length, relationshipTypes, selected,
|
|
296
|
+
optionalModules,
|
|
297
|
+
rootDir: pkgDir,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/** Parse `optionalModules:` list from a manifest file content. */
|
|
301
|
+
function readOptionalModulesList(content) {
|
|
302
|
+
const out = [];
|
|
303
|
+
const section = content.split(/^optionalModules:/m)[1];
|
|
304
|
+
if (!section)
|
|
305
|
+
return out;
|
|
306
|
+
for (const m of section.matchAll(/^\s*-\s*"?([@\w/-]+)"?/gm)) {
|
|
307
|
+
out.push(m[1]);
|
|
308
|
+
// Guard: stop if we leave the list (no leading `-`)
|
|
309
|
+
if (!m[0].match(/^\s*-/))
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
return out;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Get ontology package metadata for all packages in the project's extends chain
|
|
316
|
+
* plus any available-but-unselected packages under packages/ or node_modules/@memoarchitect/.
|
|
317
|
+
*
|
|
318
|
+
* @param projectRoot - Absolute path to the project root (where memo.package.yaml lives)
|
|
319
|
+
*/
|
|
320
|
+
export function getPackageMetadata(projectRoot) {
|
|
321
|
+
const configCandidates = ['memo.package.yaml', 'memo.package.yml', 'memo.config.yaml', 'memo.config.yml'];
|
|
322
|
+
let primaryConfig = '';
|
|
323
|
+
for (const name of configCandidates) {
|
|
324
|
+
const p = join(projectRoot, name);
|
|
325
|
+
if (existsSync(p)) {
|
|
326
|
+
primaryConfig = p;
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (!primaryConfig)
|
|
331
|
+
return [];
|
|
332
|
+
const selectedNames = readSelectedOntologies(primaryConfig);
|
|
333
|
+
const result = [];
|
|
334
|
+
const seen = new Set();
|
|
335
|
+
// Gather package directories from the tools repo and its memo submodule.
|
|
336
|
+
const candidates = [];
|
|
337
|
+
let searchDir = resolve(projectRoot);
|
|
338
|
+
while (true) {
|
|
339
|
+
const pkgsDir = join(searchDir, 'packages');
|
|
340
|
+
if (existsSync(pkgsDir)) {
|
|
341
|
+
try {
|
|
342
|
+
for (const entry of readdirSync(pkgsDir, { withFileTypes: true })) {
|
|
343
|
+
if (!entry.isDirectory())
|
|
344
|
+
continue;
|
|
345
|
+
candidates.push(join(pkgsDir, entry.name));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch { /* skip */ }
|
|
349
|
+
const vendorPkgsDir = join(searchDir, VENDOR_ONTOLOGY_PACKAGES_DIR);
|
|
350
|
+
if (existsSync(vendorPkgsDir)) {
|
|
351
|
+
try {
|
|
352
|
+
for (const entry of readdirSync(vendorPkgsDir, { withFileTypes: true })) {
|
|
353
|
+
if (!entry.isDirectory())
|
|
354
|
+
continue;
|
|
355
|
+
candidates.push(join(vendorPkgsDir, entry.name));
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
catch { /* skip */ }
|
|
359
|
+
}
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
const parent = dirname(searchDir);
|
|
363
|
+
if (parent === searchDir)
|
|
364
|
+
break;
|
|
365
|
+
searchDir = parent;
|
|
366
|
+
}
|
|
367
|
+
// Scan memo_packages/ for locally installed packages
|
|
368
|
+
const memoPkgsDir = join(projectRoot, 'memo_packages');
|
|
369
|
+
if (existsSync(memoPkgsDir)) {
|
|
370
|
+
try {
|
|
371
|
+
for (const entry of readdirSync(memoPkgsDir, { withFileTypes: true })) {
|
|
372
|
+
if (entry.isDirectory())
|
|
373
|
+
candidates.push(join(memoPkgsDir, entry.name));
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
catch { /* skip */ }
|
|
377
|
+
}
|
|
378
|
+
// Also scan node_modules/@memoarchitect/ for installed packages
|
|
379
|
+
const nmMemo = join(projectRoot, 'node_modules', '@memo');
|
|
380
|
+
if (existsSync(nmMemo)) {
|
|
381
|
+
try {
|
|
382
|
+
for (const entry of readdirSync(nmMemo, { withFileTypes: true })) {
|
|
383
|
+
if (entry.isDirectory())
|
|
384
|
+
candidates.push(join(nmMemo, entry.name));
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
catch { /* skip */ }
|
|
388
|
+
}
|
|
389
|
+
// Collect which packages are declared as optionalModules by any base pkg.
|
|
390
|
+
const optionalModuleNames = new Set();
|
|
391
|
+
for (const pkgDir of candidates) {
|
|
392
|
+
for (const cfg of configCandidates) {
|
|
393
|
+
const manifestPath = join(pkgDir, cfg);
|
|
394
|
+
if (!existsSync(manifestPath))
|
|
395
|
+
continue;
|
|
396
|
+
try {
|
|
397
|
+
const content = readFileSync(manifestPath, 'utf-8');
|
|
398
|
+
for (const m of readOptionalModulesList(content))
|
|
399
|
+
optionalModuleNames.add(m);
|
|
400
|
+
}
|
|
401
|
+
catch { /* skip */ }
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// Also collect project-declared modules so they get selected=true.
|
|
406
|
+
const projectModules = new Set(readDeclaredModules(primaryConfig));
|
|
407
|
+
// Phase C: methodology field also marks packages selected — methodology
|
|
408
|
+
// pkg itself plus everything on its extends chain.
|
|
409
|
+
const methodologySelected = readMethodologyChain(primaryConfig);
|
|
410
|
+
for (const pkgDir of candidates) {
|
|
411
|
+
let sysmlPath = join(pkgDir, 'sysml');
|
|
412
|
+
for (const cfg of CONFIG_SEARCH_ORDER) {
|
|
413
|
+
const cp = join(pkgDir, cfg);
|
|
414
|
+
if (existsSync(cp)) {
|
|
415
|
+
const ov = readYamlField(readFileSync(cp, 'utf-8'), 'sysmlDir');
|
|
416
|
+
if (ov)
|
|
417
|
+
sysmlPath = resolve(pkgDir, ov);
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
const hasSysml = existsSync(sysmlPath);
|
|
422
|
+
if (!hasSysml)
|
|
423
|
+
continue;
|
|
424
|
+
if (seen.has(pkgDir))
|
|
425
|
+
continue;
|
|
426
|
+
seen.add(pkgDir);
|
|
427
|
+
const info = buildPackageInfo(pkgDir, false);
|
|
428
|
+
if (!info)
|
|
429
|
+
continue;
|
|
430
|
+
// Mark as selected if name is in project's ontologies list, or inferred heuristic
|
|
431
|
+
info.selected = selectedNames.has(info.name)
|
|
432
|
+
|| selectedNames.has(info.name.replace('@memoarchitect/', ''))
|
|
433
|
+
|| projectModules.has(info.name)
|
|
434
|
+
|| methodologySelected.has(info.name);
|
|
435
|
+
info.isOptionalModule = optionalModuleNames.has(info.name);
|
|
436
|
+
result.push(info);
|
|
437
|
+
}
|
|
438
|
+
// Sort: selected first, then by name
|
|
439
|
+
result.sort((a, b) => {
|
|
440
|
+
if (a.selected !== b.selected)
|
|
441
|
+
return a.selected ? -1 : 1;
|
|
442
|
+
return a.name.localeCompare(b.name);
|
|
443
|
+
});
|
|
444
|
+
return result;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Recursively collect all .sysml files under a directory,
|
|
448
|
+
* excluding index.sysml (which is just imports).
|
|
449
|
+
*/
|
|
450
|
+
function collectSysmlFiles(dir) {
|
|
451
|
+
const files = [];
|
|
452
|
+
try {
|
|
453
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
454
|
+
const full = join(dir, entry.name);
|
|
455
|
+
if (entry.isDirectory()) {
|
|
456
|
+
files.push(...collectSysmlFiles(full));
|
|
457
|
+
}
|
|
458
|
+
else if (entry.name.endsWith('.sysml') && entry.name !== 'index.sysml') {
|
|
459
|
+
files.push(full);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
// skip inaccessible dirs
|
|
465
|
+
}
|
|
466
|
+
return files;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Walk the config `extends` chain to find ontology package directories.
|
|
470
|
+
* Returns absolute paths to directories containing `sysml/` subdirectories.
|
|
471
|
+
*
|
|
472
|
+
* Strategy:
|
|
473
|
+
* 1. Start from the config file's directory
|
|
474
|
+
* 2. Follow `extends` references (@memoarchitect/package-name → packages/package-name)
|
|
475
|
+
* 3. For each package in the chain, check if it has a sysml/ directory
|
|
476
|
+
* 4. Also check for ontology-core (may not be in extends chain directly)
|
|
477
|
+
*/
|
|
478
|
+
export function findOntologyPackageDirs(configPath) {
|
|
479
|
+
const dirs = [];
|
|
480
|
+
const seen = new Set();
|
|
481
|
+
// 0. (Phase C) If project pins a `methodology:`, resolve it and walk its
|
|
482
|
+
// extends chain. The methodology package brings in its own SysML and
|
|
483
|
+
// chain-pulls the kinds ontology (e.g. @memoarchitect/ontology).
|
|
484
|
+
try {
|
|
485
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
486
|
+
const methodologyMatch = content.match(/^methodology:\s*"?([^"\s#]+)"?/m);
|
|
487
|
+
if (methodologyMatch) {
|
|
488
|
+
// Strip optional version range "@^1.0" → just the package name.
|
|
489
|
+
// The leading @memoarchitect/ scope must be preserved, so only strip the LAST `@`.
|
|
490
|
+
const raw = methodologyMatch[1];
|
|
491
|
+
const lastAt = raw.lastIndexOf('@');
|
|
492
|
+
const methodologyName = lastAt > 0 ? raw.slice(0, lastAt) : raw;
|
|
493
|
+
const fullName = methodologyName.startsWith('@memoarchitect/')
|
|
494
|
+
? methodologyName
|
|
495
|
+
: `@memoarchitect/${methodologyName}`;
|
|
496
|
+
const pkgConfig = resolvePackageConfig(fullName, dirname(configPath));
|
|
497
|
+
if (pkgConfig)
|
|
498
|
+
walkExtendsChain(pkgConfig, dirs, seen);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
catch { /* skip */ }
|
|
502
|
+
// 1. Walk the primary extends chain
|
|
503
|
+
walkExtendsChain(configPath, dirs, seen);
|
|
504
|
+
// 2. Load additional ontologies from the config file's `ontologies` array.
|
|
505
|
+
// This allows for a "Base + Plugin" model where users can add multiple domain-specific ontologies.
|
|
506
|
+
try {
|
|
507
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
508
|
+
// Lightweight YAML parsing for ontologies:
|
|
509
|
+
const ontologySection = content.split(/^ontologies:/m)[1];
|
|
510
|
+
if (ontologySection) {
|
|
511
|
+
const matches = ontologySection.matchAll(/^\s*-\s*name:\s*"?([\w@\/-]+)"?/gm);
|
|
512
|
+
for (const match of matches) {
|
|
513
|
+
let ontologyName = match[1];
|
|
514
|
+
// Ensure name has @memoarchitect/ prefix for resolution if missing
|
|
515
|
+
if (!ontologyName.startsWith('@memoarchitect/')) {
|
|
516
|
+
ontologyName = `@memoarchitect/${ontologyName}`;
|
|
517
|
+
}
|
|
518
|
+
const pkgConfig = resolvePackageConfig(ontologyName, dirname(configPath));
|
|
519
|
+
if (pkgConfig) {
|
|
520
|
+
walkExtendsChain(pkgConfig, dirs, seen);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
catch {
|
|
526
|
+
// Skip inaccessible configs
|
|
527
|
+
}
|
|
528
|
+
// 3. Resolve optional modules declared under `modules:` in the project config.
|
|
529
|
+
// Modules follow OWL import semantics — declared in the base ontology's
|
|
530
|
+
// `optionalModules:` list, loaded only when the project opts in.
|
|
531
|
+
for (const moduleName of readDeclaredModules(configPath)) {
|
|
532
|
+
const pkgConfig = resolvePackageConfig(moduleName, dirname(configPath));
|
|
533
|
+
if (pkgConfig)
|
|
534
|
+
walkExtendsChain(pkgConfig, dirs, seen);
|
|
535
|
+
}
|
|
536
|
+
return dirs;
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Read the `modules:` array from a project config, resolving short aliases
|
|
540
|
+
* (e.g. "ros") against the base ontology's `optionalModules:` list.
|
|
541
|
+
* Returns fully-qualified @memoarchitect/... package names.
|
|
542
|
+
*/
|
|
543
|
+
function readDeclaredModules(configPath) {
|
|
544
|
+
const out = [];
|
|
545
|
+
let rawModules = [];
|
|
546
|
+
try {
|
|
547
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
548
|
+
// Match `modules:\n - foo\n - "@memoarchitect/bar"`
|
|
549
|
+
const section = content.split(/^modules:/m)[1];
|
|
550
|
+
if (section) {
|
|
551
|
+
const matches = section.matchAll(/^\s*-\s*"?([@\w/-]+)"?/gm);
|
|
552
|
+
// Stop at the first non-list YAML key
|
|
553
|
+
for (const m of matches) {
|
|
554
|
+
const line = m[0];
|
|
555
|
+
if (!line.match(/^\s*-/))
|
|
556
|
+
break;
|
|
557
|
+
rawModules.push(m[1]);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
catch {
|
|
562
|
+
return out;
|
|
563
|
+
}
|
|
564
|
+
if (rawModules.length === 0)
|
|
565
|
+
return out;
|
|
566
|
+
// Gather optional-module allowlist from the extends chain
|
|
567
|
+
const allowlist = collectOptionalModules(configPath);
|
|
568
|
+
const byShort = new Map(); // short → full name
|
|
569
|
+
for (const full of allowlist) {
|
|
570
|
+
const short = full.split('/').pop() ?? full;
|
|
571
|
+
byShort.set(short, full);
|
|
572
|
+
}
|
|
573
|
+
for (const entry of rawModules) {
|
|
574
|
+
if (entry.startsWith('@')) {
|
|
575
|
+
out.push(entry);
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
out.push(byShort.get(entry) ?? entry);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
return out;
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Walk the extends chain of a config and collect all `optionalModules:` entries.
|
|
585
|
+
*/
|
|
586
|
+
function collectOptionalModules(configPath) {
|
|
587
|
+
const modules = new Set();
|
|
588
|
+
const visited = new Set();
|
|
589
|
+
const stack = [resolve(configPath)];
|
|
590
|
+
while (stack.length) {
|
|
591
|
+
const p = stack.pop();
|
|
592
|
+
if (visited.has(p))
|
|
593
|
+
continue;
|
|
594
|
+
visited.add(p);
|
|
595
|
+
let content = '';
|
|
596
|
+
try {
|
|
597
|
+
content = readFileSync(p, 'utf-8');
|
|
598
|
+
}
|
|
599
|
+
catch {
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
const section = content.split(/^optionalModules:/m)[1];
|
|
603
|
+
if (section) {
|
|
604
|
+
for (const m of section.matchAll(/^\s*-\s*"?([@\w/-]+)"?/gm)) {
|
|
605
|
+
const line = m[0];
|
|
606
|
+
if (!line.match(/^\s*-/))
|
|
607
|
+
break;
|
|
608
|
+
modules.add(m[1]);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
// Handle both single and array extends forms
|
|
612
|
+
const singleExt = content.match(/^extends:\s*"?(@memo\/[\w-]+)"?/m);
|
|
613
|
+
if (singleExt) {
|
|
614
|
+
const parent = resolvePackageConfig(singleExt[1], dirname(p));
|
|
615
|
+
if (parent)
|
|
616
|
+
stack.push(parent);
|
|
617
|
+
}
|
|
618
|
+
else {
|
|
619
|
+
const arraySection = content.match(/^extends:\s*\n((?:\s+-\s+.+\n?)+)/m);
|
|
620
|
+
if (arraySection) {
|
|
621
|
+
for (const m of arraySection[1].matchAll(/^\s+-\s+"?(@memo\/[\w-]+)"?/gm)) {
|
|
622
|
+
const parent = resolvePackageConfig(m[1], dirname(p));
|
|
623
|
+
if (parent)
|
|
624
|
+
stack.push(parent);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return [...modules];
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* Recursively walk the extends chain, collecting ontology package dirs.
|
|
633
|
+
*/
|
|
634
|
+
function walkExtendsChain(configPath, dirs, seen) {
|
|
635
|
+
const resolvedPath = resolve(configPath);
|
|
636
|
+
if (seen.has(resolvedPath))
|
|
637
|
+
return;
|
|
638
|
+
seen.add(resolvedPath);
|
|
639
|
+
// Read the YAML to find extends (lightweight — just look for extends line)
|
|
640
|
+
let extendsPackages = [];
|
|
641
|
+
let projectType;
|
|
642
|
+
try {
|
|
643
|
+
const content = readFileSync(resolvedPath, 'utf-8');
|
|
644
|
+
// Handle both single-string extends and array extends in YAML:
|
|
645
|
+
// extends: "@memoarchitect/ontology"
|
|
646
|
+
// extends:
|
|
647
|
+
// - "@memoarchitect/ontology"
|
|
648
|
+
const singleMatch = content.match(/^extends:\s*"?(@memo\/[\w-]+)"?/m);
|
|
649
|
+
if (singleMatch) {
|
|
650
|
+
extendsPackages = [singleMatch[1]];
|
|
651
|
+
}
|
|
652
|
+
else {
|
|
653
|
+
// Array form: collect all list entries under `extends:`
|
|
654
|
+
const arraySection = content.match(/^extends:\s*\n((?:\s+-\s+.+\n?)+)/m);
|
|
655
|
+
if (arraySection) {
|
|
656
|
+
const entries = [...arraySection[1].matchAll(/^\s+-\s+"?(@memo\/[\w-]+)"?/gm)];
|
|
657
|
+
extendsPackages = entries.map(m => m[1]);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
// Match both legacy (projectType:) and new format (type:)
|
|
661
|
+
const typeMatch = content.match(/^(?:projectType|type):\s*(\w+)/m);
|
|
662
|
+
if (typeMatch) {
|
|
663
|
+
projectType = typeMatch[1];
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
catch {
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
const packageDir = dirname(resolvedPath);
|
|
670
|
+
// Honor `sysmlDir:` override (points outside package, e.g. ../../ontology)
|
|
671
|
+
let sysmlDir;
|
|
672
|
+
try {
|
|
673
|
+
const content = readFileSync(resolvedPath, 'utf-8');
|
|
674
|
+
const override = readYamlField(content, 'sysmlDir');
|
|
675
|
+
sysmlDir = override ? resolve(packageDir, override) : resolve(packageDir, 'sysml');
|
|
676
|
+
}
|
|
677
|
+
catch {
|
|
678
|
+
sysmlDir = resolve(packageDir, 'sysml');
|
|
679
|
+
}
|
|
680
|
+
if (existsSync(sysmlDir)) {
|
|
681
|
+
dirs.push(packageDir);
|
|
682
|
+
}
|
|
683
|
+
// Follow extends chain (handles both single and array extends)
|
|
684
|
+
for (const extendsPackage of extendsPackages) {
|
|
685
|
+
const parentConfigPath = resolvePackageConfig(extendsPackage, packageDir);
|
|
686
|
+
if (parentConfigPath) {
|
|
687
|
+
walkExtendsChain(parentConfigPath, dirs, seen);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Resolve the SysML root directory for an ontology package.
|
|
693
|
+
* Honors `sysmlDir:` override in the package's manifest; falls back to `<pkgDir>/sysml`.
|
|
694
|
+
*/
|
|
695
|
+
export function resolvePackageSysmlDir(pkgDir) {
|
|
696
|
+
for (const cfg of CONFIG_SEARCH_ORDER) {
|
|
697
|
+
const cp = resolve(pkgDir, cfg);
|
|
698
|
+
if (existsSync(cp)) {
|
|
699
|
+
try {
|
|
700
|
+
const ov = readYamlField(readFileSync(cp, 'utf-8'), 'sysmlDir');
|
|
701
|
+
if (ov)
|
|
702
|
+
return resolve(pkgDir, ov);
|
|
703
|
+
}
|
|
704
|
+
catch { /* skip */ }
|
|
705
|
+
break;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
return resolve(pkgDir, 'sysml');
|
|
709
|
+
}
|
|
710
|
+
/** Ordered list of config filenames to search for (new format first, then legacy) */
|
|
711
|
+
const CONFIG_SEARCH_ORDER = [
|
|
712
|
+
'memo.package.yaml',
|
|
713
|
+
'memo.package.yml',
|
|
714
|
+
'memo.config.yaml',
|
|
715
|
+
'memo.config.yml',
|
|
716
|
+
];
|
|
717
|
+
/**
|
|
718
|
+
* Resolve a @memoarchitect/package-name to its config file path.
|
|
719
|
+
* Prefers memo.package.yaml (new format), falls back to memo.config.yaml (legacy).
|
|
720
|
+
* Searches: workspace packages (monorepo), then node_modules.
|
|
721
|
+
*/
|
|
722
|
+
export function resolvePackageConfig(packageName, fromDir) {
|
|
723
|
+
const shortName = packageName.replace(/^@memo\//, '');
|
|
724
|
+
const startDir = resolve(fromDir);
|
|
725
|
+
const projectConfig = findNearestProjectConfig(startDir);
|
|
726
|
+
const boundary = projectConfig ? dirname(projectConfig) : undefined;
|
|
727
|
+
// A logical package config is itself inside the physical content package.
|
|
728
|
+
// It is not a user-project boundary: allow sibling logical packages to be
|
|
729
|
+
// resolved through the nearest enclosing manifest.
|
|
730
|
+
if (projectConfig) {
|
|
731
|
+
const type = readYamlField(readFileSync(projectConfig, 'utf-8'), 'type')
|
|
732
|
+
|| readYamlField(readFileSync(projectConfig, 'utf-8'), 'projectType');
|
|
733
|
+
if (type && type !== 'device') {
|
|
734
|
+
let manifestDir = dirname(projectConfig);
|
|
735
|
+
while (true) {
|
|
736
|
+
for (const manifest of discoverMemoManifests([manifestDir])) {
|
|
737
|
+
const subpath = manifest.manifest.packages[packageName];
|
|
738
|
+
if (!subpath)
|
|
739
|
+
continue;
|
|
740
|
+
const packageDir = resolveManifestPath(manifest, subpath);
|
|
741
|
+
for (const configName of CONFIG_SEARCH_ORDER) {
|
|
742
|
+
const candidate = resolve(packageDir, configName);
|
|
743
|
+
if (existsSync(candidate))
|
|
744
|
+
return candidate;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
if (existsSync(resolve(manifestDir, '.git')))
|
|
748
|
+
break;
|
|
749
|
+
const parent = dirname(manifestDir);
|
|
750
|
+
if (parent === manifestDir)
|
|
751
|
+
break;
|
|
752
|
+
manifestDir = parent;
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
let dir = startDir;
|
|
757
|
+
while (true) {
|
|
758
|
+
for (const manifest of discoverMemoManifests([dir])) {
|
|
759
|
+
const subpath = manifest.manifest.packages[packageName];
|
|
760
|
+
if (!subpath)
|
|
761
|
+
continue;
|
|
762
|
+
const packageDir = resolveManifestPath(manifest, subpath);
|
|
763
|
+
for (const configName of CONFIG_SEARCH_ORDER) {
|
|
764
|
+
const candidate = resolve(packageDir, configName);
|
|
765
|
+
if (existsSync(candidate))
|
|
766
|
+
return candidate;
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
for (const configName of CONFIG_SEARCH_ORDER) {
|
|
770
|
+
const candidate = resolve(dir, 'packages', shortName, configName);
|
|
771
|
+
if (existsSync(candidate))
|
|
772
|
+
return candidate;
|
|
773
|
+
}
|
|
774
|
+
for (const configName of CONFIG_SEARCH_ORDER) {
|
|
775
|
+
const vendorCandidate = resolve(dir, VENDOR_ONTOLOGY_PACKAGES_DIR, shortName, configName);
|
|
776
|
+
if (existsSync(vendorCandidate))
|
|
777
|
+
return vendorCandidate;
|
|
778
|
+
}
|
|
779
|
+
for (const configName of CONFIG_SEARCH_ORDER) {
|
|
780
|
+
const localCandidate = resolve(dir, 'memo_packages', shortName, configName);
|
|
781
|
+
if (existsSync(localCandidate))
|
|
782
|
+
return localCandidate;
|
|
783
|
+
}
|
|
784
|
+
for (const configName of CONFIG_SEARCH_ORDER) {
|
|
785
|
+
const nmCandidate = resolve(dir, 'node_modules', packageName, configName);
|
|
786
|
+
if (existsSync(nmCandidate))
|
|
787
|
+
return nmCandidate;
|
|
788
|
+
}
|
|
789
|
+
if (dir === boundary || existsSync(resolve(dir, '.git')))
|
|
790
|
+
break;
|
|
791
|
+
const parent = dirname(dir);
|
|
792
|
+
if (parent === dir)
|
|
793
|
+
break;
|
|
794
|
+
dir = parent;
|
|
795
|
+
}
|
|
796
|
+
// Workspace convenience is explicit and manifest-driven; published project
|
|
797
|
+
// resolution never relies on walking above its own root.
|
|
798
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../..');
|
|
799
|
+
const devManifestRoot = resolve(packageRoot, VENDOR_ONTOLOGY_DIR);
|
|
800
|
+
for (const manifest of [
|
|
801
|
+
...findMemoManifests(fromDir),
|
|
802
|
+
...discoverMemoManifests([devManifestRoot]),
|
|
803
|
+
]) {
|
|
804
|
+
const subpath = manifest.manifest.packages[packageName];
|
|
805
|
+
if (!subpath)
|
|
806
|
+
continue;
|
|
807
|
+
const packageDir = resolveManifestPath(manifest, subpath);
|
|
808
|
+
for (const configName of CONFIG_SEARCH_ORDER) {
|
|
809
|
+
const candidate = resolve(packageDir, configName);
|
|
810
|
+
if (existsSync(candidate))
|
|
811
|
+
return candidate;
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
return undefined;
|
|
815
|
+
}
|
|
816
|
+
function findNearestProjectConfig(startDir) {
|
|
817
|
+
let dir = resolve(startDir);
|
|
818
|
+
while (true) {
|
|
819
|
+
for (const name of CONFIG_SEARCH_ORDER) {
|
|
820
|
+
const candidate = resolve(dir, name);
|
|
821
|
+
if (existsSync(candidate))
|
|
822
|
+
return candidate;
|
|
823
|
+
}
|
|
824
|
+
if (existsSync(resolve(dir, '.git')))
|
|
825
|
+
return undefined;
|
|
826
|
+
const parent = dirname(dir);
|
|
827
|
+
if (parent === dir)
|
|
828
|
+
return undefined;
|
|
829
|
+
dir = parent;
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
/**
|
|
833
|
+
* Load ontology registries by walking the config extends chain,
|
|
834
|
+
* finding ontology SysML files, parsing them, and populating
|
|
835
|
+
* KindRegistry + RelationshipRegistry.
|
|
836
|
+
*
|
|
837
|
+
* @param configPath - Path to the project's memo.config.yaml
|
|
838
|
+
* @returns Populated registries and diagnostic info
|
|
839
|
+
*/
|
|
840
|
+
export async function loadOntologyRegistries(configPath) {
|
|
841
|
+
const kindRegistry = new KindRegistry();
|
|
842
|
+
const relationshipRegistry = new RelationshipRegistry();
|
|
843
|
+
const errors = [];
|
|
844
|
+
// Find ontology package directories
|
|
845
|
+
const ontologyDirs = findOntologyPackageDirs(configPath);
|
|
846
|
+
if (ontologyDirs.length === 0) {
|
|
847
|
+
return {
|
|
848
|
+
registries: { kindRegistry, relationshipRegistry },
|
|
849
|
+
fileCount: 0,
|
|
850
|
+
ontologyDirs: [],
|
|
851
|
+
errors: ['No ontology packages with sysml/ directories found in extends chain'],
|
|
852
|
+
parsedDocuments: [],
|
|
853
|
+
};
|
|
854
|
+
}
|
|
855
|
+
// Collect all SysML files from all ontology packages (honor sysmlDir override).
|
|
856
|
+
// Dedupe by absolute path — methodology and base ontology pkgs may have
|
|
857
|
+
// overlapping sysmlDirs (e.g. methodology points at ontology/methodology/memo
|
|
858
|
+
// while @memoarchitect/ontology points at src/).
|
|
859
|
+
const sysmlSet = new Set();
|
|
860
|
+
for (const pkgDir of ontologyDirs) {
|
|
861
|
+
let sysmlDir = resolve(pkgDir, 'sysml');
|
|
862
|
+
for (const cfg of CONFIG_SEARCH_ORDER) {
|
|
863
|
+
const cp = resolve(pkgDir, cfg);
|
|
864
|
+
if (existsSync(cp)) {
|
|
865
|
+
const ov = readYamlField(readFileSync(cp, 'utf-8'), 'sysmlDir');
|
|
866
|
+
if (ov)
|
|
867
|
+
sysmlDir = resolve(pkgDir, ov);
|
|
868
|
+
break;
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
for (const f of collectSysmlFiles(sysmlDir))
|
|
872
|
+
sysmlSet.add(f);
|
|
873
|
+
}
|
|
874
|
+
const allSysmlFiles = [...sysmlSet];
|
|
875
|
+
if (allSysmlFiles.length === 0) {
|
|
876
|
+
return {
|
|
877
|
+
registries: { kindRegistry, relationshipRegistry },
|
|
878
|
+
fileCount: 0,
|
|
879
|
+
ontologyDirs,
|
|
880
|
+
errors: ['Ontology packages found but no .sysml files in sysml/ directories'],
|
|
881
|
+
parsedDocuments: [],
|
|
882
|
+
};
|
|
883
|
+
}
|
|
884
|
+
// Parse all ontology SysML files
|
|
885
|
+
const parseResult = await parseFiles(allSysmlFiles, '');
|
|
886
|
+
for (const err of parseResult.errors) {
|
|
887
|
+
errors.push(`${err.file}${err.line ? `:${err.line}` : ''}: ${err.message}`);
|
|
888
|
+
}
|
|
889
|
+
// Populate registries from parsed documents
|
|
890
|
+
kindRegistry.populateFromDocuments(parseResult.documents);
|
|
891
|
+
kindRegistry.computeDerivedBy();
|
|
892
|
+
relationshipRegistry.populateFromDocuments(parseResult.documents);
|
|
893
|
+
return {
|
|
894
|
+
registries: { kindRegistry, relationshipRegistry },
|
|
895
|
+
fileCount: allSysmlFiles.length,
|
|
896
|
+
ontologyDirs,
|
|
897
|
+
errors,
|
|
898
|
+
parsedDocuments: parseResult.documents,
|
|
899
|
+
};
|
|
900
|
+
}
|
|
901
|
+
//# sourceMappingURL=ontology-loader.js.map
|