# feat(trail): show a spinner during tune's gather and agent run

`38afd32`→[main](/content/gh/entireio/cli/commits/main/index.html)·  
  
Soph·3w ago·1 file·+4 added/-2 removed

The two opaque waits in `tune` — gathering repository signal (gh, checkpoint listing, trails API) and the headless agent run — printed a static line and then sat silent. Wrap both in the shared startSpinner helper so there's live "still working" feedback on a TTY, degrading to a "✓ <step>" line when output isn't a terminal (CI, pipes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

## Sessions

99c1933c8608View transcript

[?\
Refine Risk Review Prompt TemplateClaude Code·Opus 4.8[1m]·1 step](/content/gh/entireio/cli/session/d70d405d-5421-4b68-beab-2e3bcaaf25a7#timeline-99c1933c8608/index.html)

## Changes

1

- cmd/entire/cli

- Mtrail_tune_cmd.go+4/-2

```
106 unmodified lines

107
108
109
110
110
111
112
113
114
115
50 unmodified lines

166
167
168
168
169
170
171
172
173
174

106 unmodified lines

return err

}

fmt.Fprintln(errW, "Gathering repository signal…")
stopGather := startSpinner(errW, "Gathering repository signal")
brief := gatherTuningContext(ctx, errW, repoRoot, src, opts.limit, opts.insecureHTTP)
stopGather(true)
prompt := buildTunePrompt(brief, runners)

if opts.debugDir != ""
50 unmodified lines

return fmt.Errorf("provider %s cannot generate text", provider.Name)
}

fmt.Fprintf(errW, "Tuning %d runner(s) with %s…\n", len(runners), provider.DisplayName)
stop := startSpinner(errW, fmt.Sprintf("Tuning %d runner(s) with %s", len(runners), provider.DisplayName))
out, err := textGen.GenerateText(ctx, prompt, provider.Model)
stop(err == nil)
if err != nil {
    return fmt.Errorf("agent run failed: %w", err)
}
```

Mcmd/entire/cli/trail_tune_cmd.go+4/-2
