Files
gstack/bin/gstack-claude-code
T
garrytanandcapy-ai[bot] 660484ee99 security: isolate every gstack Bun entry point from the audited checkout's .env and bunfig.toml
Bun auto-loads .env, .env.local and .env.<NODE_ENV> from its cwd and runs a
cwd bunfig.toml preload before the program starts. gstack runs inside the repo
it audits, so a committed .env could steer state roots, the claude binary or
spend caps, and a bunfig preload ran arbitrary code in every bin and hook.

Every bun shebang, shell and skill caller, TypeScript spawn and compiled build
now disables both (--no-env-file --config=/dev/null, bunIsolationArgs(),
--no-compile-autoload-dotenv/bunfig), with a ratchet and hostile-fixture
regressions.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
2026-10-19 20:48:49 +00:00

17 lines
844 B
TypeScript
Executable File

#!/usr/bin/env -S bun --no-env-file --config=/dev/null
// Claude-only outside-review runner. Prompts arrive on stdin, never argv.
// codex_reviews gates the send (lib/outside-consent.ts); --user-invoked marks
// a review the user asked for by name (/claude-code) and runs regardless.
import { claudeCodeMain } from '../lib/claude-code';
import { outsideConsent } from '../lib/outside-consent';
const argv = process.argv.slice(2);
const userInvoked = argv.includes('--user-invoked');
const consent = outsideConsent({ userInvoked });
if (!consent.allowed) {
process.stderr.write(consent.lines.join('\n') + '\n');
process.stdout.write(JSON.stringify({ status: 'not_run', reason: 'consent_missing', stderr: consent.lines.join('\n') }) + '\n');
process.exit(3);
}
process.exit(await claudeCodeMain(argv.filter(a => a !== '--user-invoked')));