@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,416 @@
1
+ const ASPECT_CATEGORIES = ['systems', 'actors', 'equipment', 'information_entities'];
2
+ const ASPECT_LABEL = {
3
+ systems: 'Systems',
4
+ actors: 'Actors',
5
+ equipment: 'Equipment',
6
+ information_entities: 'Information',
7
+ };
8
+ const DEFAULTS = {
9
+ legendColumnWidth: 140,
10
+ stageColumnWidth: 220,
11
+ stageHeaderHeight: 40,
12
+ goalRowHeight: 56,
13
+ resultRowHeight: 56,
14
+ aspectRowMinHeight: 60,
15
+ pillHeight: 28,
16
+ pillGap: 4,
17
+ cellPadding: 8,
18
+ textLineHeight: 15,
19
+ textCharWidth: 6.2,
20
+ cellTextPadX: 10,
21
+ cellTextPadY: 10,
22
+ maxTextLines: 6,
23
+ };
24
+ function resolveOptions(options) {
25
+ return { ...DEFAULTS, ...(options ?? {}) };
26
+ }
27
+ /**
28
+ * Greedy word-wrap to a max characters-per-line budget. Words longer than the
29
+ * budget are hard-split; if the result exceeds `maxLines`, the last kept line
30
+ * is truncated with an ellipsis so a single pathological cell can't grow the
31
+ * whole row unbounded.
32
+ */
33
+ function wrapText(text, maxChars, maxLines) {
34
+ const trimmed = (text ?? '').trim();
35
+ if (trimmed.length === 0)
36
+ return [];
37
+ const budget = Math.max(1, maxChars);
38
+ const words = trimmed.split(/\s+/);
39
+ const lines = [];
40
+ let cur = '';
41
+ const flush = () => {
42
+ if (cur.length > 0) {
43
+ lines.push(cur);
44
+ cur = '';
45
+ }
46
+ };
47
+ for (const word of words) {
48
+ if (word.length > budget) {
49
+ // Token wider than the cell: hard-break it across lines.
50
+ flush();
51
+ let rest = word;
52
+ while (rest.length > budget) {
53
+ lines.push(rest.slice(0, budget));
54
+ rest = rest.slice(budget);
55
+ }
56
+ cur = rest;
57
+ continue;
58
+ }
59
+ const candidate = cur.length > 0 ? `${cur} ${word}` : word;
60
+ if (candidate.length > budget) {
61
+ flush();
62
+ cur = word;
63
+ }
64
+ else {
65
+ cur = candidate;
66
+ }
67
+ }
68
+ flush();
69
+ if (lines.length > maxLines) {
70
+ const capped = lines.slice(0, maxLines);
71
+ const last = capped[maxLines - 1];
72
+ const clipped = last.length > budget - 1 ? last.slice(0, budget - 1) : last;
73
+ capped[maxLines - 1] = `${clipped.replace(/…$/, '')}…`;
74
+ return capped;
75
+ }
76
+ return lines;
77
+ }
78
+ function buildStageIndex(stages) {
79
+ const idx = new Map();
80
+ for (let i = 0; i < stages.length; i++) {
81
+ const sid = typeof stages[i]?.id === 'string' ? stages[i].id.trim() : '';
82
+ if (sid.length > 0 && !idx.has(sid)) {
83
+ idx.set(sid, i);
84
+ }
85
+ }
86
+ return idx;
87
+ }
88
+ function pillsForEntry(category, entryIndex, entry, stageIndexById) {
89
+ if (!Array.isArray(entry.stages))
90
+ return [];
91
+ const idxs = [];
92
+ const seen = new Set();
93
+ for (const ref of entry.stages) {
94
+ if (typeof ref !== 'string')
95
+ continue;
96
+ const i = stageIndexById.get(ref.trim());
97
+ if (i === undefined)
98
+ continue;
99
+ if (seen.has(i))
100
+ continue;
101
+ seen.add(i);
102
+ idxs.push(i);
103
+ }
104
+ idxs.sort((a, b) => a - b);
105
+ const pills = [];
106
+ let runStart = null;
107
+ let runEnd = null;
108
+ for (const i of idxs) {
109
+ if (runStart === null || runEnd === null) {
110
+ runStart = i;
111
+ runEnd = i;
112
+ continue;
113
+ }
114
+ if (i === runEnd + 1) {
115
+ runEnd = i;
116
+ }
117
+ else {
118
+ pills.push({
119
+ category,
120
+ entryIndex,
121
+ name: entry.name,
122
+ id: entry.id,
123
+ startStageIndex: runStart,
124
+ endStageIndex: runEnd,
125
+ });
126
+ runStart = i;
127
+ runEnd = i;
128
+ }
129
+ }
130
+ if (runStart !== null && runEnd !== null) {
131
+ pills.push({
132
+ category,
133
+ entryIndex,
134
+ name: entry.name,
135
+ id: entry.id,
136
+ startStageIndex: runStart,
137
+ endStageIndex: runEnd,
138
+ });
139
+ }
140
+ return pills;
141
+ }
142
+ function packPillsIntoSlots(pills) {
143
+ // Greedy interval scheduling: stable order by startStageIndex.
144
+ const order = pills
145
+ .map((_, i) => i)
146
+ .sort((a, b) => {
147
+ const ds = pills[a].startStageIndex - pills[b].startStageIndex;
148
+ if (ds !== 0)
149
+ return ds;
150
+ return pills[a].endStageIndex - pills[b].endStageIndex;
151
+ });
152
+ const slotEndByLevel = []; // slotEndByLevel[s] = last endStageIndex placed in slot s
153
+ const slot = new Array(pills.length).fill(0);
154
+ let maxSlot = 0;
155
+ for (const i of order) {
156
+ const p = pills[i];
157
+ let placed = false;
158
+ for (let s = 0; s < slotEndByLevel.length; s++) {
159
+ if (slotEndByLevel[s] < p.startStageIndex) {
160
+ slot[i] = s;
161
+ slotEndByLevel[s] = p.endStageIndex;
162
+ placed = true;
163
+ break;
164
+ }
165
+ }
166
+ if (!placed) {
167
+ slot[i] = slotEndByLevel.length;
168
+ slotEndByLevel.push(p.endStageIndex);
169
+ }
170
+ if (slot[i] > maxSlot)
171
+ maxSlot = slot[i];
172
+ }
173
+ return { slot, maxSlot };
174
+ }
175
+ // ── Compliance lane derivation ────────────────────────────────────────────────
176
+ /** ISO 8601 date comparison helper — no Date parsing, string comparison is valid for YYYY-MM-DD. */
177
+ function deadlineStatus(deadline, today) {
178
+ if (!deadline)
179
+ return 'none';
180
+ if (deadline < today)
181
+ return 'past_due';
182
+ const daysAway = Math.round((new Date(deadline).getTime() - new Date(today).getTime()) / (1000 * 60 * 60 * 24));
183
+ return daysAway <= 30 ? 'in_force' : 'upcoming';
184
+ }
185
+ /**
186
+ * Derive the laid-out compliance row for a process blueprint.
187
+ *
188
+ * For each stage, gathers the laws that bind that stage (via the
189
+ * assertion → requirement → derived_from chain), applies the jurisdiction
190
+ * filter, and computes the three orthogonal decorations per law chip.
191
+ */
192
+ function deriveComplianceRow(stages, stageIndexById, input, opts, yStart) {
193
+ const { complianceLane: laneConfig, legendColumnWidth, stageColumnWidth, cellPadding, pillHeight, pillGap, aspectRowMinHeight, } = opts;
194
+ if (!laneConfig?.enabled)
195
+ return undefined;
196
+ const today = laneConfig.referenceDate ?? new Date().toISOString().slice(0, 10);
197
+ const filterJurisdictions = laneConfig.jurisdictions?.length ? new Set(laneConfig.jurisdictions) : null;
198
+ // Build requirement index: id → requirement.
199
+ const reqById = new Map();
200
+ for (const r of input.requirements) {
201
+ if (r?.id)
202
+ reqById.set(r.id, r);
203
+ }
204
+ const stageAccum = new Map();
205
+ for (const a of input.assertions) {
206
+ if (!a || typeof a !== 'object')
207
+ continue;
208
+ const realisedVia = Array.isArray(a.realised_via) ? a.realised_via : [];
209
+ if (realisedVia.length === 0)
210
+ continue;
211
+ const req = reqById.get(a.about);
212
+ if (!req)
213
+ continue;
214
+ const lawIds = Array.isArray(req.derived_from)
215
+ ? req.derived_from.filter((x) => typeof x === 'string')
216
+ : [];
217
+ if (lawIds.length === 0)
218
+ continue;
219
+ for (const stageRef of realisedVia) {
220
+ if (typeof stageRef !== 'string')
221
+ continue;
222
+ const idx = stageIndexById.get(stageRef.trim());
223
+ if (idx === undefined)
224
+ continue;
225
+ for (const lawId of lawIds) {
226
+ // Apply jurisdiction filter.
227
+ if (filterJurisdictions) {
228
+ const jur = input.codexJurisdictions?.[lawId];
229
+ if (!jur || !filterJurisdictions.has(jur))
230
+ continue;
231
+ }
232
+ if (!stageAccum.has(idx))
233
+ stageAccum.set(idx, new Map());
234
+ const lawMap = stageAccum.get(idx);
235
+ const existing = lawMap.get(lawId);
236
+ const isGap = a.status === 'non_compliant' || a.status === 'partial';
237
+ if (!existing) {
238
+ lawMap.set(lawId, { gap: isGap, deadline: req.deadline });
239
+ }
240
+ else {
241
+ existing.gap = existing.gap || isGap;
242
+ // Keep the earlier deadline (more urgent).
243
+ if (req.deadline && (!existing.deadline || req.deadline < existing.deadline)) {
244
+ existing.deadline = req.deadline;
245
+ }
246
+ }
247
+ }
248
+ }
249
+ }
250
+ if (stageAccum.size === 0)
251
+ return undefined;
252
+ // Determine how many slots (rows) per stage.
253
+ const slotsPerStage = new Map();
254
+ for (const [idx, lawMap] of stageAccum) {
255
+ slotsPerStage.set(idx, lawMap.size);
256
+ }
257
+ const maxSlots = Math.max(0, ...slotsPerStage.values());
258
+ if (maxSlots === 0)
259
+ return undefined;
260
+ const contentHeight = maxSlots * (pillHeight + pillGap) - pillGap;
261
+ const rowHeight = Math.max(aspectRowMinHeight, contentHeight + 2 * cellPadding);
262
+ const chips = [];
263
+ for (const [stageIdx, lawMap] of stageAccum) {
264
+ const prevLawIds = new Set(laneConfig.previousSnapshot?.[stages[stageIdx]?.id ?? ''] ?? []);
265
+ let slot = 0;
266
+ for (const [lawId, accum] of lawMap) {
267
+ const decorations = [];
268
+ if (!prevLawIds.has(lawId))
269
+ decorations.push('new');
270
+ if (accum.gap) {
271
+ decorations.push('gap');
272
+ const ds = deadlineStatus(accum.deadline, today);
273
+ if (ds !== 'none')
274
+ decorations.push('deadline');
275
+ }
276
+ const x = legendColumnWidth + stageIdx * stageColumnWidth + cellPadding;
277
+ const width = stageColumnWidth - 2 * cellPadding;
278
+ const y = yStart + cellPadding + slot * (pillHeight + pillGap);
279
+ chips.push({ stageIndex: stageIdx, lawId, decorations, x, y, width, height: pillHeight });
280
+ slot++;
281
+ }
282
+ }
283
+ return { y: yStart, height: rowHeight, chips };
284
+ }
285
+ export function layoutProcessBlueprint(file, options) {
286
+ const opts = resolveOptions(options);
287
+ const pb = file.process_blueprint;
288
+ const stages = Array.isArray(pb?.stages) ? pb.stages : [];
289
+ const stageIndexById = buildStageIndex(stages);
290
+ // Stage headers
291
+ const stageHeaders = stages.map((s, i) => ({
292
+ stageIndex: i,
293
+ id: s?.id ?? '',
294
+ name: s?.name ?? '',
295
+ x: opts.legendColumnWidth + i * opts.stageColumnWidth,
296
+ y: 0,
297
+ width: opts.stageColumnWidth,
298
+ height: opts.stageHeaderHeight,
299
+ }));
300
+ // Goal + result rows. Text is word-wrapped to the column width, and each row
301
+ // grows to fit the tallest cell so nothing is clipped.
302
+ const maxCharsPerLine = Math.max(4, Math.floor((opts.stageColumnWidth - 2 * opts.cellTextPadX) / opts.textCharWidth));
303
+ const wrap = (text) => wrapText(text, maxCharsPerLine, opts.maxTextLines);
304
+ const rowHeightFor = (lineCounts, minHeight) => {
305
+ const maxLines = Math.max(1, ...lineCounts);
306
+ return Math.max(minHeight, maxLines * opts.textLineHeight + 2 * opts.cellTextPadY);
307
+ };
308
+ const goalLines = stages.map(s => wrap(s?.goal ?? ''));
309
+ const resultLines = stages.map(s => wrap(s?.result ?? ''));
310
+ const goalRowY = opts.stageHeaderHeight;
311
+ const goalRowHeight = rowHeightFor(goalLines.map(l => l.length), opts.goalRowHeight);
312
+ const resultRowY = goalRowY + goalRowHeight;
313
+ const resultRowHeight = rowHeightFor(resultLines.map(l => l.length), opts.resultRowHeight);
314
+ const goalCells = stages.map((s, i) => ({
315
+ stageIndex: i,
316
+ text: s?.goal ?? '',
317
+ lines: goalLines[i],
318
+ x: opts.legendColumnWidth + i * opts.stageColumnWidth,
319
+ y: goalRowY,
320
+ width: opts.stageColumnWidth,
321
+ height: goalRowHeight,
322
+ }));
323
+ const resultCells = stages.map((s, i) => ({
324
+ stageIndex: i,
325
+ text: s?.result ?? '',
326
+ lines: resultLines[i],
327
+ x: opts.legendColumnWidth + i * opts.stageColumnWidth,
328
+ y: resultRowY,
329
+ width: opts.stageColumnWidth,
330
+ height: resultRowHeight,
331
+ }));
332
+ const aspectsStartY = resultRowY + resultRowHeight;
333
+ // Aspect rows: only categories with at least one entry, in fixed order.
334
+ const aspectRows = [];
335
+ let aspectCursorY = aspectsStartY;
336
+ for (const category of ASPECT_CATEGORIES) {
337
+ const arr = pb?.[category];
338
+ if (!Array.isArray(arr) || arr.length === 0)
339
+ continue;
340
+ const rawPills = [];
341
+ for (let i = 0; i < arr.length; i++) {
342
+ const entry = arr[i];
343
+ if (!entry || typeof entry !== 'object')
344
+ continue;
345
+ rawPills.push(...pillsForEntry(category, i, entry, stageIndexById));
346
+ }
347
+ // If every entry in this category had no resolvable stage refs, drop the row.
348
+ if (rawPills.length === 0)
349
+ continue;
350
+ const { slot, maxSlot } = packPillsIntoSlots(rawPills);
351
+ const contentHeight = (maxSlot + 1) * (opts.pillHeight + opts.pillGap) - opts.pillGap;
352
+ const rowHeight = Math.max(opts.aspectRowMinHeight, contentHeight + 2 * opts.cellPadding);
353
+ const pills = rawPills.map((p, i) => {
354
+ const x = opts.legendColumnWidth + p.startStageIndex * opts.stageColumnWidth + opts.cellPadding;
355
+ const width = (p.endStageIndex - p.startStageIndex + 1) * opts.stageColumnWidth - 2 * opts.cellPadding;
356
+ const y = aspectCursorY + opts.cellPadding + slot[i] * (opts.pillHeight + opts.pillGap);
357
+ return {
358
+ category: p.category,
359
+ entryIndex: p.entryIndex,
360
+ name: p.name,
361
+ id: p.id,
362
+ startStageIndex: p.startStageIndex,
363
+ endStageIndex: p.endStageIndex,
364
+ x,
365
+ y,
366
+ width,
367
+ height: opts.pillHeight,
368
+ };
369
+ });
370
+ aspectRows.push({
371
+ category,
372
+ y: aspectCursorY,
373
+ height: rowHeight,
374
+ pills,
375
+ });
376
+ aspectCursorY += rowHeight;
377
+ }
378
+ // Compliance lane — derived from assertions/requirements, rendered after aspect rows.
379
+ let complianceRow;
380
+ if (opts.complianceLane?.enabled && opts.complianceInput) {
381
+ complianceRow = deriveComplianceRow(stages, stageIndexById, opts.complianceInput, opts, aspectCursorY);
382
+ if (complianceRow) {
383
+ aspectCursorY += complianceRow.height;
384
+ }
385
+ }
386
+ // Legend (left column labels): one entry per row.
387
+ const legend = [
388
+ { kind: 'goal', label: 'Goal', y: goalRowY, height: goalRowHeight },
389
+ { kind: 'result', label: 'Result', y: resultRowY, height: resultRowHeight },
390
+ ...aspectRows.map(row => ({
391
+ kind: 'aspect',
392
+ category: row.category,
393
+ label: ASPECT_LABEL[row.category],
394
+ y: row.y,
395
+ height: row.height,
396
+ })),
397
+ ...(complianceRow
398
+ ? [{ kind: 'compliance', label: 'Compliance', y: complianceRow.y, height: complianceRow.height }]
399
+ : []),
400
+ ];
401
+ const totalWidth = opts.legendColumnWidth + stages.length * opts.stageColumnWidth;
402
+ const totalHeight = aspectCursorY;
403
+ return {
404
+ bounds: { x: 0, y: 0, width: totalWidth, height: totalHeight },
405
+ legendColumnWidth: opts.legendColumnWidth,
406
+ stageColumnWidth: opts.stageColumnWidth,
407
+ textLineHeight: opts.textLineHeight,
408
+ cellTextPadX: opts.cellTextPadX,
409
+ legend,
410
+ stageHeaders,
411
+ goalCells,
412
+ resultCells,
413
+ aspectRows,
414
+ complianceRow,
415
+ };
416
+ }
@@ -0,0 +1,220 @@
1
+ export type AspectCategory = 'systems' | 'actors' | 'equipment' | 'information_entities';
2
+ /**
3
+ * One of the three orthogonal decoration signals that can appear on a compliance
4
+ * law chip (ADR 2026-06-09-compliance-impact-as-blueprint-lane §3):
5
+ * - `new` — law's impact on this stage appeared since the previous snapshot
6
+ * - `gap` — a bound assertion has status `non_compliant` or `partial`
7
+ * - `deadline` — gap is present AND the requirement carries a deadline that is
8
+ * past, imminent, or in-force
9
+ */
10
+ export type ComplianceDecoration = 'new' | 'gap' | 'deadline';
11
+ /** Input shape for a requirement — minimal projection the compliance lane needs. */
12
+ export interface ComplianceLaneRequirement {
13
+ id: string;
14
+ /** Typed IDs of codex sources (law IDs displayed as chips). */
15
+ derived_from?: string[];
16
+ /**
17
+ * ISO 8601 compliance deadline on the external regulatory source.
18
+ * Used to compute the `deadline` decoration.
19
+ */
20
+ deadline?: string;
21
+ }
22
+ /** Input shape for an assertion — minimal projection the compliance lane needs. */
23
+ export interface ComplianceLaneAssertion {
24
+ /** Requirement ID this assertion is about. */
25
+ about: string;
26
+ /** Compliance realisation status. */
27
+ status: 'compliant' | 'partial' | 'non_compliant' | 'under_review' | 'n_a';
28
+ /**
29
+ * Typed IDs of stages / process steps where the requirement is realised.
30
+ * When empty/absent, the assertion covers the entire subject, not a specific stage.
31
+ */
32
+ realised_via?: string[];
33
+ }
34
+ /**
35
+ * Input data for the compliance lane derivation.
36
+ * Passed via `ProcessBlueprintLayoutOptions.complianceInput`.
37
+ */
38
+ export interface ComplianceLaneInput {
39
+ assertions: ComplianceLaneAssertion[];
40
+ requirements: ComplianceLaneRequirement[];
41
+ /**
42
+ * Codex jurisdiction map: codexId → jurisdiction code.
43
+ * Required only when `ComplianceLaneConfig.jurisdictions` is non-empty.
44
+ */
45
+ codexJurisdictions?: Record<string, string>;
46
+ }
47
+ /**
48
+ * Runtime configuration for the compliance lane.
49
+ * Passed via `ProcessBlueprintLayoutOptions.complianceLane`.
50
+ */
51
+ export interface ComplianceLaneConfig {
52
+ /** When false (default), the compliance lane is not rendered. */
53
+ enabled: boolean;
54
+ /**
55
+ * Jurisdiction filter: if non-empty, only show laws whose codex jurisdiction
56
+ * is in this list. Requires `ComplianceLaneInput.codexJurisdictions`.
57
+ */
58
+ jurisdictions?: string[];
59
+ /**
60
+ * Per-stage map of law IDs known from the previous generated snapshot.
61
+ * Key: stage ID; Value: array of law IDs.
62
+ * A law not present in the previous snapshot is decorated as `new`.
63
+ */
64
+ previousSnapshot?: Record<string, string[]>;
65
+ /**
66
+ * Reference date for deadline-status computation (YYYY-MM-DD).
67
+ * Defaults to today when not supplied.
68
+ */
69
+ referenceDate?: string;
70
+ }
71
+ /** One law chip rendered inside a compliance cell. */
72
+ export interface ComplianceChip {
73
+ stageIndex: number;
74
+ /** Codex / law ID shown as the chip label. */
75
+ lawId: string;
76
+ /** Active decorations — a subset of the three orthogonal signals. */
77
+ decorations: ComplianceDecoration[];
78
+ x: number;
79
+ y: number;
80
+ width: number;
81
+ height: number;
82
+ }
83
+ /** Laid-out compliance row (one per blueprint when the lane is enabled). */
84
+ export interface ComplianceRow {
85
+ y: number;
86
+ height: number;
87
+ chips: ComplianceChip[];
88
+ }
89
+ export interface Stage {
90
+ id: string;
91
+ name: string;
92
+ goal: string;
93
+ result: string;
94
+ description?: string;
95
+ }
96
+ export interface AspectEntry {
97
+ id?: string;
98
+ name: string;
99
+ stages: string[];
100
+ description?: string;
101
+ }
102
+ /** Rendering-config block that selects which lanes are visible (spec §5 `lane_config:`). */
103
+ export interface LaneConfig {
104
+ /** Enable the derived compliance lane. Default: false. */
105
+ compliance?: boolean;
106
+ compliance_filter?: {
107
+ /** ISO jurisdiction codes; empty array means all jurisdictions. */
108
+ jurisdictions?: string[];
109
+ };
110
+ }
111
+ export interface ProcessBlueprintHeader {
112
+ id: string;
113
+ name: string;
114
+ description?: string;
115
+ period?: string;
116
+ version?: string;
117
+ date?: string;
118
+ author?: string;
119
+ process?: string;
120
+ scenario?: string;
121
+ stages: Stage[];
122
+ systems?: AspectEntry[];
123
+ actors?: AspectEntry[];
124
+ equipment?: AspectEntry[];
125
+ information_entities?: AspectEntry[];
126
+ /** Optional rendering config selecting which lanes to show. */
127
+ lane_config?: LaneConfig;
128
+ }
129
+ export interface ProcessBlueprintFile {
130
+ notation: string;
131
+ spec_version?: string;
132
+ process_blueprint: ProcessBlueprintHeader;
133
+ }
134
+ export interface ProcessBlueprintLayoutOptions {
135
+ legendColumnWidth?: number;
136
+ stageColumnWidth?: number;
137
+ stageHeaderHeight?: number;
138
+ goalRowHeight?: number;
139
+ resultRowHeight?: number;
140
+ aspectRowMinHeight?: number;
141
+ pillHeight?: number;
142
+ pillGap?: number;
143
+ cellPadding?: number;
144
+ /** Vertical advance between wrapped text lines in goal/result cells (px). */
145
+ textLineHeight?: number;
146
+ /** Approximate glyph width used to estimate wrap width (px per char). */
147
+ textCharWidth?: number;
148
+ /** Horizontal text inset inside goal/result cells (px, both sides). */
149
+ cellTextPadX?: number;
150
+ /** Top+bottom padding added around wrapped goal/result text (px). */
151
+ cellTextPadY?: number;
152
+ /** Maximum wrapped lines per goal/result cell before truncating with an ellipsis. */
153
+ maxTextLines?: number;
154
+ /** Enable and configure the derived compliance lane. Default: disabled. */
155
+ complianceLane?: ComplianceLaneConfig;
156
+ /** Assertion + requirement data for the compliance lane derivation. */
157
+ complianceInput?: ComplianceLaneInput;
158
+ }
159
+ import type { LayoutBounds } from '../geometry.js';
160
+ export type { LayoutBounds };
161
+ export interface LegendCell {
162
+ kind: 'goal' | 'result' | 'aspect' | 'compliance';
163
+ category?: AspectCategory;
164
+ label: string;
165
+ y: number;
166
+ height: number;
167
+ }
168
+ export interface StageHeaderCell {
169
+ stageIndex: number;
170
+ id: string;
171
+ name: string;
172
+ x: number;
173
+ y: number;
174
+ width: number;
175
+ height: number;
176
+ }
177
+ export interface StageTextCell {
178
+ stageIndex: number;
179
+ text: string;
180
+ /** Word-wrapped lines of `text`, pre-fitted to the cell width by the layout. */
181
+ lines: string[];
182
+ x: number;
183
+ y: number;
184
+ width: number;
185
+ height: number;
186
+ }
187
+ export interface AspectPill {
188
+ category: AspectCategory;
189
+ entryIndex: number;
190
+ name: string;
191
+ id?: string;
192
+ startStageIndex: number;
193
+ endStageIndex: number;
194
+ x: number;
195
+ y: number;
196
+ width: number;
197
+ height: number;
198
+ }
199
+ export interface AspectRow {
200
+ category: AspectCategory;
201
+ y: number;
202
+ height: number;
203
+ pills: AspectPill[];
204
+ }
205
+ export interface ProcessBlueprintLayout {
206
+ bounds: LayoutBounds;
207
+ legendColumnWidth: number;
208
+ stageColumnWidth: number;
209
+ /** Vertical advance between wrapped text lines, so renderers stack tspans consistently. */
210
+ textLineHeight: number;
211
+ /** Horizontal text inset used for goal/result cells (px). */
212
+ cellTextPadX: number;
213
+ legend: LegendCell[];
214
+ stageHeaders: StageHeaderCell[];
215
+ goalCells: StageTextCell[];
216
+ resultCells: StageTextCell[];
217
+ aspectRows: AspectRow[];
218
+ /** Compliance lane row — present only when the lane is enabled and has data. */
219
+ complianceRow?: ComplianceRow;
220
+ }
@@ -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 validateProcessBlueprint(input: unknown): ValidationResult;