From dac0eca79e9a2d56ca10487729a959b221c839bf Mon Sep 17 00:00:00 2001 From: John Gerwin De las Alas Date: Mon, 19 Oct 2026 23:22:06 +0800 Subject: [PATCH 1/2] feat(brewfile): add bash and g3rm0n install recommendation - Add modern Homebrew bash to the Brewfile, ahead of bat in CLI tools - Document the optional g3rm0n monitoring dashboard in README and INSTALLATION - Add tests/brewfile_test.py regression for the Bash entry and jq uniqueness - Record the changes under Unreleased in CHANGELOG --- Brewfile | 1 + CHANGELOG.md | 6 ++++++ INSTALLATION.md | 7 ++++++- README.md | 9 +++++++++ tests/brewfile_test.py | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/brewfile_test.py diff --git a/Brewfile b/Brewfile index cba18d1..3603d28 100644 --- a/Brewfile +++ b/Brewfile @@ -4,6 +4,7 @@ tap "charmbracelet/tap" # Charm shell tools and utilities tap "oven-sh/bun" # Bun JavaScript runtime # Command Line Tools & Development +brew "bash" # Modern Bash for monitoring tools such as g3rm0n (macOS ships Bash 3.2) brew "bat" # Cat clone with syntax highlighting brew "bottom" # Yet another cross-platform graphical process/system monitor brew "btop" # Resource monitor that shows usage and stats diff --git a/CHANGELOG.md b/CHANGELOG.md index cf55790..b1be2bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added +- `bash` (modern Homebrew Bash) to the Brewfile for monitoring tools such as g3rm0n +- g3rm0n live terminal dashboard recommendation in README and INSTALLATION + (`brew install bash jq && curl -fsSL https://raw.githubusercontent.com/iamgerwin/g3rm0n/main/install.sh | bash`) +- `tests/brewfile_test.py` regression for the Brewfile Bash entry + ## [0.1.0] - 2026-10-19 ### Added diff --git a/INSTALLATION.md b/INSTALLATION.md index 68132ed..aa79119 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -106,13 +106,18 @@ Each backup includes: - Tmux with Tmux Plugin Manager (TPM) - Tmux plugins (resurrect, continuum, vim-navigator) - AI CLI tools (Claude, Gemini, Codex) - optional, requires API keys +- Recommended extra: **g3rm0n** live monitoring dashboard (optional, installs to `~/.local`, no root) + ```bash + brew install bash jq && curl -fsSL https://raw.githubusercontent.com/iamgerwin/g3rm0n/main/install.sh | bash + ``` ### Final Configuration Steps After installation completes, you'll need to: 1. Install the MesloLGS NF font and configure your terminal 2. Run `p10k configure` to customize your prompt theme 3. (Optional) Run `~/dotfiles/scripts/setup-ai-tools.sh` to configure AI CLI tools -4. Restart your terminal to activate all changes +4. (Optional) Install the g3rm0n monitoring dashboard (see Dependencies Installed) +5. Restart your terminal to activate all changes ## Verification Steps diff --git a/README.md b/README.md index 6a8bd53..0917cd1 100644 --- a/README.md +++ b/README.md @@ -337,6 +337,15 @@ The dotfiles now include comprehensive terminal setup tools for an enhanced deve - **Fd**: Simple, fast alternative to `find` - **Dust**: More intuitive version of `du` written in Rust +#### Monitoring +- **g3rm0n**: Live terminal dashboard for system and AI usage (CPU, memory, disk, network + Claude/Codex/Z.ai limits) + +Install it with the one-liner below. `bash` and `jq` already come from the Brewfile; the command installs them if missing and then installs g3rm0n into `~/.local`: + +```bash +brew install bash jq && curl -fsSL https://raw.githubusercontent.com/iamgerwin/g3rm0n/main/install.sh | bash +``` + #### Fonts The setup includes JetBrains Mono and other Nerd Fonts for proper icon display in terminals. diff --git a/tests/brewfile_test.py b/tests/brewfile_test.py new file mode 100644 index 0000000..dfa55ec --- /dev/null +++ b/tests/brewfile_test.py @@ -0,0 +1,33 @@ +"""Brewfile regression: modern Bash is declared once, in the CLI tools section.""" + +from pathlib import Path +import unittest + + +BREWFILE = Path(__file__).resolve().parents[1] / "Brewfile" + + +class BrewfileTests(unittest.TestCase): + def setUp(self): + self.lines = BREWFILE.read_text(encoding="utf-8").splitlines() + + def formula_lines(self, name): + prefix = f'brew "{name}"' + return [line for line in self.lines if line.startswith(prefix)] + + def test_modern_bash_is_declared_once(self): + self.assertEqual(len(self.formula_lines("bash")), 1) + + def test_jq_is_not_duplicated(self): + self.assertEqual(len(self.formula_lines("jq")), 1) + + def test_bash_sits_in_command_line_tools_before_bat(self): + section = self.lines.index("# Command Line Tools & Development") + bash_index = next(i for i, line in enumerate(self.lines) if line.startswith('brew "bash"')) + bat_index = next(i for i, line in enumerate(self.lines) if line.startswith('brew "bat"')) + self.assertGreater(bash_index, section) + self.assertEqual(bash_index + 1, bat_index) + + +if __name__ == "__main__": + unittest.main() From f095127a68a560c2a39b9b8c717e50e549cd3b8c Mon Sep 17 00:00:00 2001 From: John Gerwin De las Alas Date: Mon, 19 Oct 2026 23:23:43 +0800 Subject: [PATCH 2/2] test(brewfile): assert sorted placement instead of strict adjacency --- tests/brewfile_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/brewfile_test.py b/tests/brewfile_test.py index dfa55ec..e05a373 100644 --- a/tests/brewfile_test.py +++ b/tests/brewfile_test.py @@ -21,12 +21,12 @@ def test_modern_bash_is_declared_once(self): def test_jq_is_not_duplicated(self): self.assertEqual(len(self.formula_lines("jq")), 1) - def test_bash_sits_in_command_line_tools_before_bat(self): + def test_bash_sits_in_command_line_tools_section_sorted(self): section = self.lines.index("# Command Line Tools & Development") bash_index = next(i for i, line in enumerate(self.lines) if line.startswith('brew "bash"')) bat_index = next(i for i, line in enumerate(self.lines) if line.startswith('brew "bat"')) self.assertGreater(bash_index, section) - self.assertEqual(bash_index + 1, bat_index) + self.assertLess(bash_index, bat_index) if __name__ == "__main__":