fix(cli): fix format_output() to use rich and color renderers instead of JSON fallback #3227

Merged
HAL9000 merged 4 commits from fix/format-output-rich-color-renderers into master 2026-05-30 17:06:23 +00:00

4 Commits

Author SHA1 Message Date
HAL9000 d0fd9319d3 fix(tests): add BDD scenarios for rich/color formats with list data to restore coverage
CI / push-validation (pull_request) Successful in 24s
CI / helm (pull_request) Successful in 32s
CI / lint (pull_request) Successful in 45s
CI / build (pull_request) Successful in 41s
CI / quality (pull_request) Successful in 53s
CI / typecheck (pull_request) Successful in 58s
CI / security (pull_request) Successful in 1m21s
CI / unit_tests (pull_request) Successful in 4m51s
CI / docker (pull_request) Successful in 1m25s
CI / coverage (pull_request) Successful in 11m12s
CI / integration_tests (pull_request) Successful in 26m11s
CI / status-check (pull_request) Successful in 3s
Cover the list branches in _format_rich() and _format_color() that were
left untested, causing the coverage gate to drop below the 97% threshold.
Add two new @when steps (list+rich, list+color), two @then steps for list
panel assertions, and two new feature scenarios exercising those paths.

ISSUES CLOSED: #2921
2026-05-30 11:45:16 -04:00
HAL9000 353451263e fix(tests): remove @tdd_expected_fail from format_output dict scenario
CI / push-validation (pull_request) Successful in 21s
CI / build (pull_request) Successful in 30s
CI / lint (pull_request) Successful in 32s
CI / helm (pull_request) Successful in 30s
CI / quality (pull_request) Successful in 56s
CI / typecheck (pull_request) Successful in 1m12s
CI / security (pull_request) Successful in 1m14s
CI / unit_tests (pull_request) Successful in 5m14s
CI / docker (pull_request) Successful in 1m36s
CI / coverage (pull_request) Failing after 12m27s
CI / integration_tests (pull_request) Successful in 22m26s
CI / status-check (pull_request) Failing after 2s
Issue #4364 is now resolved by the envelope pattern introduced on master.
The scenario "Format output handles all format types for dict" passes
correctly — the TDD inversion was flipping it to a failure.

ISSUES CLOSED: #4364
2026-05-30 11:09:06 -04:00
HAL9000 a726b96d26 fix(cli): address reviewer feedback on format_output rich/color fix
- Move function-level imports to module top level in formatting.py:
  * Remove redundant OutputSession import inside _format_rich()
  * Remove redundant OutputSession import inside _format_color()
  * Move `import sys` from inside format_output() to module level

- Fix robot/helper_cli_formats.py:
  * Remove redundant `import json as _json` inside format_output_rich();
    use the top-level `json` module directly
  * Replace non-deterministic datetime.now() calls in _mock_action() and
    _mock_plan() with fixed datetime(2025, 1, 15, 10, 0, 0)

- Split cli_output_formats_steps.py to comply with 500-line limit:
  * Extract all @then step definitions into new file
    features/steps/cli_output_format_validation_steps.py
  * Behave auto-discovers steps from any .py file in steps/

ISSUES CLOSED: #2921
2026-05-30 11:09:06 -04:00
freemo 6e47abbd63 fix(cli): fix format_output() to use rich and color renderers instead of JSON fallback
The format_output() function in src/cleveragents/cli/formatting.py had two
routing bugs that caused incorrect output for the 'rich' and 'color' formats:

1. The 'rich' format had no explicit dispatch branch and silently fell through
   to the final JSON fallback, returning raw JSON instead of styled terminal
   output. Since 'rich' is the default CLI format (per ADR-021), this meant
   all commands using format_output() (version, info, diagnostics) produced
   JSON by default.

2. The 'color' format was incorrectly routed to _format_plain() instead of a
   color-aware renderer, producing plain text with no ANSI color codes.

Fix:
- Added _format_rich() helper that delegates to RichMaterializer via
  OutputSession, producing ANSI-styled terminal output consistent with
  format_output_session().
- Added _format_color() helper that delegates to ColorMaterializer via
  OutputSession, producing ANSI-colored terminal output.
- Added explicit OutputFormat.RICH dispatch in format_output() routing.
- Fixed OutputFormat.COLOR dispatch to use _format_color() instead of
  _format_plain().

Tests:
- Updated existing BDD scenario that was validating the buggy behavior
  (expected JSON for rich format) to now assert correct styled output.
- Added new BDD scenarios: 'rich format produces styled terminal output not
  JSON' and 'color format produces ANSI-colored output not plain text'.
- Added Robot Framework integration tests in cli_formats.robot and
  helper_cli_formats.py verifying end-to-end styled output for both formats.

All nox sessions pass: lint, typecheck, unit_tests, security_scan.

ISSUES CLOSED: #2921
2026-05-30 11:09:06 -04:00