Accenture/MethodAtlas
GitHub: Accenture/MethodAtlas
MethodAtlas是一个扫描测试源代码的CLI工具,通过结合AST确定性分析与AI辅助分类,自动生成结构化的安全测试覆盖率清单,以满足合规审计需求。
Stars: 0 | Forks: 0
# MethodAtlas
MethodAtlas 是一个 CLI 工具,用于扫描测试源代码树以查找测试方法,并为每个发现的方法生成一条结构化记录——支持可选的 AI 辅助安全分类。该工具开箱即支持 Java (JUnit 5, JUnit 4, TestNG)、C# (.NET — xUnit, NUnit, MSTest) 以及 TypeScript/JavaScript (Jest, Vitest, Mocha);并且可以通过插件添加对其他语言的支持。
它专为需要向审计员、监管机构或安全审查委员会证明安全属性测试覆盖率的团队而构建:它将**确定性的源代码分析**与**可选的 AI 解释**分离开来,从而确保每个结果都是可追溯、可重复且经得起推敲的。
## 为什么选择 MethodAtlas
受监管行业的安全团队需要的不仅仅是一个能通过的测试套件。他们需要以足够详尽的细节来证明*哪些*测试覆盖了*哪些*安全控制,以满足外部审查的要求。
MethodAtlas 通过以极少的设置将现有测试套件转换为结构化清单来解决这一问题。完整列表请参阅[支持的语言和框架](#supported-languages-and-frameworks)。插件架构允许在不修改核心工具的情况下添加更多语言。
| 挑战 | MethodAtlas 提供的解决方案 |
| --- | --- |
| “请向我们展示您的安全测试覆盖率” | 带有每种方法分类理由的 AI 分类清单 |
| “证明测试自上次审计以来未被更改” | 每个类的 SHA-256 内容指纹 (`-content-hash`) |
| “将其集成到我们的 SAST 流水线中” | 原生 **SARIF 2.1.0** 输出,兼容 GitHub Advanced Security、VS Code、Azure DevOps 和 SonarQube |
| “我们不能将源代码发送到外部 AI API” | 通过 **Ollama** 进行本地推理,或针对网闸隔离环境采用两阶段的**手动 AI 工作流** |
| “分类必须一致且可审计” | 闭合的、受版本控制的**安全分类法**,以及与您的控制框架保持一致的可选自定义分类法 |
| “我们需要置信度分数,而不仅仅是是或否” | 每个方法的 AI **置信度分数** (`0.0–1.0`),用于基于阈值的过滤和人工审查队列 |
| “为我们标注这些源文件” | **应用标签模式**将 `@DisplayName` 和 `@Tag` 注解直接写入源文件 |
| “我们的 @Tag 注解看起来过时了” | **标签与 AI 偏移检测**标记源文件注解与 AI 分类之间的不一致 |
## 核心功能
- **确定性测试发现** — 基于 AST 的分析(Java 使用 JavaParser,C# 使用 ANTLR4 语法);不进行推断,不会在方法存在性上出现误报;根据导入/using 指令自动检测框架
- **多语言插件架构** — Java、C# 和 TypeScript/JavaScript 插件以单独的 JAR 形式提供,通过 `ServiceLoader` 加载;新语言无需更改核心工具
- **SARIF 2.1.0 输出** — 与静态分析平台和 IDE 工具链的一流集成
- **AI 安全分类** — 根据闭合的安全分类法对每个测试方法进行分类;支持 Ollama、OpenAI、Anthropic、Azure OpenAI、Groq、xAI、GitHub Models、Mistral 和 OpenRouter
- **置信度评分** — 每个方法的十进制分数 (`-ai-confidence`);可按阈值进行过滤,用于生成审计报告
- **内容哈希指纹** — 类 AST 文本的 SHA-256 值 (`-content-hash`);同一个类中的所有方法共享相同的哈希值;支持增量扫描和变更检测
- **AI 结果缓存** — 按哈希值重用之前的 AI 分类 (`-ai-cache`);未更改的类不消耗 API 调用
- **标签与 AI 偏移检测** — `-drift-detect` 标记源代码中 `@Tag("security")` 与 AI 分类不一致的方法
- **多根目录和单体仓库扫描** — `-emit-source-root` 向 CSV/纯文本输出追加 `source_root` 列,消除不同模块下出现相同 FQCN 时的记录歧义
- **分类覆盖** — `-override-file` 记录人工审查的更正内容;覆盖在重新运行中保持不变,并将置信度设置为 `1.0` 或 `0.0`
- **差异报告** — `-diff` 比较两次 CSV 扫描并生成变更报告:两次运行之间被添加、删除或修改的方法;适用于 CI 回归门禁
- **仅安全过滤器** — `-security-only` 在 CSV/纯文本输出中隐藏非安全方法;在 SARIF 模式下自动应用
- **不一致限制** — `-mismatch-limit` 作为 `-apply-tags-from-csv` 的安全门禁;当 CSV 与当前代码库不匹配时中止操作,不触碰源文件
- **GitHub Actions 注解** — `-github-annotations` 为与安全相关的方法输出行内 PR 注解,无需 GitHub Advanced Security 许可证
- **应用标签** — 将 AI 建议的 `@DisplayName` 和 `@Tag` 注解写回源文件;具有幂等性
- **从 CSV 应用标签** — 将 CSV 中人工审查后的注解决策应用回源文件;将审查步骤与回写步骤分离
- **手动 AI 工作流** — 针对阻止 API 访问的环境的两阶段准备/消费工作流
- **本地推理** — Ollama 支持将源代码完全保留在您的网络内
- **YAML 配置** — 在团队或 CI 流水线之间共享扫描设置,无需重复使用 CLI 标志
- **自定义分类法** — 提供与 ISO 27001、NIST SP 800-53、PCI DSS 或您自己的控制框架相对齐的外部分类法文件
- **扫描来源信息** — `-emit-metadata` 在 CSV 开头预置工具版本和时间戳;可嵌入到证据包中
- **多种输出模式** — CSV(默认)、纯文本、SARIF 和 GitHub Actions 注解
## 快速开始
构建并解压分发包,然后运行:
```
cd methodatlas-/bin
# 静态扫描 — 输出 fqcn、method、loc、tags
./methodatlas /path/to/project
# AI 安全分类(本地 Ollama)
./methodatlas -ai /path/to/project
# SARIF 输出 — 通过管道输出到文件以上传到 GitHub Advanced Security
./methodatlas -sarif /path/to/project > results.sarif
# SARIF + AI 丰富信息 + content hash 指纹
./methodatlas -ai -sarif -content-hash /path/to/project > results.sarif
# 将 AI 建议的 annotations 应用回源文件
./methodatlas -ai -apply-tags /path/to/tests
# 将审查过的 CSV 决策应用回源文件
./methodatlas -apply-tags-from-csv reviewed.csv /path/to/tests
# GitHub Actions 内联 PR annotations
./methodatlas -ai -github-annotations /path/to/tests
```
完整的选项参考请参阅 [docs/cli-reference.md](docs/cli-reference.md)。
## 桌面 GUI
`methodatlas-gui` 模块提供专业的 Swing 桌面应用程序,
用于交互式分析和标签审查。它面向需要在不使用命令行的
情况下审查、覆盖和应用 AI 建议的 `@Tag` 注解的安全工程师和审计人员。
### 功能
- **目录选择器** — 浏览至任何测试源码根目录;会记住上次使用的路径
- **后台分析** — 测试发现和 AI 富化在后台线程中运行;UI 全程保持响应
- **结果树** — 方法按类分组;颜色编码的状态指示器可一目了然地显示哪些方法需要注意(橙色 `⚠`)、已正确标记(绿色 `✓`)或没有 AI 数据(灰色 `○`)
- **语法高亮编辑器** — 所选方法的源文件在带有行号和代码折叠功能的嵌入式 RSyntaxTextArea 编辑器中打开;支持的语言:Java、C#、TypeScript、JavaScript
- **标签编辑器** — 将方法当前的 `@Tag` 值与 AI 建议的标签并排显示为可交互的切换标签块;在回写到源文件之前,可以单独接受或拒绝标签
- **自定义覆盖** — 手动输入以逗号分隔的标签,以补充或替换 AI 建议
- **分阶段工作流** — “Apply to Source” 将更改暂存在内存中而不写入磁盘;**Save All Changes** 工具栏按钮将每个文件的所有暂存补丁批量处理为一次写入,从而消除了修改同一类中的多个方法时可能出现的行号偏移;暂存的方法在树中显示为带有橙色铅笔 `✎` 图标;如果存在暂存的更改,应用程序在退出时会提示保存
- **审计追踪** — 每次执行 **Save All Changes** 操作都会在扫描项目根目录下的隐藏 `.methodatlas/` 目录中写入两个产物:
- 带有时间戳的**证据 CSV**(`methodatlas-YYYYMMDD-HHmmss.csv`),使用与 CLI `DeltaReport` CSV 相同的列模式,记录每个被修补方法的 AI 建议和用户的最终决定——永远不会被覆盖,按每次保存操作累积
- 累积的**覆盖 YAML**(`overrides.yaml`),采用 CLI `--override` 标志所消费的 `ClassificationOverride` 格式,使未来的分析运行能够重现相同的决定而无需重新调用 AI;条目包含 ISO-8601 时间戳,并且在配置时,`note` 字段中包含审查者身份
- **活动面板** — 位于状态栏上方的可折叠面板,在分析运行时出现;显示当前正在发送给 AI 的类、确定性进度计数器(`X / Y classes`)、已用时间,以及带有每个类耗时和方法计数的已完成类的可滚动日志;可立即识别长时间的 AI 请求是否停滞
- **AI 配置文件** — 多个命名的提供商配置(例如 "Fast Ollama"、"GPT-4o"、"Java-only")并排共存;活动配置文件从工具栏的组合框中选择,无需打开“设置”;切换配置文件将在下一次运行时生效
- **插件选择** — “设置”对话框列出在 classpath 上检测到的所有发现插件;取消选中某个插件可将其排除在下次扫描之外,这在只需要处理一种语言时非常有用
- **设置对话框** — 配置文件管理器(新建 / 删除 / 重命名 + 每个配置文件的完整表单),适用于十种受支持的 AI 提供商(Ollama、OpenAI、Anthropic、Azure OpenAI、Groq、xAI、GitHub Models、Mistral、OpenRouter 或 AUTO)中的任何一种,包含 API 密钥、模型名称、基础 URL、超时和重试设置;**Operator name**(操作员姓名)字段(位于 Audit 部分),其值将出现在每条审计记录中;主题选择器(IntelliJ Light、Flat Dark、Flat Light、Darcula);**Reset to Defaults** 按钮将所有字段恢复为内置值;**Open folder** 按钮在系统文件管理器中打开包含设置文件的目录
### 构建与运行
GUI 与 CLI 打包在同一个分发包中——一个 `lib/` 目录,两个入口点,没有重复或用于 ANTLR 语法编译器的 JAR 包。
```
# 构建组合分发包(安装到 build/install/methodatlas/)
./gradlew installDist
# 或生成 zip 归档文件
./gradlew distZip
# 运行 GUI 启动脚本(Unix)
build/install/methodatlas/bin/methodatlas-gui
# 运行 GUI 启动脚本(Windows)
build\install\methodatlas\bin\methodatlas-gui.bat
# 在开发过程中直接从 Gradle 运行
./gradlew :methodatlas-gui:run
```
在 Windows 上,设置会持久化保存到 `%APPDATA%\MethodAtlasGUI\settings.json`,
而在 Linux 和 macOS 上,会保存到
`$XDG_CONFIG_HOME/methodatlas-gui/settings.json`(或 `~/.methodatlas-gui/settings.json`)。
## 支持的语言和框架
| 语言 | 插件模块 | 测试框架 | 标签属性 | 显示名称支持 | 需求 |
| --- | --- | --- | --- | --- | --- |
| Java | `methodatlas-discovery-jvm` | JUnit 5, JUnit 4, TestNG(根据导入自动检测) | `@Tag("value")` | `@DisplayName("text")` | — |
| C# (.NET) | `methodatlas-discovery-dotnet` | xUnit, NUnit, MSTest(根据 `using` 指令自动检测) | `[Category]` / `[Trait]` / `[TestCategory]` | 仅限 xUnit 的 `DisplayName=` | — |
| TypeScript / JavaScript | `methodatlas-discovery-typescript` | Jest, Vitest, Mocha(通过函数调用名称识别) | — | — | PATH 中需要 Node.js 18+ |
默认分发包中包含了所有这三个插件。当 PATH 中没有 Node.js 时,TypeScript 插件会优雅地自动禁用。可以通过实现 `TestDiscovery`(位于 `methodatlas-api` 中)、声明唯一的 `pluginId()` 并将 JAR 放置在 classpath 上来添加其他语言——无需更改核心工具。
## MethodAtlas 报告的内容
对于每个被发现的测试方法,MethodAtlas 都会生成一条记录。
**源代码派生字段:**
| 字段 | 出现时机 | 描述 |
| --- | --- | --- |
| `fqcn` | 始终存在 | 完全限定类名(Java/C#);不带扩展名的以点分隔的相对文件路径 |
| `method` | 始终存在 | 测试方法名称;对于 TypeScript,包含 describe 块层次结构(例如 `AuthService > should authenticate`) |
| `loc` | 始终存在 | 方法声明包含的行数 |
| `tags` | 始终存在 | 现有的标签注解值(Java 为 `@Tag`;C# 为 `[Category]`/`[Trait]`/`[TestCategory]`) |
| `source_root` | `-emit-source-root` | 生成该记录的扫描根目录相对于 CWD 的路径;消除多根目录或 monpo 项目中的记录歧义 |
| `content_hash` | `-content-hash` | 封闭类的 SHA-256 指纹 |
**AI 富化字段**(在启用 `-ai` 时出现):
| 字段 | 出现时机 | 描述 |
| --- | --- | --- |
| `ai_security_relevant` | `-ai` | 模型是否将该测试分类为与安全相关 |
| `ai_display_name` | `-ai` | 建议的面向安全的 `@DisplayName` 值 |
| `ai_tags` | `-ai` | 建议的安全分类法标签(例如 `security;auth`、`security;crypto`) |
| `ai_reason` | `-ai` | 分类的简短理由 |
| `ai_interaction_score` | `-ai` | 仅验证方法调用而非结果的断言所占的比例(`0.0` = 全部为结果检查,`1.0` = 全部为交互检查) |
| `ai_confidence` | `-ai` + `-ai-confidence` | 模型置信度分数 `0.0–1.0` |
| `tag_ai_drift` | `-ai` + `-drift-detect` | 源文件中 `@Tag("security")` 与 AI 分类之间的不一致 |
## 输出模式
### CSV(默认)
```
fqcn,method,loc,tags,display_name,ai_security_relevant,ai_display_name,ai_tags,ai_reason,ai_interaction_score
com.acme.auth.LoginTest,testLoginWithValidCredentials,12,,,true,SECURITY: auth - validates session token,security;auth,Verifies session token is issued on successful login.,0.0
com.acme.util.DateTest,format_returnsIso8601,5,,,false,,,,0.1
```
### SARIF 2.1.0
```
./methodatlas -ai -sarif /path/to/tests > results.sarif
```
生成一个单一有效的 [SARIF 2.1.0](https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html) JSON 文档。与安全相关的方法将获得 SARIF 级别 `note`;所有其他测试方法获得级别 `none`。规则 ID 派生自 AI 分类法标签(`security/auth`、`security/crypto` 等)。
以下平台原生支持使用 SARIF:
- **GitHub Advanced Security** — 通过 `upload-sarif` action 上传,以在 Security 标签页中显示结果
- **VS Code** — [SARIF Viewer 扩展](https://marketplace.visualstudio.com/items?itemName=MS-SarifVSCode.sarif-viewer) 内联渲染结果
- **Azure DevOps** — SARIF 查看器流水线扩展
- **SonarQube** — 转换后通过通用问题导入格式进行导入
### 纯文本
```
./methodatlas -plain /path/to/project
```
面向行的、人类可读的输出,适用于终端检查和 shell 脚本编程。
### GitHub Actions 注解
```
./methodatlas -ai -github-annotations /path/to/tests
```
输出 `::notice` / `::warning` 工作流命令,GitHub Actions 会将其渲染为 PR diff 上的内联注解。不需要 GitHub Advanced Security 许可证。
完整的格式描述和示例请参阅 [docs/output-formats.md](docs/output-formats.md)。
## 审计追踪(GUI)
桌面 GUI 中的每次 **Save All Changes** 操作都会在扫描项目根目录下的隐藏 `.methodatlas/` 目录中写入两个产物。
### 证据 CSV
每次保存时都会创建一个带有时间戳的不可变文件,命名为 `methodatlas-YYYYMMDD-HHmmss.csv`。每一行记录一个被修补的方法,并使用与 CLI `DeltaReport` CSV 相同的列模式:
| 列 | 描述 |
| --- | --- |
| `fqcn` | 完全限定类名 |
| `method` | 简单方法名 |
| `loc` | 代码行数 |
| `tags` | 写入源文件的以分号分隔的标签 |
| `display_name` | 写入源文件的 `@DisplayName` 文本(空 = 未更改) |
| `ai_security_relevant` | AI 分类(`true`/`false`) |
| `ai_display_name` | AI 建议的显示名称 |
| `ai_tags` | 以分号分隔的 AI 建议标签 |
| `ai_reason` | AI 理由 |
| `ai_confidence` | AI 置信度分数(0.0–1.0) |
| `ai_interaction_score` | AI 交互分数 |
| `tag_ai_drift` | `none` / `tag-only` / `ai-only` — 已应用标签与 AI 标签之间的差异 |
该文件永远不会被覆盖。文件会随着时间推移不断累积,提供每次审查会话的有序历史记录。
### 覆盖 YAML
每次保存时都会更新(或创建)`overrides.yaml`。它采用 CLI `--override` 标志接受的 `ClassificationOverride` 格式:
```
overrides:
- fqcn: com.acme.crypto.AesGcmTest
method: roundTrip_encryptDecrypt
securityRelevant: true
tags: [security, crypto]
displayName: "SECURITY: crypto — AES-GCM round-trip"
reason: "Verifies ciphertext integrity under AES-GCM — critical crypto test"
note: "Reviewed 2026-05-01T14:30:00 by Jane Smith"
```
`note` 字段会自动填充 ISO-8601 审查时间戳。如果在“设置 -> Audit”中设置了 **Operator name** 字段,它将作为 `by ` 被追加,为受监管环境提供清晰的审查者身份。现有条目会在原位更新;新条目将被追加。
在后续的 CLI 运行中传入 `--override .methodatlas/overrides.yaml` 即可重现相同的标签决策,无需重新调用 AI,这对于可重现的 CI 流水线和受监管的发布流程至关重要。
## 面向受监管环境的 SARIF
SARIF(OASIS 静态分析结果交换格式)为每个发现结果提供了一个物理位置、一个逻辑位置(完全限定的方法名),以及一个包含所有 AI 富化字段的结构化属性包,并且在使用 `-content-hash` 时,还会提供一个可追溯到确切类版本修订的 SHA-256 指纹。这使得 MethodAtlas 的输出可以在无需自定义工具的情况下进行独立审计。
完整的结果模式、规则 ID 和特定平台的集成说明,请参阅 [docs/output-formats.md](docs/output-formats.md#sarif-mode)。针对受监管环境的部署指南(PCI-DSS、ISO 27001、网闸隔离),请参阅 [docs/deployment/](docs/deployment/index.md)。
## AI 安全分类
当启用 `-ai` 时,MethodAtlas 会将每个解析后的测试类提交给配置的 AI 提供商以进行安全分类。模型接收到的信息包括:
1. **闭合的安全分类法** — 一组受控的标签,用于约束模型可以返回的内容
2. **由解析器发现的确切测试方法列表** — 模型不能捏造或跳过方法
3. **完整源文本** — 作为语义解释的上下文
由于发现过程基于 AST,并且 AI 分类受限于固定的标签集,因此即使语义解释使用了语言模型,结构化清单也是确定性的。
### 支持的提供商
| 提供商值 | AI 产品 / 平台 | 部署方式 | 免费套餐 |
| --- | --- | --- | --- |
| `ollama` | 任何本地安装的模型 | 本地 — 源代码永远不会离开机器 | — |
| `auto` | Ollama → API 密钥回退 | 本地优先,云端回退 | — |
| `openai` | ChatGPT / OpenAI API | 云端 | 否 |
| `anthropic` | Claude / Anthropic API | 云端 | 否 |
| `xai` | Grok / xAI API | 云端 | 有限 |
| `groq` | Groq(快速 LPU 推理) | 云端 | 是 |
| `github_models` | GitHub Models | 云端 | 是(GitHub 账户) |
| `mistral` | Mistral AI | 云端 (欧盟) | 有限 |
| `openrouter` | 通过 OpenRouter 接入的多种模型 | 云端 | 是(免费模型) |
| `azure_openai` | Azure OpenAI Service | 客户的 Azure 租户 | 否 |
每个提供商的设置说明(包括知名的 AI 助手对应哪个提供商值)请参阅 [docs/ai/providers.md](docs/ai/providers.md)。
### 置信度评分
传入 `-ai-confidence` 可以为每个方法添加一个 `0.0–1.0` 的置信度分数。该分数会出现在 `ai_confidence` 列中,当启用 `-content-hash` 或 `-emit-source-root` 等可选列时,其位置会发生偏移。请使用标题行来定位它:
```
./methodatlas -ai -ai-confidence /path/to/tests > scan.csv
# 保留 header + ai_confidence >= 0.7 的 rows
# 从 header 中定位列索引,然后按名称过滤:
python3 -c "
import csv, sys
r = csv.DictReader(open('scan.csv'))
w = csv.DictWriter(sys.stdout, fieldnames=r.fieldnames)
w.writeheader()
for row in r:
if float(row.get('ai_confidence') or 0) >= 0.7:
w.writerow(row)
"
```
| 分数 | 含义 |
| --- | --- |
| `1.0` | 明确且毫无歧义地测试了指定的安全属性 |
| `~0.7` | 明显测试了与安全相邻的问题 |
| `~0.5` | 有可能但存在歧义;人工审查的候选对象 |
| `0.0` | 与安全无关 |
完整的解读指南请参阅 [docs/ai/confidence.md](docs/ai/confidence.md)。
## 内容哈希指纹和增量扫描
传入 `-content-hash` 可将每个类的 SHA-256 指纹追加到每条生成的记录中:
```
./methodatlas -content-hash -sarif /path/to/tests > results.sarif
```
哈希值是根据封闭类的已解析 AST 文本计算的(Java 使用 JavaParser;C# 使用 ANTLR4 解析树;TypeScript 使用源文本)。同一类中的所有方法共享相同的值,并且只有当类体发生更改时哈希值才会改变——不相关文件的修改不会影响它。
实际应用:
- **增量扫描** — 跳过自上次运行以来哈希值未更改的类
- **审计可追溯性** — 将 SARIF 发现结果与生成它的确切类版本修订关联起来
- **CI 变更检测** — 在两个流水线阶段之间检测修改过的测试类,而无需比对源文件
### AI 结果缓存
传入 `-ai-cache ` 可以重用上一次运行的 AI 分类。在为某个类调用 AI 提供商之前,MethodAtlas 会检查该类的内容哈希是否存在于缓存文件中。如果命中,则直接使用存储的结果——不进行 API 调用。只有已更改或新增的类才会产生提供商调用。
```
# 第 1 天 — 完整扫描;将结果保存为 cache
./methodatlas -ai -content-hash src/test/java > scan.csv
# 第 2、3、… 天 — 未更改的 classes 无任何成本
./methodatlas -ai -content-hash -ai-cache scan.csv src/test/java > scan-new.csv
```
在生成 SARIF 输出时,请使用两遍方法:第一遍刷新 CSV 缓存(仅对已更改的类调用 AI),第二遍以零次 AI 调用从缓存生成 SARIF。
```
# Pass 1:刷新 cache(仅对更改的 classes 调用 AI)
./methodatlas -ai -content-hash -ai-cache scan.csv src/test/java > scan-new.csv
# Pass 2:从 cache 生成 SARIF — 零 AI 调用
./methodatlas -ai -content-hash -ai-cache scan-new.csv -sarif src/test/java > results.sarif
```
完整的缓存文档请参阅 [docs/ai/caching.md](docs/ai/caching.md),
实现此模式的完整 GitHub Actions 工作流请参阅 [docs/ci/github-actions.md](docs/ci/github-actions.md)。
## 手动 AI 工作流
对于因公司政策阻止直接访问 AI API 的环境,MethodAtlas 支持两阶段的手动工作流:
```
# 阶段 1 — 将 prompts 写入文件
./methodatlas -manual-prepare ./work ./responses /path/to/tests
# (将每个工作文件的 AI prompt 粘贴到聊天窗口,保存响应)
# 阶段 2 — 使用响应并生成丰富的 CSV(或应用 tags)
./methodatlas -manual-consume ./work ./responses /path/to/tests
./methodatlas -manual-consume ./work ./responses -apply-tags /path/to/tests
```
所有分类法和置信度标志在手动模式下同样适用。消费阶段是增量的——您可以在响应到达时处理类,而无需等待整个批次完成。
完整的工作流请参阅 [docs/usage-modes/manual.md](docs/usage-modes/manual.md)。
## YAML 配置
将共享设置存储在 YAML 文件中,以便 CI 流水线和团队成员使用一致的选项,而无需重复输入标志:
```
outputMode: sarif
contentHash: true
ai:
enabled: true
provider: ollama
model: qwen2.5-coder:7b
confidence: true
taxonomyMode: optimized
```
```
./methodatlas -config ./methodatlas.yaml /path/to/tests
```
命令行标志始终会覆盖 YAML 值。完整的字段参考请参阅 [docs/cli-reference.md](docs/cli-reference.md#-config-file)。
## 分发包布局
```
methodatlas-/
├── bin/
│ ├── methodatlas
│ └── methodatlas.bat
└── lib/
├── methodatlas-.jar
└── *.jar (runtime dependency libraries)
```
`bin/` 中的启动脚本会自动配置 classpath 以包含 `lib/` 中的所有 JAR 包,因此解压后无需手动设置。
## 文档
完整文档可在 [accenture.github.io/MethodAtlas](https://accenture.github.io/MethodAtlas/) 获取。
| 文档 | 内容 |
| --- | --- |
| [docs/cli-reference.md](docs/cli-reference.md) | 完整的选项参考、YAML 模式、退出代码和示例命令 |
| [docs/cli-examples.md](docs/cli-examples.md) | 按用例分组的实用命令行示例 |
| [docs/output-formats.md](docs/output-formats.md) | CSV、纯文本、SARIF 和 GitHub Annotations 格式描述 |
| [docs/migration.md](docs/migration.md) | 重大变更说明及每个主要版本边界的升级步骤 |
| [docs/troubleshooting.md](docs/troubleshooting.md) | 常见问题的诊断和解决方法 |
| [docs/discovery-plugins.md](docs/discovery-plugins.md) | 按语言划分的插件配置:Java、C#、TypeScript/JavaScript |
| [docs/usage-modes/](docs/usage-modes/index.md) | 所有操作模式:静态清单、API AI、手动工作流、apply-tags、apply-tags-from-csv、delta、security-only |
| [docs/ai/providers.md](docs/ai/providers.md) | 各提供商设置:Ollama、OpenAI、Anthropic、Azure OpenAI、Groq、xAI、GitHub Models、Mistral、OpenRouter |
| [docs/ai/overrides.md](docs/ai/overrides.md) | 分类覆盖文件:格式、治理与 CI 集成 |
| [docs/ai/confidence.md](docs/ai/confidence.md) | 置信度评分:解释与阈值指导 |
| [docs/ai/caching.md](docs/ai/caching.md) | AI 结果缓存:跳过未更改的类、两阶段 SARIF 模式、CI 缓存键策略 |
| [docs/ai/drift-detection.md](docs/ai/drift-detection.md) | 标签与 AI 偏移检测:检测过时的 `@Tag("security")` 注解 |
| [docs/ai/interaction-score.md](docs/ai/interaction-score.md) | 安慰剂测试检测:交互分数语义与 CI 阈值 |
| [docs/compliance.md]( ) | 合规性框架映射:OWASP SAMM、NIST SSDF、ISO 27001、DORA;可重现性声明 |
| [docs/deployment/](docs/deployment/index.md) | 受监管环境指南:PCI-DSS、ISO 27001、NIST SSDF、DORA、SOC 2、网闸隔离 |
| [docs/deployment/onboarding.md](docs/deployment/onboarding.md) | 接入棕地代码库:从静态扫描到 CI 门禁的六阶段演进 |
| [docs/concepts/data-governance.md](docs/concepts/data-governance.md) | 向 AI 提交了哪些数据、数据驻留选项、企业机密管理 |
| [docs/concepts/for-security-teams.md](docs/concepts/for-security-teams.md) | 安全团队视角下的 MethodAtlas:证据包、审计追踪 |
| [docs/concepts/asvs-mapping.md](docs/concepts/asvs-mapping.md) | 将 MethodAtlas 分类法标签映射到 OWASP ASVS 要求 |
| [docs/concepts/vs-sast.md](docs/concepts/vs-sast.md) | MethodAtlas 与传统 SAST 工具的区别与互补 |
| [docs/concepts/remediation.md](docs/concepts/remediation.md) | 针对 MethodAtlas 发现结果采取行动的指导:修复安慰剂测试、添加断言 |
| [docs/publication-order.txt](docs/publication-order.txt) | pandoc 发布顺序——按阅读顺序排列的全部 50 份文档;由 `methodatlas-docs:generatePdf` 使用 |
MethodAtlas 是一个 CLI 工具,用于扫描测试源代码树以查找测试方法,并为每个发现的方法生成一条结构化记录——支持可选的 AI 辅助安全分类。该工具开箱即支持 Java (JUnit 5, JUnit 4, TestNG)、C# (.NET — xUnit, NUnit, MSTest) 以及 TypeScript/JavaScript (Jest, Vitest, Mocha);并且可以通过插件添加对其他语言的支持。
它专为需要向审计员、监管机构或安全审查委员会证明安全属性测试覆盖率的团队而构建:它将**确定性的源代码分析**与**可选的 AI 解释**分离开来,从而确保每个结果都是可追溯、可重复且经得起推敲的。
## 为什么选择 MethodAtlas
受监管行业的安全团队需要的不仅仅是一个能通过的测试套件。他们需要以足够详尽的细节来证明*哪些*测试覆盖了*哪些*安全控制,以满足外部审查的要求。
MethodAtlas 通过以极少的设置将现有测试套件转换为结构化清单来解决这一问题。完整列表请参阅[支持的语言和框架](#supported-languages-and-frameworks)。插件架构允许在不修改核心工具的情况下添加更多语言。
| 挑战 | MethodAtlas 提供的解决方案 |
| --- | --- |
| “请向我们展示您的安全测试覆盖率” | 带有每种方法分类理由的 AI 分类清单 |
| “证明测试自上次审计以来未被更改” | 每个类的 SHA-256 内容指纹 (`-content-hash`) |
| “将其集成到我们的 SAST 流水线中” | 原生 **SARIF 2.1.0** 输出,兼容 GitHub Advanced Security、VS Code、Azure DevOps 和 SonarQube |
| “我们不能将源代码发送到外部 AI API” | 通过 **Ollama** 进行本地推理,或针对网闸隔离环境采用两阶段的**手动 AI 工作流** |
| “分类必须一致且可审计” | 闭合的、受版本控制的**安全分类法**,以及与您的控制框架保持一致的可选自定义分类法 |
| “我们需要置信度分数,而不仅仅是是或否” | 每个方法的 AI **置信度分数** (`0.0–1.0`),用于基于阈值的过滤和人工审查队列 |
| “为我们标注这些源文件” | **应用标签模式**将 `@DisplayName` 和 `@Tag` 注解直接写入源文件 |
| “我们的 @Tag 注解看起来过时了” | **标签与 AI 偏移检测**标记源文件注解与 AI 分类之间的不一致 |
## 核心功能
- **确定性测试发现** — 基于 AST 的分析(Java 使用 JavaParser,C# 使用 ANTLR4 语法);不进行推断,不会在方法存在性上出现误报;根据导入/using 指令自动检测框架
- **多语言插件架构** — Java、C# 和 TypeScript/JavaScript 插件以单独的 JAR 形式提供,通过 `ServiceLoader` 加载;新语言无需更改核心工具
- **SARIF 2.1.0 输出** — 与静态分析平台和 IDE 工具链的一流集成
- **AI 安全分类** — 根据闭合的安全分类法对每个测试方法进行分类;支持 Ollama、OpenAI、Anthropic、Azure OpenAI、Groq、xAI、GitHub Models、Mistral 和 OpenRouter
- **置信度评分** — 每个方法的十进制分数 (`-ai-confidence`);可按阈值进行过滤,用于生成审计报告
- **内容哈希指纹** — 类 AST 文本的 SHA-256 值 (`-content-hash`);同一个类中的所有方法共享相同的哈希值;支持增量扫描和变更检测
- **AI 结果缓存** — 按哈希值重用之前的 AI 分类 (`-ai-cache`);未更改的类不消耗 API 调用
- **标签与 AI 偏移检测** — `-drift-detect` 标记源代码中 `@Tag("security")` 与 AI 分类不一致的方法
- **多根目录和单体仓库扫描** — `-emit-source-root` 向 CSV/纯文本输出追加 `source_root` 列,消除不同模块下出现相同 FQCN 时的记录歧义
- **分类覆盖** — `-override-file` 记录人工审查的更正内容;覆盖在重新运行中保持不变,并将置信度设置为 `1.0` 或 `0.0`
- **差异报告** — `-diff` 比较两次 CSV 扫描并生成变更报告:两次运行之间被添加、删除或修改的方法;适用于 CI 回归门禁
- **仅安全过滤器** — `-security-only` 在 CSV/纯文本输出中隐藏非安全方法;在 SARIF 模式下自动应用
- **不一致限制** — `-mismatch-limit` 作为 `-apply-tags-from-csv` 的安全门禁;当 CSV 与当前代码库不匹配时中止操作,不触碰源文件
- **GitHub Actions 注解** — `-github-annotations` 为与安全相关的方法输出行内 PR 注解,无需 GitHub Advanced Security 许可证
- **应用标签** — 将 AI 建议的 `@DisplayName` 和 `@Tag` 注解写回源文件;具有幂等性
- **从 CSV 应用标签** — 将 CSV 中人工审查后的注解决策应用回源文件;将审查步骤与回写步骤分离
- **手动 AI 工作流** — 针对阻止 API 访问的环境的两阶段准备/消费工作流
- **本地推理** — Ollama 支持将源代码完全保留在您的网络内
- **YAML 配置** — 在团队或 CI 流水线之间共享扫描设置,无需重复使用 CLI 标志
- **自定义分类法** — 提供与 ISO 27001、NIST SP 800-53、PCI DSS 或您自己的控制框架相对齐的外部分类法文件
- **扫描来源信息** — `-emit-metadata` 在 CSV 开头预置工具版本和时间戳;可嵌入到证据包中
- **多种输出模式** — CSV(默认)、纯文本、SARIF 和 GitHub Actions 注解
## 快速开始
构建并解压分发包,然后运行:
```
cd methodatlas-标签:AI辅助分类, AI风险缓解, Anchore, Azure DevOps, CMS安全, DevSecOps, GitHub Advanced Security, JavaScript, Jest, JS文件枚举, JUnit, LLM评估, Mocha, MSTest, NUnit, Ollama, Petitpotam, pocsuite3, SARIF输出, SAST管道, SHA-256, SonarQube, TestNG, TypeScript, Vitest, VS Code, xUnit, 上游代理, 代码审查, 代码指纹, 加密哈希, 后台面板检测, 域名枚举, 安全分类法, 安全加固, 安全合规, 安全控制, 安全插件, 安全测试, 开发安全, 开源框架, 持续集成, 插件架构, 攻击性安全, 数据可视化, 本地AI推理, 测试方法发现, 测试覆盖率, 测试资产盘点, 网络代理, 网络管理, 软件测试, 追溯性, 错误基检测, 静态代码分析