- Add CONTRIBUTING.md with branch naming, commit format, and PR workflow
- Add TROUBLESHOOTING.md with common issues and solutions
- Update README.md with CI badge and commit convention section
- Update pyproject.toml with pythonpath and coverage settings for scripts
- Change --ask-become-pass from opt-in to opt-out across all commands
(install, update, start, stop, enable, disable, status, remove)
- Use Click toggle pattern: --ask-become-pass/--no-ask-become-pass with
default=True so users are always prompted for sudo unless they
explicitly opt out
- Update i18n translations for both help texts
- Update all CLI tests to expect ask_become_pass=True as default and
add test for --no-ask-become-pass
- Update README: remove --ask-become-pass from examples, document
--no-ask-become-pass for passwordless-sudo setups
- 120 tests, 100% coverage, pyright clean, ruff clean
- Remove console StreamHandler from get_logger() — say() already handles
console output via click.echo(); having both caused every message to
appear twice
- Move GRM_LOG_LEVEL filtering into ui.say() via _console_level() so
console verbosity is still user-controllable while the log file always
captures everything at DEBUG
- Remove [GRM] prefix from say() calls — no longer needed without
duplicate logger output, giving cleaner user-facing messages
- Update test_logging_config.py: remove console handler tests and
_level_from_env tests (now in test_ui.py), expect 1 handler only
- Add test_ui.py coverage for _console_level and say() level filtering
- Update README to document single-path console output via click.echo
- 116 tests, 100% coverage, pyright clean, ruff clean
- Extend ui.say() with optional color parameter using click.style()
- Console output gets tinted; log file always stores plain text (no ANSI)
- executor.py: cyan for start, yellow for status, green for done, red for errors
- report.py: bright_cyan header, green completed, red failed, yellow in-progress,
white pending
- Update README with colorized output documentation
- 117 tests, 100% coverage, pyright clean, ruff clean
- Create logging_config.py with get_logger() providing dual handlers:
- Console handler (stderr) controlled by GRM_LOG_LEVEL env var (default INFO)
- File handler (~/.local/state/grm/logs/grm.log) capturing everything at DEBUG
- Replace all print() calls in executor.py and report.py with logger.info()/error()
- Add error logging before raising AnsibleError in executor.run()
- Add GRM_LOG_LEVEL to README configuration table and logging documentation
- Update all unit tests to mock logger instead of using capsys
- 114 tests, 100% coverage, pyright clean, ruff clean