


























@@ -495,44 +495,85 @@ export async function runChecks(
495495return failures;
496496}
497497498-function resolveCliShardSpec(args, env) {
499-const shardIndex = args.indexOf("--shard");
500-if (shardIndex !== -1) {
501-return args[shardIndex + 1] ?? "";
502-}
503-const inlineShard = args.find((arg) => arg.startsWith("--shard="));
504-if (inlineShard) {
505-return inlineShard.slice("--shard=".length);
498+function usage() {
499+return `Usage: node scripts/run-additional-boundary-checks.mjs [--shard <N/TOTAL>[,<N/TOTAL>]]
500+501+Runs supplemental architecture and boundary checks with bounded concurrency.
502+503+Options:
504+ --shard <spec> Run only checks selected by one or more N/TOTAL shard specs
505+ -h, --help Show this help
506+`;
507+}
508+509+export function parseCliArgs(args, env = process.env) {
510+let shardSpec = env.OPENCLAW_ADDITIONAL_BOUNDARY_SHARD ?? "";
511+let help = false;
512+for (let index = 0; index < args.length; index += 1) {
513+const arg = args[index];
514+if (arg === "-h" || arg === "--help") {
515+help = true;
516+continue;
517+}
518+if (arg === "--shard") {
519+const value = args[index + 1];
520+if (!value || value.startsWith("--")) {
521+throw new Error("--shard requires a value");
522+}
523+shardSpec = value;
524+index += 1;
525+continue;
526+}
527+if (arg.startsWith("--shard=")) {
528+const value = arg.slice("--shard=".length);
529+if (!value) {
530+throw new Error("--shard requires a value");
531+}
532+shardSpec = value;
533+continue;
534+}
535+throw new Error(`Unknown argument: ${arg}`);
506536}
507-return env.OPENCLAW_ADDITIONAL_BOUNDARY_SHARD ?? "";
537+return { help, shardSpec };
508538}
509539510540if (import.meta.url === `file://${process.argv[1]}`) {
511-const concurrencyRaw =
512-process.env.OPENCLAW_ADDITIONAL_BOUNDARY_CONCURRENCY ??
513-process.env.OPENCLAW_EXTENSION_BOUNDARY_CONCURRENCY;
514-const concurrencyLabel =
515-process.env.OPENCLAW_ADDITIONAL_BOUNDARY_CONCURRENCY === undefined
516- ? "OPENCLAW_EXTENSION_BOUNDARY_CONCURRENCY"
517- : "OPENCLAW_ADDITIONAL_BOUNDARY_CONCURRENCY";
518-const concurrency = resolveConcurrency(concurrencyRaw, 4, concurrencyLabel);
519-const checkTimeoutMs = resolvePositiveInteger(
520-process.env.OPENCLAW_ADDITIONAL_BOUNDARY_TIMEOUT_MS,
521-DEFAULT_CHECK_TIMEOUT_MS,
522-"OPENCLAW_ADDITIONAL_BOUNDARY_TIMEOUT_MS",
523-);
524-const outputMaxBytes = resolvePositiveInteger(
525-process.env.OPENCLAW_ADDITIONAL_BOUNDARY_OUTPUT_MAX_BYTES,
526-DEFAULT_OUTPUT_MAX_BYTES,
527-"OPENCLAW_ADDITIONAL_BOUNDARY_OUTPUT_MAX_BYTES",
528-);
529-const shards = parseShardSelection(resolveCliShardSpec(process.argv.slice(2), process.env));
530-const checks = selectChecksForShard(BOUNDARY_CHECKS, shards);
531-if (shards) {
532-process.stdout.write(
533-`Running ${checks.length}/${BOUNDARY_CHECKS.length} additional boundary checks (shard ${shards.map((shard) => shard.label).join(",")})\n`,
534-);
541+try {
542+const cliArgs = parseCliArgs(process.argv.slice(2), process.env);
543+if (cliArgs.help) {
544+process.stdout.write(usage());
545+process.exitCode = 0;
546+} else {
547+const concurrencyRaw =
548+process.env.OPENCLAW_ADDITIONAL_BOUNDARY_CONCURRENCY ??
549+process.env.OPENCLAW_EXTENSION_BOUNDARY_CONCURRENCY;
550+const concurrencyLabel =
551+process.env.OPENCLAW_ADDITIONAL_BOUNDARY_CONCURRENCY === undefined
552+ ? "OPENCLAW_EXTENSION_BOUNDARY_CONCURRENCY"
553+ : "OPENCLAW_ADDITIONAL_BOUNDARY_CONCURRENCY";
554+const concurrency = resolveConcurrency(concurrencyRaw, 4, concurrencyLabel);
555+const checkTimeoutMs = resolvePositiveInteger(
556+process.env.OPENCLAW_ADDITIONAL_BOUNDARY_TIMEOUT_MS,
557+DEFAULT_CHECK_TIMEOUT_MS,
558+"OPENCLAW_ADDITIONAL_BOUNDARY_TIMEOUT_MS",
559+);
560+const outputMaxBytes = resolvePositiveInteger(
561+process.env.OPENCLAW_ADDITIONAL_BOUNDARY_OUTPUT_MAX_BYTES,
562+DEFAULT_OUTPUT_MAX_BYTES,
563+"OPENCLAW_ADDITIONAL_BOUNDARY_OUTPUT_MAX_BYTES",
564+);
565+const shards = parseShardSelection(cliArgs.shardSpec);
566+const checks = selectChecksForShard(BOUNDARY_CHECKS, shards);
567+if (shards) {
568+process.stdout.write(
569+`Running ${checks.length}/${BOUNDARY_CHECKS.length} additional boundary checks (shard ${shards.map((shard) => shard.label).join(",")})\n`,
570+);
571+}
572+const failures = await runChecks(checks, { checkTimeoutMs, concurrency, outputMaxBytes });
573+process.exitCode = failures === 0 ? 0 : 1;
574+}
575+} catch (error) {
576+process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n\n${usage()}`);
577+process.exitCode = 1;
535578}
536-const failures = await runChecks(checks, { checkTimeoutMs, concurrency, outputMaxBytes });
537-process.exitCode = failures === 0 ? 0 : 1;
538579}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。