Skip to content

feat(ui): add Fabric-branded progress spinner during command execution - #69

Draft
ayeshurun with Copilot wants to merge 236 commits into
mainfrom
copilot/add-responsive-progress-indicator
Draft

feat(ui): add Fabric-branded progress spinner during command execution#69
ayeshurun with Copilot wants to merge 236 commits into
mainfrom
copilot/add-responsive-progress-indicator

Conversation

Copilot AI commented Feb 24, 2026

Copy link
Copy Markdown

📥 Pull Request

✨ Description of new changes

Adds a Fabric-branded animated spinner on stderr while CLI commands execute, providing visual feedback for long-running operations.

Design

  • Spinner context manager in fab_ui.py — background daemon thread animates braille characters (⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏) on stderr
  • Fabric-branded colors — braille frames rendered in Fabric teal (#49C5B1), message text in grey, matching the CLI's existing print_fabric() and get_common_style() palette
  • TTY-aware — no-op when stderr is piped (non-interactive)
  • 300ms startup delay — fast commands (config, pwd) never flash a spinner
  • Auto-clear before outputstop_active_spinner() called from all output functions (print_output_format(), print_output_error(), print_progress(), print_done(), print_warning(), and print_info()) so the spinner line is always cleaned up before any console output renders, including during LRO polling

Integration points

  • main.py:_execute_command() — wraps func(args) for command-line mode
  • fab_interactive.py:handle_command() — wraps func(args) for interactive REPL mode
# Both paths now use:
with fab_ui.Spinner():
    return subparser_args.func(subparser_args)

LRO overlap prevention

The spinner is guaranteed not to overlap with Long Running Operation (LRO) polling output. Every output function used by the LRO flow — print_progress(), print_done(), print_warning(), print_info(), print_output_format(), and print_output_error() — calls stop_active_spinner() as its first action, clearing the spinner line from stderr before rendering status text. The call is idempotent, so it's safe when the spinner is already stopped or was never started.

Tests

11 unit tests covering init, TTY/non-TTY behavior, start/stop lifecycle, idempotent stop, global state management, and fast-command animation skip.

No new dependencies.


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

ayeshurun and others added 30 commits September 17, 2025 17:11
chore: Introduce release workflowc
…ith pulsing dots

Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com>
Copilot AI changed the title feat(ui): add responsive progress spinner during command execution feat(ui): add Fabric-branded progress spinner during command execution Feb 24, 2026
Comment thread src/fabric_cli/utils/fab_ui.py Outdated
Comment thread src/fabric_cli/utils/fab_ui.py
…coloring

Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com>
…verlap

Co-authored-by: ayeshurun <98805507+ayeshurun@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants