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.3 — 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, dozens to hundreds of times per 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 Compiler-style + JSON Agents

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

Demo

pulci watching a project for changes

MCP server

pulci ships an MCP server for Claude Desktop, Cursor, and any MCP-compatible host.

pulci mcp info          # prints the config block to paste into your host
pulci mcp               # starts the server (stdio)
pulci mcp /path/to/project  # explicit project root

pulci mcp info output (paste into claude_desktop_config.json or .cursor/mcp.json):

{
  "mcpServers": {
    "pulci": {
      "command": "/path/to/.venv/bin/pulci",
      "args": ["mcp"]
    }
  }
}

Once configured, the host exposes the pulci_status tool — agents call it instead of invoking ruff/ty/pytest directly.

For AI agents

AI coding agents (Claude Code, Cursor, Codex) should start at docs/AGENTS.md.

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

Install

pip install pulci
pulci --version

From source (to modify the Rust core — requires 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

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           # suppress startup messages; structured exit events

Output — compiler-style diagnostics, one per line (same in both modes):

src/foo.py:12:1: error[ruff/F401] 'os' imported but unused
1 error, 0 warnings (3 files checked, 0.4s)

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,
  "state_version": 7,
  "timestamp": "2026-05-16T12:00:00Z",
  "summary": { "errors": 2, "warnings": 1, "checks_run": 3, "stale": false },
  "tools": [
    {"name": "ruff", "version": "0.7.4", "source": "local-venv", "path": ".venv/bin/ruff"},
    {"name": "ty",   "version": "0.0.3", "source": "uvx-latest", "path": null}
  ],
  "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)

[tools]          # optional — pin exact versions for reproducibility
ruff   = "0.7.4" # uses uvx ruff@0.7.4 instead of auto-resolving
ty     = "0.0.3"

If pulci.toml is absent, defaults apply (ruff=true, ty=true, pytest=false). If [tools] is absent, pulci resolves each tool automatically: .venv/bin/<tool>$PATHuvx <tool>.

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.

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.3.tar.gz (44.6 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.3-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.2 MB view details)

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

pulci-0.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (715.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

pulci-0.0.3-cp312-cp312-win_amd64.whl (654.4 kB view details)

Uploaded CPython 3.12Windows x86-64

pulci-0.0.3-cp312-cp312-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

pulci-0.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (716.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

pulci-0.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (716.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

pulci-0.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (716.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

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

File metadata

  • Download URL: pulci-0.0.3.tar.gz
  • Upload date:
  • Size: 44.6 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.3.tar.gz
Algorithm Hash digest
SHA256 1e773afdece963e038403b750862080ac5ff7529758f4d43d6477cf50c443221
MD5 81d426976dd9317cc3803c0b3bf1f579
BLAKE2b-256 df7d2959f7c9b9d848f7f05fca3013bcd7f00e746387920858b34bc212b0105e

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.3.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.3-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.3-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 691d8aebd69268283d29bddb9a68948273f5bf509794afb714b607f5a9a297cb
MD5 cc402f1a93729aa404c999e1208b8bd4
BLAKE2b-256 dcd17260b991320ce3684dad4d73e0e7db8b15f6baf8b6145c1a8e2b49f3d46b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.3-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.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 46232567e1d8be67909d3e7b19196ffc7999bb6185953c7be4dc1efd63f5f88d
MD5 76bef28e7a3b6bde1e99869a299baea2
BLAKE2b-256 ebcb4f0b79c59dd159e129d476fe6f36166617042fb1d21371042dc298a71cdf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.3-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.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pulci-0.0.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 654.4 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.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c760531ad4a5e3743bd38bc46baf704123790f84bf222df9df072a980ac6780b
MD5 deda205530baceab1b1bd5b6194ef9dc
BLAKE2b-256 8cb520dfebc32c1a533dd8b0c3583224df7acf4e3081278bae85e1583b48a99d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.3-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.3-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.3-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c1a31163bf5bd8bf0a7efaebd62aba7c27eabb6f60d3ed8a401e0420c231ac4c
MD5 a3f8b383587964e6b78793d09bc8e5ed
BLAKE2b-256 1034b480b9c4acfbef8d17f9e2169decd9b2e9276439a766d5a783d7598a789c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.3-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.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 18cd035b1eda0b2acd543efd16c36c78a135a081be4905014b56617f1f444722
MD5 b2a90ff0e91ce0b6384c5087c088893b
BLAKE2b-256 5da13d4403b805a0c3bccfe761f84066cc7c68b5403189a9c16bb77f1f461488

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.3-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.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ca36159c8d41ceb8198d04de77284e411c3d218dbc6670dbae5873a4d983a5d1
MD5 dd709431785bc250c722541a8d9015f7
BLAKE2b-256 440a32df446d43cf066325f82e2b04205e7c56e410b221a31be54f773b785edf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.3-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.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pulci-0.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 64f264095892d93042915034f05f17452ab7dc9af868b5c9e1cf07a96d2d39f2
MD5 53a7e3cbf4524952ebea862cf547f40b
BLAKE2b-256 60312d80c0881d39588827e4f31cefae5fd8199cd65efdf76ce50c2a2a3a0d59

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.3-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