Skip to content

Latest commit

 

History

History
314 lines (239 loc) · 23 KB

README.zh-CN.md

File metadata and controls

314 lines (239 loc) · 23 KB
Skylos

Skylos

开源、本地优先,在代码合并前检查死代码、安全问题、密钥、质量回归和 AI 代码错误。

License: Apache 2.0 codecov PyPI - Python Version PyPI version VS Code Marketplace Discord

官网 | 文档 | 快速开始 | GitHub Action | VS Code 扩展 | 基准测试 | 贡献指南

English | Deutsch | 简体中文 | 其他翻译

Skylos 是什么?

Skylos 是一款面向 Python、TypeScript、JavaScript、Java、Go、PHP、Rust、Dart、C#、C++、Kotlin 和 Shell 仓库的开源静态分析 CLI。它默认在本地运行,也可以作为 CI/CD PR 门控使用。Python、TypeScript/JavaScript 和 Java 的覆盖最深,其他语言的支持范围见“语言支持”表。

如果你使用 Vulture 检测死代码、Bandit 做安全检查,或使用 Semgrep、CodeQL、GitHub Advanced Security 做 CI 门控,Skylos 可以作为补充:它更关注框架感知的死代码检测、差异感知的回归检查,以及适合 PR 审查的反馈。

60 秒开始

pip install skylos
skylos .            # 查找问题;代码和发现的问题都留在本机
skylos cloud        # 可选:在 Skylos Cloud 上按分支跟踪结果
skylos cicd init    # 为每个拉取请求添加 Skylos 检查

使用编码代理时,只需要两个命令:

skylos setup   # 每个仓库一次:连接 Claude Code 和 Codex,写入 PR 检查,生成代码地图
skylos open    # 每天:代码图、用简单语言说明的改动、每一次检查

检查由你的代理自己运行。教程记录了一次真实会话:代理描述代码、 修改代码、被拦下,然后按照 Skylos 的修复说明修好。

skylos cloud 运行全部检查,显示发现的问题并上传,然后打印当前分支的质量门结果和一个链接:

✗ Quality gate on feat/login: FAILED (was PASSED on 24 Oct 15:38 UTC, 1ba9895) · 1 critical security issue
  Open: https://skylos.dev/dashboard/projects/<project>?branch=feat%2Flogin
  Next: fix the issues behind the failed gate, then run skylos cloud again.

第一次运行会打开浏览器登录并为此仓库选择项目。它发送的是发现的问题:文件路径、最多 7 行的代码片段(密钥类问题不带片段)、分支、提交、每个被标记行的 git 作者邮箱,以及函数和类的 概览(名称、文件、行号、大小、调用关系)。不会发送你的仓库。即使 Skylos Cloud 质量门失败,退出码 也是 0;加上 --gate 时退出码为 1(用于 CI)。通过质量门永远不需要密钥:修复导致失败的问题即可。详见 Skylos Cloud。

加入安全、密钥、质量和依赖检查:

skylos . -a

生成 GitHub Actions PR 门控:

skylos cicd init
git add .github/workflows/skylos.yml
git commit -m "Add Skylos CI gate"
git push

加 --upload 时(本机已用 skylos login 登录 Skylos Cloud 时这是默认值;未登录时默认不加上传作业), 工作流还会通过 GitHub OIDC 上传到 Skylos Cloud:默认分支的推送,以及指向默认分支的 PR。PR 在没有任何凭据的作业中作为不可信数据扫描,再由一个从不检出其文件的作业上传。

使用 GitLab CI、Jenkins、Bitbucket Pipelines、Azure Pipelines 或 CircleCI?同一条 skylos cicd init 会为该 CI 设置 PR 门控,详见 Skylos on any CI。

需要更多命令?阅读 CLI Reference。

选择你的工作流

目标 命令 你会得到什么 详细文档
第一次死代码扫描 skylos . 发现未使用的函数、类、导入、文件和框架入口点问题 死代码文档
安全与质量审计 skylos . -a 增加危险数据流、密钥、依赖和质量检查 安全文档
可分享的一页报告 skylos report . 生成 skylos-report.html:结论(“Not ready: 1 blocking issue”)、最先要修的五个风险及修复建议和文档链接、按类别的问题数、被抑制的数量和未覆盖的检查;不会上传任何内容 CLI Output Modes
AI 复核问题 skylos . -a --ai-review 各语言的未使用代码问题和 Python 文件中的安全问题都会得到 AI 判断:确认、AI 不同意或不确定。不会隐藏任何问题,门禁结果不变;使用 skylos cloud --ai-review 时判断会显示在 Skylos Cloud AI review
可选 Python lint pip install "skylos[lint]" && skylos lint . 通过 Skylos CLI 运行 Ruff,并保留其原生配置、输出、修复和退出码 Python linting
PR 门控 skylos cicd init 为你的 CI 设置 PR 门控:生成带注释和失败阈值的 GitHub Actions 工作流,或为 GitLab CI、Jenkins、Bitbucket Pipelines、Azure Pipelines 和 CircleCI 生成门控配置 CI/CD 指南
更易读的终端报告 skylos . --format pretty 按文件分组展示发现,包含严重级别标记、代码片段和可复制的 file:line 位置 CLI Output Modes
可选择的终端界面 skylos . --tui 打开键盘驱动的分类列表、发现列表和详情面板 CLI Output Modes
审查用的变更地图 skylos done map --base origin/main 列出每个改动的 Python 或 TypeScript/JavaScript 函数:新旧代码、新增和删除的调用、调用者、被删除的安全检查,以及应该先读哪些改动;由代码计算得出,不是模型生成 Change map
代码库图谱 skylos graph open 在本地浏览器中展示每个 Python 和 TypeScript/JavaScript 函数和类(Go、Java、Rust 和 PHP 为初步支持,调用按名称匹配),按区域分组,谁调用谁、测试及其期望输出;标出改动的代码,并说明逻辑是否保持不变(只有能证明时才这样说)。通俗英文说明由你的编码代理、你自己的模型密钥或 Skylos(消耗额度)生成;Skylos Cloud 可以在每个拉取请求上发布逻辑变更评论。skylos done map 把每处改动分为“先读”“要读”“略读”和“可跳过”(只有能证明逻辑不变时才可跳过);相应的 MCP 工具不需要密钥 Codebase graph
只审查变更行 skylos . -a --diff origin/main 聚焦当前 PR,避免被历史债务淹没 质量门控
运行时辅助死代码检测 skylos . --trace 用测试运行轨迹降低动态代码误报 Smart Tracing
AI 辅助审查 skylos agent scan . 静态分析加可选 LLM 审查和修复建议 AI Features
LLM 应用防护 skylos defend . 查找缺失的 AI 应用防护措施并映射到 OWASP LLM 风险 AI app safety
技术债务梳理 skylos debt . 排序热点和债务趋势 Technical Debt

Skylos 能发现什么?

类别 示例 为什么重要
死代码 未使用的函数、类、导入、包入口点、路由处理器 降低维护成本,同时避免误删动态框架代码
安全缺陷 SQL 注入、XSS、SSRF、路径穿越、命令注入、不安全反序列化 在代码进入 main 前发现可利用路径
密钥 API key、token、私有凭据、高熵字符串 防止凭据通过提交和 PR 泄露
质量回归 复杂度、深层嵌套、重复分支、长函数、不一致返回 防止 AI 辅助重构引入脆弱代码
AI 代码错误 幻觉安全调用、缺失装饰器、未完成桩代码、禁用的安全控制 捕获常见的 AI 生成或不完整代码路径
LLM 应用风险 不安全工具调用、提示注入暴露、缺失输出校验、缺失限流 帮助团队在发布 AI 功能时保留防护栏

查看完整 Rules Reference。

团队为什么使用 Skylos?

  • 框架感知的死代码检测: 理解 FastAPI、Django、Flask、pytest、SQLAlchemy、Next.js、React、包入口点和常见插件模式。
  • 面向 CI/CD 的工作流: 本地运行、PR 门控、GitHub diff 注释,并通过基线控制历史问题。
  • 默认本地优先: 核心静态分析不需要云端上传,也不需要 LLM 调用。
  • 面向 AI 时代的回归检查: 捕获 AI 辅助编辑中被移除的验证、认证、日志、CSRF、限流等控制。
  • 统一命令入口: 死代码、安全、密钥、质量、技术债务、Agent 审查和 AI 防御都在同一个 CLI 下。

安装选项

# 核心静态分析
pip install skylos

# LLM Agent 工作流
pip install "skylos[llm]"

# 通过 `skylos lint` 使用 Ruff Python lint
pip install "skylos[lint]"

# 所有已发布的可选 extras
pip install "skylos[all]"

容器镜像:

docker pull ghcr.io/duriantaco/skylos:latest
docker run --rm -v "$PWD":/work -w /work ghcr.io/duriantaco/skylos:latest . --json --no-provenance

源码安装、容器使用和可选依赖请看 Installation。

语言支持

语言 死代码 安全 质量 说明
Python 是 是 是 覆盖最强,支持框架感知静态分析和可选运行时追踪
TypeScript / JavaScript 是 是 是 Tree-sitter 解析、包图可达性、框架约定
Java 是 是 是 Tree-sitter 解析和结构化安全流分析
Go 是¹ 部分¹ 部分 死代码和部分安全基准覆盖
PHP 是 是 否 PHP parser 覆盖;安全检查在单个函数或文件内追踪请求数据(超全局变量、Laravel/Symfony/PSR-7/CodeIgniter 请求、Drupal Form API),覆盖命令与代码执行、include 文件包含、echo/<?= ?>/Blade {!! !!} XSS、SQL、SSRF、unserialize 和文件路径;不跨函数或文件,也不检查 Twig 模板
Rust 实验性⁴ 部分 部分 Rust 解析;命令注入、路径穿越、直接不可达语句及重复分支检查
Dart 是³ 部分³ 否 Dart parser 覆盖;安全检查覆盖命令注入、路径穿越和 SSRF
C# 部分 部分 部分 C# 符号、直接代码块中的不可达语句、感知 ASP.NET 的安全检查(请求来源、按接收者类型识别的汇入点、不安全反序列化、XSS)及 NuGet 依赖清单(.csproj 和 packages.lock.json)
C++ 部分 否 否 仅报告 .cpp、.cc、.cxx 中看似未使用的文件内函数;会读取 C++ 头文件中的引用
Kotlin 部分² 部分² 否 词法符号提取;只报告 private 声明和导入;Spring、Ktor、Servlet 和 Android WebView 安全检查
Shell 否 部分 否 shell 脚本安全检查,覆盖命令注入、SSRF 和路径穿越

¹ Go 的死代码和安全检查需要原生 skylos-go 引擎。从 4.50 起,Linux、macOS 和 Windows(x86_64 和 arm64)的 PyPI wheel 以及容器镜像都包含该引擎,官方 GitHub Action 会自动构建。其他平台上 skylos doctor 会给出构建命令。没有该引擎时只运行 Go 质量检查,Go 文件会被报告为未分析。

² Kotlin 死代码只报告 private 类型和函数以及未使用的导入;所有非 private 声明都视为已使用。代码中的任何使用都算引用:类型位置、::foo、尾随 lambda 和中缀调用、字符串模板以及 KDoc 链接;运算符约定导入(getValue、plus、component1)从不报告。Kotlin 安全分析是词法级的(没有 Kotlin 解析器),复用 Java 的来源和汇入点:输入来自 Spring 处理方法参数、HttpServletRequest、Ktor call.parameters、call.receive<T>() 和 WebFlux ServerRequest;检查覆盖命令注入(SKY-D212、SKY-D203)、包括字符串模板的 SQL 注入(SKY-D211)、路径穿越(SKY-D215)、SSRF(SKY-D216)、开放重定向(SKY-D230)、HTML 响应 XSS(SKY-D226)、ObjectInputStream/XMLDecoder(SKY-D204、SKY-D233)、XXE(SKY-D236)、SpEL/JNDI(SKY-D237),以及 Android WebView JavaScript 桥(SKY-D257)和 file:// URL 文件访问(SKY-D258)。数据流只在单个函数或路由 lambda 内跟踪。密钥扫描覆盖 .kt 和 .kts 文件。

³ Dart 检查需要可选依赖 skylos[dart](pip install "skylos[dart]",安装时需要 C 编译器)。未安装时,包含 .dart 文件的扫描会把它们报告为未分析(SKY-ANALYSIS-INCOMPLETE)。

⁴ Rust 死代码是实验性功能:trait 方法调用、跨 crate 使用的 pub 项、重新导出和宏都不会被解析。Rust 候选项的置信度最高为 40,低于默认阈值 60,因此只有加上 --confidence 40 才会列出。

上表所有语言的内联抑制用法相同:在问题所在行的注释里写 skylos: ignore[SKY-D211] 原因(只抑制列出的规则)、skylos: ignore(抑制所有规则),或用 skylos: ignore-start … skylos: ignore-end 包住一段代码(Python、Shell 和 PHP 用 #,其他语言用 // 或单行 /* */)。它适用于死代码、安全、质量和密钥检查;字符串字面量里的文字不算数,其他工具的标记(#nosec、//nolint、NOSONAR、@SuppressWarnings)不会隐藏 Skylos 的问题。

--secrets 还会读取 shell 脚本(包括以 shell #! 行开头、没有扩展名的脚本)、C 和 C++ 源文件与头文件、Dockerfile、Terraform .tf/.tfvars/.hcl、.properties、XML、Gradle、.npmrc 和 .pypirc。

C# 死代码检查采用保守策略:完整扫描可执行或 Web 应用时,未被引用的 public 类型和方法会作为低置信度候选项;库的公开 API、protected 成员及已知的框架或 配置入口仍视为可被外部使用。构造函数只有在私有、带参数且没有任何调用时才会 报告为未使用函数(与 Roslyn IDE0051 规则一致);控制器和依赖注入的构造函数由 框架调用。暂不分析 C# 源文件的可达性;质量检查可识别直接代码块中无条件 return、throw、 break 或 continue 后的语句,但并非完整控制流分析。安全检查(--danger)把 ASP.NET 请求数据视为输入:控制器 Action、Razor Page 处理程序、Minimal API 和 [From*] 参数以及 Request.*,不包括构造函数参数或普通服务参数,并会跟踪到 同一文件中的辅助方法。它报告 SQL 注入(ADO.NET、EF 原始 SQL、Dapper)、命令注入、 路径遍历、SSRF(HttpClient、WebClient、WebRequest、RestSharp)、开放重定向 (LocalRedirect 或 Url.IsLocalUrl 检查除外)、不安全反序列化(BinaryFormatter 系列、Json.NET TypeNameHandling、SimpleTypeResolver)以及通过 HtmlString/Html.Raw/MarkupString 和 HTML 响应产生的 XSS,每条都带 CWE。 与汇入点同名的方法(如仓储的 GetAsync)只有在接收者类型匹配时才计入。使用 --secrets 或 -a 时,也会对 .cs 文件运行通用密钥扫描。C# 污点分析暂不跟踪 .cshtml/.razor 标记、跨文件数据流以及插值原始字符串中的表达式。SCA 会收集 .csproj 中直接声明的 NuGet PackageReference; 只有无条件的精确 Version([version])且没有本地 Update/Remove 修改时 才会查询漏洞;VersionOverride 和集中管理的版本不在此范围内。普通版本号只是最低版本约束;没有已解析的 锁文件时,实际安装版本及漏洞状态仍未知。有 packages.lock.json(RestorePackagesWithLockFile)时, 会按每个目标框架检查所有已解析的包,包括传递依赖。

规则族和扫描范围请看 Rules Reference。

依赖文件

依赖漏洞扫描(--sca,-a 已包含)把下列文件当作数据读取,并按其中记录的精确版本查询 OSV:

生态 锁文件(全部已记录的包) 清单文件(只用精确版本;版本范围记为未解析) 会列出但不读取
PyPI uv.lock、poetry.lock、Pipfile.lock requirements.txt、pyproject.toml、setup.cfg、setup.py 没有锁文件的 Pipfile
npm package-lock.json、npm-shrinkwrap.json、pnpm-lock.yaml、yarn.lock、bun.lock package.json bun.lockb
Go go.mod Go 1.17 之前的 go.sum
Maven / Gradle gradle.lockfile pom.xml(properties、本地父 POM 和 <dependencyManagement>) 没有 gradle.lockfile 的 build.gradle(.kts)
crates.io Cargo.lock Cargo.toml(=x.y.z)
Packagist composer.lock composer.json
RubyGems Gemfile.lock 没有锁文件的 Gemfile
Pub pubspec.lock pubspec.yaml
NuGet packages.lock.json *.csproj([x.y.z])

Git、本地路径、SDK、私有仓库和分支(dev-*)条目会列为未检查,从不当作公共包查询。详见 Dependency scanning。

基准测试快照

Skylos 有已提交的死代码、安全、质量、Agent 审查和 AI 代码错误回归套件。 这些是回归门控,不是独立的准确率基准。用例数量会随套件更新;请以各套件的 manifest 为准。

方法论、注明日期的结果、对比数据和限制请看 BENCHMARK.md。

项目证据

Skylos 辅助的死代码清理 PR 已被 Black、 NetworkX、 Optuna、 mitmproxy、 pypdf 和 beets 合并。这些是已被接受的清理 PR,不代表相关项目背书。详见 Real-World Results。

集成

集成 链接 用途
GitHub Action GitHub Action PR 门控、注释和 CI 执行
VS Code 扩展 VS Code extension 编辑器内发现和 AI 辅助修复
MCP server MCP setup 将 Skylos 扫描暴露给 AI Agent 和编码助手
Docker image Installation 无需本地 Python 安装即可运行 Skylos
Skylos Cloud Cloud workflow 可选上传和仪表盘工作流

文档地图

你需要 阅读
安装、源码安装和 Docker Installation
第一次扫描和核心工作流 Quick Start
CLI 命令、flags 和示例 CLI Reference
CLI 输出模式、pretty 报告和 TUI 快捷键 CLI Output Modes
通过 Skylos CLI 使用可选 Ruff lint Python Linting
CI 设置、PR 门控、注释和分支保护 CI/CD
死代码行为和框架感知 Dead Code Detection
安全扫描和污点分析 Security Analysis
Rule ID 前缀和产品术语 Rule Dictionary
Agent 扫描、验证、修复和模型设置 AI Features
AI 防御和 LLM guardrails AI app safety
一次改动影响了什么、先读什么(skylos done map) Change map
教程:skylos setup、skylos open、Pipeline 视图和 PR 检查,来自一次真实的代理会话 教程
谁调用谁、通俗说明,以及改动后的逻辑是否不变(skylos graph) Codebase graph
MCP server 设置 MCP Server
基线、过滤、抑制和白名单 Configuration
智能追踪 Smart Tracing
规则族和语言支持 Rules Reference
云端上传和仪表盘流程 CLI to Dashboard
VS Code 扩展 VS Code Extension
基准测试和方法论 BENCHMARK.md
安全政策 SECURITY.md
发布流程 RELEASE_WORKFLOW.md
贡献 CONTRIBUTING.md

常见问题

Skylos 会替代 Bandit、Semgrep、CodeQL 或 Vulture 吗?

不会。Skylos 可以和它们一起使用。Skylos 更关注框架感知的死代码信号、PR 门控、AI 时代的回归检查,以及把死代码、安全、密钥和质量整合到一个工作流。

Skylos 需要 LLM 吗?

不需要。核心静态分析在本地运行,不需要 API key。LLM 功能是可选的,通过 skylos[llm] 和 agent 命令使用。

Skylos 会替代 Ruff 吗?

不会。skylos lint 是一个委托给 Ruff 的可选命令入口。使用 pip install "skylos[lint]" 安装;普通 Skylos 扫描不会运行 Ruff。

可以只扫描变更代码吗?

可以。本地使用 skylos . -a --diff origin/main,或者在 CI 中配置只关注新发现。

如何处理有意的动态代码?

使用基线、白名单、内联抑制或运行时追踪。参见 configuration docs 和 smart tracing docs。

贡献与支持

许可证

Skylos 使用 Apache License 2.0。