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.2 — 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.2.tar.gz (35.3 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.2-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.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (689.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

pulci-0.0.2-cp312-cp312-win_amd64.whl (621.8 kB view details)

Uploaded CPython 3.12Windows x86-64

pulci-0.0.2-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.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (689.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

pulci-0.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (689.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

pulci-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (689.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

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

File metadata

  • Download URL: pulci-0.0.2.tar.gz
  • Upload date:
  • Size: 35.3 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.2.tar.gz
Algorithm Hash digest
SHA256 a8e14cdf5239d513419ae60a8afa2944d94916bb8e149fa8d0c2df4be7392f35
MD5 03d0cf3b70eb8746ee0344ac6d4c689d
BLAKE2b-256 de62d40468f330c855e8a35a893d1e0ecc45bb7450428ec9d1321cb62e9eb26b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pulci-0.0.2.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.2-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.2-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 041d8c43184402a1b8da19006cc85a78dc99302478dbf33d64cb2262c4229bd5
MD5 585d4adb7aba334b9e5e7287cdee01c5
BLAKE2b-256 076d0323e72533d4a525c5dd0d7d5e985ffbfd99733064f60ce095a375a39340

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pulci-0.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3172f9293b45ea5502d247808a930b13c4c28ca546392477e79d40ed2af88914
MD5 501f288b5531309f37675fc845f0be8c
BLAKE2b-256 2b2b023501877f1a41f0a64712806e0c73f7697b91b0c90609e9c50fc717b791

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pulci-0.0.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 621.8 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.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c807d79efbd4ab4ae9b55a6dd833d45e634fcf189542744752256d98e4edca6a
MD5 45fa1ad3274c9c3a2c2e5ab9aeb48480
BLAKE2b-256 6a19bbd024a81c8486a81d7b9438ac1de9791a5d847cf3bb26701c992a7ae4c7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pulci-0.0.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 885bd2fb2d79ca9118315d8723228259793a19cadd68224e09a4ae1cbfe35cbb
MD5 c7dbbc94c8fa9a8cc221aa9e0c10523f
BLAKE2b-256 51af284a51d55aeea8aa04eb74ac57476abd92e8f4169187c85b02ea7a846465

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pulci-0.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0a44f665c6b1ea2da4d42e8b4171163b3a347fc8fc7a3678196f0e0f890f0fd3
MD5 a2d57a75b7be80d408424d22e847db48
BLAKE2b-256 9b926ff27f1b662a11b65b1300e6fd0482b114f3edf7dfb925216d409860ecd8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pulci-0.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 29b3e471620cdc7ecb24b1757dfdad8e373cde826c182d652f101ae9af76d5e8
MD5 4a2a32a22886164d7921362b140a07a0
BLAKE2b-256 85939867d0e8806f0f1b0d3dafedb6923fb13ea5143c5b6727a3483c6b32f384

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pulci-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f9c0533c4ec619ce386f0358e88709d9e385beafb587a32c9d1f415435410083
MD5 eb1eadd07b6c60721bb60dd937eb7179
BLAKE2b-256 afd6e07a7c4910ef97652a6e2ae13ce4ba09033dc447647777e9492a97327ab0

See more details on using hashes here.

Provenance

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