@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,54 @@
1
+ /**
2
+ * CiCore CLI — `ci brand reconcile` (control-plane → node state)
3
+ *
4
+ * The reproducibility keystone (plan B2). The control-plane DB
5
+ * (`vucore_control`: `cp_brands` + `cp_domains`) is the single source of
6
+ * truth; this command *renders* the derived node state from it, idempotently:
7
+ *
8
+ * 1. brand.json — projects each active brand's identity into
9
+ * `cores/<slug>/brand.json` (logo/title/theme) so the Nuxt runtime
10
+ * (core-loader → useBrand → VBrandLogo + titleTemplate) reflects it.
11
+ * Canonical writer; `BrandService::reconcileBrandJson` (PHP) mirrors it.
12
+ * 2. nginx — ensures the core_path map entry + domain→core map + per-domain
13
+ * vhost for every brand domain (`cp_domains` owner_type='brand').
14
+ * 3. DNS (opt-in, --dns) — provisions each domain via the DnsProvider and
15
+ * writes the achieved routing/SSL state back to `cp_domains`.
16
+ * 4. Reloads nginx once (validates first).
17
+ *
18
+ * Idempotent by construction: brand.json is compared semantically (no rewrite
19
+ * if unchanged), nginx map inserts skip-if-present, vhost render is
20
+ * content-stable. Running twice = a clean "unchanged" run. Drift (a hand-
21
+ * edited node, a wiped nginx map) is repaired from the control-plane — the
22
+ * disaster-recovery property the plan calls out (K0).
23
+ */
24
+ import { Command } from 'commander';
25
+ import { type HostConfig } from '../../lib/hosts.js';
26
+ interface BrandRow {
27
+ readonly id: string;
28
+ readonly slug: string;
29
+ readonly title: string;
30
+ readonly logo_url: string | null;
31
+ readonly favicon_url: string | null;
32
+ readonly theme: Record<string, unknown> | null;
33
+ readonly data_db_name: string | null;
34
+ }
35
+ export declare function registerBrandCommands(program: Command): void;
36
+ /**
37
+ * Project tenant state between the control-plane and the brand's data DB (K14
38
+ * BD2). Two directions, both idempotent:
39
+ *
40
+ * - mirror UP: data DB `tnt_tenants` → `cp_tenants_ref` (the control-plane's
41
+ * lightweight tenant mirror; tenants are authored in the data plane, the
42
+ * mirror gives the control-plane the brand↔tenant link routing needs).
43
+ * - project DOWN: `cp_domains` (owner_type='tenant', this brand's tenants) →
44
+ * data DB `tnt_domains`, the cache the runtime reads for host→tenant
45
+ * resolution. cp_domains is the authority (K14); tnt_domains is derived.
46
+ *
47
+ * Upsert by default. With `prune`, also delete derived tnt_domains rows the
48
+ * control-plane no longer lists — safe post-BD3 (the tenant write path now
49
+ * authors cp_domains first, so tnt_domains is purely derived). FK misses
50
+ * (a cp_domains tenant whose tenant isn't in the data DB) are skipped + warned.
51
+ */
52
+ export declare function projectTenantState(cfg: HostConfig, brand: BrandRow, summary: string[], prune?: boolean): Promise<void>;
53
+ export {};
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/brand/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAkBnE,UAAU,QAAQ;IAChB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CACrC;AA+BD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe5D;AAyMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,KAAK,UAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CA0Ef"}
@@ -0,0 +1,367 @@
1
+ /**
2
+ * CiCore CLI — `ci brand reconcile` (control-plane → node state)
3
+ *
4
+ * The reproducibility keystone (plan B2). The control-plane DB
5
+ * (`vucore_control`: `cp_brands` + `cp_domains`) is the single source of
6
+ * truth; this command *renders* the derived node state from it, idempotently:
7
+ *
8
+ * 1. brand.json — projects each active brand's identity into
9
+ * `cores/<slug>/brand.json` (logo/title/theme) so the Nuxt runtime
10
+ * (core-loader → useBrand → VBrandLogo + titleTemplate) reflects it.
11
+ * Canonical writer; `BrandService::reconcileBrandJson` (PHP) mirrors it.
12
+ * 2. nginx — ensures the core_path map entry + domain→core map + per-domain
13
+ * vhost for every brand domain (`cp_domains` owner_type='brand').
14
+ * 3. DNS (opt-in, --dns) — provisions each domain via the DnsProvider and
15
+ * writes the achieved routing/SSL state back to `cp_domains`.
16
+ * 4. Reloads nginx once (validates first).
17
+ *
18
+ * Idempotent by construction: brand.json is compared semantically (no rewrite
19
+ * if unchanged), nginx map inserts skip-if-present, vhost render is
20
+ * content-stable. Running twice = a clean "unchanged" run. Drift (a hand-
21
+ * edited node, a wiped nginx map) is repaired from the control-plane — the
22
+ * disaster-recovery property the plan calls out (K0).
23
+ */
24
+ import { log, spinner } from '../../lib/logger.js';
25
+ import { isDryRun } from '../../lib/config.js';
26
+ import { getHostConfig } from '../../lib/hosts.js';
27
+ import { dbSelectJson, dbExec } from '../../lib/ops/db.js';
28
+ import { coreReconcileBrandJson } from '../../lib/ops/core.js';
29
+ import { nginxDomainAdd, nginxDomainRemove, nginxEnsureCorePath, nginxListDomainsForCore, nginxReload, nginxRemoveVhost, nginxWriteVhost, } from '../../lib/ops/nginx.js';
30
+ import { createDnsProvider } from '../../lib/ops/dns.js';
31
+ const CONTROL_DB = 'vucore_control';
32
+ /** Brand slugs (and the core dirs they map to) — keep in sync with assertSlug (PHP) + assertCoreName (CLI). */
33
+ const SLUG_RE = /^[a-z][a-z0-9_-]{1,62}$/;
34
+ export function registerBrandCommands(program) {
35
+ const brand = program.command('brand').description('Brand control-plane operations');
36
+ brand
37
+ .command('reconcile')
38
+ .description('Render node state (brand.json + nginx + DNS) from the control-plane (idempotent)')
39
+ .option('-h, --host <host>', 'Host alias (cicore | mkt)')
40
+ .option('--brand <slug>', 'Reconcile only this brand slug (default: all active brands)')
41
+ .option('--dns', 'Also provision DNS + TLS for each brand domain via the DnsProvider')
42
+ .option('--fallback-origin <host>', 'CF-for-SaaS fallback origin / owned_zone origin target (with --dns)')
43
+ .option('--ssl-cert-name <name>', "SSL cert basename for vhosts (default: host's defaultSslCertName)")
44
+ .option('--prune', 'Delete orphans the control-plane no longer lists (nginx map/vhost + tnt_domains). Destructive — off by default (BD4)')
45
+ .action(async (options) => {
46
+ await reconcile(options);
47
+ });
48
+ }
49
+ async function reconcile(options) {
50
+ log.title('🔄 Brand reconcile (control-plane → node state)');
51
+ if (options.host === undefined) {
52
+ log.error('--host is required (cicore | mkt). Pass --host <alias>.');
53
+ process.exit(1);
54
+ }
55
+ if (options.brand !== undefined && !SLUG_RE.test(options.brand)) {
56
+ log.error(`Invalid --brand slug '${options.brand}' (a-z, 0-9, -, _; start with a letter).`);
57
+ process.exit(1);
58
+ }
59
+ let cfg;
60
+ try {
61
+ cfg = getHostConfig(options.host);
62
+ }
63
+ catch (err) {
64
+ log.error(err instanceof Error ? err.message : String(err));
65
+ process.exit(1);
66
+ }
67
+ const dryRun = isDryRun();
68
+ const sslCertName = options.sslCertName ?? cfg.defaultSslCertName;
69
+ log.info(`Target host: ${cfg.brandName}`);
70
+ log.info(`Scope: ${options.brand ?? 'all active brands'}`);
71
+ log.info(`DNS: ${options.dns ? 'provision (--dns)' : 'skip'}`);
72
+ log.info(`Prune: ${options.prune ? 'delete orphans (--prune)' : 'keep (upsert-only)'}`);
73
+ log.info(`Dry run: ${dryRun ? 'yes' : 'no'}`);
74
+ log.blank();
75
+ // ── Read desired state from the control-plane ──────────────────────────
76
+ const brandFilter = options.brand ? ` AND slug = '${options.brand}'` : '';
77
+ const brands = await dbSelectJson(cfg, CONTROL_DB, `SELECT id, slug, title, logo_url, favicon_url, theme, data_db_name
78
+ FROM cp_brands
79
+ WHERE status = 'active'${brandFilter}
80
+ ORDER BY slug`);
81
+ if (brands.length === 0) {
82
+ log.warn(`No active brands found in ${CONTROL_DB}${options.brand ? ` matching '${options.brand}'` : ''}. Nothing to reconcile.`);
83
+ return;
84
+ }
85
+ const domains = await dbSelectJson(cfg, CONTROL_DB, `SELECT d.domain, d.kind, d.dns_mode, d.ssl_cert_name, b.slug AS brand_slug
86
+ FROM cp_domains d
87
+ JOIN cp_brands b ON b.id = d.owner_id
88
+ WHERE d.owner_type = 'brand'${options.brand ? ` AND b.slug = '${options.brand}'` : ''}
89
+ ORDER BY d.domain`);
90
+ log.info(`Desired: ${brands.length} brand(s), ${domains.length} domain(s).`);
91
+ log.blank();
92
+ const summary = [];
93
+ let nginxTouched = false;
94
+ // ── Render each brand ──────────────────────────────────────────────────
95
+ for (const b of brands) {
96
+ const brandDomains = domains.filter(d => d.brand_slug === b.slug);
97
+ await step(`brand ${b.slug}`, dryRun, async () => {
98
+ // 1. brand.json projection (semantic-idempotent).
99
+ const projection = {
100
+ brand: b.slug,
101
+ title: b.title,
102
+ logoUrl: b.logo_url || null,
103
+ faviconUrl: b.favicon_url || null,
104
+ theme: b.theme ?? {},
105
+ };
106
+ if (dryRun) {
107
+ log.warn(`[dry-run] reconcile brand.json for ${b.slug} + map ${brandDomains.length} domain(s)`);
108
+ }
109
+ else {
110
+ const bj = await coreReconcileBrandJson(cfg, b.slug, projection);
111
+ if (!bj.success)
112
+ throw new Error(`brand.json: ${bj.stderr}`);
113
+ summary.push(`✓ ${b.slug}: brand.json ${bj.changed ? 'written' : 'unchanged'}`);
114
+ // 2. nginx core_path + per-domain map + vhost.
115
+ const pathRes = await nginxEnsureCorePath(cfg, b.slug);
116
+ if (!pathRes.success)
117
+ throw new Error(`nginx core_path: ${pathRes.stderr}`);
118
+ for (const d of brandDomains) {
119
+ const mapRes = await nginxDomainAdd(cfg, d.domain, b.slug);
120
+ if (!mapRes.success)
121
+ throw new Error(`nginx map ${d.domain}: ${mapRes.stderr}`);
122
+ // Per-domain cert (K14 BD2 fix): the domain's own ssl_cert_name from
123
+ // the control-plane, falling back to the host default only when unset.
124
+ // Multi-brand hosts carry distinct certs — using the host default for
125
+ // every domain would write the wrong cert + break TLS on reload.
126
+ const certName = d.ssl_cert_name ?? sslCertName;
127
+ const vhostRes = await nginxWriteVhost(cfg, b.slug, d.domain, certName);
128
+ if (!vhostRes.success)
129
+ throw new Error(`nginx vhost ${d.domain}: ${vhostRes.stderr}`);
130
+ nginxTouched = true;
131
+ summary.push(`✓ ${b.slug}: nginx ${d.domain} → ${b.slug} (ssl=${certName})`);
132
+ }
133
+ // 2b. Tenant projection (K14 BD2/BD4): mirror tenants up + project
134
+ // tenant domains down into the brand's data DB tnt_domains. With
135
+ // --prune, also delete derived tnt_domains rows the control-plane no
136
+ // longer lists (safe post-BD3: the runtime no longer authors them).
137
+ await projectTenantState(cfg, b, summary, options.prune === true);
138
+ }
139
+ // 2c. Prune nginx orphans (BD4, opt-in): map/vhost the control-plane no
140
+ // longer lists. Honors dry-run (logs only). Runs outside the else so a
141
+ // dry-run still reports what it would remove.
142
+ if (options.prune) {
143
+ const pruned = await pruneBrandNginxOrphans(cfg, b.slug, brandDomains, dryRun, summary);
144
+ if (pruned)
145
+ nginxTouched = true;
146
+ }
147
+ // 3. DNS (opt-in).
148
+ if (options.dns && !dryRun) {
149
+ await provisionBrandDns(cfg, b.slug, brandDomains, options, summary);
150
+ }
151
+ });
152
+ }
153
+ // 4. Reload nginx once.
154
+ if (nginxTouched && !dryRun) {
155
+ await step('reload nginx (validates first)', dryRun, async () => {
156
+ const res = await nginxReload(cfg);
157
+ if (!res.success)
158
+ throw new Error(`nginx reload: ${res.stderr}`);
159
+ summary.push('✓ nginx reloaded');
160
+ });
161
+ }
162
+ log.blank();
163
+ log.title('✨ Reconcile complete');
164
+ for (const line of summary)
165
+ log.info(line);
166
+ if (summary.every(l => l.includes('unchanged')) && nginxTouched === false) {
167
+ log.info('(no drift — node already matches the control-plane)');
168
+ }
169
+ }
170
+ /**
171
+ * Prune nginx routing the control-plane no longer lists for this brand (BD4).
172
+ * Reads the domains nginx currently maps to the brand's core and removes any
173
+ * that aren't a desired cp_domains entry (nor the api.<domain> mirror of one):
174
+ * the DOMAIN_CORE_MAP line plus, for a primary domain, its vhost file. The
175
+ * caller reloads nginx once after all brands. Returns true if anything changed.
176
+ *
177
+ * Scope-safe: only touches entries pointing at THIS brand's core, so other
178
+ * brands/cores are never affected. A domain mapped here but absent from the
179
+ * control-plane is exactly the drift reconcile is meant to repair (K0) — but
180
+ * because removal takes live routing offline it's gated behind --prune.
181
+ */
182
+ async function pruneBrandNginxOrphans(cfg, slug, brandDomains, dryRun, summary) {
183
+ const mapped = await nginxListDomainsForCore(cfg, slug);
184
+ // Keep desired domains + their api.<domain> mirrors (nginxDomainAdd pairs them).
185
+ const kept = new Set();
186
+ for (const d of brandDomains) {
187
+ kept.add(d.domain);
188
+ kept.add(`api.${d.domain}`);
189
+ }
190
+ const orphans = mapped.filter(d => !kept.has(d));
191
+ if (orphans.length === 0)
192
+ return false;
193
+ let changed = false;
194
+ for (const orphan of orphans) {
195
+ if (dryRun) {
196
+ log.warn(`[dry-run] prune nginx orphan ${orphan} (→ ${slug})${orphan.startsWith('api.') ? '' : ' + vhost'}`);
197
+ summary.push(`✓ ${slug}: [dry-run] would prune ${orphan}`);
198
+ continue;
199
+ }
200
+ const unmap = await nginxDomainRemove(cfg, orphan);
201
+ if (!unmap.success) {
202
+ log.warn(`[prune] ${slug}: could not unmap ${orphan}: ${unmap.stderr.trim()}`);
203
+ continue;
204
+ }
205
+ // Only primary domains carry a vhost file; api.<domain> is a map entry only.
206
+ if (!orphan.startsWith('api.')) {
207
+ const rmVhost = await nginxRemoveVhost(cfg, orphan);
208
+ if (!rmVhost.success)
209
+ log.warn(`[prune] ${slug}: could not remove vhost for ${orphan}: ${rmVhost.stderr.trim()}`);
210
+ }
211
+ changed = true;
212
+ summary.push(`✓ ${slug}: pruned orphan ${orphan}`);
213
+ }
214
+ return changed;
215
+ }
216
+ /**
217
+ * Project tenant state between the control-plane and the brand's data DB (K14
218
+ * BD2). Two directions, both idempotent:
219
+ *
220
+ * - mirror UP: data DB `tnt_tenants` → `cp_tenants_ref` (the control-plane's
221
+ * lightweight tenant mirror; tenants are authored in the data plane, the
222
+ * mirror gives the control-plane the brand↔tenant link routing needs).
223
+ * - project DOWN: `cp_domains` (owner_type='tenant', this brand's tenants) →
224
+ * data DB `tnt_domains`, the cache the runtime reads for host→tenant
225
+ * resolution. cp_domains is the authority (K14); tnt_domains is derived.
226
+ *
227
+ * Upsert by default. With `prune`, also delete derived tnt_domains rows the
228
+ * control-plane no longer lists — safe post-BD3 (the tenant write path now
229
+ * authors cp_domains first, so tnt_domains is purely derived). FK misses
230
+ * (a cp_domains tenant whose tenant isn't in the data DB) are skipped + warned.
231
+ */
232
+ export async function projectTenantState(cfg, brand, summary, prune = false) {
233
+ if (!brand.data_db_name) {
234
+ summary.push(`· ${brand.slug}: data_db yok — tenant projeksiyon atlandı`);
235
+ return;
236
+ }
237
+ const dataDb = brand.data_db_name;
238
+ // ── mirror UP: tnt_tenants → cp_tenants_ref ──────────────────────────
239
+ const tenants = await dbSelectJson(cfg, dataDb, `SELECT id, slug FROM tnt_tenants`);
240
+ for (const t of tenants) {
241
+ await dbExec(cfg, CONTROL_DB, `INSERT INTO cp_tenants_ref (brand_id, data_tenant_id, slug)
242
+ VALUES ('${brand.id}', '${t.id}', '${sqlLit(t.slug)}')
243
+ ON CONFLICT (brand_id, slug) DO UPDATE SET data_tenant_id = EXCLUDED.data_tenant_id`);
244
+ }
245
+ if (tenants.length > 0)
246
+ summary.push(`✓ ${brand.slug}: ${tenants.length} tenant aynalandı (cp_tenants_ref)`);
247
+ // ── project DOWN: cp_domains(tenant) → tnt_domains ───────────────────
248
+ const tdomains = await dbSelectJson(cfg, CONTROL_DB, `SELECT d.domain, d.kind, d.routing_status, r.data_tenant_id
249
+ FROM cp_domains d
250
+ JOIN cp_tenants_ref r ON r.data_tenant_id = d.owner_id
251
+ WHERE d.owner_type = 'tenant' AND r.brand_id = '${brand.id}'`);
252
+ let projected = 0;
253
+ for (const d of tdomains) {
254
+ const type = d.kind === 'subdomain' || d.kind === 'tenant_subdomain' ? 'subdomain' : 'domain';
255
+ const status = d.routing_status === 'active' ? 'active' : 'pending';
256
+ // Manual upsert by (tenant_id, domain) — no assumption about a unique
257
+ // constraint on tnt_domains. UPDATE then conditional INSERT.
258
+ const sql = `UPDATE tnt_domains SET status='${status}', type='${type}', updated_at=now() ` +
259
+ `WHERE tenant_id='${d.data_tenant_id}' AND domain='${sqlLit(d.domain)}';\n` +
260
+ `INSERT INTO tnt_domains (tenant_id, domain, status, type, created_at, updated_at) ` +
261
+ `SELECT '${d.data_tenant_id}','${sqlLit(d.domain)}','${status}','${type}',now(),now() ` +
262
+ `WHERE NOT EXISTS (SELECT 1 FROM tnt_domains WHERE tenant_id='${d.data_tenant_id}' AND domain='${sqlLit(d.domain)}');`;
263
+ const res = await dbExec(cfg, dataDb, sql);
264
+ if (res.success)
265
+ projected++;
266
+ else
267
+ log.warn(`[reconcile] ${brand.slug}: tnt_domains projeksiyon atlandı (${d.domain}): ${res.stderr.trim()}`);
268
+ }
269
+ if (projected > 0)
270
+ summary.push(`✓ ${brand.slug}: ${projected} tenant domain projekte edildi (tnt_domains)`);
271
+ // ── prune DOWN: drop derived tnt_domains rows not in cp_domains (BD4) ──
272
+ if (prune) {
273
+ // Desired domains per tenant from the authority (cp_domains owner=tenant).
274
+ const desired = new Map();
275
+ for (const d of tdomains) {
276
+ const set = desired.get(d.data_tenant_id) ?? new Set();
277
+ set.add(d.domain.toLowerCase());
278
+ desired.set(d.data_tenant_id, set);
279
+ }
280
+ let pruned = 0;
281
+ // Only prune tenants the control-plane knows (this brand's mirrored tenants),
282
+ // never touching data DBs/tenants outside the authority's view.
283
+ for (const t of tenants) {
284
+ const keep = desired.get(t.id);
285
+ const notIn = keep && keep.size > 0
286
+ ? ` AND lower(domain) NOT IN (${[...keep].map(d => `'${sqlLit(d)}'`).join(',')})`
287
+ : ''; // no desired domains for this tenant → all its tnt_domains are orphans
288
+ const res = await dbExec(cfg, dataDb, `DELETE FROM tnt_domains WHERE tenant_id='${t.id}'${notIn};`);
289
+ if (res.success) {
290
+ // dbExec doesn't surface rowcount here; count the operation, not rows.
291
+ pruned++;
292
+ }
293
+ else {
294
+ log.warn(`[reconcile] ${brand.slug}: tnt_domains prune atlandı (tenant ${t.slug}): ${res.stderr.trim()}`);
295
+ }
296
+ }
297
+ if (pruned > 0)
298
+ summary.push(`✓ ${brand.slug}: tnt_domains orphan-prune uygulandı (${pruned} tenant)`);
299
+ }
300
+ }
301
+ /**
302
+ * Provision DNS for a brand's domains via the DnsProvider and write the
303
+ * achieved routing/SSL state back to `cp_domains`. Each domain's mode is the
304
+ * control-plane `dns_mode`, falling back to auto-detection. A `pending` SSL
305
+ * (async DV issuance) is recorded as-is, not treated as a failure.
306
+ */
307
+ async function provisionBrandDns(cfg, slug, brandDomains, options, summary) {
308
+ const provider = createDnsProvider(cfg);
309
+ const originTarget = options.fallbackOrigin ?? '';
310
+ for (const d of brandDomains) {
311
+ // Map the control-plane dns_mode → DnsProvider mode:
312
+ // custom_hostname → custom_hostname (BYO domain, CF for SaaS)
313
+ // full_zone / subdomain → owned_zone (a zone/subdomain we manage)
314
+ // detectMode is the fallback only if the column is somehow unset.
315
+ const mode = d.dns_mode === 'custom_hostname'
316
+ ? 'custom_hostname'
317
+ : d.dns_mode === 'full_zone' || d.dns_mode === 'subdomain'
318
+ ? 'owned_zone'
319
+ : await provider.detectMode(d.domain);
320
+ if (mode === 'owned_zone' && !originTarget) {
321
+ log.warn(`[dns] ${d.domain}: owned_zone needs --fallback-origin (CNAME target) — skipping DNS for this domain.`);
322
+ continue;
323
+ }
324
+ const state = await provider.ensureHost({ hostname: d.domain, mode, originTarget });
325
+ if (!state.success) {
326
+ await writeDomainStatus(cfg, d.domain, 'error', 'error');
327
+ throw new Error(`DNS provision failed for ${d.domain}: ${state.errorMessage}`);
328
+ }
329
+ await writeDomainStatus(cfg, d.domain, state.routingStatus, state.sslStatus, state.customHostnameId, state.cfZoneId);
330
+ const sslNote = state.sslStatus === 'active' ? 'ssl active' : 'ssl pending';
331
+ summary.push(`✓ ${slug}: DNS ${d.domain} [${mode}] routing=${state.routingStatus}, ${sslNote}`);
332
+ }
333
+ }
334
+ /** Write achieved DNS state back to cp_domains. Values are validated/enum — safe to interpolate. */
335
+ async function writeDomainStatus(cfg, domain, routing, ssl, customHostnameId, cfZoneId) {
336
+ const setCh = customHostnameId ? `, cf_custom_hostname_id = '${sqlLit(customHostnameId)}'` : '';
337
+ const setZone = cfZoneId ? `, cf_zone_id = '${sqlLit(cfZoneId)}'` : '';
338
+ const sql = `UPDATE cp_domains SET routing_status = '${routing}', ssl_status = '${ssl}'${setCh}${setZone}, updated_at = now() ` +
339
+ `WHERE domain = '${sqlLit(domain)}';`;
340
+ const res = await dbExec(cfg, CONTROL_DB, sql);
341
+ if (!res.success)
342
+ log.warn(`[dns] could not persist status for ${domain}: ${res.stderr.trim()}`);
343
+ }
344
+ /** Escape single quotes for a SQL string literal (defence-in-depth; inputs already validated). */
345
+ function sqlLit(s) {
346
+ return s.replace(/'/g, "''");
347
+ }
348
+ // ─────────────────────────────────────────────────────────────────────────
349
+ // Step runner (consistent log + dry-run handling)
350
+ // ─────────────────────────────────────────────────────────────────────────
351
+ async function step(label, dryRun, body) {
352
+ if (dryRun) {
353
+ await body(); // dry-run bodies only log; no spinner noise
354
+ return;
355
+ }
356
+ const sp = spinner(label).start();
357
+ try {
358
+ await body();
359
+ sp.succeed(label);
360
+ }
361
+ catch (err) {
362
+ sp.fail(label);
363
+ log.error(err instanceof Error ? err.message : String(err));
364
+ process.exit(1);
365
+ }
366
+ }
367
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/brand/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * CiCore CLI — Build commands (host-aware)
3
+ *
4
+ * Three subcommands, one for each core image plus addons:
5
+ *
6
+ * - `vu build nuxt --host <h> [--deploy]` build Nuxt → push → upload UI → deploy
7
+ * - `vu build php --host <h> [--deploy]` build PHP → push → deploy
8
+ * - `vu build addon <name> --host <h>` vite build → upload → install backend → deploy
9
+ *
10
+ * Everything host-specific (registry namespace, CDN endpoint, server paths,
11
+ * container names, ssh target, CF zone) comes from {@link getHostConfig};
12
+ * there is no global CONFIG sabit any more, no hardcoded URL, no hardcoded
13
+ * `/home/cores/...`. Add a host to STATIC_TOPOLOGY and the same commands
14
+ * deploy to it.
15
+ *
16
+ * Heavy lifting (image build/push/pull/retag, compose ops, CDN clean/upload,
17
+ * nginx reload, CF purge) is delegated to the `ops/` primitives written in
18
+ * step 2. This file is mostly orchestration + CLI plumbing + the things
19
+ * still local to the Mac build host (Tailwind safelist, Vite build, manifest
20
+ * generation, Asset hashing).
21
+ */
22
+ import { Command } from 'commander';
23
+ export interface NuxtBuildOptions {
24
+ readonly skipCdn?: boolean;
25
+ readonly skipPush?: boolean;
26
+ readonly skipBuild?: boolean;
27
+ readonly skipServer?: boolean;
28
+ readonly skipSafelist?: boolean;
29
+ readonly host?: string;
30
+ readonly core?: string;
31
+ readonly deploy?: boolean;
32
+ readonly dryRun?: boolean;
33
+ }
34
+ export interface PhpBuildOptions {
35
+ readonly skipPush?: boolean;
36
+ readonly skipServer?: boolean;
37
+ readonly host?: string;
38
+ readonly core?: string;
39
+ readonly deploy?: boolean;
40
+ readonly dryRun?: boolean;
41
+ }
42
+ export interface AddonBuildOptions {
43
+ readonly core?: string;
44
+ readonly skipCdn?: boolean;
45
+ readonly skipServer?: boolean;
46
+ readonly host?: string;
47
+ readonly dryRun?: boolean;
48
+ }
49
+ export declare function registerBuildCommands(program: Command): void;
50
+ export declare function buildNuxt(options: NuxtBuildOptions): Promise<void>;
51
+ export declare function buildPHP(options: PhpBuildOptions): Promise<void>;
52
+ export declare function buildAddon(addonName: string, options: AddonBuildOptions): Promise<void>;
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/build/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8BnC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2C5D;AAMD,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDxE;AA8HD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCtE;AAkDD,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+D7F"}