{"id":43098281,"url":"https://github.com/lgtm-hq/py-lintro","last_synced_at":"2026-03-04T18:05:05.541Z","repository":{"id":306669269,"uuid":"947224774","full_name":"lgtm-hq/py-lintro","owner":"lgtm-hq","description":"Making linters play nice... Mostly.","archived":false,"fork":false,"pushed_at":"2026-03-03T08:10:31.000Z","size":5801,"stargazers_count":0,"open_issues_count":69,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-03T10:07:41.296Z","etag":null,"topics":["ci-cd","cli","code-quality","docker","docker-compose","formatter","github-actions","linter","linting","python","sbom","static-analysis"],"latest_commit_sha":null,"homepage":"https://lgtm-hq.github.io/py-lintro/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lgtm-hq.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":".github/SECURITY.md","support":null,"governance":"GOVERNANCE.md","roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":"DCO.md","cla":null}},"created_at":"2025-03-12T10:54:21.000Z","updated_at":"2026-03-03T07:01:36.000Z","dependencies_parsed_at":"2026-02-06T21:01:07.004Z","dependency_job_id":null,"html_url":"https://github.com/lgtm-hq/py-lintro","commit_stats":null,"previous_names":["turbocoder13/py-lintro"],"tags_count":154,"template":false,"template_full_name":null,"purl":"pkg:github/lgtm-hq/py-lintro","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgtm-hq%2Fpy-lintro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgtm-hq%2Fpy-lintro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgtm-hq%2Fpy-lintro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgtm-hq%2Fpy-lintro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lgtm-hq","download_url":"https://codeload.github.com/lgtm-hq/py-lintro/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lgtm-hq%2Fpy-lintro/sbom","scorecard":{"id":1237091,"data":{"date":"2025-09-01T06:06:12Z","repo":{"name":"github.com/TurboCoder13/py-lintro","commit":"4df2edf539be1436fdb89724f69f28aa4bb18164"},"scorecard":{"version":"v5.2.1","commit":"ab2f6e92482462fe66246d9e32f642855a691dc1"},"score":6.3,"checks":[{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: RenovateBot: renovate.json:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dependency-update-tool"}},{"name":"Code-Review","score":0,"reason":"Found 0/16 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":-1,"reason":"internal error: internal error: invalid Dockerfile: Syntax error - can't find = in \"#\". Must be of the form: name=value","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/auto-tag-on-main.yml:20","Info: jobLevel 'contents' permission set to 'read': .github/workflows/ci-lintro-analysis.yml:22","Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish-pypi-on-tag.yml:24","Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish-pypi-on-tag.yml:30","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/publish-pypi-on-tag.yml:37","Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish-testpypi.yml:20","Info: jobLevel 'contents' permission set to 'read': .github/workflows/reusable-build.yml:25","Info: jobLevel 'contents' permission set to 'read': .github/workflows/reusable-quality.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/scorecards.yml:15","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/semantic-release.yml:15","Info: jobLevel 'contents' permission set to 'read': .github/workflows/test-and-coverage.yml:25","Info: jobLevel 'contents' permission set to 'read': .github/workflows/test-and-coverage.yml:125","Warn: topLevel 'contents' permission set to 'write': .github/workflows/auto-bump-internal-refs.yml:17","Info: topLevel 'contents' permission set to 'read': .github/workflows/auto-tag-on-main.yml:14","Warn: no topLevel permission defined: .github/workflows/ci-lintro-analysis.yml:1","Warn: topLevel 'security-events' permission set to 'write': .github/workflows/codeql.yml:15","Info: topLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:14","Info: topLevel 'contents' permission set to 'read': .github/workflows/composite-smoke-tests.yml:8","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-review.yml:8","Info: topLevel 'contents' permission set to 'read': .github/workflows/docker-build-publish.yml:34","Warn: topLevel 'packages' permission set to 'write': .github/workflows/docker-build-publish.yml:35","Info: topLevel 'contents' permission set to 'read': .github/workflows/ghcr-cleanup.yml:9","Warn: topLevel 'packages' permission set to 'write': .github/workflows/ghcr-cleanup.yml:10","Warn: no topLevel permission defined: .github/workflows/lintro-renovate.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/lintro-report-scheduled.yml:23","Info: topLevel 'contents' permission set to 'read': .github/workflows/pages-deploy-coverage.yml:12","Info: topLevel 'contents' permission set to 'read': .github/workflows/publish-pypi-on-tag.yml:18","Warn: no topLevel permission defined: .github/workflows/publish-testpypi.yml:1","Warn: no topLevel permission defined: .github/workflows/reusable-build.yml:1","Warn: no topLevel permission defined: .github/workflows/reusable-quality.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/scorecards.yml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/semantic-pr-title.yml:9","Info: topLevel 'contents' permission set to 'read': .github/workflows/semantic-release.yml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/test-and-coverage.yml:20","Info: topLevel 'contents' permission set to 'read': .github/workflows/validate-action-pinning.yml:9"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#cii-best-practices"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.5.1 not signed: https://api.github.com/repos/TurboCoder13/py-lintro/releases/243742627","Warn: release artifact v0.5.0 not signed: https://api.github.com/repos/TurboCoder13/py-lintro/releases/243674211","Warn: release artifact v0.4.3 not signed: https://api.github.com/repos/TurboCoder13/py-lintro/releases/243577981","Warn: release artifact v0.5.1 does not have provenance: https://api.github.com/repos/TurboCoder13/py-lintro/releases/243742627","Warn: release artifact v0.5.0 does not have provenance: https://api.github.com/repos/TurboCoder13/py-lintro/releases/243674211","Warn: release artifact v0.4.3 does not have provenance: https://api.github.com/repos/TurboCoder13/py-lintro/releases/243577981"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 23 commits out of 29 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#sast"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#license"}},{"name":"Branch-Protection","score":6,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'main'","Info: 'stale review dismissal' is required to merge on branch 'main'","Warn: required approving review count is 1 on branch 'main'","Info: codeowner review is required on branch 'main'","Info: 'last push approval' is required to merge on branch 'main'","Warn: no status checks found to merge onto branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/ci-lintro-analysis.yml:11"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#packaging"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#fuzzing"}},{"name":"Contributors","score":3,"reason":"project has 1 contributing companies or organizations -- score normalized to 3","details":["Info: found contributions from: codehub labs"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#contributors"}},{"name":"CI-Tests","score":2,"reason":"8 out of 29 merged PRs checked by a CI test -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#ci-tests"}}]},"last_synced_at":"2025-09-05T21:28:39.225Z","repository_id":306669269,"created_at":"2025-09-05T21:28:39.225Z","updated_at":"2025-09-05T21:28:39.225Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30088349,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T15:40:14.053Z","status":"ssl_error","status_checked_at":"2026-03-04T15:40:13.655Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ci-cd","cli","code-quality","docker","docker-compose","formatter","github-actions","linter","linting","python","sbom","static-analysis"],"created_at":"2026-01-31T17:00:37.071Z","updated_at":"2026-03-04T18:05:05.512Z","avatar_url":"https://github.com/lgtm-hq.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lintro\n\n\u003c!-- markdownlint-disable MD033 MD013 --\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/lgtm-hq/py-lintro/main/assets/images/lintro.png\" alt=\"Lintro Logo\" style=\"width:100%;max-width:800px;height:auto;\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\nA comprehensive CLI tool that unifies various code formatting, linting, and quality\nassurance tools under a single command-line interface.\n\u003c/p\u003e\n\n\u003c!-- Badges: Build \u0026 Quality --\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/lgtm-hq/py-lintro/actions/workflows/test-and-coverage.yml?query=branch%3Amain\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/test-and-coverage.yml?label=tests\u0026branch=main\u0026logo=githubactions\u0026logoColor=white\" alt=\"Tests\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/lgtm-hq/py-lintro/actions/workflows/ci-pipeline.yml?query=branch%3Amain\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/ci-pipeline.yml?label=ci\u0026branch=main\u0026logo=githubactions\u0026logoColor=white\" alt=\"CI\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/lgtm-hq/py-lintro/actions/workflows/docker-build-publish.yml?query=branch%3Amain\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/docker-build-publish.yml?label=docker\u0026logo=docker\u0026branch=main\" alt=\"Docker\"\u003e\u003c/a\u003e\n\u003ca href=\"https://codecov.io/gh/lgtm-hq/py-lintro\"\u003e\u003cimg src=\"https://codecov.io/gh/lgtm-hq/py-lintro/branch/main/graph/badge.svg\" alt=\"Coverage\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003c!-- Badges: Releases --\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/lgtm-hq/py-lintro/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/lgtm-hq/py-lintro?label=release\" alt=\"Release\"\u003e\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/lintro/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/lintro?label=pypi\" alt=\"PyPI\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.python.org/downloads/\"\u003e\u003cimg src=\"https://img.shields.io/badge/python-3.11+-blue\" alt=\"Python\"\u003e\u003c/a\u003e\n\u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003c!-- Badges: Security \u0026 Supply Chain --\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/lgtm-hq/py-lintro/actions/workflows/codeql.yml?query=branch%3Amain\"\u003e\u003cimg src=\"https://github.com/lgtm-hq/py-lintro/actions/workflows/codeql.yml/badge.svg?branch=main\" alt=\"CodeQL\"\u003e\u003c/a\u003e\n\u003ca href=\"https://scorecard.dev/viewer/?uri=github.com/lgtm-hq/py-lintro\"\u003e\u003cimg src=\"https://api.securityscorecards.dev/projects/github.com/lgtm-hq/py-lintro/badge\" alt=\"OpenSSF Scorecard\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.bestpractices.dev/projects/11142\"\u003e\u003cimg src=\"https://www.bestpractices.dev/projects/11142/badge\" alt=\"OpenSSF Best Practices\"\u003e\u003c/a\u003e\n\u003ca href=\"docs/security/assurance.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/SBOM-CycloneDX-brightgreen\" alt=\"SBOM\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/lgtm-hq/py-lintro/actions/workflows/sbom-on-main.yml?query=branch%3Amain\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/lgtm-hq/py-lintro/sbom-on-main.yml?label=sbom\u0026branch=main\" alt=\"SBOM Status\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003c!-- markdownlint-enable MD033 MD013 --\u003e\n\n## 🚀 Quick Start\n\n```bash\nuv pip install lintro              # Install (or: pip install lintro)\nlintro check .                     # Find issues (alias: chk)\nlintro format .                    # Fix issues (alias: fmt)\nlintro check --output-format grid  # Beautiful output\n```\n\n\u003c!-- TODO: Add screenshot of grid output --\u003e\n\n## ✨ Why Lintro?\n\n- **🎯 Unified Interface** - One command for all your linting and formatting tools\n- **📊 Consistent Output** - Beautiful, standardized output formats across all tools\n- **🔧 Auto-fixing** - Automatically fix issues where possible\n- **🐳 Docker Ready** - Run in isolated containers for consistent environments\n- **📈 Rich Reporting** - Multiple formats: grid, JSON, HTML, CSV, Markdown\n- **⚡ Fast** - Optimized parallel execution\n\n## 🔌 Works With Your Existing Configs\n\nLintro respects your native tool configurations. If you have a `.prettierrc`,\n`pyproject.toml [tool.ruff]`, or `.yamllint`, Lintro uses them automatically - no\nmigration required.\n\n- **Native configs are detected** - Your existing `.prettierrc`, `.oxlintrc.json`, etc.\n  work as-is\n- **Enforce settings override consistently** - Set `line_length: 88` once, applied\n  everywhere\n- **Fallback defaults when needed** - Tools without native configs use sensible defaults\n\nSee the [Configuration Guide](docs/configuration.md) for details on the 4-tier config\nsystem.\n\n## 🛠️ Supported Tools\n\n\u003c!-- markdownlint-disable MD013 MD033 MD060 --\u003e\n\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\u003cth\u003eTool\u003c/th\u003e\u003cth\u003eLanguage\u003c/th\u003e\u003cth\u003eAuto-fix\u003c/th\u003e\u003cth\u003eInstall\u003c/th\u003e\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\u003cth colspan=\"4\"\u003eLinters\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/rhysd/actionlint\"\u003e\u003cimg src=\"https://img.shields.io/badge/Actionlint-24292e?logo=github\u0026logoColor=white\" alt=\"Actionlint\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e⚙️ GitHub Actions\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/rhysd/actionlint/releases\"\u003eGitHub Releases\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/rust-lang/rust-clippy\"\u003e\u003cimg src=\"https://img.shields.io/badge/Clippy-000000?logo=rust\u0026logoColor=white\" alt=\"Clippy\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🦀 Rust\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erustup component add clippy\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/hadolint/hadolint\"\u003e\u003cimg src=\"https://img.shields.io/badge/Hadolint-2496ED?logo=docker\u0026logoColor=white\" alt=\"Hadolint\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🐳 Dockerfile\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/hadolint/hadolint/releases\"\u003eGitHub Releases\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/DavidAnson/markdownlint-cli2\"\u003e\u003cimg src=\"https://img.shields.io/badge/Markdownlint--cli2-000000?logo=markdown\u0026logoColor=white\" alt=\"Markdownlint\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e📝 Markdown\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebun add -g markdownlint-cli2\u003c/code\u003e\u003cbr\u003e\u003ccode\u003enpm install -g markdownlint-cli2\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://oxc.rs/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Oxlint-e05d44?logo=javascript\u0026logoColor=white\" alt=\"Oxlint\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🟨 JS/TS\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebun add -g oxlint\u003c/code\u003e\u003cbr\u003e\u003ccode\u003enpm install -g oxlint\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/jsh9/pydoclint\"\u003e\u003cimg src=\"https://img.shields.io/badge/pydoclint-3776AB?logo=python\u0026logoColor=white\" alt=\"pydoclint\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🐍 Python\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e📦\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://www.shellcheck.net/\"\u003e\u003cimg src=\"https://img.shields.io/badge/ShellCheck-4EAA25?logo=gnubash\u0026logoColor=white\" alt=\"ShellCheck\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🐚 Shell Scripts\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebrew install shellcheck\u003c/code\u003e\u003cbr\u003e\u003ca href=\"https://github.com/koalaman/shellcheck/releases\"\u003eGitHub Releases\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/adrienverge/yamllint\"\u003e\u003cimg src=\"https://img.shields.io/badge/Yamllint-cb171e?logo=yaml\u0026logoColor=white\" alt=\"Yamllint\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🧾 YAML\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e📦\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003cth colspan=\"4\"\u003eFormatters\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/psf/black\"\u003e\u003cimg src=\"https://img.shields.io/badge/Black-000000?logo=python\u0026logoColor=white\" alt=\"Black\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🐍 Python\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e📦\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://oxc.rs/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Oxfmt-e05d44?logo=javascript\u0026logoColor=white\" alt=\"Oxfmt\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🟨 JS/TS\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebun add -g oxfmt\u003c/code\u003e\u003cbr\u003e\u003ccode\u003enpm install -g oxfmt\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://prettier.io/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Prettier-1a2b34?logo=prettier\u0026logoColor=white\" alt=\"Prettier\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🟨 JS/TS · 🧾 JSON\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebun add -g prettier\u003c/code\u003e\u003cbr\u003e\u003ccode\u003enpm install -g prettier\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/mvdan/sh\"\u003e\u003cimg src=\"https://img.shields.io/badge/shfmt-4EAA25?logo=gnubash\u0026logoColor=white\" alt=\"shfmt\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🐚 Shell Scripts\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebrew install shfmt\u003c/code\u003e\u003cbr\u003e\u003ca href=\"https://github.com/mvdan/sh/releases\"\u003eGitHub Releases\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/rust-lang/rustfmt\"\u003e\u003cimg src=\"https://img.shields.io/badge/rustfmt-000000?logo=rust\u0026logoColor=white\" alt=\"rustfmt\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🦀 Rust\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erustup component add rustfmt\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003cth colspan=\"4\"\u003eLint + Format\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/astral-sh/ruff\"\u003e\u003cimg src=\"https://img.shields.io/badge/Ruff-000?logo=ruff\u0026logoColor=white\" alt=\"Ruff\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🐍 Python\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e📦\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://sqlfluff.com/\"\u003e\u003cimg src=\"https://img.shields.io/badge/SQLFluff-4b5563?logo=database\u0026logoColor=white\" alt=\"SQLFluff\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🗃️ SQL\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epipx install sqlfluff\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://taplo.tamasfe.dev/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Taplo-9b4dca?logo=toml\u0026logoColor=white\" alt=\"Taplo\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🧾 TOML\u003c/td\u003e\n\u003ctd\u003e✅\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebrew install taplo\u003c/code\u003e\u003cbr\u003e\u003ca href=\"https://github.com/tamasfe/taplo/releases\"\u003eGitHub Releases\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003cth colspan=\"4\"\u003eType Checkers\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://astro.build/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Astro-ff5d01?logo=astro\u0026logoColor=white\" alt=\"Astro\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🚀 Astro\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebun add astro\u003c/code\u003e\u003cbr\u003e\u003ccode\u003enpm install astro\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://mypy-lang.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Mypy-2d50a5?logo=python\u0026logoColor=white\" alt=\"Mypy\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🐍 Python\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e📦\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://svelte.dev/\"\u003e\u003cimg src=\"https://img.shields.io/badge/svelte--check-ff3e00?logo=svelte\u0026logoColor=white\" alt=\"svelte-check\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🔥 Svelte\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebun add -D svelte-check\u003c/code\u003e\u003cbr\u003e\u003ccode\u003enpm install -D svelte-check\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://www.typescriptlang.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/TypeScript-3178c6?logo=typescript\u0026logoColor=white\" alt=\"TypeScript\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🟨 JS/TS\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebun add -g typescript\u003c/code\u003e\u003cbr\u003e\u003ccode\u003enpm install -g typescript\u003c/code\u003e\u003cbr\u003e\u003ccode\u003ebrew install typescript\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/vuejs/language-tools\"\u003e\u003cimg src=\"https://img.shields.io/badge/vue--tsc-42b883?logo=vuedotjs\u0026logoColor=white\" alt=\"vue-tsc\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e💚 Vue\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebun add -D vue-tsc\u003c/code\u003e\u003cbr\u003e\u003ccode\u003enpm install -D vue-tsc\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\u003cth colspan=\"4\"\u003eSecurity\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/PyCQA/bandit\"\u003e\u003cimg src=\"https://img.shields.io/badge/Bandit-yellow?logo=python\u0026logoColor=white\" alt=\"Bandit\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🐍 Python\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e📦\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://gitleaks.io/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Gitleaks-dc2626?logo=git\u0026logoColor=white\" alt=\"Gitleaks\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🔐 Secret Detection\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ebrew install gitleaks\u003c/code\u003e\u003cbr\u003e\u003ca href=\"https://github.com/gitleaks/gitleaks/releases\"\u003eGitHub Releases\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/rustsec/rustsec/tree/main/cargo-audit\"\u003e\u003cimg src=\"https://img.shields.io/badge/cargo--audit-000000?logo=rust\u0026logoColor=white\" alt=\"cargo-audit\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🦀 Rust\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ecargo install cargo-audit\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://github.com/EmbarkStudios/cargo-deny\"\u003e\u003cimg src=\"https://img.shields.io/badge/cargo--deny-000000?logo=rust\u0026logoColor=white\" alt=\"cargo-deny\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🦀 Rust\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ecargo install cargo-deny\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca href=\"https://semgrep.dev/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Semgrep-5b21b6?logo=semgrep\u0026logoColor=white\" alt=\"Semgrep\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e🔒 Multi-language\u003c/td\u003e\n\u003ctd\u003e-\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epipx install semgrep\u003c/code\u003e\u003cbr\u003e\u003ccode\u003epip install semgrep\u003c/code\u003e\u003cbr\u003e\u003ccode\u003ebrew install semgrep\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003e 📦 = bundled with lintro — no separate install needed\\\n\u003e ⚡ Node.js tools support `--auto-install` to install dependencies automatically\n\n\u003c!-- markdownlint-enable MD013 MD033 MD060 --\u003e\n\n## 📦 Installation\n\n**Python 3.11+** is required. Check tool versions with `lintro list-tools`.\n\n```bash\n# PyPI (recommended)\nuv pip install lintro        # or: pip install lintro\n\n# Homebrew (macOS binary)\nbrew tap lgtm-hq/tap \u0026\u0026 brew install lintro-bin\n\n# Docker (tools image - includes all external tools)\ndocker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:latest check\n\n# Docker (base image - minimal, no external tools)\ndocker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:base check\n```\n\nSee [Getting Started](docs/getting-started.md) for detailed installation options.\n\n## 💻 Usage\n\n```bash\n# Check all files (alias: chk)\nlintro check .\n\n# Auto-fix issues (alias: fmt)\nlintro format .\n\n# Grid output with grouping\nlintro check --output-format grid --group-by file\n\n# Run specific tools\nlintro check --tools ruff,prettier,mypy\n\n# Auto-install Node.js dependencies\nlintro check --tools tsc --auto-install\n\n# Exclude directories\nlintro check --exclude \"node_modules,dist,venv\"\n\n# List available tools\nlintro list-tools\n```\n\n### 🐳 Docker\n\n```bash\n# Run from GHCR (tools image - recommended)\ndocker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:latest check\n\n# With formatting\ndocker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:latest check --output-format grid\n\n# Base image (minimal, no external tools)\ndocker run --rm -v $(pwd):/code ghcr.io/lgtm-hq/py-lintro:base check\n```\n\n## 📚 Documentation\n\n| Guide                                            | Description                             |\n| ------------------------------------------------ | --------------------------------------- |\n| [Getting Started](docs/getting-started.md)       | Installation, first steps, requirements |\n| [Configuration](docs/configuration.md)           | Tool configuration, options, presets    |\n| [Docker Usage](docs/docker.md)                   | Containerized development               |\n| [GitHub Integration](docs/github-integration.md) | CI/CD setup, workflows                  |\n| [Contributing](docs/contributing.md)             | Development guide, adding tools         |\n| [Troubleshooting](docs/troubleshooting.md)       | Common issues and solutions             |\n\n**Advanced:** [Tool Analysis](docs/tool-analysis/) · [Architecture](docs/architecture/)\n· [Security](docs/security/)\n\n## 🔨 Development\n\n```bash\n# Clone and install\ngit clone https://github.com/lgtm-hq/py-lintro.git\ncd py-lintro\nuv sync --dev\n\n# Run tests\n./scripts/local/run-tests.sh\n\n# Run lintro on itself\n./scripts/local/local-lintro.sh check --output-format grid\n```\n\n## 🤝 Community\n\n- 🐛\n  [Bug Reports](https://github.com/lgtm-hq/py-lintro/issues/new?template=bug_report.md)\n- 💡\n  [Feature Requests](https://github.com/lgtm-hq/py-lintro/issues/new?template=feature_request.md)\n- ❓ [Questions](https://github.com/lgtm-hq/py-lintro/issues/new?template=question.md)\n- 📖 [Contributing Guide](docs/contributing.md)\n\n## 📄 License\n\nMIT License - see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flgtm-hq%2Fpy-lintro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flgtm-hq%2Fpy-lintro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flgtm-hq%2Fpy-lintro/lists"}