@memoarchitect/tools 0.13.2 → 0.15.1

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 (825) hide show
  1. package/README.md +40 -26
  2. package/corpus/README.md +20 -36
  3. package/package.json +9 -10
  4. package/packages/tools/lib/analysis/impact.d.ts +30 -0
  5. package/packages/tools/lib/analysis/impact.d.ts.map +1 -1
  6. package/packages/tools/lib/analysis/impact.js +47 -74
  7. package/packages/tools/lib/analysis/impact.js.map +1 -1
  8. package/packages/tools/lib/analysis/interfaces-between.d.ts +36 -0
  9. package/packages/tools/lib/analysis/interfaces-between.d.ts.map +1 -0
  10. package/packages/tools/lib/analysis/interfaces-between.js +66 -0
  11. package/packages/tools/lib/analysis/interfaces-between.js.map +1 -0
  12. package/packages/tools/lib/analysis/suspect-links.d.ts +45 -0
  13. package/packages/tools/lib/analysis/suspect-links.d.ts.map +1 -0
  14. package/packages/tools/lib/analysis/suspect-links.js +66 -0
  15. package/packages/tools/lib/analysis/suspect-links.js.map +1 -0
  16. package/packages/tools/lib/analysis-starters.d.ts +2 -0
  17. package/packages/tools/lib/analysis-starters.d.ts.map +1 -1
  18. package/packages/tools/lib/analysis-starters.js +73 -68
  19. package/packages/tools/lib/analysis-starters.js.map +1 -1
  20. package/packages/tools/lib/authoring/outline-identity.d.ts +34 -0
  21. package/packages/tools/lib/authoring/outline-identity.d.ts.map +1 -0
  22. package/packages/tools/lib/authoring/outline-identity.js +95 -0
  23. package/packages/tools/lib/authoring/outline-identity.js.map +1 -0
  24. package/packages/tools/lib/authoring/outline-source.d.ts +57 -0
  25. package/packages/tools/lib/authoring/outline-source.d.ts.map +1 -0
  26. package/packages/tools/lib/authoring/outline-source.js +203 -0
  27. package/packages/tools/lib/authoring/outline-source.js.map +1 -0
  28. package/packages/tools/lib/authoring/source-outline.d.ts +82 -0
  29. package/packages/tools/lib/authoring/source-outline.d.ts.map +1 -0
  30. package/packages/tools/lib/authoring/source-outline.js +267 -0
  31. package/packages/tools/lib/authoring/source-outline.js.map +1 -0
  32. package/packages/tools/lib/bin/memo.js +181 -632
  33. package/packages/tools/lib/bin/memo.js.map +1 -1
  34. package/packages/tools/lib/browser/index.d.ts +12 -0
  35. package/packages/tools/lib/browser/index.d.ts.map +1 -1
  36. package/packages/tools/lib/browser/index.js +8 -0
  37. package/packages/tools/lib/browser/index.js.map +1 -1
  38. package/packages/tools/lib/cli/project-commands.d.ts +3 -0
  39. package/packages/tools/lib/cli/project-commands.d.ts.map +1 -0
  40. package/packages/tools/lib/cli/project-commands.js +577 -0
  41. package/packages/tools/lib/cli/project-commands.js.map +1 -0
  42. package/packages/tools/lib/commands/ask.d.ts.map +1 -1
  43. package/packages/tools/lib/commands/ask.js +10 -18
  44. package/packages/tools/lib/commands/ask.js.map +1 -1
  45. package/packages/tools/lib/commands/compile.d.ts +18 -0
  46. package/packages/tools/lib/commands/compile.d.ts.map +1 -0
  47. package/packages/tools/lib/commands/compile.js +122 -0
  48. package/packages/tools/lib/commands/compile.js.map +1 -0
  49. package/packages/tools/lib/commands/convert.js +2 -2
  50. package/packages/tools/lib/commands/convert.js.map +1 -1
  51. package/packages/tools/lib/commands/create-package.js +4 -4
  52. package/packages/tools/lib/commands/create-package.js.map +1 -1
  53. package/packages/tools/lib/commands/dev.d.ts +20 -2
  54. package/packages/tools/lib/commands/dev.d.ts.map +1 -1
  55. package/packages/tools/lib/commands/dev.js +386 -97
  56. package/packages/tools/lib/commands/dev.js.map +1 -1
  57. package/packages/tools/lib/commands/dhf-draft.d.ts.map +1 -1
  58. package/packages/tools/lib/commands/dhf-draft.js +7 -16
  59. package/packages/tools/lib/commands/dhf-draft.js.map +1 -1
  60. package/packages/tools/lib/commands/dhf-init.js +3 -3
  61. package/packages/tools/lib/commands/dhf-init.js.map +1 -1
  62. package/packages/tools/lib/commands/dhf-lint.d.ts.map +1 -1
  63. package/packages/tools/lib/commands/dhf-lint.js +4 -3
  64. package/packages/tools/lib/commands/dhf-lint.js.map +1 -1
  65. package/packages/tools/lib/commands/dhf-preview.d.ts.map +1 -1
  66. package/packages/tools/lib/commands/dhf-preview.js +5 -26
  67. package/packages/tools/lib/commands/dhf-preview.js.map +1 -1
  68. package/packages/tools/lib/commands/dhf.d.ts +4 -0
  69. package/packages/tools/lib/commands/dhf.d.ts.map +1 -1
  70. package/packages/tools/lib/commands/dhf.js +77 -31
  71. package/packages/tools/lib/commands/dhf.js.map +1 -1
  72. package/packages/tools/lib/commands/element.d.ts.map +1 -1
  73. package/packages/tools/lib/commands/element.js +44 -6
  74. package/packages/tools/lib/commands/element.js.map +1 -1
  75. package/packages/tools/lib/commands/export.d.ts +1 -1
  76. package/packages/tools/lib/commands/export.d.ts.map +1 -1
  77. package/packages/tools/lib/commands/export.js +25 -18
  78. package/packages/tools/lib/commands/export.js.map +1 -1
  79. package/packages/tools/lib/commands/generate.d.ts.map +1 -1
  80. package/packages/tools/lib/commands/generate.js +10 -30
  81. package/packages/tools/lib/commands/generate.js.map +1 -1
  82. package/packages/tools/lib/commands/ids-rebase.d.ts +15 -0
  83. package/packages/tools/lib/commands/ids-rebase.d.ts.map +1 -0
  84. package/packages/tools/lib/commands/ids-rebase.js +133 -0
  85. package/packages/tools/lib/commands/ids-rebase.js.map +1 -0
  86. package/packages/tools/lib/commands/import-ea.d.ts +3 -3
  87. package/packages/tools/lib/commands/import-ea.d.ts.map +1 -1
  88. package/packages/tools/lib/commands/import-ea.js +12 -9
  89. package/packages/tools/lib/commands/import-ea.js.map +1 -1
  90. package/packages/tools/lib/commands/import-owl.d.ts +1 -1
  91. package/packages/tools/lib/commands/import-owl.js +2 -2
  92. package/packages/tools/lib/commands/import-owl.js.map +1 -1
  93. package/packages/tools/lib/commands/import-sysand.d.ts +1 -1
  94. package/packages/tools/lib/commands/import-sysand.d.ts.map +1 -1
  95. package/packages/tools/lib/commands/import-sysand.js +15 -6
  96. package/packages/tools/lib/commands/import-sysand.js.map +1 -1
  97. package/packages/tools/lib/commands/import.d.ts +13 -0
  98. package/packages/tools/lib/commands/import.d.ts.map +1 -1
  99. package/packages/tools/lib/commands/import.js +89 -29
  100. package/packages/tools/lib/commands/import.js.map +1 -1
  101. package/packages/tools/lib/commands/init.d.ts +0 -8
  102. package/packages/tools/lib/commands/init.d.ts.map +1 -1
  103. package/packages/tools/lib/commands/init.js +56 -51
  104. package/packages/tools/lib/commands/init.js.map +1 -1
  105. package/packages/tools/lib/commands/inspect.d.ts.map +1 -1
  106. package/packages/tools/lib/commands/inspect.js +22 -15
  107. package/packages/tools/lib/commands/inspect.js.map +1 -1
  108. package/packages/tools/lib/commands/install.d.ts.map +1 -1
  109. package/packages/tools/lib/commands/install.js +9 -6
  110. package/packages/tools/lib/commands/install.js.map +1 -1
  111. package/packages/tools/lib/commands/interfaces.d.ts +8 -0
  112. package/packages/tools/lib/commands/interfaces.d.ts.map +1 -0
  113. package/packages/tools/lib/commands/interfaces.js +71 -0
  114. package/packages/tools/lib/commands/interfaces.js.map +1 -0
  115. package/packages/tools/lib/commands/lock.d.ts.map +1 -1
  116. package/packages/tools/lib/commands/lock.js +13 -6
  117. package/packages/tools/lib/commands/lock.js.map +1 -1
  118. package/packages/tools/lib/commands/mcp.js +7 -7
  119. package/packages/tools/lib/commands/mcp.js.map +1 -1
  120. package/packages/tools/lib/commands/migrate-layout.d.ts +5 -0
  121. package/packages/tools/lib/commands/migrate-layout.d.ts.map +1 -0
  122. package/packages/tools/lib/commands/migrate-layout.js +90 -0
  123. package/packages/tools/lib/commands/migrate-layout.js.map +1 -0
  124. package/packages/tools/lib/commands/ontology.d.ts.map +1 -1
  125. package/packages/tools/lib/commands/ontology.js +26 -22
  126. package/packages/tools/lib/commands/ontology.js.map +1 -1
  127. package/packages/tools/lib/commands/pack.d.ts.map +1 -1
  128. package/packages/tools/lib/commands/pack.js +14 -9
  129. package/packages/tools/lib/commands/pack.js.map +1 -1
  130. package/packages/tools/lib/commands/pinned-target.d.ts +12 -0
  131. package/packages/tools/lib/commands/pinned-target.d.ts.map +1 -0
  132. package/packages/tools/lib/commands/pinned-target.js +74 -0
  133. package/packages/tools/lib/commands/pinned-target.js.map +1 -0
  134. package/packages/tools/lib/commands/plugin.d.ts.map +1 -1
  135. package/packages/tools/lib/commands/plugin.js +13 -22
  136. package/packages/tools/lib/commands/plugin.js.map +1 -1
  137. package/packages/tools/lib/commands/prune.d.ts +5 -0
  138. package/packages/tools/lib/commands/prune.d.ts.map +1 -0
  139. package/packages/tools/lib/commands/prune.js +27 -0
  140. package/packages/tools/lib/commands/prune.js.map +1 -0
  141. package/packages/tools/lib/commands/retired.d.ts +10 -0
  142. package/packages/tools/lib/commands/retired.d.ts.map +1 -0
  143. package/packages/tools/lib/commands/retired.js +35 -0
  144. package/packages/tools/lib/commands/retired.js.map +1 -0
  145. package/packages/tools/lib/commands/rules.d.ts +49 -5
  146. package/packages/tools/lib/commands/rules.d.ts.map +1 -1
  147. package/packages/tools/lib/commands/rules.js +340 -172
  148. package/packages/tools/lib/commands/rules.js.map +1 -1
  149. package/packages/tools/lib/commands/ship-library.d.ts +4 -0
  150. package/packages/tools/lib/commands/ship-library.d.ts.map +1 -0
  151. package/packages/tools/lib/commands/ship-library.js +45 -0
  152. package/packages/tools/lib/commands/ship-library.js.map +1 -0
  153. package/packages/tools/lib/commands/standards.d.ts +2 -2
  154. package/packages/tools/lib/commands/standards.d.ts.map +1 -1
  155. package/packages/tools/lib/commands/standards.js +78 -33
  156. package/packages/tools/lib/commands/standards.js.map +1 -1
  157. package/packages/tools/lib/commands/sysand-publish.d.ts +16 -1
  158. package/packages/tools/lib/commands/sysand-publish.d.ts.map +1 -1
  159. package/packages/tools/lib/commands/sysand-publish.js +75 -193
  160. package/packages/tools/lib/commands/sysand-publish.js.map +1 -1
  161. package/packages/tools/lib/commands/toolchain.d.ts +5 -0
  162. package/packages/tools/lib/commands/toolchain.d.ts.map +1 -1
  163. package/packages/tools/lib/commands/toolchain.js +50 -1
  164. package/packages/tools/lib/commands/toolchain.js.map +1 -1
  165. package/packages/tools/lib/commands/validate-client.d.ts +11 -0
  166. package/packages/tools/lib/commands/validate-client.d.ts.map +1 -0
  167. package/packages/tools/lib/commands/validate-client.js +54 -0
  168. package/packages/tools/lib/commands/validate-client.js.map +1 -0
  169. package/packages/tools/lib/commands/validate.d.ts +33 -2
  170. package/packages/tools/lib/commands/validate.d.ts.map +1 -1
  171. package/packages/tools/lib/commands/validate.js +432 -186
  172. package/packages/tools/lib/commands/validate.js.map +1 -1
  173. package/packages/tools/lib/dhf/device-dhf.d.ts +57 -0
  174. package/packages/tools/lib/dhf/device-dhf.d.ts.map +1 -0
  175. package/packages/tools/lib/dhf/device-dhf.js +152 -0
  176. package/packages/tools/lib/dhf/device-dhf.js.map +1 -0
  177. package/packages/tools/lib/dhf/dhf-config-v2.d.ts +1 -1
  178. package/packages/tools/lib/dhf/dhf-config-v2.d.ts.map +1 -1
  179. package/packages/tools/lib/dhf/query-engine.d.ts +9 -2
  180. package/packages/tools/lib/dhf/query-engine.d.ts.map +1 -1
  181. package/packages/tools/lib/dhf/query-engine.js +29 -25
  182. package/packages/tools/lib/dhf/query-engine.js.map +1 -1
  183. package/packages/tools/lib/dhf/query-executor.d.ts +1 -1
  184. package/packages/tools/lib/dhf/query-executor.js +1 -1
  185. package/packages/tools/lib/dhf/query-executor.js.map +1 -1
  186. package/packages/tools/lib/dhf/standards-block.js +1 -1
  187. package/packages/tools/lib/dhf/standards-block.js.map +1 -1
  188. package/packages/tools/lib/dhf/standards-library.d.ts.map +1 -1
  189. package/packages/tools/lib/dhf/standards-library.js +16 -9
  190. package/packages/tools/lib/dhf/standards-library.js.map +1 -1
  191. package/packages/tools/lib/dhf/standards-report.d.ts +11 -3
  192. package/packages/tools/lib/dhf/standards-report.d.ts.map +1 -1
  193. package/packages/tools/lib/dhf/standards-report.js +43 -13
  194. package/packages/tools/lib/dhf/standards-report.js.map +1 -1
  195. package/packages/tools/lib/dhf/template-engine.d.ts +2 -0
  196. package/packages/tools/lib/dhf/template-engine.d.ts.map +1 -1
  197. package/packages/tools/lib/dhf/template-engine.js +5 -5
  198. package/packages/tools/lib/dhf/template-engine.js.map +1 -1
  199. package/packages/tools/lib/import/import-diff.d.ts +31 -1
  200. package/packages/tools/lib/import/import-diff.d.ts.map +1 -1
  201. package/packages/tools/lib/import/import-diff.js +91 -19
  202. package/packages/tools/lib/import/import-diff.js.map +1 -1
  203. package/packages/tools/lib/import/import-sources.d.ts +21 -0
  204. package/packages/tools/lib/import/import-sources.d.ts.map +1 -0
  205. package/packages/tools/lib/import/import-sources.js +36 -0
  206. package/packages/tools/lib/import/import-sources.js.map +1 -0
  207. package/packages/tools/lib/import/reqif.d.ts +23 -0
  208. package/packages/tools/lib/import/reqif.d.ts.map +1 -0
  209. package/packages/tools/lib/import/reqif.js +151 -0
  210. package/packages/tools/lib/import/reqif.js.map +1 -0
  211. package/packages/tools/lib/import/source-import.d.ts +128 -0
  212. package/packages/tools/lib/import/source-import.d.ts.map +1 -0
  213. package/packages/tools/lib/import/source-import.js +305 -0
  214. package/packages/tools/lib/import/source-import.js.map +1 -0
  215. package/packages/tools/lib/importer/cameo-importer.d.ts.map +1 -1
  216. package/packages/tools/lib/importer/cameo-importer.js +4 -1
  217. package/packages/tools/lib/importer/cameo-importer.js.map +1 -1
  218. package/packages/tools/lib/importer/ea-importer.d.ts.map +1 -1
  219. package/packages/tools/lib/importer/ea-importer.js +4 -1
  220. package/packages/tools/lib/importer/ea-importer.js.map +1 -1
  221. package/packages/tools/lib/importer/sysand-importer.d.ts +2 -1
  222. package/packages/tools/lib/importer/sysand-importer.d.ts.map +1 -1
  223. package/packages/tools/lib/importer/sysand-importer.js +27 -10
  224. package/packages/tools/lib/importer/sysand-importer.js.map +1 -1
  225. package/packages/tools/lib/index.d.ts +20 -6
  226. package/packages/tools/lib/index.d.ts.map +1 -1
  227. package/packages/tools/lib/index.js +22 -8
  228. package/packages/tools/lib/index.js.map +1 -1
  229. package/packages/tools/lib/llm/draft-engine.js +1 -1
  230. package/packages/tools/lib/llm/draft-engine.js.map +1 -1
  231. package/packages/tools/lib/llm/model-context.js +1 -1
  232. package/packages/tools/lib/llm/model-context.js.map +1 -1
  233. package/packages/tools/lib/lock.d.ts +37 -2
  234. package/packages/tools/lib/lock.d.ts.map +1 -1
  235. package/packages/tools/lib/lock.js +93 -8
  236. package/packages/tools/lib/lock.js.map +1 -1
  237. package/packages/tools/lib/mcp/index.js +1 -1
  238. package/packages/tools/lib/mcp/index.js.map +1 -1
  239. package/packages/tools/lib/mcp/model-loader.d.ts.map +1 -1
  240. package/packages/tools/lib/mcp/model-loader.js +6 -18
  241. package/packages/tools/lib/mcp/model-loader.js.map +1 -1
  242. package/packages/tools/lib/mcp/server.js +2 -2
  243. package/packages/tools/lib/mcp/server.js.map +1 -1
  244. package/packages/tools/lib/mcp/tools.d.ts.map +1 -1
  245. package/packages/tools/lib/mcp/tools.js +5 -4
  246. package/packages/tools/lib/mcp/tools.js.map +1 -1
  247. package/packages/tools/lib/methodology/guide-service.d.ts +28 -0
  248. package/packages/tools/lib/methodology/guide-service.d.ts.map +1 -0
  249. package/packages/tools/lib/methodology/guide-service.js +32 -0
  250. package/packages/tools/lib/methodology/guide-service.js.map +1 -0
  251. package/packages/tools/lib/methodology/guide.d.ts +56 -0
  252. package/packages/tools/lib/methodology/guide.d.ts.map +1 -0
  253. package/packages/tools/lib/methodology/guide.js +80 -0
  254. package/packages/tools/lib/methodology/guide.js.map +1 -0
  255. package/packages/tools/lib/model/census-projects.d.ts +26 -0
  256. package/packages/tools/lib/model/census-projects.d.ts.map +1 -0
  257. package/packages/tools/lib/model/census-projects.js +53 -0
  258. package/packages/tools/lib/model/census-projects.js.map +1 -0
  259. package/packages/tools/lib/model/census.d.ts +103 -0
  260. package/packages/tools/lib/model/census.d.ts.map +1 -0
  261. package/packages/tools/lib/model/census.js +229 -0
  262. package/packages/tools/lib/model/census.js.map +1 -0
  263. package/packages/tools/lib/model/complete-model.d.ts +52 -0
  264. package/packages/tools/lib/model/complete-model.d.ts.map +1 -0
  265. package/packages/tools/lib/model/complete-model.js +333 -0
  266. package/packages/tools/lib/model/complete-model.js.map +1 -0
  267. package/packages/tools/lib/model/config-loader.d.ts +8 -3
  268. package/packages/tools/lib/model/config-loader.d.ts.map +1 -1
  269. package/packages/tools/lib/model/config-loader.js +37 -6
  270. package/packages/tools/lib/model/config-loader.js.map +1 -1
  271. package/packages/tools/lib/model/config.d.ts +21 -7
  272. package/packages/tools/lib/model/config.d.ts.map +1 -1
  273. package/packages/tools/lib/model/effective-scope.d.ts +55 -28
  274. package/packages/tools/lib/model/effective-scope.d.ts.map +1 -1
  275. package/packages/tools/lib/model/effective-scope.js +96 -35
  276. package/packages/tools/lib/model/effective-scope.js.map +1 -1
  277. package/packages/tools/lib/model/element-index.d.ts +207 -0
  278. package/packages/tools/lib/model/element-index.d.ts.map +1 -0
  279. package/packages/tools/lib/model/element-index.js +316 -0
  280. package/packages/tools/lib/model/element-index.js.map +1 -0
  281. package/packages/tools/lib/model/id-rebase.d.ts +35 -0
  282. package/packages/tools/lib/model/id-rebase.d.ts.map +1 -0
  283. package/packages/tools/lib/model/id-rebase.js +199 -0
  284. package/packages/tools/lib/model/id-rebase.js.map +1 -0
  285. package/packages/tools/lib/model/identity-registry.d.ts +34 -3
  286. package/packages/tools/lib/model/identity-registry.d.ts.map +1 -1
  287. package/packages/tools/lib/model/identity-registry.js +40 -7
  288. package/packages/tools/lib/model/identity-registry.js.map +1 -1
  289. package/packages/tools/lib/model/impact.d.ts +75 -0
  290. package/packages/tools/lib/model/impact.d.ts.map +1 -0
  291. package/packages/tools/lib/model/impact.js +167 -0
  292. package/packages/tools/lib/model/impact.js.map +1 -0
  293. package/packages/tools/lib/model/ir-identity.d.ts +3 -51
  294. package/packages/tools/lib/model/ir-identity.d.ts.map +1 -1
  295. package/packages/tools/lib/model/ir-identity.js +14 -121
  296. package/packages/tools/lib/model/ir-identity.js.map +1 -1
  297. package/packages/tools/lib/model/kind-registry.d.ts +66 -22
  298. package/packages/tools/lib/model/kind-registry.d.ts.map +1 -1
  299. package/packages/tools/lib/model/kind-registry.js +104 -145
  300. package/packages/tools/lib/model/kind-registry.js.map +1 -1
  301. package/packages/tools/lib/model/manifest.d.ts +2 -2
  302. package/packages/tools/lib/model/manifest.d.ts.map +1 -1
  303. package/packages/tools/lib/model/manifest.js +5 -4
  304. package/packages/tools/lib/model/manifest.js.map +1 -1
  305. package/packages/tools/lib/model/methodology-loader.d.ts +11 -2
  306. package/packages/tools/lib/model/methodology-loader.d.ts.map +1 -1
  307. package/packages/tools/lib/model/methodology-loader.js +24 -130
  308. package/packages/tools/lib/model/methodology-loader.js.map +1 -1
  309. package/packages/tools/lib/model/methodology-resolver.d.ts +71 -6
  310. package/packages/tools/lib/model/methodology-resolver.d.ts.map +1 -1
  311. package/packages/tools/lib/model/methodology-resolver.js +210 -24
  312. package/packages/tools/lib/model/methodology-resolver.js.map +1 -1
  313. package/packages/tools/lib/model/model-diff.d.ts +73 -0
  314. package/packages/tools/lib/model/model-diff.d.ts.map +1 -0
  315. package/packages/tools/lib/model/model-diff.js +91 -0
  316. package/packages/tools/lib/model/model-diff.js.map +1 -0
  317. package/packages/tools/lib/model/narrow-model.d.ts +9 -0
  318. package/packages/tools/lib/model/narrow-model.d.ts.map +1 -0
  319. package/packages/tools/lib/model/narrow-model.js +54 -0
  320. package/packages/tools/lib/model/narrow-model.js.map +1 -0
  321. package/packages/tools/lib/model/native-project.d.ts +92 -11
  322. package/packages/tools/lib/model/native-project.d.ts.map +1 -1
  323. package/packages/tools/lib/model/native-project.js +163 -269
  324. package/packages/tools/lib/model/native-project.js.map +1 -1
  325. package/packages/tools/lib/model/ontology-loader.d.ts +10 -61
  326. package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -1
  327. package/packages/tools/lib/model/ontology-loader.js +11 -512
  328. package/packages/tools/lib/model/ontology-loader.js.map +1 -1
  329. package/packages/tools/lib/model/package-manifest.d.ts +8 -2
  330. package/packages/tools/lib/model/package-manifest.d.ts.map +1 -1
  331. package/packages/tools/lib/model/package-manifest.js +14 -2
  332. package/packages/tools/lib/model/package-manifest.js.map +1 -1
  333. package/packages/tools/lib/model/pinned.d.ts +216 -0
  334. package/packages/tools/lib/model/pinned.d.ts.map +1 -0
  335. package/packages/tools/lib/model/pinned.js +481 -0
  336. package/packages/tools/lib/model/pinned.js.map +1 -0
  337. package/packages/tools/lib/model/project-conversion.d.ts +3 -2
  338. package/packages/tools/lib/model/project-conversion.d.ts.map +1 -1
  339. package/packages/tools/lib/model/project-conversion.js +55 -10
  340. package/packages/tools/lib/model/project-conversion.js.map +1 -1
  341. package/packages/tools/lib/model/project-settings.d.ts +10 -0
  342. package/packages/tools/lib/model/project-settings.d.ts.map +1 -0
  343. package/packages/tools/lib/model/project-settings.js +48 -0
  344. package/packages/tools/lib/model/project-settings.js.map +1 -0
  345. package/packages/tools/lib/model/relation-selection.d.ts +25 -0
  346. package/packages/tools/lib/model/relation-selection.d.ts.map +1 -0
  347. package/packages/tools/lib/model/relation-selection.js +65 -0
  348. package/packages/tools/lib/model/relation-selection.js.map +1 -0
  349. package/packages/tools/lib/model/relationship-legality.d.ts +6 -0
  350. package/packages/tools/lib/model/relationship-legality.d.ts.map +1 -1
  351. package/packages/tools/lib/model/relationship-legality.js.map +1 -1
  352. package/packages/tools/lib/model/relationship-registry.d.ts +21 -8
  353. package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -1
  354. package/packages/tools/lib/model/relationship-registry.js +77 -129
  355. package/packages/tools/lib/model/relationship-registry.js.map +1 -1
  356. package/packages/tools/lib/model/relationship-subjects.d.ts +28 -0
  357. package/packages/tools/lib/model/relationship-subjects.d.ts.map +1 -0
  358. package/packages/tools/lib/model/relationship-subjects.js +126 -0
  359. package/packages/tools/lib/model/relationship-subjects.js.map +1 -0
  360. package/packages/tools/lib/model/release-target.d.ts +12 -0
  361. package/packages/tools/lib/model/release-target.d.ts.map +1 -0
  362. package/packages/tools/lib/model/release-target.js +35 -0
  363. package/packages/tools/lib/model/release-target.js.map +1 -0
  364. package/packages/tools/lib/model/selector-vocabulary.d.ts +47 -0
  365. package/packages/tools/lib/model/selector-vocabulary.d.ts.map +1 -0
  366. package/packages/tools/lib/model/selector-vocabulary.js +181 -0
  367. package/packages/tools/lib/model/selector-vocabulary.js.map +1 -0
  368. package/packages/tools/lib/model/semantic.d.ts +99 -7
  369. package/packages/tools/lib/model/semantic.d.ts.map +1 -1
  370. package/packages/tools/lib/model/semantic.js +13 -1
  371. package/packages/tools/lib/model/semantic.js.map +1 -1
  372. package/packages/tools/lib/model/settings-boundary.d.ts.map +1 -1
  373. package/packages/tools/lib/model/settings-boundary.js +9 -8
  374. package/packages/tools/lib/model/settings-boundary.js.map +1 -1
  375. package/packages/tools/lib/model/short-id.d.ts +2 -0
  376. package/packages/tools/lib/model/short-id.d.ts.map +1 -1
  377. package/packages/tools/lib/model/short-id.js +9 -0
  378. package/packages/tools/lib/model/short-id.js.map +1 -1
  379. package/packages/tools/lib/model/source-graph.d.ts +9 -7
  380. package/packages/tools/lib/model/source-graph.d.ts.map +1 -1
  381. package/packages/tools/lib/model/source-graph.js +19 -24
  382. package/packages/tools/lib/model/source-graph.js.map +1 -1
  383. package/packages/tools/lib/model/source-provenance.d.ts +5 -1
  384. package/packages/tools/lib/model/source-provenance.d.ts.map +1 -1
  385. package/packages/tools/lib/model/source-provenance.js.map +1 -1
  386. package/packages/tools/lib/model/sysml-files.js +1 -1
  387. package/packages/tools/lib/model/sysml-ir.d.ts +2 -5
  388. package/packages/tools/lib/model/sysml-ir.d.ts.map +1 -1
  389. package/packages/tools/lib/model/sysml-ir.js +1 -100
  390. package/packages/tools/lib/model/sysml-ir.js.map +1 -1
  391. package/packages/tools/lib/model/toolchain-merge.d.ts +4 -0
  392. package/packages/tools/lib/model/toolchain-merge.d.ts.map +1 -0
  393. package/packages/tools/lib/model/toolchain-merge.js +34 -0
  394. package/packages/tools/lib/model/toolchain-merge.js.map +1 -0
  395. package/packages/tools/lib/model/user-settings.d.ts +13 -0
  396. package/packages/tools/lib/model/user-settings.d.ts.map +1 -0
  397. package/packages/tools/lib/model/user-settings.js +83 -0
  398. package/packages/tools/lib/model/user-settings.js.map +1 -0
  399. package/packages/tools/lib/model/variability.d.ts +56 -0
  400. package/packages/tools/lib/model/variability.d.ts.map +1 -0
  401. package/packages/tools/lib/model/variability.js +116 -0
  402. package/packages/tools/lib/model/variability.js.map +1 -0
  403. package/packages/tools/lib/model/version-range.d.ts +2 -0
  404. package/packages/tools/lib/model/version-range.d.ts.map +1 -0
  405. package/packages/tools/lib/model/version-range.js +37 -0
  406. package/packages/tools/lib/model/version-range.js.map +1 -0
  407. package/packages/tools/lib/model/view-deriver.d.ts +16 -0
  408. package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
  409. package/packages/tools/lib/model/view-deriver.js +100 -26
  410. package/packages/tools/lib/model/view-deriver.js.map +1 -1
  411. package/packages/tools/lib/model/view-layout-block.d.ts +81 -0
  412. package/packages/tools/lib/model/view-layout-block.d.ts.map +1 -0
  413. package/packages/tools/lib/model/view-layout-block.js +525 -0
  414. package/packages/tools/lib/model/view-layout-block.js.map +1 -0
  415. package/packages/tools/lib/model/view-layout-migration.d.ts +54 -0
  416. package/packages/tools/lib/model/view-layout-migration.d.ts.map +1 -0
  417. package/packages/tools/lib/model/view-layout-migration.js +156 -0
  418. package/packages/tools/lib/model/view-layout-migration.js.map +1 -0
  419. package/packages/tools/lib/model/workspace-membership.d.ts +99 -0
  420. package/packages/tools/lib/model/workspace-membership.d.ts.map +1 -0
  421. package/packages/tools/lib/model/workspace-membership.js +281 -0
  422. package/packages/tools/lib/model/workspace-membership.js.map +1 -0
  423. package/packages/tools/lib/ontology/owl-exporter.d.ts +1 -1
  424. package/packages/tools/lib/ontology/owl-exporter.d.ts.map +1 -1
  425. package/packages/tools/lib/ontology/owl-exporter.js +1 -1
  426. package/packages/tools/lib/ontology/owl-exporter.js.map +1 -1
  427. package/packages/tools/lib/operations/ai-authoring.d.ts.map +1 -1
  428. package/packages/tools/lib/operations/ai-authoring.js +7 -5
  429. package/packages/tools/lib/operations/ai-authoring.js.map +1 -1
  430. package/packages/tools/lib/operations/authoring.d.ts +10 -4
  431. package/packages/tools/lib/operations/authoring.d.ts.map +1 -1
  432. package/packages/tools/lib/operations/authoring.js +27 -11
  433. package/packages/tools/lib/operations/authoring.js.map +1 -1
  434. package/packages/tools/lib/operations/index.d.ts +2 -0
  435. package/packages/tools/lib/operations/index.d.ts.map +1 -1
  436. package/packages/tools/lib/operations/index.js +1 -0
  437. package/packages/tools/lib/operations/index.js.map +1 -1
  438. package/packages/tools/lib/operations/project-snapshot.d.ts.map +1 -1
  439. package/packages/tools/lib/operations/project-snapshot.js +7 -13
  440. package/packages/tools/lib/operations/project-snapshot.js.map +1 -1
  441. package/packages/tools/lib/plugin/plugin-scaffold.js +2 -2
  442. package/packages/tools/lib/plugin/plugin-scaffold.js.map +1 -1
  443. package/packages/tools/lib/protocol/messages.d.ts +375 -7
  444. package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
  445. package/packages/tools/lib/serializer/csv-io.d.ts +37 -29
  446. package/packages/tools/lib/serializer/csv-io.d.ts.map +1 -1
  447. package/packages/tools/lib/serializer/csv-io.js +64 -31
  448. package/packages/tools/lib/serializer/csv-io.js.map +1 -1
  449. package/packages/tools/lib/serializer/sysml-generator.d.ts +15 -2
  450. package/packages/tools/lib/serializer/sysml-generator.d.ts.map +1 -1
  451. package/packages/tools/lib/serializer/sysml-generator.js +45 -17
  452. package/packages/tools/lib/serializer/sysml-generator.js.map +1 -1
  453. package/packages/tools/lib/server/conflict-policy.js +1 -1
  454. package/packages/tools/lib/server/conflict-policy.js.map +1 -1
  455. package/packages/tools/lib/server/dashboard-store.d.ts +1 -7
  456. package/packages/tools/lib/server/dashboard-store.d.ts.map +1 -1
  457. package/packages/tools/lib/server/dashboard-store.js +3 -14
  458. package/packages/tools/lib/server/dashboard-store.js.map +1 -1
  459. package/packages/tools/lib/server/dev-server.d.ts +48 -1
  460. package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
  461. package/packages/tools/lib/server/dev-server.js +529 -80
  462. package/packages/tools/lib/server/dev-server.js.map +1 -1
  463. package/packages/tools/lib/server/dev-validate.d.ts +30 -0
  464. package/packages/tools/lib/server/dev-validate.d.ts.map +1 -0
  465. package/packages/tools/lib/server/dev-validate.js +82 -0
  466. package/packages/tools/lib/server/dev-validate.js.map +1 -0
  467. package/packages/tools/lib/server/element-writer.d.ts +4 -1
  468. package/packages/tools/lib/server/element-writer.d.ts.map +1 -1
  469. package/packages/tools/lib/server/element-writer.js +56 -35
  470. package/packages/tools/lib/server/element-writer.js.map +1 -1
  471. package/packages/tools/lib/server/mutation-domain.d.ts +10 -0
  472. package/packages/tools/lib/server/mutation-domain.d.ts.map +1 -1
  473. package/packages/tools/lib/server/mutation-domain.js +45 -8
  474. package/packages/tools/lib/server/mutation-domain.js.map +1 -1
  475. package/packages/tools/lib/server/package-source.d.ts +13 -3
  476. package/packages/tools/lib/server/package-source.d.ts.map +1 -1
  477. package/packages/tools/lib/server/package-source.js +31 -39
  478. package/packages/tools/lib/server/package-source.js.map +1 -1
  479. package/packages/tools/lib/server/package-writer.d.ts +19 -6
  480. package/packages/tools/lib/server/package-writer.d.ts.map +1 -1
  481. package/packages/tools/lib/server/package-writer.js +90 -39
  482. package/packages/tools/lib/server/package-writer.js.map +1 -1
  483. package/packages/tools/lib/server/persistor.d.ts +33 -7
  484. package/packages/tools/lib/server/persistor.d.ts.map +1 -1
  485. package/packages/tools/lib/server/persistor.js +63 -48
  486. package/packages/tools/lib/server/persistor.js.map +1 -1
  487. package/packages/tools/lib/server/project-gitignore.d.ts +9 -0
  488. package/packages/tools/lib/server/project-gitignore.d.ts.map +1 -0
  489. package/packages/tools/lib/server/project-gitignore.js +27 -0
  490. package/packages/tools/lib/server/project-gitignore.js.map +1 -0
  491. package/packages/tools/lib/server/relationship-writer.d.ts +31 -2
  492. package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -1
  493. package/packages/tools/lib/server/relationship-writer.js +255 -95
  494. package/packages/tools/lib/server/relationship-writer.js.map +1 -1
  495. package/packages/tools/lib/server/release-writer.d.ts +46 -0
  496. package/packages/tools/lib/server/release-writer.d.ts.map +1 -0
  497. package/packages/tools/lib/server/release-writer.js +133 -0
  498. package/packages/tools/lib/server/release-writer.js.map +1 -0
  499. package/packages/tools/lib/server/rule-policy-writer.d.ts +17 -4
  500. package/packages/tools/lib/server/rule-policy-writer.d.ts.map +1 -1
  501. package/packages/tools/lib/server/rule-policy-writer.js +92 -7
  502. package/packages/tools/lib/server/rule-policy-writer.js.map +1 -1
  503. package/packages/tools/lib/server/rule-service.d.ts +50 -0
  504. package/packages/tools/lib/server/rule-service.d.ts.map +1 -0
  505. package/packages/tools/lib/server/rule-service.js +89 -0
  506. package/packages/tools/lib/server/rule-service.js.map +1 -0
  507. package/packages/tools/lib/server/rule-writer.d.ts +87 -0
  508. package/packages/tools/lib/server/rule-writer.d.ts.map +1 -0
  509. package/packages/tools/lib/server/rule-writer.js +165 -0
  510. package/packages/tools/lib/server/rule-writer.js.map +1 -0
  511. package/packages/tools/lib/server/suspect-review.d.ts +11 -0
  512. package/packages/tools/lib/server/suspect-review.d.ts.map +1 -0
  513. package/packages/tools/lib/server/suspect-review.js +28 -0
  514. package/packages/tools/lib/server/suspect-review.js.map +1 -0
  515. package/packages/tools/lib/server/sysml-notation.d.ts +1 -1
  516. package/packages/tools/lib/server/sysml-notation.d.ts.map +1 -1
  517. package/packages/tools/lib/server/sysml-notation.js +5 -0
  518. package/packages/tools/lib/server/sysml-notation.js.map +1 -1
  519. package/packages/tools/lib/server/user-preferences.d.ts +8 -0
  520. package/packages/tools/lib/server/user-preferences.d.ts.map +1 -0
  521. package/packages/tools/lib/server/user-preferences.js +47 -0
  522. package/packages/tools/lib/server/user-preferences.js.map +1 -0
  523. package/packages/tools/lib/server/version-servers.d.ts +60 -0
  524. package/packages/tools/lib/server/version-servers.d.ts.map +1 -0
  525. package/packages/tools/lib/server/version-servers.js +106 -0
  526. package/packages/tools/lib/server/version-servers.js.map +1 -0
  527. package/packages/tools/lib/server/view-layout-store.d.ts +28 -13
  528. package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -1
  529. package/packages/tools/lib/server/view-layout-store.js +106 -106
  530. package/packages/tools/lib/server/view-layout-store.js.map +1 -1
  531. package/packages/tools/lib/server/view-writer.d.ts +22 -2
  532. package/packages/tools/lib/server/view-writer.d.ts.map +1 -1
  533. package/packages/tools/lib/server/view-writer.js +99 -44
  534. package/packages/tools/lib/server/view-writer.js.map +1 -1
  535. package/packages/tools/lib/server/write-guard.d.ts +7 -0
  536. package/packages/tools/lib/server/write-guard.d.ts.map +1 -0
  537. package/packages/tools/lib/server/write-guard.js +77 -0
  538. package/packages/tools/lib/server/write-guard.js.map +1 -0
  539. package/packages/tools/lib/stage2/api-model.d.ts +160 -0
  540. package/packages/tools/lib/stage2/api-model.d.ts.map +1 -0
  541. package/packages/tools/lib/stage2/api-model.js +341 -0
  542. package/packages/tools/lib/stage2/api-model.js.map +1 -0
  543. package/packages/tools/lib/stage2/build-from-api.d.ts +47 -0
  544. package/packages/tools/lib/stage2/build-from-api.d.ts.map +1 -0
  545. package/packages/tools/lib/stage2/build-from-api.js +1462 -0
  546. package/packages/tools/lib/stage2/build-from-api.js.map +1 -0
  547. package/packages/tools/lib/stage2/guide-from-api.d.ts +38 -0
  548. package/packages/tools/lib/stage2/guide-from-api.d.ts.map +1 -0
  549. package/packages/tools/lib/stage2/guide-from-api.js +97 -0
  550. package/packages/tools/lib/stage2/guide-from-api.js.map +1 -0
  551. package/packages/tools/lib/stage2/handoff-files.d.ts +13 -0
  552. package/packages/tools/lib/stage2/handoff-files.d.ts.map +1 -0
  553. package/packages/tools/lib/stage2/handoff-files.js +32 -0
  554. package/packages/tools/lib/stage2/handoff-files.js.map +1 -0
  555. package/packages/tools/lib/stage2/methodology-from-api.d.ts +10 -0
  556. package/packages/tools/lib/stage2/methodology-from-api.d.ts.map +1 -0
  557. package/packages/tools/lib/stage2/methodology-from-api.js +109 -0
  558. package/packages/tools/lib/stage2/methodology-from-api.js.map +1 -0
  559. package/packages/tools/lib/stage2/package-metadata-from-api.d.ts +15 -0
  560. package/packages/tools/lib/stage2/package-metadata-from-api.d.ts.map +1 -0
  561. package/packages/tools/lib/stage2/package-metadata-from-api.js +238 -0
  562. package/packages/tools/lib/stage2/package-metadata-from-api.js.map +1 -0
  563. package/packages/tools/lib/stage2/project-from-api.d.ts +60 -0
  564. package/packages/tools/lib/stage2/project-from-api.d.ts.map +1 -0
  565. package/packages/tools/lib/stage2/project-from-api.js +328 -0
  566. package/packages/tools/lib/stage2/project-from-api.js.map +1 -0
  567. package/packages/tools/lib/stage2/registries-from-api.d.ts +68 -0
  568. package/packages/tools/lib/stage2/registries-from-api.d.ts.map +1 -0
  569. package/packages/tools/lib/stage2/registries-from-api.js +313 -0
  570. package/packages/tools/lib/stage2/registries-from-api.js.map +1 -0
  571. package/packages/tools/lib/stage2/stage2-from-handoff.d.ts +26 -0
  572. package/packages/tools/lib/stage2/stage2-from-handoff.d.ts.map +1 -0
  573. package/packages/tools/lib/stage2/stage2-from-handoff.js +34 -0
  574. package/packages/tools/lib/stage2/stage2-from-handoff.js.map +1 -0
  575. package/packages/tools/lib/stage2/sysml-names.d.ts +9 -0
  576. package/packages/tools/lib/stage2/sysml-names.d.ts.map +1 -0
  577. package/packages/tools/lib/stage2/sysml-names.js +39 -0
  578. package/packages/tools/lib/stage2/sysml-names.js.map +1 -0
  579. package/packages/tools/lib/toolchain/default-registry.d.ts +2 -2
  580. package/packages/tools/lib/toolchain/default-registry.d.ts.map +1 -1
  581. package/packages/tools/lib/toolchain/default-registry.js +9 -5
  582. package/packages/tools/lib/toolchain/default-registry.js.map +1 -1
  583. package/packages/tools/lib/toolchain/diagnostic.d.ts +2 -2
  584. package/packages/tools/lib/toolchain/diagnostic.js +1 -1
  585. package/packages/tools/lib/toolchain/diagnostic.js.map +1 -1
  586. package/packages/tools/lib/toolchain/effective.d.ts +25 -17
  587. package/packages/tools/lib/toolchain/effective.d.ts.map +1 -1
  588. package/packages/tools/lib/toolchain/effective.js +45 -40
  589. package/packages/tools/lib/toolchain/effective.js.map +1 -1
  590. package/packages/tools/lib/toolchain/exceptions.d.ts +27 -0
  591. package/packages/tools/lib/toolchain/exceptions.d.ts.map +1 -0
  592. package/packages/tools/lib/toolchain/exceptions.js +77 -0
  593. package/packages/tools/lib/toolchain/exceptions.js.map +1 -0
  594. package/packages/tools/lib/toolchain/index.d.ts +2 -2
  595. package/packages/tools/lib/toolchain/index.d.ts.map +1 -1
  596. package/packages/tools/lib/toolchain/index.js +2 -2
  597. package/packages/tools/lib/toolchain/index.js.map +1 -1
  598. package/packages/tools/lib/toolchain/operations.d.ts +45 -10
  599. package/packages/tools/lib/toolchain/operations.d.ts.map +1 -1
  600. package/packages/tools/lib/toolchain/operations.js +107 -8
  601. package/packages/tools/lib/toolchain/operations.js.map +1 -1
  602. package/packages/tools/lib/toolchain/ownership.d.ts +13 -0
  603. package/packages/tools/lib/toolchain/ownership.d.ts.map +1 -0
  604. package/packages/tools/lib/toolchain/ownership.js +57 -0
  605. package/packages/tools/lib/toolchain/ownership.js.map +1 -0
  606. package/packages/tools/lib/toolchain/process.d.ts +2 -2
  607. package/packages/tools/lib/toolchain/process.js +2 -2
  608. package/packages/tools/lib/toolchain/project-config.d.ts +4 -0
  609. package/packages/tools/lib/toolchain/project-config.d.ts.map +1 -0
  610. package/packages/tools/lib/toolchain/project-config.js +13 -0
  611. package/packages/tools/lib/toolchain/project-config.js.map +1 -0
  612. package/packages/tools/lib/toolchain/project-model.d.ts +75 -0
  613. package/packages/tools/lib/toolchain/project-model.d.ts.map +1 -0
  614. package/packages/tools/lib/toolchain/project-model.js +92 -0
  615. package/packages/tools/lib/toolchain/project-model.js.map +1 -0
  616. package/packages/tools/lib/toolchain/providers/internal-package.d.ts +6 -0
  617. package/packages/tools/lib/toolchain/providers/internal-package.d.ts.map +1 -0
  618. package/packages/tools/lib/toolchain/providers/internal-package.js +47 -0
  619. package/packages/tools/lib/toolchain/providers/internal-package.js.map +1 -0
  620. package/packages/tools/lib/toolchain/providers/opensysml-check.d.ts +20 -0
  621. package/packages/tools/lib/toolchain/providers/opensysml-check.d.ts.map +1 -0
  622. package/packages/tools/lib/toolchain/providers/opensysml-check.js +95 -0
  623. package/packages/tools/lib/toolchain/providers/opensysml-check.js.map +1 -0
  624. package/packages/tools/lib/toolchain/providers/opensysml-compact.d.ts +17 -0
  625. package/packages/tools/lib/toolchain/providers/opensysml-compact.d.ts.map +1 -0
  626. package/packages/tools/lib/toolchain/providers/opensysml-compact.js +69 -0
  627. package/packages/tools/lib/toolchain/providers/opensysml-compact.js.map +1 -0
  628. package/packages/tools/lib/toolchain/providers/opensysml-lowering.d.ts +50 -0
  629. package/packages/tools/lib/toolchain/providers/opensysml-lowering.d.ts.map +1 -0
  630. package/packages/tools/lib/toolchain/providers/opensysml-lowering.js +646 -0
  631. package/packages/tools/lib/toolchain/providers/opensysml-lowering.js.map +1 -0
  632. package/packages/tools/lib/toolchain/providers/opensysml-names.d.ts +16 -0
  633. package/packages/tools/lib/toolchain/providers/opensysml-names.d.ts.map +1 -0
  634. package/packages/tools/lib/toolchain/providers/opensysml-names.js +37 -0
  635. package/packages/tools/lib/toolchain/providers/opensysml-names.js.map +1 -0
  636. package/packages/tools/lib/toolchain/providers/opensysml.d.ts +88 -0
  637. package/packages/tools/lib/toolchain/providers/opensysml.d.ts.map +1 -0
  638. package/packages/tools/lib/toolchain/providers/opensysml.js +178 -0
  639. package/packages/tools/lib/toolchain/providers/opensysml.js.map +1 -0
  640. package/packages/tools/lib/toolchain/providers/recommended.d.ts +2 -0
  641. package/packages/tools/lib/toolchain/providers/recommended.d.ts.map +1 -0
  642. package/packages/tools/lib/toolchain/providers/recommended.js +13 -0
  643. package/packages/tools/lib/toolchain/providers/recommended.js.map +1 -0
  644. package/packages/tools/lib/toolchain/providers/sysand-project.d.ts +60 -0
  645. package/packages/tools/lib/toolchain/providers/sysand-project.d.ts.map +1 -0
  646. package/packages/tools/lib/toolchain/providers/sysand-project.js +160 -0
  647. package/packages/tools/lib/toolchain/providers/sysand-project.js.map +1 -0
  648. package/packages/tools/lib/toolchain/providers/sysand.d.ts.map +1 -1
  649. package/packages/tools/lib/toolchain/providers/sysand.js +26 -2
  650. package/packages/tools/lib/toolchain/providers/sysand.js.map +1 -1
  651. package/packages/tools/lib/toolchain/providers/syside-lowering.d.ts +29 -0
  652. package/packages/tools/lib/toolchain/providers/syside-lowering.d.ts.map +1 -0
  653. package/packages/tools/lib/toolchain/providers/syside-lowering.js +497 -0
  654. package/packages/tools/lib/toolchain/providers/syside-lowering.js.map +1 -0
  655. package/packages/tools/lib/toolchain/providers/syside-python.d.ts +9 -0
  656. package/packages/tools/lib/toolchain/providers/syside-python.d.ts.map +1 -0
  657. package/packages/tools/lib/toolchain/providers/syside-python.js +69 -0
  658. package/packages/tools/lib/toolchain/providers/syside-python.js.map +1 -0
  659. package/packages/tools/lib/toolchain/providers/syside.d.ts.map +1 -1
  660. package/packages/tools/lib/toolchain/providers/syside.js +2 -0
  661. package/packages/tools/lib/toolchain/providers/syside.js.map +1 -1
  662. package/packages/tools/lib/toolchain/registry.d.ts +118 -21
  663. package/packages/tools/lib/toolchain/registry.d.ts.map +1 -1
  664. package/packages/tools/lib/toolchain/registry.js +18 -24
  665. package/packages/tools/lib/toolchain/registry.js.map +1 -1
  666. package/packages/tools/lib/toolchain/schema.d.ts +6 -5
  667. package/packages/tools/lib/toolchain/schema.d.ts.map +1 -1
  668. package/packages/tools/lib/toolchain/schema.js +8 -13
  669. package/packages/tools/lib/toolchain/schema.js.map +1 -1
  670. package/packages/tools/lib/toolchain/shipped-library.d.ts +28 -0
  671. package/packages/tools/lib/toolchain/shipped-library.d.ts.map +1 -0
  672. package/packages/tools/lib/toolchain/shipped-library.js +120 -0
  673. package/packages/tools/lib/toolchain/shipped-library.js.map +1 -0
  674. package/packages/tools/lib/toolchain/source-fingerprint.d.ts +2 -0
  675. package/packages/tools/lib/toolchain/source-fingerprint.d.ts.map +1 -0
  676. package/packages/tools/lib/toolchain/source-fingerprint.js +30 -0
  677. package/packages/tools/lib/toolchain/source-fingerprint.js.map +1 -0
  678. package/packages/tools/lib/toolchain/user-settings-status.d.ts +51 -0
  679. package/packages/tools/lib/toolchain/user-settings-status.d.ts.map +1 -0
  680. package/packages/tools/lib/toolchain/user-settings-status.js +104 -0
  681. package/packages/tools/lib/toolchain/user-settings-status.js.map +1 -0
  682. package/packages/tools/lib/validator/architecture-validator.d.ts.map +1 -1
  683. package/packages/tools/lib/validator/architecture-validator.js +2 -1
  684. package/packages/tools/lib/validator/architecture-validator.js.map +1 -1
  685. package/packages/tools/lib/validator/behavior-validator.js +1 -1
  686. package/packages/tools/lib/validator/behavior-validator.js.map +1 -1
  687. package/packages/tools/lib/validator/builtin-rules.js +1 -1
  688. package/packages/tools/lib/validator/builtin-rules.js.map +1 -1
  689. package/packages/tools/lib/validator/constraint-eval.d.ts +30 -4
  690. package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -1
  691. package/packages/tools/lib/validator/constraint-eval.js +101 -59
  692. package/packages/tools/lib/validator/constraint-eval.js.map +1 -1
  693. package/packages/tools/lib/validator/constraint-loader-api.d.ts +22 -0
  694. package/packages/tools/lib/validator/constraint-loader-api.d.ts.map +1 -0
  695. package/packages/tools/lib/validator/constraint-loader-api.js +160 -0
  696. package/packages/tools/lib/validator/constraint-loader-api.js.map +1 -0
  697. package/packages/tools/lib/validator/constraint-loader.d.ts +22 -18
  698. package/packages/tools/lib/validator/constraint-loader.d.ts.map +1 -1
  699. package/packages/tools/lib/validator/constraint-loader.js +33 -141
  700. package/packages/tools/lib/validator/constraint-loader.js.map +1 -1
  701. package/packages/tools/lib/validator/rule-clauses.d.ts +51 -0
  702. package/packages/tools/lib/validator/rule-clauses.d.ts.map +1 -0
  703. package/packages/tools/lib/validator/rule-clauses.js +87 -0
  704. package/packages/tools/lib/validator/rule-clauses.js.map +1 -0
  705. package/packages/tools/lib/validator/rule-engine.d.ts +9 -1
  706. package/packages/tools/lib/validator/rule-engine.d.ts.map +1 -1
  707. package/packages/tools/lib/validator/rule-engine.js +50 -6
  708. package/packages/tools/lib/validator/rule-engine.js.map +1 -1
  709. package/packages/tools/lib/validator/rule-registry.d.ts +4 -8
  710. package/packages/tools/lib/validator/rule-registry.d.ts.map +1 -1
  711. package/packages/tools/lib/validator/rule-registry.js +42 -79
  712. package/packages/tools/lib/validator/rule-registry.js.map +1 -1
  713. package/packages/tools/lib/validator/rule-tailoring.d.ts +62 -0
  714. package/packages/tools/lib/validator/rule-tailoring.d.ts.map +1 -0
  715. package/packages/tools/lib/validator/rule-tailoring.js +85 -0
  716. package/packages/tools/lib/validator/rule-tailoring.js.map +1 -0
  717. package/packages/tools/lib/validator/types.d.ts +12 -1
  718. package/packages/tools/lib/validator/types.d.ts.map +1 -1
  719. package/packages/tools/lib/validator/workspace-boundary-validator.d.ts +9 -0
  720. package/packages/tools/lib/validator/workspace-boundary-validator.d.ts.map +1 -0
  721. package/packages/tools/lib/validator/workspace-boundary-validator.js +28 -0
  722. package/packages/tools/lib/validator/workspace-boundary-validator.js.map +1 -0
  723. package/packages/tools/python/memo_model.py +243 -0
  724. package/packages/tools/python/memo_stage1_syside.py +389 -0
  725. package/packages/tools/lib/commands/check.d.ts +0 -6
  726. package/packages/tools/lib/commands/check.d.ts.map +0 -1
  727. package/packages/tools/lib/commands/check.js +0 -191
  728. package/packages/tools/lib/commands/check.js.map +0 -1
  729. package/packages/tools/lib/commands/conformance.d.ts +0 -36
  730. package/packages/tools/lib/commands/conformance.d.ts.map +0 -1
  731. package/packages/tools/lib/commands/conformance.js +0 -212
  732. package/packages/tools/lib/commands/conformance.js.map +0 -1
  733. package/packages/tools/lib/commands/roundtrip.d.ts +0 -6
  734. package/packages/tools/lib/commands/roundtrip.d.ts.map +0 -1
  735. package/packages/tools/lib/commands/roundtrip.js +0 -145
  736. package/packages/tools/lib/commands/roundtrip.js.map +0 -1
  737. package/packages/tools/lib/conformance/baseline.d.ts +0 -26
  738. package/packages/tools/lib/conformance/baseline.d.ts.map +0 -1
  739. package/packages/tools/lib/conformance/baseline.js +0 -170
  740. package/packages/tools/lib/conformance/baseline.js.map +0 -1
  741. package/packages/tools/lib/conformance/bnf.d.ts +0 -84
  742. package/packages/tools/lib/conformance/bnf.d.ts.map +0 -1
  743. package/packages/tools/lib/conformance/bnf.js +0 -166
  744. package/packages/tools/lib/conformance/bnf.js.map +0 -1
  745. package/packages/tools/lib/conformance/corpus.d.ts +0 -125
  746. package/packages/tools/lib/conformance/corpus.d.ts.map +0 -1
  747. package/packages/tools/lib/conformance/corpus.js +0 -190
  748. package/packages/tools/lib/conformance/corpus.js.map +0 -1
  749. package/packages/tools/lib/conformance/diff-xmi.d.ts +0 -118
  750. package/packages/tools/lib/conformance/diff-xmi.d.ts.map +0 -1
  751. package/packages/tools/lib/conformance/diff-xmi.js +0 -276
  752. package/packages/tools/lib/conformance/diff-xmi.js.map +0 -1
  753. package/packages/tools/lib/conformance/generated/syside-rules.d.ts +0 -10
  754. package/packages/tools/lib/conformance/generated/syside-rules.d.ts.map +0 -1
  755. package/packages/tools/lib/conformance/generated/syside-rules.js +0 -1142
  756. package/packages/tools/lib/conformance/generated/syside-rules.js.map +0 -1
  757. package/packages/tools/lib/conformance/index.d.ts +0 -7
  758. package/packages/tools/lib/conformance/index.d.ts.map +0 -1
  759. package/packages/tools/lib/conformance/index.js +0 -19
  760. package/packages/tools/lib/conformance/index.js.map +0 -1
  761. package/packages/tools/lib/conformance/run.d.ts +0 -117
  762. package/packages/tools/lib/conformance/run.d.ts.map +0 -1
  763. package/packages/tools/lib/conformance/run.js +0 -0
  764. package/packages/tools/lib/conformance/run.js.map +0 -1
  765. package/packages/tools/lib/conformance/xmi.d.ts +0 -45
  766. package/packages/tools/lib/conformance/xmi.d.ts.map +0 -1
  767. package/packages/tools/lib/conformance/xmi.js +0 -148
  768. package/packages/tools/lib/conformance/xmi.js.map +0 -1
  769. package/packages/tools/lib/language/generated/ast.d.ts +0 -3571
  770. package/packages/tools/lib/language/generated/ast.d.ts.map +0 -1
  771. package/packages/tools/lib/language/generated/ast.js +0 -2980
  772. package/packages/tools/lib/language/generated/ast.js.map +0 -1
  773. package/packages/tools/lib/language/generated/grammar.d.ts +0 -7
  774. package/packages/tools/lib/language/generated/grammar.d.ts.map +0 -1
  775. package/packages/tools/lib/language/generated/grammar.js +0 -10687
  776. package/packages/tools/lib/language/generated/grammar.js.map +0 -1
  777. package/packages/tools/lib/language/generated/module.d.ts +0 -14
  778. package/packages/tools/lib/language/generated/module.d.ts.map +0 -1
  779. package/packages/tools/lib/language/generated/module.js +0 -21
  780. package/packages/tools/lib/language/generated/module.js.map +0 -1
  781. package/packages/tools/lib/language/memo-sysml-module.d.ts +0 -24
  782. package/packages/tools/lib/language/memo-sysml-module.d.ts.map +0 -1
  783. package/packages/tools/lib/language/memo-sysml-module.js +0 -20
  784. package/packages/tools/lib/language/memo-sysml-module.js.map +0 -1
  785. package/packages/tools/lib/model/builder.d.ts +0 -27
  786. package/packages/tools/lib/model/builder.d.ts.map +0 -1
  787. package/packages/tools/lib/model/builder.js +0 -2112
  788. package/packages/tools/lib/model/builder.js.map +0 -1
  789. package/packages/tools/lib/model/package-registry.d.ts +0 -64
  790. package/packages/tools/lib/model/package-registry.d.ts.map +0 -1
  791. package/packages/tools/lib/model/package-registry.js +0 -184
  792. package/packages/tools/lib/model/package-registry.js.map +0 -1
  793. package/packages/tools/lib/model/parser-utils.d.ts +0 -65
  794. package/packages/tools/lib/model/parser-utils.d.ts.map +0 -1
  795. package/packages/tools/lib/model/parser-utils.js +0 -201
  796. package/packages/tools/lib/model/parser-utils.js.map +0 -1
  797. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts +0 -3
  798. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.d.ts.map +0 -1
  799. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js +0 -97
  800. package/packages/tools/lib/sysmlc/bin/memo-sysmlc.js.map +0 -1
  801. package/packages/tools/lib/sysmlc/index.d.ts +0 -2
  802. package/packages/tools/lib/sysmlc/index.d.ts.map +0 -1
  803. package/packages/tools/lib/sysmlc/index.js +0 -7
  804. package/packages/tools/lib/sysmlc/index.js.map +0 -1
  805. package/packages/tools/lib/sysmlc/server.d.ts +0 -29
  806. package/packages/tools/lib/sysmlc/server.d.ts.map +0 -1
  807. package/packages/tools/lib/sysmlc/server.js +0 -168
  808. package/packages/tools/lib/sysmlc/server.js.map +0 -1
  809. package/packages/tools/lib/toolchain/lowering.d.ts +0 -63
  810. package/packages/tools/lib/toolchain/lowering.d.ts.map +0 -1
  811. package/packages/tools/lib/toolchain/lowering.js +0 -100
  812. package/packages/tools/lib/toolchain/lowering.js.map +0 -1
  813. package/packages/tools/lib/toolchain/providers/internal.d.ts +0 -33
  814. package/packages/tools/lib/toolchain/providers/internal.d.ts.map +0 -1
  815. package/packages/tools/lib/toolchain/providers/internal.js +0 -286
  816. package/packages/tools/lib/toolchain/providers/internal.js.map +0 -1
  817. package/packages/tools/lib/toolchain/sysmlc-client.d.ts +0 -77
  818. package/packages/tools/lib/toolchain/sysmlc-client.d.ts.map +0 -1
  819. package/packages/tools/lib/toolchain/sysmlc-client.js +0 -0
  820. package/packages/tools/lib/toolchain/sysmlc-client.js.map +0 -1
  821. package/packages/tools/lib/validator/sysml-constraints.d.ts +0 -64
  822. package/packages/tools/lib/validator/sysml-constraints.d.ts.map +0 -1
  823. package/packages/tools/lib/validator/sysml-constraints.js +0 -251
  824. package/packages/tools/lib/validator/sysml-constraints.js.map +0 -1
  825. package/packages/tools/src/grammar/memo-sysml.langium +0 -1064
@@ -3,91 +3,177 @@
3
3
  // Parses all .sysml files, builds the model, evaluates closure rules,
4
4
  // and prints a completeness report.
5
5
  // ─────────────────────────────────────────────────────────────────────────────
6
- import { resolve } from 'node:path';
6
+ import { relative, resolve } from 'node:path';
7
7
  import { writeFileSync } from 'node:fs';
8
8
  import chalk from 'chalk';
9
9
  import { identityKey, writeIdentityRegistry } from '../model/identity-registry.js';
10
- import { buildMemoModel, loadOntologyRegistries, loadProjectSettings, findProjectRoot, resolveEffectiveMethodology, resolveEffectiveRules, buildEffectiveScope, activeRuleCandidates, isRulePackageInScope, checkSemanticFields, } from '@memoarchitect/tools';
11
- import { validateModel, collectNativeConstraints } from '@memoarchitect/tools';
10
+ import { loadProjectSettings, findProjectRoot, resolveEffectiveMethodology, buildEffectiveScope, resolveProjectRules, isRulePackageInScope, scopedSubjectIds, checkSemanticFields, } from '@memoarchitect/tools';
11
+ import { ELEMENT_NAME_COLLISION, AMBIGUOUS_ELEMENT_REFERENCE } from '@memoarchitect/tools';
12
+ import { validateModel, collectApiConstraints, } from '@memoarchitect/tools';
13
+ import { checkSelectorVocabulary } from '@memoarchitect/tools';
12
14
  import { computeCompleteness } from '@memoarchitect/tools';
13
- import { checkLockFile } from '../lock.js';
15
+ import { checkLockFile, lockableDependencies } from '../lock.js';
14
16
  import { runValidator } from '../toolchain/operations.js';
15
17
  import { resolveToolchain } from '../toolchain/effective.js';
16
18
  import { defaultRegistry } from '../toolchain/default-registry.js';
19
+ import { compileResolvedProject, compileServesValidator } from '../toolchain/operations.js';
20
+ import { discoverProjectSources } from '../model/native-project.js';
21
+ import { narrowModel } from '../model/narrow-model.js';
22
+ import { computeWorkspaceMembership, selectWorkspace } from '../model/workspace-membership.js';
23
+ import { resolutionLoads } from '../stage2/project-from-api.js';
24
+ import { stage1CacheDir } from '../toolchain/project-model.js';
17
25
  import { withToolchainOverrides } from '../toolchain/schema.js';
18
26
  import { countBySeverity, formatDiagnosticsText } from '../toolchain/diagnostic.js';
27
+ import { servable, validateWithDevServer } from './validate-client.js';
28
+ /** A run that stops early with this exit code; thrown, never left to escape. */
29
+ export class ValidationExit extends Error {
30
+ code;
31
+ constructor(code) {
32
+ super(`validation stopped with exit code ${code}`);
33
+ this.code = code;
34
+ }
35
+ }
36
+ /** The console, as the CLI writes. */
37
+ export const consoleIO = {
38
+ out: (...args) => console.log(...args),
39
+ err: (...args) => console.error(...args),
40
+ write: text => { process.stdout.write(text); },
41
+ };
42
+ /** Runs a validation, stopping early with its code instead of throwing. */
43
+ export async function validationExitCode(run) {
44
+ try {
45
+ return await run();
46
+ }
47
+ catch (error) {
48
+ if (error instanceof ValidationExit)
49
+ return error.code;
50
+ throw error;
51
+ }
52
+ }
19
53
  export async function validateCommand(projectDir, options) {
54
+ // A running `memo dev` holds the compiled model already: ask it first.
55
+ const cwd = resolve(projectDir || process.cwd());
56
+ const projectRoot = servable(options) ? findProjectRoot(cwd) : undefined;
57
+ const served = projectRoot ? await validateWithDevServer(projectRoot, process.cwd(), options) : undefined;
58
+ if (served) {
59
+ process.stderr.write(chalk.gray(`(answered by the dev server running for this project, from the model it holds; --no-server to compile here)\n`));
60
+ process.stderr.write(served.stderr);
61
+ process.stdout.write(served.stdout);
62
+ if (served.exitCode !== 0)
63
+ process.exitCode = served.exitCode;
64
+ return;
65
+ }
66
+ const code = await validationExitCode(() => runValidation(projectDir, options, consoleIO));
67
+ if (code !== 0)
68
+ process.exitCode = code;
69
+ }
70
+ export async function runValidation(projectDir, options, io, compile = compileResolvedProject) {
71
+ let exitCode = 0;
20
72
  const format = options?.format || 'text';
73
+ // A report written to stdout (json or junit without -o) is the whole of
74
+ // stdout, so a script can parse it; the progress goes to stderr.
75
+ const say = format !== 'text' && !options?.output ? io.err : io.out;
21
76
  const cwd = resolve(projectDir || process.cwd());
22
- console.log(chalk.bold('\n📋 MEMO Validate\n'));
77
+ say(chalk.bold('\n📋 MEMO Validate\n'));
23
78
  // 1. Find the project by its native entrypoint, not by a settings file.
24
79
  const projectRoot = findProjectRoot(cwd);
25
80
  if (!projectRoot) {
26
- console.error(chalk.red('❌ No MEMO project found. A project is located by the `entrypoint` in its '
81
+ io.err(chalk.red('❌ No MEMO project found. A project is located by the `entrypoint` in its '
27
82
  + '`memo.package.yaml`, which names the SysML file declaring its identity '
28
- + 'and method binding — run `memo init` to scaffold one.'));
29
- process.exit(1);
83
+ + 'and method binding — run `memo-architect init` to scaffold one.'));
84
+ throw new ValidationExit(1);
30
85
  }
31
- console.log(chalk.gray(`Project root: ${projectRoot}`));
86
+ say(chalk.gray(`Model root: ${projectRoot}`));
32
87
  // 2. Reject semantic configuration before anything reads it.
33
88
  const rejections = checkSemanticFields(projectRoot);
34
89
  if (rejections.length > 0) {
35
- console.error(chalk.red(`\n❌ Semantic configuration found in application settings (${rejections.length}):\n`));
90
+ io.err(chalk.red(`\n❌ Semantic configuration found in application settings (${rejections.length}):\n`));
36
91
  for (const r of rejections) {
37
- console.error(chalk.red(` ${r.file}`));
38
- console.error(chalk.gray(` ${r.message}\n`));
92
+ io.err(chalk.red(` ${r.file}`));
93
+ io.err(chalk.gray(` ${r.message}\n`));
39
94
  }
40
- process.exit(1);
95
+ throw new ValidationExit(1);
41
96
  }
42
97
  const config = withToolchainOverrides(loadProjectSettings(projectRoot), options ?? {}, defaultRegistry);
43
98
  const effectiveToolchain = resolveToolchain(config, defaultRegistry);
44
99
  for (const note of effectiveToolchain.deprecations)
45
- console.log(chalk.yellow(` ⚠ ${note}`));
46
- // 3. Resolve the project natively: imports and the method binding decide
47
- // everything about what is loaded.
100
+ say(chalk.yellow(` ⚠ ${note}`));
101
+ // 3. Resolve the project: imports and the method binding decide everything
102
+ // about what is loaded. The compiler resolves it from what it compiled —
103
+ // every library root a locator offers, the import closure deciding which
104
+ // is the ontology — so MEMO parses nothing.
105
+ const compiler = effectiveToolchain.lowering;
106
+ const validatorFromStage1 = compileServesValidator(config, defaultRegistry);
107
+ let sysmlDiagnostics = [];
48
108
  let ontologyRegistries;
49
- let ontologyDocuments = [];
50
- const loadResult = await loadOntologyRegistries(projectRoot);
51
- const resolution = loadResult.resolution;
52
- if (loadResult.fileCount > 0) {
53
- ontologyRegistries = { ...loadResult.registries, provenance: loadResult.provenance };
54
- ontologyDocuments = loadResult.parsedDocuments;
55
- const kr = loadResult.registries.kindRegistry;
56
- const rr = loadResult.registries.relationshipRegistry;
57
- console.log(chalk.gray(`Resolved: ${kr?.size ?? 0} kinds, ${rr?.size ?? 0} relationships `
58
- + `(${loadResult.fileCount} SysML files, ${loadResult.ontologyDirs.length} packages)`));
59
- }
60
- for (const err of loadResult.errors)
61
- console.log(chalk.yellow(` ⚠ ${err}`));
109
+ let resolution;
110
+ let stage1;
111
+ const projectSourceCount = discoverProjectSources(projectRoot).projectFiles.length;
112
+ {
113
+ try {
114
+ // Reuses a fresh `memo compile`.
115
+ stage1 = await compile({ config, projectDir: projectRoot, cacheDir: stage1CacheDir(projectRoot) });
116
+ }
117
+ catch (error) {
118
+ io.err(chalk.red(`\n❌ ${error instanceof Error ? error.message : error}\n`));
119
+ throw new ValidationExit(1);
120
+ }
121
+ say(chalk.gray(`Stage 1: ${compiler} ${stage1.providerVersion ?? ''} — ${stage1.accepted ? 'clean' : 'errors'}${stage1.cached ? ' (reused .memo/stage1)' : ''}`));
122
+ if (validatorFromStage1) {
123
+ sysmlDiagnostics = stage1.diagnostics;
124
+ say(chalk.gray(`Validator: ${compiler} ${stage1.providerVersion ?? ''} (stage 1's check)`));
125
+ }
126
+ // A stage 1 that reports an error stops here: stage 2 and the rules
127
+ // never run on a model that is not valid SysML.
128
+ if (!stage1.accepted || !stage1.model) {
129
+ const errors = stage1.diagnostics.filter(d => d.severity === 'error');
130
+ io.err(chalk.red(`\n❌ Stage 1 (${compiler}) reported ${errors.length} error(s); stage 2 and the rules did not run.\n`));
131
+ for (const d of errors)
132
+ io.err(chalk.red(` ${d.file}:${d.range?.start.line ?? '?'}:${d.range?.start.column ?? '?'} ${d.code ?? ''} ${d.message}`));
133
+ throw new ValidationExit(1);
134
+ }
135
+ resolution = stage1.resolution;
136
+ ontologyRegistries = stage1.registries;
137
+ const kr = ontologyRegistries?.kindRegistry;
138
+ const rr = ontologyRegistries?.relationshipRegistry;
139
+ say(chalk.gray(`Resolved: ${kr?.size ?? 0} kinds, ${rr?.size ?? 0} relationships `
140
+ + `(from ${compiler}'s handoff, ${resolution?.closure.size ?? 0} packages)`));
141
+ for (const d of resolution?.diagnostics ?? [])
142
+ say(chalk.yellow(` ⚠ ${d.code}: ${d.message}`));
143
+ }
62
144
  if (resolution?.binding) {
63
- console.log(chalk.gray(`Binding: ${resolution.binding.projectName ?? resolution.binding.usageName} → `
145
+ say(chalk.gray(`Binding: ${resolution.binding.modelName ?? resolution.binding.usageName} → `
64
146
  + `${resolution.binding.selectedMethodologyName ?? '(none)'}`));
65
147
  }
66
148
  // The validator's verdict is diagnostics, not an exception. A tool that
67
149
  // rejects the source has done its job and its complaints belong in the
68
150
  // report; only a tool that could not be run at all aborts the command,
69
151
  // because selecting a missing tool must never downgrade to another provider.
70
- let sysmlDiagnostics = [];
71
- try {
72
- const run = await runValidator({ config, projectDir: projectRoot, registry: defaultRegistry });
73
- sysmlDiagnostics = run.diagnostics;
74
- console.log(chalk.gray(`Validator: ${run.provider}${run.providerVersion ? ` ${run.providerVersion}` : ''}`));
75
- }
76
- catch (error) {
77
- console.error(chalk.red(`\n❌ ${error instanceof Error ? error.message : error}\n`));
78
- process.exit(1);
152
+ // When the compiler's own stage 1 is the validator's check (one provider in
153
+ // both roles), its diagnostics are taken from stage 1 below instead of
154
+ // running the same tool twice.
155
+ if (!validatorFromStage1) {
156
+ try {
157
+ const run = await runValidator({ config, projectDir: projectRoot, registry: defaultRegistry });
158
+ sysmlDiagnostics = run.diagnostics;
159
+ say(chalk.gray(`Validator: ${run.provider}${run.providerVersion ? ` ${run.providerVersion}` : ''}`));
160
+ }
161
+ catch (error) {
162
+ io.err(chalk.red(`\n❌ ${error instanceof Error ? error.message : error}\n`));
163
+ throw new ValidationExit(1);
164
+ }
79
165
  }
80
166
  const lockCheck = checkLockFile(projectRoot, (resolution?.selectedRoots ?? []).map(root => ({
81
167
  ...root,
82
168
  origin: 'ontology',
83
169
  importDepth: 1,
84
- })));
170
+ })), lockableDependencies(resolution?.dependencies ?? []));
85
171
  if (!lockCheck.ok) {
86
- console.error(chalk.red(`\n❌ ${lockCheck.message}\n`));
87
- process.exit(1);
172
+ io.err(chalk.red(`\n❌ ${lockCheck.message}\n`));
173
+ throw new ValidationExit(1);
88
174
  }
89
175
  if (lockCheck.locked) {
90
- console.log(chalk.gray(`Ontology: locked to ${lockCheck.locked.ontology} v${lockCheck.locked.version}`));
176
+ say(chalk.gray(`Ontology: locked to ${lockCheck.locked.ontology} v${lockCheck.locked.version}`));
91
177
  }
92
178
  // 4. The project's own source is everything parsed that belongs to no
93
179
  // library root — selected OR unused.
@@ -101,88 +187,146 @@ export async function validateCommand(projectDir, options) {
101
187
  // from a root the project never imported is not project source; it is
102
188
  // not in the model at all.
103
189
  const resolvedRoots = [...(resolution?.selectedRoots ?? []), ...(resolution?.unusedRoots ?? [])];
104
- const documents = (resolution?.documents ?? []).filter(d => !resolvedRoots.some(r => d.filePath.startsWith(r.sysmlDir)));
190
+ const isProjectFile = (file) => !resolvedRoots.some(r => file.startsWith(r.sysmlDir));
191
+ // Stage 1 was clean, so nothing the project declares failed to parse.
105
192
  const parseErrors = [];
106
- if (documents.length === 0) {
107
- console.error(chalk.yellow('⚠️ No project .sysml files found.'));
108
- return;
193
+ const projectFileCount = projectSourceCount;
194
+ if (projectFileCount === 0) {
195
+ io.err(chalk.yellow('⚠️ No project .sysml files found.'));
196
+ return exitCode;
109
197
  }
110
- console.log(chalk.gray(`Files: ${documents.length} project .sysml files\n`));
111
- // 5. Build model
112
- const model = buildMemoModel(documents, config, parseErrors, ontologyRegistries);
113
- console.log(chalk.cyan(`Model: ${model.elements.size} elements, ${model.relationships.length} relationships\n`));
198
+ say(chalk.gray(`Files: ${projectFileCount} project .sysml files\n`));
199
+ // 5. The model stage 1 built from its handoff.
200
+ const model = stage1.model;
201
+ say(chalk.cyan(`Model: ${model.elements.size} elements, ${model.relationships.length} relationships\n`));
202
+ // A short-name collision belongs in this report for exactly the reason a
203
+ // parse error does: an element the project declared is not in the model, so
204
+ // every number below is computed over less than the source says.
205
+ const missingContent = new Set([ELEMENT_NAME_COLLISION, AMBIGUOUS_ELEMENT_REFERENCE]);
206
+ const diagnostics = [
207
+ ...parseErrors,
208
+ ...model.errors.filter(e => e.code !== undefined && missingContent.has(e.code) && isProjectFile(e.file)),
209
+ ];
210
+ // Every other finding the builder raised: an edge whose end is the wrong
211
+ // kind, an end that names nothing, a relationship name used twice. The
212
+ // model loaded; it says something the ontology does not allow. These were
213
+ // computed on every build and read by no command until 2026-09-25, when
214
+ // surfacing them found 72 across three shipped examples. `model.errors`
215
+ // begins with the parse errors it was given, which carry no code, so the
216
+ // code is what tells a builder finding apart.
217
+ const modelFindings = model.errors.filter(e => e.code !== undefined && !missingContent.has(e.code) && isProjectFile(e.file));
218
+ // A file the parser rejected declares less of the model than it says it
219
+ // does, so every number below it — completeness, rules passed, violations
220
+ // — is computed over a model that is missing content. Reported quietly,
221
+ // that reads as PROGRESS: the elements carrying violations never loaded,
222
+ // so the violation total FALLS. Measured 2026-09-19, one file with 805
223
+ // parse errors built 2 elements instead of 124 and validate said "92%
224
+ // complete, 1583 violations, 32 rules passed", down from 1595 — and the
225
+ // drop was committed as work that had not landed.
226
+ //
227
+ // So it is printed before any of those numbers, and it fails the command.
228
+ reportParseErrors(diagnostics, projectRoot, say);
229
+ reportModelFindings(modelFindings, projectRoot, say);
230
+ // A selector naming a kind, relationship or attribute the ontology never
231
+ // declared matches nothing — in this model and in every other one, which is
232
+ // why it survives review: an empty view looks exactly like an empty model.
233
+ // Reported here, next to the parse errors, because both mean the report
234
+ // below describes something other than what the source says.
235
+ const selectorDiagnostics = checkSelectorVocabulary(model, {
236
+ kindRegistry: ontologyRegistries?.kindRegistry,
237
+ relationshipRegistry: ontologyRegistries?.relationshipRegistry,
238
+ });
239
+ reportSelectorDiagnostics(selectorDiagnostics, projectRoot, say);
114
240
  // Record the identities this build assigned. `validate` is the command that
115
241
  // runs most, so it is where a project first acquires memo.identity.yaml;
116
242
  // without this the registry would only appear on a pack or an Architect
117
243
  // build, and every validate in between would re-mint identities.
118
- try {
119
- const assigned = {};
120
- for (const el of model.elements.values()) {
121
- if (!el.shortId && !el.uuid)
122
- continue;
123
- assigned[identityKey(el)] = { shortId: el.shortId, uuid: el.uuid };
244
+ if (!options?.readOnly)
245
+ try {
246
+ const assigned = {};
247
+ for (const el of model.elements.values()) {
248
+ if (!el.shortId && !el.uuid)
249
+ continue;
250
+ // Another package owns a dependency's identities; this model's registry does not hold them.
251
+ if (el.provenance?.declaration.origin === 'dependency')
252
+ continue;
253
+ assigned[identityKey(el)] = { shortId: el.shortId, uuid: el.uuid };
254
+ }
255
+ writeIdentityRegistry(projectRoot, assigned, config.priorIdentities ?? {});
256
+ }
257
+ catch {
258
+ // A read-only checkout still validates; it just cannot record identities.
124
259
  }
125
- writeIdentityRegistry(projectRoot, assigned, config.priorIdentities ?? {});
126
- }
127
- catch {
128
- // A read-only checkout still validates; it just cannot record identities.
129
- }
130
260
  // 6. Validate — native ontology constraints (constraint def bodies) + structural checks.
131
- // Constraint defs live in the ontology packages (parsed by loadOntologyRegistries),
132
- // so collect across both ontology and project documents.
261
+ // The compiler's handoff carries the ontology, so its rules are read from
262
+ // that handoff.
133
263
  const constraintDiagnostics = [];
134
- const nativeConstraints = collectNativeConstraints([...ontologyDocuments, ...documents], constraintDiagnostics);
264
+ const stage1Api = stage1.api;
265
+ // The rules resolution loads: the ontology's and the project's own.
266
+ const loaded = resolution ? resolutionLoads(resolution) : () => true;
267
+ const ruleFileLoaded = (file) => loaded(file) || isProjectFile(file);
268
+ const nativeConstraints = collectApiConstraints(stage1Api, constraintDiagnostics, resolution?.filePackages, ruleFileLoaded);
135
269
  if (nativeConstraints.length > 0) {
136
- console.log(chalk.gray(`Native constraints: ${nativeConstraints.length} (from constraint def bodies)`));
270
+ say(chalk.gray(`Native constraints: ${nativeConstraints.length} (from ${compiler}'s handoff)`));
137
271
  }
138
272
  // A rule that failed to load is a check that is not running. Report it
139
273
  // prominently: silence here reads as "all rules passed".
140
274
  if (constraintDiagnostics.length > 0) {
141
- console.log(chalk.red(`\n⚠ ${constraintDiagnostics.length} rule(s) could not be loaded and are NOT being evaluated:`));
275
+ say(chalk.red(`\n⚠ ${constraintDiagnostics.length} rule(s) could not be loaded and are NOT being evaluated:`));
142
276
  for (const d of constraintDiagnostics) {
143
- console.log(chalk.red(` ${d.ruleId} (${d.file})`));
144
- console.log(chalk.gray(` ${d.message}`));
277
+ say(chalk.red(` ${d.ruleId} (${d.file})`));
278
+ say(chalk.gray(` ${d.message}`));
145
279
  }
146
- console.log('');
280
+ say('');
147
281
  }
148
282
  // 6a. Effective methodology and the deterministic effective rule set.
149
- // A module is available when a resolved package supplies it. That is wider
150
- // than the import closure on purpose: a package the project resolved is
151
- // resolved in full, and whether the methodology selects it is the next
152
- // question, not this one.
153
- const availablePackages = new Set(resolution?.filePackages.values() ?? []);
154
- const effectiveMethodology = resolveEffectiveMethodology(resolution?.binding, resolution?.methodologies ?? new Map(), availablePackages);
283
+ const effectiveMethodology = resolveEffectiveMethodology(resolution?.binding, resolution?.methodologies ?? new Map(), resolution?.publicImports ?? new Map());
155
284
  const scope = buildEffectiveScope(effectiveMethodology);
156
- for (const d of effectiveMethodology.diagnostics) {
157
- console.log(chalk.yellow(` ⚠ ${d.code}: ${d.message}`));
285
+ // A methodology diagnostic is not advisory either. A module, layer or base
286
+ // the methodology names and the project cannot resolve selects nothing, so
287
+ // the rule set that ran is not the one the methodology describes, and a
288
+ // narrower rule set reads exactly like a cleaner model. It fails the run
289
+ // the way a rule-resolution diagnostic does.
290
+ if (effectiveMethodology.diagnostics.length > 0) {
291
+ say(chalk.red.bold(`\nMethodology resolution (${effectiveMethodology.diagnostics.length}):`));
292
+ for (const d of effectiveMethodology.diagnostics) {
293
+ say(chalk.red(` ${d.code}: ${d.message}`));
294
+ }
295
+ say();
296
+ exitCode = 1;
158
297
  }
159
- // Rule activation is shared with `memo rules list` so the two commands
298
+ // Rule activation is shared with `memo validate --rules` so the two commands
160
299
  // cannot report different rule sets for one project.
161
300
  const ruleFileToPackage = resolution?.filePackages ?? new Map();
162
301
  const kindRegistry = ontologyRegistries?.kindRegistry;
163
- const candidates = activeRuleCandidates(nativeConstraints, scope, ruleFileToPackage, kindName => kindRegistry?.getKind(kindName)?.sourceFile);
164
- const effectiveRules = resolveEffectiveRules(candidates, effectiveMethodology.policyChain);
302
+ const { rules: effectiveRules } = resolveProjectRules({
303
+ constraints: nativeConstraints,
304
+ effective: effectiveMethodology,
305
+ filePackages: ruleFileToPackage,
306
+ kindSourceFile: kindName => kindRegistry?.getKind(kindName)?.sourceFile,
307
+ isOwnFile: isProjectFile,
308
+ });
165
309
  // A rule-resolution diagnostic is not advisory. A policy that targets a
166
310
  // rule that is not there, or tries to disable an invariant, means the
167
311
  // effective rule set is not the one the methodology describes.
168
312
  if (effectiveRules.diagnostics.length > 0) {
169
- console.log(chalk.red.bold(`\nRule resolution (${effectiveRules.diagnostics.length}):`));
313
+ say(chalk.red.bold(`\nRule resolution (${effectiveRules.diagnostics.length}):`));
170
314
  for (const d of effectiveRules.diagnostics) {
171
- console.log(chalk.red(` ${d.code}${d.ruleId ? ` [${d.ruleId}]` : ''}: ${d.message}`));
315
+ say(chalk.red(` ${d.code}${d.ruleId ? ` [${d.ruleId}]` : ''}: ${d.message}`));
172
316
  }
173
- console.log();
174
- process.exitCode = 1;
317
+ say();
318
+ exitCode = 1;
175
319
  }
176
320
  const disabled = effectiveRules.rules.filter(r => r.disposition !== 'enabled');
177
321
  if (disabled.length > 0) {
178
- console.log(chalk.gray(`Tailored rules (${disabled.length}):`));
322
+ say(chalk.gray(`Tailored rules (${disabled.length}):`));
179
323
  for (const r of disabled) {
180
324
  const chain = r.policyChain.map(p => `${p.level}:${p.source}`).join(' → ');
181
- console.log(chalk.gray(` ${r.sourceRuleId} ${r.disposition} by ${chain}`));
325
+ say(chalk.gray(` ${r.sourceRuleId} ${r.disposition} by ${chain}`));
182
326
  if (r.rationaleText)
183
- console.log(chalk.gray(` ${r.rationaleText}`));
327
+ say(chalk.gray(` ${r.rationaleText}`));
184
328
  }
185
- console.log();
329
+ say();
186
330
  }
187
331
  // Rules evaluate over in-scope elements only.
188
332
  //
@@ -198,27 +342,56 @@ export async function validateCommand(projectDir, options) {
198
342
  // Scope decides which elements rules RUN ON. It must not touch the model:
199
343
  // see narrowToScope below for what happened when it did.
200
344
  const inScopeIds = scope.mode === 'allAvailable' ? undefined : scopeElementIds(model);
201
- const subjectModel = scope.mode === 'allAvailable' ? model : narrowToScope(model);
202
- const result = validateModel(model, effectiveRules.activeConstraints, ontologyRegistries?.kindRegistry, effectiveRules.rules, inScopeIds && (element => inScopeIds.has(element.id)));
345
+ // `--workspace` is a second, independent narrowing of the subjects (see WorkspaceScope). It is
346
+ // refused outright when it cannot be honoured: a workspace that is unknown, or empty, would
347
+ // otherwise print "0 violations", which reads exactly like a clean model.
348
+ // What each workspace holds: also what the system boundary rule (CR-ONT-087) judges.
349
+ const membership = ontologyRegistries?.kindRegistry && ontologyRegistries.relationshipRegistry
350
+ ? computeWorkspaceMembership(model, ontologyRegistries)
351
+ : undefined;
352
+ let workspace;
353
+ const requestedWorkspace = typeof options?.workspace === 'string' ? options.workspace : undefined;
354
+ if (requestedWorkspace !== undefined) {
355
+ if (!membership) {
356
+ io.err(chalk.red('\n❌ --workspace needs the ontology registries the model was built with.\n'));
357
+ throw new ValidationExit(1);
358
+ }
359
+ const selection = selectWorkspace(model, membership, requestedWorkspace);
360
+ if (!selection.ok) {
361
+ io.err(chalk.red(`\n❌ --workspace: ${selection.message}\n`));
362
+ throw new ValidationExit(1);
363
+ }
364
+ workspace = selection.scope;
365
+ if (workspace.subjects.size === 0) {
366
+ io.err(chalk.red(`\n❌ --workspace: the workspace "${workspace.name}" holds no elements.\n`));
367
+ throw new ValidationExit(1);
368
+ }
369
+ say(chalk.gray(`Workspace: ${workspace.name} (${workspace.scope}) — ${workspace.subjects.size} elements; rules run on these over the whole model\n`));
370
+ }
371
+ const subjectModel = scope.mode === 'allAvailable' && !workspace ? model : narrowToScope(model);
372
+ const result = validateModel(model, effectiveRules.activeConstraints, ontologyRegistries?.kindRegistry, effectiveRules.rules, inScopeIds && (element => inScopeIds.has(element.id)), workspace, membership);
203
373
  // Completeness reports on what the methodology selected, which is the
204
374
  // scoped model — not on content the project deliberately excluded.
205
375
  const completeness = computeCompleteness(subjectModel, result);
206
- /** Element ids the methodology selected. */
376
+ /** Subject ids the methodology selected: elements, and named typed edges. */
207
377
  function scopeElementIds(full) {
208
- const ids = new Set();
209
- for (const [id, element] of full.elements) {
210
- const sourceFile = kindRegistry?.getKind(element.kind)?.sourceFile;
378
+ return scopedSubjectIds(full, kind => {
379
+ const sourceFile = kindRegistry?.getKind(kind)?.sourceFile;
211
380
  const declaringPackage = sourceFile ? ruleFileToPackage.get(sourceFile) : undefined;
212
- if (!declaringPackage || isRulePackageInScope(scope, declaringPackage))
213
- ids.add(id);
214
- }
215
- return ids;
381
+ return !declaringPackage || isRulePackageInScope(scope, declaringPackage);
382
+ });
216
383
  }
217
384
  // Still used for the COMPLETENESS report, which is a statement about what
218
385
  // the methodology selected. Rules no longer see it — see the note inside.
219
386
  function narrowToScope(full) {
220
387
  const kept = new Map();
221
388
  for (const [id, element] of full.elements) {
389
+ if (workspace && !workspace.subjects.has(id))
390
+ continue;
391
+ if (scope.mode === 'allAvailable') {
392
+ kept.set(id, element);
393
+ continue;
394
+ }
222
395
  const sourceFile = kindRegistry?.getKind(element.kind)?.sourceFile;
223
396
  const declaringPackage = sourceFile ? ruleFileToPackage.get(sourceFile) : undefined;
224
397
  // A kind the resolved ontology does not declare is project-local
@@ -226,52 +399,7 @@ export async function validateCommand(projectDir, options) {
226
399
  if (!declaringPackage || isRulePackageInScope(scope, declaringPackage))
227
400
  kept.set(id, element);
228
401
  }
229
- const byKind = new Map();
230
- const byLayer = new Map();
231
- for (const element of kept.values()) {
232
- (byKind.get(element.kind) ?? byKind.set(element.kind, []).get(element.kind)).push(element);
233
- (byLayer.get(element.layer) ?? byLayer.set(element.layer, []).get(element.layer)).push(element);
234
- }
235
- // Narrow the SUBJECT SET, not the graph.
236
- //
237
- // This used to drop out-of-scope elements from `elements` and filter
238
- // `relationships` to edges with both endpoints kept — while leaving
239
- // `outgoing`, `incoming` and `relationshipsByType` pointing at the FULL
240
- // model. The result was a model that contradicted itself, and every
241
- // rule that NAVIGATES a trace silently saw nothing: `navigate` looks the
242
- // far endpoint up in `elements`, so an edge to a dropped element
243
- // returned no result.
244
- //
245
- // Measured on gpca-pump (2026-08-19): 374 of 723 elements dropped, and
246
- // ALL 110 `satisfiedBy` edges lost an endpoint — every architecture
247
- // element went, because `filePackages` maps every file, so the
248
- // module-scope test was applied to architecture kinds that
249
- // `includedLayer` governs instead. XL-002 then reported 89 requirements
250
- // as lacking requirements-to-architecture traceability that the source
251
- // plainly traces.
252
- //
253
- // The comment above already said the intent: "only the subject set
254
- // narrows". `subjectsForScope` reads `elementsByKind`, so narrowing
255
- // that alone is both sufficient and consistent.
256
- const relationships = full.relationships.filter(r => kept.has(r.sourceId) && kept.has(r.targetId));
257
- const relationshipsByType = new Map();
258
- const outgoing = new Map();
259
- const incoming = new Map();
260
- for (const r of relationships) {
261
- (relationshipsByType.get(r.type) ?? relationshipsByType.set(r.type, []).get(r.type)).push(r);
262
- (outgoing.get(r.sourceId) ?? outgoing.set(r.sourceId, []).get(r.sourceId)).push(r);
263
- (incoming.get(r.targetId) ?? incoming.set(r.targetId, []).get(r.targetId)).push(r);
264
- }
265
- return {
266
- ...full,
267
- elements: kept,
268
- elementsByKind: byKind,
269
- elementsByLayer: byLayer,
270
- relationships,
271
- relationshipsByType,
272
- outgoing,
273
- incoming,
274
- };
402
+ return narrowModel(full, kept);
275
403
  }
276
404
  const errors = result.violations.filter(v => v.severity === 'error');
277
405
  const warnings = result.violations.filter(v => v.severity === 'warning');
@@ -282,27 +410,29 @@ export async function validateCommand(projectDir, options) {
282
410
  const sysmlErrors = countBySeverity(sysmlDiagnostics).error;
283
411
  // ─── Output format dispatch ──────────────────────────────────────────────
284
412
  if (format === 'junit') {
285
- const xml = generateJUnit(result, completeness, config.projectName || 'memo');
413
+ const xml = generateJUnit(result, completeness, config.modelName || 'memo', diagnostics, modelFindings);
286
414
  if (options?.output) {
287
415
  writeFileSync(resolve(cwd, options.output), xml);
288
- console.log(chalk.green(`JUnit XML written to ${options.output}`));
416
+ io.out(chalk.green(`JUnit XML written to ${options.output}`));
289
417
  }
290
418
  else {
291
- process.stdout.write(xml);
419
+ io.write(xml);
292
420
  }
293
- if (errors.length > 0 || sysmlErrors > 0)
294
- process.exitCode = 1;
295
- return;
421
+ if (failed())
422
+ exitCode = 1;
423
+ return exitCode;
296
424
  }
297
425
  if (format === 'json') {
298
426
  const jsonOutput = {
299
- projectName: config.projectName,
427
+ modelName: config.modelName,
428
+ projectName: config.modelName, // deprecated alias, deleted in 0.15.0
300
429
  timestamp: new Date().toISOString(),
301
430
  summary: {
302
431
  elements: model.elements.size,
303
432
  relationships: model.relationships.length,
304
433
  rulesEvaluated: result.rulesEvaluated,
305
434
  rulesPassed: result.rulesPassed,
435
+ rulesVacuous: result.rulesVacuous,
306
436
  violations: result.violations.length,
307
437
  errors: errors.length,
308
438
  warnings: warnings.length,
@@ -310,13 +440,16 @@ export async function validateCommand(projectDir, options) {
310
440
  completeness: completeness.overall,
311
441
  rulesNotLoaded: constraintDiagnostics.length,
312
442
  sysmlErrors,
443
+ parseErrors: diagnostics.length,
444
+ filesNotParsed: filesWithParseErrors(diagnostics).size,
445
+ modelFindings: modelFindings.length,
313
446
  },
447
+ parseErrors: diagnostics,
448
+ modelFindings,
314
449
  rulesNotLoaded: constraintDiagnostics,
315
- toolchain: {
316
- validator: effectiveToolchain.validator,
317
- lowering: effectiveToolchain.lowering,
318
- packager: effectiveToolchain.packager,
319
- },
450
+ // The roles the settings fill; a packager is named only by a
451
+ // project that packages.
452
+ toolchain: Object.fromEntries(effectiveToolchain.selections.map(s => [s.role === 'package' ? 'packager' : s.role, s.provider])),
320
453
  diagnostics: sysmlDiagnostics,
321
454
  violations: result.violations.map(v => ({
322
455
  ruleId: v.ruleId,
@@ -343,14 +476,14 @@ export async function validateCommand(projectDir, options) {
343
476
  const jsonStr = JSON.stringify(jsonOutput, null, 2);
344
477
  if (options?.output) {
345
478
  writeFileSync(resolve(cwd, options.output), jsonStr);
346
- console.log(chalk.green(`JSON report written to ${options.output}`));
479
+ io.out(chalk.green(`JSON report written to ${options.output}`));
347
480
  }
348
481
  else {
349
- process.stdout.write(jsonStr + '\n');
482
+ io.write(jsonStr + '\n');
350
483
  }
351
- if (errors.length > 0 || sysmlErrors > 0)
352
- process.exitCode = 1;
353
- return;
484
+ if (failed())
485
+ exitCode = 1;
486
+ return exitCode;
354
487
  }
355
488
  // ─── Default text output ─────────────────────────────────────────────────
356
489
  // GNU one-liners, so an editor or CI annotator that already understands
@@ -358,59 +491,157 @@ export async function validateCommand(projectDir, options) {
358
491
  // MEMO. The trailing `[domain/provider]` is additive.
359
492
  if (sysmlDiagnostics.length > 0) {
360
493
  const counts = countBySeverity(sysmlDiagnostics);
361
- console.log(chalk.red.bold(`SysML diagnostics (${counts.error} error, ${counts.warning} warning, ${counts.info} info):`));
362
- console.log(formatDiagnosticsText(sysmlDiagnostics));
363
- console.log();
494
+ io.out(chalk.red.bold(`SysML diagnostics (${counts.error} error, ${counts.warning} warning, ${counts.info} info):`));
495
+ io.out(formatDiagnosticsText(sysmlDiagnostics));
496
+ io.out();
364
497
  }
365
498
  if (errors.length > 0) {
366
- console.log(chalk.red.bold(`Errors (${errors.length}):`));
499
+ io.out(chalk.red.bold(`Errors (${errors.length}):`));
367
500
  for (const v of errors) {
368
- console.log(chalk.red(` ✖ [${v.ruleId}] ${v.elementKind}/${v.elementName}: ${v.description}`));
501
+ io.out(chalk.red(` ✖ [${v.ruleId}] ${v.elementKind}/${v.elementName}: ${v.description}`));
369
502
  }
370
- console.log();
503
+ io.out();
371
504
  }
372
505
  if (warnings.length > 0) {
373
- console.log(chalk.yellow.bold(`Warnings (${warnings.length}):`));
506
+ io.out(chalk.yellow.bold(`Warnings (${warnings.length}):`));
374
507
  for (const v of warnings) {
375
- console.log(chalk.yellow(` ⚠ [${v.ruleId}] ${v.elementKind}/${v.elementName}: ${v.description}`));
508
+ io.out(chalk.yellow(` ⚠ [${v.ruleId}] ${v.elementKind}/${v.elementName}: ${v.description}`));
376
509
  }
377
- console.log();
510
+ io.out();
378
511
  }
379
512
  if (infos.length > 0) {
380
- console.log(chalk.blue.bold(`Info (${infos.length}):`));
513
+ io.out(chalk.blue.bold(`Info (${infos.length}):`));
381
514
  for (const v of infos) {
382
- console.log(chalk.blue(` ℹ [${v.ruleId}] ${v.elementKind}/${v.elementName}: ${v.description}`));
515
+ io.out(chalk.blue(` ℹ [${v.ruleId}] ${v.elementKind}/${v.elementName}: ${v.description}`));
383
516
  }
384
- console.log();
517
+ io.out();
385
518
  }
386
- console.log(chalk.bold('Completeness by Layer:'));
519
+ io.out(chalk.bold('Completeness by Layer:'));
387
520
  for (const layer of completeness.layers) {
388
521
  if (layer.totalElements === 0)
389
522
  continue;
390
523
  const pct = layer.percentage;
391
524
  const color = pct >= 80 ? chalk.green : pct >= 50 ? chalk.yellow : chalk.red;
392
525
  const bar = makeBar(pct);
393
- console.log(` ${layer.layerLabel.padEnd(22)} ${color(bar)} ${color(`${pct}%`)} (${layer.completeElements}/${layer.totalElements})`);
526
+ io.out(` ${layer.layerLabel.padEnd(22)} ${color(bar)} ${color(`${pct}%`)} (${layer.completeElements}/${layer.totalElements})`);
394
527
  }
395
- console.log();
528
+ io.out();
396
529
  const overallColor = completeness.overall >= 80 ? chalk.green : completeness.overall >= 50 ? chalk.yellow : chalk.red;
397
- console.log(chalk.bold(`Overall: ${overallColor(completeness.overall + '%')} (${completeness.completeElements}/${completeness.totalElements} elements complete)`));
398
- console.log(chalk.gray(`Rules: ${result.rulesEvaluated} evaluated, ${result.rulesPassed} passed, ${result.violations.length} violations\n`));
399
- if (errors.length > 0 || sysmlErrors > 0) {
400
- process.exitCode = 1;
530
+ io.out(chalk.bold(`Overall: ${overallColor(completeness.overall + '%')} (${completeness.completeElements}/${completeness.totalElements} elements complete)`));
531
+ io.out(chalk.gray(`Rules: ${result.rulesEvaluated} evaluated, ${result.rulesPassed} passed, `
532
+ + `${result.rulesVacuous} ran on no subject, ${result.violations.length} violations`));
533
+ const parseErrorFiles = filesWithParseErrors(diagnostics).size;
534
+ io.out((diagnostics.length > 0 ? chalk.red : chalk.gray)(`Parse errors: ${diagnostics.length}`
535
+ + (diagnostics.length > 0
536
+ ? ` in ${parseErrorFiles} file(s) \u2014 this report describes an incomplete model`
537
+ : '')));
538
+ io.out((modelFindings.length > 0 ? chalk.red : chalk.gray)(`Model findings: ${modelFindings.length}`));
539
+ io.out();
540
+ if (failed()) {
541
+ exitCode = 1;
401
542
  }
543
+ return exitCode;
544
+ /**
545
+ * Whether this run is a failure.
546
+ *
547
+ * A parse error counts, and it counts first: a source file the parser
548
+ * rejected cannot produce a success verdict, however healthy the numbers
549
+ * computed from what did load happen to look.
550
+ */
551
+ function failed() {
552
+ return errors.length > 0 || sysmlErrors > 0 || diagnostics.length > 0
553
+ || modelFindings.length > 0 || selectorDiagnostics.length > 0;
554
+ }
555
+ }
556
+ /** Parse errors grouped by the file that produced them. */
557
+ function filesWithParseErrors(parseErrors) {
558
+ const byFile = new Map();
559
+ for (const e of parseErrors)
560
+ byFile.set(e.file, (byFile.get(e.file) ?? 0) + 1);
561
+ return byFile;
562
+ }
563
+ /** How many individual errors are listed before the rest are summarised. */
564
+ const PARSE_ERRORS_LISTED = 10;
565
+ function reportParseErrors(parseErrors, projectRoot, say) {
566
+ if (parseErrors.length === 0)
567
+ return;
568
+ const show = (file) => (file.startsWith(projectRoot) ? relative(projectRoot, file) : file);
569
+ const byFile = filesWithParseErrors(parseErrors);
570
+ say(chalk.red.bold(`\u26d4 ${parseErrors.length} parse error(s) in ${byFile.size} file(s). `
571
+ + 'Whatever those files declare past the error is missing from the model, '
572
+ + 'so every count below is a count of less than the project:'));
573
+ for (const [file, count] of byFile) {
574
+ say(chalk.red(` ${show(file)} (${count})`));
575
+ }
576
+ // GNU one-liners, the same prefix the SysML diagnostics use, so an editor
577
+ // or CI annotator picks them up without knowing anything about MEMO.
578
+ for (const e of parseErrors.slice(0, PARSE_ERRORS_LISTED)) {
579
+ // A message may name a second location of its own — the other half of
580
+ // a short-name collision does — so the same relativization is applied
581
+ // inside it. An absolute path from a build machine is noise in a report
582
+ // read next to relative ones.
583
+ const message = e.message.split(`${projectRoot}/`).join('');
584
+ say(chalk.gray(` ${show(e.file)}:${e.line ?? 1}:${e.column ?? 1}: error: ${message}`));
585
+ }
586
+ if (parseErrors.length > PARSE_ERRORS_LISTED) {
587
+ say(chalk.gray(` \u2026 and ${parseErrors.length - PARSE_ERRORS_LISTED} more`));
588
+ }
589
+ say('');
590
+ }
591
+ /**
592
+ * Print every builder finding on a model that did load.
593
+ *
594
+ * All of them, with no elision, for the reason the selector list has none:
595
+ * each one is an edge to fix, and "and 57 more" is how 67 of them went
596
+ * unread in the first place.
597
+ */
598
+ function reportModelFindings(findings, projectRoot, say) {
599
+ if (findings.length === 0)
600
+ return;
601
+ const show = (file) => (file.startsWith(projectRoot) ? relative(projectRoot, file) : file);
602
+ say(chalk.red.bold(`\u26d4 ${findings.length} model finding(s). The model loaded, and says something `
603
+ + 'the ontology does not allow:'));
604
+ for (const f of findings) {
605
+ const message = f.message.split(`${projectRoot}/`).join('');
606
+ say(chalk.gray(` ${show(f.file)}:${f.line ?? 1}:${f.column ?? 1}: error: ${message} [${f.code}]`));
607
+ }
608
+ say('');
609
+ }
610
+ /**
611
+ * Print every selector that names something no resolved ontology declares.
612
+ *
613
+ * All of them, with no elision: the list is short by construction — a selector
614
+ * is written by hand — and the whole value of the check is that the offending
615
+ * name is spelled out next to where it was written.
616
+ */
617
+ function reportSelectorDiagnostics(selectorDiagnostics, projectRoot, say) {
618
+ if (selectorDiagnostics.length === 0)
619
+ return;
620
+ const show = (file) => (file.startsWith(projectRoot) ? relative(projectRoot, file) : file);
621
+ say(chalk.red.bold(`\u26d4 ${selectorDiagnostics.length} selector(s) name vocabulary no resolved ontology `
622
+ + 'declares. Each one matches nothing, whatever the model contains:'));
623
+ for (const d of selectorDiagnostics) {
624
+ say(chalk.gray(` ${show(d.file)}: error: ${d.message}`));
625
+ }
626
+ say('');
402
627
  }
403
628
  // ─── JUnit XML Generator ─────────────────────────────────────────────────────
404
- function generateJUnit(result, completeness, projectName) {
629
+ function generateJUnit(result, completeness, modelName, parseErrors = [], modelFindings = []) {
405
630
  const escXml = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
406
631
  const errors = result.violations.filter(v => v.severity === 'error');
407
632
  const warnings = result.violations.filter(v => v.severity === 'warning');
408
- const allTests = result.rulesEvaluated;
409
- const failures = errors.length;
410
- const skipped = 0;
633
+ // A file that did not parse is its own failed test. Counted only through
634
+ // the rules, a green suite would report on a model missing the content
635
+ // that file declares.
636
+ const parseErrorFiles = [...filesWithParseErrors(parseErrors)];
637
+ const allTests = result.rulesEvaluated + parseErrorFiles.length + modelFindings.length;
638
+ const failures = errors.length + parseErrorFiles.length + modelFindings.length;
639
+ // A rule that ran on no subject tested nothing. It is reported as skipped
640
+ // so a CI dashboard cannot count it towards the green.
641
+ const skipped = result.rulesVacuous;
411
642
  const lines = [
412
643
  '<?xml version="1.0" encoding="UTF-8"?>',
413
- `<testsuites name="${escXml(projectName)}" tests="${allTests}" failures="${failures}" errors="0" skipped="${skipped}" timestamp="${new Date().toISOString()}">`,
644
+ `<testsuites name="${escXml(modelName)}" tests="${allTests}" failures="${failures}" errors="0" skipped="${skipped}" timestamp="${new Date().toISOString()}">`,
414
645
  ` <testsuite name="closure-rules" tests="${allTests}" failures="${failures}" errors="0" skipped="${skipped}">`,
415
646
  ` <properties>`,
416
647
  ` <property name="completeness" value="${completeness.overall}%" />`,
@@ -418,6 +649,21 @@ function generateJUnit(result, completeness, projectName) {
418
649
  ` <property name="warnings" value="${warnings.length}" />`,
419
650
  ` </properties>`,
420
651
  ];
652
+ for (const [file, count] of parseErrorFiles) {
653
+ const message = `${count} parse error(s); this file's content is missing from the model`;
654
+ lines.push(` <testcase classname="parse" name="${escXml(file)}">`);
655
+ lines.push(` <failure message="${escXml(message)}" type="PARSE_ERROR">`);
656
+ for (const e of parseErrors.filter(e => e.file === file)) {
657
+ lines.push(` ${escXml(`${e.file}:${e.line ?? 1}:${e.column ?? 1}: error: ${e.message}`)}`);
658
+ }
659
+ lines.push(` </failure>`);
660
+ lines.push(` </testcase>`);
661
+ }
662
+ for (const f of modelFindings) {
663
+ lines.push(` <testcase classname="model.${escXml(f.code ?? 'finding')}" name="${escXml(`${f.file}:${f.line ?? 1}`)}">`);
664
+ lines.push(` <failure message="${escXml(f.message)}" type="${escXml(f.code ?? 'MODEL_FINDING')}" />`);
665
+ lines.push(` </testcase>`);
666
+ }
421
667
  // Each violation becomes a test case
422
668
  for (const v of result.violations) {
423
669
  const className = `${v.elementKind}.${escXml(v.elementName)}`;