@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,206 @@
1
+ /**
2
+ * vu core:create <name>
3
+ *
4
+ * Creates a new core instance with the standard directory structure
5
+ */
6
+ import { log, spinner } from '../../lib/logger.js';
7
+ import { ssh } from '../../lib/shell.js';
8
+ import { getEnv } from '../../lib/config.js';
9
+ import { confirm, input } from '../../lib/prompts.js';
10
+ export async function createCore(name, options) {
11
+ const env = getEnv();
12
+ log.title(`Creating Core: ${name}`);
13
+ log.kv('Environment', env);
14
+ log.kv('Domain', options.domain || 'Not specified');
15
+ log.blank();
16
+ // Validate core name
17
+ if (!/^[a-z][a-z0-9_-]*$/i.test(name)) {
18
+ log.error('Invalid core name. Use alphanumeric characters, hyphens, and underscores.');
19
+ process.exit(1);
20
+ }
21
+ // Check if core already exists
22
+ const checkSpinner = spinner('Checking if core exists...').start();
23
+ if (env === 'prod') {
24
+ const result = await ssh(`test -d /home/cores/${name} && echo "exists"`, { silent: true });
25
+ if (result.stdout.includes('exists')) {
26
+ checkSpinner.fail(`Core "${name}" already exists`);
27
+ process.exit(1);
28
+ }
29
+ }
30
+ else {
31
+ // DEV mode - check local addons folder structure
32
+ log.debug('DEV mode: Core creation is server-only operation');
33
+ }
34
+ checkSpinner.succeed('Core name is available');
35
+ // Get domain if not provided
36
+ let domain = options.domain;
37
+ if (!domain) {
38
+ domain = await input('Enter domain for this core:', `${name}.example.com`);
39
+ }
40
+ // Confirm creation
41
+ const shouldCreate = await confirm(`Create core "${name}" with domain "${domain}"?`, true);
42
+ if (!shouldCreate) {
43
+ log.warn('Cancelled');
44
+ return;
45
+ }
46
+ // Create core structure
47
+ const createSpinner = spinner('Creating core directory structure...').start();
48
+ if (env === 'prod') {
49
+ const corePath = `/home/cores/${name}`;
50
+ // Create directories
51
+ const commands = [
52
+ `mkdir -p ${corePath}/addons`,
53
+ `mkdir -p ${corePath}/shared/vendor`,
54
+ `mkdir -p ${corePath}/storage/logs`,
55
+ `mkdir -p ${corePath}/storage/cache`,
56
+ `mkdir -p ${corePath}/storage/temp`,
57
+ `mkdir -p ${corePath}/storage/filestorage`,
58
+ ];
59
+ for (const cmd of commands) {
60
+ const result = await ssh(cmd, { silent: true });
61
+ if (!result.success) {
62
+ createSpinner.fail(`Failed to create directory: ${cmd}`);
63
+ log.error(result.stderr);
64
+ process.exit(1);
65
+ }
66
+ }
67
+ createSpinner.succeed('Directory structure created');
68
+ // Create .env file
69
+ const envSpinner = spinner('Creating environment file...').start();
70
+ const envContent = generateEnvContent(name, domain);
71
+ const envResult = await ssh(`cat > ${corePath}/.env << 'EOF'
72
+ ${envContent}
73
+ EOF`, { silent: true });
74
+ if (!envResult.success) {
75
+ envSpinner.fail('Failed to create .env file');
76
+ log.error(envResult.stderr);
77
+ process.exit(1);
78
+ }
79
+ envSpinner.succeed('Environment file created');
80
+ // Create README
81
+ const readmeSpinner = spinner('Creating README...').start();
82
+ const readmeContent = generateReadmeContent(name, domain);
83
+ await ssh(`cat > ${corePath}/README.md << 'EOF'
84
+ ${readmeContent}
85
+ EOF`, { silent: true });
86
+ readmeSpinner.succeed('README created');
87
+ }
88
+ else {
89
+ createSpinner.info('DEV mode: Core creation is a server-only operation');
90
+ log.warn('Run with --env prod to create core on server');
91
+ return;
92
+ }
93
+ // Summary
94
+ log.blank();
95
+ log.success(`Core "${name}" created successfully!`);
96
+ log.blank();
97
+ log.box('Core Details', [
98
+ `Name: ${name}`,
99
+ `Domain: ${domain}`,
100
+ `Path: /home/cores/${name}`,
101
+ ]);
102
+ log.blank();
103
+ log.info('Next steps:');
104
+ log.item('Update Nginx configuration to add domain routing');
105
+ log.item('Run: vu addon:install <AddonName> ' + name);
106
+ log.item('Run: vu core:rebuild ' + name);
107
+ }
108
+ /**
109
+ * Generate .env file content
110
+ */
111
+ function generateEnvContent(name, domain) {
112
+ return `# ciCore Core Configuration
113
+ # Core: ${name}
114
+ # Generated: ${new Date().toISOString()}
115
+
116
+ # Core Identity
117
+ CORE_NAME=${name}
118
+ DOMAIN=${domain}
119
+
120
+ # Database (PostgreSQL)
121
+ DB_HOST=cicore_global_postgres
122
+ DB_PORT=5432
123
+ DB_NAME=${name.replace(/-/g, '_')}
124
+ DB_USER=postgres
125
+ DB_PASS=your_secure_password_here
126
+
127
+ # Redis Cache
128
+ REDIS_HOST=cicore_global_redis
129
+ REDIS_PORT=6379
130
+ REDIS_DB=0
131
+
132
+ # Application
133
+ APP_ENV=production
134
+ APP_DEBUG=false
135
+ APP_KEY=
136
+
137
+ # Addon Security
138
+ ENFORCE_ADDON_SIGNATURES=true
139
+ ADDON_SIGNATURE_STRICT=true
140
+
141
+ # CDN (Cloudflare R2)
142
+ CDN_URL=https://cdn.cicore.com.tr
143
+ CDN_API_URL=https://cdn-api.cicore.com.tr
144
+ CDN_API_KEY=
145
+
146
+ # Logging
147
+ LOG_LEVEL=info
148
+ LOG_CHANNEL=file
149
+ `;
150
+ }
151
+ /**
152
+ * Generate README content
153
+ */
154
+ function generateReadmeContent(name, domain) {
155
+ return `# ciCore Core: ${name}
156
+
157
+ **Domain:** ${domain}
158
+ **Created:** ${new Date().toISOString()}
159
+
160
+ ## Directory Structure
161
+
162
+ \`\`\`
163
+ ${name}/
164
+ ├── .env # Environment configuration
165
+ ├── addons/ # Installed addons
166
+ ├── shared/ # Shared libraries
167
+ │ └── vendor/ # Vendor dependencies
168
+ └── storage/ # Storage directories
169
+ ├── logs/ # Application logs
170
+ ├── cache/ # Cache files
171
+ ├── temp/ # Temporary files
172
+ └── filestorage/ # User uploads
173
+ \`\`\`
174
+
175
+ ## Commands
176
+
177
+ \`\`\`bash
178
+ # List installed addons
179
+ vu addon:list ${name}
180
+
181
+ # Install an addon
182
+ vu addon:install MyAddon ${name}
183
+
184
+ # Rebuild containers
185
+ vu core:rebuild ${name}
186
+
187
+ # View logs
188
+ vu logs ${name}
189
+
190
+ # Health check
191
+ vu health ${name}
192
+ \`\`\`
193
+
194
+ ## Configuration
195
+
196
+ Edit \`.env\` file to configure:
197
+ - Database connection
198
+ - Redis cache
199
+ - CDN settings
200
+ - Addon security
201
+
202
+ ---
203
+ Generated by CiCore CLI
204
+ `;
205
+ }
206
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/core/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * vu core:delete <name>
3
+ *
4
+ * Deletes a core instance (with double confirmation)
5
+ */
6
+ interface DeleteOptions {
7
+ force?: boolean;
8
+ }
9
+ export declare function deleteCore(name: string, options: DeleteOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/core/delete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEpF"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * vu core:delete <name>
3
+ *
4
+ * Deletes a core instance (with double confirmation)
5
+ */
6
+ import { log, spinner } from '../../lib/logger.js';
7
+ import { ssh } from '../../lib/shell.js';
8
+ import { getEnv } from '../../lib/config.js';
9
+ import { dangerConfirm } from '../../lib/prompts.js';
10
+ export async function deleteCore(name, options) {
11
+ const env = getEnv();
12
+ if (env === 'dev') {
13
+ log.warn('DEV mode: Core deletion is a server-only operation');
14
+ log.info('Run with --env prod to delete core on server');
15
+ return;
16
+ }
17
+ log.title(`Delete Core: ${name}`);
18
+ // Check if core exists
19
+ const checkResult = await ssh(`test -d /home/cores/${name} && echo "exists"`, { silent: true });
20
+ if (!checkResult.stdout.includes('exists')) {
21
+ log.error(`Core "${name}" does not exist`);
22
+ process.exit(1);
23
+ }
24
+ // Get core info
25
+ const envResult = await ssh(`grep "^DOMAIN=" /home/cores/${name}/.env 2>/dev/null | cut -d= -f2`, { silent: true });
26
+ const domain = envResult.stdout.trim() || 'Unknown';
27
+ const addonResult = await ssh(`ls -1 /home/cores/${name}/addons/ 2>/dev/null`, { silent: true });
28
+ const addons = addonResult.stdout.trim().split('\n').filter(Boolean);
29
+ // Show what will be deleted
30
+ log.blank();
31
+ log.warn('The following will be permanently deleted:');
32
+ log.item(`Core: ${name}`);
33
+ log.item(`Domain: ${domain}`);
34
+ log.item(`Path: /home/cores/${name}`);
35
+ if (addons.length > 0) {
36
+ log.item(`Addons: ${addons.join(', ')}`);
37
+ }
38
+ log.blank();
39
+ // Confirmation
40
+ if (!options.force) {
41
+ const confirmed = await dangerConfirm(`Are you sure you want to delete core "${name}"?`, name.toUpperCase());
42
+ if (!confirmed) {
43
+ log.info('Cancelled');
44
+ return;
45
+ }
46
+ }
47
+ // Delete core
48
+ const deleteSpinner = spinner('Deleting core...').start();
49
+ const deleteResult = await ssh(`rm -rf /home/cores/${name}`, { silent: true });
50
+ if (!deleteResult.success) {
51
+ deleteSpinner.fail('Failed to delete core');
52
+ log.error(deleteResult.stderr);
53
+ process.exit(1);
54
+ }
55
+ deleteSpinner.succeed(`Core "${name}" deleted`);
56
+ log.blank();
57
+ log.success('Core deleted successfully');
58
+ log.blank();
59
+ log.info('Remember to:');
60
+ log.item('Remove domain from Nginx configuration');
61
+ log.item('Drop database if no longer needed');
62
+ log.item('Clear Redis cache for this core');
63
+ }
64
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/core/delete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * vu core:env <name>
3
+ *
4
+ * View or edit core environment configuration
5
+ */
6
+ interface EnvOptions {
7
+ show?: boolean;
8
+ set?: string;
9
+ }
10
+ export declare function editEnv(name: string, options: EnvOptions): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../src/commands/core/env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwG9E"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * vu core:env <name>
3
+ *
4
+ * View or edit core environment configuration
5
+ */
6
+ import { log } from '../../lib/logger.js';
7
+ import { ssh } from '../../lib/shell.js';
8
+ import { getEnv } from '../../lib/config.js';
9
+ import { input, confirm } from '../../lib/prompts.js';
10
+ export async function editEnv(name, options) {
11
+ const env = getEnv();
12
+ if (env === 'dev') {
13
+ log.warn('DEV mode: Core env editing is a server-only operation');
14
+ log.info('Run with --env prod to edit core env on server');
15
+ return;
16
+ }
17
+ const envPath = `/home/cores/${name}/.env`;
18
+ // Check if core exists
19
+ const checkResult = await ssh(`test -f ${envPath} && echo "exists"`, { silent: true });
20
+ if (!checkResult.stdout.includes('exists')) {
21
+ log.error(`Core "${name}" does not exist or has no .env file`);
22
+ process.exit(1);
23
+ }
24
+ // Show current env
25
+ if (options.show) {
26
+ log.title(`Environment: ${name}`);
27
+ const result = await ssh(`cat ${envPath}`, { silent: true });
28
+ console.log(result.stdout);
29
+ return;
30
+ }
31
+ // Set specific variable
32
+ if (options.set) {
33
+ const [key, ...valueParts] = options.set.split('=');
34
+ const value = valueParts.join('=');
35
+ if (!key || value === undefined) {
36
+ log.error('Invalid format. Use: --set KEY=value');
37
+ process.exit(1);
38
+ }
39
+ // Check if key exists
40
+ const grepResult = await ssh(`grep "^${key}=" ${envPath}`, { silent: true });
41
+ if (grepResult.success) {
42
+ // Update existing
43
+ await ssh(`sed -i "s|^${key}=.*|${key}=${value}|" ${envPath}`, { silent: true });
44
+ log.success(`Updated: ${key}=${value}`);
45
+ }
46
+ else {
47
+ // Add new
48
+ await ssh(`echo "${key}=${value}" >> ${envPath}`, { silent: true });
49
+ log.success(`Added: ${key}=${value}`);
50
+ }
51
+ return;
52
+ }
53
+ // Interactive mode - show current values and allow editing
54
+ log.title(`Edit Environment: ${name}`);
55
+ const result = await ssh(`cat ${envPath}`, { silent: true });
56
+ const lines = result.stdout.split('\n');
57
+ const envVars = {};
58
+ for (const line of lines) {
59
+ if (line.startsWith('#') || !line.includes('='))
60
+ continue;
61
+ const [key, ...valueParts] = line.split('=');
62
+ envVars[key] = valueParts.join('=');
63
+ }
64
+ // Show editable variables
65
+ const editableKeys = ['DOMAIN', 'DB_NAME', 'DB_USER', 'DB_PASS', 'REDIS_DB', 'APP_DEBUG', 'LOG_LEVEL'];
66
+ log.blank();
67
+ log.info('Current configuration:');
68
+ for (const key of editableKeys) {
69
+ if (envVars[key] !== undefined) {
70
+ const displayValue = key.includes('PASS') ? '********' : envVars[key];
71
+ log.kv(key, displayValue);
72
+ }
73
+ }
74
+ log.blank();
75
+ const shouldEdit = await confirm('Would you like to edit any values?', false);
76
+ if (!shouldEdit) {
77
+ return;
78
+ }
79
+ // Edit each value
80
+ for (const key of editableKeys) {
81
+ if (envVars[key] === undefined)
82
+ continue;
83
+ const currentValue = key.includes('PASS') ? '' : envVars[key];
84
+ const newValue = await input(`${key}:`, currentValue);
85
+ if (newValue !== envVars[key]) {
86
+ await ssh(`sed -i "s|^${key}=.*|${key}=${newValue}|" ${envPath}`, { silent: true });
87
+ log.success(`Updated: ${key}`);
88
+ }
89
+ }
90
+ log.blank();
91
+ log.success('Environment updated');
92
+ log.info('Restart containers for changes to take effect:');
93
+ log.item(`vu core:rebuild ${name}`);
94
+ }
95
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/commands/core/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CiCore CLI - Core Health & Clone Commands
3
+ */
4
+ export declare function healthCore(name: string, options: any): Promise<void>;
5
+ export declare function cloneCore(source: string, target: string, options: any): Promise<void>;
6
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/commands/core/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA6H1E;AAsBD,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAgF3F"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * CiCore CLI - Core Health & Clone Commands
3
+ */
4
+ import { log, spinner } from '../../lib/logger.js';
5
+ import { exec } from '../../lib/shell.js';
6
+ import { confirm } from '../../lib/prompts.js';
7
+ import { getSSHHost, buildSSHCommand } from '../../lib/ssh-config.js';
8
+ // ============================================
9
+ // CORE HEALTH CHECK
10
+ // ============================================
11
+ export async function healthCore(name, options) {
12
+ log.title(`🏥 Core Health Check: ${name}`);
13
+ log.blank();
14
+ const host = await getSSHHost(options.host);
15
+ if (!host) {
16
+ log.error(`SSH host "${options.host}" not found`);
17
+ return;
18
+ }
19
+ const checks = [];
20
+ // Check 1: Core directory exists
21
+ const dirSpinner = spinner('Checking core directory...').start();
22
+ const dirCmd = `test -d /home/cores/${name} && echo "OK" || echo "FAIL"`;
23
+ const dirArgs = buildSSHCommand(host, dirCmd);
24
+ const dirResult = await exec('ssh', dirArgs, { silent: true });
25
+ if (dirResult.stdout.trim() === 'OK') {
26
+ dirSpinner.succeed(`Core directory: OK`);
27
+ checks.push({ name: 'Core Directory', status: 'ok', message: `/home/cores/${name}` });
28
+ }
29
+ else {
30
+ dirSpinner.fail(`Core directory: NOT FOUND`);
31
+ checks.push({ name: 'Core Directory', status: 'fail', message: 'Not found' });
32
+ printHealthSummary(checks);
33
+ return;
34
+ }
35
+ // Check 2: .env file
36
+ const envSpinner = spinner('Checking .env file...').start();
37
+ const envCmd = `test -f /home/cores/${name}/.env && echo "OK" || echo "FAIL"`;
38
+ const envArgs = buildSSHCommand(host, envCmd);
39
+ const envResult = await exec('ssh', envArgs, { silent: true });
40
+ if (envResult.stdout.trim() === 'OK') {
41
+ envSpinner.succeed(`.env file: OK`);
42
+ checks.push({ name: '.env File', status: 'ok', message: 'Present' });
43
+ }
44
+ else {
45
+ envSpinner.fail(`.env file: MISSING`);
46
+ checks.push({ name: '.env File', status: 'fail', message: 'Missing' });
47
+ }
48
+ // Check 3: Addons directory
49
+ const addonsSpinner = spinner('Checking addons...').start();
50
+ const addonsCmd = `ls -1 /home/cores/${name}/addons 2>/dev/null | wc -l`;
51
+ const addonsArgs = buildSSHCommand(host, addonsCmd);
52
+ const addonsResult = await exec('ssh', addonsArgs, { silent: true });
53
+ const addonCount = parseInt(addonsResult.stdout.trim()) || 0;
54
+ addonsSpinner.succeed(`Addons: ${addonCount} installed`);
55
+ checks.push({ name: 'Addons', status: 'ok', message: `${addonCount} installed` });
56
+ // Check 4: Nuxt container
57
+ const nuxtSpinner = spinner('Checking Nuxt container...').start();
58
+ const nuxtCmd = `docker ps --filter "name=cicore_nuxt" --format "{{.Status}}" | head -1`;
59
+ const nuxtArgs = buildSSHCommand(host, nuxtCmd);
60
+ const nuxtResult = await exec('ssh', nuxtArgs, { silent: true });
61
+ if (nuxtResult.stdout.includes('Up')) {
62
+ nuxtSpinner.succeed(`Nuxt: Running`);
63
+ checks.push({ name: 'Nuxt Container', status: 'ok', message: 'Running' });
64
+ }
65
+ else {
66
+ nuxtSpinner.fail(`Nuxt: Not running`);
67
+ checks.push({ name: 'Nuxt Container', status: 'fail', message: 'Not running' });
68
+ }
69
+ // Check 5: PHP container
70
+ const phpSpinner = spinner('Checking PHP container...').start();
71
+ const phpCmd = `docker ps --filter "name=cicore_php" --format "{{.Status}}" | head -1`;
72
+ const phpArgs = buildSSHCommand(host, phpCmd);
73
+ const phpResult = await exec('ssh', phpArgs, { silent: true });
74
+ if (phpResult.stdout.includes('Up')) {
75
+ phpSpinner.succeed(`PHP: Running`);
76
+ checks.push({ name: 'PHP Container', status: 'ok', message: 'Running' });
77
+ }
78
+ else {
79
+ phpSpinner.fail(`PHP: Not running`);
80
+ checks.push({ name: 'PHP Container', status: 'fail', message: 'Not running' });
81
+ }
82
+ // Check 6: PostgreSQL
83
+ const pgSpinner = spinner('Checking PostgreSQL...').start();
84
+ const pgCmd = `docker ps --filter "name=cicore_global_postgres" --format "{{.Status}}" | head -1`;
85
+ const pgArgs = buildSSHCommand(host, pgCmd);
86
+ const pgResult = await exec('ssh', pgArgs, { silent: true });
87
+ if (pgResult.stdout.includes('Up')) {
88
+ pgSpinner.succeed(`PostgreSQL: Running`);
89
+ checks.push({ name: 'PostgreSQL', status: 'ok', message: 'Running' });
90
+ }
91
+ else {
92
+ pgSpinner.fail(`PostgreSQL: Not running`);
93
+ checks.push({ name: 'PostgreSQL', status: 'fail', message: 'Not running' });
94
+ }
95
+ // Check 7: Redis
96
+ const redisSpinner = spinner('Checking Redis...').start();
97
+ const redisCmd = `docker ps --filter "name=cicore_global_redis" --format "{{.Status}}" | head -1`;
98
+ const redisArgs = buildSSHCommand(host, redisCmd);
99
+ const redisResult = await exec('ssh', redisArgs, { silent: true });
100
+ if (redisResult.stdout.includes('Up')) {
101
+ redisSpinner.succeed(`Redis: Running`);
102
+ checks.push({ name: 'Redis', status: 'ok', message: 'Running' });
103
+ }
104
+ else {
105
+ redisSpinner.fail(`Redis: Not running`);
106
+ checks.push({ name: 'Redis', status: 'fail', message: 'Not running' });
107
+ }
108
+ // Check 8: Nginx mapping
109
+ const nginxSpinner = spinner('Checking Nginx mapping...').start();
110
+ const nginxCmd = `grep -c "${name}" /home/services/nginx/conf.d/vucore-global-router.conf 2>/dev/null || echo "0"`;
111
+ const nginxArgs = buildSSHCommand(host, nginxCmd);
112
+ const nginxResult = await exec('ssh', nginxArgs, { silent: true });
113
+ const mappingCount = parseInt(nginxResult.stdout.trim()) || 0;
114
+ if (mappingCount > 0) {
115
+ nginxSpinner.succeed(`Nginx mapping: ${mappingCount} entries`);
116
+ checks.push({ name: 'Nginx Mapping', status: 'ok', message: `${mappingCount} entries` });
117
+ }
118
+ else {
119
+ nginxSpinner.warn(`Nginx mapping: No entries`);
120
+ checks.push({ name: 'Nginx Mapping', status: 'warn', message: 'No entries found' });
121
+ }
122
+ // Print summary
123
+ printHealthSummary(checks);
124
+ }
125
+ function printHealthSummary(checks) {
126
+ const ok = checks.filter(c => c.status === 'ok').length;
127
+ const warn = checks.filter(c => c.status === 'warn').length;
128
+ const fail = checks.filter(c => c.status === 'fail').length;
129
+ log.blank();
130
+ log.info('=== Health Summary ===');
131
+ if (fail === 0 && warn === 0) {
132
+ log.success(`✅ All ${ok} checks passed`);
133
+ }
134
+ else {
135
+ if (fail > 0)
136
+ log.error(`❌ ${fail} failed`);
137
+ if (warn > 0)
138
+ log.warn(`⚠️ ${warn} warnings`);
139
+ if (ok > 0)
140
+ log.success(`✅ ${ok} passed`);
141
+ }
142
+ }
143
+ // ============================================
144
+ // CLONE CORE
145
+ // ============================================
146
+ export async function cloneCore(source, target, options) {
147
+ log.title(`📋 Clone Core: ${source} → ${target}`);
148
+ log.blank();
149
+ const host = await getSSHHost(options.host);
150
+ if (!host) {
151
+ log.error(`SSH host "${options.host}" not found`);
152
+ return;
153
+ }
154
+ // Check source exists
155
+ const checkSpinner = spinner('Checking source core...').start();
156
+ const checkCmd = `test -d /home/cores/${source} && echo "OK" || echo "FAIL"`;
157
+ const checkArgs = buildSSHCommand(host, checkCmd);
158
+ const checkResult = await exec('ssh', checkArgs, { silent: true });
159
+ if (checkResult.stdout.trim() !== 'OK') {
160
+ checkSpinner.fail(`Source core "${source}" not found`);
161
+ return;
162
+ }
163
+ checkSpinner.succeed(`Source core found`);
164
+ // Check target doesn't exist
165
+ const targetCheckCmd = `test -d /home/cores/${target} && echo "EXISTS" || echo "OK"`;
166
+ const targetCheckArgs = buildSSHCommand(host, targetCheckCmd);
167
+ const targetCheckResult = await exec('ssh', targetCheckArgs, { silent: true });
168
+ if (targetCheckResult.stdout.trim() === 'EXISTS') {
169
+ log.error(`Target core "${target}" already exists`);
170
+ return;
171
+ }
172
+ const confirmed = await confirm(`Clone ${source} to ${target}?`, true);
173
+ if (!confirmed) {
174
+ log.info('Cancelled');
175
+ return;
176
+ }
177
+ const startTime = Date.now();
178
+ // Step 1: Copy directory
179
+ const copySpinner = spinner('Copying core directory...').start();
180
+ const copyCmd = `cp -r /home/cores/${source} /home/cores/${target}`;
181
+ const copyArgs = buildSSHCommand(host, copyCmd);
182
+ await exec('ssh', copyArgs, { silent: true });
183
+ copySpinner.succeed('Core directory copied');
184
+ // Step 2: Clear domain from .env
185
+ const envSpinner = spinner('Updating .env file...').start();
186
+ const envCmd = `
187
+ ENV_FILE="/home/cores/${target}/.env"
188
+ if [ -f "$ENV_FILE" ]; then
189
+ sed -i "s/^CORE_NAME=.*/CORE_NAME=${target}/" "$ENV_FILE"
190
+ sed -i "s/^DOMAIN=.*/DOMAIN=/" "$ENV_FILE"
191
+ fi
192
+ `;
193
+ const envArgs = buildSSHCommand(host, envCmd);
194
+ await exec('ssh', envArgs, { silent: true });
195
+ envSpinner.succeed('.env file updated');
196
+ // Step 3: Clear addons (optional - keep structure)
197
+ const addonsSpinner = spinner('Preparing addons directory...').start();
198
+ // Keep addons but clear any cache
199
+ const addonsCmd = `rm -rf /home/cores/${target}/addons/*/ui/.cache 2>/dev/null || true`;
200
+ const addonsArgs = buildSSHCommand(host, addonsCmd);
201
+ await exec('ssh', addonsArgs, { silent: true });
202
+ addonsSpinner.succeed('Addons directory prepared');
203
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
204
+ log.blank();
205
+ log.box('✅ Core Cloned', [
206
+ `Source: ${source}`,
207
+ `Target: ${target}`,
208
+ `Duration: ${elapsed}s`,
209
+ '',
210
+ 'Next steps:',
211
+ ` 1. Attach a domain: vu domain attach ${target} yourdomain.com`,
212
+ ` 2. Check health: vu core health ${target}`,
213
+ ]);
214
+ }
215
+ //# sourceMappingURL=health.js.map