๐ Website ยท Documentation ยท Blog ยท GitHub Action ยท VS Code Extension ยท MCP Server
English | ไธญๆ
Skylos is an open-source static analysis tool and PR gate for Python, TypeScript, and Go. It helps teams detect dead code, hardcoded secrets, exploitable flows, and AI-generated security regressions before they land in main.
If you use Vulture for dead code, Bandit for security checks, or Semgrep/CodeQL for CI enforcement, Skylos combines those workflows with framework-aware dead code detection and diff-aware regression detection for AI-assisted refactors.
The core use case is straightforward: run it locally, add it to CI, and gate pull requests on real findings with GitHub annotations and review comments. Advanced features like AI defense, remediation agents, VS Code, MCP, and cloud upload are available, but you do not need any of them to get value from Skylos.
- Python teams that want dead code detection with fewer false positives than Vulture
- Repositories using Cursor, Copilot, Claude Code, or other AI coding assistants
- CI/CD pull request gates with GitHub annotations and review comments
- Python LLM applications that need OWASP LLM Top 10 checks
- CLI for local scans and CI/CD workflows
- GitHub Action for pull request gating and annotations
- VS Code extension for in-editor findings and AI-assisted fixes
- MCP server for AI agents and coding assistants
| Goal | Command | What you get |
|---|---|---|
| Scan a repo | skylos . -a |
Dead code, risky flows, secrets, and code quality findings |
| Gate pull requests | skylos cicd init |
A GitHub Actions workflow with a quality gate and inline annotations |
| Audit an LLM app | skylos defend . |
Optional AI defense checks for Python LLM integrations |
- Better dead code signal on real frameworks: Skylos understands FastAPI, Django, Flask, pytest, Next.js, React, and more, so dynamic code produces less noise.
- Diff-aware AI regression detection: Skylos can catch removed auth decorators, CSRF, rate limiting, validation, logging, and other controls that disappear during AI-assisted refactors.
- One workflow instead of three tools: Dead code, security scanning, and PR gating live in the same CLI and CI flow.
- Local-first by default: You can keep scans on your machine and add optional AI or cloud features later if you need them.
- Self-explaining output: Every table prints a legend explaining what each column and number means โ no manual required.
| Skylos | Vulture | |
|---|---|---|
| Recall | 98.1% (51/52) | 84.6% (44/52) |
| False Positives | 220 | 644 |
| Framework-aware (FastAPI, Django, pytest) | Yes | No |
| Security scanning (secrets, SQLi, SSRF) | Yes | No |
| AI-powered analysis | Yes | No |
| CI/CD quality gates | Yes | No |
| TypeScript + Go support | Yes | No |
Benchmarked on 9 popular Python repos (350k+ combined stars) + TypeScript (consola). Every finding manually verified. Full case study โ
# Generate a GitHub Actions workflow in 30 seconds
skylos cicd init
# Commit and push to activate
git add .github/workflows/skylos.yml && git pushWhat you get:
- Automatic dead code detection on every PR
- Security vulnerability scanning (SQLi, secrets, dangerous patterns)
- Quality gate that fails builds on critical issues
- Inline PR review comments with file:line links
- GitHub Annotations visible in the "Files Changed" tab
No configuration needed - works out of the box with sensible defaults. See CI/CD section for customization.
- What is Skylos?
- Quick Start
- Technical Debt Hotspots
- Key Capabilities
- Installation
- Skylos vs Vulture
- Projects Using Skylos
- How It Works
- Advanced Workflows
- CI/CD
- MCP Server
- Baseline Tracking
- Gating
- VS Code Extension
- Integration and Ecosystem
- Auditing and Precision
- Coverage Integration
- Filtering
- Release Automation
- Release Workflow Runbook
- CLI Options
- FAQ
- Limitations and Troubleshooting
- Contributing
- Roadmap
- License
- Contact
If you are evaluating Skylos, start with the core workflow below. The LLM and AI defense commands are optional.
| Objective | Command | Outcome |
|---|---|---|
| First scan | skylos . |
Dead code findings with confidence scoring |
| Audit risk and quality | skylos . -a |
Dead code, risky flows, secrets, quality, and SCA findings |
| Higher-confidence dead code | skylos . --trace |
Cross-reference static findings with runtime activity |
| Review only changed lines | skylos . --diff origin/main |
Focus findings on active work instead of legacy debt |
| Gate locally | skylos --gate |
Fail on findings before code leaves your machine |
| Set up CI/CD | skylos cicd init |
Generate a GitHub Actions workflow in 30 seconds |
| Gate in CI | skylos cicd gate --input results.json |
Fail builds when issues cross your threshold |
| Objective | Command | Outcome |
|---|---|---|
| Detect Unused Pytest Fixtures | skylos . --pytest-fixtures |
Find unused @pytest.fixture across tests + conftest |
| AI-Powered Analysis | skylos agent scan . --model gpt-4.1 |
Fast static + LLM file review with dead-code verification available on demand |
| Dead Code Verification | skylos agent verify . --model gpt-4.1 |
Dead-code-only second pass: static findings reviewed by the LLM |
| Security Audit | skylos agent scan . --security |
Deep LLM security review with interactive file selection |
| Auto-Remediate | skylos agent remediate . --auto-pr |
Scan, fix, test, and open a PR โ end to end |
| Code Cleanup | skylos agent remediate . --standards |
LLM-guided code quality cleanup against coding standards |
| PR Review | skylos agent scan . --changed |
Analyze only git-changed files |
| PR Review (JSON) | skylos agent scan . --changed --format json -o results.json |
LLM review with code-level fix suggestions |
| Local LLM | skylos agent scan . --base-url http://localhost:11434/v1 --model codellama |
Use Ollama/LM Studio (no API key needed) |
| PR Review (CI) | skylos cicd review -i results.json |
Post inline comments on PRs |
| AI Defense: Discover | skylos discover . |
Map all LLM integrations in your codebase |
| AI Defense: Defend | skylos defend . |
Check LLM integrations for missing guardrails |
| AI Defense: CI Gate | skylos defend . --fail-on critical --min-score 70 |
Block PRs with critical AI defense gaps |
| Whitelist | skylos whitelist 'handle_*' |
Suppress known dynamic patterns |
Use skylos debt <path> to rank structural debt hotspots without collapsing everything into a single urgency number.
scoreis the project-level structural debt score.priorityis the hotspot triage score used for ordering fix candidates.--changedlimits the visible hotspot list to changed files, but keeps the structural debt score anchored to the whole project.
# Full project debt scan
skylos debt .
# Review only changed hotspots without distorting the project score
skylos debt . --changed
# Compare the current project against a saved debt baseline
skylos debt . --baseline
# Save a repo-level debt baseline
skylos debt . --save-baselineDebt policy files such as skylos-debt.yaml are discovered from the scan target upward, and explicit CLI flags like --top override policy defaults.
Backup (GitHub): #82
The core product is dead code detection, security scanning, and PR gating. The AI-focused features below are optional layers on top of that baseline workflow.
- Taint Analysis: Traces untrusted input from API endpoints to databases to prevent SQL Injection and XSS.
- Secrets Detection: Hunts down hardcoded API keys (AWS, Stripe, OpenAI) and private credentials before commit.
- Vulnerability Checks: Flags dangerous patterns like
eval(), unsafepickle, and weak cryptography.
Skylos can also flag common AI-generated code mistakes. Every finding includes vibe_category and ai_likelihood (high/medium/low) metadata so you can filter them separately if you want.
- Phantom Call Detection: Catches calls to security functions (
sanitize_input,validate_token,check_permission, etc.) that are never defined or imported โ AI hallucinates these constantly.hallucinated_reference, high - Phantom Decorator Detection: Catches security decorators (
@require_auth,@rate_limit,@authenticate, etc.) that are never defined or imported.hallucinated_reference, high - Unfinished Generation: Detects functions with only
pass,..., orraise NotImplementedErrorโ AI-generated stubs that silently do nothing in production.incomplete_generation, medium - Undefined Config: Flags
os.getenv("ENABLE_X")referencing feature flags that are never defined anywhere in the project.ghost_config, medium - Stale Mock Detection: Catches
mock.patch("app.email.send_email")wheresend_emailno longer exists โ AI renames functions but leaves tests pointing at the old name.stale_reference, medium - Security TODO Scanners: Flags
# TODO: add authplaceholders that AI left behind and nobody finished. - Disabled Security Controls: Detects
verify=False,@csrf_exempt,DEBUG=True, andALLOWED_HOSTS=["*"]. - Credential & Randomness Checks: Catches hardcoded passwords and
random.choice()used for security-sensitive values like tokens and OTPs.
These checks run under --danger and look for prompt injection patterns or obfuscated instructions in repository content.
- Multi-File Prompt Injection Scanner: Scans Python, Markdown, YAML, JSON, TOML, and
.envfiles for hidden instruction payloads โ instruction overrides ("ignore previous instructions"), role hijacking ("you are now"), AI-targeted suppression ("do not flag", "skip security"), data exfiltration prompts, and AI-targeting phrases. - Text Canonicalization Engine: NFKC normalization, whitespace folding, and confusable replacement neutralize obfuscation before pattern matching.
- Zero-Width & Invisible Unicode: Detects zero-width spaces, joiners, BOM, and bidi overrides (U+200BโU+202E) that hide payloads from human reviewers.
- Base64 Obfuscation Detection: Automatically decodes base64-encoded strings and re-scans for injection content.
- Homoglyph / Mixed-Script Detection: Flags Cyrillic and Greek characters mixed with Latin text (e.g., Cyrillic 'ะฐ' in
password) that bypass visual review. - Location-Aware Severity: Findings in README files, HTML comments, and YAML prompt fields get elevated severity. Test files are automatically skipped.
Static analysis for AI application security that maps every LLM call in your Python codebase and checks for missing guardrails. Python only (TypeScript/Go support planned).
# Discover all LLM integrations
skylos discover .
# Check defenses and get a scored report
skylos defend .
# CI gate: fail on critical gaps, require 70% defense score
skylos defend . --fail-on critical --min-score 70
# JSON output for dashboards and pipelines
skylos defend . --json -o defense-report.json
# Filter by OWASP LLM Top 10 category
skylos defend . --owasp LLM01,LLM0413 checks across defense and ops:
| Check | Severity | OWASP | What it detects |
|---|---|---|---|
no-dangerous-sink |
Critical | LLM02 | LLM output flowing to eval/exec/subprocess |
untrusted-input-to-prompt |
Critical | LLM01 | Raw user input in prompt with no processing |
tool-scope |
Critical | LLM04 | Agent tools with dangerous system calls |
tool-schema-present |
Critical | LLM04 | Agent tools without typed schemas |
output-validation |
High | LLM02 | LLM output used without structured validation |
prompt-delimiter |
High | LLM01 | User input in prompts without delimiters |
rag-context-isolation |
High | LLM01 | RAG context injected without isolation |
output-pii-filter |
High | LLM06 | No PII filtering on user-facing LLM output |
model-pinned |
Medium | LLM03 | Model version not pinned (floating alias) |
input-length-limit |
Low | LLM01 | No input length check before LLM call |
logging-present |
Medium | Ops | No logging around LLM calls |
cost-controls |
Medium | Ops | No max_tokens set on LLM calls |
rate-limiting |
Medium | Ops | No rate limiting on LLM endpoints |
Defense and ops scores are tracked separately โ adding logging won't inflate your security score.
Custom policy via skylos-defend.yaml:
rules:
model-pinned:
severity: critical # Upgrade severity
input-length-limit:
enabled: false # Disable check
gate:
min_score: 70
fail_on: highSupports OpenAI, Anthropic, Google Gemini, Cohere, Mistral, Ollama, Together AI, Groq, Fireworks, Replicate, LiteLLM, LangChain, LlamaIndex, CrewAI, and AutoGen.
- Find Unused Code: Identifies unreachable functions, orphan classes, and unused imports with confidence scoring.
- Smart Tracing: Distinguishes between truly dead code and dynamic frameworks (Flask/Django routes, Pytest fixtures).
- Safe Pruning: Uses LibCST to safely remove dead code without breaking syntax.
- Context-aware audits: Combines static analysis speed with LLM reasoning to validate findings and filter noise.
- Remediation workflow:
skylos agent remediatecan scan, generate fixes, run tests, and optionally open a PR. - Local model support: Supports Ollama and other OpenAI-compatible local endpoints if you want code to stay on your machine.
- 30-Second Workflow Setup:
skylos cicd initgenerates GitHub Actions workflows with sensible defaults. - Diff-Aware Enforcement: Gate only the lines that changed, fail on severity thresholds, and keep legacy debt manageable with baselines.
- PR-Native Feedback: GitHub annotations, inline review comments, and optional dashboard upload keep findings where teams already work.
- Corpus Guard: Require the
Corpus Guardworkflow on PRs to catch dead-code precision regressions against curated framework and language fixtures.
- CST-safe removals: Uses LibCST to remove selected imports or functions (handles multiline imports, aliases, decorators, async etc..)
- Logic Awareness: Deep integration for Python frameworks (Django, Flask, FastAPI) and TypeScript (Tree-sitter) to identify active routes and dependencies.
- Granular Filtering: Skip lines tagged with
# pragma: no skylos,# pragma: no cover, or# noqa
- Coverage Integration: Auto-detects
.skylos-tracefiles to verify dead code with runtime data - Quality Gates: Enforces hard thresholds for complexity, nesting, and security risk via
pyproject.tomlto block non-compliant PRs - Interactive CLI: Manually verify and remove/comment-out findings through an
inquirer-based terminal interface - Security-Audit Mode: Leverages an independent reasoning loop to identify security vulnerabilities
- Unused Fixture Detection: Finds unused
@pytest.fixturedefinitions intest_*.pyandconftest.py - Cross-file Resolution: Tracks fixtures used across modules, not just within the same file
| Language | Parser | Dead Code | Security | Quality |
|---|---|---|---|---|
| Python | AST | โ | โ | โ |
| TypeScript/TSX | Tree-sitter | โ | โ | โ |
| Java | Tree-sitter | โ | โ | โ |
| Go | Standalone binary | โ | - | - |
Languages are auto-detected by file extension. Mixed-language repos work out of the box. No Node.js or JDK required โ all parsers are built-in via Tree-sitter.
| Rule | ID | What It Catches |
|---|---|---|
| Dead Code | ||
| Functions | - | Unused functions, arrow functions, and overloads |
| Classes | - | Unused classes, interfaces, enums, and type aliases |
| Imports | - | Unused named, default, and namespace imports |
| Methods | - | Unused methods (lifecycle methods excluded) |
| Security | ||
| eval() | SKY-D201 | eval() usage |
| Dynamic exec | SKY-D202 | exec(), new Function(), setTimeout with string |
| XSS | SKY-D226 | innerHTML, outerHTML, document.write(), dangerouslySetInnerHTML |
| SQL injection | SKY-D211 | Template literal / f-string in SQL query |
| Command injection | SKY-D212 | child_process.exec(), os.system() |
| SSRF | SKY-D216 | fetch()/axios with variable URL |
| Open redirect | SKY-D230 | res.redirect() with variable argument |
| Weak hash | SKY-D207/D208 | MD5 / SHA1 usage |
| Prototype pollution | SKY-D510 | __proto__ access |
| Dynamic require | SKY-D245 | require() with variable argument |
| JWT bypass | SKY-D246 | jwt.decode() without verification |
| CORS wildcard | SKY-D247 | cors({ origin: '*' }) |
| Internal URL | SKY-D248 | Hardcoded localhost/127.0.0.1 URLs |
| Insecure random | SKY-D250 | Math.random() for security-sensitive ops |
| Sensitive logs | SKY-D251 | Passwords/tokens passed to console.log() |
| Insecure cookie | SKY-D252 | Missing httpOnly/secure flags |
| Timing attack | SKY-D253 | ===/== comparison of secrets |
| Storage tokens | SKY-D270 | Sensitive data in localStorage/sessionStorage |
| Error disclosure | SKY-D271 | error.stack/.sql sent in HTTP response |
| Secrets | SKY-S101 | Hardcoded API keys + high-entropy strings |
| Quality | ||
| Complexity | SKY-Q301 | Cyclomatic complexity exceeds threshold |
| Nesting depth | SKY-Q302 | Too many nested levels |
| Function length | SKY-C304 | Function exceeds line limit |
| Too many params | SKY-C303 | Function has too many parameters |
| Duplicate condition | SKY-Q305 | Identical condition in if-else-if chain |
| Await in loop | SKY-Q402 | await inside for/while loop |
| Unreachable code | SKY-UC002 | Code after return/throw/break/continue |
Framework-aware: Next.js convention exports (page.tsx, layout.tsx, route.ts, middleware.ts), config exports (getServerSideProps, generateMetadata, revalidate), React patterns (memo, forwardRef), and exported custom hooks (use*) are automatically excluded from dead code reports.
TypeScript dead code detection tracks: callbacks, type annotations, generics, decorators, inheritance (extends), object shorthand, spread, re-exports, and typeof references. Benchmarked at 95% recall with 0 false positives on alive code.
## from pypi
pip install skylos
## with LLM-powered features (agent verify, agent remediate, etc.)
pip install skylos[llm]
## with Rust-accelerated analysis (up to 63x faster)
pip install skylos[fast]
## both
pip install skylos[llm,fast]
## or from source
git clone https://github.com/duriantaco/skylos.git
cd skylos
pip install .
skylos[fast]installs an optional Rust backend that accelerates clone detection (63x), file discovery (5x), coupling analysis, and cycle detection. Same results, just faster. Pure Python works fine without it โ the Rust module is auto-detected at runtime.
skylos[llm]installslitellmfor LLM-powered features (skylos agent verify,skylos agent remediate,--llm). Core static analysis works without it.
After installation, we recommend:
-
Set up CI/CD (30 seconds):
skylos cicd init git add .github/workflows/skylos.yml && git pushThis will automatically scan every PR for dead code and security issues.
-
Run your first scan:
skylos . # Dead code only skylos . --danger --secrets # Include security checks
-
Keep scans focused on active work:
skylos . --diff origin/main -
Try advanced workflows only if you need them:
skylos agent review . --model gpt-4.1 skylos defend .
See all commands in the Quick Start table
We benchmarked Skylos against Vulture on 9 of the most popular Python repositories on GitHub โ 350k+ combined stars, covering HTTP clients, web frameworks, CLI tools, data validation, terminal UIs, and progress bars. Every single finding was manually verified against the source code. No automated labelling, no cherry-picking.
We deliberately chose projects that stress-test dead code detection in different ways:
| Repository | Stars | What It Tests |
|---|---|---|
| psf/requests | 53k | __init__.py re-exports, Sphinx conf, pytest classes |
| pallets/click | 17k | IO protocol methods (io.RawIOBase subclasses), nonlocal closures |
| encode/starlette | 10k | ASGI interface params, polymorphic dispatch, public API methods |
| Textualize/rich | 51k | __rich_console__ protocol, sentinel vars via f_locals, metaclasses |
| encode/httpx | 14k | Transport/auth protocol methods, zero dead code (pure FP test) |
| pallets/flask | 69k | Jinja2 template globals, Werkzeug protocol methods, extension hooks |
| pydantic/pydantic | 23k | Mypy plugin hooks, hypothesis @resolves, __getattr__ config |
| fastapi/fastapi | 82k | 100+ OpenAPI spec model fields, Starlette base class overrides |
| tqdm/tqdm | 30k | Keras/Dask callbacks, Rich column rendering, pandas monkey-patching |
No repo was excluded for having unfavorable results. We include repos where Vulture beats Skylos (click, starlette, tqdm).
| Repository | Dead Items | Skylos TP | Skylos FP | Vulture TP | Vulture FP |
|---|---|---|---|---|---|
| psf/requests | 6 | 6 | 35 | 6 | 58 |
| pallets/click | 7 | 7 | 8 | 6 | 6 |
| encode/starlette | 1 | 1 | 4 | 1 | 2 |
| Textualize/rich | 13 | 13 | 14 | 10 | 8 |
| encode/httpx | 0 | 0 | 6 | 0 | 59 |
| pallets/flask | 7 | 7 | 12 | 6 | 260 |
| pydantic/pydantic | 11 | 11 | 93 | 10 | 112 |
| fastapi/fastapi | 6 | 6 | 30 | 4 | 102 |
| tqdm/tqdm | 1 | 0 | 18 | 1 | 37 |
| Total | 52 | 51 | 220 | 44 | 644 |
| Metric | Skylos | Vulture |
|---|---|---|
| Recall | 98.1% (51/52) | 84.6% (44/52) |
| False Positives | 220 | 644 |
| Dead items found | 51 | 44 |
Skylos finds 7 more dead items than Vulture with 3x fewer false positives.
Vulture uses flat name matching โ if the bare name X appears anywhere as a string or identifier, all definitions named X are considered used. This works well for simple cases but drowns in noise on framework-heavy codebases:
- Flask (260 Vulture FP): Vulture flags every Jinja2 template global, Werkzeug protocol method, and Flask extension hook. Skylos recognizes Flask/Werkzeug patterns.
- Pydantic (112 Vulture FP): Vulture flags all config class annotations,
TYPE_CHECKINGimports, and mypy plugin hooks. Skylos understands Pydantic model fields and__getattr__dynamic access. - FastAPI (102 Vulture FP): Vulture flags 100+ OpenAPI spec model fields (Pydantic
BaseModelattributes likemaxLength,exclusiveMinimum). Skylos recognizes these as schema definitions. - httpx (59 Vulture FP): Vulture flags every transport and auth protocol method. Skylos suppresses interface implementations.
- click (8 vs 6 FP): IO protocol methods (
readable,readinto) onio.RawIOBasesubclasses โ called by Python's IO stack, not by direct call sites. - starlette (4 vs 2 FP): Instance method calls across files (
obj.method()) not resolved back to class definitions. - tqdm (18 vs 37 FP, 0 vs 1 TP): Skylos misses 1 dead function in
__init__.pybecause it suppresses__init__.pydefinitions as potential re-exports.
Reproduce any benchmark:
cd real_life_examples/{repo} && python3 ../benchmark_{repo}.pyFull methodology and per-repo breakdowns in the skylos-demo repository.
We also benchmarked Skylos against Knip on a real-world TypeScript library:
| unjs/consola (7k stars, 21 files, ~2,050 LOC) | |
|---|---|
| Dead items | 4 (entire orphaned src/utils/format.ts module) |
| Metric | Skylos | Knip |
|---|---|---|
| Recall | 100% (4/4) | 100% (4/4) |
| Precision | 36.4% | 7.5% |
| F1 Score | 53.3% | 14.0% |
| Speed | 6.83s | 11.08s |
Both tools find all dead code. Skylos has ~5x better precision โ Knip incorrectly flags package entry points as dead files (its package.json exports point to dist/ not src/) and reports public API re-exports as unused.
Reproduce:
cd real_life_examples/consola && python3 ../benchmark_consola.py
If you use Skylos in a public repository, open an issue and add it here. This list is based on self-submissions, so it will stay small until more teams opt in publicly.
Skylos builds a reference graph of your entire codebase - who defines what, who calls what, across all files.
Parse all files -> Build definition map -> Track references -> Find orphans (zero refs = dead)
Static analysis often struggles with Python's dynamic nature (e.g., getattr, pytest.fixture). Skylos minimizes false positives through:
- Confidence Scoring: Grades findings (High/Medium/Low) so you only see what matters.
- Hybrid Verification: Uses LLM reasoning to double-check static findings before reporting.
- Runtime Tracing: Optional
--tracemode validates "dead" code against actual runtime execution.
| Confidence | Meaning | Action |
|---|---|---|
| 100 | Definitely unused | Safe to delete |
| 60 | Probably unused (default threshold) | Review first |
| 40 | Maybe unused (framework helpers) | Likely false positive |
| 20 | Possibly unused (decorated/routes) | Almost certainly used |
| 0 | Show everything | Debug mode |
skylos . -c 60 # Default: high-confidence findings only
skylos . -c 30 # Include framework helpers
skylos . -c 0 # EverythingWhen Skylos sees Flask, Django, FastAPI, Next.js, or React imports, it adjusts scoring automatically:
| Pattern | Handling |
|---|---|
@app.route, @router.get |
Entry point โ marked as used |
app.add_url_rule(...), app.add_api_route(...), app.add_route(...), app.register_listener(...), app.register_middleware(...) |
Imperative route or lifecycle registration โ marked as used |
@pytest.fixture |
Treated as a pytest entrypoint, but can be reported as unused if never referenced |
@pytest.hookimpl, @hookimpl |
Plugin hook implementation โ marked as used |
@celery.task |
Entry point โ marked as used |
getattr(mod, "func") |
Tracks dynamic reference |
getattr(mod, f"handle_{x}") |
Tracks pattern handle_* |
Next.js page.tsx, layout.tsx, route.ts |
Default/named exports โ marked as used |
Next.js getServerSideProps, generateMetadata |
Config exports โ marked as used |
React.memo(), forwardRef() |
Wrapped components โ marked as used |
Exported use* hooks |
Custom hooks โ marked as used |
Tests call code in weird ways that look like dead code. By default, Skylos excludes:
| Detected By | Examples |
|---|---|
| Path | /tests/, /test/, *_test.py |
| Imports | pytest, unittest, mock |
| Decorators | @pytest.fixture, @patch |
# These are auto-excluded (confidence set to 0)
/project/tests/test_user.py
/project/test/helper.py
# These are analyzed normally
/project/user.py
/project/test_data.py # Doesn't end with _test.pyWant test files included? Use --include-folder tests.
When ambiguous, we'd rather miss dead code than flag live code as dead.
Framework endpoints are called externally (HTTP, signals). Name resolution handles aliases. When things get unclear, we err on the side of caution.
| Version | Changes | Urgency | Date |
|---|---|---|---|
| v4.23.1 | ## [4.23.1](https://github.com/duriantaco/skylos/compare/v4.23.0...v4.23.1) (2026-06-04) ### Bug Fixes * **verify:** catch api and stale-reference hallucinations ([#530](https://github.com/duriantaco/skylos/issues/530)) ([7c9d0e2](https://github.com/duriantaco/skylos/commit/7c9d0e2b66de4a0f255c999763963d2b1f3891a6)) * **verify:** handle manifest-only dependency cases ([#525](https://github.com/duriantaco/skylos/issues/525)) ([9f3393c](https://github.com/duriantaco/skylos/commit/9f3393cd313edc | High | 6/4/2026 |
| v4.22.1 | ## [4.22.1](https://github.com/duriantaco/skylos/compare/v4.22.0...v4.22.1) (2026-05-30) ### Bug Fixes * **cli:** deprecate run dashboard ([#513](https://github.com/duriantaco/skylos/issues/513)) ([eb5331d](https://github.com/duriantaco/skylos/commit/eb5331d282ef7fd6f1fffded0cfa75dd85429069)) | High | 5/30/2026 |
| v4.19.0 | ## [4.19.0](https://github.com/duriantaco/skylos/compare/v4.18.0...v4.19.0) (2026-05-24) ### Features * **csharp:** add C# analyzer support ([#485](https://github.com/duriantaco/skylos/issues/485)) ([1422f41](https://github.com/duriantaco/skylos/commit/1422f41eece7ece968b4ba198d376cb7fd58ae6e)) * **docs:** add agent skills for Skylos ([#481](https://github.com/duriantaco/skylos/issues/481)) ([aeb4c5a](https://github.com/duriantaco/skylos/commit/aeb4c5af6467c85d4115267e27f5110ae85bfdc2)) * **d | High | 5/24/2026 |
| v4.15.1 | ## [4.15.1](https://github.com/duriantaco/skylos/compare/v4.15.0...v4.15.1) (2026-05-16) ### Bug Fixes * **audit:** contain audit file discovery ([#379](https://github.com/duriantaco/skylos/issues/379)) ([a95c246](https://github.com/duriantaco/skylos/commit/a95c246f90895cef31156f492ec3f30579d5f144)) * **cache:** harden grep cache writes ([#377](https://github.com/duriantaco/skylos/issues/377)) ([22afc24](https://github.com/duriantaco/skylos/commit/22afc24452ee5a1aa0f0cbda2fd72a508f41f796)) * | High | 5/16/2026 |
| v4.14.0 | ## [4.14.0](https://github.com/duriantaco/skylos/compare/v4.13.1...v4.14.0) (2026-05-11) ### Features * **security:** add Deep Mode audit foundation ([#339](https://github.com/duriantaco/skylos/issues/339)) ([d4a89d2](https://github.com/duriantaco/skylos/commit/d4a89d2478891834afde6f46d87c1468d2804a41)) * **security:** add SSRF evidence packets ([#336](https://github.com/duriantaco/skylos/issues/336)) ([2990d2c](https://github.com/duriantaco/skylos/commit/2990d2cb1bd9a76cdfc29a1f2ce79e108f17f | High | 5/11/2026 |
| v4.12.1 | ## [4.12.1](https://github.com/duriantaco/skylos/compare/v4.12.0...v4.12.1) (2026-05-08) ### Bug Fixes * **architecture:** repair Q802/Q803 audit defects ([#316](https://github.com/duriantaco/skylos/issues/316)) ([633e911](https://github.com/duriantaco/skylos/commit/633e911e17bfb4e2f62ac42175ebe528ddd29359)) * **architecture:** suppress private helper Q803 false positives ([#315](https://github.com/duriantaco/skylos/issues/315)) ([8ec8799](https://github.com/duriantaco/skylos/commit/8ec879926 | High | 5/8/2026 |
| v4.10.0 | ## [4.10.0](https://github.com/duriantaco/skylos/compare/v4.9.0...v4.10.0) (2026-05-02) ### Features * **analyzer:** add configurable vibe guardrails ([b789334](https://github.com/duriantaco/skylos/commit/b78933488deee7b3a40e6bb7c2fae44f93d76587)) * **analyzer:** add Python liveness evidence for dead-code detection ([#272](https://github.com/duriantaco/skylos/issues/272)) ([f5c53b3](https://github.com/duriantaco/skylos/commit/f5c53b372ef7aa848cd900a3410f9e15d5d92950)) * **cli:** add concise I | High | 5/2/2026 |
| v4.8.0 | ## [4.8.0](https://github.com/duriantaco/skylos/compare/v4.7.0...v4.8.0) (2026-04-28) ### Features * **cli:** add upload session metadata ([0758f77](https://github.com/duriantaco/skylos/commit/0758f77bca606f5f4e046ccc481e638779738d19)) ### Performance Improvements * **analyzer:** reduce scan runtime without changing findings ([#264](https://github.com/duriantaco/skylos/issues/264)) ([9cff0c4](https://github.com/duriantaco/skylos/commit/9cff0c4b38870bb99c093a95f9fb0b710ddfd6be)) ### Docum | High | 4/28/2026 |
| v4.5.0 | ## [4.5.0](https://github.com/duriantaco/skylos/compare/v4.4.0...v4.5.0) (2026-04-22) ### Features * **docker:** publish official GHCR image for Skylos CLI ([#230](https://github.com/duriantaco/skylos/issues/230)) ([0300f87](https://github.com/duriantaco/skylos/commit/0300f87997c0497f23b368a2f2ccbc609dab199e)) * **docker:** publish official GHCR image for Skylos CLI ([#231](https://github.com/duriantaco/skylos/issues/231)) ([96cc2b7](https://github.com/duriantaco/skylos/commit/96cc2b795c102fb | High | 4/22/2026 |
| v4.4.0 | ## [4.4.0](https://github.com/duriantaco/skylos/compare/v4.3.2...v4.4.0) (2026-04-16) ### Features * **cli:** add suite command for the full local bundle ([#209](https://github.com/duriantaco/skylos/issues/209)) ([1989905](https://github.com/duriantaco/skylos/commit/198990555adbebc1bda52fecf306a639a31616cf)) * **py:** add repo-aware vibe reference detection ([#208](https://github.com/duriantaco/skylos/issues/208)) ([797b1ab](https://github.com/duriantaco/skylos/commit/797b1ab83f25cfe0f2a282eb | High | 4/16/2026 |
| v4.3.2 | ## What's Changed * fix(ts): resolve workspace exports and local imports maps by @duriantaco in https://github.com/duriantaco/skylos/pull/181 * chore(deps): bump cryptography from 46.0.6 to 46.0.7 by @dependabot[bot] in https://github.com/duriantaco/skylos/pull/183 * refactor(core): reduce gatekeeper debt without changing behavior by @duriantaco in https://github.com/duriantaco/skylos/pull/184 * refactor(core): reduce fixgen debt without changing behavior by @duriantaco in https://github.com/dur | High | 4/10/2026 |
| v4.3.1 | ## [4.3.1](https://github.com/duriantaco/skylos/compare/v4.3.0...v4.3.1) (2026-04-08) ### Bug Fixes * **upload:** support large scan uploads via artifact transport ([#179](https://github.com/duriantaco/skylos/issues/179)) ([7f1641f](https://github.com/duriantaco/skylos/commit/7f1641f5fdda4970e310ad96836618b6dba96124)) | High | 4/8/2026 |
| v4.3.0 | ## [4.3.0](https://github.com/duriantaco/skylos/compare/v4.2.1...v4.3.0) (2026-04-08) ### Features * **cli:** add explicit project selection flow ([#171](https://github.com/duriantaco/skylos/issues/171)) ([3eb3001](https://github.com/duriantaco/skylos/commit/3eb30014c06cc5b4e96ed599298cc551010a7d3a)) ### Bug Fixes * **core:** honor root ignores and actionable clean edits ([#165](https://github.com/duriantaco/skylos/issues/165)) ([358dd1f](https://github.com/duriantaco/skylos/commit/358dd1f | Medium | 4/8/2026 |
| v4.2.1 | ## Changed - `skylos agent scan` now defaults to the fast review path. Slow dead-code verification is opt-in via `--verify-dead-code` - Agent review is more repo-aware, with better file selection and context for quality, security, and debt-style issues - Added agent benchmarks and Codex comparison runs with token reporting ## Fixed - Agent scans now fail cleanly on missing API keys instead of crashing - Review output is clearer when dead-code verification is still running - LLM provider | Medium | 4/4/2026 |
| v4.2.0 | ### Added - `skylos debt <path>` for technical debt hotspot analysis - separate structural debt scoring and hotspot `priority_score` ### Changed - CLI entrypoint cleanup by extracting command handlers into dedicated modules - CLI helper extraction and rules command extraction - agent ranking and payload helpers extracted out of `agent_center.py` - `skylos debt --top` now overrides `report.top` - changed-file debt scans now resolve git diffs from the repository root and include `.js | Medium | 3/30/2026 |
| v4.1.4 | ### Fixed - Honor project `.gitignore` during file discovery. Ignored worktrees, custom virtualenvs, and other excluded paths are no longer scanned - Treat imperative framework entrypoints as live code instead of dead code: - Flask `add_url_rule(...)` - FastAPI `add_api_route(...)` - Starlette `add_route(...)` / `add_websocket_route(...)` - Sanic `register_listener(...)` / `register_middleware(...)` - Treat pytest / Pluggy hook implementations (`@pytest.hookimpl`, `@hook | Medium | 3/28/2026 |
| v4.1.3 | ## [4.1.3] - 2026-03-22 ### Added - Configurable duplicate string threshold โ `duplicate_strings` in `[tool.skylos]` (default: 3) - CLI table now prints a brief explanation of what each column means - CLI discoverability overhaul โ `skylos` with no args shows grouped command overview of all 30+ commands - `skylos commands` โ flat alphabetical listing of every command - `skylos tour` โ guided 6-step walkthrough for new users - README Command Reference section with grouped tables - `nudg | Medium | 3/23/2026 |
| v4.1.2 | ## [4.1.2] - 2026-03-20 ### Added - MCP `validate_code_change` โ diff-level validation with security regression detection, dangerous pattern scanning, secret leak detection, and SQL injection checks - CI/CD review integration with security regression detection from diffs - Upload payload now includes `definitions` for Code City dashboard - Auto-detect changed files from git for quality checks when no explicit diff base is provided ### Fixed - Crash on systems without clipboard mechani | Low | 3/20/2026 |
| v4.1.0 | ## [4.1.0] - 2026-03-20 ### Added - Security regression detection โ SKY-L021 expanded to 13 categories: input validation, security headers, encryption, logging/audit, sanitization, permission checks. Findings include `control_type` field - Web scanner โ public scan page at `skylos.dev/scan`, paste a GitHub URL, get a vibe code risk score. No signup, rate-limited (10/IP/hr) - MCP guardrails โ `validate_code_change` (diff validation for regressions, dangerous patterns, secrets) and `get_secu | Low | 3/20/2026 |
| v4.0.0 | ## [4.0.0] - 2026-03-15 ### Added - **`-a` / `--all` flag** โ enables `--danger`, `--secrets`, `--quality`, and `--sca` in one shot. `skylos . -a` replaces `skylos . --danger --secrets --quality --sca` - **`addopts` config** โ set default CLI flags in `pyproject.toml` under `[tool.skylos]`, just like pytest. Supports list (`["--quality", "--danger"]`) or string (`"--quality --danger"`) format. CLI flags override `addopts` - **LLM Verification Agent** โ `skylos agent verify <path>` runs 3-p | Low | 3/16/2026 |
| v3.5.9 | ## [3.5.9] - 2026-03-10 Patch over 3.5.8. ### Fixed - `skylos cicd init` no longer crashes with `TypeError: generate_workflow() got an unexpected keyword argument 'use_baseline'` ## [3.5.8] - 2026-03-10 ### Fixed - SKY-D260: multiline HTML comments no longer produce duplicate findings โ all spanned lines are excluded from prose scanning - SKY-D260: `scan_directory` now reuses project-wide `DEFAULT_EXCLUDE_FOLDERS` (adds `vendor`, `.next`, `.nuxt`, `.idea`, etc.) - SKY-D260: remov | Low | 3/10/2026 |
| v3.5.7 | ## [3.5.7] - 2026-03-09 ### Added - `skylos cicd init --upload` flag for cloud dashboard upload workflows - SKY-L016: Undefined Config โ detects references to undefined env-var feature flags - SKY-L023: Phantom Decorator โ detects undefined security decorators - SKY-L024: Stale Mock โ detects `mock.patch` targeting renamed/removed functions - SKY-L026: Unfinished Generation โ detects stub-only functions in production code - SKY-D260: AI Supply Chain Security โ multi-file prompt injectio | Low | 3/9/2026 |
| v3.5.6 | ## [3.5.6] - 2026-03-07 ### Added - `--diff [BASE_REF]` flag for line-level precision filtering โ only reports findings in lines changed since BASE_REF (e.g. `--diff origin/main`). Use `--diff` without a value to auto-detect (`GITHUB_BASE_REF` or `origin/main`). Unlike `--diff-base` which filters at the file level, `--diff` uses unified diff hunk headers for exact line-range matching - Git blame attribution: findings show the author who introduced the code - Auto-upload: linked projects au | Low | 3/8/2026 |
| v3.5.5 | ## [3.5.5] - 2026-03-04 ### Added - Claude Code Security integration โ ingest Anthropic's AI vulnerability scanner findings into Skylos dashboard - `skylos ingest claude-security` CLI subcommand (--input, --token, --no-upload, --json) - `skylos cicd init --claude-security` generates a 3-job GitHub Actions workflow (Skylos + Claude Security in parallel, upload sequential) - Blue "Claude Security" badges on scans list, scan detail, and issues list pages - Example workflow: `.github/workflo | Low | 3/4/2026 |
| v3.5.4 | ## [3.5.4] - 2026-03-03 ### Added - LLM now generates code-level fix suggestions. It shows the problematic code snippet and the corrected version with 2 lines of context before/after - PR inline comments render vulnerable code and fixed code in fenced code blocks - PR summary "Top Issues" section uses collapsible `<details>` blocks for code fixes - Fallback to rule-based text suggestions (`_RULE_SUGGESTIONS`) when LLM is not used ### Fixed - Phase 3 matching: findings without `rule_id | Low | 3/3/2026 |
| v3.5.3 | ## [3.5.3] - 2026-03-03 ### Added - CVE reachability analysis for Python SCA findings via ca9 engine โ proves whether vulnerable dependency code is actually reachable, eliminating false positives - "Reachability" column in SCA table output (red=Reachable, green=Unreachable, yellow=Inconclusive) - Auto-discovery of `coverage.json` for dynamic reachability analysis - `ca9` added as a core dependency - `skylos whoami` command โ shows org, project, and plan info ### Fixed - `--json -o <f | Low | 3/3/2026 |
| v3.5.2 | ## [3.5.2] - 2026-03-01 ### Added - Go dead code detection now live - Go module caching to avoid redundant binary invocations per file ### Changed - Go engine output now returns symbols alongside findings - Go engine contract validates symbol data structure - README: added Skylos vs Knip (TS) benchmark on consola | Low | 3/1/2026 |
| v3.5.1 | ## [3.5.1] - 2026-02-28 ### Added - TypeScript analysis 6.7x faster โ batched ~77 per-file tree-sitter queries into 3-4 module-level compiled queries - SKY-D245 (HIGH): Dynamic `require()` with variable argument - SKY-D246 (HIGH): `jwt.decode()` without verification - SKY-D247 (MEDIUM): CORS wildcard origin `cors({ origin: '*' })` - SKY-D248 (MEDIUM): Hardcoded internal URL (`localhost`/`127.0.0.1`) - SKY-D250 (MEDIUM): Insecure randomness โ `Math.random()` usage - SKY-D251 (HIGH): Sen | Low | 2/28/2026 |
| v3.4.3 | ## [3.4.3] - 2026-02-25 ### Added - Multi-path CLI support โ `skylos app/ tests/` analyzes all paths with deduplication - Module-scoped f-string pattern matching (`export_*` no longer leaks across modules) - `@abstractmethod` declarations suppressed as dead code - Framework dictionaries for Starlette, Flask-RESTful, Tornado, Marshmallow, SQLAlchemy, Celery, Click ### Fixed - Pattern tracker double-counting refs from redundant per-module loop - `private_name` penalty 80โ60 for correct | Low | 2/25/2026 |
| v3.4.2 | ## [3.4.2] - 2026-02-22 ### Added - Next.js/React framework TypeScript dead code detection. Convention-based exports, route handlers, config exports, react patterns, and exported custom hooks are no longer flagged as dead code - Added dynamic dispatch pattern detection. `getattr(module, f"prefix_{var}")` registers f-string patterns and marks matching functions as used - Added `globals()[f"prefix_{var}"]` f-string subscript detection - Added `__init_subclass__` registry pattern are now ma | Low | 2/24/2026 |
| v3.4.1 | ## [3.4.1] - 2026-02-21 ### Added - BFS from entry points through the import graph to eliminate false positives for code in orphaned modules - `__getattr__` package handling and dynamic module safety for lazy-loading and `eval`/`exec` patterns - Relative import resolution in raw import collection - `skylos credits` command and credit check before `--upload` - MCP server auth, rate limiting, and per-tool credit deduction ### Fixed - `--trace --json` and `--pytest-fixtures --json` prod | Low | 2/21/2026 |
| v3.3.0 | ## [3.3.0] - 2026-02-13 ### Added **DevOps Remediation Agent** - New `skylos agent remediate` command โ end-to-end security & quality remediation agent that scans, prioritizes, fixes, tests, and creates PRs autonomously - `--dry-run` shows remediation plan without touching files - `--max-fixes N` caps the number of fixes per run - `--auto-pr` creates a git branch, commits fixes, pushes, and opens a PR via `gh` - `--test-cmd CMD` overrides test suite auto-detection (supports py | Low | 2/13/2026 |
| v3.2.5 | ## [3.2.5] - 2026-02-09 ### Fixed - Wired `exclude_folders` parameter through `run_pipeline` and `run_static_on_files` - `run_analyze` call inside run_pipeline now uses the passed `exclude_folders` instead of always calling `parse_exclude_folders()` | Low | 2/9/2026 |
| v3.2.4 | ## [3.2.4] - 2026-02-08 ### Changed - Refactored agent analyze and review commands from parallel execution to a pipeline architecture where static analysis is source of truth and LLM verifies - Extracted orchestration logic from `cli.py` into `pipeline.py` - Static analysis now indexes the full project even when reviewing changed files, fixing FP dead code in the review command - LLM no longer independently discovers dead code. Only confirms static findings - LLM-only findings are now al | Low | 2/8/2026 |
| v3.2.3 | ## [3.2.3] - 2026-02-07 ## Fixed - Fixed hallucination detection by making PyPI "missing" status behave correctly - Improved dependency parsing for pyproject.toml and setup.py, including extras like pkg[extra], and updated parsers to return (deps, name) - Ensured the project's own package name is included in declared dependencies - Fixed tests to reflect above changes | Low | 2/7/2026 |
| v3.2.1 | ## [3.2.1] - 2026-02-05 ## Fixed - Fix import usage counting by mapping imports to the correct original def using the full qualified import target. We matched ref keys so aliases donโt mark the wrong mod as used. | Low | 2/6/2026 |
| v3.2.0 | ## [3.2.0] - 202-02-05 ## Added - Added `graph.py` to handle taint analysis, data flow, and context slicing for the LLM. - Added `FalsePositiveFilterAgent` in `agents.py` to verify static findings using the LLM - Added typing for `visitor.py`, `base.py`, `merger.py`, `schemas.py`, `framework_aware.py`, and `test_aware.py` - Added CI auto-detection for GitHub Actions, Jenkins, CircleCI, and GitLab CI in `api.py` - Added automatic PR/MR number extraction from CI environments - Added e | Low | 2/5/2026 |
| v0.3.0-skylos-vsce | ## [0.3.0] - 2025-02-01 ### Added - Real-time analysis. Detects bugs as you type, no save required - Choose between OpenAI and Anthropic - CodeLens buttons. "Fix with AI" and "Dismiss" appear inline on error lines - See fix progress in status bar as AI generates code - Function caching. It only re-analyzes functions that changed - Popup alerts for critical issues with configurable cooldown - New settings: `aiProvider`, `openaiApiKey`, `anthropicApiKey`, `openaiModel`, `anthropicModel`, | Low | 2/2/2026 |
| v3.1.2 | ## [3.1.2] - 202-01-25 ### Added - Parse pyproject.toml for console entrypoints via `[project.scripts]` (and optionally `[tool.poetry.scripts]`) and treat them as implicit usage - Added `--pytest-fixtures` flag which should be run in the test directory. This will allow Skylos to detect pytest fixtures that are defined but never used - Added dependency hallucination to catch packages that do not exist - Allow customrules and compliance from main webapp (beta) ### Fixed - Fixed tests | Low | 1/26/2026 |
| v3.1.1 | ## [3.1.1] - 202-01-20 ### Added - Added new `--provider` flag to force `openai` or `anthropic` provider - New `--base-url` flag for OpenAI compatible endpoints (eg. Ollama etc) - env variable support: `SKYLOS_LLM_PROVIDER`, `SKYLOS_LLM_BASE_URL`, `OPENAI_BASE_URL` - Auto API key bypass for local endpoints (localhost, 127.0.0.1, 0.0.0.0) - Added agent for LLM assisted detection - Added new cache and parallel processing functionalities - More unit tests for LLM agents, cache and para | Low | 1/20/2026 |
| v3.0.3 | ## [3.0.3] - 2026-01-10 ### Added - Added protocol and ABC detection. Things include protocol class and member skipping. Classes inhering from `abc.ABC` or `ABC` classes are tracked. `@abstractmethod` decorators are also collected per ABC class. Methods implementing parent ABC's abstract methods as well as classes explicitly inheriting from Protocol classes will get a confidence of 0 - Added `visit_ClassDef` tracking inside `visitor.py` for ABC/Protocol inheritance chains - Added auto du | Low | 1/10/2026 |
| v3.0.1 | ## [3.0.1] - 2026-01-08 New year new me, and a new release! Happy new year everyone! ### Added - Added `--trace` flag for runtime call tracing using `sys.settrace()` to capture dynamic dispatch patterns (visitor patterns, getattr, plugins) - Added `skylos/tracer.py` with `CallTracer` class to record function calls during test execution - Added pytest plugin hooks (`pytest_configure`, `pytest_unconfigure`, `pytest_addoption`) for `--skylos-trace` integration - Added `.skylos_trace` f | Low | 1/10/2026 |
| v2.7.1 | ## [2.7.1] - 2025-12-23 ### Fixed - Fixed packaging bug where `skylos.visitors.languages` were missing from some installs, causing `ModuleNotFoundError: No module named 'skylos.visitors.languages'` - Fixed bug where running `skylos --version` could crash by importing optional language scanners too early - Fixed pre-commit integration issue where inline `python -c gate` scripts could fail with SyntaxError due to multi-statement if usage - Fixed pre-commit integration reliability by moving | Low | 12/23/2025 |
| v2.5.3 | ## [2.5.3] - 2025-11-28 ### Fixed - Fixed a bug in `analyzer.py` where exclusion patterns were ignored - Fixed `UnboundLocalError` in `start_server` by correctly passing `exclude_folders` as an argument ### Added - Added support in `analyzer.py` for excluding nested directories (e.g., `--exclude-folder src/legacy`) using normalized path matching | Low | 11/28/2025 |
| v2.5.2 | ## [2.5.2] - 2025-11-24 ### Added - **Gatekeeper (`--gate`):** A new "Quality Gate" feature that blocks CI/CD pipelines or local deployments if critical issues are found. - Supports "Bypass" mode - Includes a deployment wizard that handles git staging/commit/push if the checks pass - **Config Support:** Skylos now reads settings from `pyproject.toml` under `[tool.skylos]`. - Users can change the complexity thresholds, max arguments, and ignore specific rules without waiting for a r | Low | 11/24/2025 |
| v2.5.1 | ## [2.5.1] - 2025-11-19 ### Changed - CLI now displays **relative file paths** (relative to the scanned root), reducing text overflow in CLI output ### Added - Added `--tree` flag so users can display their results in an ASCII tree format ### Downstream - Analyzer returns richer metadata (`analysis_summary`, secrets/danger/quality wiring), preparing for FE UI integrations down the road | Low | 11/19/2025 |
| v2.5.0 | ## [2.5.0] - 2025-11-12 ### Added - Code quality scanner with 2 new rules namely complexity and nesting - flags high cyclomatic complexity - flags deep nesting - Added uv.lock for frozen dependency snapshot ### Changed - CLI ui/ux polish ### Fixed - Fixed dataframely schema class reports class variables marked as unused - Fixed multi-part module imports not detected correctly ### Developer Notes Quality rules live under: - `skylos/rules/quality/complexity.py` | Low | 11/12/2025 |
| v0.1.1-skylos-vsce | Added Output panel showing all findings grouped by category and severity Status bar item with clickable icon showing scan results File paths with line numbers for each finding Extension icon Changed Improved error reporting and feedback Fixed Issues not showing detailed location information **Full Changelog**: https://github.com/duriantaco/skylos/compare/v0.1.0-skylos-vsce...v0.1.1-skylos-vsce | Low | 11/6/2025 |
| v2.4.0 | ## Add SKY-D211 (CRITICAL) + test โ> SQL injection (cursor): tainted/string-built SQL into .execute etc SKY-D217 (CRITICAL) -> SQL injection (raw-api): tainted SQL SKY-D216 (CRITICAL) + test โ> SSRF: tainted URL into HTTP clients SKY-D215 (HIGH) + test โ> Path traversal: tainted file path into open(...), os.* etc SKY-D212 (CRITICAL) + test โ> Cmd injection: tainted command to os.system(...) or subprocess.*(...). Added new UI materials into the VSC extension **Full Changelog**: https:/ | Low | 11/6/2025 |
| v0.1.0-skylos-vsce | ## [0.1.0] - 2025-09-22 ### Added - VS Code extension: inline diagnostics - Popup + status bar after each scan - Settings: `skylos.path`, `skylos.confidence`, `skylos.excludeFolders`, `skylos.runOnSave` (default true), `skylos.enableSecrets` (default true), `skylos.enableDanger` (default true), `skylos.showPopup` (default true) - Workspace command: "Skylos: Scan Workspace" | Low | 9/22/2025 |
| v2.3.0 | ## Changelog ## [2.3.0] - 2025-09-22 ### Added - You can now download the plugin via marketplace VSC - Added dangerous patterns scanner (from SKY-D201 -> D210). Results appear in JSON under dangerous - Danger flag for cli to trigger the dangerous pattern scanning `--danger` - Added test for danger script - `--table` flag to output results in table format ### Fixed - Removed non JSON prints which was causing some CICD pipeline failures - Fixed the REGEX for secrets which was c | Low | 9/22/2025 |
| v2.2.4 | ## [2.2.4] - 2025-09-22 ### Added - Added dangerous patterns scanner (from SKY-D201 -> D210). Results appear in JSON under dangerous - Danger flag for cli to trigger the dangerous pattern scanning `--danger` - Added test for danger script ### Fixed - Removed non JSON prints which was causing some CICD pipeline failures - Fixed the REGEX for secrets which was causing a lot of false positives - Analyzer now emits separate secrets and dangerous buckets | Low | 9/22/2025 |
| v2.2.3 | ## [2.2.3] - 2025-09-18 ### Fix Interactive remove and comment out works for dotted imports (e.g. import pkg.subpkg.mod) and class/async methods (Class.method). There was a name mismatch in `codemods.py` script | Low | 9/18/2025 |
| v2.2.2 | ## [2.2.2] - 2025-09-17 ### Added - Secrets scanning PoC (SKY-S101): provider patterns + generic high entropy - `--secrets` CLI flag. Results shown in JSON output. To trigger secrets scanning run with `--secrets` flag - Unit tests covering secrets - GitHub Actions CI. Skylos Deadcode Scan workflow (.github/workflows/skylos.yml) ### Changed - Lazy imports to avoid cycles ### Fixed - Circular import causing scan_ctx import errors. - Minor preview/test stability issues | Low | 9/17/2025 |
| v2.1.2 | ## [2.1.2] - 2025-08-27 ### Added - `Dataclass` field detection in `visitor.py`. When a class has `@dataclass`, its annotated class attributes are tagged as dataclass fields - `first_read_lineno` tracking. Record the first line where each variable is read. - `visit_Global` to bind global names to module-level FQNs ### Changed - Report `ALL_CAPS` constants. Previously we had a blanket mute which caused quite a bit of problems - `_apply_penalties` mute dataclass fields - In `Defin | Low | 8/28/2025 |
| v2.1.1 | ## Changelog ## [2.1.1] - 2025-08-23 ### Added - Added pre-commit hooks ## [2.1.0] - 2025-08-21 ### Added - CST based safe edits for removals.. `remove_unused_import_cst` and `remove_unused_function_cst` using `libcst` + `PositionProvider`. Handles multiline imports, aliases, decorators, async defs etc .. - Unit tests done for `codemode.py` - Added dependency: `libcst>=1.4` to project requirements. ### Changed - `visitor.py` improvements by tracking locals and types per fun | Low | 8/23/2025 |
| v2.0.0 | Added web interface! | Low | 7/14/2025 |
| v1.2.2 | ## [1.2.2] - 2025-07-03 ### Fixed - Patched bug because down in the loop accidentally overwrote `self.ignored_lines` so it never fires lmao | Low | 7/3/2025 |
| v1.2.1 | ## [1.2.1] - 2025-07-03 ### Added - Skylos now recognises comment directives that mark code as intentionally unreachable: `# pragma: no skylos`, `# pragma: no cover`, and standard `# noqa`. Lines carrying these tags are skipped in all unused-code reports - `proc_file()` returns a 7 tuple: the final item is the `set[int]` of ignored line numbers. Library users can consume it immediately. Legacy callers still work - **Deprecation warning** A `DeprecationWarning` is emitted when | Low | 7/3/2025 |


