openclaw/scripts/ensure-cli-startup-build.mts
Peter Steinberger 799ddbd35d
refactor(comments): deslop production narration
## What Problem This Solves

Production code still carries duplicated narration over function names, types, branches and CSS selectors. Some of that prose has drifted: Zalo polling is described as development-only even though it is the default production route, and a joined hook helper is called fire-and-forget.

## User Impact

No user-visible behavior changes. Runtime logic, templates, CSS declarations, configuration, persisted state, wire formats, public API documentation, licenses and lint-suppression reasons remain intact.

## Why This Change Was Made

This maintainer-requested cleanup removes redundant internal helper/registrar summaries, repeated section labels, and obsolete inline font-size history. Existing declarations and shared owners already express these facts; no new abstraction is needed. Comments explaining authority, lifecycle, ordering, cleanup, platform constraints, dependencies and public contracts stay.

The measured reduction is 696 net production/tooling lines: 604 standalone comment lines and 92 adjacent blank lines, plus 59 inline comment removals without net line savings. No tests or generated files changed. This is a bounded contextual sweep, not a claim of exhaustive repository coverage; the local census records exact findings, retained candidates, and unread files. Filename-header cleanup from #161768 is excluded.

## Evidence

Independent review completed; all accepted documentation findings were addressed by restoring base comments. The remaining changed files are byte-identical to the reviewed and remotely frozen candidate.

Blacksmith Testbox validation:
- Parser comparison: identical non-comment TypeScript tokens and CSS structure.
- Both import-cycle checks: 0 cycles.
- Focused existing tests: 40 Vitest shards passed (521.71 seconds).
- Plugin contracts: 48 files / 1,153 tests passed.
- Plugin, source-to-extension, and SDK/package import-boundary checks passed.
- Feishu asset hook check: no build hooks; no plugin browser/control-UI source changed.

SDK API comparison passed with no API changes. The full changed-file gate passed remotely. The lowered-threshold duplicate census (12 lines / 80 tokens) completed; its raw 155 records include deliberate probe/fixture matches and are not claimed as removable production code. No tests were added or changed.

Public JSDoc was audited independently: the SDK API comparison strips comments, while shipped declarations can preserve them, so API-shape equality alone would not prove documentation preservation.


### Inherited hosted CI failure

Exact-head [CI run 36815106181](https://github.com/openclaw/openclaw/actions/runs/36815106181) tested `ff26a4c05d3b41d25477df41cb94010c6cac5cb0` merged with main `75d1f82c18`. The only failing test job was `checks-node-compact-small-19`: `test/helpers/openclaw-test-instance.acquisition.test.ts:33`, “keeps an absent Gateway unreachable while retaining its port claims,” expected `free` but received `busy`. The other failure is the aggregate CI gate. This attempt has 84 successful jobs, 16 skipped jobs, and 88 collateral cancellations; cancelled coverage is not counted as passing.

The identical assertion and error were independently verified in [job 110052175838](https://github.com/openclaw/openclaw/actions/runs/36763489663/job/110052175838), the latest attempt (1) for unrelated PR #162070's final head `d07a6981d4`. The acquisition test, instance helper, cleanup wrapper, isolated-state writer, port allocator, claim owner, claim-lock owner and TCP probe are byte-identical between that head and this PR. No changed file participates in the failing acquisition/probe path. The failure precedes Gateway startup; the logs do not identify the competing listener, so no root-cause repair is claimed.

Landing uses the maintainer-authorized inherited-failure exception pinned to this exact head, backed by the passing remote gates above. The fixture defect remains with the main-CI coordinator. No workflow rerun, test weakening, timeout increase, or source repush was used to obtain green. GitHub's GraphQL writer rejected auto-merge because its quota was exhausted; the request was reconciled as absent before selecting the supported REST squash path.
2026-09-30 22:28:36 -07:00

74 lines
2.7 KiB
TypeScript

#!/usr/bin/env node
// Ensures CLI startup benchmark assets are built before checks.
import { spawnSync } from "node:child_process";
import { existsSync } from "node:fs";
import path from "node:path";
import { pathToFileURL } from "node:url";
import { readPositiveEnvInt } from "./lib/numeric-options.mjs";
import { resolveRepoRoot } from "./lib/repo-root.mjs";
const repoRoot = resolveRepoRoot(import.meta.url);
const entryCandidates = ["dist/entry.js", "dist/entry.mjs"];
const startupMetadataPath = "dist/cli-startup-metadata.json";
const DEFAULT_BUILD_TIMEOUT_MS = 10 * 60 * 1000;
type StartupBuildParams = Partial<{
env: NodeJS.ProcessEnv;
existsSync: typeof existsSync;
killSignal: NodeJS.Signals;
nodeExecPath: string;
rootDir: string;
spawnSync: (...args: Parameters<typeof spawnSync>) => Partial<ReturnType<typeof spawnSync>>;
stdio: "inherit" | "pipe";
timeoutMs: number;
}>;
export function resolveCliStartupBuildTimeoutMs(env: NodeJS.ProcessEnv = process.env) {
return readPositiveEnvInt("OPENCLAW_CLI_STARTUP_BUILD_TIMEOUT_MS", env, DEFAULT_BUILD_TIMEOUT_MS);
}
export function hasCliStartupBuild(params: StartupBuildParams = {}) {
const rootDir = params.rootDir ?? repoRoot;
const exists = params.existsSync ?? existsSync;
const hasEntry = entryCandidates.some((relativePath) => exists(path.join(rootDir, relativePath)));
return hasEntry && exists(path.join(rootDir, startupMetadataPath));
}
export function ensureCliStartupBuild(params: StartupBuildParams = {}) {
const rootDir = params.rootDir ?? repoRoot;
if (hasCliStartupBuild({ rootDir, existsSync: params.existsSync })) {
return { built: false };
}
const nodeExecPath = params.nodeExecPath ?? process.execPath;
const spawn = params.spawnSync ?? spawnSync;
const buildScript = path.join(rootDir, "scripts", "build-all.mts");
console.error(
"[cli-startup-build] dist startup entry or metadata missing; running cliStartup build profile",
);
const result = spawn(nodeExecPath, ["--import", "tsx", buildScript, "cliStartup"], {
cwd: rootDir,
env: params.env ?? process.env,
killSignal: params.killSignal ?? "SIGKILL",
stdio: params.stdio ?? "inherit",
timeout: params.timeoutMs ?? resolveCliStartupBuildTimeoutMs(params.env ?? process.env),
});
if (result.error) {
throw result.error;
}
const status = result.status ?? (result.signal ? 1 : 0);
if (status !== 0) {
throw new Error(`cliStartup build profile failed with exit code ${status}`);
}
return { built: true };
}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
try {
ensureCliStartupBuild();
} catch (error) {
console.error(error instanceof Error ? error.message : String(error));
process.exit(1);
}
}