Convertir espacios
Los comandos space convert exportan un espacio completo de Confluence, con todas sus páginas, a un directorio de archivos Markdown. La jerarquía de páginas se conserva automáticamente como subdirectorios anidados.
Este es el flujo operativo principal de acs2md y la razón principal por la que la mayoría de equipos licencia el producto.
Si estás preparando una ejecución real con cliente, consulta Flujos y comandos para patrones de continuidad, archivo, migración, gobernanza y generación de corpus para IA.
Convertir por clave
acs2md space convert by-key SPACE_KEY [flags]La clave del espacio es el identificador corto visible en la URL de Confluence: .../wiki/spaces/MYSPACE/. También aparece en la salida de acs2md space list.
Ejemplos
# Convierte al directorio de salida predeterminado
acs2md space convert by-key MYSPACE
# Convierte a un directorio concreto
acs2md space convert by-key MYSPACE --output-dir ./docs
# Construye una base de conocimiento RAG, texto plano sin imágenes
acs2md space convert by-key MYSPACE \
--exclude-marks=true \
--embed-images=false \
--output-dir ./rag-knowledge-base
# Incluye solo páginas publicadas actualmente
acs2md space convert by-key MYSPACE --status current --output-dir ./docs
# Desactiva la reescritura de enlaces internos
acs2md space convert by-key MYSPACE --rewrite-links=false --output-dir ./site
# Sincronización incremental: solo reconvierte páginas cambiadas y conserva archivos eliminados
acs2md space convert by-key MYSPACE --incremental --output-dir ./docs
# Sincronización completa: reconvierte páginas cambiadas y elimina archivos de páginas retiradas
acs2md space convert by-key MYSPACE --sync --output-dir ./docsFlags
| Flag | Short | Predeterminado | Descripción |
|---|---|---|---|
--output-dir | -o | ./output/<SPACE_KEY>/ | Directorio donde escribir los archivos Markdown |
--status | -s | current | Filtra páginas por estado: current, archived, trashed, deleted, draft |
--conflict-resolution | overwrite | Cómo gestionar conflictos de nombres de archivo: overwrite, suffix, skip, versioned | |
--rewrite-links | true | Reescribe URLs internas de Confluence a rutas relativas locales | |
--sync | false | Mantiene .convert-sync-state.json y solo reconvierte páginas cambiadas. Elimina archivos locales de páginas retiradas de Confluence. Mutuamente excluyente con --incremental. | |
--incremental | true | Igual que --sync, pero conserva archivos locales de páginas retiradas. Mutuamente excluyente con --sync. | |
--concurrency | 4 | Páginas convertidas a la vez. Con 1 se restaura la conversión estrictamente secuencial — consulta Rendimiento. |
Convertir por ID
acs2md space convert by-id SPACE_ID [flags]Convierte un espacio identificado por su ID numérico en lugar de su clave. Usa los mismos flags que by-key.
acs2md space convert by-id 65539 --output-dir ./docsFlags de conversión
Estos flags están disponibles tanto en by-key como en by-id y controlan como se renderiza cada página.
Contenido y metadatos
| Flag | Short | Predeterminado | Descripción |
|---|---|---|---|
--include-metadata | -m | true | Añade un bloque YAML front matter a cada archivo (título, autor, fechas de creación/modificación) |
--exclude-marks | -x | true | Elimina todo el formato en línea: negrita, cursiva, subrayado y colores. Usa --exclude-marks=false si quieres conservar formato enriquecido. |
--include-labels | -l | true | Recupera las labels de la página para el campo tags del front matter. Cuesta una llamada a la API por página. |
--resolve-users | true | Resuelve los IDs de autor del front matter a nombres visibles. Cuesta llamadas adicionales; con false deja los IDs de cuenta en bruto. | |
--link-mentions | true | Enlaza las @menciones al perfil de la persona en Confluence | |
--space-key | — | Clave de espacio para las macros --ext-render-* que la necesitan. by-key ya la conoce; con by-id hay que indicarla. | |
--validate-strict | false | Falla la conversión ante errores de validación estricta de ADF en lugar de convertir con el mejor esfuerzo posible |
Imágenes y multimedia
| Flag | Short | Predeterminado | Descripción |
|---|---|---|---|
--embed-images | -e | true | Incrusta imágenes como URI de datos base64 |
--ext-embed-drawio | -D | true | Incrusta diagramas de draw.io como imágenes base64 |
--ext-embed-roadmap | true | Incrusta diagramas de Roadmap Planner como imágenes base64 | |
--embed-media-images | true | Incrusta archivos multimedia de Confluence (imágenes, avatares) como URI de datos base64 | |
--image-sidecars | false | Escribe las imágenes en attachments/<page-id>/ y las enlaza de forma relativa, en lugar de incrustarlas en base64 | |
--media-dimensions | false | Renderiza el multimedia con tamaño como HTML <img> para conservar el ancho |
Usa --embed-images=false para mantener las referencias de imagen como URLs
externas. Esto genera archivos de salida más pequeños, pero requiere acceso a
red para visualizarlos. --image-sidecars es el término medio: los bytes
siguen en disco, así que la exportación sigue siendo autónoma, pero ninguna
página carga una URI de datos de 100 KB en una sola línea.
Obsidian y estilo de salida
| Flag | Predeterminado | Descripción |
|---|---|---|
--obsidian | false | Preajuste: callouts de Obsidian, anclajes de encabezado que Obsidian resuelve y archivos sidecar de imagen |
--panel-style | github | Cómo se renderizan los paneles de Confluence: github (alerts), obsidian (callouts), emoji |
--wikilinks | false | Renderiza las inline cards internas como [[Título de la página]]. Necesita --ext-resolve-inline-card-titles. |
--inline-tags | false | Añade las labels de la página como #tag en una línea final, además del campo tags del front matter |
--obsidian es un preajuste, no un candado: una opción explícita siempre
gana. Consulta Bóvedas de Obsidian para ver qué
establece, una matriz de compatibilidad por función y una tabla de
síntoma-solución.
Flags de extensión
| Flag | Predeterminado | Descripción |
|---|---|---|
--ext-render-toc | true | Genera una tabla de contenidos Markdown a partir de los encabezados del documento |
--ext-render-recently-updated | true | Convierte la macro recently-updated en una lista Markdown |
--ext-render-listlabels | true | Convierte insignias de etiquetas |
--ext-render-pagetree | true | Convierte la macro pagetree en una lista Markdown anidada |
--ext-render-children | true | Convierte la macro children en una lista Markdown plana |
--ext-render-contributors | true | Convierte la macro contributors en una lista Markdown |
--ext-render-page-signatures | true | Convierte tablas de firmas de Document Control |
--ext-render-qc-properties | true | Convierte las macros de propiedades y revision QC con sus valores reales |
--ext-render-task-report | true | Convierte tasks-report-macro en una tabla Markdown |
--ext-render-content-report | true | Convierte content-report-table macro en una tabla Markdown |
--ext-render-cql-query | true | Ejecuta la macro CQL Query y convierte sus resultados en una lista Markdown |
--ext-resolve-inline-card-titles | true | Resuelve enlaces de tarjetas inline a sus títulos reales de página |
Cada flag --ext-render-* anterior cuesta llamadas adicionales a la API,
porque la macro hay que resolverla contra Confluence en lugar de leerla del
cuerpo de la página. --ext-render-listlabels y
--ext-render-recently-updated necesitan además una clave de espacio:
by-key ya la tiene, by-id necesita --space-key.
Rendimiento
space convert convierte 4 páginas a la vez por defecto. La conversión está limitada por la red — varias llamadas a la API por página — así que solapar unas cuantas páginas oculta la mayor parte de la latencia por página.
# Súbelo para un espacio grande en un tenant tolerante
acs2md space convert by-key DEVOPS --output-dir ./docs --concurrency 8
# Restaura la conversión estrictamente secuencial
acs2md space convert by-key DEVOPS --output-dir ./docs --concurrency 1El techo útil es el límite de peticiones de tu tenant de Confluence, no el número de núcleos de CPU, y por eso el valor por defecto es deliberadamente modesto. Subirlo es seguro porque el cliente HTTP respeta la cabecera Retry-After: cuando Confluence responde a una petición limitada con 429 o 503 e indica un retardo, el cliente espera exactamente ese tiempo en lugar de adivinarlo. Es el servidor quien marca el ritmo, en vez de que el cliente lo descubra fallando.
La salida es idéntica con cualquier valor. Las páginas se recogen en el orden
de entrada, sin importar qué worker termine primero, así que la estructura de
directorios, --rewrite-links y los totales del resumen no cambian al subir
--concurrency.
Cada comando informa además de cuánto ha tardado:
✅ Sync complete!
✅ Converted: 835
❌ Failed: 0
🔗 Links rewritten: 835 files
📂 Output: ~/tmp/docs-sec-obsidian/SEC
⏱️ Took: 2m 14sLa cifra cubre el comando completo, incluidas las llamadas a la API y las descargas de imágenes.
Un segundo Ctrl+C fuerza la salida. El primero cancela de forma limpia y
deja que terminen de replegarse las páginas que ya estaban en vuelo, lo cual
no es instantáneo cuando se están convirtiendo varias a la vez.
Reporte de progreso
Las conversiones largas muestran una barra de progreso en tiempo real en stderr con el título actual de la página, el porcentaje completado y el tiempo estimado restante. Esto no interfiere con la salida en stdout que pueda redirigirse a un archivo.
Esa separacion es importante para la automatizacion porque mantiene visibilidad del progreso para humanos sin corromper la salida redirigida.
Si necesitas una transcripcion limpia para CI, demos o capturas de documentación, usa el flag global --no-progress.
Ejecución observada de conversión (anonimizada)
La siguiente salida se capturo de una ejecución real en macOS contra un espacio pequeño y actual, con el nombre y la clave del espacio anonimizados:
📚 Converting space: Team Documentation (TEAMDOCS)
📂 Output directory: /tmp/acs2md-doc-sample
🔄 Mode: incremental — state file: /tmp/acs2md-doc-sample/.convert-sync-state.json
🔍 Fetching page metadata for sync...
📥 Fetched metadata for 6 pages ✅
📋 Found 6 page(s) to convert (0 up-to-date)
✅ Sync complete!
✅ Converted: 6
❌ Failed: 0
✅ Up-to-date (skipped): 0
🗑️ Removed from tracking: 0
🔗 Links rewritten: 1 files
📂 Output: /tmp/acs2md-doc-sampleUna segunda ejecución contra el mismo directorio de salida produjo:
📚 Converting space: Team Documentation (TEAMDOCS)
📂 Output directory: /tmp/acs2md-doc-sample
🔄 Mode: incremental — state file: /tmp/acs2md-doc-sample/.convert-sync-state.json
🔍 Fetching page metadata for sync...
📥 Fetched metadata for 6 pages ✅
✅ All pages are up-to-date.
✅ Sync complete!
✅ Up-to-date (skipped): 6
🗑️ Removed from tracking: 0
📂 Output: /tmp/acs2md-doc-sampleFlujos que combinan espacios y páginas
acs2md también incluye comandos a nivel de página para que los equipos combinen exportación masiva con inspección dirigida desde el mismo binario.
acs2md page convert by-id,by-title,by-urlacs2md page get by-id,by-title,by-urlacs2md page count nodes,page count marksypage properties
Estructura de salida
acs2md crea subdirectorios que reflejan el árbol de páginas de Confluence. Cada página se convierte en un archivo Markdown y las páginas hijas se colocan dentro de una carpeta con el nombre de su página padre.
./output/TEAMDOCS/
├── .convert-sync-state.json
├── Team_Documentation.md
└── Team_Documentation/
├── Architecture_decisions.md
├── Change_log.md
├── Meeting_notes.md
├── Product_requirements.md
└── Retrospectives.mdLos nombres de archivo se derivan de los títulos de página y los conflictos se resuelven usando la estrategia de --conflict-resolution.
Que el archivo Markdown raiz y la carpeta hija compartan el mismo título de página no es teorico; esa estructura salio directamente de una exportación real.
Resolución de conflictos de salida
Cuando dos páginas del espacio generan el mismo nombre de archivo, --conflict-resolution controla el comportamiento:
| Valor | Comportamiento |
|---|---|
overwrite | Sobrescribe cualquier archivo existente (predeterminado) |
suffix | Añade el ID de página para desambiguar nombres de archivo duplicados |
skip | Conserva el archivo existente y omite el duplicado |
versioned | Crea un directorio de salida con marca temporal para cada ejecución |
Modo sync e incremental
En la versión actual documentada, acs2md space convert by-key se observo arrancando en modo incremental cuando no se pasa ni --incremental ni --sync. La herramienta rastrea versiones de página en un archivo .convert-sync-state.json dentro del directorio de salida y solo reconvierte páginas que han cambiado desde la última ejecución.
| Flag | Comportamiento |
|---|---|
--sync | Reconvierte páginas cambiadas. Elimina archivos locales de páginas retiradas de Confluence. |
--incremental | Reconvierte páginas cambiadas. Conserva archivos locales de páginas retiradas de Confluence. Este fue el comportamiento observado por defecto en v1.0.0. |
Los dos flags son mutuamente excluyentes.
Los modos sync e incremental son ideales para pipelines de CI/CD y exportaciones programadas. En ejecuciones posteriores, solo se recuperan y convierten páginas con versiones nuevas, lo que reduce de forma notable las llamadas a la API y el tiempo de proceso.
Archivo de estado de ejemplo
El archivo de estado creado por la exportación real tenia esta forma tras anonimizarlo:
{
"last_sync_at": "2026-03-29T10:55:33.744109+02:00",
"pages": {
"100101": {
"converted_at": "2026-03-29T10:55:31.313290+02:00",
"version_created_at": "2024-01-15T09:00:00.000Z",
"page_id": "100101",
"title": "Team Documentation",
"file_path": "/tmp/acs2md-doc-sample/Team_Documentation.md",
"version_number": 3
}
},
"space_id": "100001",
"version": 1
}Patrones de uso recomendados
- Usa
--synccuando el directorio de salida deba permanecer como un espejo exacto y vivo del espacio de origen. - Usa
--incrementalcuando quieras una copia de continuidad o de archivo que conserve contenido eliminado localmente. - Usa
--rewrite-links=falsesolo cuando no necesites portabilidad local. - Ejecuta
space pages --treeantes de la primera exportación grande si necesitas validar el alcance con stakeholders.
Ejemplos prácticos
Migración completa de un espacio a un sitio estático
acs2md space convert by-key DOCS \
--include-metadata \
--output-dir ./site/docsBase de conocimiento para IA (texto plano, sin imágenes)
acs2md space convert by-key KB \
--exclude-marks \
--embed-images=false \
--ext-render-toc=false \
--output-dir ./ragBackup nocturno mediante CI/CD
#!/bin/bash
export ACS2MD_CONFLUENCE_DOMAIN=mycompany.atlassian.net
export ACS2MD_CONFLUENCE_USERNAME=$CONFLUENCE_USER
export ACS2MD_CONFLUENCE_API_TOKEN=$CONFLUENCE_TOKEN
acs2md space convert by-key DOCS \
--output-dir "./backup/$(date +%Y-%m-%d)" \
--log-file acs2md.logSincronización incremental en CI/CD
# Solo reconvierte páginas cambiadas y conserva archivos de páginas retiradas
acs2md space convert by-key DOCS \
--incremental \
--output-dir ./docs
# Solo reconvierte páginas cambiadas y elimina archivos de páginas retiradas
acs2md space convert by-key DOCS \
--sync \
--output-dir ./docsExportación orientada a archivo que conserva páginas retiradas
acs2md space convert by-key DOCS \
--incremental \
--output-dir ./archive/docsExportación sin reescritura de enlaces
# Conserva las URLs originales de Confluence en lugar de reescribirlas a rutas locales
acs2md space convert by-key MYSPACE \
--rewrite-links=false \
--output-dir ./exportPara orientación por escenarios en lugar de comandos individuales, sigue con Flujos y comandos.