Skylos
Code checks that show their work.
## What Is Skylos?
Skylos is an open-source (Apache-2.0) CLI and pull-request gate for Python
projects that runs without an account. `skylos .` finds dead code: unused
functions, classes, imports and empty files. Add `-a` to check security bugs,
hard-coded secrets, vulnerable dependencies, code quality and AI-code
mistakes. Findings include source locations and supporting analysis;
`skylos done` checks whether a branch, often a coding agent's, is ready to
merge.
It is built for:
- **Teams merging pull requests from AI coding agents** such as Claude Code,
Codex and Cursor. `skylos done` runs your tests and flags deleted or skipped
tests, loosened CI test steps, silenced lint or type checks, and test-only
special cases.
- **Python maintainers** who want framework-aware dead-code, security and
secrets checks. Python has the deepest coverage; other languages are listed
under [Language Support](#language-support).
```bash
pip install skylos
skylos . # find dead code
skylos . -a # add security, secrets, quality, dependency and AI-code checks
skylos done --base main # is this branch finished? runs your tests, compares with main
```
**Proof, including the misses:** 10 Skylos-assisted dead-code cleanup PRs have
been merged into the default branch in 9 open-source
projects, including Black, NetworkX, Optuna, mitmproxy and pypdf.
[Real-World Results](./REAL_WORLD_RESULTS.md) lists the 26 cleanup and quality-fix PRs in this ledger,
including the ones that were closed, reverted or never reached the default
branch. These are accepted cleanup
PRs, not endorsements.
[](https://mcptoplist.com/server/io.github.duriantaco%2Fskylos)

[](https://codecov.io/gh/duriantaco/skylos)

[](https://pypi.org/project/skylos/)

[Website](https://skylos.dev) |
[Docs](https://docs.skylos.dev) |
[Repo Map](https://duriantaco.github.io/skylos/repo-map/) |
[Quick Start](https://docs.skylos.dev/quick-start) |
[GitHub Action](./action.yml) |
[VS Code Extension](./editors/vscode/README.md) |
[Real-World Results](./REAL_WORLD_RESULTS.md) |
[Benchmarks](./BENCHMARK.md) |
[Roadmap](./ROADMAP.md) |
[Contributing](./CONTRIBUTING.md)
**English** | [Deutsch](./docs/i18n/README.de.md) | [简体中文](./docs/i18n/README.zh-CN.md) | [Translations](./docs/i18n/README.md)
Skylos runs locally by default and can also gate pull requests in CI. Use it
when you want one command to check a repo or pull request for:
- dead code and unused files
- security flaws and dangerous data flows
- secrets and dependency CVEs
- CI/CD and edge-device deployment misconfigurations
- quality regressions such as complexity, duplicate branches, and deep nesting
- common AI-generated code mistakes, including missing guards, fake helpers,
invented package APIs, and impossible dependency versions
- LLM app risks such as unsafe tool use and missing output validation
Python has the deepest coverage. TypeScript/JavaScript and Java also get
dead-code, security and quality checks; PHP and Dart get dead-code and
security checks; Rust gets security checks and experimental dead code
(hidden below the default confidence threshold; `--confidence 40` lists it).
Go dead-code and security checks need the native `skylos-go` engine: from
4.50 the PyPI wheels for Linux, macOS and Windows (x86_64 and arm64) include
it, the container image includes it and the GitHub Action builds it. On other
platforms `skylos doctor` prints the command that builds it from source, and
`SKYLOS_GO_BIN` points Skylos at a separately built engine. C# support is
partial, Kotlin is dead code only, C++ is limited to unused file-local
functions, and Shell is security only.
Skylos also checks CI/CD and deployment config. See
[Language Support](#language-support).
## Read The Results
Remember **Risk, Maintainability, Dead code, Gate**:
| Readout | What it tells you |
|:---|:---|
| **Risk** | Highest unresolved severity and counts. One critical finding stays critical, regardless of repository size. |
| **Maintainability** | Advice counts, affected code units, and how far measurements exceed their limits. |
| **Dead code** | Removal candidates with confidence and evidence; review dynamic calls and public APIs before deleting. |
| **Gate** | Whether findings satisfy your configured limits. Passing means within policy, not zero findings. |
Finding **Type** is separate from severity: **Defect** is a concrete correctness
pattern, **Review** needs context, and **Advice** concerns maintainability or
tooling. A Review finding can still be critical. Advice stays visible in rule
groups; `--expand-advice` shows every location and JSON keeps complete records.
Grouping cannot improve the assessment or bypass a gate.
Security findings show recorded source-to-sink evidence when available, with
partial static analysis labeled. Dependency coverage names unresolved versions
and the supported inputs needed to check them. Neither view claims runtime
exploitability or a complete installed environment; JSON keeps the full evidence.
For `uv.lock`, valid Git, URL, path and private-index dependencies are shown as
**not checked**. Skylos still queries supported public packages; the coverage
gap alone does not cause exit `2`. It cannot establish a clean dependency
assessment. See [uv source coverage](./docs/dependency-scanning.md#uv-source-coverage).
New source scans replace the blended A–F grade with these readouts. Disabled
checks are **not assessed**; failed checks are **incomplete**. Maintainability
percentages use only the relevant units actually measured, with no guessed
denominators or uncalibrated grades. The independent `debt` and `defend` scores
keep their meanings. See [the output guide](./docs/cli-output.md#scan-assessment).
## Choose the Right Command
Each command answers a different question. The source scan requires `PATH`.
Bracketed paths on `verify`, `suite`, `defend`, and `clean` default to the
current directory. `suite` and `defend` require a directory; `verify` and
`clean` also accept a file.
| Question | Command | Input checked |
|:---|:---|:---|
| What problems are in this source tree? | `skylos PATH` | Source files and project configuration; dead code by default, every main source analyzer with `-a` |
| Did the agent really finish this branch? | `skylos done --base main` | The branch's changes since its merge base with `main`: Skylos runs your tests (pytest automatically; other runners need `test_command` in `[tool.skylos.done]`) and compares the tests, test settings and CI steps with the base; writes a receipt to `.skylos/receipts/` |
| Does this code contain AI-code mistakes? | `skylos verify [PATH]` | AI-defect checks over the selected file or tree, plus a separate Git HEAD behavior comparison for supported Python working changes |
| Should a model review static dead-code findings? | `skylos agent verify [PATH]` | LLM by default; optional [Jev-only or Jev-plus-LLM review](./docs/dead-code-review.md) |
| What does the combined repo suite report? | `skylos suite [DIRECTORY]` | Static analysis, technical debt, AI defense, and provenance; local findings are report-only by default |
| Does an agent implementation have deployment guardrails? | `skylos defend [DIRECTORY]` | Recognized Python and TypeScript/JavaScript LLM integrations; gating requires a threshold flag or policy |
| Which Python dead code can Skylos remove? | `skylos clean [PATH] --dry-run` | Python import/function cleanup candidates; `--dry-run` never writes |
| Will this exact local GPU build fit the machines we ship to? | `skylos preflight [ARTIFACT]` | A local built file or directory and `.skylos/gpu-targets.yml`; an OCI reference is identity-only and returns `UNKNOWN` in the CLI |
| What vulnerabilities are in this container image? | `skylos image scan IMAGE@sha256: