Habilidad de Configuración de la Construcción
Genera SETUP.md — la guía de configuración posterior a la importación y reemplazo de contenido para el usuario — y actualiza build.json con metadatos específicos del idioma natural. Esta habilidad se ejecuta después de build-content y antes del empaquetado ZIP.
Variables de entrada (establecidas por build-theme y build-content):
| Variable | Fuente | Descripción |
|---|---|---|
BUILD_DIR | build-scaffold | Ruta absoluta al directorio de trabajo de la construcción |
NL_PROMPT | COMMAND.md Sección 1 | Descripción original del sitio en lenguaje natural |
THEME_SLUG | build-theme | Slug del tema instalado |
THEME_NAME | build-theme | Nombre legible del tema |
THEME_VERSION | build-theme | Cadena de versión del tema instalado |
THEME_INSTALLED | build-theme | Booleano — verdadero si el tema se instaló correctamente |
INSTALLED_PLUGINS | build-content | Arreglo de slug:nombre:versión para los plugins instalados correctamente |
FAILED_PLUGINS | build-content | Arreglo de slugs que fallaron al instalar o activar |
PAGES_CREATED | build-content | Número entero de páginas creadas |
POSTS_CREATED | build-content | Número entero de entradas creadas |
MENU_ASSIGNED | build-content | Booleano — verdadero si el menú de navegación se asignó a una ubicación del tema |
MENU_LOCATION | build-content | El nombre de la ubicación del tema utilizada (o cadena vacía si no está asignada) |
Sección 1: Generación de SETUP.md
Escribe $BUILD_DIR/SETUP.md usando todo el contexto disponible — plugins instalados, tema, número de páginas y el prompt NL — para producir una guía de configuración ordenada por prioridad que el usuario pueda seguir inmediatamente después de importar el sitio en Local WP.
echo "[Build] Generando SETUP.md..."
# ── Construir la sección Qué está Instalado ────────────────────────────────────────
SETUP_FILE="$BUILD_DIR/SETUP.md"
# Comenzar a escribir SETUP.md
cat > "$SETUP_FILE" << 'SETUP_HEADER'
# Guía de Configuración
Esta guía te explica cómo configurar tu nuevo sitio WordPress después de importarlo
en Local WP. Los elementos están ordenados por prioridad: completa primero los pasos
Críticos, luego trabaja en los Importantes y Opcionales a tu propio ritmo.
---
## Qué está Instalado
SETUP_HEADER
# Entrada del tema
echo "- **Tema:** ${THEME_NAME} (v${THEME_VERSION})" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
# Lista de plugins
if [ ${#INSTALLED_PLUGINS[@]} -gt 0 ]; then
echo "- **Plugins:**" >> "$SETUP_FILE"
for plugin_entry in "${INSTALLED_PLUGINS[@]}"; do
# Formato: slug:nombre:versión
PLUGIN_SLUG=$(echo "$plugin_entry" | cut -d: -f1)
PLUGIN_NAME=$(echo "$plugin_entry" | cut -d: -f2)
PLUGIN_VER=$(echo "$plugin_entry" | cut -d: -f3)
# Claude genera una descripción de una línea para cada plugin basada en el slug y nombre
PLUGIN_PURPOSE="<descripción de una línea de lo que hace ${PLUGIN_NAME} — generada por Claude a partir del conocimiento del plugin>"
echo " - **${PLUGIN_NAME}** (v${PLUGIN_VER}) — ${PLUGIN_PURPOSE}" >> "$SETUP_FILE"
done
echo "" >> "$SETUP_FILE"
fi
# Plugins fallidos (si los hay)
if [ ${#FAILED_PLUGINS[@]} -gt 0 ]; then
echo "- **Plugins que Fallaron al Instalar:**" >> "$SETUP_FILE"
for slug in "${FAILED_PLUGINS[@]}"; do
echo " - ${slug} — se intentó la instalación pero falló durante la construcción" >> "$SETUP_FILE"
done
echo "" >> "$SETUP_FILE"
fi
A continuación, escribe la lista de acciones ordenadas por prioridad. Esta es una tarea de juicio de IA — Claude genera las instrucciones paso a paso reales para cada plugin basándose en su conocimiento del flujo de trabajo de configuración de ese plugin, usando el contexto del prompt NL para determinar qué es más importante para este sitio en particular.
# ── Construir la sección Qué hacer a continuación ────────────────────────────────────────
cat >> "$SETUP_FILE" << 'SETUP_NEXT'
---
## Qué hacer a continuación (Orden de Prioridad)
SETUP_NEXT
# ── Elementos CRÍTICOS ────────────────────────────────────────────────────────────
echo "### Crítico" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
STEP_NUM=1
# Para cada plugin instalado que requiera configuración, Claude genera
# instrucciones paso a paso con rutas completas de navegación del admin de WordPress.
# Ejemplo de patrón para WPForms Lite:
#
# echo "${STEP_NUM}. **Configurar WPForms — crear tu formulario de contacto**" >> "$SETUP_FILE"
# cat >> "$SETUP_FILE" << 'EOF'
# Ve a: **WPForms > Añadir Nuevo**
# Pasos:
# 1. Haz clic en "Seleccionar una plantilla" y elige **Formulario de Contacto Simple**
# 2. Haz clic en "Usar Plantilla" — se abre el constructor de formularios
# 3. (Opcional) Añade o elimina campos arrastrándolos desde el panel izquierdo
# 4. Haz clic en **Guardar** en la esquina superior derecha
# 5. Ve a **Páginas > Contacto > Editar**
# 6. Añade un nuevo bloque, busca "WPForms" y selecciona el bloque de WPForms
# 7. Elige tu formulario recién creado del menú desplegable
# 8. Haz clic en **Actualizar** para guardar la página
# EOF
# STEP_NUM=$((STEP_NUM + 1))
# Claude genera bloques equivalentes para cada plugin en INSTALLED_PLUGINS
# que requiera configuración del usuario. Los plugins que funcionan sin configuración
# (p.ej., un plugin de caché que se activa silenciosamente) pueden documentarse bajo Importante
# u omitirse si no se necesita ninguna acción.
# ── Reemplazo de información de marcador de posición de la página de contacto (siempre Crítico) ────────────────────
echo "${STEP_NUM}. **Reemplazar la información de marcador de posición de la página de Contacto**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'CONTACT_STEP'
Ve a: **Páginas > Contacto > Editar**
Reemplaza el siguiente contenido de marcador de posición con tus datos reales:
- El nombre de la empresa ficticio en el encabezado de la página
- La dirección ficticia (p.ej., "Calle Ejemplo 123, Ciudad Muestra")
- El número de teléfono ficticio
- La dirección de correo electrónico ficticia
- Cualquier horario comercial ficticio o detalles de ubicación
CONTACT_STEP
STEP_NUM=$((STEP_NUM + 1))
# ── Elementos IMPORTANTES ───────────────────────────────────────────────────────────
echo "" >> "$SETUP_FILE"
echo "### Importante" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
# Reemplazo de contenido de la página Acerca de
echo "${STEP_NUM}. **Actualizar el contenido de la página Acerca de**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'ABOUT_STEP'
Ve a: **Páginas > Acerca de > Editar**
Reemplaza el siguiente contenido de marcador de posición:
- El nombre de la empresa/persona ficticio y la biografía
- Cualquier descripción ficticia de miembros del equipo
- La foto de perfil o retrato de marcador de posición (sube la tuya usando el bloque de Medios)
- Cualquier credencial ficticia, historial o historia de origen
ABOUT_STEP
STEP_NUM=$((STEP_NUM + 1))
# Reemplazo de contenido de la página de inicio
echo "${STEP_NUM}. **Actualizar el héroe y el contenido de introducción de la página de inicio**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'HOME_STEP'
Ve a: **Páginas > Inicio > Editar**
Reemplaza el siguiente contenido de marcador de posición:
- El encabezado del héroe y el eslogan (hazlo específico para tu negocio u oferta)
- La imagen de fondo o destacada del héroe (sube a través del bloque de Portada/Imagen)
- El párrafo introductorio que describe lo que haces
- Cualquier etiqueta y enlace de botón de llamada a la acción
HOME_STEP
STEP_NUM=$((STEP_NUM + 1))
# Páginas adicionales según el tipo de sitio — Claude genera orientación específica para cada página
# en PAGES_CREATED más allá de Inicio, Acerca de, Contacto. Ejemplos:
#
# Página de portafolio:
# echo "${STEP_NUM}. **Añade tu trabajo real a la página de Portafolio**" >> "$SETUP_FILE"
# ...
# STEP_NUM=$((STEP_NUM + 1))
#
# Página de servicios:
# echo "${STEP_NUM}. **Actualiza la página de Servicios con tus ofertas reales**" >> "$SETUP_FILE"
# ...
# STEP_NUM=$((STEP_NUM + 1))
#
# Claude usa el contexto de NL_PROMPT para determinar qué páginas adicionales existen
# y qué contenido de marcador de posición contienen, luego escribe orientación específica.
# Cualquier configuración adicional de plugins que caiga bajo Importante (no Crítico)
# Claude añade pasos aquí para plugins que necesitan configuración pero no rompen el sitio
# si se dejan sin configurar (p.ej., configuración de un plugin SEO, ajustes de galería)
# ── Elementos OPCIONALES ────────────────────────────────────────────────────────────
echo "" >> "$SETUP_FILE"
echo "### Opcional" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
# Reemplazo de entradas de muestra
echo "${STEP_NUM}. **Añade tus propias entradas de blog para reemplazar el contenido de muestra**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'POSTS_STEP'
Las entradas de muestra demuestran cómo tu tema renderiza el contenido del blog. Utilizan
temas realistas pero ficticios relacionados con el tema de tu sitio.
Ve a: **Entradas > Todas las entradas** para editar las muestras existentes o añadir nuevas.
Puedes eliminar las entradas de muestra una vez que hayas publicado tu propio contenido.
POSTS_STEP
STEP_NUM=$((STEP_NUM + 1))
# Reemplazo de imágenes de marcador de posición
echo "${STEP_NUM}. **Reemplaza las imágenes de marcador de posición con tus propias fotos**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'IMAGES_STEP'
Se generaron imágenes de marcador de posición de color sólido durante la construcción para mostrar
la intención del diseño. Reemplázalas con tus propias imágenes:
Ve a: **Medios > Añadir Nuevo** para subir tus fotos
Luego edita cada página/entrada y reemplaza los bloques de imagen de marcador de posición por tus subidas.
IMAGES_STEP
STEP_NUM=$((STEP_NUM + 1))
# Asignación de menú si no se asignó automáticamente (caso límite de tema de bloque FSE)
if [ "$MENU_ASSIGNED" = "false" ] || [ "$MENU_ASSIGNED" = "" ]; then
echo "${STEP_NUM}. **Asignar el menú de navegación en el Editor del Sitio**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'MENU_STEP'
Tu menú de navegación se creó durante la construcción pero no pudo asignarse
a una ubicación del tema automáticamente (esto es esperado para temas de bloques).
Ve a: **Apariencia > Editor > Navegación**
Selecciona "Menú Principal" y colócalo en tu área de navegación del encabezado.
MENU_STEP
STEP_NUM=$((STEP_NUM + 1))
fi
# Finalizar SETUP.md
echo "---" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
echo "*Generado por el Plugin Experto de WordPress — Sistema de Construcción CoWork*" >> "$SETUP_FILE"
SETUP_ITEM_COUNT=$((STEP_NUM - 1))
echo "[Build] SETUP.md generado (${SETUP_ITEM_COUNT} elementos de configuración)"
Notas de implementación para Claude:
- Las instrucciones de plugins son una tarea de juicio de IA. Para cada plugin en
INSTALLED_PLUGINS, Claude genera instrucciones detalladas paso a paso usando su conocimiento del flujo de trabajo de configuración de ese plugin. Las instrucciones deben incluir rutas completas de navegación del admin de WP (p.ej., "Ve a WPForms > Añadir Nuevo > Selecciona plantilla de formulario de contacto > Guardar > Copia shortcode > Edita página de Contacto > Añade bloque de shortcode"). - El contexto impulsa la prioridad. Claude lee
NL_PROMPTpara determinar qué elementos de configuración son Críticos vs Importantes. Para un sitio de portafolio de fotografía, reemplazar las imágenes del portafolio es Crítico. Para un restaurante, configurar un plugin de reservas es Crítico. - Cobertura página por página. Cada página creada por build-content obtiene una entrada dedicada con orientación específica sobre qué contenido de marcador de posición contiene.
- Sin instrucciones genéricas. Toda la orientación es específica para el plugin y el tipo de sitio — no consejos genéricos como "configura tus plugins".
Sección 2: Actualización de metadatos NL de build.json
Lee el build.json existente (creado por build-scaffold Sección 6) y añade campos específicos de NL. Utiliza el mismo patrón de análisis JSON de Python3 establecido en build-mcp Sección 4.
echo "[Build] Actualizando build.json con metadatos NL..."
BUILD_JSON="$BUILD_DIR/build.json"
# Construir arreglos para serialización JSON
INSTALLED_JSON=""
for plugin_entry in "${INSTALLED_PLUGINS[@]}"; do
PLUGIN_SLUG=$(echo "$plugin_entry" | cut -d: -f1)
PLUGIN_NAME=$(echo "$plugin_entry" | cut -d: -f2)
PLUGIN_VER=$(echo "$plugin_entry" | cut -d: -f3)
if [ -n "$INSTALLED_JSON" ]; then
INSTALLED_JSON="${INSTALLED_JSON},"
fi
INSTALLED_JSON="${INSTALLED_JSON}{\"slug\":\"${PLUGIN_SLUG}\",\"name\":\"${PLUGIN_NAME}\",\"version\":\"${PLUGIN_VER}\",\"installed\":true}"
done
FAILED_JSON=""
for slug in "${FAILED_PLUGINS[@]}"; do
if [ -n "$FAILED_JSON" ]; then
FAILED_JSON="${FAILED_JSON},"
fi
FAILED_JSON="${FAILED_JSON}\"${slug}\""
done
# Escribir script Python en un archivo temporal (mismo patrón que el generador de imágenes de build-content)
NL_META_SCRIPT="/tmp/update_build_json_$$.py"
cat > "$NL_META_SCRIPT" << PYEOF
import json, sys
build_file = sys.argv[1]
nl_prompt = sys.argv[2]
theme_slug = sys.argv[3]
theme_name = sys.argv[4]
theme_version = sys.argv[5]
theme_installed = sys.argv[6] == 'true'
pages_created = int(sys.argv[7])
posts_created = int(sys.argv[8])
menu_assigned = sys.argv[9] == 'true'
installed_json = sys.argv[10]
failed_json = sys.argv[11]
with open(build_file) as f:
data = json.load(f)
data['mode'] = 'nl'
data['nl_prompt'] = nl_prompt
data['theme'] = {
'slug': theme_slug,
'name': theme_name,
'version': theme_version,
'installed': theme_installed
}
data['plugins'] = json.loads('[' + installed_json + ']') if installed_json else []
data['content'] = {
'pages_created': pages_created,
'posts_created': posts_created,
'menu_assigned': menu_assigned
}
if failed_json:
data['failed_plugins'] = json.loads('[' + failed_json + ']')
with open(build_file, 'w') as f:
json.dump(data, f, indent=2)
print('[Build] build.json actualizado con metadatos NL')
PYEOF
python3 "$NL_META_SCRIPT" \
"$BUILD_JSON" \
"$NL_PROMPT" \
"$THEME_SLUG" \
"$THEME_NAME" \
"$THEME_VERSION" \
"${THEME_INSTALLED:-true}" \
"$PAGES_CREATED" \
"$POSTS_CREATED" \
"${MENU_ASSIGNED:-false}" \
"$INSTALLED_JSON" \
"$FAILED_JSON"
# Limpiar script temporal
rm -f "$NL_META_SCRIPT"
build.json después de la actualización de metadatos NL:
{
"build_id": "nl-portafolio-fotografia-20260220-143022",
"mode": "nl",
"nl_prompt": "un sitio de portafolio para un fotógrafo freelance",
"wp_version": "6.7",
"php_version": "8.2",
"site_url": "http://localhost",
"site_title": "un sitio de portafolio para un fotógrafo freelance",
"created_at": "2026-02-20T14:30:22Z",
"theme": {
"slug": "blocksy",
"name": "Blocksy",
"version": "2.0.50",
"installed": true
},
"plugins": [
{ "slug": "envira-gallery-lite", "name": "Envira Gallery Lite", "version": "1.9.0", "installed": true },
{ "slug": "wpforms-lite", "name": "WPForms Lite", "version": "1.9.0", "installed": true }
],
"content": {
"pages_created": 4,
"posts_created": 3,
"menu_assigned": false
},
"failed_plugins": [],
"mcp_adapter": {
"included": true,
"activated": true,
"version": "0.4.1"
}
}
Sección 3: Extensión del Resumen de Construcción
Añadir
… [truncado para traducción]