From efec87be16d43b7a60d681725f4c3bbe6ebb951c Mon Sep 17 00:00:00 2001 From: Coding-Dev-Tools Date: Tue, 30 Jun 2026 07:39:42 -0400 Subject: [PATCH 1/2] improve: add py3.13 to CI matrix, add format check step, update Makefile targets --- .github/workflows/ci.yml | 5 ++++- CHANGELOG.md | 10 ++++++++++ Makefile | 9 ++++++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4daac39..43e05c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,11 +23,14 @@ jobs: - name: Run ruff check run: ruff check src/ tests/ + - name: Check formatting + run: ruff format --check src/ tests/ + test: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v6 diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f32bcb..5c06f9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to Revenue Holdings CLI will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.0] - 2026-06-30 + +### Added +- Python 3.13 to CI test matrix +- Formatting check step in CI workflow +- `format-check` Makefile target + +### Changed +- Makefile lint/format targets scoped to `src/ tests/` instead of entire repo + ## [0.2.0] - 2026-05-17 ### Added diff --git a/Makefile b/Makefile index 2f1f871..0555de0 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,14 @@ # Generated by Agent B — Lint & Type Scripts -.PHONY: lint test format typecheck +.PHONY: lint test format typecheck format-check lint: - ruff check . + ruff check src/ tests/ format: - ruff format . + ruff format src/ tests/ + +format-check: + ruff format --check src/ tests/ typecheck: pyright src/ From 290af434f7f2de7a4ae28c868f4ff1c82b50b9fd Mon Sep 17 00:00:00 2001 From: Coding-Dev-Tools Date: Tue, 30 Jun 2026 07:43:22 -0400 Subject: [PATCH 2/2] fix: apply ruff formatting to cli.py and test_cli.py by dev-engineer --- src/devforge/cli.py | 12 +++--------- tests/test_cli.py | 5 ++--- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/devforge/cli.py b/src/devforge/cli.py index a999e16..b8a9733 100644 --- a/src/devforge/cli.py +++ b/src/devforge/cli.py @@ -82,9 +82,7 @@ def list_tools( @app.command() def install( - tool: str = typer.Argument( - ..., help="Tool to install: " + ", ".join(TOOLS.keys()) + ", or 'all'" - ), + tool: str = typer.Argument(..., help="Tool to install: " + ", ".join(TOOLS.keys()) + ", or 'all'"), ): """Install a DevForge tool.""" if tool == "all": @@ -101,10 +99,7 @@ def install( pkg = f"devforge[{extras}]" console.print(f"[yellow]Installing {pkg}...[/yellow]") try: - result = subprocess.run( - [sys.executable, "-m", "pip", "install", pkg], - capture_output=True, text=True - ) + result = subprocess.run([sys.executable, "-m", "pip", "install", pkg], capture_output=True, text=True) if result.returncode == 0: console.print(f"[green]Successfully installed:[/green] {', '.join(targets)}") else: @@ -130,8 +125,7 @@ def show_versions( info = TOOLS[t] try: result = subprocess.run( - [sys.executable, "-m", "pip", "show", info["package"]], - capture_output=True, text=True + [sys.executable, "-m", "pip", "show", info["package"]], capture_output=True, text=True ) if result.returncode == 0: for line in result.stdout.splitlines(): diff --git a/tests/test_cli.py b/tests/test_cli.py index 7cca06c..b5efe82 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,4 +1,5 @@ """Tests for devforge meta-package.""" + from __future__ import annotations from devforge import TOOLS, __version__ @@ -86,9 +87,7 @@ def test_versions_unknown_tool_fails(self): @mock.patch("devforge.cli.subprocess.run") def test_versions_specific_tool_not_installed(self, mock_run): """Show 'not installed' for a tool that isn't installed.""" - mock_run.return_value = mock.MagicMock( - returncode=1, stdout="", stderr="" - ) + mock_run.return_value = mock.MagicMock(returncode=1, stdout="", stderr="") result = runner.invoke(app, ["versions", "guard"]) assert result.exit_code == 0 assert "guard" in result.stdout