fix(bin): route remaining Windows-reachable mkdirSync sites through mkdirpSync

Sweep follow-up to #2641's lib/fs-utils.ts helper: bun on Windows throws EEXIST from a recursive mkdir on an existing dir, so every unguarded recursive mkdirSync on a Windows-reachable path is a latent crash. Converted: bin/gstack-decision-log (unguarded, runs on every decision log — the second call on any machine hits the pre-existing projects dir), bin/gstack-evidence logsDir + ledger dir sites, and bin/gstack-redact-prepush's skip-log site (already try-wrapped, so its failure mode was a silent skip-log loss rather than a crash — the fix makes the log survive). The ~15 remaining gbrain/mac-lane sites are deliberately left alone.

Regression: fs-utils.test.ts drives gstack-decision-log twice, the second run under the bun-Windows EEXIST preload fixture — the pre-sweep code exits 1 with EEXIST there; verified red against v1.68.3.0.
This commit is contained in:
Garry Tan
2026-08-22 01:59:16 +00:00
parent 790c42505a
commit 361dfebcbe
4 changed files with 40 additions and 6 deletions
+4 -2
View File
@@ -14,8 +14,8 @@
* validateDecide; a rejected decision exits 1 with a message, nothing persisted.
*/
import { mkdirSync } from "fs";
import { dirname } from "path";
import { mkdirpSync } from "../lib/fs-utils";
import { spawnSync } from "child_process";
import {
decisionPaths,
@@ -33,7 +33,9 @@ const HERE = import.meta.dir;
const args = process.argv.slice(2);
const slug = resolveSlug(`${HERE}/gstack-slug`);
const paths = decisionPaths(slug);
mkdirSync(dirname(paths.log), { recursive: true });
// mkdirpSync, not bare mkdirSync: bun on Windows throws EEXIST from a
// recursive mkdir on an existing dir (#2635), and this runs on every log call.
mkdirpSync(dirname(paths.log));
function enqueue(): void {
// Fire-and-forget cross-machine sync (no-op when artifacts_sync is off).