




















@@ -49,10 +49,19 @@ const RUNTIME_SIDECAR_BASELINE_PATH_RE =
4949const CANVAS_A2UI_NATIVE_RESOURCE_PATH_RE =
5050/^(?:pnpm-lock\.yaml$|apps\/shared\/OpenClawKit\/Sources\/OpenClawKit\/Resources\/CanvasA2UI\/|extensions\/canvas\/(?:package\.json$|scripts\/bundle-a2ui\.mjs$|src\/host\/a2ui(?:\/(?:index\.html|a2ui\.bundle\.js|\.bundle\.hash)$|-app\/))|scripts\/(?:bundle-a2ui|sync-native-a2ui)\.mjs$)/u;
5151const CORE_OXLINT_TS_CONFIG = "config/tsconfig/oxlint.core.json";
52-const TARGETED_CORE_LINT_PATH_LIMIT = 8;
52+const EXTENSIONS_OXLINT_TS_CONFIG = "config/tsconfig/oxlint.extensions.json";
53+const SCRIPTS_OXLINT_TS_CONFIG = "config/tsconfig/oxlint.scripts.json";
54+const TARGETED_LINT_PATH_LIMIT = 8;
5355const LINTABLE_CORE_PATH_RE = /^(?:src|ui|packages)\/.+\.[cm]?[jt]sx?$/u;
56+const LINTABLE_EXTENSION_PATH_RE = /^extensions\/[^/]+\/.+\.[cm]?[jt]sx?$/u;
57+const LINTABLE_SCRIPT_PATH_RE = /^scripts\/.+\.[cm]?[jt]sx?$/u;
58+const MARKDOWN_LINT_OPTIMIZATION_NEUTRAL_PATH_RE = /^(?:docs\/|README\.md$|.*\.mdx?$)/u;
5459const CORE_LINT_OPTIMIZATION_NEUTRAL_PATH_RE =
5560/^(?:scripts|test\/scripts)\/|^\.github\/workflows\/ci\.yml$/u;
61+const EXTENSION_LINT_OPTIMIZATION_NEUTRAL_PATH_RE =
62+/^(?:test\/scripts\/|\.github\/workflows\/ci\.yml$)/u;
63+const SCRIPT_LINT_OPTIMIZATION_NEUTRAL_PATH_RE =
64+/^(?:test\/scripts\/|\.github\/workflows\/ci\.yml$)/u;
5665const ANDROID_VERSION_SYNC_PATHS = new Set([
5766"apps/android/CHANGELOG.md",
5867"apps/android/Config/Version.properties",
@@ -413,10 +422,32 @@ export function createChangedCheckPlan(result, options = {}) {
413422addLint("lint core", ["lint:core"]);
414423}
415424if (lanes.extensions || lanes.extensionTests) {
416-addLint("lint extensions", ["lint:extensions"]);
425+const extensionLintCommand = createTargetedExtensionLintCommand(result.paths, baseEnv);
426+if (extensionLintCommand) {
427+addCommand(
428+extensionLintCommand.name,
429+extensionLintCommand.bin,
430+extensionLintCommand.args,
431+extensionLintCommand.env,
432+);
433+} else {
434+addLint("lint extensions", ["lint:extensions"]);
435+}
417436}
418437if (lanes.tooling || lanes.liveDockerTooling) {
419-addLint("lint scripts", ["lint:scripts"]);
438+const scriptLintCommand = createTargetedScriptLintCommand(result.paths, baseEnv);
439+if (scriptLintCommand) {
440+addLint("lint docker-e2e", ["lint:docker-e2e"]);
441+addLint("raw HTTP/2 import guard", ["lint:tmp:no-raw-http2-imports"]);
442+addCommand(
443+scriptLintCommand.name,
444+scriptLintCommand.bin,
445+scriptLintCommand.args,
446+scriptLintCommand.env,
447+);
448+} else {
449+addLint("lint scripts", ["lint:scripts"]);
450+}
420451}
421452if (lanes.apps && shouldSkipAppLintForMissingSwiftlint({ ...options, env: baseEnv })) {
422453addCommand(
@@ -466,29 +497,73 @@ export function createChangedCheckPlan(result, options = {}) {
466497}
467498468499export function createTargetedCoreLintCommand(paths, env = process.env, options = {}) {
500+return createTargetedOxlintCommand({
501+ env,
502+label: "core",
503+lintablePathRe: LINTABLE_CORE_PATH_RE,
504+neutralPathRe: CORE_LINT_OPTIMIZATION_NEUTRAL_PATH_RE,
505+ paths,
506+tsconfig: CORE_OXLINT_TS_CONFIG,
507+ ...options,
508+});
509+}
510+511+export function createTargetedExtensionLintCommand(paths, env = process.env, options = {}) {
512+return createTargetedOxlintCommand({
513+ env,
514+label: "extension",
515+lintablePathRe: LINTABLE_EXTENSION_PATH_RE,
516+neutralPathRe: EXTENSION_LINT_OPTIMIZATION_NEUTRAL_PATH_RE,
517+ paths,
518+tsconfig: EXTENSIONS_OXLINT_TS_CONFIG,
519+ ...options,
520+});
521+}
522+523+export function createTargetedScriptLintCommand(paths, env = process.env, options = {}) {
524+return createTargetedOxlintCommand({
525+ env,
526+label: "script",
527+lintablePathRe: LINTABLE_SCRIPT_PATH_RE,
528+neutralPathRe: SCRIPT_LINT_OPTIMIZATION_NEUTRAL_PATH_RE,
529+ paths,
530+tsconfig: SCRIPTS_OXLINT_TS_CONFIG,
531+ ...options,
532+});
533+}
534+535+function createTargetedOxlintCommand({
536+ env = process.env,
537+ fileExists = existsSync,
538+ label,
539+ lintablePathRe,
540+ neutralPathRe,
541+ paths,
542+ tsconfig,
543+}) {
469544if (
470545paths.some(
471546(changedPath) =>
472-!LINTABLE_CORE_PATH_RE.test(changedPath) &&
473-!CORE_LINT_OPTIMIZATION_NEUTRAL_PATH_RE.test(changedPath),
547+!lintablePathRe.test(changedPath) &&
548+!neutralPathRe.test(changedPath) &&
549+!MARKDOWN_LINT_OPTIMIZATION_NEUTRAL_PATH_RE.test(changedPath),
474550)
475551) {
476552return null;
477553}
478554const targets = paths
479-.filter((changedPath) => LINTABLE_CORE_PATH_RE.test(changedPath))
555+.filter((changedPath) => lintablePathRe.test(changedPath))
480556.toSorted((left, right) => left.localeCompare(right));
481-if (targets.length === 0 || targets.length > TARGETED_CORE_LINT_PATH_LIMIT) {
557+if (targets.length === 0 || targets.length > TARGETED_LINT_PATH_LIMIT) {
482558return null;
483559}
484-const fileExists = options.fileExists ?? existsSync;
485560if (!targets.every((target) => fileExists(target))) {
486561return null;
487562}
488563return {
489-name: targets.length === 1 ? "lint core changed file" : "lint core changed files",
564+name: targets.length === 1 ? `lint ${label} changed file` : `lint ${label} changed files`,
490565bin: "node",
491-args: ["scripts/run-oxlint.mjs", "--tsconfig", CORE_OXLINT_TS_CONFIG, ...targets],
566+args: ["scripts/run-oxlint.mjs", "--tsconfig", tsconfig, ...targets],
492567 env,
493568};
494569}
@@ -544,6 +619,11 @@ function printPlan(result, plan, options) {
544619for (const reason of result.reasons) {
545620console.error(`${prefix} ${reason}`);
546621}
622+if (options.dryRun) {
623+for (const command of plan.commands) {
624+console.error(`${prefix} would run: ${formatPlanCommand(command)}`);
625+}
626+}
547627}
548628549629async function runPnpm(command, timings) {
@@ -557,6 +637,15 @@ async function runPlanCommand(command, timings) {
557637return await runPnpm(command, timings);
558638}
559639640+function formatPlanCommand(command) {
641+const argv = command.bin ? [command.bin, ...command.args] : ["pnpm", ...command.args];
642+return argv.map(formatShellToken).join(" ");
643+}
644+645+function formatShellToken(token) {
646+return /^[A-Za-z0-9_./:@=-]+$/u.test(token) ? token : `'${token.replaceAll("'", "'\\''")}'`;
647+}
648+560649export function createPnpmManagedCommand(command, env = process.env) {
561650const commandEnv = command.env ?? resolveLocalHeavyCheckEnv(env);
562651if (isTruthyEnvFlag(commandEnv.CI) || isTruthyEnvFlag(commandEnv.GITHUB_ACTIONS)) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。