kcreate-scaffolding-gcp-script 0.0.0-stage → 0.2.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.
- package/LICENSE +21 -0
- package/README.md +370 -2
- package/bin/build.js +70 -0
- package/bin/cli.js +441 -0
- package/package.json +36 -4
- package/skill/SKILL.md +246 -0
- package/skill/references/lessons-learned.md +623 -0
- package/skill/scripts/01_init_config.sh +151 -0
- package/skill/scripts/02_print_config.sh +60 -0
- package/skill/scripts/10_build_components.sh +584 -0
- package/skill/scripts/20_validate_file_parity.sh +107 -0
- package/skill/scripts/21_validate_project_pinning.sh +105 -0
- package/skill/scripts/lib/common.sh +747 -0
- package/skill/scripts/run_tracking.sh +72 -0
- package/skill/templates/scaffolding.config.template +81 -0
- package/vendor/github-proyect-tracking/SKILL.md +171 -0
- package/vendor/github-proyect-tracking/references/api.md +163 -0
- package/vendor/github-proyect-tracking/references/architecture.md +171 -0
- package/vendor/github-proyect-tracking/scripts/tracking.py +196 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/__init__.py +1 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/commands.py +846 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/common.py +163 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/events.py +204 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/github.py +315 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/state.py +379 -0
package/skill/SKILL.md
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kcreate-scaffolding-gcp-script
|
|
3
|
+
description: Genera el scaffolding de Terragrunt (live/<entorno-nuevo>/) para un proyecto GCP nuevo, copiando y adaptando un entorno ya existente del mismo repo. Úsalo siempre que el usuario pida crear un nuevo entorno/proyecto de GCP a partir de uno existente, generar los scripts de Terragrunt para un ambiente nuevo, o "clonar" un entorno como boletera-qa/cashless-qa/xoloshop-qa hacia uno nuevo — incluso si no menciona la palabra "skill" o "scaffolding" explícitamente. NO despliega nada en GCP (eso es un paso posterior, manual).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# kcreate-scaffolding-gcp-script
|
|
7
|
+
|
|
8
|
+
Genera `live/<NEW_ENV>/` completo copiando y adaptando `live/<SOURCE_ENV>/`
|
|
9
|
+
en el mismo repo. Todo el trabajo pesado lo hacen scripts de shell
|
|
10
|
+
determinísticos en `scripts/` — tu trabajo como agente es **orquestarlos
|
|
11
|
+
en el orden correcto y reportar sus mensajes tal cual**, no editar HCL a
|
|
12
|
+
mano ni decidir valores por tu cuenta.
|
|
13
|
+
|
|
14
|
+
**Por qué scripts y no ediciones manuales:** cada sustitución manual de un
|
|
15
|
+
nombre de entorno, un rango CIDR o una lista de APIs es una oportunidad de
|
|
16
|
+
error que solo se descubre en el momento real de desplegar en GCP (ver
|
|
17
|
+
`references/lessons-learned.md` — todos los casos documentados ahí ya
|
|
18
|
+
rompieron un despliegue real alguna vez). Los scripts de este skill existen
|
|
19
|
+
para que esos errores ya no puedan volver a pasar, no para ahorrar
|
|
20
|
+
tipeo.
|
|
21
|
+
|
|
22
|
+
## Requiere
|
|
23
|
+
|
|
24
|
+
- `bash`, `python3` (stdlib `ipaddress`, sin paquetes externos), `git`,
|
|
25
|
+
`curl`, GNU `sed`.
|
|
26
|
+
- El repo destino debe seguir la convención
|
|
27
|
+
`live/<entorno>/<componente>/terragrunt.hcl` + `Makefile` + `.gitignore`
|
|
28
|
+
(la misma de `club-tijuana/infra-cloud`).
|
|
29
|
+
- `github-proyect-tracking` instalado junto a este skill (lo hace
|
|
30
|
+
`install.sh` de este mismo repo automáticamente — si no está, los
|
|
31
|
+
scripts lo detectan y terminan con un mensaje claro en vez de fallar a
|
|
32
|
+
medias).
|
|
33
|
+
|
|
34
|
+
## Parámetros
|
|
35
|
+
|
|
36
|
+
| Parámetro | Obligatorio | Descripción |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `SOURCE_ENV` | sí | Entorno ya existente a copiar. Debe existir en `live/<SOURCE_ENV>/project/terragrunt.hcl` del repo destino. Cualquier entorno vale — no está fijo a uno en particular. |
|
|
39
|
+
| `NEW_ENV` | sí | Id del entorno nuevo, patrón `<app>-<qa\|prod>` en minúsculas (ej. `xoloshop-prod`). De aquí se infiere `PROJECT_NAME` (ej. `Xoloshop-Prod`) — ver sección 3.4 de `references/lessons-learned.md` si la app tiene una capitalización no obvia. |
|
|
40
|
+
|
|
41
|
+
Todo lo demás (repo de GitHub de la app, URL de tracking, org id,
|
|
42
|
+
versiones, rangos CIDR, IPs) se resuelve en la etapa de **Pre requisitos**
|
|
43
|
+
— nunca se lo preguntes al humano campo por campo, usa el archivo de
|
|
44
|
+
configuración (ver abajo).
|
|
45
|
+
|
|
46
|
+
## Antes de todo: ¿dónde estás parado?
|
|
47
|
+
|
|
48
|
+
Todos los scripts de este skill asumen que el directorio de trabajo
|
|
49
|
+
(`cwd`) es la **raíz del repo destino** (donde vive `./live/`). Si no
|
|
50
|
+
estás ahí, `cd` primero — cada script valida esto y se detiene con un
|
|
51
|
+
mensaje claro si no es así.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Etapa 1 — Pre requisitos
|
|
56
|
+
|
|
57
|
+
### 1.1 Generar/localizar el archivo de configuración
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
.claude/skills/kcreate-scaffolding-gcp-script/scripts/01_init_config.sh <SOURCE_ENV> <NEW_ENV>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Este script:
|
|
64
|
+
- Valida que `SOURCE_ENV` exista.
|
|
65
|
+
- Si `live/<NEW_ENV>/` ya existe pero **no hay** config de este skill
|
|
66
|
+
para esa ejecución: si `project.hcl` ahí tiene `project_id` igual a
|
|
67
|
+
`NEW_ENV` (la firma que este skill siempre deja), es un **rescate**
|
|
68
|
+
legítimo — el config se perdió (ej. por un `uninstall.sh
|
|
69
|
+
--clean-gitignore`) — y se regenera desde cero sin pedir confirmación
|
|
70
|
+
extra. Si no tiene esa firma, es una colisión real (otra cosa ocupa
|
|
71
|
+
ese nombre), `DETENTE`. Si **sí hay** config → es un reintento
|
|
72
|
+
legítimo de una corrida anterior (completa o parcial), no un error.
|
|
73
|
+
- Si es la primera vez: genera `.kcreate-scaffolding/<NEW_ENV>.config` a
|
|
74
|
+
partir de la plantilla (`templates/scaffolding.config.template`) y
|
|
75
|
+
**autodetecta** del propio `SOURCE_ENV` todo lo que se pueda (org id,
|
|
76
|
+
billing account, región/zona, owner, organización de GitHub, IPs fijas
|
|
77
|
+
de `authorized_networks`, versiones de GKE/Postgres actuales). Si hay
|
|
78
|
+
una mayoría clara entre los entornos reales de `live/` para una IP fija
|
|
79
|
+
(ej. `cloudadmin`) y `SOURCE_ENV` difiere, adopta el valor mayoritario
|
|
80
|
+
en vez del de `SOURCE_ENV` (probable typo) y avisa.
|
|
81
|
+
- Si ya existe (ejecución anterior interrumpida): no lo regenera —
|
|
82
|
+
reanuda tal cual quedó.
|
|
83
|
+
|
|
84
|
+
Termina con exit code **0** (`CONFIG_READY`) o **2** (`CONFIG_PENDING`,
|
|
85
|
+
con la lista exacta de campos que faltan).
|
|
86
|
+
|
|
87
|
+
SI exit code es 2 → muestra al humano exactamente los campos listados
|
|
88
|
+
(`APP_GITHUB_REPO` y `TRACKING_GITHUB_PROJECT_URL` casi siempre — son los
|
|
89
|
+
dos que ningún entorno existente puede responder por sí solo) y pídeselos.
|
|
90
|
+
Edítalos tú mismo en el archivo (son líneas `CLAVE="valor"` simples) y
|
|
91
|
+
vuelve a correr este mismo script para confirmar que ya quedó completo.
|
|
92
|
+
No inventes estos valores ni asumas un repo de GitHub por el nombre de
|
|
93
|
+
`NEW_ENV`.
|
|
94
|
+
|
|
95
|
+
SI exit code es distinto de 0 y 2 → es un error de validación real
|
|
96
|
+
(`SOURCE_ENV` no existe, `NEW_ENV` ya existe, patrón inválido). `DETENTE`
|
|
97
|
+
y reporta el mensaje tal cual.
|
|
98
|
+
|
|
99
|
+
Antes de confirmar, revisa también `GKE_VERSION_NEEDS_VERIFICATION` y
|
|
100
|
+
`DATABASE_VERSION_NEEDS_VERIFICATION` en el config: son la versión que ya
|
|
101
|
+
usaba `SOURCE_ENV`, no necesariamente la más reciente. Verifícalas contra
|
|
102
|
+
la documentación oficial de GKE (canal Stable) y Cloud SQL Postgres antes
|
|
103
|
+
de dar por buena la confirmación — si `SOURCE_ENV` es un entorno viejo,
|
|
104
|
+
puede estar desactualizado.
|
|
105
|
+
|
|
106
|
+
### 1.2 Mostrar y confirmar
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
.claude/skills/kcreate-scaffolding-gcp-script/scripts/02_print_config.sh <NEW_ENV>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Antes de imprimir el config, este script corre un "doctor" sobre
|
|
113
|
+
`SOURCE_ENV`: compara `project_services`/`org_policies`/IP de
|
|
114
|
+
`cloudadmin` contra el resto de `live/` y emite `[WARN]` si `SOURCE_ENV`
|
|
115
|
+
le falta algo que el entorno más reciente (o la mayoría) ya tiene — por
|
|
116
|
+
ejemplo, una API de organización forzada después de que `SOURCE_ENV` se
|
|
117
|
+
creó. **Repórtalas al humano junto con el config** — son parte de lo que
|
|
118
|
+
tiene que confirmar, no ruido a ignorar.
|
|
119
|
+
|
|
120
|
+
Luego muestra el archivo completo. **Cópialo tal cual al humano** (WARN
|
|
121
|
+
incluidos) y pregúntale textualmente si los datos son correctos.
|
|
122
|
+
|
|
123
|
+
- SI dice que **no** → `DETENTE` por completo. No corrijas nada por tu
|
|
124
|
+
cuenta, no sigas a la Etapa 2. Pide que te diga qué está mal, edita
|
|
125
|
+
exactamente eso, y vuelve a mostrar el archivo completo para una
|
|
126
|
+
confirmación nueva.
|
|
127
|
+
- SI dice que **sí** → continúa a la Etapa 2.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Etapa 2 — Construcción
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
.claude/skills/kcreate-scaffolding-gcp-script/scripts/10_build_components.sh <NEW_ENV>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Un solo comando. Internamente:
|
|
138
|
+
1. Descubre los componentes de `SOURCE_ENV` (cualquier subcarpeta con
|
|
139
|
+
`terragrunt.hcl`) y los filtra a solo los **base** (los que existen en
|
|
140
|
+
TODOS los entornos reales de `live/`) más lo que `EXTRA_COMPONENTS` del
|
|
141
|
+
config pida explícitamente. Componentes opcionales de `SOURCE_ENV`
|
|
142
|
+
(`cloud_armor`, `secrets`, etc.) quedan excluidos por defecto — si
|
|
143
|
+
`NEW_ENV` sí los necesita, agrégalos a `EXTRA_COMPONENTS` en el config
|
|
144
|
+
y vuelve a correr este script.
|
|
145
|
+
2. Arranca o reanuda el seguimiento con `github-proyect-tracking`. Esto es
|
|
146
|
+
**best-effort**: si falla (sin red, token, URL inválida), avisa con
|
|
147
|
+
`[WARN]` y la construcción sigue igual, solo que sin reanudación
|
|
148
|
+
remota — nunca se detiene por esto.
|
|
149
|
+
3. Copia y adapta cada componente con sustituciones de texto
|
|
150
|
+
determinísticas — nunca con juicio del agente. El detalle de qué hace
|
|
151
|
+
cada componente está en `references/lessons-learned.md`.
|
|
152
|
+
4. Corre `terragrunt hcl fmt` + `terragrunt hcl validate` por componente al
|
|
153
|
+
final (si `terragrunt` está instalado; si no, lo avisa pero no falla
|
|
154
|
+
por eso). El falso positivo conocido de `gke_private` se tolera; cualquier
|
|
155
|
+
otro error de `hcl validate` sí detiene la construcción.
|
|
156
|
+
|
|
157
|
+
Termina con **exactamente uno** de estos mensajes:
|
|
158
|
+
- `BUILD_OK: <ruta>` (exit 0) → continuar a la Etapa 3.
|
|
159
|
+
- `BUILD_FAILED: <paso> - <detalle>` (exit 1) → `DETENTE`. El detalle ya
|
|
160
|
+
trae lo necesario para decidir si es corregible (edita el archivo de
|
|
161
|
+
configuración o el `terragrunt.hcl` de `SOURCE_ENV` según corresponda) y
|
|
162
|
+
vuelve a correr el mismo comando — **es seguro reintentar incluso si
|
|
163
|
+
`live/<NEW_ENV>/` ya quedó parcialmente creado**: cada componente se
|
|
164
|
+
reconstruye siempre desde cero a partir de `SOURCE_ENV`, nunca se
|
|
165
|
+
acumula sobre lo que ya había.
|
|
166
|
+
|
|
167
|
+
Durante la construcción vas a ver líneas `[WARN]` para los casos que **no**
|
|
168
|
+
se pueden resolver solo con sustitución de texto (bindings de
|
|
169
|
+
`project_iam` específicos de `SOURCE_ENV`, componentes opcionales
|
|
170
|
+
incluidos vía `EXTRA_COMPONENTS` sin manejo dedicado, más de un repo en
|
|
171
|
+
`github_workload_identity` cuando `APP_GITHUB_REPO` tiene varios,
|
|
172
|
+
`artifact_registry` ya genérico en `SOURCE_ENV`, el dominio de
|
|
173
|
+
`dns_domain_name` cuando `DNS_DOMAIN` no está definido en el config,
|
|
174
|
+
claves HCL duplicadas heredadas de `SOURCE_ENV`, componentes excluidos por
|
|
175
|
+
defecto, fallas de tracking). Estas líneas **no son un fallo** — son el
|
|
176
|
+
agente diciéndote exactamente qué revisar a mano antes de confiar en el
|
|
177
|
+
resultado. Quedan también en `.kcreate-scaffolding/<NEW_ENV>.warnings` por
|
|
178
|
+
si la sesión se interrumpe. Léelas todas y repórtalas al humano junto con
|
|
179
|
+
el resultado final; no las descartes en silencio.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Etapa 3 — Validación
|
|
184
|
+
|
|
185
|
+
Dos scripts, cualquier orden, ambos obligatorios antes de dar por bueno
|
|
186
|
+
el resultado:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
.claude/skills/kcreate-scaffolding-gcp-script/scripts/20_validate_file_parity.sh <SOURCE_ENV> <NEW_ENV>
|
|
190
|
+
.claude/skills/kcreate-scaffolding-gcp-script/scripts/21_validate_project_pinning.sh <NEW_ENV>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
- `20_validate_file_parity.sh` → `FILE_PARITY_OK` (exit 0) o
|
|
194
|
+
`FILE_PARITY_MISMATCH` (exit 1, con el detalle de qué archivo falta o
|
|
195
|
+
sobra). Compara solo los archivos que el repo realmente comitearía
|
|
196
|
+
(respeta `.gitignore`), no cuenta cache ni temporales.
|
|
197
|
+
- `21_validate_project_pinning.sh` → `PROJECT_PINNING_OK` (exit 0) o
|
|
198
|
+
`PROJECT_PINNING_FAILED` (exit 1, listando cada componente con
|
|
199
|
+
problema). Confirma que, sin importar qué proyecto tenga `gcloud` como
|
|
200
|
+
default en ese momento, cada componente de `NEW_ENV` resuelve siempre al
|
|
201
|
+
proyecto correcto.
|
|
202
|
+
|
|
203
|
+
SI cualquiera de los dos falla → `DETENTE`. No es un error de Terragrunt
|
|
204
|
+
ni de GCP — es un defecto de generación real, y el mensaje ya dice
|
|
205
|
+
exactamente qué componente/archivo revisar.
|
|
206
|
+
|
|
207
|
+
SI ambos pasan y el tracking SÍ se inicializó en la Etapa 2 (no viste el
|
|
208
|
+
`[WARN]` de "no se pudo inicializar github-proyect-tracking") → marca el
|
|
209
|
+
proceso como terminado:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
.claude/skills/kcreate-scaffolding-gcp-script/scripts/run_tracking.sh finalize "$(ls -d .kcreate-scaffolding/<NEW_ENV>.config)"
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
SI el tracking nunca se inicializó (modo best-effort sin éxito, ver
|
|
216
|
+
Etapa 2) → omite este paso. No hay Issue que cerrar, y `finalize` fallaría
|
|
217
|
+
con un error que no es necesario interpretar ni reportar como problema.
|
|
218
|
+
|
|
219
|
+
Y reporta al humano:
|
|
220
|
+
1. Que `live/<NEW_ENV>/` quedó generado y validado.
|
|
221
|
+
2. La lista completa de `[WARN]` que salieron durante la Etapa 2 (son los
|
|
222
|
+
puntos que SÍ requieren una revisión humana antes de desplegar).
|
|
223
|
+
3. Que nada se comiteó — este skill nunca hace `git add`/`git commit` por
|
|
224
|
+
su cuenta.
|
|
225
|
+
4. Que el siguiente paso (desplegar en GCP) es un proceso separado, fuera
|
|
226
|
+
del alcance de este skill.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Qué hacer si algo falla a medias
|
|
231
|
+
|
|
232
|
+
Los scripts de las etapas 1 y 2 son seguros de reintentar:
|
|
233
|
+
`01_init_config.sh` nunca regenera un config que ya existe, y
|
|
234
|
+
`10_build_components.sh` **nunca falla por que `live/<NEW_ENV>/` ya
|
|
235
|
+
exista** — cada componente se reconstruye siempre desde `SOURCE_ENV`
|
|
236
|
+
desde cero, así que un reintento después de un fallo a medias produce el
|
|
237
|
+
mismo resultado que si hubiera corrido bien la primera vez (el rango CIDR
|
|
238
|
+
elegido también se reusa desde `.kcreate-scaffolding/<NEW_ENV>.cidr`, no
|
|
239
|
+
se recalcula). Si la sesión se cae a la mitad de la Etapa 2, simplemente
|
|
240
|
+
vuelve a correr `10_build_components.sh <NEW_ENV>` de nuevo.
|
|
241
|
+
|
|
242
|
+
Si necesitas descartar un intento fallido por completo y empezar de cero:
|
|
243
|
+
borra `live/<NEW_ENV>/` y `.kcreate-scaffolding/<NEW_ENV>.*` tú mismo (este
|
|
244
|
+
skill nunca borra nada automáticamente) y vuelve a empezar desde la Etapa
|
|
245
|
+
1. Pide confirmación explícita al humano antes de borrar — puede que
|
|
246
|
+
quiera revisar lo que ya se generó en vez de descartarlo.
|