codecrypto-cli 1.0.8 → 1.0.9

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 (256) hide show
  1. package/dist/commands/auth.d.ts.map +1 -1
  2. package/dist/commands/auth.js +64 -7
  3. package/dist/commands/auth.js.map +1 -1
  4. package/dist/commands/deploy-sc.d.ts.map +1 -1
  5. package/dist/commands/deploy-sc.js +162 -0
  6. package/dist/commands/deploy-sc.js.map +1 -1
  7. package/dist/commands/deploy.d.ts.map +1 -1
  8. package/dist/commands/deploy.js +352 -43
  9. package/dist/commands/deploy.js.map +1 -1
  10. package/dist/commands/doctor.d.ts +3 -0
  11. package/dist/commands/doctor.d.ts.map +1 -0
  12. package/dist/commands/doctor.js +518 -0
  13. package/dist/commands/doctor.js.map +1 -0
  14. package/dist/index.js +2 -0
  15. package/dist/index.js.map +1 -1
  16. package/docker-build/Dockerfile +4 -0
  17. package/docker-build/standalone/.next/BUILD_ID +1 -1
  18. package/docker-build/standalone/.next/app-path-routes-manifest.json +0 -7
  19. package/docker-build/standalone/.next/build-manifest.json +6 -7
  20. package/docker-build/standalone/.next/prerender-manifest.json +3 -75
  21. package/docker-build/standalone/.next/required-server-files.json +2 -2
  22. package/docker-build/standalone/.next/routes-manifest.json +0 -42
  23. package/docker-build/standalone/.next/server/app/_global-error/page/build-manifest.json +4 -5
  24. package/docker-build/standalone/.next/server/app/_global-error/page.js +10 -10
  25. package/docker-build/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  26. package/docker-build/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  27. package/docker-build/standalone/.next/server/app/_global-error.html +2 -2
  28. package/docker-build/standalone/.next/server/app/_global-error.rsc +8 -8
  29. package/docker-build/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  30. package/docker-build/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +8 -8
  31. package/docker-build/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +4 -4
  32. package/docker-build/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  33. package/docker-build/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  34. package/docker-build/standalone/.next/server/app/_not-found/page/build-manifest.json +4 -5
  35. package/docker-build/standalone/.next/server/app/_not-found/page/next-font-manifest.json +1 -1
  36. package/docker-build/standalone/.next/server/app/_not-found/page.js +13 -13
  37. package/docker-build/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  38. package/docker-build/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  39. package/docker-build/standalone/.next/server/app/_not-found.html +1 -1
  40. package/docker-build/standalone/.next/server/app/_not-found.rsc +10 -10
  41. package/docker-build/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
  42. package/docker-build/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  43. package/docker-build/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  44. package/docker-build/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  45. package/docker-build/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  46. package/docker-build/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  47. package/docker-build/standalone/.next/server/app/favicon.ico/route.js +5 -6
  48. package/docker-build/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  49. package/docker-build/standalone/.next/server/app/index.html +1 -1
  50. package/docker-build/standalone/.next/server/app/index.rsc +13 -22
  51. package/docker-build/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -7
  52. package/docker-build/standalone/.next/server/app/index.segments/_full.segment.rsc +13 -22
  53. package/docker-build/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  54. package/docker-build/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  55. package/docker-build/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  56. package/docker-build/standalone/.next/server/app/page/build-manifest.json +4 -5
  57. package/docker-build/standalone/.next/server/app/page/next-font-manifest.json +1 -1
  58. package/docker-build/standalone/.next/server/app/page.js +15 -15
  59. package/docker-build/standalone/.next/server/app/page.js.nft.json +1 -1
  60. package/docker-build/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  61. package/docker-build/standalone/.next/server/app-paths-manifest.json +0 -7
  62. package/docker-build/standalone/.next/server/chunks/66d90_example-navidad__next-internal_server_app_favicon_ico_route_actions_a30dceae.js +3 -0
  63. package/docker-build/standalone/.next/server/chunks/[externals]_next_dist_03fe02e0._.js +3 -0
  64. package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__4b49000d._.js +21 -0
  65. package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_example-navidad__next-internal_server_app_page_actions_a387aef9.js +3 -0
  66. package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_example-navidad_377109b0._.js +3 -0
  67. package/docker-build/standalone/.next/server/chunks/ssr/{2025_cc_CODECRYPTO_infra_server-cc_d03dcb7a._.js → 2025_cc_CODECRYPTO_infra_example-navidad_90799f30._.js} +3 -3
  68. package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_example-navidad_app_b9057478._.js +3 -0
  69. package/docker-build/standalone/.next/server/chunks/ssr/66d90_example-navidad__next-internal_server_app__global-error_page_actions_a079475f.js +3 -0
  70. package/docker-build/standalone/.next/server/chunks/ssr/66d90_example-navidad__next-internal_server_app__not-found_page_actions_ac88cec2.js +3 -0
  71. package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_5002976b._.js → 77a20_next_dist_51be1544._.js} +3 -3
  72. package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_8dba0557._.js +6 -0
  73. package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_client_components_a432b2d3._.js → 77a20_next_dist_client_components_41330064._.js} +2 -2
  74. package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_client_components_builtin_forbidden_b4e63d3a.js → 77a20_next_dist_client_components_builtin_forbidden_ff3a0457.js} +2 -2
  75. package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_client_components_builtin_global-error_e0d57e6e.js +3 -0
  76. package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_client_components_builtin_unauthorized_f08488ad.js → 77a20_next_dist_client_components_builtin_unauthorized_f1c47e13.js} +2 -2
  77. package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_d332f292._.js +3 -0
  78. package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_esm_build_templates_app-page_c7a8656a.js → 77a20_next_dist_esm_build_templates_app-page_cf6afba1.js} +3 -3
  79. package/docker-build/standalone/.next/server/chunks/ssr/{[root-of-the-server]__5ecc39a2._.js → [root-of-the-server]__02f3f427._.js} +2 -2
  80. package/docker-build/standalone/.next/server/chunks/ssr/{[root-of-the-server]__f2372d3f._.js → [root-of-the-server]__2f460610._.js} +2 -2
  81. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__4722e53c._.js +3 -0
  82. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__53b749fa._.js +3 -0
  83. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__61942f2d._.js +3 -0
  84. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__7707ad1b._.js +3 -0
  85. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__864cadbf._.js +10 -0
  86. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__9939e281._.js +3 -0
  87. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__b4b0aa8a._.js +3 -0
  88. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__d2b7072b._.js +3 -0
  89. package/docker-build/standalone/.next/server/middleware-build-manifest.js +4 -5
  90. package/docker-build/standalone/.next/server/next-font-manifest.js +1 -1
  91. package/docker-build/standalone/.next/server/next-font-manifest.json +2 -14
  92. package/docker-build/standalone/.next/server/pages/404.html +1 -1
  93. package/docker-build/standalone/.next/server/pages/500.html +2 -2
  94. package/docker-build/standalone/.next/server/server-reference-manifest.js +1 -1
  95. package/docker-build/standalone/.next/server/server-reference-manifest.json +1 -1
  96. package/docker-build/standalone/.next/static/chunks/57d1af92f5dc15fa.js +1 -0
  97. package/docker-build/standalone/.next/static/chunks/6ae71d5e8ea4d1eb.js +1 -0
  98. package/docker-build/standalone/.next/static/chunks/70977d70c9306213.js +1 -0
  99. package/docker-build/standalone/.next/static/chunks/777dac7104fe2a30.js +5 -0
  100. package/docker-build/standalone/.next/static/chunks/a6dad97d9634a72d.js.map +1 -1
  101. package/docker-build/standalone/.next/static/chunks/d6aec49b013224a2.css +3 -0
  102. package/docker-build/standalone/.next/static/chunks/turbopack-0ce517fb6224c1f0.js +4 -0
  103. package/docker-build/standalone/package.json +4 -13
  104. package/package.json +1 -1
  105. package/src/commands/auth.ts +71 -8
  106. package/src/commands/deploy-sc.ts +182 -0
  107. package/src/commands/deploy.ts +365 -47
  108. package/src/commands/doctor.ts +498 -0
  109. package/src/index.ts +2 -0
  110. package/token.json +69 -0
  111. package/docker-build/standalone/.next/server/app/api/deploy/route/app-paths-manifest.json +0 -3
  112. package/docker-build/standalone/.next/server/app/api/deploy/route/build-manifest.json +0 -11
  113. package/docker-build/standalone/.next/server/app/api/deploy/route/server-reference-manifest.json +0 -4
  114. package/docker-build/standalone/.next/server/app/api/deploy/route.js +0 -7
  115. package/docker-build/standalone/.next/server/app/api/deploy/route.js.map +0 -5
  116. package/docker-build/standalone/.next/server/app/api/deploy/route.js.nft.json +0 -1
  117. package/docker-build/standalone/.next/server/app/api/deploy/route_client-reference-manifest.js +0 -2
  118. package/docker-build/standalone/.next/server/app/api/deploy-image/route/app-paths-manifest.json +0 -3
  119. package/docker-build/standalone/.next/server/app/api/deploy-image/route/build-manifest.json +0 -11
  120. package/docker-build/standalone/.next/server/app/api/deploy-image/route/server-reference-manifest.json +0 -4
  121. package/docker-build/standalone/.next/server/app/api/deploy-image/route.js +0 -6
  122. package/docker-build/standalone/.next/server/app/api/deploy-image/route.js.map +0 -5
  123. package/docker-build/standalone/.next/server/app/api/deploy-image/route.js.nft.json +0 -1
  124. package/docker-build/standalone/.next/server/app/api/deploy-image/route_client-reference-manifest.js +0 -2
  125. package/docker-build/standalone/.next/server/app/api/docker-images/route/app-paths-manifest.json +0 -3
  126. package/docker-build/standalone/.next/server/app/api/docker-images/route/build-manifest.json +0 -11
  127. package/docker-build/standalone/.next/server/app/api/docker-images/route/server-reference-manifest.json +0 -4
  128. package/docker-build/standalone/.next/server/app/api/docker-images/route.js +0 -6
  129. package/docker-build/standalone/.next/server/app/api/docker-images/route.js.map +0 -5
  130. package/docker-build/standalone/.next/server/app/api/docker-images/route.js.nft.json +0 -1
  131. package/docker-build/standalone/.next/server/app/api/docker-images/route_client-reference-manifest.js +0 -2
  132. package/docker-build/standalone/.next/server/app/api/faucet/route/app-paths-manifest.json +0 -3
  133. package/docker-build/standalone/.next/server/app/api/faucet/route/build-manifest.json +0 -11
  134. package/docker-build/standalone/.next/server/app/api/faucet/route/server-reference-manifest.json +0 -4
  135. package/docker-build/standalone/.next/server/app/api/faucet/route.js +0 -9
  136. package/docker-build/standalone/.next/server/app/api/faucet/route.js.map +0 -5
  137. package/docker-build/standalone/.next/server/app/api/faucet/route.js.nft.json +0 -1
  138. package/docker-build/standalone/.next/server/app/api/faucet/route_client-reference-manifest.js +0 -2
  139. package/docker-build/standalone/.next/server/app/deploy/page/app-paths-manifest.json +0 -3
  140. package/docker-build/standalone/.next/server/app/deploy/page/build-manifest.json +0 -17
  141. package/docker-build/standalone/.next/server/app/deploy/page/next-font-manifest.json +0 -11
  142. package/docker-build/standalone/.next/server/app/deploy/page/react-loadable-manifest.json +0 -1
  143. package/docker-build/standalone/.next/server/app/deploy/page/server-reference-manifest.json +0 -4
  144. package/docker-build/standalone/.next/server/app/deploy/page.js +0 -16
  145. package/docker-build/standalone/.next/server/app/deploy/page.js.map +0 -5
  146. package/docker-build/standalone/.next/server/app/deploy/page.js.nft.json +0 -1
  147. package/docker-build/standalone/.next/server/app/deploy/page_client-reference-manifest.js +0 -2
  148. package/docker-build/standalone/.next/server/app/deploy.html +0 -1
  149. package/docker-build/standalone/.next/server/app/deploy.meta +0 -15
  150. package/docker-build/standalone/.next/server/app/deploy.rsc +0 -20
  151. package/docker-build/standalone/.next/server/app/deploy.segments/_full.segment.rsc +0 -20
  152. package/docker-build/standalone/.next/server/app/deploy.segments/_head.segment.rsc +0 -6
  153. package/docker-build/standalone/.next/server/app/deploy.segments/_index.segment.rsc +0 -5
  154. package/docker-build/standalone/.next/server/app/deploy.segments/_tree.segment.rsc +0 -4
  155. package/docker-build/standalone/.next/server/app/deploy.segments/deploy/__PAGE__.segment.rsc +0 -9
  156. package/docker-build/standalone/.next/server/app/deploy.segments/deploy.segment.rsc +0 -4
  157. package/docker-build/standalone/.next/server/app/faucet/page/app-paths-manifest.json +0 -3
  158. package/docker-build/standalone/.next/server/app/faucet/page/build-manifest.json +0 -17
  159. package/docker-build/standalone/.next/server/app/faucet/page/next-font-manifest.json +0 -11
  160. package/docker-build/standalone/.next/server/app/faucet/page/react-loadable-manifest.json +0 -1
  161. package/docker-build/standalone/.next/server/app/faucet/page/server-reference-manifest.json +0 -4
  162. package/docker-build/standalone/.next/server/app/faucet/page.js +0 -16
  163. package/docker-build/standalone/.next/server/app/faucet/page.js.map +0 -5
  164. package/docker-build/standalone/.next/server/app/faucet/page.js.nft.json +0 -1
  165. package/docker-build/standalone/.next/server/app/faucet/page_client-reference-manifest.js +0 -2
  166. package/docker-build/standalone/.next/server/app/faucet.html +0 -1
  167. package/docker-build/standalone/.next/server/app/faucet.meta +0 -15
  168. package/docker-build/standalone/.next/server/app/faucet.rsc +0 -20
  169. package/docker-build/standalone/.next/server/app/faucet.segments/_full.segment.rsc +0 -20
  170. package/docker-build/standalone/.next/server/app/faucet.segments/_head.segment.rsc +0 -6
  171. package/docker-build/standalone/.next/server/app/faucet.segments/_index.segment.rsc +0 -5
  172. package/docker-build/standalone/.next/server/app/faucet.segments/_tree.segment.rsc +0 -4
  173. package/docker-build/standalone/.next/server/app/faucet.segments/faucet/__PAGE__.segment.rsc +0 -9
  174. package/docker-build/standalone/.next/server/app/faucet.segments/faucet.segment.rsc +0 -4
  175. package/docker-build/standalone/.next/server/app/images/page/app-paths-manifest.json +0 -3
  176. package/docker-build/standalone/.next/server/app/images/page/build-manifest.json +0 -17
  177. package/docker-build/standalone/.next/server/app/images/page/next-font-manifest.json +0 -11
  178. package/docker-build/standalone/.next/server/app/images/page/react-loadable-manifest.json +0 -1
  179. package/docker-build/standalone/.next/server/app/images/page/server-reference-manifest.json +0 -4
  180. package/docker-build/standalone/.next/server/app/images/page.js +0 -16
  181. package/docker-build/standalone/.next/server/app/images/page.js.map +0 -5
  182. package/docker-build/standalone/.next/server/app/images/page.js.nft.json +0 -1
  183. package/docker-build/standalone/.next/server/app/images/page_client-reference-manifest.js +0 -2
  184. package/docker-build/standalone/.next/server/app/images.html +0 -1
  185. package/docker-build/standalone/.next/server/app/images.meta +0 -15
  186. package/docker-build/standalone/.next/server/app/images.rsc +0 -20
  187. package/docker-build/standalone/.next/server/app/images.segments/_full.segment.rsc +0 -20
  188. package/docker-build/standalone/.next/server/app/images.segments/_head.segment.rsc +0 -6
  189. package/docker-build/standalone/.next/server/app/images.segments/_index.segment.rsc +0 -5
  190. package/docker-build/standalone/.next/server/app/images.segments/_tree.segment.rsc +0 -4
  191. package/docker-build/standalone/.next/server/app/images.segments/images/__PAGE__.segment.rsc +0 -9
  192. package/docker-build/standalone/.next/server/app/images.segments/images.segment.rsc +0 -4
  193. package/docker-build/standalone/.next/server/chunks/10072_infra_server-cc__next-internal_server_app_api_deploy_route_actions_6cdc6432.js +0 -3
  194. package/docker-build/standalone/.next/server/chunks/10072_infra_server-cc__next-internal_server_app_api_faucet_route_actions_f54ec975.js +0 -3
  195. package/docker-build/standalone/.next/server/chunks/10072_infra_server-cc__next-internal_server_app_favicon_ico_route_actions_d73715d1.js +0 -3
  196. package/docker-build/standalone/.next/server/chunks/66d90_server-cc__next-internal_server_app_api_deploy-image_route_actions_b340a7f4.js +0 -3
  197. package/docker-build/standalone/.next/server/chunks/66d90_server-cc__next-internal_server_app_api_docker-images_route_actions_4adcb030.js +0 -3
  198. package/docker-build/standalone/.next/server/chunks/6f6aa_4d460f49._.js +0 -30
  199. package/docker-build/standalone/.next/server/chunks/6f6aa_@noble_curves_esm_secp256k1_c7f9b58b.js +0 -3
  200. package/docker-build/standalone/.next/server/chunks/6f6aa_next_dist_esm_build_templates_app-route_1a9ee783.js +0 -6
  201. package/docker-build/standalone/.next/server/chunks/6f6aa_next_dist_esm_build_templates_app-route_8d132e6a.js +0 -3
  202. package/docker-build/standalone/.next/server/chunks/6f6aa_viem__esm_utils_ccip_bb7bf310.js +0 -3
  203. package/docker-build/standalone/.next/server/chunks/[externals]_next_dist_b01ab6e1._.js +0 -3
  204. package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__0928cca7._.js +0 -3
  205. package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__0c6b3bd9._.js +0 -3
  206. package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__1846bb23._.js +0 -3
  207. package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__8f8a2ff9._.js +0 -3
  208. package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__90ea784b._.js +0 -21
  209. package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__f6379956._.js +0 -39
  210. package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app__global-error_page_actions_bdbde336.js +0 -3
  211. package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app__not-found_page_actions_41269af3.js +0 -3
  212. package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app_deploy_page_actions_3988cfb8.js +0 -3
  213. package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app_faucet_page_actions_e5e8dd8a.js +0 -3
  214. package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app_images_page_actions_bcdfd86b.js +0 -3
  215. package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_293382c4._.js +0 -4
  216. package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_55723634._.js +0 -4
  217. package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_821445df._.js +0 -3
  218. package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_8545ebc7._.js +0 -4
  219. package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_acad38a1._.js +0 -6
  220. package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_app_b373a582._.js +0 -3
  221. package/docker-build/standalone/.next/server/chunks/ssr/6f6aa_7c51ed4c._.js +0 -3
  222. package/docker-build/standalone/.next/server/chunks/ssr/6f6aa_next_dist_05cd73d5._.js +0 -3
  223. package/docker-build/standalone/.next/server/chunks/ssr/6f6aa_next_dist_3e60adb5._.js +0 -6
  224. package/docker-build/standalone/.next/server/chunks/ssr/6f6aa_next_dist_client_components_builtin_global-error_edcabd66.js +0 -3
  225. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e0d983d._.js +0 -3
  226. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f25bf3b._.js +0 -3
  227. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__10dae68a._.js +0 -3
  228. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ebd727b._.js +0 -3
  229. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__30996048._.js +0 -3
  230. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__587c95dd._.js +0 -3
  231. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__6382fff8._.js +0 -3
  232. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__8ed1042a._.js +0 -3
  233. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__91644c56._.js +0 -3
  234. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__a2833bcd._.js +0 -10
  235. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__acf31a1c._.js +0 -3
  236. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__ae009f46._.js +0 -3
  237. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__daca67ae._.js +0 -3
  238. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__f2ed834a._.js +0 -3
  239. package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__ff0dddf3._.js +0 -3
  240. package/docker-build/standalone/.next/server/chunks/ssr/e6d68_cc_CODECRYPTO_infra_server-cc__next-internal_server_app_page_actions_12ae3ff1.js +0 -3
  241. package/docker-build/standalone/.next/static/chunks/0c03a563297c48f4.js +0 -1
  242. package/docker-build/standalone/.next/static/chunks/3142ddfdb448fd24.js +0 -1
  243. package/docker-build/standalone/.next/static/chunks/35b2ae0057b43b20.js +0 -1
  244. package/docker-build/standalone/.next/static/chunks/5a1aef391fd12242.js +0 -1
  245. package/docker-build/standalone/.next/static/chunks/66401b6fc62891de.js +0 -4
  246. package/docker-build/standalone/.next/static/chunks/782a67ca986fb1bd.js +0 -1
  247. package/docker-build/standalone/.next/static/chunks/8b27abf6cb0fca62.js +0 -2
  248. package/docker-build/standalone/.next/static/chunks/8dba80aa68873762.css +0 -3
  249. package/docker-build/standalone/.next/static/chunks/902797f337bf356c.js +0 -1
  250. package/docker-build/standalone/.next/static/chunks/9706b17cfd50df01.js +0 -1
  251. package/docker-build/standalone/.next/static/chunks/df3b8eb181fde7c2.js +0 -1
  252. package/docker-build/standalone/.next/static/chunks/turbopack-237950634fd3a365.js +0 -4
  253. package/docker-build/standalone/public/deploy-test.html +0 -276
  254. /package/docker-build/standalone/.next/static/{ZrQJjBH5oznRmy8xN4NKX → _NbfI2TKfapiyxsQgIG3h}/_buildManifest.js +0 -0
  255. /package/docker-build/standalone/.next/static/{ZrQJjBH5oznRmy8xN4NKX → _NbfI2TKfapiyxsQgIG3h}/_clientMiddlewareManifest.json +0 -0
  256. /package/docker-build/standalone/.next/static/{ZrQJjBH5oznRmy8xN4NKX → _NbfI2TKfapiyxsQgIG3h}/_ssgManifest.js +0 -0
@@ -17,6 +17,8 @@ export const deployCommand = new Command('deploy')
17
17
  .option('--env-file <path>', 'Path to .env file with environment variables')
18
18
  .option('--port <port>', 'Application port', '3000')
19
19
  .option('--domain-base <domain>', 'Domain base for deployment', 'proyectos.codecrypto.academy')
20
+ .option('--image-version <version>', 'Image version/tag to deploy (overrides package.json version)')
21
+ .option('--skip-git-check', 'Skip Git repository status check', false)
20
22
  .action(async (projectPath: string, destFolder: string, options) => {
21
23
  console.log(chalk.blue('\n🐳 CodeCrypto Docker Deployment\n'));
22
24
 
@@ -35,9 +37,81 @@ export const deployCommand = new Command('deploy')
35
37
  process.exit(1);
36
38
  }
37
39
 
38
- // Leer versión del package.json
40
+ // Validar que no hay archivos pendientes de commit (a menos que se omita)
41
+ if (!options.skipGitCheck) {
42
+ const gitCheckSpinner = ora('Checking Git status...').start();
43
+ try {
44
+ // Verificar si es un repositorio git usando git rev-parse
45
+ // Esto es más robusto que solo verificar .git ya que funciona con submodules y worktrees
46
+ let isGitRepo = false;
47
+ try {
48
+ execSync('git rev-parse --git-dir', {
49
+ cwd: resolvedProjectPath,
50
+ encoding: 'utf-8',
51
+ stdio: 'pipe',
52
+ });
53
+ isGitRepo = true;
54
+ } catch {
55
+ // No es un repositorio git o git no está disponible
56
+ isGitRepo = false;
57
+ }
58
+
59
+ if (isGitRepo) {
60
+ // Verificar si hay cambios sin commitear
61
+ try {
62
+ const gitStatus = execSync('git status --porcelain', {
63
+ cwd: resolvedProjectPath,
64
+ encoding: 'utf-8',
65
+ stdio: 'pipe',
66
+ }).trim();
67
+
68
+ if (gitStatus) {
69
+ gitCheckSpinner.fail('Uncommitted changes detected');
70
+ console.error(chalk.red('\n❌ Error: Hay archivos pendientes de commit en el repositorio'));
71
+ console.error(chalk.yellow('\n📋 Archivos modificados/sin commitear:'));
72
+ console.log(chalk.gray('─'.repeat(60)));
73
+
74
+ // Mostrar los archivos pendientes
75
+ const files = gitStatus.split('\n').filter(line => line.trim());
76
+ files.forEach(file => {
77
+ const status = file.substring(0, 2);
78
+ const fileName = file.substring(3);
79
+ let statusColor = chalk.yellow;
80
+ if (status.includes('A')) statusColor = chalk.green;
81
+ else if (status.includes('D')) statusColor = chalk.red;
82
+ else if (status.includes('M')) statusColor = chalk.yellow;
83
+ console.log(chalk.gray(` ${statusColor(status)} ${chalk.white(fileName)}`));
84
+ });
85
+
86
+ console.log(chalk.gray('─'.repeat(60)));
87
+ console.error(chalk.yellow('\n💡 Por favor, haz commit de tus cambios antes de desplegar:'));
88
+ console.error(chalk.cyan(' git add .'));
89
+ console.error(chalk.cyan(' git commit -m "your message"'));
90
+ console.error(chalk.yellow('\n O usa --skip-git-check para omitir esta validación (no recomendado)'));
91
+ process.exit(1);
92
+ } else {
93
+ gitCheckSpinner.succeed('Git repository is clean');
94
+ }
95
+ } catch (error: any) {
96
+ // Si git status falla, puede ser que haya algún problema
97
+ gitCheckSpinner.warn('Could not check Git status, continuing...');
98
+ if (error.message) {
99
+ console.log(chalk.yellow(` Warning: ${error.message}`));
100
+ }
101
+ }
102
+ } else {
103
+ gitCheckSpinner.succeed('Not a Git repository (skipping check)');
104
+ }
105
+ } catch (error: any) {
106
+ gitCheckSpinner.warn('Git check failed, continuing...');
107
+ }
108
+ } else {
109
+ console.log(chalk.yellow('⚠️ Git status check skipped (--skip-git-check)'));
110
+ }
111
+
112
+ // Leer versión del package.json o usar la versión especificada
39
113
  const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
40
- const version = packageJson.version || 'latest';
114
+ const version = options.imageVersion || packageJson.version || 'latest';
41
115
  const projectName = path.basename(resolvedProjectPath);
42
116
  const imageBase = `jviejo/${projectName}`;
43
117
  const imageName = `${imageBase}:${version}`;
@@ -155,6 +229,7 @@ export const deployCommand = new Command('deploy')
155
229
  }
156
230
 
157
231
  // Paso 3: Crear Dockerfile con variables NEXT_PUBLIC_*
232
+ const dockerfileSpinner = ora('Creating Dockerfile...').start();
158
233
  const dockerfilePath = path.join(resolvedDestFolder, 'Dockerfile');
159
234
 
160
235
  // Construir ARG y ENV para NEXT_PUBLIC_*
@@ -190,21 +265,71 @@ EXPOSE 3000
190
265
  CMD ["node", "server.js"]
191
266
  `;
192
267
  fs.writeFileSync(dockerfilePath, dockerfileContent);
268
+
269
+ dockerfileSpinner.succeed('Dockerfile created');
270
+
271
+ // Mostrar contenido del Dockerfile si hay variables NEXT_PUBLIC_*
272
+ if (nextPublicEnvVars.length > 0) {
273
+ console.log(chalk.gray('\n📄 Dockerfile content:'));
274
+ console.log(chalk.gray('─'.repeat(60)));
275
+ console.log(chalk.white(dockerfileContent));
276
+ console.log(chalk.gray('─'.repeat(60)));
277
+ console.log(chalk.gray(`\n NEXT_PUBLIC_* variables: ${chalk.cyan(nextPublicEnvVars.length)}`));
278
+ nextPublicEnvVars.forEach(env => {
279
+ const [key] = env.split('=');
280
+ console.log(chalk.gray(` - ${chalk.cyan(key)}`));
281
+ });
282
+ } else {
283
+ console.log(chalk.gray('\n📄 Dockerfile created (no NEXT_PUBLIC_* variables found)'));
284
+ }
193
285
 
194
286
  // Paso 4: Verificar/crear builder multi-plataforma
195
287
  const builderSpinner = ora('Setting up multi-platform builder...').start();
196
288
  try {
197
- const builders = execSync('docker buildx ls', { encoding: 'utf-8' });
289
+ // Listar builders disponibles, ignorando errores de builders con problemas
290
+ let buildersOutput = '';
291
+ try {
292
+ // Redirigir stderr a /dev/null para ignorar errores de builders problemáticos
293
+ buildersOutput = execSync('docker buildx ls 2>/dev/null', {
294
+ encoding: 'utf-8',
295
+ stdio: 'pipe',
296
+ shell: '/bin/sh',
297
+ });
298
+ } catch (error) {
299
+ // Si hay errores al listar builders (por ejemplo, builder "cc" con problemas SSH),
300
+ // intentar continuar de todas formas
301
+ console.log(chalk.yellow('⚠️ Warning: Some builders have connection issues, continuing...'));
302
+ }
303
+
198
304
  const builderName = 'multiarch-builder';
199
- if (!builders.includes(builderName)) {
200
- execSync(`docker buildx create --name ${builderName} --use --bootstrap`, { stdio: 'pipe' });
305
+ if (!buildersOutput.includes(builderName)) {
306
+ builderSpinner.text = 'Creating multi-platform builder...';
307
+ execSync(`docker buildx create --name ${builderName} --use --bootstrap`, {
308
+ stdio: 'pipe',
309
+ // No heredar stderr para evitar errores de otros builders
310
+ });
201
311
  } else {
202
- execSync(`docker buildx use ${builderName}`, { stdio: 'pipe' });
203
- }
312
+ builderSpinner.text = 'Using existing multi-platform builder...';
313
+ try {
314
+ execSync(`docker buildx use ${builderName}`, { stdio: 'pipe' });
315
+ } catch (error) {
316
+ // Si falla, intentar crearlo de nuevo
317
+ builderSpinner.text = 'Recreating multi-platform builder...';
318
+ try {
319
+ execSync(`docker buildx rm ${builderName}`, { stdio: 'pipe' });
320
+ } catch {
321
+ // Ignorar si no existe
322
+ }
323
+ execSync(`docker buildx create --name ${builderName} --use --bootstrap`, { stdio: 'pipe' });
324
+ }
325
+ }
204
326
  builderSpinner.succeed('Builder ready');
205
- } catch (error) {
327
+ } catch (error: any) {
206
328
  builderSpinner.fail('Failed to setup builder');
207
329
  console.error(chalk.red('Error setting up Docker buildx builder'));
330
+ console.error(chalk.yellow('💡 Tip: If you have problematic builders configured, you can remove them with:'));
331
+ console.error(chalk.cyan(' docker buildx rm <builder-name>'));
332
+ console.error(chalk.yellow(' Or inspect them with: docker buildx inspect <builder-name>'));
208
333
  process.exit(1);
209
334
  }
210
335
 
@@ -243,6 +368,14 @@ CMD ["node", "server.js"]
243
368
  --progress=plain \
244
369
  .`;
245
370
 
371
+ console.log(chalk.gray('\n🔨 Build command:'));
372
+ console.log(chalk.gray('─'.repeat(60)));
373
+ console.log(chalk.cyan(buildCommand));
374
+ console.log(chalk.gray('─'.repeat(60)));
375
+ console.log(chalk.gray(`\n Working directory: ${chalk.cyan(resolvedDestFolder)}`));
376
+ console.log(chalk.gray(` Platforms: ${chalk.cyan('linux/amd64, linux/arm64')}`));
377
+ console.log(chalk.gray(` Push to registry: ${shouldPush ? chalk.green('Yes') : chalk.yellow('No')}\n`));
378
+
246
379
  execSync(buildCommand, {
247
380
  cwd: resolvedDestFolder,
248
381
  stdio: 'inherit'
@@ -250,8 +383,9 @@ CMD ["node", "server.js"]
250
383
 
251
384
  buildDockerSpinner.succeed('Docker image built successfully');
252
385
 
253
- console.log(chalk.green('\n✅ Deployment completed successfully!'));
254
- console.log(chalk.gray('Image details:'));
386
+ console.log(chalk.green('\n✅ Image build and push completed successfully!'));
387
+ console.log(chalk.gray('📦 Image details:'));
388
+ console.log(chalk.gray('─'.repeat(60)));
255
389
  console.log(chalk.white(` Platforms: ${chalk.cyan('linux/amd64, linux/arm64')}`));
256
390
  console.log(chalk.white(` Version: ${chalk.cyan(version)}`));
257
391
  console.log(chalk.white(` Tags:`));
@@ -260,6 +394,11 @@ CMD ["node", "server.js"]
260
394
  if (shouldPush) {
261
395
  console.log(chalk.white(` Registry: ${chalk.cyan('Docker Hub')}`));
262
396
  console.log(chalk.white(` URL: ${chalk.cyan(`https://hub.docker.com/r/${imageBase}`)}`));
397
+ console.log(chalk.gray('─'.repeat(60)));
398
+ console.log(chalk.green(`\n✅ Image pushed to Docker Hub successfully!`));
399
+ } else {
400
+ console.log(chalk.gray('─'.repeat(60)));
401
+ console.log(chalk.yellow(`\n⚠️ Image built locally (not pushed to registry)`));
263
402
  }
264
403
  } catch (error) {
265
404
  buildDockerSpinner.fail('Docker build failed');
@@ -272,8 +411,13 @@ CMD ["node", "server.js"]
272
411
 
273
412
  // Paso 6: Desplegar en servidor remoto si se solicita
274
413
  if (options.deploy) {
414
+ // Para despliegue, usar la versión especificada o la del package.json
415
+ const deployImageName = options.imageVersion
416
+ ? `${imageBase}:${options.imageVersion}`
417
+ : (shouldPush ? imageName : imageLatest);
418
+
275
419
  await deployToRemoteServer({
276
- imageName: shouldPush ? imageName : imageLatest,
420
+ imageName: deployImageName,
277
421
  serviceName: options.serviceName || projectName,
278
422
  domainBase: options.domainBase,
279
423
  port: options.port,
@@ -288,6 +432,115 @@ CMD ["node", "server.js"]
288
432
  }
289
433
  });
290
434
 
435
+ // Función para leer certificados Docker desde token.json
436
+ function loadDockerCertificatesFromToken(): { caPem: string; certPem: string; keyPem: string; certPath: string } {
437
+ const tokenFilePath = path.join(os.homedir(), '.codecrypto', 'token.json');
438
+
439
+ if (!fs.existsSync(tokenFilePath)) {
440
+ throw new Error(`Token file not found at ${tokenFilePath}. Please run 'codecrypto auth' first.`);
441
+ }
442
+
443
+ let tokenData: any;
444
+ try {
445
+ tokenData = JSON.parse(fs.readFileSync(tokenFilePath, 'utf-8'));
446
+ } catch (error: any) {
447
+ throw new Error(`Failed to read token file: ${error.message}`);
448
+ }
449
+
450
+ if (!tokenData.adminGlobals || !Array.isArray(tokenData.adminGlobals)) {
451
+ throw new Error('adminGlobals not found in token.json. Please run "codecrypto auth --force" to refresh your token.');
452
+ }
453
+
454
+ // Buscar los certificados Docker en el array adminGlobals
455
+ // Las keys que buscamos son:
456
+ // - docker-client/ca-pem
457
+ // - docker-client/cert.pem
458
+ // - docker-client/key.pem
459
+ const certKeys = {
460
+ ca: 'docker-client/ca-pem',
461
+ cert: 'docker-client/cert.pem',
462
+ key: 'docker-client/key.pem'
463
+ };
464
+
465
+ const certificates: { ca?: string; cert?: string; key?: string } = {};
466
+
467
+ // Lista de keys encontradas para debugging
468
+ const foundKeys: string[] = [];
469
+
470
+ // Iterar sobre adminGlobals para encontrar los certificados
471
+ for (const global of tokenData.adminGlobals) {
472
+ if (global && global.key) {
473
+ foundKeys.push(global.key);
474
+ // Buscar cada certificado por su key exacta
475
+ if (global.key === certKeys.ca) {
476
+ certificates.ca = global.value;
477
+ } else if (global.key === certKeys.cert) {
478
+ certificates.cert = global.value;
479
+ } else if (global.key === certKeys.key) {
480
+ certificates.key = global.value;
481
+ }
482
+ }
483
+ }
484
+
485
+ // Verificar que todos los certificados estén presentes
486
+ if (!certificates.ca) {
487
+ const availableKeys = foundKeys.filter(k => k.includes('docker-client')).join(', ') || 'none';
488
+ throw new Error(
489
+ `Certificate not found: ${certKeys.ca} in adminGlobals.\n` +
490
+ ` Available docker-client keys: ${availableKeys || 'none'}\n` +
491
+ ` Total adminGlobals entries: ${tokenData.adminGlobals.length}\n` +
492
+ ` Please run "codecrypto auth --force" to refresh your token.`
493
+ );
494
+ }
495
+ if (!certificates.cert) {
496
+ const availableKeys = foundKeys.filter(k => k.includes('docker-client')).join(', ') || 'none';
497
+ throw new Error(
498
+ `Certificate not found: ${certKeys.cert} in adminGlobals.\n` +
499
+ ` Available docker-client keys: ${availableKeys || 'none'}\n` +
500
+ ` Total adminGlobals entries: ${tokenData.adminGlobals.length}\n` +
501
+ ` Please run "codecrypto auth --force" to refresh your token.`
502
+ );
503
+ }
504
+ if (!certificates.key) {
505
+ const availableKeys = foundKeys.filter(k => k.includes('docker-client')).join(', ') || 'none';
506
+ throw new Error(
507
+ `Certificate not found: ${certKeys.key} in adminGlobals.\n` +
508
+ ` Available docker-client keys: ${availableKeys || 'none'}\n` +
509
+ ` Total adminGlobals entries: ${tokenData.adminGlobals.length}\n` +
510
+ ` Please run "codecrypto auth --force" to refresh your token.`
511
+ );
512
+ }
513
+
514
+ // Crear directorio para certificados si no existe
515
+ const dockerCertPath = path.join(os.homedir(), '.codecrypto', 'docker-client');
516
+ if (!fs.existsSync(dockerCertPath)) {
517
+ fs.mkdirSync(dockerCertPath, { recursive: true });
518
+ }
519
+
520
+ // Escribir certificados a archivos
521
+ const caPemPath = path.join(dockerCertPath, 'ca.pem');
522
+ const certPemPath = path.join(dockerCertPath, 'cert.pem');
523
+ const keyPemPath = path.join(dockerCertPath, 'key.pem');
524
+
525
+ fs.writeFileSync(caPemPath, certificates.ca, 'utf-8');
526
+ fs.writeFileSync(certPemPath, certificates.cert, 'utf-8');
527
+ fs.writeFileSync(keyPemPath, certificates.key, 'utf-8');
528
+
529
+ // Establecer permisos correctos para la clave privada (solo lectura para el propietario)
530
+ try {
531
+ fs.chmodSync(keyPemPath, 0o600);
532
+ } catch (error) {
533
+ // Ignorar errores de chmod en Windows
534
+ }
535
+
536
+ return {
537
+ caPem: certificates.ca,
538
+ certPem: certificates.cert,
539
+ keyPem: certificates.key,
540
+ certPath: dockerCertPath
541
+ };
542
+ }
543
+
291
544
  // Función para desplegar en servidor remoto
292
545
  async function deployToRemoteServer(config: {
293
546
  imageName: string;
@@ -300,13 +553,19 @@ async function deployToRemoteServer(config: {
300
553
  const deploySpinner = ora('Configuring remote Docker connection...').start();
301
554
 
302
555
  try {
303
- // Configurar variables de entorno para Docker remoto
304
- const dockerCertPath = path.join(os.homedir(), '.codecrypto', 'docker-client');
305
-
306
- if (!fs.existsSync(dockerCertPath)) {
307
- deploySpinner.fail('Docker certificates not found');
308
- console.error(chalk.red(`❌ Error: Docker certificates not found at ${dockerCertPath}`));
309
- console.error(chalk.yellow(' Make sure you have the certificates in ~/.codecrypto/docker-client'));
556
+ // Cargar certificados desde token.json
557
+ let dockerCertPath: string;
558
+ try {
559
+ const certs = loadDockerCertificatesFromToken();
560
+ dockerCertPath = certs.certPath;
561
+ deploySpinner.succeed('Docker certificates loaded from token.json');
562
+ } catch (error: any) {
563
+ deploySpinner.fail('Failed to load Docker certificates');
564
+ console.error(chalk.red(`❌ Error: ${error.message}`));
565
+ console.error(chalk.yellow('\n💡 To fix this issue:'));
566
+ console.error(chalk.yellow(' 1. Run: codecrypto auth --force'));
567
+ console.error(chalk.yellow(' 2. This will refresh your token with the latest adminGlobals'));
568
+ console.error(chalk.yellow(' 3. Then try the deploy command again\n'));
310
569
  process.exit(1);
311
570
  }
312
571
 
@@ -321,44 +580,79 @@ async function deployToRemoteServer(config: {
321
580
  }
322
581
  }
323
582
 
324
- // Configurar variables de entorno para Docker
325
- const dockerEnv: Record<string, string> = {
326
- ...process.env,
327
- DOCKER_HOST: 'https://server.codecrypto.academy:2376',
328
- DOCKER_TLS_VERIFY: '1',
329
- DOCKER_CERT_PATH: dockerCertPath,
330
- };
331
-
332
- deploySpinner.succeed('Docker connection configured');
583
+ // Construir prefijo de comando Docker con parámetros TLS
584
+ const dockerHost = 'tcp://server.codecrypto.academy:2376';
585
+ const dockerTlsPrefix = `docker -H ${dockerHost} \\
586
+ --tlsverify \\
587
+ --tlscacert="${path.join(dockerCertPath, 'ca.pem')}" \\
588
+ --tlscert="${path.join(dockerCertPath, 'cert.pem')}" \\
589
+ --tlskey="${path.join(dockerCertPath, 'key.pem')}"`;
590
+
591
+ console.log(chalk.gray('\n🔌 Remote Docker configuration:'));
592
+ console.log(chalk.gray('─'.repeat(60)));
593
+ console.log(chalk.white(` Docker Host: ${chalk.cyan(dockerHost)}`));
594
+ console.log(chalk.white(` TLS Verify: ${chalk.cyan('enabled')}`));
595
+ console.log(chalk.white(` Certificates Source: ${chalk.cyan('token.json (adminGlobals)')}`));
596
+ console.log(chalk.white(` Certificates Path: ${chalk.cyan(dockerCertPath)}`));
597
+ console.log(chalk.gray(' Certificates loaded:'));
598
+ requiredCerts.forEach(cert => {
599
+ const certPath = path.join(dockerCertPath, cert);
600
+ const exists = fs.existsSync(certPath);
601
+ console.log(chalk.gray(` ${exists ? '✓' : '✗'} ${chalk.cyan(cert)}`));
602
+ });
603
+ console.log(chalk.gray('─'.repeat(60)));
604
+ console.log(chalk.yellow('\n💡 All docker commands will use TLS parameters directly\n'));
333
605
 
334
606
  // Construir nombre completo del dominio
335
607
  const fullDomain = `${config.serviceName}.${config.domainBase}`;
336
608
  const serviceName = config.serviceName.toLowerCase().replace(/[^a-z0-9-]/g, '-');
337
609
 
338
610
  // Detener y eliminar contenedor existente si existe
339
- const stopSpinner = ora('Checking for existing container...').start();
611
+ const stopSpinner = ora('Checking and removing existing container...').start();
340
612
  try {
341
- execSync(`docker ps -a --filter name=^${fullDomain}$ --format "{{.Names}}"`, {
342
- env: dockerEnv,
613
+ // Verificar si el contenedor existe
614
+ const checkCmd = `${dockerTlsPrefix} ps -a --filter name=^${fullDomain}$ --format "{{.Names}}"`;
615
+ const existingContainer = execSync(checkCmd, {
343
616
  stdio: 'pipe',
344
617
  encoding: 'utf-8',
345
- });
618
+ shell: '/bin/sh',
619
+ }).trim();
346
620
 
347
- // Si existe, detenerlo y eliminarlo
348
- try {
349
- execSync(`docker stop ${fullDomain}`, { env: dockerEnv, stdio: 'pipe' });
350
- } catch {
351
- // Container might not be running
621
+ if (existingContainer === fullDomain) {
622
+ // Contenedor existe, detenerlo primero (si está corriendo)
623
+ try {
624
+ const stopCmd = `${dockerTlsPrefix} stop ${fullDomain}`;
625
+ execSync(stopCmd, { stdio: 'pipe', shell: '/bin/sh' });
626
+ console.log(chalk.gray(` ✓ Container ${fullDomain} stopped`));
627
+ } catch (error: any) {
628
+ // Container might not be running, that's okay
629
+ console.log(chalk.gray(` ℹ Container ${fullDomain} was not running`));
630
+ }
631
+
632
+ // Eliminar el contenedor
633
+ try {
634
+ const rmCmd = `${dockerTlsPrefix} rm -f ${fullDomain}`;
635
+ execSync(rmCmd, { stdio: 'pipe', shell: '/bin/sh' });
636
+ stopSpinner.succeed(`Existing container ${fullDomain} removed`);
637
+ } catch (error: any) {
638
+ stopSpinner.fail(`Failed to remove container ${fullDomain}`);
639
+ console.error(chalk.red(` Error: ${error.message}`));
640
+ process.exit(1);
641
+ }
642
+ } else {
643
+ stopSpinner.succeed('No existing container found');
352
644
  }
353
-
645
+ } catch (error: any) {
646
+ // Si el comando falla, puede ser que el contenedor no exista
647
+ // Intentar eliminarlo de todas formas con -f para forzar
354
648
  try {
355
- execSync(`docker rm ${fullDomain}`, { env: dockerEnv, stdio: 'pipe' });
356
- stopSpinner.succeed('Existing container removed');
649
+ const forceRmCmd = `${dockerTlsPrefix} rm -f ${fullDomain}`;
650
+ execSync(forceRmCmd, { stdio: 'pipe', shell: '/bin/sh' });
651
+ stopSpinner.succeed('Existing container removed (forced)');
357
652
  } catch {
358
- stopSpinner.warn('No existing container found');
653
+ // Si falla, asumir que no existe y continuar
654
+ stopSpinner.succeed('No existing container found');
359
655
  }
360
- } catch (error) {
361
- stopSpinner.warn('Could not check for existing container');
362
656
  }
363
657
 
364
658
  // Preparar opciones de entorno
@@ -376,12 +670,12 @@ async function deployToRemoteServer(config: {
376
670
  });
377
671
  }
378
672
 
379
- // Construir comando docker run
380
- const dockerRunCmd = `docker run -d \\
673
+ // Construir comando docker run con parámetros TLS
674
+ const dockerRunCmd = `${dockerTlsPrefix} run -d \\
381
675
  --name ${fullDomain} \\
382
676
  --network academy-network \\
383
677
  --restart unless-stopped \\
384
- ${envOpts.join(' \\\n ')} \\
678
+ ${envOpts.length > 0 ? envOpts.join(' \\\n ') + ' \\' : ''}
385
679
  -l traefik.enable=true \\
386
680
  -l "traefik.http.routers.${serviceName}-router.rule=Host(\\\`${fullDomain}\\\`)" \\
387
681
  -l traefik.http.routers.${serviceName}-router.entrypoints=websecure \\
@@ -389,11 +683,30 @@ async function deployToRemoteServer(config: {
389
683
  -l traefik.http.services.${serviceName}-service.loadbalancer.server.port=${config.port} \\
390
684
  ${config.imageName}`;
391
685
 
686
+ console.log(chalk.gray('\n🚀 Deployment command (executing on remote Docker):'));
687
+ console.log(chalk.gray('─'.repeat(60)));
688
+ console.log(chalk.cyan(dockerRunCmd));
689
+ console.log(chalk.gray('─'.repeat(60)));
690
+ console.log(chalk.gray(`\n Remote Docker: ${chalk.cyan(dockerHost)}`));
691
+ console.log(chalk.gray(` TLS Certificates: ${chalk.cyan(dockerCertPath)}`));
692
+ console.log(chalk.gray(` Service name: ${chalk.cyan(config.serviceName)}`));
693
+ console.log(chalk.gray(` Full domain: ${chalk.cyan(fullDomain)}`));
694
+ console.log(chalk.gray(` Image: ${chalk.cyan(config.imageName)}`));
695
+ console.log(chalk.gray(` Port: ${chalk.cyan(config.port)}`));
696
+ console.log(chalk.gray(` Environment variables: ${chalk.cyan(config.envVars.length)}`));
697
+ if (config.envVars.length > 0) {
698
+ config.envVars.forEach(env => {
699
+ const [key] = env.split('=');
700
+ console.log(chalk.gray(` - ${chalk.cyan(key)}`));
701
+ });
702
+ }
703
+ console.log(chalk.gray('─'.repeat(60)));
704
+
392
705
  const runSpinner = ora('Deploying container to remote server...').start();
393
706
 
394
707
  try {
708
+ // Ejecutar comando docker con parámetros TLS directamente
395
709
  execSync(dockerRunCmd, {
396
- env: dockerEnv,
397
710
  stdio: 'inherit',
398
711
  shell: '/bin/sh',
399
712
  });
@@ -401,12 +714,17 @@ async function deployToRemoteServer(config: {
401
714
  runSpinner.succeed('Container deployed successfully');
402
715
 
403
716
  console.log(chalk.green('\n✅ Remote deployment completed successfully!'));
404
- console.log(chalk.gray('Deployment details:'));
717
+ console.log(chalk.gray('📋 Deployment details:'));
718
+ console.log(chalk.gray('─'.repeat(60)));
405
719
  console.log(chalk.white(` Service: ${chalk.cyan(config.serviceName)}`));
406
720
  console.log(chalk.white(` Domain: ${chalk.cyan(fullDomain)}`));
407
721
  console.log(chalk.white(` URL: ${chalk.cyan(`https://${fullDomain}`)}`));
408
722
  console.log(chalk.white(` Image: ${chalk.cyan(config.imageName)}`));
409
723
  console.log(chalk.white(` Port: ${chalk.cyan(config.port)}`));
724
+ console.log(chalk.white(` Network: ${chalk.cyan('academy-network')}`));
725
+ console.log(chalk.white(` Restart policy: ${chalk.cyan('unless-stopped')}`));
726
+ console.log(chalk.gray('─'.repeat(60)));
727
+ console.log(chalk.green(`\n🌐 Your application is now available at: ${chalk.cyan.underline(`https://${fullDomain}`)}`));
410
728
  } catch (error) {
411
729
  runSpinner.fail('Failed to deploy container');
412
730
  console.error(chalk.red('\n❌ Error deploying container to remote server'));