Summary
Replace the generic spinner overlay with real per-layer progress bars during image pull, push, and (future) build operations, using the Docker API progress stream.
Current State
- Image pull and push show a static spinner with no progress info
- The Docker API returns a JSON stream of progress events (
{"status","progressDetail","id",...}) that is not being parsed for the UI
Implementation Steps
1. Define a progress event model
type ProgressEvent struct {
ID string // layer ID
Status string // "Pulling fs layer", "Downloading", "Pull complete", etc.
Current int64
Total int64
}
2. Parse the Docker progress stream
Create a helper internal/ui/progress/stream.go that reads io.ReadCloser from pull/push and emits ProgressEvent messages into the Bubble Tea runtime via tea.Cmd.
3. Build a progress panel component
Create internal/ui/components/progress/ with a Model that:
- Maintains a map of layer ID → progress state
- Renders a list of per-layer progress bars (using
lipgloss or a simple ASCII bar)
- Shows overall completion status
4. Integrate with image pull
In the images section, when a pull starts:
- Launch the progress stream command
- Open the progress panel as an overlay
- Update the panel as
ProgressEvent messages arrive
- Close and refresh image list on completion
5. Integrate with image push
Same pattern as pull.
Acceptance Criteria
Summary
Replace the generic spinner overlay with real per-layer progress bars during image pull, push, and (future) build operations, using the Docker API progress stream.
Current State
{"status","progressDetail","id",...}) that is not being parsed for the UIImplementation Steps
1. Define a progress event model
2. Parse the Docker progress stream
Create a helper
internal/ui/progress/stream.gothat readsio.ReadCloserfrom pull/push and emitsProgressEventmessages into the Bubble Tea runtime viatea.Cmd.3. Build a progress panel component
Create
internal/ui/components/progress/with aModelthat:lipglossor a simple ASCII bar)4. Integrate with image pull
In the images section, when a pull starts:
ProgressEventmessages arrive5. Integrate with image push
Same pattern as pull.
Acceptance Criteria