diff --git a/browse/src/file-permissions.ts b/browse/src/file-permissions.ts index d3d404acde..f359a13660 100644 --- a/browse/src/file-permissions.ts +++ b/browse/src/file-permissions.ts @@ -143,9 +143,24 @@ export function appendSecureFile( * `mkdir -p` with owner-only directory permissions, cross-platform. * Replaces `fs.mkdirSync(path, { recursive: true, mode: 0o700 })` + Windows ACL. * Safe to call on an existing directory — re-applies the ACL idempotently. + * + * Bun-on-Windows quirk: bun's compiled-binary fs.mkdirSync sometimes throws + * EEXIST even with `recursive: true` when the directory already exists (Node + * does not). Swallow that one case so callers don't have to wrap every + * invocation. */ export function mkdirSecure(dirPath: string): void { - fs.mkdirSync(dirPath, { recursive: true, mode: 0o700 }); + try { + fs.mkdirSync(dirPath, { recursive: true, mode: 0o700 }); + } catch (err: any) { + if (err && err.code === 'EEXIST') { + const stat = fs.statSync(dirPath); + if (!stat.isDirectory()) throw err; + // Existing directory — fall through to re-apply ACL. + } else { + throw err; + } + } restrictDirectoryPermissions(dirPath); } diff --git a/package.json b/package.json index 3851a78bd7..791f3e5d79 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "make-pdf": "./make-pdf/dist/pdf" }, "scripts": { - "build": "bun run vendor:xterm && bun run gen:skill-docs --host all; bun build --compile browse/src/cli.ts --outfile browse/dist/browse && bun build --compile browse/src/find-browse.ts --outfile browse/dist/find-browse && bun build --compile design/src/cli.ts --outfile design/dist/design && bun build --compile make-pdf/src/cli.ts --outfile make-pdf/dist/pdf && bun build --compile bin/gstack-global-discover.ts --outfile bin/gstack-global-discover && bash browse/scripts/build-node-server.sh && ( git rev-parse HEAD 2>/dev/null || true ) > browse/dist/.version && ( git rev-parse HEAD 2>/dev/null || true ) > design/dist/.version && ( git rev-parse HEAD 2>/dev/null || true ) > make-pdf/dist/.version && chmod +x browse/dist/browse browse/dist/find-browse design/dist/design make-pdf/dist/pdf bin/gstack-global-discover && (rm -f .*.bun-build || true)", + "build": "bun run vendor:xterm && bun run gen:skill-docs --host all; bun build --compile browse/src/cli.ts --outfile browse/dist/browse && bun build --compile browse/src/find-browse.ts --outfile browse/dist/find-browse && bun build --compile design/src/cli.ts --outfile design/dist/design && bun build --compile make-pdf/src/cli.ts --outfile make-pdf/dist/pdf && bun build --compile bin/gstack-global-discover.ts --outfile bin/gstack-global-discover && bash browse/scripts/build-node-server.sh && bash -c '(git rev-parse HEAD 2>/dev/null || true) > browse/dist/.version' && bash -c '(git rev-parse HEAD 2>/dev/null || true) > design/dist/.version' && bash -c '(git rev-parse HEAD 2>/dev/null || true) > make-pdf/dist/.version' && chmod +x browse/dist/browse browse/dist/find-browse design/dist/design make-pdf/dist/pdf bin/gstack-global-discover && bash -c 'rm -f .*.bun-build || true'", "vendor:xterm": "mkdir -p extension/lib && cp node_modules/xterm/lib/xterm.js extension/lib/xterm.js && cp node_modules/xterm/css/xterm.css extension/lib/xterm.css && cp node_modules/xterm-addon-fit/lib/xterm-addon-fit.js extension/lib/xterm-addon-fit.js", "dev:make-pdf": "bun run make-pdf/src/cli.ts", "dev:design": "bun run design/src/cli.ts",