Generación, actualización y creación guiada de documentos de especificación en spec/ asi como la generación de los archivos fragmentados para doc-spec-manager a partir de los documentos fuente en spec/. Usar cuando: (1) se hayan modificado documentos en spec/, (2) se necesite regenerar las referencias del doc-spec-manager, (3) se quiera validar la integridad de las referencias actuales, (4) se quiera crear un nuevo documento spec/ o añadir entidades a uno existente.
Transforma los documentos de spec/ en fragmentos atómicos optimizados para
agentes en doc-spec-manager/references/. Toda la generación es determinista
(scripts Python, sin LLM): la misma entrada siempre produce la misma salida.
También guía la creación de nuevos documentos spec/ y la extensión de los existentes, asegurando que la estructura sea parseable por los extractores.
Ejecutar después de cualquier modificación en spec/:
python3 .agents/skills/doc-spec-generator/scripts/generate_all.py
Pasos automáticos:
extract_*.py → 619 fragmentos.gen_head_*.py → 8 head files.python3 .agents/skills/doc-spec-generator/scripts/validate_references.py
Workflow guiado para crear un nuevo archivo en spec/ que sea parseable.
Todo documento spec/ DEBE seguir esta estructura:
# Título del Documento
**Proyecto:** Associated - ERP Ligero para Colectividades Españolas
**Versión:** 1.0
**Fecha:** {Mes} {Año}
**Inputs:** {documentos de entrada, ej: KB-003 (Requisitos Funcionales)}
**Estado:** {Borrador | Validado | Aprobado | Verificado}
**Total {Tipo}:** {N}
---
## Índice
1. [{Sección 1}](#{anchor})
2. [{Sección 2}](#{anchor})
...
---
## {Sección H2}
### {Código}: {Título}
{Contenido del item...}
---
### {Código}: {Título}
{Contenido del item...}
Requisitos críticos para el parser:
: y título.---.El parser divide por headings con regex. Cada tipo de entidad tiene su patrón:
| Tipo | Nivel | Patrón del heading | Ejemplo |
|---|---|---|---|
| RF | H3 | ### N{x}RF{yy}: {título} | ### N2RF01: Aislamiento Multi-Tenant |
| RNF | H3 | ### RNF-{xxx}: {título} | ### RNF-001: Autenticación de Usuarios |
| BC | H2 | ## {N}. BC-{Name}: {título} | ## 3. BC-Membership: Gestión de Socios |
| ADR | H2 | ## ADR-{xxx}: {título} | ## ADR-001: Arquitectura General |
| Stack | H2 | ## {N}. {título} | ## 2. Backend |
| RNFT | H3 | ### {N}.{M} RNFT-{xxx}: {título} | ### 2.1 RNFT-001: Autenticación con JWT |
| US | H4 | #### US-{xxx}: {título} | #### US-001: Aislamiento de datos |
| UC | H3 | ### UC-{xxx}: {título} | ### UC-001: Provisión de nuevo tenant |
IMPORTANTE: Si el heading no sigue exactamente el patrón, el parser NO lo detectará.
Cada tipo de entidad debe incluir campos de trazabilidad en su contenido:
RF:
### N{x}RF{yy}: {Título}
**Qué es:** {descripción}
**Problema que resuelve:** {problema}
RNF:
### RNF-{xxx}: {Título}
**Descripción:** {descripción}
**Criterios de aceptación:**
- {criterio 1}
- {criterio 2}
**Trazabilidad RF:** {N{x}RF{yy}, ...}
RNFT:
### {N}.{M} RNFT-{xxx}: {Título}
**RNF Base:** RNF-{xxx} ({nombre del RNF})
{Implementación técnica con código...}
**Métricas:**
- {métrica 1}
US:
#### US-{xxx}: {Título}
**RF Origen:** N{x}RF{yy}
**Prioridad:** {Must | Should | Could | Won't}
> Como **{rol}**,
> quiero {acción},
> para {beneficio}.
**Criterios de Aceptación:**
```gherkin
Scenario: {nombre}
Given {contexto}
When {acción}
Then {resultado}
**UC:**
```markdown
### UC-{xxx}: {Título}
#### Metadatos
- **User Stories:** US-{xxx}, US-{yyy}
- **Bounded Context:** BC-{Name}
- **Application Service:** `{NombreService}`
- **Aggregates:** **{NombreAggregate}**
- **Prioridad:** {Must | Should | Could}
**Descripción:** {descripción}
#### Actores
#### Precondiciones
#### Flujo Normal
#### Flujos Alternativos
#### Flujos de Excepción
#### Domain Events Emitidos
#### Postcondiciones
Para determinar el siguiente código disponible:
# Último RF de sección N4:
ls references/rf/n4rf*.md | sort | tail -1
# → n4rf38.md → siguiente: N4RF39
# Último RNF:
ls references/rnf/ | sort | tail -1
# → rnf-066.md → siguiente: RNF-067
# Último US:
ls references/us/ | sort | tail -1
# → us-202.md → siguiente: US-203
# Último UC:
ls references/uc/ | sort | tail -1
# → uc-076.md → siguiente: UC-077
Los items H3/H4 heredan contexto de sus secciones H2 (y H3 para US):
## N4: Necesidades de Tesorería ← contexto H2 para RFs H3
### N4RF01: Configuración de Cuotas ← RF dentro de sección N4
## 3. BC-Treasury ← contexto H2 para USs
### 3.1 Configuración de Planes ← contexto H3 para USs H4
#### US-042: Crear plan de cuota ← US con contexto dual (H2 + H3)
El parser captura automáticamente este contexto y lo añade como blockquote al inicio del fragmento extraído.
python3 scripts/generate_all.py.Si se crea un archivo completamente nuevo (ej. 011_nuevo.md):
extract_nuevo.py:
lib_parser (split_by_heading o split_h2_sections).extract(spec_dir, output_dir) -> list[str].gen_head_nuevo.py:
generate(spec_dir, output_dir) -> str.generate_all.py (imports + listas).validate_references.py (ENTITY_TYPES + EXPECTED_HEAD_FILES).generate_all.py y verificar.| Fuente en spec/ | Script | Output en references/ |
|---|---|---|
003_requisitos-funcionales.md | extract_rf.py + gen_head_rf.py | rf/ + head-requisitos-funcionales.md |
004_rnf-base.md | extract_rnf.py + gen_head_rnf.py | rnf/ + head-requisitos-no-funcionales.md |
005_modelo-dominio.md | extract_bc.py + gen_head_bc.py | bc/ + head-modelo-dominio.md |
006_adrs.md | extract_adr.py + gen_head_adr.py | adr/ + head-adrs.md |
007_stack.md | extract_stack.py + gen_head_stack.py | stack/ + head-stack.md |
008_rnf-tecnicos.md | extract_rnft.py + gen_head_rnft.py | rnft/ + head-requisitos-no-funcionales-tech.md |
009_user-stories.md | extract_us.py + gen_head_us.py | us/ + head-user-stories.md |
010_casos-uso.md | extract_uc.py + gen_head_uc.py | uc/ + head-use-cases.md |
| Script | Función |
|---|---|
lib_parser.py | Librería compartida: parsing, split por heading, code fence handling |
extract_*.py | Fragmentan un documento spec/ en archivos individuales |
gen_head_*.py | Generan head-*.md (metadatos + índice + resúmenes) |
generate_all.py | Orquestador: limpia + genera + valida |
validate_references.py | Validación de integridad post-generación |
test_lib_parser.py | 108 tests para lib_parser.py |
python3 .agents/skills/doc-spec-generator/scripts/test_lib_parser.py
# dentro de bloques ```.