@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,220 @@
1
+ /**
2
+ * CiCore CLI - DevOps Commands
3
+ */
4
+ import { log, spinner, formatTable } from '../../lib/logger.js';
5
+ import { ssh, dockerExec } from '../../lib/shell.js';
6
+ import { getEnv, containers } from '../../lib/config.js';
7
+ export function registerDevOpsCommands(program) {
8
+ // vu cache:clear [core]
9
+ program
10
+ .command('cache:clear [core]')
11
+ .description('Clear cache for a core')
12
+ .option('-a, --all', 'Clear all caches including Redis')
13
+ .action(async (core, options) => {
14
+ await clearCache(core || 'core1', options);
15
+ });
16
+ // vu logs [core]
17
+ program
18
+ .command('logs [core]')
19
+ .description('View logs')
20
+ .option('-f, --follow', 'Follow log output')
21
+ .option('-n, --lines <n>', 'Number of lines', '50')
22
+ .option('--nuxt', 'Show only Nuxt logs')
23
+ .option('--php', 'Show only PHP logs')
24
+ .option('--nginx', 'Show only Nginx logs')
25
+ .action(async (core, options) => {
26
+ await viewLogs(core, options);
27
+ });
28
+ // vu health [core]
29
+ program
30
+ .command('health [core]')
31
+ .description('Check system health')
32
+ .option('-j, --json', 'Output as JSON')
33
+ .action(async (core, options) => {
34
+ await checkHealth(core, options);
35
+ });
36
+ // vu status
37
+ program
38
+ .command('status')
39
+ .description('Show container status')
40
+ .action(async () => {
41
+ await showStatus();
42
+ });
43
+ }
44
+ async function clearCache(core, options) {
45
+ log.title(`Clear Cache: ${core}`);
46
+ const env = getEnv();
47
+ const coreContainer = env === 'dev' ? containers.dev.php : containers.php;
48
+ // Clear file cache
49
+ const fileSpinner = spinner('Clearing file cache...').start();
50
+ if (env === 'prod') {
51
+ await ssh(`rm -rf /home/cores/${core}/storage/cache/*`, { silent: true });
52
+ await ssh(`rm -rf /home/cores/${core}/storage/temp/*`, { silent: true });
53
+ }
54
+ fileSpinner.succeed('File cache cleared');
55
+ // Clear addon registry cache
56
+ const registrySpinner = spinner('Clearing addon registry...').start();
57
+ const phpCmd = `php -r "
58
+ if (file_exists('/var/www/cores/${core}/storage/cache/addon_routes.cache.php')) {
59
+ unlink('/var/www/cores/${core}/storage/cache/addon_routes.cache.php');
60
+ }
61
+ if (file_exists('/var/www/cores/${core}/storage/cache/addon_registry.cache.php')) {
62
+ unlink('/var/www/cores/${core}/storage/cache/addon_registry.cache.php');
63
+ }
64
+ echo 'done';
65
+ "`;
66
+ await dockerExec(coreContainer, phpCmd, { silent: true });
67
+ registrySpinner.succeed('Addon registry cleared');
68
+ // Clear Redis cache
69
+ if (options.all) {
70
+ const redisSpinner = spinner('Clearing Redis cache...').start();
71
+ const redisContainer = env === 'dev' ? containers.dev.redis : containers.redis;
72
+ await dockerExec(redisContainer, 'redis-cli FLUSHDB', { silent: true });
73
+ redisSpinner.succeed('Redis cache cleared');
74
+ }
75
+ // Clear Nuxt cache
76
+ const nuxtSpinner = spinner('Clearing Nuxt cache...').start();
77
+ const nuxtContainer = env === 'dev' ? containers.dev.nuxt : containers.nuxt;
78
+ await dockerExec(nuxtContainer, 'rm -rf /app/.nuxt/cache 2>/dev/null || true', { silent: true });
79
+ nuxtSpinner.succeed('Nuxt cache cleared');
80
+ log.blank();
81
+ log.success('All caches cleared');
82
+ }
83
+ async function viewLogs(core, options) {
84
+ const env = getEnv();
85
+ const lines = options.lines || '50';
86
+ const follow = options.follow ? '-f' : '';
87
+ let container = '';
88
+ if (options.nuxt) {
89
+ container = env === 'dev' ? containers.dev.nuxt : containers.nuxt;
90
+ }
91
+ else if (options.php) {
92
+ container = env === 'dev' ? containers.dev.php : containers.php;
93
+ }
94
+ else if (options.nginx) {
95
+ container = env === 'dev' ? containers.dev.nginx : containers.nginx;
96
+ }
97
+ else {
98
+ // Show all logs
99
+ log.title('Container Logs');
100
+ log.info('Use --nuxt, --php, or --nginx to filter');
101
+ log.blank();
102
+ container = env === 'dev' ? containers.dev.nuxt : containers.nuxt;
103
+ }
104
+ log.info(`Showing logs for: ${container}`);
105
+ log.blank();
106
+ if (env === 'dev') {
107
+ // Local Docker logs
108
+ const { execa } = await import('execa');
109
+ const subprocess = execa('docker', ['logs', follow, '--tail', lines, container].filter(Boolean), {
110
+ stdio: 'inherit',
111
+ });
112
+ await subprocess;
113
+ }
114
+ else {
115
+ // Remote logs via SSH
116
+ const result = await ssh(`docker logs ${follow} --tail ${lines} ${container}`, { silent: false });
117
+ console.log(result.stdout);
118
+ if (result.stderr)
119
+ console.error(result.stderr);
120
+ }
121
+ }
122
+ async function checkHealth(core, options) {
123
+ log.title('System Health Check');
124
+ const env = getEnv();
125
+ const targetCore = core || 'core1';
126
+ const checks = [];
127
+ // Check containers
128
+ const containerList = env === 'dev'
129
+ ? [containers.dev.nuxt, containers.dev.php, containers.dev.nginx, containers.dev.postgres, containers.dev.redis]
130
+ : [containers.nuxt, containers.php, containers.nginx, containers.postgres, containers.redis];
131
+ for (const container of containerList) {
132
+ const checkSpinner = spinner(`Checking ${container}...`).start();
133
+ let result;
134
+ if (env === 'dev') {
135
+ const { execa } = await import('execa');
136
+ try {
137
+ const proc = await execa('docker', ['inspect', '-f', '{{.State.Status}}', container]);
138
+ result = { success: true, stdout: proc.stdout };
139
+ }
140
+ catch {
141
+ result = { success: false, stdout: 'not found' };
142
+ }
143
+ }
144
+ else {
145
+ result = await ssh(`docker inspect -f '{{.State.Status}}' ${container} 2>/dev/null || echo 'not found'`, { silent: true });
146
+ }
147
+ const status = result.stdout.trim();
148
+ const isHealthy = status === 'running';
149
+ checks.push({
150
+ name: container,
151
+ status: isHealthy ? '✓ Running' : '✗ ' + status,
152
+ details: isHealthy ? 'Healthy' : 'Check container',
153
+ });
154
+ if (isHealthy) {
155
+ checkSpinner.succeed(`${container}: running`);
156
+ }
157
+ else {
158
+ checkSpinner.fail(`${container}: ${status}`);
159
+ }
160
+ }
161
+ // Check API health
162
+ const apiSpinner = spinner('Checking API health...').start();
163
+ let apiResult;
164
+ if (env === 'dev') {
165
+ const { execa } = await import('execa');
166
+ try {
167
+ const proc = await execa('curl', ['-s', '-o', '/dev/null', '-w', '%{http_code}', 'http://localhost:3080/api/system/health']);
168
+ apiResult = { success: true, stdout: proc.stdout };
169
+ }
170
+ catch {
171
+ apiResult = { success: false, stdout: '000' };
172
+ }
173
+ }
174
+ else {
175
+ apiResult = await ssh(`curl -s -o /dev/null -w '%{http_code}' http://localhost/api/system/health`, { silent: true });
176
+ }
177
+ const apiStatus = apiResult.stdout.trim();
178
+ const apiHealthy = apiStatus === '200';
179
+ checks.push({
180
+ name: 'API Endpoint',
181
+ status: apiHealthy ? '✓ OK' : '✗ ' + apiStatus,
182
+ details: apiHealthy ? 'Responding' : 'Not responding',
183
+ });
184
+ if (apiHealthy) {
185
+ apiSpinner.succeed('API: responding');
186
+ }
187
+ else {
188
+ apiSpinner.fail(`API: ${apiStatus}`);
189
+ }
190
+ // Output
191
+ if (options.json) {
192
+ console.log(JSON.stringify(checks, null, 2));
193
+ return;
194
+ }
195
+ log.blank();
196
+ formatTable(['Service', 'Status', 'Details'], checks.map(c => [c.name, c.status, c.details]));
197
+ const healthyCount = checks.filter(c => c.status.startsWith('✓')).length;
198
+ log.blank();
199
+ if (healthyCount === checks.length) {
200
+ log.success('All systems healthy');
201
+ }
202
+ else {
203
+ log.warn(`${healthyCount}/${checks.length} systems healthy`);
204
+ }
205
+ }
206
+ async function showStatus() {
207
+ log.title('Container Status');
208
+ const env = getEnv();
209
+ let result;
210
+ if (env === 'dev') {
211
+ const { execa } = await import('execa');
212
+ const proc = await execa('docker', ['ps', '--format', 'table {{.Names}}\t{{.Status}}\t{{.Ports}}', '--filter', 'name=vucore']);
213
+ result = { stdout: proc.stdout };
214
+ }
215
+ else {
216
+ result = await ssh(`docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' --filter 'name=vucore'`, { silent: true });
217
+ }
218
+ console.log(result.stdout);
219
+ }
220
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/devops/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,wBAAwB;IACxB,OAAO;SACJ,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAAO,EAAE,EAAE;QAClD,MAAM,UAAU,CAAC,IAAI,IAAI,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEL,iBAAiB;IACjB,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,WAAW,CAAC;SACxB,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;SAC3C,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;SAClD,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CAAC;SACvC,MAAM,CAAC,OAAO,EAAE,oBAAoB,CAAC;SACrC,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAAO,EAAE,EAAE;QAClD,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAAO,EAAE,EAAE;QAClD,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEL,YAAY;IACZ,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,OAAY;IAClD,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAElC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,aAAa,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;IAE1E,mBAAmB;IACnB,MAAM,WAAW,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;IAE9D,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,CAAC,sBAAsB,IAAI,kBAAkB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,MAAM,GAAG,CAAC,sBAAsB,IAAI,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAE1C,6BAA6B;IAC7B,MAAM,eAAe,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;IAEtE,MAAM,MAAM,GAAG;sCACqB,IAAI;+BACX,IAAI;;sCAEG,IAAI;+BACX,IAAI;;;IAG/B,CAAC;IAEH,MAAM,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,eAAe,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAElD,oBAAoB;IACpB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEhE,MAAM,cAAc,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;QAC/E,MAAM,UAAU,CAAC,cAAc,EAAE,mBAAmB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAExE,YAAY,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC9C,CAAC;IAED,mBAAmB;IACnB,MAAM,WAAW,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;IAE9D,MAAM,aAAa,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IAC5E,MAAM,UAAU,CAAC,aAAa,EAAE,6CAA6C,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjG,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAE1C,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAwB,EAAE,OAAY;IAC5D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1C,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,SAAS,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IACpE,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACvB,SAAS,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;IAClE,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,SAAS,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,gBAAgB;QAChB,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACpD,GAAG,CAAC,KAAK,EAAE,CAAC;QAEZ,SAAS,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IACpE,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;IAC3C,GAAG,CAAC,KAAK,EAAE,CAAC;IAEZ,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,oBAAoB;QACpB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YAC/F,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,MAAM,UAAU,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,eAAe,MAAM,WAAW,KAAK,IAAI,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAwB,EAAE,OAAY;IAC/D,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAEjC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,UAAU,GAAG,IAAI,IAAI,OAAO,CAAC;IAEnC,MAAM,MAAM,GAA6D,EAAE,CAAC;IAE5E,mBAAmB;IACnB,MAAM,aAAa,GAAG,GAAG,KAAK,KAAK;QACjC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAChH,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAE/F,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,SAAS,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjE,IAAI,MAAM,CAAC;QACX,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAClB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC,CAAC;gBACtF,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YACnD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,GAAG,CAAC,yCAAyC,SAAS,kCAAkC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7H,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC;QAEvC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM;YAC/C,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB;SACnD,CAAC,CAAC;QAEH,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS,WAAW,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7D,IAAI,SAAS,CAAC;IACd,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,yCAAyC,CAAC,CAAC,CAAC;YAC7H,SAAS,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,MAAM,GAAG,CAAC,2EAA2E,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACvH,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,SAAS,KAAK,KAAK,CAAC;IAEvC,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS;QAC9C,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB;KACtD,CAAC,CAAC;IAEH,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,SAAS;IACT,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,WAAW,CACT,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,EAChC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAC/C,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACzE,GAAG,CAAC,KAAK,EAAE,CAAC;IAEZ,IAAI,YAAY,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,IAAI,MAAM,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAE9B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IAErB,IAAI,MAAM,CAAC;IACX,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,2CAA2C,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;QAC/H,MAAM,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,GAAG,CAAC,uFAAuF,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChI,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CiCore CLI - Domain Management Commands
3
+ *
4
+ * Domain attach, detach, transfer between cores
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function registerDomainCommands(program: Command): void;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/domain/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C7D"}
@@ -0,0 +1,386 @@
1
+ /**
2
+ * CiCore CLI - Domain Management Commands
3
+ *
4
+ * Domain attach, detach, transfer between cores
5
+ */
6
+ import { log, spinner } 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, getZoneByDomain, upsertDNSRecord, setSSLMode, createOriginCertificate, purgeAllCache } from '../../lib/cloudflare.js';
11
+ export function registerDomainCommands(program) {
12
+ const domain = program
13
+ .command('domain')
14
+ .description('Domain management commands');
15
+ // vu domain:attach
16
+ domain
17
+ .command('attach <core> <domain>')
18
+ .description('Attach domain to a core')
19
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
20
+ .option('--skip-ssl', 'Skip SSL certificate creation')
21
+ .option('--skip-dns', 'Skip DNS record creation')
22
+ .action(async (core, domainName, options) => {
23
+ await attachDomain(core, domainName, options);
24
+ });
25
+ // vu domain:detach
26
+ domain
27
+ .command('detach <domain>')
28
+ .description('Detach domain from core')
29
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
30
+ .option('-f, --force', 'Skip confirmation')
31
+ .action(async (domainName, options) => {
32
+ await detachDomain(domainName, options);
33
+ });
34
+ // vu domain:transfer
35
+ domain
36
+ .command('transfer <domain> <fromCore> <toCore>')
37
+ .description('Transfer domain from one core to another')
38
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
39
+ .action(async (domainName, fromCore, toCore, options) => {
40
+ await transferDomain(domainName, fromCore, toCore, options);
41
+ });
42
+ // vu domain:list
43
+ domain
44
+ .command('list')
45
+ .alias('ls')
46
+ .description('List all domains and their core mappings')
47
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
48
+ .action(async (options) => {
49
+ await listDomains(options);
50
+ });
51
+ }
52
+ // ============================================
53
+ // ATTACH DOMAIN
54
+ // ============================================
55
+ async function attachDomain(core, domainName, options) {
56
+ log.title('🔗 Attach Domain to Core');
57
+ log.blank();
58
+ const host = await getSSHHost(options.host);
59
+ if (!host) {
60
+ log.error(`SSH host "${options.host}" not found`);
61
+ return;
62
+ }
63
+ log.kv('Domain', domainName);
64
+ log.kv('Core', core);
65
+ log.kv('Server', `${host.name} (${host.hostname})`);
66
+ log.blank();
67
+ const startTime = Date.now();
68
+ // Step 1: Create DNS records (if not skipped)
69
+ if (!options.skipDns) {
70
+ const token = await getCloudflareToken();
71
+ if (token) {
72
+ const dnsSpinner = spinner('Creating DNS records...').start();
73
+ try {
74
+ const zone = await getZoneByDomain(domainName);
75
+ if (zone) {
76
+ await upsertDNSRecord(zone.id, 'A', '@', host.hostname, true);
77
+ await upsertDNSRecord(zone.id, 'A', 'www', host.hostname, true);
78
+ await upsertDNSRecord(zone.id, 'A', 'api', host.hostname, true);
79
+ await upsertDNSRecord(zone.id, 'A', '*', host.hostname, true);
80
+ dnsSpinner.succeed('DNS records created');
81
+ }
82
+ else {
83
+ dnsSpinner.warn('Zone not found in Cloudflare');
84
+ }
85
+ }
86
+ catch (error) {
87
+ dnsSpinner.warn(`DNS: ${error.message}`);
88
+ }
89
+ }
90
+ }
91
+ // Step 2: Create SSL certificate (if not skipped)
92
+ if (!options.skipSsl) {
93
+ const token = await getCloudflareToken();
94
+ if (token) {
95
+ const sslSpinner = spinner('Creating SSL certificate...').start();
96
+ try {
97
+ const zone = await getZoneByDomain(domainName);
98
+ if (zone) {
99
+ await setSSLMode(zone.id, 'strict');
100
+ const hostnames = [domainName, `*.${domainName}`];
101
+ const cert = await createOriginCertificate(hostnames);
102
+ if (cert) {
103
+ // Upload certificate to server
104
+ const sslDir = `/home/services/nginx/ssl`;
105
+ const certPath = `${sslDir}/${domainName}.crt`;
106
+ const keyPath = `${sslDir}/${domainName}.key`;
107
+ const mkdirArgs = buildSSHCommand(host, `mkdir -p ${sslDir}`);
108
+ await exec('ssh', mkdirArgs, { silent: true });
109
+ const certCmd = `cat > ${certPath} << 'CERTEOF'
110
+ ${cert.certificate}
111
+ CERTEOF`;
112
+ const certArgs = buildSSHCommand(host, certCmd);
113
+ await exec('ssh', certArgs, { silent: true });
114
+ const keyCmd = `cat > ${keyPath} << 'KEYEOF'
115
+ ${cert.private_key}
116
+ KEYEOF`;
117
+ const keyArgs = buildSSHCommand(host, keyCmd);
118
+ await exec('ssh', keyArgs, { silent: true });
119
+ const chmodArgs = buildSSHCommand(host, `chmod 600 ${certPath} ${keyPath}`);
120
+ await exec('ssh', chmodArgs, { silent: true });
121
+ sslSpinner.succeed('SSL certificate created and uploaded');
122
+ }
123
+ else {
124
+ sslSpinner.warn('Certificate creation failed');
125
+ }
126
+ }
127
+ }
128
+ catch (error) {
129
+ sslSpinner.warn(`SSL: ${error.message}`);
130
+ }
131
+ }
132
+ }
133
+ // Step 3: Update nginx global router
134
+ const nginxSpinner = spinner('Updating Nginx configuration...').start();
135
+ // Add domain to nginx map
136
+ const addMapCmd = `
137
+ CONF="/home/services/nginx/conf.d/vucore-global-router.conf"
138
+ if [ -f "$CONF" ]; then
139
+ # Check if domain already exists
140
+ if ! grep -q "${domainName}" "$CONF"; then
141
+ # Add to map section
142
+ sed -i "/map \\$host \\$target_core {/a\\ ${domainName} ${core};\\n www.${domainName} ${core};\\n api.${domainName} ${core};\\n ~^.+\\\\.${domainName.replace(/\./g, '\\\\.')}\\$ ${core};" "$CONF"
143
+ echo "ADDED"
144
+ else
145
+ echo "EXISTS"
146
+ fi
147
+ else
148
+ echo "CONF_NOT_FOUND"
149
+ fi
150
+ `;
151
+ const addMapArgs = buildSSHCommand(host, addMapCmd);
152
+ const addMapResult = await exec('ssh', addMapArgs, { silent: true });
153
+ if (addMapResult.stdout.includes('CONF_NOT_FOUND')) {
154
+ nginxSpinner.warn('Nginx config not found');
155
+ }
156
+ else if (addMapResult.stdout.includes('EXISTS')) {
157
+ nginxSpinner.warn('Domain already exists in config');
158
+ }
159
+ else {
160
+ nginxSpinner.succeed('Nginx configuration updated');
161
+ }
162
+ // Step 4: Update core .env
163
+ const envSpinner = spinner('Updating core .env...').start();
164
+ const envCmd = `
165
+ ENV_FILE="/home/cores/${core}/.env"
166
+ if [ -f "$ENV_FILE" ]; then
167
+ if grep -q "^DOMAIN=" "$ENV_FILE"; then
168
+ sed -i "s/^DOMAIN=.*/DOMAIN=${domainName}/" "$ENV_FILE"
169
+ else
170
+ echo "DOMAIN=${domainName}" >> "$ENV_FILE"
171
+ fi
172
+ echo "UPDATED"
173
+ else
174
+ echo "ENV_NOT_FOUND"
175
+ fi
176
+ `;
177
+ const envArgs = buildSSHCommand(host, envCmd);
178
+ const envResult = await exec('ssh', envArgs, { silent: true });
179
+ if (envResult.stdout.includes('ENV_NOT_FOUND')) {
180
+ envSpinner.warn('Core .env not found');
181
+ }
182
+ else {
183
+ envSpinner.succeed('Core .env updated');
184
+ }
185
+ // Step 5: Reload Nginx
186
+ const reloadSpinner = spinner('Reloading Nginx...').start();
187
+ const reloadArgs = buildSSHCommand(host, 'docker exec cicore_global_nginx nginx -t && docker exec cicore_global_nginx nginx -s reload');
188
+ const reloadResult = await exec('ssh', reloadArgs, { silent: true });
189
+ if (reloadResult.success) {
190
+ reloadSpinner.succeed('Nginx reloaded');
191
+ }
192
+ else {
193
+ reloadSpinner.fail('Nginx reload failed');
194
+ log.error(reloadResult.stderr);
195
+ }
196
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
197
+ log.blank();
198
+ log.box('✅ Domain Attached', [
199
+ `Domain: ${domainName}`,
200
+ `Core: ${core}`,
201
+ `Duration: ${elapsed}s`,
202
+ ]);
203
+ }
204
+ // ============================================
205
+ // DETACH DOMAIN
206
+ // ============================================
207
+ async function detachDomain(domainName, options) {
208
+ log.title('🔓 Detach Domain');
209
+ log.blank();
210
+ const host = await getSSHHost(options.host);
211
+ if (!host) {
212
+ log.error(`SSH host "${options.host}" not found`);
213
+ return;
214
+ }
215
+ if (!options.force) {
216
+ const confirmed = await confirm(`Detach domain ${domainName}?`, false);
217
+ if (!confirmed) {
218
+ log.info('Cancelled');
219
+ return;
220
+ }
221
+ }
222
+ // Step 1: Remove from nginx config
223
+ const nginxSpinner = spinner('Removing from Nginx configuration...').start();
224
+ const removeCmd = `
225
+ CONF="/home/services/nginx/conf.d/vucore-global-router.conf"
226
+ if [ -f "$CONF" ]; then
227
+ sed -i "/${domainName}/d" "$CONF"
228
+ echo "REMOVED"
229
+ fi
230
+ `;
231
+ const removeArgs = buildSSHCommand(host, removeCmd);
232
+ await exec('ssh', removeArgs, { silent: true });
233
+ nginxSpinner.succeed('Removed from Nginx config');
234
+ // Step 2: Remove SSL certificates
235
+ const sslSpinner = spinner('Removing SSL certificates...').start();
236
+ const sslCmd = `rm -f /home/services/nginx/ssl/${domainName}.crt /home/services/nginx/ssl/${domainName}.key`;
237
+ const sslArgs = buildSSHCommand(host, sslCmd);
238
+ await exec('ssh', sslArgs, { silent: true });
239
+ sslSpinner.succeed('SSL certificates removed');
240
+ // Step 3: Reload Nginx
241
+ const reloadSpinner = spinner('Reloading Nginx...').start();
242
+ const reloadArgs = buildSSHCommand(host, 'docker exec cicore_global_nginx nginx -s reload 2>/dev/null || true');
243
+ await exec('ssh', reloadArgs, { silent: true });
244
+ reloadSpinner.succeed('Nginx reloaded');
245
+ log.blank();
246
+ log.success(`Domain ${domainName} detached`);
247
+ }
248
+ // ============================================
249
+ // TRANSFER DOMAIN
250
+ // ============================================
251
+ async function transferDomain(domainName, fromCore, toCore, options) {
252
+ log.title('🔄 Transfer Domain');
253
+ log.blank();
254
+ const host = await getSSHHost(options.host);
255
+ if (!host) {
256
+ log.error(`SSH host "${options.host}" not found`);
257
+ return;
258
+ }
259
+ log.kv('Domain', domainName);
260
+ log.kv('From', fromCore);
261
+ log.kv('To', toCore);
262
+ log.blank();
263
+ const confirmed = await confirm(`Transfer ${domainName} from ${fromCore} to ${toCore}?`, true);
264
+ if (!confirmed) {
265
+ log.info('Cancelled');
266
+ return;
267
+ }
268
+ const startTime = Date.now();
269
+ // Step 1: Update nginx map
270
+ const nginxSpinner = spinner('Updating Nginx configuration...').start();
271
+ const updateCmd = `
272
+ CONF="/home/services/nginx/conf.d/vucore-global-router.conf"
273
+ if [ -f "$CONF" ]; then
274
+ # Replace core mapping for this domain
275
+ sed -i "s/${domainName} ${fromCore}/${domainName} ${toCore}/g" "$CONF"
276
+ sed -i "s/www.${domainName} ${fromCore}/www.${domainName} ${toCore}/g" "$CONF"
277
+ sed -i "s/api.${domainName} ${fromCore}/api.${domainName} ${toCore}/g" "$CONF"
278
+ echo "UPDATED"
279
+ fi
280
+ `;
281
+ const updateArgs = buildSSHCommand(host, updateCmd);
282
+ await exec('ssh', updateArgs, { silent: true });
283
+ nginxSpinner.succeed('Nginx configuration updated');
284
+ // Step 2: Update new core .env
285
+ const envSpinner = spinner('Updating core .env files...').start();
286
+ // Remove from old core
287
+ const removeEnvCmd = `
288
+ ENV_FILE="/home/cores/${fromCore}/.env"
289
+ if [ -f "$ENV_FILE" ]; then
290
+ sed -i "/^DOMAIN=${domainName}/d" "$ENV_FILE"
291
+ fi
292
+ `;
293
+ const removeEnvArgs = buildSSHCommand(host, removeEnvCmd);
294
+ await exec('ssh', removeEnvArgs, { silent: true });
295
+ // Add to new core
296
+ const addEnvCmd = `
297
+ ENV_FILE="/home/cores/${toCore}/.env"
298
+ if [ -f "$ENV_FILE" ]; then
299
+ if grep -q "^DOMAIN=" "$ENV_FILE"; then
300
+ sed -i "s/^DOMAIN=.*/DOMAIN=${domainName}/" "$ENV_FILE"
301
+ else
302
+ echo "DOMAIN=${domainName}" >> "$ENV_FILE"
303
+ fi
304
+ fi
305
+ `;
306
+ const addEnvArgs = buildSSHCommand(host, addEnvCmd);
307
+ await exec('ssh', addEnvArgs, { silent: true });
308
+ envSpinner.succeed('Core .env files updated');
309
+ // Step 3: Reload Nginx
310
+ const reloadSpinner = spinner('Reloading Nginx...').start();
311
+ const reloadArgs = buildSSHCommand(host, 'docker exec cicore_global_nginx nginx -t && docker exec cicore_global_nginx nginx -s reload');
312
+ await exec('ssh', reloadArgs, { silent: true });
313
+ reloadSpinner.succeed('Nginx reloaded');
314
+ // Step 4: Clear cache
315
+ const cacheSpinner = spinner('Clearing cache...').start();
316
+ try {
317
+ const token = await getCloudflareToken();
318
+ if (token) {
319
+ const zone = await getZoneByDomain(domainName);
320
+ if (zone) {
321
+ await purgeAllCache(zone.id);
322
+ }
323
+ }
324
+ }
325
+ catch (e) {
326
+ // Ignore cache errors
327
+ }
328
+ cacheSpinner.succeed('Cache cleared');
329
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
330
+ log.blank();
331
+ log.box('✅ Domain Transferred', [
332
+ `Domain: ${domainName}`,
333
+ `From: ${fromCore} → To: ${toCore}`,
334
+ `Duration: ${elapsed}s`,
335
+ '',
336
+ 'No downtime occurred.',
337
+ ]);
338
+ }
339
+ // ============================================
340
+ // LIST DOMAINS
341
+ // ============================================
342
+ async function listDomains(options) {
343
+ log.title('📋 Domain Mappings');
344
+ log.blank();
345
+ const host = await getSSHHost(options.host);
346
+ if (!host) {
347
+ log.error(`SSH host "${options.host}" not found`);
348
+ return;
349
+ }
350
+ const listSpinner = spinner('Loading domain mappings...').start();
351
+ // Parse nginx config for domain mappings
352
+ const cmd = `
353
+ CONF="/home/services/nginx/conf.d/vucore-global-router.conf"
354
+ if [ -f "$CONF" ]; then
355
+ grep -E "^\\s+[a-zA-Z0-9.-]+\\s+core" "$CONF" | awk '{print $1"|"$2}' | sort -u
356
+ fi
357
+ `;
358
+ const args = buildSSHCommand(host, cmd);
359
+ const result = await exec('ssh', args, { silent: true });
360
+ listSpinner.stop();
361
+ if (!result.stdout.trim()) {
362
+ log.info('No domain mappings found');
363
+ return;
364
+ }
365
+ const mappings = result.stdout.trim().split('\n').map(line => {
366
+ const [domain, core] = line.split('|');
367
+ return [domain, core];
368
+ });
369
+ // Group by core
370
+ const byCore = new Map();
371
+ mappings.forEach(([domain, core]) => {
372
+ if (!byCore.has(core)) {
373
+ byCore.set(core, []);
374
+ }
375
+ byCore.get(core).push(domain);
376
+ });
377
+ // Display
378
+ byCore.forEach((domains, core) => {
379
+ log.info(`=== ${core} ===`);
380
+ domains.forEach(d => log.item(d));
381
+ log.blank();
382
+ });
383
+ log.kv('Total Domains', mappings.length.toString());
384
+ log.kv('Total Cores', byCore.size.toString());
385
+ }
386
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/domain/index.ts"],"names":[],"mappings":"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"}