Skip to main content

Continuous quality gate daemon for agent-driven Python development.

Project description

pulci

Continuous quality gate daemon for agent-driven Python development.

CI License Python 3.10+ Rust

v0.0.1 — Apache-2.0 — docs/AGENTS.md

Why

When AI coding agents (Claude Code, Cursor, Codex) iterate on a Python project, they invoke ruff check, ty check, pytest over and over. Pre-commit hooks run at commit time. CI runs even later. Nothing in the existing tooling stack was designed for the loop an agent actually runs: edit → check → edit, fifty times an hour.

pulci is a small daemon — Rust core, Python CLI — that runs your configured quality gates continuously as files change, and exposes the aggregated state as structured JSON. Agents stop re-invoking tools; they query state.

Comparison

Tool When it runs Output format Built for
pre-commit Commit time Human terminal Humans
prek Commit time (fast) Human terminal Humans
MegaLinter CI time Reports CI/CD
pytest-watch File change Human terminal Humans
pulci Iteration time Structured JSON Agents

pulci does not replace any of these. It fills the empty quadrant.

For AI agents

If you are an AI coding agent, start here: docs/AGENTS.md

The short version: run pulci start --agent once, then call pulci status --json after each edit instead of invoking ruff/ty/pytest directly.

Install

Prerequisites: Rust stable and uv.

git clone https://github.com/grego-casparri/pulci
cd pulci
uv sync
uv run maturin develop --release
uv run pulci --version

PyPI wheels are planned for v0.1.

Usage

Start the daemon (runs in foreground; press Ctrl-C to stop):

pulci start                   # watches current directory, human output
pulci start /path/to/project  # explicit root
pulci start --agent           # compact JSON events — use this in agent loops

Agent mode output (one JSON line per check):

{"event":"check","files":2,"errors":3,"warnings":1,"checks_run":2,"stale":false}

(stale is always false in v0.0.1 — reserved for a future release)

Query current state (reads .pulci/state.json):

pulci status                        # human-readable table
pulci status --json                 # full JSON for agents
pulci status /path/to/project --json

Sample pulci status --json output:

{
  "schema_version": 1,
  "timestamp": "2026-05-16T12:00:00Z",
  "summary": { "errors": 2, "warnings": 1, "checks_run": 2, "stale": false },
  "diagnostics": [
    {
      "tool": "ruff",
      "file": "src/foo.py",
      "line": 12,
      "col": 1,
      "severity": "error",
      "code": "F401",
      "message": "'os' imported but unused"
    }
  ]
}

Configuration

Create pulci.toml in the project root (all fields optional):

[hooks]
ruff   = true    # ruff check on changed .py files (default: true)
ty     = true    # ty check on changed .py files  (default: true)
pytest = false   # pytest on tests/test_<changed>.py (default: false)

If pulci.toml is absent, defaults apply (ruff=true, ty=true, pytest=false).

Benchmark

A benchmark script is included to compare pulci against manual tool invocation and prek across N iterations:

uv run python benchmarks/bench_modes.py --iterations 50

Metrics: mean/p50/p95 latency per iteration, total wall time, estimated output tokens per iteration. pulci's compact state.json is a fixed-schema file; manual tool output grows linearly with the number of violations.

State file contract

.pulci/state.json is the primary contract between pulci and consumers. Schema version is 1 and will be bumped on breaking changes.

Full schema documented in docs/AGENTS.md.

Roadmap

  • File watcher with debounce and ignore filters
  • ruff, ty, and pytest hook adapters with parallel execution
  • Aggregated JSON state, atomic write, hash-based cache
  • pulci.toml config, --agent output mode
  • Benchmark suite
  • PyPI wheels (v0.1)
  • MCP server interface (v0.2)
  • mypy / basedpyright / bandit adapters (v0.2)

Contributing

See CONTRIBUTING.md.

License

Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pulci-0.0.1.tar.gz (27.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pulci-0.0.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.1 MB view details)

Uploaded CPython 3.14macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

pulci-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (638.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

pulci-0.0.1-cp312-cp312-win_amd64.whl (567.5 kB view details)

Uploaded CPython 3.12Windows x86-64

pulci-0.0.1-cp312-cp312-musllinux_1_2_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

pulci-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (638.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

pulci-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (638.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

pulci-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (638.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

Details for the file pulci-0.0.1.tar.gz.

File metadata

  • Download URL: pulci-0.0.1.tar.gz
  • Upload date:
  • Size: 27.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pulci-0.0.1.tar.gz
Algorithm Hash digest
SHA256 4ebc9acaf8556fc9d48bcab2df85bb7a3cf59bba448c9124779af83f707d8c37
MD5 47c0efbee0b4125799ebfed2fdd4f7fb
BLAKE2b-256 bc1f89be0a221a7f7c7a3e412d9ab1410c14c6ad08de9746cfeea7bf7b2b093f

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.1.tar.gz:

Publisher: release.yml on grego-casparri/pulci

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pulci-0.0.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for pulci-0.0.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 66e470a342d6490442ba4f10f3e465dc7541322ba69cd2ce3629a8c98eaf4294
MD5 c3d79a349d13a40b1b7b5b596d4d004e
BLAKE2b-256 a8e8c79824076bf1d2a3ad25064b2bb324eef3ef313abf470bea9caebcb5b96b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: release.yml on grego-casparri/pulci

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pulci-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fe8dfb853038f8ebb87feb907115080bcedf2dbd0b5807bf928c21a699596edd
MD5 f1bc40e50603fd7a86754aed7c31a7b4
BLAKE2b-256 9923b3240354baf73f596d7a095a08dcfbe5362531c13f25a0b8cc7b0a6bbc87

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on grego-casparri/pulci

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pulci-0.0.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pulci-0.0.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 567.5 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pulci-0.0.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cf24dc87d5be5c334b0b2c658ccfee1f045c1e7caeee74854a36265813d40664
MD5 bcc633f231bcbe70ca84503b03e96980
BLAKE2b-256 df0215f3b9fe8703e61d306041f47987d5f89c228ca6a99f4024265c7a4e2fa2

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.1-cp312-cp312-win_amd64.whl:

Publisher: release.yml on grego-casparri/pulci

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pulci-0.0.1-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7bbc1a5a46147f86955e65b2786d8fd3bfbd20ae0765646f5764909505da5035
MD5 b17fb212a65019a49b858cbfde0a50d7
BLAKE2b-256 5cb1e0f1fa01a06ad5d1b8ba1ee768589c653379343a102ea74a215bf6d15c88

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.1-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: release.yml on grego-casparri/pulci

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pulci-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 53644cd353eca23954debb03456330c1303c6748b1abf98044d836e196f799b1
MD5 98060b41733ebd1d6f14ec5db7b30f5f
BLAKE2b-256 d7364b477a3816171fa74291ae8d3563faf68fda1930951e8ad6c772761c12e7

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on grego-casparri/pulci

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pulci-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 58e327bc18d6ee6ff5fea802160828469e5f50e8d6599f17efa23b889cd40bb8
MD5 3bea243006b302283426c987c9fcc3bc
BLAKE2b-256 73a98f0dae6bec4cb26b4866f5674bf93392a3d70750116b88c0e519509bc522

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on grego-casparri/pulci

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pulci-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 db79223aa6ff8944b1dbc820b09a3cebfe430ac89584611a40b103fdbbd59ca1
MD5 176514ec2b9c3b84c94fb331370937f7
BLAKE2b-256 8b626d217684fca84165e43dc8ad9caaa785b6d9e45d74334c8d4b62fc2fbe0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on grego-casparri/pulci

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page