@cicore/cli 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 (337) hide show
  1. package/bin/ci.js +13 -0
  2. package/dist/commands/addon/api-actions.d.ts +45 -0
  3. package/dist/commands/addon/api-actions.d.ts.map +1 -0
  4. package/dist/commands/addon/api-actions.js +281 -0
  5. package/dist/commands/addon/api-actions.js.map +1 -0
  6. package/dist/commands/addon/build.d.ts +11 -0
  7. package/dist/commands/addon/build.d.ts.map +1 -0
  8. package/dist/commands/addon/build.js +182 -0
  9. package/dist/commands/addon/build.js.map +1 -0
  10. package/dist/commands/addon/create.d.ts +11 -0
  11. package/dist/commands/addon/create.d.ts.map +1 -0
  12. package/dist/commands/addon/create.js +1186 -0
  13. package/dist/commands/addon/create.js.map +1 -0
  14. package/dist/commands/addon/delete.d.ts +13 -0
  15. package/dist/commands/addon/delete.d.ts.map +1 -0
  16. package/dist/commands/addon/delete.js +83 -0
  17. package/dist/commands/addon/delete.js.map +1 -0
  18. package/dist/commands/addon/deploy.d.ts +27 -0
  19. package/dist/commands/addon/deploy.d.ts.map +1 -0
  20. package/dist/commands/addon/deploy.js +459 -0
  21. package/dist/commands/addon/deploy.js.map +1 -0
  22. package/dist/commands/addon/dev-deploy.d.ts +31 -0
  23. package/dist/commands/addon/dev-deploy.d.ts.map +1 -0
  24. package/dist/commands/addon/dev-deploy.js +128 -0
  25. package/dist/commands/addon/dev-deploy.js.map +1 -0
  26. package/dist/commands/addon/dev.d.ts +36 -0
  27. package/dist/commands/addon/dev.d.ts.map +1 -0
  28. package/dist/commands/addon/dev.js +323 -0
  29. package/dist/commands/addon/dev.js.map +1 -0
  30. package/dist/commands/addon/extract-classes.d.ts +23 -0
  31. package/dist/commands/addon/extract-classes.d.ts.map +1 -0
  32. package/dist/commands/addon/extract-classes.js +281 -0
  33. package/dist/commands/addon/extract-classes.js.map +1 -0
  34. package/dist/commands/addon/generate-safelist.d.ts +24 -0
  35. package/dist/commands/addon/generate-safelist.d.ts.map +1 -0
  36. package/dist/commands/addon/generate-safelist.js +276 -0
  37. package/dist/commands/addon/generate-safelist.js.map +1 -0
  38. package/dist/commands/addon/index.d.ts +19 -0
  39. package/dist/commands/addon/index.d.ts.map +1 -0
  40. package/dist/commands/addon/index.js +296 -0
  41. package/dist/commands/addon/index.js.map +1 -0
  42. package/dist/commands/addon/init-repo.d.ts +25 -0
  43. package/dist/commands/addon/init-repo.d.ts.map +1 -0
  44. package/dist/commands/addon/init-repo.js +171 -0
  45. package/dist/commands/addon/init-repo.js.map +1 -0
  46. package/dist/commands/addon/install.d.ts +23 -0
  47. package/dist/commands/addon/install.d.ts.map +1 -0
  48. package/dist/commands/addon/install.js +84 -0
  49. package/dist/commands/addon/install.js.map +1 -0
  50. package/dist/commands/addon/list.d.ts +10 -0
  51. package/dist/commands/addon/list.d.ts.map +1 -0
  52. package/dist/commands/addon/list.js +102 -0
  53. package/dist/commands/addon/list.js.map +1 -0
  54. package/dist/commands/addon/manifest-refresh.d.ts +17 -0
  55. package/dist/commands/addon/manifest-refresh.d.ts.map +1 -0
  56. package/dist/commands/addon/manifest-refresh.js +48 -0
  57. package/dist/commands/addon/manifest-refresh.js.map +1 -0
  58. package/dist/commands/addon/migrate.d.ts +40 -0
  59. package/dist/commands/addon/migrate.d.ts.map +1 -0
  60. package/dist/commands/addon/migrate.js +236 -0
  61. package/dist/commands/addon/migrate.js.map +1 -0
  62. package/dist/commands/addon/publish.d.ts +33 -0
  63. package/dist/commands/addon/publish.d.ts.map +1 -0
  64. package/dist/commands/addon/publish.js +236 -0
  65. package/dist/commands/addon/publish.js.map +1 -0
  66. package/dist/commands/addon/scaffold-quality.d.ts +21 -0
  67. package/dist/commands/addon/scaffold-quality.d.ts.map +1 -0
  68. package/dist/commands/addon/scaffold-quality.js +90 -0
  69. package/dist/commands/addon/scaffold-quality.js.map +1 -0
  70. package/dist/commands/addon/sign.d.ts +9 -0
  71. package/dist/commands/addon/sign.d.ts.map +1 -0
  72. package/dist/commands/addon/sign.js +83 -0
  73. package/dist/commands/addon/sign.js.map +1 -0
  74. package/dist/commands/addon/toggle.d.ts +6 -0
  75. package/dist/commands/addon/toggle.d.ts.map +1 -0
  76. package/dist/commands/addon/toggle.js +46 -0
  77. package/dist/commands/addon/toggle.js.map +1 -0
  78. package/dist/commands/agent/index.d.ts +34 -0
  79. package/dist/commands/agent/index.d.ts.map +1 -0
  80. package/dist/commands/agent/index.js +564 -0
  81. package/dist/commands/agent/index.js.map +1 -0
  82. package/dist/commands/brand/index.d.ts +54 -0
  83. package/dist/commands/brand/index.d.ts.map +1 -0
  84. package/dist/commands/brand/index.js +367 -0
  85. package/dist/commands/brand/index.js.map +1 -0
  86. package/dist/commands/build/index.d.ts +53 -0
  87. package/dist/commands/build/index.d.ts.map +1 -0
  88. package/dist/commands/build/index.js +726 -0
  89. package/dist/commands/build/index.js.map +1 -0
  90. package/dist/commands/cache/flush-local.d.ts +31 -0
  91. package/dist/commands/cache/flush-local.d.ts.map +1 -0
  92. package/dist/commands/cache/flush-local.js +161 -0
  93. package/dist/commands/cache/flush-local.js.map +1 -0
  94. package/dist/commands/cache/index.d.ts +14 -0
  95. package/dist/commands/cache/index.d.ts.map +1 -0
  96. package/dist/commands/cache/index.js +453 -0
  97. package/dist/commands/cache/index.js.map +1 -0
  98. package/dist/commands/check/index.d.ts +8 -0
  99. package/dist/commands/check/index.d.ts.map +1 -0
  100. package/dist/commands/check/index.js +1316 -0
  101. package/dist/commands/check/index.js.map +1 -0
  102. package/dist/commands/cloudflare/index.d.ts +8 -0
  103. package/dist/commands/cloudflare/index.d.ts.map +1 -0
  104. package/dist/commands/cloudflare/index.js +453 -0
  105. package/dist/commands/cloudflare/index.js.map +1 -0
  106. package/dist/commands/core/create.d.ts +12 -0
  107. package/dist/commands/core/create.d.ts.map +1 -0
  108. package/dist/commands/core/create.js +206 -0
  109. package/dist/commands/core/create.js.map +1 -0
  110. package/dist/commands/core/delete.d.ts +11 -0
  111. package/dist/commands/core/delete.d.ts.map +1 -0
  112. package/dist/commands/core/delete.js +64 -0
  113. package/dist/commands/core/delete.js.map +1 -0
  114. package/dist/commands/core/env.d.ts +12 -0
  115. package/dist/commands/core/env.d.ts.map +1 -0
  116. package/dist/commands/core/env.js +95 -0
  117. package/dist/commands/core/env.js.map +1 -0
  118. package/dist/commands/core/health.d.ts +6 -0
  119. package/dist/commands/core/health.d.ts.map +1 -0
  120. package/dist/commands/core/health.js +215 -0
  121. package/dist/commands/core/health.js.map +1 -0
  122. package/dist/commands/core/index.d.ts +15 -0
  123. package/dist/commands/core/index.d.ts.map +1 -0
  124. package/dist/commands/core/index.js +86 -0
  125. package/dist/commands/core/index.js.map +1 -0
  126. package/dist/commands/core/list.d.ts +11 -0
  127. package/dist/commands/core/list.d.ts.map +1 -0
  128. package/dist/commands/core/list.js +58 -0
  129. package/dist/commands/core/list.js.map +1 -0
  130. package/dist/commands/core/rebuild.d.ts +13 -0
  131. package/dist/commands/core/rebuild.d.ts.map +1 -0
  132. package/dist/commands/core/rebuild.js +119 -0
  133. package/dist/commands/core/rebuild.js.map +1 -0
  134. package/dist/commands/db/index.d.ts +23 -0
  135. package/dist/commands/db/index.d.ts.map +1 -0
  136. package/dist/commands/db/index.js +355 -0
  137. package/dist/commands/db/index.js.map +1 -0
  138. package/dist/commands/db/promote-silo.d.ts +320 -0
  139. package/dist/commands/db/promote-silo.d.ts.map +1 -0
  140. package/dist/commands/db/promote-silo.js +930 -0
  141. package/dist/commands/db/promote-silo.js.map +1 -0
  142. package/dist/commands/db/relocate.d.ts +41 -0
  143. package/dist/commands/db/relocate.d.ts.map +1 -0
  144. package/dist/commands/db/relocate.js +482 -0
  145. package/dist/commands/db/relocate.js.map +1 -0
  146. package/dist/commands/db/rollback-silo.d.ts +44 -0
  147. package/dist/commands/db/rollback-silo.d.ts.map +1 -0
  148. package/dist/commands/db/rollback-silo.js +402 -0
  149. package/dist/commands/db/rollback-silo.js.map +1 -0
  150. package/dist/commands/deploy/index.d.ts +26 -0
  151. package/dist/commands/deploy/index.d.ts.map +1 -0
  152. package/dist/commands/deploy/index.js +107 -0
  153. package/dist/commands/deploy/index.js.map +1 -0
  154. package/dist/commands/devops/index.d.ts +6 -0
  155. package/dist/commands/devops/index.d.ts.map +1 -0
  156. package/dist/commands/devops/index.js +220 -0
  157. package/dist/commands/devops/index.js.map +1 -0
  158. package/dist/commands/domain/index.d.ts +8 -0
  159. package/dist/commands/domain/index.d.ts.map +1 -0
  160. package/dist/commands/domain/index.js +386 -0
  161. package/dist/commands/domain/index.js.map +1 -0
  162. package/dist/commands/image/index.d.ts +8 -0
  163. package/dist/commands/image/index.d.ts.map +1 -0
  164. package/dist/commands/image/index.js +308 -0
  165. package/dist/commands/image/index.js.map +1 -0
  166. package/dist/commands/install/factory-reset.d.ts +21 -0
  167. package/dist/commands/install/factory-reset.d.ts.map +1 -0
  168. package/dist/commands/install/factory-reset.js +83 -0
  169. package/dist/commands/install/factory-reset.js.map +1 -0
  170. package/dist/commands/install/index.d.ts +17 -0
  171. package/dist/commands/install/index.d.ts.map +1 -0
  172. package/dist/commands/install/index.js +44 -0
  173. package/dist/commands/install/index.js.map +1 -0
  174. package/dist/commands/install/install.d.ts +35 -0
  175. package/dist/commands/install/install.d.ts.map +1 -0
  176. package/dist/commands/install/install.js +171 -0
  177. package/dist/commands/install/install.js.map +1 -0
  178. package/dist/commands/login/index.d.ts +15 -0
  179. package/dist/commands/login/index.d.ts.map +1 -0
  180. package/dist/commands/login/index.js +58 -0
  181. package/dist/commands/login/index.js.map +1 -0
  182. package/dist/commands/nginx/index.d.ts +11 -0
  183. package/dist/commands/nginx/index.d.ts.map +1 -0
  184. package/dist/commands/nginx/index.js +580 -0
  185. package/dist/commands/nginx/index.js.map +1 -0
  186. package/dist/commands/server/bootstrap.d.ts +25 -0
  187. package/dist/commands/server/bootstrap.d.ts.map +1 -0
  188. package/dist/commands/server/bootstrap.js +260 -0
  189. package/dist/commands/server/bootstrap.js.map +1 -0
  190. package/dist/commands/server/index.d.ts +8 -0
  191. package/dist/commands/server/index.d.ts.map +1 -0
  192. package/dist/commands/server/index.js +2524 -0
  193. package/dist/commands/server/index.js.map +1 -0
  194. package/dist/commands/setup/index.d.ts +34 -0
  195. package/dist/commands/setup/index.d.ts.map +1 -0
  196. package/dist/commands/setup/index.js +423 -0
  197. package/dist/commands/setup/index.js.map +1 -0
  198. package/dist/commands/ssl/index.d.ts +8 -0
  199. package/dist/commands/ssl/index.d.ts.map +1 -0
  200. package/dist/commands/ssl/index.js +275 -0
  201. package/dist/commands/ssl/index.js.map +1 -0
  202. package/dist/commands/superadmin/index.d.ts +16 -0
  203. package/dist/commands/superadmin/index.d.ts.map +1 -0
  204. package/dist/commands/superadmin/index.js +81 -0
  205. package/dist/commands/superadmin/index.js.map +1 -0
  206. package/dist/commands/tenant/index.d.ts +6 -0
  207. package/dist/commands/tenant/index.d.ts.map +1 -0
  208. package/dist/commands/tenant/index.js +192 -0
  209. package/dist/commands/tenant/index.js.map +1 -0
  210. package/dist/index.d.ts +11 -0
  211. package/dist/index.d.ts.map +1 -0
  212. package/dist/index.js +107 -0
  213. package/dist/index.js.map +1 -0
  214. package/dist/lib/addon-sign.d.ts +23 -0
  215. package/dist/lib/addon-sign.d.ts.map +1 -0
  216. package/dist/lib/addon-sign.js +39 -0
  217. package/dist/lib/addon-sign.js.map +1 -0
  218. package/dist/lib/addon-sign.test.d.ts +2 -0
  219. package/dist/lib/addon-sign.test.d.ts.map +1 -0
  220. package/dist/lib/addon-sign.test.js +27 -0
  221. package/dist/lib/addon-sign.test.js.map +1 -0
  222. package/dist/lib/cdn.d.ts +25 -0
  223. package/dist/lib/cdn.d.ts.map +1 -0
  224. package/dist/lib/cdn.js +131 -0
  225. package/dist/lib/cdn.js.map +1 -0
  226. package/dist/lib/cloudflare.d.ts +133 -0
  227. package/dist/lib/cloudflare.d.ts.map +1 -0
  228. package/dist/lib/cloudflare.js +435 -0
  229. package/dist/lib/cloudflare.js.map +1 -0
  230. package/dist/lib/config.d.ts +96 -0
  231. package/dist/lib/config.d.ts.map +1 -0
  232. package/dist/lib/config.js +132 -0
  233. package/dist/lib/config.js.map +1 -0
  234. package/dist/lib/env.d.ts +8 -0
  235. package/dist/lib/env.d.ts.map +1 -0
  236. package/dist/lib/env.js +64 -0
  237. package/dist/lib/env.js.map +1 -0
  238. package/dist/lib/hosts.d.ts +194 -0
  239. package/dist/lib/hosts.d.ts.map +1 -0
  240. package/dist/lib/hosts.js +183 -0
  241. package/dist/lib/hosts.js.map +1 -0
  242. package/dist/lib/logger.d.ts +68 -0
  243. package/dist/lib/logger.d.ts.map +1 -0
  244. package/dist/lib/logger.js +130 -0
  245. package/dist/lib/logger.js.map +1 -0
  246. package/dist/lib/nginx-config.d.ts +78 -0
  247. package/dist/lib/nginx-config.d.ts.map +1 -0
  248. package/dist/lib/nginx-config.js +736 -0
  249. package/dist/lib/nginx-config.js.map +1 -0
  250. package/dist/lib/ops/addon-dev.d.ts +93 -0
  251. package/dist/lib/ops/addon-dev.d.ts.map +1 -0
  252. package/dist/lib/ops/addon-dev.js +237 -0
  253. package/dist/lib/ops/addon-dev.js.map +1 -0
  254. package/dist/lib/ops/addon-quality.d.ts +38 -0
  255. package/dist/lib/ops/addon-quality.d.ts.map +1 -0
  256. package/dist/lib/ops/addon-quality.js +338 -0
  257. package/dist/lib/ops/addon-quality.js.map +1 -0
  258. package/dist/lib/ops/addon-routes.d.ts +49 -0
  259. package/dist/lib/ops/addon-routes.d.ts.map +1 -0
  260. package/dist/lib/ops/addon-routes.js +189 -0
  261. package/dist/lib/ops/addon-routes.js.map +1 -0
  262. package/dist/lib/ops/addon.d.ts +120 -0
  263. package/dist/lib/ops/addon.d.ts.map +1 -0
  264. package/dist/lib/ops/addon.js +260 -0
  265. package/dist/lib/ops/addon.js.map +1 -0
  266. package/dist/lib/ops/cdn.d.ts +87 -0
  267. package/dist/lib/ops/cdn.d.ts.map +1 -0
  268. package/dist/lib/ops/cdn.js +170 -0
  269. package/dist/lib/ops/cdn.js.map +1 -0
  270. package/dist/lib/ops/cf.d.ts +36 -0
  271. package/dist/lib/ops/cf.d.ts.map +1 -0
  272. package/dist/lib/ops/cf.js +114 -0
  273. package/dist/lib/ops/cf.js.map +1 -0
  274. package/dist/lib/ops/compose.d.ts +95 -0
  275. package/dist/lib/ops/compose.d.ts.map +1 -0
  276. package/dist/lib/ops/compose.js +165 -0
  277. package/dist/lib/ops/compose.js.map +1 -0
  278. package/dist/lib/ops/core.d.ts +117 -0
  279. package/dist/lib/ops/core.d.ts.map +1 -0
  280. package/dist/lib/ops/core.js +322 -0
  281. package/dist/lib/ops/core.js.map +1 -0
  282. package/dist/lib/ops/db.d.ts +116 -0
  283. package/dist/lib/ops/db.d.ts.map +1 -0
  284. package/dist/lib/ops/db.js +351 -0
  285. package/dist/lib/ops/db.js.map +1 -0
  286. package/dist/lib/ops/dns.d.ts +111 -0
  287. package/dist/lib/ops/dns.d.ts.map +1 -0
  288. package/dist/lib/ops/dns.js +306 -0
  289. package/dist/lib/ops/dns.js.map +1 -0
  290. package/dist/lib/ops/image.d.ts +94 -0
  291. package/dist/lib/ops/image.d.ts.map +1 -0
  292. package/dist/lib/ops/image.js +159 -0
  293. package/dist/lib/ops/image.js.map +1 -0
  294. package/dist/lib/ops/nginx.d.ts +114 -0
  295. package/dist/lib/ops/nginx.d.ts.map +1 -0
  296. package/dist/lib/ops/nginx.js +388 -0
  297. package/dist/lib/ops/nginx.js.map +1 -0
  298. package/dist/lib/ops/redis.d.ts +7 -0
  299. package/dist/lib/ops/redis.d.ts.map +1 -0
  300. package/dist/lib/ops/redis.js +35 -0
  301. package/dist/lib/ops/redis.js.map +1 -0
  302. package/dist/lib/ops/ssh.d.ts +127 -0
  303. package/dist/lib/ops/ssh.d.ts.map +1 -0
  304. package/dist/lib/ops/ssh.js +269 -0
  305. package/dist/lib/ops/ssh.js.map +1 -0
  306. package/dist/lib/prompts.d.ts +46 -0
  307. package/dist/lib/prompts.d.ts.map +1 -0
  308. package/dist/lib/prompts.js +113 -0
  309. package/dist/lib/prompts.js.map +1 -0
  310. package/dist/lib/sast.d.ts +43 -0
  311. package/dist/lib/sast.d.ts.map +1 -0
  312. package/dist/lib/sast.js +79 -0
  313. package/dist/lib/sast.js.map +1 -0
  314. package/dist/lib/sast.test.d.ts +2 -0
  315. package/dist/lib/sast.test.d.ts.map +1 -0
  316. package/dist/lib/sast.test.js +33 -0
  317. package/dist/lib/sast.test.js.map +1 -0
  318. package/dist/lib/shell.d.ts +61 -0
  319. package/dist/lib/shell.d.ts.map +1 -0
  320. package/dist/lib/shell.js +183 -0
  321. package/dist/lib/shell.js.map +1 -0
  322. package/dist/lib/ssh-config.d.ts +37 -0
  323. package/dist/lib/ssh-config.d.ts.map +1 -0
  324. package/dist/lib/ssh-config.js +122 -0
  325. package/dist/lib/ssh-config.js.map +1 -0
  326. package/dist/lib/tenant-scope.d.ts +38 -0
  327. package/dist/lib/tenant-scope.d.ts.map +1 -0
  328. package/dist/lib/tenant-scope.js +129 -0
  329. package/dist/lib/tenant-scope.js.map +1 -0
  330. package/dist/lib/tenant-scope.test.d.ts +2 -0
  331. package/dist/lib/tenant-scope.test.d.ts.map +1 -0
  332. package/dist/lib/tenant-scope.test.js +223 -0
  333. package/dist/lib/tenant-scope.test.js.map +1 -0
  334. package/package.json +58 -0
  335. package/templates/bootstrap/.env.template +54 -0
  336. package/templates/bootstrap/docker-compose.yml +145 -0
  337. package/templates/vhost.conf.tmpl +446 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/addon/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,WAAW,EACX,eAAe,GAChB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,iFAAiF;AAEjF,qCAAqC;AACrC,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;SAC1B,WAAW,EAAE;SACb,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC;AAED,oCAAoC;AACpC,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC5B,IAAI,CAAC,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,qCAAqC;AACrC,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,GAAG,CAAC,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IAE9C,yCAAyC;IACzC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,GAAG,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qDAAqD;IACrD,4DAA4D;IAC5D,mEAAmE;IACnE,iEAAiE;IACjE,uDAAuD;IACvD,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;IACjG,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAE9C,2BAA2B;IAC3B,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,2BAA2B,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,MAAM,IAAI,GAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAO,iBAAiB;IACxD,MAAM,KAAK,GAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAO,gBAAgB;IACvD,MAAM,MAAM,GAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK;IAC5C,MAAM,OAAO,GAAK,SAAS,CAAC,IAAI,CAAC,CAAC,CAAK,iBAAiB;IAExD,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,YAAY,EAAM,IAAI,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,CAAC,UAAU,EAAQ,IAAI,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAChC,GAAG,CAAC,EAAE,CAAC,cAAc,EAAI,MAAM,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,CAAC,cAAc,EAAI,OAAO,CAAC,CAAC;IAClC,GAAG,CAAC,KAAK,EAAE,CAAC;IAEZ,uBAAuB;IACvB,MAAM,CAAC,GAAG,OAAO,CAAC,0CAA0C,CAAC,CAAC,KAAK,EAAE,CAAC;IAEtE,IAAI,CAAC;QACH,YAAY;QACZ,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;QACnE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAChE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAE1D,WAAW;QACX,MAAM,KAAK,CAAC,SAAS,EAAE,YAAY,EAA2B,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAChH,MAAM,KAAK,CAAC,SAAS,EAAE,cAAc,EAAyB,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACpF,MAAM,KAAK,CAAC,SAAS,EAAE,YAAY,EAA2B,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,CAAC,SAAS,EAAE,mBAAmB,EAAoB,gBAAgB,EAAE,CAAC,CAAC;QAClF,MAAM,KAAK,CAAC,SAAS,EAAE,gBAAgB,EAAuB,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,MAAM,KAAK,CAAC,SAAS,EAAE,2BAA2B,EAAY,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACrF,MAAM,KAAK,CAAC,SAAS,EAAE,uBAAuB,IAAI,gBAAgB,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/F,MAAM,KAAK,CAAC,SAAS,EAAE,oBAAoB,IAAI,aAAa,EAAO,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7F,MAAM,KAAK,CAAC,SAAS,EAAE,gCAAgC,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACpH,MAAM,KAAK,CAAC,SAAS,EAAE,uBAAuB,EAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/F,MAAM,KAAK,CAAC,SAAS,EAAE,qBAAqB,EAAkB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7F,MAAM,KAAK,CAAC,SAAS,EAAE,aAAa,EAA0B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAChF,MAAM,KAAK,CAAC,SAAS,EAAE,cAAc,EAAyB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,MAAM,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAsB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3F,MAAM,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAsB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3F,oEAAoE;QACpE,kEAAkE;QAClE,kEAAkE;QAClE,sCAAsC;QACtC,MAAM,KAAK,CAAC,SAAS,EAAE,gBAAgB,EAAuB,eAAe,EAAE,CAAC,CAAC;QACjF,MAAM,KAAK,CAAC,SAAS,EAAE,kBAAkB,EAAqB,iBAAiB,EAAE,CAAC,CAAC;QACnF,MAAM,KAAK,CAAC,SAAS,EAAE,eAAe,EAAwB,eAAe,EAAE,CAAC,CAAC;QACjF,MAAM,KAAK,CAAC,SAAS,EAAE,eAAe,EAAwB,WAAW,EAAE,CAAC,CAAC;QAC7E,MAAM,KAAK,CAAC,SAAS,EAAE,gBAAgB,EAAuB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,4DAA4D;QAC5D,kEAAkE;QAClE,mDAAmD;QACnD,MAAM,KAAK,CAAC,SAAS,EAAE,UAAU,EAA6B,eAAe,EAAE,CAAC,CAAC;QACjF,MAAM,KAAK,CAAC,SAAS,EAAE,YAAY,EAA2B,YAAY,EAAE,CAAC,CAAC;QAE9E,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACjC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,UAAU;IACV,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,kCAAkC,CAAC,CAAC;IACxD,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;IACtC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,4BAA4B,CAAC,CAAC;IACrD,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,wBAAwB,IAAI,gBAAgB,CAAC,CAAC;IACrE,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,qBAAqB,IAAI,aAAa,CAAC,CAAC;IAC/D,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,iCAAiC,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACzF,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,wBAAwB,CAAC,CAAC;IACjD,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,sBAAsB,CAAC,CAAC;IAC/C,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,cAAc,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,8BAA8B,CAAC,CAAC;IACvD,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC7B,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,6CAA6C,CAAC,CAAC;IACzE,GAAG,CAAC,IAAI,CAAC,uBAAuB,IAAI,gCAAgC,CAAC,CAAC;IACtE,GAAG,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACrD,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,8BAA8B,CAAC,CAAC;IAChE,GAAG,CAAC,IAAI,CAAC,kCAAkC,IAAI,cAAc,CAAC,CAAC;IAC/D,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC3D,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACpC,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACrC,GAAG,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACjF,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACzC,GAAG,CAAC,IAAI,CAAC,MAAM,SAAS,qDAAqD,IAAI,kBAAkB,CAAC,CAAC;AACvG,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,KAAK,CAAC,IAAY,EAAE,GAAW,EAAE,OAAwB;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa,EAAE,MAAc,EAAE,OAAe;IAC9F,2EAA2E;IAC3E,uEAAuE;IACvE,kEAAkE;IAClE,oEAAoE;IACpE,kEAAkE;IAClE,OAAO;QACL,IAAI;QACJ,YAAY,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE;QAC1C,OAAO,EAAE,OAAO;QAChB,mEAAmE;QACnE,8DAA8D;QAC9D,oEAAoE;QACpE,0CAA0C;QAC1C,WAAW,EAAE,GAAG,OAAO,mBAAmB;QAC1C,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,IAAI;QAEb,KAAK,EAAE;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,UAAU,IAAI,EAAE;YAC9B,IAAI,EAAE;gBACJ,KAAK,EAAE,OAAO;gBACd,UAAU,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE;gBACxC,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,EAAE;gBACT,EAAE,EAAE,UAAU,IAAI,EAAE;aACrB;SACF;QAED,GAAG,EAAE;YACH,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,cAAc,IAAI,EAAE;YAClC,IAAI,EAAE;gBACJ,KAAK,EAAE,OAAO;gBACd,UAAU,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE;gBACxC,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,EAAE;gBACT,EAAE,EAAE,cAAc,IAAI,EAAE;aACzB;SACF;QAED,OAAO,EAAE;YACP,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,QAAQ,IAAI,EAAE;YAC5B,SAAS,EAAE,mBAAmB,IAAI,EAAE;YACpC,WAAW,EAAE,2BAA2B;YACxC,cAAc,EAAE,oBAAoB;YACpC,YAAY,EAAE,MAAM;SACrB;QAED,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;QAC1B,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;KAC7B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,IAAI,EAAE,iBAAiB,IAAI,CAAC,WAAW,EAAE,EAAE;QAC3C,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,2BAA2B;YACjC,SAAS,EAAE,kBAAkB;SAC9B;QACD,eAAe,EAAE;YACf,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,QAAQ;YAC9B,GAAG,EAAE,SAAS;YACd,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,QAAQ;YACpB,kCAAkC,EAAE,SAAS;YAC7C,2BAA2B,EAAE,SAAS;YACtC,MAAM,EAAE,SAAS;YACjB,mBAAmB,EAAE,SAAS;YAC9B,mBAAmB,EAAE,QAAQ;SAC9B;KACF,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,YAAY;IACnB,OAAO;;;;;CAKR,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO;;;CAGR,CAAC;AACF,CAAC;AAED,gFAAgF;AAEhF,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,8EAA8E;IAC9E,kEAAkE;IAClE,MAAM,KAAK,GAAG;QACZ,OAAO;QACP,KAAK;QACL,MAAM,IAAI,SAAS;QACnB,IAAI;QACJ,iEAAiE;QACjE,uEAAuE;QACvE,KAAK;QACL,EAAE;QACF,gBAAgB;QAChB,yCAAyC;QACzC,uBAAuB,IAAI,kBAAkB,IAAI,aAAa;QAC9D,mDAAmD;QACnD,EAAE;QACF,8BAA8B;QAC9B,yBAAyB,IAAI,eAAe;QAC5C,uCAAuC,IAAI,KAAK;QAChD,EAAE;QACF,kDAAkD;QAClD,yBAAyB,IAAI,8DAA8D;QAC3F,8DAA8D;QAC9D,+DAA+D;QAC/D,8DAA8D;QAC9D,+DAA+D;QAC/D,gEAAgE;QAChE,iEAAiE;QACjE,qBAAqB;QACrB,EAAE;QACF,0CAA0C;QAC1C,yBAAyB,IAAI,kEAAkE;QAC/F,iEAAiE;QACjE,gDAAgD;QAChD,SAAS;QACT,IAAI;QACJ,EAAE;KACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAEhF,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,MAAM,KAAK,GAAG;QACZ,OAAO;QACP,0BAA0B;QAC1B,EAAE;QACF,6BAA6B,IAAI,gBAAgB;QACjD,EAAE;QACF,wDAAwD;QACxD,4DAA4D;QAC5D,gDAAgD;QAChD,uBAAuB,IAAI,eAAe,IAAI,UAAU;QACxD,EAAE;QACF,SAAS,IAAI,mCAAmC;QAChD,GAAG;QACH,gBAAgB,IAAI,mBAAmB;QACvC,EAAE;QACF,mCAAmC;QACnC,OAAO;QACP,eAAe;QACf,oCAAoC,IAAI,YAAY;QACpD,oCAAoC;QACpC,2BAA2B,IAAI,kDAAkD;QACjF,oCAAoC;QACpC,WAAW;QACX,OAAO;QACP,EAAE;QACF,gEAAgE;QAChE,OAAO;QACP,uGAAuG;QACvG,OAAO;QACP,EAAE;QACF,gBAAgB,IAAI,UAAU;QAC9B,0EAA0E;QAC1E,OAAO;QACP,yCAAyC;QACzC,kCAAkC;QAClC,oCAAoC;QACpC,+BAA+B,IAAI,IAAI;QACvC,uCAAuC;QACvC,aAAa;QACb,OAAO;QACP,EAAE;QACF,gBAAgB,IAAI,WAAW;QAC/B,2EAA2E;QAC3E,OAAO;QACP,oEAAoE;QACpE,eAAe;QACf,2EAA2E;QAC3E,oFAAoF;QACpF,oCAAoC;QACpC,sGAAsG;QACtG,WAAW;QACX,OAAO;QACP,EAAE;QACF,gBAAgB,IAAI,gBAAgB;QACpC,uFAAuF;QACvF,OAAO;QACP,oEAAoE;QACpE,uDAAuD;QACvD,yGAAyG;QACzG,8EAA8E;QAC9E,OAAO;QACP,EAAE;QACF,iBAAiB,IAAI,WAAW;QAChC,2EAA2E;QAC3E,OAAO;QACP,oEAAoE;QACpE,eAAe;QACf,8EAA8E;QAC9E,uFAAuF;QACvF,oCAAoC;QACpC,sGAAsG;QACtG,WAAW;QACX,OAAO;QACP,EAAE;QACF,kBAAkB,IAAI,gBAAgB;QACtC,yFAAyF;QACzF,OAAO;QACP,oEAAoE;QACpE,eAAe;QACf,2FAA2F;QAC3F,6GAA6G;QAC7G,kFAAkF;QAClF,oCAAoC;QACpC,sGAAsG;QACtG,WAAW;QACX,OAAO;QACP,EAAE;QACF,mBAAmB,IAAI,gBAAgB;QACvC,0FAA0F;QAC1F,OAAO;QACP,oEAAoE;QACpE,8CAA8C;QAC9C,6DAA6D;QAC7D,OAAO;QACP,EAAE;QACF,gBAAgB,IAAI,0BAA0B;QAC9C,mFAAmF;QACnF,OAAO;QACP,sFAAsF,IAAI,OAAO;QACjG,OAAO;QACP,GAAG;QACH,EAAE;KACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAEhF,SAAS,UAAU,CAAC,IAAY,EAAE,MAAc;IAC9C,MAAM,GAAG,GAAG,GAAG,MAAM,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAG;QACZ,OAAO;QACP,0BAA0B;QAC1B,EAAE;QACF,6BAA6B,IAAI,aAAa;QAC9C,EAAE;QACF,8CAA8C;QAC9C,UAAU;QACV,EAAE;QACF,SAAS,IAAI,SAAS;QACtB,GAAG;QACH,sBAAsB;QACtB,gCAAgC,GAAG,IAAI;QACvC,EAAE;QACF,mCAAmC;QACnC,OAAO;QACP,uDAAuD;QACvD,OAAO;QACP,EAAE;QACF,uDAAuD;QACvD,OAAO;QACP,iDAAiD;QACjD,sDAAsD;QACtD,4CAA4C;QAC5C,EAAE;QACF,qCAAqC;QACrC,iGAAiG;QACjG,YAAY;QACZ,gEAAgE;QAChE,gEAAgE;QAChE,2BAA2B;QAC3B,qDAAqD;QACrD,EAAE;QACF,+FAA+F;QAC/F,EAAE;QACF,kBAAkB;QAClB,qCAAqC;QACrC,+BAA+B;QAC/B,2CAA2C;QAC3C,6CAA6C;QAC7C,0CAA0C;QAC1C,iEAAiE;QACjE,gBAAgB;QAChB,YAAY;QACZ,OAAO;QACP,EAAE;QACF,iDAAiD;QACjD,OAAO;QACP,oFAAoF;QACpF,wCAAwC;QACxC,wDAAwD;QACxD,OAAO;QACP,EAAE;QACF,gDAAgD;QAChD,OAAO;QACP,6FAA6F;QAC7F,EAAE;QACF,sCAAsC;QACtC,mGAAmG;QACnG,iFAAiF;QACjF,yBAAyB;QACzB,aAAa;QACb,mGAAmG;QACnG,gDAAgD;QAChD,OAAO;QACP,EAAE;QACF,6DAA6D;QAC7D,OAAO;QACP,0CAA0C;QAC1C,sCAAsC;QACtC,EAAE;QACF,sCAAsC;QACtC,mCAAmC;QACnC,8EAA8E;QAC9E,wCAAwC;QACxC,aAAa;QACb,0BAA0B;QAC1B,mCAAmC;QACnC,yEAAyE;QACzE,gFAAgF;QAChF,aAAa;QACb,gDAAgD;QAChD,OAAO;QACP,EAAE;QACF,8CAA8C;QAC9C,OAAO;QACP,kGAAkG;QAClG,OAAO;QACP,GAAG;QACH,EAAE;KACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAEhF,SAAS,YAAY,CAAC,IAAY,EAAE,MAAc;IAChD,MAAM,EAAE,GAAI,MAAM,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,uBAAuB,EAAE,OAAO,CAAC;IAC7C,MAAM,GAAG,GAAG,GAAG,MAAM,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAG;QACZ,OAAO;QACP,0BAA0B;QAC1B,EAAE;QACF,6BAA6B,IAAI,eAAe;QAChD,EAAE;QACF,wCAAwC;QACxC,UAAU;QACV,EAAE;QACF,SAAS,GAAG,uBAAuB;QACnC,GAAG;QACH,iCAAiC,MAAM,IAAI;QAC3C,EAAE;QACF,0DAA0D,EAAE,WAAW;QACvE,EAAE;QACF,uCAAuC;QACvC,OAAO;QACP,gCAAgC;QAChC,6BAA6B;QAC7B,6EAA6E,GAAG,GAAG;QACnF,eAAe;QACf,4BAA4B;QAC5B,8BAA8B;QAC9B,EAAE;QACF,qBAAqB;QACrB,4BAA4B,GAAG,IAAI;QACnC,yEAAyE;QACzE,oDAAoD;QACpD,mCAAmC;QACnC,mDAAmD;QACnD,iDAAiD;QACjD,wDAAwD;QACxD,uDAAuD;QACvD,eAAe;QACf,aAAa;QACb,uCAAuC,MAAM,uBAAuB,GAAG,WAAW;QAClF,uCAAuC,MAAM,uBAAuB,GAAG,gBAAgB;QACvF,OAAO;QACP,EAAE;QACF,yCAAyC;QACzC,OAAO;QACP,2CAA2C,GAAG,aAAa;QAC3D,OAAO;QACP,GAAG;QACH,EAAE;KACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAEhF,SAAS,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa;IAC7D,OAAO;;;;;;kBAMS,KAAK;;;kBAGL,KAAK;;;;gBAIP,KAAK;;;;;;;;;;;yCAWoB,KAAK;;kBAE5B,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BA6BO,KAAK,wBAAwB,KAAK;;;;;qCAK3B,KAAK;;;qCAGL,KAAK;;;;;;;;sBAQpB,KAAK;;;sBAGL,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gEAuCqC,IAAI;;;4BAGxC,KAAK;;;;;;;;;;;;;;;;;;;;;;;iDAuBgB,IAAI;;;8BAGvB,KAAK;;iDAEc,IAAI;;;8BAGvB,KAAK;;;;;4BAKP,KAAK;;;;;;;;+CAQc,IAAI;4BACvB,KAAK;;;4BAGL,KAAK;;;;;;;;;;;;CAYhC,CAAC;AACF,CAAC;AAED,gFAAgF;AAEhF,SAAS,UAAU,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa;IAC3D,OAAO;;;;gBAIO,KAAK;;;gBAGL,KAAK;;;;;;;uDAOkC,KAAK;8CACd,KAAK;;;kBAGjC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gEAmCyC,IAAI;;;;;;;;;CASnE,CAAC;AACF,CAAC;AAED,gFAAgF;AAEhF,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBlB,CAAC;AACF,CAAC;AAED,gFAAgF;AAEhF,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,MAAM,IAAI;;;CAGlB,CAAC;AACF,CAAC;AAED,gFAAgF;AAEhF,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwER,CAAC;AACF,CAAC;AAED,gFAAgF;AAEhF,SAAS,WAAW,CAAC,KAAa,EAAE,OAAe;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,CAAC,KAAK,CAAC,EAAE;YACP,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,GAAG,OAAO,mBAAmB;YAC1C,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,aAAa;aAC3B;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,QAAQ;gBAChB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,QAAQ;aACjB;YACD,GAAG,EAAE;gBACH,QAAQ,EAAE,cAAc,OAAO,GAAG;gBAClC,QAAQ,EAAE,sBAAsB;gBAChC,YAAY,EAAE,eAAe;aAC9B;YACD,QAAQ,EAAE;gBACR,OAAO,EAAE,sBAAsB;gBAC/B,OAAO,EAAE,sBAAsB;gBAC/B,OAAO,EAAE,sBAAsB;gBAC/B,KAAK,EAAE,mBAAmB;aAC3B;SACF;KACF,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,OAAe;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,CAAC,KAAK,CAAC,EAAE;YACP,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,cAAc,OAAO,UAAU;YAC5C,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,UAAU;aACxB;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,cAAc;gBACtB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,OAAO;aAChB;YACD,GAAG,EAAE;gBACH,QAAQ,EAAE,GAAG,OAAO,eAAe;gBACnC,QAAQ,EAAE,mBAAmB;gBAC7B,YAAY,EAAE,cAAc;aAC7B;YACD,QAAQ,EAAE;gBACR,OAAO,EAAE,uBAAuB;gBAChC,OAAO,EAAE,uBAAuB;gBAChC,OAAO,EAAE,mBAAmB;gBAC5B,KAAK,EAAE,iBAAiB;aACzB;SACF;KACF,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,uEAAuE;AACvE,qEAAqE;AACrE,oEAAoE;AACpE,sEAAsE;AACtE,0BAA0B;AAE1B,SAAS,uBAAuB;IAC9B,OAAO;QACL,IAAI,EAAE,IAAI;QACV,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QAChD,MAAM,EAAE,mBAAmB;QAC3B,aAAa,EAAE;YACb,MAAM,EAAE,2BAA2B;YACnC,WAAW,EAAE,QAAQ;YACrB,UAAU,EAAE,QAAQ;YACpB,mBAAmB,EAAE,CAAC,MAAM,CAAC;SAC9B;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC;QACtC,OAAO,EAAE;YACP,oBAAoB;YACpB,6BAA6B;YAC7B,uCAAuC;SACxC;QACD,KAAK,EAAE;YACL,6DAA6D;YAC7D,mEAAmE;YACnE,0DAA0D;YAC1D,gCAAgC,EAAE,KAAK;YACvC,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC;YACvG,mEAAmE;YACnE,+DAA+D;YAC/D,oCAAoC,EAAE,MAAM;YAC5C,gBAAgB,EAAE,KAAK;YACvB,mCAAmC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;YACnG,cAAc,EAAE,OAAO;YACvB,QAAQ,EAAE,OAAO;SAClB;QACD,cAAc,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,CAAC;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB;IAChC,OAAO;QACL,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,GAAG;QACf,aAAa,EAAE,KAAK;QACpB,uBAAuB,EAAE,KAAK;QAC9B,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO;;;;;;;;;;;;CAYR,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;QACL,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,SAAS;YAC3B,MAAM,EAAE,IAAI;YACZ,wBAAwB,EAAE,IAAI;YAC9B,kBAAkB,EAAE,IAAI;YACxB,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,IAAI;YACrB,iBAAiB,EAAE,IAAI;YACvB,MAAM,EAAE,IAAI;YACZ,GAAG,EAAE,UAAU;YACf,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC;YACtC,6DAA6D;YAC7D,0DAA0D;YAC1D,KAAK,EAAE,CAAC,KAAK,CAAC;YACd,KAAK,EAAE;gBACL,KAAK,EAAE,CAAC,KAAK,CAAC;aACf;SACF;QACD,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC;QAC/C,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC;KACjD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuER,CAAA;AACD,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,OAAO,yCAAyC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B1D,CAAC;AACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * vu addon:delete <name> <core>
3
+ *
4
+ * Delete addon from server and optionally drop database tables
5
+ */
6
+ interface DeleteOptions {
7
+ force?: boolean;
8
+ host?: string;
9
+ dropTables?: boolean;
10
+ }
11
+ export declare function deleteAddon(name: string, core: string, options: DeleteOptions): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/addon/delete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA8BD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEnG"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * vu addon:delete <name> <core>
3
+ *
4
+ * Delete addon from server and optionally drop database tables
5
+ */
6
+ import { log, spinner } from '../../lib/logger.js';
7
+ import { exec } from '../../lib/shell.js';
8
+ import { dangerConfirm, select } from '../../lib/prompts.js';
9
+ import { parseSSHConfig } from '../../lib/ssh-config.js';
10
+ // Get SSH host from config
11
+ async function getHost(hostName) {
12
+ const hosts = await parseSSHConfig();
13
+ if (hostName) {
14
+ const host = hosts.get(hostName);
15
+ if (!host) {
16
+ log.error(`Host "${hostName}" not found in SSH config`);
17
+ return null;
18
+ }
19
+ return host;
20
+ }
21
+ // Interactive selection
22
+ if (hosts.size === 0) {
23
+ log.error('No SSH hosts found in ~/.ssh/config');
24
+ return null;
25
+ }
26
+ const choices = Array.from(hosts.values()).map(h => ({
27
+ name: h.name,
28
+ message: `${h.name} (${h.user}@${h.hostname})`
29
+ }));
30
+ const selected = await select('Select SSH host:', choices);
31
+ return hosts.get(selected) || null;
32
+ }
33
+ export async function deleteAddon(name, core, options) {
34
+ log.title(`Delete Addon: ${name} from ${core}`);
35
+ // Get SSH host
36
+ const host = await getHost(options.host);
37
+ if (!host) {
38
+ return;
39
+ }
40
+ // Helper to run SSH commands
41
+ const runSSH = async (cmd, silent = true) => {
42
+ return exec('ssh', [host.name, cmd], { silent });
43
+ };
44
+ const addonPath = `/home/cores/${core}/addons/${name}`;
45
+ const containerAddonPath = `/var/www/cores/${core}/addons/${name}`;
46
+ // Check addon exists
47
+ log.info(`Checking addon on ${host.name}...`);
48
+ const checkResult = await runSSH(`test -d ${addonPath} && echo "exists"`);
49
+ if (!checkResult.stdout.includes('exists')) {
50
+ log.error(`Addon "${name}" not found in ${core}`);
51
+ return;
52
+ }
53
+ // Confirm deletion
54
+ if (!options.force) {
55
+ const confirmed = await dangerConfirm(`Delete addon "${name}" from ${core}?`, name.toUpperCase());
56
+ if (!confirmed) {
57
+ log.warn('Cancelled');
58
+ return;
59
+ }
60
+ }
61
+ // Delete addon files
62
+ const deleteSpinner = spinner('Deleting addon files...').start();
63
+ const result = await runSSH(`rm -rf ${addonPath}`);
64
+ if (!result.success) {
65
+ deleteSpinner.fail('Failed to delete addon');
66
+ log.error(result.stderr);
67
+ return;
68
+ }
69
+ deleteSpinner.succeed('Addon files deleted');
70
+ // Clear addon cache
71
+ const cacheSpinner = spinner('Clearing addon cache...').start();
72
+ await runSSH(`rm -rf /home/cores/${core}/storage/cache/addon_* 2>/dev/null || true`);
73
+ await runSSH(`docker exec cicore_php rm -rf /var/www/cores/${core}/storage/cache/addon_* 2>/dev/null || true`);
74
+ cacheSpinner.succeed('Cache cleared');
75
+ // Restart PHP to reload addon registry
76
+ const restartSpinner = spinner('Restarting PHP...').start();
77
+ await runSSH('docker restart cicore_php');
78
+ restartSpinner.succeed('PHP restarted');
79
+ log.blank();
80
+ log.success(`Addon "${name}" deleted from ${core}`);
81
+ log.info(`Server: ${host.name}`);
82
+ }
83
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/addon/delete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ci addon deploy [--core <cicore|vucore>] [--path <addon-dir>]
3
+ *
4
+ * Personnel-friendly addon deploy. Differs from `ci addon install` in three
5
+ * ways suited to the addon-developer flow:
6
+ *
7
+ * - addon path defaults to the current working directory (the developer
8
+ * runs this from inside their cloned addon repo), not the monorepo's
9
+ * `addons/` tree.
10
+ * - host is implicit cicore (the staging instance hosts both tenants).
11
+ * - `--core` accepts only `cicore` or `vucore` — the two tenants
12
+ * served by the multi-tenant runtime — and is required.
13
+ *
14
+ * Everything downstream of packaging (upload to /home/cicore-deploy/
15
+ * incoming/, install-addon.sh trigger, container restarts) reuses the
16
+ * same primitives as `ci addon install`, so server-side behaviour and
17
+ * audit trail are identical.
18
+ */
19
+ export interface DeployOptions {
20
+ readonly core?: string;
21
+ readonly path?: string;
22
+ readonly force?: boolean;
23
+ readonly dryRun?: boolean;
24
+ readonly quality?: boolean;
25
+ }
26
+ export declare function deployAddon(options: DeployOptions): Promise<void>;
27
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/addon/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAoBH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IAIzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAC3B;AASD,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkJvE"}
@@ -0,0 +1,459 @@
1
+ /**
2
+ * ci addon deploy [--core <cicore|vucore>] [--path <addon-dir>]
3
+ *
4
+ * Personnel-friendly addon deploy. Differs from `ci addon install` in three
5
+ * ways suited to the addon-developer flow:
6
+ *
7
+ * - addon path defaults to the current working directory (the developer
8
+ * runs this from inside their cloned addon repo), not the monorepo's
9
+ * `addons/` tree.
10
+ * - host is implicit cicore (the staging instance hosts both tenants).
11
+ * - `--core` accepts only `cicore` or `vucore` — the two tenants
12
+ * served by the multi-tenant runtime — and is required.
13
+ *
14
+ * Everything downstream of packaging (upload to /home/cicore-deploy/
15
+ * incoming/, install-addon.sh trigger, container restarts) reuses the
16
+ * same primitives as `ci addon install`, so server-side behaviour and
17
+ * audit trail are identical.
18
+ */
19
+ import path from 'path';
20
+ import os from 'node:os';
21
+ import { execSync, spawnSync } from 'node:child_process';
22
+ import { glob } from 'glob';
23
+ import fs from 'fs-extra';
24
+ import enquirer from 'enquirer';
25
+ import { log, spinner } from '../../lib/logger.js';
26
+ import { getHostConfig } from '../../lib/hosts.js';
27
+ import { isDryRun } from '../../lib/config.js';
28
+ import { findShellRoot } from '../../lib/ops/addon-dev.js';
29
+ import { addonPackageBackend, addonInstallBackend, addonCleanupPackage, } from '../../lib/ops/addon.js';
30
+ import { confirm } from '../../lib/prompts.js';
31
+ import { analyzeTenantScope } from '../../lib/tenant-scope.js';
32
+ const ALLOWED_CORES = new Set(['cicore', 'vucore']);
33
+ // Both allowed cores are production tenants today. We treat any deploy
34
+ // to either as a production deploy and require the typed confirmation;
35
+ // staging tenant separation is tracked in plan FUTURE.
36
+ const PRODUCTION_CORES = new Set(['cicore', 'vucore']);
37
+ const DEPLOY_CONFIRMATION_PHRASE = 'DEPLOY TO PRODUCTION';
38
+ export async function deployAddon(options) {
39
+ log.title('Deploy Addon → cicore staging');
40
+ if (options.core === undefined || options.core === '') {
41
+ log.error('--core is required (cicore | vucore). Pass --core <name>.');
42
+ return;
43
+ }
44
+ if (!ALLOWED_CORES.has(options.core)) {
45
+ log.error(`Invalid --core "${options.core}". Allowed: cicore | vucore.`);
46
+ return;
47
+ }
48
+ const core = options.core;
49
+ const addonDir = path.resolve(options.path ?? process.cwd());
50
+ const addonJsonPath = path.join(addonDir, 'addon.json');
51
+ if (!(await fs.pathExists(addonJsonPath))) {
52
+ log.error(`addon.json not found at ${addonJsonPath}`);
53
+ log.info('Run this command from an addon directory, or pass --path <addon-dir>.');
54
+ return;
55
+ }
56
+ let addonName;
57
+ try {
58
+ const addonJson = (await fs.readJson(addonJsonPath));
59
+ addonName = String(addonJson.name ?? '');
60
+ }
61
+ catch (err) {
62
+ log.error(`Failed to read addon.json: ${err instanceof Error ? err.message : String(err)}`);
63
+ return;
64
+ }
65
+ if (!/^[A-Za-z0-9_-]+$/.test(addonName)) {
66
+ log.error(`Invalid addon name "${addonName}" in addon.json — only [A-Za-z0-9_-].`);
67
+ return;
68
+ }
69
+ log.info(`Addon: ${addonName}`);
70
+ log.info(`Source: ${addonDir}`);
71
+ log.info(`Target: cores/${core} on cicore staging`);
72
+ // Soft warning if the addon is a git repo with uncommitted changes — what
73
+ // gets deployed is the current filesystem state, not the last commit, so
74
+ // surfacing this prevents "wait, that's not what I pushed" surprises.
75
+ const dirty = isGitDirty(addonDir);
76
+ if (dirty === 'dirty') {
77
+ log.warn('addon directory has uncommitted changes — deploying current working tree, not the last commit.');
78
+ }
79
+ else if (dirty === 'untracked') {
80
+ log.warn('addon directory has untracked files — they will be included in the deploy.');
81
+ }
82
+ // ─── Quality gate ────────────────────────────────────────────────
83
+ // Runs before packaging so we don't waste a round-trip for a deploy
84
+ // we'd reject anyway. Each check is opt-in by file presence — addons
85
+ // without an eslint config don't fail eslint; addons without TS don't
86
+ // fail vue-tsc. addon.json schema is the only always-on check.
87
+ // --no-quality bypasses everything, audited so it shows up in the
88
+ // deploy log next to who chose to skip.
89
+ let bypassedQuality = false;
90
+ if (options.quality === false) {
91
+ bypassedQuality = true;
92
+ log.warn('Quality gate bypassed via --no-quality — this is audited.');
93
+ }
94
+ else {
95
+ const gate = await runQualityGate(addonDir, addonName);
96
+ if (!gate.ok) {
97
+ log.error('Quality gate failed — deploy refused. Fix the issues below, then retry:');
98
+ for (const issue of gate.issues)
99
+ log.item(issue);
100
+ log.blank();
101
+ log.info('Bypass (emergency only): rerun with --no-quality (your decision is recorded).');
102
+ return;
103
+ }
104
+ if (gate.notes.length > 0) {
105
+ log.info('Quality gate notes:');
106
+ for (const note of gate.notes)
107
+ log.item(note);
108
+ }
109
+ }
110
+ // `--dry-run` is a top-level program option (src/index.ts) so commander
111
+ // catches it before the subcommand sees it — read from global config.
112
+ // We still keep options.dryRun on the type as a future-proofing seam in
113
+ // case the global option is ever removed.
114
+ const dryRun = isDryRun() || options.dryRun === true;
115
+ if (dryRun) {
116
+ log.info('Dry-run mode — no upload, no install.');
117
+ log.kv('Would-deploy', `${addonName} → cores/${core}`);
118
+ log.kv('Source path', addonDir);
119
+ return;
120
+ }
121
+ // ─── Production confirmation friction ────────────────────────────
122
+ // Both currently-allowed cores are production tenants. A wrong-tab
123
+ // `ci addon deploy --core cicore` should not be a single Enter away
124
+ // from rewriting the live customer's addon. The literal phrase forces
125
+ // intentionality — autocomplete and "yes" reflexes don't match it.
126
+ // --force skips this (audited) for legitimate scripted workflows
127
+ // like CI/CD pipelines.
128
+ let bypassedConfirmation = false;
129
+ if (PRODUCTION_CORES.has(core)) {
130
+ if (options.force === true) {
131
+ bypassedConfirmation = true;
132
+ log.warn(`Confirmation bypassed via --force — deploying ${addonName} to ${core} (production).`);
133
+ }
134
+ else {
135
+ const ok = await requireProductionConfirmation(addonName, core, addonDir);
136
+ if (!ok) {
137
+ log.warn('Cancelled');
138
+ return;
139
+ }
140
+ }
141
+ }
142
+ else if (options.force !== true) {
143
+ // Non-production cores keep the lighter prompt for muscle memory.
144
+ const ok = await confirm(`Deploy "${addonName}" to ${core}?`, true);
145
+ if (!ok) {
146
+ log.warn('Cancelled');
147
+ return;
148
+ }
149
+ }
150
+ await appendDeployAudit({ addonName, core, force: options.force === true, bypassedQuality, bypassedConfirmation });
151
+ const cfg = getHostConfig('cicore');
152
+ const packSpinner = spinner('Packaging addon ...').start();
153
+ let pack;
154
+ try {
155
+ pack = await addonPackageBackend(addonName, addonDir);
156
+ }
157
+ catch (err) {
158
+ packSpinner.fail('Packaging failed');
159
+ log.error(err instanceof Error ? err.message : String(err));
160
+ return;
161
+ }
162
+ packSpinner.succeed(`Packaged: ${(pack.sizeBytes / 1024).toFixed(1)} KiB`);
163
+ try {
164
+ const installSpinner = spinner('Uploading + installing on cicore staging ...').start();
165
+ const result = await addonInstallBackend(cfg, pack.zipPath, addonName, core);
166
+ if (!result.success) {
167
+ installSpinner.fail('Server install failed');
168
+ log.error(result.stderr || result.stdout);
169
+ return;
170
+ }
171
+ installSpinner.succeed('Deploy complete');
172
+ }
173
+ finally {
174
+ await addonCleanupPackage(pack.zipPath);
175
+ }
176
+ log.blank();
177
+ log.success(`"${addonName}" deployed to cores/${core}/addons on cicore staging`);
178
+ log.info(`Verify in browser: https://${core}.com.tr/admin/addon-market`);
179
+ }
180
+ /**
181
+ * Quick git-status probe. Returns 'clean' when the directory is a git
182
+ * working tree with no pending changes, 'dirty' when tracked files are
183
+ * modified, 'untracked' when only untracked files exist, and 'unknown'
184
+ * when the directory isn't a git repo or git isn't available. We only
185
+ * surface this as a warning, never block — addons mid-development might
186
+ * legitimately want to ship working-tree state.
187
+ */
188
+ function isGitDirty(dir) {
189
+ try {
190
+ const out = execSync('git status --porcelain', {
191
+ cwd: dir,
192
+ encoding: 'utf8',
193
+ stdio: ['ignore', 'pipe', 'ignore'],
194
+ }).trim();
195
+ if (out === '')
196
+ return 'clean';
197
+ const lines = out.split('\n');
198
+ const hasTracked = lines.some((l) => !l.startsWith('??'));
199
+ return hasTracked ? 'dirty' : 'untracked';
200
+ }
201
+ catch {
202
+ return 'unknown';
203
+ }
204
+ }
205
+ /**
206
+ * Run every applicable pre-deploy check. Each block is opt-in by file
207
+ * presence so existing addons don't suddenly fail to deploy when the
208
+ * Faz 5 quality template ships — they just skip the checks they aren't
209
+ * configured for. The addon.json validation is always on because every
210
+ * addon must have a parseable manifest.
211
+ *
212
+ * php -l runs inside the dev-shell php container when available — that
213
+ * way personnel doesn't need a host PHP install. If neither host nor
214
+ * container PHP is available the check is skipped with a note.
215
+ */
216
+ async function runQualityGate(addonDir, addonName) {
217
+ const issues = [];
218
+ const notes = [];
219
+ // ── addon.json schema (always on) ─────────────────────────────────
220
+ try {
221
+ const manifest = await fs.readJson(path.join(addonDir, 'addon.json'));
222
+ const schemaIssues = validateAddonManifest(manifest, addonName);
223
+ issues.push(...schemaIssues);
224
+ }
225
+ catch (err) {
226
+ issues.push(`addon.json could not be parsed: ${err instanceof Error ? err.message : String(err)}`);
227
+ }
228
+ // Faz 5 addons don't ship their own node_modules — the toolchain
229
+ // (eslint, vue-tsc, prettier) lives in dev-shell's top-level
230
+ // node_modules so a single `npm install` covers every addon on the
231
+ // machine. We resolve binaries by checking addon-local first (in
232
+ // case someone HAS installed deps locally) then fall back to
233
+ // dev-shell. Without this fallback the quality gate would silently
234
+ // skip checks for every Faz-5-shaped addon.
235
+ const shellRoot = findShellRoot(addonDir) ?? findShellRoot(process.cwd());
236
+ const findBin = async (binName) => {
237
+ const local = path.join(addonDir, 'node_modules', '.bin', binName);
238
+ if (await fs.pathExists(local))
239
+ return local;
240
+ if (shellRoot) {
241
+ const shared = path.join(shellRoot, 'node_modules', '.bin', binName);
242
+ if (await fs.pathExists(shared))
243
+ return shared;
244
+ }
245
+ return null;
246
+ };
247
+ // ── vue-tsc (only when addon ships TS + the tool is resolvable) ───
248
+ const tsconfig = path.join(addonDir, 'tsconfig.json');
249
+ if (await fs.pathExists(tsconfig)) {
250
+ const vueTsc = await findBin('vue-tsc');
251
+ if (vueTsc) {
252
+ const sp = spinner('vue-tsc --noEmit ...').start();
253
+ const result = spawnSync(vueTsc, ['--noEmit'], { cwd: addonDir, encoding: 'utf8' });
254
+ if (result.status === 0) {
255
+ sp.succeed('vue-tsc clean');
256
+ }
257
+ else {
258
+ sp.fail('vue-tsc reported errors');
259
+ const out = String(result.stdout || '') + String(result.stderr || '');
260
+ issues.push(`vue-tsc errors:\n${truncate(out, 2000)}`);
261
+ }
262
+ }
263
+ else {
264
+ notes.push('tsconfig.json present but vue-tsc not resolvable (neither addon-local nor dev-shell node_modules). Run `npm install` in dev-shell.');
265
+ }
266
+ }
267
+ // ── eslint (only when addon ships an eslint config + the tool) ────
268
+ const eslintConfigs = ['.eslintrc.json', '.eslintrc.js', 'eslint.config.js', 'eslint.config.mjs'];
269
+ const hasEslintConfig = await Promise.any(eslintConfigs.map((c) => fs.pathExists(path.join(addonDir, c)).then((ok) => (ok ? c : Promise.reject())))).catch(() => null);
270
+ if (hasEslintConfig) {
271
+ const eslintBin = await findBin('eslint');
272
+ if (eslintBin) {
273
+ const sp = spinner(`eslint . (config: ${hasEslintConfig}) ...`).start();
274
+ const result = spawnSync(eslintBin, ['.', '--max-warnings', '0'], { cwd: addonDir, encoding: 'utf8' });
275
+ if (result.status === 0) {
276
+ sp.succeed('eslint clean');
277
+ }
278
+ else {
279
+ sp.fail('eslint reported errors');
280
+ issues.push(`eslint errors:\n${truncate(String(result.stdout || '') + String(result.stderr || ''), 2000)}`);
281
+ }
282
+ }
283
+ else {
284
+ notes.push(`${hasEslintConfig} present but eslint not resolvable. Run \`npm install\` in dev-shell.`);
285
+ }
286
+ }
287
+ // ── php -l on every backend file ─────────────────────────────────
288
+ const phpFiles = await glob('Backend/**/*.php', { cwd: addonDir, absolute: false });
289
+ if (phpFiles.length > 0) {
290
+ const phpCmd = await findPhpForLint(addonDir);
291
+ if (phpCmd) {
292
+ const sp = spinner(`php -l on ${phpFiles.length} backend file${phpFiles.length === 1 ? '' : 's'} ...`).start();
293
+ const failures = [];
294
+ for (const rel of phpFiles) {
295
+ const result = phpCmd.run([rel]);
296
+ if (result.status !== 0) {
297
+ failures.push(`${rel}: ${truncate(String(result.stdout || '') + String(result.stderr || ''), 200)}`);
298
+ }
299
+ }
300
+ if (failures.length === 0) {
301
+ sp.succeed(`php -l clean (${phpFiles.length} files)`);
302
+ }
303
+ else {
304
+ sp.fail(`php -l failed on ${failures.length} file${failures.length === 1 ? '' : 's'}`);
305
+ issues.push(`PHP syntax errors:\n${failures.join('\n')}`);
306
+ }
307
+ }
308
+ else {
309
+ notes.push('No PHP available (neither on host PATH nor in addon_dev_php container) — skipped php -l syntax check.');
310
+ }
311
+ }
312
+ // ── tenant-scope static analysis (T-C trust-boundary gate) ──────────
313
+ // Backend PHP dosyası olan her addon için zorunlu: TenantContext/TenantDbResolver
314
+ // kullanımı + DatabaseService::getConnection() direkt çağrısı yasak.
315
+ // Violation → deploy REDDEDILIR (fail-closed).
316
+ const backendPhpFiles = await glob('Backend/**/*.php', { cwd: addonDir, absolute: false });
317
+ if (backendPhpFiles.length > 0) {
318
+ const sp = spinner(`tenant-scope analysis (${backendPhpFiles.length} backend file(s)) ...`).start();
319
+ const fileContents = await Promise.all(backendPhpFiles.map(async (rel) => ({
320
+ path: rel,
321
+ content: await fs.readFile(path.join(addonDir, rel), 'utf8'),
322
+ })));
323
+ const scopeResult = analyzeTenantScope(fileContents);
324
+ if (scopeResult.ok) {
325
+ sp.succeed('tenant-scope clean');
326
+ }
327
+ else {
328
+ sp.fail(`tenant-scope violation(s): ${scopeResult.violations.length} found`);
329
+ for (const v of scopeResult.violations) {
330
+ const loc = v.line > 0 ? `:${v.line}` : '';
331
+ issues.push(`[tenant-scope:${v.rule}] ${v.file}${loc} — ${v.detail}`);
332
+ }
333
+ }
334
+ }
335
+ return { ok: issues.length === 0, issues, notes };
336
+ }
337
+ /** Schema check for addon.json. Keep this in lock-step with the SDK
338
+ * reference in docs/addon-sdk/addon-json-schema.md (Faz 6B). */
339
+ function validateAddonManifest(manifest, expectedName) {
340
+ const issues = [];
341
+ const requiredString = (key) => {
342
+ const v = manifest[key];
343
+ if (typeof v !== 'string' || v.trim() === '') {
344
+ issues.push(`addon.json: field "${key}" is required and must be a non-empty string`);
345
+ }
346
+ };
347
+ requiredString('name');
348
+ requiredString('version');
349
+ requiredString('description');
350
+ requiredString('author');
351
+ if (typeof manifest['enabled'] !== 'boolean') {
352
+ issues.push('addon.json: field "enabled" is required and must be a boolean');
353
+ }
354
+ if (manifest['name'] !== expectedName) {
355
+ issues.push(`addon.json: "name" ("${manifest['name']}") does not match addon directory ("${expectedName}")`);
356
+ }
357
+ const licensing = manifest['licensing'];
358
+ if (licensing && typeof licensing === 'object') {
359
+ const model = licensing['model'];
360
+ const allowedModels = new Set(['free', 'system', 'one_time', 'subscription', 'tiered', 'usage']);
361
+ if (model !== undefined && typeof model === 'string' && !allowedModels.has(model)) {
362
+ issues.push(`addon.json: licensing.model "${model}" is not in [${Array.from(allowedModels).join(', ')}]`);
363
+ }
364
+ }
365
+ return issues;
366
+ }
367
+ /** Locate a PHP we can use for `-l` linting. Host PHP wins on speed
368
+ * (no docker exec overhead). Falls back to the dev-shell PHP container
369
+ * when running on a personnel laptop without PHP installed. */
370
+ async function findPhpForLint(addonDir) {
371
+ const hostCheck = spawnSync('php', ['-v'], { encoding: 'utf8' });
372
+ if (hostCheck.status === 0) {
373
+ return {
374
+ run: (rel) => spawnSync('php', ['-l', ...rel], { cwd: addonDir, encoding: 'utf8' }),
375
+ };
376
+ }
377
+ const containerCheck = spawnSync('docker', ['ps', '--filter', 'name=addon_dev_php', '--format', '{{.Names}}'], { encoding: 'utf8' });
378
+ if (containerCheck.status === 0 && (containerCheck.stdout || '').trim() === 'addon_dev_php') {
379
+ // The addon is bind-mounted into the php container at /var/www/cores/dev/addons/<name>.
380
+ // We resolve the container path by basename of addonDir — only works when the dev-shell
381
+ // layout is /home/cores/<core>/addons/<name>. If the user passed --path to a non-dev-shell
382
+ // location we'd lint wrongly, so we double-check the basename matches.
383
+ const addonName = path.basename(addonDir);
384
+ const containerPath = `/var/www/cores/dev/addons/${addonName}`;
385
+ return {
386
+ run: (rel) => spawnSync('docker', [
387
+ 'exec', 'addon_dev_php', 'sh', '-c',
388
+ `cd ${containerPath} && for f in ${rel.map((r) => `'${r}'`).join(' ')}; do php -l "$f" || exit 1; done`,
389
+ ], { encoding: 'utf8' }),
390
+ };
391
+ }
392
+ return null;
393
+ }
394
+ /** Production deploy confirmation. Prompts for the literal phrase
395
+ * defined in DEPLOY_CONFIRMATION_PHRASE — exact match only, so muscle
396
+ * memory "y" or "yes" doesn't pass. A 5-second pause before the
397
+ * prompt gives personnel a moment to spot the diff summary and
398
+ * abort with Ctrl-C if the target is wrong. */
399
+ async function requireProductionConfirmation(addonName, core, addonDir) {
400
+ log.blank();
401
+ log.warn(`⚠️ Production deploy: ${addonName} → cores/${core}`);
402
+ log.kv('Source', addonDir);
403
+ // Diff vs last commit summary — best-effort.
404
+ try {
405
+ const diffStat = execSync('git diff --shortstat HEAD', { cwd: addonDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
406
+ if (diffStat)
407
+ log.kv('Working tree vs HEAD', diffStat);
408
+ const lastCommit = execSync('git log -1 --format=%h%x09%s', { cwd: addonDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
409
+ if (lastCommit)
410
+ log.kv('Last commit', lastCommit);
411
+ }
412
+ catch {
413
+ // Not a git repo, or git not installed — skip the summary, deploy
414
+ // still proceeds. The literal-phrase prompt is the real gate.
415
+ }
416
+ log.blank();
417
+ log.info(`A 5-second pause follows so you can re-read the target. Press Ctrl-C now to abort without confirming.`);
418
+ for (let i = 5; i > 0; i--) {
419
+ process.stdout.write(` ${i}…\r`);
420
+ await new Promise((r) => setTimeout(r, 1000));
421
+ }
422
+ process.stdout.write(' \n');
423
+ const { phrase } = await enquirer.prompt({
424
+ type: 'input',
425
+ name: 'phrase',
426
+ message: `Type exactly "${DEPLOY_CONFIRMATION_PHRASE}" to confirm:`,
427
+ });
428
+ if (phrase !== DEPLOY_CONFIRMATION_PHRASE) {
429
+ log.error(`Phrase didn't match. Expected exactly: ${DEPLOY_CONFIRMATION_PHRASE}`);
430
+ return false;
431
+ }
432
+ return true;
433
+ }
434
+ /** Append a one-line audit record to ~/.cicore/deploy-audit.log. The
435
+ * log is local to the personnel's machine; it's an honesty trail for
436
+ * bypasses (--force / --no-quality), not a centralized audit. A real
437
+ * centralized audit ships in the install-addon.sh receiver on the
438
+ * cicore server. */
439
+ async function appendDeployAudit(entry) {
440
+ try {
441
+ const dir = path.join(os.homedir(), '.cicore');
442
+ await fs.ensureDir(dir);
443
+ const line = JSON.stringify({
444
+ ts: new Date().toISOString(),
445
+ user: os.userInfo().username,
446
+ ...entry,
447
+ }) + '\n';
448
+ await fs.appendFile(path.join(dir, 'deploy-audit.log'), line, 'utf8');
449
+ }
450
+ catch {
451
+ // Audit failure must not block a deploy — emergencies happen.
452
+ }
453
+ }
454
+ function truncate(s, max) {
455
+ if (s.length <= max)
456
+ return s;
457
+ return s.slice(0, max) + `\n... (${s.length - max} more chars truncated)`;
458
+ }
459
+ //# sourceMappingURL=deploy.js.map