From 09b2ec2b8ef0820b6d4a6119be79dd1b17a47846 Mon Sep 17 00:00:00 2001 From: Eyejoker Date: Mon, 30 Mar 2026 00:33:44 +0900 Subject: [PATCH] fix: skip directories in reviewer snapshot fingerprint to prevent EISDIR git ls-files can return directory entries (e.g. submodules). readFileSync on these causes EISDIR error, blocking reviewer trigger for all non-brain paired channels. --- src/paired-workspace-manager.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/paired-workspace-manager.ts b/src/paired-workspace-manager.ts index 325f16a..4930e1b 100644 --- a/src/paired-workspace-manager.ts +++ b/src/paired-workspace-manager.ts @@ -242,6 +242,12 @@ function buildReviewerSnapshotFingerprint(args: { const appendFile = (kind: 'tracked' | 'untracked', relativePath: string) => { const sourcePath = path.join(args.sourceDir, relativePath); if (!fs.existsSync(sourcePath)) return; + // Skip directories (e.g. submodules listed by git ls-files) + try { + if (fs.statSync(sourcePath).isDirectory()) return; + } catch { + return; + } hash.update(`${kind}\0${relativePath}\0`); hash.update(fs.readFileSync(sourcePath)); hash.update('\0'); @@ -413,10 +419,7 @@ export function provisionOwnerWorkspaceForPairedTask( fs.mkdirSync(path.dirname(workspaceDir), { recursive: true }); if (!fs.existsSync(path.join(workspaceDir, '.git'))) { - runGit( - ['worktree', 'add', workspaceDir, 'HEAD'], - canonicalWorkDir, - ); + runGit(['worktree', 'add', workspaceDir, 'HEAD'], canonicalWorkDir); logger.info( { taskId, workspaceDir }, 'Provisioned stable owner workspace for channel',