@transitrix/diagrams 1.0.0

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 (541) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/dist/__tests__/edge-path.test.d.ts +1 -0
  4. package/dist/__tests__/edge-path.test.js +39 -0
  5. package/dist/__tests__/scope.test.d.ts +1 -0
  6. package/dist/__tests__/scope.test.js +23 -0
  7. package/dist/__tests__/yaml-normalize.test.d.ts +1 -0
  8. package/dist/__tests__/yaml-normalize.test.js +148 -0
  9. package/dist/activities/__tests__/cpm.test.d.ts +1 -0
  10. package/dist/activities/__tests__/cpm.test.js +146 -0
  11. package/dist/activities/__tests__/gantt.test.d.ts +1 -0
  12. package/dist/activities/__tests__/gantt.test.js +224 -0
  13. package/dist/activities/__tests__/layout.test.d.ts +1 -0
  14. package/dist/activities/__tests__/layout.test.js +98 -0
  15. package/dist/activities/__tests__/validate.test.d.ts +1 -0
  16. package/dist/activities/__tests__/validate.test.js +363 -0
  17. package/dist/activities/cpm.d.ts +2 -0
  18. package/dist/activities/cpm.js +86 -0
  19. package/dist/activities/gantt.d.ts +6 -0
  20. package/dist/activities/gantt.js +250 -0
  21. package/dist/activities/index.d.ts +5 -0
  22. package/dist/activities/index.js +4 -0
  23. package/dist/activities/layout.d.ts +2 -0
  24. package/dist/activities/layout.js +103 -0
  25. package/dist/activities/types.d.ts +125 -0
  26. package/dist/activities/types.js +1 -0
  27. package/dist/activities/validate.d.ts +2 -0
  28. package/dist/activities/validate.js +326 -0
  29. package/dist/activity-card/__tests__/example.test.d.ts +1 -0
  30. package/dist/activity-card/__tests__/example.test.js +56 -0
  31. package/dist/activity-card/__tests__/layout.test.d.ts +1 -0
  32. package/dist/activity-card/__tests__/layout.test.js +57 -0
  33. package/dist/activity-card/__tests__/resolver.test.d.ts +1 -0
  34. package/dist/activity-card/__tests__/resolver.test.js +146 -0
  35. package/dist/activity-card/__tests__/validate.test.d.ts +1 -0
  36. package/dist/activity-card/__tests__/validate.test.js +116 -0
  37. package/dist/activity-card/index.d.ts +5 -0
  38. package/dist/activity-card/index.js +3 -0
  39. package/dist/activity-card/layout.d.ts +7 -0
  40. package/dist/activity-card/layout.js +167 -0
  41. package/dist/activity-card/resolver.d.ts +7 -0
  42. package/dist/activity-card/resolver.js +310 -0
  43. package/dist/activity-card/types.d.ts +175 -0
  44. package/dist/activity-card/types.js +20 -0
  45. package/dist/activity-card/validate.d.ts +3 -0
  46. package/dist/activity-card/validate.js +145 -0
  47. package/dist/actor/__tests__/validate.test.d.ts +1 -0
  48. package/dist/actor/__tests__/validate.test.js +57 -0
  49. package/dist/actor/index.d.ts +3 -0
  50. package/dist/actor/index.js +2 -0
  51. package/dist/actor/types.d.ts +20 -0
  52. package/dist/actor/types.js +4 -0
  53. package/dist/actor/validate.d.ts +2 -0
  54. package/dist/actor/validate.js +34 -0
  55. package/dist/applications/__tests__/validate.test.d.ts +1 -0
  56. package/dist/applications/__tests__/validate.test.js +223 -0
  57. package/dist/applications/index.d.ts +2 -0
  58. package/dist/applications/index.js +1 -0
  59. package/dist/applications/types.d.ts +39 -0
  60. package/dist/applications/types.js +1 -0
  61. package/dist/applications/validate.d.ts +3 -0
  62. package/dist/applications/validate.js +109 -0
  63. package/dist/assertion/__tests__/example.test.d.ts +1 -0
  64. package/dist/assertion/__tests__/example.test.js +32 -0
  65. package/dist/assertion/__tests__/validate.test.d.ts +1 -0
  66. package/dist/assertion/__tests__/validate.test.js +130 -0
  67. package/dist/assertion/index.d.ts +4 -0
  68. package/dist/assertion/index.js +2 -0
  69. package/dist/assertion/types.d.ts +43 -0
  70. package/dist/assertion/types.js +7 -0
  71. package/dist/assertion/validate.d.ts +9 -0
  72. package/dist/assertion/validate.js +137 -0
  73. package/dist/blocks/__tests__/layout.test.d.ts +1 -0
  74. package/dist/blocks/__tests__/layout.test.js +153 -0
  75. package/dist/blocks/__tests__/validate.test.d.ts +1 -0
  76. package/dist/blocks/__tests__/validate.test.js +235 -0
  77. package/dist/blocks/index.d.ts +4 -0
  78. package/dist/blocks/index.js +2 -0
  79. package/dist/blocks/layout.d.ts +4 -0
  80. package/dist/blocks/layout.js +145 -0
  81. package/dist/blocks/types.d.ts +56 -0
  82. package/dist/blocks/types.js +1 -0
  83. package/dist/blocks/validate.d.ts +9 -0
  84. package/dist/blocks/validate.js +186 -0
  85. package/dist/capability-map/__tests__/validate.test.d.ts +1 -0
  86. package/dist/capability-map/__tests__/validate.test.js +212 -0
  87. package/dist/capability-map/index.d.ts +2 -0
  88. package/dist/capability-map/index.js +1 -0
  89. package/dist/capability-map/types.d.ts +26 -0
  90. package/dist/capability-map/types.js +1 -0
  91. package/dist/capability-map/validate.d.ts +3 -0
  92. package/dist/capability-map/validate.js +103 -0
  93. package/dist/change/__tests__/validate.test.d.ts +1 -0
  94. package/dist/change/__tests__/validate.test.js +73 -0
  95. package/dist/change/index.d.ts +2 -0
  96. package/dist/change/index.js +1 -0
  97. package/dist/change/types.d.ts +17 -0
  98. package/dist/change/types.js +3 -0
  99. package/dist/change/validate.d.ts +2 -0
  100. package/dist/change/validate.js +57 -0
  101. package/dist/compliance/__tests__/classify.test.d.ts +1 -0
  102. package/dist/compliance/__tests__/classify.test.js +24 -0
  103. package/dist/compliance/__tests__/confidence.test.d.ts +1 -0
  104. package/dist/compliance/__tests__/confidence.test.js +78 -0
  105. package/dist/compliance/__tests__/coverage-metric.test.d.ts +1 -0
  106. package/dist/compliance/__tests__/coverage-metric.test.js +164 -0
  107. package/dist/compliance/__tests__/demo-scenario.test.d.ts +1 -0
  108. package/dist/compliance/__tests__/demo-scenario.test.js +226 -0
  109. package/dist/compliance/__tests__/example.test.d.ts +1 -0
  110. package/dist/compliance/__tests__/example.test.js +51 -0
  111. package/dist/compliance/__tests__/gap-report.test.d.ts +1 -0
  112. package/dist/compliance/__tests__/gap-report.test.js +113 -0
  113. package/dist/compliance/__tests__/html.test.d.ts +1 -0
  114. package/dist/compliance/__tests__/html.test.js +122 -0
  115. package/dist/compliance/__tests__/impact.test.d.ts +1 -0
  116. package/dist/compliance/__tests__/impact.test.js +410 -0
  117. package/dist/compliance/__tests__/markdown.test.d.ts +1 -0
  118. package/dist/compliance/__tests__/markdown.test.js +85 -0
  119. package/dist/compliance/__tests__/views.test.d.ts +1 -0
  120. package/dist/compliance/__tests__/views.test.js +59 -0
  121. package/dist/compliance/classify.d.ts +27 -0
  122. package/dist/compliance/classify.js +60 -0
  123. package/dist/compliance/confidence.d.ts +27 -0
  124. package/dist/compliance/confidence.js +43 -0
  125. package/dist/compliance/coverage-metric.d.ts +74 -0
  126. package/dist/compliance/coverage-metric.js +181 -0
  127. package/dist/compliance/gap-report.d.ts +20 -0
  128. package/dist/compliance/gap-report.js +64 -0
  129. package/dist/compliance/html.d.ts +22 -0
  130. package/dist/compliance/html.js +256 -0
  131. package/dist/compliance/impact.d.ts +251 -0
  132. package/dist/compliance/impact.js +464 -0
  133. package/dist/compliance/index.d.ts +16 -0
  134. package/dist/compliance/index.js +9 -0
  135. package/dist/compliance/markdown.d.ts +18 -0
  136. package/dist/compliance/markdown.js +129 -0
  137. package/dist/compliance/reverse-index.d.ts +8 -0
  138. package/dist/compliance/reverse-index.js +30 -0
  139. package/dist/compliance/types.d.ts +98 -0
  140. package/dist/compliance/types.js +5 -0
  141. package/dist/compliance/views.d.ts +14 -0
  142. package/dist/compliance/views.js +35 -0
  143. package/dist/compliance-matrix/__tests__/build.test.d.ts +1 -0
  144. package/dist/compliance-matrix/__tests__/build.test.js +183 -0
  145. package/dist/compliance-matrix/__tests__/example.test.d.ts +1 -0
  146. package/dist/compliance-matrix/__tests__/example.test.js +49 -0
  147. package/dist/compliance-matrix/build.d.ts +18 -0
  148. package/dist/compliance-matrix/build.js +0 -0
  149. package/dist/compliance-matrix/index.d.ts +2 -0
  150. package/dist/compliance-matrix/index.js +1 -0
  151. package/dist/compliance-matrix/types.d.ts +86 -0
  152. package/dist/compliance-matrix/types.js +8 -0
  153. package/dist/confidence/__tests__/score.test.d.ts +1 -0
  154. package/dist/confidence/__tests__/score.test.js +188 -0
  155. package/dist/confidence/index.d.ts +2 -0
  156. package/dist/confidence/index.js +1 -0
  157. package/dist/confidence/score.d.ts +62 -0
  158. package/dist/confidence/score.js +215 -0
  159. package/dist/confidence/types.d.ts +79 -0
  160. package/dist/confidence/types.js +6 -0
  161. package/dist/edge-path.d.ts +18 -0
  162. package/dist/edge-path.js +35 -0
  163. package/dist/element-envelope.d.ts +15 -0
  164. package/dist/element-envelope.js +55 -0
  165. package/dist/factor/__tests__/validate.test.d.ts +1 -0
  166. package/dist/factor/__tests__/validate.test.js +83 -0
  167. package/dist/factor/index.d.ts +3 -0
  168. package/dist/factor/index.js +2 -0
  169. package/dist/factor/types.d.ts +23 -0
  170. package/dist/factor/types.js +6 -0
  171. package/dist/factor/validate.d.ts +2 -0
  172. package/dist/factor/validate.js +69 -0
  173. package/dist/fgca/__tests__/chain-table.test.d.ts +1 -0
  174. package/dist/fgca/__tests__/chain-table.test.js +158 -0
  175. package/dist/fgca/__tests__/layout.test.d.ts +1 -0
  176. package/dist/fgca/__tests__/layout.test.js +140 -0
  177. package/dist/fgca/__tests__/parse-canonical.test.d.ts +1 -0
  178. package/dist/fgca/__tests__/parse-canonical.test.js +224 -0
  179. package/dist/fgca/__tests__/preview-layout.test.d.ts +1 -0
  180. package/dist/fgca/__tests__/preview-layout.test.js +106 -0
  181. package/dist/fgca/__tests__/validate.test.d.ts +1 -0
  182. package/dist/fgca/__tests__/validate.test.js +125 -0
  183. package/dist/fgca/chain-table.d.ts +36 -0
  184. package/dist/fgca/chain-table.js +177 -0
  185. package/dist/fgca/index.d.ts +16 -0
  186. package/dist/fgca/index.js +11 -0
  187. package/dist/fgca/layout.d.ts +27 -0
  188. package/dist/fgca/layout.js +156 -0
  189. package/dist/fgca/nodeTypes.d.ts +6 -0
  190. package/dist/fgca/nodeTypes.js +10 -0
  191. package/dist/fgca/nodes/FGCAActivityNode.d.ts +13 -0
  192. package/dist/fgca/nodes/FGCAActivityNode.js +35 -0
  193. package/dist/fgca/nodes/FGCAChangeNode.d.ts +12 -0
  194. package/dist/fgca/nodes/FGCAChangeNode.js +35 -0
  195. package/dist/fgca/nodes/FGCAFactorNode.d.ts +12 -0
  196. package/dist/fgca/nodes/FGCAFactorNode.js +35 -0
  197. package/dist/fgca/nodes/FGCAGoalNode.d.ts +14 -0
  198. package/dist/fgca/nodes/FGCAGoalNode.js +40 -0
  199. package/dist/fgca/parse-canonical.d.ts +58 -0
  200. package/dist/fgca/parse-canonical.js +339 -0
  201. package/dist/fgca/preview-layout.d.ts +87 -0
  202. package/dist/fgca/preview-layout.js +122 -0
  203. package/dist/fgca/types.d.ts +39 -0
  204. package/dist/fgca/types.js +7 -0
  205. package/dist/fgca/validate.d.ts +14 -0
  206. package/dist/fgca/validate.js +108 -0
  207. package/dist/geometry.d.ts +7 -0
  208. package/dist/geometry.js +2 -0
  209. package/dist/goals/__tests__/layout.test.d.ts +1 -0
  210. package/dist/goals/__tests__/layout.test.js +153 -0
  211. package/dist/goals/__tests__/mutations.test.d.ts +1 -0
  212. package/dist/goals/__tests__/mutations.test.js +95 -0
  213. package/dist/goals/__tests__/parse-canonical.test.d.ts +1 -0
  214. package/dist/goals/__tests__/parse-canonical.test.js +129 -0
  215. package/dist/goals/__tests__/validate.test.d.ts +1 -0
  216. package/dist/goals/__tests__/validate.test.js +183 -0
  217. package/dist/goals/index.d.ts +6 -0
  218. package/dist/goals/index.js +4 -0
  219. package/dist/goals/layout.d.ts +11 -0
  220. package/dist/goals/layout.js +147 -0
  221. package/dist/goals/mutations.d.ts +6 -0
  222. package/dist/goals/mutations.js +116 -0
  223. package/dist/goals/parse-canonical.d.ts +29 -0
  224. package/dist/goals/parse-canonical.js +257 -0
  225. package/dist/goals/types.d.ts +71 -0
  226. package/dist/goals/types.js +1 -0
  227. package/dist/goals/validate.d.ts +2 -0
  228. package/dist/goals/validate.js +122 -0
  229. package/dist/index.d.ts +23 -0
  230. package/dist/index.js +23 -0
  231. package/dist/issues/__tests__/layout.test.d.ts +1 -0
  232. package/dist/issues/__tests__/layout.test.js +62 -0
  233. package/dist/issues/__tests__/validate.test.d.ts +1 -0
  234. package/dist/issues/__tests__/validate.test.js +82 -0
  235. package/dist/issues/index.d.ts +4 -0
  236. package/dist/issues/index.js +2 -0
  237. package/dist/issues/layout.d.ts +10 -0
  238. package/dist/issues/layout.js +82 -0
  239. package/dist/issues/types.d.ts +61 -0
  240. package/dist/issues/types.js +6 -0
  241. package/dist/issues/validate.d.ts +3 -0
  242. package/dist/issues/validate.js +143 -0
  243. package/dist/process-blueprint/__tests__/compliance-lane.test.d.ts +1 -0
  244. package/dist/process-blueprint/__tests__/compliance-lane.test.js +272 -0
  245. package/dist/process-blueprint/__tests__/layout.test.d.ts +1 -0
  246. package/dist/process-blueprint/__tests__/layout.test.js +159 -0
  247. package/dist/process-blueprint/__tests__/validate.test.d.ts +1 -0
  248. package/dist/process-blueprint/__tests__/validate.test.js +280 -0
  249. package/dist/process-blueprint/index.d.ts +4 -0
  250. package/dist/process-blueprint/index.js +2 -0
  251. package/dist/process-blueprint/layout.d.ts +2 -0
  252. package/dist/process-blueprint/layout.js +416 -0
  253. package/dist/process-blueprint/types.d.ts +220 -0
  254. package/dist/process-blueprint/types.js +1 -0
  255. package/dist/process-blueprint/validate.d.ts +3 -0
  256. package/dist/process-blueprint/validate.js +165 -0
  257. package/dist/process-map/__tests__/validate.test.d.ts +1 -0
  258. package/dist/process-map/__tests__/validate.test.js +199 -0
  259. package/dist/process-map/index.d.ts +2 -0
  260. package/dist/process-map/index.js +1 -0
  261. package/dist/process-map/types.d.ts +32 -0
  262. package/dist/process-map/types.js +1 -0
  263. package/dist/process-map/validate.d.ts +3 -0
  264. package/dist/process-map/validate.js +115 -0
  265. package/dist/products/__tests__/validate.test.d.ts +1 -0
  266. package/dist/products/__tests__/validate.test.js +210 -0
  267. package/dist/products/index.d.ts +2 -0
  268. package/dist/products/index.js +1 -0
  269. package/dist/products/types.d.ts +28 -0
  270. package/dist/products/types.js +1 -0
  271. package/dist/products/validate.d.ts +3 -0
  272. package/dist/products/validate.js +93 -0
  273. package/dist/repo-validate/__tests__/validate-repo.test.d.ts +1 -0
  274. package/dist/repo-validate/__tests__/validate-repo.test.js +132 -0
  275. package/dist/repo-validate/index.d.ts +2 -0
  276. package/dist/repo-validate/index.js +1 -0
  277. package/dist/repo-validate/types.d.ts +34 -0
  278. package/dist/repo-validate/types.js +14 -0
  279. package/dist/repo-validate/validate-repo.d.ts +8 -0
  280. package/dist/repo-validate/validate-repo.js +189 -0
  281. package/dist/requirement/__tests__/example.test.d.ts +1 -0
  282. package/dist/requirement/__tests__/example.test.js +21 -0
  283. package/dist/requirement/__tests__/validate.test.d.ts +1 -0
  284. package/dist/requirement/__tests__/validate.test.js +80 -0
  285. package/dist/requirement/index.d.ts +4 -0
  286. package/dist/requirement/index.js +2 -0
  287. package/dist/requirement/types.d.ts +25 -0
  288. package/dist/requirement/types.js +4 -0
  289. package/dist/requirement/validate.d.ts +7 -0
  290. package/dist/requirement/validate.js +81 -0
  291. package/dist/scenarios/__tests__/validate.test.d.ts +1 -0
  292. package/dist/scenarios/__tests__/validate.test.js +183 -0
  293. package/dist/scenarios/index.d.ts +2 -0
  294. package/dist/scenarios/index.js +1 -0
  295. package/dist/scenarios/types.d.ts +45 -0
  296. package/dist/scenarios/types.js +1 -0
  297. package/dist/scenarios/validate.d.ts +3 -0
  298. package/dist/scenarios/validate.js +110 -0
  299. package/dist/schema-version.d.ts +16 -0
  300. package/dist/schema-version.js +16 -0
  301. package/dist/scope.d.ts +23 -0
  302. package/dist/scope.js +38 -0
  303. package/dist/stakeholder/__tests__/validate.test.d.ts +1 -0
  304. package/dist/stakeholder/__tests__/validate.test.js +86 -0
  305. package/dist/stakeholder/index.d.ts +3 -0
  306. package/dist/stakeholder/index.js +2 -0
  307. package/dist/stakeholder/types.d.ts +24 -0
  308. package/dist/stakeholder/types.js +5 -0
  309. package/dist/stakeholder/validate.d.ts +2 -0
  310. package/dist/stakeholder/validate.js +58 -0
  311. package/dist/target-state/__tests__/validate.test.d.ts +1 -0
  312. package/dist/target-state/__tests__/validate.test.js +62 -0
  313. package/dist/target-state/index.d.ts +2 -0
  314. package/dist/target-state/index.js +1 -0
  315. package/dist/target-state/types.d.ts +18 -0
  316. package/dist/target-state/types.js +7 -0
  317. package/dist/target-state/validate.d.ts +2 -0
  318. package/dist/target-state/validate.js +61 -0
  319. package/dist/theme/index.d.ts +4 -0
  320. package/dist/theme/index.js +2 -0
  321. package/dist/theme/themes.d.ts +16 -0
  322. package/dist/theme/themes.js +213 -0
  323. package/dist/theme/tokens.d.ts +158 -0
  324. package/dist/theme/tokens.js +105 -0
  325. package/dist/typed-id.d.ts +20 -0
  326. package/dist/typed-id.js +38 -0
  327. package/dist/validation-types.d.ts +34 -0
  328. package/dist/validation-types.js +1 -0
  329. package/dist/webview/__tests__/entry-notations.test.d.ts +1 -0
  330. package/dist/webview/__tests__/entry-notations.test.js +62 -0
  331. package/dist/webview/__tests__/entry.test.d.ts +1 -0
  332. package/dist/webview/__tests__/entry.test.js +56 -0
  333. package/dist/webview/__tests__/render-goals.test.d.ts +1 -0
  334. package/dist/webview/__tests__/render-goals.test.js +65 -0
  335. package/dist/webview/entry.d.ts +38 -0
  336. package/dist/webview/entry.js +182 -0
  337. package/dist/webview/render-activities.d.ts +24 -0
  338. package/dist/webview/render-activities.js +127 -0
  339. package/dist/webview/render-activity-card.d.ts +5 -0
  340. package/dist/webview/render-activity-card.js +168 -0
  341. package/dist/webview/render-applications.d.ts +11 -0
  342. package/dist/webview/render-applications.js +105 -0
  343. package/dist/webview/render-blocks.d.ts +5 -0
  344. package/dist/webview/render-blocks.js +71 -0
  345. package/dist/webview/render-capability-map.d.ts +7 -0
  346. package/dist/webview/render-capability-map.js +88 -0
  347. package/dist/webview/render-fgca.d.ts +8 -0
  348. package/dist/webview/render-fgca.js +94 -0
  349. package/dist/webview/render-goals.d.ts +6 -0
  350. package/dist/webview/render-goals.js +92 -0
  351. package/dist/webview/render-process-blueprint.d.ts +5 -0
  352. package/dist/webview/render-process-blueprint.js +135 -0
  353. package/dist/webview/render-process-map.d.ts +7 -0
  354. package/dist/webview/render-process-map.js +82 -0
  355. package/dist/webview/render-products.d.ts +7 -0
  356. package/dist/webview/render-products.js +81 -0
  357. package/dist/webview/render-scenarios.d.ts +7 -0
  358. package/dist/webview/render-scenarios.js +75 -0
  359. package/dist/webview/render-util.d.ts +16 -0
  360. package/dist/webview/render-util.js +31 -0
  361. package/dist/webview/transitrix-render.css +323 -0
  362. package/dist/webview/transitrix-render.js +6452 -0
  363. package/dist/webview/transitrix-render.js.map +7 -0
  364. package/dist/yaml-normalize.d.ts +20 -0
  365. package/dist/yaml-normalize.js +57 -0
  366. package/package.json +40 -0
  367. package/src/__tests__/edge-path.test.ts +46 -0
  368. package/src/__tests__/scope.test.ts +27 -0
  369. package/src/__tests__/yaml-normalize.test.ts +158 -0
  370. package/src/activities/__tests__/cpm.test.ts +164 -0
  371. package/src/activities/__tests__/gantt.test.ts +245 -0
  372. package/src/activities/__tests__/layout.test.ts +112 -0
  373. package/src/activities/__tests__/validate.test.ts +409 -0
  374. package/src/activities/cpm.ts +95 -0
  375. package/src/activities/gantt.ts +276 -0
  376. package/src/activities/index.ts +28 -0
  377. package/src/activities/layout.ts +112 -0
  378. package/src/activities/types.ts +148 -0
  379. package/src/activities/validate.ts +357 -0
  380. package/src/activity-card/__tests__/example.test.ts +66 -0
  381. package/src/activity-card/__tests__/layout.test.ts +63 -0
  382. package/src/activity-card/__tests__/resolver.test.ts +161 -0
  383. package/src/activity-card/__tests__/validate.test.ts +131 -0
  384. package/src/activity-card/index.ts +32 -0
  385. package/src/activity-card/layout.ts +194 -0
  386. package/src/activity-card/resolver.ts +337 -0
  387. package/src/activity-card/types.ts +237 -0
  388. package/src/activity-card/validate.ts +158 -0
  389. package/src/actor/__tests__/validate.test.ts +67 -0
  390. package/src/actor/index.ts +3 -0
  391. package/src/actor/types.ts +29 -0
  392. package/src/actor/validate.ts +38 -0
  393. package/src/applications/__tests__/validate.test.ts +256 -0
  394. package/src/applications/index.ts +11 -0
  395. package/src/applications/types.ts +43 -0
  396. package/src/applications/validate.ts +131 -0
  397. package/src/assertion/__tests__/example.test.ts +37 -0
  398. package/src/assertion/__tests__/validate.test.ts +142 -0
  399. package/src/assertion/index.ts +12 -0
  400. package/src/assertion/types.ts +58 -0
  401. package/src/assertion/validate.ts +145 -0
  402. package/src/blocks/__tests__/layout.test.ts +169 -0
  403. package/src/blocks/__tests__/validate.test.ts +260 -0
  404. package/src/blocks/index.ts +17 -0
  405. package/src/blocks/layout.ts +186 -0
  406. package/src/blocks/types.ts +62 -0
  407. package/src/blocks/validate.ts +206 -0
  408. package/src/capability-map/__tests__/validate.test.ts +238 -0
  409. package/src/capability-map/index.ts +8 -0
  410. package/src/capability-map/types.ts +29 -0
  411. package/src/capability-map/validate.ts +127 -0
  412. package/src/change/__tests__/validate.test.ts +88 -0
  413. package/src/change/index.ts +2 -0
  414. package/src/change/types.ts +23 -0
  415. package/src/change/validate.ts +61 -0
  416. package/src/compliance/__tests__/classify.test.ts +27 -0
  417. package/src/compliance/__tests__/confidence.test.ts +98 -0
  418. package/src/compliance/__tests__/coverage-metric.test.ts +188 -0
  419. package/src/compliance/__tests__/demo-scenario.test.ts +273 -0
  420. package/src/compliance/__tests__/example.test.ts +57 -0
  421. package/src/compliance/__tests__/gap-report.test.ts +129 -0
  422. package/src/compliance/__tests__/html.test.ts +142 -0
  423. package/src/compliance/__tests__/impact.test.ts +482 -0
  424. package/src/compliance/__tests__/markdown.test.ts +95 -0
  425. package/src/compliance/__tests__/views.test.ts +64 -0
  426. package/src/compliance/classify.ts +84 -0
  427. package/src/compliance/confidence.ts +69 -0
  428. package/src/compliance/coverage-metric.ts +263 -0
  429. package/src/compliance/gap-report.ts +94 -0
  430. package/src/compliance/html.ts +295 -0
  431. package/src/compliance/impact.ts +677 -0
  432. package/src/compliance/index.ts +56 -0
  433. package/src/compliance/markdown.ts +135 -0
  434. package/src/compliance/reverse-index.ts +33 -0
  435. package/src/compliance/types.ts +120 -0
  436. package/src/compliance/views.ts +46 -0
  437. package/src/compliance-matrix/__tests__/build.test.ts +200 -0
  438. package/src/compliance-matrix/__tests__/example.test.ts +57 -0
  439. package/src/compliance-matrix/build.ts +0 -0
  440. package/src/compliance-matrix/index.ts +11 -0
  441. package/src/compliance-matrix/types.ts +102 -0
  442. package/src/confidence/__tests__/score.test.ts +254 -0
  443. package/src/confidence/index.ts +21 -0
  444. package/src/confidence/score.ts +243 -0
  445. package/src/confidence/types.ts +96 -0
  446. package/src/edge-path.ts +44 -0
  447. package/src/element-envelope.ts +76 -0
  448. package/src/factor/__tests__/validate.test.ts +98 -0
  449. package/src/factor/index.ts +8 -0
  450. package/src/factor/types.ts +41 -0
  451. package/src/factor/validate.ts +74 -0
  452. package/src/fgca/__tests__/chain-table.test.ts +172 -0
  453. package/src/fgca/__tests__/layout.test.ts +179 -0
  454. package/src/fgca/__tests__/parse-canonical.test.ts +248 -0
  455. package/src/fgca/__tests__/preview-layout.test.ts +124 -0
  456. package/src/fgca/__tests__/validate.test.ts +142 -0
  457. package/src/fgca/chain-table.ts +225 -0
  458. package/src/fgca/index.ts +45 -0
  459. package/src/fgca/layout.ts +204 -0
  460. package/src/fgca/nodeTypes.ts +11 -0
  461. package/src/fgca/nodes/FGCAActivityNode.tsx +65 -0
  462. package/src/fgca/nodes/FGCAChangeNode.tsx +64 -0
  463. package/src/fgca/nodes/FGCAFactorNode.tsx +64 -0
  464. package/src/fgca/nodes/FGCAGoalNode.tsx +72 -0
  465. package/src/fgca/parse-canonical.ts +400 -0
  466. package/src/fgca/preview-layout.ts +217 -0
  467. package/src/fgca/types.ts +50 -0
  468. package/src/fgca/validate.ts +126 -0
  469. package/src/geometry.ts +9 -0
  470. package/src/goals/__tests__/layout.test.ts +175 -0
  471. package/src/goals/__tests__/mutations.test.ts +111 -0
  472. package/src/goals/__tests__/parse-canonical.test.ts +145 -0
  473. package/src/goals/__tests__/validate.test.ts +202 -0
  474. package/src/goals/index.ts +21 -0
  475. package/src/goals/layout.ts +172 -0
  476. package/src/goals/mutations.ts +123 -0
  477. package/src/goals/parse-canonical.ts +286 -0
  478. package/src/goals/types.ts +85 -0
  479. package/src/goals/validate.ts +136 -0
  480. package/src/index.ts +23 -0
  481. package/src/process-blueprint/__tests__/compliance-lane.test.ts +320 -0
  482. package/src/process-blueprint/__tests__/layout.test.ts +195 -0
  483. package/src/process-blueprint/__tests__/validate.test.ts +310 -0
  484. package/src/process-blueprint/index.ts +31 -0
  485. package/src/process-blueprint/layout.ts +531 -0
  486. package/src/process-blueprint/types.ts +242 -0
  487. package/src/process-blueprint/validate.ts +181 -0
  488. package/src/process-map/__tests__/validate.test.ts +223 -0
  489. package/src/process-map/index.ts +10 -0
  490. package/src/process-map/types.ts +36 -0
  491. package/src/process-map/validate.ts +135 -0
  492. package/src/products/__tests__/validate.test.ts +239 -0
  493. package/src/products/index.ts +9 -0
  494. package/src/products/types.ts +31 -0
  495. package/src/products/validate.ts +112 -0
  496. package/src/repo-validate/__tests__/validate-repo.test.ts +149 -0
  497. package/src/repo-validate/index.ts +2 -0
  498. package/src/repo-validate/types.ts +50 -0
  499. package/src/repo-validate/validate-repo.ts +196 -0
  500. package/src/requirement/__tests__/example.test.ts +24 -0
  501. package/src/requirement/__tests__/validate.test.ts +96 -0
  502. package/src/requirement/index.ts +4 -0
  503. package/src/requirement/types.ts +35 -0
  504. package/src/requirement/validate.ts +92 -0
  505. package/src/scenarios/__tests__/validate.test.ts +209 -0
  506. package/src/scenarios/index.ts +15 -0
  507. package/src/scenarios/types.ts +37 -0
  508. package/src/scenarios/validate.ts +122 -0
  509. package/src/schema-version.ts +16 -0
  510. package/src/scope.ts +46 -0
  511. package/src/stakeholder/__tests__/validate.test.ts +101 -0
  512. package/src/stakeholder/index.ts +3 -0
  513. package/src/stakeholder/types.ts +33 -0
  514. package/src/stakeholder/validate.ts +63 -0
  515. package/src/target-state/__tests__/validate.test.ts +74 -0
  516. package/src/target-state/index.ts +2 -0
  517. package/src/target-state/types.ts +28 -0
  518. package/src/target-state/validate.ts +67 -0
  519. package/src/theme/index.ts +4 -0
  520. package/src/theme/themes.ts +237 -0
  521. package/src/theme/tokens.ts +133 -0
  522. package/src/typed-id.ts +56 -0
  523. package/src/validation-types.ts +36 -0
  524. package/src/webview/__tests__/entry-notations.test.ts +77 -0
  525. package/src/webview/__tests__/entry.test.ts +64 -0
  526. package/src/webview/__tests__/render-goals.test.ts +72 -0
  527. package/src/webview/entry.ts +292 -0
  528. package/src/webview/render-activities.ts +156 -0
  529. package/src/webview/render-activity-card.ts +234 -0
  530. package/src/webview/render-applications.ts +123 -0
  531. package/src/webview/render-blocks.ts +91 -0
  532. package/src/webview/render-capability-map.ts +98 -0
  533. package/src/webview/render-fgca.ts +122 -0
  534. package/src/webview/render-goals.ts +110 -0
  535. package/src/webview/render-process-blueprint.ts +207 -0
  536. package/src/webview/render-process-map.ts +93 -0
  537. package/src/webview/render-products.ts +91 -0
  538. package/src/webview/render-scenarios.ts +90 -0
  539. package/src/webview/render-util.ts +34 -0
  540. package/src/webview/styles.css +323 -0
  541. package/src/yaml-normalize.ts +56 -0
@@ -0,0 +1,45 @@
1
+ export type ScenarioStatus = 'Draft' | 'Active' | 'Archived';
2
+ export type FactorRelevance = 'High' | 'Medium' | 'Low';
3
+ export interface FactorView {
4
+ factor_id: string;
5
+ relevance?: FactorRelevance;
6
+ impact?: string;
7
+ }
8
+ export interface GoalRef {
9
+ goal_id: string;
10
+ }
11
+ export interface CapabilityRef {
12
+ capability_id: string;
13
+ }
14
+ export interface ActivityRef {
15
+ activity_id: string;
16
+ }
17
+ export interface ProductRef {
18
+ product_id: string;
19
+ }
20
+ export interface ProcessRef {
21
+ process_id: string;
22
+ }
23
+ export interface ApplicationRef {
24
+ app_id: string;
25
+ }
26
+ export interface ScenarioHeader {
27
+ id: string;
28
+ name: string;
29
+ description?: string;
30
+ status: ScenarioStatus;
31
+ created_at?: string;
32
+ vision?: string;
33
+ factors_view?: FactorView[];
34
+ goals?: GoalRef[];
35
+ capabilities?: CapabilityRef[];
36
+ activities?: ActivityRef[];
37
+ products?: ProductRef[];
38
+ processes?: ProcessRef[];
39
+ applications?: ApplicationRef[];
40
+ }
41
+ export interface ScenarioFile {
42
+ notation: string;
43
+ spec_version?: string;
44
+ scenario: ScenarioHeader;
45
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { ValidationError, ValidationWarning, ValidationResult } from '../validation-types.js';
2
+ export type { ValidationError, ValidationWarning, ValidationResult };
3
+ export declare function validateScenario(input: unknown): ValidationResult;
@@ -0,0 +1,110 @@
1
+ const VALID_STATUSES = new Set(['Draft', 'Active', 'Archived']);
2
+ const VALID_RELEVANCE = new Set(['High', 'Medium', 'Low']);
3
+ const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
4
+ const REF_SPECS = [
5
+ { field: 'goals', idField: 'goal_id', errorCode: 'SCN-007' },
6
+ { field: 'capabilities', idField: 'capability_id', errorCode: 'SCN-008' },
7
+ { field: 'activities', idField: 'activity_id', errorCode: 'SCN-009' },
8
+ { field: 'products', idField: 'product_id', errorCode: 'SCN-010' },
9
+ { field: 'processes', idField: 'process_id', errorCode: 'SCN-011' },
10
+ { field: 'applications', idField: 'app_id', errorCode: 'SCN-012' },
11
+ ];
12
+ export function validateScenario(input) {
13
+ const errors = [];
14
+ const warnings = [];
15
+ if (!input || typeof input !== 'object') {
16
+ return { valid: false, errors: [{ code: 'SCN-001', message: 'Input must be an object' }], warnings };
17
+ }
18
+ const raw = input;
19
+ if (!('notation' in raw)) {
20
+ errors.push({ code: 'SCN-001', message: 'Missing required field: notation' });
21
+ }
22
+ else if (raw['notation'] !== 'scenarios') {
23
+ errors.push({ code: 'SCN-001', message: `notation must be "scenarios", got "${raw['notation']}"` });
24
+ }
25
+ if (errors.length > 0)
26
+ return { valid: false, errors, warnings };
27
+ const scn = raw['scenario'];
28
+ if (!scn || typeof scn !== 'object') {
29
+ errors.push({ code: 'SCN-002', message: 'Missing required field: scenario' });
30
+ return { valid: false, errors, warnings };
31
+ }
32
+ const s = scn;
33
+ if (!s['id'] || typeof s['id'] !== 'string' || !s['id'].trim())
34
+ errors.push({ code: 'SCN-002', message: 'scenario.id is required' });
35
+ if (!s['name'] || typeof s['name'] !== 'string' || !s['name'].trim())
36
+ errors.push({ code: 'SCN-002', message: 'scenario.name is required' });
37
+ if (!s['status']) {
38
+ errors.push({ code: 'SCN-002', message: 'scenario.status is required' });
39
+ }
40
+ else if (!VALID_STATUSES.has(s['status'])) {
41
+ errors.push({ code: 'SCN-003', message: `scenario.status "${s['status']}" must be one of: Draft, Active, Archived` });
42
+ }
43
+ if (errors.length > 0)
44
+ return { valid: false, errors, warnings };
45
+ if (s['created_at'] !== undefined) {
46
+ if (typeof s['created_at'] !== 'string' || !DATE_RE.test(s['created_at'])) {
47
+ errors.push({ code: 'SCN-004', message: `scenario.created_at must be YYYY-MM-DD, got "${s['created_at']}"` });
48
+ }
49
+ }
50
+ if (s['factors_view'] !== undefined) {
51
+ if (!Array.isArray(s['factors_view'])) {
52
+ errors.push({ code: 'SCN-005', message: 'scenario.factors_view must be an array' });
53
+ }
54
+ else {
55
+ const seen = new Set();
56
+ const fv = s['factors_view'];
57
+ for (let i = 0; i < fv.length; i++) {
58
+ const rawFactor = fv[i];
59
+ const idx = `factors_view[${i}]`;
60
+ if (!rawFactor || typeof rawFactor !== 'object') {
61
+ errors.push({ code: 'SCN-005', message: `${idx} must be an object` });
62
+ continue;
63
+ }
64
+ const f = rawFactor;
65
+ if (!f['factor_id'] || typeof f['factor_id'] !== 'string' || !f['factor_id'].trim()) {
66
+ errors.push({ code: 'SCN-005', message: `${idx}: factor_id is required` });
67
+ }
68
+ else {
69
+ const fid = f['factor_id'];
70
+ if (seen.has(fid))
71
+ errors.push({ code: 'SCN-013', message: `Duplicate factor_id: "${fid}"` });
72
+ seen.add(fid);
73
+ }
74
+ if (f['relevance'] !== undefined && !VALID_RELEVANCE.has(f['relevance'])) {
75
+ errors.push({ code: 'SCN-006', message: `${idx}: relevance "${f['relevance']}" must be one of: High, Medium, Low` });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ for (const spec of REF_SPECS) {
81
+ const list = s[spec.field];
82
+ if (list === undefined)
83
+ continue;
84
+ if (!Array.isArray(list)) {
85
+ errors.push({ code: spec.errorCode, message: `scenario.${spec.field} must be an array` });
86
+ continue;
87
+ }
88
+ const seen = new Set();
89
+ for (let i = 0; i < list.length; i++) {
90
+ const rawItem = list[i];
91
+ const idx = `${spec.field}[${i}]`;
92
+ if (!rawItem || typeof rawItem !== 'object') {
93
+ errors.push({ code: spec.errorCode, message: `${idx} must be an object` });
94
+ continue;
95
+ }
96
+ const item = rawItem;
97
+ const id = item[spec.idField];
98
+ if (!id || typeof id !== 'string' || !id.trim()) {
99
+ errors.push({ code: spec.errorCode, message: `${idx}: ${spec.idField} is required` });
100
+ }
101
+ else {
102
+ const sid = id;
103
+ if (seen.has(sid))
104
+ errors.push({ code: spec.errorCode, message: `${idx}: duplicate ${spec.idField} "${sid}"` });
105
+ seen.add(sid);
106
+ }
107
+ }
108
+ }
109
+ return { valid: errors.length === 0, errors, warnings };
110
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SCHEMA_VERSION — the methodology release whose notation schemas and validation
3
+ * rules this `@transitrix/diagrams` build conforms to (SV-1).
4
+ *
5
+ * Source of truth: the methodology `methodology_version`, declared in an adopter
6
+ * repository's `transitrix.yaml` per the methodology `notations/MANIFEST.md`
7
+ * (single source of truth for a repo's conformance). The current methodology
8
+ * release is **0.5.0**.
9
+ *
10
+ * This constant is kept in lockstep with the project manifest's
11
+ * `transitrix.methodologyVersion` (`package.json`); the
12
+ * `tests/schema-version.test.ts` unit test asserts the two are equal. A CI guard
13
+ * that additionally asserts both equal the methodology's published SoT lands
14
+ * separately (SV-1 PR2) — do not bundle it here.
15
+ */
16
+ export declare const SCHEMA_VERSION = "0.5.0";
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SCHEMA_VERSION — the methodology release whose notation schemas and validation
3
+ * rules this `@transitrix/diagrams` build conforms to (SV-1).
4
+ *
5
+ * Source of truth: the methodology `methodology_version`, declared in an adopter
6
+ * repository's `transitrix.yaml` per the methodology `notations/MANIFEST.md`
7
+ * (single source of truth for a repo's conformance). The current methodology
8
+ * release is **0.5.0**.
9
+ *
10
+ * This constant is kept in lockstep with the project manifest's
11
+ * `transitrix.methodologyVersion` (`package.json`); the
12
+ * `tests/schema-version.test.ts` unit test asserts the two are equal. A CI guard
13
+ * that additionally asserts both equal the methodology's published SoT lands
14
+ * separately (SV-1 PR2) — do not bundle it here.
15
+ */
16
+ export const SCHEMA_VERSION = '0.5.0';
@@ -0,0 +1,23 @@
1
+ import type { ValidationWarning } from './validation-types.js';
2
+ export type Scope = {
3
+ mode: 'all';
4
+ } | {
5
+ mode: 'level';
6
+ maxLevel: number;
7
+ } | {
8
+ mode: 'root';
9
+ rootGoalId: string;
10
+ };
11
+ /** Default scope — render everything. */
12
+ export declare const SCOPE_ALL: Scope;
13
+ /** Warning code emitted when a root-mode scope names a goal that isn't in the document. */
14
+ export declare const SCOPE_MISSING_ROOT_CODE = "SCOPE-001";
15
+ /**
16
+ * Returns the SCOPE-001 warning when `scope` is root-mode and `rootGoalId` is
17
+ * not among the document's goal ids; otherwise null. Goal ids are compared as
18
+ * strings so numeric (FGCA/Goals) and string ids both work.
19
+ *
20
+ * Previews call this to surface the warning in their panel — the layout
21
+ * functions independently return an empty layout in the same situation.
22
+ */
23
+ export declare function checkScopeRoot(scope: Scope, goalIds: Iterable<string | number>): ValidationWarning | null;
package/dist/scope.js ADDED
@@ -0,0 +1,38 @@
1
+ // Scope filtering for hierarchical / relational previews (Goals, FGA, FGCA).
2
+ //
3
+ // A `Scope` trims what a preview renders to part of the hierarchy:
4
+ // - 'all' → everything (default, today's behaviour)
5
+ // - 'level' → only goals at or below a level cap, plus the factors /
6
+ // changes / activities that touch a visible goal
7
+ // - 'root' → only a chosen goal's subtree (Goals: descendants via
8
+ // parent_id; FGA/FGCA goals are flat, so the subtree is the
9
+ // single root goal), plus its connected factors / changes /
10
+ // activities
11
+ //
12
+ // This is intentionally a small, pure rendering primitive: a role's view in
13
+ // a future access-control layer (DSM) can be expressed as a level cap or a
14
+ // subtree root and reuse exactly this filter. No RBAC here — just the filter.
15
+ /** Default scope — render everything. */
16
+ export const SCOPE_ALL = { mode: 'all' };
17
+ /** Warning code emitted when a root-mode scope names a goal that isn't in the document. */
18
+ export const SCOPE_MISSING_ROOT_CODE = 'SCOPE-001';
19
+ /**
20
+ * Returns the SCOPE-001 warning when `scope` is root-mode and `rootGoalId` is
21
+ * not among the document's goal ids; otherwise null. Goal ids are compared as
22
+ * strings so numeric (FGCA/Goals) and string ids both work.
23
+ *
24
+ * Previews call this to surface the warning in their panel — the layout
25
+ * functions independently return an empty layout in the same situation.
26
+ */
27
+ export function checkScopeRoot(scope, goalIds) {
28
+ if (scope.mode !== 'root')
29
+ return null;
30
+ for (const id of goalIds) {
31
+ if (String(id) === scope.rootGoalId)
32
+ return null;
33
+ }
34
+ return {
35
+ code: SCOPE_MISSING_ROOT_CODE,
36
+ message: `Scope root goal "${scope.rootGoalId}" was not found in this document — nothing to show. Clear the scope or pick a goal that exists.`,
37
+ };
38
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,86 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { validateStakeholder } from '../validate.js';
3
+ function valid() {
4
+ return {
5
+ notation: 'stakeholder',
6
+ id: 'STAKEHOLDER-DPA-1',
7
+ name: 'Data Protection Authority',
8
+ type: 'external',
9
+ actor: 'ACTOR-DPA-1',
10
+ concern: 'Lawful processing and timely erasure of EU customer personal data.',
11
+ interest: 'high',
12
+ influence: 'high',
13
+ description: 'External oversight stakeholder.',
14
+ zone: 'canon',
15
+ admitted_at: '2026-05-29',
16
+ admitted_by: 'v.korobeinikov',
17
+ gate_checks: { uniqueness: 'pass', consistency: 'pass', completeness: 'pass' },
18
+ valid_from: '2018-05-25',
19
+ valid_to: null,
20
+ };
21
+ }
22
+ const codes = (input) => validateStakeholder(input).errors.map(e => e.code);
23
+ describe('validateStakeholder — positive', () => {
24
+ it('accepts the worked-example STAKEHOLDER-DPA-1', () => {
25
+ const r = validateStakeholder(valid());
26
+ expect(r.valid, JSON.stringify(r.errors)).toBe(true);
27
+ expect(r.errors).toHaveLength(0);
28
+ });
29
+ it('accepts a minimal stakeholder (no concern / interest / influence)', () => {
30
+ const r = valid();
31
+ delete r.concern;
32
+ delete r.interest;
33
+ delete r.influence;
34
+ expect(validateStakeholder(r).valid).toBe(true);
35
+ });
36
+ });
37
+ describe('validateStakeholder — STAKEHOLDER-001 (envelope / shape)', () => {
38
+ it('flags a non-object', () => {
39
+ expect(codes(null)).toEqual(['STAKEHOLDER-001']);
40
+ });
41
+ it('flags a wrong notation tag', () => {
42
+ expect(codes({ ...valid(), notation: 'stake' })).toContain('STAKEHOLDER-001');
43
+ });
44
+ it('flags an id with the wrong TYPE prefix', () => {
45
+ expect(codes({ ...valid(), id: 'ACTOR-DPA-1' })).toContain('STAKEHOLDER-001');
46
+ });
47
+ });
48
+ describe('validateStakeholder — STAKEHOLDER-002 (type enum)', () => {
49
+ it('flags a missing type', () => {
50
+ const r = valid();
51
+ delete r.type;
52
+ expect(codes(r)).toContain('STAKEHOLDER-002');
53
+ });
54
+ it('flags a type outside internal/external', () => {
55
+ expect(codes({ ...valid(), type: 'regulator' })).toContain('STAKEHOLDER-002');
56
+ });
57
+ it('accepts both internal and external', () => {
58
+ for (const t of ['internal', 'external']) {
59
+ expect(validateStakeholder({ ...valid(), type: t }).valid).toBe(true);
60
+ }
61
+ });
62
+ });
63
+ describe('validateStakeholder — STAKEHOLDER-003 (actor binding)', () => {
64
+ it('flags a missing actor', () => {
65
+ const r = valid();
66
+ delete r.actor;
67
+ expect(codes(r)).toContain('STAKEHOLDER-003');
68
+ });
69
+ it('flags an actor that is not an ACTOR typed id', () => {
70
+ expect(codes({ ...valid(), actor: 'ROLE-CEO-1' })).toContain('STAKEHOLDER-003');
71
+ expect(codes({ ...valid(), actor: 'not an id' })).toContain('STAKEHOLDER-003');
72
+ });
73
+ });
74
+ describe('validateStakeholder — STAKEHOLDER-004 (level enums)', () => {
75
+ it('flags an interest outside high/medium/low', () => {
76
+ expect(codes({ ...valid(), interest: 'extreme' })).toContain('STAKEHOLDER-004');
77
+ });
78
+ it('flags an influence outside high/medium/low', () => {
79
+ expect(codes({ ...valid(), influence: 'extreme' })).toContain('STAKEHOLDER-004');
80
+ });
81
+ it('accepts each permitted level', () => {
82
+ for (const l of ['high', 'medium', 'low']) {
83
+ expect(validateStakeholder({ ...valid(), interest: l, influence: l }).valid).toBe(true);
84
+ }
85
+ });
86
+ });
@@ -0,0 +1,3 @@
1
+ export type { Stakeholder, StakeholderType, StakeholderLevel } from './types.js';
2
+ export { STAKEHOLDER_TYPES, STAKEHOLDER_LEVELS } from './types.js';
3
+ export { validateStakeholder } from './validate.js';
@@ -0,0 +1,2 @@
1
+ export { STAKEHOLDER_TYPES, STAKEHOLDER_LEVELS } from './types.js';
2
+ export { validateStakeholder } from './validate.js';
@@ -0,0 +1,24 @@
1
+ import type { GateChecks } from '../requirement/types.js';
2
+ export type StakeholderType = 'internal' | 'external';
3
+ export declare const STAKEHOLDER_TYPES: readonly ["internal", "external"];
4
+ export type StakeholderLevel = 'high' | 'medium' | 'low';
5
+ export declare const STAKEHOLDER_LEVELS: readonly ["high", "medium", "low"];
6
+ export interface Stakeholder {
7
+ notation: 'stakeholder';
8
+ id: string;
9
+ name: string;
10
+ /** Required subtype — internal | external. */
11
+ type: StakeholderType;
12
+ /** Required ACTOR-… typed id — identity binding (never inline). */
13
+ actor: string;
14
+ concern?: string;
15
+ interest?: StakeholderLevel;
16
+ influence?: StakeholderLevel;
17
+ description?: string;
18
+ zone: 'canon';
19
+ admitted_at: string;
20
+ admitted_by: string;
21
+ gate_checks: GateChecks;
22
+ valid_from: string;
23
+ valid_to: string | null;
24
+ }
@@ -0,0 +1,5 @@
1
+ // STAKEHOLDER — motivation-layer interest primitive.
2
+ // Schema: methodology notations/ELEMENT_PRIMITIVES.md §7.15 +
3
+ // notations/elements/20-stakeholders.md + envelope §3.
4
+ export const STAKEHOLDER_TYPES = ['internal', 'external'];
5
+ export const STAKEHOLDER_LEVELS = ['high', 'medium', 'low'];
@@ -0,0 +1,2 @@
1
+ import type { ValidationResult } from '../validation-types.js';
2
+ export declare function validateStakeholder(input: unknown): ValidationResult;
@@ -0,0 +1,58 @@
1
+ // STAKEHOLDER validator — methodology notations/ELEMENT_PRIMITIVES.md §7.15
2
+ // + notations/elements/20-stakeholders.md.
3
+ //
4
+ // Implements STAKEHOLDER-001..004. Stake-in-a-specific-object lives on
5
+ // `stakeholding` REL records (elements/17-relations.md §3) and is out of
6
+ // scope for this single-artefact validator.
7
+ import { typeOfId } from '../typed-id.js';
8
+ import { validateElementEnvelope } from '../element-envelope.js';
9
+ import { STAKEHOLDER_LEVELS, STAKEHOLDER_TYPES } from './types.js';
10
+ export function validateStakeholder(input) {
11
+ const errors = [];
12
+ const warnings = [];
13
+ const { record, errors: envErrors } = validateElementEnvelope(input, {
14
+ notation: 'stakeholder',
15
+ idType: 'STAKEHOLDER',
16
+ code: 'STAKEHOLDER-001',
17
+ });
18
+ errors.push(...envErrors);
19
+ if (!record)
20
+ return { valid: false, errors, warnings };
21
+ // STAKEHOLDER-002 — type subtype required.
22
+ if (record.type === undefined || record.type === null) {
23
+ errors.push({ code: 'STAKEHOLDER-002', message: 'type is required (internal | external).', path: 'type' });
24
+ }
25
+ else if (!STAKEHOLDER_TYPES.includes(record.type)) {
26
+ errors.push({
27
+ code: 'STAKEHOLDER-002',
28
+ message: `type "${String(record.type)}" must be one of ${STAKEHOLDER_TYPES.join(', ')}.`,
29
+ path: 'type',
30
+ });
31
+ }
32
+ // STAKEHOLDER-003 — actor identity binding (REQUIRED, must be ACTOR-…).
33
+ if (record.actor === undefined || record.actor === null || record.actor === '') {
34
+ errors.push({
35
+ code: 'STAKEHOLDER-003',
36
+ message: 'actor is required — identity lives in an ACTOR-… record, never inline.',
37
+ path: 'actor',
38
+ });
39
+ }
40
+ else if (typeOfId(record.actor) !== 'ACTOR') {
41
+ errors.push({
42
+ code: 'STAKEHOLDER-003',
43
+ message: `actor "${String(record.actor)}" must be an ACTOR typed ID.`,
44
+ path: 'actor',
45
+ });
46
+ }
47
+ // STAKEHOLDER-004 — interest / influence level enums (optional fields).
48
+ for (const f of ['interest', 'influence']) {
49
+ if (record[f] !== undefined && !STAKEHOLDER_LEVELS.includes(record[f])) {
50
+ errors.push({
51
+ code: 'STAKEHOLDER-004',
52
+ message: `${f} "${String(record[f])}" must be one of ${STAKEHOLDER_LEVELS.join(', ')}.`,
53
+ path: f,
54
+ });
55
+ }
56
+ }
57
+ return { valid: errors.length === 0, errors, warnings };
58
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { validateTargetState } from '../validate.js';
3
+ function valid() {
4
+ return {
5
+ notation: 'target-state',
6
+ id: 'TARGET_STATE-EU-LIVE-1',
7
+ name: 'EU operations live — three markets, localised CRM and payments',
8
+ description: 'The structural end-state in which Acme operates in three EU markets.',
9
+ capabilities: ['CAPABILITY-V1', 'CAPABILITY-V1.2', 'CAPABILITY-V2'],
10
+ processes: ['PROCESS-CUST-ONBOARD-1', 'PROCESS-ORD-FULFILL-1'],
11
+ applications: ['APPLICATION-CRM-1', 'APPLICATION-OMS-1'],
12
+ zone: 'canon',
13
+ admitted_at: '2026-05-31',
14
+ admitted_by: 'v.korobeinikov',
15
+ gate_checks: { uniqueness: 'pass', consistency: 'pass', completeness: 'pass' },
16
+ valid_from: '2026-05-31',
17
+ valid_to: null,
18
+ };
19
+ }
20
+ const codes = (input) => validateTargetState(input).errors.map(e => e.code);
21
+ describe('validateTargetState — positive', () => {
22
+ it('accepts the worked-example TARGET_STATE-EU-LIVE-1', () => {
23
+ const r = validateTargetState(valid());
24
+ expect(r.valid, JSON.stringify(r.errors)).toBe(true);
25
+ expect(r.errors).toHaveLength(0);
26
+ });
27
+ it('accepts a minimal target state (name + envelope only)', () => {
28
+ const r = valid();
29
+ delete r.capabilities;
30
+ delete r.processes;
31
+ delete r.applications;
32
+ expect(validateTargetState(r).valid).toBe(true);
33
+ });
34
+ });
35
+ describe('validateTargetState — TARGET_STATE-001 (envelope / shape)', () => {
36
+ it('flags a non-object', () => {
37
+ expect(codes(null)).toEqual(['TARGET_STATE-001']);
38
+ });
39
+ it('flags a wrong notation tag', () => {
40
+ expect(codes({ ...valid(), notation: 'plateau' })).toContain('TARGET_STATE-001');
41
+ });
42
+ it('flags an id with the wrong TYPE prefix', () => {
43
+ expect(codes({ ...valid(), id: 'SCENARIO-EU-LIVE-1' })).toContain('TARGET_STATE-001');
44
+ });
45
+ it('flags an inline goals field (it belongs on a REL)', () => {
46
+ expect(codes({ ...valid(), goals: ['GOAL-EU-1'] })).toContain('TARGET_STATE-001');
47
+ });
48
+ });
49
+ describe('validateTargetState — TARGET_STATE-002 (composition refs)', () => {
50
+ it('flags a non-CAPABILITY id in capabilities', () => {
51
+ expect(codes({ ...valid(), capabilities: ['PROCESS-X-1'] })).toContain('TARGET_STATE-002');
52
+ });
53
+ it('flags a non-PROCESS id in processes', () => {
54
+ expect(codes({ ...valid(), processes: ['CAPABILITY-V1'] })).toContain('TARGET_STATE-002');
55
+ });
56
+ it('flags a non-APPLICATION id in applications', () => {
57
+ expect(codes({ ...valid(), applications: ['PRODUCT-X-1'] })).toContain('TARGET_STATE-002');
58
+ });
59
+ it('flags a composition field that is not an array', () => {
60
+ expect(codes({ ...valid(), capabilities: 'CAPABILITY-V1' })).toContain('TARGET_STATE-002');
61
+ });
62
+ });
@@ -0,0 +1,2 @@
1
+ export type { TargetState } from './types.js';
2
+ export { validateTargetState } from './validate.js';
@@ -0,0 +1 @@
1
+ export { validateTargetState } from './validate.js';
@@ -0,0 +1,18 @@
1
+ import type { GateChecks } from '../requirement/types.js';
2
+ export interface TargetState {
3
+ notation: 'target-state';
4
+ id: string;
5
+ name: string;
6
+ /** Composition lists are inline; they are timeless on the element file. */
7
+ capabilities?: string[];
8
+ processes?: string[];
9
+ applications?: string[];
10
+ description?: string;
11
+ link?: string;
12
+ zone: 'canon';
13
+ admitted_at: string;
14
+ admitted_by: string;
15
+ gate_checks: GateChecks;
16
+ valid_from: string;
17
+ valid_to: string | null;
18
+ }
@@ -0,0 +1,7 @@
1
+ // TARGET_STATE — implementation-layer plateau primitive (ArchiMate Plateau).
2
+ // Schema: methodology notations/ELEMENT_PRIMITIVES.md §7.17 + envelope §3.
3
+ //
4
+ // The id TYPE prefix is `TARGET_STATE` (underscore — uppercase identifier in
5
+ // IDS_AND_REFERENCES.md §3.1). The notation tag is the lowercased hyphenated
6
+ // short name `target-state` (per ELEMENT_PRIMITIVES.md §4).
7
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { ValidationResult } from '../validation-types.js';
2
+ export declare function validateTargetState(input: unknown): ValidationResult;
@@ -0,0 +1,61 @@
1
+ // TARGET_STATE validator — methodology notations/ELEMENT_PRIMITIVES.md §7.17.
2
+ //
3
+ // Implements TARGET_STATE-001..002. Goal-satisfaction lives on the
4
+ // `target_state_satisfies_goal` REL kind (elements/17-relations.md §3) and is
5
+ // never inline here; a `goals:` field on a TARGET_STATE is flagged.
6
+ import { typeOfId } from '../typed-id.js';
7
+ import { validateElementEnvelope } from '../element-envelope.js';
8
+ /** Composition fields and the TYPE each entry must carry. */
9
+ const COMPOSITION_TYPES = {
10
+ capabilities: 'CAPABILITY',
11
+ processes: 'PROCESS',
12
+ applications: 'APPLICATION',
13
+ };
14
+ export function validateTargetState(input) {
15
+ const errors = [];
16
+ const warnings = [];
17
+ const { record, errors: envErrors } = validateElementEnvelope(input, {
18
+ notation: 'target-state',
19
+ idType: 'TARGET_STATE',
20
+ code: 'TARGET_STATE-001',
21
+ });
22
+ errors.push(...envErrors);
23
+ if (!record)
24
+ return { valid: false, errors, warnings };
25
+ // TARGET_STATE-002 — composition entries must carry the right TYPE prefix.
26
+ for (const [field, expectedType] of Object.entries(COMPOSITION_TYPES)) {
27
+ const value = record[field];
28
+ if (value === undefined)
29
+ continue;
30
+ if (!Array.isArray(value)) {
31
+ errors.push({
32
+ code: 'TARGET_STATE-002',
33
+ message: `${field} must be a list of ${expectedType} typed IDs.`,
34
+ path: field,
35
+ });
36
+ continue;
37
+ }
38
+ value.forEach((ref, i) => {
39
+ // CAPABILITY uses a V/H terminal (e.g. CAPABILITY-V1.2) rather than a
40
+ // plain integer; the prefix-TYPE gate is what this validator enforces,
41
+ // and the V/H grammar is owned by the capability-map module.
42
+ if (typeOfId(ref) !== expectedType) {
43
+ errors.push({
44
+ code: 'TARGET_STATE-002',
45
+ message: `${field}[${i}] "${String(ref)}" must be a ${expectedType} typed ID.`,
46
+ path: `${field}[${i}]`,
47
+ });
48
+ }
49
+ });
50
+ }
51
+ // TARGET_STATE-001 — `goals:` is not an inline field on this element. Goal
52
+ // satisfaction is a target_state_satisfies_goal REL (§7.17).
53
+ if ('goals' in record) {
54
+ errors.push({
55
+ code: 'TARGET_STATE-001',
56
+ message: 'goals is not an inline field on TARGET_STATE — use a target_state_satisfies_goal REL.',
57
+ path: 'goals',
58
+ });
59
+ }
60
+ return { valid: errors.length === 0, errors, warnings };
61
+ }
@@ -0,0 +1,4 @@
1
+ export type { AdaptiveTokens } from './tokens.js';
2
+ export { BRAND, FUNCTIONAL, LAYER_COLORS, LEVEL_COLORS, MATURITY_COLORS, STRUCTURAL, TYPOGRAPHY, CSS_VAR, getBaseResetCss } from './tokens.js';
3
+ export type { ThemeId } from './themes.js';
4
+ export { generateWebviewCss, generateSvgEmbedCss } from './themes.js';
@@ -0,0 +1,2 @@
1
+ export { BRAND, FUNCTIONAL, LAYER_COLORS, LEVEL_COLORS, MATURITY_COLORS, STRUCTURAL, TYPOGRAPHY, CSS_VAR, getBaseResetCss } from './tokens.js';
2
+ export { generateWebviewCss, generateSvgEmbedCss } from './themes.js';
@@ -0,0 +1,16 @@
1
+ export type ThemeId = 'transitrix' | 'transitrix-dark' | 'vscode-adaptive';
2
+ /**
3
+ * Generates a self-contained CSS block for embedding inside a standalone SVG file.
4
+ * Defines all --ts-* custom properties on :root so diagram classes resolve correctly
5
+ * when the SVG is opened outside of VS Code.
6
+ * vscode-adaptive falls back to the light palette (runtime VS Code variables are unavailable).
7
+ */
8
+ export declare function generateSvgEmbedCss(themeId: ThemeId): string;
9
+ /**
10
+ * Generates complete CSS for a static SVG diagram webview.
11
+ *
12
+ * For transitrix/transitrix-dark: sets --ts-* vars with fixed brand colors.
13
+ * For vscode-adaptive: maps --ts-* vars to --vscode-* CSS vars, with
14
+ * body.vscode-dark / body.vscode-high-contrast overrides for diagram colors.
15
+ */
16
+ export declare function generateWebviewCss(themeId: ThemeId): string;