# Configuración y descubrimiento

Campos realmente leídos de wu.config.json, puertos, comandos y metadatos de montaje.

Consulta las versiones, cambios y requisitos en [Framework 4.0 y CLI 1.2](/es/docs/guides/releases/).


<span class="section-anchor" id="section-1"></span>

## Archivo de proyecto

Los comandos buscan `wu.config.json` en el directorio de trabajo. No hay un flag global `--config` ni un comando `wu config`. Las rutas se interpretan desde la raíz donde se ejecuta la CLI.

```json
{
  "name": "conocimiento",
  "version": "1.1.0",
  "shell": {
    "dir": "shell",
    "framework": "astro",
    "port": 4321,
    "dev_cmd": "npx astro dev",
    "build_cmd": "npx astro build"
  },
  "apps": [
    {
      "name": "busqueda",
      "dir": "mf-busqueda",
      "framework": "react",
      "port": 5001,
      "dev_cmd": "npx vite",
      "build_cmd": "npx vite build"
    },
    {
      "name": "explorador",
      "dir": "mf-explorador",
      "framework": "vue",
      "port": 5002
    }
  ],
  "proxy": {
    "port": 3000,
    "open_browser": false,
    "/api": {
      "target": "http://127.0.0.1:8080",
      "rewrite": true,
      "cors": false
    }
  },
  "shared": ["react", "react-dom/client"],
  "security": {
    "enabled": true
  }
}
```

`version` es metadato de configuración. El ejecutable sigue utilizando la versión compilada en `main.zig`; editar ese campo no actualiza la CLI.

<span class="section-anchor" id="section-2"></span>

## Shell y aplicaciones

| Campo | Valor por defecto | Uso |
| --- | --- | --- |
| `shell.dir` | `shell` | Directorio del anfitrión |
| `shell.framework` | `vanilla` | Selecciona tratamiento del shell |
| `shell.port` | `4321` | Puerto del proceso en modo Vite |
| `shell.dev_cmd` | Cadena vacía | Comando del shell en modo Vite |
| `shell.build_cmd` | Cadena vacía | Con fallback a Astro, Next o Vite según framework |
| `apps[].name` | Cadena vacía | Identificador de app para el catálogo |
| `apps[].dir` | Cadena vacía | Directorio local y clave de overrides |
| `apps[].framework` | `vanilla` | Selección de compilador/plantilla |
| `apps[].port` | `0` | Puerto de la app en modo Vite |
| `apps[].dev_cmd` | `npx vite` | Comando de desarrollo legado |
| `apps[].build_cmd` | `npx vite build` | Comando de construcción |

El parser acepta únicamente los campos que consume. No valida una topología completa como lo haría un esquema estricto: muchos valores de tipo incorrecto mantienen el valor por defecto. Declara explícitamente nombres, directorios y puertos, y revisa el resultado con `wu info`.

<span class="section-anchor" id="section-3"></span>

## Metadatos que llegan al navegador

| Campo en cada app | Valores / significado |
| --- | --- |
| `fullBleed` o `full_bleed` | Booleano para que el shell pueda conceder ancho completo |
| `domOwnership` o `dom_ownership` | `wu`, `app` o `light` |
| `nativeShadow` o `native_shadow` | Alias legado opcional; conviene expresar ownership explícito |
| `grants` | Lista de capacidades que el host concede como máximo |
| `compatibility` | `strict` o `v2` |

Estos campos viajan al catálogo de desarrollo y al resultado de build. Conceder un grant en el host no sustituye la solicitud correspondiente en `wu.json`. `fullBleed` comunica una preferencia de presentación; el shell debe consumirla al disponer el contenedor.

<span class="section-anchor" id="section-4"></span>

## Proxy y puertos

En modo nativo, la prioridad de puerto es `wu dev --port`, después `proxy.port`, después 3000. La prioridad de apertura es `--open` o `--no-open`, después `proxy.open_browser`, cuyo defecto es `true`.

Cada clave de `proxy` que empieza con `/` define una regla. Puede ser una cadena con el origen destino o un objeto con `target`, `rewrite` y `cors`. `rewrite: true` retira el prefijo: `/api/users` se reenvía como `/users`. `cors` es optativo.

El proxy implementado admite orígenes `http://`; rechaza TLS/`https://`, credenciales y destinos ambiguos. No declares una URL con rutas como si fuera un origen. Los puertos de `shell` y `apps` pertenecen al modo de procesos Vite; no crean listeners separados en el servidor nativo.

<span class="section-anchor" id="section-5"></span>

## Opciones nuevas de desarrollo y build

```json
{
  "dev": { "allowedHosts": ["mi-tunel.example.com"] },
  "build": { "keepPreviousBuilds": 2 },
  "security": { "upgradeInsecureRequests": false }
}
```

`dev.allowedHosts` (`allowed_hosts`) amplía los hosts permitidos para Host, CORS y WebSocket; no cambia la interfaz de escucha. `build.keepPreviousBuilds` (`keep_previous_builds`) conserva archivos con hash de builds anteriores, con defecto `2`. `security.upgradeInsecureRequests` (`upgrade_insecure_requests`) fuerza la directiva CSP; si falta, WU la omite cuando `hsts` es `off` o hay orígenes HTTP configurados.

Al recargar configuración se conservan grants, modo de manifest y opciones de layout. Las apps añadidas pasan al router y al watcher; una escritura sin cambios no fuerza recarga. Directorios `./mf-a` o `mf-a/` se normalizan como `mf-a`.

<span class="section-anchor" id="section-6"></span>

## Descubrimiento automático

Si falta el archivo, varios comandos inspeccionan subdirectorios inmediatos y reconocen señales de proyecto y dependencias. Solo el directorio llamado exactamente `shell` se convierte en shell. Los demás candidatos se tratan como microapps.

El descubrimiento reconoce el adaptador importado y nombres exactos de dependencias: Preact no se confunde con React y Qwik/Stencil se detectan. Ordena directorios y asigna puertos libres desde 5001 sin colisionar con el shell; los puertos explícitos se respetan.

La detección usa heurísticas; no replica toda la matriz de plantillas ni sustituye la intención de un manifiesto explícito. Con un JSON malformado se informa el error y se desactiva el descubrimiento para evitar operar sobre una topología accidental. Corrige el archivo antes de seguir.

CLI `1.2.0` acepta `manifest: "define"` en cada app y `security.frameOrigins` para los iframes remotos. Los orígenes de frames solo entran en `frame-src`; no habilitan scripts ni conexiones del host. El filtro de navegación de catálogos no bloquea su lectura por fetch. Consulta [apps remotas](/es/docs/framework/remote-apps/) y [build](/es/docs/cli/build/).

<span class="section-anchor" id="section-7"></span>

## Referencia de implementación

- `wu-cli/src/config/config.zig`
- `wu-cli/src/config/discovery.zig`
- `wu-cli/src/runtime/allowed_hosts.zig`
- `wu-cli/src/runtime/dev/config_reload.zig`
- `wu-cli/src/runtime/handlers/proxy.zig`