关于 Evergreen
Evergreen 检查代码库中的弃用及生命周期结束依赖、运行时和 CI 组件,并标出文件与行号,附上权威依据和迁移指引。它面向开发者和编码 Agent,提供确定性的离线扫描,以及本地命令行、MCP 服务、CI 和 Agent Skill 入口。
主要功能
- 01覆盖多生态的生命周期扫描
- 02精确定位文件与行号
- 03提供权威依据和替代方案
- 04生成迁移背景与步骤
- 05确定性离线扫描
适用场景
- 01在构建失败前发现生命周期风险
- 02添加依赖前检查其状态
- 03通过基线仅追踪新增问题
MCP 相关
Evergreen 提供本地 MCP 服务,供兼容客户端发现并调用生命周期检查能力。MCP 入口沿用项目本地、离线的扫描方式。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
6收录的工具列表 · 更新于 4 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| baseline | string | 否 | 可选的 Evergreen 基线文件路径,相对于代码仓库。已抑制的发现项不会列出;结果的 suppressions 字段会说明抑制数量,以及哪些抑制即将到期或已过期。 |
| repository_path | string | 否 | 代码仓库的本地路径。默认使用服务器工作目录。 |
详细介绍
Evergreen
Evergreen 可在代码库中发现生命周期结束和已弃用的运行时、软件包及 GitHub Actions,指出确切的文件和行,并为每项发现提供权威来源、替代方案和迁移步骤。它可在本机以命令行工具、本地 MCP 服务、GitHub Action(支持用于代码扫描的 SARIF)和 Agent Skill 的形式运行,让开发者和编码 Agent 能在生命周期风险导致构建失败之前发现问题,也能在添加依赖项之前检查其状态。扫描结果确定且无需联网,也不需要账户。
阅读公开文档,运行90 秒演示,或查看验证报告。面向 AI 工具的文档也以 llms.txt 和 llms-full.txt 的形式发布。
覆盖范围
| 生态系统 | Evergreen 读取的内容 | 报告的内容 |
|---|---|---|
| 容器基础映像 (实验性) | Dockerfile、*.Dockerfile、Containerfile、compose.yaml、docker-compose.yml:官方 node、python、postgres、mysql 和 ruby 的基础映像 | 已终止生命周期的映像发布版本系列。变量、latest 和浮动标签会列为未分类,不会猜测。参见容器基础映像 |
| .NET (测试版) | global.json、*.csproj/*.fsproj/*.vbproj、Directory.Build.props、Directory.Packages.props、packages.lock.json:固定的 SDK、目标框架和直接 NuGet 包 | 已结束支持期的 .NET 发布版本系列,以及其发布者已弃用的直接依赖包,并列出使用这些包的 C# 文件。.NET Framework、netstandard、MSBuild 属性、浮动版本和版本范围不作判定。参见.NET |
| Go (实验性) | go.mod 和 go.work:go 和 toolchain 指令,以及直接 require 条目 | 不再接收修复的 Go 发布版本系列,以及具有生命周期规则的直接模块。Evergreen 无法读取的版本会列为未分类。参见Go |
| GitHub Actions | .github/workflows/*.yml:对操作的 uses: 引用,包括通过尾随版本注释或内置发布映射解析的完整 SHA 固定版本 | 使用已停用运行时(例如 Node.js 20)的操作,以及已停用或弃用的主版本,并标明准确行号 |
| C 和 C++ (实验性) | CMakeLists.txt、conanfile.txt、conanfile.py 和 vcpkg.json | CMake 策略兼容性移除项和弃用项,并标明准确声明。其他声明需要有匹配的已审核规则。参见C 和 C++ |
| CI 运行器映像 (实验性) | .gitlab-ci.yml 的 image 和 services、.circleci/config.yml 的 docker.image、machine.image 和 orbs,以及 azure-pipelines.yml 的 pool.vmImage | 已审核规则涵盖的 Azure 托管映像标签,并标明准确行号。GitLab 映像和 CircleCI orbs、变量及浮动别名会列为未分类。不会判定字面量 CircleCI 映像。参见CI 运行器映像 |
| Java 和 Kotlin(JVM) (测试版) | pom.xml、build.gradle、build.gradle.kts、.java-version、.sdkmanrc、.tool-versions:项目固定或指定目标的 JDK,以及直接 Maven 依赖。参见Java 和 Kotlin | 已结束支持期的 JDK 特性版本,以及 POM 声明已迁移的依赖。属性引用和表达式会列为未分类 |
| Kubernetes API (测试版) | *.yaml、*.yml 清单、Helm chart 的 templates/ 和 kustomization.yaml:字面量 apiVersion 和 kind,以及 kustomize 补丁。参见Kubernetes API | Kubernetes 项目声明已不再提供服务的 API 版本。Helm 值、受集群条件限制的模板,以及无法按字面读取的内容会跳过 |
| Node.js | engines.node、volta、.nvmrc、.node-version | 已结束生命周期或支持期的运行时版本 |
| npm | package.json 依赖项、package-lock.json、npm-shrinkwrap.json、yarn.lock、pnpm-lock.yaml,以及使用各个包的导入和调用 | 已弃用或不再维护的包,并列出替代方案和包的使用位置 |
| Python | pyproject.toml、requirements*.txt、.python-version、runtime.txt、.tool-versions、poetry.lock、uv.lock、Pipfile.lock | 已结束生命周期的 Python 版本,以及已弃用或过时的包 |
| Dart 和 Flutter (实验性) | pubspec.yaml、pubspec.lock、.fvmrc、.fvm/fvm_config.json:SDK 约束、直接依赖项、解析后的包和固定的 Flutter 版本 | 固定到确切版本且不再接收安全更新的 Dart SDK 发布版本,以及已停止维护的 pub 包,并列出使用这些包的文件。不会判定 >=3.8.0 <4.0.0 这样的约束范围。参见Dart 和 Flutter |
| 数据库运行时 (实验性) | compose.yaml / docker-compose.yml 映像标签(postgres、mysql、mariadb、redis、mongo),以及 *.tf 中 AWS 托管数据库资源的 engine_version | 已结束生命周期的 PostgreSQL 11–13 和 MySQL 5.7、8.0。浮动标签、变量、模块块以及带有 YAML 别名的 Compose 文件不作判定。参见数据库运行时 |
| Shell 和 PowerShell (实验性) | *.ps1 / *.psm1 中的 #Requires -Version、*.psd1 中的 PowerShellVersion,以及 .github/workflows 中固定的 mcr.microsoft.com/powershell 映像标签 | 已结束支持期的 PowerShell 6.x 和 7.0–7.3。Windows PowerShell 5.1、Shell 名称、Bash 映像、动态值以及带有额外选项的指令不作判定。参见Shell 和 PowerShell |
| Terraform (实验性) | *.tf(required_version、required_providers)、.terraform.lock.hcl、.terraform-version、.tool-versions:版本约束、锁定的提供程序和固定的 Terraform CLI | 固定到确切版本或使用 ~> X.Y.Z 约束,且不再接收支持的 Terraform CLI 发布版本系列。不会判定 >= 1.5 这样的范围。参见Terraform |
| Rust (实验性) | Cargo.toml、Cargo.lock、rust-toolchain(.toml):固定的工具链和直接 crate 依赖项 | 早于最新稳定版的工具链,以及依赖于不再维护的 crate 的直接依赖项,并列出使用这些依赖项的文件。edition、rust-version、stable 以及无法按字面读取的内容不作判定。参见Rust |
| Swift (测试版) | .swift-version、.xcode-version、Package.swift、Package.resolved,以及 project.pbxproj 中应用目标的 IPHONEOS_DEPLOYMENT_TARGET | App Store Connect 不再接受的 Xcode 和 iOS 发布版本、具有生命周期规则的 Swift 工具链版本系列,以及具有规则的包。不判定库和 platforms: 最低版本。参见Swift |
| 无服务器运行时 (测试版) | AWS SAM 和 CloudFormation 模板中的 Runtime、serverless.yml 中的 provider.runtime 和 runtime,以及 Terraform aws_lambda_function、Google Cloud Functions 和 Azure Function Apps 中的 runtime | 供应商列为已结束生命周期的 Lambda 和 Cloud Functions 运行时。参见无服务器运行时 |
| Ruby (实验性) | .ruby-version、.tool-versions、Gemfile、Gemfile.lock | 已结束支持期的 Ruby 发布版本系列和已撤回的 gem,并列出使用这些 gem 的 Ruby 文件。参见兼容性 |
| PHP (实验性) | .php-version、.tool-versions、composer.json、composer.lock | 已结束支持期的 PHP 发布版本系列和已弃用的 Composer 包。参见兼容性 |
| Android (实验性) | build.gradle(.kts)、settings.gradle(.kts)、libs.versions.toml:SDK 级别、Android Gradle Plugin、Kotlin 插件和 Maven 依赖项 | 已审核规则明确列出的声明,例如 Google Play Billing Library 5 到 9 的主版本。参见兼容性 |
括号中的级别表示检测器的成熟度;包含各级别的完整列表见生态系统覆盖矩阵,各检测器的精确率和召回率见准确率仪表板。每条发现都附有相应规则的来源、审核日期和迁移步骤;请参阅生命周期规则。对于其他生态系统,Evergreen 不会猜测:如果某个软件包没有对应规则,Evergreen 会将其报告为 no-data,绝不会判定为安全;新增生态系统时,则从生成的检测器骨架开始。兼容性矩阵列出了受支持的环境和主机。 |
产品原则
- 本地优先:源代码保留在用户的计算机或 CI 运行器上。
- 核心逻辑具备确定性:生成发现结果不需要大模型。
- 有证据支撑:每项弃用声明都链接到权威来源。
- 为 Agent 做好准备:每份人类可读的报告都有对应的机器可读版本。
- 易于扩展:通过检测器新增生态系统,无需重写核心逻辑。
快速入门
要求:Node.js 22 或更高版本。
npx evergreen-deprecation scan .
为 Agent 提供简短答复,而非完整报告:每项发现占一行,包含其 ID、位置、严重程度和替代方案,按严重程度从高到低排列,最多列出 25 项发现(其余项计入总数),且内容少于 8 KiB:
npx evergreen-deprecation scan . --format compact
验证 CLI、本地 MCP 服务、Agent 技能、插件基础组件和 CI 工作区是否已就绪,且不更改配置或上传仓库数据:
npx evergreen-deprecation doctor .
npx evergreen-deprecation doctor . --json
有关受支持、实验性和不受支持的组合,请参阅公开的兼容性矩阵。
以编程方式发现 Evergreen 的版本化功能和入口点:
npx evergreen-deprecation capabilities --json
自动发现约定定义了 CLI、MCP 服务、Agent 技能、插件和 CI 集成使用的共享标识符。
为现有且已接受的发现创建基线,然后仅报告新的生命周期回归:
npx evergreen-deprecation baseline .
npx evergreen-deprecation scan . --baseline .evergreen-baseline.json
在添加单个依赖项之前检查它,无需扫描仓库:
npx evergreen-deprecation check pkg:npm/[email protected]
npx evergreen-deprecation check pkg:github/actions/checkout@v4 --json
该命令会打印生命周期问题、替代方案和证据;当适用的规则达到或高于 --fail-on(默认为 high)时,退出码为 1;否则为 0;命令行错误时为 2;无法解析 Package URL 时为 4(参见退出码)。如果 Evergreen 没有该软件包的规则,则会报告 no-data,这并不表示该软件包是安全的。如果某个软件包的规则仅涵盖部分版本,但未提供版本,则会报告 version-dependent;添加版本即可获得明确结论。
生命周期规则可以在版本发布之间通过签名包刷新;除非你主动请求,否则扫描始终离线进行:
npx evergreen-deprecation data status
npx evergreen-deprecation data update
有关签名和信任模型、固定版本,以及下载无法验证时的处理方式,请参阅生命周期数据。
查看单项结果的证据和迁移方向:
npx evergreen-deprecation explain '<finding-id>' .
为人类或编码 Agent 生成可移植的迁移上下文:
npx evergreen-deprecation context '<finding-id>' . --json
迁移包包含特定规则的约束和步骤、确切的受影响文件和用法、权威来源以及建议的验证命令。Evergreen 不会自动执行这些命令。请参阅迁移包指南。
告知在仓库中工作的编码 Agent,在添加依赖项之前先进行检查。此操作会在 AGENTS.md 中添加(或刷新)一个带有明确标记的部分;如果你使用的是 CLAUDE.md,则会修改该文件。再次运行不会造成任何更改,标记范围之外的内容也不会被触及:
npx evergreen-deprecation init --agents --dry-run # show the change
npx evergreen-deprecation init --agents
若要为仓库已配置的每个编码 Agent 执行此操作,请运行 setup。它会检测 Claude Code、Codex、Cursor、Gemini CLI、GitHub Copilot 和 Kilo Code 的配置,显示对各宿主指令文件的更改,并且仅在你确认后(或传入 --yes)才写入。它使用与 init --agents 相同的带标记部分,因此绝不会覆盖现有规则:
npx evergreen-deprecation setup --dry-run # print the plan
npx evergreen-deprecation setup # ask, then write
npx evergreen-deprecation setup --yes # no prompt (CI, scripts)
通过本地 MCP 服务连接编码 Agent:
npx --yes --package evergreen-deprecation evergreen-mcp
stdio 服务端提供 scan_repository、list_deprecations、explain_deprecation、create_migration_context、verify_migration 和 check_dependency(在添加前检查单个软件包)。有关宿主配置、建议工作流和隐私保障,请参阅本地 MCP 指南。
Agent Skill
从 monorepo 安装与供应商无关的 Agent Skill:
npx skills add arminazimi/evergreen
使用以下命令拉取未来的修订版本:
npx skills update evergreen-deprecation
evergreen-deprecation Skill 可指导你发现、解释、迁移和验证,同时将检测与迁移逻辑保留在 Evergreen 中。它可在 skills.sh 上发现,并已通过 Codex、Claude Code、Cursor、GitHub Copilot 和 Gemini CLI 的安装验证。有关评估、兼容性、限制和安全假设,请参阅 Agent Skill 指南。
Codex 和 Claude 插件包由同一 Skill 和 MCP 工作流生成。它们的打包架构使宿主清单保持精简,并在任一软件包偏离规范源时令 CI 失败。
跨宿主评估公布共享语料库结果、上下文预算、权限行为和安全限制;同样的检查也会通过 npm run check 阻止发布回归。
Evergreen 在本地运行,不会上传仓库内容。
开发
npm install
npm run check
初始检测器会报告五个一方 Action 的不受支持主版本,并提供确切的文件和行位置:
actions/checkoutactions/setup-nodeactions/cacheactions/upload-artifactactions/download-artifact
在 Evergreen 无需猜测即可解析之前,固定的提交 SHA 和动态表达式会被有意标记为未分类。
npm 检测器还会读取 package.json、npm/pnpm/Yarn 锁文件、Node.js 运行时声明,以及一个有少量证据支持的废弃直接依赖注册表。使用 evergreen explain <finding-id> 检查发现项及其来源。如果发现项有误,evergreen report-issue <finding-id> 会打印一份 Markdown 报告,其中包含规则、相关证据以及声明该依赖的文件中几行经过脱敏的内容;它不会创建议题,也不会使用网络。
Python 检测器会读取 pyproject.toml 中的 PEP 621 和 Poetry 元数据、requirements*.txt、常见的运行时版本文件,以及 uv/Poetry/PDM/Pipenv 锁文件。它会报告不受支持的 Python 声明和直接依赖的生命周期风险,同时忽略锁文件中仅作为传递依赖的条目。
源代码用法分析
现在,软件包生命周期发现项会包含导致迁移成为必要的具体导入、调用和配置键。匹配功能支持 JavaScript、TypeScript 和 Python,并能识别语言特性和别名;配置键匹配则支持 JSON、YAML、TOML、INI 和 Python 设置。每个匹配项都包含确切的文件、行、列和源代码摘录,以及根据受影响的用法和文件估算的迁移影响。
分析器会针对一批检测器契约扫描一次仓库,并忽略生成目录、依赖目录、构建目录和环境目录。使用以下命令运行可重复的准确性和扫描耗时基准测试:
npm run benchmark:usage
有关语料库和结果解读,请参阅基准测试说明。
GitHub Action
Evergreen 可以为拉取请求添加注释,使用基线抑制已接受的发现项,按指定严重级别使检查失败,并上传完整的 JSON 报告:
permissions:
contents: read
steps:
- uses: actions/checkout@v7
- uses: arminazimi/[email protected]
with:
baseline: .evergreen-baseline.json
fail-on-severity: high
如果你的威胁模型要求第三方 Action 引用不可变,请固定完整的提交 SHA,而不要使用版本标签。有关设置、输入、权限、制品和隐私边界,请参阅 GitHub Action 指南。
检测器 SDK
外部检测器可以使用 evergreen-deprecation/sdk 导出的版本化接口。扫描引擎可以组合兼容的检测器,而无需导入任何内置实现。
初始产品形态
CLI 就是产品。检测器可扩展 CLI,GitHub Actions 可将其自动化,本地 MCP 服务则将其提供给 Agent 使用。托管后端有意不纳入路线图;生命周期数据改为通过经过签名、可离线验证的数据通道更新。
社区
有关 Evergreen 的问题、想法以及你用它构建的内容,都可以发布到 GitHub Discussions:使用 Q&A 提问,使用 Ideas 提出建议,使用 Show and tell 分享成果。漏洞、生命周期规则请求和生态系统请求请通过 issues 提交。
许可证与品牌
Evergreen 源代码根据 Apache License 2.0 授权。
Evergreen 名称、徽标以及 brand/ 中的文件均为专有品牌资产,
并受单独的品牌资产条款约束。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。