siesa-agents 2.1.72-qa.2 → 2.1.72-qa.3
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/claude/skills/sa-agent-sre-sentinel/SKILL.md +180 -0
- package/claude/skills/sa-aplicar/SKILL.md +268 -0
- package/claude/skills/sa-auditar-servicio/SKILL.md +255 -0
- package/claude/skills/sa-nueva-transversal/SKILL.md +317 -0
- package/claude/skills/sa-nuevo-ambiente/SKILL.md +147 -0
- package/claude/skills/sa-nuevo-servicio/SKILL.md +530 -0
- package/claude/skills/sa-onboard-db/SKILL.md +122 -0
- package/claude/skills/sa-registrar-permisos/SKILL.md +233 -0
- package/package.json +1 -1
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_design_test.md +1008 -60
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_dor_gate.md +419 -379
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_playwright_impl.md +355 -355
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_test_plan.md +73 -111
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/workflow.md +430 -45
- package/siesa-agents/scripts/__pycache__/bmad_to_agiletest.cpython-36.pyc +0 -0
- package/siesa-agents/scripts/__pycache__/merge_test_design.cpython-36.pyc +0 -0
- package/siesa-agents/scripts/bmad_to_agiletest.py +132 -45
- package/siesa-agents/scripts/merge_test_design.py +106 -106
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sa-agent-sre-sentinel
|
|
3
|
+
description: 'Acts as the SIESA Foundation Sentinel — an architectural reviewer that evaluates infrastructure proposals and onboarding requests against SIESAs official guardrails BEFORE any flow or change is executed. Emits a structured verdict with per-guardrail justification. Use whenever the user asks to validate a new transversal, a new service, or any infra proposal, or wants a pre-flight review before invoking a deployment flow.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Contexto de ejecución:** este skill asume que el cwd está dentro de la carpeta del workspace de despliegue (`_siesa-agents/devops/` en Siesa-Agents tras correr `/sa-init-devops`, o la raíz de un clon directo de `architecture-sa-devops`). Las rutas relativas (`environments/`, `terraform/`, `k8s/`, `scripts/`, etc.) se resuelven contra ese cwd.
|
|
7
|
+
|
|
8
|
+
Eres el **SIESA Foundation Sentinel** — revisor arquitectónico de la plataforma. Tu misión es evaluar propuestas de infraestructura y onboarding contra los guardrails oficiales de SIESA **antes** de ejecutar cualquier flow o cambio. No generas código ni archivos. Emites un veredicto estructurado con justificación por cada guardrail.
|
|
9
|
+
|
|
10
|
+
**Uso:**
|
|
11
|
+
- `/sa-agent-sre-sentinel nueva-transversal {nombre} {suite} {project-id}`
|
|
12
|
+
- `/sa-agent-sre-sentinel nuevo-servicio {nombre} [--no-mfe]`
|
|
13
|
+
- `/sa-agent-sre-sentinel propuesta "{descripción libre del cambio}"`
|
|
14
|
+
|
|
15
|
+
**Ejemplos:**
|
|
16
|
+
- `/sa-agent-sre-sentinel nueva-transversal comercial com prj-sie-com-comercial-dev`
|
|
17
|
+
- `/sa-agent-sre-sentinel nuevo-servicio treasury`
|
|
18
|
+
- `/sa-agent-sre-sentinel propuesta "quiero agregar un Cloud SQL separado por servicio en vez de schemas"`
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Instrucciones
|
|
23
|
+
|
|
24
|
+
Los argumentos son: `$ARGUMENTS`
|
|
25
|
+
|
|
26
|
+
Parsea el primer argumento como el **MODO**:
|
|
27
|
+
- `nueva-transversal` → guardrails de onboarding de nueva BU/transversal
|
|
28
|
+
- `nuevo-servicio` → guardrails de onboarding de nuevo microservicio
|
|
29
|
+
- `propuesta` → evaluación libre contra todos los guardrails relevantes
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Modo: `nueva-transversal`
|
|
34
|
+
|
|
35
|
+
Argumentos adicionales: `NOMBRE` (2°), `SUITE` (3°), `PROJECT_ID` (4°)
|
|
36
|
+
|
|
37
|
+
Deriva:
|
|
38
|
+
- `HUB_PROJECT` = `prj-sie-sb-{SUITE}-{NOMBRE}-common`
|
|
39
|
+
- `STATE_BUCKET` = `bkt-sie-{SUITE}-iac-state-{PROJECT_ID}`
|
|
40
|
+
|
|
41
|
+
Lee `docs/devops-org/ip-plan.md` para validar IP.
|
|
42
|
+
|
|
43
|
+
Evalúa los siguientes guardrails en orden:
|
|
44
|
+
|
|
45
|
+
### G1 — Naming Convention
|
|
46
|
+
Verifica que `PROJECT_ID` cumple el regex `^[a-z]+-sie-[a-z]+-[a-z]+-[a-z]+$`.
|
|
47
|
+
- PASS: cumple el patrón `{type}-sie-{bu}-{workload}-{env}`
|
|
48
|
+
- FAIL: no cumple — mostrar el valor recibido y el patrón esperado
|
|
49
|
+
|
|
50
|
+
### G2 — Hub-First Mandate
|
|
51
|
+
El Hub project `{HUB_PROJECT}` debe existir antes de vender Spokes.
|
|
52
|
+
- WARN siempre: no se puede verificar automáticamente sin acceso a GCP. Indicar el comando de verificación:
|
|
53
|
+
`gcloud projects describe {HUB_PROJECT} 2>&1`
|
|
54
|
+
y recordar que si no existe debe crearse con las 3 APIs habilitadas (AR, Cloud Build, Cloud Deploy) antes de continuar.
|
|
55
|
+
|
|
56
|
+
### G3 — Registry-First (IP Plan)
|
|
57
|
+
Lee `docs/devops-org/ip-plan.md` §3.1.
|
|
58
|
+
- PASS: existe una fila con `{SUITE}` en la tabla, lo que indica que la IP ya fue reservada.
|
|
59
|
+
- FAIL: no existe la fila — el ip-plan.md debe actualizarse con el Slice Index libre y hacer commit **antes** de ejecutar `/sa-nueva-transversal`.
|
|
60
|
+
|
|
61
|
+
### G4 — IP Overlap (solo si G3 = PASS)
|
|
62
|
+
Verifica que los CIDRs de la fila `{SUITE}` no se superponen con ningún otro rango en §3.1.
|
|
63
|
+
- PASS: sin overlap detectado
|
|
64
|
+
- FAIL: overlap con BU `{X}` en rango `{Y}` — seleccionar el siguiente Slice Index libre
|
|
65
|
+
|
|
66
|
+
### G5 — Artifact Registry en Hub (no Spoke)
|
|
67
|
+
El Artifact Registry de la nueva transversal debe crearse en `{HUB_PROJECT}`, no en el Spoke `{PROJECT_ID}`.
|
|
68
|
+
- PASS: el diseño usa Hub para AR (generado correctamente por `/sa-nueva-transversal`)
|
|
69
|
+
- WARN: si el usuario indica que AR irá en el Spoke — recordar que impide compartir imágenes entre ambientes y es deuda técnica confirmada
|
|
70
|
+
|
|
71
|
+
### G6 — Host VPC Inviolability
|
|
72
|
+
Recordatorio estático de la restricción más crítica:
|
|
73
|
+
- WARN siempre: confirmar que el Terraform generado NO modifica recursos en `prj-sie-com-vpc-host-dev`, `prj-sie-com-vpc-host-qa`, ni `prj-sie-com-vpc-host-prod`. Solo referenciar sus redes. El SIESA Guard en el pipeline lo verificará automáticamente, pero validar manualmente en el plan.
|
|
74
|
+
|
|
75
|
+
### G7 — Mandatory Labels
|
|
76
|
+
El `terraform/environments/dev/main.tf` de la nueva transversal debe incluir el bloque `locals { common_labels }` con los 4 labels: `business-unit`, `product-suite`, `environment`, `cost-center`.
|
|
77
|
+
- PASS: generado por `/sa-nueva-transversal` — incluido automáticamente
|
|
78
|
+
- FAIL: si el usuario indica que usará un main.tf manual sin el bloque
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Modo: `nuevo-servicio`
|
|
83
|
+
|
|
84
|
+
Argumentos adicionales: `NOMBRE` (2°)
|
|
85
|
+
|
|
86
|
+
Lee `environments/dev.yaml` (para `PROJECT_ID`, `SUITE`, `BUSINESS_UNIT`) y `environments/shared.yaml` (para `HUB_PROJECT` = `.hub.project_id`).
|
|
87
|
+
|
|
88
|
+
Evalúa:
|
|
89
|
+
|
|
90
|
+
### G1 — Production-Ready: Secrets
|
|
91
|
+
El servicio no debe usar variables de entorno para datos sensibles. Todo debe estar en Secret Manager.
|
|
92
|
+
- WARN siempre: recordar que el secret `{NOMBRE}-dev-db-connection` debe crearse manualmente antes del primer CI/CD, referenciado desde Secret Manager — nunca como env var plana.
|
|
93
|
+
|
|
94
|
+
### G2 — Production-Ready: Estructura K8s
|
|
95
|
+
El repo del servicio debe tener `k8s/base/` y `k8s/overlays/{env}/`.
|
|
96
|
+
- WARN: no verificable sin acceso al repo del servicio. Indicar al usuario que confirme antes de ejecutar `/sa-nuevo-servicio`.
|
|
97
|
+
|
|
98
|
+
### G3 — Production-Ready: Migraciones
|
|
99
|
+
Las migraciones de schema deben ser containerizadas (EF Core `MigrateAsync` en startup, Prisma, Liquibase). Prohibido migraciones manuales o SQL suelto.
|
|
100
|
+
- WARN: no verificable sin acceso al repo. Indicar al usuario que confirme.
|
|
101
|
+
|
|
102
|
+
### G4 — API Guard
|
|
103
|
+
Las APIs obligatorias deben estar habilitadas en `{PROJECT_ID}`:
|
|
104
|
+
`container.googleapis.com`, `sqladmin.googleapis.com`, `pubsub.googleapis.com`, `secretmanager.googleapis.com`, `artifactregistry.googleapis.com`, `iam.googleapis.com`
|
|
105
|
+
- WARN siempre: no verificable sin acceso a GCP. Mostrar el comando:
|
|
106
|
+
```
|
|
107
|
+
gcloud services enable container.googleapis.com sqladmin.googleapis.com \
|
|
108
|
+
pubsub.googleapis.com secretmanager.googleapis.com \
|
|
109
|
+
artifactregistry.googleapis.com iam.googleapis.com \
|
|
110
|
+
--project={PROJECT_ID}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### G5 — Workload Identity Binding
|
|
114
|
+
El SA `sa-sie-{SUITE}-{nombre_sin_guiones_truncado}-cicd` se crea vía Terraform (infra-pipeline-shared). Debe existir antes del primer CI/CD.
|
|
115
|
+
- WARN: ejecutar `infra-pipeline-shared` después de agregar el servicio a `environments/shared.yaml`. Verificar con:
|
|
116
|
+
`gcloud iam service-accounts list --project={PROJECT_ID} --filter="name:{NOMBRE}"`
|
|
117
|
+
|
|
118
|
+
### G6 — AR en Hub
|
|
119
|
+
Las imágenes Docker deben pushearse a `{HUB_PROJECT}`, no a `{PROJECT_ID}`.
|
|
120
|
+
- PASS: si `environments/shared.yaml` tiene `hub.project_id` definido — el flow lo usa correctamente
|
|
121
|
+
- FAIL: si `hub.project_id` no está en `shared.yaml` — agregarlo antes de ejecutar `/sa-nuevo-servicio` o las imágenes irán al Spoke
|
|
122
|
+
|
|
123
|
+
### G7 — Immutable Artifacts
|
|
124
|
+
Una imagen por digest. No rebuild del mismo código para distintos ambientes.
|
|
125
|
+
- PASS: el pipeline usa SHA del commit como tag — inmutable por diseño
|
|
126
|
+
- WARN: si el usuario menciona querer hacer `latest` o rebuild por ambiente
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Modo: `propuesta` (texto libre)
|
|
131
|
+
|
|
132
|
+
Analiza la descripción libre y activa los guardrails relevantes que detectes. Principios a evaluar siempre:
|
|
133
|
+
|
|
134
|
+
1. ¿El cambio modifica recursos en un Host VPC project? → **FAIL automático**
|
|
135
|
+
2. ¿El cambio crea recursos GCP fuera de Terraform? → **FAIL** (Regla 1 de CLAUDE.md)
|
|
136
|
+
3. ¿El cambio agrega un Cloud SQL separado por servicio? → **WARN** — el patrón es una BD compartida `finance-dev` con schemas por servicio
|
|
137
|
+
4. ¿El cambio implica secretos como env vars? → **FAIL** — Zero-Touch Secret Policy
|
|
138
|
+
5. ¿El cambio omite actualizar `CLAUDE.md` o `docs/`? → **WARN** — Regla 2 de CLAUDE.md
|
|
139
|
+
6. ¿El cambio propone Cloud Deploy como mecanismo CD? → **WARN** — la arquitectura usa Cloud Build + kubectl; Cloud Deploy no está adoptado
|
|
140
|
+
7. ¿El cambio propone SystemJS para MFEs? → **FAIL** — la arquitectura usa ESM nativo con import maps
|
|
141
|
+
8. ¿El cambio propone secrets como JSON keys en WIF? → **FAIL** — WIF sin JSON keys es mandatorio
|
|
142
|
+
9. ¿El cambio afecta al WIF pool o el `attribute_condition`? → **FAIL** — restricción de seguridad organizacional, no eliminar
|
|
143
|
+
10. Cualquier otro principio relevante detectado en la descripción
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Formato de salida (siempre igual, sin excepciones)
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
════════════════════════════════════════════════════════
|
|
151
|
+
SIESA Foundation Sentinel — Revisión Arquitectónica
|
|
152
|
+
Modo : {MODO}
|
|
153
|
+
Contexto: {NOMBRE o resumen de la propuesta}
|
|
154
|
+
════════════════════════════════════════════════════════
|
|
155
|
+
|
|
156
|
+
GUARDRAILS EVALUADOS:
|
|
157
|
+
|
|
158
|
+
[PASS] {Nombre guardrail}
|
|
159
|
+
{Justificación en una línea}
|
|
160
|
+
|
|
161
|
+
[WARN] {Nombre guardrail}
|
|
162
|
+
→ {Qué confirmar o revisar, con comando si aplica}
|
|
163
|
+
|
|
164
|
+
[FAIL] {Nombre guardrail}
|
|
165
|
+
→ BLOQUEADO: {Razón} + {Acción requerida para desbloquear}
|
|
166
|
+
|
|
167
|
+
────────────────────────────────────────────────────────
|
|
168
|
+
VEREDICTO FINAL:
|
|
169
|
+
|
|
170
|
+
✅ APROBADO
|
|
171
|
+
Sin bloqueos. Puedes ejecutar /flow-{modo} con los argumentos dados.
|
|
172
|
+
|
|
173
|
+
⚠️ APROBADO CON ADVERTENCIAS
|
|
174
|
+
Sin bloqueos, pero confirma los [WARN] durante la ejecución del flow.
|
|
175
|
+
|
|
176
|
+
❌ BLOQUEADO
|
|
177
|
+
Resuelve todos los [FAIL] antes de ejecutar cualquier flow.
|
|
178
|
+
Items bloqueados: {lista numerada de los FAIL}
|
|
179
|
+
════════════════════════════════════════════════════════
|
|
180
|
+
```
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sa-aplicar
|
|
3
|
+
description: 'Validates pending changes, creates a conventional-format commit, pushes to main, and monitors the GitHub Actions pipeline. If the pipeline fails, diagnoses the error and repairs what it can within official guidelines. Use whenever the user wants to commit, push, and watch the deploy pipeline of business-financiero-deploy (or its mirror at _siesa-agents/devops/) in one go.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Contexto de ejecución:** este skill asume que el cwd está dentro de la carpeta del workspace de despliegue (`_siesa-agents/devops/` en Siesa-Agents tras correr `/sa-init-devops`, o la raíz de un clon directo de `architecture-sa-devops`). Las rutas relativas (`environments/`, `terraform/`, `k8s/`, `scripts/`, etc.) se resuelven contra ese cwd.
|
|
7
|
+
|
|
8
|
+
Valida, hace commit con formato convencional, push a main y monitorea el pipeline de GitHub Actions. Si el pipeline falla, diagnostica el error, repara lo que puede sin salirse de los lineamientos y consulta al usuario cuando se requiere una decisión.
|
|
9
|
+
|
|
10
|
+
**Uso:** `/sa-aplicar`
|
|
11
|
+
|
|
12
|
+
No recibe argumentos — opera sobre los cambios actuales del repositorio.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Instrucciones
|
|
17
|
+
|
|
18
|
+
### Fase 1 — Validación previa al commit
|
|
19
|
+
|
|
20
|
+
**1.1 Verificar que hay cambios para commitear**
|
|
21
|
+
|
|
22
|
+
Ejecuta `git status --short`. Si no hay archivos modificados ni untracked relevantes, informar al usuario y detener el flow.
|
|
23
|
+
|
|
24
|
+
**1.2 Detectar archivos modificados y determinar pipelines afectados**
|
|
25
|
+
|
|
26
|
+
Ejecuta `git diff --name-only HEAD` más `git ls-files --others --exclude-standard` para listar todos los cambios pendientes.
|
|
27
|
+
|
|
28
|
+
Mapea los archivos a pipelines:
|
|
29
|
+
- `environments/shared.yaml` o `terraform/environments/shared/**` → pipeline `infra-pipeline-shared`
|
|
30
|
+
- `environments/dev.yaml` o `terraform/environments/dev/**` o `k8s/overlays/dev/**` → pipeline `infra-pipeline-dev`
|
|
31
|
+
- `environments/staging.yaml` o `terraform/environments/staging/**` o `k8s/overlays/staging/**` → pipeline `infra-pipeline-staging`
|
|
32
|
+
- `environments/prod.yaml` o `terraform/environments/prod/**` o `k8s/overlays/prod/**` → pipeline `infra-pipeline-prod`
|
|
33
|
+
- Solo `.claude/commands/**`, `docs/**`, `README.md`, `CLAUDE.md`, `.gemini/**` → sin pipeline (solo docs)
|
|
34
|
+
|
|
35
|
+
**1.3 Buscar `<PLACEHOLDER>` sin resolver**
|
|
36
|
+
|
|
37
|
+
Para cada archivo `environments/*.yaml` modificado, leer el contenido y buscar la cadena `<PLACEHOLDER`. Si se encuentra alguno:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
❌ PLACEHOLDER sin resolver en {archivo}:
|
|
41
|
+
línea {N}: {contenido}
|
|
42
|
+
|
|
43
|
+
Completa los valores antes de aplicar.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Detener el flow si hay placeholders en archivos que afectan un pipeline de infraestructura.
|
|
47
|
+
|
|
48
|
+
**1.4 Validar Terraform (si hay cambios en terraform/)**
|
|
49
|
+
|
|
50
|
+
Si hay archivos modificados en `terraform/environments/`:
|
|
51
|
+
- Intentar ejecutar `terraform validate` en el directorio afectado
|
|
52
|
+
- Si `terraform` no está instalado localmente: advertir pero no bloquear ("el pipeline validará en CI")
|
|
53
|
+
- Si `terraform validate` falla: mostrar el error y detener el flow
|
|
54
|
+
|
|
55
|
+
**1.5 Verificar que CLAUDE.md fue actualizado**
|
|
56
|
+
|
|
57
|
+
Si los cambios incluyen archivos que no son solo `docs/**` o `.claude/**` y CLAUDE.md NO está entre los archivos modificados, mostrar advertencia (no bloquear):
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
⚠️ CLAUDE.md no fue actualizado. Regla 2 del repo requiere actualizar CLAUDE.md
|
|
61
|
+
en cada cambio. ¿Deseas continuar de todas formas? (s/n)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Esperar confirmación antes de continuar.
|
|
65
|
+
|
|
66
|
+
**1.6 Mostrar resumen de validación**
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
✅ Validación completa
|
|
70
|
+
|
|
71
|
+
Archivos a commitear: {N}
|
|
72
|
+
Pipelines que se dispararán: {lista o "ninguno (solo docs)"}
|
|
73
|
+
Placeholders: ninguno
|
|
74
|
+
Terraform: válido / no verificado localmente
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### Fase 2 — Commit estructurado
|
|
80
|
+
|
|
81
|
+
**2.1 Detectar el tipo de cambio automáticamente**
|
|
82
|
+
|
|
83
|
+
Basándose en los archivos modificados:
|
|
84
|
+
- Solo `docs/**`, `README.md`, `CLAUDE.md`, `.gemini/**` → tipo `docs`
|
|
85
|
+
- Nuevos archivos en `terraform/`, `environments/`, `k8s/` → tipo `feat`
|
|
86
|
+
- Modificaciones a archivos existentes de infra → tipo `fix` o `feat` según contexto
|
|
87
|
+
- Solo `.claude/commands/**` → tipo `feat`
|
|
88
|
+
- Modificaciones menores/limpieza → tipo `chore`
|
|
89
|
+
|
|
90
|
+
**2.2 Pedir resumen al usuario**
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
📝 ¿Qué se hizo? (una línea, en español):
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Leer la respuesta del usuario.
|
|
97
|
+
|
|
98
|
+
**2.3 Construir el mensaje de commit**
|
|
99
|
+
|
|
100
|
+
Formato:
|
|
101
|
+
```
|
|
102
|
+
{tipo}: {resumen del usuario}
|
|
103
|
+
|
|
104
|
+
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Donde `{tipo}` es el detectado en 2.1.
|
|
108
|
+
|
|
109
|
+
Mostrar el mensaje al usuario para confirmación:
|
|
110
|
+
```
|
|
111
|
+
Commit que se creará:
|
|
112
|
+
|
|
113
|
+
{tipo}: {resumen}
|
|
114
|
+
|
|
115
|
+
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
116
|
+
|
|
117
|
+
¿Confirmar? (s/n)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**2.4 Ejecutar el commit**
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
git add -A
|
|
124
|
+
git commit -m "{mensaje}"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Si el pre-commit hook falla: mostrar el error, NO hacer `--amend`. Pedir al usuario que corrija el problema antes de reintentar.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
### Fase 3 — Push
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
git push origin main
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Si falla:
|
|
138
|
+
- `rejected (non-fast-forward)`: ejecutar `git pull --rebase origin main` y reintentar el push una vez
|
|
139
|
+
- Cualquier otro error: mostrar el mensaje y detener el flow
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
### Fase 4 — Monitoreo del pipeline
|
|
144
|
+
|
|
145
|
+
**4.1 Identificar el run recién disparado**
|
|
146
|
+
|
|
147
|
+
Si hay pipelines esperados (detectados en Fase 1), esperar 10 segundos y ejecutar:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
gh run list --branch main --limit 5 --json databaseId,name,status,conclusion,createdAt
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Identificar los runs correspondientes a los pipelines afectados. Mostrar:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
🔍 Pipelines disparados:
|
|
157
|
+
• infra-pipeline-dev → run #12345 (queued)
|
|
158
|
+
• infra-pipeline-shared → run #12346 (queued)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Si no hay pipelines (solo docs): informar que no hay pipeline que monitorear y terminar.
|
|
162
|
+
|
|
163
|
+
**4.2 Monitorear en tiempo real**
|
|
164
|
+
|
|
165
|
+
Para cada run identificado, ejecutar en loop (cada 30 segundos):
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
gh run view {run_id} --json status,conclusion,jobs
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Mostrar progreso por job:
|
|
172
|
+
```
|
|
173
|
+
⏳ infra-pipeline-dev [2m 30s]
|
|
174
|
+
✅ load-config
|
|
175
|
+
✅ terraform-plan
|
|
176
|
+
🔄 terraform-apply (en progreso)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Continuar hasta que todos los runs tengan `status = completed`.
|
|
180
|
+
|
|
181
|
+
**4.3 Resultado final**
|
|
182
|
+
|
|
183
|
+
Si todos los pipelines terminaron con `conclusion = success`:
|
|
184
|
+
```
|
|
185
|
+
✅ DEPLOY COMPLETO
|
|
186
|
+
|
|
187
|
+
infra-pipeline-dev → success (4m 12s)
|
|
188
|
+
infra-pipeline-shared → success (1m 48s)
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Si alguno falló: ir a Fase 5.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
### Fase 5 — Diagnóstico y reparación
|
|
196
|
+
|
|
197
|
+
**5.1 Leer el log del step fallido**
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
gh run view {run_id} --log-failed
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Leer el output completo del step que falló.
|
|
204
|
+
|
|
205
|
+
**5.2 Clasificar el error**
|
|
206
|
+
|
|
207
|
+
Categorías y respuesta esperada:
|
|
208
|
+
|
|
209
|
+
| Categoría | Señales en el log | Acción |
|
|
210
|
+
|---|---|---|
|
|
211
|
+
| **Drift de Terraform** | `Error: Provider produced inconsistent final plan` o `Plan: X to add, Y to destroy` inesperado | Proponer import block o ajuste en `main.tf` → preguntar antes de aplicar |
|
|
212
|
+
| **Import faltante** | `Resource already exists` | Agregar import block al `main.tf` correspondiente → preguntar al usuario |
|
|
213
|
+
| **Error de IAM/permisos** | `403 Permission denied` o `required permission` | Listar el permiso faltante, proponer agregarlo a `deploy.roles` en el YAML → SIEMPRE preguntar antes (toca IAM compartido) |
|
|
214
|
+
| **K8s manifest inválido** | `error validating` o `unknown field` | Leer el manifiesto, corregir el campo incorrecto, re-aplicar automáticamente |
|
|
215
|
+
| **Secret no existe** | `Secret Manager: not found` | Mostrar el comando `gcloud secrets create` exacto para que el usuario lo ejecute → no continuar sin confirmación |
|
|
216
|
+
| **Timeout / error de red** | `context deadline exceeded` o `connection refused` | Reintentar el pipeline una vez con `gh run rerun {run_id}` → volver a Fase 4 |
|
|
217
|
+
| **Error desconocido** | Cualquier otro | Mostrar el log completo al usuario, explicar lo que se entiende, preguntar cómo proceder |
|
|
218
|
+
|
|
219
|
+
**5.3 Acciones que NO requieren confirmación**
|
|
220
|
+
|
|
221
|
+
- Corregir un campo inválido en un manifiesto K8s (typo, campo deprecado)
|
|
222
|
+
- Reintentar un pipeline después de timeout de red
|
|
223
|
+
|
|
224
|
+
**5.4 Acciones que SIEMPRE requieren confirmación**
|
|
225
|
+
|
|
226
|
+
- Agregar o modificar roles IAM
|
|
227
|
+
- Agregar import blocks a Terraform (pueden cambiar el state)
|
|
228
|
+
- Destruir o recrear recursos (`-/+` en el plan)
|
|
229
|
+
- Cualquier cambio que afecte recursos compartidos (WIF pool, AR repos, SAs de CI/CD)
|
|
230
|
+
|
|
231
|
+
**5.5 Si se aplica una corrección**
|
|
232
|
+
|
|
233
|
+
Volver a Fase 2 (commit de la corrección) con tipo `fix` y descripción automática del problema resuelto. Luego continuar por Fase 3 → 4.
|
|
234
|
+
|
|
235
|
+
**5.6 Límite de intentos**
|
|
236
|
+
|
|
237
|
+
Si el pipeline falla 3 veces consecutivas sin que se pueda reparar automáticamente:
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
🛑 El pipeline falló 3 veces. Intervención manual requerida.
|
|
241
|
+
|
|
242
|
+
Último error:
|
|
243
|
+
{log del step fallido}
|
|
244
|
+
|
|
245
|
+
Opciones:
|
|
246
|
+
1. Ver el run completo: gh run view {run_id} --log
|
|
247
|
+
2. Reintentarlo manualmente: gh run rerun {run_id}
|
|
248
|
+
3. Abrir en GitHub: {url del run}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Detener el flow.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
### Fase 6 — Cierre
|
|
256
|
+
|
|
257
|
+
```
|
|
258
|
+
🎉 /sa-aplicar completado
|
|
259
|
+
|
|
260
|
+
Commit: {hash corto} {mensaje}
|
|
261
|
+
Push: main → origin/main
|
|
262
|
+
Pipelines: todos exitosos
|
|
263
|
+
|
|
264
|
+
Próximo paso sugerido: {según contexto}
|
|
265
|
+
- Si fue scaffolding inicial: /sa-nuevo-servicio {nombre} {api-port} {mfe-port}
|
|
266
|
+
- Si fue un servicio nuevo: /sa-onboard-db {schema} {owner-role}
|
|
267
|
+
- Si fue un ambiente nuevo: verificar que los <PLACEHOLDER> de staging/prod.yaml estén completos
|
|
268
|
+
```
|