Skip to content

ci: Add Python CI workflow (format, lint, test)#15

Merged
evansenter merged 8 commits into
mainfrom
add-python-ci
Dec 31, 2025
Merged

ci: Add Python CI workflow (format, lint, test)#15
evansenter merged 8 commits into
mainfrom
add-python-ci

Conversation

@evansenter

Copy link
Copy Markdown
Owner

Summary

  • Add Python CI workflow matching claude-event-bus configuration
  • Format & Lint job using ruff
  • Test Suite job using pytest

Test plan

  • CI runs successfully on this PR

🤖 Generated with Claude Code

Matches claude-event-bus CI configuration.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@claude

claude Bot commented Dec 31, 2025

Copy link
Copy Markdown

Code Review

Thanks for adding CI to the project! This is an important step for code quality. I've identified several issues that need to be addressed before this workflow can run successfully.

Critical Issues ❌

1. Missing pyproject.toml

The test job attempts to install dependencies with pip install -e ".[dev]" (line 40), but there's no pyproject.toml or setup.py in the repository. This will cause the installation to fail.

Action Required: Add a pyproject.toml file with project metadata and dependencies. Based on CLAUDE.md, you'll need at least:

  • fastmcp
  • pytest (in dev dependencies)
  • ruff (in dev dependencies)

2. No Tests to Run

The tests/ directory only contains an empty __init__.py. The pytest -v command (line 42) will succeed but won't actually test anything, which defeats the purpose of the CI.

Action Required: Either:

  • Add actual tests before merging this PR, or
  • Modify the workflow to allow empty test runs initially (though this isn't recommended)

Recommendations 💡

3. Unnecessary Matrix Strategy

Lines 30-32 define a matrix with only one Python version. This adds complexity without benefit.

strategy:
  matrix:
    python-version: ["3.12"]

Suggestion: Simplify to a single version:

- uses: actions/setup-python@v5
  with:
    python-version: "3.12"

If you plan to test multiple versions in the future, the matrix makes sense, but for now it's premature.

4. Missing Ruff Configuration

While ruff can run with defaults, having a pyproject.toml with ruff configuration would ensure consistent settings between local development (make check) and CI.

5. Workflow Dependencies

Consider making the test job depend on the check job passing first:

test:
  name: Test Suite
  needs: check
  runs-on: ubuntu-latest

This saves CI minutes by not running tests if linting fails.

Minor Issues

6. Inconsistent Formatting

The workflow follows the pattern from claude-event-bus (as mentioned in the PR description), which is good for consistency. No issues here.

Security ✅

No security concerns identified. The workflow:

  • Uses pinned action versions (v4, v5)
  • Doesn't expose secrets
  • Has appropriate permissions

Testing Coverage ⚠️

As noted, there are currently no tests. According to CLAUDE.md, this project should have tests for:

  • SQLite backend (storage.py)
  • JSONL parsing (ingest.py)
  • Query implementations (queries.py)
  • Pattern detection (patterns.py)
  • MCP tools (server.py)

Summary

This PR cannot be merged as-is because:

  1. The dependencies installation will fail (no pyproject.toml)
  2. The test suite is empty

Recommended Next Steps:

  1. Add pyproject.toml with proper dependencies
  2. Add at least basic smoke tests
  3. Consider simplifying the Python version matrix
  4. Update the PR description checklist once CI actually runs

The workflow structure itself is solid and follows good practices. Once the project configuration is in place, this will provide valuable CI coverage.


Review generated by Claude Code

@claude

claude Bot commented Dec 31, 2025

Copy link
Copy Markdown

PR Review: CI Workflow Setup

Summary

This PR adds foundational CI infrastructure with format/lint/test jobs. Overall structure is solid and follows established patterns from claude-event-bus. Here's my detailed feedback:


Strengths

  1. Clean workflow structure - Separates format/lint from testing, making failures easier to diagnose
  2. Modern actions - Uses actions/checkout@v4 and actions/setup-python@v5
  3. Good Python version alignment - Targets 3.12 consistently
  4. Proper project metadata - pyproject.toml is well-structured with clear dependencies

🔍 Issues & Recommendations

Critical

1. Missing tests/__init__.py (.github/workflows/python.yml:42)

The CI adds a commit for tests/__init__.py but the file appears empty. While pytest can discover tests without it, this creates inconsistency.

Fix: Ensure the file exists with at least a docstring:

"""Tests for session analytics."""

2. Hardcoded Python version in strategy matrix (.github/workflows/python.yml:31)

The test job uses a matrix strategy but only tests Python 3.12. This adds complexity without benefit.

Recommendation: Either:

  • Use multiple versions: ["3.10", "3.11", "3.12"] (matching requires-python = ">=3.10")
  • Or simplify to remove the matrix entirely:
test:
  name: Test Suite
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-python@v5
      with:
        python-version: "3.12"

3. Missing src/session_analytics/__init__.py content

The package init file is empty, which means the get_status function won't be easily importable from the package root.

Recommendation: Add package-level exports:

"""Session analytics for Claude Code."""

from session_analytics.server import get_status, mcp

__all__ = ["get_status", "mcp"]

Medium Priority

4. Ruff configuration mismatch (pyproject.toml:53)

The workflow runs ruff format --check src tests but pyproject.toml only specifies src = ["src", "tests"] without explicit format configuration. While this works, it's implicit.

Recommendation: Add explicit format config:

[tool.ruff.format]
docstring-code-format = true

5. Missing dependency caching (.github/workflows/python.yml)

Both jobs reinstall dependencies from scratch, slowing CI runs.

Recommendation: Add pip caching:

- uses: actions/setup-python@v5
  with:
    python-version: "3.12"
    cache: 'pip'

6. ruff check missing auto-fixable flag

The lint step doesn't show which issues are auto-fixable.

Enhancement:

- name: Lint
  run: ruff check src tests --output-format=github

Low Priority / Enhancements

7. Test coverage not measured

No coverage reporting configured.

Enhancement: Add to dev dependencies and CI:

dev = [
    "pytest>=8.0.0",
    "pytest-asyncio>=0.23.0",
    "pytest-cov>=4.1.0",
    "ruff>=0.8.0",
]
- name: Run tests
  run: pytest -v --cov=session_analytics --cov-report=term-missing

8. Minimal test coverage

Only one test exists (test_get_status), which doesn't exercise FastMCP integration.

Recommendation: Add integration test:

import pytest
from fastmcp.testing import MCPTestClient

@pytest.mark.asyncio
async def test_mcp_server():
    """Test that MCP server can list tools."""
    from session_analytics.server import mcp
    
    async with MCPTestClient(mcp) as client:
        tools = await client.list_tools()
        assert any(t.name == "get_status" for t in tools)

9. Missing README.md

Project has no README, making it harder for contributors to onboard.

Enhancement: Add minimal README documenting installation and usage.


🔒 Security

✅ No security concerns identified

  • Dependencies are pinned with minimum versions
  • No secrets or credentials in code
  • GitHub Actions uses official actions only

🚀 Performance

✅ No performance issues


📊 Test Coverage

⚠️ Coverage is minimal (tests/test_server.py:1-10)

  • Only tests get_status return structure
  • No FastMCP integration testing
  • No edge cases covered

Recommendation: See #8 above for integration test example.


Final Verdict

Approve with minor changes recommended

This PR establishes solid CI foundations. The critical issues (#1-3) are minor and should be addressed before merge. Medium/low priority items can be follow-up PRs.

Must fix before merge:

  1. Add content to init.py files
  2. Simplify or expand Python version matrix

Nice to have:
3. Add dependency caching
4. Improve test coverage in follow-up PR


Great work getting the infrastructure in place! 🎉

@claude

claude Bot commented Dec 31, 2025

Copy link
Copy Markdown

PR Review: CI Workflow Addition

Overall Assessment

Good foundational PR that adds essential CI infrastructure. The implementation follows the reference architecture from claude-event-bus and aligns well with the project goals. However, there are several areas that need attention before merging.


Critical Issues

1. Missing tests/__init__.py in PR 🔴

The workflow references tests/ directory, but the PR doesn't create tests/__init__.py. While it may exist in the branch, it's not shown in the diff. This could cause import issues.

Recommendation: Ensure tests/__init__.py is created (even if empty) or already exists.


2. pyproject.toml Build Configuration Issue 🔴

Location: pyproject.toml:40-41

[tool.hatch.build.targets.wheel]
packages = ["src/session_analytics"]

Problem: This configuration is incorrect. Hatch expects package directories relative to the project root, not nested inside src/.

Fix:

[tool.hatch.build.targets.wheel]
packages = ["session_analytics"]

[tool.hatch.build]
sources = ["src"]

Or use the more explicit:

[tool.hatch.build.targets.wheel]
only-include = ["src/session_analytics"]

[tool.hatch.build.targets.wheel.force-include]
"src/session_analytics" = "session_analytics"

Significant Issues

3. Missing tests/__init__.py Module ⚠️

The test_server.py imports from session_analytics.server import get_status which requires proper package structure. Without tests/__init__.py, this may work but isn't following best practices.

4. Incomplete Ruff Configuration ⚠️

Location: pyproject.toml:52-54

[tool.ruff.lint]
select = ["E", "F", "I", "N", "W", "UP"]
ignore = ["E501"]

Issues:

  • Ignoring E501 (line-length) conflicts with setting line-length = 100. Either enforce it or don't set it.
  • Missing common useful rules: B (bugbear), C4 (comprehensions), SIM (simplify), RUF (Ruff-specific)

Recommendation:

[tool.ruff.lint]
select = ["E", "F", "I", "N", "W", "UP", "B", "C4", "SIM", "RUF"]
ignore = []  # Enforce line-length via line-length setting

5. Test Coverage is Minimal ⚠️

The single test in test_server.py:6-10 only validates structure, not behavior. While this is appropriate for initial skeleton code, the PR title suggests a full CI setup.

Recommendation: Add a comment in the test file indicating this is a placeholder for future comprehensive tests, or add a TODO.


Minor Issues

6. Python Version Inconsistency 📝

  • pyproject.toml:6 requires Python >=3.10
  • .github/workflows/python.yml:31 only tests Python 3.12
  • .github/workflows/python.yml:17 uses Python 3.12 for linting

Recommendation: Either:

  • Test against the minimum supported version (3.10) AND latest (3.12), or
  • Update requires-python to >=3.12 if older versions aren't needed

Suggested matrix:

matrix:
  python-version: ["3.10", "3.12"]

7. Missing LICENSE File 📝

pyproject.toml:11 declares license = "MIT" but there's no LICENSE file in the repository (based on file listing).

Recommendation: Add a LICENSE file or change to license = {text = "MIT"} if intentionally excluding the file.

8. CI Optimization Opportunity 📝

The format & lint job installs only ruff, but could use caching to speed up future runs.

Suggestion:

- name: Cache pip packages
  uses: actions/cache@v4
  with:
    path: ~/.cache/pip
    key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }}

9. Docstring Consistency 📝

server.py:17-19 has a docstring for main() but it's a trivial function. Consider removing it or making it more descriptive (e.g., "Entry point for the MCP server. Starts the FastMCP server in blocking mode.").


Security & Performance

No security concerns - No sensitive data handling or unsafe operations
No performance issues - Minimal code, appropriate tool choices
Dependencies are well-scoped - FastMCP and uvicorn are appropriate


Best Practices Alignment

Follows CLAUDE.md conventions:

  • ✅ Uses FastMCP as specified
  • ✅ Matches claude-event-bus pattern
  • ✅ Appropriate commit messages with Claude Code attribution

Gaps:

  • ⚠️ CLAUDE.md references Makefile with make check, make install, etc., but there's no Makefile in the repo yet
  • ⚠️ No mention of the other modules listed in CLAUDE.md: storage.py, ingest.py, queries.py, patterns.py

Test Plan Review

The PR checklist states:

  • CI runs successfully on this PR

Assessment: The workflow syntax looks correct, but the package build configuration issue (#2) may cause installation failures in the test job.


Recommendations Summary

Must Fix Before Merge:

  1. Fix pyproject.toml build configuration for hatch
  2. Verify tests/__init__.py exists or create it

Should Fix:
3. Align Python version testing with minimum requirements
4. Enhance Ruff configuration or document E501 exception
5. Add LICENSE file or update pyproject.toml

Nice to Have:
6. Add pip caching to CI
7. Expand test coverage (or add TODO comments)
8. Create the referenced Makefile


Verdict

Approve with changes required. This is a solid foundation, but the build configuration must be fixed before merge. The PR successfully establishes the CI pipeline structure and follows the project's architectural patterns.

Estimated effort to address: ~15 minutes for critical fixes, ~30 minutes for all recommendations.


Review generated with Claude Code

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@claude

claude Bot commented Dec 31, 2025

Copy link
Copy Markdown

Code Review

This PR establishes the foundational CI infrastructure and project skeleton. Overall the implementation is clean and follows best practices, but there are several items that need attention before merging.

✅ Strengths

  1. Clean CI workflow: The GitHub Actions workflow follows modern best practices with separate jobs for formatting/linting and testing
  2. Proper dependency management: Good separation between production and dev dependencies in pyproject.toml
  3. Consistent tooling: Using ruff for both formatting and linting aligns with modern Python practices
  4. Test infrastructure: Basic test setup is correct and will catch import issues early

🐛 Critical Issues

1. Missing __init__.py export (.github/workflows/python.yml:42, src/session_analytics/init.py)

The test imports from session_analytics.server import get_status but src/session_analytics/__init__.py is empty. This will cause import failures. You need to either:

Option A - Export in init.py:

from session_analytics.server import get_status

__all__ = ["get_status"]

Option B - Update test import:

from session_analytics.server import get_status

The current approach in the test is correct IF you plan to expose the server module publicly. If so, update __init__.py accordingly.

2. Incomplete pyproject.toml configuration (pyproject.toml:40)

The [tool.hatch.build.targets.wheel] section has:

packages = ["src/session_analytics"]

This should be:

[tool.hatch.build.targets.wheel]
packages = ["src"]

[tool.hatch.build]
include = ["src/session_analytics"]

Or add a [tool.hatch.build] section:

[tool.hatch.build]
packages = ["src"]

Currently, the package structure may not install correctly with pip install -e .

3. Missing ruff configuration (pyproject.toml:53)

You ignore E501 (line length) but set line-length = 100. This creates confusion - if you want 100-char lines enforced, remove the ignore:

[tool.ruff.lint]
select = ["E", "F", "I", "N", "W", "UP"]
# Remove ignore = ["E501"] to enforce line-length

Or if you want flexible line lengths, remove the line-length setting.

⚠️ Issues to Address

4. Minimal test coverage (tests/test_server.py:6-9)

The test only validates the happy path. Consider adding:

  • Test for the actual MCP server instantiation
  • Test that the tool is registered correctly with FastMCP
  • Integration test that the server can actually start (even if just a smoke test)

Example:

def test_server_initialization():
    """Test that MCP server initializes correctly."""
    from session_analytics.server import mcp
    assert mcp.name == "session-analytics"
    # Verify get_status tool is registered
    assert "get_status" in [tool.name for tool in mcp.tools]

5. Missing Makefile (CLAUDE.md:26-29)

CLAUDE.md references make check, make install, etc., but no Makefile exists in this PR. Either:

  • Add the Makefile in this PR, or
  • Update README.md and CLAUDE.md to reflect that these commands don't exist yet

This creates confusion for new contributors.

6. Python version matrix inconsistency (pyproject.toml:20-22, .github/workflows/python.yml:31)

pyproject.toml declares support for Python 3.10, 3.11, 3.12, but CI only tests 3.12:

matrix:
  python-version: ["3.12"]  # Should be ["3.10", "3.11", "3.12"]

Either expand the test matrix or adjust the classifiers.

💡 Suggestions

7. Add ruff to production dependencies?

Currently ruff is only in dev dependencies, but the project description mentions this is an MCP server. Consider if you need formatting/linting as production dependencies for any runtime introspection or if dev is sufficient.

8. Server entry point (src/session_analytics/server.py:17-19)

The main() function just calls mcp.run() with no error handling. Consider adding basic exception handling:

def main():
    """Run the MCP server."""
    try:
        mcp.run()
    except KeyboardInterrupt:
        print("\nServer stopped")
    except Exception as e:
        print(f"Server error: {e}")
        raise

9. Missing docstring in test (tests/test_server.py:1)

Add module docstring describing the test suite's purpose, especially as the project grows.

📊 Summary

Before merging:

Can be follow-up PRs:

The foundation is solid, but these issues should be addressed to ensure a smooth development experience going forward.

@claude

claude Bot commented Dec 31, 2025

Copy link
Copy Markdown

PR Review: CI Infrastructure Setup

Summary

This PR adds foundational CI/CD infrastructure with GitHub Actions for formatting, linting, and testing. Overall, this is a solid start that follows Python best practices.

✅ Strengths

  1. Clean separation of concerns: Separate jobs for format/lint and testing
  2. Follows reference pattern: Matches the claude-event-bus structure mentioned in CLAUDE.md
  3. Good defaults: Using ruff for both formatting and linting is a modern, fast choice
  4. Proper dependency management: Uses pip install -e ".[dev]" for test job

🐛 Issues & Bugs

Critical

1. Missing __init__.py export (src/session_analytics/init.py)
The package has no exports, which will cause import failures. You need to export the main entry points:

from session_analytics.server import mcp

__all__ = ["mcp"]

2. Python version inconsistency (pyproject.toml:19 vs .github/workflows/python.yml:31)

  • pyproject.toml claims support for >=3.10
  • CI only tests 3.12
  • Recommendation: Either test all supported versions or narrow the requirement to >=3.12

High Priority

3. Missing ruff installation in dependencies (pyproject.toml:32-34)
The dev dependencies include ruff, but the format/lint CI job reinstalls it separately. This creates drift risk.

  • Fix: Use pip install -e ".[dev]" in the check job too, or document why ruff is special

4. Incomplete test coverage

  • Only tests the happy path of get_status()
  • No tests for the actual @mcp.tool() decorator integration
  • No tests for error cases
  • Add: Test that the FastMCP server can actually start and expose tools

🔍 Code Quality

pyproject.toml

Line 40-41: Incorrect package configuration

[tool.hatch.build.targets.wheel]
packages = ["src/session_analytics"]

This should be:

packages = ["src"]

The current config will look for src/src/session_analytics/ which doesn't exist.

Line 53: Consider stricter linting

select = ["E", "F", "I", "N", "W", "UP"]

Consider adding:

  • "B" - bugbear (catches common bugs)
  • "C4" - comprehensions
  • "SIM" - simplify
  • "RUF" - ruff-specific rules

server.py

Line 7-12: Redundant function
The _get_status_impl() function is only called from one place. Unless you're planning to reuse it elsewhere, inline it:

@mcp.tool()
def get_status() -> dict:
    """Get ingestion status and database stats."""
    return {
        "status": "ok",
        "message": "Session analytics server is running",
    }

Missing type hints
According to CLAUDE.md, you'll need types for the full tool suite. Consider using TypedDict or Pydantic for return types once you implement the real tools.

README.md

Line 32-34: Incomplete tool list
The README only lists 3 tools, but CLAUDE.md lists 10. This creates confusion about the project scope.

  • Fix: Either mark tools as "Planned" or align the README with current reality

⚡ Performance

No performance concerns at this stage. FastMCP is appropriately lightweight for an MCP server.

🔒 Security

Low: Hardcoded paths in CLAUDE.md
References to ~/.claude/ paths are fine for documentation but ensure the actual implementation uses configurable paths or proper XDG conventions for cross-platform support.

🧪 Test Coverage Recommendations

Add these test cases to tests/test_server.py:

import pytest
from session_analytics.server import mcp


def test_mcp_server_has_tools():
    """Verify that tools are registered with FastMCP."""
    tools = mcp.list_tools()
    assert "get_status" in [tool.name for tool in tools]


def test_get_status_structure():
    """Test that get_status returns required fields."""
    from session_analytics.server import _get_status_impl
    result = _get_status_impl()
    assert isinstance(result, dict)
    assert result["status"] == "ok"
    assert isinstance(result["message"], str)


@pytest.mark.asyncio
async def test_mcp_server_starts():
    """Test that the MCP server can be instantiated."""
    # This ensures the server doesn't crash on import
    assert mcp is not None
    assert mcp.name == "session-analytics"

📋 Action Items

Must fix before merge:

  • Fix pyproject.toml packages configuration (line 40-41)
  • Resolve Python version mismatch (test 3.10, 3.11, 3.12 or require >=3.12)
  • Add exports to src/session_analytics/__init__.py

Should fix:

  • Install ruff via dev dependencies in check job
  • Add more comprehensive tests
  • Align README tool list with reality

Nice to have:

  • Add stricter ruff rules
  • Inline _get_status_impl() or justify keeping it separate

🎯 Verdict

Request Changes - The Python version mismatch and package configuration issues need resolution before merge. The foundation is solid, but these issues will cause problems in production.

Great work on getting CI set up! This is exactly the right infrastructure to build on.

🤖 Generated with Claude Code

@claude

claude Bot commented Dec 31, 2025

Copy link
Copy Markdown

PR Review: Python CI Workflow

Thanks for setting up the CI infrastructure! This is a solid foundation. Here's my detailed review:

✅ Strengths

  1. Clean CI Configuration: The GitHub Actions workflow is well-structured and follows modern best practices
  2. Proper Separation: Format/Lint and Test jobs are appropriately separated
  3. Version Consistency: Using Python 3.12 consistently across jobs
  4. FastMCP Alignment: Dependencies and structure match the claude-event-bus reference implementation

🔍 Code Quality & Best Practices

pyproject.toml (pyproject.toml:1-54)

  • ✅ Good use of modern Python packaging with hatchling
  • ✅ Appropriate license and metadata
  • ⚠️ Issue: requires-python = ">=3.10" but CI only tests 3.12. Consider either:
    • Testing multiple versions (3.10, 3.11, 3.12) in the matrix, OR
    • Raising the minimum to ">=3.12" if that's the actual requirement
  • ⚠️ Issue: The hatch.build configuration specifies packages = ["src/session_analytics"] but hatch expects ["session_analytics"] when using src layout. This will work but may cause issues with package discovery.

CI Workflow (.github/workflows/python.yml:1-43)

  • ✅ Proper use of actions/checkout@v4 and actions/setup-python@v5
  • ✅ Triggers on both push to main and PRs
  • ⚠️ Minor: The test job includes a matrix strategy for python-version but only tests one version (3.12). Either add more versions or simplify by removing the matrix.
  • 💡 Suggestion: Consider adding a concurrency group to cancel outdated PR runs

Server Implementation (src/session_analytics/server.py:1-28)

  • ✅ Clean minimal implementation for initial CI setup
  • ✅ Good separation of implementation (_get_status_impl) from MCP tool decorator
  • ✅ Proper docstrings
  • 💡 Suggestion: Consider adding type hints for better IDE support and runtime validation

Tests (tests/test_server.py:1-10)

  • ✅ Tests the implementation directly, not through the MCP layer (good for unit testing)
  • ✅ Basic assertions cover the expected structure
  • ⚠️ Coverage Gap: No test for the actual MCP tool get_status() - only the implementation
  • 💡 Suggestion: Add async test for the MCP tool itself

README (README.md:1-34)

  • ✅ Clear, concise documentation
  • ⚠️ Inconsistency: README shows only 3 MCP tools in the table, but CLAUDE.md lists 10 tools. This is fine for initial state but could be confusing.

🐛 Potential Issues

  1. Python Version Matrix: The test job uses a matrix but only includes one Python version. Remove the matrix or add more versions.
  2. Package Configuration: The hatch packages path may need adjustment.
  3. Missing Makefile: CLAUDE.md references make check, make install, etc., but there's no Makefile in this PR. Is that intentional for a future PR?

🔒 Security Concerns

  • ✅ No security issues identified
  • ✅ Dependencies are minimal and from trusted sources (fastmcp, uvicorn, pytest, ruff)
  • ✅ No hardcoded secrets or sensitive data

⚡ Performance Considerations

  • ✅ CI is optimized with separate jobs that can run in parallel
  • ✅ No unnecessary work in the workflow
  • 💡 Future: Consider caching pip dependencies to speed up CI runs

🧪 Test Coverage

  • ⚠️ Limited: Only one basic test currently
  • This is acceptable for initial CI setup, but the project will need comprehensive tests for:
    • Storage layer (SQLite operations)
    • Ingest layer (JSONL parsing)
    • Query implementations
    • Pattern detection
  • 💡 Consider adding pytest-cov for coverage reporting in CI

📝 Recommendations

High Priority:

  1. Fix Python version matrix: either test multiple versions or remove the matrix strategy
  2. Verify hatch package configuration works correctly

Medium Priority:
3. Align README with CLAUDE.md or add a note that other tools are "coming soon"
4. Add test for the MCP tool wrapper, not just the implementation

Nice to Have:
5. Add pip caching to CI
6. Add concurrency control for PR builds
7. Add coverage reporting
8. Consider adding ruff format/check to pre-commit hooks

✅ Verdict

This is a solid first PR that establishes the CI foundation correctly. The code is clean, follows best practices, and aligns with the FastMCP patterns. The issues identified are minor and mostly about consistency and future-proofing. Once the Python version matrix issue is resolved, this is ready to merge.

Would you like me to suggest specific fixes for any of these issues?

@evansenter evansenter merged commit 337c1e5 into main Dec 31, 2025
6 of 8 checks passed
@evansenter evansenter deleted the add-python-ci branch December 31, 2025 05:25
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.

1 participant