
# CLI

Phasisには、`bin/`に3つの主要な実行ファイルがあります。

- **`bin/phasis`** — JavaScriptファイルを実行し、コマンドラインで渡されたソースを評価し、ASTを出力します。
- **`bin/test262`** — Phasisに対して公式ECMAScript適合性テストを実行します。
- **`bin/wpt`** — Phasisに対してWeb Platform Testsのフィクスチャを実行します（URL、エンコーディング、fetch、ヘッダー、Blob、AbortSignal、ストリームなど）。

`composer require phasis/phasis`の後、`bin/phasis`と`bin/test262`は`vendor/bin/`からリンクされています。そこから動作するのは`bin/phasis`だけです。`bin/test262`には`test262`のgitサブモジュールとテストクラスが必要ですが、Composerパッケージには含まれていません。また、`bin/wpt`はそもそも同梱されていません。どちらもPhasisリポジトリのクローンから実行してください。

## bin/phasis

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

この3つの形式がインターフェースのすべてです。REPL、標準入力、モジュールフラグはありません。

### ファイルを実行する

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

`script.js`をクラシックスクリプトとして実行します。実行が完了すると、スクリプトが`console.log`（および`console.error`、`console.warn`など）で書き込んだ内容が、一度に標準出力へ出力されます。スクリプトが例外をスローすると、エラーメッセージは標準エラー出力に送られ、終了ステータスは1になります。

ファイルは常にクラシックスクリプトとして解析されるため、`import` / `export`やトップレベル`await`を含むファイルはSyntaxErrorになります。ESモジュールを実行するには、PHPから`Engine::evalAsModule()`を使う（[APIリファレンス](https://phasis.inline0.dev/ja/docs/api#evalasmodule)を参照）か、先にコードをバンドルしてください。

### ソースを評価する

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

引数はスクリプト全体として評価されます。出力されるのは`console`の出力だけで、最後の式の値は出力されません。そのため、`phasis -e '1 + 2'`は何も出力しません。

### ASTを出力する

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

解析ツリーをJSON形式で出力します（2スペースでインデント）。パーサーの問題をデバッグするときや、Phasis上にツールを構築するときに役立ちます。プログラムからアクセスするには、[パーサーAPI](https://phasis.inline0.dev/ja/docs/parser)を使ってください。

## bin/test262

`bin/test262`は、Phasisに対して[公式test262スイート](https://github.com/tc39/test262)を実行します。変更を加える際の回帰テストに便利です。`COMPAT.md`にある全スイートのスナップショットは、関連する`bin/compat-report`が生成します。手動で開始するCIマトリックスでは、これを複数のシャードに分けて実行します。

### カテゴリを1つ実行する

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

### スイート全体を実行する

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

### 設定

ランナーはプロジェクトのルートから`config/support.php`を読み込みます。`test262_skipped_features`のリストは空なので、`tail-call-optimization`を含め、test262の機能は何もスキップされません。このファイルには、カテゴリと単独で実行する必要があるテストも記載されています。

スイート本体は`test262`のgitサブモジュールです。クローン後に`git submodule update --init test262`を実行してください。これがない場合、ランナーは「test262 suite not found」と表示して終了します。

### その他の便利なフラグ

| フラグ | 用途 |
|---|---|
| `--failures` | 失敗したテストごとに1行を出力する |
| `--limit N` | 最初のN件のテストを実行した時点で停止する |
| `--jobs N` | N件のテストを並列実行する |
| `--files-from file` | `file`に記載されたテストだけを実行する |
| `--json` | 機械処理可能なサマリーを標準出力に出力する |
| `--no-progress` | 進捗行の出力を抑制する |

最新のスナップショットは[互換性のセクション](https://phasis.inline0.dev/ja/docs/compatibility)を参照してください。

## bin/wpt

`bin/wpt`は、`tests/Wpt/fixtures/`に取り込まれたWeb Platform Testsのフィクスチャを実行します。テスト対象はURL、エンコーディング、atob/btoa、structuredClone、performance、Headers、Blob/File、AbortController/Signal、EventTarget、FormData、WHATWG Streams、`crypto` / `SubtleCrypto`の全機能、`fetch` / `Request` / `Response`、`XMLHttpRequest` / `XMLHttpRequestUpload`、`WebSocket`です。領域ごとの合格率は[Web APIs](https://phasis.inline0.dev/ja/docs/compatibility/web-apis)を参照してください。

### 取り込んだすべてのフィクスチャを実行する

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

### カテゴリを1つ実行する

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

### サブテストごとの出力

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

各フィクスチャ内のすべてのサブテスト（PASS / FAIL）を、失敗時のアサーションメッセージとともに出力します。

### JSON出力

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

CIパイプラインやスクリプトによる分析向けに、機械処理可能な合否サマリーを出力します。

### 注意事項

- Fetchを使うフィクスチャでは、`127.0.0.1:8765`上の`tests/Wpt/fetch-server.php`でバンドル済みWPTテストサーバーが自動起動し、実行後に停止します。
- `tests/Wpt/testharness-shim.js`にあるハーネスのシムは、取り込んだフィクスチャが使うWPTのAPI機能だけを実装します（全体では約3K行の`testharness.js`に対し、約400行）。
- ソースフィクスチャは`tests/Wpt/upstream/`にあります（[web-platform-tests/wpt](https://github.com/web-platform-tests/wpt)のgitignore対象のスパースチェックアウト）。追加で取り込むには、`upstream/<area>/`から`.any.js`ファイルを`fixtures/<category>/`にコピーしてください。ランナーが自動的に検出します。

## 終了コード

`bin/phasis`は2種類の終了コードを返します。

| コード | 意味 |
|---|---|
| `0` | 成功 — スクリプトが最後まで実行された（`--ast`の後も含む） |
| `1` | その他すべて：未捕捉のJS例外、構文エラー、ファイルの欠落、無効な引数 |

スクリプトのエラーはメッセージが標準エラー出力に出力されます。無効な引数やファイルの欠落がある場合は、使用方法を示す行が標準エラー出力に出力されます。

## リソース上限

`bin/phasis`はエンジンのデフォルト設定で動作し、上限を指定するフラグはありません。JSコールスタックの上限は4,096フレーム、トランスパイル済みクロージャーのガードは8,192フレームです。また、デフォルトの`maxLoopIterations`は100,000で、ツリーウォーキングインタープリターが実行するコードにのみ適用されます（[API: setLimit](https://phasis.inline0.dev/ja/docs/api#setlimit)を参照）。時間制限はありません。終了しない可能性のあるスクリプトには、コマンドを`timeout`で囲んでください。
