The AI Linter - Enterprise-grade linting and governance for AI-generated code across multiple languages
Project description
thai-lint
The AI Linter - Catch the mistakes AI coding assistants keep making.
thailint detects anti-patterns that AI tools frequently introduce: duplicate code, excessive nesting, magic numbers, SRP violations, and more. It works across Python, TypeScript, JavaScript, and Rust with unified rules - filling gaps that existing linters miss.
Installation
pip install thailint
Or with Docker:
docker run --rm -v $(pwd):/data washad/thailint:latest --help
Quick Start
# Generate a config file (optional)
thailint init-config
# Run any linter
thailint dry src/
That's it. See violations, fix them, ship better code.
Available Linters
| Linter | What It Catches | Command | Docs |
|---|---|---|---|
| DRY | Duplicate code across files | thailint dry src/ |
Guide |
| Nesting | Deeply nested if/for/while blocks | thailint nesting src/ |
Guide |
| Magic Numbers | Unnamed numeric literals | thailint magic-numbers src/ |
Guide |
| Performance | O(n²) patterns: string += in loops, regex in loops | thailint perf src/ |
Guide |
| SRP | Classes doing too much | thailint srp src/ |
Guide |
| File Header | Missing documentation headers | thailint file-header src/ |
Guide |
| Stateless Class | Classes that should be functions | thailint stateless-class src/ |
Guide |
| Collection Pipeline | Loops with embedded filtering | thailint pipeline src/ |
Guide |
| Method Property | Methods that should be @property | thailint method-property src/ |
Guide |
| File Placement | Files in wrong directories | thailint file-placement src/ |
Guide |
| Lazy Ignores | Unjustified linting suppressions | thailint lazy-ignores src/ |
Guide |
| Improper Logging | Print statements and conditional verbose patterns | thailint improper-logging src/ |
Guide |
| Stringly Typed | Strings that should be enums | thailint stringly-typed src/ |
Guide |
| LBYL | Look Before You Leap anti-patterns | thailint lbyl src/ |
Guide |
| Unwrap Abuse | .unwrap()/.expect() that panic at runtime (Rust) |
thailint unwrap-abuse src/ |
Guide |
| Clone Abuse | .clone() abuse: loops, chains, unnecessary (Rust) |
thailint clone-abuse src/ |
Guide |
| Blocking Async | Blocking std:: calls in async functions (Rust) | thailint blocking-async src/ |
Guide |
Configuration
Create .thailint.yaml in your project root:
dry:
enabled: true
min_duplicate_lines: 4
nesting:
enabled: true
max_nesting_depth: 3
magic-numbers:
enabled: true
allowed_numbers: [-1, 0, 1, 2, 10, 100]
Or generate one automatically:
thailint init-config --preset lenient # or: strict, standard
See Configuration Reference for all options.
Output Formats
# Human-readable (default)
thailint dry src/
# JSON for CI/CD
thailint dry --format json src/
# SARIF for GitHub Code Scanning
thailint dry --format sarif src/ > results.sarif
Ignoring Violations
# Line-level
timeout = 3600 # thailint: ignore[magic-numbers]
# File-level
# thailint: ignore-file[dry]
Or in config:
dry:
ignore:
- "tests/"
- "**/generated/**"
See How to Ignore Violations for all 5 ignore levels.
CI/CD Integration
# GitHub Actions
- name: Run thailint
run: |
pip install thailint
thailint --parallel dry src/
thailint --parallel nesting src/
Use --parallel for faster linting on large codebases (2-4x speedup on multi-core systems).
Exit codes: 0 = success, 1 = violations found, 2 = error.
Documentation
- Quick Start Guide - Get running in 5 minutes
- Configuration Reference - All config options
- Troubleshooting - Common issues
- Full Documentation - Everything else
Contributing
Contributions welcome! See CONTRIBUTING.md for guidelines.
git clone https://github.com/be-wise-be-kind/thai-lint.git
cd thai-lint
poetry install
just test
License
MIT License - see LICENSE for details.
Support
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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 thailint-0.17.6.tar.gz.
File metadata
- Download URL: thailint-0.17.6.tar.gz
- Upload date:
- Size: 288.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.13.2 Linux/6.17.0-14-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
03f93c5cc8d732fb23583b9ddf947a3d9fe8007c73fc20e4715c43459cd5f102
|
|
| MD5 |
91093a0463407a956ac3be0ef2ff1ff7
|
|
| BLAKE2b-256 |
fa9b8ebd5b59273cc6d10314554671804d1ec29301fd6eab7432c1a0176e38bd
|
File details
Details for the file thailint-0.17.6-py3-none-any.whl.
File metadata
- Download URL: thailint-0.17.6-py3-none-any.whl
- Upload date:
- Size: 430.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.2.1 CPython/3.13.2 Linux/6.17.0-14-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f16454f0fc4a698e6af3c5dc5e91763d1de15579ad33b11534da4a48d46292a8
|
|
| MD5 |
86b124c987846ea1824a7023f940ba84
|
|
| BLAKE2b-256 |
19fcc4bf6900ea053000bea6f5e76f585099d0cc3048a6ef406dd874bb49f911
|