From 3df6499fb80ff4b3b26ef5c4ec23f0eef7802d7b Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 17 May 2026 00:33:58 +0800 Subject: [PATCH] test: harden sparse Testbox scans --- .../doctor/shared/legacy-config-write-ownership.test.ts | 1 + src/infra/fs-safe-import-boundary.test.ts | 1 + src/plugins/contracts/boundary-invariants.test.ts | 1 + src/plugins/contracts/core-extension-facade-boundary.test.ts | 1 + .../contracts/extension-package-project-boundaries.test.ts | 1 + .../contracts/plugin-sdk-package-contract-guardrails.test.ts | 1 + src/plugins/contracts/plugin-sdk-subpaths.test.ts | 1 + src/plugins/contracts/plugin-tool-contracts.test.ts | 2 ++ .../contracts/provider-catalog-deprecation.contract.test.ts | 1 + src/plugins/contracts/provider-family-plugin-tests.test.ts | 1 + src/plugins/runtime-registry-boundary.test.ts | 1 + src/tools/boundary.test.ts | 1 + 12 files changed, 13 insertions(+) diff --git a/src/commands/doctor/shared/legacy-config-write-ownership.test.ts b/src/commands/doctor/shared/legacy-config-write-ownership.test.ts index 9b1a2f7ebdc..f7294cfd933 100644 --- a/src/commands/doctor/shared/legacy-config-write-ownership.test.ts +++ b/src/commands/doctor/shared/legacy-config-write-ownership.test.ts @@ -37,6 +37,7 @@ function listGitSourceFiles(dir: string): string[] | null { } return files .map((file) => path.join(REPO_ROOT, file)) + .filter((filePath) => fs.existsSync(filePath)) .filter(isOwnedSourceFile) .toSorted(); } diff --git a/src/infra/fs-safe-import-boundary.test.ts b/src/infra/fs-safe-import-boundary.test.ts index f570fa76978..b98644ca05a 100644 --- a/src/infra/fs-safe-import-boundary.test.ts +++ b/src/infra/fs-safe-import-boundary.test.ts @@ -34,6 +34,7 @@ function listGitSourceFiles(repoPath: string): string[] | null { } return files .map((filePath) => path.join(REPO_ROOT, filePath)) + .filter((filePath) => fs.existsSync(filePath)) .filter(isSourceFile) .toSorted(); } diff --git a/src/plugins/contracts/boundary-invariants.test.ts b/src/plugins/contracts/boundary-invariants.test.ts index e5cfce7dec3..53b0e679460 100644 --- a/src/plugins/contracts/boundary-invariants.test.ts +++ b/src/plugins/contracts/boundary-invariants.test.ts @@ -183,6 +183,7 @@ function listGitTrackedTsFiles(rootRelativePath: string, filter: FileFilter): st .filter((line) => line.endsWith(".ts")) .filter((line) => !(filter.excludeTests && line.endsWith(".test.ts"))) .filter((line) => !(filter.testOnly && !line.endsWith(".test.ts"))) + .filter((line) => fs.existsSync(resolve(REPO_ROOT, line))) .toSorted(); } diff --git a/src/plugins/contracts/core-extension-facade-boundary.test.ts b/src/plugins/contracts/core-extension-facade-boundary.test.ts index d47fc8f5637..35f2841e38a 100644 --- a/src/plugins/contracts/core-extension-facade-boundary.test.ts +++ b/src/plugins/contracts/core-extension-facade-boundary.test.ts @@ -37,6 +37,7 @@ function listTrackedSourceFiles(dir: string): string[] | null { return files .filter((line) => line.length > 0 && line.endsWith(".ts") && !line.includes("/plugin-sdk/")) .map((line) => path.join(repoRoot, ...line.split("/"))) + .filter((filePath) => fs.existsSync(filePath)) .toSorted(); } diff --git a/src/plugins/contracts/extension-package-project-boundaries.test.ts b/src/plugins/contracts/extension-package-project-boundaries.test.ts index 554dd8a6f15..0de4bb45778 100644 --- a/src/plugins/contracts/extension-package-project-boundaries.test.ts +++ b/src/plugins/contracts/extension-package-project-boundaries.test.ts @@ -89,6 +89,7 @@ function listTrackedCodeFiles(relativeDir: string): string[] | null { } const files = trackedFiles .filter((line) => line.length > 0 && /\.(?:[cm]?ts|tsx|mts|cts)$/u.test(line)) + .filter((line) => fs.existsSync(resolve(REPO_ROOT, line))) .toSorted(); trackedCodeFilesByRoot.set(relativeDir, files); return [...files]; diff --git a/src/plugins/contracts/plugin-sdk-package-contract-guardrails.test.ts b/src/plugins/contracts/plugin-sdk-package-contract-guardrails.test.ts index 2ff2a7ae8b8..8124456bc41 100644 --- a/src/plugins/contracts/plugin-sdk-package-contract-guardrails.test.ts +++ b/src/plugins/contracts/plugin-sdk-package-contract-guardrails.test.ts @@ -94,6 +94,7 @@ function listTrackedFiles(root: string): string[] | null { const files = trackedFiles .filter((line) => line.length > 0 && !isSkippedTrackedPath(line)) .map((line) => resolve(REPO_ROOT, line)) + .filter((filePath) => fs.existsSync(filePath)) .toSorted(); trackedFilesByRoot.set(relativeRoot, files); return [...files]; diff --git a/src/plugins/contracts/plugin-sdk-subpaths.test.ts b/src/plugins/contracts/plugin-sdk-subpaths.test.ts index 84b9ca3ead3..0be82d9115c 100644 --- a/src/plugins/contracts/plugin-sdk-subpaths.test.ts +++ b/src/plugins/contracts/plugin-sdk-subpaths.test.ts @@ -342,6 +342,7 @@ function listTrackedRepoTsFiles(dir: string): string[] | null { line.endsWith(".ts") && !line.includes("/dist/") && !line.includes("/node_modules/"), ) .map((line) => resolve(REPO_ROOT, ...line.split("/"))) + .filter((filePath) => fs.existsSync(filePath)) .toSorted(); } diff --git a/src/plugins/contracts/plugin-tool-contracts.test.ts b/src/plugins/contracts/plugin-tool-contracts.test.ts index e4d1a76418f..4ca62264c20 100644 --- a/src/plugins/contracts/plugin-tool-contracts.test.ts +++ b/src/plugins/contracts/plugin-tool-contracts.test.ts @@ -58,6 +58,7 @@ function listGitFiles(dir: string): string[] | null { return files .filter((line) => !isSkippedRepoPath(line)) .map((line) => path.join(process.cwd(), ...line.split("/"))) + .filter((filePath) => fs.existsSync(filePath)) .toSorted(); } @@ -73,6 +74,7 @@ function listGitPluginManifestPaths(extensionsDir: string): string[] | null { return files .filter((line) => /^extensions\/[^/]+\/openclaw\.plugin\.json$/u.test(line)) .map((line) => path.join(process.cwd(), ...line.split("/"))) + .filter((filePath) => fs.existsSync(filePath)) .toSorted(); } diff --git a/src/plugins/contracts/provider-catalog-deprecation.contract.test.ts b/src/plugins/contracts/provider-catalog-deprecation.contract.test.ts index aae2d54dad4..2c71e5b1468 100644 --- a/src/plugins/contracts/provider-catalog-deprecation.contract.test.ts +++ b/src/plugins/contracts/provider-catalog-deprecation.contract.test.ts @@ -34,6 +34,7 @@ function listGitProductionSourceFiles(root: string): string[] | null { return files .filter(isProductionSourcePath) .map((line) => path.join(repoRoot, ...line.split("/"))) + .filter((filePath) => fs.existsSync(filePath)) .toSorted(); } diff --git a/src/plugins/contracts/provider-family-plugin-tests.test.ts b/src/plugins/contracts/provider-family-plugin-tests.test.ts index e3058839cd9..720d440fb2c 100644 --- a/src/plugins/contracts/provider-family-plugin-tests.test.ts +++ b/src/plugins/contracts/provider-family-plugin-tests.test.ts @@ -67,6 +67,7 @@ function listGitFiles(dir: string): string[] | null { return files .filter((line) => !shouldSkipScannedPath(line)) .map((line) => resolve(REPO_ROOT, line)) + .filter((filePath) => fs.existsSync(filePath)) .toSorted(); } diff --git a/src/plugins/runtime-registry-boundary.test.ts b/src/plugins/runtime-registry-boundary.test.ts index f8e010f9728..b94aade3d7c 100644 --- a/src/plugins/runtime-registry-boundary.test.ts +++ b/src/plugins/runtime-registry-boundary.test.ts @@ -34,6 +34,7 @@ function listGitSourceFiles(dir: string): string[] | null { } return files .map((file) => resolve(repoRoot, file)) + .filter((filePath) => fs.existsSync(filePath)) .filter(isProductionTypeScriptFile) .toSorted(); } diff --git a/src/tools/boundary.test.ts b/src/tools/boundary.test.ts index 57d90c9e337..c74c5f1e138 100644 --- a/src/tools/boundary.test.ts +++ b/src/tools/boundary.test.ts @@ -57,6 +57,7 @@ function listGitProductionToolModuleFiles(): string[] | null { .filter((line) => line.startsWith("src/tools/")) .map((line) => line.slice("src/tools/".length)) .filter((name) => name.endsWith(".ts") && !name.endsWith(".test.ts")) + .filter((name) => fs.existsSync(new URL(name, toolsDir))) .toSorted(); }