@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,8 @@
1
+ /**
2
+ * CiCore CLI - SSL Management Commands
3
+ *
4
+ * Cloudflare Origin Certificate automation
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function registerSSLCommands(program: Command): void;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ssl/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoD1D"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * CiCore CLI - SSL Management Commands
3
+ *
4
+ * Cloudflare Origin Certificate automation
5
+ */
6
+ import { log, spinner, formatTable } from '../../lib/logger.js';
7
+ import { exec } from '../../lib/shell.js';
8
+ import { confirm } from '../../lib/prompts.js';
9
+ import { getSSHHost, buildSSHCommand } from '../../lib/ssh-config.js';
10
+ import { getCloudflareToken, createOriginCertificate, getZoneByDomain, setSSLMode, upsertDNSRecord } from '../../lib/cloudflare.js';
11
+ export function registerSSLCommands(program) {
12
+ const ssl = program
13
+ .command('ssl')
14
+ .description('SSL certificate management');
15
+ // vu ssl:create
16
+ ssl
17
+ .command('create <domain>')
18
+ .description('Create and install SSL certificate for domain')
19
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
20
+ .option('--skip-dns', 'Skip DNS record creation')
21
+ .action(async (domain, options) => {
22
+ await createSSL(domain, options);
23
+ });
24
+ // vu ssl:renew
25
+ ssl
26
+ .command('renew <domain>')
27
+ .description('Renew SSL certificate')
28
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
29
+ .action(async (domain, options) => {
30
+ await renewSSL(domain, options);
31
+ });
32
+ // vu ssl:list
33
+ ssl
34
+ .command('list')
35
+ .alias('ls')
36
+ .description('List all SSL certificates')
37
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
38
+ .action(async (options) => {
39
+ await listSSL(options);
40
+ });
41
+ // vu ssl:check
42
+ ssl
43
+ .command('check <domain>')
44
+ .description('Check SSL certificate status')
45
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
46
+ .action(async (domain, options) => {
47
+ await checkSSL(domain, options);
48
+ });
49
+ // vu ssl:delete
50
+ ssl
51
+ .command('delete <domain>')
52
+ .description('Delete SSL certificate')
53
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
54
+ .option('-f, --force', 'Skip confirmation')
55
+ .action(async (domain, options) => {
56
+ await deleteSSL(domain, options);
57
+ });
58
+ }
59
+ // ============================================
60
+ // CREATE SSL
61
+ // ============================================
62
+ async function createSSL(domain, options) {
63
+ log.title('🔐 Create SSL Certificate');
64
+ log.blank();
65
+ const host = await getSSHHost(options.host);
66
+ if (!host) {
67
+ log.error(`SSH host "${options.host}" not found`);
68
+ return;
69
+ }
70
+ const token = await getCloudflareToken();
71
+ if (!token) {
72
+ log.error('Cloudflare token not configured. Run: vu cloudflare auth --token YOUR_TOKEN');
73
+ return;
74
+ }
75
+ log.kv('Domain', domain);
76
+ log.kv('Server', `${host.name} (${host.hostname})`);
77
+ log.blank();
78
+ const startTime = Date.now();
79
+ // Step 1: Get zone
80
+ const zoneSpinner = spinner('Getting Cloudflare zone...').start();
81
+ const zone = await getZoneByDomain(domain);
82
+ if (!zone) {
83
+ zoneSpinner.fail(`Zone not found for domain: ${domain}`);
84
+ return;
85
+ }
86
+ zoneSpinner.succeed(`Zone: ${zone.name} (${zone.id})`);
87
+ // Step 2: Create DNS records (if not skipped)
88
+ if (!options.skipDns) {
89
+ const dnsSpinner = spinner('Creating DNS records...').start();
90
+ try {
91
+ // Create A records
92
+ await upsertDNSRecord(zone.id, 'A', '@', host.hostname, true);
93
+ await upsertDNSRecord(zone.id, 'A', 'www', host.hostname, true);
94
+ await upsertDNSRecord(zone.id, 'A', 'api', host.hostname, true);
95
+ await upsertDNSRecord(zone.id, 'A', '*', host.hostname, true);
96
+ dnsSpinner.succeed('DNS records created');
97
+ }
98
+ catch (error) {
99
+ dnsSpinner.warn(`DNS: ${error.message}`);
100
+ }
101
+ }
102
+ // Step 3: Set SSL mode
103
+ const sslModeSpinner = spinner('Setting SSL mode to Full (Strict)...').start();
104
+ try {
105
+ await setSSLMode(zone.id, 'strict');
106
+ sslModeSpinner.succeed('SSL mode: Full (Strict)');
107
+ }
108
+ catch (error) {
109
+ sslModeSpinner.warn(`SSL mode: ${error.message}`);
110
+ }
111
+ // Step 4: Create Origin Certificate
112
+ const certSpinner = spinner('Creating Origin Certificate (15 years)...').start();
113
+ const hostnames = [domain, `*.${domain}`];
114
+ const cert = await createOriginCertificate(hostnames);
115
+ if (!cert) {
116
+ certSpinner.fail('Certificate creation failed');
117
+ return;
118
+ }
119
+ certSpinner.succeed('Origin Certificate created');
120
+ // Step 5: Upload to server
121
+ const uploadSpinner = spinner('Uploading certificate to server...').start();
122
+ const sslDir = `/home/services/nginx/ssl`;
123
+ const certPath = `${sslDir}/${domain}.crt`;
124
+ const keyPath = `${sslDir}/${domain}.key`;
125
+ // Create directory
126
+ const mkdirArgs = buildSSHCommand(host, `mkdir -p ${sslDir}`);
127
+ await exec('ssh', mkdirArgs, { silent: true });
128
+ // Write certificate
129
+ const certCmd = `cat > ${certPath} << 'CERTEOF'
130
+ ${cert.certificate}
131
+ CERTEOF`;
132
+ const certArgs = buildSSHCommand(host, certCmd);
133
+ await exec('ssh', certArgs, { silent: true });
134
+ // Write private key
135
+ const keyCmd = `cat > ${keyPath} << 'KEYEOF'
136
+ ${cert.private_key}
137
+ KEYEOF`;
138
+ const keyArgs = buildSSHCommand(host, keyCmd);
139
+ await exec('ssh', keyArgs, { silent: true });
140
+ // Set permissions
141
+ const chmodArgs = buildSSHCommand(host, `chmod 600 ${certPath} ${keyPath}`);
142
+ await exec('ssh', chmodArgs, { silent: true });
143
+ uploadSpinner.succeed('Certificate uploaded to server');
144
+ // Step 6: Reload Nginx
145
+ const nginxSpinner = spinner('Reloading Nginx...').start();
146
+ const reloadArgs = buildSSHCommand(host, 'docker exec cicore_global_nginx nginx -s reload 2>/dev/null || true');
147
+ await exec('ssh', reloadArgs, { silent: true });
148
+ nginxSpinner.succeed('Nginx reloaded');
149
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
150
+ log.blank();
151
+ log.box('✅ SSL Certificate Created', [
152
+ `Domain: ${domain}`,
153
+ `Certificate: ${certPath}`,
154
+ `Private Key: ${keyPath}`,
155
+ `Expires: 15 years`,
156
+ `Duration: ${elapsed}s`,
157
+ ]);
158
+ }
159
+ // ============================================
160
+ // RENEW SSL
161
+ // ============================================
162
+ async function renewSSL(domain, options) {
163
+ log.title('🔄 Renew SSL Certificate');
164
+ log.blank();
165
+ // Renew is same as create (Cloudflare Origin Certs are 15 years)
166
+ await createSSL(domain, { ...options, skipDns: true });
167
+ }
168
+ // ============================================
169
+ // LIST SSL
170
+ // ============================================
171
+ async function listSSL(options) {
172
+ log.title('📋 SSL Certificates');
173
+ log.blank();
174
+ const host = await getSSHHost(options.host);
175
+ if (!host) {
176
+ log.error(`SSH host "${options.host}" not found`);
177
+ return;
178
+ }
179
+ const listSpinner = spinner('Listing certificates...').start();
180
+ const cmd = `
181
+ for cert in /home/services/nginx/ssl/*.crt 2>/dev/null; do
182
+ if [ -f "$cert" ]; then
183
+ domain=$(basename "$cert" .crt)
184
+ expiry=$(openssl x509 -enddate -noout -in "$cert" 2>/dev/null | cut -d= -f2)
185
+ echo "$domain|$expiry"
186
+ fi
187
+ done
188
+ `;
189
+ const args = buildSSHCommand(host, cmd);
190
+ const result = await exec('ssh', args, { silent: true });
191
+ listSpinner.stop();
192
+ if (!result.stdout.trim()) {
193
+ log.info('No SSL certificates found');
194
+ return;
195
+ }
196
+ const certs = result.stdout.trim().split('\n').map(line => {
197
+ const [domain, expiry] = line.split('|');
198
+ const expiryDate = new Date(expiry);
199
+ const now = new Date();
200
+ const daysLeft = Math.ceil((expiryDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
201
+ const status = daysLeft > 30 ? '✅ ACTIVE' : daysLeft > 0 ? '⚠️ EXPIRING' : '❌ EXPIRED';
202
+ return [domain, expiry || 'Unknown', status];
203
+ });
204
+ formatTable(['Domain', 'Expires', 'Status'], certs);
205
+ }
206
+ // ============================================
207
+ // CHECK SSL
208
+ // ============================================
209
+ async function checkSSL(domain, options) {
210
+ log.title('🔍 SSL Certificate Check');
211
+ log.blank();
212
+ const host = await getSSHHost(options.host);
213
+ if (!host) {
214
+ log.error(`SSH host "${options.host}" not found`);
215
+ return;
216
+ }
217
+ log.kv('Domain', domain);
218
+ log.blank();
219
+ // Check local certificate
220
+ const localSpinner = spinner('Checking local certificate...').start();
221
+ const certPath = `/home/services/nginx/ssl/${domain}.crt`;
222
+ const localCmd = `
223
+ if [ -f "${certPath}" ]; then
224
+ openssl x509 -in "${certPath}" -noout -subject -issuer -dates 2>/dev/null
225
+ else
226
+ echo "NOT_FOUND"
227
+ fi
228
+ `;
229
+ const localArgs = buildSSHCommand(host, localCmd);
230
+ const localResult = await exec('ssh', localArgs, { silent: true });
231
+ if (localResult.stdout.includes('NOT_FOUND')) {
232
+ localSpinner.fail('Local certificate not found');
233
+ }
234
+ else {
235
+ localSpinner.succeed('Local certificate found');
236
+ console.log(localResult.stdout);
237
+ }
238
+ // Check remote SSL
239
+ const remoteSpinner = spinner('Checking remote SSL connection...').start();
240
+ const remoteCmd = `echo | openssl s_client -connect ${domain}:443 -servername ${domain} 2>/dev/null | openssl x509 -noout -dates 2>/dev/null || echo "CONNECTION_FAILED"`;
241
+ const remoteArgs = buildSSHCommand(host, remoteCmd);
242
+ const remoteResult = await exec('ssh', remoteArgs, { silent: true });
243
+ if (remoteResult.stdout.includes('CONNECTION_FAILED')) {
244
+ remoteSpinner.warn('Remote SSL connection failed');
245
+ }
246
+ else {
247
+ remoteSpinner.succeed('Remote SSL connection OK');
248
+ console.log(remoteResult.stdout);
249
+ }
250
+ }
251
+ // ============================================
252
+ // DELETE SSL
253
+ // ============================================
254
+ async function deleteSSL(domain, options) {
255
+ log.title('🗑️ Delete SSL Certificate');
256
+ log.blank();
257
+ const host = await getSSHHost(options.host);
258
+ if (!host) {
259
+ log.error(`SSH host "${options.host}" not found`);
260
+ return;
261
+ }
262
+ if (!options.force) {
263
+ const confirmed = await confirm(`Delete SSL certificate for ${domain}?`, false);
264
+ if (!confirmed) {
265
+ log.info('Cancelled');
266
+ return;
267
+ }
268
+ }
269
+ const deleteSpinner = spinner('Deleting certificate...').start();
270
+ const cmd = `rm -f /home/services/nginx/ssl/${domain}.crt /home/services/nginx/ssl/${domain}.key`;
271
+ const args = buildSSHCommand(host, cmd);
272
+ await exec('ssh', args, { silent: true });
273
+ deleteSpinner.succeed('Certificate deleted');
274
+ }
275
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ssl/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * CiCore CLI — `ci super-admin` (control-plane platform super-admins)
3
+ *
4
+ * Manages `cp_super_admins` in the control-plane DB (vucore_control) — the
5
+ * registry of platform-level super-admins (K5). Control-plane operations
6
+ * (brand/domain CRUD, etc.) are gated on membership here, by email: being a
7
+ * data-plane super-admin on *your own* core does NOT grant authority over the
8
+ * whole platform's brands. The merkez (cicore.com.tr) platform admin is seeded
9
+ * here; a whitelabel brand's own super-admin is deliberately absent → denied.
10
+ *
11
+ * Deploy-free: writes straight to the control-plane DB over SSH/psql, so the
12
+ * registry can be seeded + inspected before the PHP gate that reads it ships.
13
+ */
14
+ import { Command } from 'commander';
15
+ export declare function registerSuperAdminCommands(program: Command): void;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAenC,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkEjE"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * CiCore CLI — `ci super-admin` (control-plane platform super-admins)
3
+ *
4
+ * Manages `cp_super_admins` in the control-plane DB (vucore_control) — the
5
+ * registry of platform-level super-admins (K5). Control-plane operations
6
+ * (brand/domain CRUD, etc.) are gated on membership here, by email: being a
7
+ * data-plane super-admin on *your own* core does NOT grant authority over the
8
+ * whole platform's brands. The merkez (cicore.com.tr) platform admin is seeded
9
+ * here; a whitelabel brand's own super-admin is deliberately absent → denied.
10
+ *
11
+ * Deploy-free: writes straight to the control-plane DB over SSH/psql, so the
12
+ * registry can be seeded + inspected before the PHP gate that reads it ships.
13
+ */
14
+ import { log, formatTable } from '../../lib/logger.js';
15
+ import { getHostConfig } from '../../lib/hosts.js';
16
+ import { dbSelectJson, dbExec } from '../../lib/ops/db.js';
17
+ const CONTROL_DB = 'vucore_control';
18
+ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
19
+ export function registerSuperAdminCommands(program) {
20
+ const sa = program.command('super-admin').description('Control-plane platform super-admins (cp_super_admins)');
21
+ sa.command('list')
22
+ .description('List platform super-admins')
23
+ .option('-h, --host <host>', 'Host alias (cicore | mkt)')
24
+ .action(async (options) => {
25
+ const cfg = resolveHost(options.host);
26
+ const rows = await dbSelectJson(cfg, CONTROL_DB, `SELECT email, name, is_active, created_at FROM cp_super_admins ORDER BY created_at`);
27
+ if (rows.length === 0) {
28
+ log.warn('No platform super-admins registered. Add one with `ci super-admin add <email>`.');
29
+ return;
30
+ }
31
+ formatTable(['Email', 'Name', 'Active'], rows.map(r => [r.email, r.name, r.is_active ? 'yes' : 'no']));
32
+ });
33
+ sa.command('add <email>')
34
+ .description('Register (or re-activate) a platform super-admin')
35
+ .option('-h, --host <host>', 'Host alias (cicore | mkt)')
36
+ .option('--name <name>', 'Display name', 'Super Admin')
37
+ .action(async (email, options) => {
38
+ const cfg = resolveHost(options.host);
39
+ const e = email.trim().toLowerCase();
40
+ if (!EMAIL_RE.test(e)) {
41
+ log.error(`Invalid email: ${email}`);
42
+ process.exit(1);
43
+ }
44
+ const name = (options.name ?? 'Super Admin').replace(/'/g, "''");
45
+ // Idempotent upsert: re-adding re-activates + updates the name.
46
+ const res = await dbExec(cfg, CONTROL_DB, `INSERT INTO cp_super_admins (email, name, is_active) VALUES ('${e}', '${name}', true)
47
+ ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name, is_active = true, updated_at = now();`);
48
+ if (!res.success) {
49
+ log.error(`Failed to add super-admin: ${res.stderr.trim()}`);
50
+ process.exit(1);
51
+ }
52
+ log.success(`Platform super-admin: ${e} (active)`);
53
+ });
54
+ sa.command('remove <email>')
55
+ .description('Deactivate a platform super-admin (soft — keeps the row)')
56
+ .option('-h, --host <host>', 'Host alias (cicore | mkt)')
57
+ .action(async (email, options) => {
58
+ const cfg = resolveHost(options.host);
59
+ const e = email.trim().toLowerCase();
60
+ const res = await dbExec(cfg, CONTROL_DB, `UPDATE cp_super_admins SET is_active = false, updated_at = now() WHERE email = '${e.replace(/'/g, "''")}';`);
61
+ if (!res.success) {
62
+ log.error(`Failed to remove super-admin: ${res.stderr.trim()}`);
63
+ process.exit(1);
64
+ }
65
+ log.success(`Platform super-admin deactivated: ${e}`);
66
+ });
67
+ }
68
+ function resolveHost(alias) {
69
+ if (alias === undefined) {
70
+ log.error('--host is required (cicore | mkt). Pass --host <alias>.');
71
+ process.exit(1);
72
+ }
73
+ try {
74
+ return getHostConfig(alias);
75
+ }
76
+ catch (err) {
77
+ log.error(err instanceof Error ? err.message : String(err));
78
+ process.exit(1);
79
+ }
80
+ }
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAmB,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE1D,MAAM,UAAU,GAAG,gBAAgB,CAAA;AACnC,MAAM,QAAQ,GAAG,4BAA4B,CAAA;AAS7C,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,uDAAuD,CAAC,CAAA;IAE9G,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,IAAI,GAAG,MAAM,YAAY,CAC7B,GAAG,EACH,UAAU,EACV,oFAAoF,CACrF,CAAA;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAA;YAC3F,OAAM;QACR,CAAC;QACD,WAAW,CACT,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAC7D,CAAA;IACH,CAAC,CAAC,CAAA;IAEJ,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,cAAc,EAAE,aAAa,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAAyC,EAAE,EAAE;QACzE,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAA;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,aAAa,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAChE,gEAAgE;QAChE,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,GAAG,EACH,UAAU,EACV,iEAAiE,CAAC,OAAO,IAAI;uGACkB,CAChG,CAAA;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,GAAG,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEJ,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAA0B,EAAE,EAAE;QAC1D,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,GAAG,EACH,UAAU,EACV,mFAAmF,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAC7G,CAAA;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,GAAG,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB;IAC5C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAA;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CiCore CLI - Tenant Management Commands
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function registerTenantCommands(program: Command): void;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/tenant/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD7D"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * CiCore CLI - Tenant Management Commands
3
+ */
4
+ import { log, spinner } from '../../lib/logger.js';
5
+ import { dockerExec } from '../../lib/shell.js';
6
+ import { containers } from '../../lib/config.js';
7
+ import { confirm } from '../../lib/prompts.js';
8
+ export function registerTenantCommands(program) {
9
+ const tenant = program
10
+ .command('tenant')
11
+ .description('Tenant management commands');
12
+ // vu tenant:create <name> <core>
13
+ tenant
14
+ .command('create <name> <core>')
15
+ .description('Create a new tenant')
16
+ .option('-d, --domain <domain>', 'Tenant subdomain')
17
+ .action(async (name, core, options) => {
18
+ await createTenant(name, core, options);
19
+ });
20
+ // vu tenant:list <core>
21
+ tenant
22
+ .command('list <core>')
23
+ .alias('ls')
24
+ .description('List tenants in a core')
25
+ .option('-j, --json', 'Output as JSON')
26
+ .action(async (core, options) => {
27
+ await listTenants(core, options);
28
+ });
29
+ // vu tenant:delete <name> <core>
30
+ tenant
31
+ .command('delete <name> <core>')
32
+ .alias('rm')
33
+ .description('Delete a tenant')
34
+ .option('-f, --force', 'Skip confirmation')
35
+ .action(async (name, core, options) => {
36
+ await deleteTenant(name, core, options);
37
+ });
38
+ // vu tenant:enable-addon <tenant> <addon>
39
+ tenant
40
+ .command('enable-addon <tenant> <addon>')
41
+ .description('Enable addon for tenant')
42
+ .option('-c, --core <core>', 'Core name', 'core1')
43
+ .action(async (tenantName, addonName, options) => {
44
+ await toggleTenantAddon(tenantName, addonName, options.core, true);
45
+ });
46
+ // vu tenant:disable-addon <tenant> <addon>
47
+ tenant
48
+ .command('disable-addon <tenant> <addon>')
49
+ .description('Disable addon for tenant')
50
+ .option('-c, --core <core>', 'Core name', 'core1')
51
+ .action(async (tenantName, addonName, options) => {
52
+ await toggleTenantAddon(tenantName, addonName, options.core, false);
53
+ });
54
+ }
55
+ async function createTenant(name, core, options) {
56
+ log.title(`Create Tenant: ${name} in ${core}`);
57
+ const subdomain = options.domain || name.toLowerCase();
58
+ log.kv('Tenant Name', name);
59
+ log.kv('Subdomain', subdomain);
60
+ log.kv('Core', core);
61
+ log.blank();
62
+ const shouldCreate = await confirm('Create tenant with these settings?', true);
63
+ if (!shouldCreate) {
64
+ log.warn('Cancelled');
65
+ return;
66
+ }
67
+ const createSpinner = spinner('Creating tenant...').start();
68
+ // Create tenant via PHP
69
+ const phpCmd = `php -r "
70
+ require '/var/www/vendor/autoload.php';
71
+
72
+ \\\$corePath = '/var/www/cores/${core}';
73
+ \\\$dotenv = Dotenv\\\\Dotenv::createImmutable(\\\$corePath);
74
+ \\\$dotenv->load();
75
+
76
+ \\\$tenantService = new VuCore\\\\Core\\\\Services\\\\TenantService();
77
+ \\\$result = \\\$tenantService->create([
78
+ 'name' => '${name}',
79
+ 'subdomain' => '${subdomain}',
80
+ 'status' => 'active'
81
+ ]);
82
+
83
+ echo json_encode(\\\$result);
84
+ "`;
85
+ const result = await dockerExec(containers.php, phpCmd, { silent: true });
86
+ if (!result.success) {
87
+ createSpinner.fail('Failed to create tenant');
88
+ log.error(result.stderr);
89
+ return;
90
+ }
91
+ createSpinner.succeed('Tenant created');
92
+ log.blank();
93
+ log.success(`Tenant "${name}" created in ${core}`);
94
+ log.info(`Access: https://${subdomain}.{domain}`);
95
+ }
96
+ async function listTenants(core, options) {
97
+ log.title(`Tenants in ${core}`);
98
+ const phpCmd = `php -r "
99
+ require '/var/www/vendor/autoload.php';
100
+
101
+ \\\$corePath = '/var/www/cores/${core}';
102
+ \\\$dotenv = Dotenv\\\\Dotenv::createImmutable(\\\$corePath);
103
+ \\\$dotenv->load();
104
+
105
+ \\\$tenantService = new VuCore\\\\Core\\\\Services\\\\TenantService();
106
+ \\\$tenants = \\\$tenantService->getAll();
107
+
108
+ echo json_encode(\\\$tenants);
109
+ "`;
110
+ const result = await dockerExec(containers.php, phpCmd, { silent: true });
111
+ if (!result.success) {
112
+ log.error('Failed to list tenants');
113
+ log.error(result.stderr);
114
+ return;
115
+ }
116
+ try {
117
+ const tenants = JSON.parse(result.stdout);
118
+ if (options.json) {
119
+ console.log(JSON.stringify(tenants, null, 2));
120
+ return;
121
+ }
122
+ if (!tenants.length) {
123
+ log.info('No tenants found');
124
+ return;
125
+ }
126
+ tenants.forEach((t) => {
127
+ log.item(`${t.name} (${t.subdomain}) - ${t.status}`);
128
+ });
129
+ log.blank();
130
+ log.info(`Total: ${tenants.length} tenant(s)`);
131
+ }
132
+ catch {
133
+ log.error('Failed to parse tenant list');
134
+ }
135
+ }
136
+ async function deleteTenant(name, core, options) {
137
+ log.title(`Delete Tenant: ${name} from ${core}`);
138
+ if (!options.force) {
139
+ const confirmed = await confirm(`Delete tenant "${name}"? This cannot be undone.`, false);
140
+ if (!confirmed) {
141
+ log.warn('Cancelled');
142
+ return;
143
+ }
144
+ }
145
+ const deleteSpinner = spinner('Deleting tenant...').start();
146
+ const phpCmd = `php -r "
147
+ require '/var/www/vendor/autoload.php';
148
+
149
+ \\\$corePath = '/var/www/cores/${core}';
150
+ \\\$dotenv = Dotenv\\\\Dotenv::createImmutable(\\\$corePath);
151
+ \\\$dotenv->load();
152
+
153
+ \\\$tenantService = new VuCore\\\\Core\\\\Services\\\\TenantService();
154
+ \\\$result = \\\$tenantService->deleteByName('${name}');
155
+
156
+ echo json_encode(\\\$result);
157
+ "`;
158
+ const result = await dockerExec(containers.php, phpCmd, { silent: true });
159
+ if (!result.success) {
160
+ deleteSpinner.fail('Failed to delete tenant');
161
+ log.error(result.stderr);
162
+ return;
163
+ }
164
+ deleteSpinner.succeed('Tenant deleted');
165
+ log.success(`Tenant "${name}" deleted from ${core}`);
166
+ }
167
+ async function toggleTenantAddon(tenantName, addonName, core, enable) {
168
+ const action = enable ? 'Enable' : 'Disable';
169
+ log.title(`${action} Addon: ${addonName} for ${tenantName}`);
170
+ const toggleSpinner = spinner(`${action}ing addon...`).start();
171
+ const phpCmd = `php -r "
172
+ require '/var/www/vendor/autoload.php';
173
+
174
+ \\\$corePath = '/var/www/cores/${core}';
175
+ \\\$dotenv = Dotenv\\\\Dotenv::createImmutable(\\\$corePath);
176
+ \\\$dotenv->load();
177
+
178
+ \\\$tenantService = new VuCore\\\\Core\\\\Services\\\\TenantService();
179
+ \\\$result = \\\$tenantService->toggleAddon('${tenantName}', '${addonName}', ${enable});
180
+
181
+ echo json_encode(\\\$result);
182
+ "`;
183
+ const result = await dockerExec(containers.php, phpCmd, { silent: true });
184
+ if (!result.success) {
185
+ toggleSpinner.fail(`Failed to ${action.toLowerCase()} addon`);
186
+ log.error(result.stderr);
187
+ return;
188
+ }
189
+ toggleSpinner.succeed(`Addon ${enable ? 'enabled' : 'disabled'}`);
190
+ log.success(`${addonName} is now ${enable ? 'enabled' : 'disabled'} for ${tenantName}`);
191
+ }
192
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/tenant/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAO,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAS,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE7C,iCAAiC;IACjC,MAAM;SACH,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAY,EAAE,OAAO,EAAE,EAAE;QACpD,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEL,wBAAwB;IACxB,MAAM;SACH,OAAO,CAAC,aAAa,CAAC;SACtB,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAO,EAAE,EAAE;QACtC,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEL,iCAAiC;IACjC,MAAM;SACH,OAAO,CAAC,sBAAsB,CAAC;SAC/B,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAY,EAAE,OAAO,EAAE,EAAE;QACpD,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEL,0CAA0C;IAC1C,MAAM;SACH,OAAO,CAAC,+BAA+B,CAAC;SACxC,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,mBAAmB,EAAE,WAAW,EAAE,OAAO,CAAC;SACjD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,SAAiB,EAAE,OAAO,EAAE,EAAE;QAC/D,MAAM,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEL,2CAA2C;IAC3C,MAAM;SACH,OAAO,CAAC,gCAAgC,CAAC;SACzC,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,mBAAmB,EAAE,WAAW,EAAE,OAAO,CAAC;SACjD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,SAAiB,EAAE,OAAO,EAAE,EAAE;QAC/D,MAAM,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,OAAY;IAClE,GAAG,CAAC,KAAK,CAAC,kBAAkB,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;IAEvD,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC5B,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrB,GAAG,CAAC,KAAK,EAAE,CAAC;IAEZ,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,oCAAoC,EAAE,IAAI,CAAC,CAAC;IAC/E,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,wBAAwB;IACxB,MAAM,MAAM,GAAG;;;qCAGoB,IAAI;;;;;;mBAMtB,IAAI;wBACC,SAAS;;;;;IAK7B,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,aAAa,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC9C,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAExC,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,gBAAgB,IAAI,EAAE,CAAC,CAAC;IACnD,GAAG,CAAC,IAAI,CAAC,mBAAmB,SAAS,WAAW,CAAC,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,OAAY;IACnD,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG;;;qCAGoB,IAAI;;;;;;;;IAQrC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACpC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE1C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;YACzB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,OAAY;IAClE,GAAG,CAAC,KAAK,CAAC,kBAAkB,IAAI,SAAS,IAAI,EAAE,CAAC,CAAC;IAEjD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,kBAAkB,IAAI,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAC1F,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,MAAM,MAAM,GAAG;;;qCAGoB,IAAI;;;;;oDAKW,IAAI;;;IAGpD,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,aAAa,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC9C,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxC,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,kBAAkB,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,UAAkB,EAClB,SAAiB,EACjB,IAAY,EACZ,MAAe;IAEf,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,WAAW,SAAS,QAAQ,UAAU,EAAE,CAAC,CAAC;IAE7D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,MAAM,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC;IAE/D,MAAM,MAAM,GAAG;;;qCAGoB,IAAI;;;;;mDAKU,UAAU,OAAO,SAAS,MAAM,MAAM;;;IAGrF,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,aAAa,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC9D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,aAAa,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAClE,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS,WAAW,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,QAAQ,UAAU,EAAE,CAAC,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CiCore CLI - Main Entry Point
4
+ *
5
+ * Professional Multi-Core SaaS Management Tool
6
+ *
7
+ * @author ciCore Team
8
+ * @version 1.0.0
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}