@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,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,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.
|