Evenflow
Evenflow is an opinionated Rust source linter that runs alongside Clippy. It uses Tree-sitter to check source structure and comments without building your project.
Install and run
Install the Python package (CPython 3.10 or newer):
python -m pip install evenflow
Or install the Rust executable (Rust 1.90 or newer):
cargo install --locked evenflow
Both installations provide the same command:
evenflow check
evenflow check src/ worker/src/
evenflow check . --strict
evenflow check . --format json
evenflow rules
Prebuilt binaries are available from GitHub Releases.
Library usage
Python calls the Rust scanner directly; no subprocess or Rust toolchain is needed when installing a wheel:
import evenflow
report = evenflow.check(["src/"], working_directory="/path/to/project", strict=True)
for diagnostic in report["diagnostics"]:
print(diagnostic["rule"], diagnostic["message"])
check() returns the JSON report schema as a dictionary,
including lint and operational errors. It does not print or change the working
directory. Omit paths to scan the working directory. python -m evenflow runs
the CLI, and evenflow.main(args) returns its exit status.
Rust callers can depend on the evenflow crate and use
evenflow::runner::run(working_directory, paths, strict) to obtain a
evenflow::model::Report; report.exit_code() applies CLI exit semantics.
The Rust API is not yet stable. Python bindings are optional and are enabled by
Maturin; ordinary Cargo builds do not require Python.
GitHub Action
Call Evenflow from another repository's workflow after checking out that repository:
name: Evenflow
on: [push, pull_request]
permissions:
contents: read
jobs:
lint:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
- uses: cmeister2/evenflow@main
The action downloads a prebuilt binary, verifies it against the release's
SHA256SUMS, and runs evenflow check with text diagnostics. No Rust toolchain
or project build is required. Supported runners are Linux x64, macOS ARM64, and
Windows x64; other operating system and architecture combinations fail with an
error.
| Input | Default | Meaning |
|---|---|---|
version |
latest |
Latest stable release, or an exact bare version such as 0.1.1 without a v prefix. |
paths |
. |
Files or directories, one per line, relative to working-directory. |
working-directory |
. |
Directory to scan from, relative to GITHUB_WORKSPACE. |
strict |
true |
Promote enabled warnings to errors. Set false to respect configured rule severities. |
token |
${{ github.token }} |
Token used only for GitHub API reads of releases and assets. |
For example, select a release, scan part of a repository, and allow configured warnings:
- uses: cmeister2/evenflow@main
with:
version: '0.1.1'
working-directory: crates/service
paths: |
src/
examples/request.rs
strict: 'false'
Configuration discovery starts from working-directory using the same
evenflow.toml rules as the CLI. The action preserves CLI exit statuses: 0
passes, 1 fails for error-level lint findings, and 2 fails for tool or analysis
errors. Its default strict mode also fails on warnings.
The examples use @main because the action has not yet been tagged. For
reproducible CI, replace main with a full commit SHA containing the action and
set version to an exact release. Pinning the action alone still uses the latest
binary unless version is set.
Documentation
- Bundled rules: behavior, examples, and exemptions.
- Scope and coverage: checked code, exclusions, and macro limitations.
- Diagnostics and exit status: text output, JSON schema, and exit codes.
- Development: prerequisites, local commands, and adding rules.
Configuration and selection
Evenflow discovers the nearest ancestor of the working directory containing
evenflow.toml; that directory becomes the scan root. Without a configuration
file, the working directory is the root. Ancestor configurations are not merged,
and the target project's Cargo manifest is not required.
exclude = ["src/bindings/**", "src/test_support/**"]
include-tests = false
Set rule levels to off, warning, or error in [rules], using IDs listed by
evenflow rules. Omitted rules use their registered defaults. Warnings do not
fail a run unless --strict promotes them to errors. Strict mode does not enable
disabled rules. Unknown settings, rule IDs, options, and invalid types are errors,
even when the affected rule is off. evenflow rules also lists defaults,
descriptions, and available options.
check accepts Rust files or directories and defaults to the working directory.
It recursively selects .rs files, applies exclusions, deduplicates overlapping
inputs, and scans in stable path order. Exclusion globs use / relative to the
root; **/ matches zero or more directories. Directory symlinks are not followed,
and resolved paths must stay within the root. Explicit missing, unreadable, or
non-Rust inputs, and a selection with no files after exclusions, are errors.
Local suppressions
Use a standalone ordinary comment with one rule ID and a non-empty reason.
In this template, replace RULE_ID with an ID listed by evenflow rules:
// evenflow: allow(RULE_ID): Explain why this exception is needed.
A directive can precede the body-owning construct or its first executable
statement. It suppresses findings for that exact body, not descendants or
siblings. Adjacent directives may address different rules. Mentioning evenflow:
inside other prose does not activate one.
Malformed, trailing, misplaced, unknown-ID, and unused directives are analysis errors. Directives for known disabled rules are inactive rather than unused; unused checks run only for successfully analyzed files with the rule enabled. Analysis errors and coverage notes cannot be suppressed. Use explicit file exclusions for unsupported source. File-wide and baseline suppressions are not supported.
License
Licensed under either Apache License 2.0 or MIT License, at your option.
Metadata
Release files for evenflow 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| evenflow-0.3.0.tar.gz | 83.2 kB | With provenance | Details for evenflow-0.3.0.tar.gz |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| evenflow-0.3.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details for evenflow-0.3.0-cp310-abi3-win_amd64.whl |
| evenflow-0.3.0-cp310-abi3-manylinux_2_28_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ x86-64 | Details for evenflow-0.3.0-cp310-abi3-manylinux_2_28_x86_64.whl |
| evenflow-0.3.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details for evenflow-0.3.0-cp310-abi3-macosx_11_0_arm64.whl |
Total release size: 4.5 MB
Release files / evenflow-0.3.0.tar.gz
| Download URL | evenflow-0.3.0.tar.gz |
|---|---|
| Size | 83.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
af06945a53fe52dc72c92a0fb85f92b859d319d7e8aaa8fad7e0f4746aa14782
|
|
BLAKE2b-256 checksum How to use checksums |
8b21cd5798160472a18727cf41c99613a892d597cf4ef2fa91a2f2f746241249
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / evenflow-0.3.0-cp310-abi3-win_amd64.whl
| Download URL | evenflow-0.3.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 1.5 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
945a2ac5ff01d95e0f55f91f6483391c49fb531687b4990dc12a5006cc72d0e9
|
|
BLAKE2b-256 checksum How to use checksums |
09e8f70a893fbc7fce09152131fe4007aa54c900859da09755ff92e833485738
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / evenflow-0.3.0-cp310-abi3-manylinux_2_28_x86_64.whl
| Download URL | evenflow-0.3.0-cp310-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
4871f447e5b8415545e9960a5ff5212eeb333b578f4cd6c0714f552e88e1b0b8
|
|
BLAKE2b-256 checksum How to use checksums |
4e405c0ca4ae4be2d0f3058309dd7ad9bd476232126726995d9f07b96e08cc4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / evenflow-0.3.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | evenflow-0.3.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
4bfd457a99afe4260319f09e6b1f4c72e78b35d1ef05bd1fbab90354f99a22f9
|
|
BLAKE2b-256 checksum How to use checksums |
da829c2ddf983cd931c7f606222296b9af518304e1d81e84ce7a5fd435557484
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logSecurity for evenflow 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 4 files in this release have been uploaded with provenance metadata.
Attestation for evenflow-0.3.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.