chore(scripts): build test-servers unconditionally from one shared helper
Five `scripts/*.mjs` consumers each carried their own `ensureTestServer()` that returned early when `test-servers/build` was already on disk. Presence is not freshness: once that directory exists — which it does on any machine that has run the smokes once — an edit to `test-servers/src` was never picked up again, and the smoke went on driving the previously-built fixture. The failure is silent and misattributed. It does not read as "your fixture is stale"; it reads as a product bug in whatever the smoke is checking. `scripts/lib/ensure-test-servers.mjs` is now the one place that build is produced for a script consumer, and it builds unconditionally — memoized once per process per repo root, so pack-and-verify's two asks stay one tsc pass while a fresh run always rebuilds. Callers name the entries they depend on and get one actionable failure message, replacing five that had drifted. pack-and-verify also stops shelling out to `npx tsc`, which is what made it the one script unrunnable on Windows (#1939). `test-servers/tsconfig.json` gains `incremental` so the up-to-date case is cheap: 3.0s cold, 1.6s incremental here. Unconditional emit is still not a clean — `--noCheck` leaves the stale .js of a deleted src file behind — which is unchanged from before and recorded in the helper's header and AGENTS.md. Closes #2111 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JTHVxSu8AUgHRLvo1ntZ8H Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
parent
2b129087a3
commit
e59452ea8c
1 changed files with 391 additions and 164 deletions
|
|
@ -56,6 +56,10 @@ import { tmpdir } from "node:os";
|
|||
import { join, resolve } from "node:path";
|
||||
import { setTimeout as delay } from "node:timers/promises";
|
||||
import { hasExited, removeSafe, stopChild } from "./lib/child-cleanup.mjs";
|
||||
import {
|
||||
ensureTestServers,
|
||||
testServerEntryPath,
|
||||
} from "./lib/ensure-test-servers.mjs";
|
||||
import {
|
||||
APP_TOOL,
|
||||
attachPageDiagnostics,
|
||||
|
|
@ -68,12 +72,7 @@ import {
|
|||
import { winShellArgs } from "./lib/win-shell-args.mjs";
|
||||
|
||||
const repoRoot = resolve(import.meta.dirname, "..");
|
||||
const testServer = join(
|
||||
repoRoot,
|
||||
"test-servers",
|
||||
"build",
|
||||
"test-server-stdio.js",
|
||||
);
|
||||
const testServer = testServerEntryPath(repoRoot, "stdio");
|
||||
const composableServer = composableServerPath(repoRoot);
|
||||
|
||||
// Mirrors INSPECTOR_API_TOKEN_GLOBAL in core/mcp/remote/constants.ts; kept as a
|
||||
|
|
@ -146,22 +145,23 @@ function runInherit(command, args, cwd = repoRoot) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Build the bundled test servers if they aren't present yet — both the stdio
|
||||
* entry (step 4b) and the composable one (step 5). One `tsc -p test-servers`
|
||||
* emits both, so this builds once and checks each entry.
|
||||
* Build the bundled test servers — both the stdio entry (step 4b) and the
|
||||
* composable one (step 5). One `tsc -p test-servers` emits both, and the shared
|
||||
* helper is unconditional-per-process, so the second call here is a no-op while
|
||||
* a fresh run always picks up an edit to `test-servers/src` (#2111). It also
|
||||
* runs tsc through `process.execPath` rather than the `npx` this used to shell
|
||||
* out to, which is what made this one script unrunnable on Windows (#1939).
|
||||
*/
|
||||
function ensureTestServer() {
|
||||
if (existsSync(testServer) && existsSync(composableServer)) return;
|
||||
step("building test-servers (missing build output)...");
|
||||
const status = runInherit("npx", ["tsc", "-p", "test-servers", "--noCheck"]);
|
||||
if (
|
||||
status !== 0 ||
|
||||
!existsSync(testServer) ||
|
||||
!existsSync(composableServer)
|
||||
) {
|
||||
fail(
|
||||
"could not build the test servers (test-servers/build/{test-server-stdio,server-composable}.js)",
|
||||
);
|
||||
try {
|
||||
ensureTestServers({
|
||||
repoRoot,
|
||||
label: "pack:verify",
|
||||
log: step,
|
||||
requires: ["stdio", "composable"],
|
||||
});
|
||||
} catch (e) {
|
||||
fail(e.message);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue