diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..88dfa4ec --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,111 @@ +name: CI + +on: + pull_request: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + ruff: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + with: + persist-credentials: false + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: '3.12' + - uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2 + - run: uv sync --frozen + - run: uv run --frozen ruff check . + - run: uv run --frozen ruff format --check . + + mypy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + with: + persist-credentials: false + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: '3.12' + - uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2 + - run: uv sync --frozen + - run: uv run --frozen mypy strix/ + + bandit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + with: + persist-credentials: false + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: '3.12' + - uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2 + - run: uv sync --frozen + - run: uv run --frozen bandit -r strix/ -c pyproject.toml + + pytest: + name: pytest (${{ matrix.python-version }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ['3.12', '3.13', '3.14'] + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + with: + persist-credentials: false + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.python-version }} + - uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2 + - run: uv sync --frozen --python ${{ matrix.python-version }} + - run: uv run --frozen pytest -q + + tui: + runs-on: ubuntu-latest + defaults: + run: + working-directory: strix/interface/tui + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + with: + persist-credentials: false + - uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0 + with: + go-version-file: strix/interface/tui/go.mod + cache-dependency-path: strix/interface/tui/go.sum + - run: test -z "$(gofmt -l .)" + - run: go vet ./... + - run: CGO_ENABLED=0 go build -trimpath -o /dev/null ./cmd/strix-tui + - run: go test -race ./... + + viewer: + runs-on: ubuntu-latest + defaults: + run: + working-directory: strix/interface/viewer/frontend + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + with: + persist-credentials: false + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: '24' + cache: npm + cache-dependency-path: strix/interface/viewer/frontend/package-lock.json + - run: npm ci --no-audit --no-fund + - run: npm run build + - name: Committed viewer bundle matches the build + run: git -C "$GITHUB_WORKSPACE" diff --exit-code --stat -- strix/interface/viewer/static && test -z "$(git -C "$GITHUB_WORKSPACE" status --porcelain -- strix/interface/viewer/static)" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1de107b3..ceaae971 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ exclude: ^strix/interface/viewer/static/assets/ repos: # Ruff for fast linting and formatting - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.13 + rev: v0.15.20 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] diff --git a/tests/test_tool_call_ids_providers.py b/tests/test_tool_call_ids_providers.py index dc72196e..e6dfda29 100644 --- a/tests/test_tool_call_ids_providers.py +++ b/tests/test_tool_call_ids_providers.py @@ -106,7 +106,7 @@ class _Gateway(BaseHTTPRequestHandler): def log_message(self, *args: Any) -> None: pass - def do_POST(self) -> None: # noqa: N802 + def do_POST(self) -> None: length = int(self.headers.get("Content-Length", 0)) body = json.loads(self.rfile.read(length) or b"{}") messages = body.get("messages", [])