@cristiancorreau/forge 2.9.12 → 2.10.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.
Files changed (61) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +8 -3
  3. package/assets/adapters/claude-code/commands/session-close.md +5 -106
  4. package/assets/adapters/claude-code/commands/session-start.md +5 -56
  5. package/assets/adapters/codex/HOOKS.md +55 -0
  6. package/assets/adapters/codex/commands/session-close.md +5 -45
  7. package/assets/adapters/codex/commands/session-start.md +6 -41
  8. package/assets/adapters/opencode/HOOKS.md +31 -3
  9. package/assets/adapters/opencode/commands/session-close.md +5 -106
  10. package/assets/adapters/opencode/commands/session-start.md +6 -57
  11. package/assets/core/hooks/hooks-registry.yaml +18 -31
  12. package/assets/core/hooks/pre-edit-check.js +108 -0
  13. package/assets/core/schemas/project.schema.json +5 -0
  14. package/assets/core/skills/README.md +9 -0
  15. package/assets/core/skills/session-close/SKILL.md +137 -0
  16. package/assets/core/skills/session-start/SKILL.md +86 -0
  17. package/assets/manifest.json +1 -1
  18. package/dist/cli.js +12 -1
  19. package/dist/cli.js.map +1 -1
  20. package/dist/commands/audit.d.ts.map +1 -1
  21. package/dist/commands/audit.js +11 -0
  22. package/dist/commands/audit.js.map +1 -1
  23. package/dist/commands/generate.d.ts.map +1 -1
  24. package/dist/commands/generate.js +28 -5
  25. package/dist/commands/generate.js.map +1 -1
  26. package/dist/commands/init.d.ts.map +1 -1
  27. package/dist/commands/init.js +40 -4
  28. package/dist/commands/init.js.map +1 -1
  29. package/dist/commands/scaffold.d.ts.map +1 -1
  30. package/dist/commands/scaffold.js +107 -4
  31. package/dist/commands/scaffold.js.map +1 -1
  32. package/dist/commands/session.d.ts +3 -0
  33. package/dist/commands/session.d.ts.map +1 -0
  34. package/dist/commands/session.js +78 -0
  35. package/dist/commands/session.js.map +1 -0
  36. package/dist/commands/validate.d.ts.map +1 -1
  37. package/dist/commands/validate.js +27 -1
  38. package/dist/commands/validate.js.map +1 -1
  39. package/dist/lib/catalog.d.ts.map +1 -1
  40. package/dist/lib/catalog.js +2 -0
  41. package/dist/lib/catalog.js.map +1 -1
  42. package/dist/lib/generators/codex.d.ts +1 -0
  43. package/dist/lib/generators/codex.d.ts.map +1 -1
  44. package/dist/lib/generators/codex.js +13 -3
  45. package/dist/lib/generators/codex.js.map +1 -1
  46. package/dist/lib/generators/kiro.d.ts +2 -0
  47. package/dist/lib/generators/kiro.d.ts.map +1 -1
  48. package/dist/lib/generators/kiro.js +32 -0
  49. package/dist/lib/generators/kiro.js.map +1 -1
  50. package/dist/lib/generators/opencode.d.ts +9 -0
  51. package/dist/lib/generators/opencode.d.ts.map +1 -1
  52. package/dist/lib/generators/opencode.js +64 -1
  53. package/dist/lib/generators/opencode.js.map +1 -1
  54. package/dist/tui/dashboard.js +5 -3
  55. package/dist/tui/dashboard.js.map +1 -1
  56. package/dist/tui/wizard.d.ts.map +1 -1
  57. package/dist/tui/wizard.js +14 -6
  58. package/dist/tui/wizard.js.map +1 -1
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +1 -1
  61. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,6 +7,38 @@ Versioning: [Semantic Versioning](https://semver.org/lang/es/)
7
7
 
8
8
  ---
9
9
 
10
+ ## [2.10.0] — 2026-06-04
11
+
12
+ ### Agregado
13
+ - **Skills `session-start` / `session-close` centralizados** (#29). Definidos en `core/skills/`, registrados en el catálogo y expuestos por el CLI (`forge session-start` / `forge session-close`); los templates de Claude Code, OpenCode y Codex referencian el skill central en vez de duplicar la lógica.
14
+ - **Flujo de agentes Tier 3 (dominio)** (#31). El schema acepta `agents.specialized`; `forge scaffold --tier 3 --name <agente>` genera un agente Tier 3 conforme a `docs/agent-standard.md`; `forge validate` y `forge audit` verifican su existencia y el wizard de `forge init` los autodetecta.
15
+ - **Hooks de guardrail ejecutables en todos los runtimes** (#32). Kiro suma hooks JSON `pre-bash-check` y `post-turn-check` (además del branch-guard); OpenCode y Codex obtienen un `.githooks/pre-commit` POSIX compartido (sin Python) con branch-guard y detección de debug.
16
+ - **Barrera spec-first opt-in** (#28). Los hooks `pre-edit-check` exigen una spec `APPROVED` en `docs/specs/` (advierten por defecto; bloquean solo en `mode=enterprise`). Se agregan plantilla de PR, `CONTRIBUTING.md`, `docs/spec-gate-flow.md` y el workflow informativo `spec-gate.yml`.
17
+ - **Dogfooding: forge se auto-hostea** (#27). `project.yaml`, `CLAUDE.md`, `.forge/manifest.json` y scaffold de `docs/specs/` en la raíz, validados por el propio CLI.
18
+
19
+ ### Cambiado
20
+ - **CI principal migrado a la suite Node del CLI** (#24). `tests.yml` corre los tests del paquete publicado (Node 20/22 + Bun) en cada push/PR a `main`; el pytest legacy se movió a `tests-legacy.yml` (manual).
21
+
22
+ ### Corregido
23
+ - **`hooks-registry.yaml` apuntaba a hooks `.py` inexistentes** (#23). Ahora referencia solo los hooks `.js/.sh` que el CLI instala, restaurando el contrato "sin Python".
24
+ - **Versiones desincronizadas** (#25). `forge.py`, `manifest.json` y `packages/cli/package.json` quedan coherentes.
25
+
26
+ ### Documentación
27
+ - README: `migrate`, `scaffold` y `teardown` marcados como disponibles (#26).
28
+ - Deprecación de la CLI legacy de Python con `MIGRATION.md` y sunset en v3.0.0 (#30).
29
+
30
+ ---
31
+
32
+ ## [2.9.13] — 2026-06-04
33
+
34
+ ### Cambiado (UI)
35
+ - **Selects del wizard/dashboard: colores invertidos y más altos.** El item bajo el cursor ahora usa el fondo resaltado (`#1e3a5f`) con texto amarillo; las opciones no seleccionadas quedan sobre el fondo del panel (antes estaba al revés: el cursor se veía oscuro y el resto azul). Se agregó `itemSpacing: 1`, `showScrollIndicator` y mayor altura (`options × 3 + 1`, acotada a `BODY_H − 4`) para que cada opción tenga aire. Aplicado en `askSelect`, el welcome y el nav del dashboard. Verificado en PTY reconstruyendo el grid.
36
+
37
+ ### Deprecado
38
+ - **`forge.py` y `scripts/*.py` (CLI legacy de Python).** La CLI es 100% TypeScript desde la v2.8.0; la implementación Python queda deprecada y será **removida en v3.0.0**. Usá `npx @cristiancorreau/forge` (Node/Bun, sin dependencias de Python) para todos los comandos. Timeline y guía de migración en [MIGRATION.md](MIGRATION.md).
39
+
40
+ ---
41
+
10
42
  ## [2.9.12] — 2026-06-04
11
43
 
12
44
  ### Agregado
package/README.md CHANGED
@@ -8,6 +8,9 @@
8
8
 
9
9
  Wizard interactivo que detecta tu stack, instala agentes especializados, genera guardrails y mantiene un manifest con SHA-256 para auditar cada cambio.
10
10
 
11
+ > ⚠️ **Deprecation Notice**: `forge.py` y los scripts Python (`scripts/*.py`) están deprecados y serán removidos en **v3.0.0**.
12
+ > Usa `npx @cristiancorreau/forge` para todos los comandos (Node/Bun, sin Python). Ver [MIGRATION.md](MIGRATION.md).
13
+
11
14
  ---
12
15
 
13
16
  ## Quick start
@@ -39,7 +42,7 @@ El wizard detecta y configura el proyecto en cinco pasos:
39
42
  | SDD (Spec-Driven Development) | Flujo spec-first: ninguna tarea de código arranca sin una spec `APPROVED`. El `orchestrator` rechaza spawnear agentes sin spec aprobada; el skill `/spec` redacta specs en `docs/specs/`. | ✅ | Claude Code, OpenCode, Codex, Kiro |
40
43
  | Agentes Tier 1 (universal) | Agentes definidos por output, no por stack: `orchestrator`, `backend-engineer`, `frontend-engineer`, `test-engineer`, `docs-writer`, `compliance-reviewer`, `security-auditor`. Sirven en cualquier proyecto. | ✅ | Claude Code, OpenCode, Codex, Kiro |
41
44
  | Agentes Tier 2 (stack) | Mismo rol que Tier 1 con instrucciones del stack: Hono+Drizzle, FastAPI, Express, NestJS, Django, Go-Gin, Laravel, Rails, Next.js, Expo, Astro, SvelteKit, Nuxt/Vue, WordPress, Playwright. | ✅ | Claude Code, OpenCode, Codex, Kiro |
42
- | Agentes Tier 3 (dominio) | Agentes que conocen el negocio (`dsar-specialist`, `gcm-engineer`, `policy-engineer`, `banner-engineer`). Viven en el proyecto y se registran en `agents.specialized`. | 🚧 | Claude Code, OpenCode, Codex, Kiro |
45
+ | Agentes Tier 3 (dominio) | Agentes que conocen el negocio (`dsar-specialist`, `gcm-engineer`, `policy-engineer`, `banner-engineer`). Viven en el proyecto y se registran en `agents.specialized`. | | Claude Code, OpenCode, Codex, Kiro |
43
46
  | Hooks de guardrail (sin Python) | Guardrails de pre-edit/branch-guard, detección de debug, secretos y prod-safety, ejecutados por el runtime. | 🚧 | Claude Code, Codex, Kiro |
44
47
  | Operaciones reversibles | Manifest SHA-256 + dry-run para instalaciones reversibles y verificables. | 🚧 | Claude Code, OpenCode, Codex, Kiro |
45
48
  | Multi-runtime | Un mismo proyecto forge se adapta a varios runtimes con sus marcadores de detección y niveles de soporte. | ✅ | Claude Code (completo), OpenCode, Codex, Kiro |
@@ -50,8 +53,8 @@ El wizard detecta y configura el proyecto en cinco pasos:
50
53
  | Browser testing | Automatización de navegador (agent-browser sobre CDP) para verificar UI, flujos críticos, evidencia y diffs visuales/responsive (`/browser-test`). | ✅ | Claude Code, OpenCode, Codex, Kiro |
51
54
  | DB migrations | Flujo seguro de migraciones compatible con Prisma, Drizzle, ActiveRecord, Alembic y Goose (`/db-migrate`). | ✅ | Claude Code, OpenCode, Codex, Kiro |
52
55
  | Deploy a producción | Publicación con gate `READY/SUCCESS` sobre Vercel, Railway, Fly.io, GitHub Actions y pipelines custom (`/local2prod`). | ✅ | Claude Code, OpenCode, Codex, Kiro |
53
- | Migración v1→v2 | Portado de proyectos forge v1 a v2. Comando `migrate` aún sin portar. | | Claude Code, Kiro |
54
- | Scaffold / Teardown | Generación y desmontaje de estructura de proyecto. Comandos sin portar a la nueva CLI. | | Claude Code, OpenCode, Codex, Kiro |
56
+ | Migración v1→v2 | Migración de `project.yaml` v1 a v2 con detección automática de versión, soporte `--dry-run` y `--backup` (`forge migrate`). | | Claude Code, OpenCode, Codex, Kiro |
57
+ | Scaffold / Teardown | `forge scaffold` genera profiles Tier 2 (`--force`, `--description`, `--stack-details`) y `forge teardown` desinstala forge limpiamente vía manifest (`--dry-run`, `--keep-config`). Ambos en la CLI TypeScript con tests. | | Claude Code, OpenCode, Codex, Kiro |
55
58
 
56
59
  Leyenda: ✅ disponible · 🚧 parcial · ❌ pendiente.
57
60
 
@@ -124,6 +127,8 @@ Toda la CLI corre en Node.js. Los hooks de guardrail son JavaScript puro.
124
127
 
125
128
  No hay `pip install`, no hay `requirements.txt`, no hay dependencias de sistema fuera de Node.js 20+.
126
129
 
130
+ > El `forge.py` y los scripts `scripts/*.py` que aún viven en el repositorio son la implementación **legacy** y están **deprecados**: serán removidos en v3.0.0. No los necesitás para usar forge vía `npx @cristiancorreau/forge`. Ver [MIGRATION.md](MIGRATION.md).
131
+
127
132
  ---
128
133
 
129
134
  ## Comparativa
@@ -1,109 +1,8 @@
1
1
  # session-close
2
2
 
3
- Cierra la sesión de trabajo con un pipeline de 8 pasos: commit, changeset, GitHub Projects, daily note, release notes, close commit, sync y PR.
3
+ Cierra la sesión de trabajo con un pipeline de 8 pasos: commit changeset
4
+ GitHub Projects → daily note → RELEASE-NOTES → commit de cierre → sync → PR.
4
5
 
5
- ## Paso 1 Verificar estado
6
-
7
- Ejecutar `git status --short` y `git diff --stat HEAD 2>/dev/null`. Reportar qué hay pendiente.
8
-
9
- ## Paso 2 — Commitear cambios pendientes
10
-
11
- Si hay cambios sin commitear:
12
-
13
- - Preguntar al usuario: "¿Qué describe este commit? (usa Conventional Commits: feat/fix/chore/docs/refactor/test)"
14
- - Commitear con: `git add -A && git commit -m "<type>(<scope>): <descripción>"`
15
- - Incluir siempre en el cuerpo del commit: `Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>`
16
-
17
- Si no hay nada que commitear: indicar "Nada pendiente de commitear." y continuar.
18
-
19
- ## Paso 3 — Changeset (condicional)
20
-
21
- Si el commit del Paso 2 fue de tipo `feat:` o `fix:` Y `package.json` contiene `"@changesets/cli"`:
22
-
23
- - Ejecutar `npx changeset` para generar el changeset
24
-
25
- En cualquier otro caso, omitir este paso sin mencionarlo.
26
-
27
- ## Paso 4 — GitHub Projects (condicional)
28
-
29
- Leer `project.yaml`. Si tiene una sección `github.project` con `number`, `owner` y `repo`:
30
-
31
- - Preguntar: "¿Qué issues trabajaste en esta sesión? (números separados por coma, o Enter para saltar)"
32
- - Si el usuario provee números: ejecutar `gh issue close <N> --comment "Completado en esta sesión"` para cada uno
33
- - Mover los issues a Done en el proyecto si es posible con gh CLI
34
-
35
- Si `project.yaml` no tiene sección `github.project`: indicar "GitHub Projects no configurado en project.yaml." y continuar.
36
-
37
- ## Paso 5 — Daily note
38
-
39
- Crear el directorio `docs/daily-notes/` si no existe.
40
-
41
- Determinar:
42
- - `FECHA`: resultado de `date +%Y-%m-%d`
43
- - `TEMA`: derivado del nombre de la rama actual, eliminando el prefijo de tipo y el sufijo de fecha (ej: `feature/billing-webpay-2026-05-16` → `billing-webpay`)
44
-
45
- Crear el archivo `docs/daily-notes/FECHA-TEMA.md` con este contenido:
46
-
47
- ```
48
- # Session FECHA — TEMA
49
-
50
- ## Completado
51
- [listar qué se implementó o cambió en esta sesión]
52
-
53
- ## Archivos modificados
54
- [output de: git diff --name-only HEAD~1..HEAD 2>/dev/null || git diff --name-only HEAD 2>/dev/null]
55
-
56
- ## Commits
57
- [output de: git log --oneline HEAD~3..HEAD]
58
-
59
- ## Decisiones tomadas
60
- [preguntar al usuario: "¿Alguna decisión de diseño o arquitectura que vale registrar?"]
61
-
62
- ## Blockers para próxima sesión
63
- [preguntar al usuario: "¿Quedó algo bloqueado o incompleto?"]
64
- ```
65
-
66
- Completar las secciones "Archivos modificados" y "Commits" con los outputs reales. Completar "Completado", "Decisiones tomadas" y "Blockers" con las respuestas del usuario.
67
-
68
- ## Paso 6 — RELEASE-NOTES.md
69
-
70
- Agregar al final de `RELEASE-NOTES.md` (crear si no existe):
71
-
72
- ```
73
- ## FECHA — TEMA
74
- [resumen en una línea de qué cambió]
75
- ```
76
-
77
- Usar el resumen de la daily note para redactar la línea.
78
-
79
- ## Paso 7 — Commit de cierre
80
-
81
- Commitear los archivos generados:
82
-
83
- ```
84
- git add docs/daily-notes/ RELEASE-NOTES.md && git commit -m "docs(progress): session close FECHA — TEMA"
85
- ```
86
-
87
- ## Paso 8 — Sync y PR
88
-
89
- Ejecutar:
90
-
91
- ```
92
- git fetch origin main
93
- git log HEAD..origin/main --oneline
94
- ```
95
-
96
- - Si main tiene commits nuevos: ejecutar `git rebase origin/main` y luego `git push --force-with-lease origin <rama-actual>`
97
- - Si main no tiene cambios nuevos: ejecutar `git push -u origin <rama-actual>`
98
-
99
- Luego crear el PR:
100
-
101
- ```
102
- gh pr create --title "<resumen de cambios>" --body "<resumen de sesión tomado de la daily note>"
103
- ```
104
-
105
- Si `gh` no está disponible: hacer solo el push y recordar al usuario "Crea el PR manualmente en GitHub."
106
-
107
- ## Al finalizar el pipeline
108
-
109
- Confirmar con: "Sesión cerrada. PR creado: [URL]" o, si gh no estuvo disponible: "Sesión cerrada. Push hecho a [branch] — crea el PR en GitHub."
6
+ La lógica vive en el skill central `core/skills/session-close/SKILL.md`.
7
+ Seguí esos 8 pasos en orden. En el Paso 2, firmá el commit con el
8
+ `Co-Authored-By` del runtime activo (Claude Code).
@@ -1,59 +1,8 @@
1
1
  # session-start
2
2
 
3
- Inicializa una sesión de trabajo: detecta el estado del repo, identifica el escenario y enruta según corresponda.
3
+ Inicializa una sesión de trabajo: detecta el estado del repo, identifica el
4
+ escenario (rama activa, main con PRs, main limpio) y enruta según corresponda.
4
5
 
5
- ## Paso 1 Leer estado del repo
6
-
7
- Ejecutar los siguientes comandos y guardar sus resultados:
8
-
9
- - `git branch --show-current` → rama actual
10
- - `git status --short` → cambios sin commitear
11
- - `git log --oneline -5` → commits recientes
12
- - `gh pr list --author @me --state open --json number,title,headRefName 2>/dev/null` → PRs abiertos (saltar si gh no está disponible)
13
- - `git branch --sort=-committerdate --format='%(refname:short)' | grep -v 'HEAD' | head -8` → ramas recientes
14
-
15
- ## Paso 2 — Leer configuración del proyecto
16
-
17
- - Si existe `project.yaml` en el directorio actual, leerlo para obtener: `project.mode`, `project.name`, `stack.*`, `agents.active`
18
- - Si existe `wiki/index.md`, leerlo para obtener contexto del proyecto
19
- - Si ninguno existe, continuar con defaults: mode=startup, sin checks de compliance
20
-
21
- ## Paso 3 — Evaluar escenario y actuar
22
-
23
- ### Escenario A — Ya en una rama de feature (no es main/master/develop)
24
-
25
- - Mostrar los últimos 5 commits de esta rama para contexto
26
- - Mostrar archivos con cambios sin commitear si los hay
27
- - Reportar: "Continuando sesión en [branch]. Contexto: [mensaje del último commit]."
28
- - Preguntar: "¿Qué trabajamos hoy?"
29
-
30
- ### Escenario B — En main/master con PRs abiertos o ramas recientes de feature
31
-
32
- - Listar los PRs abiertos del Paso 1 como menú numerado
33
- - Listar las ramas recientes que no sean main/master/develop del Paso 1
34
- - Preguntar: "¿Continuás uno de estos o arrancamos algo nuevo?"
35
- - Si el usuario elige continuar uno existente: hacer checkout de esa rama
36
- - Si el usuario quiere algo nuevo: pasar al flujo del Escenario C
37
-
38
- ### Escenario C — En main/master sin trabajo previo identificado
39
-
40
- - Esperar el primer mensaje del usuario describiendo qué quiere trabajar
41
- - Antes de cualquier edición de código, proponer un nombre de rama siguiendo la convención:
42
- - `feature/<tema-corto>-$(date +%Y-%m-%d)` para features
43
- - `fix/<tema-corto>-$(date +%Y-%m-%d)` para correcciones
44
- - `chore/<tema-corto>-$(date +%Y-%m-%d)` para tareas técnicas
45
- - `docs/<tema-corto>-$(date +%Y-%m-%d)` para documentación
46
- - Crear la rama: `git checkout -b <nombre-propuesto>`
47
- - Confirmar: "Branch creada: [nombre]. Listo para trabajar."
48
-
49
- ## Paso 4 — Recordatorio de reglas de sesión
50
-
51
- Una vez determinado el escenario, enunciar estas reglas una sola vez:
52
-
53
- "Reglas de sesión: (1) No editar código en main. (2) Conventional Commits. (3) Spec antes de implementar si el proyecto es standard/enterprise. (4) Cerrar con /session-close."
54
-
55
- ## Comportamiento adaptativo
56
-
57
- - Si `gh` no está disponible: omitir los pasos que lo requieren y agregar nota "gh no disponible — revisar PRs en GitHub.com manualmente"
58
- - Si `project.yaml` no existe: continuar con defaults, no interrumpir el flujo
59
- - Si la rama actual no sigue la convención de nombres: mencionarlo pero no bloquear
6
+ La lógica vive en el skill central `core/skills/session-start/SKILL.md`.
7
+ Seguí esos pasos al pie de la letra: leer estado del repo, leer `project.yaml`,
8
+ evaluar el escenario A/B/C y enunciar las reglas de sesión una sola vez.
@@ -0,0 +1,55 @@
1
+ # Forge Hooks — Adaptación para Codex
2
+
3
+ Codex CLI no tiene un sistema de hooks de bloqueo nativo equivalente al
4
+ PreToolUse/Stop de Claude Code. Este documento describe cómo Forge aplica sus
5
+ guardrails en Codex.
6
+
7
+ > **Mecanismo de hook de este runtime:** git hooks compartidos (`.githooks/`),
8
+ > no hooks nativos. `forge generate --runtime codex` genera `.githooks/pre-commit`
9
+ > (branch guard + detección de debug). El resto de los guardrails viven como
10
+ > instrucciones en `AGENTS.md`.
11
+
12
+ ---
13
+
14
+ ## 1. Equivalencia de hooks
15
+
16
+ | Hook Forge (Claude Code) | Equivalente en Codex | Mecanismo |
17
+ |--------------------------|----------------------|-----------|
18
+ | `PreToolUse:Edit` — branch guard (bloquear edición en main) | **git pre-commit** | `.githooks/pre-commit` (automático) + AGENTS.md |
19
+ | `PreToolUse:Bash` — detección de console.log/print de debug | **git pre-commit** | `.githooks/pre-commit` (automático) + AGENTS.md |
20
+ | `PreToolUse:Bash` — bloqueo de comandos destructivos en producción | **Ninguno nativo** | Instrucción en AGENTS.md |
21
+ | `Stop` — resumen de sesión y persistencia de memoria | **Ninguno nativo** | Flujo SDD manual |
22
+
23
+ **Conclusión:** Codex no tiene hooks de bloqueo nativos. Branch guard y detección
24
+ de debug se ejecutan automáticamente vía el git hook compartido
25
+ `.githooks/pre-commit`; el resto de los guardrails se embeben como instrucciones
26
+ en AGENTS.md.
27
+
28
+ ---
29
+
30
+ ## 2. Git hook compartido (`.githooks/pre-commit`)
31
+
32
+ `forge generate` genera un hook ejecutable POSIX (sin Python) en
33
+ `.githooks/pre-commit`, idéntico al que usa OpenCode. Activalo una vez por clon:
34
+
35
+ ```sh
36
+ git config core.hooksPath .githooks
37
+ ```
38
+
39
+ Qué hace en cada `git commit`:
40
+
41
+ 1. **Branch guard** — bloquea el commit si estás en `main`/`master` y hay
42
+ archivos de código staged (los `*.md`, `*.yaml`, `*.json`, `*.txt` quedan exentos).
43
+ 2. **Debug detection** — bloquea el commit si encuentra `console.log(`,
44
+ `debugger;`, `binding.pry`, `var_dump(` o `dd(` en archivos staged.
45
+
46
+ Para saltarlo puntualmente (bajo tu responsabilidad): `git commit --no-verify`.
47
+
48
+ ---
49
+
50
+ ## 3. Guardrails que dependen del agente
51
+
52
+ El git hook solo corre en `git commit`. Los comandos destructivos en producción
53
+ (`DROP TABLE`, `TRUNCATE`, `--force-reset`, `rm -rf /`, `git push --force`) NO
54
+ los intercepta: ante cualquiera de ellos, Codex debe parar y pedir confirmación
55
+ explícita al humano. Estas reglas están documentadas en el `AGENTS.md` generado.
@@ -1,53 +1,13 @@
1
1
  ---
2
2
  name: session-close
3
- description: Template para cerrar una sesión de trabajo con Codex CLI
3
+ description: Cierra una sesión de trabajo con Codex CLI siguiendo el skill central de forge
4
4
  usage: Copia el contenido de Prompt al final de tu sesión de Codex
5
5
  ---
6
6
 
7
7
  ## Prompt para Codex
8
8
 
9
- Cierra la sesión de trabajo. Ejecuta estos checks en orden:
9
+ Cierra la sesión de trabajo siguiendo el skill central `core/skills/session-close/SKILL.md`.
10
10
 
11
- 1. **Verificar estado del trabajo**
12
- - Ejecuta `git status --short`.
13
- - Si hay cambios sin commitear: listarlos. ¿Deben commitearse o descartarse?
14
- - Ejecuta `git diff --stat HEAD` para ver el resumen de cambios en el último commit.
15
-
16
- 2. **Verificar build y tests**
17
- - Lee `project.yaml` para el comando de check configurado (`scripts.check`).
18
- - Si no hay comando configurado: ejecuta el check estándar del stack (tsc --noEmit para TypeScript, py_compile para Python).
19
- - Reporta si pasan o fallan. Si fallan, listar los errores.
20
-
21
- 3. **Verificar specs**
22
- - Lee `AGENTS.md` o `CLAUDE.md` para ver el estado de specs activas.
23
- - Lista specs en `docs/specs/` con estado `APPROVED` que no estén `IMPLEMENTED`.
24
- - ¿Hay specs en progreso que quedaron incompletas esta sesión? Reportarlas.
25
-
26
- 4. **Registrar progreso**
27
- - ¿Qué se completó en esta sesión? Lista los archivos modificados:
28
- `git diff --name-only HEAD~1 HEAD 2>/dev/null || git diff --name-only`
29
- - ¿Qué quedó pendiente?
30
- - ¿Hay bloqueadores para la próxima sesión?
31
-
32
- 5. **Verificar debug statements olvidados**
33
- - Ejecuta en archivos modificados: busca `console.log(`, `print(`, `debugger;`.
34
- - Si hay alguno: listarlos con archivo y línea.
35
-
36
- 6. **Reporte de cierre**
37
- Presenta este resumen:
38
- ```
39
- Sesión cerrada — [fecha]
40
-
41
- Completado:
42
- - [item 1]
43
- - [item 2]
44
-
45
- Pendiente para próxima sesión:
46
- - [item 1]
47
-
48
- Bloqueadores:
49
- - [item o "ninguno"]
50
-
51
- Estado del repo: [limpio | N archivos con cambios]
52
- Tests: [pasando | fallando]
53
- ```
11
+ Ejecuta su pipeline de 8 pasos en orden: commit → changeset → GitHub Projects →
12
+ daily note → RELEASE-NOTES commit de cierre → sync → PR. En el Paso 2, firma
13
+ el commit con `Co-Authored-By: Codex <noreply@openai.com>`.
@@ -1,49 +1,14 @@
1
1
  ---
2
2
  name: session-start
3
- description: Template para iniciar una sesión de trabajo con Codex CLI
3
+ description: Inicia una sesión de trabajo con Codex CLI siguiendo el skill central de forge
4
4
  usage: Copia el contenido de Prompt al inicio de tu sesión de Codex
5
5
  ---
6
6
 
7
7
  ## Prompt para Codex
8
8
 
9
- Inicia la sesión de trabajo. Ejecuta estos checks en orden y reporta el resultado:
9
+ Inicia la sesión de trabajo siguiendo el skill central `core/skills/session-start/SKILL.md`.
10
10
 
11
- 1. **Verificar herramientas disponibles**
12
- - Ejecuta `git --version` reporta la versión o error.
13
- - Ejecuta `python3 --version` reporta la versión o error.
14
- - Si alguna herramienta crítica falta, reporta el error y detente.
15
-
16
- 2. **Verificar branch actual**
17
- - Ejecuta `git branch --show-current`.
18
- - Si el resultado es `main` o `master`: advierte que estás en la branch protegida.
19
- Sugiere: `git checkout -b feature/<tema>-$(date +%Y-%m-%d)`
20
- - Si estás en una feature branch: OK.
21
-
22
- 3. **Verificar cambios sin commitear**
23
- - Ejecuta `git status --short`.
24
- - Si hay cambios: listarlos y advertir.
25
- - Si no hay cambios: OK.
26
-
27
- 4. **Verificar project.yaml**
28
- - Busca `project.yaml` en el directorio actual y directorios padre (hasta 3 niveles).
29
- - Si no existe: advierte que el proyecto no está inicializado con Forge. Sugiere ejecutar el wizard.
30
- - Si existe: lee los campos `project.name` y `project.mode`.
31
- - Si faltan esos campos: advertir.
32
- - Si están presentes: reportar nombre y modo del proyecto.
33
-
34
- 5. **Verificar variables de producción activas**
35
- - Ejecuta `env | grep -iE '^(PROD_|PRODUCTION_)'`.
36
- - Si hay variables de producción activas: ADVERTENCIA — verificar que es intencional trabajar con contexto de producción.
37
- - Si no hay ninguna: OK.
38
-
39
- 6. **Leer AGENTS.md**
40
- - Lee `AGENTS.md` en la raíz del repositorio.
41
- - Confirma que lo leíste y resume el nombre del proyecto y el workflow activo.
42
-
43
- Formato del reporte final:
44
- ```
45
- Sesión iniciada — [nombre del proyecto]
46
- Branch: [nombre]
47
- Estado: [limpio | N cambios sin commitear]
48
- Warnings: [lista o "ninguno"]
49
- ```
11
+ Ejecuta sus 4 pasos en orden: (1) leer estado del repo, (2) leer `project.yaml`
12
+ (en Codex, leer también `AGENTS.md` para contexto), (3) evaluar el escenario
13
+ A/B/C y enrutar, (4) enunciar las reglas de sesión una sola vez. Si `gh` no está
14
+ disponible, omite los pasos que lo requieren y avisa.
@@ -2,19 +2,47 @@
2
2
 
3
3
  OpenCode no tiene un sistema de hooks equivalente al PreToolUse/Stop de Claude Code. Este documento describe cómo adaptar cada comportamiento de hook de Forge para OpenCode.
4
4
 
5
+ > **Mecanismo de hook de este runtime:** git hooks compartidos (`.githooks/`),
6
+ > no hooks nativos. `forge generate --runtime opencode` genera
7
+ > `.githooks/pre-commit` (branch guard + detección de debug). Los demás
8
+ > guardrails se embeben como instrucciones en `AGENTS.md`.
9
+
5
10
  ---
6
11
 
7
12
  ## 1. Equivalencia de hooks
8
13
 
9
14
  | Hook Forge (Claude Code) | Equivalente en OpenCode | Mecanismo |
10
15
  |--------------------------|------------------------|-----------|
11
- | `PreToolUse:Edit` — branch guard (bloquear edición en main) | **Ninguno nativo** | Instrucción en AGENTS.md |
12
- | `PreToolUse:Bash` — detección de console.log/print de debug | **Ninguno nativo** | Instrucción en AGENTS.md |
16
+ | `PreToolUse:Edit` — branch guard (bloquear edición en main) | **git pre-commit** | `.githooks/pre-commit` (automático) + AGENTS.md |
17
+ | `PreToolUse:Bash` — detección de console.log/print de debug | **git pre-commit** | `.githooks/pre-commit` (automático) + AGENTS.md |
13
18
  | `PreToolUse:Bash` — bloqueo de comandos destructivos en producción | **Ninguno nativo** | Instrucción en AGENTS.md |
14
19
  | `Stop` — resumen de sesión y persistencia de memoria | **Ninguno nativo** | Flujo `/session-close` |
15
20
  | `pre-commit` git hook — inyección de token stats en progress.html | **Compatible** | El hook git funciona igual en OpenCode |
16
21
 
17
- **Conclusión:** OpenCode no tiene PreToolUse ni Stop hooks. Todos los guardrails deben embeberse como instrucciones en AGENTS.md.
22
+ **Conclusión:** OpenCode no tiene PreToolUse ni Stop nativos. Branch guard y
23
+ detección de debug se ejecutan de forma automática vía el git hook compartido
24
+ `.githooks/pre-commit`; el resto de los guardrails se embeben como instrucciones
25
+ en AGENTS.md.
26
+
27
+ ---
28
+
29
+ ## 1.bis. Git hook compartido (`.githooks/pre-commit`)
30
+
31
+ `forge generate` genera un hook ejecutable POSIX (sin Python) en
32
+ `.githooks/pre-commit`. Activalo una vez por clon:
33
+
34
+ ```sh
35
+ git config core.hooksPath .githooks
36
+ ```
37
+
38
+ Qué hace en cada `git commit`:
39
+
40
+ 1. **Branch guard** — bloquea el commit si estás en `main`/`master` y hay
41
+ archivos de código staged (los `*.md`, `*.yaml`, `*.json`, `*.txt` quedan exentos).
42
+ 2. **Debug detection** — bloquea el commit si encuentra `console.log(`,
43
+ `debugger;`, `binding.pry`, `var_dump(` o `dd(` en archivos staged.
44
+
45
+ Para saltarlo puntualmente (bajo tu responsabilidad): `git commit --no-verify`.
18
46
 
19
47
  ---
20
48
 
@@ -1,111 +1,10 @@
1
1
  ---
2
2
  name: session-close
3
- description: Cierra la sesión de trabajo con commit, daily note, RELEASE-NOTES y PR.
3
+ description: Cierra la sesión de trabajo siguiendo el skill central de forge.
4
4
  ---
5
5
 
6
- Cierra la sesión de trabajo con un pipeline de 8 pasos: commit, changeset, GitHub Projects, daily note, release notes, close commit, sync y PR.
6
+ Cierra la sesión de trabajo siguiendo el skill central `core/skills/session-close/SKILL.md`.
7
7
 
8
- ## Paso 1 Verificar estado
9
-
10
- Ejecutar `git status --short` y `git diff --stat HEAD 2>/dev/null`. Reportar qué hay pendiente.
11
-
12
- ## Paso 2 — Commitear cambios pendientes
13
-
14
- Si hay cambios sin commitear:
15
-
16
- - Preguntar al usuario: "¿Qué describe este commit? (usa Conventional Commits: feat/fix/chore/docs/refactor/test)"
17
- - Commitear con: `git add -A && git commit -m "<type>(<scope>): <descripción>"`
18
- - Incluir siempre en el cuerpo del commit: `Co-Authored-By: OpenCode <noreply@opencode.ai>`
19
-
20
- Si no hay nada que commitear: indicar "Nada pendiente de commitear." y continuar.
21
-
22
- ## Paso 3 — Changeset (condicional)
23
-
24
- Si el commit del Paso 2 fue de tipo `feat:` o `fix:` Y `package.json` contiene `"@changesets/cli"`:
25
-
26
- - Ejecutar `npx changeset` para generar el changeset
27
-
28
- En cualquier otro caso, omitir este paso sin mencionarlo.
29
-
30
- ## Paso 4 — GitHub Projects (condicional)
31
-
32
- Leer `project.yaml`. Si tiene una sección `github.project` con `number`, `owner` y `repo`:
33
-
34
- - Preguntar: "¿Qué issues trabajaste en esta sesión? (números separados por coma, o Enter para saltar)"
35
- - Si el usuario provee números: ejecutar `gh issue close <N> --comment "Completado en esta sesión"` para cada uno
36
-
37
- Si `project.yaml` no tiene sección `github.project`: omitir este paso.
38
-
39
- ## Paso 5 — Daily note
40
-
41
- Crear el directorio `docs/daily-notes/` si no existe.
42
-
43
- Determinar:
44
- - `FECHA`: resultado de `date +%Y-%m-%d`
45
- - `TEMA`: derivado del nombre de la rama actual, eliminando el prefijo de tipo y el sufijo de fecha (ej: `feature/billing-webpay-2026-05-16` → `billing-webpay`)
46
-
47
- Crear el archivo `docs/daily-notes/FECHA-TEMA.md` con este contenido:
48
-
49
- ```
50
- # Session FECHA — TEMA
51
-
52
- ## Completado
53
- [listar qué se implementó o cambió en esta sesión]
54
-
55
- ## Archivos modificados
56
- [output de: git diff --name-only HEAD~1..HEAD 2>/dev/null || git diff --name-only HEAD 2>/dev/null]
57
-
58
- ## Commits
59
- [output de: git log --oneline HEAD~3..HEAD]
60
-
61
- ## Decisiones tomadas
62
- [preguntar al usuario: "¿Alguna decisión de diseño o arquitectura que vale registrar?"]
63
-
64
- ## Blockers para próxima sesión
65
- [preguntar al usuario: "¿Quedó algo bloqueado o incompleto?"]
66
- ```
67
-
68
- Completar las secciones "Archivos modificados" y "Commits" con los outputs reales. Completar "Completado", "Decisiones tomadas" y "Blockers" con las respuestas del usuario.
69
-
70
- ## Paso 6 — RELEASE-NOTES.md
71
-
72
- Agregar al final de `RELEASE-NOTES.md` (crear si no existe):
73
-
74
- ```
75
- ## FECHA — TEMA
76
- [resumen en una línea de qué cambió]
77
- ```
78
-
79
- Usar el resumen de la daily note para redactar la línea.
80
-
81
- ## Paso 7 — Commit de cierre
82
-
83
- Commitear los archivos generados:
84
-
85
- ```bash
86
- git add docs/daily-notes/ RELEASE-NOTES.md && git commit -m "docs(progress): session close FECHA — TEMA"
87
- ```
88
-
89
- ## Paso 8 — Sync y PR
90
-
91
- Ejecutar:
92
-
93
- ```bash
94
- git fetch origin main
95
- git log HEAD..origin/main --oneline
96
- ```
97
-
98
- - Si main tiene commits nuevos: ejecutar `git rebase origin/main` y luego `git push --force-with-lease origin <rama-actual>`
99
- - Si main no tiene cambios nuevos: ejecutar `git push -u origin <rama-actual>`
100
-
101
- Luego crear el PR:
102
-
103
- ```bash
104
- gh pr create --title "<resumen de cambios>" --body "<resumen de sesión tomado de la daily note>"
105
- ```
106
-
107
- Si `gh` no está disponible: hacer solo el push y recordar al usuario "Crea el PR manualmente en GitHub."
108
-
109
- ## Al finalizar el pipeline
110
-
111
- Confirmar con: "Sesión cerrada. PR creado: [URL]" o, si gh no estuvo disponible: "Sesión cerrada. Push hecho a [branch] — crea el PR en GitHub."
8
+ Ejecuta su pipeline de 8 pasos en orden: commit → changeset → GitHub Projects →
9
+ daily note → RELEASE-NOTES → commit de cierre → sync → PR. En el Paso 2, firma
10
+ el commit con `Co-Authored-By: OpenCode <noreply@opencode.ai>`.