@memoarchitect/tools 0.6.6 → 0.7.2

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.
Files changed (478) hide show
  1. package/README.md +54 -11
  2. package/package.json +19 -7
  3. package/packages/tools/lib/analysis-starters.d.ts +4 -0
  4. package/packages/tools/lib/analysis-starters.d.ts.map +1 -0
  5. package/packages/tools/lib/analysis-starters.js +425 -0
  6. package/packages/tools/lib/analysis-starters.js.map +1 -0
  7. package/packages/tools/lib/bin/memo.js +161 -10
  8. package/packages/tools/lib/bin/memo.js.map +1 -1
  9. package/packages/tools/lib/browser/index.d.ts +1 -1
  10. package/packages/tools/lib/browser/index.d.ts.map +1 -1
  11. package/packages/tools/lib/browser/index.js +1 -1
  12. package/packages/tools/lib/browser/index.js.map +1 -1
  13. package/packages/tools/lib/commands/ask.js +1 -1
  14. package/packages/tools/lib/commands/ask.js.map +1 -1
  15. package/packages/tools/lib/commands/check.d.ts.map +1 -1
  16. package/packages/tools/lib/commands/check.js +3 -9
  17. package/packages/tools/lib/commands/check.js.map +1 -1
  18. package/packages/tools/lib/commands/conformance.d.ts +36 -0
  19. package/packages/tools/lib/commands/conformance.d.ts.map +1 -0
  20. package/packages/tools/lib/commands/conformance.js +212 -0
  21. package/packages/tools/lib/commands/conformance.js.map +1 -0
  22. package/packages/tools/lib/commands/convert.d.ts +12 -0
  23. package/packages/tools/lib/commands/convert.d.ts.map +1 -0
  24. package/packages/tools/lib/commands/convert.js +103 -0
  25. package/packages/tools/lib/commands/convert.js.map +1 -0
  26. package/packages/tools/lib/commands/create-package.d.ts +1 -2
  27. package/packages/tools/lib/commands/create-package.d.ts.map +1 -1
  28. package/packages/tools/lib/commands/create-package.js.map +1 -1
  29. package/packages/tools/lib/commands/dev.d.ts +13 -0
  30. package/packages/tools/lib/commands/dev.d.ts.map +1 -1
  31. package/packages/tools/lib/commands/dev.js +208 -74
  32. package/packages/tools/lib/commands/dev.js.map +1 -1
  33. package/packages/tools/lib/commands/dhf-draft.js +1 -1
  34. package/packages/tools/lib/commands/dhf-draft.js.map +1 -1
  35. package/packages/tools/lib/commands/dhf-preview.js +1 -1
  36. package/packages/tools/lib/commands/dhf-preview.js.map +1 -1
  37. package/packages/tools/lib/commands/dhf.js +1 -1
  38. package/packages/tools/lib/commands/dhf.js.map +1 -1
  39. package/packages/tools/lib/commands/element.d.ts +34 -0
  40. package/packages/tools/lib/commands/element.d.ts.map +1 -0
  41. package/packages/tools/lib/commands/element.js +174 -0
  42. package/packages/tools/lib/commands/element.js.map +1 -0
  43. package/packages/tools/lib/commands/export.d.ts.map +1 -1
  44. package/packages/tools/lib/commands/export.js +39 -40
  45. package/packages/tools/lib/commands/export.js.map +1 -1
  46. package/packages/tools/lib/commands/generate.d.ts.map +1 -1
  47. package/packages/tools/lib/commands/generate.js +10 -7
  48. package/packages/tools/lib/commands/generate.js.map +1 -1
  49. package/packages/tools/lib/commands/import.d.ts.map +1 -1
  50. package/packages/tools/lib/commands/import.js +25 -12
  51. package/packages/tools/lib/commands/import.js.map +1 -1
  52. package/packages/tools/lib/commands/init.d.ts.map +1 -1
  53. package/packages/tools/lib/commands/init.js +37 -14
  54. package/packages/tools/lib/commands/init.js.map +1 -1
  55. package/packages/tools/lib/commands/inspect.d.ts +5 -0
  56. package/packages/tools/lib/commands/inspect.d.ts.map +1 -0
  57. package/packages/tools/lib/commands/inspect.js +56 -0
  58. package/packages/tools/lib/commands/inspect.js.map +1 -0
  59. package/packages/tools/lib/commands/lock.d.ts.map +1 -1
  60. package/packages/tools/lib/commands/lock.js +7 -2
  61. package/packages/tools/lib/commands/lock.js.map +1 -1
  62. package/packages/tools/lib/commands/ontology.d.ts.map +1 -1
  63. package/packages/tools/lib/commands/ontology.js +69 -116
  64. package/packages/tools/lib/commands/ontology.js.map +1 -1
  65. package/packages/tools/lib/commands/pack.d.ts +1 -1
  66. package/packages/tools/lib/commands/pack.d.ts.map +1 -1
  67. package/packages/tools/lib/commands/pack.js +20 -75
  68. package/packages/tools/lib/commands/pack.js.map +1 -1
  69. package/packages/tools/lib/commands/package.d.ts +10 -0
  70. package/packages/tools/lib/commands/package.d.ts.map +1 -0
  71. package/packages/tools/lib/commands/package.js +113 -0
  72. package/packages/tools/lib/commands/package.js.map +1 -0
  73. package/packages/tools/lib/commands/plugin.js +1 -1
  74. package/packages/tools/lib/commands/plugin.js.map +1 -1
  75. package/packages/tools/lib/commands/rules.d.ts.map +1 -1
  76. package/packages/tools/lib/commands/rules.js +120 -30
  77. package/packages/tools/lib/commands/rules.js.map +1 -1
  78. package/packages/tools/lib/commands/sysand-publish.d.ts.map +1 -1
  79. package/packages/tools/lib/commands/sysand-publish.js +14 -16
  80. package/packages/tools/lib/commands/sysand-publish.js.map +1 -1
  81. package/packages/tools/lib/commands/toolchain.d.ts +8 -0
  82. package/packages/tools/lib/commands/toolchain.d.ts.map +1 -0
  83. package/packages/tools/lib/commands/toolchain.js +64 -0
  84. package/packages/tools/lib/commands/toolchain.js.map +1 -0
  85. package/packages/tools/lib/commands/validate.d.ts +1 -1
  86. package/packages/tools/lib/commands/validate.d.ts.map +1 -1
  87. package/packages/tools/lib/commands/validate.js +183 -56
  88. package/packages/tools/lib/commands/validate.js.map +1 -1
  89. package/packages/tools/lib/completeness/tracker.d.ts +10 -2
  90. package/packages/tools/lib/completeness/tracker.d.ts.map +1 -1
  91. package/packages/tools/lib/completeness/tracker.js +16 -21
  92. package/packages/tools/lib/completeness/tracker.js.map +1 -1
  93. package/packages/tools/lib/conformance/baseline.d.ts +26 -0
  94. package/packages/tools/lib/conformance/baseline.d.ts.map +1 -0
  95. package/packages/tools/lib/conformance/baseline.js +170 -0
  96. package/packages/tools/lib/conformance/baseline.js.map +1 -0
  97. package/packages/tools/lib/conformance/bnf.d.ts +84 -0
  98. package/packages/tools/lib/conformance/bnf.d.ts.map +1 -0
  99. package/packages/tools/lib/conformance/bnf.js +166 -0
  100. package/packages/tools/lib/conformance/bnf.js.map +1 -0
  101. package/packages/tools/lib/conformance/corpus.d.ts +125 -0
  102. package/packages/tools/lib/conformance/corpus.d.ts.map +1 -0
  103. package/packages/tools/lib/conformance/corpus.js +190 -0
  104. package/packages/tools/lib/conformance/corpus.js.map +1 -0
  105. package/packages/tools/lib/conformance/diff-xmi.d.ts +118 -0
  106. package/packages/tools/lib/conformance/diff-xmi.d.ts.map +1 -0
  107. package/packages/tools/lib/conformance/diff-xmi.js +276 -0
  108. package/packages/tools/lib/conformance/diff-xmi.js.map +1 -0
  109. package/packages/tools/lib/conformance/generated/syside-rules.d.ts +10 -0
  110. package/packages/tools/lib/conformance/generated/syside-rules.d.ts.map +1 -0
  111. package/packages/tools/lib/conformance/generated/syside-rules.js +1142 -0
  112. package/packages/tools/lib/conformance/generated/syside-rules.js.map +1 -0
  113. package/packages/tools/lib/conformance/index.d.ts +7 -0
  114. package/packages/tools/lib/conformance/index.d.ts.map +1 -0
  115. package/packages/tools/lib/conformance/index.js +19 -0
  116. package/packages/tools/lib/conformance/index.js.map +1 -0
  117. package/packages/tools/lib/conformance/run.d.ts +117 -0
  118. package/packages/tools/lib/conformance/run.d.ts.map +1 -0
  119. package/packages/tools/lib/conformance/run.js +0 -0
  120. package/packages/tools/lib/conformance/run.js.map +1 -0
  121. package/packages/tools/lib/conformance/xmi.d.ts +45 -0
  122. package/packages/tools/lib/conformance/xmi.d.ts.map +1 -0
  123. package/packages/tools/lib/conformance/xmi.js +148 -0
  124. package/packages/tools/lib/conformance/xmi.js.map +1 -0
  125. package/packages/tools/lib/dhf/template-resolver.js +1 -1
  126. package/packages/tools/lib/dhf/template-resolver.js.map +1 -1
  127. package/packages/tools/lib/import/column-mapper.d.ts +2 -2
  128. package/packages/tools/lib/import/column-mapper.d.ts.map +1 -1
  129. package/packages/tools/lib/import/column-mapper.js +3 -3
  130. package/packages/tools/lib/import/column-mapper.js.map +1 -1
  131. package/packages/tools/lib/index.d.ts +20 -3
  132. package/packages/tools/lib/index.d.ts.map +1 -1
  133. package/packages/tools/lib/index.js +19 -2
  134. package/packages/tools/lib/index.js.map +1 -1
  135. package/packages/tools/lib/language/generated/ast.d.ts +196 -51
  136. package/packages/tools/lib/language/generated/ast.d.ts.map +1 -1
  137. package/packages/tools/lib/language/generated/ast.js +136 -15
  138. package/packages/tools/lib/language/generated/ast.js.map +1 -1
  139. package/packages/tools/lib/language/generated/grammar.d.ts.map +1 -1
  140. package/packages/tools/lib/language/generated/grammar.js +867 -295
  141. package/packages/tools/lib/language/generated/grammar.js.map +1 -1
  142. package/packages/tools/lib/llm/chat-engine.d.ts +4 -3
  143. package/packages/tools/lib/llm/chat-engine.d.ts.map +1 -1
  144. package/packages/tools/lib/llm/chat-engine.js +15 -12
  145. package/packages/tools/lib/llm/chat-engine.js.map +1 -1
  146. package/packages/tools/lib/llm/generate-engine.d.ts +7 -2
  147. package/packages/tools/lib/llm/generate-engine.d.ts.map +1 -1
  148. package/packages/tools/lib/llm/generate-engine.js +22 -4
  149. package/packages/tools/lib/llm/generate-engine.js.map +1 -1
  150. package/packages/tools/lib/llm/index.d.ts +1 -0
  151. package/packages/tools/lib/llm/index.d.ts.map +1 -1
  152. package/packages/tools/lib/llm/index.js +1 -0
  153. package/packages/tools/lib/llm/index.js.map +1 -1
  154. package/packages/tools/lib/llm/model-context.d.ts +2 -2
  155. package/packages/tools/lib/llm/model-context.d.ts.map +1 -1
  156. package/packages/tools/lib/llm/model-context.js +7 -13
  157. package/packages/tools/lib/llm/model-context.js.map +1 -1
  158. package/packages/tools/lib/llm/sysml-guidance.d.ts +8 -0
  159. package/packages/tools/lib/llm/sysml-guidance.d.ts.map +1 -0
  160. package/packages/tools/lib/llm/sysml-guidance.js +28 -0
  161. package/packages/tools/lib/llm/sysml-guidance.js.map +1 -0
  162. package/packages/tools/lib/lock.d.ts +14 -8
  163. package/packages/tools/lib/lock.d.ts.map +1 -1
  164. package/packages/tools/lib/lock.js +97 -108
  165. package/packages/tools/lib/lock.js.map +1 -1
  166. package/packages/tools/lib/mcp/model-loader.d.ts +5 -1
  167. package/packages/tools/lib/mcp/model-loader.d.ts.map +1 -1
  168. package/packages/tools/lib/mcp/model-loader.js +16 -27
  169. package/packages/tools/lib/mcp/model-loader.js.map +1 -1
  170. package/packages/tools/lib/mcp/tools.d.ts +3 -0
  171. package/packages/tools/lib/mcp/tools.d.ts.map +1 -1
  172. package/packages/tools/lib/mcp/tools.js +8 -9
  173. package/packages/tools/lib/mcp/tools.js.map +1 -1
  174. package/packages/tools/lib/model/activity-notation.d.ts +54 -0
  175. package/packages/tools/lib/model/activity-notation.d.ts.map +1 -0
  176. package/packages/tools/lib/model/activity-notation.js +208 -0
  177. package/packages/tools/lib/model/activity-notation.js.map +1 -0
  178. package/packages/tools/lib/model/builder.d.ts +3 -0
  179. package/packages/tools/lib/model/builder.d.ts.map +1 -1
  180. package/packages/tools/lib/model/builder.js +264 -26
  181. package/packages/tools/lib/model/builder.js.map +1 -1
  182. package/packages/tools/lib/model/config-loader.d.ts +19 -25
  183. package/packages/tools/lib/model/config-loader.d.ts.map +1 -1
  184. package/packages/tools/lib/model/config-loader.js +51 -233
  185. package/packages/tools/lib/model/config-loader.js.map +1 -1
  186. package/packages/tools/lib/model/config.d.ts +42 -213
  187. package/packages/tools/lib/model/config.d.ts.map +1 -1
  188. package/packages/tools/lib/model/config.js +11 -9
  189. package/packages/tools/lib/model/config.js.map +1 -1
  190. package/packages/tools/lib/model/effective-scope.d.ts +74 -0
  191. package/packages/tools/lib/model/effective-scope.d.ts.map +1 -0
  192. package/packages/tools/lib/model/effective-scope.js +133 -0
  193. package/packages/tools/lib/model/effective-scope.js.map +1 -0
  194. package/packages/tools/lib/model/ir-identity.d.ts +94 -0
  195. package/packages/tools/lib/model/ir-identity.d.ts.map +1 -0
  196. package/packages/tools/lib/model/ir-identity.js +178 -0
  197. package/packages/tools/lib/model/ir-identity.js.map +1 -0
  198. package/packages/tools/lib/model/kind-registry.d.ts +114 -1
  199. package/packages/tools/lib/model/kind-registry.d.ts.map +1 -1
  200. package/packages/tools/lib/model/kind-registry.js +148 -4
  201. package/packages/tools/lib/model/kind-registry.js.map +1 -1
  202. package/packages/tools/lib/model/layer-resolver.js +1 -1
  203. package/packages/tools/lib/model/layer-resolver.js.map +1 -1
  204. package/packages/tools/lib/model/methodology-loader.d.ts +19 -24
  205. package/packages/tools/lib/model/methodology-loader.d.ts.map +1 -1
  206. package/packages/tools/lib/model/methodology-loader.js +179 -176
  207. package/packages/tools/lib/model/methodology-loader.js.map +1 -1
  208. package/packages/tools/lib/model/methodology-resolver.d.ts +115 -0
  209. package/packages/tools/lib/model/methodology-resolver.d.ts.map +1 -0
  210. package/packages/tools/lib/model/methodology-resolver.js +317 -0
  211. package/packages/tools/lib/model/methodology-resolver.js.map +1 -0
  212. package/packages/tools/lib/model/native-project.d.ts +130 -0
  213. package/packages/tools/lib/model/native-project.d.ts.map +1 -0
  214. package/packages/tools/lib/model/native-project.js +570 -0
  215. package/packages/tools/lib/model/native-project.js.map +1 -0
  216. package/packages/tools/lib/model/ontology-loader.d.ts +34 -21
  217. package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -1
  218. package/packages/tools/lib/model/ontology-loader.js +340 -614
  219. package/packages/tools/lib/model/ontology-loader.js.map +1 -1
  220. package/packages/tools/lib/model/package-manifest.d.ts +37 -0
  221. package/packages/tools/lib/model/package-manifest.d.ts.map +1 -0
  222. package/packages/tools/lib/model/package-manifest.js +96 -0
  223. package/packages/tools/lib/model/package-manifest.js.map +1 -0
  224. package/packages/tools/lib/model/parser-utils.d.ts +31 -0
  225. package/packages/tools/lib/model/parser-utils.d.ts.map +1 -1
  226. package/packages/tools/lib/model/parser-utils.js +89 -1
  227. package/packages/tools/lib/model/parser-utils.js.map +1 -1
  228. package/packages/tools/lib/model/paths.d.ts +10 -4
  229. package/packages/tools/lib/model/paths.d.ts.map +1 -1
  230. package/packages/tools/lib/model/paths.js +10 -4
  231. package/packages/tools/lib/model/paths.js.map +1 -1
  232. package/packages/tools/lib/model/project-conversion.d.ts +226 -0
  233. package/packages/tools/lib/model/project-conversion.d.ts.map +1 -0
  234. package/packages/tools/lib/model/project-conversion.js +946 -0
  235. package/packages/tools/lib/model/project-conversion.js.map +1 -0
  236. package/packages/tools/lib/model/relationship-legality.d.ts +12 -0
  237. package/packages/tools/lib/model/relationship-legality.d.ts.map +1 -1
  238. package/packages/tools/lib/model/relationship-legality.js.map +1 -1
  239. package/packages/tools/lib/model/relationship-registry.d.ts +16 -1
  240. package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -1
  241. package/packages/tools/lib/model/relationship-registry.js.map +1 -1
  242. package/packages/tools/lib/model/semantic.d.ts +38 -0
  243. package/packages/tools/lib/model/semantic.d.ts.map +1 -1
  244. package/packages/tools/lib/model/semantic.js +3 -0
  245. package/packages/tools/lib/model/semantic.js.map +1 -1
  246. package/packages/tools/lib/model/settings-boundary.d.ts +19 -0
  247. package/packages/tools/lib/model/settings-boundary.d.ts.map +1 -0
  248. package/packages/tools/lib/model/settings-boundary.js +118 -0
  249. package/packages/tools/lib/model/settings-boundary.js.map +1 -0
  250. package/packages/tools/lib/model/short-id.d.ts +8 -7
  251. package/packages/tools/lib/model/short-id.d.ts.map +1 -1
  252. package/packages/tools/lib/model/short-id.js +26 -17
  253. package/packages/tools/lib/model/short-id.js.map +1 -1
  254. package/packages/tools/lib/model/source-graph.d.ts.map +1 -1
  255. package/packages/tools/lib/model/source-graph.js +5 -1
  256. package/packages/tools/lib/model/source-graph.js.map +1 -1
  257. package/packages/tools/lib/model/source-provenance.d.ts +112 -0
  258. package/packages/tools/lib/model/source-provenance.d.ts.map +1 -0
  259. package/packages/tools/lib/model/source-provenance.js +169 -0
  260. package/packages/tools/lib/model/source-provenance.js.map +1 -0
  261. package/packages/tools/lib/model/sysml-files.d.ts +9 -0
  262. package/packages/tools/lib/model/sysml-files.d.ts.map +1 -1
  263. package/packages/tools/lib/model/sysml-files.js +20 -1
  264. package/packages/tools/lib/model/sysml-files.js.map +1 -1
  265. package/packages/tools/lib/model/sysml-ir.d.ts +9 -0
  266. package/packages/tools/lib/model/sysml-ir.d.ts.map +1 -0
  267. package/packages/tools/lib/model/sysml-ir.js +105 -0
  268. package/packages/tools/lib/model/sysml-ir.js.map +1 -0
  269. package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
  270. package/packages/tools/lib/model/view-deriver.js +60 -6
  271. package/packages/tools/lib/model/view-deriver.js.map +1 -1
  272. package/packages/tools/lib/model/view-kinds.d.ts +2 -0
  273. package/packages/tools/lib/model/view-kinds.d.ts.map +1 -1
  274. package/packages/tools/lib/model/view-kinds.js +11 -0
  275. package/packages/tools/lib/model/view-kinds.js.map +1 -1
  276. package/packages/tools/lib/ontology/owl-exporter.d.ts +2 -2
  277. package/packages/tools/lib/ontology/owl-exporter.d.ts.map +1 -1
  278. package/packages/tools/lib/ontology/owl-exporter.js +12 -12
  279. package/packages/tools/lib/ontology/owl-exporter.js.map +1 -1
  280. package/packages/tools/lib/operations/ai-authoring.d.ts +24 -0
  281. package/packages/tools/lib/operations/ai-authoring.d.ts.map +1 -0
  282. package/packages/tools/lib/operations/ai-authoring.js +77 -0
  283. package/packages/tools/lib/operations/ai-authoring.js.map +1 -0
  284. package/packages/tools/lib/operations/authoring.d.ts +40 -0
  285. package/packages/tools/lib/operations/authoring.d.ts.map +1 -0
  286. package/packages/tools/lib/operations/authoring.js +56 -0
  287. package/packages/tools/lib/operations/authoring.js.map +1 -0
  288. package/packages/tools/lib/operations/index.d.ts +2 -0
  289. package/packages/tools/lib/operations/index.d.ts.map +1 -1
  290. package/packages/tools/lib/operations/index.js +2 -0
  291. package/packages/tools/lib/operations/index.js.map +1 -1
  292. package/packages/tools/lib/operations/project-snapshot.d.ts +28 -3
  293. package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -1
  294. package/packages/tools/lib/operations/project-snapshot.js +79 -30
  295. package/packages/tools/lib/operations/project-snapshot.js.map +1 -1
  296. package/packages/tools/lib/protocol/messages.d.ts +311 -11
  297. package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
  298. package/packages/tools/lib/serializer/csv-io.d.ts +7 -7
  299. package/packages/tools/lib/serializer/csv-io.d.ts.map +1 -1
  300. package/packages/tools/lib/serializer/csv-io.js +11 -11
  301. package/packages/tools/lib/serializer/csv-io.js.map +1 -1
  302. package/packages/tools/lib/serializer/sysml-generator.d.ts.map +1 -1
  303. package/packages/tools/lib/serializer/sysml-generator.js +34 -2
  304. package/packages/tools/lib/serializer/sysml-generator.js.map +1 -1
  305. package/packages/tools/lib/server/config-resolver.d.ts +8 -4
  306. package/packages/tools/lib/server/config-resolver.d.ts.map +1 -1
  307. package/packages/tools/lib/server/config-resolver.js +25 -44
  308. package/packages/tools/lib/server/config-resolver.js.map +1 -1
  309. package/packages/tools/lib/server/conflict-policy.d.ts +44 -0
  310. package/packages/tools/lib/server/conflict-policy.d.ts.map +1 -0
  311. package/packages/tools/lib/server/conflict-policy.js +94 -0
  312. package/packages/tools/lib/server/conflict-policy.js.map +1 -0
  313. package/packages/tools/lib/server/dev-server.d.ts +32 -2
  314. package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
  315. package/packages/tools/lib/server/dev-server.js +721 -53
  316. package/packages/tools/lib/server/dev-server.js.map +1 -1
  317. package/packages/tools/lib/server/element-writer.d.ts +11 -0
  318. package/packages/tools/lib/server/element-writer.d.ts.map +1 -0
  319. package/packages/tools/lib/server/element-writer.js +123 -0
  320. package/packages/tools/lib/server/element-writer.js.map +1 -0
  321. package/packages/tools/lib/server/file-watcher.d.ts +4 -1
  322. package/packages/tools/lib/server/file-watcher.d.ts.map +1 -1
  323. package/packages/tools/lib/server/file-watcher.js +17 -7
  324. package/packages/tools/lib/server/file-watcher.js.map +1 -1
  325. package/packages/tools/lib/server/mutation-domain.d.ts +22 -0
  326. package/packages/tools/lib/server/mutation-domain.d.ts.map +1 -0
  327. package/packages/tools/lib/server/mutation-domain.js +87 -0
  328. package/packages/tools/lib/server/mutation-domain.js.map +1 -0
  329. package/packages/tools/lib/server/persistor.d.ts +63 -8
  330. package/packages/tools/lib/server/persistor.d.ts.map +1 -1
  331. package/packages/tools/lib/server/persistor.js +152 -44
  332. package/packages/tools/lib/server/persistor.js.map +1 -1
  333. package/packages/tools/lib/server/relationship-writer.d.ts +28 -4
  334. package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -1
  335. package/packages/tools/lib/server/relationship-writer.js +98 -9
  336. package/packages/tools/lib/server/relationship-writer.js.map +1 -1
  337. package/packages/tools/lib/server/rule-policy-writer.d.ts +40 -0
  338. package/packages/tools/lib/server/rule-policy-writer.d.ts.map +1 -0
  339. package/packages/tools/lib/server/rule-policy-writer.js +124 -0
  340. package/packages/tools/lib/server/rule-policy-writer.js.map +1 -0
  341. package/packages/tools/lib/server/runtime-budget.d.ts +14 -0
  342. package/packages/tools/lib/server/runtime-budget.d.ts.map +1 -0
  343. package/packages/tools/lib/server/runtime-budget.js +15 -0
  344. package/packages/tools/lib/server/runtime-budget.js.map +1 -0
  345. package/packages/tools/lib/server/sysml-notation.d.ts +36 -0
  346. package/packages/tools/lib/server/sysml-notation.d.ts.map +1 -0
  347. package/packages/tools/lib/server/sysml-notation.js +87 -0
  348. package/packages/tools/lib/server/sysml-notation.js.map +1 -0
  349. package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -1
  350. package/packages/tools/lib/server/view-layout-store.js +2 -0
  351. package/packages/tools/lib/server/view-layout-store.js.map +1 -1
  352. package/packages/tools/lib/sysml-ir/generated/sysml-derivations.d.ts +9 -0
  353. package/packages/tools/lib/sysml-ir/generated/sysml-derivations.d.ts.map +1 -0
  354. package/packages/tools/lib/sysml-ir/generated/sysml-derivations.js +315 -0
  355. package/packages/tools/lib/sysml-ir/generated/sysml-derivations.js.map +1 -0
  356. package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.d.ts +5206 -0
  357. package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.d.ts.map +1 -0
  358. package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.js +1933 -0
  359. package/packages/tools/lib/sysml-ir/generated/sysml-metamodel.js.map +1 -0
  360. package/packages/tools/lib/sysml-ir/index.d.ts +3 -0
  361. package/packages/tools/lib/sysml-ir/index.d.ts.map +1 -0
  362. package/packages/tools/lib/sysml-ir/index.js +3 -0
  363. package/packages/tools/lib/sysml-ir/index.js.map +1 -0
  364. package/packages/tools/lib/sysml-ir/ir.d.ts +50 -0
  365. package/packages/tools/lib/sysml-ir/ir.d.ts.map +1 -0
  366. package/packages/tools/lib/sysml-ir/ir.js +2 -0
  367. package/packages/tools/lib/sysml-ir/ir.js.map +1 -0
  368. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts +3 -0
  369. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts.map +1 -0
  370. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js +97 -0
  371. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js.map +1 -0
  372. package/packages/tools/lib/sysmlc/index.d.ts +2 -0
  373. package/packages/tools/lib/sysmlc/index.d.ts.map +1 -0
  374. package/packages/tools/lib/sysmlc/index.js +7 -0
  375. package/packages/tools/lib/sysmlc/index.js.map +1 -0
  376. package/packages/tools/lib/sysmlc/server.d.ts +29 -0
  377. package/packages/tools/lib/sysmlc/server.d.ts.map +1 -0
  378. package/packages/tools/lib/sysmlc/server.js +168 -0
  379. package/packages/tools/lib/sysmlc/server.js.map +1 -0
  380. package/packages/tools/lib/toolchain/default-registry.d.ts +12 -0
  381. package/packages/tools/lib/toolchain/default-registry.d.ts.map +1 -0
  382. package/packages/tools/lib/toolchain/default-registry.js +28 -0
  383. package/packages/tools/lib/toolchain/default-registry.js.map +1 -0
  384. package/packages/tools/lib/toolchain/diagnostic.d.ts +57 -0
  385. package/packages/tools/lib/toolchain/diagnostic.d.ts.map +1 -0
  386. package/packages/tools/lib/toolchain/diagnostic.js +69 -0
  387. package/packages/tools/lib/toolchain/diagnostic.js.map +1 -0
  388. package/packages/tools/lib/toolchain/effective.d.ts +36 -0
  389. package/packages/tools/lib/toolchain/effective.d.ts.map +1 -0
  390. package/packages/tools/lib/toolchain/effective.js +91 -0
  391. package/packages/tools/lib/toolchain/effective.js.map +1 -0
  392. package/packages/tools/lib/toolchain/index.d.ts +11 -0
  393. package/packages/tools/lib/toolchain/index.d.ts.map +1 -0
  394. package/packages/tools/lib/toolchain/index.js +21 -0
  395. package/packages/tools/lib/toolchain/index.js.map +1 -0
  396. package/packages/tools/lib/toolchain/lowering.d.ts +63 -0
  397. package/packages/tools/lib/toolchain/lowering.d.ts.map +1 -0
  398. package/packages/tools/lib/toolchain/lowering.js +100 -0
  399. package/packages/tools/lib/toolchain/lowering.js.map +1 -0
  400. package/packages/tools/lib/toolchain/operations.d.ts +87 -0
  401. package/packages/tools/lib/toolchain/operations.d.ts.map +1 -0
  402. package/packages/tools/lib/toolchain/operations.js +111 -0
  403. package/packages/tools/lib/toolchain/operations.js.map +1 -0
  404. package/packages/tools/lib/toolchain/process.d.ts +45 -0
  405. package/packages/tools/lib/toolchain/process.d.ts.map +1 -0
  406. package/packages/tools/lib/toolchain/process.js +125 -0
  407. package/packages/tools/lib/toolchain/process.js.map +1 -0
  408. package/packages/tools/lib/toolchain/protocol.d.ts +122 -0
  409. package/packages/tools/lib/toolchain/protocol.d.ts.map +1 -0
  410. package/packages/tools/lib/toolchain/protocol.js +74 -0
  411. package/packages/tools/lib/toolchain/protocol.js.map +1 -0
  412. package/packages/tools/lib/toolchain/providers/internal-kpar.d.ts +9 -0
  413. package/packages/tools/lib/toolchain/providers/internal-kpar.d.ts.map +1 -0
  414. package/packages/tools/lib/toolchain/providers/internal-kpar.js +84 -0
  415. package/packages/tools/lib/toolchain/providers/internal-kpar.js.map +1 -0
  416. package/packages/tools/lib/toolchain/providers/internal.d.ts +33 -0
  417. package/packages/tools/lib/toolchain/providers/internal.d.ts.map +1 -0
  418. package/packages/tools/lib/toolchain/providers/internal.js +286 -0
  419. package/packages/tools/lib/toolchain/providers/internal.js.map +1 -0
  420. package/packages/tools/lib/toolchain/providers/sysand.d.ts +12 -0
  421. package/packages/tools/lib/toolchain/providers/sysand.d.ts.map +1 -0
  422. package/packages/tools/lib/toolchain/providers/sysand.js +110 -0
  423. package/packages/tools/lib/toolchain/providers/sysand.js.map +1 -0
  424. package/packages/tools/lib/toolchain/providers/syside.d.ts +24 -0
  425. package/packages/tools/lib/toolchain/providers/syside.d.ts.map +1 -0
  426. package/packages/tools/lib/toolchain/providers/syside.js +208 -0
  427. package/packages/tools/lib/toolchain/providers/syside.js.map +1 -0
  428. package/packages/tools/lib/toolchain/registry.d.ts +192 -0
  429. package/packages/tools/lib/toolchain/registry.d.ts.map +1 -0
  430. package/packages/tools/lib/toolchain/registry.js +130 -0
  431. package/packages/tools/lib/toolchain/registry.js.map +1 -0
  432. package/packages/tools/lib/toolchain/schema.d.ts +30 -0
  433. package/packages/tools/lib/toolchain/schema.d.ts.map +1 -0
  434. package/packages/tools/lib/toolchain/schema.js +112 -0
  435. package/packages/tools/lib/toolchain/schema.js.map +1 -0
  436. package/packages/tools/lib/toolchain/sysmlc-client.d.ts +77 -0
  437. package/packages/tools/lib/toolchain/sysmlc-client.d.ts.map +1 -0
  438. package/packages/tools/lib/toolchain/sysmlc-client.js +0 -0
  439. package/packages/tools/lib/toolchain/sysmlc-client.js.map +1 -0
  440. package/packages/tools/lib/validator/architecture-validator.d.ts +17 -0
  441. package/packages/tools/lib/validator/architecture-validator.d.ts.map +1 -0
  442. package/packages/tools/lib/validator/architecture-validator.js +101 -0
  443. package/packages/tools/lib/validator/architecture-validator.js.map +1 -0
  444. package/packages/tools/lib/validator/builtin-rules.d.ts +16 -0
  445. package/packages/tools/lib/validator/builtin-rules.d.ts.map +1 -0
  446. package/packages/tools/lib/validator/builtin-rules.js +62 -0
  447. package/packages/tools/lib/validator/builtin-rules.js.map +1 -0
  448. package/packages/tools/lib/validator/constraint-eval.d.ts +15 -0
  449. package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -1
  450. package/packages/tools/lib/validator/constraint-eval.js +62 -7
  451. package/packages/tools/lib/validator/constraint-eval.js.map +1 -1
  452. package/packages/tools/lib/validator/constraint-loader.d.ts +22 -4
  453. package/packages/tools/lib/validator/constraint-loader.d.ts.map +1 -1
  454. package/packages/tools/lib/validator/constraint-loader.js +100 -27
  455. package/packages/tools/lib/validator/constraint-loader.js.map +1 -1
  456. package/packages/tools/lib/validator/rule-engine.d.ts +2 -1
  457. package/packages/tools/lib/validator/rule-engine.d.ts.map +1 -1
  458. package/packages/tools/lib/validator/rule-engine.js +57 -4
  459. package/packages/tools/lib/validator/rule-engine.js.map +1 -1
  460. package/packages/tools/lib/validator/sysml-constraints.d.ts +64 -0
  461. package/packages/tools/lib/validator/sysml-constraints.d.ts.map +1 -0
  462. package/packages/tools/lib/validator/sysml-constraints.js +251 -0
  463. package/packages/tools/lib/validator/sysml-constraints.js.map +1 -0
  464. package/packages/tools/lib/validator/types.d.ts +33 -0
  465. package/packages/tools/lib/validator/types.d.ts.map +1 -1
  466. package/packages/tools/lib/version.d.ts +2 -0
  467. package/packages/tools/lib/version.d.ts.map +1 -0
  468. package/packages/tools/lib/version.js +26 -0
  469. package/packages/tools/lib/version.js.map +1 -0
  470. package/packages/tools/src/grammar/memo-sysml.langium +104 -18
  471. package/packages/tools/lib/model/dimension-filter.d.ts +0 -33
  472. package/packages/tools/lib/model/dimension-filter.d.ts.map +0 -1
  473. package/packages/tools/lib/model/dimension-filter.js +0 -57
  474. package/packages/tools/lib/model/dimension-filter.js.map +0 -1
  475. package/packages/tools/lib/model/toolchain.d.ts +0 -12
  476. package/packages/tools/lib/model/toolchain.d.ts.map +0 -1
  477. package/packages/tools/lib/model/toolchain.js +0 -92
  478. package/packages/tools/lib/model/toolchain.js.map +0 -1
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
- <code>memo-tools 0.6.6</code> &middot; MIT &middot; SysML v2 &middot; ISO 14971 &middot; IEC 62304 &middot; ISO/IEC/IEEE 42010
12
+ <code>memo-tools 0.7.2</code> &middot; MIT &middot; SysML v2 &middot; ISO 14971 &middot; IEC 62304 &middot; ISO/IEC/IEEE 42010
13
13
  </p>
14
14
 
15
15
  <p align="center">
@@ -69,6 +69,10 @@ memo init my-device --template samd
69
69
  memo init gpca --example gpca
70
70
  memo ontology show
71
71
 
72
+ # Upgrade a pre-native project safely (reports only unless --write is supplied)
73
+ memo convert . --diff
74
+ memo convert . --write
75
+
72
76
  # Validate locally or in CI
73
77
  memo validate .
74
78
  memo validate . --format junit --output validation.xml
@@ -89,6 +93,30 @@ memo rules coverage
89
93
 
90
94
  Run `memo --help` or `memo <command> --help` for the complete command surface.
91
95
 
96
+ `memo convert` moves legacy project content beneath `model/catalog/`, rewrites
97
+ the corresponding packages/imports/artifact URIs, and creates the native project
98
+ binding entrypoint where needed. It plans before touching the filesystem, refuses
99
+ collisions, and is idempotent. Review its default dry-run output (or `--diff`)
100
+ before using `--write`; then run `memo validate` and your external SysML gate.
101
+
102
+ ### Jupyter analysis samples
103
+
104
+ Every `memo init` project includes `analysis/Samples/` with seven portable
105
+ Syside notebooks. They cover model overview and quality, architecture hotspots,
106
+ change-impact exploration, semantic charts, an ownership graph, and an HTML/CSV
107
+ inventory table. The notebooks discover either `model/` or `src/` automatically,
108
+ so the same samples work with default templates and worked examples.
109
+
110
+ Run them in a licensed Syside environment:
111
+
112
+ ```bash
113
+ python -m venv analysis/.venv
114
+ source analysis/.venv/bin/activate
115
+ python -m pip install jupyterlab syside
116
+ cd analysis
117
+ jupyter lab --port 8888
118
+ ```
119
+
92
120
  ## Documentation
93
121
 
94
122
  The [published documentation](https://memoarchitect.com/memo-tools/)
@@ -102,16 +130,18 @@ python3 -m pip install "mkdocs>=1.6" "mkdocs-material>=9.5" "pymdown-extensions>
102
130
  pnpm run docs:build
103
131
  ```
104
132
 
105
- ### Compiler and packager selection
133
+ ### Toolchain selection
106
134
 
107
- Projects may select external tools in `memo.package.yaml` or
108
- `memo.config.yaml`. Omit `toolchain` (or use `internal`) to preserve MEMO's
109
- built-in parser and KPAR writer.
135
+ Each toolchain role is filled by one provider: the **validator** answers "is
136
+ this valid SysML/KerML?", **lowering** answers "what can MEMO ingest from this
137
+ revision?", and the **packager** builds the archive. Omit `toolchain` entirely
138
+ to use MEMO's built-in parser and KPAR writer, which need nothing installed.
110
139
 
111
140
  ```yaml
112
141
  toolchain:
113
- compiler: syside # internal | syside
114
- packager: sysand # internal | sysand
142
+ validator: syside
143
+ lowering: internal
144
+ packager: sysand
115
145
  syside:
116
146
  executable: ~/.local/bin/syside
117
147
  configFile: ./syside.toml
@@ -123,11 +153,24 @@ toolchain:
123
153
  ```
124
154
 
125
155
  `memo validate` and `memo pack` run `syside check --diagnose all
126
- --warnings-as-errors` by default before MEMO's semantic validation, automatically
156
+ --warnings-as-errors` by default when it is the selected validator, automatically
127
157
  including the resolved ontology directories. Set `warningsAsErrors: false` or use
128
- `diagnose: none` to relax the check. `memo pack` delegates
129
- archive creation to SysAnd when selected. Relative executable and config paths
130
- resolve from the project directory; bare executable names resolve through `PATH`.
158
+ `diagnose: none` to relax the check. `memo pack` delegates archive creation to
159
+ SysAnd when selected. Relative executable and config paths resolve from the
160
+ project directory; bare executable names resolve through `PATH`. A selected tool
161
+ that is not installed is a clear error, never a silent fallback.
162
+
163
+ Every leaf under `toolchain` also has a generated flag, so a project can be run
164
+ against a different toolchain without editing its settings:
165
+
166
+ ```bash
167
+ memo toolchain probe # which provider, which binary, which version
168
+ memo config effective # settings + flags + defaults, fully resolved
169
+ memo validate --toolchain.validator syside
170
+ ```
171
+
172
+ `toolchain.compiler` is a deprecated alias kept for existing settings files; see
173
+ `docs/reference/configuration.md`.
131
174
 
132
175
  ### Core library usage
133
176
 
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@memoarchitect/tools",
3
- "version": "0.6.6",
4
- "description": "MEMO tools — SysML v2 parser, semantic model, validation, project operations, and CLI",
3
+ "version": "0.7.2",
4
+ "description": "MEMO tools \u2014 SysML v2 parser, semantic model, validation, project operations, and CLI",
5
5
  "type": "module",
6
6
  "main": "./packages/tools/lib/index.js",
7
7
  "types": "./packages/tools/lib/index.d.ts",
8
8
  "bin": {
9
- "memo": "packages/tools/lib/bin/memo.js"
9
+ "memo": "packages/tools/lib/bin/memo.js",
10
+ "memo-sysmlc": "packages/tools/lib/sysmlc/bin/memo-sysmlc.js"
10
11
  },
11
12
  "memo": {
12
13
  "contentPackage": "@memoarchitect/ontology"
@@ -27,10 +28,11 @@
27
28
  "./package.json": "./package.json"
28
29
  },
29
30
  "scripts": {
30
- "build": "cd packages/tools && langium generate && tsc",
31
+ "build": "pnpm generate:ir && cd packages/tools && langium generate && tsc",
32
+ "generate:ir": "node scripts/generate-sysml-ir.mjs",
31
33
  "prepack": "pnpm clean && pnpm build",
32
34
  "dev": "tsc -p packages/tools/tsconfig.json --watch",
33
- "test": "cd packages/tools && vitest run",
35
+ "test": "node scripts/check-config-boundary.mjs && cd packages/tools && vitest run",
34
36
  "test:coverage": "cd packages/tools && vitest run --coverage",
35
37
  "type-check": "tsc -p packages/tools/tsconfig.json --noEmit",
36
38
  "clean": "rm -rf packages/tools/lib packages/tools/src/language/generated",
@@ -41,10 +43,19 @@
41
43
  "version:sync": "node scripts/sync-version.mjs",
42
44
  "version:check": "node scripts/sync-version.mjs --check",
43
45
  "ontology:lint": "node tools/ontology-tools/lint.mjs",
44
- "ontology:compat": "node tools/ontology-tools/syside-compat.mjs"
46
+ "ontology:compat": "node tools/ontology-tools/syside-compat.mjs",
47
+ "check:boundary": "node scripts/check-config-boundary.mjs",
48
+ "check:budgets": "node scripts/runtime-budgets.mjs",
49
+ "check:baselines": "node scripts/verify-baseline.mjs",
50
+ "check:corpus": "node scripts/convert-corpus.mjs",
51
+ "check:conformance": "node scripts/check-conformance.mjs",
52
+ "check:metamodel": "node scripts/generate-sysml-ir.mjs --check",
53
+ "corpus:vendor": "node scripts/vendor-corpus.mjs",
54
+ "corpus:verify": "node scripts/vendor-corpus.mjs --verify",
55
+ "check:transport": "node scripts/measure-transport-latency.mjs"
45
56
  },
46
57
  "dependencies": {
47
- "@memoarchitect/ontology": "0.6.3",
58
+ "@memoarchitect/ontology": "0.7.0",
48
59
  "chalk": "^5.3.0",
49
60
  "chokidar": "^4.0.0",
50
61
  "commander": "^12.1.0",
@@ -53,6 +64,7 @@
53
64
  "open": "^10.1.0",
54
65
  "ora": "^8.1.0",
55
66
  "uuid": "^11.1.1",
67
+ "vscode-jsonrpc": "^8.2.0",
56
68
  "vscode-languageserver": "^9.0.1",
57
69
  "vscode-languageserver-textdocument": "^1.0.12",
58
70
  "ws": "^8.18.0",
@@ -0,0 +1,4 @@
1
+ /** Add model-independent Jupyter samples to a newly initialized project. */
2
+ export declare function scaffoldAnalysisSamples(projectDir: string): void;
3
+ export declare const analysisSampleNames: string[];
4
+ //# sourceMappingURL=analysis-starters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis-starters.d.ts","sourceRoot":"","sources":["../src/analysis-starters.ts"],"names":[],"mappings":"AAibA,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAShE;AAED,eAAO,MAAM,mBAAmB,UAA4C,CAAC"}
@@ -0,0 +1,425 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ const LOAD_MODEL = `from pathlib import Path
4
+ from collections import Counter, defaultdict
5
+ import syside
6
+
7
+ def find_sysml_root(start=Path.cwd()):
8
+ """Find the nearest model/ or src/ folder containing textual SysML."""
9
+ for directory in (start, *start.parents):
10
+ for folder_name in ('model', 'src'):
11
+ candidate = directory / folder_name
12
+ if candidate.is_dir() and next(candidate.rglob('*.sysml'), None):
13
+ return candidate
14
+ raise FileNotFoundError('No model/ or src/ directory containing .sysml files was found')
15
+
16
+ SYSML_ROOT = find_sysml_root()
17
+ SYSML_FILES = sorted(SYSML_ROOT.rglob('*.sysml'))
18
+ model, diagnostics = syside.try_load_model([str(path) for path in SYSML_FILES])
19
+ print(f'Loaded {len(SYSML_FILES)} SysML files from {SYSML_ROOT}')`;
20
+ const SAMPLES_README = `# MEMO analysis samples
21
+
22
+ These notebooks are created by \`memo init\` and are designed to work with any
23
+ MEMO textual SysML v2 project. They locate the nearest \`model/\` or \`src/\`
24
+ directory automatically and query it through the typed Syside API.
25
+
26
+ ## Prerequisites
27
+
28
+ Use Python 3.12 or newer with JupyterLab and Syside installed and licensed:
29
+
30
+ \`\`\`bash
31
+ python -m venv analysis/.venv
32
+ source analysis/.venv/bin/activate
33
+ python -m pip install jupyterlab syside
34
+ cd analysis
35
+ jupyter lab --port 8888
36
+ \`\`\`
37
+
38
+ Configure the Syside license using its supported keyring or environment setup.
39
+ MEMO Architect's **Analysis → Jupyter Notebooks** menu opens the local server at
40
+ \`http://127.0.0.1:8888\`.
41
+
42
+ ## Included notebooks
43
+
44
+ | Notebook | Purpose |
45
+ |---|---|
46
+ | \`01-model-overview.ipynb\` | Model size, semantic composition, and diagnostic summary. |
47
+ | \`02-architecture-hotspots.ipynb\` | Busy containers, deep ownership paths, and dominant types. |
48
+ | \`03-model-quality.ipynb\` | Diagnostics, unnamed elements, repeated names, and empty definitions. |
49
+ | \`04-change-impact-explorer.ipynb\` | Search an element and inspect its structural neighborhood. |
50
+ | \`05-model-charts.ipynb\` | Bar and donut charts rendered without extra plotting packages. |
51
+ | \`06-ownership-graph.ipynb\` | SVG network graph of model ownership relationships. |
52
+ | \`07-model-inventory-table.ipynb\` | Filterable inventory parameters, HTML table, and CSV export. |
53
+
54
+ The notebooks use \`syside.try_load_model()\`, so partial analysis remains
55
+ available while the project contains parser or semantic diagnostics. Review the
56
+ reported diagnostics before treating analysis results as release evidence.
57
+ `;
58
+ const STARTERS = [
59
+ {
60
+ filename: '01-model-overview.ipynb',
61
+ title: 'Model overview',
62
+ description: 'Visual summary of model size, semantic content, and diagnostics.',
63
+ codeCells: [
64
+ `from IPython.display import HTML, display
65
+
66
+ semantic_types = [
67
+ 'Package', 'PartDefinition', 'PartUsage', 'RequirementDefinition',
68
+ 'RequirementUsage', 'ActionDefinition', 'ActionUsage', 'PortDefinition',
69
+ 'PortUsage', 'ConnectionDefinition', 'ConnectionUsage', 'StateDefinition',
70
+ 'StateUsage', 'AttributeDefinition', 'AttributeUsage'
71
+ ]
72
+ counts = {}
73
+ for type_name in semantic_types:
74
+ node_type = getattr(syside, type_name, None)
75
+ if node_type is not None:
76
+ counts[type_name] = len(list(model.elements(node_type)))
77
+
78
+ largest = max(counts.values(), default=1)
79
+ rows = ''.join(
80
+ f'<tr><td>{name}</td><td>{count:,}</td><td><div style="background:#2d8d70;height:12px;width:{max(2, count * 320 / largest):.0f}px"></div></td></tr>'
81
+ for name, count in sorted(counts.items(), key=lambda item: item[1], reverse=True)
82
+ )
83
+ display(HTML(f'<h3>Semantic inventory</h3><table><tr><th>Element type</th><th>Count</th><th>Relative size</th></tr>{rows}</table>'))
84
+
85
+ {
86
+ 'SysML files': len(SYSML_FILES),
87
+ 'Errors': len(list(diagnostics.errors)),
88
+ 'Warnings': len(list(diagnostics.warnings)),
89
+ 'Information': len(list(diagnostics.infos)),
90
+ }`,
91
+ ],
92
+ },
93
+ {
94
+ filename: '02-architecture-hotspots.ipynb',
95
+ title: 'Architecture hotspots',
96
+ description: 'Find busy containers, deep ownership paths, and dominant semantic types.',
97
+ codeCells: [
98
+ `from IPython.display import display
99
+
100
+ semantic_elements = (
101
+ list(model.elements(syside.Usage, include_subtypes=True))
102
+ + list(model.elements(syside.Definition, include_subtypes=True))
103
+ )
104
+
105
+ def safe_name(element):
106
+ value = element.qualified_name or element.name or element.declared_name
107
+ return str(value) if value else '<unnamed>'
108
+
109
+ def ownership_depth(element):
110
+ depth, current, seen = 0, element.owner, set()
111
+ while current is not None and id(current) not in seen:
112
+ seen.add(id(current))
113
+ depth += 1
114
+ current = getattr(current, 'owner', None)
115
+ return depth
116
+
117
+ containers = []
118
+ for element in semantic_elements:
119
+ children = [child for child in element.owned_elements if isinstance(child, (syside.Usage, syside.Definition))]
120
+ if children:
121
+ containers.append((len(children), type(element).__name__, safe_name(element)))
122
+
123
+ print('Top containers by directly owned semantic elements')
124
+ display(sorted(containers, reverse=True)[:25])
125
+
126
+ print('Deepest ownership paths')
127
+ display(sorted(
128
+ ((ownership_depth(item), type(item).__name__, safe_name(item)) for item in semantic_elements),
129
+ reverse=True,
130
+ )[:25])
131
+
132
+ print('Most common semantic types')
133
+ Counter(type(item).__name__ for item in semantic_elements).most_common(30)`,
134
+ ],
135
+ },
136
+ {
137
+ filename: '03-model-quality.ipynb',
138
+ title: 'Model quality review',
139
+ description: 'Review diagnostics, unnamed elements, repeated names, and empty definitions.',
140
+ codeCells: [
141
+ `from IPython.display import display
142
+
143
+ usages = list(model.elements(syside.Usage, include_subtypes=True))
144
+ definitions = list(model.elements(syside.Definition, include_subtypes=True))
145
+ semantic_elements = usages + definitions
146
+
147
+ unnamed = [item for item in semantic_elements if not (item.name or item.declared_name)]
148
+ by_name = defaultdict(list)
149
+ for item in semantic_elements:
150
+ value = item.qualified_name or item.name or item.declared_name
151
+ name = str(value) if value else None
152
+ if name:
153
+ by_name[name].append(item)
154
+ duplicates = [(name, len(items), sorted({type(item).__name__ for item in items})) for name, items in by_name.items() if len(items) > 1]
155
+ empty_definitions = [
156
+ item for item in definitions
157
+ if not any(isinstance(child, (syside.Usage, syside.Definition)) for child in item.owned_elements)
158
+ ]
159
+
160
+ display({
161
+ 'parser/semantic errors': len(list(diagnostics.errors)),
162
+ 'warnings': len(list(diagnostics.warnings)),
163
+ 'unnamed usages or definitions': len(unnamed),
164
+ 'repeated qualified names': len(duplicates),
165
+ 'definitions with no owned usages/definitions': len(empty_definitions),
166
+ })
167
+
168
+ print('Repeated qualified names (first 30)')
169
+ display(sorted(duplicates, key=lambda item: item[1], reverse=True)[:30])
170
+
171
+ print('Empty definition candidates (first 30)')
172
+ [(type(item).__name__, item.qualified_name or item.name) for item in empty_definitions[:30]]`,
173
+ `print('First diagnostics to investigate')
174
+ for diagnostic in list(diagnostics.errors)[:20] + list(diagnostics.warnings)[:20]:
175
+ print(diagnostic)`,
176
+ ],
177
+ },
178
+ {
179
+ filename: '04-change-impact-explorer.ipynb',
180
+ title: 'Change-impact explorer',
181
+ description: 'Search any element and inspect its owner, children, and directly related elements.',
182
+ codeCells: [
183
+ `QUERY = '' # Example: 'pump', 'controller', 'safety', or a requirement name
184
+
185
+ semantic_elements = (
186
+ list(model.elements(syside.Usage, include_subtypes=True))
187
+ + list(model.elements(syside.Definition, include_subtypes=True))
188
+ )
189
+
190
+ def label(element):
191
+ value = element.qualified_name or element.name or element.declared_name
192
+ return str(value) if value else '<unnamed>'
193
+
194
+ if not QUERY:
195
+ print('Set QUERY to a name fragment. Suggestions:')
196
+ for suggestion in [label(item) for item in semantic_elements if item.name][:20]:
197
+ print(' -', suggestion)
198
+ matches = []
199
+ else:
200
+ matches = [item for item in semantic_elements if QUERY.casefold() in label(item).casefold()]
201
+ print(f'{len(matches)} match(es) for {QUERY!r}')
202
+
203
+ [(type(item).__name__, label(item)) for item in matches[:100]]`,
204
+ `def neighborhood(element):
205
+ owner = getattr(element, 'owner', None)
206
+ children = [child for child in element.owned_elements if isinstance(child, (syside.Usage, syside.Definition))]
207
+ related = []
208
+ for relationship in element.owned_relationships:
209
+ for candidate in relationship.related_elements:
210
+ if candidate is not element:
211
+ related.append(candidate)
212
+ return {
213
+ 'selected': (type(element).__name__, label(element)),
214
+ 'owner': None if owner is None else (type(owner).__name__, label(owner)),
215
+ 'children': [(type(child).__name__, label(child)) for child in children[:50]],
216
+ 'directly related': [(type(item).__name__, label(item)) for item in related[:50]],
217
+ }
218
+
219
+ [neighborhood(item) for item in matches[:10]]`,
220
+ ],
221
+ },
222
+ {
223
+ filename: '05-model-charts.ipynb',
224
+ title: 'Model charts',
225
+ description: 'Render semantic composition and diagnostic charts without external plotting packages.',
226
+ codeCells: [
227
+ `from html import escape
228
+ from IPython.display import HTML, display
229
+
230
+ type_names = [
231
+ 'PartUsage', 'RequirementUsage', 'ActionUsage', 'PortUsage',
232
+ 'ConnectionUsage', 'StateUsage', 'AttributeUsage', 'ItemUsage',
233
+ 'PartDefinition', 'RequirementDefinition', 'ActionDefinition', 'PortDefinition'
234
+ ]
235
+ counts = {}
236
+ for type_name in type_names:
237
+ node_type = getattr(syside, type_name, None)
238
+ if node_type is not None:
239
+ counts[type_name] = len(list(model.elements(node_type)))
240
+
241
+ palette = ['#2d8d70', '#3887c7', '#e58a2b', '#8357b6', '#cf5c62', '#4f9d9d']
242
+ largest = max(counts.values(), default=1)
243
+ bars = []
244
+ for index, (name, count) in enumerate(sorted(counts.items(), key=lambda item: item[1], reverse=True)):
245
+ width = max(1, count * 100 / largest)
246
+ color = palette[index % len(palette)]
247
+ bars.append(f'''<div style="display:grid;grid-template-columns:180px 1fr 70px;gap:12px;align-items:center;margin:7px 0">
248
+ <div>{escape(name)}</div><div style="background:#edf2f4;border-radius:6px;overflow:hidden"><div style="width:{width:.1f}%;height:20px;background:{color}"></div></div><strong>{count:,}</strong>
249
+ </div>''')
250
+
251
+ error_count = len(list(diagnostics.errors))
252
+ warning_count = len(list(diagnostics.warnings))
253
+ info_count = len(list(diagnostics.infos))
254
+ total_diagnostics = max(1, error_count + warning_count + info_count)
255
+ diagnostic_gradient = (
256
+ f'#cf5c62 0 {error_count / total_diagnostics * 100:.1f}%, '
257
+ f'#e5a52b {error_count / total_diagnostics * 100:.1f}% {(error_count + warning_count) / total_diagnostics * 100:.1f}%, '
258
+ f'#3887c7 {(error_count + warning_count) / total_diagnostics * 100:.1f}% 100%'
259
+ )
260
+
261
+ display(HTML(f'''<div style="font-family:system-ui;max-width:900px">
262
+ <h2>Semantic composition</h2>{''.join(bars)}
263
+ <h2 style="margin-top:28px">Diagnostics</h2>
264
+ <div style="display:flex;align-items:center;gap:24px">
265
+ <div style="width:150px;height:150px;border-radius:50%;background:conic-gradient({diagnostic_gradient});position:relative">
266
+ <div style="position:absolute;inset:28px;background:white;border-radius:50%;display:grid;place-items:center;font-size:24px;font-weight:700">{error_count + warning_count + info_count}</div>
267
+ </div>
268
+ <table><tr><th>Severity</th><th>Count</th></tr><tr><td>Errors</td><td>{error_count}</td></tr><tr><td>Warnings</td><td>{warning_count}</td></tr><tr><td>Information</td><td>{info_count}</td></tr></table>
269
+ </div>
270
+ </div>'''))`,
271
+ ],
272
+ },
273
+ {
274
+ filename: '06-ownership-graph.ipynb',
275
+ title: 'Ownership graph',
276
+ description: 'Draw an SVG network of model elements and their ownership relationships.',
277
+ codeCells: [
278
+ `from html import escape
279
+ from IPython.display import SVG, display
280
+
281
+ semantic_elements = (
282
+ list(model.elements(syside.Usage, include_subtypes=True))
283
+ + list(model.elements(syside.Definition, include_subtypes=True))
284
+ )
285
+
286
+ def node_name(element):
287
+ value = element.name or element.declared_name or element.qualified_name
288
+ return str(value) if value else '<unnamed>'
289
+
290
+ # Prefer named elements with semantic children, then fill with other named elements.
291
+ ranked = sorted(
292
+ (item for item in semantic_elements if item.name or item.declared_name),
293
+ key=lambda item: sum(isinstance(child, (syside.Usage, syside.Definition)) for child in item.owned_elements),
294
+ reverse=True,
295
+ )
296
+ selected = ranked[:60]
297
+ selected_ids = {id(item) for item in selected}
298
+
299
+ def depth(element):
300
+ value, current, seen = 0, element.owner, set()
301
+ while current is not None and id(current) not in seen:
302
+ seen.add(id(current)); value += 1; current = getattr(current, 'owner', None)
303
+ return value
304
+
305
+ columns = defaultdict(list)
306
+ for item in selected:
307
+ columns[depth(item)].append(item)
308
+ depths = sorted(columns)
309
+ positions = {}
310
+ for column_index, level in enumerate(depths):
311
+ for row_index, item in enumerate(columns[level]):
312
+ positions[id(item)] = (30 + column_index * 240, 30 + row_index * 58)
313
+
314
+ width = max(500, 260 * max(1, len(depths)))
315
+ height = max(240, 70 + 58 * max((len(items) for items in columns.values()), default=1))
316
+ edges = []
317
+ nodes = []
318
+ colors = {'PartUsage':'#dff4ee', 'RequirementUsage':'#e8eefb', 'ActionUsage':'#fff0dc', 'PortUsage':'#efe5fa'}
319
+ for item in selected:
320
+ x, y = positions[id(item)]
321
+ owner = getattr(item, 'owner', None)
322
+ if owner is not None and id(owner) in selected_ids:
323
+ ox, oy = positions[id(owner)]
324
+ edges.append(f'<path d="M {ox + 190} {oy + 20} C {ox + 215} {oy + 20}, {x - 25} {y + 20}, {x} {y + 20}" fill="none" stroke="#91a7b3" stroke-width="1.5"/>')
325
+ kind = type(item).__name__
326
+ fill = colors.get(kind, '#f4f6f7')
327
+ label = escape(node_name(item)[:27])
328
+ nodes.append(f'<g><rect x="{x}" y="{y}" width="190" height="40" rx="7" fill="{fill}" stroke="#547180"/><text x="{x + 9}" y="{y + 17}" font-size="11" font-weight="700">{label}</text><text x="{x + 9}" y="{y + 32}" font-size="9" fill="#587487">{kind}</text></g>')
329
+
330
+ svg = f'''<svg xmlns="http://www.w3.org/2000/svg" width="100%" viewBox="0 0 {width} {height}" style="background:#fbfcfc;border:1px solid #d9e3e8;border-radius:10px">{''.join(edges)}{''.join(nodes)}</svg>'''
331
+ display(SVG(svg))
332
+ print(f'Displayed {len(selected)} elements and {len(edges)} ownership edges')`,
333
+ ],
334
+ },
335
+ {
336
+ filename: '07-model-inventory-table.ipynb',
337
+ title: 'Model inventory table',
338
+ description: 'Filter a model-independent element table and export the current result to CSV.',
339
+ codeCells: [
340
+ `from html import escape
341
+ from IPython.display import HTML, display
342
+
343
+ KIND_FILTER = '' # Example: 'PartUsage' or 'Requirement'
344
+ NAME_FILTER = '' # Case-insensitive name fragment
345
+ ROW_LIMIT = 250
346
+
347
+ semantic_elements = (
348
+ list(model.elements(syside.Usage, include_subtypes=True))
349
+ + list(model.elements(syside.Definition, include_subtypes=True))
350
+ )
351
+
352
+ def text(value):
353
+ return str(value) if value else ''
354
+
355
+ records = []
356
+ for item in semantic_elements:
357
+ kind = type(item).__name__
358
+ name = text(item.name or item.declared_name)
359
+ qualified_name = text(item.qualified_name)
360
+ owner = getattr(item, 'owner', None)
361
+ owner_name = text(getattr(owner, 'qualified_name', None) or getattr(owner, 'name', None))
362
+ if KIND_FILTER and KIND_FILTER.casefold() not in kind.casefold():
363
+ continue
364
+ if NAME_FILTER and NAME_FILTER.casefold() not in (name + ' ' + qualified_name).casefold():
365
+ continue
366
+ records.append({'kind': kind, 'name': name, 'qualified_name': qualified_name, 'owner': owner_name})
367
+
368
+ records.sort(key=lambda row: (row['kind'], row['qualified_name'], row['name']))
369
+ visible = records[:ROW_LIMIT]
370
+ rows = ''.join(
371
+ '<tr>' + ''.join(f'<td>{escape(row[key])}</td>' for key in ('kind', 'name', 'qualified_name', 'owner')) + '</tr>'
372
+ for row in visible
373
+ )
374
+ display(HTML(f'''<p><strong>{len(records):,}</strong> matching elements; showing {len(visible):,}.</p>
375
+ <div style="max-height:620px;overflow:auto"><table style="font-size:12px"><thead style="position:sticky;top:0;background:white"><tr><th>Kind</th><th>Name</th><th>Qualified name</th><th>Owner</th></tr></thead><tbody>{rows}</tbody></table></div>'''))`,
376
+ `import csv
377
+
378
+ OUTPUT = Path('model-inventory.csv')
379
+ with OUTPUT.open('w', newline='', encoding='utf-8') as stream:
380
+ writer = csv.DictWriter(stream, fieldnames=['kind', 'name', 'qualified_name', 'owner'])
381
+ writer.writeheader()
382
+ writer.writerows(records)
383
+ print(f'Exported {len(records):,} rows to {OUTPUT.resolve()}')`,
384
+ ],
385
+ },
386
+ ];
387
+ function markdownCell(starter) {
388
+ return {
389
+ cell_type: 'markdown',
390
+ metadata: {},
391
+ source: [`# ${starter.title}\n\n${starter.description}\n\nThis sample uses only standard SysML v2 concepts and automatically discovers the project's \`model/\` or \`src/\` directory.`],
392
+ };
393
+ }
394
+ function codeCell(source) {
395
+ return { cell_type: 'code', metadata: {}, source: [source], execution_count: null, outputs: [] };
396
+ }
397
+ function notebook(starter) {
398
+ const cells = [markdownCell(starter), codeCell(LOAD_MODEL), ...starter.codeCells.map(codeCell)]
399
+ .map((cell, index) => ({ ...cell, id: `memo-${index + 1}` }));
400
+ return {
401
+ cells,
402
+ metadata: {
403
+ kernelspec: { display_name: 'Python 3 (ipykernel)', language: 'python', name: 'python3' },
404
+ language_info: { name: 'python', version: '3' },
405
+ memo: { starter: true, description: starter.description },
406
+ },
407
+ nbformat: 4,
408
+ nbformat_minor: 5,
409
+ };
410
+ }
411
+ /** Add model-independent Jupyter samples to a newly initialized project. */
412
+ export function scaffoldAnalysisSamples(projectDir) {
413
+ const samplesDir = resolve(projectDir, 'analysis', 'Samples');
414
+ mkdirSync(samplesDir, { recursive: true });
415
+ const readmePath = resolve(samplesDir, 'README.md');
416
+ if (!existsSync(readmePath))
417
+ writeFileSync(readmePath, SAMPLES_README);
418
+ for (const starter of STARTERS) {
419
+ const path = resolve(samplesDir, starter.filename);
420
+ if (!existsSync(path))
421
+ writeFileSync(path, JSON.stringify(notebook(starter), null, 2) + '\n');
422
+ }
423
+ }
424
+ export const analysisSampleNames = STARTERS.map(starter => starter.filename);
425
+ //# sourceMappingURL=analysis-starters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis-starters.js","sourceRoot":"","sources":["../src/analysis-starters.ts"],"names":[],"mappings":"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"}