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/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.