@cristiancorreau/forge 2.9.7 → 2.9.9
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/CHANGELOG.md +14 -0
- package/README.md +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/generate.js +1 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/lib/generators/codex.d.ts.map +1 -1
- package/dist/lib/generators/codex.js +10 -8
- package/dist/lib/generators/codex.js.map +1 -1
- package/dist/lib/generators/kiro.d.ts +1 -1
- package/dist/lib/generators/kiro.d.ts.map +1 -1
- package/dist/lib/generators/kiro.js +15 -16
- package/dist/lib/generators/kiro.js.map +1 -1
- package/dist/lib/generators/opencode.d.ts.map +1 -1
- package/dist/lib/generators/opencode.js +13 -12
- package/dist/lib/generators/opencode.js.map +1 -1
- package/dist/tui/dashboard.d.ts.map +1 -1
- package/dist/tui/dashboard.js +35 -2
- package/dist/tui/dashboard.js.map +1 -1
- package/dist/tui/wizard.d.ts.map +1 -1
- package/dist/tui/wizard.js +119 -89
- package/dist/tui/wizard.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/assets/adapters/codex/hooks/codex.yaml.tpl +0 -43
- package/assets/adapters/codex/hooks/forge-codex-finish.sh +0 -158
- package/assets/adapters/codex/hooks/forge-codex-start.sh +0 -186
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Forge v2 — Codex onStart hook: forge-codex-start.sh
|
|
3
|
-
#
|
|
4
|
-
# Se ejecuta al inicio de cada sesión de Codex CLI.
|
|
5
|
-
# Equivalente al hook session-start.sh de Claude Code (UserPromptSubmit).
|
|
6
|
-
#
|
|
7
|
-
# DIFERENCIAS vs Claude Code:
|
|
8
|
-
# - Claude Code: session-start.sh corre en UserPromptSubmit (automático en cada sesión).
|
|
9
|
-
# - Codex CLI: este script corre en onStart (automático también, pero el timing
|
|
10
|
-
# exacto depende de la versión de Codex).
|
|
11
|
-
# - Claude Code: puede bloquear (exit 2) para detener la sesión.
|
|
12
|
-
# - Codex CLI: onStart no puede bloquear la sesión — solo puede imprimir advertencias.
|
|
13
|
-
# Exit 2 aquí no impide que Codex continúe; es informacional.
|
|
14
|
-
#
|
|
15
|
-
# LIMITACIONES de Codex vs Claude Code:
|
|
16
|
-
# - No hay PreToolUse: no se puede interceptar comandos individuales antes de ejecutarlos.
|
|
17
|
-
# - No hay PostToolUse: no se puede inspeccionar el resultado de cada tool call.
|
|
18
|
-
# - Las reglas de seguridad (pre-bash-check, branch guard) son instruccionales en
|
|
19
|
-
# AGENTS.md, no mecánicas. El agente debe respetar las reglas voluntariamente.
|
|
20
|
-
#
|
|
21
|
-
# Instalación: este script debe copiarse o enlazarse en .codex/forge-codex-start.sh
|
|
22
|
-
# El setup-codex.sh lo hace automáticamente.
|
|
23
|
-
|
|
24
|
-
set -uo pipefail
|
|
25
|
-
|
|
26
|
-
CHECKS_PASSED=0
|
|
27
|
-
CHECKS_TOTAL=0
|
|
28
|
-
OUTPUT=""
|
|
29
|
-
|
|
30
|
-
check() {
|
|
31
|
-
local name="$1"
|
|
32
|
-
local result="$2" # "ok" | "warn: <msg>" | "error: <msg>"
|
|
33
|
-
CHECKS_TOTAL=$((CHECKS_TOTAL + 1))
|
|
34
|
-
if [[ "$result" == "ok" ]]; then
|
|
35
|
-
CHECKS_PASSED=$((CHECKS_PASSED + 1))
|
|
36
|
-
elif [[ "$result" == error:* ]]; then
|
|
37
|
-
local msg="${result#error: }"
|
|
38
|
-
OUTPUT+=" error: ${msg}\n"
|
|
39
|
-
else
|
|
40
|
-
local msg="${result#warn: }"
|
|
41
|
-
OUTPUT+=" warn: ${msg}\n"
|
|
42
|
-
fi
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
# ---------------------------------------------------------------------------
|
|
46
|
-
# Check 1 — Herramientas básicas disponibles
|
|
47
|
-
# ---------------------------------------------------------------------------
|
|
48
|
-
if ! command -v git &>/dev/null; then
|
|
49
|
-
check "git" "error: git no está instalado o no está en PATH"
|
|
50
|
-
else
|
|
51
|
-
check "git" "ok"
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
if ! command -v python3 &>/dev/null; then
|
|
55
|
-
check "python3" "error: python3 no está instalado o no está en PATH"
|
|
56
|
-
else
|
|
57
|
-
check "python3" "ok"
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
|
-
# ---------------------------------------------------------------------------
|
|
61
|
-
# Check 2 — Branch actual no es main/master
|
|
62
|
-
# ---------------------------------------------------------------------------
|
|
63
|
-
CURRENT_BRANCH="$(git branch --show-current 2>/dev/null || true)"
|
|
64
|
-
if [[ "$CURRENT_BRANCH" == "main" || "$CURRENT_BRANCH" == "master" ]]; then
|
|
65
|
-
check "branch" "warn: branch '${CURRENT_BRANCH}' — crea una feature branch antes de implementar: git checkout -b feature/<tema>-$(date +%Y-%m-%d)"
|
|
66
|
-
else
|
|
67
|
-
check "branch" "ok"
|
|
68
|
-
fi
|
|
69
|
-
|
|
70
|
-
# ---------------------------------------------------------------------------
|
|
71
|
-
# Check 3 — Cambios sin commitear
|
|
72
|
-
# ---------------------------------------------------------------------------
|
|
73
|
-
GIT_STATUS="$(git status --short 2>/dev/null || true)"
|
|
74
|
-
if [[ -n "$GIT_STATUS" ]]; then
|
|
75
|
-
check "uncommitted" "warn: cambios sin commitear en el worktree"
|
|
76
|
-
else
|
|
77
|
-
check "uncommitted" "ok"
|
|
78
|
-
fi
|
|
79
|
-
|
|
80
|
-
# ---------------------------------------------------------------------------
|
|
81
|
-
# Check 4 — project.yaml existe
|
|
82
|
-
# ---------------------------------------------------------------------------
|
|
83
|
-
PROJECT_YAML=""
|
|
84
|
-
SEARCH_PATH="$(pwd)"
|
|
85
|
-
for _i in 1 2 3 4 5 6; do
|
|
86
|
-
if [[ -f "${SEARCH_PATH}/project.yaml" ]]; then
|
|
87
|
-
PROJECT_YAML="${SEARCH_PATH}/project.yaml"
|
|
88
|
-
break
|
|
89
|
-
fi
|
|
90
|
-
PARENT="$(dirname "$SEARCH_PATH")"
|
|
91
|
-
[[ "$PARENT" == "$SEARCH_PATH" ]] && break
|
|
92
|
-
SEARCH_PATH="$PARENT"
|
|
93
|
-
done
|
|
94
|
-
|
|
95
|
-
if [[ -z "$PROJECT_YAML" ]]; then
|
|
96
|
-
check "project.yaml" "warn: project.yaml no encontrado — ejecutar forge-wizard.py o scripts/setup-codex.sh"
|
|
97
|
-
else
|
|
98
|
-
check "project.yaml" "ok"
|
|
99
|
-
|
|
100
|
-
# Check 5 — project.yaml tiene campos requeridos
|
|
101
|
-
YAML_VALID="$(python3 - "$PROJECT_YAML" <<'PYEOF'
|
|
102
|
-
import sys, yaml
|
|
103
|
-
path = sys.argv[1]
|
|
104
|
-
try:
|
|
105
|
-
with open(path) as f:
|
|
106
|
-
data = yaml.safe_load(f)
|
|
107
|
-
if not isinstance(data, dict):
|
|
108
|
-
print("invalid")
|
|
109
|
-
sys.exit(0)
|
|
110
|
-
missing = []
|
|
111
|
-
project = data.get("project", {})
|
|
112
|
-
if not project.get("name"):
|
|
113
|
-
missing.append("project.name")
|
|
114
|
-
if not project.get("mode"):
|
|
115
|
-
missing.append("project.mode")
|
|
116
|
-
if missing:
|
|
117
|
-
print("missing:" + ",".join(missing))
|
|
118
|
-
else:
|
|
119
|
-
print("ok")
|
|
120
|
-
except Exception as e:
|
|
121
|
-
print(f"error:{e}")
|
|
122
|
-
PYEOF
|
|
123
|
-
)"
|
|
124
|
-
if [[ "$YAML_VALID" == "ok" ]]; then
|
|
125
|
-
check "project.yaml.fields" "ok"
|
|
126
|
-
elif [[ "$YAML_VALID" == missing:* ]]; then
|
|
127
|
-
MISSING_FIELDS="${YAML_VALID#missing:}"
|
|
128
|
-
check "project.yaml.fields" "warn: project.yaml faltan campos: ${MISSING_FIELDS}"
|
|
129
|
-
else
|
|
130
|
-
check "project.yaml.fields" "warn: project.yaml no se pudo parsear — verificar sintaxis"
|
|
131
|
-
fi
|
|
132
|
-
|
|
133
|
-
# Check 6 — Variables de entorno de producción activas
|
|
134
|
-
HAS_DEPLOY="$(python3 - "$PROJECT_YAML" <<'PYEOF'
|
|
135
|
-
import sys, yaml
|
|
136
|
-
path = sys.argv[1]
|
|
137
|
-
try:
|
|
138
|
-
with open(path) as f:
|
|
139
|
-
data = yaml.safe_load(f)
|
|
140
|
-
if isinstance(data, dict) and data.get("deploy"):
|
|
141
|
-
print("yes")
|
|
142
|
-
else:
|
|
143
|
-
print("no")
|
|
144
|
-
except Exception:
|
|
145
|
-
print("no")
|
|
146
|
-
PYEOF
|
|
147
|
-
)"
|
|
148
|
-
if [[ "$HAS_DEPLOY" == "yes" ]]; then
|
|
149
|
-
PROD_VARS=""
|
|
150
|
-
while IFS='=' read -r key _value; do
|
|
151
|
-
if [[ "$key" =~ ^(PROD_|PRODUCTION_|PROD$|PRODUCTION$) ]]; then
|
|
152
|
-
PROD_VARS+="${key} "
|
|
153
|
-
fi
|
|
154
|
-
done < <(env)
|
|
155
|
-
if [[ -n "$PROD_VARS" ]]; then
|
|
156
|
-
check "prod-env" "warn: variables de producción activas en sesión: ${PROD_VARS// /, } — verificar que es intencional"
|
|
157
|
-
else
|
|
158
|
-
check "prod-env" "ok"
|
|
159
|
-
fi
|
|
160
|
-
else
|
|
161
|
-
check "prod-env" "ok"
|
|
162
|
-
fi
|
|
163
|
-
fi
|
|
164
|
-
|
|
165
|
-
# ---------------------------------------------------------------------------
|
|
166
|
-
# Salida
|
|
167
|
-
# ---------------------------------------------------------------------------
|
|
168
|
-
WARNINGS=$((CHECKS_TOTAL - CHECKS_PASSED))
|
|
169
|
-
|
|
170
|
-
if [[ $WARNINGS -eq 0 ]]; then
|
|
171
|
-
# Silencioso — todo OK
|
|
172
|
-
exit 0
|
|
173
|
-
fi
|
|
174
|
-
|
|
175
|
-
# Construir etiquetas para el resumen
|
|
176
|
-
LABELS=""
|
|
177
|
-
[[ "$CURRENT_BRANCH" == "main" || "$CURRENT_BRANCH" == "master" ]] && LABELS+="[branch ${CURRENT_BRANCH}] "
|
|
178
|
-
[[ -n "$GIT_STATUS" ]] && LABELS+="[cambios sin commitear] "
|
|
179
|
-
[[ -z "$PROJECT_YAML" ]] && LABELS+="[sin project.yaml] "
|
|
180
|
-
|
|
181
|
-
printf "forge-codex session: %d advertencia(s) — %s\n" "$WARNINGS" "${LABELS%% }"
|
|
182
|
-
printf "%b" "$OUTPUT"
|
|
183
|
-
|
|
184
|
-
# Nota: en Codex CLI, onStart no puede bloquear la sesión.
|
|
185
|
-
# Salimos con 0 siempre — las advertencias son informacionales.
|
|
186
|
-
exit 0
|