@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.
Files changed (153) hide show
  1. package/CHANGELOG.md +228 -0
  2. package/LICENSE +191 -0
  3. package/README.md +156 -0
  4. package/assets/adapters/claude-code/commands/deploy-check.md +12 -0
  5. package/assets/adapters/claude-code/commands/new-feature.md +11 -0
  6. package/assets/adapters/claude-code/commands/plan.md +116 -0
  7. package/assets/adapters/claude-code/commands/review.md +219 -0
  8. package/assets/adapters/claude-code/commands/session-close.md +109 -0
  9. package/assets/adapters/claude-code/commands/session-start.md +59 -0
  10. package/assets/adapters/claude-code/commands/ship.md +133 -0
  11. package/assets/adapters/claude-code/commands/wiki-ingest.md +7 -0
  12. package/assets/adapters/claude-code/commands/wiki-lint.md +5 -0
  13. package/assets/adapters/claude-code/commands/wiki-query.md +7 -0
  14. package/assets/adapters/claude-code/commands/work.md +101 -0
  15. package/assets/adapters/claude-code/generate-claude-md.py +304 -0
  16. package/assets/adapters/codex/commands/plan.md +63 -0
  17. package/assets/adapters/codex/commands/review.md +53 -0
  18. package/assets/adapters/codex/commands/session-close.md +53 -0
  19. package/assets/adapters/codex/commands/session-start.md +49 -0
  20. package/assets/adapters/codex/commands/ship.md +53 -0
  21. package/assets/adapters/codex/commands/work.md +53 -0
  22. package/assets/adapters/codex/generate-codex-config.py +269 -0
  23. package/assets/adapters/codex/hooks/codex.yaml.tpl +43 -0
  24. package/assets/adapters/codex/hooks/forge-codex-finish.sh +158 -0
  25. package/assets/adapters/codex/hooks/forge-codex-start.sh +186 -0
  26. package/assets/adapters/kiro/generate-steering.py +367 -0
  27. package/assets/adapters/opencode/HOOKS.md +123 -0
  28. package/assets/adapters/opencode/commands/plan.md +119 -0
  29. package/assets/adapters/opencode/commands/review.md +164 -0
  30. package/assets/adapters/opencode/commands/session-close.md +111 -0
  31. package/assets/adapters/opencode/commands/session-start.md +62 -0
  32. package/assets/adapters/opencode/commands/ship.md +135 -0
  33. package/assets/adapters/opencode/commands/work.md +82 -0
  34. package/assets/adapters/opencode/generate-agents-md.py +262 -0
  35. package/assets/core/agents/backend-engineer.md +61 -0
  36. package/assets/core/agents/compliance-reviewer.md +83 -0
  37. package/assets/core/agents/docs-writer.md +77 -0
  38. package/assets/core/agents/frontend-engineer.md +70 -0
  39. package/assets/core/agents/orchestrator.md +104 -0
  40. package/assets/core/agents/security-auditor.md +54 -0
  41. package/assets/core/agents/test-engineer.md +57 -0
  42. package/assets/core/hooks/hooks-registry.yaml +48 -0
  43. package/assets/core/hooks/post-turn-check.sh +139 -0
  44. package/assets/core/hooks/pre-bash-check.py +202 -0
  45. package/assets/core/hooks/pre-edit-check.py +317 -0
  46. package/assets/core/hooks/session-start.sh +184 -0
  47. package/assets/core/schemas/project.schema.json +503 -0
  48. package/assets/core/skills/README.md +88 -0
  49. package/assets/core/skills/aitmpl-search/SKILL.md +74 -0
  50. package/assets/core/skills/browser-test/SKILL.md +177 -0
  51. package/assets/core/skills/db-migrate/SKILL.md +163 -0
  52. package/assets/core/skills/local2prod/SKILL.md +147 -0
  53. package/assets/core/skills/new-feature/SKILL.md +155 -0
  54. package/assets/core/skills/obsidian-sync/SKILL.md +152 -0
  55. package/assets/core/skills/phase-kickoff/SKILL.md +69 -0
  56. package/assets/core/skills/security-audit/SKILL.md +125 -0
  57. package/assets/core/skills/spec/SKILL.md +72 -0
  58. package/assets/core/skills/wiki-ingest/SKILL.md +183 -0
  59. package/assets/core/skills/wiki-lint/SKILL.md +109 -0
  60. package/assets/core/skills/wiki-query/SKILL.md +100 -0
  61. package/assets/core/templates/claude-md/architecture.rules +20 -0
  62. package/assets/core/templates/claude-md/global.md +30 -0
  63. package/assets/core/templates/claude-md/project.md +36 -0
  64. package/assets/core/templates/daily-note.md +38 -0
  65. package/assets/core/templates/spec-template.md +43 -0
  66. package/assets/core/workflows/sdd.md +69 -0
  67. package/assets/core/workflows/sprint.md +59 -0
  68. package/assets/forge.py +1265 -0
  69. package/assets/hooks/pre-commit +43 -0
  70. package/assets/manifest.json +274 -0
  71. package/assets/profiles/astro/README.md +24 -0
  72. package/assets/profiles/astro/agents/frontend-engineer.md +74 -0
  73. package/assets/profiles/django/agents/api-engineer.md +83 -0
  74. package/assets/profiles/expo/README.md +24 -0
  75. package/assets/profiles/expo/agents/mobile-engineer.md +69 -0
  76. package/assets/profiles/express/agents/api-engineer.md +60 -0
  77. package/assets/profiles/fastapi/README.md +32 -0
  78. package/assets/profiles/fastapi/agents/api-engineer.md +87 -0
  79. package/assets/profiles/go-gin/agents/api-engineer.md +98 -0
  80. package/assets/profiles/hono-drizzle/README.md +31 -0
  81. package/assets/profiles/hono-drizzle/agents/api-engineer.md +82 -0
  82. package/assets/profiles/laravel/README.md +32 -0
  83. package/assets/profiles/laravel/agents/api-engineer.md +114 -0
  84. package/assets/profiles/laravel/agents/fullstack-engineer.md +67 -0
  85. package/assets/profiles/laravel/agents/migration-specialist.md +420 -0
  86. package/assets/profiles/nestjs/agents/api-engineer.md +79 -0
  87. package/assets/profiles/nextjs-admin/README.md +32 -0
  88. package/assets/profiles/nextjs-admin/agents/admin-engineer.md +78 -0
  89. package/assets/profiles/playwright-crawler/agents/scanner-engineer.md +51 -0
  90. package/assets/profiles/rails/agents/fullstack-engineer.md +61 -0
  91. package/assets/profiles/sveltekit/agents/frontend-engineer.md +96 -0
  92. package/assets/profiles/vuenuxt/agents/frontend-engineer.md +82 -0
  93. package/assets/profiles/wordpress/README.md +30 -0
  94. package/assets/profiles/wordpress/agents/divi-engineer.md +273 -0
  95. package/assets/profiles/wordpress/agents/elementor-engineer.md +310 -0
  96. package/assets/profiles/wordpress/agents/wp-engineer.md +216 -0
  97. package/assets/requirements.txt +2 -0
  98. package/assets/scripts/aitmpl-search.py +808 -0
  99. package/assets/scripts/forge-add-opportunities.py +92 -0
  100. package/assets/scripts/forge-audit.py +1061 -0
  101. package/assets/scripts/forge-generate-all.py +283 -0
  102. package/assets/scripts/forge-init.py +900 -0
  103. package/assets/scripts/forge-migrate-project-yaml.py +397 -0
  104. package/assets/scripts/forge-scaffold-profile.py +181 -0
  105. package/assets/scripts/forge-teardown.py +193 -0
  106. package/assets/scripts/forge-validate-project-yaml.py +457 -0
  107. package/assets/scripts/forge-wizard.py +1003 -0
  108. package/assets/scripts/setup-codex.sh +229 -0
  109. package/assets/scripts/team-install.sh +147 -0
  110. package/assets/scripts/token-stats.py +201 -0
  111. package/assets/templates/modes/enterprise.yaml.tpl +114 -0
  112. package/assets/templates/modes/multi-runtime.yaml.tpl +89 -0
  113. package/assets/templates/modes/new-stack.yaml.tpl +101 -0
  114. package/assets/templates/modes/startup.yaml.tpl +74 -0
  115. package/assets/templates/project.yaml.tpl +185 -0
  116. package/assets/templates/wiki/concepts/_template.md +22 -0
  117. package/assets/templates/wiki/entities/_template.md +19 -0
  118. package/assets/templates/wiki/index.md +32 -0
  119. package/assets/templates/wiki/log.md +6 -0
  120. package/assets/templates/wiki/sources/_template.md +25 -0
  121. package/dist/cli.d.ts +3 -0
  122. package/dist/cli.d.ts.map +1 -0
  123. package/dist/cli.js +64 -0
  124. package/dist/cli.js.map +1 -0
  125. package/dist/commands/audit.d.ts +2 -0
  126. package/dist/commands/audit.d.ts.map +1 -0
  127. package/dist/commands/audit.js +21 -0
  128. package/dist/commands/audit.js.map +1 -0
  129. package/dist/commands/doctor.d.ts +2 -0
  130. package/dist/commands/doctor.d.ts.map +1 -0
  131. package/dist/commands/doctor.js +58 -0
  132. package/dist/commands/doctor.js.map +1 -0
  133. package/dist/commands/generate.d.ts +2 -0
  134. package/dist/commands/generate.d.ts.map +1 -0
  135. package/dist/commands/generate.js +27 -0
  136. package/dist/commands/generate.js.map +1 -0
  137. package/dist/commands/init.d.ts +2 -0
  138. package/dist/commands/init.d.ts.map +1 -0
  139. package/dist/commands/init.js +22 -0
  140. package/dist/commands/init.js.map +1 -0
  141. package/dist/commands/validate.d.ts +2 -0
  142. package/dist/commands/validate.d.ts.map +1 -0
  143. package/dist/commands/validate.js +20 -0
  144. package/dist/commands/validate.js.map +1 -0
  145. package/dist/lib/paths.d.ts +10 -0
  146. package/dist/lib/paths.d.ts.map +1 -0
  147. package/dist/lib/paths.js +49 -0
  148. package/dist/lib/paths.js.map +1 -0
  149. package/dist/lib/python.d.ts +4 -0
  150. package/dist/lib/python.d.ts.map +1 -0
  151. package/dist/lib/python.js +46 -0
  152. package/dist/lib/python.js.map +1 -0
  153. package/package.json +46 -0
@@ -0,0 +1,116 @@
1
+ # plan
2
+
3
+ Gestiona specs del ciclo SDD (Spec-Driven Development).
4
+
5
+ Scope: $ARGUMENTS (ej: `2 "Auth con OAuth"` para crear spec, `--review <archivo>` para revisar, vacío para listar)
6
+
7
+ ## Modo crear spec (`/plan <fase> "<título>"`)
8
+
9
+ ### Paso 1 — Verificar directorio
10
+
11
+ Verificar que existe `docs/specs/`. Si no existe, crearlo.
12
+
13
+ ### Paso 2 — Crear el archivo de spec
14
+
15
+ Construir el nombre del archivo:
16
+ - Tomar el título, convertirlo a minúsculas, reemplazar espacios por guiones, eliminar caracteres especiales → `<slug>`
17
+ - Nombre final: `docs/specs/<fase>-<slug>.md`
18
+
19
+ Crear el archivo con este template exacto:
20
+
21
+ ```markdown
22
+ # Spec: <título>
23
+ **Fase:** <fase> | **Estado:** draft | **Fecha:** YYYY-MM-DD
24
+
25
+ ## Problem statement
26
+ [¿Qué problema resuelve? ¿Por qué ahora?]
27
+
28
+ ## Non-goals
29
+ [Qué NO cubre esta spec]
30
+
31
+ ## Acceptance criteria
32
+ - [ ] Criterio 1 (verificable, testeable)
33
+ - [ ] Criterio 2
34
+
35
+ ## Compliance mapping
36
+ [Si el proyecto tiene frameworks de compliance en project.yaml, mapear qué artículos aplican. Si no aplica, escribir "N/A".]
37
+
38
+ ## Edge cases
39
+ [Casos límite que la implementación debe manejar]
40
+
41
+ ## Implementation notes
42
+ [Se llena durante la implementación]
43
+
44
+ ## Decisiones tomadas
45
+ [Se llena durante la implementación]
46
+ ```
47
+
48
+ ### Paso 3 — Guiar al usuario por cada sección
49
+
50
+ Preguntar una sección a la vez, en orden:
51
+
52
+ 1. "¿Qué problema concreto resuelve esta feature? ¿Por qué ahora y no más adelante?"
53
+ 2. "¿Qué queda explícitamente fuera del scope de esta spec?"
54
+ 3. "¿Cuáles son los criterios de aceptación verificables? (cada uno debe ser testeable de forma objetiva)"
55
+ 4. Si `project.yaml` tiene frameworks de compliance: "¿Qué artículos o controles de compliance aplican a esta feature?"
56
+ 5. "¿Qué casos límite debe manejar la implementación? (ej: usuario sin permisos, datos vacíos, concurrencia)"
57
+
58
+ Completar el archivo con las respuestas del usuario a medida que avanza.
59
+
60
+ ### Paso 4 — Planner-Critic (condicional)
61
+
62
+ Leer `project.yaml` → `project.mode`:
63
+
64
+ - **mode=standard o mode=enterprise**: aplicar Planner-Critic obligatoriamente
65
+ - **mode=startup**: preguntar "¿Querés aplicar el Planner-Critic para detectar ambigüedades antes de implementar? (s/n)"
66
+ - Si `project.yaml` no existe: tratar como startup
67
+
68
+ **Cómo aplicar el Planner-Critic:**
69
+
70
+ Adoptar el rol de "Critic" y revisar la spec completa buscando:
71
+ - ¿Hay acceptance criteria que no son objetivamente verificables?
72
+ - ¿Hay términos ambiguos que diferentes personas podrían interpretar distinto?
73
+ - ¿Hay edge cases no cubiertos que podrían romper la implementación?
74
+ - ¿Los non-goals son suficientemente explícitos para evitar scope creep?
75
+
76
+ Mostrar las críticas como bullet points. Preguntar: "¿Ajustamos la spec antes de marcarla como ready?"
77
+
78
+ Si el usuario ajusta: actualizar el archivo y repetir el Critic una vez más.
79
+
80
+ ### Paso 5 — Marcar como ready
81
+
82
+ Cuando el usuario aprueba la spec (o decide no aplicar el Critic):
83
+ - Cambiar `**Estado:** draft` → `**Estado:** ready` en el archivo
84
+ - Confirmar: "Spec lista: `docs/specs/<archivo>.md`. Ahora podés ejecutar `/work` para implementarla."
85
+
86
+ ---
87
+
88
+ ## Modo listar (`/plan` sin argumentos)
89
+
90
+ Buscar todos los archivos `.md` en `docs/specs/` que contengan `**Estado:** draft` o `**Estado:** in-review`.
91
+
92
+ Si no hay ninguno: "No hay specs en estado draft o in-review. Ejecutá `/plan <fase> \"<título>\"` para crear una."
93
+
94
+ Si hay alguno: mostrarlos como lista numerada con título, fase y fecha. Ejemplo:
95
+ ```
96
+ 1. auth-oauth.md — Fase 2 — Auth con OAuth (2026-05-17)
97
+ 2. billing-webpay.md — Fase 3 — Pago con WebPay (2026-05-14)
98
+ ```
99
+
100
+ Preguntar: "¿Cuál continuamos?"
101
+
102
+ ---
103
+
104
+ ## Modo revisar (`/plan --review <archivo-spec>`)
105
+
106
+ Leer el archivo de spec indicado.
107
+
108
+ Aplicar el Planner-Critic completo:
109
+ - ¿Los acceptance criteria son objetivamente testeables?
110
+ - ¿Hay ambigüedades en el problem statement o en los criterios?
111
+ - ¿Hay edge cases no cubiertos?
112
+ - ¿Los non-goals son suficientemente explícitos?
113
+
114
+ Mostrar sugerencias de mejora como bullet points con la sección específica que afectan.
115
+
116
+ Preguntar: "¿Aplicamos alguno de estos cambios?"
@@ -0,0 +1,219 @@
1
+ # review
2
+
3
+ Orquesta una revisión de código estructurada y produce un veredicto vinculante para `/ship`.
4
+
5
+ Scope: $ARGUMENTS (ej: vacío para cambios uncommitted, `HEAD~3..HEAD` para últimos 3 commits, `PR-42` para un PR específico, `--codex` para output en texto plano)
6
+
7
+ ---
8
+
9
+ ## Paso 0 — Determinar modo de invocación
10
+
11
+ Evaluar `$ARGUMENTS`:
12
+
13
+ - **Vacío**: revisar cambios uncommitted (`git diff HEAD`)
14
+ - **`HEAD~N..HEAD`** o cualquier rango git válido: revisar ese rango de commits (`git diff <rango>`)
15
+ - **`PR-N`** (ej: `PR-42`): obtener el diff del PR con `gh pr diff 42`
16
+ - **`--codex`**: activar modo Codex CLI — output en texto plano sin markdown ni tablas, misma lógica de revisión
17
+
18
+ Guardar el scope como descripción legible (ej: "cambios uncommitted", "últimos 3 commits", "PR #42") para incluirlo en el reporte final.
19
+
20
+ ---
21
+
22
+ ## Paso 1 — Obtener el diff
23
+
24
+ Según el modo detectado en el Paso 0:
25
+
26
+ - Cambios uncommitted: `git diff HEAD` (si está vacío, probar `git diff --cached`)
27
+ - Rango de commits: `git diff <rango>`
28
+ - PR: `gh pr diff <N>`
29
+
30
+ Si el diff está vacío: "No hay cambios para revisar en el scope indicado." y detener.
31
+
32
+ Mostrar un resumen de lo que se va a revisar:
33
+ ```
34
+ Revisando: <scope>
35
+ Archivos modificados: <N>
36
+ Líneas añadidas/eliminadas: +X / -Y
37
+ ```
38
+
39
+ ---
40
+
41
+ ## Paso 2 — Leer mode del proyecto
42
+
43
+ Leer `project.yaml` → `project.mode`:
44
+
45
+ - `startup`: revisión en un solo paso (Paso 3A)
46
+ - `standard`: revisión multi-agente paralela sin compliance (Paso 3B)
47
+ - `enterprise`: revisión multi-agente paralela con compliance (Paso 3B)
48
+ - Si `project.yaml` no existe o no tiene `project.mode`: tratar como `startup`
49
+
50
+ ---
51
+
52
+ ## Paso 3A — Revisión única (modo startup)
53
+
54
+ Revisar el diff completo cubriendo todas las dimensiones en un solo paso:
55
+
56
+ **Seguridad**
57
+ - ¿Hay tokens, passwords o claves hardcodeadas?
58
+ - ¿Los endpoints nuevos o modificados verifican autenticación Y autorización?
59
+ - ¿Hay concatenación de input del usuario en queries SQL (riesgo de SQLi)?
60
+ - ¿Hay output de input del usuario sin escapar (riesgo de XSS)?
61
+ - ¿Se loguea PII sin enmascarar?
62
+
63
+ **Calidad**
64
+ - ¿Hay naming confuso o inconsistente con el resto del proyecto?
65
+ - ¿Hay código muerto o lógica duplicada?
66
+ - ¿Hay N+1 queries o loops en caminos críticos?
67
+ - ¿Faltan índices para queries que se ejecutan frecuentemente?
68
+
69
+ **Tests**
70
+ - ¿Cada función o endpoint modificado tiene al menos un test correspondiente?
71
+ - ¿Los casos borde están cubiertos?
72
+
73
+ Ir directamente al Paso 4.
74
+
75
+ ---
76
+
77
+ ## Paso 3B — Revisión multi-agente paralela (modo standard/enterprise)
78
+
79
+ Lanzar los siguientes agentes en paralelo. Cada uno debe revisar el diff completo enfocándose en su dominio.
80
+
81
+ ### Agente 1 — Security reviewer
82
+
83
+ Revisar exclusivamente dimensiones de seguridad:
84
+ - Secrets hardcodeados (tokens, passwords, API keys, certificados)
85
+ - Endpoints sin verificación de autenticación o autorización
86
+ - Input del usuario concatenado en queries SQL
87
+ - Output sin escapar que pueda resultar en XSS
88
+ - PII en logs sin enmascarar
89
+ - Dependencias nuevas con vulnerabilidades conocidas
90
+
91
+ Reportar: lista de hallazgos con severidad (CRITICAL / HIGH / MEDIUM / LOW) y línea exacta.
92
+
93
+ ### Agente 2 — Quality reviewer
94
+
95
+ Revisar exclusivamente dimensiones de calidad de código:
96
+ - Naming confuso, inconsistente o engañoso
97
+ - Código muerto (funciones no llamadas, variables no usadas)
98
+ - Lógica duplicada que debería extraerse
99
+ - N+1 queries o llamadas a DB dentro de loops
100
+ - Índices faltantes para las queries nuevas o modificadas
101
+ - Violaciones de principios de responsabilidad única del agente
102
+
103
+ Reportar: lista de hallazgos con descripción y sugerencia de mejora.
104
+
105
+ ### Agente 3 — Test reviewer
106
+
107
+ Revisar exclusivamente cobertura de tests:
108
+ - Por cada función o endpoint modificado: ¿existe un test que lo cubra?
109
+ - Por cada caso borde identificado en el diff: ¿hay un test para él?
110
+ - ¿Se eliminaron tests sin eliminar también la funcionalidad correspondiente?
111
+ - ¿Los tests nuevos son significativos (no triviales o que siempre pasan)?
112
+
113
+ Reportar: lista de funciones/endpoints sin cobertura y gaps de casos borde.
114
+
115
+ ### Agente 4 — Compliance reviewer (solo enterprise)
116
+
117
+ Revisar exclusivamente dimensiones de compliance:
118
+ - ¿Hay cambios en el manejo de PII (recolección, almacenamiento, transmisión)?
119
+ - ¿Se modificaron flujos de consentimiento o se agregaron nuevos?
120
+ - ¿Hay cambios en logs de auditoría (adición, modificación o eliminación de eventos)?
121
+ - ¿Los cambios están alineados con los frameworks de compliance definidos en `project.yaml`?
122
+
123
+ Reportar: impactos de compliance con referencia al artículo o control específico si aplica.
124
+
125
+ ---
126
+
127
+ ## Paso 4 — Sintetizar veredicto
128
+
129
+ (Para modo startup: aplicar directamente. Para standard/enterprise: consolidar los reportes de todos los agentes.)
130
+
131
+ Evaluar la totalidad de los hallazgos y asignar uno de estos veredictos:
132
+
133
+ ### APPROVED
134
+ No hay hallazgos bloqueantes ni cambios requeridos. Los cambios se ven bien.
135
+
136
+ ### CHANGES_REQUESTED
137
+ Hay issues que deben resolverse pero no son críticos. Listar cada uno claramente:
138
+ ```
139
+ CHANGES_REQUESTED
140
+
141
+ Cambios requeridos:
142
+ 1. [Descripción del issue] — [archivo:línea si aplica]
143
+ 2. [Descripción del issue] — [archivo:línea si aplica]
144
+ ```
145
+
146
+ ### BLOCKED
147
+ Hay issues críticos de seguridad, compliance o correctitud que deben resolverse antes de poder hacer `/ship`. Listar cada uno claramente:
148
+ ```
149
+ BLOCKED
150
+
151
+ Issues críticos:
152
+ 1. [Descripción] — [archivo:línea si aplica] — Severidad: CRITICAL
153
+ 2. [Descripción] — [archivo:línea si aplica] — Severidad: HIGH
154
+
155
+ Esta sesión no es apta para /ship hasta resolver estos puntos.
156
+ ```
157
+
158
+ ---
159
+
160
+ ## Paso 5 — Producir reporte
161
+
162
+ Formatear el reporte final:
163
+
164
+ ```
165
+ ## Code Review — <scope>
166
+ Fecha: YYYY-MM-DD HH:MM
167
+ Modo: <startup|standard|enterprise>
168
+
169
+ ### Hallazgos
170
+
171
+ #### Seguridad
172
+ [hallazgos o "Sin hallazgos."]
173
+
174
+ #### Calidad
175
+ [hallazgos o "Sin hallazgos."]
176
+
177
+ #### Tests
178
+ [hallazgos o "Sin hallazgos."]
179
+
180
+ #### Compliance (solo enterprise)
181
+ [hallazgos o "Sin hallazgos." o "N/A (modo no-enterprise)"]
182
+
183
+ ---
184
+
185
+ ### Veredicto: <APPROVED|CHANGES_REQUESTED|BLOCKED>
186
+
187
+ [Detalle del veredicto]
188
+ ```
189
+
190
+ Si el modo es `--codex`: producir el mismo contenido pero en texto plano sin encabezados markdown, sin tablas, sin bloques de código.
191
+
192
+ ---
193
+
194
+ ## Paso 6 — Guardar resultado
195
+
196
+ Escribir el archivo `.claude/review-status.json` con el resultado:
197
+
198
+ ```json
199
+ {
200
+ "verdict": "<APPROVED|CHANGES_REQUESTED|BLOCKED>",
201
+ "reviewer": "claude-code/review",
202
+ "timestamp": "<ISO 8601>",
203
+ "scope": "<descripción del scope revisado>"
204
+ }
205
+ ```
206
+
207
+ Si el directorio `.claude/` no existe, crearlo.
208
+
209
+ Confirmar al usuario: "Review guardado en `.claude/review-status.json`. `/ship` lo leerá para verificar que el review fue aprobado antes de hacer deploy."
210
+
211
+ ---
212
+
213
+ ## Si BLOCKED
214
+
215
+ Recordar explícitamente al final del reporte:
216
+
217
+ > **Esta sesión no es apta para `/ship` hasta resolver los puntos bloqueantes listados arriba.**
218
+
219
+ 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,109 @@
1
+ # session-close
2
+
3
+ Cierra la sesión de trabajo con un pipeline de 8 pasos: commit, changeset, GitHub Projects, daily note, release notes, close commit, sync y PR.
4
+
5
+ ## Paso 1 — Verificar estado
6
+
7
+ Ejecutar `git status --short` y `git diff --stat HEAD 2>/dev/null`. Reportar qué hay pendiente.
8
+
9
+ ## Paso 2 — Commitear cambios pendientes
10
+
11
+ Si hay cambios sin commitear:
12
+
13
+ - Preguntar al usuario: "¿Qué describe este commit? (usa Conventional Commits: feat/fix/chore/docs/refactor/test)"
14
+ - Commitear con: `git add -A && git commit -m "<type>(<scope>): <descripción>"`
15
+ - Incluir siempre en el cuerpo del commit: `Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>`
16
+
17
+ Si no hay nada que commitear: indicar "Nada pendiente de commitear." y continuar.
18
+
19
+ ## Paso 3 — Changeset (condicional)
20
+
21
+ Si el commit del Paso 2 fue de tipo `feat:` o `fix:` Y `package.json` contiene `"@changesets/cli"`:
22
+
23
+ - Ejecutar `npx changeset` para generar el changeset
24
+
25
+ En cualquier otro caso, omitir este paso sin mencionarlo.
26
+
27
+ ## Paso 4 — GitHub Projects (condicional)
28
+
29
+ Leer `project.yaml`. Si tiene una sección `github.project` con `number`, `owner` y `repo`:
30
+
31
+ - Preguntar: "¿Qué issues trabajaste en esta sesión? (números separados por coma, o Enter para saltar)"
32
+ - Si el usuario provee números: ejecutar `gh issue close <N> --comment "Completado en esta sesión"` para cada uno
33
+ - Mover los issues a Done en el proyecto si es posible con gh CLI
34
+
35
+ Si `project.yaml` no tiene sección `github.project`: indicar "GitHub Projects no configurado en project.yaml." y continuar.
36
+
37
+ ## Paso 5 — Daily note
38
+
39
+ Crear el directorio `docs/daily-notes/` si no existe.
40
+
41
+ Determinar:
42
+ - `FECHA`: resultado de `date +%Y-%m-%d`
43
+ - `TEMA`: derivado del nombre de la rama actual, eliminando el prefijo de tipo y el sufijo de fecha (ej: `feature/billing-webpay-2026-05-16` → `billing-webpay`)
44
+
45
+ Crear el archivo `docs/daily-notes/FECHA-TEMA.md` con este contenido:
46
+
47
+ ```
48
+ # Session FECHA — TEMA
49
+
50
+ ## Completado
51
+ [listar qué se implementó o cambió en esta sesión]
52
+
53
+ ## Archivos modificados
54
+ [output de: git diff --name-only HEAD~1..HEAD 2>/dev/null || git diff --name-only HEAD 2>/dev/null]
55
+
56
+ ## Commits
57
+ [output de: git log --oneline HEAD~3..HEAD]
58
+
59
+ ## Decisiones tomadas
60
+ [preguntar al usuario: "¿Alguna decisión de diseño o arquitectura que vale registrar?"]
61
+
62
+ ## Blockers para próxima sesión
63
+ [preguntar al usuario: "¿Quedó algo bloqueado o incompleto?"]
64
+ ```
65
+
66
+ Completar las secciones "Archivos modificados" y "Commits" con los outputs reales. Completar "Completado", "Decisiones tomadas" y "Blockers" con las respuestas del usuario.
67
+
68
+ ## Paso 6 — RELEASE-NOTES.md
69
+
70
+ Agregar al final de `RELEASE-NOTES.md` (crear si no existe):
71
+
72
+ ```
73
+ ## FECHA — TEMA
74
+ [resumen en una línea de qué cambió]
75
+ ```
76
+
77
+ Usar el resumen de la daily note para redactar la línea.
78
+
79
+ ## Paso 7 — Commit de cierre
80
+
81
+ Commitear los archivos generados:
82
+
83
+ ```
84
+ git add docs/daily-notes/ RELEASE-NOTES.md && git commit -m "docs(progress): session close FECHA — TEMA"
85
+ ```
86
+
87
+ ## Paso 8 — Sync y PR
88
+
89
+ Ejecutar:
90
+
91
+ ```
92
+ git fetch origin main
93
+ git log HEAD..origin/main --oneline
94
+ ```
95
+
96
+ - Si main tiene commits nuevos: ejecutar `git rebase origin/main` y luego `git push --force-with-lease origin <rama-actual>`
97
+ - Si main no tiene cambios nuevos: ejecutar `git push -u origin <rama-actual>`
98
+
99
+ Luego crear el PR:
100
+
101
+ ```
102
+ gh pr create --title "<resumen de cambios>" --body "<resumen de sesión tomado de la daily note>"
103
+ ```
104
+
105
+ Si `gh` no está disponible: hacer solo el push y recordar al usuario "Crea el PR manualmente en GitHub."
106
+
107
+ ## Al finalizar el pipeline
108
+
109
+ Confirmar con: "Sesión cerrada. PR creado: [URL]" o, si gh no estuvo disponible: "Sesión cerrada. Push hecho a [branch] — crea el PR en GitHub."
@@ -0,0 +1,59 @@
1
+ # session-start
2
+
3
+ Inicializa una sesión de trabajo: detecta el estado del repo, identifica el escenario y enruta según corresponda.
4
+
5
+ ## Paso 1 — Leer estado del repo
6
+
7
+ Ejecutar los siguientes comandos y guardar sus resultados:
8
+
9
+ - `git branch --show-current` → rama actual
10
+ - `git status --short` → cambios sin commitear
11
+ - `git log --oneline -5` → commits recientes
12
+ - `gh pr list --author @me --state open --json number,title,headRefName 2>/dev/null` → PRs abiertos (saltar si gh no está disponible)
13
+ - `git branch --sort=-committerdate --format='%(refname:short)' | grep -v 'HEAD' | head -8` → ramas recientes
14
+
15
+ ## Paso 2 — Leer configuración del proyecto
16
+
17
+ - Si existe `project.yaml` en el directorio actual, leerlo para obtener: `project.mode`, `project.name`, `stack.*`, `agents.active`
18
+ - Si existe `docs/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
@@ -0,0 +1,133 @@
1
+ # ship
2
+
3
+ Pipeline de deploy de 10 pasos. Solo disponible cuando `project.yaml` tiene sección `deploy`.
4
+
5
+ ## Verificación inicial
6
+
7
+ 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.
8
+
9
+ ---
10
+
11
+ ## Paso 1 — Verificar review
12
+
13
+ Buscar en el contexto de la sesión si se ejecutó `/review` y resultó en APPROVED.
14
+
15
+ - Si hay evidencia de review aprobado: continuar.
16
+ - Si no hay evidencia: "¿Confirmás que el código fue revisado y aprobado? (s/n)"
17
+ - Si n: "Ejecutá `/review` antes de hacer deploy." y detener.
18
+
19
+ ## Paso 2 — Verificar git status
20
+
21
+ Ejecutar `git status --short`.
22
+
23
+ Si hay cambios sin commitear: "Hay cambios sin commitear. Commiteá primero antes de hacer deploy." y detener.
24
+
25
+ Si el working tree está limpio: continuar.
26
+
27
+ ## Paso 3 — Merge PR a main (condicional)
28
+
29
+ Preguntar: "¿Querés mergear el PR actual a main antes del deploy? (s/n)"
30
+
31
+ Si sí:
32
+ - Ejecutar `gh pr checks` para verificar que todos los checks pasan
33
+ - Si algún check falla: "El PR tiene checks fallando. Resolvelos antes de mergear." y detener.
34
+ - Si todos pasan: ejecutar `gh pr merge --merge` (o la estrategia configurada en `project.yaml` → `deploy.merge_strategy`)
35
+
36
+ Si no: continuar sin mergear.
37
+
38
+ ## Paso 4 — Trigger deploy
39
+
40
+ Leer `project.yaml` → `deploy.provider`:
41
+
42
+ - **vercel**: el deploy se triggeará automáticamente con el merge/push. Ejecutar `gh api repos/:owner/:repo/deployments --jq '.[0].id'` o `vercel ls --json | jq '.[0].uid'` para obtener el deployment ID más reciente. Guardar este ID para el polling.
43
+ - **railway**: ejecutar `railway up` si está disponible en el PATH.
44
+ - **fly**: ejecutar `fly deploy`.
45
+ - **aws**: indicar el comando apropiado según la configuración y pedir al usuario que lo ejecute.
46
+ - Provider no reconocido: "Provider '`<valor>`' no reconocido. Soportados: vercel, railway, fly, aws."
47
+
48
+ ## Paso 5-8 — Polling de estado con backoff
49
+
50
+ **REGLA CRITICA: máximo 1 consulta al estado del deploy por minuto. Esta regla existe porque los providers rate-limitan su API. Nunca encadenar polls consecutivos sin pausa.**
51
+
52
+ Loop de polling (máximo 20 intentos = 20 minutos):
53
+
54
+ ```
55
+ Para cada intento:
56
+ 1. Consultar estado del deploy (una sola consulta)
57
+ 2. Evaluar resultado:
58
+ - BUILDING / QUEUED / IN_PROGRESS:
59
+ Reportar: "Deploy en progreso (intento N/20)... esperando 60 segundos."
60
+ Esperar 60 segundos antes del siguiente poll.
61
+ - ERROR / FAILED / CANCELED:
62
+ Leer build logs completos.
63
+ Reportar el error al usuario con los logs relevantes.
64
+ DETENER — no continuar al Paso 9.
65
+ - READY / SUCCESS:
66
+ Continuar al Paso 9.
67
+ 3. Si se alcanzan 20 intentos sin READY: reportar timeout y detener.
68
+ ```
69
+
70
+ **Consultas según provider:**
71
+ - Vercel: `vercel inspect <deployment-id> --json | jq '.readyState'`
72
+ - Railway: `railway status`
73
+ - Fly: `fly status`
74
+
75
+ ## Paso 9 — Verificar runtime logs
76
+
77
+ Leer los primeros 60 segundos de logs post-deploy:
78
+ - Vercel: `vercel logs <deployment-url> --since 1m`
79
+ - Railway/Fly: logs equivalentes del provider
80
+
81
+ Si hay errores en los logs:
82
+ - Reportar los errores al usuario con contexto
83
+ - Sugerir rollback: "¿Querés hacer rollback al deploy anterior? (s/n)"
84
+ - **NO ejecutar rollback automáticamente — siempre requiere confirmación explícita.**
85
+ - Si el usuario confirma rollback: ejecutar el comando de rollback del provider.
86
+
87
+ Si los logs están limpios: continuar.
88
+
89
+ ## Paso 10 — Smoke tests (condicional)
90
+
91
+ Si `project.yaml` → `deploy.smoke_tests` está definido y tiene URLs:
92
+
93
+ Para cada URL de smoke test:
94
+ ```
95
+ curl -s -o /dev/null -w "%{http_code}" <url>
96
+ ```
97
+
98
+ - Si el código HTTP es 2xx: marcar como pasado.
99
+ - Si el código HTTP es 4xx o 5xx: reportar fallo.
100
+
101
+ Si algún smoke test falla:
102
+ - Reportar qué URL falló y el código HTTP
103
+ - Sugerir rollback: "¿Querés hacer rollback? (s/n)"
104
+ - **NO ejecutar rollback automáticamente.**
105
+
106
+ Si todos pasan o no hay smoke tests definidos: continuar.
107
+
108
+ ---
109
+
110
+ ## Al terminar exitosamente
111
+
112
+ Obtener la URL de producción de `project.yaml` → `deploy.production_url` o del output del provider.
113
+
114
+ Reportar: "Deploy exitoso. URL: [production_url]"
115
+
116
+ Agregar entrada al daily note si existe `docs/daily-notes/` (buscar el archivo del día actual):
117
+ ```
118
+ ## Deploy
119
+ - Fecha: YYYY-MM-DD HH:MM
120
+ - Estado: exitoso
121
+ - URL: [production_url]
122
+ ```
123
+
124
+ ---
125
+
126
+ ## Si hay errores en cualquier paso
127
+
128
+ Reportar claramente:
129
+ - En qué paso ocurrió el error
130
+ - Qué salió mal (con logs si están disponibles)
131
+ - Qué acción correctiva se sugiere
132
+
133
+ **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,7 @@
1
+ # wiki-ingest
2
+
3
+ Ingest a source into the project wiki.
4
+
5
+ Use the wiki-ingest skill to process: $ARGUMENTS
6
+
7
+ If $ARGUMENTS is empty, ask the user for the source (URL, file path, or text to ingest).
@@ -0,0 +1,5 @@
1
+ # wiki-lint
2
+
3
+ Run a health check on the project wiki: verify index integrity, find broken links, detect orphan pages, and auto-repair what's safe to fix.
4
+
5
+ Use the wiki-lint skill now. Report all issues found and list what was auto-repaired vs what needs manual attention.
@@ -0,0 +1,7 @@
1
+ # wiki-query
2
+
3
+ Query the project wiki and answer with citations.
4
+
5
+ Use the wiki-query skill to answer: $ARGUMENTS
6
+
7
+ If $ARGUMENTS is empty, ask the user what they want to look up in the wiki.