1import * as NodeFS from "node:fs";
2
3const argv = process.argv.slice(2);
4const args = argv.join(" ");
5
6function fail(message, code) {
7 process.stderr.write(message + "\n");
8 process.exit(code);
9}
10
11const permissionIndex = argv.indexOf("--permission-mode");
12if (permissionIndex === -1 || argv[permissionIndex + 1] !== "dontAsk") {
13 fail("text generation must deny permission prompts", 12);
14}
15const toolsIndex = argv.indexOf("--tools");
16if (toolsIndex === -1 || argv[toolsIndex + 1] !== "") {
17 fail("text generation must receive an explicit empty tool set", 6);
18}
19if (argv.includes("--dangerously-skip-permissions")) {
20 fail("text generation must not bypass permissions", 7);
21}
22if (!argv.includes("--disable-slash-commands")) {
23 fail("text generation must disable skills", 8);
24}
25if (!argv.includes("--strict-mcp-config")) {
26 fail("text generation must not load configured MCP servers", 9);
27}
28const settingsIndex = argv.indexOf("--settings");
29if (settingsIndex === -1 || JSON.parse(argv[settingsIndex + 1]).disableAllHooks !== true) {
30 fail("text generation must disable hooks", 10);
31}
32const cwdMustNotBe = process.env.T3_FAKE_CLAUDE_CWD_MUST_NOT_BE;
33if (cwdMustNotBe && NodeFS.realpathSync(process.cwd()) === NodeFS.realpathSync(cwdMustNotBe)) {
34 fail("text generation ran in the project directory", 11);
35}
36
37let stdinContent = "";
38if (!process.stdin.isTTY) {
39 const chunks = [];
40 for await (const chunk of process.stdin) {
41 chunks.push(chunk);
42 }
43 stdinContent = Buffer.concat(chunks).toString("utf8");
44}
45
46const argsMustContain = process.env.T3_FAKE_CLAUDE_ARGS_MUST_CONTAIN;
47if (argsMustContain && !args.includes(argsMustContain)) {
48 fail("args missing expected content", 2);
49}
50
51const argsMustNotContain = process.env.T3_FAKE_CLAUDE_ARGS_MUST_NOT_CONTAIN;
52if (argsMustNotContain && args.includes(argsMustNotContain)) {
53 fail("args contained forbidden content", 3);
54}
55
56const stdinMustContain = process.env.T3_FAKE_CLAUDE_STDIN_MUST_CONTAIN;
57if (stdinMustContain && !stdinContent.includes(stdinMustContain)) {
58 fail("stdin missing expected content", 4);
59}
60
61const configDirMustBe = process.env.T3_FAKE_CLAUDE_CONFIG_DIR_MUST_BE;
62if (configDirMustBe && process.env.CLAUDE_CONFIG_DIR !== configDirMustBe) {
63 fail("CLAUDE_CONFIG_DIR was " + (process.env.CLAUDE_CONFIG_DIR ?? ""), 5);
64}
65
66const stderrText = process.env.T3_FAKE_CLAUDE_STDERR;
67if (stderrText) {
68 process.stderr.write(stderrText + "\n");
69}
70
71process.stdout.write(process.env.T3_FAKE_CLAUDE_OUTPUT ?? "");
72process.exitCode = Number(process.env.T3_FAKE_CLAUDE_EXIT_CODE ?? 0);