Continuous quality gate daemon for agent-driven Python development.
Project description
pulci
Continuous quality gate daemon for agent-driven Python development.
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.tomlconfig,--agentoutput mode - Benchmark suite
- PyPI wheels (v0.1)
- MCP server interface (v0.2)
- mypy / basedpyright / bandit adapters (v0.2)
Contributing
See CONTRIBUTING.md.
License
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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ebc9acaf8556fc9d48bcab2df85bb7a3cf59bba448c9124779af83f707d8c37
|
|
| MD5 |
47c0efbee0b4125799ebfed2fdd4f7fb
|
|
| BLAKE2b-256 |
bc1f89be0a221a7f7c7a3e412d9ab1410c14c6ad08de9746cfeea7bf7b2b093f
|
Provenance
The following attestation bundles were made for pulci-0.0.1.tar.gz:
Publisher:
release.yml on grego-casparri/pulci
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pulci-0.0.1.tar.gz -
Subject digest:
4ebc9acaf8556fc9d48bcab2df85bb7a3cf59bba448c9124779af83f707d8c37 - Sigstore transparency entry: 1552236795
- Sigstore integration time:
-
Permalink:
grego-casparri/pulci@0deb463ac63c7e181c00aec84adc58b15818cc73 -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/grego-casparri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0deb463ac63c7e181c00aec84adc58b15818cc73 -
Trigger Event:
push
-
Statement type:
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
- Download URL: pulci-0.0.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.14, macOS 10.12+ universal2 (ARM64, x86-64), macOS 10.12+ x86-64, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66e470a342d6490442ba4f10f3e465dc7541322ba69cd2ce3629a8c98eaf4294
|
|
| MD5 |
c3d79a349d13a40b1b7b5b596d4d004e
|
|
| BLAKE2b-256 |
a8e8c79824076bf1d2a3ad25064b2bb324eef3ef313abf470bea9caebcb5b96b
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pulci-0.0.1-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl -
Subject digest:
66e470a342d6490442ba4f10f3e465dc7541322ba69cd2ce3629a8c98eaf4294 - Sigstore transparency entry: 1552218001
- Sigstore integration time:
-
Permalink:
grego-casparri/pulci@17c90f492008d0e813ef363aa3a5924b6a53286c -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/grego-casparri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@17c90f492008d0e813ef363aa3a5924b6a53286c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pulci-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: pulci-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 638.0 kB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe8dfb853038f8ebb87feb907115080bcedf2dbd0b5807bf928c21a699596edd
|
|
| MD5 |
f1bc40e50603fd7a86754aed7c31a7b4
|
|
| BLAKE2b-256 |
9923b3240354baf73f596d7a095a08dcfbe5362531c13f25a0b8cc7b0a6bbc87
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pulci-0.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
fe8dfb853038f8ebb87feb907115080bcedf2dbd0b5807bf928c21a699596edd - Sigstore transparency entry: 1552217892
- Sigstore integration time:
-
Permalink:
grego-casparri/pulci@17c90f492008d0e813ef363aa3a5924b6a53286c -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/grego-casparri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@17c90f492008d0e813ef363aa3a5924b6a53286c -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf24dc87d5be5c334b0b2c658ccfee1f045c1e7caeee74854a36265813d40664
|
|
| MD5 |
bcc633f231bcbe70ca84503b03e96980
|
|
| BLAKE2b-256 |
df0215f3b9fe8703e61d306041f47987d5f89c228ca6a99f4024265c7a4e2fa2
|
Provenance
The following attestation bundles were made for pulci-0.0.1-cp312-cp312-win_amd64.whl:
Publisher:
release.yml on grego-casparri/pulci
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pulci-0.0.1-cp312-cp312-win_amd64.whl -
Subject digest:
cf24dc87d5be5c334b0b2c658ccfee1f045c1e7caeee74854a36265813d40664 - Sigstore transparency entry: 1552217788
- Sigstore integration time:
-
Permalink:
grego-casparri/pulci@17c90f492008d0e813ef363aa3a5924b6a53286c -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/grego-casparri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@17c90f492008d0e813ef363aa3a5924b6a53286c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pulci-0.0.1-cp312-cp312-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: pulci-0.0.1-cp312-cp312-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.12, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7bbc1a5a46147f86955e65b2786d8fd3bfbd20ae0765646f5764909505da5035
|
|
| MD5 |
b17fb212a65019a49b858cbfde0a50d7
|
|
| BLAKE2b-256 |
5cb1e0f1fa01a06ad5d1b8ba1ee768589c653379343a102ea74a215bf6d15c88
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pulci-0.0.1-cp312-cp312-musllinux_1_2_x86_64.whl -
Subject digest:
7bbc1a5a46147f86955e65b2786d8fd3bfbd20ae0765646f5764909505da5035 - Sigstore transparency entry: 1552217936
- Sigstore integration time:
-
Permalink:
grego-casparri/pulci@17c90f492008d0e813ef363aa3a5924b6a53286c -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/grego-casparri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@17c90f492008d0e813ef363aa3a5924b6a53286c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pulci-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: pulci-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 638.5 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53644cd353eca23954debb03456330c1303c6748b1abf98044d836e196f799b1
|
|
| MD5 |
98060b41733ebd1d6f14ec5db7b30f5f
|
|
| BLAKE2b-256 |
d7364b477a3816171fa74291ae8d3563faf68fda1930951e8ad6c772761c12e7
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pulci-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
53644cd353eca23954debb03456330c1303c6748b1abf98044d836e196f799b1 - Sigstore transparency entry: 1552217864
- Sigstore integration time:
-
Permalink:
grego-casparri/pulci@17c90f492008d0e813ef363aa3a5924b6a53286c -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/grego-casparri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@17c90f492008d0e813ef363aa3a5924b6a53286c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pulci-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: pulci-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 638.5 kB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58e327bc18d6ee6ff5fea802160828469e5f50e8d6599f17efa23b889cd40bb8
|
|
| MD5 |
3bea243006b302283426c987c9fcc3bc
|
|
| BLAKE2b-256 |
73a98f0dae6bec4cb26b4866f5674bf93392a3d70750116b88c0e519509bc522
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pulci-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
58e327bc18d6ee6ff5fea802160828469e5f50e8d6599f17efa23b889cd40bb8 - Sigstore transparency entry: 1552217817
- Sigstore integration time:
-
Permalink:
grego-casparri/pulci@17c90f492008d0e813ef363aa3a5924b6a53286c -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/grego-casparri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@17c90f492008d0e813ef363aa3a5924b6a53286c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pulci-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: pulci-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 638.5 kB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db79223aa6ff8944b1dbc820b09a3cebfe430ac89584611a40b103fdbbd59ca1
|
|
| MD5 |
176514ec2b9c3b84c94fb331370937f7
|
|
| BLAKE2b-256 |
8b626d217684fca84165e43dc8ad9caaa785b6d9e45d74334c8d4b62fc2fbe0d
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pulci-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
db79223aa6ff8944b1dbc820b09a3cebfe430ac89584611a40b103fdbbd59ca1 - Sigstore transparency entry: 1552217838
- Sigstore integration time:
-
Permalink:
grego-casparri/pulci@17c90f492008d0e813ef363aa3a5924b6a53286c -
Branch / Tag:
refs/tags/v0.0.1 - Owner: https://github.com/grego-casparri
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@17c90f492008d0e813ef363aa3a5924b6a53286c -
Trigger Event:
push
-
Statement type: