hermes-labs-ai/quick-gate-python
v0.3.2Apache-2.0
Python quality gate CLI for Ruff, Pyright, and pytest with bounded auto-repair and escalation artifacts
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.3.2 - 2026-09-19
Fixed
- CLI commands now report missing, unreadable, or malformed inputs for
run --changed-files,summarize --input, andrepair --inputas clear diagnostics with exit code 2 instead of exposing raw tracebacks. - Pre-commit hooks now install the gate tools they run.
language: pythoninstalled PyGate's runtime dependencies only, so the first run in a clean environment reported every gate asmissing(exit code 127) instead of gating anything: Ruff, Pyright, and pytest are[dev]extras and pre-commit's hook environment is isolated. Both hook ids now declare exactadditional_dependenciespins —pygateinstalls Ruff and Pyright,pygate-fulladds pytest andpytest-json-report.
Added
- The root GitHub Action can optionally render a bounded, status-only job summary with the final status, recognized check counts, repair state, PyGate version, and source link; the action smoke fixture covers the enabled path.
- The repository root is now a portable Agent Plugin with one canonical skill, host manifests for Agent Plugins, Claude Code, and Gemini CLI, and local Claude Code and Codex marketplace entries plus install/readback guidance.
- Added machine-readable CodeMeta software metadata.
- Manifest regression coverage for the hook dependency pins, plus a check that
.pre-commit-hooks.yamlpassespre-commit validate-manifest. - Added regression coverage for the action summary, clean CLI input errors, and plugin, marketplace, Gemini, and pre-commit integration surfaces.
- README documentation of the hook pins, of the Node runtime the Pyright distribution fetches on
a first run, and of the caller-owned project test dependencies that an isolated
pygate-fullenvironment cannot supply.
Changed
- README and
llms.txtnow document portable plugin installs and native pre-commit routes; README also documents the action summary option and current version readback. - The documented pre-commit
revis an immutable commit (00e561917dd1772252773aef060c07c2b8719377, the working hook manifest) instead of the mutablemainbranch, matching the root action's pinning policy, and a regression test keeps it a 40-character commit SHA.llms.txtdocuments the hook route with the same pin.
0.3.1 - 2026-09-12
Fixed
- Reject stale pytest JSON reports: the pytest gate clears an existing report before execution, so a failed or interrupted run (including custom pytest commands) can no longer be masked by a pre-existing report.
- Preserve fixture setup and teardown failures as actionable test findings without duplicating test items.
0.3.0 - 2026-09-07
Added
python -m pygate.evidence: emit apygate runevaluation as a Hermes Reliability Lab result envelope (tool, version, status, input hash, non-passing checks, native findings, exit code, timestamp, Git commit) with the ordinarygate-result/v1payload embedded verbatim. No change to gate resolution or scoring.
0.2.2 - 2026-09-05
Fixed
- Allow filenames containing consecutive dots (for example,
version..py) in deterministic repair scope while continuing to reject parent-directory paths.
Changed
- Updated Action pinning guidance after publication:
v0.2.1is the first release tag containing the rootaction.yml; the audited commit remains the reproducible supply-chain pin.
0.2.1 - 2026-09-04
Added
- Added
tests/test_fresh_repo_integration.py, a real-subprocess fresh-repository proof: it builds throwaway projects from the existingtests/action-fixture/fixtures and runs the installedpygatebinary (with real Ruff and Pyright, no mocked tool output) to demonstrate, end to end, that a clean project passes, a non-fixable type error fails the gate and repair correctly escalates, and a Ruff-fixable lint issue is auto-repaired back to a passing gate. Isolated behind a newintegrationpytest marker (addopts = "-m 'not integration'"inpyproject.toml) so it is excluded from the defaultpytestrun and its "mocked tool output only" invariant. Run it explicitly withpytest -m integration. - Added a
ci.ymlintegrationjob that installs.[dev](which suppliespygate,ruff, andpyrightonPATH) and runspytest -m integration -v, so the real-subprocess proof above runs on every push and pull request againstmain, alongside (not in place of) the existing offlinetestjob and the GitHub-composite-action proof inaction-smoke.yml. - Added
tests/test_docs_action_pin.py, a regression contract asserting that every documented root-action reference is a 40-character commit SHA and that all documented pins agree.
Fixed
- Corrected the root-action pin in
llms.txt, which still referenced the superseded1a70edccommit after the audited pin moved to671e8db. - Replaced the "replace it with an immutable release tag when one exists" guidance in
README.md,SECURITY.md, andllms.txt. The publishedv0.1.0,v0.1.1, andv0.2.0tags predate the rootaction.yml, so following that guidance produced a workflow that cannot resolve the action.
Boundaries
- This release does not change any gate, repair, or CLI behavior; the package version moves only
because CI now runs an additional, previously-unwired proof and the docs/pin corrections above
ship with it. It does not by itself change root-action pinning guidance: continue to pin the
root action at an audited commit, not at a PyPI release tag, until the README's "Pinning
policy" section is updated to name a tag cut at or after
action.ymllanded.
0.2.0 - 2026-08-08
Added
- Added the side-effect-free
pygate.api.evaluateprimitive with argv-safe command execution, bounded timeouts, capped output, snapshot binding, and thegate-result/v1contract. - Added explicit CLI artifact output via
--output-dir;pygate runwithout it emits JSON without creating worktree state.
Changed
- Standardized the cross-engine discriminator as
"schema": "gate-result/v1"and aligned result/check status enums with QuickGate.js and HermesGate. - Made
--changed-filesoptional for whole-project runs and made the composite action install its checked-out source instead of a registry version.
0.1.2 - 2026-05-30
Changed
- Updated project metadata: copyright holder, maintainer contact, and citation files.
0.1.1 - 2026-03-02
Fixed
- Standardized copyright to Hermes Labs in LICENSE
- Fixed stale GitHub URLs (hermes-labs-ai/pygate → hermes-labs-ai/quick-gate-python)
- Added PyPI version badge to README
0.1.0 - 2026-02-23
Added
pygate runcommand with canary and full modes- Lint gate via ruff with JSON output parsing
- Type-check gate via pyright with JSON output parsing
- Test gate via pytest with json-report plugin
pygate summarizecommand producing agent-friendly briefs (JSON + Markdown)pygate repaircommand with bounded deterministic repair loop- Deterministic fixes:
ruff check --fix+ruff formaton scoped files - Repair safeguards: workspace backup/restore, patch budget, no-improvement abort, time cap
- 7 escalation reason codes with structured evidence
- Rich environment metadata capture (Python version, platform, venv, resolver, packages)
- Configuration via
pygate.tomlor[tool.pygate]inpyproject.toml - Composite GitHub Action for CI integration
- Structured artifacts: failures.json, run-metadata.json, agent-brief.json/md, repair-report.json, escalation.json