Possible SQL injection: tainted or string-built query.
Open source · for teams using AI coding agents
Know when an AI agent's pull request is actually done.
Skylos is an open-source (Apache-2.0) static analysis CLI and pull request check for TypeScript, JavaScript, Python, Go and Java codebases. It finds dead code, security issues, and secrets. Agents skip tests, loosen CI, and hard-code answers. skylos done fails the branch when it finds those shortcuts.
On your machine
Check an agent branch before you review it.
Runs on your machine without an account. Exit code 1 means a blocking check failed.
The agent's change (git diff main)
--- a/shop/pricing.py+++ b/shop/pricing.py-PERCENT_OFF = {"SAVE10": 10}+PERCENT_OFF = {"SAVE10": 10, "SAVE20": 20} def apply_discount(total: float, code: str) -> float:- percent = PERCENT_OFF.get(code, 0)+ percent = PERCENT_OFF[code] return round(total * (100 - percent) / 100, 2)--- a/tests/test_pricing.py+++ b/tests/test_pricing.py assert apply_discount(100.0, "SAVE10") == 90.0 +def test_save20_takes_twenty_percent_off():+ assert apply_discount(100.0, "SAVE20") == 80.0++[email protected](reason="flaky") def test_unknown_code_keeps_total(): assert apply_discount(100.0, "BOGUS") == 100.0skylos done --base main
$ skylos done --base mainSkylos done · base 8da0a2b (merge base) · head d0ff52aUNFINISHED Tests pass when Skylos runs them: Earlier required checks failed or were incompleteFAIL No tests deleted, skipped or weakened: 1 test change(s) weaken what the tests check tests/test_pricing.py:15 SKY-A111 test_unknown_code_keeps_total now skips or expects failure (skip) tests/test_pricing.py:14 SKY-A101 (advice) Test was skipped or xfailed in this diff Fix: Put back the removed or skipped tests and the original assertions and settings.PASS Skylos settings and hooks left alone: Skylos settings, hooks and protected paths unchangedPASS No secrets added: No secrets addedPASS Every package and import is real: Every added import and package resolvesWARN Tests check the changed lines: Earlier required checks failed or were incompletePASS Code doesn't special-case the tests: No code special-cases the tests (1 changed file(s) read)PASS Linters, type checkers, scanners and CI not silenced: No linter, type-checker, scanner or CI settings weakenedVerdict: FAIL (Tests pass when Skylos runs them, No tests deleted, skipped or weakened)Receipt: .skylos/receipts/d0ff52a8ddaa-8da0a2b2fb37.json$ echo $?1Recorded output from Skylos 4.47.1 on a small example repository. Nothing runs or uploads in your browser.
The checks
Five block by default. Three only warn.
Blocks
- Tests fail when Skylos runs them, or the test run doesn't finish
- Tests deleted, skipped, or weakened, including loosened test settings and CI test steps
- Code written to pass particular tests, such as an answer hard-coded to a test's input
- Skylos settings, or the agent hook files that run it, edited
- Secrets added
Warns
- Lint, type-check, scanner, or CI checks silenced
- Imports or dependencies that don't resolve to a declared package
- Changed Python lines that no test runs or checks
How each check worksCheck a branch for deleted or skipped tests
Every pull request
Start locally. Add it to CI. Block merges with Cloud.
- 1
On your machine
Free, no account.
- 2
On every pull request
Writes a GitHub Actions workflow. No API key.
Your first gated pull request - 3
For your team
Turn on merge blockingFree: a pass/fail check. Workspace: one policy, history and expiring exceptions.
Open the Agents view in Cloud
Also in the CLI
Dead code, security issues and secrets.
Recorded scan
from flask import request def search_users(conn): name = request.args.get("name") query = f"SELECT * FROM users WHERE name = '{name}'" return conn.execute(query).fetchall()Tainted input enters a string-built query.
The flagged line is highlighted.
Proof
10 Skylos-assisted dead-code cleanup PRs merged into the default branch in 9 open-source projects.
The checks are free. Teams pay a flat price.
Nothing is metered by seat, line of code or pull request.
Free
$0
- CLI and agent hooks, no login
- PR gate in your own CI, private repos included
- Cloud: 1 project, 10 stored scans, pass/fail on pull requests
- Cloud: up to 25 issues marked not fixing per project; custom rules run on Workspace
- Credits work here too: comparisons, AI triage, AI fix PRs
Workspace pass
$990 once
- Unlimited members
- Up to 10 projects, 500 stored scans per project
- Shared history, team policy, pull request comments and exports
- Up to 50 custom rules, run on every connected scan
- 1,000 credits included
- Does not renew by itself
Credit packs
from $9
- $9 · 50 creditsUp to 3 people
- $39 · 250 creditsUp to 3 people
- $129 · 1,000 creditsUp to 3 people
- $499 · 5,000 creditsUp to 3 people
Enterprise
from $5,000 / year
Talk to us only if you need:
- More than 10 projects
- SSO
- Invoice or purchase-order billing
- A DPA or a security questionnaire
Questions
What teams ask first.
We already use an AI reviewer such as CodeRabbit or Copilot. Why add this?
AI reviewers comment on the diff. skylos done runs your tests and compares test files and CI steps with main, and no model decides a block. Run both.
Will it block good pull requests?
Only the checks under "What blocks by default" fail the run. Set any check to block, advise, or off in [tool.skylos.done.checks] on your main branch.
Does Skylos upload my source code?
No. CLI scans, including skylos done, never send source code and call no AI model; dependency checks look up package names in public registries and OSV. Cloud gets findings and short snippets only when you use --upload or the Skylos GitHub App, whose scan runs in a temporary sandbox that is deleted when the scan ends.
Does it work for my stack?
skylos done runs pytest and reads Jest, Vitest, Mocha, node:test, and Playwright Test files. For other test runners, set test_command in [tool.skylos.done].
Which languages does Skylos support?
Dead code: Python, TypeScript/JavaScript, Java, Go, PHP, Rust, Dart, Kotlin, C#, and C++ (file-local functions). Security: Python, TypeScript/JavaScript, Java, Go, PHP, Rust, Dart, C#, Shell, GitHub Actions, GitLab CI, and Dockerfiles. Go needs the skylos-go engine (Docker image and GitHub Action); Dart needs an extra parser.
Is this a cheating detector?
No. It finds specific shortcuts in tests, CI, and code. It can't prove code is correct.
Is Skylos free?
Yes. The CLI, skylos done, and the GitHub Actions workflow need no login. Cloud Free adds a pass/fail pull request check; Workspace adds history, policy, and team review.
What do Cloud credits pay for?
Scan comparisons, AI fix PRs, AI triage, MCP remediation, and compliance reports. Scan uploads, Cloud scans of your GitHub repositories, PR checks, and the merge gate never use credits. MCP scan tools run on your machine and don't use credits. They need a project token, except the dead-code analyze tool, which works without one for 5 calls a day. Your first workspace gets a Workspace trial: 14 days, 50 credits, no card, nothing renews or charges you.