@cyberismo/backend 0.0.27 → 1.1.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 (268) hide show
  1. package/dist/app.d.ts +1 -1
  2. package/dist/app.js +10 -4
  3. package/dist/app.js.map +1 -1
  4. package/dist/auth/index.d.ts +1 -1
  5. package/dist/auth/index.js +1 -1
  6. package/dist/auth/index.js.map +1 -1
  7. package/dist/auth/keycloak.js +3 -0
  8. package/dist/auth/keycloak.js.map +1 -1
  9. package/dist/auth/mock.d.ts +8 -1
  10. package/dist/auth/mock.js +51 -2
  11. package/dist/auth/mock.js.map +1 -1
  12. package/dist/common/validationSchemas.d.ts +3 -1
  13. package/dist/common/validationSchemas.js +1 -0
  14. package/dist/common/validationSchemas.js.map +1 -1
  15. package/dist/domain/calculations/index.js +1 -1
  16. package/dist/domain/calculations/index.js.map +1 -1
  17. package/dist/domain/cardTypes/service.d.ts +1 -1
  18. package/dist/domain/cardTypes/service.js +26 -4
  19. package/dist/domain/cardTypes/service.js.map +1 -1
  20. package/dist/domain/cards/lib.js +7 -5
  21. package/dist/domain/cards/lib.js.map +1 -1
  22. package/dist/domain/cards/service.js +3 -6
  23. package/dist/domain/cards/service.js.map +1 -1
  24. package/dist/domain/project/index.js +32 -1
  25. package/dist/domain/project/index.js.map +1 -1
  26. package/dist/domain/project/schema.d.ts +11 -0
  27. package/dist/domain/project/schema.js +20 -0
  28. package/dist/domain/project/schema.js.map +1 -1
  29. package/dist/domain/project/service.d.ts +23 -1
  30. package/dist/domain/project/service.js +52 -1
  31. package/dist/domain/project/service.js.map +1 -1
  32. package/dist/domain/projects/index.d.ts +1 -1
  33. package/dist/domain/projects/index.js +66 -3
  34. package/dist/domain/projects/index.js.map +1 -1
  35. package/dist/domain/projects/schema.d.ts +22 -0
  36. package/dist/domain/projects/schema.js +40 -0
  37. package/dist/domain/projects/schema.js.map +1 -0
  38. package/dist/domain/projects/service.d.ts +37 -0
  39. package/dist/domain/projects/service.js +53 -0
  40. package/dist/domain/projects/service.js.map +1 -0
  41. package/dist/domain/resources/index.js +1 -1
  42. package/dist/domain/resources/index.js.map +1 -1
  43. package/dist/domain/resources/schema.d.ts +4 -1
  44. package/dist/domain/resources/schema.js +4 -2
  45. package/dist/domain/resources/schema.js.map +1 -1
  46. package/dist/domain/resources/service.d.ts +1 -1
  47. package/dist/domain/resources/service.js +7 -2
  48. package/dist/domain/resources/service.js.map +1 -1
  49. package/dist/index.d.ts +1 -1
  50. package/dist/index.js +5 -4
  51. package/dist/index.js.map +1 -1
  52. package/dist/main.js +0 -4
  53. package/dist/main.js.map +1 -1
  54. package/dist/middleware/auth.d.ts +5 -3
  55. package/dist/middleware/auth.js +7 -4
  56. package/dist/middleware/auth.js.map +1 -1
  57. package/dist/middleware/zvalidator.d.ts +1 -1
  58. package/dist/project-registry.d.ts +2 -1
  59. package/dist/project-registry.js +4 -2
  60. package/dist/project-registry.js.map +1 -1
  61. package/dist/public/THIRD-PARTY.txt +932 -1022
  62. package/dist/public/assets/abnfDiagram-VRR7QNED-Djr4KJ5E.js +1 -0
  63. package/dist/public/assets/arc-DrR4k_H-.js +1 -0
  64. package/dist/public/assets/architecture-TIHT7OUA-XL6N-4o9.js +1 -0
  65. package/dist/public/assets/architectureDiagram-ZJ3FMSHR-DsMU2Uwa.js +36 -0
  66. package/dist/public/assets/blockDiagram-677ZJIJ3-DRBmQUQJ.js +132 -0
  67. package/dist/public/assets/c4Diagram-LMCZKHZV-E0rM02LD.js +10 -0
  68. package/dist/public/assets/channel-D5fnImJy.js +1 -0
  69. package/dist/public/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  70. package/dist/public/assets/chunk-32BRIVSS-BnDY0aSV.js +1 -0
  71. package/dist/public/assets/chunk-52WLFC77-N5YugKaZ.js +10 -0
  72. package/dist/public/assets/chunk-5FCAYU7R-I3_t_Ic_.js +1 -0
  73. package/dist/public/assets/chunk-5HE753X5-Dxz40rzH.js +1 -0
  74. package/dist/public/assets/chunk-5JV3BV7I-CNwCKRLH.js +1 -0
  75. package/dist/public/assets/chunk-5TONJI2A-ezWQ_Z2j.js +2 -0
  76. package/dist/public/assets/{chunk-FMBD7UC4-Cgl-u-NC.js → chunk-5VM5RSS4-ZNzvKenW.js} +1 -1
  77. package/dist/public/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  78. package/dist/public/assets/chunk-BIQX33UG-DS132-R_.js +1 -0
  79. package/dist/public/assets/chunk-C7G6YPKG-BN-cNjoj.js +1 -0
  80. package/dist/public/assets/chunk-CQNSW5MT-D8Mn1I73.js +1 -0
  81. package/dist/public/assets/chunk-CYSBUYHQ-Dc64Dwdo.js +1 -0
  82. package/dist/public/assets/chunk-EMLP6XTP-aIK0V8GX.js +1 -0
  83. package/dist/public/assets/chunk-EX3LRPZG-Db0XYyxy.js +231 -0
  84. package/dist/public/assets/chunk-FWX5IMBZ-BF_P2-Do.js +2 -0
  85. package/dist/public/assets/chunk-HOUHSVGY-L35GPy9G.js +1 -0
  86. package/dist/public/assets/chunk-ICXQ74PX-Bb8zaHde.js +2 -0
  87. package/dist/public/assets/chunk-JG7HCLWE-BtAXK3iQ.js +2 -0
  88. package/dist/public/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  89. package/dist/public/assets/chunk-KEIR6QF5-DEvma7oi.js +161 -0
  90. package/dist/public/assets/chunk-MOJQB5TN-D1shKbMs.js +88 -0
  91. package/dist/public/assets/chunk-MOZMSUNE-5FIqIBsY.js +1 -0
  92. package/dist/public/assets/chunk-OGEWGWER-BVIFy9xz.js +1 -0
  93. package/dist/public/assets/chunk-OSBZ3O6U-Cfd7kf1R.js +1 -0
  94. package/dist/public/assets/chunk-PUDLZKDR-Db3FSNR9.js +156 -0
  95. package/dist/public/assets/chunk-Q4XR5HBZ-BuKFRUzR.js +70 -0
  96. package/dist/public/assets/chunk-QBLGF6JB-DUGZXFh-.js +1 -0
  97. package/dist/public/assets/chunk-R7FJI6CG-D7mUd-qN.js +1 -0
  98. package/dist/public/assets/chunk-RYQCIY6F-C_3rESBd.js +1 -0
  99. package/dist/public/assets/chunk-U6XO7XAA-C3UhlwA1.js +2 -0
  100. package/dist/public/assets/chunk-V7JOEXUC-71b0ABpv.js +206 -0
  101. package/dist/public/assets/chunk-VAUOI2AC-C-GBw18h.js +1 -0
  102. package/dist/public/assets/chunk-VR4S4FIN-tUhbELKr.js +1 -0
  103. package/dist/public/assets/chunk-WYO6CB5R-BQoO62-B.js +127 -0
  104. package/dist/public/assets/chunk-XXDRQBXY-Co8n4ZHT.js +1 -0
  105. package/dist/public/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  106. package/dist/public/assets/chunk-YOTPTUD7-DhCRKU1A.js +1 -0
  107. package/dist/public/assets/chunk-ZGVPDNZ5-hpz2Ryq5.js +62 -0
  108. package/dist/public/assets/chunk-ZIRB5QZD-BpeS1aZ7.js +32 -0
  109. package/dist/public/assets/classDiagram-OUVF2IWQ-CXdVorPK.js +1 -0
  110. package/dist/public/assets/classDiagram-v2-EOCWNBFH-CXdVorPK.js +1 -0
  111. package/dist/public/assets/colors-Cg5Vh3br.js +1 -0
  112. package/dist/public/assets/cose-bilkent-JH36ORCC-4GoRbloS.js +1 -0
  113. package/dist/public/assets/cynefin-VYW2F7L2-BPH-25fI.js +1 -0
  114. package/dist/public/assets/cynefinDiagram-TSTJHNR4-PEf16euv.js +62 -0
  115. package/dist/public/assets/cytoscape.esm-C3UvhD5t.js +321 -0
  116. package/dist/public/assets/dagre-Buvkdvvj.js +1 -0
  117. package/dist/public/assets/dagre-VKFMJZFB-DPsCMBF1.js +4 -0
  118. package/dist/public/assets/defaultLocale-CNPGWpMu.js +1 -0
  119. package/dist/public/assets/diagram-FQU43EPY-DS-ryuRg.js +3 -0
  120. package/dist/public/assets/diagram-G47NLZAW-CzUoYkFf.js +24 -0
  121. package/dist/public/assets/diagram-NH7WQ7WH-MhGnE2fh.js +24 -0
  122. package/dist/public/assets/diagram-OA4YK3LP-CsQ9aFR_.js +30 -0
  123. package/dist/public/assets/diagram-WEI45ONY-Er3q49ew.js +41 -0
  124. package/dist/public/assets/dist-BzwexiH1.js +1 -0
  125. package/dist/public/assets/ebnfDiagram-CCIWWBDH-AnJAsk14.js +1 -0
  126. package/dist/public/assets/erDiagram-Q63AITRT-DulA16my.js +85 -0
  127. package/dist/public/assets/eventmodeling-45OFAUF4-CoIhTpHU.js +1 -0
  128. package/dist/public/assets/flowDiagram-23GEKE2U-BGMXUq18.js +1 -0
  129. package/dist/public/assets/ganttDiagram-NO4QXBWP-DAvCPT7_.js +292 -0
  130. package/dist/public/assets/gitGraph-TEB2WS4Q-BcPsZts5.js +1 -0
  131. package/dist/public/assets/gitGraphDiagram-IHSO6WYX-CksvJvsQ.js +106 -0
  132. package/dist/public/assets/{graphlib-B8gBHxth.js → graphlib-DS17s2tU.js} +1 -1
  133. package/dist/public/assets/index-H1CkT-JT.js +447 -0
  134. package/dist/public/assets/info-DKCQHKI2-7VGzrAVB.js +1 -0
  135. package/dist/public/assets/infoDiagram-FWYZ7A6U-D_by7lSL.js +2 -0
  136. package/dist/public/assets/init-ZlXS9mIS.js +1 -0
  137. package/dist/public/assets/{ishikawaDiagram-YF4QCWOH-D5HGS4h9.js → ishikawaDiagram-FXEZZL3T-CiLpASIW.js} +6 -6
  138. package/dist/public/assets/journeyDiagram-5HDEW3XC-DpvFmk7c.js +139 -0
  139. package/dist/public/assets/kanban-definition-HUTT4EX6-DYP_x6zD.js +89 -0
  140. package/dist/public/assets/{katex-Vhh-h91d.js → katex-DolUETbr.js} +3 -3
  141. package/dist/public/assets/{line-DNZMOnJ3.js → line-C8Sfsgt8.js} +1 -1
  142. package/dist/public/assets/linear-BWTvbP1l.js +1 -0
  143. package/dist/public/assets/map-BaFkSB1l.js +1 -0
  144. package/dist/public/assets/mermaid-parser.core--8614tkK.js +4 -0
  145. package/dist/public/assets/mindmap-definition-LN4V7U3C-3IAd4gp3.js +96 -0
  146. package/dist/public/assets/ordinal-BdBDtYTt.js +1 -0
  147. package/dist/public/assets/packet-7NZHBO7P-KYt33H0C.js +1 -0
  148. package/dist/public/assets/pegDiagram-2B236MQR-BQNFxYz2.js +1 -0
  149. package/dist/public/assets/pie-RZYD4A2V-xKz9s9I4.js +1 -0
  150. package/dist/public/assets/pieDiagram-ENE6RG2P-Cy13tg8_.js +39 -0
  151. package/dist/public/assets/quadrantDiagram-ABIIQ3AL-B3czMbdS.js +7 -0
  152. package/dist/public/assets/radar-I7S5WNFK-B4QTX-fX.js +1 -0
  153. package/dist/public/assets/railroad-3IZDKUUU-Co_9rPVC.js +1 -0
  154. package/dist/public/assets/railroad-abnf-AHOZXSZD-Bhy_c3ol.js +1 -0
  155. package/dist/public/assets/railroad-ebnf-EBAXGLYW-B9ENjG34.js +1 -0
  156. package/dist/public/assets/railroad-peg-LSFZ7HO6-CyJxDBsB.js +1 -0
  157. package/dist/public/assets/railroadDiagram-RFXS5EU6-M2j5SJF2.js +1 -0
  158. package/dist/public/assets/range-EplFIxc7.js +1 -0
  159. package/dist/public/assets/requirementDiagram-TGXJPOKE-CmvJWy_S.js +84 -0
  160. package/dist/public/assets/{rough.esm-CSKSodPl.js → rough.esm-By172zw-.js} +1 -1
  161. package/dist/public/assets/sankeyDiagram-HTMAVEWB-tAeOzMTn.js +40 -0
  162. package/dist/public/assets/sequenceDiagram-DBY2YBRQ-r0pwijM4.js +162 -0
  163. package/dist/public/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  164. package/dist/public/assets/src-DOh7_en_.js +1 -0
  165. package/dist/public/assets/stateDiagram-2N3HPSRC-a9IdkSQG.js +1 -0
  166. package/dist/public/assets/stateDiagram-v2-6OUMAXLB-s2blPtZ-.js +1 -0
  167. package/dist/public/assets/swimlanes-5IMT3BWC-5w0Cdxk6.js +2 -0
  168. package/dist/public/assets/swimlanesDiagram-G3AALYLV-BWa-KRed.js +8 -0
  169. package/dist/public/assets/time-BM2d9MsQ.js +1 -0
  170. package/dist/public/assets/timeline-definition-FHXFAJF6-CvXlv_4Y.js +120 -0
  171. package/dist/public/assets/treeView-QDETBFTQ-B9cxjfpB.js +1 -0
  172. package/dist/public/assets/treemap-6X3UGDF4-BplEq4hB.js +1 -0
  173. package/dist/public/assets/treemap-BfjIY-m6.js +1 -0
  174. package/dist/public/assets/vennDiagram-L72KCM5P-ti2qNcvo.js +34 -0
  175. package/dist/public/assets/wardley-OPB4EBWU-BX2ghg5e.js +1 -0
  176. package/dist/public/assets/wardleyDiagram-EHGQE667-C8lblm8x.js +78 -0
  177. package/dist/public/assets/xychartDiagram-FW5EYKEG-US-_k5eu.js +7 -0
  178. package/dist/public/index.html +31 -12
  179. package/dist/types.d.ts +4 -1
  180. package/dist/types.js +3 -0
  181. package/dist/types.js.map +1 -1
  182. package/package.json +11 -10
  183. package/src/app.ts +11 -4
  184. package/src/auth/index.ts +1 -1
  185. package/src/auth/keycloak.ts +3 -0
  186. package/src/auth/mock.ts +54 -2
  187. package/src/common/validationSchemas.ts +1 -0
  188. package/src/domain/calculations/index.ts +1 -1
  189. package/src/domain/cardTypes/service.ts +26 -21
  190. package/src/domain/cards/lib.ts +11 -4
  191. package/src/domain/cards/service.ts +4 -5
  192. package/src/domain/project/index.ts +54 -0
  193. package/src/domain/project/schema.ts +23 -0
  194. package/src/domain/project/service.ts +89 -1
  195. package/src/domain/projects/index.ts +115 -3
  196. package/src/domain/projects/schema.ts +42 -0
  197. package/src/domain/projects/service.ts +98 -0
  198. package/src/domain/resources/index.ts +1 -1
  199. package/src/domain/resources/schema.ts +4 -2
  200. package/src/domain/resources/service.ts +5 -4
  201. package/src/index.ts +11 -6
  202. package/src/main.ts +0 -6
  203. package/src/middleware/auth.ts +10 -4
  204. package/src/project-registry.ts +7 -2
  205. package/src/types.ts +3 -0
  206. package/dist/public/assets/architecture-7EHR7CIX-CHU1xuYF.js +0 -1
  207. package/dist/public/assets/architectureDiagram-3BPJPVTR--CSL9yP4.js +0 -36
  208. package/dist/public/assets/blockDiagram-GPEHLZMM-KVU5YZg5.js +0 -132
  209. package/dist/public/assets/c4Diagram-AAUBKEIU-CKZoRo4y.js +0 -10
  210. package/dist/public/assets/channel-DylEVeTd.js +0 -1
  211. package/dist/public/assets/chunk-2J33WTMH-3csjo24p.js +0 -1
  212. package/dist/public/assets/chunk-3OPIFGDE-BKzRNP07.js +0 -62
  213. package/dist/public/assets/chunk-4BX2VUAB-ClBqZOcE.js +0 -1
  214. package/dist/public/assets/chunk-55IACEB6-Bgi2dUOh.js +0 -1
  215. package/dist/public/assets/chunk-5ZQYHXKU-CECM_AkK.js +0 -2
  216. package/dist/public/assets/chunk-727SXJPM-DwCEXlGv.js +0 -206
  217. package/dist/public/assets/chunk-AQP2D5EJ-4K2xdOIK.js +0 -231
  218. package/dist/public/assets/chunk-BSJP7CBP-ByoKnyMP.js +0 -1
  219. package/dist/public/assets/chunk-CSCIHK7Q-DPeQmPB5.js +0 -124
  220. package/dist/public/assets/chunk-L5ZTLDWV-pkYUefHU.js +0 -1
  221. package/dist/public/assets/chunk-ND2GUHAM-BbBhIALU.js +0 -1
  222. package/dist/public/assets/chunk-NNHCCRGN-DlpIbxXb.js +0 -159
  223. package/dist/public/assets/chunk-NZK2D7GU-Bsg3s0FQ.js +0 -1
  224. package/dist/public/assets/chunk-O5CBEL6O-CLKEM0Ng.js +0 -70
  225. package/dist/public/assets/chunk-QZHKN3VN-DYbrfjC5.js +0 -1
  226. package/dist/public/assets/classDiagram-4FO5ZUOK-BJy5zoel.js +0 -1
  227. package/dist/public/assets/classDiagram-v2-Q7XG4LA2-BJy5zoel.js +0 -1
  228. package/dist/public/assets/cose-bilkent-S5V4N54A-BW2eHW0s.js +0 -1
  229. package/dist/public/assets/cytoscape.esm-FqbQrHcz.js +0 -321
  230. package/dist/public/assets/dagre-BM42HDAG-BthzRaVA.js +0 -4
  231. package/dist/public/assets/dagre-Bx709z4p.js +0 -1
  232. package/dist/public/assets/diagram-2AECGRRQ-CQJQx4k6.js +0 -43
  233. package/dist/public/assets/diagram-5GNKFQAL-DZn5aW7S.js +0 -10
  234. package/dist/public/assets/diagram-KO2AKTUF-C-khQZwA.js +0 -3
  235. package/dist/public/assets/diagram-LMA3HP47-DgWJfUcV.js +0 -24
  236. package/dist/public/assets/diagram-OG6HWLK6-44JZNjGl.js +0 -24
  237. package/dist/public/assets/dist-Dek0Yhn0.js +0 -1
  238. package/dist/public/assets/erDiagram-TEJ5UH35-BVkYJRJ3.js +0 -85
  239. package/dist/public/assets/eventmodeling-FCH6USID-C_5XBe82.js +0 -1
  240. package/dist/public/assets/flowDiagram-I6XJVG4X-DanY8_jA.js +0 -162
  241. package/dist/public/assets/ganttDiagram-6RSMTGT7-DD1Pw4Yz.js +0 -292
  242. package/dist/public/assets/gitGraph-WXDBUCRP-D4dBNuhe.js +0 -1
  243. package/dist/public/assets/gitGraphDiagram-PVQCEYII-BPrVPTyG.js +0 -106
  244. package/dist/public/assets/index-CKFcPbR1.js +0 -729
  245. package/dist/public/assets/info-J43DQDTF-D7lvZ6o6.js +0 -1
  246. package/dist/public/assets/infoDiagram-5YYISTIA-t6t0skjQ.js +0 -2
  247. package/dist/public/assets/journeyDiagram-JHISSGLW-DZle34fL.js +0 -139
  248. package/dist/public/assets/kanban-definition-UN3LZRKU-DvUHZ0z2.js +0 -89
  249. package/dist/public/assets/mermaid-parser.core-DFZGVidJ.js +0 -4
  250. package/dist/public/assets/mindmap-definition-RKZ34NQL-Lmrs6IX6.js +0 -96
  251. package/dist/public/assets/packet-YPE3B663-AbbU2Ze4.js +0 -1
  252. package/dist/public/assets/pie-LRSECV5Y-DN4QBmSF.js +0 -1
  253. package/dist/public/assets/pieDiagram-4H26LBE5-BwD91PEd.js +0 -30
  254. package/dist/public/assets/quadrantDiagram-W4KKPZXB-DXCkBrKi.js +0 -7
  255. package/dist/public/assets/radar-GUYGQ44K-ej308gGR.js +0 -1
  256. package/dist/public/assets/requirementDiagram-4Y6WPE33-jDFKiwdn.js +0 -84
  257. package/dist/public/assets/sankeyDiagram-5OEKKPKP-D9xT2nUr.js +0 -40
  258. package/dist/public/assets/sequenceDiagram-3UESZ5HK-Bmko-3_U.js +0 -162
  259. package/dist/public/assets/src-CqxF9LGw.js +0 -1
  260. package/dist/public/assets/stateDiagram-AJRCARHV-DjPm6sNG.js +0 -1
  261. package/dist/public/assets/stateDiagram-v2-BHNVJYJU-B-cimf9q.js +0 -1
  262. package/dist/public/assets/timeline-definition-PNZ67QCA-nKPLYYzI.js +0 -120
  263. package/dist/public/assets/treeView-BLDUP644--ooV0k8a.js +0 -1
  264. package/dist/public/assets/treemap-LRROVOQU-BKq-VDOX.js +0 -1
  265. package/dist/public/assets/vennDiagram-CIIHVFJN-DHORAsW0.js +0 -34
  266. package/dist/public/assets/wardley-L42UT6IY-VU5ormp0.js +0 -1
  267. package/dist/public/assets/wardleyDiagram-YWT4CUSO-DwqR74vk.js +0 -78
  268. package/dist/public/assets/xychartDiagram-2RQKCTM6-CUU1IRcn.js +0 -7
@@ -0,0 +1,98 @@
1
+ /**
2
+ Cyberismo
3
+ Copyright © Cyberismo Ltd and contributors 2026
4
+ This program is free software: you can redistribute it and/or modify it under
5
+ the terms of the GNU Affero General Public License version 3 as published by
6
+ the Free Software Foundation.
7
+ This program is distributed in the hope that it will be useful, but WITHOUT
8
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9
+ FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
10
+ details. You should have received a copy of the GNU Affero General Public
11
+ License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
+ */
13
+
14
+ import { join } from 'node:path';
15
+ import {
16
+ CommandManager,
17
+ Create,
18
+ scanForProjects,
19
+ } from '@cyberismo/data-handler';
20
+ import type { ProjectRegistry } from '../../project-registry.js';
21
+
22
+ export interface CreateProjectParams {
23
+ name: string;
24
+ prefix: string;
25
+ category?: string;
26
+ description?: string;
27
+ }
28
+
29
+ export interface CreateProjectResult {
30
+ prefix: string;
31
+ name: string;
32
+ category?: string;
33
+ description?: string;
34
+ }
35
+
36
+ export async function createProject(
37
+ registry: ProjectRegistry,
38
+ rootPath: string,
39
+ params: CreateProjectParams,
40
+ user?: { name: string; email: string } | null,
41
+ ): Promise<CreateProjectResult> {
42
+ const { name, prefix, category, description } = params;
43
+ const projectPath = join(rootPath, prefix);
44
+
45
+ const commands = await CommandManager.createProjectWithDefaults(
46
+ projectPath,
47
+ params,
48
+ {
49
+ ...registry.options,
50
+ gitUser: user ?? undefined,
51
+ },
52
+ );
53
+
54
+ registry.add(prefix, commands);
55
+
56
+ return {
57
+ prefix,
58
+ name,
59
+ category: category || undefined,
60
+ description: description || undefined,
61
+ };
62
+ }
63
+
64
+ export interface CloneProjectResult {
65
+ projects: { prefix: string; name: string }[];
66
+ skippedDuplicates?: string[];
67
+ }
68
+
69
+ export async function cloneProject(
70
+ registry: ProjectRegistry,
71
+ rootPath: string,
72
+ url: string,
73
+ ): Promise<CloneProjectResult> {
74
+ const clonedPath = await Create.cloneProject(url, rootPath);
75
+ const scanned = await scanForProjects(clonedPath);
76
+
77
+ const registered: { prefix: string; name: string }[] = [];
78
+ const skippedDuplicates: string[] = [];
79
+
80
+ for (const project of scanned) {
81
+ if (registry.has(project.prefix)) {
82
+ skippedDuplicates.push(project.prefix);
83
+ continue;
84
+ }
85
+ const commands = new CommandManager(project.path, registry.options);
86
+ await commands.initialize();
87
+ registry.add(project.prefix, commands);
88
+ registered.push({
89
+ prefix: project.prefix,
90
+ name: project.name,
91
+ });
92
+ }
93
+
94
+ return {
95
+ projects: registered,
96
+ ...(skippedDuplicates.length > 0 && { skippedDuplicates }),
97
+ };
98
+ }
@@ -213,7 +213,7 @@ router.get(
213
213
 
214
214
  router.post(
215
215
  '/:prefix/:type/:identifier/operation',
216
- requireRole(UserRole.Admin),
216
+ requireRole(UserRole.Admin, [UserRole.Connector]),
217
217
  zValidator('param', resourceParamsSchema),
218
218
  zValidator('json', updateOperationBodySchema),
219
219
  async (c) => {
@@ -25,7 +25,7 @@ export const resourceFileParamsSchema = resourceParamsSchema.extend({
25
25
  export type ResourceFileParams = z.infer<typeof resourceFileParamsSchema>;
26
26
 
27
27
  export const validateResourceParamsSchema = resourceParamsSchema.extend({
28
- type: z.enum(resourceTypes.filter((type) => type !== 'calculations')),
28
+ type: z.enum(resourceTypes),
29
29
  });
30
30
 
31
31
  export type ValidateResourceParams = z.infer<
@@ -54,7 +54,9 @@ export const updateOperationBodySchema = z.object({
54
54
  }),
55
55
  z.object({
56
56
  name: z.literal('change'),
57
- target: z.unknown(),
57
+ // The old value; scalar changes have none, and clients drop the key
58
+ // entirely when it is undefined (JSON.stringify omits undefined).
59
+ target: z.unknown().optional(),
58
60
  to: z.unknown(),
59
61
  mappingTable: z
60
62
  .object({
@@ -532,7 +532,7 @@ export async function getWorkflowGraph(
532
532
 
533
533
  /**
534
534
  * Perform an updateOperation on a resource key.
535
- * This delegates to data-handler Update.applyResourceOperation.
535
+ * This delegates to the data-handler mutation engine.
536
536
  */
537
537
  export async function updateResourceWithOperation(
538
538
  commands: CommandManager,
@@ -542,11 +542,12 @@ export async function updateResourceWithOperation(
542
542
  const { updateKey, operation } = body;
543
543
  await commands.atomic(
544
544
  () =>
545
- commands.updateCmd.applyResourceOperation(
546
- resourceNameToString(resource),
545
+ commands.updateCmd.apply({
546
+ kind: 'edit',
547
+ target: resource,
547
548
  updateKey,
548
549
  operation,
549
- ),
550
+ }),
550
551
  `Update ${resource.type} ${resource.identifier}`,
551
552
  );
552
553
  }
package/src/index.ts CHANGED
@@ -37,13 +37,12 @@ const DEFAULT_MAX_PORT = DEFAULT_PORT + 100;
37
37
  export async function previewSite(dir: string, findPort: boolean = true) {
38
38
  const app = new Hono();
39
39
  app.use(serveStatic({ root: dir }));
40
- app.get('*', (c) => {
40
+ app.get('*', async (c) => {
41
41
  if (c.req.path.startsWith('/api/')) {
42
42
  return c.json({ error: 'Resource not found' }, 404);
43
43
  }
44
- return c.html(
45
- readFile(path.join(dir, 'index.html')).then((file) => file.toString()),
46
- );
44
+ const file = await readFile(path.join(dir, 'index.html'));
45
+ return c.html(file.toString());
47
46
  });
48
47
 
49
48
  let port = parseInt(process.env.PORT || DEFAULT_PORT.toString(), 10);
@@ -64,7 +63,7 @@ export async function startServer(
64
63
  authProvider: AuthProvider,
65
64
  registry: ProjectRegistry,
66
65
  findPort: boolean = true,
67
- rootPath?: string,
66
+ multiProjectRoot?: string,
68
67
  ) {
69
68
  const useOsAssigned = process.env.CYBERISMO_E2E_OSPORT === 'true';
70
69
  let port = useOsAssigned
@@ -73,7 +72,13 @@ export async function startServer(
73
72
  if (findPort && !useOsAssigned) {
74
73
  port = await findFreePort(port, DEFAULT_MAX_PORT);
75
74
  }
76
- const app = createApp(authProvider, registry, undefined, false, rootPath);
75
+ const app = createApp(
76
+ authProvider,
77
+ registry,
78
+ undefined,
79
+ false,
80
+ multiProjectRoot,
81
+ );
77
82
  startApp(app, port);
78
83
  }
79
84
 
package/src/main.ts CHANGED
@@ -91,12 +91,6 @@ if (args.export) {
91
91
  : undefined,
92
92
  });
93
93
  } else {
94
- if (projects.length === 0) {
95
- console.error(
96
- `No projects found in "${projectPath}". Cannot start the server without at least one project.`,
97
- );
98
- process.exit(1);
99
- }
100
94
  const autocommit = process.env.CYBERISMO_AUTOCOMMIT === 'true';
101
95
  const registry = await ProjectRegistry.fromScannedProjects(projects, {
102
96
  autocommit,
@@ -24,6 +24,7 @@ declare module 'hono' {
24
24
  }
25
25
 
26
26
  const roleLevel: Record<UserRole, number> = {
27
+ [UserRole.Connector]: -1,
27
28
  [UserRole.Reader]: 0,
28
29
  [UserRole.Editor]: 1,
29
30
  [UserRole.Admin]: 2,
@@ -72,10 +73,15 @@ export function hasRole(c: Context, minimumRole: UserRole): boolean {
72
73
  }
73
74
 
74
75
  /**
75
- * Require minimum role middleware factory
76
- * Returns a middleware that checks if the user has at least the required role
76
+ * Require minimum role middleware factory.
77
+ * Optional exactRoles allows orthogonal roles (e.g. Connector) that bypass
78
+ * the hierarchy with an exact match.
79
+ * e.g. requireRole(Admin, [Connector]) → Admin ✓, Editor ✗, Connector ✓
77
80
  */
78
- export function requireRole(minimumRole: UserRole): MiddlewareHandler {
81
+ export function requireRole(
82
+ minimumRole: UserRole,
83
+ exactRoles?: UserRole[],
84
+ ): MiddlewareHandler {
79
85
  return async (c, next) => {
80
86
  const user = c.get('user');
81
87
 
@@ -83,7 +89,7 @@ export function requireRole(minimumRole: UserRole): MiddlewareHandler {
83
89
  return c.json({ error: 'Unauthorized' }, 401);
84
90
  }
85
91
 
86
- if (!hasRole(c, minimumRole)) {
92
+ if (!hasRole(c, minimumRole) && !exactRoles?.includes(user.role)) {
87
93
  return c.json({ error: 'Forbidden' }, 403);
88
94
  }
89
95
 
@@ -34,8 +34,13 @@ export interface ScannedProject {
34
34
 
35
35
  export class ProjectRegistry implements ProjectProvider {
36
36
  private projects: Map<string, CommandManager> = new Map();
37
+ readonly options: ConstructorParameters<typeof CommandManager>[1];
37
38
 
38
- constructor(entries: ProjectRegistryEntry[] = []) {
39
+ constructor(
40
+ entries: ProjectRegistryEntry[] = [],
41
+ options?: ConstructorParameters<typeof CommandManager>[1],
42
+ ) {
43
+ this.options = options;
39
44
  for (const entry of entries) {
40
45
  this.add(entry.prefix, entry.commands);
41
46
  }
@@ -120,6 +125,6 @@ export class ProjectRegistry implements ProjectProvider {
120
125
  await commands.initialize();
121
126
  entries.push({ prefix: project.prefix, commands });
122
127
  }
123
- return new ProjectRegistry(entries);
128
+ return new ProjectRegistry(entries, options);
124
129
  }
125
130
  }
package/src/types.ts CHANGED
@@ -32,11 +32,14 @@ export interface TreeOptions {
32
32
  * - Admin: All operations including configuration
33
33
  * - Editor: Can create, edit, and manage content but not config
34
34
  * - Reader: Can only view content
35
+ * Orthogonal role (outside hierarchy):
36
+ * - Connector: Service accounts that can only create/update calculations
35
37
  */
36
38
  export enum UserRole {
37
39
  Admin = 'admin',
38
40
  Editor = 'editor',
39
41
  Reader = 'reader',
42
+ Connector = 'connector',
40
43
  }
41
44
 
42
45
  /**
@@ -1 +0,0 @@
1
- import"./chunk-NNHCCRGN-DlpIbxXb.js";import{x as e}from"./mermaid-parser.core-DFZGVidJ.js";export{e as createArchitectureServices};