rad1092/gh-dependency-risk
GitHub: rad1092/gh-dependency-risk
一个轻量的 GitHub CLI 扩展,按需对 Pull Request 中的依赖变更进行风险评分和审查,支持多生态系统并在 API 不可用时回退到本地静态分析。
Stars: 0 | Forks: 0
# gh-dep-risk
[](https://github.com/rad1092/gh-dependency-risk/actions/workflows/test.yml)
[](https://github.com/rad1092/gh-dependency-risk/actions/workflows/install-smoke.yml)
`gh-dep-risk` 是一个预编译的 GitHub CLI 扩展,供审查人员按需运行,以总结 Pull Request 中的依赖风险。
它被设计为扩展而非服务器,这样可以复用 `gh` 的身份验证,保留在审查人员的机器或一次性工作流运行中,并避免任何 webhook、队列、数据库或仪表盘基础设施。

上面的终端动画捕获是一个使用 Yarn 本地回退的 E2E PR 实战演示。同时也提供了一个兼容 asciinema 的录制文件在 [docs/assets/demo.cast](docs/assets/demo.cast);签入到 [`docs/examples`](docs/examples) 下的示例是由渲染器支持的精确输出结果。
## 范围
- 当 GitHub 为 PR 提供依赖项审查数据时,通过 GitHub Dependency Review API 进行按需的 Pull Request 依赖项审查
- 仅当 Dependency Review 不可用时(例如 `403` 或 `404`),对这些静态文件目标进行本地回退:
- npm:`package.json`、`package-lock.json`
- pnpm:`package.json`、`pnpm-lock.yaml`
- pnpm 工作区发现:`pnpm-workspace.yaml`
- yarn:`package.json`、经典或现代 `yarn.lock`;Yarn Berry / 现代 Yarn 回退仅限直接依赖,不解析 `.pnp.cjs` 或重建 PnP 图
- Bun:`package.json` 直接依赖与匹配的文本 `bun.lock` 条目;不支持 `bun.lockb`,没有解析器或完整的图重建
- Python:`requirements.txt`、PEP 621 `pyproject.toml` 和 Poetry `pyproject.toml` 的直接依赖声明;Poetry 可使用 `poetry.lock`,PEP 621 可使用 `uv.lock` 来丰富直接已解析的版本和源元数据,但没有解析器或完整的传递性分析
- Go modules:`go.mod` 的 `require` 和 `replace` 变更,`go.sum` 的校验和变更仅作为证据处理;没有解析器、完整的模块图或 `go list` / `go mod` 执行
- 单个 Go 二进制文件
- 优先使用 Dependency Review API,仅当 Dependency Review 不可用时才进行本地回退
- 没有服务器、webhook 接收器、GitHub App、数据库、队列、仪表盘,或超出此版本中狭窄的 JavaScript、Python 和 Go 模块静态文件回退范围的广泛本地回退
当 GitHub 提供 Dependency Review API 生态系统数据时,在此版本中展示的功能与本地回退支持是分开的:
- Cargo
- Composer
- Go modules
- Maven
- npm
- pip
- pnpm
- Poetry
- RubyGems
- Swift Package Manager
- Yarn
## 安装
### 首先进行身份验证
```
gh auth login
```
`go-gh` 也支持:
- `GH_TOKEN`
- `GITHUB_TOKEN`
- `GH_REPO`
- `GH_HOST`
`GH_REPO=OWNER/REPO` 在 git 检出之外很有用。`GH_HOST` 在 GitHub Enterprise 环境下很有用。
### 从 GitHub 安装
```
gh extension install rad1092/gh-dep-risk
```
之后使用以下命令升级:
```
gh extension upgrade dep-risk
```
### 从此仓库在本地安装
Linux 或 macOS:
```
go build -o gh-dep-risk .
gh extension install .
```
Windows PowerShell:
```
go build -o gh-dep-risk.exe .
gh extension install .
```
此仓库不会自动安装自身。首先在仓库根目录构建二进制文件,然后手动运行 `gh extension install .`。
安装后的命令仍为 `gh dep-risk`。
仓库本身也需要 `gh-` 前缀,因为 GitHub CLI 扩展安装要求远程扩展仓库以 `gh-` 开头。
公共仓库的别名是 `rad1092/gh-dependency-risk` 以提高可读性,但稳定的安装路径有意保持为 `rad1092/gh-dep-risk`,以便 GitHub CLI 将命令注册为 `gh dep-risk`。直接安装可读性别名会注册更长的命令名 `gh dependency-risk`。
检出目录名仍必须以 `gh-` 开头才能进行本地扩展安装,因此在克隆进行扩展测试时,请使用诸如 `gh-dep-risk` 的本地文件夹。
## 命令
```
gh dep-risk pr 123
gh dep-risk pr https://github.com/OWNER/REPO/pull/123
gh dep-risk pr --format json
gh dep-risk pr 123 --list-targets
gh dep-risk pr 123 --path apps/web
gh dep-risk pr 123 --path package.json --comment
gh dep-risk pr --comment=false
gh dep-risk pr --bundle-dir ./dep-risk-bundle
gh dep-risk pr --comment
gh dep-risk pr --fail-level high
gh dep-risk version
gh dep-risk version --json
```
针对自有的固定仓库的典型只读实时检查:
```
gh dep-risk pr 3 --repo rad1092/gh-dep-risk-smoke-matrix --lang en --format json --no-registry
gh dep-risk pr 1 --repo rad1092/gh-dep-risk-smoke-matrix --lang en --format json --no-registry
gh dep-risk pr 2 --repo rad1092/gh-dep-risk-smoke-matrix --lang en --format json --no-registry
```
矩阵仓库目前涵盖了只读的 npm、pnpm 工作区和 Yarn Classic 分析。更广泛的本地回退覆盖范围记录在 [docs/smoke-test.md](docs/smoke-test.md) 中,并由仓库测试支持,除非那里列出了自有的实时固定 PR。
评论冒烟测试被有意分开,因为它会写入一条 PR 时间线评论:
```
gh dep-risk pr 1 --repo rad1092/gh-dep-risk-smoke-comments --lang en --comment --no-registry
```
评论仓库可能包含每个经过身份验证的身份(例如本地的 `rad1092` 和来自 Actions 的 `github-actions[bot]`)的一个标记评论。
命令形式:
- `gh dep-risk pr [|]`
- `gh dep-risk version`
如果省略 PR 参数,`gh dep-risk pr` 将解析当前分支的 PR。
## 标志
### `gh dep-risk pr`
- `--repo owner/repo`
- `--format human|json|markdown`
- `--lang ko|en`
- `--comment`
- `--fail-level low|medium|high|critical|none`
- `--no-registry`
- `--bundle-dir `
- `--path ` 可重复
- `--list-targets`
### `gh dep-risk version`
- `--json`
## 配置文件
`gh dep-risk pr` 还会从当前工作目录读取名为 `.gh-dep-risk.yml` 的仓库本地配置文件(如果存在)。
支持的键:
- `lang: ko|en`
- `fail_level: none|low|medium|high|critical`
- `comment: true|false`
- `path: apps/web` 或 `path: [apps/web, package.json]`
- `no_registry: true|false`
示例:
```
lang: en
fail_level: high
comment: true
path:
- apps/web
- package.json
no_registry: false
```
优先级规则:
- CLI 标志覆盖配置值
- 配置值覆盖内置默认值
- 显式的 CLI `--path` 替换配置的 `path`
- 显式的布尔 CLI 覆盖(例如 `--comment=false` 和 `--no-registry=false`)会覆盖配置值 `true`
未知的配置键将被拒绝,并显示包含配置文件路径的明确错误。缺少的配置文件将被忽略。
## 外观展示
这些示例被签入在 [docs/examples](docs/examples) 下,并源自确定性的固定数据、渲染器测试和由固定数据支持的应用程序测试。
### 人类可读输出
```
Repository: owner/repo
PR: #123 Update dependencies
Score: 48 (high)
Blast radius: medium
Dependency review available: false
Why risky: left-pad crosses a major version boundary and declares an install script.
```
### Markdown 评论
```
## gh-dep-risk
- Repository: `owner/repo`
- PR: [#123](https://github.com/owner/repo/pull/123) Update dependencies
- Score: `48` (`high`)
- Why risky: left-pad crosses a major version boundary and declares an install script.
```
### JSON 输出
```
{
"repo": "owner/repo",
"score": 48,
"level": "high",
"blast_radius": "medium",
"dependency_review_available": false
}
```
## 输出格式
- `human`:简洁的面向审查者的摘要
- `json`:稳定的机器可读模式,包含仓库、PR 元数据、评分、级别、影响范围、依赖项审查可用性、摘要要点、建议操作、备注、详细更改以及 `targets` 数组
- `markdown`:即用型评论输出,始终以 `` 开头
英语是默认语言。使用 `--lang ko` 切换为韩语。
`--bundle-dir` 将写入:
- `dep-risk-human.txt`
- `dep-risk.json`
- `dep-risk.md`
- `metadata.json`
当分析多个目标时,打包文件还将包括:
- `targets//dep-risk.json`
- `targets//dep-risk.md`
## 评分模型
评分模型保持启发式、确定性,并且是可审计的。
- 每个依赖项变更都由具有固定权重的命名风险驱动因素进行评分
- 整体 PR 评分是最高单次变更分数,加上针对其他风险变更的封顶小奖励
- 这使得主要驱动因素保持可解释性,同时仍然反映多目标或多变更的 PR,而不会使评分变成不透明的总和
## Dependency Review 与回退矩阵
在可用时,Dependency Review API 数据始终优先。仅当 Dependency Review API 对 PR 不可用时,才使用本地回退。
| 生态系统 / 管理器 | 有 GitHub Dependency Review 时 | 无 GitHub Dependency Review 时 |
| --- | --- | --- |
| npm | 在可用时使用 Dependency Review 数据。 | 本地回退分析 `package.json` 和 `package-lock.json`。 |
| pnpm | 在可用时使用 Dependency Review 数据。 | 本地回退分析 `package.json`、`pnpm-lock.yaml` 和 `pnpm-workspace.yaml` 发现。 |
| Yarn Classic | 在可用时使用 Dependency Review 数据。 | 本地回退分析 `package.json` 和经典 `yarn.lock`。 |
| Yarn Berry / 现代 Yarn | 在可用时使用 Dependency Review 数据。 | 本地回退将直接 `package.json` 声明与匹配的现代 `yarn.lock` 条目进行比较。`.yarnrc.yml` 仅用于检测/nodeLinker 注释;没有 `.pnp.cjs`、缓存存档检查、Yarn 命令执行、注册表查找或完整的 PnP 图重建。 |
| Bun | 在可用时使用 Dependency Review 数据。 | 本地回退将直接 `package.json` 声明与匹配的文本 `bun.lock` 条目进行比较。不支持 `bun.lockb`;没有 Bun/npm/node 执行、注册表查找或完整的依赖图重建。 |
| Python `requirements.txt` / PEP 621 `pyproject.toml` + 可选 `uv.lock` / Poetry `pyproject.toml` + 可选 `poetry.lock` | 在可用时使用 Dependency Review 数据。 | 本地回退比较直接依赖声明,并可以使用 `uv.lock` 或 `poetry.lock` 来丰富匹配的直接已解析版本和源元数据。没有解析器、广泛的 lockfile 支持或完整的传递性分析。 |
| Go modules | 在可用时使用 Dependency Review 数据。 | 本地回退分析静态的 `go.mod` `require`/`replace` 变更。`go.sum` 仅作为校验和证据;没有解析器、完整的模块图、`go list` 或 `go mod` 执行。 |
| Cargo, Composer, Maven, RubyGems, SwiftPM | 当 GitHub 提供数据时,可能会展示 Dependency Review 数据。 | 此版本中没有本地回退。 |
## 行为
`gh dep-risk pr` 从 `GH_REPO` 或当前 git 远程解析仓库,获取 PR 元数据,并在可用时优先使用 GitHub dependency-review 数据。仓库树发现仍用于本地回退、`--list-targets` 和路径验证。
支持的目标形式:
- 针对 Cargo、Composer、Go modules、Maven、npm、pip、pnpm、Poetry、RubyGems、SwiftPM 和 Yarn 的 dependency-review 目标
- 带有 `package.json` 和 `package-lock.json` 的 npm 根项目
- 带有共享根 `package-lock.json` 的 npm 工作区
- 带有 `package.json` 和 `pnpm-lock.yaml` 的 pnpm 根项目
- 带有 `pnpm-workspace.yaml` 和共享根 `pnpm-lock.yaml` 的 pnpm 工作区
- 带有 `package.json` 和经典或现代 `yarn.lock` 的 Yarn 根项目
- 从 `package.json` 工作区和共享根 `yarn.lock` 发现的 Yarn 工作区
- 带有 `package.json` 和文本 `bun.lock` 的 Bun 根项目
- 从 `package.json` 工作区和共享根文本 `bun.lock` 发现的 Bun 工作区
- 带有自己的 `package.json` 以及 `package-lock.json`、`pnpm-lock.yaml`、`yarn.lock` 或 `bun.lock` 之一的嵌套独立子项目
- Python `requirements.txt` 直接依赖声明
- PEP 621 `pyproject.toml` 中来自 `[project].dependencies` 和 `[project.optional-dependencies]` 的直接依赖,带有可选的 `uv.lock` 直接已解析版本和源丰富
- Poetry `pyproject.toml` 中来自 `[tool.poetry.dependencies]`、`[tool.poetry.dev-dependencies]` 和 `[tool.poetry.group..dependencies]` 的直接依赖,带有可选的 `poetry.lock` 直接已解析版本丰富
- Go modules 的 `go.mod` `require` 和 `replace` 变更,仅带有可选的同级 `go.sum` 校验和证据说明
### 混合生态系统和 JS 工作区
默认行为:
- 如果一个受支持的目标发生更改,`gh-dep-risk` 将分析该目标
- 如果多个受支持的目标发生更改,`gh-dep-risk` 将分析所有目标,并发出一个汇总结果以及每个目标的详细信息
- 如果没有受支持的目标发生,命令将以退出代码 `2` 退出
有用的示例:
```
gh dep-risk pr 123 --list-targets
gh dep-risk pr 123 --path apps/web
gh dep-risk pr 123 --path package.json --comment
gh dep-risk pr 123 --bundle-dir ./out
```
注意:
- `--path` 接受精确的清单路径或所属目录(当该目录恰好映射到一个检测到的目标时),并且可以重复使用
- `--list-targets` 打印可读的目标列表,验证任何 `--path` 过滤器,并在不运行 PR 文件分析或依赖项审查的情况下退出
- npm 工作区复用共享的根 `package-lock.json`
- pnpm 工作区复用共享的根 `pnpm-lock.yaml`,并使用 `pnpm-workspace.yaml` 包 glob 进行发现
- Yarn Berry / 现代 Yarn 本地回退是静态的且仅限直接依赖:它读取 `package.json`、匹配的现代 `yarn.lock` 条目以及可选的 `.yarnrc.yml` `nodeLinker` 设置,而不运行 `yarn`、`npm` 或 `node`
- 如果存在多个同名 Yarn Berry lockfile 条目,但没有针对直接依赖的精确描述符/范围匹配,本地回退将不会猜测已解析的版本,而是记录一个不受支持的条目说明
- Yarn Berry / 现代 Yarn 本地回退忽略仅传递性的 lockfile 更新、仅校验和的更新、`.pnp.cjs`、PnP 加载器文件、缓存存档、插件、约束和完整的 PnP 图重建
- Yarn Berry 协议(例如 `workspace:`、`portal:`、`link:`、`file:`、`patch:`、git 和 HTTP(S) 源)在与更改的直接依赖关联时,将作为保守的说明/源验证信号显示
- Bun 本地回退是静态的且仅限直接依赖:它读取 `package.json` 和匹配的文本 `bun.lock` 条目,而不运行 `bun`、`npm` 或 `node`
- Bun 的 `bun.lockb` 二进制 lockfile 在此阶段不被解析,并且仅包含 `bun.lockb` 的更改仍不受支持/没有有意义的依赖项更改
- Bun 仅传递性和仅校验和的 lockfile 更新不会创建依赖项更改报告条目
- Bun 的 `workspace:`、`file:`、`link:`、git、GitHub 和 HTTP(S) 源仅在绑定到已更改的直接依赖时,才作为保守的源验证说明/操作显示
- 由 GitHub contents API 提供但没有内联内容的大型 lockfile,仍将通过相应的 blob 对象获取,而不是提前失败
- 如果仅 lockfile 的工作区更改无法精确映射,报告将指出该归因是近似的,而不是失败
- 如果同一个目标目录同时存在 `package-lock.json` 和 `pnpm-lock.yaml`,`gh-dep-risk` 将仅在 PR 中恰好只有一个 lockfile 发生明确更改时自动选择其中一个;否则它将返回一个歧义错误并提示您缩小目标范围或删除未使用的 lockfile
- 如果 dependency review 不可用,并且所选目标属于此版本中不支持本地回退的生态系统,则该命令将返回一个明确的可操作错误,而不是假装对其进行分析
- Python 本地回退是面向声明的:不支持的需求包含项、约束、可编辑安装、不受支持的 Poetry 依赖项形状以及 Poetry 直接子集之外的依赖项组在此阶段不被解析
- `uv.lock` 支持仅限于使用匹配的直接已解析版本和识别的源元数据来丰富 PEP 621 直接依赖;注册表、虚拟和工作区源不会创建非注册表源说明
- 独立的可编辑 `uv.lock` 源不受支持;`editable=true` 仅作为 `path` 或 `directory` 源修饰符被接受
- 未知的 `uv.lock` 源形式将被报告为不受支持的依赖条目,而不是被猜测
- `poetry.lock` 支持仅限于使用已解析的版本和源元数据来丰富直接的 Poetry 依赖项;它不会重建完整的传递依赖图
- 如果直接 PEP 621 依赖声明未更改,但匹配的 `uv.lock` 已解析版本或源发生更改,本地回退将报告该直接依赖已更新
- 没有匹配的 `pyproject.toml` 直接依赖声明的 `uv.lock` 包更改将被视为仅传递性,并且不会创建报告更改
- 如果直接的 Poetry 依赖声明未更改,但匹配的 `poetry.lock` 已解析版本发生更改,本地回退将报告该直接依赖已更新
- 没有匹配的 `pyproject.toml` 直接依赖声明的 `poetry.lock` 包更改将被视为仅传递性,并且不会创建报告更改
- Go modules 本地回退是静态的:它从仓库中读取 `go.mod` 和可选的同级 `go.sum` 内容,并且从不运行 `go list`、`go mod`、`go env` 或网络模块元数据查找
- Go modules 本地回退报告 `go.mod` 的 `require` 添加、删除、更新、直接与 `// indirect` 需求,以及 `replace` 的添加、删除或更改;本地 `replace` 目标将作为非注册表源验证说明/操作显示
- 特定于版本的仅替换条目可能会使用包含旧版本的稳定显示身份,例如 `example.com/lib@v1.0.0`,因为现有的 JSON 模式没有单独的替换身份字段,而且模式更改超出了范围
- Go modules 本地回退可能会注明伪版本、`go` 指令更改、`toolchain` 指令更改和 `go.sum` 校验和证据更改,但仅当目标也具有有意义的 `require` 或 `replace` 结果时才进行
- `go.sum` 不被视为 lockfile 或依赖树,因此仅包含 `go.sum` 校验和的更改不会创建依赖项更改报告条目
- 目前超出范围的内容:Python 解析器行为、PyPI/npm/模块注册表元数据查找、`bun.lockb`、`bunfig.toml`、Bun 解析器/工作区图语义、`package.json5`、`package.yaml`、pnpm 目录、pnpm 分支 lockfile、广泛的非 JS 解析器样式回退、Go 模块图重建、完整的 Yarn Plug'n'Play 图解析、`.pnp.cjs` 解析、Yarn 插件/约束解释、SARIF 输出、许可风险和 OSV/Socket 集成
如果 dependency review 返回 `403` 或 `404`,`gh-dep-risk` 将回退到支持的本地回退分析,并明确报告 `dependency_review_available=false`。注册表发布年龄查找是尽最大努力进行的,并会通过 `--no-registry` 跳过,但当 GitHub 已经提供 API 发布年龄信号时,这些信号仍然可用。
如果没有受支持的有意义的依赖项更改,命令将以退出代码 `2` 退出。
### 评论更新插入规则
`--comment` 使用 PR 时间线评论,而不是审查评论。
标记评论是:
```
```
行为:
- 恰好维护一个由经过身份验证的用户拥有的标记评论
- 如果存在多个自己的标记评论,则更新最新的,并删除较旧的重复评论
- 绝不会编辑或删除其他作者的标记评论
- 如果其他作者已经有标记评论,`gh-dep-risk` 将在标准错误上发出警告,并且仅管理当前用户自己的评论
## 版本元数据
`gh dep-risk version` 打印人类可读的构建元数据。发布质量的构建会注入:
- `version`
- `commit`
- `date`
示例:
```
gh dep-risk version
gh dep-risk version --json
```
使用 `go build` 的本地构建仍可使用安全默认值。发布质量的二进制文件应使用 ldflags 或提供的 `Makefile`,以便 version 命令不会仅报告 `dev`。
## 退出代码
- `0` 成功
- `1` 常规错误
- `2` 未找到支持的依赖项更改
- `3` 最终分数达到或超过 `--fail-level`
- `4` 需要身份验证或权限不足
## 本地开发
运行测试:
```
go test ./...
```
使用本地默认值构建:
```
go build -o gh-dep-risk .
./gh-dep-risk version
```
使用显式元数据构建:
```
go build -ldflags "-s -w -X gh-dep-risk/cmd.version=dev-local -X gh-dep-risk/cmd.commit=$(git rev-parse --short HEAD) -X gh-dep-risk/cmd.date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" -o gh-dep-risk .
```
或使用 `Makefile`:
```
make test
make build VERSION=dev-local
```
Windows PowerShell:
```
$date = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
$commit = git rev-parse --short HEAD
go build -ldflags "-s -w -X gh-dep-risk/cmd.version=dev-local -X gh-dep-risk/cmd.commit=$commit -X gh-dep-risk/cmd.date=$date" -o gh-dep-risk.exe .
.\gh-dep-risk.exe version --json
```
本地扩展安装仍需手动执行:
```
gh extension install .
```
## 无需本地安装运行
您可以从 GitHub Actions 运行现有的 CLI 引擎,而无需在本地安装扩展。
### 从 Actions 选项卡
使用 `dep-risk-manual` 工作流并提供:
- `pr`:必需的 PR 编号或完整的 PR URL
- `repo`:可选的仓库覆盖
- `lang`
- `fail_level`
- `comment`
- `no_registry`
`comment=true` 仅限于本仓库中的 PR。对于远程评论更新插入冒烟测试,请改为运行目标冒烟测试仓库自己的工作流,以便其仓库作用域的 `GITHUB_TOKEN` 写入到其自己的 PR 中。
工作流文件必须存在于默认分支上,才会出现 **Run workflow** 按钮。
### 从 GitHub CLI
```
gh workflow run .github/workflows/dep-risk-manual.yml -f pr=123
gh workflow run .github/workflows/dep-risk-manual.yml -f pr=https://github.com/OWNER/REPO/pull/123
gh workflow run .github/workflows/dep-risk-manual.yml -f pr=3 -f repo=rad1092/gh-dep-risk-smoke-matrix -f no_registry=true
gh run watch
gh workflow run comment-smoke.yml --repo rad1092/gh-dep-risk-smoke-comments -f pr=1 -f source_ref=main -f no_registry=true
gh run watch --repo rad1092/gh-dep-risk-smoke-comments
```
### 工作流结果
每次手动运行:
- 构建并测试仓库
- 使用工作流元数据构建一次 `gh-dep-risk`
- 运行一次 CLI
- 上传输出包构件
- 将汇总的 Markdown 输出附加到工作流作业摘要
如果使用 `comment=true`,评论所有权将遵循工作流验证的身份。
此工作流仅使用其仓库作用域的 `GITHUB_TOKEN`;在 GitHub Actions 中,该身份是 `github-actions[bot]`。
当工作流在与目标 PR 不同的仓库中运行时,`GITHUB_TOKEN` 可能根本不被允许读取目标 PR,特别是对于私有跨仓库目标。在这种情况下,工作流可能会在构件上传之前失败。跨仓库评论模式被此工作流有意拒绝。
远程评论冒烟测试由 `rad1092/gh-dep-risk-smoke-comments/.github/workflows/comment-smoke.yml` 处理。该工作流检出此仓库,构建请求的 ref,并使用其自己的 `GITHUB_TOKEN` 在其自己的固定 PR 上发表评论,因此不需要 PAT 密钥。
### 自托管运行器
这些工作流使用基于 Node 24 的 GitHub Actions 主要版本。保持自托管运行器为最新;GitHub 的 Node 24 迁移指南使用 Actions Runner `v2.327.1+` 作为基线。如果自托管运行器拒绝 `checkout@v5`,请先升级运行器,然后再使用这些工作流。
## 发布
推送 `v*` 标签以触发 `.github/workflows/release.yml`。
发布工作流:
- 运行 `go test ./...`
- 将版本、提交和构建日期元数据注入到二进制文件中
- 使用 `cli/gh-extension-precompile@v2`
- 发布用于 GitHub CLI 扩展安装的预编译二进制文件
有关确切的首次发布过程,请参阅 [RELEASING.md](RELEASING.md)。
## 许可证
本项目基于 [MIT 许可证](LICENSE) 授权。
标签:Bun, CLI扩展, CMS安全, DevSecOps, EVTX分析, GitHub API, GitHub CLI, GNU通用公共许可证, JavaScript, Node.js, npm, pnpm, pnpm-workspace, Pull Request, Python, Yarn, 上游代理, 云安全监控, 代码审查, 依赖管理, 依赖风险审查, 包管理器, 威胁情报, 安全审查, 开发者工具, 无后门, 日志审计, 本地回退机制, 统一API, 静态分析