@saulwade/swl-ses 1.2.2 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +199 -255
- package/README.md +4 -4
- package/comandos/swl/claudemd.md +136 -0
- package/comandos/swl/salud.md +29 -0
- package/habilidades/nextjs-experto/SKILL.md +5 -5
- package/habilidades/nextjs-testing/SKILL.md +26 -1
- package/habilidades/nuevo-proyecto/SKILL.md +82 -2
- package/habilidades/planear-fase/SKILL.md +24 -4
- package/habilidades/react-experto/SKILL.md +25 -4
- package/habilidades/swl-claudemd/SKILL.md +220 -0
- package/habilidades/tdd-workflow/SKILL.md +8 -1
- package/hooks/claudemd-bloat-detector.js +161 -0
- package/hooks/lib/privacy-filter.js +42 -4
- package/manifiestos/hooks-config.json +9 -0
- package/manifiestos/modulos.json +21 -2
- package/manifiestos/skills-lock.json +68 -40
- package/package.json +87 -87
- package/plugin.json +343 -343
- package/reglas/seguridad-agentes.md +12 -0
- package/scripts/auditar-claudemd.js +297 -0
- package/scripts/instalador.js +4 -0
- package/scripts/lib/detectar-stack-detallado.js +307 -0
- package/scripts/lib/transformadores/claude.js +200 -124
- package/scripts/publicar.js +166 -12
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swl:claudemd
|
|
3
|
+
description: Audita, refactoriza, valida o inicializa archivos CLAUDE.md según best practices Anthropic (ADR-0016). Subcomandos audit (analiza calidad), refactor (sugiere extracciones), check (verifica secciones canónicas), init-user (crea ~/.claude/CLAUDE.md template), init-project (genera CLAUDE.md raíz del proyecto).
|
|
4
|
+
allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /swl:claudemd — Tratamiento profesional de CLAUDE.md
|
|
8
|
+
|
|
9
|
+
Comando para auditar, refactorizar y mantener `CLAUDE.md` siguiendo las
|
|
10
|
+
cinco recomendaciones del video oficial Anthropic *"The CLAUDE.md file"*:
|
|
11
|
+
|
|
12
|
+
1. **Compacto** — empieza sin uno, agrega solo lo que tengas que corregir
|
|
13
|
+
2. **Stack arriba** — lenguaje, framework, ORM, BD
|
|
14
|
+
3. **Commands** — cómo correr dev, tests, lint, build
|
|
15
|
+
4. **Code style** — convenciones de indentación, exports, nombrado
|
|
16
|
+
5. **Conventions** — dónde van las cosas, qué patrones preferir
|
|
17
|
+
|
|
18
|
+
**Carga**: `Skill("swl-claudemd")` — contiene la lógica de auditoría, las
|
|
19
|
+
secciones canónicas, los umbrales de inflación y los templates de
|
|
20
|
+
generación. Delega análisis y criterios al skill.
|
|
21
|
+
|
|
22
|
+
## Subcomandos
|
|
23
|
+
|
|
24
|
+
| Subcomando | Propósito |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `/swl:claudemd audit` | Audita el CLAUDE.md actual (líneas, bullets gigantes, secciones canónicas, @references, placeholders) |
|
|
27
|
+
| `/swl:claudemd check` | Como audit pero exit 1 si hay WARN — útil en pre-commit/CI |
|
|
28
|
+
| `/swl:claudemd refactor` | Sugiere extracciones a archivos `@`-referenciados (no modifica, solo propone diff) |
|
|
29
|
+
| `/swl:claudemd init-user` | Crea `~/.claude/CLAUDE.md` con template de preferencias personales si no existe |
|
|
30
|
+
| `/swl:claudemd init-project` | Genera CLAUDE.md raíz del proyecto detectando el stack actual |
|
|
31
|
+
|
|
32
|
+
Sin subcomando: equivale a `audit`.
|
|
33
|
+
|
|
34
|
+
## Cuándo usar
|
|
35
|
+
|
|
36
|
+
- Después de modificar manualmente CLAUDE.md (verifica calidad)
|
|
37
|
+
- Al inicio de un proyecto que no tenía CLAUDE.md (init-project)
|
|
38
|
+
- Al cambiar de máquina y querer transportar preferencias (init-user)
|
|
39
|
+
- En pre-commit hook si el proyecto trackea CLAUDE.md (check)
|
|
40
|
+
- Cuando el hook `claudemd-bloat-detector` emite nudge
|
|
41
|
+
|
|
42
|
+
## Ejecución de cada subcomando
|
|
43
|
+
|
|
44
|
+
### audit / check
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
node scripts/auditar-claudemd.js # output legible
|
|
48
|
+
node scripts/auditar-claudemd.js --json # output JSON estructurado
|
|
49
|
+
node scripts/auditar-claudemd.js --strict # exit 1 si WARN (modo check)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
El veredicto puede ser:
|
|
53
|
+
|
|
54
|
+
- **OK** — cumple best practices, sin hallazgos
|
|
55
|
+
- **WARN** — tiene oportunidades de mejora (líneas excesivas, bullets
|
|
56
|
+
gigantes, secciones ausentes, sin @references)
|
|
57
|
+
- **ERROR** — no existe, tiene placeholders sin reemplazar, faltan
|
|
58
|
+
secciones críticas
|
|
59
|
+
|
|
60
|
+
### refactor
|
|
61
|
+
|
|
62
|
+
Lee el CLAUDE.md actual, identifica candidatos a extracción (bullets
|
|
63
|
+
monolíticos, secciones largas, contenido duplicable a `@references`) y
|
|
64
|
+
imprime el diff propuesto. **NO modifica el archivo** — el usuario
|
|
65
|
+
revisa y aplica manualmente o con `git apply`.
|
|
66
|
+
|
|
67
|
+
Patrones de extracción típicos:
|
|
68
|
+
|
|
69
|
+
| Si el bullet/sección contiene… | Mover a… |
|
|
70
|
+
|---|---|
|
|
71
|
+
| Variables de entorno opt-in | `docs/variables-entorno.md` |
|
|
72
|
+
| Reglas de gobernanza extensas | `docs/gobernanza.md` |
|
|
73
|
+
| Catálogo de comandos completo | `COMANDOS.md` (referenciar) |
|
|
74
|
+
| Mapa de propagación detallado | `docs/mapa-propagacion.md` |
|
|
75
|
+
| Convenciones de cada capa | `docs/convenciones-{capa}.md` |
|
|
76
|
+
|
|
77
|
+
### init-user
|
|
78
|
+
|
|
79
|
+
Verifica si existe `~/.claude/CLAUDE.md` (en Windows:
|
|
80
|
+
`%USERPROFILE%\.claude\CLAUDE.md`). Si no existe, genera template
|
|
81
|
+
mínimo:
|
|
82
|
+
|
|
83
|
+
```markdown
|
|
84
|
+
# CLAUDE.md (preferencias personales transversales)
|
|
85
|
+
|
|
86
|
+
> Este archivo aplica a TODOS mis proyectos. Las reglas específicas de
|
|
87
|
+
> proyecto van en el CLAUDE.md de la raíz del proyecto, no aquí.
|
|
88
|
+
|
|
89
|
+
## Mi rol y stack preferido
|
|
90
|
+
|
|
91
|
+
- Rol: [ej. ingeniero senior backend]
|
|
92
|
+
- Stack preferido: [ej. Python + FastAPI, TypeScript + Next.js]
|
|
93
|
+
- Herramientas habituales: [ej. Neovim, ripgrep, fd, gh CLI]
|
|
94
|
+
|
|
95
|
+
## Estilo de comunicación
|
|
96
|
+
|
|
97
|
+
- Idioma: español
|
|
98
|
+
- Formato preferido para respuestas: [breve / detallado / con tablas]
|
|
99
|
+
- Cuándo prefiero ver alternativas vs. una sola recomendación
|
|
100
|
+
|
|
101
|
+
## Patrones que aplico siempre
|
|
102
|
+
|
|
103
|
+
- [ej. "Antes de implementar, mostrar el plan"]
|
|
104
|
+
- [ej. "Tests para todo código nuevo, sin excepción"]
|
|
105
|
+
- [ej. "Commits atómicos en español, formato conventional"]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Si ya existe, NO lo sobreescribe — sugiere añadir secciones faltantes.
|
|
109
|
+
|
|
110
|
+
### init-project
|
|
111
|
+
|
|
112
|
+
Detecta el stack del proyecto actual con `scripts/lib/detectar-stack-detallado.js`
|
|
113
|
+
y genera `./CLAUDE.md` mínimo con:
|
|
114
|
+
|
|
115
|
+
- Sección **Stack** poblada (lenguaje, framework, ORM, package manager)
|
|
116
|
+
- Sección **Comandos** poblada (npm scripts detectados o comandos típicos)
|
|
117
|
+
- Sección **Code style** vacía con placeholders
|
|
118
|
+
- Sección **Conventions** vacía con placeholders
|
|
119
|
+
- Sección **@references** apuntando a `.planning/PROYECTO.md`,
|
|
120
|
+
`README.md`, etc. si existen
|
|
121
|
+
|
|
122
|
+
Si CLAUDE.md ya existe, **NO lo sobreescribe**. Sugiere correr
|
|
123
|
+
`/swl:claudemd refactor` para mejorar el actual.
|
|
124
|
+
|
|
125
|
+
## Variables de entorno
|
|
126
|
+
|
|
127
|
+
Ver `@docs/variables-entorno.md` sección "Calidad de CLAUDE.md":
|
|
128
|
+
|
|
129
|
+
- `SWL_CLAUDEMD_BLOAT` (on/off) — activa hook `claudemd-bloat-detector`
|
|
130
|
+
- `SWL_CLAUDEMD_MAX_LINES` (default 200) — umbral de líneas totales
|
|
131
|
+
- `SWL_CLAUDEMD_MAX_BULLET_CHARS` (default 1000) — umbral de bullet/párrafo
|
|
132
|
+
|
|
133
|
+
## Exit codes
|
|
134
|
+
|
|
135
|
+
- `0` — OK o WARN (consultivo)
|
|
136
|
+
- `1` — ERROR o `--strict` + WARN
|
package/comandos/swl/salud.md
CHANGED
|
@@ -286,6 +286,35 @@ Si `SWL_AUDIT_AGENTES` no está definida, este paso se omite — los reportes
|
|
|
286
286
|
son opt-in por diseño (CLAUDE.md: "Variables de entorno opt-in para
|
|
287
287
|
integraciones enterprise").
|
|
288
288
|
|
|
289
|
+
## Paso 5f — Calidad de CLAUDE.md (ADR-0016)
|
|
290
|
+
|
|
291
|
+
Auditoría determinista del archivo `CLAUDE.md` raíz del proyecto según best
|
|
292
|
+
practices Anthropic ("The CLAUDE.md file"): líneas totales, bullets
|
|
293
|
+
monolíticos, secciones canónicas (Stack/Comandos/Code style/Conventions),
|
|
294
|
+
uso de `@references`, placeholders sin reemplazar.
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
node scripts/auditar-claudemd.js --json
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
Veredictos posibles:
|
|
301
|
+
|
|
302
|
+
| Veredicto | Significado | Score impact |
|
|
303
|
+
|---|---|---|
|
|
304
|
+
| `OK` | Cumple best practices, sin hallazgos | +1 |
|
|
305
|
+
| `WARN` | Oportunidades de mejora (líneas excesivas, bullets gigantes, secciones ausentes, sin @references) | -0.5 |
|
|
306
|
+
| `ERROR` | No existe, placeholders sin reemplazar, secciones críticas ausentes | -1 |
|
|
307
|
+
|
|
308
|
+
Si veredicto != OK, el reporte sugiere ejecutar `/swl:claudemd refactor`
|
|
309
|
+
para identificar candidatos a extracción a archivos `@`-referenciados.
|
|
310
|
+
|
|
311
|
+
Variables de entorno: `SWL_CLAUDEMD_MAX_LINES` (default 200) y
|
|
312
|
+
`SWL_CLAUDEMD_MAX_BULLET_CHARS` (default 1000) ajustan los umbrales.
|
|
313
|
+
Documentación completa en `@docs/variables-entorno.md`.
|
|
314
|
+
|
|
315
|
+
Este paso siempre se ejecuta (no es opt-in) — la calidad de CLAUDE.md
|
|
316
|
+
es métrica continua del sistema.
|
|
317
|
+
|
|
289
318
|
## Paso 5e — Verificación de drift de skills (skills-lock)
|
|
290
319
|
|
|
291
320
|
Si existe `manifiestos/skills-lock.json`, comparar el hash actual de cada
|
|
@@ -4,12 +4,12 @@ description: >
|
|
|
4
4
|
Next.js App Router: Server Components, Client Components, Server Actions,
|
|
5
5
|
streaming con Suspense, ISR, route handlers y middleware. Cargar cuando se
|
|
6
6
|
implementen páginas Next.js, data fetching, mutaciones o rutas de API.
|
|
7
|
-
version: "1.1.
|
|
7
|
+
version: "1.1.1"
|
|
8
8
|
evolved: true
|
|
9
|
-
evolved-from: "1.
|
|
10
|
-
evolved-at: "2026-05-
|
|
9
|
+
evolved-from: "1.1.0"
|
|
10
|
+
evolved-at: "2026-05-11"
|
|
11
11
|
evolved-by: "aprender"
|
|
12
|
-
evolved-note: "
|
|
12
|
+
evolved-note: "L-108 SIGM Opción C: cache .next/ confirmado x2 (Opción B + Opción C) — patrón consolidado para refactors de tipos masivos. Sin cambios en otros gotchas."
|
|
13
13
|
herramientasPermitidas: [Read]
|
|
14
14
|
exclusiones:
|
|
15
15
|
- "No cargar para proyectos Next.js con Pages Router (pages/index.tsx) — el modelo de getServerSideProps y getStaticProps es diferente al App Router; este skill solo cubre App Router."
|
|
@@ -323,7 +323,7 @@ export default function Reloj() {
|
|
|
323
323
|
|
|
324
324
|
**`useSearchParams()` requiere `<Suspense>` boundary durante prerender estático**: build de producción falla con `⨯ useSearchParams() should be wrapped in a suspense boundary at page "/X". Read more: https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout`. Causa: el prerender estático no puede ejecutar el hook → CSR bailout → build aborta. Fix: en `page.tsx` envolver el componente que usa `useSearchParams()` en `<Suspense fallback={null}>` (o un esqueleto). El shell se prerenderiza vacío; el componente hidrata en cliente con los search params disponibles. Mismo patrón aplica a `useRouter()` y `usePathname()` cuando se usan en componentes prerenderizados. Caso real: SIGM agregó `useSearchParams()` a `useLoginForm.ts` para honrar `?siguiente=`; tsc + vitest pasaban pero `npm run build` falló hasta envolver `<LoginForm />` en `<Suspense>`.
|
|
325
325
|
|
|
326
|
-
**Cache `.next/` puede ocultar errores TypeScript reales tras refactor de tipos masivo
|
|
326
|
+
**Cache `.next/` puede ocultar errores TypeScript reales tras refactor de tipos masivo** [CONFIRMADO x2 — Opción B 2026-05-10, Opción C 2026-05-11]: `npx tsc --noEmit` local pasa pero CI falla con errores TS2724/TS2305 sobre tipos eliminados. Causa: `.next/types/*.d.ts` y `tsconfig.tsbuildinfo` cachean los types del estado anterior; CI clona limpio y ve los errores reales. Fix: cuando se modifican imports/exports masivos en `lib/*/tipos.ts` (refactor de tipos, eliminación de interfaces, codegen openapi-typescript), borrar cache antes de validar local: `cd frontend && rm -rf .next && npx tsc --noEmit`. Si CI falla con TSC y local pasa: 90% de las veces es cache stale. Reforzado masivamente en F2/F3 de SIGM Opción C — 6+ archivos generados con tipos backend-first detectaron diff que el cache local ocultaba.
|
|
327
327
|
|
|
328
328
|
**Override de `brace-expansion@^5` rompe minimatch (eslint depende)**: `npm install` aplica el override pero `eslint . --ext .ts,.tsx` falla con `TypeError: expand is not a function` en `@eslint/config-array → minimatch → brace-expansion`. Causa: brace-expansion v3+ cambió la API (de export default `expand` function a export con shape distinto); minimatch espera la API v2. Fix: para CVE-2025-5889 (ReDoS), usar `"brace-expansion": "^2.0.2"` (parcheado desde 2.0.2 — NO requiere v5). Validación pre-override: `npm ls brace-expansion` para revisar consumidores conocidos antes de bumpear major. Mismo patrón aplicable a otros overrides de transitives — validar cadena de consumers antes de bumpear major.
|
|
329
329
|
|
|
@@ -4,7 +4,12 @@ description: >
|
|
|
4
4
|
Testing Next.js con Vitest, React Testing Library, Playwright y MSW.
|
|
5
5
|
Cubre Server Components, Server Actions, page objects E2E y mocking de API.
|
|
6
6
|
Cargar cuando se escriban tests de componentes, integración o E2E en Next.js.
|
|
7
|
-
version: "1.0.
|
|
7
|
+
version: "1.0.1"
|
|
8
|
+
evolved: true
|
|
9
|
+
evolved-from: "1.0.0"
|
|
10
|
+
evolved-at: "2026-05-11"
|
|
11
|
+
evolved-by: "aprender"
|
|
12
|
+
evolved-note: "L-106 SIGM Opción C: gotcha getByText vs getAllByText/getByRole para textos duplicados legítimos (subtotal+total, heading+botón) - confirmado x2 en F1.1 y F1.2"
|
|
8
13
|
herramientasPermitidas: [Read]
|
|
9
14
|
exclusiones:
|
|
10
15
|
- "No cargar para tests React puros fuera del contexto de Next.js (Vite, CRA, Remix) — los mocks del router de Next.js y los Server Components son específicos del framework."
|
|
@@ -311,6 +316,26 @@ Preferir assertions específicas sobre el contenido crítico.
|
|
|
311
316
|
|
|
312
317
|
**`userEvent.setup()` debe llamarse fuera del `it()` o re-instanciarse por test**: compartir una instancia de `userEvent` entre tests causa que el estado del puntero/teclado se acumule entre tests, causando comportamiento impredecible. Causa: `userEvent.setup()` crea un estado de dispositivo virtual que persiste. Fix: llamar `const user = userEvent.setup()` dentro de cada `it()` o en `beforeEach`, no al nivel de `describe`.
|
|
313
318
|
|
|
319
|
+
**`getByText` falla con "found multiple elements" cuando el mismo texto aparece en varios nodos legítimos** [CONFIRMADO x2 en SIGM Opción C, F1.1 y F1.2]: en componentes con resumen + total, o heading + botón con texto similar, el monto `$5,000.00` o la palabra "Forma de pago" aparece en 2+ elementos del DOM. `getByText` lanza error. Fix por precisión semántica, en orden de preferencia:
|
|
320
|
+
|
|
321
|
+
```tsx
|
|
322
|
+
// ❌ Falla cuando hay duplicación legítima
|
|
323
|
+
expect(screen.getByText('$5,000.00')).toBeInTheDocument()
|
|
324
|
+
|
|
325
|
+
// ✅ Opción 1 — usar getByRole con accessibility name (más precisa)
|
|
326
|
+
expect(screen.getByRole('heading', { name: /forma de pago/i })).toBeInTheDocument()
|
|
327
|
+
expect(screen.getByRole('button', { name: /agregar forma de pago/i })).toBeInTheDocument()
|
|
328
|
+
|
|
329
|
+
// ✅ Opción 2 — getAllByText cuando todas las apariciones son válidas
|
|
330
|
+
const montos = screen.getAllByText('$5,000.00')
|
|
331
|
+
expect(montos).toHaveLength(2) // subtotal + total
|
|
332
|
+
|
|
333
|
+
// ✅ Opción 3 — within() para scope al contenedor
|
|
334
|
+
const total = within(screen.getByTestId('seccion-total')).getByText('$5,000.00')
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
Regla práctica: si el texto aparece duplicado, casi siempre la intención del test es verificar UNO de los dos elementos por su rol semántico (`heading` vs `button` vs `cell`). `getByRole` con `name` lo resuelve sin recurrir a `data-testid`.
|
|
338
|
+
|
|
314
339
|
## Checklist de verificación
|
|
315
340
|
|
|
316
341
|
- [ ] Vitest/Jest configurado con next/jest transform o plugin react
|
|
@@ -176,7 +176,85 @@ Una vez obtenidas las respuestas, crea la carpeta `.planning/` y los tres docume
|
|
|
176
176
|
|
|
177
177
|
---
|
|
178
178
|
|
|
179
|
-
## Fase 3 —
|
|
179
|
+
## Fase 3 — Generar CLAUDE.md raíz del proyecto
|
|
180
|
+
|
|
181
|
+
Antes de cerrar la sesión de inicialización, **genera un `CLAUDE.md` mínimo en
|
|
182
|
+
la raíz del proyecto recién creado**. Es el onboarding script que Claude leerá
|
|
183
|
+
en cada sesión futura sobre este proyecto.
|
|
184
|
+
|
|
185
|
+
> Sigue las best practices del video oficial Anthropic
|
|
186
|
+
> ("The CLAUDE.md file"): empieza compacto, deja que el archivo crezca con
|
|
187
|
+
> correcciones explícitas. Las cinco secciones canónicas son:
|
|
188
|
+
> Stack / Comandos / Code style / Conventions / @references.
|
|
189
|
+
|
|
190
|
+
### Plantilla mínima: `./CLAUDE.md` del proyecto
|
|
191
|
+
|
|
192
|
+
Usa los datos del Bloque B (stack) y del Bloque C (equipo, repo) del cuestionario.
|
|
193
|
+
|
|
194
|
+
```markdown
|
|
195
|
+
# CLAUDE.md — [Nombre del Proyecto]
|
|
196
|
+
|
|
197
|
+
## Stack
|
|
198
|
+
|
|
199
|
+
- **Lenguaje**: [del Bloque B5 / B6]
|
|
200
|
+
- **Framework principal**: [si aplica]
|
|
201
|
+
- **Base de datos**: [del Bloque B7]
|
|
202
|
+
- **Infraestructura**: [del Bloque B6]
|
|
203
|
+
|
|
204
|
+
## Comandos del proyecto
|
|
205
|
+
|
|
206
|
+
| Comando | Propósito |
|
|
207
|
+
|---------|-----------|
|
|
208
|
+
| `[npm run dev / poetry run / etc.]` | Servidor de desarrollo |
|
|
209
|
+
| `[npm test / pytest / cargo test]` | Tests |
|
|
210
|
+
| `[npm run build / ...]` | Build |
|
|
211
|
+
| `[npm run lint / ruff / clippy]` | Lint |
|
|
212
|
+
|
|
213
|
+
## Code style
|
|
214
|
+
|
|
215
|
+
- [Convención de indentación si difiere del default del lenguaje]
|
|
216
|
+
- [Preferencia de exports / módulos si aplica]
|
|
217
|
+
- [Naming si difiere del idiomático del lenguaje]
|
|
218
|
+
|
|
219
|
+
## Conventions
|
|
220
|
+
|
|
221
|
+
- [Convención de organización: dónde van los endpoints / componentes / utils]
|
|
222
|
+
- [Patrones a preferir: ej. "preferir async sobre callbacks"]
|
|
223
|
+
- [Restricciones del Bloque B8 si son operativas]
|
|
224
|
+
|
|
225
|
+
## @references
|
|
226
|
+
|
|
227
|
+
- `@.planning/PROYECTO.md` — visión, objetivos del MVP, criterios de éxito
|
|
228
|
+
- `@.planning/REQUISITOS.md` — requerimientos funcionales y no funcionales
|
|
229
|
+
- `@.planning/HOJA-RUTA.md` — fases planeadas
|
|
230
|
+
|
|
231
|
+
## Cómo evolucionar este archivo
|
|
232
|
+
|
|
233
|
+
1. Empieza mínimo. No adelantes reglas.
|
|
234
|
+
2. Cuando corrijas a Claude, pídele explícitamente: *"guarda esto en CLAUDE.md"*.
|
|
235
|
+
3. Para preferencias personales (no del proyecto), usa `~/.claude/CLAUDE.md`.
|
|
236
|
+
4. Si crece demasiado, ejecuta `/swl:claudemd refactor` para extraer secciones.
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Reglas de generación
|
|
240
|
+
|
|
241
|
+
- **Llenar TODOS los placeholders `[...]` con los datos reales del cuestionario**.
|
|
242
|
+
Si falta un dato (ej. el usuario no especificó comandos), dejar el bullet con
|
|
243
|
+
un comentario `<!-- pendiente: confirmar con el equipo -->` en lugar de
|
|
244
|
+
eliminar el bullet o dejarlo vacío.
|
|
245
|
+
- **Mantener el archivo bajo 80 líneas inicialmente**. El video oficial
|
|
246
|
+
recomienda explícitamente "empezar sin uno y construir desde ahí" — la
|
|
247
|
+
primera versión debe ser un esqueleto, no una enciclopedia.
|
|
248
|
+
- **NO incluir reglas que aún no han sido violadas**. Por ejemplo, no
|
|
249
|
+
agregar "no usar `eval()`" si Claude nunca lo usó en este proyecto. Esa
|
|
250
|
+
regla puede vivir como global del usuario o agregarse cuando aparezca el
|
|
251
|
+
primer caso.
|
|
252
|
+
- **NO duplicar información que ya está en `.planning/PROYECTO.md`**. Usar
|
|
253
|
+
`@.planning/PROYECTO.md` como referencia.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Fase 4 — Checklist de arranque
|
|
180
258
|
|
|
181
259
|
Antes de cerrar la sesión de inicialización, verifica:
|
|
182
260
|
|
|
@@ -185,10 +263,12 @@ Antes de cerrar la sesión de inicialización, verifica:
|
|
|
185
263
|
- [ ] El HOJA-RUTA.md tiene fases con duración estimada
|
|
186
264
|
- [ ] Las restricciones "no negociables" están identificadas y documentadas
|
|
187
265
|
- [ ] Se registró quién tomó cada decisión de stack (para futura referencia)
|
|
266
|
+
- [ ] CLAUDE.md raíz generado con secciones canónicas pobladas (Stack, Comandos, @references)
|
|
267
|
+
- [ ] CLAUDE.md raíz validado con `/swl:claudemd audit` (sin warnings)
|
|
188
268
|
|
|
189
269
|
## Gotchas / Errores comunes no obvios
|
|
190
270
|
|
|
191
|
-
- **PROYECTO.md generado con `[TBD]` en restricciones no negociables**: el agente deja campos sin resolver para no bloquear al usuario, pero las restricciones vacías generan retrabajos costosos cuando se descubren tardíamente. Causa: el checklist de cierre de la Fase
|
|
271
|
+
- **PROYECTO.md generado con `[TBD]` en restricciones no negociables**: el agente deja campos sin resolver para no bloquear al usuario, pero las restricciones vacías generan retrabajos costosos cuando se descubren tardíamente. Causa: el checklist de cierre de la Fase 4 no se aplicó rigurosamente. Solución: no cerrar la sesión de inicialización hasta que no quede ningún `[TBD]` en el bloque de restricciones — si el usuario no puede responder, registrar la restricción como "pendiente" en la sección `## Decisiones pendientes` con ticket asignado.
|
|
192
272
|
- **Fase 1 de HOJA-RUTA.md sin duración estimada**: el usuario acepta el documento sin notar que las fases no tienen estimaciones. Causa: el agente genera el template sin poblar las duraciones. Solución: antes de entregar HOJA-RUTA.md, pedir al usuario una estimación rough (días, semanas) para cada fase — sin eso el roadmap es decorativo.
|
|
193
273
|
- **Stack seleccionado sin verificar restricciones del Bloque B**: el agente sugiere un stack "moderno" que viola una restricción de licencia OSS o de plataforma mandatoria del equipo. Causa: el Bloque B se procesó en orden pero las respuestas no se cruzaron con las sugerencias del Bloque A. Solución: al proponer stack, citar explícitamente cada restricción del Bloque B y confirmar que ninguna es violada.
|
|
194
274
|
- **No preguntar por sistemas legados cuando el usuario menciona "reemplazar"**: el agente omite la pregunta 4 del Bloque A asumiendo que el proyecto es greenfield. Causa: mala clasificación del proyecto como nuevo cuando el usuario usó la palabra "reemplazar". Solución: si el usuario menciona "reemplazar", "migrar" o "integrar con" en la descripción, la pregunta 4 es obligatoria, no opcional.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: planear-fase
|
|
3
3
|
description: Crea el PLAN.md ejecutable para una fase de desarrollo. Descompone la fase en tareas atómicas con dependencias explícitas, las agrupa en oleadas de ejecución paralela cuando es posible, y aplica verificación goal-backward para garantizar que el plan completo satisface los criterios de éxito definidos en CONTEXTO.md.
|
|
4
|
-
version: "1.
|
|
4
|
+
version: "1.2.0"
|
|
5
5
|
evolved: true
|
|
6
|
-
evolved-from: "1.
|
|
7
|
-
evolved-at: "2026-05-
|
|
6
|
+
evolved-from: "1.1.0"
|
|
7
|
+
evolved-at: "2026-05-10"
|
|
8
8
|
evolved-by: "aprender"
|
|
9
|
-
evolved-note: "Sección nueva '
|
|
9
|
+
evolved-note: "Sección nueva 'Estimación de commits — bloques funcionales, no archivos' — anti-patrón confirmado en sesión ADR-0016 (estimación 12 commits resultó 7 reales, 1.7× sobreestimación por contar archivos en vez de bloques funcionales)"
|
|
10
10
|
herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
|
|
11
11
|
exclusiones:
|
|
12
12
|
- "No cargar si no existe CONTEXTO.md para la fase — ejecutar `discutir-fase` primero."
|
|
@@ -75,6 +75,26 @@ Agrupa tareas sin dependencias mutuas en la misma oleada. Las tareas de una
|
|
|
75
75
|
oleada pueden ejecutarse en paralelo (o en secuencia rápida si el contexto lo
|
|
76
76
|
requiere).
|
|
77
77
|
|
|
78
|
+
### 5. Estimación de commits — bloques funcionales, no archivos
|
|
79
|
+
|
|
80
|
+
Al estimar la cantidad de commits que requerirá una fase, contar **bloques
|
|
81
|
+
funcionales atómicos** (1 bloque = 1 commit), no archivos modificados. Un
|
|
82
|
+
refactor que toca 25 archivos pero implementa 7 bloques funcionales coherentes
|
|
83
|
+
genera 7 commits, no 25.
|
|
84
|
+
|
|
85
|
+
**Heurística**:
|
|
86
|
+
|
|
87
|
+
- Cada Bn (B1, B2, B3...) del plan = 1 commit atómico (incluye código + tests + manifests asociados)
|
|
88
|
+
- Modificaciones cross-archivo en el MISMO bloque funcional van al MISMO commit
|
|
89
|
+
- Tests del bloque van CON el bloque, no en commit separado (excepto TDD estricto)
|
|
90
|
+
- Bump de versión + docs + CHANGELOG = 1 commit final aparte (B-final)
|
|
91
|
+
|
|
92
|
+
**Anti-patrón observado** (sesión 2026-05-10, ADR-0016): estimación inicial
|
|
93
|
+
"~12 commits, ~25 archivos" para Opción C completa. Resultado real: 7 commits,
|
|
94
|
+
25 archivos (1.7× sobreestimación de commits). La cuenta de archivos fue
|
|
95
|
+
correcta; la de commits estaba inflada por contar "1 archivo nuevo = 1 commit"
|
|
96
|
+
en vez de "1 bloque funcional = 1 commit".
|
|
97
|
+
|
|
78
98
|
---
|
|
79
99
|
|
|
80
100
|
## Algoritmo de construcción del plan
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: react-experto
|
|
3
3
|
description: React + Next.js mejores prácticas modernas. Cubre Server Components vs Client Components, data fetching patterns (RSC, React Query, SWR, Server Actions), state management (useState, Zustand, Jotai), performance (memo, lazy, Suspense, streaming) y Next.js App Router patterns.
|
|
4
|
-
version: "1.1.
|
|
4
|
+
version: "1.1.1"
|
|
5
5
|
evolved: true
|
|
6
|
-
evolved-from: "1.
|
|
7
|
-
evolved-at: "2026-05-
|
|
6
|
+
evolved-from: "1.1.0"
|
|
7
|
+
evolved-at: "2026-05-11"
|
|
8
8
|
evolved-by: "aprender"
|
|
9
|
-
evolved-note: "
|
|
9
|
+
evolved-note: "L-105 SIGM: setState dentro de useEffect bloqueado por react-hooks/set-state-in-effect (eslint-plugin-react-hooks v7+) - 3 patrones de reemplazo (lazy init, useMemo, useSyncExternalStore) confirmados x3 en F1.2/F1.3/F3"
|
|
10
10
|
herramientasPermitidas: [Read]
|
|
11
11
|
exclusiones:
|
|
12
12
|
- "No cargar para optimización de rendimiento React (memo, useMemo, useCallback, virtualización, code splitting) — para rendimiento cargar `react-optimizacion`."
|
|
@@ -222,3 +222,24 @@ const mounted = useSyncExternalStore(
|
|
|
222
222
|
)
|
|
223
223
|
```
|
|
224
224
|
Equivalente funcional al patrón mounted flag, sin disparar la regla. Type-safe, lint-compliant. Usar en Header/Sidebar/cualquier componente que lea localStorage o `window` y necesite render distinto en SSR vs cliente.
|
|
225
|
+
|
|
226
|
+
**`setState` dentro de `useEffect` por cualquier razón dispara la misma regla — 3 patrones idiomáticos para reemplazarlo** [CONFIRMADO x3 en SIGM Opción C, F1.2/F1.3/F3]: la regla `react-hooks/set-state-in-effect` no solo afecta al patrón mounted flag — bloquea cualquier `setX(...)` síncrono dentro del cuerpo de un `useEffect`. Patrones de reemplazo según el caso:
|
|
227
|
+
|
|
228
|
+
```tsx
|
|
229
|
+
// ❌ Anti-patrón (la regla lo bloquea)
|
|
230
|
+
const [value, setValue] = useState(null)
|
|
231
|
+
useEffect(() => {
|
|
232
|
+
setValue(cargarDesdeStorage())
|
|
233
|
+
}, [])
|
|
234
|
+
|
|
235
|
+
// ✅ Caso 1 — lazy initialization (estado inicial computado una sola vez)
|
|
236
|
+
const [value, setValue] = useState(() => cargarDesdeStorage())
|
|
237
|
+
|
|
238
|
+
// ✅ Caso 2 — valor derivado de props o estado
|
|
239
|
+
const value = useMemo(() => calcular(prop1, prop2), [prop1, prop2])
|
|
240
|
+
|
|
241
|
+
// ✅ Caso 3 — detección cliente vs SSR
|
|
242
|
+
const isClient = useSyncExternalStore(() => () => {}, () => true, () => false)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Regla práctica: si el `setState` solo se ejecuta una vez al montar, casi siempre puede reescribirse como `useState(() => init())` o `useMemo(...)`. Solo dejar `setState` dentro de `useEffect` cuando responde a un evento externo asíncrono (fetch, subscription) — en ese caso, mover la lógica a un handler dedicado y aplicar `// eslint-disable-next-line react-hooks/set-state-in-effect` con comentario justificando.
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swl-claudemd
|
|
3
|
+
description: Tratamiento profesional de CLAUDE.md según best practices Anthropic (ADR-0016). Cubre auditoría (líneas totales, bullets gigantes, secciones canónicas, @references, placeholders), refactor (extracción a archivos referenciados con @), generación de templates (init-user para preferencias personales transversales en ~/.claude/CLAUDE.md, init-project para CLAUDE.md raíz del proyecto detectando stack). Cargar cuando se invoque /swl:claudemd o cuando el hook claudemd-bloat-detector sugiera intervención.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
|
|
6
|
+
exclusiones:
|
|
7
|
+
- "No cargar para editar reglas globales en ~/.claude/rules/ — usar Edit directo."
|
|
8
|
+
- "No cargar para crear ADRs — usar habilidades/doc-coauthoring o Write directo."
|
|
9
|
+
- "No cargar para validar otros archivos (.md de docs, READMEs) — solo CLAUDE.md tiene contrato canónico."
|
|
10
|
+
- "No cargar para generar el bloque del installer en CLAUDE.md de proyectos destino — eso lo hace scripts/lib/transformadores/claude.js."
|
|
11
|
+
evolvable: true
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Habilidad: Tratamiento profesional de CLAUDE.md
|
|
15
|
+
|
|
16
|
+
## Propósito
|
|
17
|
+
|
|
18
|
+
Aplicar las cinco recomendaciones del video oficial Anthropic
|
|
19
|
+
*"The CLAUDE.md file"* (`temp/YouTube · O0FGCxkHM-U.md`) como mecanismo
|
|
20
|
+
verificable y mantenible:
|
|
21
|
+
|
|
22
|
+
1. **Compacto** — empieza sin uno, agrega solo lo que tengas que corregir
|
|
23
|
+
2. **Stack arriba** — lenguaje, framework, ORM, BD
|
|
24
|
+
3. **Commands** — cómo correr dev, tests, lint, build
|
|
25
|
+
4. **Code style** — convenciones de indentación, exports, nombrado
|
|
26
|
+
5. **Conventions** — dónde van las cosas, qué patrones preferir
|
|
27
|
+
|
|
28
|
+
Más dos prácticas auxiliares del video:
|
|
29
|
+
|
|
30
|
+
- **`@filepath`** para referenciar docs en lugar de duplicar contenido
|
|
31
|
+
- **"Ask Claude to save to memory"** — el archivo crece con correcciones
|
|
32
|
+
explícitas, no por adelantar reglas hipotéticas
|
|
33
|
+
|
|
34
|
+
## Cuándo cargar
|
|
35
|
+
|
|
36
|
+
- El usuario invoca `/swl:claudemd [audit|check|refactor|init-user|init-project]`
|
|
37
|
+
- El hook `claudemd-bloat-detector` emite nudge sugiriendo `/swl:claudemd refactor`
|
|
38
|
+
- El usuario pregunta "¿está bien mi CLAUDE.md?" o "¿cómo mejoro mi CLAUDE.md?"
|
|
39
|
+
- Se está generando un proyecto nuevo y se necesita CLAUDE.md raíz
|
|
40
|
+
- Se está cambiando de máquina y se necesita transportar `~/.claude/CLAUDE.md`
|
|
41
|
+
|
|
42
|
+
## Cuándo NO cargar
|
|
43
|
+
|
|
44
|
+
- El usuario quiere editar `~/.claude/rules/*.md` (reglas globales) — usar Edit directo
|
|
45
|
+
- El usuario quiere validar otros `.md` (READMEs, docs/) — no aplica el contrato canónico de CLAUDE.md
|
|
46
|
+
- El usuario quiere generar el bloque del installer — eso lo hace `scripts/lib/transformadores/claude.js`
|
|
47
|
+
- El usuario quiere crear un ADR — usar `Skill("doc-coauthoring")` o Write directo
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Subcomando: audit
|
|
52
|
+
|
|
53
|
+
Ejecuta el auditor determinista:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
node scripts/auditar-claudemd.js
|
|
57
|
+
node scripts/auditar-claudemd.js --json # para parsing
|
|
58
|
+
node scripts/auditar-claudemd.js --strict # exit 1 si WARN
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
El auditor verifica seis dimensiones:
|
|
62
|
+
|
|
63
|
+
| Dimensión | Regla | Severidad |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| Existencia | Archivo presente en `./CLAUDE.md` o `./.claude/CLAUDE.md` | ERROR si ausente |
|
|
66
|
+
| Tamaño total | Líneas ≤ `SWL_CLAUDEMD_MAX_LINES` (default 200) | WARN |
|
|
67
|
+
| Bullets monolíticos | Cada bullet/párrafo ≤ `SWL_CLAUDEMD_MAX_BULLET_CHARS` (default 1000). Tablas y bloques de código se ignoran | WARN |
|
|
68
|
+
| Secciones canónicas | Stack, Comandos, Code style, Conventions presentes | WARN |
|
|
69
|
+
| @references | Archivos >80 líneas usan al menos un `@docs/...md` | WARN |
|
|
70
|
+
| Placeholders | `[TBD]`, `[TODO]`, `[COMPLETAR]` | ERROR |
|
|
71
|
+
|
|
72
|
+
Veredicto final: ERROR → WARN → OK (el más severo gana).
|
|
73
|
+
|
|
74
|
+
### Cómo interpretar los resultados
|
|
75
|
+
|
|
76
|
+
- **OK**: el archivo cumple. No hay acción requerida.
|
|
77
|
+
- **WARN líneas**: el archivo creció demasiado. Ejecuta `refactor` para
|
|
78
|
+
identificar candidatos a extracción.
|
|
79
|
+
- **WARN bullet gigante**: un bullet/párrafo es ilegible. Convertirlo a
|
|
80
|
+
tabla, lista jerárquica, o extraer su contenido a archivo separado.
|
|
81
|
+
- **WARN secciones ausentes**: las secciones canónicas Anthropic no
|
|
82
|
+
están. Si el archivo es proyecto greenfield, agregarlas. Si es CLAUDE.md
|
|
83
|
+
de overview/meta-sistema, considerar si aplica el contrato.
|
|
84
|
+
- **WARN sin @references**: el archivo es grande pero no enlaza nada
|
|
85
|
+
externo. Identificar contenido duplicable a `@docs/`, `@.planning/`, etc.
|
|
86
|
+
- **ERROR placeholders**: bloqueador. Resolver antes de commitear.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Subcomando: refactor
|
|
91
|
+
|
|
92
|
+
**No modifica archivos** — propone diff. El usuario decide aplicar.
|
|
93
|
+
|
|
94
|
+
### Algoritmo
|
|
95
|
+
|
|
96
|
+
1. Lee `CLAUDE.md` actual.
|
|
97
|
+
2. Para cada bullet/párrafo > `MAX_BULLET_CHARS`:
|
|
98
|
+
- Si contiene **una sola lista de items homogéneos** → propone tabla
|
|
99
|
+
- Si contiene **definiciones técnicas extensas** → propone extracción a `docs/[tema].md`
|
|
100
|
+
- Si contiene **enumeración de variables/configuración** → propone extracción a `docs/variables-[scope].md`
|
|
101
|
+
3. Para cada sección > 50 líneas:
|
|
102
|
+
- Identifica el "tema" del header
|
|
103
|
+
- Propone `docs/[tema-kebab].md` y reemplazo en CLAUDE.md por:
|
|
104
|
+
`Para detalles ver @docs/[tema].md`
|
|
105
|
+
4. Imprime diff propuesto en formato unified.
|
|
106
|
+
|
|
107
|
+
### Patrones de extracción típicos
|
|
108
|
+
|
|
109
|
+
| Si la sección/bullet contiene… | Mover a… |
|
|
110
|
+
|---|---|
|
|
111
|
+
| Variables de entorno opt-in | `docs/variables-entorno.md` |
|
|
112
|
+
| Reglas de gobernanza extensas | `docs/gobernanza.md` |
|
|
113
|
+
| Catálogo completo de comandos | `COMANDOS.md` (referenciar) |
|
|
114
|
+
| Mapa de propagación detallado | `docs/mapa-propagacion.md` |
|
|
115
|
+
| Convenciones por capa | `docs/convenciones-{capa}.md` |
|
|
116
|
+
| Lista de dependencias / stack histórico | `docs/stack-historico.md` |
|
|
117
|
+
| Decisiones puntuales antiguas | ADR en `.planning/adrs/` |
|
|
118
|
+
|
|
119
|
+
### Anti-patrones de refactor
|
|
120
|
+
|
|
121
|
+
- **NO extraer reglas de máxima prioridad** — esas DEBEN estar en CLAUDE.md raíz
|
|
122
|
+
- **NO extraer la sección Stack** — es la primera info que Claude necesita
|
|
123
|
+
- **NO extraer la sección Commands** — son acción inmediata, deben estar visibles
|
|
124
|
+
- **NO crear más de 3 archivos `@`-referenciados nuevos en un solo refactor** — fragmentar demasiado dispersa el contexto
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Subcomando: init-user
|
|
129
|
+
|
|
130
|
+
Genera `~/.claude/CLAUDE.md` (en Windows: `%USERPROFILE%\.claude\CLAUDE.md`)
|
|
131
|
+
con template de preferencias personales si NO existe. Si existe, sugiere
|
|
132
|
+
secciones faltantes pero NO sobreescribe.
|
|
133
|
+
|
|
134
|
+
### Pasos
|
|
135
|
+
|
|
136
|
+
1. Detectar la ruta:
|
|
137
|
+
- Linux/macOS: `$HOME/.claude/CLAUDE.md`
|
|
138
|
+
- Windows: `$env:USERPROFILE/.claude/CLAUDE.md` (en PowerShell)
|
|
139
|
+
2. Si existe → leer, identificar secciones faltantes, sugerir patches
|
|
140
|
+
3. Si no existe → crear directorio `~/.claude/` si falta, escribir template
|
|
141
|
+
|
|
142
|
+
### Template
|
|
143
|
+
|
|
144
|
+
Ver template completo en el comando `/swl:claudemd` sección `init-user`.
|
|
145
|
+
|
|
146
|
+
Las secciones canónicas para user-level son DISTINTAS de project-level:
|
|
147
|
+
|
|
148
|
+
| Sección | Project-level | User-level |
|
|
149
|
+
|---|---|---|
|
|
150
|
+
| Stack | Sí — del proyecto | No (varía por proyecto) |
|
|
151
|
+
| Comandos | Sí — del proyecto | No |
|
|
152
|
+
| Code style | Sí — convenciones del equipo | Sí — preferencias personales (indent, naming favorito) |
|
|
153
|
+
| Conventions | Sí — del proyecto | No |
|
|
154
|
+
| Mi rol y stack preferido | No | Sí |
|
|
155
|
+
| Estilo de comunicación | No | Sí |
|
|
156
|
+
| Patrones que aplico siempre | No | Sí — meta-preferencias cross-project |
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Subcomando: init-project
|
|
161
|
+
|
|
162
|
+
Genera `./CLAUDE.md` raíz del proyecto detectando stack actual.
|
|
163
|
+
|
|
164
|
+
### Pasos
|
|
165
|
+
|
|
166
|
+
1. Verificar que `./CLAUDE.md` NO exista. Si existe → mensaje "ya existe,
|
|
167
|
+
considera `/swl:claudemd refactor`" y salir sin tocar.
|
|
168
|
+
2. Ejecutar `detectarStackDetallado(process.cwd())` (de
|
|
169
|
+
`scripts/lib/detectar-stack-detallado.js`).
|
|
170
|
+
3. Generar archivo con secciones pobladas:
|
|
171
|
+
- **Stack**: lenguaje + framework + ORM + package manager detectados
|
|
172
|
+
- **Comandos**: npm scripts detectados o comandos típicos por lenguaje
|
|
173
|
+
- **Code style**: placeholders explícitos (`<!-- pendiente: definir convención de X -->`)
|
|
174
|
+
- **Conventions**: placeholders explícitos
|
|
175
|
+
- **@references**: enlazar a `.planning/PROYECTO.md`, `README.md`,
|
|
176
|
+
`CONTRIBUTING.md` solo si existen
|
|
177
|
+
4. Imprimir mensaje con próximo paso: "ejecuta `/swl:claudemd audit`
|
|
178
|
+
para verificar".
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Gotchas / Errores comunes no obvios
|
|
183
|
+
|
|
184
|
+
- **Marcar tablas como bullets gigantes**: el detector debe excluir
|
|
185
|
+
líneas que empiezan con `|` (tablas Markdown). Sin ese filtro genera
|
|
186
|
+
falsos positivos en cualquier CLAUDE.md con tablas. Implementado en
|
|
187
|
+
`scripts/auditar-claudemd.js` función `detectarBulletsGigantes`.
|
|
188
|
+
- **Marcar bloques de código como bullets gigantes**: igual que tablas
|
|
189
|
+
— el detector entra en modo "code fence" al ver ` ``` ` y no cuenta
|
|
190
|
+
esas líneas. Sin ese filtro un script Bash de 50 líneas en CLAUDE.md
|
|
191
|
+
rompe la auditoría.
|
|
192
|
+
- **`refactor` que termina escribiendo el archivo**: el subcomando
|
|
193
|
+
refactor SOLO debe imprimir diff. Si modifica el archivo viola el
|
|
194
|
+
principio "el usuario decide". Cualquier modificación destructiva debe
|
|
195
|
+
ser explícita y confirmada por el usuario.
|
|
196
|
+
- **`init-project` sobreescribiendo CLAUDE.md existente**: el usuario
|
|
197
|
+
puede tener un CLAUDE.md curado con valor irrecuperable. NUNCA
|
|
198
|
+
sobreescribir — sugerir refactor.
|
|
199
|
+
- **Templates con `[TBD]` que después fallan auditoría**: los templates
|
|
200
|
+
generados por `init-user` y `init-project` usan `<!-- pendiente: ... -->`
|
|
201
|
+
HTML comments en lugar de `[TBD]` para que el auditor no los marque
|
|
202
|
+
como ERROR placeholders. Comments HTML son ignorados por el regex.
|
|
203
|
+
- **Aplicar el contrato canónico a CLAUDE.md de subdirectorios**: si el
|
|
204
|
+
proyecto adopta jerarquía (ADR-0007), los CLAUDE.md de subdirectorios
|
|
205
|
+
pueden NO tener todas las secciones canónicas (porque heredan del root).
|
|
206
|
+
Por ahora el auditor aplica el contrato uniforme; si el ADR-0007 se
|
|
207
|
+
acepta, el auditor debe distinguir root vs subdirectorio.
|
|
208
|
+
|
|
209
|
+
## Señales de alerta
|
|
210
|
+
|
|
211
|
+
Detente y escala si:
|
|
212
|
+
|
|
213
|
+
- El usuario pide `init-project` en un directorio que ya tiene CLAUDE.md
|
|
214
|
+
con >100 líneas de contenido custom (riesgo: pérdida de información)
|
|
215
|
+
- `audit` reporta WARN líneas pero el contenido es legítimamente
|
|
216
|
+
necesario (ej. listas grandes de comandos sin posibilidad de extracción
|
|
217
|
+
útil) — sugerir ajustar `SWL_CLAUDEMD_MAX_LINES`, no extraer por extraer
|
|
218
|
+
- El usuario pide `refactor` y propone extracciones que dispersarían
|
|
219
|
+
contexto crítico (ej. mover "Reglas de máxima prioridad") — rechazar
|
|
220
|
+
con explicación del anti-patrón
|