@cristiancorreau/forge 2.1.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.
- package/CHANGELOG.md +228 -0
- package/LICENSE +191 -0
- package/README.md +156 -0
- package/assets/adapters/claude-code/commands/deploy-check.md +12 -0
- package/assets/adapters/claude-code/commands/new-feature.md +11 -0
- package/assets/adapters/claude-code/commands/plan.md +116 -0
- package/assets/adapters/claude-code/commands/review.md +219 -0
- package/assets/adapters/claude-code/commands/session-close.md +109 -0
- package/assets/adapters/claude-code/commands/session-start.md +59 -0
- package/assets/adapters/claude-code/commands/ship.md +133 -0
- package/assets/adapters/claude-code/commands/wiki-ingest.md +7 -0
- package/assets/adapters/claude-code/commands/wiki-lint.md +5 -0
- package/assets/adapters/claude-code/commands/wiki-query.md +7 -0
- package/assets/adapters/claude-code/commands/work.md +101 -0
- package/assets/adapters/claude-code/generate-claude-md.py +304 -0
- package/assets/adapters/codex/commands/plan.md +63 -0
- package/assets/adapters/codex/commands/review.md +53 -0
- package/assets/adapters/codex/commands/session-close.md +53 -0
- package/assets/adapters/codex/commands/session-start.md +49 -0
- package/assets/adapters/codex/commands/ship.md +53 -0
- package/assets/adapters/codex/commands/work.md +53 -0
- package/assets/adapters/codex/generate-codex-config.py +269 -0
- package/assets/adapters/codex/hooks/codex.yaml.tpl +43 -0
- package/assets/adapters/codex/hooks/forge-codex-finish.sh +158 -0
- package/assets/adapters/codex/hooks/forge-codex-start.sh +186 -0
- package/assets/adapters/kiro/generate-steering.py +367 -0
- package/assets/adapters/opencode/HOOKS.md +123 -0
- package/assets/adapters/opencode/commands/plan.md +119 -0
- package/assets/adapters/opencode/commands/review.md +164 -0
- package/assets/adapters/opencode/commands/session-close.md +111 -0
- package/assets/adapters/opencode/commands/session-start.md +62 -0
- package/assets/adapters/opencode/commands/ship.md +135 -0
- package/assets/adapters/opencode/commands/work.md +82 -0
- package/assets/adapters/opencode/generate-agents-md.py +262 -0
- package/assets/core/agents/backend-engineer.md +61 -0
- package/assets/core/agents/compliance-reviewer.md +83 -0
- package/assets/core/agents/docs-writer.md +77 -0
- package/assets/core/agents/frontend-engineer.md +70 -0
- package/assets/core/agents/orchestrator.md +104 -0
- package/assets/core/agents/security-auditor.md +54 -0
- package/assets/core/agents/test-engineer.md +57 -0
- package/assets/core/hooks/hooks-registry.yaml +48 -0
- package/assets/core/hooks/post-turn-check.sh +139 -0
- package/assets/core/hooks/pre-bash-check.py +202 -0
- package/assets/core/hooks/pre-edit-check.py +317 -0
- package/assets/core/hooks/session-start.sh +184 -0
- package/assets/core/schemas/project.schema.json +503 -0
- package/assets/core/skills/README.md +88 -0
- package/assets/core/skills/aitmpl-search/SKILL.md +74 -0
- package/assets/core/skills/browser-test/SKILL.md +177 -0
- package/assets/core/skills/db-migrate/SKILL.md +163 -0
- package/assets/core/skills/local2prod/SKILL.md +147 -0
- package/assets/core/skills/new-feature/SKILL.md +155 -0
- package/assets/core/skills/obsidian-sync/SKILL.md +152 -0
- package/assets/core/skills/phase-kickoff/SKILL.md +69 -0
- package/assets/core/skills/security-audit/SKILL.md +125 -0
- package/assets/core/skills/spec/SKILL.md +72 -0
- package/assets/core/skills/wiki-ingest/SKILL.md +183 -0
- package/assets/core/skills/wiki-lint/SKILL.md +109 -0
- package/assets/core/skills/wiki-query/SKILL.md +100 -0
- package/assets/core/templates/claude-md/architecture.rules +20 -0
- package/assets/core/templates/claude-md/global.md +30 -0
- package/assets/core/templates/claude-md/project.md +36 -0
- package/assets/core/templates/daily-note.md +38 -0
- package/assets/core/templates/spec-template.md +43 -0
- package/assets/core/workflows/sdd.md +69 -0
- package/assets/core/workflows/sprint.md +59 -0
- package/assets/forge.py +1265 -0
- package/assets/hooks/pre-commit +43 -0
- package/assets/manifest.json +274 -0
- package/assets/profiles/astro/README.md +24 -0
- package/assets/profiles/astro/agents/frontend-engineer.md +74 -0
- package/assets/profiles/django/agents/api-engineer.md +83 -0
- package/assets/profiles/expo/README.md +24 -0
- package/assets/profiles/expo/agents/mobile-engineer.md +69 -0
- package/assets/profiles/express/agents/api-engineer.md +60 -0
- package/assets/profiles/fastapi/README.md +32 -0
- package/assets/profiles/fastapi/agents/api-engineer.md +87 -0
- package/assets/profiles/go-gin/agents/api-engineer.md +98 -0
- package/assets/profiles/hono-drizzle/README.md +31 -0
- package/assets/profiles/hono-drizzle/agents/api-engineer.md +82 -0
- package/assets/profiles/laravel/README.md +32 -0
- package/assets/profiles/laravel/agents/api-engineer.md +114 -0
- package/assets/profiles/laravel/agents/fullstack-engineer.md +67 -0
- package/assets/profiles/laravel/agents/migration-specialist.md +420 -0
- package/assets/profiles/nestjs/agents/api-engineer.md +79 -0
- package/assets/profiles/nextjs-admin/README.md +32 -0
- package/assets/profiles/nextjs-admin/agents/admin-engineer.md +78 -0
- package/assets/profiles/playwright-crawler/agents/scanner-engineer.md +51 -0
- package/assets/profiles/rails/agents/fullstack-engineer.md +61 -0
- package/assets/profiles/sveltekit/agents/frontend-engineer.md +96 -0
- package/assets/profiles/vuenuxt/agents/frontend-engineer.md +82 -0
- package/assets/profiles/wordpress/README.md +30 -0
- package/assets/profiles/wordpress/agents/divi-engineer.md +273 -0
- package/assets/profiles/wordpress/agents/elementor-engineer.md +310 -0
- package/assets/profiles/wordpress/agents/wp-engineer.md +216 -0
- package/assets/requirements.txt +2 -0
- package/assets/scripts/aitmpl-search.py +808 -0
- package/assets/scripts/forge-add-opportunities.py +92 -0
- package/assets/scripts/forge-audit.py +1061 -0
- package/assets/scripts/forge-generate-all.py +283 -0
- package/assets/scripts/forge-init.py +900 -0
- package/assets/scripts/forge-migrate-project-yaml.py +397 -0
- package/assets/scripts/forge-scaffold-profile.py +181 -0
- package/assets/scripts/forge-teardown.py +193 -0
- package/assets/scripts/forge-validate-project-yaml.py +457 -0
- package/assets/scripts/forge-wizard.py +1003 -0
- package/assets/scripts/setup-codex.sh +229 -0
- package/assets/scripts/team-install.sh +147 -0
- package/assets/scripts/token-stats.py +201 -0
- package/assets/templates/modes/enterprise.yaml.tpl +114 -0
- package/assets/templates/modes/multi-runtime.yaml.tpl +89 -0
- package/assets/templates/modes/new-stack.yaml.tpl +101 -0
- package/assets/templates/modes/startup.yaml.tpl +74 -0
- package/assets/templates/project.yaml.tpl +185 -0
- package/assets/templates/wiki/concepts/_template.md +22 -0
- package/assets/templates/wiki/entities/_template.md +19 -0
- package/assets/templates/wiki/index.md +32 -0
- package/assets/templates/wiki/log.md +6 -0
- package/assets/templates/wiki/sources/_template.md +25 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +64 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +21 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +58 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/generate.d.ts +2 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +27 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +22 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +20 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/lib/paths.d.ts +10 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +49 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/python.d.ts +4 -0
- package/dist/lib/python.d.ts.map +1 -0
- package/dist/lib/python.js +46 -0
- package/dist/lib/python.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan
|
|
3
|
+
description: Crea o revisa una spec de feature en docs/specs/ siguiendo el flujo SDD.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Gestiona specs del ciclo SDD (Spec-Driven Development).
|
|
7
|
+
|
|
8
|
+
Argumentos: `<fase> "<título>"` para crear, `--review <archivo>` para revisar, vacío para listar.
|
|
9
|
+
|
|
10
|
+
## Modo crear spec (`/plan <fase> "<título>"`)
|
|
11
|
+
|
|
12
|
+
### Paso 1 — Verificar directorio
|
|
13
|
+
|
|
14
|
+
Verificar que existe `docs/specs/`. Si no existe, crearlo.
|
|
15
|
+
|
|
16
|
+
### Paso 2 — Crear el archivo de spec
|
|
17
|
+
|
|
18
|
+
Construir el nombre del archivo:
|
|
19
|
+
- Tomar el título, convertirlo a minúsculas, reemplazar espacios por guiones, eliminar caracteres especiales → `<slug>`
|
|
20
|
+
- Nombre final: `docs/specs/<fase>-<slug>.md`
|
|
21
|
+
|
|
22
|
+
Crear el archivo con este template exacto:
|
|
23
|
+
|
|
24
|
+
```markdown
|
|
25
|
+
# Spec: <título>
|
|
26
|
+
**Fase:** <fase> | **Estado:** draft | **Fecha:** YYYY-MM-DD
|
|
27
|
+
|
|
28
|
+
## Problem statement
|
|
29
|
+
[¿Qué problema resuelve? ¿Por qué ahora?]
|
|
30
|
+
|
|
31
|
+
## Non-goals
|
|
32
|
+
[Qué NO cubre esta spec]
|
|
33
|
+
|
|
34
|
+
## Acceptance criteria
|
|
35
|
+
- [ ] Criterio 1 (verificable, testeable)
|
|
36
|
+
- [ ] Criterio 2
|
|
37
|
+
|
|
38
|
+
## Compliance mapping
|
|
39
|
+
[Si el proyecto tiene frameworks de compliance en project.yaml, mapear qué artículos aplican. Si no aplica, escribir "N/A".]
|
|
40
|
+
|
|
41
|
+
## Edge cases
|
|
42
|
+
[Casos límite que la implementación debe manejar]
|
|
43
|
+
|
|
44
|
+
## Implementation notes
|
|
45
|
+
[Se llena durante la implementación]
|
|
46
|
+
|
|
47
|
+
## Decisiones tomadas
|
|
48
|
+
[Se llena durante la implementación]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Paso 3 — Guiar al usuario por cada sección
|
|
52
|
+
|
|
53
|
+
Preguntar una sección a la vez, en orden:
|
|
54
|
+
|
|
55
|
+
1. "¿Qué problema concreto resuelve esta feature? ¿Por qué ahora y no más adelante?"
|
|
56
|
+
2. "¿Qué queda explícitamente fuera del scope de esta spec?"
|
|
57
|
+
3. "¿Cuáles son los criterios de aceptación verificables? (cada uno debe ser testeable de forma objetiva)"
|
|
58
|
+
4. Si `project.yaml` tiene frameworks de compliance: "¿Qué artículos o controles de compliance aplican a esta feature?"
|
|
59
|
+
5. "¿Qué casos límite debe manejar la implementación? (ej: usuario sin permisos, datos vacíos, concurrencia)"
|
|
60
|
+
|
|
61
|
+
Completar el archivo con las respuestas del usuario a medida que avanza.
|
|
62
|
+
|
|
63
|
+
### Paso 4 — Planner-Critic (condicional)
|
|
64
|
+
|
|
65
|
+
Leer `project.yaml` → `project.mode`:
|
|
66
|
+
|
|
67
|
+
- **mode=standard o mode=enterprise**: aplicar Planner-Critic obligatoriamente
|
|
68
|
+
- **mode=startup**: preguntar "¿Querés aplicar el Planner-Critic para detectar ambigüedades antes de implementar? (s/n)"
|
|
69
|
+
- Si `project.yaml` no existe: tratar como startup
|
|
70
|
+
|
|
71
|
+
**Cómo aplicar el Planner-Critic:**
|
|
72
|
+
|
|
73
|
+
Adoptar el rol de "Critic" y revisar la spec completa buscando:
|
|
74
|
+
- ¿Hay acceptance criteria que no son objetivamente verificables?
|
|
75
|
+
- ¿Hay términos ambiguos que diferentes personas podrían interpretar distinto?
|
|
76
|
+
- ¿Hay edge cases no cubiertos que podrían romper la implementación?
|
|
77
|
+
- ¿Los non-goals son suficientemente explícitos para evitar scope creep?
|
|
78
|
+
|
|
79
|
+
Mostrar las críticas como bullet points. Preguntar: "¿Ajustamos la spec antes de marcarla como ready?"
|
|
80
|
+
|
|
81
|
+
Si el usuario ajusta: actualizar el archivo y repetir el Critic una vez más.
|
|
82
|
+
|
|
83
|
+
### Paso 5 — Marcar como ready
|
|
84
|
+
|
|
85
|
+
Cuando el usuario aprueba la spec (o decide no aplicar el Critic):
|
|
86
|
+
- Cambiar `**Estado:** draft` → `**Estado:** ready` en el archivo
|
|
87
|
+
- Confirmar: "Spec lista: `docs/specs/<archivo>.md`. Ahora podés ejecutar `/work` para implementarla."
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Modo listar (`/plan` sin argumentos)
|
|
92
|
+
|
|
93
|
+
Buscar todos los archivos `.md` en `docs/specs/` que contengan `**Estado:** draft` o `**Estado:** in-review`.
|
|
94
|
+
|
|
95
|
+
Si no hay ninguno: "No hay specs en estado draft o in-review. Ejecutá `/plan <fase> \"<título>\"` para crear una."
|
|
96
|
+
|
|
97
|
+
Si hay alguno: mostrarlos como lista numerada con título, fase y fecha. Ejemplo:
|
|
98
|
+
```
|
|
99
|
+
1. auth-oauth.md — Fase 2 — Auth con OAuth (2026-05-17)
|
|
100
|
+
2. billing-webpay.md — Fase 3 — Pago con WebPay (2026-05-14)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Preguntar: "¿Cuál continuamos?"
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Modo revisar (`/plan --review <archivo-spec>`)
|
|
108
|
+
|
|
109
|
+
Leer el archivo de spec indicado.
|
|
110
|
+
|
|
111
|
+
Aplicar el Planner-Critic completo:
|
|
112
|
+
- ¿Los acceptance criteria son objetivamente testeables?
|
|
113
|
+
- ¿Hay ambigüedades en el problem statement o en los criterios?
|
|
114
|
+
- ¿Hay edge cases no cubiertos?
|
|
115
|
+
- ¿Los non-goals son suficientemente explícitos?
|
|
116
|
+
|
|
117
|
+
Mostrar sugerencias de mejora como bullet points con la sección específica que afectan.
|
|
118
|
+
|
|
119
|
+
Preguntar: "¿Aplicamos alguno de estos cambios?"
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review
|
|
3
|
+
description: Revisión de código estructurada en un solo paso. Produce un veredicto APPROVED / CHANGES_REQUESTED / BLOCKED vinculante para /ship.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Orquesta una revisión de código estructurada y produce un veredicto vinculante para `/ship`.
|
|
7
|
+
|
|
8
|
+
Argumentos: vacío para cambios uncommitted, `HEAD~N..HEAD` para rango de commits, `PR-N` para un PR específico.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Paso 0 — Determinar modo de invocación
|
|
13
|
+
|
|
14
|
+
Evaluar los argumentos:
|
|
15
|
+
|
|
16
|
+
- **Vacío**: revisar cambios uncommitted (`git diff HEAD`)
|
|
17
|
+
- **`HEAD~N..HEAD`** o cualquier rango git válido: revisar ese rango de commits
|
|
18
|
+
- **`PR-N`** (ej: `PR-42`): obtener el diff del PR con `gh pr diff 42`
|
|
19
|
+
|
|
20
|
+
Guardar el scope como descripción legible (ej: "cambios uncommitted", "últimos 3 commits", "PR #42").
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Paso 1 — Obtener el diff
|
|
25
|
+
|
|
26
|
+
Según el modo detectado:
|
|
27
|
+
|
|
28
|
+
- Cambios uncommitted: `git diff HEAD` (si está vacío, probar `git diff --cached`)
|
|
29
|
+
- Rango de commits: `git diff <rango>`
|
|
30
|
+
- PR: `gh pr diff <N>`
|
|
31
|
+
|
|
32
|
+
Si el diff está vacío: "No hay cambios para revisar en el scope indicado." y detener.
|
|
33
|
+
|
|
34
|
+
Mostrar un resumen de lo que se va a revisar:
|
|
35
|
+
```
|
|
36
|
+
Revisando: <scope>
|
|
37
|
+
Archivos modificados: <N>
|
|
38
|
+
Líneas añadidas/eliminadas: +X / -Y
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Paso 2 — Leer mode del proyecto
|
|
44
|
+
|
|
45
|
+
Leer `project.yaml` → `project.mode`. Si no existe: tratar como `startup`.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Paso 3 — Revisión completa en un solo paso
|
|
50
|
+
|
|
51
|
+
OpenCode ejecuta la revisión en un único paso cubriendo todas las dimensiones.
|
|
52
|
+
|
|
53
|
+
**Seguridad**
|
|
54
|
+
- ¿Hay tokens, passwords o claves hardcodeadas?
|
|
55
|
+
- ¿Los endpoints nuevos o modificados verifican autenticación Y autorización?
|
|
56
|
+
- ¿Hay concatenación de input del usuario en queries SQL (riesgo de SQLi)?
|
|
57
|
+
- ¿Hay output de input del usuario sin escapar (riesgo de XSS)?
|
|
58
|
+
- ¿Se loguea PII sin enmascarar?
|
|
59
|
+
|
|
60
|
+
**Calidad**
|
|
61
|
+
- ¿Hay naming confuso o inconsistente con el resto del proyecto?
|
|
62
|
+
- ¿Hay código muerto o lógica duplicada?
|
|
63
|
+
- ¿Hay N+1 queries o loops en caminos críticos?
|
|
64
|
+
- ¿Faltan índices para queries que se ejecutan frecuentemente?
|
|
65
|
+
|
|
66
|
+
**Tests**
|
|
67
|
+
- ¿Cada función o endpoint modificado tiene al menos un test correspondiente?
|
|
68
|
+
- ¿Los casos borde están cubiertos?
|
|
69
|
+
|
|
70
|
+
**Compliance (solo si `project.mode` es enterprise)**
|
|
71
|
+
- ¿Hay cambios en el manejo de PII?
|
|
72
|
+
- ¿Se modificaron flujos de consentimiento?
|
|
73
|
+
- ¿Hay cambios en logs de auditoría?
|
|
74
|
+
- ¿Los cambios están alineados con los frameworks de compliance de `project.yaml`?
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Paso 4 — Sintetizar veredicto
|
|
79
|
+
|
|
80
|
+
Evaluar la totalidad de los hallazgos y asignar uno de estos veredictos:
|
|
81
|
+
|
|
82
|
+
### APPROVED
|
|
83
|
+
No hay hallazgos bloqueantes ni cambios requeridos.
|
|
84
|
+
|
|
85
|
+
### CHANGES_REQUESTED
|
|
86
|
+
Hay issues que deben resolverse pero no son críticos:
|
|
87
|
+
```
|
|
88
|
+
CHANGES_REQUESTED
|
|
89
|
+
|
|
90
|
+
Cambios requeridos:
|
|
91
|
+
1. [Descripción del issue] — [archivo:línea si aplica]
|
|
92
|
+
2. [Descripción del issue] — [archivo:línea si aplica]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### BLOCKED
|
|
96
|
+
Hay issues críticos que deben resolverse antes de poder hacer `/ship`:
|
|
97
|
+
```
|
|
98
|
+
BLOCKED
|
|
99
|
+
|
|
100
|
+
Issues críticos:
|
|
101
|
+
1. [Descripción] — [archivo:línea si aplica] — Severidad: CRITICAL
|
|
102
|
+
2. [Descripción] — [archivo:línea si aplica] — Severidad: HIGH
|
|
103
|
+
|
|
104
|
+
Esta sesión no es apta para /ship hasta resolver estos puntos.
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Paso 5 — Producir reporte
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
## Code Review — <scope>
|
|
113
|
+
Fecha: YYYY-MM-DD HH:MM
|
|
114
|
+
Modo: <startup|standard|enterprise>
|
|
115
|
+
|
|
116
|
+
### Hallazgos
|
|
117
|
+
|
|
118
|
+
#### Seguridad
|
|
119
|
+
[hallazgos o "Sin hallazgos."]
|
|
120
|
+
|
|
121
|
+
#### Calidad
|
|
122
|
+
[hallazgos o "Sin hallazgos."]
|
|
123
|
+
|
|
124
|
+
#### Tests
|
|
125
|
+
[hallazgos o "Sin hallazgos."]
|
|
126
|
+
|
|
127
|
+
#### Compliance
|
|
128
|
+
[hallazgos o "Sin hallazgos." o "N/A (modo no-enterprise)"]
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
### Veredicto: <APPROVED|CHANGES_REQUESTED|BLOCKED>
|
|
133
|
+
|
|
134
|
+
[Detalle del veredicto]
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Paso 6 — Guardar resultado
|
|
140
|
+
|
|
141
|
+
Escribir el archivo `.opencode/review-status.json` con el resultado:
|
|
142
|
+
|
|
143
|
+
```json
|
|
144
|
+
{
|
|
145
|
+
"verdict": "<APPROVED|CHANGES_REQUESTED|BLOCKED>",
|
|
146
|
+
"reviewer": "opencode/review",
|
|
147
|
+
"timestamp": "<ISO 8601>",
|
|
148
|
+
"scope": "<descripción del scope revisado>"
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Si el directorio `.opencode/` no existe, crearlo.
|
|
153
|
+
|
|
154
|
+
Confirmar: "Review guardado en `.opencode/review-status.json`. `/ship` lo leerá para verificar que el review fue aprobado antes de hacer deploy."
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Si BLOCKED
|
|
159
|
+
|
|
160
|
+
Recordar explícitamente al final del reporte:
|
|
161
|
+
|
|
162
|
+
> **Esta sesión no es apta para `/ship` hasta resolver los puntos bloqueantes listados arriba.**
|
|
163
|
+
|
|
164
|
+
No sugerir hacer deploy ni continuar con otros pasos hasta que el usuario reporte que los issues fueron resueltos y vuelva a ejecutar `/review`.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: session-close
|
|
3
|
+
description: Cierra la sesión de trabajo con commit, daily note, RELEASE-NOTES y PR.
|
|
4
|
+
---
|
|
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.
|
|
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."
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: session-start
|
|
3
|
+
description: Inicializa una sesión de trabajo detectando el estado del repo y enrutando según el escenario.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Inicializa la sesión de trabajo: detecta el estado del repo, identifica el escenario y actúa según corresponda.
|
|
7
|
+
|
|
8
|
+
## Paso 1 — Leer estado del repo
|
|
9
|
+
|
|
10
|
+
Ejecutar los siguientes comandos y guardar sus resultados:
|
|
11
|
+
|
|
12
|
+
- `git branch --show-current` → rama actual
|
|
13
|
+
- `git status --short` → cambios sin commitear
|
|
14
|
+
- `git log --oneline -5` → commits recientes
|
|
15
|
+
- `gh pr list --author @me --state open --json number,title,headRefName 2>/dev/null` → PRs abiertos (saltar si gh no está disponible)
|
|
16
|
+
- `git branch --sort=-committerdate --format='%(refname:short)' | grep -v 'HEAD' | head -8` → ramas recientes
|
|
17
|
+
|
|
18
|
+
## Paso 2 — Leer configuración del proyecto
|
|
19
|
+
|
|
20
|
+
- Si existe `project.yaml` en el directorio actual, leerlo para obtener: `project.mode`, `project.name`, `stack.*`, `agents.active`
|
|
21
|
+
- Si existe `AGENTS.md`, leerlo para obtener contexto del proyecto
|
|
22
|
+
- Si ninguno existe, continuar con defaults: mode=startup
|
|
23
|
+
|
|
24
|
+
## Paso 3 — Evaluar escenario y actuar
|
|
25
|
+
|
|
26
|
+
### Escenario A — Ya en una rama de feature (no es main/master/develop)
|
|
27
|
+
|
|
28
|
+
- Mostrar los últimos 5 commits de esta rama para contexto
|
|
29
|
+
- Mostrar archivos con cambios sin commitear si los hay
|
|
30
|
+
- Reportar: "Continuando sesión en [branch]. Contexto: [mensaje del último commit]."
|
|
31
|
+
- Preguntar: "¿Qué trabajamos hoy?"
|
|
32
|
+
|
|
33
|
+
### Escenario B — En main/master con PRs abiertos o ramas recientes de feature
|
|
34
|
+
|
|
35
|
+
- Listar los PRs abiertos del Paso 1 como menú numerado
|
|
36
|
+
- Listar las ramas recientes que no sean main/master/develop del Paso 1
|
|
37
|
+
- Preguntar: "¿Continuás uno de estos o arrancamos algo nuevo?"
|
|
38
|
+
- Si el usuario elige continuar uno existente: hacer checkout de esa rama
|
|
39
|
+
- Si el usuario quiere algo nuevo: pasar al flujo del Escenario C
|
|
40
|
+
|
|
41
|
+
### Escenario C — En main/master sin trabajo previo identificado
|
|
42
|
+
|
|
43
|
+
- Esperar el primer mensaje del usuario describiendo qué quiere trabajar
|
|
44
|
+
- Antes de cualquier edición de código, proponer un nombre de rama siguiendo la convención:
|
|
45
|
+
- `feature/<tema-corto>-$(date +%Y-%m-%d)` para features
|
|
46
|
+
- `fix/<tema-corto>-$(date +%Y-%m-%d)` para correcciones
|
|
47
|
+
- `chore/<tema-corto>-$(date +%Y-%m-%d)` para tareas técnicas
|
|
48
|
+
- `docs/<tema-corto>-$(date +%Y-%m-%d)` para documentación
|
|
49
|
+
- Crear la rama: `git checkout -b <nombre-propuesto>`
|
|
50
|
+
- Confirmar: "Branch creada: [nombre]. Listo para trabajar."
|
|
51
|
+
|
|
52
|
+
## Paso 4 — Recordatorio de reglas de sesión
|
|
53
|
+
|
|
54
|
+
Una vez determinado el escenario, enunciar estas reglas una sola vez:
|
|
55
|
+
|
|
56
|
+
"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) Implementar en serie — OpenCode no soporta subagentes paralelos. (5) Cerrar con /session-close."
|
|
57
|
+
|
|
58
|
+
## Comportamiento adaptativo
|
|
59
|
+
|
|
60
|
+
- Si `gh` no está disponible: omitir los pasos que lo requieren y agregar nota "gh no disponible — revisar PRs en GitHub.com manualmente"
|
|
61
|
+
- Si `project.yaml` no existe: continuar con defaults, no interrumpir el flujo
|
|
62
|
+
- Si la rama actual no sigue la convención de nombres: mencionarlo pero no bloquear
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ship
|
|
3
|
+
description: Pipeline de deploy. Solo disponible cuando project.yaml tiene sección deploy configurada.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Pipeline de deploy. Solo disponible cuando `project.yaml` tiene sección `deploy`.
|
|
7
|
+
|
|
8
|
+
## Verificación inicial
|
|
9
|
+
|
|
10
|
+
Leer `project.yaml`. Si no existe sección `deploy`: "deploy no configurado en project.yaml. Agregá la sección deploy para usar /ship." y detener.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Paso 1 — Verificar review
|
|
15
|
+
|
|
16
|
+
Leer `.opencode/review-status.json` si existe.
|
|
17
|
+
|
|
18
|
+
- Si el archivo existe y `verdict` es `APPROVED`: continuar.
|
|
19
|
+
- Si el archivo existe y `verdict` es `BLOCKED` o `CHANGES_REQUESTED`: "El último review no está aprobado (veredicto: <verdict>). Ejecutá `/review` y resolvé los issues antes de hacer deploy." y detener.
|
|
20
|
+
- Si el archivo no existe: "¿Confirmás que el código fue revisado y aprobado? (s/n)"
|
|
21
|
+
- Si n: "Ejecutá `/review` antes de hacer deploy." y detener.
|
|
22
|
+
|
|
23
|
+
## Paso 2 — Verificar git status
|
|
24
|
+
|
|
25
|
+
Ejecutar `git status --short`.
|
|
26
|
+
|
|
27
|
+
Si hay cambios sin commitear: "Hay cambios sin commitear. Commiteá primero antes de hacer deploy." y detener.
|
|
28
|
+
|
|
29
|
+
Si el working tree está limpio: continuar.
|
|
30
|
+
|
|
31
|
+
## Paso 3 — Merge PR a main (condicional)
|
|
32
|
+
|
|
33
|
+
Preguntar: "¿Querés mergear el PR actual a main antes del deploy? (s/n)"
|
|
34
|
+
|
|
35
|
+
Si sí:
|
|
36
|
+
- Ejecutar `gh pr checks` para verificar que todos los checks pasan
|
|
37
|
+
- Si algún check falla: "El PR tiene checks fallando. Resolvelos antes de mergear." y detener.
|
|
38
|
+
- Si todos pasan: ejecutar `gh pr merge --merge` (o la estrategia configurada en `project.yaml` → `deploy.merge_strategy`)
|
|
39
|
+
|
|
40
|
+
Si no: continuar sin mergear.
|
|
41
|
+
|
|
42
|
+
## Paso 4 — Trigger deploy
|
|
43
|
+
|
|
44
|
+
Leer `project.yaml` → `deploy.provider`:
|
|
45
|
+
|
|
46
|
+
- **vercel**: ejecutar `vercel deploy --prod` (o el deploy se triggeará automáticamente con el merge/push si está configurado). Guardar la URL del deployment del output para el polling.
|
|
47
|
+
- **railway**: ejecutar `railway up` si está disponible en el PATH.
|
|
48
|
+
- **fly**: ejecutar `fly deploy`.
|
|
49
|
+
- **aws**: indicar el comando apropiado según la configuración y pedir al usuario que lo ejecute.
|
|
50
|
+
- Provider no reconocido: "Provider '<valor>' no reconocido. Soportados: vercel, railway, fly, aws."
|
|
51
|
+
|
|
52
|
+
## Paso 5-8 — Polling de estado con backoff
|
|
53
|
+
|
|
54
|
+
**REGLA CRITICA: máximo 1 consulta al estado del deploy por minuto. Nunca encadenar polls consecutivos sin pausa.**
|
|
55
|
+
|
|
56
|
+
Loop de polling (máximo 20 intentos = 20 minutos):
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Para cada intento:
|
|
60
|
+
1. Consultar estado del deploy (una sola consulta)
|
|
61
|
+
2. Evaluar resultado:
|
|
62
|
+
- BUILDING / QUEUED / IN_PROGRESS:
|
|
63
|
+
Reportar: "Deploy en progreso (intento N/20)... esperando 60 segundos."
|
|
64
|
+
Esperar 60 segundos antes del siguiente poll.
|
|
65
|
+
- ERROR / FAILED / CANCELED:
|
|
66
|
+
Leer build logs completos.
|
|
67
|
+
Reportar el error al usuario con los logs relevantes.
|
|
68
|
+
DETENER — no continuar al Paso 9.
|
|
69
|
+
- READY / SUCCESS:
|
|
70
|
+
Continuar al Paso 9.
|
|
71
|
+
3. Si se alcanzan 20 intentos sin READY: reportar timeout y detener.
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Comandos según provider:**
|
|
75
|
+
- Vercel: `vercel inspect <deployment-url> --json | jq '.readyState'` o `vercel ls --json | jq '.[0].readyState'`
|
|
76
|
+
- Railway: `railway status`
|
|
77
|
+
- Fly: `fly status`
|
|
78
|
+
|
|
79
|
+
## Paso 9 — Verificar runtime logs
|
|
80
|
+
|
|
81
|
+
Leer los primeros 60 segundos de logs post-deploy:
|
|
82
|
+
- Vercel: `vercel logs <deployment-url> --since 1m`
|
|
83
|
+
- Railway/Fly: logs equivalentes del provider
|
|
84
|
+
|
|
85
|
+
Si hay errores en los logs:
|
|
86
|
+
- Reportar los errores al usuario con contexto
|
|
87
|
+
- Sugerir rollback: "¿Querés hacer rollback al deploy anterior? (s/n)"
|
|
88
|
+
- **NO ejecutar rollback automáticamente — siempre requiere confirmación explícita.**
|
|
89
|
+
- Si el usuario confirma rollback: ejecutar el comando de rollback del provider.
|
|
90
|
+
|
|
91
|
+
Si los logs están limpios: continuar.
|
|
92
|
+
|
|
93
|
+
## Paso 10 — Smoke tests (condicional)
|
|
94
|
+
|
|
95
|
+
Si `project.yaml` → `deploy.smoke_tests` está definido y tiene URLs:
|
|
96
|
+
|
|
97
|
+
Para cada URL de smoke test:
|
|
98
|
+
```bash
|
|
99
|
+
curl -s -o /dev/null -w "%{http_code}" <url>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- Si el código HTTP es 2xx: marcar como pasado.
|
|
103
|
+
- Si el código HTTP es 4xx o 5xx: reportar fallo.
|
|
104
|
+
|
|
105
|
+
Si algún smoke test falla:
|
|
106
|
+
- Reportar qué URL falló y el código HTTP
|
|
107
|
+
- Sugerir rollback: "¿Querés hacer rollback? (s/n)"
|
|
108
|
+
- **NO ejecutar rollback automáticamente.**
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Al terminar exitosamente
|
|
113
|
+
|
|
114
|
+
Obtener la URL de producción de `project.yaml` → `deploy.production_url` o del output del provider.
|
|
115
|
+
|
|
116
|
+
Reportar: "Deploy exitoso. URL: [production_url]"
|
|
117
|
+
|
|
118
|
+
Agregar entrada al daily note si existe `docs/daily-notes/` (buscar el archivo del día actual):
|
|
119
|
+
```
|
|
120
|
+
## Deploy
|
|
121
|
+
- Fecha: YYYY-MM-DD HH:MM
|
|
122
|
+
- Estado: exitoso
|
|
123
|
+
- URL: [production_url]
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Si hay errores en cualquier paso
|
|
129
|
+
|
|
130
|
+
Reportar claramente:
|
|
131
|
+
- En qué paso ocurrió el error
|
|
132
|
+
- Qué salió mal (con logs si están disponibles)
|
|
133
|
+
- Qué acción correctiva se sugiere
|
|
134
|
+
|
|
135
|
+
**Nunca continuar automáticamente después de un error de deploy.** Siempre esperar confirmación explícita del usuario antes de cualquier acción de remediación.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: work
|
|
3
|
+
description: Implementa una spec en modo serial. OpenCode no soporta subagentes paralelos — toda la implementación ocurre en esta sesión.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Implementa una spec siguiendo el flujo SDD. OpenCode ejecuta todo en serie en la sesión actual — no se crean subagentes paralelos.
|
|
7
|
+
|
|
8
|
+
Argumentos: vacío para modo estándar, `--autorun` para ejecutar sin confirmaciones intermedias.
|
|
9
|
+
|
|
10
|
+
## Paso 1 — Identificar la spec
|
|
11
|
+
|
|
12
|
+
Buscar archivos `.md` en `docs/specs/` que contengan `**Estado:** ready`.
|
|
13
|
+
|
|
14
|
+
- Si hay exactamente una: mostrarla y confirmar "Implementando: `<archivo>`."
|
|
15
|
+
- Si hay varias: mostrarlas como lista numerada y pedir que el usuario elija.
|
|
16
|
+
- Si no hay ninguna: "No hay spec en estado ready. Ejecutá `/plan` primero." y detener.
|
|
17
|
+
|
|
18
|
+
Leer la spec seleccionada completa antes de continuar.
|
|
19
|
+
|
|
20
|
+
## Paso 2 — Leer configuración del proyecto
|
|
21
|
+
|
|
22
|
+
Leer `project.yaml` si existe. Obtener:
|
|
23
|
+
- `project.mode` (startup/standard/enterprise) — default: startup si no existe
|
|
24
|
+
- `stack.*` — stack técnico del proyecto
|
|
25
|
+
- `agents.active` — agentes disponibles (para conocer el dominio, no para spawnearlos)
|
|
26
|
+
|
|
27
|
+
Si `project.yaml` no existe, continuar con defaults: mode=startup.
|
|
28
|
+
|
|
29
|
+
## Paso 3 — Proponer plan de implementación
|
|
30
|
+
|
|
31
|
+
Evaluar la naturaleza de la tarea según el acceptance criteria de la spec.
|
|
32
|
+
|
|
33
|
+
Presentar un plan de implementación secuencial organizado por rol:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Plan de implementación:
|
|
37
|
+
1. [Backend] Implementar endpoints/lógica de negocio: <descripción>
|
|
38
|
+
2. [Frontend] Construir componentes UI: <descripción>
|
|
39
|
+
3. [Tests] Escribir tests para los cambios: <descripción>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Adaptar el plan según el `project.mode`:
|
|
43
|
+
- **startup**: plan mínimo (1-2 pasos, sin separación rígida de roles)
|
|
44
|
+
- **standard**: plan con separación backend/frontend/tests
|
|
45
|
+
- **enterprise**: plan con separación backend/frontend/tests + revisión de compliance al final
|
|
46
|
+
|
|
47
|
+
## Paso 4 — Confirmar con el usuario
|
|
48
|
+
|
|
49
|
+
Preguntar: "¿Aprobás este plan o querés ajustarlo?"
|
|
50
|
+
|
|
51
|
+
Si el usuario ajusta: modificar el plan según su feedback antes de ejecutar.
|
|
52
|
+
|
|
53
|
+
Si se usó `--autorun`: advertir una sola vez "Modo --autorun: ejecutaré hasta completar sin confirmaciones intermedias." y continuar.
|
|
54
|
+
|
|
55
|
+
## Paso 5 — Ejecutar en serie
|
|
56
|
+
|
|
57
|
+
Implementar cada paso del plan secuencialmente. Por cada paso:
|
|
58
|
+
|
|
59
|
+
1. Anunciar: "Implementando: [descripción del paso]"
|
|
60
|
+
2. Ejecutar los cambios de código necesarios
|
|
61
|
+
3. Si hay tests para este paso: escribirlos junto con el código, no al final
|
|
62
|
+
4. Reportar: "Completado: [descripción breve de qué se hizo]"
|
|
63
|
+
|
|
64
|
+
En modo estándar (sin `--autorun`): pausar brevemente entre pasos para permitir que el usuario intervenga si algo no está bien.
|
|
65
|
+
|
|
66
|
+
Seguir el acceptance criteria de la spec como checklist — marcar cada ítem cuando esté implementado.
|
|
67
|
+
|
|
68
|
+
## Paso 6 — Verificar implementación
|
|
69
|
+
|
|
70
|
+
Al completar todos los pasos, ejecutar:
|
|
71
|
+
- El comando de tests del proyecto (según stack en `project.yaml`)
|
|
72
|
+
- El comando de lint si está disponible
|
|
73
|
+
|
|
74
|
+
Reportar los resultados. Si hay fallos: describirlos y resolverlos antes de continuar.
|
|
75
|
+
|
|
76
|
+
## Paso 7 — Actualizar la spec
|
|
77
|
+
|
|
78
|
+
- Al iniciar la implementación: cambiar `**Estado:** ready` → `**Estado:** in-progress`
|
|
79
|
+
- Al completar exitosamente: cambiar `**Estado:** in-progress` → `**Estado:** implemented`
|
|
80
|
+
- Completar las secciones "Implementation notes" y "Decisiones tomadas" con lo que se hizo
|
|
81
|
+
|
|
82
|
+
Confirmar: "Implementación completa. Spec actualizada a `implemented`. Podés ejecutar `/review` y luego `/ship`."
|