Skip to main content

thai-lint

License: MIT Python 3.11+ PyPI Tests Coverage Documentation

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 run instantly with uvx (no install required):

uvx thailint dry src/

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
Law of Demeter Deep object chain access (reaching through objects) thailint law-of-demeter src/ Guide
Version Freshness EOL/outdated runtime versions in infra files thailint version-freshness . 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 add a [tool.thailint] section to your pyproject.toml:

[tool.thailint]
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]}

Config precedence: .thailint.yaml > .thailint.json > pyproject.toml.

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

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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

thailint-0.23.0.tar.gz (341.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

thailint-0.23.0-py3-none-any.whl (489.3 kB view details)

Uploaded Python 3

File details

Details for the file thailint-0.23.0.tar.gz.

File metadata

  • Download URL: thailint-0.23.0.tar.gz
  • Upload date:
  • Size: 341.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.4.1 CPython/3.12.3 Linux/6.18.7-76061807-generic

File hashes

Hashes for thailint-0.23.0.tar.gz
Algorithm Hash digest
SHA256 626d5f1de58478404aa5841e80150a0956d3dcd7d091fa4ed9c2d924a9819874
MD5 2ddb48bbf6f8648912c5bafd51bfcb9c
BLAKE2b-256 fa68b692fe0287db1a6ddc9238a3c970371395de558fb20f243cc02bfc39a893

See more details on using hashes here.

File details

Details for the file thailint-0.23.0-py3-none-any.whl.

File metadata

  • Download URL: thailint-0.23.0-py3-none-any.whl
  • Upload date:
  • Size: 489.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.4.1 CPython/3.12.3 Linux/6.18.7-76061807-generic

File hashes

Hashes for thailint-0.23.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8a5133290584c3f774a4a9f17c1bf4325c8b05da0d028a0ac7056e53e3e789bf
MD5 c01bd3bb9add68ca52d311c2ec5bf90e
BLAKE2b-256 361d21abd4e167d6a678cebede69371079666d9980525a73d65204d30fd6b4e3

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.23.0 This release

2 files

0.22.2

2 files

0.22.1

2 files

0.22.0

2 files

0.21.3

2 files

0.21.2

2 files

0.21.1

2 files

0.21.0

2 files

0.20.4

2 files

0.20.3

2 files

0.20.2

2 files

0.20.1

2 files

0.20.0

2 files

0.19.6

2 files

0.19.5

2 files

0.19.4

2 files

0.19.2

2 files

0.19.1

2 files

0.19.0

2 files

0.18.2

2 files

0.18.1

2 files

0.18.0

2 files

0.17.6

2 files

0.17.5

2 files

0.17.3

2 files

0.17.2

2 files

0.17.1

2 files

0.17.0

2 files

0.16.0

2 files

0.15.8

2 files

0.15.6

2 files

0.15.5

2 files

0.15.4

2 files

0.15.3

2 files

0.15.2

2 files

0.15.1

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.0

2 files

0.9.0

2 files

0.8.0

2 files

0.7.0

2 files

0.5.0

2 files

0.4.6

2 files

0.4.5

2 files

0.4.4

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

0.1.6

2 files

0.1.5

2 files

0.1.3

2 files

0.1.1

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page