@cristiancorreau/forge 2.9.13 → 2.10.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/CHANGELOG.md +41 -0
- package/README.md +20 -7
- package/assets/adapters/claude-code/commands/session-close.md +5 -106
- package/assets/adapters/claude-code/commands/session-start.md +5 -56
- package/assets/adapters/codex/HOOKS.md +55 -0
- package/assets/adapters/codex/commands/session-close.md +5 -45
- package/assets/adapters/codex/commands/session-start.md +6 -41
- package/assets/adapters/opencode/HOOKS.md +31 -3
- package/assets/adapters/opencode/commands/session-close.md +5 -106
- package/assets/adapters/opencode/commands/session-start.md +6 -57
- package/assets/core/hooks/hooks-registry.yaml +18 -31
- package/assets/core/hooks/pre-edit-check.js +108 -0
- package/assets/core/schemas/project.schema.json +6 -1
- package/assets/core/skills/README.md +9 -0
- package/assets/core/skills/session-close/SKILL.md +137 -0
- package/assets/core/skills/session-start/SKILL.md +86 -0
- package/assets/manifest.json +2 -2
- package/dist/cli.js +12 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +11 -0
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +28 -5
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +128 -8
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/scaffold.d.ts.map +1 -1
- package/dist/commands/scaffold.js +107 -4
- package/dist/commands/scaffold.js.map +1 -1
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +78 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +27 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/lib/catalog.d.ts.map +1 -1
- package/dist/lib/catalog.js +2 -0
- package/dist/lib/catalog.js.map +1 -1
- package/dist/lib/generators/claude-code.d.ts.map +1 -1
- package/dist/lib/generators/claude-code.js +14 -2
- package/dist/lib/generators/claude-code.js.map +1 -1
- package/dist/lib/generators/codex.d.ts +1 -0
- package/dist/lib/generators/codex.d.ts.map +1 -1
- package/dist/lib/generators/codex.js +13 -3
- package/dist/lib/generators/codex.js.map +1 -1
- package/dist/lib/generators/kiro.d.ts +2 -0
- package/dist/lib/generators/kiro.d.ts.map +1 -1
- package/dist/lib/generators/kiro.js +32 -0
- package/dist/lib/generators/kiro.js.map +1 -1
- package/dist/lib/generators/opencode.d.ts +9 -0
- package/dist/lib/generators/opencode.d.ts.map +1 -1
- package/dist/lib/generators/opencode.js +64 -1
- package/dist/lib/generators/opencode.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,11 +7,52 @@ Versioning: [Semantic Versioning](https://semver.org/lang/es/)
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [2.10.1] — 2026-06-04
|
|
11
|
+
|
|
12
|
+
### Corregido
|
|
13
|
+
- **`forge init` preserva un `.claude/settings.json` existente** al regenerarlo: hace merge de `env` y de `permissions.allow` en vez de sobrescribir el archivo (antes perdía claves como `env`).
|
|
14
|
+
- **`.forge/manifest.json` rastrea los agentes Tier 3 (`agents.specialized`)** además de `active`/`compliance`, junto con los hooks y slash commands instalados (antes los omitía).
|
|
15
|
+
- **`CLAUDE.md` renderiza los agentes Tier 3 (`agents.specialized`)** en la tabla "Agentes y su scope"; un proyecto con equipo solo Tier 3 ya no queda sin tabla.
|
|
16
|
+
- El schema de `project.yaml` acepta `node-test` en `stack.testing`.
|
|
17
|
+
|
|
18
|
+
### Documentación
|
|
19
|
+
- README y docs sincronizados con v2.10.0 (14 skills, tabla de comandos completa, hooks ejecutables multi-runtime, runtimes actualizados).
|
|
20
|
+
|
|
21
|
+
### Interno
|
|
22
|
+
- Dogfooding: el repo de forge se auto-aplica (hooks, slash commands, `architecture.rules`, `settings.json` con la registry de hooks); `forge audit` queda en 0 warnings.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## [2.10.0] — 2026-06-04
|
|
27
|
+
|
|
28
|
+
### Agregado
|
|
29
|
+
- **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.
|
|
30
|
+
- **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.
|
|
31
|
+
- **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.
|
|
32
|
+
- **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`.
|
|
33
|
+
- **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.
|
|
34
|
+
|
|
35
|
+
### Cambiado
|
|
36
|
+
- **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).
|
|
37
|
+
|
|
38
|
+
### Corregido
|
|
39
|
+
- **`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".
|
|
40
|
+
- **Versiones desincronizadas** (#25). `forge.py`, `manifest.json` y `packages/cli/package.json` quedan coherentes.
|
|
41
|
+
|
|
42
|
+
### Documentación
|
|
43
|
+
- README: `migrate`, `scaffold` y `teardown` marcados como disponibles (#26).
|
|
44
|
+
- Deprecación de la CLI legacy de Python con `MIGRATION.md` y sunset en v3.0.0 (#30).
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
10
48
|
## [2.9.13] — 2026-06-04
|
|
11
49
|
|
|
12
50
|
### Cambiado (UI)
|
|
13
51
|
- **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.
|
|
14
52
|
|
|
53
|
+
### Deprecado
|
|
54
|
+
- **`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).
|
|
55
|
+
|
|
15
56
|
---
|
|
16
57
|
|
|
17
58
|
## [2.9.12] — 2026-06-04
|
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,8 +42,8 @@ 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`. |
|
|
43
|
-
| 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 |
|
|
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 |
|
|
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, OpenCode, 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 |
|
|
46
49
|
| Auto-detección de stack | Detección por marcadores (`CLAUDE.md`+`.claude/`, `AGENTS.md`+`.opencode/`, `.codex/`, `.kiro/`) para activar profiles y adapters. | 🚧 | Claude Code, 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 |
|
|
54
|
-
| Scaffold / Teardown |
|
|
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
|
|
|
@@ -62,10 +65,18 @@ Leyenda: ✅ disponible · 🚧 parcial · ❌ pendiente.
|
|
|
62
65
|
| Comando | Qué hace |
|
|
63
66
|
|---------|----------|
|
|
64
67
|
| `forge init` | Wizard completo: detecta stack, instala agentes, hooks y genera configuración |
|
|
68
|
+
| `forge generate` | Regenera configuración nativa de cada runtime desde `project.yaml` sin ejecutar el wizard completo |
|
|
69
|
+
| `forge migrate` | Migra `project.yaml` del schema v1 al v2 (`--dry-run`, `--backup`) |
|
|
70
|
+
| `forge scaffold` | Genera un agente nuevo: profile Tier 2 o agente de dominio Tier 3 (`--tier 3`, `--name`) |
|
|
71
|
+
| `forge teardown` | Desinstala forge del proyecto de forma limpia vía manifest (`--dry-run`, `--keep-config`) |
|
|
65
72
|
| `forge audit` | Verifica el estado del proyecto contra el manifest; detecta archivos modificados o faltantes |
|
|
66
|
-
| `forge generate` | Regenera configuración desde el estado actual del proyecto sin ejecutar el wizard completo |
|
|
67
73
|
| `forge validate` | Valida que los archivos generados cumplan el esquema esperado |
|
|
68
74
|
| `forge doctor` | Health-check del entorno: Node.js, git, runtime de IA activo, permisos |
|
|
75
|
+
| `forge skills` | Lista los skills disponibles agrupados por categoría |
|
|
76
|
+
| `forge aitmpl-search` | Busca en el catálogo curado offline (frameworks, MCP servers, profiles) |
|
|
77
|
+
| `forge session-start` | Abre una sesión de trabajo: detecta estado del repo y enruta |
|
|
78
|
+
| `forge session-close` | Cierra una sesión de trabajo: commit → daily note → sync → PR |
|
|
79
|
+
| `forge wiki` | Gestiona la knowledge base del proyecto (`status` \| `ingest` \| `query` \| `lint`) |
|
|
69
80
|
|
|
70
81
|
> **Dashboard post-install.** Cuando `forge init` corre con Bun, al terminar abre un dashboard interactivo navegable con OpenTUI: panel con paneles para explorar agentes instalados, skills, profiles activos y estado del manifest sin salir de la terminal. Con Node.js el wizard cae al flujo de prompts estándar.
|
|
71
82
|
|
|
@@ -112,7 +123,7 @@ Detalle completo en [docs/tiers.md](docs/tiers.md).
|
|
|
112
123
|
|
|
113
124
|
## Skills
|
|
114
125
|
|
|
115
|
-
forge incluye
|
|
126
|
+
forge incluye 14 skills invocables que encapsulan flujos completos: `session-start` (abre sesión), `session-close` (cierra sesión), `spec` (redacta specs SDD), `new-feature` (kickoff de feature spec-first), `security-audit`, `db-migrate`, `local2prod` (deploy con gate de producción), `browser-test`, `phase-kickoff`, `obsidian-sync`, `aitmpl-search` y la familia `wiki-*` (`wiki-ingest`, `wiki-lint`, `wiki-query`) para la knowledge base del proyecto. Se invocan como slash commands (`/spec`, `/new-feature`, `/db-migrate`, …) y se mapean por runtime.
|
|
116
127
|
|
|
117
128
|
Catálogo completo en [docs/skills.md](docs/skills.md).
|
|
118
129
|
|
|
@@ -124,6 +135,8 @@ Toda la CLI corre en Node.js. Los hooks de guardrail son JavaScript puro.
|
|
|
124
135
|
|
|
125
136
|
No hay `pip install`, no hay `requirements.txt`, no hay dependencias de sistema fuera de Node.js 20+.
|
|
126
137
|
|
|
138
|
+
> 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).
|
|
139
|
+
|
|
127
140
|
---
|
|
128
141
|
|
|
129
142
|
## Comparativa
|
|
@@ -134,7 +147,7 @@ No hay `pip install`, no hay `requirements.txt`, no hay dependencias de sistema
|
|
|
134
147
|
| SDD spec-first con gate | ✅ spec `APPROVED` obligatoria, veto del orchestrator | ❌ | ✅ núcleo del producto |
|
|
135
148
|
| Agentes especializados por tier | ✅ Tier 1/2/3 (universal, stack, dominio) | ❌ | ❌ |
|
|
136
149
|
| Profiles por stack | ✅ 15+ stacks (Hono, FastAPI, Django, Rails, Laravel, Go, WordPress, Expo…) | 🚧 parcial | ❌ |
|
|
137
|
-
| Skills invocables | ✅
|
|
150
|
+
| Skills invocables | ✅ 14+ skills | ✅ foco central | 🚧 limitado |
|
|
138
151
|
| Multi-runtime | ✅ Claude Code, OpenCode, Codex, Kiro | 🚧 principalmente Claude Code | 🚧 Claude Code + parcial |
|
|
139
152
|
| Compliance con veto (GDPR/LGPD/CCPA) | ✅ `compliance-reviewer` vinculante | ❌ | ❌ |
|
|
140
153
|
| Hooks de guardrail (branch/secrets/prod) | 🚧 parcial, sin Python | ❌ | ❌ |
|
|
@@ -1,109 +1,8 @@
|
|
|
1
1
|
# session-close
|
|
2
2
|
|
|
3
|
-
Cierra la sesión de trabajo con un pipeline de 8 pasos: commit
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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:
|
|
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
|
|
9
|
+
Cierra la sesión de trabajo siguiendo el skill central `core/skills/session-close/SKILL.md`.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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:
|
|
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
|
|
9
|
+
Inicia la sesión de trabajo siguiendo el skill central `core/skills/session-start/SKILL.md`.
|
|
10
10
|
|
|
11
|
-
1
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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) | **
|
|
12
|
-
| `PreToolUse:Bash` — detección de console.log/print de debug | **
|
|
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
|
|
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
|
|
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
|
|
6
|
+
Cierra la sesión de trabajo siguiendo el skill central `core/skills/session-close/SKILL.md`.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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>`.
|