
# CLI

Phasis enthält drei wichtige ausführbare Dateien in `bin/`:

- **`bin/phasis`** — JavaScript-Dateien ausführen, Quelltext aus der Befehlszeile auswerten und ASTs ausgeben.
- **`bin/test262`** — die offizielle ECMAScript-Konformitätssuite mit Phasis ausführen.
- **`bin/wpt`** — die Web Platform Tests-Fixtures mit Phasis ausführen (URL, Encoding, Fetch, Header, Blob, AbortSignal, Streams, …).

Nach `composer require phasis/phasis` sind `bin/phasis` und `bin/test262` mit `vendor/bin/` verknüpft. Von dort aus funktioniert nur `bin/phasis`: `bin/test262` benötigt das git-Submodul `test262` und die Testklassen, die das Composer-Paket nicht enthält; `bin/wpt` wird überhaupt nicht mitgeliefert. Führe beide aus einem Klon des Repositorys Phasis aus.

## bin/phasis

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

Diese drei Formen bilden die gesamte Schnittstelle. Es gibt weder eine REPL noch eine stdin-Eingabe oder ein Modul-Flag.

### Datei ausführen

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

Führt `script.js` als klassisches Skript aus. Nach Abschluss wird alles, was das Skript mit `console.log` (und `console.error`, `console.warn`, …) geschrieben hat, auf einmal nach stdout ausgegeben. Wirft das Skript einen Fehler, wird die Fehlermeldung nach stderr ausgegeben und der Exit-Status ist 1.

Die Datei wird immer als klassisches Skript geparst. Daher führt eine Datei mit `import` / `export` oder `await` auf oberster Ebene zu einem SyntaxError. Um ein ES-Modul auszuführen, verwende `Engine::evalAsModule()` von PHP (siehe die Referenz zu [API](https://phasis.inline0.dev/de/docs/api#evalasmodule)) oder bündle den Code zuerst.

### Quelltext auswerten

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

Das Argument wird als vollständiges Skript ausgewertet. Ausgegeben wird nur die Ausgabe von `console`; der Wert des letzten Ausdrucks wird nicht ausgegeben, daher gibt `phasis -e '1 + 2'` nichts aus.

### AST ausgeben

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

Gibt den Parse-Baum als JSON aus (mit zwei Leerzeichen eingerückt). Nützlich, um Parserprobleme zu beheben oder Werkzeuge auf Basis von Phasis zu erstellen. Für den programmgesteuerten Zugriff verwende den [Parser API](https://phasis.inline0.dev/de/docs/parser).

## bin/test262

`bin/test262` führt die [offizielle test262-Suite](https://github.com/tc39/test262) mit Phasis aus. Sie eignet sich als Regressionstest beim Entwickeln von Änderungen. Der vollständige Suite-Snapshot in `COMPAT.md` wird vom zugehörigen `bin/compat-report` erstellt, das die manuell gestartete CI-Matrix in Teilmengen ausführt.

### Einzelne Kategorie ausführen

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

### Vollständige Suite ausführen

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

### Konfiguration

Der Runner liest `config/support.php` aus dem Projektstammverzeichnis. Seine Liste `test262_skipped_features` ist leer: Kein test262-Feature wird übersprungen, einschließlich `tail-call-optimization`. Die Datei listet außerdem die Kategorien und Tests auf, die isoliert ausgeführt werden müssen.

Die Suite selbst ist das git-Submodul `test262`. Führe nach dem Klonen `git submodule update --init test262` aus. Fehlt es, wird der Runner mit "test262 suite not found" beendet.

### Weitere nützliche Flags

| Flag | Zweck |
|---|---|
| `--failures` | eine Zeile pro fehlgeschlagenem Test ausgeben |
| `--limit N` | nach den ersten N Tests stoppen |
| `--jobs N` | N Tests parallel ausführen |
| `--files-from file` | nur die in `file` aufgeführten Tests ausführen |
| `--json` | maschinenlesbare Zusammenfassung auf stdout ausgeben |
| `--no-progress` | Fortschrittszeile unterdrücken |

Den aktuellen Snapshot findest du im Abschnitt [Kompatibilität](https://phasis.inline0.dev/de/docs/compatibility).

## bin/wpt

`bin/wpt` führt die in `tests/Wpt/fixtures/` importierten Web Platform Tests-Fixtures aus. Der Korpus umfasst URL, Encoding, atob/btoa, structuredClone, performance, Headers, Blob/File, AbortController/Signal, EventTarget, FormData, WHATWG Streams, den gesamten Bereich `crypto`/`SubtleCrypto`, `fetch`/`Request`/`Response`, `XMLHttpRequest`/`XMLHttpRequestUpload` und `WebSocket`. Die Tabelle zu den Erfolgsraten der einzelnen Bereiche findest du unter [Web-APIs](https://phasis.inline0.dev/de/docs/compatibility/web-apis).

### Alle importierten Fixtures ausführen

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

### Einzelne Kategorie ausführen

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

### Ausgabe pro Untertest

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

Gibt jeden Untertest (PASS / FAIL) innerhalb jeder Fixture aus, bei fehlgeschlagenen Tests mit Assertionsmeldungen.

### JSON-Ausgabe

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

Maschinenlesbare Zusammenfassung zu Erfolgen und Fehlern für CI-Pipelines oder skriptgesteuerte Analysen.

### Hinweise

- Fixtures, die Fetch verwenden, starten den mitgelieferten WPT-Testserver automatisch unter `tests/Wpt/fetch-server.php` auf `127.0.0.1:8765` und fahren ihn anschließend herunter.
- Der Harness-Shim unter `tests/Wpt/testharness-shim.js` implementiert nur die WPT-API-Schnittstelle, die von den importierten Fixtures verwendet wird (etwa 400 Zeilen gegenüber den rund 3K Zeilen des vollständigen `testharness.js`).
- Die Quell-Fixtures befinden sich unter `tests/Wpt/upstream/` (ein von Git ignorierter Sparse-Checkout von [web-platform-tests/wpt](https://github.com/web-platform-tests/wpt)). Um weitere zu importieren, kopiere `.any.js`-Dateien aus `upstream/<area>/` nach `fixtures/<category>/`; der Runner findet sie dann automatisch.

## Exit-Codes

`bin/phasis` wird mit einem von zwei Statuscodes beendet:

| Code | Bedeutung |
|---|---|
| `0` | Erfolg — das Skript wurde vollständig ausgeführt (auch nach `--ast`) |
| `1` | alles andere: eine nicht abgefangene JS-Ausnahme, ein Syntaxfehler, eine fehlende Datei oder ungültige Argumente |

Fehler des Skripts geben ihre Meldung auf stderr aus. Bei ungültigen Argumenten und fehlenden Dateien wird die Nutzungshinweiszeile auf stderr ausgegeben.

## Ressourcenlimits

`bin/phasis` läuft mit den Standardeinstellungen der Engine und bietet keine Flags für Limits: eine Obergrenze von 4,096 Frames für den JS-Aufrufstapel, eine Begrenzung auf 8,192 Frames für transpilierte Closures und standardmäßig `maxLoopIterations` von 100,000, das nur für Code gilt, den der Tree-Walking-Interpreter ausführt (siehe [API: setLimit](https://phasis.inline0.dev/de/docs/api#setlimit)). Es gibt kein Zeitlimit; verwende `timeout`, wenn ein Skript möglicherweise nicht endet.
