@memoarchitect/tools 0.6.7 → 0.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -11
- package/corpus/README.md +63 -0
- package/corpus/sysml-v2-release/bnf/SysML-graphical-bnf.kgbnf +2264 -0
- package/package.json +20 -7
- package/packages/tools/lib/analysis/dsm.d.ts +1 -1
- package/packages/tools/lib/analysis/dsm.d.ts.map +1 -1
- package/packages/tools/lib/analysis/dsm.js +1 -1
- package/packages/tools/lib/analysis/dsm.js.map +1 -1
- package/packages/tools/lib/bin/memo.js +186 -10
- package/packages/tools/lib/bin/memo.js.map +1 -1
- package/packages/tools/lib/browser/index.d.ts +3 -1
- package/packages/tools/lib/browser/index.d.ts.map +1 -1
- package/packages/tools/lib/browser/index.js +2 -1
- package/packages/tools/lib/browser/index.js.map +1 -1
- package/packages/tools/lib/commands/ask.js +1 -1
- package/packages/tools/lib/commands/ask.js.map +1 -1
- package/packages/tools/lib/commands/check.d.ts.map +1 -1
- package/packages/tools/lib/commands/check.js +3 -9
- package/packages/tools/lib/commands/check.js.map +1 -1
- package/packages/tools/lib/commands/conformance.d.ts +36 -0
- package/packages/tools/lib/commands/conformance.d.ts.map +1 -0
- package/packages/tools/lib/commands/conformance.js +212 -0
- package/packages/tools/lib/commands/conformance.js.map +1 -0
- package/packages/tools/lib/commands/convert.d.ts +12 -0
- package/packages/tools/lib/commands/convert.d.ts.map +1 -0
- package/packages/tools/lib/commands/convert.js +103 -0
- package/packages/tools/lib/commands/convert.js.map +1 -0
- package/packages/tools/lib/commands/create-package.d.ts +1 -2
- package/packages/tools/lib/commands/create-package.d.ts.map +1 -1
- package/packages/tools/lib/commands/create-package.js.map +1 -1
- package/packages/tools/lib/commands/dev.d.ts +13 -0
- package/packages/tools/lib/commands/dev.d.ts.map +1 -1
- package/packages/tools/lib/commands/dev.js +245 -89
- package/packages/tools/lib/commands/dev.js.map +1 -1
- package/packages/tools/lib/commands/dhf-draft.js +1 -1
- package/packages/tools/lib/commands/dhf-draft.js.map +1 -1
- package/packages/tools/lib/commands/dhf-lint.d.ts +10 -0
- package/packages/tools/lib/commands/dhf-lint.d.ts.map +1 -0
- package/packages/tools/lib/commands/dhf-lint.js +72 -0
- package/packages/tools/lib/commands/dhf-lint.js.map +1 -0
- package/packages/tools/lib/commands/dhf-preview.js +1 -1
- package/packages/tools/lib/commands/dhf-preview.js.map +1 -1
- package/packages/tools/lib/commands/dhf.d.ts.map +1 -1
- package/packages/tools/lib/commands/dhf.js +8 -2
- package/packages/tools/lib/commands/dhf.js.map +1 -1
- package/packages/tools/lib/commands/element.d.ts +34 -0
- package/packages/tools/lib/commands/element.d.ts.map +1 -0
- package/packages/tools/lib/commands/element.js +174 -0
- package/packages/tools/lib/commands/element.js.map +1 -0
- package/packages/tools/lib/commands/export.d.ts.map +1 -1
- package/packages/tools/lib/commands/export.js +39 -40
- package/packages/tools/lib/commands/export.js.map +1 -1
- package/packages/tools/lib/commands/generate.d.ts.map +1 -1
- package/packages/tools/lib/commands/generate.js +10 -7
- package/packages/tools/lib/commands/generate.js.map +1 -1
- package/packages/tools/lib/commands/import.d.ts.map +1 -1
- package/packages/tools/lib/commands/import.js +25 -12
- package/packages/tools/lib/commands/import.js.map +1 -1
- package/packages/tools/lib/commands/init.d.ts.map +1 -1
- package/packages/tools/lib/commands/init.js +34 -14
- package/packages/tools/lib/commands/init.js.map +1 -1
- package/packages/tools/lib/commands/inspect.d.ts +5 -0
- package/packages/tools/lib/commands/inspect.d.ts.map +1 -0
- package/packages/tools/lib/commands/inspect.js +56 -0
- package/packages/tools/lib/commands/inspect.js.map +1 -0
- package/packages/tools/lib/commands/lock.d.ts.map +1 -1
- package/packages/tools/lib/commands/lock.js +7 -2
- package/packages/tools/lib/commands/lock.js.map +1 -1
- package/packages/tools/lib/commands/ontology.d.ts.map +1 -1
- package/packages/tools/lib/commands/ontology.js +69 -116
- package/packages/tools/lib/commands/ontology.js.map +1 -1
- package/packages/tools/lib/commands/pack.d.ts +1 -1
- package/packages/tools/lib/commands/pack.d.ts.map +1 -1
- package/packages/tools/lib/commands/pack.js +20 -78
- package/packages/tools/lib/commands/pack.js.map +1 -1
- package/packages/tools/lib/commands/package.d.ts +10 -0
- package/packages/tools/lib/commands/package.d.ts.map +1 -0
- package/packages/tools/lib/commands/package.js +113 -0
- package/packages/tools/lib/commands/package.js.map +1 -0
- package/packages/tools/lib/commands/plugin.js +1 -1
- package/packages/tools/lib/commands/plugin.js.map +1 -1
- package/packages/tools/lib/commands/rules.d.ts.map +1 -1
- package/packages/tools/lib/commands/rules.js +120 -30
- package/packages/tools/lib/commands/rules.js.map +1 -1
- package/packages/tools/lib/commands/standards.d.ts +28 -0
- package/packages/tools/lib/commands/standards.d.ts.map +1 -0
- package/packages/tools/lib/commands/standards.js +203 -0
- package/packages/tools/lib/commands/standards.js.map +1 -0
- package/packages/tools/lib/commands/sysand-publish.d.ts.map +1 -1
- package/packages/tools/lib/commands/sysand-publish.js +14 -16
- package/packages/tools/lib/commands/sysand-publish.js.map +1 -1
- package/packages/tools/lib/commands/toolchain.d.ts +8 -0
- package/packages/tools/lib/commands/toolchain.d.ts.map +1 -0
- package/packages/tools/lib/commands/toolchain.js +64 -0
- package/packages/tools/lib/commands/toolchain.js.map +1 -0
- package/packages/tools/lib/commands/validate.d.ts +1 -1
- package/packages/tools/lib/commands/validate.d.ts.map +1 -1
- package/packages/tools/lib/commands/validate.js +194 -56
- package/packages/tools/lib/commands/validate.js.map +1 -1
- package/packages/tools/lib/completeness/tracker.d.ts +10 -2
- package/packages/tools/lib/completeness/tracker.d.ts.map +1 -1
- package/packages/tools/lib/completeness/tracker.js +16 -21
- package/packages/tools/lib/completeness/tracker.js.map +1 -1
- package/packages/tools/lib/conformance/baseline.d.ts +26 -0
- package/packages/tools/lib/conformance/baseline.d.ts.map +1 -0
- package/packages/tools/lib/conformance/baseline.js +170 -0
- package/packages/tools/lib/conformance/baseline.js.map +1 -0
- package/packages/tools/lib/conformance/bnf.d.ts +84 -0
- package/packages/tools/lib/conformance/bnf.d.ts.map +1 -0
- package/packages/tools/lib/conformance/bnf.js +166 -0
- package/packages/tools/lib/conformance/bnf.js.map +1 -0
- package/packages/tools/lib/conformance/corpus.d.ts +125 -0
- package/packages/tools/lib/conformance/corpus.d.ts.map +1 -0
- package/packages/tools/lib/conformance/corpus.js +190 -0
- package/packages/tools/lib/conformance/corpus.js.map +1 -0
- package/packages/tools/lib/conformance/diff-xmi.d.ts +118 -0
- package/packages/tools/lib/conformance/diff-xmi.d.ts.map +1 -0
- package/packages/tools/lib/conformance/diff-xmi.js +276 -0
- package/packages/tools/lib/conformance/diff-xmi.js.map +1 -0
- package/packages/tools/lib/conformance/generated/syside-rules.d.ts +10 -0
- package/packages/tools/lib/conformance/generated/syside-rules.d.ts.map +1 -0
- package/packages/tools/lib/conformance/generated/syside-rules.js +1142 -0
- package/packages/tools/lib/conformance/generated/syside-rules.js.map +1 -0
- package/packages/tools/lib/conformance/index.d.ts +7 -0
- package/packages/tools/lib/conformance/index.d.ts.map +1 -0
- package/packages/tools/lib/conformance/index.js +19 -0
- package/packages/tools/lib/conformance/index.js.map +1 -0
- package/packages/tools/lib/conformance/run.d.ts +117 -0
- package/packages/tools/lib/conformance/run.d.ts.map +1 -0
- package/packages/tools/lib/conformance/run.js +0 -0
- package/packages/tools/lib/conformance/run.js.map +1 -0
- package/packages/tools/lib/conformance/xmi.d.ts +45 -0
- package/packages/tools/lib/conformance/xmi.d.ts.map +1 -0
- package/packages/tools/lib/conformance/xmi.js +148 -0
- package/packages/tools/lib/conformance/xmi.js.map +1 -0
- package/packages/tools/lib/dhf/document-compiler.d.ts.map +1 -1
- package/packages/tools/lib/dhf/document-compiler.js +13 -8
- package/packages/tools/lib/dhf/document-compiler.js.map +1 -1
- package/packages/tools/lib/dhf/document-registry.d.ts +16 -2
- package/packages/tools/lib/dhf/document-registry.d.ts.map +1 -1
- package/packages/tools/lib/dhf/document-registry.js +74 -23
- package/packages/tools/lib/dhf/document-registry.js.map +1 -1
- package/packages/tools/lib/dhf/index.d.ts +3 -0
- package/packages/tools/lib/dhf/index.d.ts.map +1 -1
- package/packages/tools/lib/dhf/index.js +4 -0
- package/packages/tools/lib/dhf/index.js.map +1 -1
- package/packages/tools/lib/dhf/query-engine.d.ts +12 -1
- package/packages/tools/lib/dhf/query-engine.d.ts.map +1 -1
- package/packages/tools/lib/dhf/query-engine.js +2 -1
- package/packages/tools/lib/dhf/query-engine.js.map +1 -1
- package/packages/tools/lib/dhf/query-executor.d.ts +72 -5
- package/packages/tools/lib/dhf/query-executor.d.ts.map +1 -1
- package/packages/tools/lib/dhf/query-executor.js +471 -81
- package/packages/tools/lib/dhf/query-executor.js.map +1 -1
- package/packages/tools/lib/dhf/script-runner.js +6 -6
- package/packages/tools/lib/dhf/script-runner.js.map +1 -1
- package/packages/tools/lib/dhf/standards-block.d.ts +40 -0
- package/packages/tools/lib/dhf/standards-block.d.ts.map +1 -0
- package/packages/tools/lib/dhf/standards-block.js +223 -0
- package/packages/tools/lib/dhf/standards-block.js.map +1 -0
- package/packages/tools/lib/dhf/standards-library.d.ts +123 -0
- package/packages/tools/lib/dhf/standards-library.d.ts.map +1 -0
- package/packages/tools/lib/dhf/standards-library.js +295 -0
- package/packages/tools/lib/dhf/standards-library.js.map +1 -0
- package/packages/tools/lib/dhf/standards-report.d.ts +189 -0
- package/packages/tools/lib/dhf/standards-report.d.ts.map +1 -0
- package/packages/tools/lib/dhf/standards-report.js +384 -0
- package/packages/tools/lib/dhf/standards-report.js.map +1 -0
- package/packages/tools/lib/dhf/template-lint.d.ts +42 -0
- package/packages/tools/lib/dhf/template-lint.d.ts.map +1 -0
- package/packages/tools/lib/dhf/template-lint.js +421 -0
- package/packages/tools/lib/dhf/template-lint.js.map +1 -0
- package/packages/tools/lib/dhf/template-resolver.d.ts.map +1 -1
- package/packages/tools/lib/dhf/template-resolver.js +18 -6
- package/packages/tools/lib/dhf/template-resolver.js.map +1 -1
- package/packages/tools/lib/import/column-mapper.d.ts +2 -2
- package/packages/tools/lib/import/column-mapper.d.ts.map +1 -1
- package/packages/tools/lib/import/column-mapper.js +3 -3
- package/packages/tools/lib/import/column-mapper.js.map +1 -1
- package/packages/tools/lib/importer/cameo-importer.js +2 -2
- package/packages/tools/lib/importer/cameo-importer.js.map +1 -1
- package/packages/tools/lib/importer/ea-importer.d.ts.map +1 -1
- package/packages/tools/lib/importer/ea-importer.js +4 -3
- package/packages/tools/lib/importer/ea-importer.js.map +1 -1
- package/packages/tools/lib/importer/owl-importer.d.ts.map +1 -1
- package/packages/tools/lib/importer/owl-importer.js +2 -3
- package/packages/tools/lib/importer/owl-importer.js.map +1 -1
- package/packages/tools/lib/index.d.ts +20 -3
- package/packages/tools/lib/index.d.ts.map +1 -1
- package/packages/tools/lib/index.js +19 -2
- package/packages/tools/lib/index.js.map +1 -1
- package/packages/tools/lib/language/generated/ast.d.ts +1344 -99
- package/packages/tools/lib/language/generated/ast.d.ts.map +1 -1
- package/packages/tools/lib/language/generated/ast.js +1066 -32
- package/packages/tools/lib/language/generated/ast.js.map +1 -1
- package/packages/tools/lib/language/generated/grammar.d.ts.map +1 -1
- package/packages/tools/lib/language/generated/grammar.js +5242 -1454
- package/packages/tools/lib/language/generated/grammar.js.map +1 -1
- package/packages/tools/lib/llm/chat-engine.d.ts +4 -3
- package/packages/tools/lib/llm/chat-engine.d.ts.map +1 -1
- package/packages/tools/lib/llm/chat-engine.js +15 -12
- package/packages/tools/lib/llm/chat-engine.js.map +1 -1
- package/packages/tools/lib/llm/generate-engine.d.ts +7 -2
- package/packages/tools/lib/llm/generate-engine.d.ts.map +1 -1
- package/packages/tools/lib/llm/generate-engine.js +22 -4
- package/packages/tools/lib/llm/generate-engine.js.map +1 -1
- package/packages/tools/lib/llm/index.d.ts +1 -0
- package/packages/tools/lib/llm/index.d.ts.map +1 -1
- package/packages/tools/lib/llm/index.js +1 -0
- package/packages/tools/lib/llm/index.js.map +1 -1
- package/packages/tools/lib/llm/model-context.d.ts +2 -2
- package/packages/tools/lib/llm/model-context.d.ts.map +1 -1
- package/packages/tools/lib/llm/model-context.js +7 -13
- package/packages/tools/lib/llm/model-context.js.map +1 -1
- package/packages/tools/lib/llm/sysml-guidance.d.ts +8 -0
- package/packages/tools/lib/llm/sysml-guidance.d.ts.map +1 -0
- package/packages/tools/lib/llm/sysml-guidance.js +28 -0
- package/packages/tools/lib/llm/sysml-guidance.js.map +1 -0
- package/packages/tools/lib/lock.d.ts +14 -8
- package/packages/tools/lib/lock.d.ts.map +1 -1
- package/packages/tools/lib/lock.js +97 -108
- package/packages/tools/lib/lock.js.map +1 -1
- package/packages/tools/lib/mcp/model-loader.d.ts +3 -0
- package/packages/tools/lib/mcp/model-loader.d.ts.map +1 -1
- package/packages/tools/lib/mcp/model-loader.js +9 -5
- package/packages/tools/lib/mcp/model-loader.js.map +1 -1
- package/packages/tools/lib/mcp/tools.d.ts +3 -0
- package/packages/tools/lib/mcp/tools.d.ts.map +1 -1
- package/packages/tools/lib/mcp/tools.js +8 -9
- package/packages/tools/lib/mcp/tools.js.map +1 -1
- package/packages/tools/lib/model/activity-notation.d.ts +54 -0
- package/packages/tools/lib/model/activity-notation.d.ts.map +1 -0
- package/packages/tools/lib/model/activity-notation.js +208 -0
- package/packages/tools/lib/model/activity-notation.js.map +1 -0
- package/packages/tools/lib/model/builder.d.ts +3 -0
- package/packages/tools/lib/model/builder.d.ts.map +1 -1
- package/packages/tools/lib/model/builder.js +956 -62
- package/packages/tools/lib/model/builder.js.map +1 -1
- package/packages/tools/lib/model/config-loader.d.ts +19 -25
- package/packages/tools/lib/model/config-loader.d.ts.map +1 -1
- package/packages/tools/lib/model/config-loader.js +51 -233
- package/packages/tools/lib/model/config-loader.js.map +1 -1
- package/packages/tools/lib/model/config.d.ts +42 -213
- package/packages/tools/lib/model/config.d.ts.map +1 -1
- package/packages/tools/lib/model/config.js +11 -9
- package/packages/tools/lib/model/config.js.map +1 -1
- package/packages/tools/lib/model/effective-scope.d.ts +74 -0
- package/packages/tools/lib/model/effective-scope.d.ts.map +1 -0
- package/packages/tools/lib/model/effective-scope.js +133 -0
- package/packages/tools/lib/model/effective-scope.js.map +1 -0
- package/packages/tools/lib/model/ir-identity.d.ts +94 -0
- package/packages/tools/lib/model/ir-identity.d.ts.map +1 -0
- package/packages/tools/lib/model/ir-identity.js +178 -0
- package/packages/tools/lib/model/ir-identity.js.map +1 -0
- package/packages/tools/lib/model/kind-registry.d.ts +134 -1
- package/packages/tools/lib/model/kind-registry.d.ts.map +1 -1
- package/packages/tools/lib/model/kind-registry.js +186 -4
- package/packages/tools/lib/model/kind-registry.js.map +1 -1
- package/packages/tools/lib/model/layer-resolver.js +1 -1
- package/packages/tools/lib/model/layer-resolver.js.map +1 -1
- package/packages/tools/lib/model/manifest.d.ts +8 -0
- package/packages/tools/lib/model/manifest.d.ts.map +1 -1
- package/packages/tools/lib/model/manifest.js +3 -0
- package/packages/tools/lib/model/manifest.js.map +1 -1
- package/packages/tools/lib/model/methodology-loader.d.ts +19 -24
- package/packages/tools/lib/model/methodology-loader.d.ts.map +1 -1
- package/packages/tools/lib/model/methodology-loader.js +179 -176
- package/packages/tools/lib/model/methodology-loader.js.map +1 -1
- package/packages/tools/lib/model/methodology-resolver.d.ts +115 -0
- package/packages/tools/lib/model/methodology-resolver.d.ts.map +1 -0
- package/packages/tools/lib/model/methodology-resolver.js +317 -0
- package/packages/tools/lib/model/methodology-resolver.js.map +1 -0
- package/packages/tools/lib/model/naming.d.ts +57 -0
- package/packages/tools/lib/model/naming.d.ts.map +1 -0
- package/packages/tools/lib/model/naming.js +69 -0
- package/packages/tools/lib/model/naming.js.map +1 -0
- package/packages/tools/lib/model/native-project.d.ts +130 -0
- package/packages/tools/lib/model/native-project.d.ts.map +1 -0
- package/packages/tools/lib/model/native-project.js +580 -0
- package/packages/tools/lib/model/native-project.js.map +1 -0
- package/packages/tools/lib/model/ontology-loader.d.ts +34 -21
- package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -1
- package/packages/tools/lib/model/ontology-loader.js +343 -614
- package/packages/tools/lib/model/ontology-loader.js.map +1 -1
- package/packages/tools/lib/model/package-manifest.d.ts +37 -0
- package/packages/tools/lib/model/package-manifest.d.ts.map +1 -0
- package/packages/tools/lib/model/package-manifest.js +96 -0
- package/packages/tools/lib/model/package-manifest.js.map +1 -0
- package/packages/tools/lib/model/parser-utils.d.ts +31 -0
- package/packages/tools/lib/model/parser-utils.d.ts.map +1 -1
- package/packages/tools/lib/model/parser-utils.js +89 -1
- package/packages/tools/lib/model/parser-utils.js.map +1 -1
- package/packages/tools/lib/model/paths.d.ts +10 -4
- package/packages/tools/lib/model/paths.d.ts.map +1 -1
- package/packages/tools/lib/model/paths.js +10 -4
- package/packages/tools/lib/model/paths.js.map +1 -1
- package/packages/tools/lib/model/project-conversion.d.ts +226 -0
- package/packages/tools/lib/model/project-conversion.d.ts.map +1 -0
- package/packages/tools/lib/model/project-conversion.js +946 -0
- package/packages/tools/lib/model/project-conversion.js.map +1 -0
- package/packages/tools/lib/model/relationship-legality.d.ts +27 -0
- package/packages/tools/lib/model/relationship-legality.d.ts.map +1 -1
- package/packages/tools/lib/model/relationship-legality.js.map +1 -1
- package/packages/tools/lib/model/relationship-registry.d.ts +93 -1
- package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -1
- package/packages/tools/lib/model/relationship-registry.js +217 -2
- package/packages/tools/lib/model/relationship-registry.js.map +1 -1
- package/packages/tools/lib/model/semantic.d.ts +73 -0
- package/packages/tools/lib/model/semantic.d.ts.map +1 -1
- package/packages/tools/lib/model/semantic.js +6 -0
- package/packages/tools/lib/model/semantic.js.map +1 -1
- package/packages/tools/lib/model/settings-boundary.d.ts +19 -0
- package/packages/tools/lib/model/settings-boundary.d.ts.map +1 -0
- package/packages/tools/lib/model/settings-boundary.js +118 -0
- package/packages/tools/lib/model/settings-boundary.js.map +1 -0
- package/packages/tools/lib/model/short-id.js +3 -3
- package/packages/tools/lib/model/short-id.js.map +1 -1
- package/packages/tools/lib/model/source-graph.d.ts.map +1 -1
- package/packages/tools/lib/model/source-graph.js +5 -1
- package/packages/tools/lib/model/source-graph.js.map +1 -1
- package/packages/tools/lib/model/source-provenance.d.ts +112 -0
- package/packages/tools/lib/model/source-provenance.d.ts.map +1 -0
- package/packages/tools/lib/model/source-provenance.js +169 -0
- package/packages/tools/lib/model/source-provenance.js.map +1 -0
- package/packages/tools/lib/model/sysml-ir.d.ts +9 -0
- package/packages/tools/lib/model/sysml-ir.d.ts.map +1 -0
- package/packages/tools/lib/model/sysml-ir.js +105 -0
- package/packages/tools/lib/model/sysml-ir.js.map +1 -0
- package/packages/tools/lib/model/view-deriver.d.ts +10 -1
- package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
- package/packages/tools/lib/model/view-deriver.js +139 -11
- package/packages/tools/lib/model/view-deriver.js.map +1 -1
- package/packages/tools/lib/model/view-kinds.d.ts +2 -0
- package/packages/tools/lib/model/view-kinds.d.ts.map +1 -1
- package/packages/tools/lib/model/view-kinds.js +11 -0
- package/packages/tools/lib/model/view-kinds.js.map +1 -1
- package/packages/tools/lib/ontology/owl-exporter.d.ts +2 -2
- package/packages/tools/lib/ontology/owl-exporter.d.ts.map +1 -1
- package/packages/tools/lib/ontology/owl-exporter.js +12 -12
- package/packages/tools/lib/ontology/owl-exporter.js.map +1 -1
- package/packages/tools/lib/operations/ai-authoring.d.ts +24 -0
- package/packages/tools/lib/operations/ai-authoring.d.ts.map +1 -0
- package/packages/tools/lib/operations/ai-authoring.js +77 -0
- package/packages/tools/lib/operations/ai-authoring.js.map +1 -0
- package/packages/tools/lib/operations/authoring.d.ts +40 -0
- package/packages/tools/lib/operations/authoring.d.ts.map +1 -0
- package/packages/tools/lib/operations/authoring.js +56 -0
- package/packages/tools/lib/operations/authoring.js.map +1 -0
- package/packages/tools/lib/operations/index.d.ts +2 -0
- package/packages/tools/lib/operations/index.d.ts.map +1 -1
- package/packages/tools/lib/operations/index.js +2 -0
- package/packages/tools/lib/operations/index.js.map +1 -1
- package/packages/tools/lib/operations/project-snapshot.d.ts +28 -3
- package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -1
- package/packages/tools/lib/operations/project-snapshot.js +79 -30
- package/packages/tools/lib/operations/project-snapshot.js.map +1 -1
- package/packages/tools/lib/protocol/messages.d.ts +381 -12
- package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
- package/packages/tools/lib/serializer/csv-io.d.ts +7 -7
- package/packages/tools/lib/serializer/csv-io.d.ts.map +1 -1
- package/packages/tools/lib/serializer/csv-io.js +11 -11
- package/packages/tools/lib/serializer/csv-io.js.map +1 -1
- package/packages/tools/lib/serializer/sysml-generator.d.ts.map +1 -1
- package/packages/tools/lib/serializer/sysml-generator.js +34 -2
- package/packages/tools/lib/serializer/sysml-generator.js.map +1 -1
- package/packages/tools/lib/server/config-resolver.d.ts +8 -4
- package/packages/tools/lib/server/config-resolver.d.ts.map +1 -1
- package/packages/tools/lib/server/config-resolver.js +25 -44
- package/packages/tools/lib/server/config-resolver.js.map +1 -1
- package/packages/tools/lib/server/conflict-policy.d.ts +44 -0
- package/packages/tools/lib/server/conflict-policy.d.ts.map +1 -0
- package/packages/tools/lib/server/conflict-policy.js +94 -0
- package/packages/tools/lib/server/conflict-policy.js.map +1 -0
- package/packages/tools/lib/server/dev-server.d.ts +32 -2
- package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
- package/packages/tools/lib/server/dev-server.js +875 -54
- package/packages/tools/lib/server/dev-server.js.map +1 -1
- package/packages/tools/lib/server/element-writer.d.ts +11 -0
- package/packages/tools/lib/server/element-writer.d.ts.map +1 -0
- package/packages/tools/lib/server/element-writer.js +123 -0
- package/packages/tools/lib/server/element-writer.js.map +1 -0
- package/packages/tools/lib/server/file-watcher.d.ts +4 -1
- package/packages/tools/lib/server/file-watcher.d.ts.map +1 -1
- package/packages/tools/lib/server/file-watcher.js +17 -7
- package/packages/tools/lib/server/file-watcher.js.map +1 -1
- package/packages/tools/lib/server/mutation-domain.d.ts +22 -0
- package/packages/tools/lib/server/mutation-domain.d.ts.map +1 -0
- package/packages/tools/lib/server/mutation-domain.js +87 -0
- package/packages/tools/lib/server/mutation-domain.js.map +1 -0
- package/packages/tools/lib/server/package-source.d.ts +26 -0
- package/packages/tools/lib/server/package-source.d.ts.map +1 -0
- package/packages/tools/lib/server/package-source.js +81 -0
- package/packages/tools/lib/server/package-source.js.map +1 -0
- package/packages/tools/lib/server/package-writer.d.ts +94 -0
- package/packages/tools/lib/server/package-writer.d.ts.map +1 -0
- package/packages/tools/lib/server/package-writer.js +317 -0
- package/packages/tools/lib/server/package-writer.js.map +1 -0
- package/packages/tools/lib/server/persistor.d.ts +81 -6
- package/packages/tools/lib/server/persistor.d.ts.map +1 -1
- package/packages/tools/lib/server/persistor.js +173 -44
- package/packages/tools/lib/server/persistor.js.map +1 -1
- package/packages/tools/lib/server/relationship-writer.d.ts +41 -5
- package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -1
- package/packages/tools/lib/server/relationship-writer.js +157 -13
- package/packages/tools/lib/server/relationship-writer.js.map +1 -1
- package/packages/tools/lib/server/rule-policy-writer.d.ts +40 -0
- package/packages/tools/lib/server/rule-policy-writer.d.ts.map +1 -0
- package/packages/tools/lib/server/rule-policy-writer.js +124 -0
- package/packages/tools/lib/server/rule-policy-writer.js.map +1 -0
- package/packages/tools/lib/server/runtime-budget.d.ts +14 -0
- package/packages/tools/lib/server/runtime-budget.d.ts.map +1 -0
- package/packages/tools/lib/server/runtime-budget.js +15 -0
- package/packages/tools/lib/server/runtime-budget.js.map +1 -0
- package/packages/tools/lib/server/sysml-notation.d.ts +36 -0
- package/packages/tools/lib/server/sysml-notation.d.ts.map +1 -0
- package/packages/tools/lib/server/sysml-notation.js +104 -0
- package/packages/tools/lib/server/sysml-notation.js.map +1 -0
- package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -1
- package/packages/tools/lib/server/view-layout-store.js +1 -0
- package/packages/tools/lib/server/view-layout-store.js.map +1 -1
- package/packages/tools/lib/sysml-ir/generated/sysml-derivations.d.ts +9 -0
- package/packages/tools/lib/sysml-ir/generated/sysml-derivations.d.ts.map +1 -0
- package/packages/tools/lib/sysml-ir/generated/sysml-derivations.js +315 -0
- package/packages/tools/lib/sysml-ir/generated/sysml-derivations.js.map +1 -0
- package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.d.ts +5206 -0
- package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.d.ts.map +1 -0
- package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.js +1933 -0
- package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.js.map +1 -0
- package/packages/tools/lib/sysml-ir/index.d.ts +3 -0
- package/packages/tools/lib/sysml-ir/index.d.ts.map +1 -0
- package/packages/tools/lib/sysml-ir/index.js +3 -0
- package/packages/tools/lib/sysml-ir/index.js.map +1 -0
- package/packages/tools/lib/sysml-ir/ir.d.ts +50 -0
- package/packages/tools/lib/sysml-ir/ir.d.ts.map +1 -0
- package/packages/tools/lib/sysml-ir/ir.js +2 -0
- package/packages/tools/lib/sysml-ir/ir.js.map +1 -0
- package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts +3 -0
- package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts.map +1 -0
- package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js +97 -0
- package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js.map +1 -0
- package/packages/tools/lib/sysmlc/index.d.ts +2 -0
- package/packages/tools/lib/sysmlc/index.d.ts.map +1 -0
- package/packages/tools/lib/sysmlc/index.js +7 -0
- package/packages/tools/lib/sysmlc/index.js.map +1 -0
- package/packages/tools/lib/sysmlc/server.d.ts +29 -0
- package/packages/tools/lib/sysmlc/server.d.ts.map +1 -0
- package/packages/tools/lib/sysmlc/server.js +168 -0
- package/packages/tools/lib/sysmlc/server.js.map +1 -0
- package/packages/tools/lib/toolchain/default-registry.d.ts +12 -0
- package/packages/tools/lib/toolchain/default-registry.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/default-registry.js +28 -0
- package/packages/tools/lib/toolchain/default-registry.js.map +1 -0
- package/packages/tools/lib/toolchain/diagnostic.d.ts +57 -0
- package/packages/tools/lib/toolchain/diagnostic.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/diagnostic.js +69 -0
- package/packages/tools/lib/toolchain/diagnostic.js.map +1 -0
- package/packages/tools/lib/toolchain/effective.d.ts +36 -0
- package/packages/tools/lib/toolchain/effective.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/effective.js +91 -0
- package/packages/tools/lib/toolchain/effective.js.map +1 -0
- package/packages/tools/lib/toolchain/index.d.ts +11 -0
- package/packages/tools/lib/toolchain/index.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/index.js +21 -0
- package/packages/tools/lib/toolchain/index.js.map +1 -0
- package/packages/tools/lib/toolchain/lowering.d.ts +63 -0
- package/packages/tools/lib/toolchain/lowering.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/lowering.js +100 -0
- package/packages/tools/lib/toolchain/lowering.js.map +1 -0
- package/packages/tools/lib/toolchain/operations.d.ts +87 -0
- package/packages/tools/lib/toolchain/operations.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/operations.js +111 -0
- package/packages/tools/lib/toolchain/operations.js.map +1 -0
- package/packages/tools/lib/toolchain/process.d.ts +45 -0
- package/packages/tools/lib/toolchain/process.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/process.js +125 -0
- package/packages/tools/lib/toolchain/process.js.map +1 -0
- package/packages/tools/lib/toolchain/protocol.d.ts +122 -0
- package/packages/tools/lib/toolchain/protocol.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/protocol.js +74 -0
- package/packages/tools/lib/toolchain/protocol.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/internal-kpar.d.ts +9 -0
- package/packages/tools/lib/toolchain/providers/internal-kpar.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/internal-kpar.js +84 -0
- package/packages/tools/lib/toolchain/providers/internal-kpar.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/internal.d.ts +33 -0
- package/packages/tools/lib/toolchain/providers/internal.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/internal.js +286 -0
- package/packages/tools/lib/toolchain/providers/internal.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/sysand.d.ts +12 -0
- package/packages/tools/lib/toolchain/providers/sysand.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/sysand.js +110 -0
- package/packages/tools/lib/toolchain/providers/sysand.js.map +1 -0
- package/packages/tools/lib/toolchain/providers/syside.d.ts +24 -0
- package/packages/tools/lib/toolchain/providers/syside.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/providers/syside.js +208 -0
- package/packages/tools/lib/toolchain/providers/syside.js.map +1 -0
- package/packages/tools/lib/toolchain/registry.d.ts +192 -0
- package/packages/tools/lib/toolchain/registry.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/registry.js +130 -0
- package/packages/tools/lib/toolchain/registry.js.map +1 -0
- package/packages/tools/lib/toolchain/schema.d.ts +30 -0
- package/packages/tools/lib/toolchain/schema.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/schema.js +112 -0
- package/packages/tools/lib/toolchain/schema.js.map +1 -0
- package/packages/tools/lib/toolchain/sysmlc-client.d.ts +77 -0
- package/packages/tools/lib/toolchain/sysmlc-client.d.ts.map +1 -0
- package/packages/tools/lib/toolchain/sysmlc-client.js +0 -0
- package/packages/tools/lib/toolchain/sysmlc-client.js.map +1 -0
- package/packages/tools/lib/validator/architecture-validator.d.ts +8 -1
- package/packages/tools/lib/validator/architecture-validator.d.ts.map +1 -1
- package/packages/tools/lib/validator/architecture-validator.js +25 -1
- package/packages/tools/lib/validator/architecture-validator.js.map +1 -1
- package/packages/tools/lib/validator/behavior-validator.d.ts +1 -1
- package/packages/tools/lib/validator/behavior-validator.js +1 -1
- package/packages/tools/lib/validator/builtin-rules.d.ts +16 -0
- package/packages/tools/lib/validator/builtin-rules.d.ts.map +1 -0
- package/packages/tools/lib/validator/builtin-rules.js +62 -0
- package/packages/tools/lib/validator/builtin-rules.js.map +1 -0
- package/packages/tools/lib/validator/constraint-eval.d.ts +31 -0
- package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -1
- package/packages/tools/lib/validator/constraint-eval.js +164 -7
- package/packages/tools/lib/validator/constraint-eval.js.map +1 -1
- package/packages/tools/lib/validator/constraint-loader.d.ts +22 -4
- package/packages/tools/lib/validator/constraint-loader.d.ts.map +1 -1
- package/packages/tools/lib/validator/constraint-loader.js +100 -27
- package/packages/tools/lib/validator/constraint-loader.js.map +1 -1
- package/packages/tools/lib/validator/rule-engine.d.ts +2 -1
- package/packages/tools/lib/validator/rule-engine.d.ts.map +1 -1
- package/packages/tools/lib/validator/rule-engine.js +56 -5
- package/packages/tools/lib/validator/rule-engine.js.map +1 -1
- package/packages/tools/lib/validator/sysml-constraints.d.ts +64 -0
- package/packages/tools/lib/validator/sysml-constraints.d.ts.map +1 -0
- package/packages/tools/lib/validator/sysml-constraints.js +251 -0
- package/packages/tools/lib/validator/sysml-constraints.js.map +1 -0
- package/packages/tools/lib/validator/types.d.ts +33 -0
- package/packages/tools/lib/validator/types.d.ts.map +1 -1
- package/packages/tools/lib/version.d.ts +2 -0
- package/packages/tools/lib/version.d.ts.map +1 -0
- package/packages/tools/lib/version.js +26 -0
- package/packages/tools/lib/version.js.map +1 -0
- package/packages/tools/src/grammar/memo-sysml.langium +517 -41
- package/packages/tools/lib/model/dimension-filter.d.ts +0 -33
- package/packages/tools/lib/model/dimension-filter.d.ts.map +0 -1
- package/packages/tools/lib/model/dimension-filter.js +0 -57
- package/packages/tools/lib/model/dimension-filter.js.map +0 -1
- package/packages/tools/lib/model/toolchain.d.ts +0 -12
- package/packages/tools/lib/model/toolchain.d.ts.map +0 -1
- package/packages/tools/lib/model/toolchain.js +0 -92
- package/packages/tools/lib/model/toolchain.js.map +0 -1
|
@@ -1,30 +1,67 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
// ─── Element write-back ──────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Persists one element change back to its source `.sysml` file.
|
|
4
|
+
//
|
|
5
|
+
// This module used to find its target with a regular expression over the file
|
|
6
|
+
// text — `<construct> <id> : <kind> { … }` — which made the authored name the
|
|
7
|
+
// address of the declaration. That is wrong in three ways at once: two
|
|
8
|
+
// same-named declarations in different namespaces are one target; a `{}` nested
|
|
9
|
+
// two deep escapes the pattern; and a comment mentioning the name is a match.
|
|
10
|
+
//
|
|
11
|
+
// An update now addresses its target by **IR identity** (§6.2): the caller
|
|
12
|
+
// quotes the identity minted by the last lowering, the identity is resolved
|
|
13
|
+
// against the current source, and the declaration's own CST range is replaced.
|
|
14
|
+
// Everything else in the file — comments, imports, neighbouring declarations —
|
|
15
|
+
// is untouched because only that one range is edited, and the result is
|
|
16
|
+
// reparsed before it reaches disk. An identity the current source does not have
|
|
17
|
+
// raises `StaleIrIdentityError` rather than falling back to a name match, which
|
|
18
|
+
// is the whole point: a stale write fails loudly instead of editing whatever
|
|
19
|
+
// happens to share the name.
|
|
20
|
+
//
|
|
21
|
+
// Creation has no identity yet, by definition. It appends, and the recompile
|
|
22
|
+
// that follows the write mints the identity for the next edit.
|
|
23
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
25
|
+
import { dirname, resolve } from 'node:path';
|
|
26
|
+
import { generateUsage } from '../serializer/sysml-generator.js';
|
|
27
|
+
import { parseText } from '../model/parser-utils.js';
|
|
28
|
+
import { requireIrIdentity, resolveDeclarationByIdentity, StaleIrIdentityError, } from '../model/ir-identity.js';
|
|
29
|
+
import { insertIntoBody, locatePackages } from './package-source.js';
|
|
30
|
+
/** Default home for an element the request does not place. */
|
|
31
|
+
export const DEFAULT_ELEMENT_FILE = 'model/catalog/project.sysml';
|
|
4
32
|
/**
|
|
5
|
-
*
|
|
33
|
+
* Why a rename is only a text edit, said once here so every surface says the
|
|
34
|
+
* same thing.
|
|
6
35
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
36
|
+
* Updating references would need name resolution across the workspace — the
|
|
37
|
+
* linker, which is Track B B5 and does not exist yet. Silently rewriting the
|
|
38
|
+
* declaration and leaving every reference pointing at the old name would be a
|
|
39
|
+
* broken model presented as a successful edit, so the write succeeds and says
|
|
40
|
+
* what it did not do.
|
|
9
41
|
*/
|
|
10
|
-
export
|
|
11
|
-
|
|
42
|
+
export const RENAME_IS_TEXT_ONLY = 'Renaming edits this declaration only. MEMO cannot yet update references to it elsewhere in the '
|
|
43
|
+
+ 'project — that needs cross-file name resolution — so any reference to the old name will not resolve '
|
|
44
|
+
+ 'until you update it by hand.';
|
|
45
|
+
/**
|
|
46
|
+
* Write one element into project source.
|
|
47
|
+
*
|
|
48
|
+
* `index` is the identity index of the current revision. Passing it is what
|
|
49
|
+
* makes an update identity-addressed; without it only creation is possible,
|
|
50
|
+
* and an update that quotes an identity is refused rather than silently
|
|
51
|
+
* degraded to a name match.
|
|
52
|
+
*/
|
|
53
|
+
export async function saveElementToFile(cwd, element, index) {
|
|
54
|
+
const relativePath = element.file || DEFAULT_ELEMENT_FILE;
|
|
12
55
|
const filePath = resolve(cwd, relativePath);
|
|
13
|
-
// 1. Ensure directory exists
|
|
14
56
|
const dir = dirname(filePath);
|
|
15
|
-
if (!existsSync(dir))
|
|
57
|
+
if (!existsSync(dir))
|
|
16
58
|
mkdirSync(dir, { recursive: true });
|
|
17
|
-
}
|
|
18
|
-
// 2. Initialize file if new
|
|
19
59
|
if (!existsSync(filePath)) {
|
|
20
60
|
const pkgName = relativePath.replace(/[^a-zA-Z0-9]/g, '_').replace(/^_/, '').replace(/\.sysml$/, '');
|
|
21
61
|
writeFileSync(filePath, `package ${pkgName || 'generated'} {\n}\n`, 'utf8');
|
|
22
62
|
}
|
|
23
63
|
const content = readFileSync(filePath, 'utf8');
|
|
24
|
-
|
|
25
|
-
// Note: our current generator expects CsvElement, but we can call generateUsage
|
|
26
|
-
// with a duck-typed object.
|
|
27
|
-
const newUsage = generateUsage({
|
|
64
|
+
const usage = generateUsage({
|
|
28
65
|
id: element.id,
|
|
29
66
|
name: element.name,
|
|
30
67
|
kind: element.kind,
|
|
@@ -33,40 +70,132 @@ export function saveElementToFile(cwd, element) {
|
|
|
33
70
|
doc: element.doc || '',
|
|
34
71
|
attributes: element.attributes || {},
|
|
35
72
|
});
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
73
|
+
let updated;
|
|
74
|
+
let replaced = false;
|
|
75
|
+
const warnings = [];
|
|
76
|
+
// A caller holding the current index does not have to quote an identity for
|
|
77
|
+
// an element the index already knows: server-side callers (kind remapping,
|
|
78
|
+
// an approved LLM change) work from the model rather than from a UI
|
|
79
|
+
// selection, and re-deriving the identity there is the same lookup the
|
|
80
|
+
// client would have done. A *quoted* identity is never overridden this way
|
|
81
|
+
// — that is the one that has to be checked for staleness.
|
|
82
|
+
const identity = element.irIdentity ?? (index ? index.byMemoElement[element.id] : undefined);
|
|
83
|
+
if (identity) {
|
|
84
|
+
if (!index) {
|
|
85
|
+
return {
|
|
86
|
+
success: false, filePath: relativePath, stale: true,
|
|
87
|
+
error: 'The write quotes an IR identity but no compiled revision is available to resolve it '
|
|
88
|
+
+ 'against; no file was written.',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
let located;
|
|
92
|
+
try {
|
|
93
|
+
located = await locateDeclaration(content, index, identity, element.renamedFrom ?? element.id);
|
|
54
94
|
}
|
|
55
|
-
|
|
56
|
-
|
|
95
|
+
catch (e) {
|
|
96
|
+
if (e instanceof StaleIrIdentityError) {
|
|
97
|
+
return { success: false, filePath: relativePath, stale: true, error: e.message };
|
|
98
|
+
}
|
|
99
|
+
return { success: false, filePath: relativePath, error: String(e) };
|
|
57
100
|
}
|
|
101
|
+
if (located.declaredName && element.id !== located.declaredName) {
|
|
102
|
+
warnings.push({ code: 'rename-is-text-only', message: RENAME_IS_TEXT_ONLY });
|
|
103
|
+
}
|
|
104
|
+
updated = spliceIndented(content, located.start, located.end, usage);
|
|
105
|
+
replaced = true;
|
|
106
|
+
}
|
|
107
|
+
else if (element.package) {
|
|
108
|
+
const target = (await locatePackages(content)).find(pkg => pkg.qualifiedName === element.package);
|
|
109
|
+
if (!target) {
|
|
110
|
+
return {
|
|
111
|
+
success: false, filePath: relativePath,
|
|
112
|
+
error: `${relativePath} does not declare package "${element.package}"; nothing was written.`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
updated = insertIntoBody(content, target, `${usage}\n`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
updated = appendToLastPackage(content, usage);
|
|
119
|
+
}
|
|
120
|
+
const committed = await commitSource(filePath, relativePath, updated);
|
|
121
|
+
if (!committed.success)
|
|
122
|
+
return { success: false, filePath: relativePath, error: committed.error };
|
|
123
|
+
return { success: true, filePath: relativePath, replaced, ...(warnings.length ? { warnings } : {}) };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Parse-before-commit, then write atomically.
|
|
127
|
+
*
|
|
128
|
+
* Source that does not parse never reaches disk. The editor model (§1.1) says a
|
|
129
|
+
* *user* may save anything; it does not say a machine-generated splice may
|
|
130
|
+
* corrupt a file the user did not touch.
|
|
131
|
+
*/
|
|
132
|
+
export async function commitSource(absolutePath, relativePath, updated) {
|
|
133
|
+
const { errors } = await parseText(updated);
|
|
134
|
+
if (errors.length > 0) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
error: `The updated source did not parse (${errors[0].message}); ${relativePath} was left unchanged.`,
|
|
138
|
+
};
|
|
58
139
|
}
|
|
59
140
|
try {
|
|
60
|
-
|
|
61
|
-
log(`Successfully wrote ${newContent.length} bytes to ${filePath}`);
|
|
62
|
-
return { success: true, filePath: relativePath };
|
|
141
|
+
atomicWrite(absolutePath, updated);
|
|
63
142
|
}
|
|
64
143
|
catch (e) {
|
|
65
|
-
|
|
66
|
-
|
|
144
|
+
return { success: false, error: `Could not write ${relativePath}: ${String(e)}` };
|
|
145
|
+
}
|
|
146
|
+
return { success: true };
|
|
147
|
+
}
|
|
148
|
+
/** Source range of the declaration an identity names, in this file's text. */
|
|
149
|
+
async function locateDeclaration(source, index, identityId, memoElementId) {
|
|
150
|
+
const record = requireIrIdentity(index, identityId, memoElementId);
|
|
151
|
+
const { document, errors } = await parseText(source);
|
|
152
|
+
if (errors.length > 0) {
|
|
153
|
+
throw new StaleIrIdentityError(identityId, `its file no longer parses (${errors[0].message})`);
|
|
154
|
+
}
|
|
155
|
+
const node = resolveDeclarationByIdentity(document.parseResult.value, record.identity);
|
|
156
|
+
const cst = node.$cstNode;
|
|
157
|
+
if (!cst)
|
|
158
|
+
throw new StaleIrIdentityError(identityId, 'the resolved declaration has no source range');
|
|
159
|
+
return { start: cst.offset, end: cst.offset + cst.length, declaredName: node.name };
|
|
160
|
+
}
|
|
161
|
+
/** Replace a range, re-indenting the replacement to the line it starts on. */
|
|
162
|
+
function spliceIndented(source, start, end, replacement) {
|
|
163
|
+
const lineStart = source.lastIndexOf('\n', start - 1) + 1;
|
|
164
|
+
const lead = source.slice(lineStart, start);
|
|
165
|
+
const indent = /^[ \t]*$/.test(lead) ? lead : '';
|
|
166
|
+
const body = replacement.split('\n').map((line, i) => (i === 0 || !line ? line : indent + line)).join('\n');
|
|
167
|
+
return source.slice(0, start) + body + source.slice(end);
|
|
168
|
+
}
|
|
169
|
+
/** Append a new declaration as the last member of the file's final package. */
|
|
170
|
+
function appendToLastPackage(source, usage) {
|
|
171
|
+
const lastBrace = source.lastIndexOf('}');
|
|
172
|
+
if (lastBrace === -1)
|
|
173
|
+
return `${source}\n${usage}\n`;
|
|
174
|
+
const braceLineStart = source.lastIndexOf('\n', lastBrace - 1) + 1;
|
|
175
|
+
const braceIndent = source.slice(braceLineStart, lastBrace);
|
|
176
|
+
const indent = /^[ \t]*$/.test(braceIndent) ? `${braceIndent} ` : ' ';
|
|
177
|
+
const indented = usage.split('\n').map(line => (line ? indent + line : line)).join('\n');
|
|
178
|
+
const before = source.slice(0, lastBrace);
|
|
179
|
+
const separator = before.endsWith('\n') ? '' : '\n';
|
|
180
|
+
return `${before}${separator}${indented}\n${source.slice(lastBrace)}`;
|
|
181
|
+
}
|
|
182
|
+
/** Write via a sibling temp file so a crash cannot leave a half-written model. */
|
|
183
|
+
function atomicWrite(absolutePath, contents) {
|
|
184
|
+
const tempPath = `${absolutePath}.${process.pid}.tmp`;
|
|
185
|
+
try {
|
|
186
|
+
writeFileSync(tempPath, contents, 'utf8');
|
|
187
|
+
renameSync(tempPath, absolutePath);
|
|
188
|
+
}
|
|
189
|
+
catch (e) {
|
|
190
|
+
if (existsSync(tempPath)) {
|
|
191
|
+
try {
|
|
192
|
+
unlinkSync(tempPath);
|
|
193
|
+
}
|
|
194
|
+
catch { /* best effort cleanup */ }
|
|
195
|
+
}
|
|
196
|
+
throw e;
|
|
67
197
|
}
|
|
68
198
|
}
|
|
69
|
-
// Relationship persistence lives in ./relationship-writer.ts
|
|
70
|
-
//
|
|
71
|
-
// validation, a deterministic ownership policy, and CST-aware source editing.
|
|
199
|
+
// Relationship persistence lives in ./relationship-writer.ts, and the notation
|
|
200
|
+
// it emits in ./sysml-notation.ts.
|
|
72
201
|
//# sourceMappingURL=persistor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistor.js","sourceRoot":"","sources":["../../src/server/persistor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"persistor.js","sourceRoot":"","sources":["../../src/server/persistor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { MemoModelDTO, MemoRelationship } from '../model/semantic.js';
|
|
2
|
-
import type { RelationshipCreateRequest, RelationshipDefinitionDTO } from '../model/relationship-legality.js';
|
|
2
|
+
import type { RelationshipCreateRequest, RelationshipDefinitionDTO, RelationshipUpdateRequest } from '../model/relationship-legality.js';
|
|
3
|
+
import { type IrIdentityIndex } from '../model/ir-identity.js';
|
|
4
|
+
import { type RelationshipNotation } from './sysml-notation.js';
|
|
3
5
|
/** Default file used when the project has no better home for a relationship. */
|
|
4
|
-
export declare const CANONICAL_RELATIONSHIP_FILE = "model/relationships.sysml";
|
|
6
|
+
export declare const CANONICAL_RELATIONSHIP_FILE = "model/catalog/relationships.sysml";
|
|
5
7
|
/** Directory segments holding view/presentation SysML — never a relationship home. */
|
|
6
8
|
export declare const DEFAULT_PRESENTATION_DIRS: string[];
|
|
7
9
|
/** Filenames a package uses to collect its relationships. */
|
|
@@ -28,6 +30,14 @@ export interface RelationshipWriterOptions {
|
|
|
28
30
|
presentationDirs?: string[];
|
|
29
31
|
/** Filenames treated as a package's relationship collection. */
|
|
30
32
|
relationshipFilePattern?: RegExp;
|
|
33
|
+
/**
|
|
34
|
+
* Identity index of the current revision.
|
|
35
|
+
*
|
|
36
|
+
* Present whenever a compiled revision exists. Absent only before the first
|
|
37
|
+
* successful lowering, and a request quoting an identity is then refused
|
|
38
|
+
* rather than written blind.
|
|
39
|
+
*/
|
|
40
|
+
irIndex?: IrIdentityIndex;
|
|
31
41
|
}
|
|
32
42
|
/** Why a particular file was chosen, for logging and for the UI to show. */
|
|
33
43
|
export type PlacementReason = 'requested' | 'designated-package-file' | 'common-package-file' | 'source-element-file' | 'canonical-file' | 'canonical-file-created';
|
|
@@ -42,12 +52,20 @@ export interface RelationshipWriteResult {
|
|
|
42
52
|
success: boolean;
|
|
43
53
|
/** Project-relative file actually written. */
|
|
44
54
|
sourceFile?: string;
|
|
45
|
-
/**
|
|
55
|
+
/**
|
|
56
|
+
* Stable ID (the connection usage name) of the created relationship.
|
|
57
|
+
*
|
|
58
|
+
* Absent for notations SysML does not name — see `notation`.
|
|
59
|
+
*/
|
|
46
60
|
relationshipId?: string;
|
|
61
|
+
/** SysML production the relationship was written in. */
|
|
62
|
+
notation?: RelationshipNotation;
|
|
47
63
|
/** The exact declaration text inserted. */
|
|
48
64
|
declaration?: string;
|
|
49
65
|
placementReason?: PlacementReason;
|
|
50
66
|
error?: string;
|
|
67
|
+
/** Set when the failure was a stale endpoint identity. */
|
|
68
|
+
stale?: boolean;
|
|
51
69
|
}
|
|
52
70
|
export interface RelationshipRemoveResult {
|
|
53
71
|
success: boolean;
|
|
@@ -56,6 +74,12 @@ export interface RelationshipRemoveResult {
|
|
|
56
74
|
removedDeclaration?: string;
|
|
57
75
|
error?: string;
|
|
58
76
|
}
|
|
77
|
+
export interface RelationshipUpdateResult {
|
|
78
|
+
success: boolean;
|
|
79
|
+
sourceFile?: string;
|
|
80
|
+
declaration?: string;
|
|
81
|
+
error?: string;
|
|
82
|
+
}
|
|
59
83
|
/**
|
|
60
84
|
* Whether a project-relative path is a legal home for a model relationship.
|
|
61
85
|
*
|
|
@@ -83,8 +107,14 @@ export declare function resolveRelationshipPlacement(request: Pick<RelationshipC
|
|
|
83
107
|
* authored relationship gets one.
|
|
84
108
|
*/
|
|
85
109
|
export declare function generateRelationshipId(type: string, sourceId: string, targetId: string, taken: Iterable<string>): string;
|
|
86
|
-
/**
|
|
87
|
-
|
|
110
|
+
/**
|
|
111
|
+
* Render a relationship as SysML source.
|
|
112
|
+
*
|
|
113
|
+
* The form comes from the language, not from this module — see
|
|
114
|
+
* `./sysml-notation.ts`. Kept as a named export because the shape "id,
|
|
115
|
+
* definition, endpoints" is what every caller has.
|
|
116
|
+
*/
|
|
117
|
+
export declare function generateRelationshipDeclaration(id: string, definition: RelationshipDefinitionDTO, sourceId: string, targetId: string, flowItem?: string, guard?: string): string;
|
|
88
118
|
/**
|
|
89
119
|
* Write a relationship into project SysML.
|
|
90
120
|
*
|
|
@@ -93,6 +123,12 @@ export declare function generateRelationshipDeclaration(id: string, definition:
|
|
|
93
123
|
* not parse or does not contain the new connection.
|
|
94
124
|
*/
|
|
95
125
|
export declare function writeRelationship(request: RelationshipCreateRequest, definition: RelationshipDefinitionDTO, model: Pick<MemoModelDTO, 'elements' | 'relationships'>, options: RelationshipWriterOptions): Promise<RelationshipWriteResult>;
|
|
126
|
+
/**
|
|
127
|
+
* Atomically replace one relationship declaration at the exact range supplied
|
|
128
|
+
* by the current compiled model. This also supports anonymous SysML `flow` and
|
|
129
|
+
* `succession` usages, which deliberately have no stable declared name.
|
|
130
|
+
*/
|
|
131
|
+
export declare function updateRelationship(request: RelationshipUpdateRequest, relationship: MemoRelationship, definition: RelationshipDefinitionDTO, model: Pick<MemoModelDTO, 'elements'>, options: RelationshipWriterOptions): Promise<RelationshipUpdateResult>;
|
|
96
132
|
/**
|
|
97
133
|
* Remove exactly one connection usage from its owning file.
|
|
98
134
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-writer.d.ts","sourceRoot":"","sources":["../../src/server/relationship-writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relationship-writer.d.ts","sourceRoot":"","sources":["../../src/server/relationship-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,16 +7,28 @@
|
|
|
7
7
|
// Editing is CST-aware: the file is parsed, the edit is applied by source
|
|
8
8
|
// offset so comments and unrelated declarations survive untouched, the result
|
|
9
9
|
// is reparsed and validated, and only then does it atomically replace the file.
|
|
10
|
+
//
|
|
11
|
+
// Endpoints are addressed by **IR identity** when the caller quotes one (§6.2).
|
|
12
|
+
// A relationship names two elements, so a request built against a stale
|
|
13
|
+
// revision is a request to connect two things that may no longer be what the
|
|
14
|
+
// client thought they were — it is refused, loudly, rather than written against
|
|
15
|
+
// whatever now answers to those names.
|
|
16
|
+
//
|
|
17
|
+
// The notation is standard SysML, chosen in ./sysml-notation.ts: a succession
|
|
18
|
+
// is written `succession first a if g then b;`, not encoded as a MEMO-flavoured
|
|
19
|
+
// connection usage.
|
|
10
20
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
21
|
import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
12
22
|
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
13
23
|
import { parseText } from '../model/parser-utils.js';
|
|
24
|
+
import { StaleIrIdentityError, } from '../model/ir-identity.js';
|
|
25
|
+
import { notationFor, notationIsNameable, renderRelationship, } from './sysml-notation.js';
|
|
14
26
|
import { isConnectionUsage, isPackageDeclaration, } from '../language/generated/ast.js';
|
|
15
27
|
// Project-layout conventions, not ontology semantics — these describe where a
|
|
16
28
|
// MEMO project keeps its files, so they are overridable per project rather than
|
|
17
29
|
// fixed in the engine.
|
|
18
30
|
/** Default file used when the project has no better home for a relationship. */
|
|
19
|
-
export const CANONICAL_RELATIONSHIP_FILE = 'model/relationships.sysml';
|
|
31
|
+
export const CANONICAL_RELATIONSHIP_FILE = 'model/catalog/relationships.sysml';
|
|
20
32
|
/** Directory segments holding view/presentation SysML — never a relationship home. */
|
|
21
33
|
export const DEFAULT_PRESENTATION_DIRS = ['views'];
|
|
22
34
|
/** Filenames a package uses to collect its relationships. */
|
|
@@ -175,15 +187,15 @@ export function generateRelationshipId(type, sourceId, targetId, taken) {
|
|
|
175
187
|
n++;
|
|
176
188
|
return `${base}_${n}`;
|
|
177
189
|
}
|
|
178
|
-
/**
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
190
|
+
/**
|
|
191
|
+
* Render a relationship as SysML source.
|
|
192
|
+
*
|
|
193
|
+
* The form comes from the language, not from this module — see
|
|
194
|
+
* `./sysml-notation.ts`. Kept as a named export because the shape "id,
|
|
195
|
+
* definition, endpoints" is what every caller has.
|
|
196
|
+
*/
|
|
197
|
+
export function generateRelationshipDeclaration(id, definition, sourceId, targetId, flowItem, guard) {
|
|
198
|
+
return renderRelationship({ id, definition, sourceId, targetId, flowItem, guard });
|
|
187
199
|
}
|
|
188
200
|
// ─── Create ─────────────────────────────────────────────────────────────────
|
|
189
201
|
/**
|
|
@@ -194,13 +206,24 @@ export function generateRelationshipDeclaration(id, definition, sourceId, target
|
|
|
194
206
|
* not parse or does not contain the new connection.
|
|
195
207
|
*/
|
|
196
208
|
export async function writeRelationship(request, definition, model, options) {
|
|
209
|
+
// Endpoint identities first: a request built against a revision that has
|
|
210
|
+
// moved on must not be written at all, so this precedes every file decision.
|
|
211
|
+
try {
|
|
212
|
+
assertFreshEndpoints(request, options.irIndex);
|
|
213
|
+
}
|
|
214
|
+
catch (e) {
|
|
215
|
+
if (e instanceof StaleIrIdentityError)
|
|
216
|
+
return { success: false, stale: true, error: e.message };
|
|
217
|
+
throw e;
|
|
218
|
+
}
|
|
197
219
|
const placement = resolveRelationshipPlacement(request, model, options);
|
|
198
220
|
if (!isWritableRelationshipFile(placement.file, options)) {
|
|
199
221
|
return { success: false, error: `No writable project file can own this relationship (${placement.file})` };
|
|
200
222
|
}
|
|
201
223
|
const absolutePath = resolve(options.projectRoot, placement.file);
|
|
224
|
+
const notation = notationFor(definition);
|
|
202
225
|
const relationshipId = generateRelationshipId(definition.name, request.sourceId, request.targetId, model.relationships.map(rel => rel.id));
|
|
203
|
-
const declaration = generateRelationshipDeclaration(relationshipId, definition, request.sourceId, request.targetId, request.flowItem);
|
|
226
|
+
const declaration = generateRelationshipDeclaration(relationshipId, definition, request.sourceId, request.targetId, request.flowItem, request.guard);
|
|
204
227
|
let updated;
|
|
205
228
|
if (!existsSync(absolutePath)) {
|
|
206
229
|
updated = newRelationshipFile(placement.file, declaration);
|
|
@@ -220,7 +243,9 @@ export async function writeRelationship(request, definition, model, options) {
|
|
|
220
243
|
error: `The updated source did not parse (${errors[0].message}); the file was left unchanged`,
|
|
221
244
|
};
|
|
222
245
|
}
|
|
223
|
-
const written =
|
|
246
|
+
const written = notationIsNameable(notation)
|
|
247
|
+
? findConnectionUsage(document.parseResult.value, relationshipId) !== undefined
|
|
248
|
+
: containsDeclaration(document.parseResult.value, updated, declaration);
|
|
224
249
|
if (!written) {
|
|
225
250
|
return {
|
|
226
251
|
success: false,
|
|
@@ -236,11 +261,45 @@ export async function writeRelationship(request, definition, model, options) {
|
|
|
236
261
|
return {
|
|
237
262
|
success: true,
|
|
238
263
|
sourceFile: placement.file,
|
|
239
|
-
|
|
264
|
+
// SysML's succession and flow productions take no declared name, so a
|
|
265
|
+
// relationship written in one is addressed by position. Reporting an ID
|
|
266
|
+
// it does not have would only make deletion fail later, further away.
|
|
267
|
+
...(notationIsNameable(notation) ? { relationshipId } : {}),
|
|
268
|
+
notation,
|
|
240
269
|
declaration,
|
|
241
270
|
placementReason: placement.reason,
|
|
242
271
|
};
|
|
243
272
|
}
|
|
273
|
+
/**
|
|
274
|
+
* Refuse a request whose endpoints were named against an older revision.
|
|
275
|
+
*
|
|
276
|
+
* Only quoted identities are checked. A caller that quotes none is asking for
|
|
277
|
+
* the by-name behaviour it always had, and gets it — the loud failure is for
|
|
278
|
+
* callers that *did* name a revision and named a stale one, which is the case
|
|
279
|
+
* where continuing would connect the wrong elements.
|
|
280
|
+
*/
|
|
281
|
+
function assertFreshEndpoints(request, index) {
|
|
282
|
+
const ends = [
|
|
283
|
+
['source', request.sourceIdentity, request.sourceId],
|
|
284
|
+
['target', request.targetIdentity, request.targetId],
|
|
285
|
+
];
|
|
286
|
+
for (const [end, identityId, elementId] of ends) {
|
|
287
|
+
if (!identityId)
|
|
288
|
+
continue;
|
|
289
|
+
if (!index) {
|
|
290
|
+
throw new StaleIrIdentityError(identityId, 'no compiled revision is available to resolve the ' + end + ' endpoint against');
|
|
291
|
+
}
|
|
292
|
+
const record = index.byIdentity.get(identityId);
|
|
293
|
+
if (!record) {
|
|
294
|
+
throw new StaleIrIdentityError(identityId, `the ${end} endpoint is not in the current model revision`);
|
|
295
|
+
}
|
|
296
|
+
const named = record.memoElementId;
|
|
297
|
+
if (named !== elementId) {
|
|
298
|
+
throw new StaleIrIdentityError(identityId, `the ${end} endpoint now names ${named ? `"${named}"` : 'a declaration MEMO does not project'}, `
|
|
299
|
+
+ `not "${elementId}"`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
244
303
|
/** Body of a freshly created relationship file. */
|
|
245
304
|
function newRelationshipFile(relativePath, declaration) {
|
|
246
305
|
const packageName = relativePath
|
|
@@ -249,6 +308,65 @@ function newRelationshipFile(relativePath, declaration) {
|
|
|
249
308
|
.replace(/^_+|_+$/g, '') || 'relationships';
|
|
250
309
|
return `package ${packageName} {\n ${declaration}\n}\n`;
|
|
251
310
|
}
|
|
311
|
+
/** Fully qualify a nested endpoint from the semantic ownership chain. */
|
|
312
|
+
function endpointPath(elementId, model) {
|
|
313
|
+
const path = [elementId];
|
|
314
|
+
const visited = new Set(path);
|
|
315
|
+
let owner = model.elements[elementId]?.owner;
|
|
316
|
+
while (owner && !visited.has(owner)) {
|
|
317
|
+
path.unshift(owner);
|
|
318
|
+
visited.add(owner);
|
|
319
|
+
owner = model.elements[owner]?.owner;
|
|
320
|
+
}
|
|
321
|
+
return path.join('.');
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Atomically replace one relationship declaration at the exact range supplied
|
|
325
|
+
* by the current compiled model. This also supports anonymous SysML `flow` and
|
|
326
|
+
* `succession` usages, which deliberately have no stable declared name.
|
|
327
|
+
*/
|
|
328
|
+
export async function updateRelationship(request, relationship, definition, model, options) {
|
|
329
|
+
try {
|
|
330
|
+
assertFreshEndpoints(request, options.irIndex);
|
|
331
|
+
}
|
|
332
|
+
catch (e) {
|
|
333
|
+
if (e instanceof StaleIrIdentityError)
|
|
334
|
+
return { success: false, error: e.message };
|
|
335
|
+
throw e;
|
|
336
|
+
}
|
|
337
|
+
if (!relationship.file || !isWritableRelationshipFile(relationship.file, options)) {
|
|
338
|
+
return { success: false, error: `${relationship.file || 'The source file'} is not a writable project file` };
|
|
339
|
+
}
|
|
340
|
+
const range = relationship.sourceRange;
|
|
341
|
+
if (!range)
|
|
342
|
+
return { success: false, error: 'The relationship has no source range in the current model revision' };
|
|
343
|
+
const absolutePath = resolve(options.projectRoot, relationship.file);
|
|
344
|
+
if (!existsSync(absolutePath))
|
|
345
|
+
return { success: false, error: `${relationship.file} no longer exists` };
|
|
346
|
+
const source = readFileSync(absolutePath, 'utf8');
|
|
347
|
+
if (range.offset < 0 || range.length <= 0 || range.offset + range.length > source.length) {
|
|
348
|
+
return { success: false, error: 'The relationship source range is stale' };
|
|
349
|
+
}
|
|
350
|
+
const declaration = generateRelationshipDeclaration(relationship.id, definition, endpointPath(request.sourceId, model), endpointPath(request.targetId, model), relationship.flowItem, relationship.attributes?.guard);
|
|
351
|
+
const updated = source.slice(0, range.offset) + declaration + source.slice(range.offset + range.length);
|
|
352
|
+
const reparsed = await parseText(updated);
|
|
353
|
+
if (reparsed.errors.length > 0) {
|
|
354
|
+
return { success: false, error: `The updated source did not parse (${reparsed.errors[0].message}); the file was left unchanged` };
|
|
355
|
+
}
|
|
356
|
+
const notation = notationFor(definition);
|
|
357
|
+
const present = notationIsNameable(notation)
|
|
358
|
+
? findConnectionUsage(reparsed.document.parseResult.value, relationship.id) !== undefined
|
|
359
|
+
: containsDeclaration(reparsed.document.parseResult.value, updated, declaration);
|
|
360
|
+
if (!present)
|
|
361
|
+
return { success: false, error: 'The updated relationship was not present after reparsing; the file was left unchanged' };
|
|
362
|
+
try {
|
|
363
|
+
atomicWrite(absolutePath, updated);
|
|
364
|
+
}
|
|
365
|
+
catch (e) {
|
|
366
|
+
return { success: false, error: `Could not write ${relationship.file}: ${String(e)}` };
|
|
367
|
+
}
|
|
368
|
+
return { success: true, sourceFile: relationship.file, declaration };
|
|
369
|
+
}
|
|
252
370
|
/**
|
|
253
371
|
* Insert a declaration as the last member of the file's final top-level
|
|
254
372
|
* package, matching the indentation of the members already there. Everything
|
|
@@ -363,6 +481,32 @@ export async function removeRelationship(relationship, options) {
|
|
|
363
481
|
return { success: true, sourceFile: relationship.file, removedDeclaration };
|
|
364
482
|
}
|
|
365
483
|
// ─── Shared helpers ─────────────────────────────────────────────────────────
|
|
484
|
+
/**
|
|
485
|
+
* Whether a parsed document contains exactly the declaration that was inserted.
|
|
486
|
+
*
|
|
487
|
+
* The confirmation for anonymous notations. A named connection can be looked up
|
|
488
|
+
* by name; a succession cannot, so the check is that some parsed node's own
|
|
489
|
+
* source range *is* the text that was inserted — which proves both that it
|
|
490
|
+
* survived the reparse and that the parser read it as one declaration rather
|
|
491
|
+
* than as a fragment of something larger.
|
|
492
|
+
*/
|
|
493
|
+
function containsDeclaration(model, source, declaration) {
|
|
494
|
+
const wanted = declaration.trim();
|
|
495
|
+
const stack = [...(model.members ?? [])];
|
|
496
|
+
while (stack.length > 0) {
|
|
497
|
+
const node = stack.pop();
|
|
498
|
+
if (!node || typeof node !== 'object')
|
|
499
|
+
continue;
|
|
500
|
+
const cst = node.$cstNode;
|
|
501
|
+
if (cst && source.slice(cst.offset, cst.offset + cst.length).trim() === wanted)
|
|
502
|
+
return true;
|
|
503
|
+
if (Array.isArray(node.members))
|
|
504
|
+
stack.push(...node.members);
|
|
505
|
+
if (Array.isArray(node.body))
|
|
506
|
+
stack.push(...node.body);
|
|
507
|
+
}
|
|
508
|
+
return false;
|
|
509
|
+
}
|
|
366
510
|
/** Depth-first search for a named connection usage anywhere in the document. */
|
|
367
511
|
function findConnectionUsage(model, name) {
|
|
368
512
|
const stack = [...(model.members ?? [])];
|