@saulwade/swl-ses 2.2.3 → 2.3.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/CLAUDE.md +4 -4
- package/README.md +3 -3
- package/agentes/arquitecto-swl.md +1 -1
- package/agentes/auto-evolucion-swl.md +908 -908
- package/agentes/backend-csharp-swl.md +1 -1
- package/agentes/backend-go-swl.md +1 -1
- package/agentes/backend-java-swl.md +1 -1
- package/agentes/backend-rust-swl.md +1 -1
- package/agentes/evals/orquestador-swl.evals.json +1 -1
- package/agentes/implementador-swl.md +2 -2
- package/agentes/llm-apps-swl.md +1 -1
- package/agentes/orquestador-swl.md +7 -7
- package/agentes/pagos-swl.md +1 -1
- package/agentes/perfilador-usuario-swl.md +321 -321
- package/agentes/planificador-swl.md +1 -1
- package/agentes/producto-prd-swl.md +1 -1
- package/agentes/revisor-seguridad-swl.md +1 -1
- package/agentes/sre-swl.md +1 -1
- package/comandos/swl/aprobar-plan.md +146 -141
- package/comandos/swl/release.md +45 -8
- package/comandos/swl/status.md +343 -333
- package/comandos/swl/verificar.md +817 -817
- package/habilidades/compactacion-contexto/SKILL.md +3 -3
- package/habilidades/contenedores-docker/SKILL.md +3 -1
- package/habilidades/context-builder/SKILL.md +4 -4
- package/habilidades/control-profundidad/SKILL.md +5 -5
- package/habilidades/ejecutar-fase/SKILL.md +564 -541
- package/habilidades/extractor-de-aprendizajes/SKILL.md +3 -3
- package/habilidades/guardrail-semantico/SKILL.md +1 -1
- package/habilidades/harness-claude-code/SKILL.md +305 -305
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +1 -1
- package/habilidades/planear-fase/SKILL.md +15 -1
- package/habilidades/proceso-debate-adversarial/SKILL.md +191 -164
- package/habilidades/prompt-engineering/SKILL.md +5 -5
- package/habilidades/release-semver/SKILL.md +4 -1
- package/habilidades/tdd-workflow/SKILL.md +33 -1
- package/habilidades/workflow-claude-code/SKILL.md +6 -6
- package/hooks/captura-acciones-post.js +151 -0
- package/hooks/captura-acciones-session.js +155 -0
- package/hooks/lib/briefing.js +512 -474
- package/hooks/lib/captura-acciones.js +392 -0
- package/hooks/lib/context-builder.js +2 -2
- package/hooks/lib/model-router.js +1 -1
- package/hooks/lib/token-estimator.js +2 -0
- package/hooks/linea-estado.js +7 -5
- package/llms.txt +29 -29
- package/manifiestos/canonical-hashes.json +1964 -1310
- package/manifiestos/hooks-config.json +18 -0
- package/manifiestos/modulos.json +4 -0
- package/manifiestos/skills-lock.json +1282 -1282
- package/package.json +93 -93
- package/plugin.json +371 -371
- package/reglas/git-coauthor.md +100 -100
- package/reglas/memoria-consolidada.md +41 -0
- package/reglas/pruebas.md +15 -0
- package/reglas/seguridad-agentes.md +66 -0
- package/schemas/agent-frontmatter.schema.json +294 -294
- package/schemas/instinct.schema.json +161 -152
- package/scripts/bootstrap-instintos.js +25 -7
- package/scripts/lib/claude-sessions.js +1 -0
- package/scripts/lib/gitignore-manifest.js +44 -11
- package/scripts/lib/skill-metrics.js +41 -1
- package/scripts/lib/tool-cost-analyzer.js +1 -0
- package/scripts/publicar.js +34 -85
- package/scripts/verificar-trazabilidad.js +329 -298
- package/scripts/vendor/claude-usage/__pycache__/scanner.cpython-314.pyc +0 -0
|
@@ -8,7 +8,7 @@ description: >
|
|
|
8
8
|
de producto (no solo técnicos). NO invocar para bugs o tareas técnicas puras
|
|
9
9
|
donde el planificador puede trabajar directamente del requisito.
|
|
10
10
|
tools: [Read, Write, Grep, Glob, WebSearch]
|
|
11
|
-
model: claude-opus-4-
|
|
11
|
+
model: claude-opus-4-8
|
|
12
12
|
modeloAlterno: claude-sonnet-4-6
|
|
13
13
|
ventanaContexto: 200k
|
|
14
14
|
permissionMode: plan
|
|
@@ -7,7 +7,7 @@ description: >
|
|
|
7
7
|
severidad CVSSv3 por hallazgo. Invocar antes de cualquier merge a main cuando
|
|
8
8
|
el código toca endpoints, autenticación, manejo de archivos o datos de usuario.
|
|
9
9
|
tools: [Read, Grep, Glob, Bash]
|
|
10
|
-
model: claude-opus-4-
|
|
10
|
+
model: claude-opus-4-8
|
|
11
11
|
modeloAlterno: claude-sonnet-4-6
|
|
12
12
|
ventanaContexto: 200k
|
|
13
13
|
color: red
|
package/agentes/sre-swl.md
CHANGED
|
@@ -8,7 +8,7 @@ description: >
|
|
|
8
8
|
cuantificar la confiabilidad de un sistema. Complementa a observabilidad-swl
|
|
9
9
|
(que implementa métricas) con el framework de confiabilidad.
|
|
10
10
|
tools: [Read, Write, Edit, Bash, Grep, Glob, Skill]
|
|
11
|
-
model: claude-opus-4-
|
|
11
|
+
model: claude-opus-4-8
|
|
12
12
|
modeloAlterno: claude-sonnet-4-6
|
|
13
13
|
ventanaContexto: 200k
|
|
14
14
|
permissionMode: acceptEdits
|
|
@@ -1,141 +1,146 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: swl:aprobar-plan
|
|
3
|
-
description: Aprueba el PLAN.md de una fase y lo firma con un lock SHA256 (gate G1 de SDD). Transiciona el frontmatter de estado borrador a aprobado y escribe .planning/locks/<plan>.lock. Es la única vía válida de aprobación — ejecutar-fase verifica este lock antes de implementar y detiene la ejecución si el plan fue mutado tras la firma.
|
|
4
|
-
allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# /swl:aprobar-plan <n> — Aprobar y firmar el plan de una fase (Gate G1)
|
|
8
|
-
|
|
9
|
-
Eres el guardián del gate G1 del enforcement SDD. Tu trabajo es transicionar un
|
|
10
|
-
PLAN de `borrador` a `aprobado` Y firmarlo con un lock SHA256, de modo que
|
|
11
|
-
cualquier mutación posterior del plan sea detectable por `/swl:ejecutar-fase`.
|
|
12
|
-
|
|
13
|
-
Este comando es la **única vía documentada de aprobación**. Editar el frontmatter
|
|
14
|
-
a mano (`estado: aprobado`) deja el plan en modo legacy (cláusula de gracia D-05):
|
|
15
|
-
se ejecuta con advertencia pero sin protección de integridad. Usar este comando
|
|
16
|
-
es lo que activa el gate real.
|
|
17
|
-
|
|
18
|
-
> **Invocación cross-scope** (ver `@docs/invocacion-cli-cross-scope.md`): las
|
|
19
|
-
> partes deterministas del gate viven en subcomandos del CLI. Resuélvelos así:
|
|
20
|
-
> si existe `./scripts/cli/<sub>.js` (repo madre) usa `node scripts/cli/<sub>.js`;
|
|
21
|
-
> si `command -v swl-ses` responde usa `swl-ses <sub>`; si no,
|
|
22
|
-
> `npx -y @saulwade/swl-ses@latest <sub>`. Abajo escribo la forma `swl-ses <sub>`
|
|
23
|
-
> como canónica. NUNCA uses `node -e "require('./scripts/lib/...')"` — esa ruta no
|
|
24
|
-
> existe en proyectos downstream.
|
|
25
|
-
|
|
26
|
-
## Uso
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
/swl:aprobar-plan 9
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
El argumento `<n>` es el número de la fase cuyo PLAN se aprueba.
|
|
33
|
-
|
|
34
|
-
## Paso 1 — Localizar el PLAN
|
|
35
|
-
|
|
36
|
-
Resuelve la ruta `.planning/fases/0N-PLAN.md` (N con cero a la izquierda si N < 10).
|
|
37
|
-
|
|
38
|
-
- Si no existe: detente con "No existe el PLAN de la fase N. Ejecuta `/swl:planear-fase N` primero."
|
|
39
|
-
- Lee el archivo completo.
|
|
40
|
-
|
|
41
|
-
## Paso 2 — Validar el estado actual del frontmatter
|
|
42
|
-
|
|
43
|
-
Lee el campo `estado:` del frontmatter:
|
|
44
|
-
|
|
45
|
-
- Si `estado: borrador` → continúa al Paso 3 (caso normal).
|
|
46
|
-
- Si `estado: aprobado` → ya está aprobado. Verifica si existe el lock:
|
|
47
|
-
```bash
|
|
48
|
-
swl-ses verificar-plan --fase=N
|
|
49
|
-
```
|
|
50
|
-
- Si `modo: "firmado"` → informa "El plan ya está aprobado y firmado." y termina.
|
|
51
|
-
- Si `modo: "legacy"` (aprobado sin lock) → pregunta al usuario: "El plan está
|
|
52
|
-
aprobado pero sin firmar (modo legacy). ¿Lo firmo ahora para activar el gate
|
|
53
|
-
G1?" Si confirma, salta al Paso 4 (firmar sin re-transicionar).
|
|
54
|
-
- Si `modo: "mutado"` → el plan cambió tras una firma previa. Informa el
|
|
55
|
-
`hashEsperado` vs `hashActual` y pregunta si re-aprobar (re-firmar el estado
|
|
56
|
-
actual). Procede solo con confirmación explícita.
|
|
57
|
-
- Si no hay campo `estado` → detente: "El PLAN no tiene campo `estado` en el
|
|
58
|
-
frontmatter. Revisa que sea un plan válido generado por `/swl:planear-fase`."
|
|
59
|
-
|
|
60
|
-
## Paso 2.5 — Validar la matriz REQ×T (trazabilidad G4)
|
|
61
|
-
|
|
62
|
-
Lee `.planning/fases/0N-CONTEXTO.md` y extrae los IDs `REQ-NN:` (fases 01-11) o
|
|
63
|
-
`REQ-<fase>-NN:` (namespaceados, fases ≥12) de la sección de criterios de
|
|
64
|
-
aceptación. `verificar-trazabilidad.js` reconoce ambos formatos.
|
|
65
|
-
|
|
66
|
-
- **CONTEXTO sin REQ-IDs** (fases legacy 01-09): advertencia informativa
|
|
67
|
-
("CONTEXTO sin REQ-IDs — trazabilidad no exigible, gracia legacy") y continúa.
|
|
68
|
-
- **CONTEXTO con REQ-IDs**: verifica que el PLAN cubra TODOS:
|
|
69
|
-
```bash
|
|
70
|
-
swl-ses verificar-trazabilidad --fase=N --solo-plan
|
|
71
|
-
```
|
|
72
|
-
- Exit 0 → continúa al Paso 3.
|
|
73
|
-
- Exit 1 (REQ huérfanos) → **RECHAZA la aprobación**. Lista los REQ sin tarea y
|
|
74
|
-
remite a `/swl:planear-fase N` para cubrirlos (o a retirar el REQ del CONTEXTO
|
|
75
|
-
con marca "RETIRADO — razón"). NO firmes un plan con REQ huérfanos.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
- El
|
|
141
|
-
|
|
1
|
+
---
|
|
2
|
+
name: swl:aprobar-plan
|
|
3
|
+
description: Aprueba el PLAN.md de una fase y lo firma con un lock SHA256 (gate G1 de SDD). Transiciona el frontmatter de estado borrador a aprobado y escribe .planning/locks/<plan>.lock. Es la única vía válida de aprobación — ejecutar-fase verifica este lock antes de implementar y detiene la ejecución si el plan fue mutado tras la firma.
|
|
4
|
+
allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /swl:aprobar-plan <n> — Aprobar y firmar el plan de una fase (Gate G1)
|
|
8
|
+
|
|
9
|
+
Eres el guardián del gate G1 del enforcement SDD. Tu trabajo es transicionar un
|
|
10
|
+
PLAN de `borrador` a `aprobado` Y firmarlo con un lock SHA256, de modo que
|
|
11
|
+
cualquier mutación posterior del plan sea detectable por `/swl:ejecutar-fase`.
|
|
12
|
+
|
|
13
|
+
Este comando es la **única vía documentada de aprobación**. Editar el frontmatter
|
|
14
|
+
a mano (`estado: aprobado`) deja el plan en modo legacy (cláusula de gracia D-05):
|
|
15
|
+
se ejecuta con advertencia pero sin protección de integridad. Usar este comando
|
|
16
|
+
es lo que activa el gate real.
|
|
17
|
+
|
|
18
|
+
> **Invocación cross-scope** (ver `@docs/invocacion-cli-cross-scope.md`): las
|
|
19
|
+
> partes deterministas del gate viven en subcomandos del CLI. Resuélvelos así:
|
|
20
|
+
> si existe `./scripts/cli/<sub>.js` (repo madre) usa `node scripts/cli/<sub>.js`;
|
|
21
|
+
> si `command -v swl-ses` responde usa `swl-ses <sub>`; si no,
|
|
22
|
+
> `npx -y @saulwade/swl-ses@latest <sub>`. Abajo escribo la forma `swl-ses <sub>`
|
|
23
|
+
> como canónica. NUNCA uses `node -e "require('./scripts/lib/...')"` — esa ruta no
|
|
24
|
+
> existe en proyectos downstream.
|
|
25
|
+
|
|
26
|
+
## Uso
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
/swl:aprobar-plan 9
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
El argumento `<n>` es el número de la fase cuyo PLAN se aprueba.
|
|
33
|
+
|
|
34
|
+
## Paso 1 — Localizar el PLAN
|
|
35
|
+
|
|
36
|
+
Resuelve la ruta `.planning/fases/0N-PLAN.md` (N con cero a la izquierda si N < 10).
|
|
37
|
+
|
|
38
|
+
- Si no existe: detente con "No existe el PLAN de la fase N. Ejecuta `/swl:planear-fase N` primero."
|
|
39
|
+
- Lee el archivo completo.
|
|
40
|
+
|
|
41
|
+
## Paso 2 — Validar el estado actual del frontmatter
|
|
42
|
+
|
|
43
|
+
Lee el campo `estado:` del frontmatter:
|
|
44
|
+
|
|
45
|
+
- Si `estado: borrador` → continúa al Paso 3 (caso normal).
|
|
46
|
+
- Si `estado: aprobado` → ya está aprobado. Verifica si existe el lock:
|
|
47
|
+
```bash
|
|
48
|
+
swl-ses verificar-plan --fase=N
|
|
49
|
+
```
|
|
50
|
+
- Si `modo: "firmado"` → informa "El plan ya está aprobado y firmado." y termina.
|
|
51
|
+
- Si `modo: "legacy"` (aprobado sin lock) → pregunta al usuario: "El plan está
|
|
52
|
+
aprobado pero sin firmar (modo legacy). ¿Lo firmo ahora para activar el gate
|
|
53
|
+
G1?" Si confirma, salta al Paso 4 (firmar sin re-transicionar).
|
|
54
|
+
- Si `modo: "mutado"` → el plan cambió tras una firma previa. Informa el
|
|
55
|
+
`hashEsperado` vs `hashActual` y pregunta si re-aprobar (re-firmar el estado
|
|
56
|
+
actual). Procede solo con confirmación explícita.
|
|
57
|
+
- Si no hay campo `estado` → detente: "El PLAN no tiene campo `estado` en el
|
|
58
|
+
frontmatter. Revisa que sea un plan válido generado por `/swl:planear-fase`."
|
|
59
|
+
|
|
60
|
+
## Paso 2.5 — Validar la matriz REQ×T (trazabilidad G4)
|
|
61
|
+
|
|
62
|
+
Lee `.planning/fases/0N-CONTEXTO.md` y extrae los IDs `REQ-NN:` (fases 01-11) o
|
|
63
|
+
`REQ-<fase>-NN:` (namespaceados, fases ≥12) de la sección de criterios de
|
|
64
|
+
aceptación. `verificar-trazabilidad.js` reconoce ambos formatos.
|
|
65
|
+
|
|
66
|
+
- **CONTEXTO sin REQ-IDs** (fases legacy 01-09): advertencia informativa
|
|
67
|
+
("CONTEXTO sin REQ-IDs — trazabilidad no exigible, gracia legacy") y continúa.
|
|
68
|
+
- **CONTEXTO con REQ-IDs**: verifica que el PLAN cubra TODOS:
|
|
69
|
+
```bash
|
|
70
|
+
swl-ses verificar-trazabilidad --fase=N --solo-plan
|
|
71
|
+
```
|
|
72
|
+
- Exit 0 → continúa al Paso 3.
|
|
73
|
+
- Exit 1 (REQ huérfanos) → **RECHAZA la aprobación**. Lista los REQ sin tarea y
|
|
74
|
+
remite a `/swl:planear-fase N` para cubrirlos (o a retirar el REQ del CONTEXTO
|
|
75
|
+
con marca "RETIRADO — razón"). NO firmes un plan con REQ huérfanos.
|
|
76
|
+
- **WARN "headers de tarea malformados"** (warn-only, no cambia el exit): si el
|
|
77
|
+
reporte lista headers como `#### T-01 — ...`, son la **causa silenciosa** de
|
|
78
|
+
REQ huérfanos. El parser de la matriz exige `### T-NN:` (2-4 `#`, dos puntos
|
|
79
|
+
tras el ID; nunca em-dash). Corrige el separador en el PLAN y re-ejecuta antes
|
|
80
|
+
de aprobar — un header con `—` deja la tarea invisible aunque declare su REQ.
|
|
81
|
+
|
|
82
|
+
## Paso 3 — Confirmar con el usuario antes de aprobar
|
|
83
|
+
|
|
84
|
+
NUNCA apruebes sin confirmación explícita. Presenta un resumen breve del plan
|
|
85
|
+
(número de slices, tareas, slices HITL) y pregunta:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
El plan de la fase N tiene [X] slices y [Y] tareas ([Z] HITL).
|
|
89
|
+
¿Confirmas la aprobación? Al aprobar se firma con SHA256 y queda inmutable:
|
|
90
|
+
cualquier edición posterior detendrá /swl:ejecutar-fase.
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Espera respuesta afirmativa. Si el usuario pide cambios, NO apruebes — remítelo
|
|
94
|
+
a `/swl:planear-fase N` para refinar.
|
|
95
|
+
|
|
96
|
+
## Paso 4 — Transicionar y firmar
|
|
97
|
+
|
|
98
|
+
1. **Transicionar** (omitir si el plan ya estaba `aprobado` en modo legacy):
|
|
99
|
+
edita el frontmatter `estado: borrador` → `estado: aprobado` y agrega
|
|
100
|
+
`aprobadoPor: usuario (<nombre>) — <fecha>, via /swl:aprobar-plan`.
|
|
101
|
+
|
|
102
|
+
2. **Firmar y marcar la fase activa** — un solo subcomando hace las tres
|
|
103
|
+
operaciones deterministas: firma SHA256 → `.planning/locks/0N-PLAN.md.lock`,
|
|
104
|
+
verifica la firma, y escribe `.planning/locks/fase-activa.json` (gate G0 que
|
|
105
|
+
consume `hooks/spec-gate.js`):
|
|
106
|
+
```bash
|
|
107
|
+
swl-ses aprobar-plan --fase=N
|
|
108
|
+
```
|
|
109
|
+
Verifica en la salida JSON que `ok: true` y `modo: "firmado"`. Si reporta
|
|
110
|
+
error de firma, **NO continúes** — revisa el `motivo`.
|
|
111
|
+
|
|
112
|
+
El `.lock` SÍ se versiona en git (evidencia de aprobación, parte del audit
|
|
113
|
+
trail SDD). El `fase-activa.json` es runtime local (gitignored);
|
|
114
|
+
`/swl:ejecutar-fase` lo elimina al cerrar la fase. Re-ejecutar
|
|
115
|
+
`swl-ses aprobar-plan --fase=N` tras una re-aprobación (plan mutado) realinea
|
|
116
|
+
lock y fase-activa automáticamente.
|
|
117
|
+
|
|
118
|
+
## Paso 5 — Reporte
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
Plan de la fase N aprobado y firmado (gate G1 activo).
|
|
122
|
+
|
|
123
|
+
estado: borrador -> aprobado
|
|
124
|
+
lock: .planning/locks/0N-PLAN.md.lock
|
|
125
|
+
fase activa: .planning/locks/fase-activa.json (gate G0 cubierto)
|
|
126
|
+
sha256: <hash corto>
|
|
127
|
+
|
|
128
|
+
Cualquier edición del PLAN tras esta firma detendrá /swl:ejecutar-fase con un
|
|
129
|
+
mensaje de "plan mutado tras aprobación". Para cambiar el plan: edítalo y vuelve
|
|
130
|
+
a ejecutar /swl:aprobar-plan N.
|
|
131
|
+
|
|
132
|
+
Próximo paso: /swl:ejecutar-fase N
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Reglas de comportamiento
|
|
136
|
+
|
|
137
|
+
- NUNCA apruebes un plan sin confirmación explícita del usuario.
|
|
138
|
+
- NUNCA modifiques el contenido del plan al aprobarlo — solo el campo `estado`
|
|
139
|
+
del frontmatter y la línea `aprobadoPor`. El cuerpo es lo que se firma.
|
|
140
|
+
- El lock vive en `.planning/locks/` y SÍ se versiona en git (es evidencia de
|
|
141
|
+
aprobación, parte del audit trail de SDD).
|
|
142
|
+
- Si el usuario quiere cambiar el plan después de aprobado, el flujo correcto es
|
|
143
|
+
editar el PLAN y re-ejecutar `/swl:aprobar-plan N` (re-firma). NUNCA editar el
|
|
144
|
+
lock a mano.
|
|
145
|
+
- El número de versión del release que publique esta fase lo decide el usuario
|
|
146
|
+
(regla CLAUDE.md) — este comando no toca versiones.
|
package/comandos/swl/release.md
CHANGED
|
@@ -266,7 +266,19 @@ Usar tags anotados siempre (regla del skill).
|
|
|
266
266
|
|
|
267
267
|
## Paso 9 — Generar RELEASE-NOTES
|
|
268
268
|
|
|
269
|
-
Crea `RELEASE-NOTES-v[nueva-versión].md` con: resumen,
|
|
269
|
+
Crea `releases/v[nueva-versión]/RELEASE-NOTES-v[nueva-versión].md` con: resumen,
|
|
270
|
+
cambios, instrucciones de actualización y guía de migración si hay breaking changes.
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
mkdir -p releases/v[nueva-versión]
|
|
274
|
+
# escribir releases/v[nueva-versión]/RELEASE-NOTES-v[nueva-versión].md
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
**NUNCA crear las RELEASE-NOTES en la raíz del repo.** La convención (todos los
|
|
278
|
+
releases previos en `releases/`) es que las RELEASE-NOTES viven SOLO en
|
|
279
|
+
`releases/vX.Y.Z/` — no se versiona ninguna copia en raíz. El directorio
|
|
280
|
+
`releases/v[nueva-versión]/` también lo crea `evidencia-release.js` (Paso 9.5);
|
|
281
|
+
si ese paso corre primero, el `mkdir -p` es no-op.
|
|
270
282
|
|
|
271
283
|
## Paso 9.5 — Evidencia de procedencia (cadena de suministro, ADR-0038)
|
|
272
284
|
|
|
@@ -286,20 +298,21 @@ Esto escribe (vía `scripts/lib/evidencia-release.js`):
|
|
|
286
298
|
Luego:
|
|
287
299
|
|
|
288
300
|
1. **Insertar la sección "Integridad y verificación"** en
|
|
289
|
-
`RELEASE-NOTES-v[nueva-versión].md`, justo después de
|
|
290
|
-
correcciones. La genera `seccionVerificacionNotas` de la lib:
|
|
301
|
+
`releases/v[nueva-versión]/RELEASE-NOTES-v[nueva-versión].md`, justo después de
|
|
302
|
+
la sección de correcciones. La genera `seccionVerificacionNotas` de la lib:
|
|
291
303
|
|
|
292
304
|
```bash
|
|
293
305
|
node -e "const {seccionVerificacionNotas}=require('./scripts/lib/evidencia-release');const fs=require('fs');const v='[nueva-versión]';const sums=fs.readFileSync('releases/v'+v+'/SHA256SUMS','utf8').trim().split(/\s+/);const md=seccionVerificacionNotas({version:v,hash:sums[0],tarball:sums[1]});console.log(md)"
|
|
294
306
|
```
|
|
295
307
|
|
|
296
|
-
|
|
308
|
+
Anexar ese markdown a `releases/v[nueva-versión]/RELEASE-NOTES-v[nueva-versión].md`
|
|
309
|
+
(tras "Correcciones").
|
|
297
310
|
|
|
298
|
-
2. **
|
|
299
|
-
|
|
311
|
+
2. **Versionar la evidencia** del release. Las RELEASE-NOTES ya viven en
|
|
312
|
+
`releases/v[nueva-versión]/` (Paso 9) — NO hacer `cp` desde la raíz (no debe
|
|
313
|
+
existir copia en raíz):
|
|
300
314
|
|
|
301
315
|
```bash
|
|
302
|
-
cp RELEASE-NOTES-v[nueva-versión].md releases/v[nueva-versión]/
|
|
303
316
|
git add releases/v[nueva-versión]/
|
|
304
317
|
```
|
|
305
318
|
|
|
@@ -397,7 +410,7 @@ Commits incluidos: [N] (feat: [N], fix: [N], otros: [N])
|
|
|
397
410
|
Tests: [ejecutados OK | omitidos (--skip-tests)]
|
|
398
411
|
|
|
399
412
|
Próximos pasos:
|
|
400
|
-
1. Revisar RELEASE-NOTES-v[nueva-versión].md
|
|
413
|
+
1. Revisar releases/v[nueva-versión]/RELEASE-NOTES-v[nueva-versión].md
|
|
401
414
|
2. git push origin v[nueva-versión]
|
|
402
415
|
3. Publicar release en GitHub/GitLab si aplica
|
|
403
416
|
4. Notificar al equipo
|
|
@@ -411,3 +424,27 @@ Próximos pasos:
|
|
|
411
424
|
- Si tipo calculado es MAJOR pero usuario pidió --tipo=patch, reportar discrepancia y esperar confirmación.
|
|
412
425
|
- CHANGELOG legible por alguien que no conoce el código.
|
|
413
426
|
- Si es monorepo, reportar que no se soporta y sugerir lerna/changesets.
|
|
427
|
+
- **Crear el tag anotado AL FINAL del proceso, cuando el contenido está congelado
|
|
428
|
+
y verificado** (tras evidencia + RELEASE-NOTES). Commitear ENCIMA de un tag de
|
|
429
|
+
release ya creado pero aún-no-publicado obliga a mover el tag + regenerar la
|
|
430
|
+
evidencia (el SHA del tarball cambia si el commit toca archivos de
|
|
431
|
+
`package.json#files`) — churn evitable. Si hay que iterar, hacerlo antes de taggear.
|
|
432
|
+
- **Si el usuario alimenta archivos de forma incremental para la MISMA versión
|
|
433
|
+
("faltan N archivos que agregar a esta versión, espera"), NO finalizar el
|
|
434
|
+
release** (no congelar tag, no regenerar evidencia final, no proponer push)
|
|
435
|
+
hasta que el usuario confirme que ya están TODOS los archivos. Mantener el
|
|
436
|
+
commit de release como HEAD entre tandas para que cada incorporación sea un
|
|
437
|
+
`amend` limpio + mover tag; regenerar la evidencia (SBOM/SHA256SUMS) SOLO en la
|
|
438
|
+
última tanda, porque el SHA del tarball cambia con cada archivo nuevo que entre
|
|
439
|
+
en `package.json#files`. Cerrar el release antes de tiempo obliga a rehacer
|
|
440
|
+
evidencia y tag por cada archivo tardío.
|
|
441
|
+
- **El agente NUNCA corre `npm` (test/pack/build/publish) en paralelo a un
|
|
442
|
+
`npm run publish:*` que está ejecutando el usuario.** `test:release` incluye
|
|
443
|
+
`test:smoke` (install/uninstall a temp + lectura de estado global); dos suites
|
|
444
|
+
simultáneas colisionan y rompen `prepublishOnly` con fallos espurios que parecen
|
|
445
|
+
bugs de test pero son concurrencia. La preparación del release (bump, manifests,
|
|
446
|
+
evidencia, push, GitHub release) termina ANTES de que el usuario publique; durante
|
|
447
|
+
el publish del usuario, el agente no ejecuta `npm`.
|
|
448
|
+
- Si `prepublishOnly` falla y no se ve la causa: npm v10 NO guarda el stdout del
|
|
449
|
+
script fallido en su debug log. Capturar con el log síncrono de `publicar.js`
|
|
450
|
+
(`.planning/logs/publish-<v>-<ts>.log`) o `... *>&1 | Tee-Object`. No diagnosticar a ciegas.
|