
# CLI

Phasis은 `bin/`에서 세 가지 주요 실행 파일을 제공합니다:

- **`bin/phasis`** — JavaScript 파일을 실행하고, 명령줄에서 전달한 소스를 평가하며, AST를 출력합니다.
- **`bin/test262`** — 공식 ECMAScript 적합성 테스트 스위트를 Phasis에 대해 실행합니다.
- **`bin/wpt`** — Web Platform Tests 픽스처를 Phasis에 대해 실행합니다(URL, 인코딩, fetch, 헤더, Blob, AbortSignal, 스트림 등).

`composer require phasis/phasis` 이후 `bin/phasis`와 `bin/test262`가 `vendor/bin/`에서 링크됩니다. 여기서는 `bin/phasis`만 작동합니다. `bin/test262`에는 Composer 패키지에 포함되지 않은 `test262` git 서브모듈과 테스트 클래스가 필요하고, `bin/wpt`은 아예 제공되지 않기 때문입니다. Phasis 저장소를 클론한 뒤 둘 다 실행하세요.

## bin/phasis

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

이 세 가지 형식이 전체 인터페이스입니다. REPL, 표준 입력 또는 모듈 플래그는 없습니다.

### 파일 실행

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

`script.js`을 클래식 스크립트로 실행합니다. 실행이 끝나면 스크립트가 `console.log`(및 `console.error`, `console.warn` 등)으로 출력한 내용을 한 번에 stdout으로 출력합니다. 스크립트에서 예외가 발생하면 오류 메시지는 stderr로 출력되고 종료 상태는 1이 됩니다.

파일은 항상 클래식 스크립트로 파싱되므로 `import` / `export` 또는 최상위 `await`이 있는 파일은 SyntaxError가 발생합니다. ES 모듈을 실행하려면 PHP에서 `Engine::evalAsModule()`을 사용하세요([API 참조](https://phasis.inline0.dev/ko/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로 출력합니다(들여쓰기는 두 칸). 파서 문제를 디버깅하거나 Phasis 기반 도구를 만들 때 유용합니다. 프로그래밍 방식으로 접근하려면 [파서 API](https://phasis.inline0.dev/ko/docs/parser)를 사용하세요.

## bin/test262

`bin/test262`은 [공식 test262 스위트](https://github.com/tc39/test262)를 Phasis에 대해 실행합니다. 변경 사항을 기여할 때 회귀 테스트 하네스로 유용합니다. `COMPAT.md`의 전체 스위트 스냅샷은 관련 `bin/compat-report`이 생성하며, 수동으로 시작하는 CI 매트릭스에서 이를 샤드별로 실행합니다.

### 단일 카테고리 실행

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

### 전체 스위트 실행

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

### 구성

러너는 프로젝트 루트에서 `config/support.php`을 읽습니다. `test262_skipped_features` 목록은 비어 있어 test262 기능을 건너뛰지 않으며 `tail-call-optimization`도 포함됩니다. 이 파일에는 격리 실행이 필요한 카테고리와 테스트도 나열되어 있습니다.

스위트 자체는 `test262` git 서브모듈입니다. 클론한 뒤 `git submodule update --init test262`을 실행하세요. 서브모듈이 없으면 러너가 "test262 suite not found" 메시지와 함께 종료됩니다.

### 유용한 기타 플래그

| 플래그 | 용도 |
|---|---|
| `--failures` | 실패한 테스트마다 한 줄 출력 |
| `--limit N` | 처음 N개 테스트 실행 후 중단 |
| `--jobs N` | N개 테스트를 병렬로 실행 |
| `--files-from file` | `file`에 나열된 테스트만 실행 |
| `--json` | stdout에 기계 판독 가능한 요약 출력 |
| `--no-progress` | 진행 상황 줄 표시 안 함 |

최신 스냅샷은 [호환성 섹션](https://phasis.inline0.dev/ko/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`을 다룹니다. 영역별 통과율 표는 [웹 API](https://phasis.inline0.dev/ko/docs/compatibility/web-apis)에서 확인하세요.

### 가져온 모든 픽스처 실행

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

### 카테고리 하나 실행

```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를 사용하는 픽스처는 `tests/Wpt/fetch-server.php`에서 `127.0.0.1:8765`로 번들 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`은 두 가지 종료 코드 중 하나를 반환합니다:

| 코드 | 의미 |
|---|---|
| `0` | 성공 — 스크립트가 끝까지 실행됨(`--ast` 이후에도 해당) |
| `1` | 그 밖의 모든 경우: 처리되지 않은 JS 예외, 구문 오류, 파일 누락 또는 잘못된 인수 |

스크립트 오류 메시지는 stderr에 출력됩니다. 잘못된 인수와 누락된 파일이 있는 경우 사용법 안내가 stderr에 출력됩니다.

## 리소스 제한

`bin/phasis`는 엔진 기본값으로 실행되며 제한을 설정하는 플래그는 없습니다. JS 호출 스택은 4,096 프레임으로 제한되고, 트랜스파일된 클로저에는 8,192 프레임 가드가 적용됩니다. 기본 `maxLoopIterations`는 100,000이며 트리 순회 인터프리터가 실행하는 코드에만 적용됩니다([API: setLimit](https://phasis.inline0.dev/ko/docs/api#setlimit) 참고). 시간 제한은 없습니다. 스크립트가 종료되지 않을 수 있다면 명령어를 `timeout`로 감싸세요.
