Skip to content

chore: update dependencies to latest #338

chore: update dependencies to latest

chore: update dependencies to latest #338

Workflow file for this run

name: Quality Gate
on:
push:
branches: [main, master, develop]
pull_request:
branches: [main, master, develop]
release:
types: [created]
# Cancel any in-progress runs when a new run starts
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
block-todo-stub-code:
name: "🚫 Block TODO/STUB/FAKE Code"
runs-on: hanzo-build-linux-amd64
steps:
- uses: actions/checkout@v4
- name: "🔍 Search for forbidden patterns in hanzo-mcp"
run: |
echo "Searching for problematic TODO/STUB patterns in hanzo-mcp..."
# Focus on hanzo-mcp package only (other packages may have legitimate TODOs)
# We look for specific problematic patterns, not all TODOs
FOUND_ISSUES=0
# Check for stub functions that return "TODO" or "STUB" strings
echo "Checking for stub return values..."
if grep -rn --include="*.py" -E "return\s+['\"]TODO['\"]|return\s+['\"]STUB['\"]" pkg/hanzo-mcp/hanzo_mcp/ 2>/dev/null; then
echo "❌ Found stub return values"
FOUND_ISSUES=1
fi
# Check for empty pass-only functions (excluding fallback stubs in except blocks)
echo "Checking for empty functions..."
# This is better handled by the pytest test_no_stubs.py
# Check for explicit "STUB:" or "FAKE:" comments indicating unfinished code
echo "Checking for explicit stub markers..."
if grep -rn --include="*.py" -E "#\s*(STUB|FAKE|UNFINISHED):" pkg/hanzo-mcp/hanzo_mcp/ 2>/dev/null; then
echo "❌ Found explicit stub markers"
FOUND_ISSUES=1
fi
if [ $FOUND_ISSUES -eq 1 ]; then
echo "🚫 DEPLOYMENT BLOCKED: Remove stub/fake code before deploying!"
exit 1
fi
echo "✅ No forbidden stub patterns found in hanzo-mcp"
echo "Note: Other packages may contain legitimate TODO comments for documentation"
test-no-stubs:
name: "🧪 Anti-Stub Tests"
runs-on: hanzo-build-linux-amd64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install dependencies
run: |
pip install uv
uv venv
source .venv/bin/activate
uv pip install -e ./pkg/hanzo-mcp[test]
- name: "Run anti-stub tests"
run: |
source .venv/bin/activate
cd pkg/hanzo-mcp
python -m pytest tests/test_no_stubs.py -v --tb=short
- name: "Verify no incomplete implementations"
run: |
source .venv/bin/activate
cd pkg/hanzo-mcp
# Run the test file directly for extra validation
python tests/test_no_stubs.py
all-tests-must-pass:
name: "✅ ALL Tests Must Pass"
runs-on: hanzo-build-linux-amd64
strategy:
fail-fast: true # Stop immediately if any test fails
matrix:
python-version: ['3.12']
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install test dependencies
run: |
pip install uv
uv venv
source .venv/bin/activate
# Install hanzo-mcp with test deps and optional memory/agents packages
uv pip install -e ./pkg/hanzo-mcp[test,memory,agents]
# Install sibling packages for integration tests
uv pip install -e ./pkg/hanzo-memory || true
uv pip install -e ./pkg/hanzo-network || true
# Override PyPI versions with local tool packages (monorepo)
uv pip install -e ./pkg/hanzo-tools -e ./pkg/hanzo-tools-core \
-e ./pkg/hanzo-tools-agent -e ./pkg/hanzo-tools-shell -e ./pkg/hanzo-tools-fs \
-e ./pkg/hanzo-tools-memory -e ./pkg/hanzo-tools-todo -e ./pkg/hanzo-tools-reasoning \
-e ./pkg/hanzo-tools-browser -e ./pkg/hanzo-tools-lsp -e ./pkg/hanzo-tools-refactor \
-e ./pkg/hanzo-tools-computer -e ./pkg/hanzo-tools-config -e ./pkg/hanzo-tools-api \
-e ./pkg/hanzo-tools-vcs -e ./pkg/hanzo-tools-net -e ./pkg/hanzo-tools-plan \
-e ./pkg/hanzo-tools-jupyter -e ./pkg/hanzo-tools-llm 2>/dev/null || true
- name: "🧪 Run ALL tests"
run: |
source .venv/bin/activate
cd pkg/hanzo-mcp
# Run all working tests with strict mode
# Note: Some async tests require specific pytest-asyncio configuration
# The core test suite validates CI requirements
python -m pytest tests/test_agent_tools_ci.py tests/test_llm_warnings.py \
-v \
--strict-markers \
--tb=short \
2>&1 | tee test-output.log
# Run additional simple tests
python -m pytest tests/test_hanzo_mcp_simple.py::test_cli_help \
tests/test_hanzo_mcp_simple.py::test_cli_version \
tests/test_hanzo_mcp_simple.py::test_import_tools \
-v --tb=short 2>&1 | tee -a test-output.log
# Check if any tests failed
if grep -q "FAILED" test-output.log; then
echo "❌ TESTS FAILED! All tests must pass!"
exit 1
fi
echo "✅ All tests passed!"
code-quality:
name: "🎯 Code Quality Check"
runs-on: hanzo-build-linux-amd64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install quality tools
run: |
pip install ruff mypy pyright bandit
- name: "🔍 Lint with ruff"
run: |
cd pkg/hanzo-mcp
ruff check hanzo_mcp tests --fix --exit-non-zero-on-fix
- name: "🔍 Type check with mypy"
run: |
cd pkg/hanzo-mcp
mypy hanzo_mcp --ignore-missing-imports --strict || true
- name: "🔍 Security scan with bandit"
run: |
cd pkg/hanzo-mcp
bandit -r hanzo_mcp -f json -o bandit-report.json || true
if [ -f bandit-report.json ]; then
python -m json.tool bandit-report.json
fi
function-implementation-check:
name: "🔨 Verify Functions Are Implemented"
runs-on: hanzo-build-linux-amd64
steps:
- uses: actions/checkout@v4
- name: "Check for empty functions"
run: |
echo "Checking for empty functions with only 'pass'..."
# Find functions that only contain pass
FOUND_EMPTY=0
for file in $(find pkg/hanzo-mcp -name "*.py" -not -path "*/test*"); do
# Look for functions with only pass
if grep -Pzo "def\s+\w+\([^)]*\):\s*\n\s*pass\s*$" "$file" 2>/dev/null; then
echo "❌ Empty function found in: $file"
FOUND_EMPTY=1
fi
# Look for functions with only ellipsis
if grep -Pzo "def\s+\w+\([^)]*\):\s*\n\s*\.\.\.\s*$" "$file" 2>/dev/null; then
echo "❌ Ellipsis-only function found in: $file"
FOUND_EMPTY=1
fi
done
if [ $FOUND_EMPTY -eq 1 ]; then
echo "🚫 BLOCKED: Empty functions detected! Implement them properly!"
exit 1
fi
echo "✅ All functions have implementations"
block-deployment:
name: "🚀 Deployment Gate"
needs:
- block-todo-stub-code
- test-no-stubs
- all-tests-must-pass
- code-quality
- function-implementation-check
runs-on: hanzo-build-linux-amd64
if: github.event_name == 'release' || github.ref == 'refs/heads/main'
steps:
- name: "✅ Quality Gate PASSED"
run: |
echo "✅ All quality checks passed!"
echo "✅ No TODOs, STUBs, or FAKE code found"
echo "✅ All tests are passing"
echo "✅ All functions are implemented"
echo "🚀 Ready for deployment!"
- name: "📦 Prepare for PyPI deployment"
if: github.event_name == 'release'
run: |
echo "Ready to deploy to PyPI"
echo "Version: ${{ github.event.release.tag_name }}"
publish-to-pypi:
name: "📦 Publish to PyPI"
needs: [block-deployment]
if: github.event_name == 'release'
runs-on: hanzo-build-linux-amd64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Build package
run: |
pip install uv
cd pkg/hanzo-mcp
uv build
- name: Publish to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: |
pip install twine
cd pkg/hanzo-mcp
twine upload dist/* --non-interactive --skip-existing