fix(scripts): use direct-run helper for Windows guards (#110877)

* fix(scripts): normalize Windows direct-run guards

* test(scripts): cover direct-run routing

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
This commit is contained in:
qingminlong
2026-08-04 23:11:12 +08:00
committed by GitHub
parent d06fc25a0c
commit cb2965ddde
13 changed files with 141 additions and 13 deletions
+2 -1
View File
@@ -3,6 +3,7 @@ import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { expectDefined } from "../packages/normalization-core/src/expect.js";
import { isDirectRunUrl } from "./lib/direct-run.mjs";
import { NATIVE_I18N_LOCALES } from "./native-i18n-locales.ts";
const HERE = path.dirname(fileURLToPath(import.meta.url));
@@ -1612,7 +1613,7 @@ export async function checkAndroidAppI18n(options: { tolerateManagedPending?: bo
);
}
if (process.argv[1] && import.meta.url === `file://${path.resolve(process.argv[1])}`) {
if (isDirectRunUrl(process.argv[1], import.meta.url)) {
const [command] = process.argv.slice(2);
if (command === "sync") {
await syncAndroidAppI18n();
+2 -1
View File
@@ -9,6 +9,7 @@ import {
syncAndroidVersioning,
writeAndroidVersionManifest,
} from "./lib/android-version.ts";
import { isDirectRunUrl } from "./lib/direct-run.mjs";
type CliOptions = {
explicitVersion: string | null;
@@ -194,7 +195,7 @@ export async function main(argv: string[]): Promise<number> {
}
}
if (import.meta.url === `file://${process.argv[1]}`) {
if (isDirectRunUrl(process.argv[1], import.meta.url)) {
const exitCode = await main(process.argv.slice(2));
if (exitCode !== 0) {
process.exit(exitCode);
+2 -2
View File
@@ -50,9 +50,9 @@ const NODE_SCOPE_RE =
/^(src\/|test\/|extensions\/|packages\/|scripts\/|ui\/|\.github\/|openclaw\.mjs$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|tsconfig.*\.json$|vitest.*\.ts$|tsdown\.config\.ts$|\.oxlintrc\.json$|\.oxfmtrc\.jsonc$)/;
const WINDOWS_SQLITE_SCOPE_RE = /^src\/(?:state\/|.*sqlite.*\.ts$)/;
const WINDOWS_SCOPE_RE =
/^(extensions\/mxc\/|src\/agents\/(?:bash-tools\.exec-script-(?:preflight|target)|bash-tools\.exec\.script-preflight\.test)\.ts$|src\/config\/sessions\/(?:session-accessor\.sqlite-archive|store\.session-lifecycle-mutation\.test)\.ts$|src\/process\/|src\/infra\/(?:(?:exec-allowlist-pattern|fs-safe-remove)(?:\.test)?|ssh-client(?:\.windows\.test)?|update-managed-service-handoff(?:\.test)?|windows-install-roots)\.ts$|src\/shared\/(?:import-specifier|runtime-import)(?:\.test)?\.ts$|src\/test-utils\/openclaw-test-state(?:\.test)?\.ts$|scripts\/(?:install\.ps1|openclaw-cross-os-release-checks\.ts|github\/run-openclaw-cross-os-release-checks\.sh|(?:npm-runner|pnpm-runner|ui|vitest-process-group)\.(?:mjs|js)|lib\/(?:format-generated-module\.mjs|cross-os-release-checks\/[^/]+\.ts))$|test\/scripts\/(?:format-generated-module|install-ps1|npm-runner|openclaw-cross-os-release-workflow|pnpm-runner|ui|vitest-process-group)\.test\.ts$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|\.github\/workflows\/(?:ci|openclaw-cross-os-release-checks-reusable)\.yml$|\.github\/actions\/setup-node-env\/action\.yml$|\.github\/actions\/setup-pnpm-store-cache\/action\.yml$)/;
/^(extensions\/mxc\/|src\/agents\/(?:bash-tools\.exec-script-(?:preflight|target)|bash-tools\.exec\.script-preflight\.test)\.ts$|src\/config\/sessions\/(?:session-accessor\.sqlite-archive|store\.session-lifecycle-mutation\.test)\.ts$|src\/process\/|src\/infra\/(?:(?:exec-allowlist-pattern|fs-safe-remove)(?:\.test)?|ssh-client(?:\.windows\.test)?|update-managed-service-handoff(?:\.test)?|windows-install-roots)\.ts$|src\/shared\/(?:import-specifier|runtime-import)(?:\.test)?\.ts$|src\/test-utils\/openclaw-test-state(?:\.test)?\.ts$|scripts\/(?:android-(?:app-i18n|pin-version)\.ts|ci-run-timings\.mjs|e2e\/lib\/package-compat\.mjs|generate-bundled-channel-config-metadata\.ts|install\.ps1|openclaw-cross-os-release-checks\.ts|plan-release-workflow-matrix\.mjs|run-additional-boundary-checks\.mjs|verify-docker-attestations\.mjs|github\/run-openclaw-cross-os-release-checks\.sh|(?:npm-runner|pnpm-runner|ui|vitest-process-group)\.(?:mjs|js)|lib\/(?:direct-run\.mjs|format-generated-module\.mjs|cross-os-release-checks\/[^/]+\.ts))$|test\/scripts\/(?:direct-run-entrypoints|format-generated-module|install-ps1|npm-runner|openclaw-cross-os-release-workflow|pnpm-runner|ui|vitest-process-group)\.test\.ts$|package\.json$|pnpm-lock\.yaml$|pnpm-workspace\.yaml$|\.github\/workflows\/(?:ci|openclaw-cross-os-release-checks-reusable)\.yml$|\.github\/actions\/setup-node-env\/action\.yml$|\.github\/actions\/setup-pnpm-store-cache\/action\.yml$)/;
const WINDOWS_TEST_SCOPE_RE =
/^(extensions\/mxc\/test\/(?:mxc-backend|sandbox-policy-loader)\.test\.ts$|src\/agents\/bash-tools\.exec\.script-preflight\.test\.ts$|src\/config\/sessions\/store\.session-lifecycle-mutation\.test\.ts$|src\/process\/(?:exec\.windows|windows-command)\.test\.ts$|src\/infra\/(?:exec-allowlist-pattern|fs-safe-remove|ssh-client\.windows|update-managed-service-handoff|windows-install-roots)\.test\.ts$|src\/shared\/runtime-import\.test\.ts$|src\/state\/openclaw-database-paths\.windows\.test\.ts$|src\/test-utils\/openclaw-test-state\.test\.ts$|test\/scripts\/(?:format-generated-module|npm-runner|openclaw-cross-os-release-workflow|pnpm-runner|ui|vitest-process-group)\.test\.ts$)/;
/^(extensions\/mxc\/test\/(?:mxc-backend|sandbox-policy-loader)\.test\.ts$|src\/agents\/bash-tools\.exec\.script-preflight\.test\.ts$|src\/config\/sessions\/store\.session-lifecycle-mutation\.test\.ts$|src\/process\/(?:exec\.windows|windows-command)\.test\.ts$|src\/infra\/(?:exec-allowlist-pattern|fs-safe-remove|ssh-client\.windows|update-managed-service-handoff|windows-install-roots)\.test\.ts$|src\/shared\/runtime-import\.test\.ts$|src\/state\/openclaw-database-paths\.windows\.test\.ts$|src\/test-utils\/openclaw-test-state\.test\.ts$|test\/scripts\/(?:direct-run-entrypoints|format-generated-module|npm-runner|openclaw-cross-os-release-workflow|pnpm-runner|ui|vitest-process-group)\.test\.ts$)/;
const WINDOWS_DAEMON_SCOPE_RE =
/^src\/daemon\/(?:schtasks(?:[-.][^/]+)?|runtime-hints\.windows-paths(?:\.test)?|test-helpers\/schtasks-(?:base-mocks|fixtures))\.ts$/;
const CONTROL_UI_I18N_SCOPE_RE =
+2 -1
View File
@@ -2,6 +2,7 @@
// Summarizes GitHub Actions run/job timings for CI analysis.
import { execFileSync } from "node:child_process";
import { isDirectRunUrl } from "./lib/direct-run.mjs";
import { parsePositiveInt } from "./lib/numeric-options.mjs";
import { execPlainGh } from "./lib/plain-gh.mjs";
@@ -503,6 +504,6 @@ async function main() {
}
}
if (import.meta.url === `file://${process.argv[1]}`) {
if (isDirectRunUrl(process.argv[1], import.meta.url)) {
await main();
}
+3 -1
View File
@@ -1,4 +1,6 @@
// Package-version compatibility helpers for E2E acceptance scripts.
import { isDirectRunUrl } from "../../lib/direct-run.mjs";
export function legacyPackageAcceptanceCompat(version) {
const match = /^(\d{4})\.(\d{1,2})\.(\d{1,2})(?:[-+].*)?/.exec(version || "");
const [year, month, day] = match?.slice(1, 4).map(Number) ?? [];
@@ -7,6 +9,6 @@ export function legacyPackageAcceptanceCompat(version) {
);
}
if (import.meta.url === `file://${process.argv[1]}`) {
if (isDirectRunUrl(process.argv[1], import.meta.url)) {
console.log(legacyPackageAcceptanceCompat(process.argv[2]) ? "1" : "0");
}
@@ -3,6 +3,7 @@
import fs from "node:fs";
import path from "node:path";
import { loadBundledPluginPublicArtifactModuleSync } from "../src/plugins/public-surface-loader.js";
import { isDirectRunUrl } from "./lib/direct-run.mjs";
import { loadChannelConfigSurfaceModule } from "./load-channel-config-surface.ts";
const GENERATED_BY = "scripts/generate-bundled-channel-config-metadata.ts";
@@ -341,7 +342,7 @@ export const GENERATED_BUNDLED_CHANNEL_CONFIG_METADATA = JSON.parse(
});
}
if (import.meta.url === new URL(process.argv[1] ?? "", "file://").href) {
if (isDirectRunUrl(process.argv[1], import.meta.url)) {
const check = process.argv.includes("--check");
const result = await writeBundledChannelConfigMetadataModule({ check });
if (!result.changed) {
+3 -1
View File
@@ -1,4 +1,6 @@
// Plans release workflow matrix entries from profile and suite inputs.
import { isDirectRunUrl } from "./lib/direct-run.mjs";
const DOCKER_E2E_CHUNKS = [
{
chunk_id: "core",
@@ -236,7 +238,7 @@ function writeOutputs(plan) {
}
}
if (import.meta.url === `file://${process.argv[1]}`) {
if (isDirectRunUrl(process.argv[1], import.meta.url)) {
const plan = createReleaseWorkflowMatrixPlan({
dockerLanes: process.env.DOCKER_LANES,
includeLiveSuites: process.env.INCLUDE_LIVE_SUITES,
+2 -1
View File
@@ -5,6 +5,7 @@ import { spawn } from "node:child_process";
import { performance } from "node:perf_hooks";
import pMap from "p-map";
import prettyMilliseconds from "pretty-ms";
import { isDirectRunUrl } from "./lib/direct-run.mjs";
const DEFAULT_CHECK_TIMEOUT_MS = 10 * 60 * 1000;
const DEFAULT_OUTPUT_MAX_BYTES = 512 * 1024;
@@ -584,7 +585,7 @@ export function parseCliArgs(args, env = process.env) {
return { help, shardSpec };
}
if (import.meta.url === `file://${process.argv[1]}`) {
if (isDirectRunUrl(process.argv[1], import.meta.url)) {
try {
const cliArgs = parseCliArgs(process.argv.slice(2), process.env);
if (cliArgs.help) {
+2 -1
View File
@@ -3,6 +3,7 @@
// Verifies Docker image attestations cover required platforms and predicates.
import { execFileSync } from "node:child_process";
import process from "node:process";
import { isDirectRunUrl } from "./lib/direct-run.mjs";
const ATTESTATION_REFERENCE_TYPE = "attestation-manifest";
const EXPECTED_ATTESTATION_ARTIFACT_TYPE = "application/vnd.docker.attestation.manifest.v1+json";
@@ -227,7 +228,7 @@ async function main() {
});
}
if (import.meta.url === `file://${process.argv[1]}`) {
if (isDirectRunUrl(process.argv[1], import.meta.url)) {
main().catch(
/** @param {unknown} error */ (error) => {
console.error(error instanceof Error ? error.message : String(error));