| 61 | } |
| 62 | |
| 63 | function exec(cmd: string, opts?: { cwd?: string }): { ok: boolean; stdout: string; stderr: string } { |
| 64 | try { |
| 65 | const stdout = execSync(cmd, { |
| 66 | cwd: opts?.cwd ?? ROOT, |
| 67 | encoding: 'utf-8', |
| 68 | stdio: ['pipe', 'pipe', 'pipe'], |
| 69 | env: { ...process.env, PATH: `${process.env.HOME}/.bun/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:${process.env.PATH ?? ''}` }, |
| 70 | }); |
| 71 | return { ok: true, stdout, stderr: '' }; |
| 72 | } catch (e: unknown) { |
| 73 | const err = e as { stdout?: string; stderr?: string }; |
| 74 | return { ok: false, stdout: err.stdout ?? '', stderr: err.stderr ?? '' }; |
| 75 | } |
| 76 | } |
| 77 | |
| 78 | // ── Phase 1: Pre-pack validation ─────────────────────────────────── |
| 79 | |