Version: 1.0 · Fecha: 2026-04-20
Inventario de los scripts del pipeline, su instalación, uso y mantenimiento.
Todos los scripts viven en:
Documentation/centrica/11_Backlog/03_Prompts/scripts/
Estructura:
scripts/
├── .venv/ ← virtualenv con todas las deps (no en git)
├── 01_extract_hu.sh ← Fase A · bash
├── 02_parse_hu.py ← Fase A · parser
├── 03_validate_v2.py ← Fase E · validador
├── 04_generate_docx.py ← Fase D · generador DOCX
├── 05_render_wireframe.py ← Fase D · renderer PNG
├── icons/
│ └── lucide_icons.py ← 16 iconos SVG lucide
├── templates/
│ ├── nebula.css ← Estilos Nebula v1.4
│ ├── base.html.j2 ← Layout global
│ ├── list_view.html.j2
│ ├── form.html.j2
│ ├── modal.html.j2
│ ├── detail.html.j2
│ └── wizard.html.j2
└── README.md ← Guía rápida de uso
Ubuntu 24.04 (o equivalente). Instalar herramientas de sistema:
sudo apt update
sudo apt install -y poppler-utils python3 python3-venv python3-pip
cd Documentation/centrica/11_Backlog/03_Prompts/scripts
python3 -m venv .venv
.venv/bin/pip install --upgrade pip
.venv/bin/pip install python-docx pyyaml Pillow jinja2 weasyprint
Versiones mínimas validadas:
| Paquete | Versión |
|---|---|
| python-docx | 1.2 |
| pyyaml | 6.0 |
| Pillow | 10.0 |
| jinja2 | 3.0 |
| weasyprint | 65 |
.venv/bin/python3 -c "
import docx, yaml, PIL, jinja2, weasyprint
print('python-docx:', docx.__version__)
print('pyyaml:', yaml.__version__)
print('Pillow:', PIL.__version__)
print('jinja2:', jinja2.__version__)
print('weasyprint:', weasyprint.__version__)
"
Hay 3 opciones operativas:
| Herramienta | Ventaja | Desventaja |
|---|---|---|
| WPS Office (ya instalado) | Exportación visual 2 clics | No scripteable (GUI-first) |
| LibreOffice (no instalado) | Scripteable libreoffice --headless --convert-to pdf |
~400 MB extras |
| Pandoc + LaTeX | Scripteable | Layout se degrada con tablas complejas |
Por ahora (v1.0): uso manual con WPS.
Previsto en servidor CI: instalar libreoffice-core --no-install-recommends.
Función: extrae texto + mockups de PDF V1 + anexos.
Dependencias: pdftotext, pdfimages, pdftoppm (poppler-utils).
Uso:
./01_extract_hu.sh <V1.pdf> [anexo_flujo.pdf] [anexo_casos.pdf] [out_dir]
Salida:
<out_dir>/02_fase_A_extraccion/
├── hu-v1.txt
├── anexo1.txt
├── anexo2.txt
├── wireframes/ ← imágenes del PDF principal
│ └── _descartados/ ← logos/headers repetidos
├── wireframes_anexo1/ ← imágenes del anexo
├── sections.tsv
├── ids_detectados.tsv
└── extraction.log
Código fuente: 01_extract_hu.sh.
Función: estructura el texto extraído en extracted.yaml.
Dependencias: Python 3.10 + PyYAML.
Uso:
.venv/bin/python3 02_parse_hu.py <extract_dir> [--pdf-name <nombre.pdf>]
Salida: <extract_dir>/extracted.yaml.
Limitaciones conocidas:
Solución: revisar extracted.yaml tras ejecutar y corregir manualmente los errores (es rápido, 2–3 min).
Código fuente: 02_parse_hu.py.
Función: valida el DOCX generado contra criterios E1-E4.
Dependencias: Python + python-docx + PyYAML.
Uso:
.venv/bin/python3 03_validate_v2.py <docx | markdown> [--v1-yaml extracted.yaml] [--output reporte.md]
Salida:
0 si pasa, 1 si falla.Criterios:
| ID | Nombre | Umbral |
|---|---|---|
| E1 | Trazabilidad grafo | sin huérfanos |
| E2 | Cobertura campos | 100% |
| E3 | Cobertura semántica V1→V2 | ≥ 85% (solo si se pasa --v1-yaml) |
| E4 | Gherkin válido | ≥ 85% |
Código fuente: 03_validate_v2.py.
Función: genera el DOCX V2 a partir del hu_spec.yaml.
Dependencias: Python + python-docx + PyYAML. Invoca 05_render_wireframe.py por cada INT.
Uso:
.venv/bin/python3 04_generate_docx.py <hu_spec.yaml> <mockups_dir> <output.docx>
Salida:
<output.docx> con la estructura V2 canónica (10+ tablas anidadas según alcances).<mockups_dir>/_rendered/INT-ALCn-##.png por cada INT con layout:.Características:
Table Grid con colores de header #D9E2F3.Código fuente: 04_generate_docx.py.
Función: renderiza un INT a PNG aplicando identidad visual Nebula v1.4.
Dependencias: Python + Jinja2 + WeasyPrint + Pillow + pdftoppm.
Uso (single):
.venv/bin/python3 05_render_wireframe.py <layout.yaml> <output.png>
Uso (batch desde hu_spec):
.venv/bin/python3 05_render_wireframe.py <hu_spec.yaml> <output_dir> --from-hu-spec
Flujo interno:
layout.yaml → Jinja2 template (list_view/form/modal/detail/wizard)
→ HTML + nebula.css
→ WeasyPrint → PDF (1600×4000 max)
→ pdftoppm → PNG
→ Pillow recorta espacio blanco inferior
→ PNG final (ancho 1600, alto adaptable ≥ 900)
Características:
Código fuente: 05_render_wireframe.py.
Previsto para v1.1: un script run_pipeline.sh que ejecute A→E de forma encadenada con un solo comando:
./run_pipeline.sh HU-CON-013 \
--v1 /ruta/HU-CON-013-V1.pdf \
--anexo-flujo /ruta/Anexo_1_Flujo.pdf \
--anexo-casos /ruta/Anexo_2_Casos.pdf \
--output-dir ./HU-CON-013/
Por ahora las fases se invocan individualmente.
Cuando la empresa compre Claude, los scripts se invocan desde subagentes Claude Code definidos en .claude/agents/:
| Subagente | Fase | Función |
|---|---|---|
hu-extractor |
A | Orquesta 01_extract_hu.sh + 02_parse_hu.py |
wireframe-interpreter |
B | LLM-vision sobre mockups |
mapping-analyst |
C | LLM-texto + presentación de gate C4 |
docx-synthesizer |
D | LLM D4/D5 + 04_generate_docx.py |
hu-validator |
E | 03_validate_v2.py + prompt 7 dimensiones |
Detalle en 05_CONFIGURACION_CLAUDE.
cd Documentation/centrica/11_Backlog/03_Prompts/scripts
.venv/bin/pip install --upgrade python-docx pyyaml Pillow jinja2 weasyprint
stroke-width="2", stroke-linecap="round", stroke-linejoin="round".LUCIDE_ICONS en icons/lucide_icons.py con clave en snake-case.templates/<type>.html.j2 que extienda base.html.j2.TEMPLATE_MAP de 05_render_wireframe.py.TEMPLATE_HU_WIREFRAME_FIRST.yaml.Los tokens están centralizados en :root { ... } de templates/nebula.css. Un solo cambio ahí propaga a todos los wireframes.
WeasyPrint falla con error: failed to find pangoInstalar libs del sistema:
sudo apt install libpango-1.0-0 libpangoft2-1.0-0
Bug conocido de WeasyPrint con <input>. Solución: los templates usan <div class="fake-input"> en su lugar.
El algoritmo de crop busca último píxel con canal < 180. Si el wireframe tiene bloques gris claro al final (ej. --nebula-silver 176), el crop puede no ejecutarse. Solución: ajustar umbral en 05_render_wireframe.py función html_to_png.
Verificar:
hu_spec.yaml tiene metadata, descripcion y alcances.fns, ints, rns, cas.mockups_dir existe y es accesible.docxAsegurar que se ejecuta con el venv:
.venv/bin/python3 <script>.py
No con python3 del sistema.
| Version | Fecha | Autor | Descripcion |
|---|---|---|---|
| 1.0.0 | 2026-04-20 | Carlos Torres | Inventario inicial de scripts |