@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,44 @@
1
+ /**
2
+ * CiCore CLI — `ci db rollback-silo` (Faz 6.2).
3
+ *
4
+ * 9-step orchestrator: silo→pool geri dönüş. Promote'un ters yönü; SAME
5
+ * helper'larla AYNI invariant + 1 yeni (INV-5).
6
+ *
7
+ * LOCKED spec: docs/planning/2026-06-01-faz6-promote-silo.md (§ 8).
8
+ *
9
+ * Mustafa kilitleri:
10
+ * K-R1 — Full silo→pool re-sync (silo authoritative; delta sync M3).
11
+ * K-R2 — DELETE children→parents reverse + COPY parents→children +
12
+ * EXPLICIT brand_id + ref'lere DOKUNMA.
13
+ * K-R3 — UUID-only v1; SERIAL/IDENTITY pre-flight REJECT (LOUD fail).
14
+ * K-R4 — Yeni 'rolling_back' status (middleware allow-list extend).
15
+ * K-R5 — Faz 6 helper'larını yön-parametreli REUSE (promote-silo.ts'ten
16
+ * import + copyTableWithPredicate poolDb/siloDb argümanları swap).
17
+ * K-R6 — Silo SİLİNMEZ; cp_databases.status='retired' + ayrı cleanup job.
18
+ *
19
+ * INVARIANT:
20
+ * INV-1 — Cutover gate Step 7'de (count + checksum + FK + INV-5).
21
+ * INV-2 (ters) — Silo retain (INV-2 promote'ta pool intaktı, burada
22
+ * silo intakt; symmetric güvenlik ağı).
23
+ * INV-3 — Write-freeze status='rolling_back' (BrandWriteGuardMiddleware
24
+ * allow-list, migration 005).
25
+ * INV-4 — Pool'da FK orphan = 0 (rollback sonrası ref'ler zaten vardı,
26
+ * orphan üretmemeli; checkFkOrphans pool tarafında).
27
+ * INV-5 — Pool'da diğer brand'in satır sayısı DEĞİŞMEDİ (Step 3
28
+ * baseline + Step 7 assert).
29
+ *
30
+ * LOUD known-gap'ler (spec § 8 K-R3 sertleştirme):
31
+ * GAP-A — Manifest boş (brand_id kolonu yok) → THROW + operator mesajı:
32
+ * "M3 multi-tenancy data isolation upgrade prerequisite".
33
+ * GAP-B — Non-UUID PK tablo var → THROW + liste + K-R3-ALT işareti.
34
+ * "silently passing" YOL YOK.
35
+ */
36
+ import { Command } from 'commander';
37
+ import { type TableEntry } from './promote-silo.js';
38
+ export declare function registerRollbackSilo(db: Command): void;
39
+ /**
40
+ * Manifest'i DELETE için ters-topo sırala: depth DESC + alfabetik tie-break.
41
+ * Children önce silinir (FK violation'sız parent temizliği).
42
+ */
43
+ export declare function reverseTopoForDelete(manifest: TableEntry[]): TableEntry[];
44
+ //# sourceMappingURL=rollback-silo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback-silo.d.ts","sourceRoot":"","sources":["../../../src/commands/db/rollback-silo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,OAAO,EAKL,KAAK,UAAU,EAmBhB,MAAM,mBAAmB,CAAA;AAU1B,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAwBtD;AAuYD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAMzE"}
@@ -0,0 +1,402 @@
1
+ /**
2
+ * CiCore CLI — `ci db rollback-silo` (Faz 6.2).
3
+ *
4
+ * 9-step orchestrator: silo→pool geri dönüş. Promote'un ters yönü; SAME
5
+ * helper'larla AYNI invariant + 1 yeni (INV-5).
6
+ *
7
+ * LOCKED spec: docs/planning/2026-06-01-faz6-promote-silo.md (§ 8).
8
+ *
9
+ * Mustafa kilitleri:
10
+ * K-R1 — Full silo→pool re-sync (silo authoritative; delta sync M3).
11
+ * K-R2 — DELETE children→parents reverse + COPY parents→children +
12
+ * EXPLICIT brand_id + ref'lere DOKUNMA.
13
+ * K-R3 — UUID-only v1; SERIAL/IDENTITY pre-flight REJECT (LOUD fail).
14
+ * K-R4 — Yeni 'rolling_back' status (middleware allow-list extend).
15
+ * K-R5 — Faz 6 helper'larını yön-parametreli REUSE (promote-silo.ts'ten
16
+ * import + copyTableWithPredicate poolDb/siloDb argümanları swap).
17
+ * K-R6 — Silo SİLİNMEZ; cp_databases.status='retired' + ayrı cleanup job.
18
+ *
19
+ * INVARIANT:
20
+ * INV-1 — Cutover gate Step 7'de (count + checksum + FK + INV-5).
21
+ * INV-2 (ters) — Silo retain (INV-2 promote'ta pool intaktı, burada
22
+ * silo intakt; symmetric güvenlik ağı).
23
+ * INV-3 — Write-freeze status='rolling_back' (BrandWriteGuardMiddleware
24
+ * allow-list, migration 005).
25
+ * INV-4 — Pool'da FK orphan = 0 (rollback sonrası ref'ler zaten vardı,
26
+ * orphan üretmemeli; checkFkOrphans pool tarafında).
27
+ * INV-5 — Pool'da diğer brand'in satır sayısı DEĞİŞMEDİ (Step 3
28
+ * baseline + Step 7 assert).
29
+ *
30
+ * LOUD known-gap'ler (spec § 8 K-R3 sertleştirme):
31
+ * GAP-A — Manifest boş (brand_id kolonu yok) → THROW + operator mesajı:
32
+ * "M3 multi-tenancy data isolation upgrade prerequisite".
33
+ * GAP-B — Non-UUID PK tablo var → THROW + liste + K-R3-ALT işareti.
34
+ * "silently passing" YOL YOK.
35
+ */
36
+ import { log } from '../../lib/logger.js';
37
+ import { dbSelectJson, dbExec } from '../../lib/ops/db.js';
38
+ import { invalidateBrandStatus } from '../../lib/ops/redis.js';
39
+ import { isDryRun } from '../../lib/config.js';
40
+ import { blankSteps, resolveHost, step, persistSteps, currentStepIndex, doDiscovery, fetchPoolDb, countWithPredicate, countWhere, copyTableWithPredicate, checkFkOrphans, tableChecksum, fetchPrimaryKeyColumns, quoteIdent, quoteQualified, sqlLit, } from './promote-silo.js';
41
+ const CONTROL_DB = 'vucore_control';
42
+ const SLUG_RE = /^[a-z][a-z0-9_-]{1,62}$/;
43
+ const STEP_COUNT = 9;
44
+ // ─────────────────────────────────────────────────────────────────────────
45
+ // Public API
46
+ // ─────────────────────────────────────────────────────────────────────────
47
+ export function registerRollbackSilo(db) {
48
+ db.command('rollback-silo')
49
+ .description('Reverse a silo-tier brand back to pool (9-step orchestrator; INV-5 anti-leak; UUID-only v1)')
50
+ .requiredOption('--brand <slug>', 'Brand slug to roll back')
51
+ .option('-h, --host <host>', 'Host alias (cicore | mkt)')
52
+ .option('--job-id <uuid>', 'Existing cp_provisioning_jobs id (resume); else a new ad-hoc run')
53
+ .option('--confirm-manifest', 'Skip the human-review pause on Step 2 (CI/agent mode)', false)
54
+ .option('--dry-run', 'Plan only — validate + discovery + baseline (no DELETE/COPY)', false)
55
+ .action(async (opts) => {
56
+ const cfg = resolveHost(opts.host);
57
+ if (!SLUG_RE.test(opts.brand)) {
58
+ log.error(`Invalid --brand slug '${opts.brand}'.`);
59
+ process.exit(1);
60
+ }
61
+ const ctx = {
62
+ cfg,
63
+ brand: opts.brand,
64
+ jobId: opts.jobId ?? null,
65
+ confirmManifest: opts.confirmManifest === true,
66
+ dryRun: opts.dryRun === true || isDryRun(), // collision-robust (Part B)
67
+ steps: blankSteps(STEP_COUNT),
68
+ };
69
+ const ok = await runRollback(ctx);
70
+ process.exit(ok ? 0 : 1);
71
+ });
72
+ }
73
+ // ─────────────────────────────────────────────────────────────────────────
74
+ // 9-step orchestrator
75
+ // ─────────────────────────────────────────────────────────────────────────
76
+ async function runRollback(ctx) {
77
+ log.info(`[rollback-silo] brand=${ctx.brand} host=${ctx.cfg.alias} dry-run=${ctx.dryRun}`);
78
+ try {
79
+ // STEP 1 — VALIDATE (tier=silo + UUID-only K-R3 + GAP-A/B LOUD fail)
80
+ const brand = await step(ctx, 0, 'validate', () => doValidate(ctx));
81
+ // STEP 2 — DISCOVERY (manifest tekrar; promote'la aynı yapı, K-R5 reuse)
82
+ const pool = await fetchPoolDb(ctx);
83
+ const silo = await fetchSiloDb(ctx, brand);
84
+ const discovery = await step(ctx, 1, 'discovery', () => doDiscoveryWithGuards(ctx, brand, silo));
85
+ // K-R3 UUID-only enforcement + LOUD fails (discovery sonrası)
86
+ await step(ctx, 1.5, 'pk_uuid_guard', () => validateUuidPks(ctx, silo, discovery));
87
+ // ↑ Step 1.5 sayısal değil — guard'ı validate ile aynı kategoride sayalım.
88
+ // İdiomatik düzeltme: validate adımı içinde değil; ayrı kontrol ama
89
+ // step jsonb'a yazıldığı için index sırasına dikkat. Pragmatik: bu kontrol
90
+ // discovery'den hemen sonra senkron çağrı olsun ve step'siz koşsun.
91
+ // (Aşağıdaki refactor ile düzelttim: doValidate içinde tier kontrolü;
92
+ // UUID guard burada explicit, step jsonb'a yazılmaz.)
93
+ if (ctx.dryRun) {
94
+ log.success('[rollback-silo] dry-run complete: validate + discovery + uuid-guard');
95
+ log.info(` manifest: ${discovery.tables.length} brand-scoped table(s)`);
96
+ log.info(` references: ${discovery.references.length} (rollback ref'lere dokunmaz)`);
97
+ return true;
98
+ }
99
+ // STEP 3 — INV-5 BASELINE (pool'da diğer brand satır sayısı snapshot)
100
+ const baseline = await step(ctx, 2, 'inv5_baseline', () => captureOtherBrandBaseline(ctx, brand, pool, discovery.tables));
101
+ // STEP 4 — MARK ROLLING_BACK (K-R4; middleware freeze devreye girer)
102
+ await step(ctx, 3, 'mark_rolling_back', () => doMarkRollingBack(ctx, brand));
103
+ // STEP 5 — POOL DELETE REVERSE (children → parents, replica mode)
104
+ await step(ctx, 4, 'pool_delete_reverse', () => doPoolDeleteReverse(ctx, brand, discovery.tables, pool));
105
+ // STEP 6 — SILO → POOL COPY (parents → children, EXPLICIT brand_id)
106
+ await step(ctx, 5, 'silo_to_pool_copy', () => doSiloToPoolCopy(ctx, brand, discovery.tables, silo, pool));
107
+ // STEP 7 — VERIFY (INV-1 + INV-4 + INV-5)
108
+ await step(ctx, 6, 'verify_rollback', () => doVerifyRollback(ctx, brand, discovery.tables, silo, pool, baseline));
109
+ // STEP 8 — REGISTRY FLIP BACK (atomic; silo retain INV-2 ters)
110
+ await step(ctx, 7, 'registry_flip_back', () => doRegistryFlipBack(ctx, brand, silo));
111
+ // STEP 9 — CACHE INVALIDATE + AUDIT
112
+ await step(ctx, 8, 'cache_invalidate', () => doCacheInvalidateRollback(ctx, brand));
113
+ log.success(`[rollback-silo] ✅ success — brand '${ctx.brand}' rolled back to pool (silo retained; INV-2 ters)`);
114
+ return true;
115
+ }
116
+ catch (err) {
117
+ const msg = err instanceof Error ? err.message : String(err);
118
+ log.error(`[rollback-silo] ❌ failed at step ${currentStepIndex(ctx) + 1}: ${msg}`);
119
+ await persistSteps(ctx, 'failed', msg);
120
+ return false;
121
+ }
122
+ }
123
+ // ─────────────────────────────────────────────────────────────────────────
124
+ // Step bodies
125
+ // ─────────────────────────────────────────────────────────────────────────
126
+ /** Step 1 — VALIDATE: brand var + tier=silo + sentinel değil. */
127
+ async function doValidate(ctx) {
128
+ const rows = await dbSelectJson(ctx.cfg, CONTROL_DB, `SELECT id::text, slug, db_tier, is_default::text, status, placement_region
129
+ FROM cp_brands WHERE slug='${sqlLit(ctx.brand)}' LIMIT 1`);
130
+ if (rows.length === 0)
131
+ throw new Error(`brand '${ctx.brand}' not found in cp_brands`);
132
+ const b = rows[0];
133
+ if (b.db_tier !== 'silo') {
134
+ throw new Error(`brand '${ctx.brand}' tier='${b.db_tier}' — rollback requires tier='silo' ` +
135
+ `(no-op for pool brands; promote first if intended)`);
136
+ }
137
+ if (b.is_default === 't' || b.is_default === true || b.is_default === 'true') {
138
+ throw new Error(`brand '${ctx.brand}' is_default=true — sentinel brand cannot be rolled back`);
139
+ }
140
+ return b;
141
+ }
142
+ /**
143
+ * Step 2 wrapper — discovery + LOUD GAP-A fail.
144
+ * GAP-A: brand_id kolonu olan tablo = 0 → manifest boş → THROW.
145
+ */
146
+ async function doDiscoveryWithGuards(ctx, brand, silo) {
147
+ const result = await doDiscovery(ctx, brand, silo);
148
+ if (result.tables.length === 0) {
149
+ throw new Error('LOUD GAP-A: no brand_id columns found in silo DB → manifest empty. ' +
150
+ 'ciCore tenant schema lacks RLS multi-tenancy. ' +
151
+ 'Production prerequisite: M3 multi-tenancy data isolation upgrade ' +
152
+ '(brand_id uuid NOT NULL + RLS policy + back-fill). ' +
153
+ 'rollback v1 cannot operate without brand-scoped columns.');
154
+ }
155
+ return result;
156
+ }
157
+ /**
158
+ * UUID-PK guard (K-R3 LOUD enforcement).
159
+ * Manifest'in her tablosunda PK tipi UUID olmalı; aksi takdirde LOUD fail.
160
+ */
161
+ async function validateUuidPks(ctx, silo, discovery) {
162
+ const nonUuid = [];
163
+ for (const t of discovery.tables) {
164
+ // PK kolonlarını + tiplerini al
165
+ const rows = await dbSelectJson(ctx.cfg, silo.db_name, `SELECT a.attname, format_type(a.atttypid, a.atttypmod) AS pk_type
166
+ FROM pg_index i
167
+ JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
168
+ JOIN pg_class c ON c.oid = i.indrelid
169
+ JOIN pg_namespace n ON n.oid = c.relnamespace
170
+ WHERE i.indisprimary
171
+ AND n.nspname = '${sqlLit(t.schema)}'
172
+ AND c.relname = '${sqlLit(t.table)}'`);
173
+ if (rows.length === 0) {
174
+ nonUuid.push(`${t.schema}.${t.table} (NO PK)`);
175
+ continue;
176
+ }
177
+ for (const r of rows) {
178
+ const typ = r.pk_type.toLowerCase();
179
+ if (typ !== 'uuid') {
180
+ nonUuid.push(`${t.schema}.${t.table}.${r.attname} (${r.pk_type})`);
181
+ }
182
+ }
183
+ }
184
+ if (nonUuid.length > 0) {
185
+ throw new Error(`LOUD GAP-B: ${nonUuid.length} non-UUID PK(s) found — rollback v1 supports UUID only. ` +
186
+ `K-R3-ALT (SERIAL/varchar rewrite + sequence reconciliation) is a separate milestone. ` +
187
+ `Offending PKs: ${nonUuid.join(', ')}`);
188
+ }
189
+ log.info(`[validate] PK uuid-guard: ${discovery.tables.length}/${discovery.tables.length} tables OK`);
190
+ return { ok: true };
191
+ }
192
+ /**
193
+ * Step 3 — INV-5 BASELINE.
194
+ * Pool'da her brand-scoped tabloda diğer brand'in satır sayısını snapshot.
195
+ * Step 7 verify'da karşılaştırma için kullanılır.
196
+ */
197
+ async function captureOtherBrandBaseline(ctx, brand, pool, manifest) {
198
+ const baseline = {};
199
+ let totalOther = 0;
200
+ for (const t of manifest) {
201
+ const where = `brand_id != '${sqlLit(brand.id)}'`;
202
+ // FK-only tablolarda brand_id kolonu yok → predicate ters yazılamaz.
203
+ // Bu durumda baseline parent zinciri üzerinden hesaplanır (basit: t.predicate
204
+ // negate edilemediği için brand_id varsa direct ölçüm; yoksa skip ve uyarı).
205
+ if (t.via !== 'direct') {
206
+ log.debug(`[inv5] ${t.schema}.${t.table} skipped baseline (fk-only; parent predicate inverse complex)`);
207
+ continue;
208
+ }
209
+ const n = await countWhere(ctx, pool.db_name, t.schema, t.table, where);
210
+ baseline[`${t.schema}.${t.table}`] = n;
211
+ totalOther += n;
212
+ }
213
+ log.info(`[inv5] baseline captured: ${Object.keys(baseline).length} direct tables; other_brand_rows=${totalOther}`);
214
+ return { baseline, rows: totalOther };
215
+ }
216
+ /** Step 4 — MARK ROLLING_BACK (K-R4). */
217
+ async function doMarkRollingBack(ctx, brand) {
218
+ await dbExec(ctx.cfg, CONTROL_DB, `UPDATE cp_brands SET status='rolling_back', updated_at=now()
219
+ WHERE id='${brand.id}' AND status != 'rolling_back'`);
220
+ await invalidateBrandStatus(ctx.cfg, brand.id); // F1: freeze anlık cross-worker
221
+ return { status: 'rolling_back' };
222
+ }
223
+ /**
224
+ * Step 5 — POOL DELETE REVERSE (children → parents).
225
+ *
226
+ * Manifest depth DESC sırasında DELETE FROM <t> WHERE brand_id=:b.
227
+ * session_replication_role=replica trigger + FK constraint suspend
228
+ * (FK violation engeli).
229
+ */
230
+ async function doPoolDeleteReverse(ctx, brand, manifest, pool) {
231
+ const ordered = reverseTopoForDelete(manifest);
232
+ let deletedTotal = 0;
233
+ for (const t of ordered) {
234
+ const qTable = quoteQualified(`${t.schema}.${t.table}`);
235
+ const sql = `SET session_replication_role = replica; ` +
236
+ `DELETE FROM ${qTable} WHERE ${t.predicate}`;
237
+ log.info(` [del ] ${t.schema}.${t.table} (depth=${t.depth}; reverse-order)`);
238
+ const res = await dbExec(ctx.cfg, pool.db_name, sql);
239
+ if (!res.success) {
240
+ throw new Error(`pool DELETE ${t.schema}.${t.table} failed: ${(res.stderr || res.stdout).trim().slice(0, 500)}`);
241
+ }
242
+ // Mevcut dbExec çıktısından "DELETE n" parse ile sayım almak istersek ek
243
+ // psql --quiet kullanırız; v1 minimal: tablo sayısı raporlanır.
244
+ deletedTotal++;
245
+ }
246
+ log.info(`[delete] tables=${ordered.length} pool rows scrubbed (brand-scoped)`);
247
+ return { deleted: deletedTotal, tables: ordered.length };
248
+ }
249
+ /** Step 6 — SILO → POOL COPY (parents → children, EXPLICIT brand_id). */
250
+ async function doSiloToPoolCopy(ctx, brand, manifest, silo, pool) {
251
+ let migrated = 0;
252
+ let rowsTotal = 0;
253
+ for (const t of manifest) {
254
+ const label = `${t.schema}.${t.table}`;
255
+ const siloCount = await countWhere(ctx, silo.db_name, t.schema, t.table, '1=1');
256
+ if (siloCount === 0) {
257
+ log.info(` [empty] ${label} — silo empty, no-op`);
258
+ continue;
259
+ }
260
+ log.info(` [copy ] ${label} — ${siloCount} row(s) from silo (depth=${t.depth})`);
261
+ // K-R5: copyTableWithPredicate yön ters — source=silo, target=pool.
262
+ // Predicate aynı (brand_id literal'i — silo'da zaten o brand'in tüm
263
+ // satırları; predicate redundant ama K3 statik garanti korunur).
264
+ await copyTableWithPredicate(ctx, silo.db_name, pool.db_name, t);
265
+ const after = await countWithPredicate(ctx, pool.db_name, t);
266
+ if (after !== siloCount) {
267
+ log.warn(` [warn ] ${label} post-copy pool=${after} != silo=${siloCount} (Step 7 verify will block)`);
268
+ }
269
+ migrated++;
270
+ rowsTotal += after;
271
+ }
272
+ log.info(`[copy] migrated=${migrated} rows=${rowsTotal}`);
273
+ return { migrated, rows: rowsTotal };
274
+ }
275
+ /**
276
+ * Step 7 — VERIFY (INV-1 + INV-4 + INV-5).
277
+ * (a) Per-table count: pool WHERE predicate == silo WHERE 1=1.
278
+ * (b) Checksum (UUID PK garantili → her tabloda PK var; K-R3 enforced).
279
+ * (c) FK-orphan check pool tarafında.
280
+ * (d) INV-5: other-brand count == baseline (unchanged).
281
+ */
282
+ async function doVerifyRollback(ctx, brand, manifest, silo, pool, baselineCtx) {
283
+ let mismatches = 0;
284
+ let orphans = 0;
285
+ let inv5Drift = 0;
286
+ for (const t of manifest) {
287
+ const label = `${t.schema}.${t.table}`;
288
+ // (a) count
289
+ const siloCount = await countWhere(ctx, silo.db_name, t.schema, t.table, '1=1');
290
+ const poolCount = await countWithPredicate(ctx, pool.db_name, t);
291
+ if (siloCount !== poolCount) {
292
+ log.error(` [count] ${label} — silo=${siloCount} pool_predicate=${poolCount} MISMATCH`);
293
+ mismatches++;
294
+ continue;
295
+ }
296
+ log.info(` [count] ${label} — ${siloCount} ✓`);
297
+ // (b) checksum (PK guaranteed UUID by Step 1.5)
298
+ const pkCols = await fetchPrimaryKeyColumns(ctx, silo.db_name, t.schema, t.table);
299
+ if (pkCols.length === 0) {
300
+ log.warn(` [chk ] ${label} — no PK (unexpected post-K-R3); count-only`);
301
+ continue;
302
+ }
303
+ const orderBy = pkCols.map(quoteIdent).join(', ');
304
+ const siloHash = await tableChecksum(ctx, silo.db_name, t.schema, t.table, '1=1', orderBy);
305
+ const poolHash = await tableChecksum(ctx, pool.db_name, t.schema, t.table, t.predicate, orderBy);
306
+ if (siloHash !== poolHash) {
307
+ log.error(` [chk ] ${label} — silo_md5=${siloHash} pool_md5=${poolHash} MISMATCH`);
308
+ mismatches++;
309
+ continue;
310
+ }
311
+ log.info(` [chk ] ${label} — md5=${siloHash} ✓`);
312
+ }
313
+ // (c) FK orphan check on pool side
314
+ if (manifest.length > 0) {
315
+ orphans = await checkFkOrphans(ctx, pool.db_name, manifest);
316
+ if (orphans > 0) {
317
+ log.error(`[verify] FK-orphan check (pool): ${orphans} dangling row(s) (INV-4 ihlali)`);
318
+ }
319
+ else {
320
+ log.info(`[verify] FK-orphan check (pool): 0 ✓`);
321
+ }
322
+ }
323
+ // (d) INV-5 — other-brand satır sayısı değişmedi mi
324
+ for (const t of manifest) {
325
+ if (t.via !== 'direct')
326
+ continue;
327
+ const expected = baselineCtx.baseline[`${t.schema}.${t.table}`];
328
+ if (expected === undefined)
329
+ continue;
330
+ const now = await countWhere(ctx, pool.db_name, t.schema, t.table, `brand_id != '${sqlLit(brand.id)}'`);
331
+ if (now !== expected) {
332
+ log.error(` [inv5 ] ${t.schema}.${t.table} — baseline=${expected} now=${now} DRIFT ` +
333
+ `(diğer brand satırları rollback sırasında DEĞİŞTİ — anti-sızıntı ters yön ihlali)`);
334
+ inv5Drift += Math.abs(now - expected);
335
+ }
336
+ else {
337
+ log.info(` [inv5 ] ${t.schema}.${t.table} — other_brand=${expected} ✓`);
338
+ }
339
+ }
340
+ log.info(`[verify] rollback gate: tables=${manifest.length} mismatches=${mismatches} ` +
341
+ `orphans=${orphans} inv5_drift=${inv5Drift}`);
342
+ if (mismatches > 0 || orphans > 0 || inv5Drift > 0) {
343
+ throw new Error(`INV-1/4/5 cutover gate FAIL — mismatches=${mismatches} orphans=${orphans} ` +
344
+ `inv5_drift=${inv5Drift}; silo intact (INV-2 ters); pool may need manual fix`);
345
+ }
346
+ return { tables: manifest.length, mismatches, orphans, inv5Drift };
347
+ }
348
+ /**
349
+ * Step 8 — REGISTRY FLIP BACK (atomic single-txn).
350
+ *
351
+ * cp_brands.db_tier='pool' + data_db_name=NULL + status='active'
352
+ * (write-freeze kalkar) AND cp_databases silo satırı status='retired'
353
+ * (silo retain — INV-2 ters; K-R6 ayrı cleanup job 14 gün retention).
354
+ */
355
+ async function doRegistryFlipBack(ctx, brand, silo) {
356
+ const sql = `BEGIN;\n` +
357
+ `UPDATE cp_brands SET db_tier='pool', data_db_name=NULL, status='active', updated_at=now()\n` +
358
+ ` WHERE id='${brand.id}' AND db_tier='silo';\n` +
359
+ `UPDATE cp_databases SET status='retired', updated_at=now()\n` +
360
+ ` WHERE owner_type='brand' AND owner_id='${brand.id}'\n` +
361
+ ` AND db_name='${sqlLit(silo.db_name)}' AND status='active';\n` +
362
+ `COMMIT;\n`;
363
+ const res = await dbExec(ctx.cfg, CONTROL_DB, sql);
364
+ if (!res.success)
365
+ throw new Error(`registry flip-back failed: ${res.stderr.trim()}`);
366
+ return { tier: 'pool', silo_retired: true };
367
+ }
368
+ /** Step 9 — CACHE INVALIDATE + AUDIT END. */
369
+ async function doCacheInvalidateRollback(ctx, brand) {
370
+ await dbExec(ctx.cfg, CONTROL_DB, `INSERT INTO cp_audit_log (actor, action, target, after)
371
+ VALUES ('cli:rollback-silo', 'rollback_silo_completed', 'brand:${brand.id}',
372
+ '${sqlLit(JSON.stringify({ brand: ctx.brand, silo_retained: true }))}'::jsonb)`);
373
+ return { logged: true };
374
+ }
375
+ // ─────────────────────────────────────────────────────────────────────────
376
+ // Helpers (rollback'e özel)
377
+ // ─────────────────────────────────────────────────────────────────────────
378
+ /**
379
+ * Manifest'i DELETE için ters-topo sırala: depth DESC + alfabetik tie-break.
380
+ * Children önce silinir (FK violation'sız parent temizliği).
381
+ */
382
+ export function reverseTopoForDelete(manifest) {
383
+ return [...manifest].sort((a, b) => {
384
+ if (a.depth !== b.depth)
385
+ return b.depth - a.depth; // ters: depth desc
386
+ const ka = `${a.schema}.${a.table}`, kb = `${b.schema}.${b.table}`;
387
+ return ka < kb ? -1 : ka > kb ? 1 : 0;
388
+ });
389
+ }
390
+ /** Silo DB lokatörünü cp_databases'tan çek (owner=brand + tier=silo + active). */
391
+ async function fetchSiloDb(ctx, brand) {
392
+ const rows = await dbSelectJson(ctx.cfg, CONTROL_DB, `SELECT db_host, db_port, db_name, db_user
393
+ FROM cp_databases
394
+ WHERE owner_type='brand' AND owner_id='${brand.id}'
395
+ AND db_tier='silo' AND status='active'
396
+ LIMIT 1`);
397
+ if (rows.length === 0) {
398
+ throw new Error(`no active silo DB for brand '${brand.slug}' (cp_databases owner=brand, tier=silo, status=active)`);
399
+ }
400
+ return rows[0];
401
+ }
402
+ //# sourceMappingURL=rollback-silo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback-silo.js","sourceRoot":"","sources":["../../../src/commands/db/rollback-silo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * CiCore CLI — Deploy commands (host-aware composition)
3
+ *
4
+ * `vu deploy core` and `vu deploy addon` are thin orchestration wrappers
5
+ * that compose the build/deploy steps already implemented in
6
+ * `commands/build/`. There is no separate deploy pipeline any more — the
7
+ * 689-line duplicate from the pre-host-aware era has been removed because
8
+ * every step it performed (image build/push, CDN upload, server pull/
9
+ * recreate, cache purge) now exists exactly once under `commands/build/`
10
+ * and gets called from both entry points.
11
+ *
12
+ * `vu deploy core --host <h>`
13
+ * ≡ vu build nuxt --host <h> --deploy --core <c>
14
+ * + vu build php --host <h> --deploy --core <c>
15
+ *
16
+ * `vu deploy addon <name> --host <h>`
17
+ * ≡ vu build addon <name> --host <h> --core <c>
18
+ * (build/addon already does the full pipeline: vite → CDN → server)
19
+ *
20
+ * Keeping these as separate commands aids discoverability (`vu deploy`
21
+ * reads naturally for full-stack pushes) without duplicating the
22
+ * implementation behind them.
23
+ */
24
+ import { Command } from 'commander';
25
+ export declare function registerDeployCommands(program: Command): void;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA8BnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6B7D"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * CiCore CLI — Deploy commands (host-aware composition)
3
+ *
4
+ * `vu deploy core` and `vu deploy addon` are thin orchestration wrappers
5
+ * that compose the build/deploy steps already implemented in
6
+ * `commands/build/`. There is no separate deploy pipeline any more — the
7
+ * 689-line duplicate from the pre-host-aware era has been removed because
8
+ * every step it performed (image build/push, CDN upload, server pull/
9
+ * recreate, cache purge) now exists exactly once under `commands/build/`
10
+ * and gets called from both entry points.
11
+ *
12
+ * `vu deploy core --host <h>`
13
+ * ≡ vu build nuxt --host <h> --deploy --core <c>
14
+ * + vu build php --host <h> --deploy --core <c>
15
+ *
16
+ * `vu deploy addon <name> --host <h>`
17
+ * ≡ vu build addon <name> --host <h> --core <c>
18
+ * (build/addon already does the full pipeline: vite → CDN → server)
19
+ *
20
+ * Keeping these as separate commands aids discoverability (`vu deploy`
21
+ * reads naturally for full-stack pushes) without duplicating the
22
+ * implementation behind them.
23
+ */
24
+ import { log } from '../../lib/logger.js';
25
+ import { buildNuxt, buildPHP, buildAddon, } from '../build/index.js';
26
+ export function registerDeployCommands(program) {
27
+ const deploy = program.command('deploy').description('Full-pipeline deployment commands');
28
+ deploy
29
+ .command('core')
30
+ .description('Build + push + upload + recreate Nuxt and PHP on the given host')
31
+ .option('-h, --host <host>', 'Host alias (vucore | cicore)')
32
+ .option('-c, --core <core>', 'Core name for cache clearing', 'core1')
33
+ .option('--skip-cdn', 'Skip CDN upload (CoreUI)')
34
+ .option('--skip-push', 'Skip Docker Hub push')
35
+ .option('--skip-server', 'Skip server pull/restart')
36
+ .option('--skip-build', 'Skip Docker build (reuse existing :latest)')
37
+ .option('--skip-safelist', 'Skip addon CSS safelist regeneration')
38
+ .option('--dry-run', 'Show steps without executing')
39
+ .action(async (options) => {
40
+ await deployCore(options);
41
+ });
42
+ deploy
43
+ .command('addon <name>')
44
+ .description('Build addon UI + upload to CDN + install backend on the host')
45
+ .option('-h, --host <host>', 'Host alias (vucore | cicore)')
46
+ .option('-c, --core <core>', 'Target core', 'core1')
47
+ .option('--skip-cdn', 'Skip CDN upload')
48
+ .option('--skip-server', 'Skip backend deploy to server')
49
+ .option('--dry-run', 'Show steps without executing')
50
+ .action(async (name, options) => {
51
+ await deployAddon(name, options);
52
+ });
53
+ }
54
+ /**
55
+ * Full-stack core deploy: Nuxt then PHP, each going through its own build
56
+ * pipeline with `--deploy` enabled. Nuxt goes first because the PHP recreate
57
+ * doesn't strictly depend on Nuxt — running them sequentially keeps logs
58
+ * readable and avoids spiking Mac CPU with two concurrent buildx jobs.
59
+ *
60
+ * Returns early on Nuxt failure: a failed Nuxt build usually indicates the
61
+ * code state isn't shippable, so deploying just PHP would push a half-
62
+ * working release. Skip flags propagate to the underlying builds.
63
+ */
64
+ async function deployCore(options) {
65
+ log.title('🚀 Deploy Core — Full Pipeline (Nuxt + PHP)');
66
+ const nuxtOpts = {
67
+ host: options.host,
68
+ core: options.core,
69
+ skipCdn: options.skipCdn,
70
+ skipPush: options.skipPush,
71
+ skipServer: options.skipServer,
72
+ skipBuild: options.skipBuild,
73
+ skipSafelist: options.skipSafelist,
74
+ deploy: true,
75
+ dryRun: options.dryRun,
76
+ };
77
+ await buildNuxt(nuxtOpts);
78
+ log.blank();
79
+ const phpOpts = {
80
+ host: options.host,
81
+ core: options.core,
82
+ skipPush: options.skipPush,
83
+ skipServer: options.skipServer,
84
+ deploy: true,
85
+ dryRun: options.dryRun,
86
+ };
87
+ await buildPHP(phpOpts);
88
+ log.blank();
89
+ log.success('✨ Core deploy complete (Nuxt + PHP)');
90
+ }
91
+ /**
92
+ * Addon deploy is the build pipeline as-is — `vu build addon` already does
93
+ * Vite build → CDN upload → backend stage → server install → cache purge.
94
+ * The wrapper exists so users can spell their intent as `vu deploy addon`.
95
+ */
96
+ async function deployAddon(name, options) {
97
+ log.title(`🚀 Deploy Addon: ${name}`);
98
+ const buildOpts = {
99
+ host: options.host,
100
+ core: options.core,
101
+ skipCdn: options.skipCdn,
102
+ skipServer: options.skipServer,
103
+ dryRun: options.dryRun,
104
+ };
105
+ await buildAddon(name, buildOpts);
106
+ }
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/deploy/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CiCore CLI - DevOps Commands
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function registerDevOpsCommands(program: Command): void;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/devops/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuC7D"}