rad1092/gh-dependency-risk

GitHub: rad1092/gh-dependency-risk

一个轻量的 GitHub CLI 扩展,按需对 Pull Request 中的依赖变更进行风险评分和审查,支持多生态系统并在 API 不可用时回退到本地静态分析。

Stars: 0 | Forks: 0

# gh-dep-risk [![test](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/fd23200ccd005222.svg)](https://github.com/rad1092/gh-dependency-risk/actions/workflows/test.yml) [![install-smoke](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/a293d5af0e005223.svg)](https://github.com/rad1092/gh-dependency-risk/actions/workflows/install-smoke.yml) `gh-dep-risk` 是一个预编译的 GitHub CLI 扩展,供审查人员按需运行,以总结 Pull Request 中的依赖风险。 它被设计为扩展而非服务器,这样可以复用 `gh` 的身份验证,保留在审查人员的机器或一次性工作流运行中,并避免任何 webhook、队列、数据库或仪表盘基础设施。 ![gh-dep-risk 终端动画演示](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8bb1f64fa1005225.gif) 上面的终端动画捕获是一个使用 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, 静态分析