[CFX-6271] Logo animation on a first run #445
Conversation
There was a problem hiding this comment.
license-eye has checked 176 files.
| Valid | Invalid | Ignored | Fixed |
|---|---|---|---|
| 167 | 2 | 7 | 0 |
Click to see the invalid file list
- tui/logo_animation_test.go
- tui/logo_animation.go
Use this command to fix any missing license headers
```bash
docker run -it --rm -v $(pwd):/github/workspace apache/skywalking-eyes header fix
</details>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit fe1870a. Configure here.
ajalon1
left a comment
There was a problem hiding this comment.
I really want to see this in the CLI! Some better error checking to make sure we don't break things though.
| // Only show animation when stdout is a terminal (not piped or redirected) | ||
| fi, err := os.Stdout.Stat() | ||
| if err != nil || (fi.Mode()&os.ModeCharDevice) == 0 { | ||
| return | ||
| } |
There was a problem hiding this comment.
Will this handle smoke tests?
| // PluginUpdateChecks maps plugin name → last check timestamp (UTC). | ||
| PluginUpdateChecks map[string]time.Time `yaml:"plugin_update_checks,omitempty"` | ||
| // FirstAnimationShown tracks whether the welcome animation has been displayed. | ||
| FirstAnimationShown bool `yaml:"first_animation_shown,omitempty"` |
There was a problem hiding this comment.
I might change this property to something like "welcome_animation_shown" since that's pretty much what it is. IDK what other animations we intend to have. :D
|
|
||
| m := tui.NewLogoAnimationModel() | ||
|
|
||
| _, _ = tui.Run(m, tea.WithAltScreen()) |
There was a problem hiding this comment.
What happens if the animation model crashes for some reason? :D
| func showFirstRunAnimation() { | ||
| if !state.IsFirstRun() { | ||
| return | ||
| } |
There was a problem hiding this comment.
I don't think we had ever checked the state file before at this point, in PersistentPreRunE. I hope this doesn't add too much of a delay.
| if err != nil { | ||
| return false | ||
| } |
There was a problem hiding this comment.
This is nice; we don't want any issues in loadGlobalState() to break the CLI, just move on.
Maybe log.Debug here.
| gs, err := loadGlobalState() | ||
| if err != nil { | ||
| return | ||
| } |
There was a problem hiding this comment.
This is nice; we don't want any issues in loadGlobalState() to break the CLI, just move on.
Maybe log.Debug here.
| github.com/charmbracelet/bubbles v1.0.0 | ||
| github.com/charmbracelet/bubbletea v1.3.10 | ||
| github.com/charmbracelet/glamour v1.0.0 | ||
| github.com/charmbracelet/harmonica v0.2.0 |
There was a problem hiding this comment.
Charmbracelet team has the funniest package names.
|
🚀 Smoke tests triggered! Running on Linux and Windows... |
|
❌ Some smoke tests failed. ✅ Linux: success |

RATIONALE
Refactored first run logo with an animation
Screen.Recording.2026-04-21.at.10.47.04.mov
CHANGES
PR Automation
Comment-Commands: Trigger CI by commenting on the PR:
/trigger-smoke-testor/trigger-test-smoke- Run smoke tests/trigger-install-testor/trigger-test-install- Run installation testsLabels: Apply labels to trigger workflows:
run-smoke-testsorgo- Run smoke tests on demand (only works for non-forked PRs)Important
For Forked PRs: The
run-smoke-testslabel won't work. A required Smoke Tests check will block merge until a maintainer acts:/approve-smoke-teststo run smoke tests (results will set the check)/skip-smoke-teststo bypass the check without running testsPlease comment requesting a maintainer review if you need smoke tests to run.
Note
Medium Risk
Runs new TUI code on the hot path for every command’s first execution and writes new global state, which could affect terminal behavior or scripted usage if detection/state persistence misbehaves.
Overview
Adds a first-run welcome experience by running a Bubble Tea animated DataRobot logo before executing any command (via
PersistentPreRunEincmd/root.go), but only when stdout is an interactive terminal.Persists a new global state flag (
first_animation_shownin~/.config/datarobot/state.yaml) to ensure the animation only shows once, and introduces a newtuispring-based animation model (plus tests) backed by the newgithub.com/charmbracelet/harmonicadependency.Reviewed by Cursor Bugbot for commit 3678ca8. Bugbot is set up for automated code reviews on this repo. Configure here.