kcreate-scaffolding-gcp-script 0.0.0-stage → 0.2.1
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 +429 -2
- package/bin/build.js +70 -0
- package/bin/cli.js +441 -0
- package/package.json +36 -4
- package/skill/SKILL.md +262 -0
- package/skill/references/lessons-learned.md +706 -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 +596 -0
- package/skill/scripts/20_validate_file_parity.sh +107 -0
- package/skill/scripts/21_validate_project_pinning.sh +105 -0
- package/skill/scripts/22_validate_no_app_name_leftover.sh +62 -0
- package/skill/scripts/lib/common.sh +788 -0
- package/skill/scripts/run_tracking.sh +93 -0
- package/skill/templates/scaffolding.config.template +81 -0
- package/vendor/github-proyect-tracking/SKILL.md +180 -0
- package/vendor/github-proyect-tracking/references/api.md +185 -0
- package/vendor/github-proyect-tracking/references/architecture.md +171 -0
- package/vendor/github-proyect-tracking/scripts/tracking.py +214 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/__init__.py +1 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/commands.py +940 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/common.py +208 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/events.py +233 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/github.py +324 -0
- package/vendor/github-proyect-tracking/scripts/tracking_core/state.py +379 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Etapa: Pre requisitos — paso 1.
|
|
3
|
+
# Crea (o localiza, si ya existe de una corrida anterior) el archivo de
|
|
4
|
+
# configuración de esta ejecución, autodetectando lo que se pueda desde
|
|
5
|
+
# SOURCE_ENV.
|
|
6
|
+
#
|
|
7
|
+
# Uso: 01_init_config.sh <SOURCE_ENV> <NEW_ENV>
|
|
8
|
+
#
|
|
9
|
+
# Salidas (código de salida, no solo texto — para que el agente no tenga
|
|
10
|
+
# que interpretar el mensaje):
|
|
11
|
+
# 0 CONFIG_READY — no quedan campos __PENDIENTE__, se puede continuar.
|
|
12
|
+
# 2 CONFIG_PENDING — faltan campos por llenar; se listan por nombre.
|
|
13
|
+
# 1 error de uso/validación (SOURCE_ENV no existe, NEW_ENV ya existe, etc.)
|
|
14
|
+
|
|
15
|
+
set -euo pipefail
|
|
16
|
+
|
|
17
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
18
|
+
# shellcheck source=lib/common.sh
|
|
19
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
20
|
+
|
|
21
|
+
SOURCE_ENV="${1:-}"
|
|
22
|
+
NEW_ENV="${2:-}"
|
|
23
|
+
[[ -n "$SOURCE_ENV" && -n "$NEW_ENV" ]] || ksc_die "uso: 01_init_config.sh <SOURCE_ENV> <NEW_ENV>"
|
|
24
|
+
|
|
25
|
+
REPO_ROOT="$(ksc_repo_root)"
|
|
26
|
+
SOURCE_DIR="$REPO_ROOT/live/$SOURCE_ENV"
|
|
27
|
+
NEW_DIR="$REPO_ROOT/live/$NEW_ENV"
|
|
28
|
+
|
|
29
|
+
[[ -f "$SOURCE_DIR/project/terragrunt.hcl" ]] || ksc_die \
|
|
30
|
+
"SOURCE_ENV '$SOURCE_ENV' no existe (no se encontró $SOURCE_DIR/project/terragrunt.hcl)"
|
|
31
|
+
[[ "$NEW_ENV" =~ ^[a-z0-9]+-(qa|prod)$ ]] || ksc_die \
|
|
32
|
+
"NEW_ENV '$NEW_ENV' no cumple el patrón <app>-<entorno>, minúsculas, entorno = qa|prod"
|
|
33
|
+
|
|
34
|
+
CONFIG_FILE="$(ksc_config_path "$REPO_ROOT" "$NEW_ENV")"
|
|
35
|
+
mkdir -p "$(dirname "$CONFIG_FILE")"
|
|
36
|
+
|
|
37
|
+
# Si live/<NEW_ENV>/ ya existe PERO el config de esta ejecución todavía
|
|
38
|
+
# no, puede ser (a) una colisión real (otra cosa ocupa ese nombre) o (b)
|
|
39
|
+
# un rescate legítimo cuyo config se perdió — ej. alguien corrió
|
|
40
|
+
# `uninstall.sh --clean-gitignore`, que borra `.kcreate-scaffolding/`
|
|
41
|
+
# completa, con un build a medias todavía en `live/` (Review V3, P-2:
|
|
42
|
+
# antes esto SIEMPRE moría como colisión, incluso cuando era claramente
|
|
43
|
+
# un rescate, y no había forma automática de recuperarlo). Se distinguen
|
|
44
|
+
# por una firma mínima: si `project.hcl` existe y su `project_id` es
|
|
45
|
+
# exactamente `NEW_ENV`, es la huella que este mismo skill deja siempre
|
|
46
|
+
# (ver build_project_hcl) — se trata como rescate (regenerar el config
|
|
47
|
+
# desde cero) en vez de colisión. Cualquier otra cosa sí se trata como
|
|
48
|
+
# colisión real y se detiene.
|
|
49
|
+
if [[ -d "$NEW_DIR" && ! -f "$CONFIG_FILE" ]]; then
|
|
50
|
+
RESCUE_PROJECT_ID=""
|
|
51
|
+
[[ -f "$NEW_DIR/project.hcl" ]] && RESCUE_PROJECT_ID="$(ksc_hcl_get "$NEW_DIR/project.hcl" project_id)"
|
|
52
|
+
if [[ "$RESCUE_PROJECT_ID" == "$NEW_ENV" ]]; then
|
|
53
|
+
ksc_info "$NEW_DIR ya existe sin config (se perdió, ej. por un uninstall --clean-gitignore) pero tiene la firma de haber sido generado por este skill (project.hcl con project_id=\"$NEW_ENV\") — se trata como rescate: regenerando el config desde cero."
|
|
54
|
+
else
|
|
55
|
+
ksc_die "NEW_ENV '$NEW_ENV' ya existe en $NEW_DIR pero no hay un config de este skill para esa ejecución ($CONFIG_FILE no existe), y $NEW_DIR/project.hcl no tiene la firma de haber sido generado por este skill — parece una colisión real con otra cosa, no se sobreescribe. Si es intencional, bórralo tú mismo primero (este skill nunca borra)."
|
|
56
|
+
fi
|
|
57
|
+
fi
|
|
58
|
+
if [[ -d "$NEW_DIR" && -f "$CONFIG_FILE" ]]; then
|
|
59
|
+
ksc_info "$NEW_DIR ya existe (reintento de una corrida anterior) — no es un error, continuando con el config existente."
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
GITIGNORE="$REPO_ROOT/.gitignore"
|
|
63
|
+
if ! grep -qxF '.kcreate-scaffolding/' "$GITIGNORE" 2>/dev/null; then
|
|
64
|
+
printf '\n# kcreate-scaffolding-gcp-script: configuracion de ejecucion, no comitear\n.kcreate-scaffolding/\n' >> "$GITIGNORE"
|
|
65
|
+
ksc_info "agregado .kcreate-scaffolding/ a $GITIGNORE"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
if [[ -f "$CONFIG_FILE" ]]; then
|
|
69
|
+
ksc_info "ya existe un archivo de configuración de una corrida anterior: $CONFIG_FILE"
|
|
70
|
+
ksc_info "no se vuelve a generar (reanudación) — usa 02_print_config.sh para revisarlo."
|
|
71
|
+
else
|
|
72
|
+
ksc_info "generando $CONFIG_FILE desde la plantilla y autodetectando valores de $SOURCE_ENV ..."
|
|
73
|
+
|
|
74
|
+
sed -e "s/__SOURCE_ENV__/$SOURCE_ENV/" -e "s/__NEW_ENV__/$NEW_ENV/" \
|
|
75
|
+
"$SCRIPT_DIR/../templates/scaffolding.config.template" > "$CONFIG_FILE"
|
|
76
|
+
|
|
77
|
+
PROJECT_NAME_GUESS="$(ksc_infer_project_name "$NEW_ENV")"
|
|
78
|
+
sed -i "s/^PROJECT_NAME=\"__PENDIENTE__\"/PROJECT_NAME=\"$PROJECT_NAME_GUESS\"/" "$CONFIG_FILE"
|
|
79
|
+
|
|
80
|
+
ORG_ID="$(ksc_hcl_get "$SOURCE_DIR/project/terragrunt.hcl" org_id)"
|
|
81
|
+
ORG_BILLING_ACCOUNT="$(ksc_hcl_get "$SOURCE_DIR/project/terragrunt.hcl" org_billing_account)"
|
|
82
|
+
REGION="$(ksc_hcl_get "$SOURCE_DIR/project.hcl" region)"
|
|
83
|
+
ZONE="$(ksc_hcl_get "$SOURCE_DIR/project.hcl" zone)"
|
|
84
|
+
LABEL_OWNER="$(ksc_hcl_get "$SOURCE_DIR/project/terragrunt.hcl" owner)"
|
|
85
|
+
GITHUB_ORG="$(ksc_hcl_get "$SOURCE_DIR/github_workload_identity/terragrunt.hcl" github_organization)"
|
|
86
|
+
GKE_VERSION="$(ksc_hcl_get "$SOURCE_DIR/gke_private/terragrunt.hcl" gke_version)"
|
|
87
|
+
DB_VERSION="$(ksc_hcl_get "$SOURCE_DIR/sql_postgres/terragrunt.hcl" database_version)"
|
|
88
|
+
|
|
89
|
+
# authorized_networks fijos (todo lo que NO empiece con "dev-"): se extraen
|
|
90
|
+
# de entradas en una sola línea como
|
|
91
|
+
# `{ name = "cloudadmin", address = "1.2.3.4/32" },` (formato real de
|
|
92
|
+
# todos los entornos existentes). Portable (grep+sed), sin depender de
|
|
93
|
+
# extensiones de gawk.
|
|
94
|
+
FIXED_NETWORKS=""
|
|
95
|
+
if [[ -f "$SOURCE_DIR/sql_postgres/terragrunt.hcl" ]]; then
|
|
96
|
+
while IFS= read -r line; do
|
|
97
|
+
name="$(printf '%s' "$line" | grep -oE 'name[[:space:]]*=[[:space:]]*"[^"]*"' | sed -E 's/.*"([^"]*)"/\1/')"
|
|
98
|
+
addr="$(printf '%s' "$line" | grep -oE 'address[[:space:]]*=[[:space:]]*"[^"]*"' | sed -E 's/.*"([^"]*)"/\1/')"
|
|
99
|
+
[[ -n "$name" && -n "$addr" ]] || continue
|
|
100
|
+
[[ "$name" == dev-* ]] && continue
|
|
101
|
+
FIXED_NETWORKS="${FIXED_NETWORKS}${FIXED_NETWORKS:+;}${name}=${addr}"
|
|
102
|
+
done < <(grep -E '\{[[:space:]]*name[[:space:]]*=' "$SOURCE_DIR/sql_postgres/terragrunt.hcl")
|
|
103
|
+
fi
|
|
104
|
+
|
|
105
|
+
# SI hay una mayoría CLARA (>mitad de los entornos reales) para una IP
|
|
106
|
+
# fija y SOURCE_ENV tiene un valor distinto para ese mismo nombre,
|
|
107
|
+
# preferir el valor mayoritario en vez de propagar lo que probablemente
|
|
108
|
+
# sea un typo (Review V2, N-6: antes el doctor avisaba del typo de
|
|
109
|
+
# xoloshop-qa pero el config igual terminaba con el valor roto).
|
|
110
|
+
BEST_NET=""; BEST_N=0; TOTAL_REAL_ENVS=0
|
|
111
|
+
read -r BEST_NET BEST_N TOTAL_REAL_ENVS < <(ksc_majority_fixed_network "$REPO_ROOT")
|
|
112
|
+
if [[ -n "$BEST_NET" && "$BEST_N" -gt $((TOTAL_REAL_ENVS / 2)) ]]; then
|
|
113
|
+
BEST_NAME="${BEST_NET%%=*}"
|
|
114
|
+
SOURCE_VALUE_FOR_NAME="$(tr ';' '\n' <<<"$FIXED_NETWORKS" | grep "^${BEST_NAME}=" || true)"
|
|
115
|
+
if [[ -n "$SOURCE_VALUE_FOR_NAME" && "$SOURCE_VALUE_FOR_NAME" != "$BEST_NET" ]]; then
|
|
116
|
+
FIXED_NETWORKS="$(tr ';' '\n' <<<"$FIXED_NETWORKS" | { grep -v "^${BEST_NAME}=" || true; } | paste -sd ';' -)"
|
|
117
|
+
FIXED_NETWORKS="${FIXED_NETWORKS}${FIXED_NETWORKS:+;}${BEST_NET}"
|
|
118
|
+
ksc_warn "$SOURCE_ENV tiene '$SOURCE_VALUE_FOR_NAME' pero $BEST_N/$TOTAL_REAL_ENVS entornos reales usan '$BEST_NET' — se adoptó el valor mayoritario en FIXED_ADMIN_NETWORKS en vez del de $SOURCE_ENV (probable typo, ver lessons-learned.md A4). Corrígelo a mano en el config si el valor de $SOURCE_ENV era el correcto a propósito."
|
|
119
|
+
fi
|
|
120
|
+
fi
|
|
121
|
+
|
|
122
|
+
for pair in "ORG_ID:$ORG_ID" "ORG_BILLING_ACCOUNT:$ORG_BILLING_ACCOUNT" \
|
|
123
|
+
"REGION:$REGION" "ZONE:$ZONE" "LABEL_OWNER:$LABEL_OWNER" \
|
|
124
|
+
"GITHUB_ORGANIZATION:$GITHUB_ORG" \
|
|
125
|
+
"GKE_VERSION_NEEDS_VERIFICATION:$GKE_VERSION" \
|
|
126
|
+
"DATABASE_VERSION_NEEDS_VERIFICATION:$DB_VERSION" \
|
|
127
|
+
"FIXED_ADMIN_NETWORKS:$FIXED_NETWORKS"; do
|
|
128
|
+
key="${pair%%:*}"; val="${pair#*:}"
|
|
129
|
+
if [[ -n "$val" ]]; then
|
|
130
|
+
val_escaped="$(printf '%s' "$val" | sed -e 's/[\/&]/\\&/g')"
|
|
131
|
+
sed -i "s/^${key}=\"__PENDIENTE__\"/${key}=\"${val_escaped}\"/" "$CONFIG_FILE"
|
|
132
|
+
else
|
|
133
|
+
ksc_warn "no se pudo autodetectar $key desde $SOURCE_ENV — queda __PENDIENTE__"
|
|
134
|
+
fi
|
|
135
|
+
done
|
|
136
|
+
|
|
137
|
+
ksc_ok "config generado en $CONFIG_FILE"
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
PENDING=$(ksc_config_pending_fields "$CONFIG_FILE" || true)
|
|
141
|
+
if [[ -n "$PENDING" ]]; then
|
|
142
|
+
echo
|
|
143
|
+
ksc_warn "CONFIG_PENDING — faltan estos campos en $CONFIG_FILE:"
|
|
144
|
+
echo "$PENDING" | sed 's/^/ - /'
|
|
145
|
+
echo
|
|
146
|
+
echo "Llénalos y vuelve a correr este mismo script para confirmar que ya quedó completo."
|
|
147
|
+
exit 2
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
ksc_ok "CONFIG_READY — $CONFIG_FILE no tiene campos pendientes."
|
|
151
|
+
echo "$CONFIG_FILE"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Etapa: Pre requisitos — paso 2.
|
|
3
|
+
# Solo imprime el contenido completo del archivo de configuración para que
|
|
4
|
+
# el agente lo muestre al humano y pida confirmación explícita antes de
|
|
5
|
+
# construir nada. Este script NUNCA decide por sí mismo si los datos son
|
|
6
|
+
# correctos — esa es una pregunta que el agente debe hacerle al humano
|
|
7
|
+
# textualmente, y detenerse si la respuesta es "no".
|
|
8
|
+
#
|
|
9
|
+
# Uso: 02_print_config.sh <NEW_ENV>
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
# shellcheck source=lib/common.sh
|
|
15
|
+
source "$SCRIPT_DIR/lib/common.sh"
|
|
16
|
+
|
|
17
|
+
NEW_ENV="${1:-}"
|
|
18
|
+
[[ -n "$NEW_ENV" ]] || ksc_die "uso: 02_print_config.sh <NEW_ENV>"
|
|
19
|
+
|
|
20
|
+
REPO_ROOT="$(ksc_repo_root)"
|
|
21
|
+
CONFIG_FILE="$(ksc_config_path "$REPO_ROOT" "$NEW_ENV")"
|
|
22
|
+
[[ -f "$CONFIG_FILE" ]] || ksc_die \
|
|
23
|
+
"no existe $CONFIG_FILE — corre primero 01_init_config.sh <SOURCE_ENV> $NEW_ENV"
|
|
24
|
+
|
|
25
|
+
PENDING=$(ksc_config_pending_fields "$CONFIG_FILE" || true)
|
|
26
|
+
if [[ -n "$PENDING" ]]; then
|
|
27
|
+
ksc_die "este archivo todavía tiene campos __PENDIENTE__ — no se puede confirmar así. Corre 01_init_config.sh de nuevo después de llenarlos."
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# shellcheck disable=SC1090
|
|
31
|
+
source "$CONFIG_FILE"
|
|
32
|
+
|
|
33
|
+
# Persistir también los WARN del doctor (no solo los de la Construcción):
|
|
34
|
+
# si la sesión muere entre este paso y 10_build_components.sh, no se
|
|
35
|
+
# pierden (Review V2, N-5). Se trunca aquí porque cada corrida de 02
|
|
36
|
+
# vuelve a mostrar el estado completo desde cero; 10_build_components.sh
|
|
37
|
+
# hace APPEND sobre este mismo archivo, nunca lo trunca, para no perder
|
|
38
|
+
# lo que el doctor ya escribió.
|
|
39
|
+
export KSC_WARNINGS_FILE="$(ksc_warnings_file_path "$REPO_ROOT" "$NEW_ENV")"
|
|
40
|
+
: > "$KSC_WARNINGS_FILE"
|
|
41
|
+
|
|
42
|
+
# "Doctor" de SOURCE_ENV (ver lib/common.sh:ksc_check_source_health):
|
|
43
|
+
# avisa ANTES de que el humano confirme si SOURCE_ENV le falta algo que
|
|
44
|
+
# el entorno más reciente/mayoritario de live/ ya tiene (API de
|
|
45
|
+
# project_services, entradas de org_policies, IP fija de cloudadmin).
|
|
46
|
+
ksc_check_source_health "$REPO_ROOT" "$SOURCE_ENV"
|
|
47
|
+
echo
|
|
48
|
+
|
|
49
|
+
echo "=================================================================="
|
|
50
|
+
echo " Configuración completa para NEW_ENV=$NEW_ENV"
|
|
51
|
+
echo " Archivo: $CONFIG_FILE"
|
|
52
|
+
echo "=================================================================="
|
|
53
|
+
cat "$CONFIG_FILE"
|
|
54
|
+
echo "=================================================================="
|
|
55
|
+
echo
|
|
56
|
+
echo "AGENTE: muestra este contenido completo al humano tal cual y"
|
|
57
|
+
echo "pregúntale explícitamente si los datos son correctos. Si dice que"
|
|
58
|
+
echo "NO, DETENTE por completo — no corrijas nada por tu cuenta, no sigas"
|
|
59
|
+
echo "a la etapa de Construcción. Si dice que SÍ, continúa con"
|
|
60
|
+
echo "10_build_components.sh."
|