Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions bin/phpc.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
* phpc lint --project <entry.php> [--json]
* phpc lint --all <dir-or-file> [--json]
* phpc lint --bootstrap-inventory [--check] [--json]
* phpc init [--profile default|miniwebapp|sessionsweb|apijson|fileupload|throwsweb|selfhostprobe] [--force] [target-dir]
* phpc init [--profile default|miniwebapp|sessionsweb|apijson|fileupload|throwsweb|selfhostprobe|fastcgiweb] [--force] [target-dir]
* phpc test [--fast] [--bootstrap] [--bootstrap-strict] [-- phpunit/ci-local args...]
* phpc doctor [--gates] [--selfhost] [--no-lint] [--jit-probe] [--aot-project-probe [dir]] Env probes; --gates MiniWebApp; --selfhost NS2 (#2053)
* phpc validate-manifest [dir] Validate phpc.json schema and paths (issue #263)
Expand Down Expand Up @@ -68,8 +68,8 @@
phpc lint --bootstrap-inventory [--check] Lint all bin/vm.php-path files (#2208)
--check Exit 1 when any file has unsupported syntax
--json fields: file, line, kind, message, issue, issue_url (when tracked)
phpc init [--profile default|miniwebapp|sessionsweb|apijson|fileupload|throwsweb|selfhostprobe] [--force] [target-dir]
Scaffold web project (default, miniwebapp, sessionsweb, apijson, fileupload, throwsweb, or selfhostprobe)
phpc init [--profile default|miniwebapp|sessionsweb|apijson|fileupload|throwsweb|selfhostprobe|fastcgiweb] [--force] [target-dir]
Scaffold web project (default, miniwebapp, sessionsweb, apijson, fileupload, throwsweb, selfhostprobe, or fastcgiweb)
phpc test [--fast] [args...] Run ci-local.sh (full) or ci-fast.sh (no LLVM)
phpc test --bootstrap [--strict] Bootstrap subset (inventory + spine sync; #1961)
phpc doctor [--gates] [--selfhost] [--no-lint] [--jit-probe] [--aot-project-probe [dir]]
Expand Down
1 change: 1 addition & 0 deletions docs/local-ci-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ Defaults are exported from [`script/ci-defaults.env`](../script/ci-defaults.env)
| `INIT_FILEUPLOAD_PARITY_GATE` | `1` | `ci-fast.sh` (`ci_run_inventory_checks`) | `script/check-init-fileupload-parity.sh` — `examples/006-FileUploadWeb/` ↔ `templates/init-fileupload/` ([#2004](https://github.com/PurHur/php-compiler/issues/2004), default-on [#2020](https://github.com/PurHur/php-compiler/issues/2020)); set `0` for doc-only iteration |
| `INIT_THROWSWEB_PARITY_GATE` | `1` | `ci-fast.sh` (`ci_run_inventory_checks`) | `script/check-init-throwsweb-parity.sh` — `examples/007-ThrowsWeb/` ↔ `templates/init-throwsweb/` ([#2086](https://github.com/PurHur/php-compiler/issues/2086), default-on [#2127](https://github.com/PurHur/php-compiler/issues/2127)); set `0` for doc-only iteration |
| `INIT_SELFHOSTPROBE_PARITY_GATE` | `1` | `ci-fast.sh` (`ci_run_inventory_checks`) | `script/check-init-selfhostprobe-parity.sh` — `examples/008-SelfHostProbe/` ↔ `templates/init-selfhostprobe/` ([#2220](https://github.com/PurHur/php-compiler/issues/2220)); set `0` for doc-only iteration |
| `INIT_FASTCGIWEB_PARITY_GATE` | `1` | `ci-fast.sh` (`ci_run_inventory_checks`) | `script/check-init-fastcgiweb-parity.sh` — `examples/009-FastCGIWeb/` ↔ `templates/init-fastcgiweb/` ([#2342](https://github.com/PurHur/php-compiler/issues/2342)); set `0` for doc-only iteration |
| `APIJSON_INIT_PARITY_GATE` | `1` | `ci-fast.sh` (`ci_run_inventory_checks`) | `script/check-init-apijson-parity.sh` — `examples/004-ApiJson/` ↔ `templates/init-apijson/` ([#2029](https://github.com/PurHur/php-compiler/issues/2029), default-on [#2037](https://github.com/PurHur/php-compiler/issues/2037)); set `0` for doc-only iteration |

Ladder-only env vars (not in `ci-defaults.env`): `MINIWEBAPP_LINT_GATE` (default `1` in `web-smoke.sh`), `MINIWEBAPP_AOT_BISECT_GATE` (default `0` in `miniwebapp-gates.sh` — [#879](https://github.com/PurHur/php-compiler/issues/879)).
Expand Down
12 changes: 12 additions & 0 deletions docs/phpc-json.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ Same manifest as **001-SimpleWeb**; docroot is the project root (no `public/`).
| `fileupload` | `templates/init-fileupload/` | Flat `example.php` multipart upload ([**006-FileUploadWeb**](../examples/006-FileUploadWeb/)) |
| `throwsweb` | `templates/init-throwsweb/` | Flat `example.php` throw/catch validation ([**007-ThrowsWeb**](../examples/007-ThrowsWeb/)) |
| `selfhostprobe` | `templates/init-selfhostprobe/` | Flat `example.php` North Star 2 bootstrap presenter ([**008-SelfHostProbe**](../examples/008-SelfHostProbe/)) |
| `fastcgiweb` | `templates/init-fastcgiweb/` | Flat `example.php` FastCGI / deploy health + PATH_INFO ([**009-FastCGIWeb**](../examples/009-FastCGIWeb/)) |

### Self-host presenter flat project (`examples/008-SelfHostProbe/phpc.json`)

Expand All @@ -146,6 +147,17 @@ Same manifest as **001-SimpleWeb**; docroot is the project root (no `public/`).

CLI presenter only (no superglobals). Scaffold with `phpc init --profile selfhostprobe` ([#2220](https://github.com/PurHur/php-compiler/issues/2220)); template parity: `script/check-init-selfhostprobe-parity.sh` (default `INIT_SELFHOSTPROBE_PARITY_GATE=1` in `ci-fast`).

### FastCGI / deploy flat project (`examples/009-FastCGIWeb/phpc.json`)

```json
{
"entry": "example.php",
"binary": ".phpc/bin/app"
}
```

Health `ok` and PATH_INFO diagnostics via CGI superglobals. Scaffold with `phpc init --profile fastcgiweb` ([#2342](https://github.com/PurHur/php-compiler/issues/2342)); template parity: `script/check-init-fastcgiweb-parity.sh` (default `INIT_FASTCGIWEB_PARITY_GATE=1` in `ci-fast`).

## Commands

| Command | Role |
Expand Down
9 changes: 9 additions & 0 deletions examples/009-FastCGIWeb/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ Minimal multi-request fixture for **`phpc deploy`** + future FastCGI adapter ([#
| `GET /example.php` (empty `PATH_INFO`) | `ok` (health) |
| `GET /example.php/...` (non-empty `PATH_INFO`) | Plain-text `REQUEST_URI`, `SCRIPT_NAME`, `PATH_INFO` |

## Scaffold

```console
./phpc init --profile fastcgiweb /tmp/my-fastcgiweb
./phpc lint /tmp/my-fastcgiweb/example.php
```

Template parity: `./script/check-init-fastcgiweb-parity.sh` ([#2342](https://github.com/PurHur/php-compiler/issues/2342)).

## Run (VM / serve)

```console
Expand Down
2 changes: 1 addition & 1 deletion examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ curl -s http://127.0.0.1:8080/example.php
curl -s http://127.0.0.1:8080/example.php/ping
```

AOT: `phpc build --project examples/009-FastCGIWeb` when LLVM is ready. CI serve smoke: opt-in `FASTCGI_WEB_SMOKE_GATE=1` · `make examples-fastcgiweb-smoke` ([#2351](https://github.com/PurHur/php-compiler/issues/2351)).
AOT: `phpc build --project examples/009-FastCGIWeb` when LLVM is ready. Init scaffold: `./phpc init --profile fastcgiweb my-app` ([#2342](https://github.com/PurHur/php-compiler/issues/2342)); template parity: `INIT_FASTCGIWEB_PARITY_GATE=1` in `ci-fast`. CI serve smoke: opt-in `FASTCGI_WEB_SMOKE_GATE=1` · `make examples-fastcgiweb-smoke` ([#2351](https://github.com/PurHur/php-compiler/issues/2351)).

### 002-StaticWeb

Expand Down
13 changes: 13 additions & 0 deletions lib/Cli/PhpcInit.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ final class PhpcInit

public const PROFILE_SELFHOSTPROBE = 'selfhostprobe';

public const PROFILE_FASTCGIWEB = 'fastcgiweb';

/** @var array<string, list<string>> */
private const PROFILE_TEMPLATES = [
self::PROFILE_DEFAULT => [
Expand Down Expand Up @@ -55,6 +57,11 @@ final class PhpcInit
'example.php',
'README.md',
],
self::PROFILE_FASTCGIWEB => [
'phpc.json',
'example.php',
'README.md',
],
self::PROFILE_MINIWEBAPP => [
'phpc.json',
'config.php',
Expand Down Expand Up @@ -180,6 +187,12 @@ public static function run(string $repoRoot, string $targetDir, bool $force, str
fwrite(STDOUT, " phpc lint example.php\n");
fwrite(STDOUT, " phpc run example.php\n");
fwrite(STDOUT, " make north-star2-verify\n");
} elseif (self::PROFILE_FASTCGIWEB === $profile) {
fwrite(STDOUT, " phpc lint example.php\n");
fwrite(STDOUT, " phpc run example.php\n");
fwrite(STDOUT, " phpc serve 127.0.0.1:8080 .\n");
fwrite(STDOUT, " curl -s http://127.0.0.1:8080/example.php\n");
fwrite(STDOUT, " curl -s http://127.0.0.1:8080/example.php/ping\n");
} else {
fwrite(STDOUT, " phpc lint public/index.php\n");
fwrite(STDOUT, " phpc run public/index.php\n");
Expand Down
14 changes: 13 additions & 1 deletion lib/Doctor.php
Original file line number Diff line number Diff line change
Expand Up @@ -954,8 +954,20 @@ private static function printFastCGIWebSection(string $repoRoot): void
fwrite(STDOUT, " Run: FASTCGI_WEB_DEPLOY_SMOKE_GATE=1 make deploy-smoke-all\n");
fwrite(STDOUT, " Or: make examples-fastcgiweb-deploy-smoke\n");
fwrite(STDOUT, " Ladder: make deploy-smoke-all (skips 009 with hint when gate=0; #2077)\n");

$initProfileLive = \PHPCompiler\Cli\PhpcInit::isKnownProfile('fastcgiweb');
$initTemplate = is_file($exampleDir.'/example.php')
&& is_file($repoRoot.'/templates/init-fastcgiweb/example.php');
if ($initProfileLive && $initTemplate) {
fwrite(STDOUT, " [✅] phpc init --profile fastcgiweb (#2342)\n");
} elseif ($initTemplate) {
fwrite(STDOUT, " [📋] phpc init --profile fastcgiweb — template ready; CLI profile pending #2342\n");
} else {
fwrite(STDOUT, " [📋] phpc init --profile fastcgiweb — #2342\n");
}
fwrite(STDOUT, " Parity: ./script/check-init-fastcgiweb-parity.sh (INIT_FASTCGIWEB_PARITY_GATE=1 in ci-fast)\n");

fwrite(STDOUT, "\n Related:\n");
fwrite(STDOUT, " [📋] phpc init --profile fastcgiweb — #2342\n");
fwrite(STDOUT, " [📋] FastCGI adapter loop — #173\n");
fwrite(STDOUT, " Docs: examples/009-FastCGIWeb/README.md · docs/local-ci-matrix.md\n");
}
Expand Down
60 changes: 60 additions & 0 deletions script/check-init-fastcgiweb-parity.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#!/usr/bin/env bash
# Keep templates/init-fastcgiweb/ byte-identical to examples/009-FastCGIWeb on key app files (issue #2342).
# Intentional divergence: add the same marker comment in BOTH trees:
# // fastcgiweb-parity: intentional divergence — reason
set -euo pipefail

REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_ROOT"

CANONICAL="examples/009-FastCGIWeb"
TEMPLATE="templates/init-fastcgiweb"

PARITY_FILES=(
example.php
phpc.json
)

fail=0

for rel in "${PARITY_FILES[@]}"; do
left="${CANONICAL}/${rel}"
right="${TEMPLATE}/${rel}"
if [[ ! -f "$left" ]]; then
echo "check-init-fastcgiweb-parity: missing canonical file: ${left}" >&2
fail=1
continue
fi
if [[ ! -f "$right" ]]; then
echo "check-init-fastcgiweb-parity: missing template file: ${right}" >&2
fail=1
continue
fi
if ! cmp -s "$left" "$right"; then
echo "check-init-fastcgiweb-parity: drift in ${rel} (sync from ${CANONICAL} → ${TEMPLATE}):" >&2
diff -u "$left" "$right" >&2 || true
fail=1
fi
done

TEMPLATE_README="${TEMPLATE}/README.md"
if [[ ! -f "$TEMPLATE_README" ]]; then
echo "check-init-fastcgiweb-parity: missing template README: ${TEMPLATE_README}" >&2
fail=1
else
if ! grep -qF 'check-init-fastcgiweb-parity.sh' "$TEMPLATE_README"; then
echo "check-init-fastcgiweb-parity: templates/init-fastcgiweb/README.md should document ./script/check-init-fastcgiweb-parity.sh (issue #2342)" >&2
fail=1
fi
if ! grep -q '#695' "$TEMPLATE_README"; then
echo "check-init-fastcgiweb-parity: templates/init-fastcgiweb/README.md should reference sync policy #695 (issue #2342)" >&2
fail=1
fi
fi

if [[ "$fail" -ne 0 ]]; then
echo "check-init-fastcgiweb-parity: FAILED — copy key files from ${CANONICAL}/ to ${TEMPLATE}/ (see README sync policy)." >&2
exit 1
fi

echo "check-init-fastcgiweb-parity: OK (${#PARITY_FILES[@]} files in sync with ${CANONICAL})."
9 changes: 9 additions & 0 deletions script/ci-common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,14 @@ ci_run_init_selfhostprobe_parity_check() {
script/check-init-selfhostprobe-parity.sh
}

ci_run_init_fastcgiweb_parity_check() {
if [[ "${INIT_FASTCGIWEB_PARITY_GATE:-1}" != "1" ]]; then
return 0
fi
echo "init-fastcgiweb template parity (INIT_FASTCGIWEB_PARITY_GATE=1, issue #2342)..."
script/check-init-fastcgiweb-parity.sh
}

ci_run_init_apijson_parity_check() {
if [[ "${APIJSON_INIT_PARITY_GATE:-1}" != "1" ]]; then
return 0
Expand All @@ -334,6 +342,7 @@ ci_run_inventory_checks() {
ci_run_init_fileupload_parity_check
ci_run_init_throwsweb_parity_check
ci_run_init_selfhostprobe_parity_check
ci_run_init_fastcgiweb_parity_check
ci_run_init_apijson_parity_check
"$PHP_BIN" "${PHP_OPTS[@]}" script/capability-matrix.php --check
ci_run_capability_syntax_check
Expand Down
1 change: 1 addition & 0 deletions script/ci-defaults.env
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ export INIT_SESSIONSWEB_PARITY_GATE="${INIT_SESSIONSWEB_PARITY_GATE:-1}" # defa
export INIT_FILEUPLOAD_PARITY_GATE="${INIT_FILEUPLOAD_PARITY_GATE:-1}" # default on (#2020); opt-out INIT_FILEUPLOAD_PARITY_GATE=0 for doc-only iteration
export INIT_THROWSWEB_PARITY_GATE="${INIT_THROWSWEB_PARITY_GATE:-1}" # default on (#2127); opt-out INIT_THROWSWEB_PARITY_GATE=0 for doc-only iteration
export INIT_SELFHOSTPROBE_PARITY_GATE="${INIT_SELFHOSTPROBE_PARITY_GATE:-1}" # default on (#2220); opt-out INIT_SELFHOSTPROBE_PARITY_GATE=0 for doc-only iteration
export INIT_FASTCGIWEB_PARITY_GATE="${INIT_FASTCGIWEB_PARITY_GATE:-1}" # default on (#2342); examples/009-FastCGIWeb ↔ templates/init-fastcgiweb
export APIJSON_INIT_PARITY_GATE="${APIJSON_INIT_PARITY_GATE:-1}" # default on (#2037); opt-out APIJSON_INIT_PARITY_GATE=0 for doc-only iteration
export CAPABILITIES_SESSIONSWEB_SYNC_GATE="${CAPABILITIES_SESSIONSWEB_SYNC_GATE:-1}" # default on (#1947); opt-out CAPABILITIES_SESSIONSWEB_SYNC_GATE=0 for doc-only iteration
export CAPABILITIES_006_SYNC_GATE="${CAPABILITIES_006_SYNC_GATE:-1}" # default on (#2019, #2068); opt-out CAPABILITIES_006_SYNC_GATE=0 for matrix-only edits
Expand Down
47 changes: 47 additions & 0 deletions templates/init-fastcgiweb/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# FastCGIWeb scaffold

Project layout from `phpc init --profile fastcgiweb` (issue #2342). Application PHP and manifest are kept **byte-identical** to [examples/009-FastCGIWeb](../../examples/009-FastCGIWeb/) — see sync policy below ([#695](https://github.com/PurHur/php-compiler/issues/695)).

## Sync policy

| Tree | Role |
|------|------|
| `examples/009-FastCGIWeb/` | **Source of truth** (FastCGI / deploy presenter, CI gates, docs) |
| `templates/init-fastcgiweb/` | `phpc init --profile fastcgiweb` output; must match canonical files |

When you change `example.php` or `phpc.json` in the example, copy the same files into this template in the **same PR**.

Verify before merge (`ci-fast` runs this when `INIT_FASTCGIWEB_PARITY_GATE=1`, [#2342](https://github.com/PurHur/php-compiler/issues/2342)):

```console
./script/check-init-fastcgiweb-parity.sh
```

Intentional divergence (rare): add the same marker in **both** trees:

```php
// fastcgiweb-parity: intentional divergence — <reason>
```

## Commands

```console
phpc lint example.php
phpc run example.php
phpc serve 127.0.0.1:8080 .
curl -s http://127.0.0.1:8080/example.php
curl -s http://127.0.0.1:8080/example.php/ping
```

`phpc.json` sets `entry` and the default AOT binary path (`.phpc/bin/app`). Health + PATH_INFO diagnostics via CGI superglobals ([#2331](https://github.com/PurHur/php-compiler/issues/2331)).

## Run matrix

| Mode | Status | Command |
|------|--------|---------|
| Lint | ✅ | `phpc lint example.php` |
| VM run | ✅ | `phpc run example.php` |
| VM serve | ✅ | `phpc serve 127.0.0.1:8080 .` |
| AOT / deploy | ✅ | `phpc build --project .` · `phpc deploy` ([#635](https://github.com/PurHur/php-compiler/issues/635)) |

See [examples/009-FastCGIWeb/README.md](../../examples/009-FastCGIWeb/README.md) and [docs/deploy-web-aot.md](../../docs/deploy-web-aot.md).
33 changes: 33 additions & 0 deletions templates/init-fastcgiweb/example.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

/**
* Minimal FastCGI / deploy presenter (issue #2331).
*
* Routes (PATH_INFO after front controller):
* empty PATH_INFO → health plain-text "ok"
* any other path → echo REQUEST_URI and SCRIPT_NAME (CGI diagnostics)
*
* VM:
* ./phpc run examples/009-FastCGIWeb/example.php
*
* Serve (loopback harness until FastCGI adapter #173):
* ./phpc serve 127.0.0.1:8080 examples/009-FastCGIWeb
* curl -s http://127.0.0.1:8080/example.php
* curl -s http://127.0.0.1:8080/example.php/ping
*
* Deploy + nginx/FastCGI: docs/deploy-web-aot.md (#445); integration target #173.
*/
$pathInfo = $_SERVER['PATH_INFO'] ?? '';

header('Content-Type: text/plain; charset=UTF-8');

// strlen guard: VM mis-lowers chained !== on coalesced $_SERVER fetches (#2351 smoke).
if (strlen($pathInfo) > 1) {
$requestUri = $_SERVER['REQUEST_URI'] ?? '/';
$scriptName = $_SERVER['SCRIPT_NAME'] ?? '/example.php';
echo 'REQUEST_URI=', $requestUri, "\n";
echo 'SCRIPT_NAME=', $scriptName, "\n";
echo 'PATH_INFO=', $pathInfo, "\n";
} else {
echo "ok\n";
}
4 changes: 4 additions & 0 deletions templates/init-fastcgiweb/phpc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"entry": "example.php",
"binary": ".phpc/bin/app"
}
39 changes: 39 additions & 0 deletions test/unit/CiScriptsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2414,6 +2414,45 @@ public function testLocalCiMatrixDocumentsSelfhostprobeInitParityGate(): void
$this->assertMatchesRegularExpression('/\| `INIT_SELFHOSTPROBE_PARITY_GATE` \| `1` \|/', $doc);
}

public function testCheckInitFastcgiwebParityScriptExists(): void
{
$check = dirname(__DIR__, 2).'/script/check-init-fastcgiweb-parity.sh';
$this->assertFileExists($check);
$this->assertTrue(is_executable($check));
$body = (string) file_get_contents($check);
$this->assertStringContainsString('examples/009-FastCGIWeb', $body);
$this->assertStringContainsString('templates/init-fastcgiweb', $body);
}

public function testCheckInitFastcgiwebParityPassesInRepo(): void
{
$check = dirname(__DIR__, 2).'/script/check-init-fastcgiweb-parity.sh';
exec('bash '.escapeshellarg($check).' 2>&1', $out, $code);
$this->assertSame(0, $code, implode("\n", $out));
}

public function testCiInventoryRunsInitFastcgiwebParityCheck(): void
{
$common = (string) file_get_contents(dirname(__DIR__, 2).'/script/ci-common.sh');
$this->assertStringContainsString('ci_run_init_fastcgiweb_parity_check', $common);
$this->assertStringContainsString('check-init-fastcgiweb-parity.sh', $common);
$this->assertStringContainsString('INIT_FASTCGIWEB_PARITY_GATE:-1', $common);
}

public function testCiDefaultsEnvDefinesFastcgiwebInitParityGateOn(): void
{
$defaults = (string) file_get_contents(dirname(__DIR__, 2).'/script/ci-defaults.env');
$this->assertStringContainsString('INIT_FASTCGIWEB_PARITY_GATE="${INIT_FASTCGIWEB_PARITY_GATE:-1}"', $defaults);
}

public function testLocalCiMatrixDocumentsFastcgiwebInitParityGate(): void
{
$doc = (string) file_get_contents(dirname(__DIR__, 2).'/docs/local-ci-matrix.md');
$this->assertStringContainsString('INIT_FASTCGIWEB_PARITY_GATE', $doc);
$this->assertStringContainsString('check-init-fastcgiweb-parity.sh', $doc);
$this->assertMatchesRegularExpression('/\| `INIT_FASTCGIWEB_PARITY_GATE` \| `1` \|/', $doc);
}

public function testCheckInitApiJsonParityScriptExists(): void
{
$check = dirname(__DIR__, 2).'/script/check-init-apijson-parity.sh';
Expand Down
2 changes: 2 additions & 0 deletions test/unit/PhpcDoctorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,8 @@ public function testDoctorGatesPrintsMiniWebAppLadder(): void
$this->assertStringContainsString('examples-fastcgiweb-smoke', $result['stdout']);
$this->assertStringContainsString('--fastcgi-only', $result['stdout']);
$this->assertStringContainsString('#2351', $result['stdout']);
$this->assertStringContainsString('phpc init --profile fastcgiweb', $result['stdout']);
$this->assertStringContainsString('check-init-fastcgiweb-parity.sh', $result['stdout']);
$this->assertStringContainsString('Bootstrap inventory lint', $result['stdout']);
$this->assertStringContainsString('bootstrap-inventory', $result['stdout']);
$this->assertStringContainsString('BOOTSTRAP_INVENTORY_LINT_SYNC_GATE', $result['stdout']);
Expand Down
Loading