@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,177 @@
|
|
|
1
|
+
# Skill: browser-test
|
|
2
|
+
|
|
3
|
+
Automatización de navegador para verificar UI en desarrollo, testear visualmente
|
|
4
|
+
flujos críticos y capturar evidencia. Usa `agent-browser` (CLI en Rust sobre CDP).
|
|
5
|
+
|
|
6
|
+
Triggers: /browser-test, "abrir en browser", "screenshot de", "verificar que
|
|
7
|
+
renderiza", "testear visualmente", "navegar a", "probar el flujo de", "ver cómo
|
|
8
|
+
se ve", "revisar esta URL", "capturar pantalla de", "test visual", "open <url>".
|
|
9
|
+
|
|
10
|
+
Prerequisito: `agent-browser` instalado globalmente.
|
|
11
|
+
Instalar: `npm i -g agent-browser && agent-browser install`
|
|
12
|
+
Verificar: `agent-browser --version`
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Cuándo usar este skill
|
|
17
|
+
|
|
18
|
+
- Verificar que una página renderiza correctamente antes de dar una tarea por terminada
|
|
19
|
+
- Testear visualmente flujos críticos (login, onboarding, formularios)
|
|
20
|
+
- Inspeccionar una URL que el usuario proporciona
|
|
21
|
+
- Capturar screenshots como evidencia de implementación o compliance
|
|
22
|
+
- Hacer diff visual entre dos versiones de una misma página
|
|
23
|
+
- Testear responsive en viewport mobile sin abrir DevTools manualmente
|
|
24
|
+
- Extraer contenido de una URL pública para investigación
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Flujo core
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# 1. Navegar y ver qué hay
|
|
32
|
+
agent-browser open <url>
|
|
33
|
+
agent-browser snapshot -i # accessibility tree — interactive elements only
|
|
34
|
+
# produce refs @e1, @e2... para interactuar
|
|
35
|
+
|
|
36
|
+
# 2. Interactuar con refs del snapshot
|
|
37
|
+
agent-browser click @e3
|
|
38
|
+
agent-browser fill @e4 "texto"
|
|
39
|
+
agent-browser snapshot -i # re-snapshot SIEMPRE después de un cambio de página
|
|
40
|
+
|
|
41
|
+
# 3. Capturar estado
|
|
42
|
+
agent-browser screenshot # guarda a /tmp auto-named
|
|
43
|
+
agent-browser screenshot page.png # o a un path específico
|
|
44
|
+
agent-browser close
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Los refs (`@e1`, `@e2`...) se vuelven stale al cambiar la página. Siempre
|
|
48
|
+
re-snapshot antes del siguiente ref interaction.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Casos de uso frecuentes
|
|
53
|
+
|
|
54
|
+
### Verificar que una ruta dev renderiza
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
agent-browser open http://localhost:3000/ruta
|
|
58
|
+
agent-browser snapshot -i # leer si hay errores o elementos esperados
|
|
59
|
+
agent-browser screenshot check.png
|
|
60
|
+
agent-browser close
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Diff visual entre dos versiones
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Tomar baseline antes del cambio
|
|
67
|
+
agent-browser open http://localhost:3000/pagina && agent-browser screenshot baseline.png
|
|
68
|
+
|
|
69
|
+
# Después del cambio
|
|
70
|
+
agent-browser open http://localhost:3000/pagina && agent-browser diff screenshot --baseline baseline.png
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Testear en mobile viewport
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
agent-browser set device "iPhone 14"
|
|
77
|
+
agent-browser open <url>
|
|
78
|
+
agent-browser screenshot mobile.png
|
|
79
|
+
agent-browser close
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Extraer contenido de una URL
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
agent-browser open <url>
|
|
86
|
+
agent-browser snapshot # árbol completo, sin filtro -i
|
|
87
|
+
agent-browser get text "#main" # extraer texto de un selector
|
|
88
|
+
agent-browser close
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Verificar web vitals
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
agent-browser vitals <url> --json # LCP, CLS, TTFB, FCP, INP
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Inspeccionar network requests
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
agent-browser open <url>
|
|
101
|
+
agent-browser wait --load networkidle
|
|
102
|
+
agent-browser network requests --type xhr,fetch --json # APIs llamadas
|
|
103
|
+
agent-browser network requests --method POST --json # solo POSTs
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Selección de elementos
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Por ref del snapshot (recomendado — determinístico)
|
|
112
|
+
agent-browser click @e2
|
|
113
|
+
|
|
114
|
+
# Por CSS selector
|
|
115
|
+
agent-browser click "#submit-btn"
|
|
116
|
+
agent-browser click ".card:first-child"
|
|
117
|
+
|
|
118
|
+
# Por semántica (más robusto que CSS en apps dinámicas)
|
|
119
|
+
agent-browser find role button click --name "Guardar"
|
|
120
|
+
agent-browser find label "Email" fill "test@test.com"
|
|
121
|
+
agent-browser find text "Aceptar todo" click
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Captura de screenshots
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
agent-browser screenshot # PNG a /tmp, auto-named
|
|
130
|
+
agent-browser screenshot ./shots/page.png # path específico
|
|
131
|
+
agent-browser screenshot --full # full page scroll
|
|
132
|
+
agent-browser screenshot --annotate # overlay con refs numerados
|
|
133
|
+
agent-browser pdf report.pdf # PDF de la página actual
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Con `--annotate`, los labels `[N]` corresponden a `@eN` — útil para debuggear
|
|
137
|
+
qué elemento es qué en páginas densas.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Opciones útiles para testing local
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# Ignorar HTTPS self-signed (localhost con cert local)
|
|
145
|
+
agent-browser --ignore-https-errors open https://localhost:3000
|
|
146
|
+
|
|
147
|
+
# Dark/Light mode
|
|
148
|
+
agent-browser set media dark
|
|
149
|
+
agent-browser screenshot dark-mode.png
|
|
150
|
+
|
|
151
|
+
# Viewport custom
|
|
152
|
+
agent-browser set viewport 1440 900
|
|
153
|
+
agent-browser set viewport 375 812 # iPhone SE
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Diagnóstico si algo falla
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
agent-browser doctor --quick # verifica instalación de Chrome y daemon
|
|
162
|
+
agent-browser console # ver errores de JS en la página
|
|
163
|
+
agent-browser errors # uncaught exceptions
|
|
164
|
+
agent-browser --headed open <url> # abrir visible para debuggear manualmente
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Si el binario no está en PATH:
|
|
168
|
+
- Buscar con: `which agent-browser` o `npm root -g`
|
|
169
|
+
- Invocar con ruta completa mientras se resuelve el PATH
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Relación con otros skills
|
|
174
|
+
|
|
175
|
+
- `security-audit`: usar browser-test para verificar visualmente que no hay info sensible expuesta en la UI.
|
|
176
|
+
- `new-feature`: al terminar una feature con UI, correr browser-test para capturar screenshot de evidencia.
|
|
177
|
+
- No depende de otros skills (es standalone).
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Skill: db-migrate
|
|
2
|
+
|
|
3
|
+
Flujo seguro para ejecutar migraciones de base de datos. Compatible con Prisma, Drizzle,
|
|
4
|
+
ActiveRecord (Rails), Alembic (Python) y Goose (Go).
|
|
5
|
+
|
|
6
|
+
Triggers: /db-migrate, "migrar schema", "actualizar base de datos", "migrar BD",
|
|
7
|
+
"cambios en schema", "nueva migración".
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Cuándo usar este skill
|
|
12
|
+
|
|
13
|
+
- Al modificar el schema de la base de datos
|
|
14
|
+
- Antes y después de agregar modelos, columnas o índices
|
|
15
|
+
- Al resolver conflictos de migración entre branches
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Paso 1 — Determinar ambiente y ORM
|
|
20
|
+
|
|
21
|
+
El ORM está en `project.yaml` bajo `stack.database`. El ambiente determina el flujo:
|
|
22
|
+
|
|
23
|
+
| Ambiente | Objetivo |
|
|
24
|
+
|----------|---------|
|
|
25
|
+
| **Desarrollo local** | Iteración rápida, puede reiniciarse |
|
|
26
|
+
| **Staging** | Igual que producción, con datos de prueba |
|
|
27
|
+
| **Producción** | Sin pérdida de datos, con backup previo |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Paso 2 — Validar antes de migrar (siempre)
|
|
32
|
+
|
|
33
|
+
### Prisma
|
|
34
|
+
```bash
|
|
35
|
+
npx prisma validate # verifica que el schema compila
|
|
36
|
+
npx tsc --noEmit # verifica que los tipos siguen siendo válidos
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Drizzle
|
|
40
|
+
```bash
|
|
41
|
+
npx drizzle-kit check # detecta drift entre schema y BD
|
|
42
|
+
npx tsc --noEmit
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### ActiveRecord (Rails)
|
|
46
|
+
```bash
|
|
47
|
+
rails db:migrate:status # ver migraciones pendientes
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Alembic (Python)
|
|
51
|
+
```bash
|
|
52
|
+
alembic check # compara heads con BD actual
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Goose (Go)
|
|
56
|
+
```bash
|
|
57
|
+
goose status # ver migraciones pendientes
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Paso 3 — Ejecutar migración
|
|
63
|
+
|
|
64
|
+
### Desarrollo
|
|
65
|
+
|
|
66
|
+
**Prisma**
|
|
67
|
+
```bash
|
|
68
|
+
npx prisma migrate dev --name <descripcion-snake-case>
|
|
69
|
+
# o para sync rápido sin historial:
|
|
70
|
+
npx prisma db push
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Drizzle**
|
|
74
|
+
```bash
|
|
75
|
+
npx drizzle-kit push # sync directo
|
|
76
|
+
# o con historial:
|
|
77
|
+
npx drizzle-kit generate && npx drizzle-kit migrate
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Rails**
|
|
81
|
+
```bash
|
|
82
|
+
rails db:migrate
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Alembic**
|
|
86
|
+
```bash
|
|
87
|
+
alembic revision --autogenerate -m "descripcion"
|
|
88
|
+
alembic upgrade head
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Goose**
|
|
92
|
+
```bash
|
|
93
|
+
goose create descripcion sql
|
|
94
|
+
goose up
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
### Producción — pasos adicionales obligatorios
|
|
100
|
+
|
|
101
|
+
1. **Backup ANTES de migrar**
|
|
102
|
+
```bash
|
|
103
|
+
# PostgreSQL genérico:
|
|
104
|
+
pg_dump $DATABASE_URL > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
105
|
+
|
|
106
|
+
# O usar el script del proyecto si existe (db:backup:prod)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
2. **Verificar que la migración no es destructiva**
|
|
110
|
+
```bash
|
|
111
|
+
# Leer el archivo SQL generado antes de aplicar
|
|
112
|
+
# Señales de peligro: DROP COLUMN, DROP TABLE, TRUNCATE, NOT NULL sin default
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
3. **Aplicar en producción**
|
|
116
|
+
|
|
117
|
+
**Prisma**: `npx prisma migrate deploy` (nunca `db push` en prod)
|
|
118
|
+
|
|
119
|
+
**Drizzle**: `npx drizzle-kit migrate` (el proyecto debe tener un script dedicado)
|
|
120
|
+
|
|
121
|
+
**Rails**: `RAILS_ENV=production rails db:migrate`
|
|
122
|
+
|
|
123
|
+
**Alembic**: `alembic upgrade head` (con DATABASE_URL de producción)
|
|
124
|
+
|
|
125
|
+
**Goose**: `goose -env production up`
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Paso 4 — Post-migración (siempre)
|
|
130
|
+
|
|
131
|
+
1. **Regenerar cliente/tipos** (si aplica)
|
|
132
|
+
```bash
|
|
133
|
+
npx prisma generate # Prisma
|
|
134
|
+
npx drizzle-kit generate # Drizzle (si usa tipos generados)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
2. **Verificar que el build sigue pasando**
|
|
138
|
+
```bash
|
|
139
|
+
# TypeScript: pnpm build / npm run build
|
|
140
|
+
# Python: mypy . / pytest
|
|
141
|
+
# Go: go build ./...
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
3. **Actualizar documentación** — si el proyecto tiene knowledge base (Obsidian, wiki), actualizar la sección de base de datos.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Señales de alerta — STOP y consultar
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
✗ La migración contiene DROP COLUMN o DROP TABLE en producción sin backup confirmado
|
|
152
|
+
✗ El ORM reporta "drift" entre schema y BD — investigar causa antes de continuar
|
|
153
|
+
✗ npx prisma migrate reset o rails db:schema:load en producción → borra todo
|
|
154
|
+
✗ --force-reset / --force en cualquier contexto productivo
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Relación con otros skills
|
|
160
|
+
|
|
161
|
+
- `new-feature` lo invoca cuando la feature requiere cambios de schema.
|
|
162
|
+
- No depende de otros skills (es standalone).
|
|
163
|
+
- Si el proyecto usa Obsidian, actualizar vault después de migrar en producción.
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Skill: local2prod
|
|
2
|
+
|
|
3
|
+
Flujo completo de publicación a producción. Compatible con Vercel, Railway, Fly.io,
|
|
4
|
+
GitHub Actions y pipelines custom.
|
|
5
|
+
|
|
6
|
+
NUNCA dar una tarea por terminada sin que el deploy esté en estado READY/SUCCESS.
|
|
7
|
+
|
|
8
|
+
Triggers: /local2prod, "publicar", "deploy", "subir a producción", "push a prod",
|
|
9
|
+
"lanzar cambios", "ir a producción".
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Cuándo usar este skill
|
|
14
|
+
|
|
15
|
+
Al terminar una feature y querer desplegarla a producción.
|
|
16
|
+
El provider de deploy está en `project.yaml` bajo `deploy.provider`.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Paso 1 — Commit
|
|
21
|
+
|
|
22
|
+
Si hay cambios sin commitear:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
git add <archivos relevantes> # preferir archivos específicos, no git add -A
|
|
26
|
+
git status # confirmar qué va al commit
|
|
27
|
+
|
|
28
|
+
git commit -m "tipo(scope): descripción en imperativo
|
|
29
|
+
|
|
30
|
+
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Si ya hay un commit listo, ir directo al Paso 2.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Paso 2 — Push
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
git push origin <branch>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
En proyectos con trunk-based development, el push a `main` trigerea el deploy automáticamente.
|
|
44
|
+
En proyectos con PRs, el deploy se crea al mergear.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Paso 3 — Esperar deploy READY
|
|
49
|
+
|
|
50
|
+
**Regla de polling — OBLIGATORIA**:
|
|
51
|
+
1. Hacer UNA verificación, leer el resultado, reportar el estado.
|
|
52
|
+
2. Si sigue en Building/Running: decirle al usuario el estado actual y esperar **~60 segundos** antes de la siguiente verificación.
|
|
53
|
+
3. **NUNCA** encadenar verificaciones automáticamente sin pausa.
|
|
54
|
+
4. Máximo 1 verificación por minuto.
|
|
55
|
+
|
|
56
|
+
### Por provider
|
|
57
|
+
|
|
58
|
+
**Vercel** (leer provider config de project.yaml o env vars):
|
|
59
|
+
```bash
|
|
60
|
+
vercel ls --scope <teamId> 2>&1 | head -8
|
|
61
|
+
# Columna Status: ● Building → esperar | ● Ready → OK | ✗ Error → ver logs
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Railway**:
|
|
65
|
+
```bash
|
|
66
|
+
railway status
|
|
67
|
+
# o: railway run --service <name> -- echo OK
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Fly.io**:
|
|
71
|
+
```bash
|
|
72
|
+
fly status --app <app-name>
|
|
73
|
+
# Buscar: Machines running
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**GitHub Actions**:
|
|
77
|
+
```bash
|
|
78
|
+
gh run list --limit 3
|
|
79
|
+
gh run watch <run-id> # bloquea hasta que termine
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Custom / otro**:
|
|
83
|
+
```bash
|
|
84
|
+
# Usar el comando definido en project.yaml bajo deploy.check_command
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Si hay ERROR
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Vercel:
|
|
91
|
+
vercel inspect <deployment-url> --logs 2>&1 | tail -40
|
|
92
|
+
|
|
93
|
+
# GitHub Actions:
|
|
94
|
+
gh run view <run-id> --log-failed
|
|
95
|
+
|
|
96
|
+
# Railway / Fly:
|
|
97
|
+
# Ver logs en el dashboard del provider
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
1. Identificar el error (build, typecheck, runtime)
|
|
101
|
+
2. Corregir el código
|
|
102
|
+
3. Volver al Paso 1
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Paso 4 — Verificar runtime logs
|
|
107
|
+
|
|
108
|
+
Una vez que el deploy está READY, verificar que no haya errores de runtime (500, crashes, errores de DB):
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Vercel:
|
|
112
|
+
vercel logs <deployment-url> 2>&1 | tail -20
|
|
113
|
+
|
|
114
|
+
# Fly:
|
|
115
|
+
fly logs --app <app-name>
|
|
116
|
+
|
|
117
|
+
# Railway:
|
|
118
|
+
railway logs
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Si hay errores → corregir y repetir desde Paso 1.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Paso 5 — Actualizar documentación [OPCIONAL]
|
|
126
|
+
|
|
127
|
+
Si el proyecto tiene un knowledge base configurado (Obsidian, wiki, Notion):
|
|
128
|
+
|
|
129
|
+
- Si hubo cambios de infra (nuevas env vars, cambios de schema, nuevas rutas) → actualizar la sección de deploy/infra.
|
|
130
|
+
- Si el proyecto usa `obsidian-sync` → invocar ese skill ahora.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Reglas críticas
|
|
135
|
+
|
|
136
|
+
- **NUNCA** declarar la tarea terminada sin `state: READY / SUCCESS` confirmado.
|
|
137
|
+
- **NUNCA** asumir que el push implica deploy exitoso — siempre verificar.
|
|
138
|
+
- Si el deploy falla 3 veces seguidas → notificar al usuario y detener. No seguir en loop automático.
|
|
139
|
+
- Si el pipeline queda en QUEUED por más de 2 minutos → investigar si hay otro deploy bloqueando.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Relación con otros skills
|
|
144
|
+
|
|
145
|
+
- `new-feature` lo invoca como último paso del flujo de implementación.
|
|
146
|
+
- `obsidian-sync` puede ser invocado en el Paso 5 si está configurado (opcional).
|
|
147
|
+
- No tiene dependencias obligatorias — puede usarse standalone.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Skill: new-feature
|
|
2
|
+
|
|
3
|
+
Checklist completo para implementar una nueva feature desde planificación hasta deploy.
|
|
4
|
+
Orquesta los otros skills del proyecto en el orden correcto.
|
|
5
|
+
|
|
6
|
+
Triggers: /new-feature, "nueva feature", "quiero agregar", "implementar",
|
|
7
|
+
"agregar funcionalidad", "nueva sección", "empezar feature".
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Cuándo usar este skill
|
|
12
|
+
|
|
13
|
+
Al comenzar a implementar cualquier feature nueva, por pequeña que sea.
|
|
14
|
+
Asegura que no se saltee la spec, la seguridad ni el deploy.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Fase 1 — Verificar que existe la spec
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
¿Existe docs/specs/<ID>-<nombre>.md con estado APPROVED?
|
|
22
|
+
→ Sí: continuar
|
|
23
|
+
→ No: STOP — usar el skill /spec para crear la spec primero
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Leer la spec antes de escribir una sola línea de código.
|
|
27
|
+
Identificar qué módulos toca: BD, API, UI, infra, auth.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Fase 2 — Leer documentación existente del área
|
|
32
|
+
|
|
33
|
+
Si el proyecto tiene un knowledge base (Obsidian, wiki, docs/):
|
|
34
|
+
|
|
35
|
+
| Si la feature toca... | Leer primero... |
|
|
36
|
+
|-----------------------|-----------------|
|
|
37
|
+
| API / endpoints | docs de API del proyecto |
|
|
38
|
+
| Schema de BD | docs de BD / migraciones previas |
|
|
39
|
+
| UI / componentes | design system del proyecto |
|
|
40
|
+
| Auth / sesiones | docs de auth del proyecto |
|
|
41
|
+
| Deploy / infra | docs de infra / variables de entorno |
|
|
42
|
+
|
|
43
|
+
Si el proyecto usa `obsidian-sync`: leer las notas del vault antes de implementar.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Fase 3 — Evaluar si crear agent team
|
|
48
|
+
|
|
49
|
+
**Crear team de agentes cuando**:
|
|
50
|
+
- La feature toca más de 3 archivos en capas distintas (BD + API + UI)
|
|
51
|
+
- El trabajo es paralelizable (backend y frontend pueden ir en paralelo)
|
|
52
|
+
- La feature tiene criterios de compliance que requieren review independiente
|
|
53
|
+
|
|
54
|
+
**NO crear team cuando**:
|
|
55
|
+
- Es un cambio en 1-2 archivos
|
|
56
|
+
- Es un bug fix puntual
|
|
57
|
+
- Es una consulta o lectura de código
|
|
58
|
+
|
|
59
|
+
Si se crea team → usar el skill `phase-kickoff` para coordinar el spawn de agentes.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Fase 4 — Checklist de seguridad antes de implementar API routes
|
|
64
|
+
|
|
65
|
+
Invocar el skill `/security-audit` como checklist mental antes de escribir cualquier endpoint:
|
|
66
|
+
|
|
67
|
+
- [ ] ¿El endpoint verifica autenticación?
|
|
68
|
+
- [ ] ¿El endpoint verifica autorización por rol?
|
|
69
|
+
- [ ] ¿Si accede por ID, verifica ownership del recurso?
|
|
70
|
+
- [ ] ¿El input del body está validado con un schema explícito?
|
|
71
|
+
- [ ] ¿Las queries usan parámetros preparados (no interpolación)?
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Fase 5 — Orden de implementación recomendado
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
1. Schema de BD (si hay modelos nuevos)
|
|
79
|
+
→ Invocar skill /db-migrate para el flujo seguro
|
|
80
|
+
|
|
81
|
+
2. Types / interfaces compartidos
|
|
82
|
+
→ Definir antes del backend para que el frontend pueda consumirlos
|
|
83
|
+
|
|
84
|
+
3. Backend — API / servicios
|
|
85
|
+
→ Tests junto con el código, no al final
|
|
86
|
+
|
|
87
|
+
4. Frontend — UI / componentes
|
|
88
|
+
→ Consume los tipos ya definidos
|
|
89
|
+
|
|
90
|
+
5. Build check
|
|
91
|
+
→ Verificar que no hay errores de compilación antes de commitear
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Fase 6 — Post-implementación (no saltear)
|
|
97
|
+
|
|
98
|
+
1. **Actualizar la spec** con decisiones tomadas durante la implementación
|
|
99
|
+
(agregar en sección "Notas de implementación" del archivo de spec)
|
|
100
|
+
|
|
101
|
+
2. **Verificación visual** [si la feature tiene UI]
|
|
102
|
+
- Si el proyecto tiene `browser-test` activo → invocar `/browser-test` para tomar screenshot de evidencia
|
|
103
|
+
- Verificar estados: loading, error, vacío, con datos
|
|
104
|
+
|
|
105
|
+
3. **Actualizar documentación del proyecto** [si aplica]
|
|
106
|
+
- Si el proyecto usa `obsidian-sync` → invocar ese skill ahora
|
|
107
|
+
- Si hay wiki o docs/ → actualizar la sección correspondiente
|
|
108
|
+
|
|
109
|
+
4. **Deploy** → invocar skill `/local2prod`
|
|
110
|
+
- Esperar estado READY/SUCCESS antes de declarar la feature terminada
|
|
111
|
+
|
|
112
|
+
5. **Marcar spec como IMPLEMENTED**
|
|
113
|
+
```bash
|
|
114
|
+
# En docs/specs/<ID>-<nombre>.md, cambiar:
|
|
115
|
+
# > Estado: APPROVED
|
|
116
|
+
# por:
|
|
117
|
+
# > Estado: IMPLEMENTED
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
5. **Actualizar CLAUDE.md** — mover el ID de spec de "En curso" a "Completadas"
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Checklist final
|
|
125
|
+
|
|
126
|
+
- [ ] Spec leída y estado APPROVED verificado
|
|
127
|
+
- [ ] Documentación del área leída antes de implementar
|
|
128
|
+
- [ ] Checklist de seguridad aplicado a endpoints nuevos
|
|
129
|
+
- [ ] DB migrada correctamente (dev y prod si aplica)
|
|
130
|
+
- [ ] Build pasando sin errores
|
|
131
|
+
- [ ] Screenshot de evidencia tomado (si hay UI y `browser-test` activo)
|
|
132
|
+
- [ ] Spec actualizada con decisiones de implementación
|
|
133
|
+
- [ ] Documentación del proyecto actualizada
|
|
134
|
+
- [ ] Deploy exitoso (estado READY confirmado)
|
|
135
|
+
- [ ] Spec marcada como IMPLEMENTED
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Relación con otros skills
|
|
140
|
+
|
|
141
|
+
Este skill orquesta los siguientes — no los reemplaza, los invoca en orden:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
new-feature
|
|
145
|
+
├── spec (Fase 1 — verificar/crear spec)
|
|
146
|
+
├── phase-kickoff (Fase 3 — si se crea team de agentes)
|
|
147
|
+
├── security-audit (Fase 4 — checklist de seguridad)
|
|
148
|
+
├── db-migrate (Fase 5 — si hay cambios de schema)
|
|
149
|
+
├── browser-test (Fase 6 — [OPCIONAL] screenshot de evidencia si hay UI)
|
|
150
|
+
├── obsidian-sync (Fase 6 — [OPCIONAL] si el proyecto lo tiene configurado)
|
|
151
|
+
└── local2prod (Fase 6 — deploy a producción)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Dependencias opcionales: `browser-test` solo se invoca si está en `project.yaml` bajo `skills.active`.
|
|
155
|
+
`obsidian-sync` solo se invoca si está en `project.yaml` bajo `skills.integrations`.
|