KengoTODA/inspequte

GitHub: KengoTODA/inspequte

一款专为 CI/CD 和 AI Agent 设计的快速 JVM 字节码静态分析工具,输出标准化 SARIF 报告。

Stars: 5 | Forks: 2

# inspequte ![inspequte logo](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/b72e033249142052.png) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/41f476a4e4142059.svg)](https://github.com/KengoTODA/inspequte/actions/workflows/ci.yml) [![Crates.io](https://img.shields.io/crates/v/inspequte.svg)](https://crates.io/crates/inspequte) [![Gradle Plugin Portal Version](https://img.shields.io/gradle-plugin-portal/v/io.github.kengotoda.inspequte)](https://plugins.gradle.org/plugin/io.github.kengotoda.inspequte) [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL%203.0-blue.svg)](https://www.gnu.org/licenses/agpl-3.0.en.html) [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://www.conventionalcommits.org/en/v1.0.0/) inspequte 是一款快速、优先考虑 CLI 的静态分析工具,专为 JVM class 和 JAR 文件设计。 它专注于 CI/CD 速度、确定性输出以及仅 SARIF 报告,以实现全球标准兼容性。 该名称结合了 "inspect" 和 "cute"。CLI 命令为 `inspequte`。 ## 目标 - 为 CI 流水线提供快速启动和分析。 - 无需 IDE 集成。 - 输出确定性的 SARIF v2.1.0,便于 LLM 友好的自动化。 ## 本地规则工作流 (Codex skills) `.codex/skills/` 下提供了五个用于顺序规则工作的本地技能: - `inspequte-rule-plan` - `inspequte-rule-spec` - `inspequte-rule-impl` - `inspequte-rule-verify` - `inspequte-rule-no-go-resume` 推荐顺序: 1. 计划:运行 `inspequte-rule-plan`,提供简短的规则想法和目标 `rule-id`。 2. 规范:运行 `inspequte-rule-spec` 以编写 `src/rules//spec.md`。 3. 实现:基于 `spec.md` 运行 `inspequte-rule-impl` 并添加测试。 4. 准备隔离的验证输入: scripts/prepare-verify-input.sh [base-ref] cargo build > verify-input/reports/cargo-build.txt 2>&1 cargo test > verify-input/reports/cargo-test.txt 2>&1 cargo audit --format sarif > verify-input/reports/cargo-audit.sarif 5. 验证:仅使用 `verify-input/` 运行 `inspequte-rule-verify`(无 plan/log 上下文)。 当规则实现在 GitHub Actions 上被标记为 No-Go 时,运行 `inspequte-rule-no-go-resume` 以: 1. 从源 PR 继承 `plan/spec/impl`, 2. 弥补 No-Go 原因中缺失的实现/测试缺口, 3. 更新 `prompts/references/no-go-history.md`,记录实现状态和修复说明。 使用拆分的提示词以减少上下文混淆: - `prompts/ideate-rule.md` - `prompts/authoring-plan.md` - `prompts/authoring-spec.md` - `prompts/authoring-impl.md` - `prompts/authoring-verify.md` - `prompts/authoring-no-go-resume.md` 编排参考: - `prompts/authoring-rule.md` 规则文档生成是确定性的: ``` scripts/generate-rule-docs.sh ``` 此命令重新生成 `docs/rules/index.md` 和 `docs/rules/.md`。 ## 字节码/JDK 兼容性 - 支持高达 Java 21(主版本号 65)的 JVM class 文件。 - 在未来的版本中,某些高级字节码属性可能仍会被跳过。 - 某些检查(例如针对局部变量的 Prefer EnumSet 规则)依赖于 `LocalVariableTypeTable` 属性,该属性仅在类使用调试符号编译时存在 (例如 `javac -g`)。字段和方法签名在没有调试信息的情况下仍会被分析。 ## 安装 通过 Homebrew tap 安装: ``` brew install KengoTODA/tap/inspequte ``` 或从 GitHub Releases 下载预编译的二进制文件: - Linux (x86_64): `inspequte--amd64-unknown-linux-gnu.tar.gz` - Linux (ARM64): `inspequte--arm64-unknown-linux-gnu.tar.gz` - macOS (Apple Silicon): `inspequte--arm64-apple-darwin.tar.gz` - macOS (Intel): `inspequte--amd64-apple-darwin.tar.gz` - Windows (x86_64): `inspequte--amd64-pc-windows-msvc.zip` (`TAG` 是 GitHub 发布标签,例如 `inspequte-v0.15.1`。) Linux/macOS 示例: ``` TAG="$(gh release list --repo KengoTODA/inspequte --exclude-drafts --exclude-pre-releases --limit 1 --json tagName --jq '.[0].tagName')" TARGET="arm64-apple-darwin" # use amd64-apple-darwin on macOS Intel, arm64-unknown-linux-gnu on Linux ARM64, amd64-unknown-linux-gnu on Linux x86_64 curl -fL -o inspequte.tar.gz \ "https://github.com/KengoTODA/inspequte/releases/download/${TAG}/inspequte-${TAG}-${TARGET}.tar.gz" tar -xzf inspequte.tar.gz chmod +x inspequte sudo mv inspequte /usr/local/bin/inspequte ``` Windows (PowerShell) 示例: ``` $Tag = gh release list --repo KengoTODA/inspequte --exclude-drafts --exclude-pre-releases --limit 1 --json tagName --jq '.[0].tagName' $Asset = "inspequte-$Tag-amd64-pc-windows-msvc.zip" Invoke-WebRequest -Uri "https://github.com/KengoTODA/inspequte/releases/download/$Tag/$Asset" -OutFile "inspequte.zip" Expand-Archive -Path "inspequte.zip" -DestinationPath "." # 移动到包含在 PATH 中的目录 Move-Item ".\\inspequte.exe" "$HOME\\bin\\inspequte.exe" -Force ``` ### 手动下载二进制文件的 macOS 说明 (Gatekeeper) macOS 可能会阻止直接运行从互联网下载的二进制文件(Gatekeeper/隔离行为)。 请遵循 Apple 的官方指南以允许执行: - [Gatekeeper and runtime protection](https://support.apple.com/guide/security/gatekeeper-and-runtime-protection-sec5599b66df/web) - [Open a Mac app from an unknown developer](https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unknown-developer-mh40616/mac) 对于终端工具,在确认二进制文件来源自官方发布版后,您可以移除隔离属性: ``` xattr -d com.apple.quarantine /usr/local/bin/inspequte ``` ## CLI 用法 ``` inspequte --input app.jar --classpath lib/ --output results.sarif ``` 设置 SARIF `run.automationDetails.id`(GitHub 代码扫描类别): ``` inspequte --input app.jar --classpath lib/ --output results.sarif \ --automation-details-id "inspequte/./main" ``` 创建当前发现的基线,以便在未来的运行中忽略它们: ``` inspequte baseline --input app.jar --classpath lib/ --output inspequte.baseline.json ``` 使用基线运行以仅输出新问题: ``` inspequte --input app.jar --classpath lib/ --output results.sarif --baseline inspequte.baseline.json ``` 如果省略 `--baseline` 输出/输入路径,默认使用 `.inspequte/baseline.json`;缺失文件将被忽略。 您可以通过在路径前加上 `@` 前缀来从文件中读取输入或 classpath 列表。 文件格式为每行一个路径;空行和以 `#` 开头的行将被忽略。 ``` inspequte --input @inputs.txt --classpath @classpath.txt --output results.sarif ``` 仅使用 `--rules` 运行特定规则。 您可以提供逗号分隔的 ID,重复该选项,或从 `@file` 加载 ID。 ``` inspequte --input app.jar --output results.sarif \ --rules SYSTEM_EXIT,THREAD_RUN_DIRECT_CALL \ --rules RETURN_IN_FINALLY inspequte --input app.jar --output results.sarif --rules @rules.txt ``` 对于 `@rules.txt`,每行使用一个规则 ID(支持嵌套的 `@file` 引用);空行和以 `#` 开头的行将被忽略。 通过 `--json` 提供对 Agent 友好的 JSON 输入: ``` inspequte --json '{"command":"scan","input":["app.jar"],"classpath":["lib/"],"rules":["SYSTEM_EXIT"],"output":"results.sarif"}' inspequte --json @request.json cat request.json | inspequte --json - ``` `--json` 与 path/rules/baseline 扫描标志(`--input`, `--classpath`, `--rules`, `--baseline`, `--output`, `--allow-duplicate-classes`)互斥。 请求负载的 JSON Schema 发布于: - https://kengotoda.github.io/inspequte/schemas/cli-option.json ## Gradle 用法 使用 Gradle 插件: ``` plugins { id("java") id("io.github.kengotoda.inspequte") version "" } inspequte { // Optional: forward OTLP collector URL to inspequte via --otel otel.set("http://localhost:4318/") // Optional: prefix for --automation-details-id (task appends /) automationDetailsIdPrefix.set("inspequte/custom-path") } // Registered automatically: // - writeInspequteInputsMain / writeInspequteInputsTest // - inspequteMain / inspequteTest // Each inspequte task emits: // build/inspequte//report.sarif ``` 该插件将所有生成的 `inspequte*` 任务挂载到 `check`。 `inspequte` 命令必须在 `PATH` 中可用。 默认情况下,每个任务将 `--automation-details-id` 设置为 `inspequte//`。 您也可以在任务运行时通过 CLI 传递收集器 URL: `./gradlew inspequteMain --inspequte-otel http://localhost:8080` 您可以从 CLI 覆盖任务的自动化详情 ID: `./gradlew inspequteMain --inspequte-automation-details-id "inspequte/override/main"` ## SARIF 输出 (示例) ``` { "version": "2.1.0", "$schema": "https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0.json", "runs": [ { "tool": { "driver": { "name": "inspequte", "informationUri": "https://github.com/KengoTODA/inspequte" } }, "results": [] } ] } ``` ## CI 集成 (GitHub Actions) 在 CI 中使用 Gradle 插件并从 GitHub Releases 安装 CLI: ``` - name: Install inspequte uses: KengoTODA/setup-inspequte@8d212fa51a56245829f88e60f081c6549e312c57 - name: Setup Java uses: actions/setup-java@v5.2.0 with: distribution: temurin java-version: "21" - name: Setup Gradle uses: gradle/actions/setup-gradle@v5.0.2 - name: Run inspequte tasks run: ./gradlew check --no-daemon - name: Upload SARIF to GitHub Code Scanning (optional) uses: github/codeql-action/upload-sarif@v4.32.6 with: sarif_file: results.sarif ``` ## Coding agent 集成 使用 coding agent(Codex, Claude Code, GitHub Copilot)运行 `inspequte`,检查 生成的 SARIF,并提出修复建议。 请参阅: - `docs/coding-agent.md` 获取运行 `inspequte` 的提示词示例。 - `docs/github-actions.md` 获取 GitHub Actions 自动化示例。 用于 coding agent 的示例提示词: ``` Run: inspequte --input app.jar --classpath lib/ --output results.sarif Then: 1) Summarize findings by rule ID. 2) Prioritize high-impact issues. 3) Propose patch-ready fixes with file paths. ``` ## 许可证 AGPL-3.0。参见 `LICENSE`。
标签:AGPL, DevSecOps, Gradle, JAR, JVM, Kotlin, LLM辅助, Redis利用, Rust, SARIF, Scala, 上游代理, 云安全监控, 可视化界面, 后台面板检测, 开源, 性能优先, 插件, 漏洞测试, 确定性输出, 编码代理, 网络流量审计, 网络调试, 自动化, 通知系统, 静态分析