mirror of
https://github.com/openclaw/openclaw.git
synced 2026-10-03 17:53:39 +00:00
## 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.
74 lines
2.7 KiB
TypeScript
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);
|
|
}
|
|
}
|