package ai import ( "bytes" "context" "fmt" "os/exec" "strings" ) type claudeCodeProvider struct { model string } func newClaudeCode(model string) *claudeCodeProvider { if model == "" { model = "claude-sonnet-4-6" } return &claudeCodeProvider{model: model} } func (p *claudeCodeProvider) Name() string { return "claudecode" } func (p *claudeCodeProvider) Summarize(ctx context.Context, prompt string, _ GenOptions) (string, error) { var stdout, stderr bytes.Buffer cmd := exec.CommandContext(ctx, "claude", "-p", prompt, "--model", p.model) cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() fmt.Printf("[claudecode] stdout len=%d stderr=%q err=%v\n", stdout.Len(), stderr.String(), err) if err != nil { msg := strings.TrimSpace(stderr.String()) if msg == "" { msg = strings.TrimSpace(stdout.String()) } if msg == "" { msg = err.Error() } return "", fmt.Errorf("claude cli: %s", msg) } return strings.TrimSpace(stdout.String()), nil } func (p *claudeCodeProvider) ListModels(_ context.Context) ([]string, error) { return []string{ "claude-opus-4-7", "claude-sonnet-4-6", "claude-haiku-4-5-20251001", }, nil }