Deterministic First
drep runs the configured tools each supported ecosystem actually ships. Their findings remain authoritative, and a configured check that cannot run is never called a pass.
The project was rebuilt in Rust and deliberately narrowed to one job: review a local change before it becomes someone else's problem.
drep is a local commit gate. It discovers the linters, formatters, compilers, and analyzers a repository already configures, runs the applicable checks over changed files, and sends those changes to an LLM for a second kind of review.
It runs on git commit and git push, or directly through drep check. It is a single Rust binary with no server, background service, hosted-platform client, or drep account.
drep runs the configured tools each supported ecosystem actually ships. Their findings remain authoritative, and a configured check that cannot run is never called a pass.
The model looks for concrete, reachable defects in the changed code. Its findings advise by default because model judgment is not deterministic.
Repository state, credentials, acknowledgements, and cache stay on the machine. Administrators can enforce a site policy above repository configuration.
Use local endpoints, hosted APIs, coding-plan endpoints, the OpenAI API, or the Codex CLI authenticated through ChatGPT.
| Layer | Good at | Default gate behavior |
|---|---|---|
| Repository-native tools | Syntax, types, formatting, and codified project rules | Blocking |
| LLM review | Cross-line reasoning and concrete defects that are difficult to encode as rules | Advisory; opt into gating with --fail-on |
The split is by source rather than by severity. A linter error is repeatable; an LLM's “error” label still reflects a probabilistic judgment.
| Language | Files | Deterministic tools |
|---|---|---|
| Python | .py | ruff |
| JavaScript | .js, .jsx, .mjs, .cjs | ESLint |
| TypeScript | .ts, .tsx, .mts, .cts | ESLint and tsc |
| Go | .go | gofmt and go vet |
| Rust | .rs | clippy |
| Java | .java | checkstyle |
| Kotlin | .kt, .kts | ktlint |
| Scala | .scala, .sc | None |
| Groovy | .groovy, .gradle | None |
| Shell | .sh, .bash | shellcheck |
| Swift | .swift | swiftlint |
| C | .c, .h | cppcheck |
| C++ | .cpp, .hpp, .cc, .hh, .cxx, .hxx | cppcheck |
| C# | .cs | dotnet format |
| Ruby | .rb, .rake, .gemspec, Gemfile, Rakefile | rubocop |
| PHP | .php | phpcs |
| Vue | .vue | ESLint |
| Svelte | .svelte | ESLint |
| Terraform | .tf, .tfvars | tflint |
| Elixir | .ex, .exs | credo |
| SQL | .sql | sqlfluff |
| Docker | Dockerfile, Containerfile, .dockerfile | hadolint |
| Lua | .lua | luacheck |
Scala and Groovy still receive semantic review. They have no deterministic tool because scalafmt, scalafix, and CodeNarc are build-plugin-first rather than standalone command-line tools drep can invoke.
Extensionless Dockerfile, Gemfile, and Rakefile names are recognized directly. Dockerfile and Containerfile variants such as Dockerfile.dev and Containerfile.prod are recognized too, while an actual extension still takes precedence.
Repository-local executables take precedence over PATH, and configuration is resolved from the nearest applicable ancestor. This lets monorepo packages use their own configs while sharing hoisted tools.
drep.toml for provider and model configurationsite.toml for concurrency ceilings and repository refusal markersThere is no application database and no remote drep service.
This was not a line-for-line language port. The former Python application centered on hosted Git platforms, pull requests, webhooks, and a long-running service. The Rust project centers on local Git state and a short-lived commit gate. Old commands and configuration files do not map directly to the current CLI.