Skip to main content

Unified structural linter for Python + TypeScript projects

Project description

swarm-lint

Unified structural linter for Python + TypeScript projects. Runs multiple checks under one CLI:

  • Structural checks (pure Python, stdlib only) — file line count limits, folder item count limits, nested import detection
  • Vulture — dead Python code detection (shells out to vulture)
  • ESLint — TypeScript/React linting (shells out to local node_modules/.bin/eslint)
  • Knip — unused TypeScript exports, dependencies, and files (shells out to local node_modules/.bin/knip)

Installation

pip install swarm-lint

# with optional extras
pip install "swarm-lint[watch]"    # adds --watch mode (watchfiles)
pip install "swarm-lint[vulture]"  # adds vulture dead-code detection
pip install "swarm-lint[all]"      # both of the above

Quick start

# interactive setup wizard — the fastest way to get going
swarm-lint setup

# or scaffold a default config non-interactively
swarm-lint init --root /path/to/project

# run all checks once
swarm-lint check --root /path/to/project

# watch mode — re-checks on every file save
swarm-lint check --watch --root /path/to/project

CLI reference

swarm-lint setup

Interactive wizard that auto-detects your project structure (Python dirs, TypeScript dirs, virtual environments, node_modules) and walks you through choosing checks, setting rules, and scaffolding config files — all from the terminal.

swarm-lint check

swarm-lint check [--root DIR] [--config FILE] [--watch/--no-watch] [--color/--no-color]
Flag Description
--root DIR Project root directory (default: .)
--config FILE Explicit path to a JSON config file
--watch Watch for file changes and re-lint continuously
--no-color Disable colored terminal output

Running swarm-lint with no subcommand is equivalent to swarm-lint check.

swarm-lint init

swarm-lint init [--root DIR] [--with-tasks] [--with-pyright] [--with-whitelist]

Non-interactive scaffolding — creates a swarm-lint-config/ folder with a general-config.json config file. Optional flags:

Flag Creates
--with-tasks .vscode/tasks.json + .vscode/extensions.json
--with-pyright swarm-lint-config/pyright-config.json template
--with-whitelist swarm-lint-config/vulture_whitelist.py stub

The .vscode/ files are always overwritten to stay in sync with swarm-lint. Other scaffolded files are skipped if they already exist.

swarm-lint config

Manage configuration without hand-editing JSON.

# pretty-print the resolved config (defaults + your overrides)
swarm-lint config show

# set a value using dot-path notation
swarm-lint config set rules.max-file-lines 300
swarm-lint config set vulture.venv_path backend/.venv

# toggle checks on/off
swarm-lint config enable vulture
swarm-lint config disable eslint

Configuration

swarm-lint looks for config in this order:

  1. --config flag (explicit path)
  2. swarm-lint-config/general-config.json in the --root directory
  3. Built-in defaults

Your config is deep-merged on top of defaults — you only need to override what differs from the defaults.

Example swarm-lint-config/general-config.json

{
  "rules": {
    "vulture-min-confidence": 1,
    "vulture-error-threshold": 1
  },
  "exclude": [
    "node_modules", ".venv", "dist", "build", "__pycache__",
    ".git", ".cursor", ".vscode", "swarm-lint-config",
    "uv-bin", "data", "public"
  ],
  "vulture": {
    "targets": ["backend", "debug.py"],
    "venv_path": "backend/.venv",
    "exclude": ".venv,__pycache__,data,uv-bin",
    "whitelist": "swarm-lint-config/vulture_whitelist.py"
  },
  "eslint": {
    "directory": "frontend"
  },
  "knip": {
    "directory": "frontend"
  }
}

Config reference

Key Type Default Description
enabled.* bool true Toggle individual checks on/off
rules.max-file-lines int 250 Max lines per source file
rules.max-folder-items int 7 Max items per folder
rules.vulture-min-confidence int 80 Min confidence to flag a vulture finding
rules.vulture-error-threshold int 90 Confidence at which a finding becomes an error
rules.no-nested-imports bool true Detect imports inside function bodies
include_extensions list[str] [".py", ".ts", ...] File extensions to check
exclude list[str] ["node_modules", ...] Glob patterns for excluded dirs/files
exceptions.<rule> list[str] [] Glob patterns for files exempt from a rule
vulture.targets list[str] ["."] Paths to scan (relative to root)
vulture.venv_path str|null null Venv dir containing bin/vulture
vulture.exclude str ".venv,__pycache__" Comma-separated vulture exclusions
vulture.whitelist str|null null Path to whitelist file (relative to root)
eslint.directory str "." Directory containing node_modules/.bin/eslint
eslint.args list[str] ["src/", ...] Arguments passed to eslint
knip.directory str "." Directory containing node_modules/.bin/knip

VS Code integration

Run swarm-lint setup (or swarm-lint init --with-tasks) to create .vscode/tasks.json and .vscode/extensions.json:

  • tasks.json — auto-starts swarm-lint --watch when the workspace opens, feeds errors into the Problems panel via problem matchers, groups errors by check type (structural, vulture, eslint, knip)
  • extensions.json — recommends the ESLint VS Code extension

These files are always overwritten on re-run to stay in sync with swarm-lint.

Output format

Every error line matches: file:line:col: severity: message [rule-tag]

Sections are delimited by <name>: checking... and <name>: done. N error(s) found. lines. This format is stable and consumed by VS Code problem matchers.

External tools

swarm-lint shells out to these tools when their checks are enabled. Install them yourself:

  • vulturepip install vulture (or use the swarm-lint[vulture] extra)
  • eslintnpm install eslint in your frontend directory
  • knipnpm install knip in your frontend directory

Development

git clone <repo-url>
cd linter
pip install -e ".[all]"
swarm-lint check --root .

License

MIT

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

swarm_lint-0.1.3.tar.gz (19.0 kB view details)

Uploaded Source

Built Distribution

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

swarm_lint-0.1.3-py3-none-any.whl (21.8 kB view details)

Uploaded Python 3

File details

Details for the file swarm_lint-0.1.3.tar.gz.

File metadata

  • Download URL: swarm_lint-0.1.3.tar.gz
  • Upload date:
  • Size: 19.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for swarm_lint-0.1.3.tar.gz
Algorithm Hash digest
SHA256 0a6e8b6f710bfce9b9f75d8d59f734ce3c6650243e91a7ee5a6233b11257652b
MD5 8c743f6d75f5949a43e586c586128bf9
BLAKE2b-256 7ca0dfdd8236174dbbc3d839de1738a3ef2d1c0a39eb4d9b76f1a88dc960380e

See more details on using hashes here.

File details

Details for the file swarm_lint-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: swarm_lint-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 21.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for swarm_lint-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 4041a6f8d67f0e600ab3562a986e55f0a1e3741c39a9e0d3812e03061c6be0b8
MD5 b43d41110cae824813eec33ea8970104
BLAKE2b-256 914c148e131f18d3797df5f7fb555a467eeb0d946c3326df4dc4c6b4aa684c4e

See more details on using hashes here.

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