From 1e39a431b7a9dd40d69b3e8ac03702e83a360563 Mon Sep 17 00:00:00 2001 From: sunlei Date: Thu, 25 Jun 2026 17:39:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=99=90=E5=88=B6NapCat=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=8C=96=E4=BA=A7=E7=89=A9=E5=86=99=E5=85=A5=E8=8C=83?= =?UTF-8?q?=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/selfTest.ts | 28 ++++++++++++++++++++++++++++ src/tools/napcatAutomation.ts | 1 + 2 files changed, 29 insertions(+) diff --git a/src/selfTest.ts b/src/selfTest.ts index 0f54bdf..6fa1eca 100644 --- a/src/selfTest.ts +++ b/src/selfTest.ts @@ -182,6 +182,34 @@ export async function runSelfTest(): Promise { ); } } + const unsafeSkeletonArtifactRootPath = path.resolve("/tmp/not-kt-skeleton"); + const unsafeSkeletonArtifactRootExisted = existsSync( + unsafeSkeletonArtifactRootPath, + ); + let unsafeSkeletonArtifactRootRejected = false; + try { + buildNapcatRuntimeReleaseReadiness({ + artifactRoot: "/tmp/not-kt-skeleton", + }); + } catch (error) { + unsafeSkeletonArtifactRootRejected = String(error).includes( + "Unsafe NapCat Codex artifactRoot", + ); + } finally { + if ( + !unsafeSkeletonArtifactRootExisted && + existsSync(unsafeSkeletonArtifactRootPath) + ) { + rmSync(unsafeSkeletonArtifactRootPath, { force: true, recursive: true }); + } + } + if ( + !unsafeSkeletonArtifactRootRejected || + (!unsafeSkeletonArtifactRootExisted && + existsSync(unsafeSkeletonArtifactRootPath)) + ) { + throw new Error("NapCat skeleton unsafe artifact root self-check failed"); + } if ( napcatCandidateDefaults.candidateBranch !== napcatAutomationDefaults.candidateBranch || diff --git a/src/tools/napcatAutomation.ts b/src/tools/napcatAutomation.ts index db83440..4b6976d 100644 --- a/src/tools/napcatAutomation.ts +++ b/src/tools/napcatAutomation.ts @@ -165,6 +165,7 @@ function buildNapcatPromptSkeleton(config: NapcatPromptSkeletonConfig) { config.input, config.artifactSlug, ); + assertSafeNapcatCodexArtifactRoot(artifactRoot); const requestedExecute = config.input.execute === true; const promptText = loadNapcatAutomationPrompt(config.promptName).trim(); const promptPath = joinNapcatArtifactPath(