codecrypto-cli 1.0.9 → 1.0.11
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.
- package/README.md +238 -399
- package/dist/commands/auth.js +1 -1
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/deploy-sc.d.ts.map +1 -1
- package/dist/commands/deploy-sc.js +35 -18
- package/dist/commands/deploy-sc.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +296 -97
- package/dist/commands/deploy.js.map +1 -1
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/auth.ts +1 -1
- package/src/commands/deploy-sc.ts +32 -18
- package/src/commands/deploy.ts +327 -107
- package/src/index.ts +37 -0
- package/Dockerfile +0 -15
- package/docker-build/Dockerfile +0 -18
- package/docker-build/standalone/.next/BUILD_ID +0 -1
- package/docker-build/standalone/.next/app-path-routes-manifest.json +0 -6
- package/docker-build/standalone/.next/build-manifest.json +0 -19
- package/docker-build/standalone/.next/package.json +0 -1
- package/docker-build/standalone/.next/prerender-manifest.json +0 -114
- package/docker-build/standalone/.next/required-server-files.json +0 -164
- package/docker-build/standalone/.next/routes-manifest.json +0 -68
- package/docker-build/standalone/.next/server/app/_global-error/page/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/_global-error/page/build-manifest.json +0 -16
- package/docker-build/standalone/.next/server/app/_global-error/page/next-font-manifest.json +0 -6
- package/docker-build/standalone/.next/server/app/_global-error/page/react-loadable-manifest.json +0 -1
- package/docker-build/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/_global-error/page.js +0 -11
- package/docker-build/standalone/.next/server/app/_global-error/page.js.map +0 -5
- package/docker-build/standalone/.next/server/app/_global-error/page.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app/_global-error.html +0 -2
- package/docker-build/standalone/.next/server/app/_global-error.meta +0 -15
- package/docker-build/standalone/.next/server/app/_global-error.rsc +0 -13
- package/docker-build/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +0 -5
- package/docker-build/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +0 -13
- package/docker-build/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +0 -6
- package/docker-build/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +0 -4
- package/docker-build/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +0 -1
- package/docker-build/standalone/.next/server/app/_not-found/page/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/_not-found/page/build-manifest.json +0 -16
- package/docker-build/standalone/.next/server/app/_not-found/page/next-font-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +0 -1
- package/docker-build/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/_not-found/page.js +0 -14
- package/docker-build/standalone/.next/server/app/_not-found/page.js.map +0 -5
- package/docker-build/standalone/.next/server/app/_not-found/page.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app/_not-found.html +0 -1
- package/docker-build/standalone/.next/server/app/_not-found.meta +0 -16
- package/docker-build/standalone/.next/server/app/_not-found.rsc +0 -14
- package/docker-build/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +0 -14
- package/docker-build/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +0 -6
- package/docker-build/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +0 -5
- package/docker-build/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
- package/docker-build/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -4
- package/docker-build/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -2
- package/docker-build/standalone/.next/server/app/favicon.ico/route/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/favicon.ico/route/build-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/favicon.ico/route.js +0 -6
- package/docker-build/standalone/.next/server/app/favicon.ico/route.js.map +0 -5
- package/docker-build/standalone/.next/server/app/favicon.ico/route.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/favicon.ico.body +0 -0
- package/docker-build/standalone/.next/server/app/favicon.ico.meta +0 -1
- package/docker-build/standalone/.next/server/app/index.html +0 -1
- package/docker-build/standalone/.next/server/app/index.meta +0 -14
- package/docker-build/standalone/.next/server/app/index.rsc +0 -16
- package/docker-build/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +0 -5
- package/docker-build/standalone/.next/server/app/index.segments/_full.segment.rsc +0 -16
- package/docker-build/standalone/.next/server/app/index.segments/_head.segment.rsc +0 -6
- package/docker-build/standalone/.next/server/app/index.segments/_index.segment.rsc +0 -5
- package/docker-build/standalone/.next/server/app/index.segments/_tree.segment.rsc +0 -4
- package/docker-build/standalone/.next/server/app/page/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/page/build-manifest.json +0 -16
- package/docker-build/standalone/.next/server/app/page/next-font-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/page/react-loadable-manifest.json +0 -1
- package/docker-build/standalone/.next/server/app/page/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/page.js +0 -16
- package/docker-build/standalone/.next/server/app/page.js.map +0 -5
- package/docker-build/standalone/.next/server/app/page.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/page_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app-paths-manifest.json +0 -6
- package/docker-build/standalone/.next/server/chunks/66d90_example-navidad__next-internal_server_app_favicon_ico_route_actions_a30dceae.js +0 -3
- package/docker-build/standalone/.next/server/chunks/[externals]_next_dist_03fe02e0._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__4b49000d._.js +0 -21
- package/docker-build/standalone/.next/server/chunks/[turbopack]_runtime.js +0 -795
- package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_example-navidad__next-internal_server_app_page_actions_a387aef9.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_example-navidad_377109b0._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_example-navidad_90799f30._.js +0 -4
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_example-navidad_app_b9057478._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/66d90_example-navidad__next-internal_server_app__global-error_page_actions_a079475f.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/66d90_example-navidad__next-internal_server_app__not-found_page_actions_ac88cec2.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_51be1544._.js +0 -4
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_8dba0557._.js +0 -6
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_client_components_41330064._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_client_components_builtin_forbidden_ff3a0457.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_client_components_builtin_global-error_e0d57e6e.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_client_components_builtin_unauthorized_f1c47e13.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_d332f292._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_esm_build_templates_app-page_cf6afba1.js +0 -4
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__02f3f427._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__2f460610._.js +0 -4
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__4722e53c._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__53b749fa._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__61942f2d._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__7707ad1b._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__864cadbf._.js +0 -10
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__9939e281._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__b4b0aa8a._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__d2b7072b._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[turbopack]_runtime.js +0 -795
- package/docker-build/standalone/.next/server/functions-config-manifest.json +0 -4
- package/docker-build/standalone/.next/server/middleware-build-manifest.js +0 -20
- package/docker-build/standalone/.next/server/middleware-manifest.json +0 -6
- package/docker-build/standalone/.next/server/next-font-manifest.js +0 -1
- package/docker-build/standalone/.next/server/next-font-manifest.json +0 -15
- package/docker-build/standalone/.next/server/pages/404.html +0 -1
- package/docker-build/standalone/.next/server/pages/500.html +0 -2
- package/docker-build/standalone/.next/server/pages-manifest.json +0 -4
- package/docker-build/standalone/.next/server/server-reference-manifest.js +0 -1
- package/docker-build/standalone/.next/server/server-reference-manifest.json +0 -5
- package/docker-build/standalone/.next/static/_NbfI2TKfapiyxsQgIG3h/_buildManifest.js +0 -11
- package/docker-build/standalone/.next/static/_NbfI2TKfapiyxsQgIG3h/_clientMiddlewareManifest.json +0 -1
- package/docker-build/standalone/.next/static/_NbfI2TKfapiyxsQgIG3h/_ssgManifest.js +0 -1
- package/docker-build/standalone/.next/static/chunks/57d1af92f5dc15fa.js +0 -1
- package/docker-build/standalone/.next/static/chunks/6ae71d5e8ea4d1eb.js +0 -1
- package/docker-build/standalone/.next/static/chunks/70977d70c9306213.js +0 -1
- package/docker-build/standalone/.next/static/chunks/777dac7104fe2a30.js +0 -5
- package/docker-build/standalone/.next/static/chunks/a6dad97d9634a72d.js +0 -1
- package/docker-build/standalone/.next/static/chunks/a6dad97d9634a72d.js.map +0 -1
- package/docker-build/standalone/.next/static/chunks/d6aec49b013224a2.css +0 -3
- package/docker-build/standalone/.next/static/chunks/turbopack-0ce517fb6224c1f0.js +0 -4
- package/docker-build/standalone/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
- package/docker-build/standalone/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
- package/docker-build/standalone/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
- package/docker-build/standalone/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
- package/docker-build/standalone/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
- package/docker-build/standalone/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
- package/docker-build/standalone/.next/static/media/favicon.0b3bf435.ico +0 -0
- package/docker-build/standalone/package.json +0 -26
- package/docker-build/standalone/public/file.svg +0 -1
- package/docker-build/standalone/public/globe.svg +0 -1
- package/docker-build/standalone/public/next.svg +0 -1
- package/docker-build/standalone/public/vercel.svg +0 -1
- package/docker-build/standalone/public/window.svg +0 -1
- package/docker-build/standalone/server.js +0 -38
- package/token.json +0 -69
package/README.md
CHANGED
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
# CodeCrypto CLI
|
|
2
2
|
|
|
3
|
-
CLI tool
|
|
3
|
+
CLI tool para desplegar aplicaciones Next.js/Express y smart contracts con Foundry.
|
|
4
4
|
|
|
5
5
|
## Instalación
|
|
6
6
|
|
|
7
|
-
### Usando NPX (sin instalación)
|
|
8
7
|
```bash
|
|
8
|
+
# Usando NPX (sin instalación)
|
|
9
9
|
npx codecrypto-cli [command]
|
|
10
|
-
```
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
```bash
|
|
11
|
+
# Instalación global
|
|
14
12
|
npm install -g codecrypto-cli
|
|
15
13
|
codecrypto [command]
|
|
16
|
-
```
|
|
17
14
|
|
|
18
|
-
|
|
19
|
-
```bash
|
|
15
|
+
# Desarrollo local
|
|
20
16
|
git clone <repository>
|
|
21
17
|
cd cli-cc
|
|
22
18
|
npm install
|
|
@@ -24,527 +20,370 @@ npm run build
|
|
|
24
20
|
npm link
|
|
25
21
|
```
|
|
26
22
|
|
|
27
|
-
## Comandos
|
|
23
|
+
## Comandos
|
|
28
24
|
|
|
29
|
-
###
|
|
25
|
+
### 🔐 `auth` - Autenticación
|
|
30
26
|
|
|
31
|
-
|
|
27
|
+
Autentica el CLI con el servidor CodeCrypto.
|
|
32
28
|
|
|
33
29
|
```bash
|
|
34
|
-
|
|
35
|
-
codecrypto
|
|
36
|
-
|
|
37
|
-
# Despliegue con opciones
|
|
38
|
-
codecrypto deploy --env prod --branch main --region us-west-2
|
|
39
|
-
|
|
40
|
-
# Despliegue sin tests
|
|
41
|
-
codecrypto deploy --skip-tests
|
|
42
|
-
|
|
43
|
-
# Simulación (dry-run)
|
|
44
|
-
codecrypto deploy --dry-run
|
|
30
|
+
codecrypto auth
|
|
31
|
+
codecrypto auth --force # Forzar renovación de token
|
|
45
32
|
```
|
|
46
33
|
|
|
47
|
-
**
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
- `--dry-run` - Simular sin ejecutar
|
|
53
|
-
|
|
54
|
-
**Ejemplos:**
|
|
55
|
-
```bash
|
|
56
|
-
# Desplegar a producción desde rama release
|
|
57
|
-
codecrypto deploy -e prod -b release
|
|
58
|
-
|
|
59
|
-
# Desplegar a staging sin tests
|
|
60
|
-
codecrypto deploy -e staging --skip-tests
|
|
61
|
-
|
|
62
|
-
# Simular despliegue a producción
|
|
63
|
-
codecrypto deploy -e prod --dry-run
|
|
64
|
-
```
|
|
34
|
+
**Funcionamiento:**
|
|
35
|
+
- Genera código de autenticación
|
|
36
|
+
- Abre navegador para autorizar
|
|
37
|
+
- Guarda token en `~/.codecrypto/token.json`
|
|
38
|
+
- Incluye certificados Docker en `adminGlobals`
|
|
65
39
|
|
|
66
40
|
---
|
|
67
41
|
|
|
68
|
-
###
|
|
42
|
+
### 🏥 `doctor` - Validación del Sistema
|
|
69
43
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
#### Crear Usuario
|
|
44
|
+
Valida todos los requisitos necesarios para desplegar.
|
|
73
45
|
|
|
74
46
|
```bash
|
|
75
|
-
|
|
76
|
-
codecrypto
|
|
77
|
-
|
|
78
|
-
# Con parámetros
|
|
79
|
-
codecrypto user create -u john_doe -e john@example.com -r admin
|
|
80
|
-
|
|
81
|
-
# Modo mixto (parámetros + interactivo)
|
|
82
|
-
codecrypto user create -u john_doe --interactive
|
|
47
|
+
codecrypto doctor
|
|
48
|
+
codecrypto doctor --verbose
|
|
83
49
|
```
|
|
84
50
|
|
|
85
|
-
**
|
|
86
|
-
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
# Crear usuario guest
|
|
97
|
-
codecrypto user create -u guest01 -e guest@example.com -r guest
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
#### Listar Usuarios
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
# Listar todos
|
|
104
|
-
codecrypto user list
|
|
105
|
-
|
|
106
|
-
# Filtrar por rol
|
|
107
|
-
codecrypto user list -r admin
|
|
108
|
-
|
|
109
|
-
# Limitar resultados
|
|
110
|
-
codecrypto user list -l 5
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
**Opciones:**
|
|
114
|
-
- `-r, --role <role>` - Filtrar por rol
|
|
115
|
-
- `-l, --limit <number>` - Límite de resultados. Default: `10`
|
|
116
|
-
|
|
117
|
-
#### Eliminar Usuario
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
# Con confirmación
|
|
121
|
-
codecrypto user delete 123
|
|
122
|
-
|
|
123
|
-
# Sin confirmación (forzar)
|
|
124
|
-
codecrypto user delete 123 --force
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
**Opciones:**
|
|
128
|
-
- `-f, --force` - Omitir confirmación
|
|
51
|
+
**Valida:**
|
|
52
|
+
- ✅ Node.js y npm
|
|
53
|
+
- ✅ Docker y Docker Buildx
|
|
54
|
+
- ✅ Docker Hub authentication
|
|
55
|
+
- ✅ CodeCrypto token
|
|
56
|
+
- ✅ Certificados Docker (desde token.json)
|
|
57
|
+
- ✅ Git
|
|
58
|
+
- ✅ Foundry (forge, cast, anvil)
|
|
59
|
+
- ✅ Anvil corriendo (puerto 55556)
|
|
60
|
+
- ✅ Acceso a cuenta Anvil 0
|
|
129
61
|
|
|
130
62
|
---
|
|
131
63
|
|
|
132
|
-
###
|
|
133
|
-
|
|
134
|
-
Gestiona la configuración del CLI.
|
|
135
|
-
|
|
136
|
-
#### Set (Establecer valor)
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
# Configuración local
|
|
140
|
-
codecrypto config set api.url https://api.example.com
|
|
141
|
-
|
|
142
|
-
# Configuración global
|
|
143
|
-
codecrypto config set api.token my-secret-token --global
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
**Opciones:**
|
|
147
|
-
- `-g, --global` - Configuración global
|
|
64
|
+
### 🐳 `deploy` - Despliegue de Aplicaciones
|
|
148
65
|
|
|
149
|
-
**
|
|
150
|
-
```bash
|
|
151
|
-
codecrypto config set default.region us-west-2
|
|
152
|
-
codecrypto config set api.timeout 5000 --global
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
#### Get (Obtener valor)
|
|
156
|
-
|
|
157
|
-
```bash
|
|
158
|
-
codecrypto config get api.url
|
|
159
|
-
codecrypto config get default.region
|
|
160
|
-
```
|
|
66
|
+
Despliega aplicaciones **Next.js** o **Express** usando Docker.
|
|
161
67
|
|
|
162
|
-
|
|
68
|
+
**Detección automática:** Analiza `package.json` para detectar el tipo:
|
|
69
|
+
- Si tiene `next` → Next.js
|
|
70
|
+
- Si tiene `express` → Express
|
|
163
71
|
|
|
164
72
|
```bash
|
|
165
|
-
#
|
|
166
|
-
codecrypto
|
|
73
|
+
# Básico
|
|
74
|
+
codecrypto deploy <project-path>
|
|
167
75
|
|
|
168
|
-
#
|
|
169
|
-
codecrypto
|
|
76
|
+
# Con opciones
|
|
77
|
+
codecrypto deploy <project-path> [dest-folder] \
|
|
78
|
+
--deploy \
|
|
79
|
+
--service-name mi-app \
|
|
80
|
+
--port 3000 \
|
|
81
|
+
--domain-base proyectos.codecrypto.academy \
|
|
82
|
+
--env-file .env \
|
|
83
|
+
--image-version 1.0.0 \
|
|
84
|
+
--skip-build \
|
|
85
|
+
--no-push \
|
|
86
|
+
--skip-git-check
|
|
170
87
|
```
|
|
171
88
|
|
|
172
89
|
**Opciones:**
|
|
173
|
-
-
|
|
90
|
+
- `<project-path>` - Ruta al proyecto (requerido)
|
|
91
|
+
- `[dest-folder]` - Carpeta destino para build Docker (default: `./docker-build`)
|
|
92
|
+
- `--deploy` - Desplegar en servidor remoto después del build
|
|
93
|
+
- `--service-name <name>` - Nombre del servicio para Traefik
|
|
94
|
+
- `--port <port>` - Puerto de la aplicación (default: `3000`)
|
|
95
|
+
- `--domain-base <domain>` - Dominio base (default: `proyectos.codecrypto.academy`)
|
|
96
|
+
- `--env-file <path>` - Archivo `.env` con variables de entorno
|
|
97
|
+
- `--image-version <version>` - Versión/tag de la imagen (sobrescribe package.json)
|
|
98
|
+
- `--skip-build` - Omitir `npm run build`
|
|
99
|
+
- `--no-push` - Construir pero no hacer push a Docker Hub
|
|
100
|
+
- `--skip-git-check` - Omitir verificación de estado Git
|
|
101
|
+
|
|
102
|
+
**Proceso:**
|
|
103
|
+
1. Detecta tipo de proyecto (Next.js/Express)
|
|
104
|
+
2. Valida estado Git (a menos que se omita)
|
|
105
|
+
3. Build del proyecto (si no se omite)
|
|
106
|
+
4. Genera Dockerfile optimizado
|
|
107
|
+
5. Construye imagen multi-plataforma (linux/amd64, linux/arm64)
|
|
108
|
+
6. Push a Docker Hub (si no se omite)
|
|
109
|
+
7. Despliega en servidor remoto (si `--deploy`)
|
|
110
|
+
|
|
111
|
+
**Dockerfile generado:**
|
|
112
|
+
- **Next.js:** Usa `node:20-alpine`, copia `.next/standalone`, `.next/static`, `public`
|
|
113
|
+
- **Express:** Usa `node:20-alpine`, multi-stage build, solo dependencias de producción
|
|
114
|
+
|
|
115
|
+
**Certificados Docker:**
|
|
116
|
+
- Se leen desde `~/.codecrypto/token.json` → `adminGlobals`
|
|
117
|
+
- Keys: `docker-client/ca-pem`, `docker-client/cert.pem`, `docker-client/key.pem`
|
|
174
118
|
|
|
175
119
|
---
|
|
176
120
|
|
|
177
|
-
###
|
|
178
|
-
|
|
179
|
-
Operaciones de base de datos.
|
|
121
|
+
### 🔷 `deploy-sc` - Despliegue de Smart Contracts
|
|
180
122
|
|
|
181
|
-
|
|
123
|
+
Despliega smart contracts usando **Foundry**.
|
|
182
124
|
|
|
183
125
|
```bash
|
|
184
|
-
#
|
|
185
|
-
codecrypto
|
|
186
|
-
|
|
187
|
-
# Ejecutar en producción
|
|
188
|
-
codecrypto db migrate -e prod
|
|
126
|
+
# Básico
|
|
127
|
+
codecrypto deploy-sc <script-path>
|
|
189
128
|
|
|
190
|
-
#
|
|
191
|
-
codecrypto
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
129
|
+
# Con opciones
|
|
130
|
+
codecrypto deploy-sc <script-path> \
|
|
131
|
+
--url http://localhost:8545 \
|
|
132
|
+
--private-key 0x... \
|
|
133
|
+
--account 0 \
|
|
134
|
+
--anvil \
|
|
135
|
+
--broadcast \
|
|
136
|
+
--verify \
|
|
137
|
+
--slow \
|
|
138
|
+
--debug
|
|
195
139
|
```
|
|
196
140
|
|
|
197
141
|
**Opciones:**
|
|
198
|
-
-
|
|
199
|
-
-
|
|
200
|
-
-
|
|
201
|
-
|
|
202
|
-
|
|
142
|
+
- `<script-path>` - Ruta al script Foundry `.s.sol` (requerido)
|
|
143
|
+
- `-u, --url <rpc-url>` - URL RPC (default: `http://server.codecrypto.academy:8546`)
|
|
144
|
+
- `-k, --private-key <key>` - Clave privada (o usar `PRIVATE_KEY` env var)
|
|
145
|
+
- `--account <index>` - Índice de cuenta (para Anvil, usa `0`)
|
|
146
|
+
- `--anvil` - Forzar uso de cuenta Anvil 0 (ignora private-key)
|
|
147
|
+
- `--verify` - Verificar contrato en block explorer
|
|
148
|
+
- `--broadcast` - Transmitir transacción (default: `true`)
|
|
149
|
+
- `--slow` - Modo lento para deployment
|
|
150
|
+
- `--debug` - Mostrar información de debug
|
|
151
|
+
|
|
152
|
+
**Proceso:**
|
|
153
|
+
1. Valida que el script existe y es `.s.sol`
|
|
154
|
+
2. Detecta proyecto Foundry (busca `foundry.toml`)
|
|
155
|
+
3. Ejecuta `forge script` con configuración
|
|
156
|
+
4. Guarda resultados en `broadcast/`
|
|
157
|
+
5. Sube transacciones a BD vía `/api/uploadSmartContract`
|
|
158
|
+
|
|
159
|
+
**Datos subidos a BD:**
|
|
160
|
+
- Email del usuario
|
|
161
|
+
- Carpeta del proyecto
|
|
162
|
+
- JSON completo de transacciones (`run-latest.json`)
|
|
163
|
+
- RPC URL usado
|
|
164
|
+
- Clave privada (o `account-{index}`)
|
|
203
165
|
|
|
204
|
-
|
|
205
|
-
# Seed básico
|
|
206
|
-
codecrypto db seed
|
|
207
|
-
|
|
208
|
-
# Limpiar y seed
|
|
209
|
-
codecrypto db seed --clear
|
|
210
|
-
|
|
211
|
-
# Seed archivo específico
|
|
212
|
-
codecrypto db seed -f users.sql
|
|
213
|
-
|
|
214
|
-
# Seed en staging
|
|
215
|
-
codecrypto db seed -e staging
|
|
216
|
-
```
|
|
166
|
+
---
|
|
217
167
|
|
|
218
|
-
|
|
219
|
-
- `-e, --env <environment>` - Entorno. Default: `dev`
|
|
220
|
-
- `-f, --file <file>` - Archivo seed específico
|
|
221
|
-
- `--clear` - Limpiar datos existentes
|
|
168
|
+
## Ejemplos de Uso
|
|
222
169
|
|
|
223
|
-
|
|
170
|
+
### Desplegar aplicación Next.js
|
|
224
171
|
|
|
225
172
|
```bash
|
|
226
|
-
#
|
|
227
|
-
codecrypto
|
|
228
|
-
|
|
229
|
-
# Backup de producción
|
|
230
|
-
codecrypto db backup prod-backup -e prod
|
|
173
|
+
# Build y push a Docker Hub
|
|
174
|
+
codecrypto deploy ../mi-app-nextjs
|
|
231
175
|
|
|
232
|
-
#
|
|
233
|
-
codecrypto
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
176
|
+
# Build, push y deploy en servidor
|
|
177
|
+
codecrypto deploy ../mi-app-nextjs \
|
|
178
|
+
--deploy \
|
|
179
|
+
--service-name mi-app \
|
|
180
|
+
--env-file ../mi-app-nextjs/.env
|
|
237
181
|
```
|
|
238
182
|
|
|
239
|
-
|
|
240
|
-
- `-e, --env <environment>` - Entorno origen. Default: `prod`
|
|
241
|
-
- `-o, --output <path>` - Directorio de salida. Default: `./backups`
|
|
242
|
-
- `--compress` - Comprimir archivo. Default: `true`
|
|
243
|
-
|
|
244
|
-
#### Restore
|
|
183
|
+
### Desplegar aplicación Express
|
|
245
184
|
|
|
246
185
|
```bash
|
|
247
|
-
#
|
|
248
|
-
codecrypto
|
|
249
|
-
|
|
250
|
-
# Restaurar en staging
|
|
251
|
-
codecrypto db restore backup.sql -e staging
|
|
186
|
+
# Build y push
|
|
187
|
+
codecrypto deploy ../mi-api-express
|
|
252
188
|
|
|
253
|
-
#
|
|
254
|
-
codecrypto
|
|
189
|
+
# Con variables de entorno
|
|
190
|
+
codecrypto deploy ../mi-api-express \
|
|
191
|
+
--env-file ../mi-api-express/.env \
|
|
192
|
+
--port 3000
|
|
255
193
|
```
|
|
256
194
|
|
|
257
|
-
|
|
258
|
-
- `-e, --env <environment>` - Entorno destino. Default: `dev`
|
|
259
|
-
- `--force` - Omitir confirmación (requerido para prod)
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
## Ayuda
|
|
195
|
+
### Desplegar Smart Contract
|
|
264
196
|
|
|
265
197
|
```bash
|
|
266
|
-
#
|
|
267
|
-
codecrypto
|
|
198
|
+
# En Anvil local
|
|
199
|
+
codecrypto deploy-sc ./script/Deploy.s.sol \
|
|
200
|
+
--url http://localhost:8545 \
|
|
201
|
+
--anvil \
|
|
202
|
+
--broadcast
|
|
268
203
|
|
|
269
|
-
#
|
|
270
|
-
codecrypto deploy
|
|
271
|
-
codecrypto
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
204
|
+
# En red remota con clave privada
|
|
205
|
+
codecrypto deploy-sc ./script/Deploy.s.sol \
|
|
206
|
+
--url http://server.codecrypto.academy:8546 \
|
|
207
|
+
--private-key 0x1234567890abcdef... \
|
|
208
|
+
--broadcast \
|
|
209
|
+
--verify
|
|
275
210
|
```
|
|
276
211
|
|
|
277
|
-
|
|
212
|
+
### Workflow completo
|
|
278
213
|
|
|
279
|
-
### Workflow de Deployment
|
|
280
214
|
```bash
|
|
281
|
-
# 1.
|
|
282
|
-
codecrypto
|
|
283
|
-
codecrypto config set default.region us-east-1
|
|
215
|
+
# 1. Validar sistema
|
|
216
|
+
codecrypto doctor
|
|
284
217
|
|
|
285
|
-
# 2.
|
|
286
|
-
codecrypto
|
|
218
|
+
# 2. Autenticarse (si es necesario)
|
|
219
|
+
codecrypto auth
|
|
287
220
|
|
|
288
|
-
# 3.
|
|
289
|
-
codecrypto deploy -
|
|
221
|
+
# 3. Desplegar aplicación
|
|
222
|
+
codecrypto deploy ../mi-app --deploy
|
|
290
223
|
|
|
291
|
-
# 4.
|
|
292
|
-
codecrypto deploy
|
|
224
|
+
# 4. Desplegar smart contract
|
|
225
|
+
codecrypto deploy-sc ./script/Deploy.s.sol --anvil
|
|
293
226
|
```
|
|
294
227
|
|
|
295
|
-
|
|
296
|
-
```bash
|
|
297
|
-
# 1. Crear backup de seguridad
|
|
298
|
-
codecrypto db backup safety-backup -e prod
|
|
299
|
-
|
|
300
|
-
# 2. Ejecutar migraciones
|
|
301
|
-
codecrypto db migrate -e dev
|
|
302
|
-
|
|
303
|
-
# 3. Poblar datos de prueba
|
|
304
|
-
codecrypto db seed --clear
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
### Gestión de Usuarios
|
|
308
|
-
```bash
|
|
309
|
-
# Crear varios usuarios
|
|
310
|
-
codecrypto user create -u admin -e admin@co.com -r admin
|
|
311
|
-
codecrypto user create -u user1 -e user1@co.com -r user
|
|
312
|
-
codecrypto user create -u guest1 -e guest1@co.com -r guest
|
|
313
|
-
|
|
314
|
-
# Listar usuarios admin
|
|
315
|
-
codecrypto user list -r admin
|
|
316
|
-
|
|
317
|
-
# Eliminar usuario
|
|
318
|
-
codecrypto user delete 5 --force
|
|
319
|
-
```
|
|
228
|
+
---
|
|
320
229
|
|
|
321
|
-
##
|
|
230
|
+
## Estructura del Proyecto
|
|
322
231
|
|
|
323
|
-
### Estructura del Proyecto
|
|
324
232
|
```
|
|
325
233
|
cli-cc/
|
|
326
234
|
├── src/
|
|
327
235
|
│ ├── index.ts # Punto de entrada
|
|
328
236
|
│ └── commands/
|
|
329
|
-
│ ├──
|
|
330
|
-
│ ├──
|
|
331
|
-
│ ├──
|
|
332
|
-
│ └──
|
|
237
|
+
│ ├── auth.ts # Autenticación
|
|
238
|
+
│ ├── deploy.ts # Deploy Next.js/Express
|
|
239
|
+
│ ├── deploy-sc.ts # Deploy Smart Contracts
|
|
240
|
+
│ └── doctor.ts # Validación del sistema
|
|
333
241
|
├── dist/ # Build output
|
|
334
242
|
├── package.json
|
|
335
243
|
├── tsconfig.json
|
|
336
244
|
└── README.md
|
|
337
245
|
```
|
|
338
246
|
|
|
339
|
-
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Desarrollo
|
|
340
250
|
|
|
341
251
|
```bash
|
|
342
252
|
# Instalar dependencias
|
|
343
253
|
npm install
|
|
344
254
|
|
|
345
|
-
# Desarrollo (
|
|
255
|
+
# Desarrollo (sin compilar)
|
|
346
256
|
npm run dev -- deploy --help
|
|
347
257
|
|
|
348
258
|
# Compilar
|
|
349
259
|
npm run build
|
|
350
260
|
|
|
351
|
-
# Probar
|
|
352
|
-
npm run test
|
|
353
|
-
|
|
354
|
-
# Testear localmente con npm link
|
|
261
|
+
# Probar localmente
|
|
355
262
|
npm link
|
|
356
263
|
codecrypto --help
|
|
357
264
|
```
|
|
358
265
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
```bash
|
|
362
|
-
# Build
|
|
363
|
-
npm run build
|
|
364
|
-
|
|
365
|
-
# Probar comando compilado
|
|
366
|
-
node dist/index.js --help
|
|
367
|
-
node dist/index.js deploy --dry-run
|
|
368
|
-
node dist/index.js user create --interactive
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
## Publicación a NPM
|
|
372
|
-
|
|
373
|
-
### 1. Preparación
|
|
374
|
-
|
|
375
|
-
Asegúrate de tener una cuenta en [npmjs.com](https://www.npmjs.com/) y estar logueado:
|
|
266
|
+
---
|
|
376
267
|
|
|
377
|
-
|
|
378
|
-
npm login
|
|
379
|
-
```
|
|
268
|
+
## Configuración
|
|
380
269
|
|
|
381
|
-
###
|
|
270
|
+
### Token de autenticación
|
|
382
271
|
|
|
383
|
-
|
|
384
|
-
- `name`: Nombre único en NPM (verifica disponibilidad en npmjs.com)
|
|
385
|
-
- `version`: Versión semántica (ej: 1.0.0)
|
|
386
|
-
- `description`: Descripción clara
|
|
387
|
-
- `keywords`: Para búsquedas
|
|
388
|
-
- `author`: Tu información
|
|
389
|
-
- `license`: Tipo de licencia
|
|
390
|
-
- `bin`: Configurado correctamente
|
|
391
|
-
- `files`: Archivos a incluir (opcional)
|
|
272
|
+
Guardado en: `~/.codecrypto/token.json`
|
|
392
273
|
|
|
393
274
|
```json
|
|
394
275
|
{
|
|
395
|
-
"
|
|
396
|
-
"
|
|
397
|
-
"
|
|
398
|
-
|
|
276
|
+
"email": "usuario@example.com",
|
|
277
|
+
"token": "jwt-token",
|
|
278
|
+
"serverUrl": "http://server.codecrypto.academy",
|
|
279
|
+
"adminGlobals": [
|
|
280
|
+
{
|
|
281
|
+
"key": "docker-client/ca-pem",
|
|
282
|
+
"value": "..."
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"key": "docker-client/cert.pem",
|
|
286
|
+
"value": "..."
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"key": "docker-client/key.pem",
|
|
290
|
+
"value": "..."
|
|
291
|
+
}
|
|
292
|
+
]
|
|
399
293
|
}
|
|
400
294
|
```
|
|
401
295
|
|
|
402
|
-
###
|
|
296
|
+
### Variables de entorno
|
|
403
297
|
|
|
404
|
-
|
|
405
|
-
# Verificar si el nombre está disponible
|
|
406
|
-
npm search codecrypto-cli
|
|
407
|
-
```
|
|
298
|
+
El CLI puede leer variables de entorno de dos formas:
|
|
408
299
|
|
|
409
|
-
|
|
410
|
-
```json
|
|
411
|
-
{
|
|
412
|
-
"name": "@tu-usuario/codecrypto-cli"
|
|
413
|
-
}
|
|
414
|
-
```
|
|
300
|
+
#### 1. Variables del sistema operativo
|
|
415
301
|
|
|
416
|
-
|
|
302
|
+
Configura las variables en tu shell:
|
|
417
303
|
|
|
418
304
|
```bash
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
### 5. Probar el paquete localmente
|
|
423
|
-
|
|
424
|
-
```bash
|
|
425
|
-
# Simular publicación (ver qué archivos se incluirán)
|
|
426
|
-
npm pack
|
|
427
|
-
|
|
428
|
-
# Esto crea un archivo .tgz que puedes inspeccionar
|
|
429
|
-
# Descomprímelo y verifica el contenido
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
### 6. Publicar
|
|
433
|
-
|
|
434
|
-
```bash
|
|
435
|
-
# Publicación pública
|
|
436
|
-
npm publish
|
|
437
|
-
|
|
438
|
-
# Si usas scoped package (@usuario/nombre)
|
|
439
|
-
npm publish --access public
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
### 7. Verificar
|
|
305
|
+
# Linux/Mac
|
|
306
|
+
export CODECRYPTO_API_URL=http://server.codecrypto.academy:3000
|
|
307
|
+
export API_URL=http://server.codecrypto.academy:3000
|
|
443
308
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
309
|
+
# Windows (PowerShell)
|
|
310
|
+
$env:CODECRYPTO_API_URL="http://server.codecrypto.academy:3000"
|
|
311
|
+
$env:API_URL="http://server.codecrypto.academy:3000"
|
|
447
312
|
|
|
448
|
-
#
|
|
449
|
-
|
|
313
|
+
# Windows (CMD)
|
|
314
|
+
set CODECRYPTO_API_URL=http://server.codecrypto.academy:3000
|
|
315
|
+
set API_URL=http://server.codecrypto.academy:3000
|
|
450
316
|
```
|
|
451
317
|
|
|
452
|
-
|
|
318
|
+
#### 2. Archivo `.env` (recomendado)
|
|
453
319
|
|
|
454
|
-
|
|
320
|
+
Crea un archivo `~/.codecrypto/.env` con tus variables:
|
|
455
321
|
|
|
456
322
|
```bash
|
|
457
|
-
#
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
# Minor (1.0.0 -> 1.1.0) - nuevas features
|
|
461
|
-
npm version minor
|
|
462
|
-
|
|
463
|
-
# Major (1.0.0 -> 2.0.0) - breaking changes
|
|
464
|
-
npm version major
|
|
323
|
+
# El folder ~/.codecrypto se crea automáticamente cuando ejecutas 'codecrypto auth' por primera vez
|
|
324
|
+
# O puedes crearlo manualmente:
|
|
325
|
+
mkdir -p ~/.codecrypto
|
|
465
326
|
|
|
466
|
-
#
|
|
467
|
-
|
|
327
|
+
# Crear archivo .env
|
|
328
|
+
cat > ~/.codecrypto/.env << EOF
|
|
329
|
+
CODECRYPTO_API_URL=http://server.codecrypto.academy:3000
|
|
330
|
+
# O usar API_URL como alternativa
|
|
331
|
+
# API_URL=http://server.codecrypto.academy:3000
|
|
332
|
+
EOF
|
|
468
333
|
```
|
|
469
334
|
|
|
470
|
-
|
|
335
|
+
**Nota:** El folder `~/.codecrypto` se crea automáticamente la primera vez que ejecutas `codecrypto auth`, pero puedes crearlo manualmente antes si lo necesitas.
|
|
471
336
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
npm run build
|
|
475
|
-
npm run test
|
|
337
|
+
**Variables disponibles:**
|
|
338
|
+
- `CODECRYPTO_API_URL` o `API_URL` - URL del servidor API (default: `http://localhost:3000`)
|
|
476
339
|
|
|
477
|
-
|
|
478
|
-
npm login
|
|
340
|
+
**Nota:** Las variables del sistema operativo tienen prioridad sobre el archivo `.env`.
|
|
479
341
|
|
|
480
|
-
|
|
481
|
-
npm search codecrypto-cli
|
|
342
|
+
---
|
|
482
343
|
|
|
483
|
-
|
|
484
|
-
npm publish --access public
|
|
344
|
+
## Requisitos
|
|
485
345
|
|
|
486
|
-
|
|
487
|
-
|
|
346
|
+
- Node.js >= 16.0.0
|
|
347
|
+
- Docker y Docker Buildx
|
|
348
|
+
- Git
|
|
349
|
+
- Foundry (forge, cast, anvil)
|
|
350
|
+
- Anvil corriendo en puerto 55556 (para smart contracts locales)
|
|
488
351
|
|
|
489
|
-
|
|
490
|
-
npm version patch
|
|
491
|
-
npm publish
|
|
492
|
-
```
|
|
352
|
+
---
|
|
493
353
|
|
|
494
|
-
|
|
354
|
+
## Ayuda
|
|
495
355
|
|
|
496
356
|
```bash
|
|
497
|
-
#
|
|
498
|
-
|
|
357
|
+
# Ayuda general
|
|
358
|
+
codecrypto --help
|
|
499
359
|
|
|
500
|
-
#
|
|
501
|
-
|
|
360
|
+
# Ayuda de comando específico
|
|
361
|
+
codecrypto deploy --help
|
|
362
|
+
codecrypto deploy-sc --help
|
|
363
|
+
codecrypto auth --help
|
|
364
|
+
codecrypto doctor --help
|
|
502
365
|
```
|
|
503
366
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
1. **Versionado Semántico**: Usa [semver](https://semver.org/)
|
|
507
|
-
- MAJOR: Cambios incompatibles
|
|
508
|
-
- MINOR: Nuevas funcionalidades compatibles
|
|
509
|
-
- PATCH: Bug fixes
|
|
510
|
-
|
|
511
|
-
2. **README**: Mantén documentación actualizada
|
|
512
|
-
|
|
513
|
-
3. **CHANGELOG**: Documenta cambios en cada versión
|
|
367
|
+
---
|
|
514
368
|
|
|
515
|
-
|
|
369
|
+
## Publicación a NPM
|
|
516
370
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
git push --tags
|
|
521
|
-
```
|
|
371
|
+
```bash
|
|
372
|
+
# 1. Build
|
|
373
|
+
npm run build
|
|
522
374
|
|
|
523
|
-
|
|
375
|
+
# 2. Login
|
|
376
|
+
npm login
|
|
524
377
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
- El archivo debe tener shebang: `#!/usr/bin/env node`
|
|
528
|
-
- Asegúrate de compilar: `npm run build`
|
|
378
|
+
# 3. Publicar
|
|
379
|
+
npm publish
|
|
529
380
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
chmod +x dist/index.js
|
|
381
|
+
# 4. Actualizar versión
|
|
382
|
+
npm version patch|minor|major
|
|
383
|
+
npm publish
|
|
534
384
|
```
|
|
535
385
|
|
|
536
|
-
|
|
537
|
-
- Verifica que estés logueado: `npm whoami`
|
|
538
|
-
- El nombre no existe: Cambia el nombre en package.json
|
|
539
|
-
- Necesitas acceso: Usa `--access public` para scoped packages
|
|
540
|
-
|
|
541
|
-
## Recursos
|
|
542
|
-
|
|
543
|
-
- [Commander.js](https://github.com/tj/commander.js) - Framework CLI
|
|
544
|
-
- [Chalk](https://github.com/chalk/chalk) - Colores en terminal
|
|
545
|
-
- [Inquirer](https://github.com/SBoudrias/Inquirer.js) - Prompts interactivos
|
|
546
|
-
- [Ora](https://github.com/sindresorhus/ora) - Spinners
|
|
547
|
-
- [NPM Publishing Guide](https://docs.npmjs.com/cli/v10/commands/npm-publish)
|
|
386
|
+
---
|
|
548
387
|
|
|
549
388
|
## Licencia
|
|
550
389
|
|