
# CLI

Phasis incluye tres ejecutables principales en `bin/`:

- **`bin/phasis`** — ejecuta archivos JavaScript, evalúa código fuente pasado por línea de comandos y vuelca AST.
- **`bin/test262`** — ejecuta la batería oficial de conformidad de ECMAScript en Phasis.
- **`bin/wpt`** — ejecuta las fixtures de Web Platform Tests en Phasis (URL, codificación, fetch, cabeceras, Blob, AbortSignal, streams, …).

Después de `composer require phasis/phasis`, `bin/phasis` y `bin/test262` se enlazan desde `vendor/bin/`. Desde ahí solo funciona `bin/phasis`: `bin/test262` necesita el submódulo `test262` git y las clases de prueba, que el paquete Composer no incluye, y `bin/wpt` ni siquiera se distribuye. Ejecuta ambos desde un clon del repositorio Phasis.

## bin/phasis

```
phasis <file.js> | phasis -e '<source>' | phasis --ast <file.js>
```

Estas tres formas constituyen toda la interfaz. No hay REPL, entrada por stdin ni indicador de módulo.

### Ejecutar un archivo

```bash
./vendor/bin/phasis script.js
```

Ejecuta `script.js` como script clásico. Al terminar, todo lo que el script haya escrito con `console.log` (y `console.error`, `console.warn`, …) se imprime de una vez en stdout. Si el script lanza una excepción, el mensaje de error se envía a stderr y el estado de salida es 1.

El archivo siempre se analiza como un script clásico, así que uno con `import` / `export` o `await` de nivel superior produce un SyntaxError. Para ejecutar un módulo ES, use `Engine::evalAsModule()` desde PHP (consulte la [referencia de API](https://phasis.inline0.dev/es/docs/api#evalasmodule)) o agrupe primero el código.

### Evaluar código fuente

```bash
./vendor/bin/phasis -e 'console.log(Math.PI * 2)'
# 6.283185307179586
```

El argumento se evalúa como un script completo. Solo se imprime la salida de `console`; no se muestra el valor de la última expresión, por lo que `phasis -e '1 + 2'` no imprime nada.

### Volcar el AST

```bash
./vendor/bin/phasis --ast script.js
./vendor/bin/phasis -e 'a + b' --ast
```

Imprime el árbol de análisis como JSON (con sangría de dos espacios). Es útil para depurar problemas del analizador o crear herramientas basadas en Phasis. Para acceder mediante programación, use el [analizador API](https://phasis.inline0.dev/es/docs/parser).

## bin/test262

`bin/test262` ejecuta la [batería oficial de test262](https://github.com/tc39/test262) en Phasis. Es útil como arnés de regresión al contribuir cambios. La instantánea de la batería completa en `COMPAT.md` la genera `bin/compat-report`, el proceso relacionado que CI inicia manualmente y ejecuta en fragmentos.

### Ejecutar una categoría

```bash
./bin/test262 --category built-ins/Array
```

### Ejecutar la batería completa

```bash
./bin/test262 --jobs 4
```

### Configuración

El ejecutor lee `config/support.php` desde la raíz del proyecto. Su lista `test262_skipped_features` está vacía: no se omite ninguna función de test262, incluida `tail-call-optimization`. El archivo también enumera las categorías y las pruebas que deben ejecutarse de forma aislada.

La suite en sí es el submódulo `test262` git; ejecuta `git submodule update --init test262` después de clonar. Sin él, el ejecutor se cierra con «No se encontró la suite test262».

### Otras opciones útiles

| Opción | Finalidad |
|---|---|
| `--failures` | imprime una línea por cada prueba fallida |
| `--limit N` | se detiene tras las primeras N pruebas |
| `--jobs N` | ejecuta N pruebas en paralelo |
| `--files-from file` | ejecuta solo las pruebas enumeradas en `file` |
| `--json` | emite un resumen legible por máquina en stdout |
| `--no-progress` | oculta la línea de progreso |

Consulte la [sección de compatibilidad](https://phasis.inline0.dev/es/docs/compatibility) para ver la instantánea más reciente.

## bin/wpt

`bin/wpt` ejecuta las fixtures de Web Platform Tests importadas en `tests/Wpt/fixtures/`. El corpus cubre URL, codificación, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, toda la superficie de `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` y `WebSocket`. Consulte [API web](https://phasis.inline0.dev/es/docs/compatibility/web-apis) para ver la tabla de tasas de aciertos por área.

### Ejecutar todas las fixtures importadas

```bash
./bin/wpt
```

### Ejecutar una categoría

```bash
./bin/wpt --category headers
./bin/wpt --category streams
./bin/wpt --category blob
```

### Salida por subprueba

```bash
./bin/wpt --category abort --verbose
```

Imprime todas las subpruebas (PASS / FAIL) de cada fixture, con mensajes de aserción cuando fallan.

### Salida de JSON

```bash
./bin/wpt --json
```

Resumen de aprobado/reprobado legible por máquina para canalizaciones de CI o análisis mediante scripts.

### Notas

- Los fixtures que realizan solicitudes inician automáticamente el servidor de pruebas WPT incluido en `tests/Wpt/fetch-server.php` en `127.0.0.1:8765` y lo detienen después.
- El adaptador del harness en `tests/Wpt/testharness-shim.js` implementa solo la interfaz WPT API que usan los fixtures importados (unas 400 líneas frente a las ~3K líneas completas de `testharness.js`).
- Los fixtures de origen se encuentran en `tests/Wpt/upstream/` (un sparse-checkout ignorado por git de [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt)). Para importar más, copia los archivos `.any.js` de `upstream/<area>/` a `fixtures/<category>/` y el ejecutor los recogerá automáticamente.

## Códigos de salida

`bin/phasis` termina con uno de estos dos códigos:

| Código | Significado |
|---|---|
| `0` | éxito — el script se ejecutó hasta el final (también después de `--ast`) |
| `1` | cualquier otro caso: una excepción JS no capturada, un error de sintaxis, un archivo inexistente o argumentos no válidos |

Los errores del script imprimen su mensaje en stderr. Los argumentos no válidos y los archivos inexistentes imprimen la línea de uso en stderr.

## Límites de recursos

`bin/phasis` se ejecuta con los valores predeterminados del motor y no tiene opciones para establecer límites: un máximo de 4,096 tramas para la pila de llamadas de JS, una protección de 8,192 tramas para los cierres transpilados y el valor predeterminado de `maxLoopIterations` de 100,000, que solo se aplica al código que ejecuta el intérprete que recorre el árbol (consulta [API: setLimit](https://phasis.inline0.dev/es/docs/api#setlimit)). No hay límite de tiempo; usa `timeout` para envolver el comando si es posible que un script no termine.
