()
| 108 | } |
| 109 | |
| 110 | async function run(): Promise<void> { |
| 111 | const parsed = parseArgs(process.argv.slice(2)) |
| 112 | |
| 113 | if (parsed.command === 'help') { printHelp(); return } |
| 114 | if (parsed.command === 'version') { printVersion(); return } |
| 115 | |
| 116 | if (!parsed.print) { |
| 117 | await runInteractive(parsed) |
| 118 | return |
| 119 | } |
| 120 | |
| 121 | const prompt = parsed.prompt || (await readPromptFromStdin()) |
| 122 | if (!prompt) { |
| 123 | process.stderr.write('Error: prompt is required\n') |
| 124 | process.exitCode = 1 |
| 125 | return |
| 126 | } |
| 127 | |
| 128 | const apiKey = process.env.ANTHROPIC_API_KEY |
| 129 | const authToken = process.env.ANTHROPIC_AUTH_TOKEN |
| 130 | if (!apiKey && !authToken) { |
| 131 | process.stderr.write('Error: set ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN\n') |
| 132 | process.exitCode = 1 |
| 133 | return |
| 134 | } |
| 135 | |
| 136 | const model = parsed.model || process.env.ANTHROPIC_DEFAULT_SONNET_MODEL || process.env.ANTHROPIC_MODEL |
| 137 | if (!model) { |
| 138 | process.stderr.write('Error: model is required\n') |
| 139 | process.exitCode = 1 |
| 140 | return |
| 141 | } |
| 142 | |
| 143 | const client = new Anthropic({ |
| 144 | apiKey: apiKey ?? undefined, |
| 145 | authToken: authToken ?? undefined, |
| 146 | baseURL: process.env.ANTHROPIC_BASE_URL || undefined, |
| 147 | timeout: parseInt(process.env.API_TIMEOUT_MS || String(600_000), 10), |
| 148 | maxRetries: 0, |
| 149 | }) |
| 150 | |
| 151 | const response = await client.messages.create({ |
| 152 | model, |
| 153 | max_tokens: 4096, |
| 154 | system: getSystemPrompt(parsed.systemPrompt, parsed.appendSystemPrompt), |
| 155 | messages: [{ role: 'user', content: prompt }], |
| 156 | }) |
| 157 | |
| 158 | if (parsed.outputFormat === 'json') { |
| 159 | process.stdout.write(`${JSON.stringify(response, null, 2)}\n`) |
| 160 | return |
| 161 | } |
| 162 | |
| 163 | const text = response.content |
| 164 | .filter(block => block.type === 'text') |
| 165 | .map(block => block.text) |
| 166 | .join('\n') |
| 167 |
no test coverage detected