()
| 22 | import { resolveClaudeBinary } from '../browse/src/claude-bin'; |
| 23 | |
| 24 | async function main() { |
| 25 | const failures: string[] = []; |
| 26 | const pass = (msg: string) => console.log(` ok ${msg}`); |
| 27 | const fail = (msg: string) => { |
| 28 | console.log(` FAIL ${msg}`); |
| 29 | failures.push(msg); |
| 30 | }; |
| 31 | |
| 32 | // 1. Overlay resolver |
| 33 | console.log('1. Overlay resolver'); |
| 34 | const resolved = readOverlay('opus-4-7'); |
| 35 | if (!resolved) { |
| 36 | fail("readOverlay('opus-4-7') returned empty"); |
| 37 | } else { |
| 38 | pass(`resolved overlay length: ${resolved.length} chars`); |
| 39 | if (resolved.includes('{{INHERIT:')) { |
| 40 | fail('resolved overlay still contains {{INHERIT:...}} directive'); |
| 41 | } else { |
| 42 | pass('no unresolved INHERIT directives'); |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | // 2. Local claude binary exists |
| 47 | console.log('\n2. Binary pinning'); |
| 48 | let claudePath: string | null = resolveClaudeBinary(); |
| 49 | if (claudePath) { |
| 50 | pass(`local claude binary: ${claudePath}`); |
| 51 | } else { |
| 52 | fail('`Bun.which("claude")` failed — cannot pin binary (set GSTACK_CLAUDE_BIN to override)'); |
| 53 | } |
| 54 | |
| 55 | // 3. SDK query end-to-end |
| 56 | console.log('\n3. SDK query end-to-end'); |
| 57 | if (!process.env.ANTHROPIC_API_KEY) { |
| 58 | console.log(' skip ANTHROPIC_API_KEY not set — cannot test live query'); |
| 59 | } else { |
| 60 | try { |
| 61 | const events: SDKMessage[] = []; |
| 62 | const q = query({ |
| 63 | prompt: 'say pong', |
| 64 | options: { |
| 65 | model: 'claude-opus-4-7', |
| 66 | systemPrompt: '', |
| 67 | tools: [], |
| 68 | permissionMode: 'bypassPermissions', |
| 69 | allowDangerouslySkipPermissions: true, |
| 70 | settingSources: [], |
| 71 | maxTurns: 1, |
| 72 | pathToClaudeCodeExecutable: claudePath ?? undefined, |
| 73 | env: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY }, |
| 74 | }, |
| 75 | }); |
| 76 | for await (const ev of q) events.push(ev); |
| 77 | pass(`received ${events.length} events`); |
| 78 | |
| 79 | const init = events.find( |
| 80 | (e) => e.type === 'system' && (e as { subtype?: string }).subtype === 'init', |
| 81 | ) as { claude_code_version?: string; model?: string } | undefined; |
no test coverage detected