# Dependencias y versiones por app

Qué agrega wu install, cómo resuelve majors y cuándo crea toolchains locales.

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

## Instalar desde declaraciones de cada parte

```bash
wu install
```

`wu i` es un alias. El comando agrega las declaraciones de shell y apps, edita el manifiesto raíz e invoca npm. Añade `wu-framework` y `esbuild` del catálogo si nadie los declara. `wu add` y el asistente de `wu create` utilizan el mismo instalador.

Añade dependencias a la microapp que las necesita o al shell que las consume, y vuelve a ejecutar `wu install`. Ejecutar solamente `npm install` en la raíz no recalcula el agregado ni `.wu-deps.json`.

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

## Resolución de bibliotecas

Los rangos compatibles se intersectan: `^19.0.0` y `^19.3.0` producen `^19.3.0`. Los grupos incompatibles usan aliases; el grupo más nuevo conserva el nombre principal. Se distinguen las líneas 0.x (`zone.js--0.15`) y los pins incompatibles dentro de un mismo major (`lodash--4.17.20`). Cada paquete aparece en una sola sección raíz; `dependencies` prevalece si alguna app lo declara allí.

```json
{
  "dependencies": {
    "react": "^19.0.0",
    "react--17": "npm:react@^17.0.0"
  }
}
```

El mapa de overrides enlaza cada import original con el alias correcto:

```json
{
  "mf-legacy": {
    "react": "react--17"
  }
}
```

Las claves son directorios, como `mf-legacy`, y no nombres de catálogo, como `legacy`. Desarrollo y build cargan ese mapa. No significa que todos los consumidores de React compartan una sola instancia: cada conjunto compatible debe resolver la identidad correcta.

La resolución admite `^`, `~`, comparadores, versiones exactas, comodines, versiones parciales, rangos con guion y hasta 32 alternativas `||`. No aplica la regla adicional de npm que limita prereleases a la misma terna del comparador: revisa la versión instalada cuando uses prereleases. Los valores no SemVer, como dist-tags o URLs Git, se conservan como pins explícitos y las declaraciones diferentes generan un aviso.

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

## Identidad de módulos en desarrollo

Cada import se resuelve desde el archivo que lo escribe: respeta `node_modules` locales y anidados, pnpm, enlaces y `.wu-deps.json`. Las URLs identifican versión y ubicación. Los paquetes de `shared`, y siempre `wu-framework`, se resuelven desde la raíz como una sola instancia; una copia local incompatible genera un aviso. No pongas en `shared` una biblioteca que deba coexistir en versiones distintas.

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

## Toolchains distintas

Vite, plugins y otras herramientas de compilación necesitan una estrategia diferente. El algoritmo elige el major con más declaraciones entre las apps que todavía comparten raíz; empates favorecen el mayor. Las aplicaciones incompatibles pasan a instalación local. La decisión se repite porque retirar los votos de una app puede cambiar otra mayoría.

```json
{
  "mf-vite-antiguo": {
    "_toolchain": "local"
  }
}
```

La CLI instala dentro de esa app y el build usa su `node_modules/vite`. El mapa se reescribe en cada instalación o se elimina si ya no quedan overrides. Los árboles locales gestionados por WU llevan información de procedencia para poder retirarlos cuando dejan de ser necesarios.

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

## Dependencias locales

Una declaración `file:` se conserva y se reexpresa desde la raíz. Por ejemplo, `file:../ui` dentro de `mf-panel/package.json` se convierte en una ruta hacia `ui/` desde el manifiesto agregado. Las declaraciones `link:` y `workspace:` se omiten en el colector actual; este mecanismo no implementa un gestor de workspaces npm completo.

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

## Reescritura del manifiesto raíz

Un manifiesto raíz sin `_wu` se rechaza con salida `1`. `--force` autoriza gestionarlo conservando sus campos y dependencias; si el JSON está roto, lo reemplaza y conserva el original en `package.json.bak`.

```bash
wu install --force
```

`--force` o `-f` pertenecen a WU: habilitan la reescritura, no son un passthrough general de opciones de npm. No hay opciones públicas `--frozen-lockfile`, `--offline`, `--no-install` ni selector de package manager.

`_wu.managed` registra las dependencias escritas por WU y permite retirar solo las que ya no declara ninguna app. Se conservan scripts propios, workspaces, overrides, engines y dependencias añadidas a mano. `dev` y `build` se crean solo si faltan. Los JSON se escriben atómicamente con copia `.bak`; una marca `_wu` antigua se migra en la primera instalación.

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

## Migrar un proyecto a CLI 1.2

`wu update` actualiza la herramienta global. `wu upgrade` compara shell y apps con el catálogo de la CLI instalada, que en 1.2.0 propone WU Framework `^4.0.0`. Revisa primero la [migración del framework](/es/docs/guides/releases/): actualizar rangos no migra automáticamente todas sus APIs.

```sh
wu upgrade --dry-run
wu upgrade --json
wu upgrade --yes
wu install
wu doctor --json
wu build
```

Sin flags, `upgrade` muestra el plan y pide confirmación. `--dry-run` no escribe; `--json` solo aplica con `--yes`; `--check` devuelve `2` cuando hay cambios pendientes. Nunca rebaja versiones: conserva rangos más nuevos, abiertos y protocolos no SemVer. Los pins exactos requieren `--force`, que tampoco permite rebajarlos. Informa dependencias ausentes sin añadirlas. Un error o una confirmación sin terminal devuelve `1`.

Las migraciones reconocen plantillas antiguas y guardan `<file>.bak`: tags Stencil únicos, retirada de `@stencil/core` sin uso, shell Astro con APIs DOM, selectores con `CSS.escape`, reglas faltantes de `.gitignore` y runtimes Qwik/Svelte en `shared`. Los cambios son idempotentes; las fuentes personalizadas que no coinciden se dejan intactas con un aviso. El comando no instala dependencias: termina con `wu install`.

Ejemplo de rangos: un `wu-framework: ^3.2.1` declarado pasa a `^4.0.0`; un `react: ^19.4.0` se conserva porque supera el catálogo `^19.3.0`; `react: 19.2.0` conserva su pin salvo `--force`. No añadas manualmente `_wu.managed`: lo mantiene `wu install`.

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

## Salidas y errores

Un JSON inválido en la configuración o en un manifiesto de app detiene la instalación con línea, columna y salida `1`, antes de escribir. También salen con `1` los fallos de escritura, el manifiesto raíz ajeno sin `--force` y los fallos de npm en raíz o toolchains locales. Con conflictos de bibliotecas, la invocación raíz incluye `--legacy-peer-deps`.

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

## Referencia de implementación

- `wu-cli/src/commands/install.zig`
- `wu-cli/src/commands/upgrade.zig`
- `wu-cli/src/commands/codemods.zig`
- `wu-cli/src/config/semver.zig`
- `wu-cli/src/config/json_doc.zig`
- `wu-cli/src/runtime/module_graph.zig`
- `wu-cli/tests/install-preserva.test.cjs`
- `wu-cli/tests/upgrade.test.cjs`
- `wu-cli/tests/dev-module-resolution.test.cjs`