| tipo | readme |
|---|---|
| estado | activo |
quarto-studio/ — herramientas de la familia de blogs Quarto y su GUI, Quarto Studio (repo scripts_for_quarto)
Suite quarto_studio · objetivo publicacion · estado activo · python · interfaz gui
Interfaz de escritorio (PySide6) sobre los backends de la familia de blogs Quarto: render, publicación, metadatos, índices.
- Escribe en: web, vault · simula por defecto: sí
- Depende de: PySide6, blogs_manager, metadata_manager, pub_index_symlink
Comandos:
main.pyBloque generado desde suite.yml por core/suites.py generar (2026-10-04); no se edita a mano.
Suites de esta carpeta (6); índice global en meta/INDICE_SCRIPTS.md. Patrón: M main · C config · L lib.
| Suite | Carpeta | Objetivo | Escribe en | Simula | Timer | Estado | Patrón |
|---|---|---|---|---|---|---|---|
blogs_manager |
quarto-studio/backend/script_blogs_manager | publicacion | web, git, archivos | no | activo | MCL |
|
format_yaml |
quarto-studio/backend/script_format_yaml | publicacion | web | no | activo | MCL |
|
generador_publicacion_similar |
quarto-studio/backend/script_generador_publicacion_similar | publicacion | web | no | activo | MCL |
|
metadata_manager |
quarto-studio/backend/script_metadata_manager | publicacion | web | no | activo | MCL |
|
pub_index_symlink |
quarto-studio/backend/script_pub_index_symlink | publicacion | vault | no | activo | MCL |
|
quarto_studio |
quarto-studio/studio | publicacion | web, vault | sí | activo | M·· |
Bloque generado desde los suite.yml por core/suites.py generar (2026-10-31); no se edita a mano.
Cinco herramientas de línea de comandos (tres en Bash, dos en Python) para mantener la familia de blogs Quarto del autor: el hub
web (repo website-achalma) y sus satélites pub_*, submódulos git del hub en web/_pubs/
(la lista, en web/_pubs/pubs.yml). Resuelven lo que Quarto no hace por sí solo: editar el frontmatter de cientos de posts
a la vez desde un Excel, normalizar etiquetas y fechas, reparar bloques YAML, generar índices de contenido,
mantener un índice por año en el vault y renderizar o publicar los doce sitios desde un solo menú.
Dos nombres para una sola cosa: la carpeta es quarto-studio y el remoto en GitHub se llama
scripts_for_quarto. La aplicación de escritorio que las envuelve, Quarto Studio (suite quarto_studio), vive
en este mismo repo, en studio/ (de la ola 4 al 2026-10-27 estuvo en el repo gui-suites), y encuentra estas
herramientas en backend/; lo común de los studios (gui_comun) lo importa de core/py-common/.
No es un tema, un sitio ni una plantilla de Quarto: el tema de los doce sitios vive en el hub y se
propaga con web/scripts/sync-theme-pubs.sh; el contenido de cada post vive en su pub. Tampoco es
una biblioteca: cada herramienta es autónoma, con su suite.yml, su README y su lib/, y Quarto Studio las
invoca como procesos, nunca importa su código. Depende de core/ (raíz y logger) y de web
(meta/workspace.yml). Su único dato propio es el Excel de metadatos,
backend/script_metadata_manager/excel_databases/quarto_metadata.xlsx, versionado a propósito como mesa
de trabajo: la verdad de cada post sigue siendo su index.qmd.
Lo que cada herramienta escribe fuera de este repo. Este repo es el proveedor: web enlaza aquí
desde su CLAUDE.md y su docs/. La verdad de un post es siempre su index.qmd; el
Excel es la mesa de trabajo, y lo que se edite a mano en un .qmd prevalece hasta el siguiente
create-template --incremental o find-differences.
| herramienta | escribe | dónde | cómo se protege |
|---|---|---|---|
metadata_manager |
el frontmatter YAML de los index.qmd |
web/blog/posts/ y los posts/ de cada pub |
--dry-run (la terminal aplica sin él); solo cambia lo que difiere; un solo escritor de YAML; nunca crea citation |
format_yaml |
el bloque YAML de cada .qmd (delimitadores y líneas en blanco) |
la carpeta que se le pase | idempotente; --dry-run |
generador_publicacion_similar |
_contenido_<subblog>.qmd, fragmentos para {{< include >}} con su identidad en un comentario de la línea 1 (sin frontmatter) |
la carpeta de cada subblog del blog que se le pase | --dry-run; si un subblog queda sin posts, borra su índice |
pub_index_symlink |
enlaces simbólicos por año, nunca copias | web/_indice/ (ignorado en git; del vault) |
omite lo que ya apunta bien; no toca archivos reales; --dry-run |
blogs_manager |
_site/, _freeze/, posts nuevos, commits, respaldos |
hub y pubs; $DOCS_ROOT/archivo/backups-publicaciones/; el remoto git (Netlify) o quarto publish <destino> |
publish y git-commit simulan salvo --aplicar, empujan solo tras la puerta R6 y no hacen git add .; clean-all pide confirmación |
Quarto Studio (studio/) |
nada propio: lanza las cinco anteriores; guarda el plan y el registro de cada operación en la caché del studio | — | una operación a la vez; F5 simula (la CLI o el plan de la ventana) y Ctrl+Intro aplica tras confirmar; publicar nombra el sitio y su dominio |
Cómo están montados los pubs y por qué se confirma dentro del pub antes que en el hub:
web/docs/pubs-submodulos.md.
/usr/bin/python3 -m venv --system-site-packages .venv && .venv/bin/pip install -r requirements.txt # pyyaml, pandas, openpyxl (PySide6 es el del sistema)
/usr/bin/python3 studio/main.py # Quarto Studio, la ventana (se relanza con .venv si existe); --smoke la abre y la cierra
backend/script_blogs_manager/main.sh # menú interactivo; `main.sh help` lista los comandos
backend/script_blogs_manager/main.sh list # los sitios que ve el gestor
backend/script_blogs_manager/main.sh render axiomata # nombre corto o axiomata; también preview, publish, clean, git-*
cd backend/script_metadata_manager # el gestor de metadatos se ejecuta desde su carpeta
python3 main.py create-template ~/Documents --config metadata_config.yml --incremental # Excel al día
python3 main.py update ~/Documents excel_databases/quarto_metadata.xlsx --dry-run # simular; sin --dry-run aplica
python3 main.py normalize-tags ~/Documents --config metadata_config.yml --dry-run # igual: sync-dates, fechas-iso, sync-pdf-urls
cd ../..
python3 backend/script_format_yaml/main.py --directory "../web/_pubs/axiomata" --recursive --dry-run
backend/script_generador_publicacion_similar/main.sh "../web/_pubs/axiomata" --dry-run
backend/script_pub_index_symlink/main.sh --dry-run # sin --dry-run escribe web/_indice/; --check-broken, --clean-brokenRegla de oro: --dry-run antes de cualquier cambio masivo. En la terminal ninguna herramienta simula
por defecto, salvo publish y git-commit de blogs_manager, que simulan sin --aplicar. En la ventana F5
siempre simula (la CLI o el plan de la ventana) y Ctrl+Intro aplica tras confirmar; publicar nombra el sitio y su dominio.
| carpeta | qué es | dueño / generador |
|---|---|---|
backend/script_blogs_manager/ |
Bash, main.sh + lib/: listar, render, preview, publicar, posts APA, git, respaldos |
a mano |
backend/script_metadata_manager/ |
Python, main.py + lib/: metadatos, tags, fechas y pdf-url desde el Excel de excel_databases/; metadata_config.yml; install.sh, quick_start.sh |
a mano; el Excel lo escribe create-template; respaldos/ ignorado |
backend/script_pub_index_symlink/ |
Bash, main.sh + lib/: enlaces por año en web/_indice/; logs/ ignorado |
a mano |
backend/script_format_yaml/ |
Python, main.py + config.py + lib/; fix_qmd_files.py es un alias |
a mano |
backend/script_generador_publicacion_similar/ |
Bash, main.sh + lib/: índices _contenido_*.qmd |
a mano |
studio/ |
Quarto Studio, la ventana (QML + Kirigami sobre gui-comun 2.x): main.py, paquete quarto_app, muestra.py, capturar.py, suite.yml, README; docs/rediseno.md es su diseño |
a mano |
suite.yml (uno por backend y el de studio/) |
manifiesto de cada suite (core/suite.schema.yml) |
a mano; los bloques de README los genera core/suites.py generar --aplicar |
requirements.txt · .venv/ |
dependencias Python de los backends de metadatos; el entorno del studio sobre el Python del sistema (ignorado) | a mano; /usr/bin/python3 -m venv --system-site-packages .venv |
tests/ |
pytest: cada suite en simulación no escribe nada; el flujo de publish/git-commit con un remoto bare local; la ventana sobre la familia de muestra (tests/studio/, tests/run.sh) |
a mano |
docs/ |
referencia del Excel de metadatos y registro de decisiones; índice generado | a mano; docs/README.md por core/docs.py indice |
CHANGELOG.md · LICENSE |
versiones de cada herramienta con fecha ISO; MIT | a mano |
Variante suite de meta/workspace.yml: cada herramienta se documenta en su carpeta; docs/ guarda
solo lo que no cabe en una puerta.
| documento | para qué leerlo |
|---|---|
CLAUDE.md |
reglas para el asistente: invariantes de diseño, cómo verificar, trampas |
docs/rediseno.md · studio/README.md |
la ventana: el diseño aprobado, la arquitectura, el .venv, las vistas y las operaciones |
backend/script_blogs_manager/README.md |
manual del gestor de blogs v3.0 |
backend/script_metadata_manager/README.md |
manual del gestor de metadatos y tags (Excel, filtros, fórmulas, columnas) |
backend/script_pub_index_symlink/README.md |
qué cuenta como publicación, conflictos, logs |
backend/script_format_yaml/README.md |
el formateador YAML y cómo reparar --- pegados |
backend/script_generador_publicacion_similar/README.md |
estructuras website y blog, URL base |
docs/excel-de-metadatos.md |
columnas, formatos y fórmulas del Excel de metadatos |
docs/decisiones.md |
por qué el repo es como es |
estado.md |
dónde está el repo y lo pendiente (§Por hacer) |
CHANGELOG.md |
qué versión de cada herramienta hay y desde cuándo |
web/docs/pubs-submodulos.md |
el hub y sus submódulos (frontera con web) |
meta/INDICE_SCRIPTS.md |
estas suites entre las del espacio de trabajo (generado) |
- Pruebas sí; lint y build, no:
tests/comprueba que cada suite en simulación no escribe nada (test_simulacion.py) y el flujo depublish/git-commitcon un remoto bare local; corren conpython3 -m pytest -q tests -p no:cacheprovider --basetemp ~/.cache/pytest/quarto-ola4. Lo demás esbash -n,py_compiley mirar el resultado de--dry-runen un pub. - Los backends no son seguros en paralelo: mutan los mismos árboles; Quarto Studio ejecuta una operación a la vez y en terminal hay que hacer lo mismo.
blogs_managersimula solo lo que publica:publishygit-commitpiden--aplicar;clean,clean-allyrenderescriben de verdad; soloclean-allpide confirmación (en la GUI, también las operaciones sobre todos los blogs).- El Excel no es la verdad: si se edita un
.qmda mano, el Excel queda atrás hasta regenerarlo;updatesolo escribe donde hay diferencias, pero una celda vacía borra el campo del.qmd. - Solo
datese sustituye línea a línea; cualquier otro cambio reescribe el bloque YAML completo (comillas y orden normalizados porfield_mapper.reorder_yaml). chaskapublica enchaska-x.netlify.app: la URL base no se deriva del nombre de carpeta; por eso la detección vota entre lospdf-urlexistentes yblog_base_urlsdemetadata_config.ymlmanda.- El asistente de posts es interactivo (
07-post-creator.sh, unas 50 preguntas): no se automatiza; la GUI lo sustituye conpost_service.py, que genera el mismoindex.qmd. - Un solo camino de instalación documentado:
pip install -r requirements.txt;backend/script_metadata_manager/install.sh(con conda) es una alternativa, no un requisito. - Licencia MIT (
LICENSE); el contenido de los blogs es del autor y vive en sus repos.