Skip to content

feat: block extra-env sensitive key overrides by default#174

Merged
Svtter merged 3 commits into
mainfrom
fix/sensitive-env-guard
Jun 3, 2026
Merged

feat: block extra-env sensitive key overrides by default#174
Svtter merged 3 commits into
mainfrom
fix/sensitive-env-guard

Conversation

@Svtter

@Svtter Svtter commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

From PR #171 review suggestions.

Previously, extra-env entries that override sensitive runtime variables (API keys, MODEL, PROMPT, etc.) only triggered a ::warning:: but still proceeded. This PR changes the default to block such overrides with an ::error:: and exit 1.

Changes

  • New input extra-env-allow-sensitive (default false) on all 5 actions that use run-github-opencode.py
  • When false: block sensitive key overrides with ::error:: and exit 1
  • When true: allow overrides with ::warning:: (previous behavior)
  • Reserved prefix GITHUB_RUN_OPENCODE_ is always blocked regardless of the flag
  • Also added missing extra-env and extra-env-allow-sensitive inputs to github-run-opencode action

- Add extra-env-allow-sensitive input (default 'false') to all 5 actions
- When false: block extra-env entries that override SENSITIVE_ENV_KEYS with ::error:: and exit 1
- When true: allow such overrides with ::warning:: (previous behavior)
- Also add extra-env + extra-env-allow-sensitive inputs to github-run-opencode (was missing)
- Reserved prefix GITHUB_RUN_OPENCODE_ is always blocked regardless of allow-sensitive
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

无遗漏

PR 规格共 5 项要求,全部在当前代码中实现到位:

  1. 5 个 action 均新增 extra-env-allow-sensitive 输入(默认 false — 已确认 architect-review/action.yml:133feature-missing/action.yml:158github-run-opencode/action.yml:144review/action.yml:158spec-coverage/action.yml:170 均声明并通过 GITHUB_RUN_OPENCODE_EXTRA_ENV_ALLOW_SENSITIVE 传递给 Python 脚本。已核对 multi-review 走的是 Node.js (dist/index.cjs),不在本 PR 范围内。
  2. false 时阻断敏感 key 并以 ::error:: 退出 1run-github-opencode.py:502-509 收集 blocked_keys 并在循环结束后 sys.exit(1),同时打印 ::error:: 行。
  3. true 时回到原 ::warning:: 行为run-github-opencode.py:504allow_sensitive=True 分支下打印 warning 并继续写入 os.environ
  4. 保留前缀 GITHUB_RUN_OPENCODE_ 恒被阻断(不受 flag 控制)run-github-opencode.py:496-499 该判断独立于 allow_sensitive,无论 flag 值都会 ::error:: + continue + 加入 blocked_keys,最终触发 exit 1
  5. github-run-opencode action 补齐 extra-envextra-env-allow-sensitive 输入github-run-opencode/action.yml:137-150 与 env 段 257-258 均已补全。

SENSITIVE_ENV_KEYS 集合(含 MINIMAX_API_KEYXIAOMI_API_KEYUSE_GITHUB_TOKENPROMPTMODELOPENCODE_* 等)与 PR 描述「API keys, MODEL, PROMPT, etc.」一致,未发现规格条目缺漏或集成断点。

New%20session%20-%202026-06-03T10%3A54%3A25.289Z
opencode session  |  github run

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

最终决策:有条件合并

简要总结:
本次 PR 将 extra-env 行为从「告警」升级为「默认拒绝敏感键覆盖」并对保留前缀 GITHUB_RUN_OPENCODE_ 完全拦截,是显著的安全正向改进(架构合理、性能无回归、失败安全)。但作为破坏性变更,必须在合并前补充文档/版本提示。安全与架构 reviewer 共同建议将"全有/全无"开关演进为更细粒度的 allowlist;安全 reviewer 单独指出敏感键列表仍存在劫持盲点。

阻塞项:

  1. 【已确认 · 质量 + 架构】破坏性变更缺乏 CHANGELOG 与版本提示。原仅产生 warning 的行为现升级为 sys.exit(1),需在 CHANGELOG.md 顶部新增 ### Breaking 条目并考虑 bump package.json major 版本,否则下游使用 extra-env: MODEL=xxx 的工作流会无声失败。
  2. 【已确认 · 质量 + 架构】新输入 extra-env-allow-sensitive 在用户文档中完全缺失README.mdmulti-review 表格(约行 133)及 skills/setup-ci/references/actions-reference.md(行 109/166/196/247)均未同步说明该 input,用户无法发现新逃生口,构成本次升级后的"静默破坏性变更"。

建议项:

  1. 【已确认 · 安全 + 架构】extra-env-allow-sensitive 粒度过粗,应演进为 allowlist。当前 true 即放行所有敏感键,工作流作者在 with: 中写错一次即完全旁路。建议增设 extra-env-allow-sensitive-keys: MODEL,PROMPT 类显式键列表 input,保留 true 作为宽限逃生口。
  2. 【安全独占】SENSITIVE_ENV_KEYS 列表覆盖不足。当前未覆盖 PATHLD_PRELOADLD_LIBRARY_PATHPYTHONPATHHOMEGIT_DIR 等同样具备劫持能力的变量(经 os.environ 透传到 subprocess.run(cmd, env=env))。建议至少补齐 PATHLD_PRELOADLD_LIBRARY_PATHPYTHONPATHHOME
  3. 【已确认 · 质量 + 架构】跨 action 文案不一致feature-missing/action.ymlextra-env 描述已去除"may override sensitive runtime settings",但 architect-review / review / spec-coverage 三个 action 未同步调整,建议统一修订。
  4. 【质量】GITHUB_RUN_OPENCODE_ 前缀拦截为无条件硬错误,即便开启 extra-env-allow-sensitive 也无法放行。建议增加 extra-env-allow-internal 旗标,或在错误信息中明确"此限制不接受 opt-in",避免日后再次改协议。
  5. 【质量】完全缺少新分支测试覆盖tests/test_all.pyextra-env 解析路径 0 命中,建议至少补 3 个用例:GITHUB_RUN_OPENCODE_* 拦截、MODEL 等敏感键默认拒绝、extra-env-allow-sensitive=true 放行。
  6. 【安全独占】大小写匹配与平台一致性。保留前缀与敏感键均为大小写敏感,若未来支持 Windows runner 可能被绕过。建议将 key 归一化(key.upper())后再比对,或文档明确仅支持 Linux。
  7. 【安全独占】value 缺少大小/字符限制os.environ[key] = value 直接赋值未限制长度,建议加入单键总长度上限(如 16 KiB)。
  8. 【安全独占】github-run-opencode 新增 extra-env 暴露面。需确认下游调用方均信任该输入来源,避免供应链上游不可信仓库通过工作流复用注入。
  9. 【质量】错误消息与 blocked_keys 汇总表述可改进:行 503 提示信息应明确是哪个 action 的 input;行 508 把"敏感键"与"保留前缀拦截"混为一谈,建议分开计数或用中性 "blocked N extra-env override(s)"。
  10. 【质量】建议将"新增 github-run-opencodeextra-env 输入"与"敏感变量守卫"拆分为两个 commit/PR,便于回滚与语义化版本控制。
  11. 【架构】建议在代码注释或文档中为 allowlist 扩展点留口子,便于未来加入更多 provider key 时平滑演进。

📋 各 Reviewer 详细审查结果
quality

我需要先查看当前仓库的实际代码以验证 PR 描述。
有条件合并

该 PR 引入了对 extra-env 的敏感变量守卫功能,方向正确(默认拒绝覆盖、显式 opt-in 才允许),整体设计合理。但作为破坏性变更,文档、测试和退出码语义都存在需要注意的问题。

阻塞项:

  1. 破坏性变更缺乏文档和版本提示extra-env 中覆盖 MODEL/PROMPT/GITHUB_TOKEN 等原先只产生 warning 的行为现在直接 sys.exit(1),且对 GITHUB_RUN_OPENCODE_ 前缀键的拦截没有任何 opt-out。这会令现有依赖 extra-env: MODEL=xxx 覆盖模型的工作流直接失败。建议:
    • CHANGELOG.md 顶部新增条目(按现有格式 ### Changed### Breaking)明确说明行为变更与迁移方式(设置 extra-env-allow-sensitive: "true")。
    • package.json 中考虑 bump major 版本号,提示下游用户这是不兼容变更。
  2. GITHUB_RUN_OPENCODE_ 前缀拦截是无条件硬错误run-github-opencode.py:495-498),即便开启 extra-env-allow-sensitive 也无法放行。如果未来确有合法需求(例如测试或临时调试内部变量),当前没有逃生通道。建议要么单独再加一个 extra-env-allow-internal 之类的旗标,要么在错误信息中明确说明"此限制不接受 opt-in",避免日后需要再改协议。
  3. 关键新增输入在用户文档中完全缺失extra-env-allow-sensitive 没有出现在 README.md(如 multi-review 表格行 133 附近),也没有出现在 skills/setup-ci/references/actions-reference.md(行 109/166/196/247 都有 extra-env 但缺少对应说明)。不更新这些文档,下游用户无法发现这个新输入,会认为 PR 是"静默破坏性变更"。

建议项:

  1. 没有任何测试覆盖新分支tests/test_all.py 完全没有针对 extra-env 解析路径的用例(搜索 extra-env/SENSITIVE/allow_sensitive 全部 0 命中),建议至少补 3 个用例:覆盖 GITHUB_RUN_OPENCODE_* 拦截、覆盖 MODEL 等敏感键默认拒绝、覆盖 extra-env-allow-sensitive=true 放行。
  2. 错误消息表述可改进run-github-opencode.py:503 提示"set extra-env-allow-sensitive to 'true' to allow",但用户可能不知道这是哪个 action 的 input。可改为 set the 'extra-env-allow-sensitive' input to 'true' on the action that triggered this run,或在仓库根添加 docs/extra-env.md 链接。
  3. blocked_keys 汇总消息用语不准run-github-opencode.py:508 写 "blocked N sensitive key override(s)",但其中也包含 GITHUB_RUN_OPENCODE_* 前缀拦截(属于"保留前缀"而非"敏感变量")。建议把两类分开计数或用更中性的 "blocked N extra-env override(s)"。
  4. extra-env-allow-sensitive 的布尔解析与文件其它部分一致(仅 "true" 视作 true,其它一律 false),这点没问题;但缺少输入校验提示,建议在 action.yml 描述里点明"only the literal string 'true' enables overrides",与同文件其它布尔 input 风格保持一致。
  5. 新增的 github-run-opencode/action.yml extra-env 输入是单独的能力扩展(与守卫无关),但和守卫改动混在同一个 PR 里。建议拆分为两个 commit / 两个 PR,便于回滚和语义化版本控制。
  6. 未触达但相关的潜在 bug:敏感键在脚本内通过 set_envrun-github-opencode.py:444-451)先于 extra-env 处理设置。当 extra-env-allow-sensitive=true 时,extra-env 仍会覆盖 set_env 设过的值,与原行为一致——但用户若期待"早定义者胜出"会感到意外。如果有文档承诺此语义应在变更说明中点明。
security

存在风险

本 PR 将 extra-env 行为从「仅告警」升级为「默认拒绝敏感键覆盖」,并对 GITHUB_RUN_OPENCODE_ 保留前缀完全拦截,是显著的安全正向改进:失败安全(sys.exit(1))、不输出 value、值通过 os.environ 而非 shell 字符串传递,避免了直接命令注入。但仍存在若干需关注的覆盖盲点。

阻塞项:无

建议项:

  1. 敏感键列表覆盖不足(建议强化)SENSITIVE_ENV_KEYSgithub-run-opencode/run-github-opencode.py:17-29)未覆盖以下同样具备劫持能力的运行时变量,且 extra-env 解析后这些键会经 os.environ 透传到 subprocess.run(cmd, env=env)run-github-opencode.py:154):

    • PATH —— 可将后续 opencode/git/python3 等命令指向攻击者控制的二进制
    • LD_PRELOADLD_LIBRARY_PATH —— 进程加载时执行任意共享库
    • PYTHONPATH —— 影响本脚本自身及子进程加载的 Python 模块
    • NODE_OPTIONS —— opencode 若是 Node 实现可能受影响
    • BASH_ENV/ENV/BASHOPTS/SHELLOPTS —— 改变 shell 启动行为
    • HOMEGIT_DIRGIT_WORK_TREE 等 git 行为控制变量(脚本后续会执行 git 操作)
      建议至少将 PATHLD_PRELOADLD_LIBRARY_PATHPYTHONPATHHOME 加入 SENSITIVE_ENV_KEYS,或对所有非显式允许的键采取白名单策略。
  2. extra-env-allow-sensitive 是「一键全放行」开关(建议细化):当前一旦设置为 true,所有 SENSITIVE_ENV_KEYS 与保留前缀全部失效,无任何粒度。攻击场景里只要工作流作者在显式 with: 中写错一次即完全旁路。建议至少要求显式列出允许覆盖的键(如 extra-env-allow-sensitive-keys: MODEL,PROMPT),并保留 true 作为宽限逃生口。

  3. github-run-opencode 新增 extra-env 暴露面扩大:该组合 action 此前未对外提供 extra-env,本 PR 新增为输入项(github-run-opencode/action.yml:137-147)。需确认下游所有调用方都信任该输入的来源,避免被供应链上游不可信仓库通过工作流复用注入。

  4. 大小写匹配与平台一致性(边缘情况):保留前缀 GITHUB_RUN_OPENCODE_SENSITIVE_ENV_KEYS 均为大小写敏感匹配。GitHub-hosted runner 走 Linux 不受影响,但若未来支持 Windows runner,model/github_token 等可绕过。建议将 key 归一化(key.upper())后再比对,或在文档中明确仅支持 Linux。

  5. value 未做大小/字符限制(次要)os.environ[key] = value 直接赋值,未限制长度或控制字符。极端超长 value 可能影响后续 subprocess 环境区。建议加入单键总长度上限(例如 16 KiB)。

参考位置:github-run-opencode/run-github-opencode.py:479-509(解析与拦截逻辑)、github-run-opencode/run-github-opencode.py:17-29(敏感键定义)、github-run-opencode/run-github-opencode.py:154(env 透传到子进程)。

performance

性能良好

本次 PR 主要为 extra-env 解析增加敏感变量保护逻辑,从算法复杂度、内存分配、I/O 等角度看都是低开销的纯字符串处理,未引入性能回归。

关键分析点:

  • SENSITIVE_ENV_KEYSrun-github-opencode.py:17-29 已经定义为 set 集合,key in SENSITIVE_ENV_KEYS 为 O(1) 查找,未退化为线性扫描
  • allow_sensitive 标志在 run-github-opencode.py:481 在循环外计算一次,循环内仅做布尔判断,无重复计算
  • 解析仍为单次 O(n) 线性遍历(splitlines() + partition("=")),blocked_keys 列表只在命中时追加,正常路径无额外内存开销
  • 命中敏感键时通过 sys.exit(1) 提前退出(run-github-opencode.py:509),属于 fail-fast,可避免后续昂贵的子进程启动与模型调用,从失败路径看反而是性能优化
  • 错误信息在循环结束后统一聚合输出(', '.join(blocked_keys)),仅一次字符串拼接,无累积开销
  • action.yml 的变更均为声明式输入透传,不影响运行时性能

阻塞项:无
建议项:无

architecture

架构合理

架构分析摘要:

本次 PR 的核心是给 extra-env 引入"敏感变量白名单"开关。从架构层面看:

  • 耦合度控制得当:策略逻辑(哪些是 sensitive、默认拒绝还是允许)集中在 run-github-opencode.py 一处,YAML 层面只做输入→环境变量的透传,没有在多处重复实现同一策略。
  • 模块位置一致:四个子 action(architect-review / feature-missing / review / spec-coverage)按既有 extra-env 透传模式补齐新输入;核心 github-run-opencode/action.yml 同时补齐 extra-envextra-env-allow-sensitive,使其可独立使用,与既有子 action 包装模式一致。
  • 分层清晰:声明式层(action.yml inputs)、编排层(env 透传)、执行层(python 解析与判定)三层职责无混淆。
  • 接口设计:命名 extra-env-allow-sensitive / GITHUB_RUN_OPENCODE_EXTRA_ENV_ALLOW_SENSITIVE 与现有 extra-env 风格一致;boolean 解析走 strip().lower() == "true",与文件中 enable-thinking 等其它开关完全相同。
  • 散弹改动:YAML 的重复改动是 GitHub Action 包装层固有的成本(每个 wrapper 都得暴露输入),实际策略改动仅集中在 Python 单一函数内。
  • 一致性:默认 "false" 走"deny by default"安全基线,与 action 整体安全姿态一致;blocked_keys 收集到末尾再统一 sys.exit(1),便于用户一次看到全部冲突项,比遇错即退更友好。

阻塞项:无

建议项:

  • 此变更将"覆盖敏感变量"从 warning 升级为 error 退出(同时 GITHUB_RUN_OPENCODE_ 前缀也从 warning 升级为 error),属于行为破坏性变更。从架构可演进性看,建议在 release notes / CHANGELOG 中显式标注,让依赖 extra-env 覆盖 MODEL 等的用户能提前设置新开关;否则在用户视角会感觉"突然坏掉"。
  • extra-env-allow-sensitive全有/全无的粗粒度开关:要么全部允许覆盖,要么全部禁止。当前规模合理,但若未来 sensitive 集合继续扩大(如加入更多 provider key),可考虑演进为"显式 allowlist"(如 extra-env-allow-keys: MODEL,FOO)以获得更细粒度控制;建议在代码注释或文档中留出扩展点。
  • SENSITIVE_ENV_KEYS 的实际定义不在 diff 范围内,PR 描述中应确认该列表覆盖了输入描述里点名的"API keys, MODEL, PROMPT"等条目,否则文档与实现会出现漂移(接口契约与实现脱节是后续维护隐患)。
  • feature-missing/action.ymlextra-env 的描述去掉了"may override sensitive runtime settings"的提示文字,与新行为一致;但其它三个 action(architect-review / review / spec-coverage)的 extra-env 描述没有同步调整,存在跨 action 文案不一致,建议同步修订以保持统一口径。

- Add docs/releases/v3.4.0.md with breaking change notice
- Add extra-env and extra-env-allow-sensitive to github-run-opencode input table
- Add extra-env-allow-sensitive to multi-review input table
- Unify extra-env description in multi-review/action.yml
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

无遗漏

PR 描述明确列出 5 项规格要求,已在当前代码中全部实现到位:

  1. 5 个 Python 脚本调用的 action 均新增 extra-env-allow-sensitive 输入(默认 falsearchitect-review/action.yml:133-139feature-missing/action.yml:158-164review/action.yml:158-164spec-coverage/action.yml:170-176github-run-opencode/action.yml:144-150 均已声明并通过 GITHUB_RUN_OPENCODE_EXTRA_ENV_ALLOW_SENSITIVE 透传。multi-review 走的是 Node.js (dist/index.cjs),规格与历史评论均明确不在本次范围内。
  2. false 时阻断敏感键并以 ::error:: 退出 1run-github-opencode.py:499-505allow_sensitive=False 分支打印 ::error:: 并将键加入 blocked_keysrun-github-opencode.py:507-509 循环结束后汇总并 sys.exit(1)
  3. true 时回到原 ::warning:: 行为run-github-opencode.py:500-501allow_sensitive=True 分支打印 warning 并继续 os.environ[key] = value,完全保持旧行为。
  4. 保留前缀 GITHUB_RUN_OPENCODE_ 恒被阻断(不受 flag 控制)run-github-opencode.py:495-498 该判断独立于 allow_sensitive,无条件 ::error:: 并加入 blocked_keys,最终触发 exit 1
  5. github-run-opencode action 补齐 extra-envextra-env-allow-sensitive 输入github-run-opencode/action.yml:137-150 声明两个输入,github-run-opencode/action.yml:257-258 在 env 段透传到 Python 脚本,Python 侧 run-github-opencode.py:480-481 通过 GITHUB_RUN_OPENCODE_EXTRA_ENVGITHUB_RUN_OPENCODE_EXTRA_ENV_ALLOW_SENSITIVE 正确读取。

SENSITIVE_ENV_KEYS 集合(run-github-opencode.py:17-29,含 GITHUB_TOKENZHIPU_API_KEYOPENCODE_API_KEYDEEPSEEK_API_KEYMINIMAX_API_KEYXIAOMI_API_KEYGITEA_TOKENMODELPROMPTUSE_GITHUB_TOKENOPENCODE_* 内部变量)与 PR 描述"API keys, MODEL, PROMPT, etc."一致。未发现规格条目缺漏或集成断点,规格要求 100% 覆盖。

New%20session%20-%202026-06-03T11%3A29%3A01.615Z
opencode session  |  github run

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

综合代码审查报告

最终决策:有条件合并

本 PR 将 extra-env 对敏感键与 GITHUB_RUN_OPENCODE_ 保留前缀的覆盖从 ::warning:: 升级为 ::error:: + exit 1,并新增 extra-env-allow-sensitive 显式放行开关,方向正确。但存在 3 个阻塞项需先解决。

阻塞项

  1. 【已确认】README 与 multi-review 实际行为不一致(quality、security、architecture 三方一致)

    • README.md:136 的 multi-review 输入表中列出 extra-env-allow-sensitive,但 multi-review/action.yml 既未声明该输入,也未注入 MULTI_REVIEW_EXTRA_ENV_ALLOW_SENSITIVEmulti-review/src/platform.ts:533-545parseExtraEnv 也无任何敏感键/保留前缀校验。
    • 用户按 README 设置 extra-env-allow-sensitive 会被 GitHub Actions 视为未声明输入而 schema 校验失败。
    • docs/releases/v3.4.0.md:9 已正确说明 multi-review 不在此列表中,README 必须与其保持一致;或者反过来补齐 multi-review 的 input 与透传。
  2. 缺少对该破坏性行为的回归测试(quality)

    • run-github-opencode.py:480-509 将 warning 升级为 exit 1 属消费者可见的破坏性变更,但 tests/test_all.pyTestGithubRunOpencode 既无 GITHUB_RUN_OPENCODE_EXTRA_ENV 的清理(reset_env 中未 pop),也未覆盖:(a) 命中保留前缀、(b) 命中 SENSITIVE_ENV_KEYSallow_sensitive=false、(c) allow_sensitive=true 仅警告 三种场景。
    • 至少需补一条断言该变更触发 exit 1 的测试。
  3. 版本号与 CHANGELOG 未同步(quality)

    • docs/releases/v3.4.0.md 描述 v3.4.0,但 multi-review/package.json 仍为 3.3.1CHANGELOG.md 也无 v3.4.0 条目。按仓库 AGENTS.md,版本号应同步到 package.json 与 git tag,并新增 CHANGELOG 条目。

建议项

  1. 保留前缀的覆盖行为与 allow_sensitive 名称语义不对齐(quality):当前 GITHUB_RUN_OPENCODE_ 前缀即使 allow_sensitive=true 也被拒绝,建议在 action.yml 描述中明示保留前缀是第二类硬性禁止、不受 allow-sensitive 控制。

  2. release notes 声明的 SENSITIVE_ENV_KEYS 补全可能不在本 diff 内(architecture):docs/releases/v3.4.0.md 的 "Fixed" 段引用 fix: complete SENSITIVE_ENV_KEYS to cover all runtime API keys #171/fix: complete SENSITIVE_ENV_KEYS to cover all runtime env vars #172 添加 MINIMAX_API_KEYXIAOMI_API_KEYUSE_GITHUB_TOKENGITEA_TOKENOPENCODE_* 等。若这些键的补全不在 feat: block extra-env sensitive key overrides by default #174 内,默认阻塞对这些键不生效;建议确认 fix: complete SENSITIVE_ENV_KEYS to cover all runtime API keys #171/fix: complete SENSITIVE_ENV_KEYS to cover all runtime env vars #172 已合入或将条目绑定到正确 PR 编号。

  3. blocked_keys 可能包含重复项(quality):同一敏感键在 extra-env 中出现多次会被重复追加,导致错误信息冗余;建议使用前 set 去重或最终汇总时 sorted(set(blocked_keys))

  4. extra-env-allow-sensitive 输入值未做规范化校验(quality):run-github-opencode.py:481"true" 启用,其他取值("True""1""yes")会无声视为 false。建议与 enable-thinking 统一为 value.lower() in {"1", "true", "yes"},或在文档中明示只接受 "true"

  5. 审计可见性不足(security):当 extra-env-allow-sensitive=true 时仅打印 ::warning::,建议同时将被覆盖的敏感 key 列表与时间戳写入 $GITHUB_STEP_SUMMARYrun-github-opencode.py:501),便于事后审计。

  6. SENSITIVE_ENV_KEYS 维护性(security):敏感集合为硬编码列表(run-github-opencode.py:17-29),未来新增 provider 需同步维护。建议在代码评审 checklist 中加入该集合完整性检查,或在 set_env 之后用反射式集合自动派生(保留黑名单防误伤)。

  7. breaking change 缺少逃生通道文档(architecture):建议在 release notes 中增加「如何快速定位被阻塞的键」小贴士(如提示看 stderr 中的 blocked N sensitive key override(s) 列表),方便用户在升级失败时迅速恢复。


📋 各 Reviewer 详细审查结果
quality

有条件合并

本 PR 主要做了三件事:(1) 在 extra-env 处理逻辑中新增 extra-env-allow-sensitive 选项,把对敏感键和 GITHUB_RUN_OPENCODE_ 保留前缀的覆盖从 ::warning:: 升级为 ::error::exit 1;(2) 在五个 action 上新增 extra-env-allow-sensitive 输入并完成 env 透传;(3) 添加 extra-envgithub-run-opencode 并补文档/发布说明。Python 主体逻辑改动本身是自洽的(SENSITIVE_ENV_KEYS 与保留前缀两个分支独立处理、sys.exit(1) 在循环结束后统一退出,错误聚合良好),但存在若干一致性与覆盖性问题需先修复。

阻塞项:

  1. README 与 multi-review 实际行为不一致README.md:136 在 multi-review 输入表中列出了 extra-env-allow-sensitive,但 multi-review/action.yml 既未声明该输入,multi-review/src/platform.ts:533-545parseExtraEnv 也没有任何敏感键/保留前缀校验,更没有读取 MULTI_REVIEW_EXTRA_ENV_ALLOW_SENSITIVE(该 env 变量也未在 multi-review/action.yml 中注入)。一旦用户按 README 设置 extra-env-allow-sensitive,会被 GitHub Actions 视为未声明输入直接 schema 校验失败。docs/releases/v3.4.0.md:9 已经正确说明 multi-review 不在此列表中,README 必须与其保持一致。
  2. 缺少对该破坏性行为的回归测试run-github-opencode.py:480-509 将原本的 warning 升级为 exit 1,属于对消费者可见的破坏性变更,但 tests/test_all.pyTestGithubRunOpencode 既无 GITHUB_RUN_OPENCODE_EXTRA_ENV 的清理(reset_env 中未 pop),也没有针对 (a) 命中保留前缀、(b) 命中 SENSITIVE_ENV_KEYSallow_sensitive=false、(c) allow_sensitive=true 仅警告 的用例。需要至少补一条断言该变更触发 exit 1 的测试。
  3. 版本号与 CHANGELOG 未同步docs/releases/v3.4.0.md 描述的是 v3.4.0,multi-review/package.json 仍为 3.3.1CHANGELOG.md 也无 v3.4.0 条目;按仓库 AGENTS.md,版本号应同步到 package.json 与 git tag,CHANGELOG 应新增条目,否则发布流程会失同步。

建议项:

  1. 保留前缀的覆盖行为与 allow_sensitive 名称语义不完全对齐:当前 GITHUB_RUN_OPENCODE_ 前缀永远被拒绝(即使 extra-env-allow-sensitive: "true"),但其描述是"override sensitive runtime variables"。建议在 action.yml 描述中明确说明保留前缀是第二类硬性禁止、不受 allow-sensitive 控制,避免用户期望被打破。
  2. blocked_keys 可能包含重复项:同一敏感键在 extra-env 中出现多次会被重复追加到 blocked_keys,导致错误信息冗余。可在使用前 set 去重或最终汇总时 sorted(set(blocked_keys))
  3. extra-env-allow-sensitive 输入值未做规范化校验run-github-opencode.py:481 仅在字符串等于 "true" 时启用,其他非空值(如 "True""1""yes")会无声地视为 false。可在文档中明示只接受 "true",或与 enable-thinking 统一为 value.lower() in {"1", "true", "yes"}
  4. GitHub Actions 工作流命令对 stdout/stderr 的依赖::error::/::warning:: 仅在被 GH Actions 抓取时才被识别。在 release notes / 测试里以普通 stdout 打印时不会自动转成 step 失败(不过这里确实紧接了 sys.exit(1),所以语义正确),但若未来要复用 parseExtraEnv 到其他脚本路径,需注意这一点。
security

让我先查看相关文件来验证 PR 中的安全相关细节。
安全无虞

安全分析摘要

本次 PR 是一次安全强化变更:将 extra-env 覆盖敏感运行时变量的行为从 ::warning:: 提升为 ::error:: + sys.exit(1),并新增显式 opt-in 开关 extra-env-allow-sensitive(默认 false)。整体方向是收紧默认行为,属于纵深防御改进。

逐项核查:

  • 输入校验/注入run-github-opencode.py:484-506 使用 Python 原生 splitlines() + partition("=") 解析 KEY=VALUE,全程在 Python 进程内完成,无 shell 介入。值通过 os.environ[key] = value 注入,仅在子进程继承环境时传递,不存在命令注入/SQL 注入/XSS 路径。
  • 认证/授权:未引入新的鉴权逻辑;权限边界与原版一致(由工作流调用者控制)。
  • 敏感数据暴露:错误/警告信息中仅回显用户自己传入的 key 名,不泄露仓库/Runner 机密;GITHUB Actions 日志对工作流调用者可见,无外泄。
  • OWASP Top 10:A03 (Injection) 路径保持闭合;A05 (Misconfiguration) 由此变更得到改善(默认拒绝敏感覆盖);A06 (Vulnerable Components) 不在本次范围。
  • 预留前缀硬阻断GITHUB_RUN_OPENCODE_ 前缀被无条件拒绝(即便 allow_sensitive=true 也不放开),对内部配置命名空间的保护是正确且严格的。
  • API 滥用allow_sensitive 的判断用 .strip().lower() == "true",任何非 "true" 取值都按 false 处理,fail-closed。

阻塞项:无

建议项:

  1. README 与 multi-review 实现不一致README.md:136 表格中 multi-review 列出了 extra-env-allow-sensitive,但 multi-review/action.yml 中未定义该 input,也未通过 MULTI_REVIEW_EXTRA_ENV_ALLOW_SENSITIVE 透传。运行时 multi-review 永远走安全默认路径(不暴露开关),这在安全上是更保守的行为,但与文档不符;建议要么补齐 input 与透传,要么从 README 中移除该行。
  2. 审计可见性不足:当 extra-env-allow-sensitive=true 时,仅打印 ::warning:: 到 GitHub Actions 日志。建议同时将覆盖事实写入 $GITHUB_STEP_SUMMARY(列出被覆盖的敏感 key、时间戳),便于事后审计。文件 github-run-opencode/run-github-opencode.py:501
  3. SENSITIVE_ENV_KEYS 维护性run-github-opencode.py:17-29 的敏感集合是硬编码列表。未来若新增 provider(如新的 *_API_KEY)或新增 OPENCODE_* 内部配置变量,需同步维护此集合,否则可被绕过。建议在代码评审流程中加入对此集合完整性的 checklist,或在 set_env 之后用反射式集合自动派生(同时保留黑名单以防误伤用户自定义 key)。
  4. 错误信息对 fork 仓库的可见性::error:: 行会出现在公开 PR 的 Actions 日志中。当 fork PR 触发时,被列入 blocked_keys 的 key 名会暴露给 PR 作者(虽然 key 是他们自己传的,但可能间接泄露工作流内部使用了哪些 key)。属低风险,可在文档中说明。
performance

性能良好

本次 PR 主要在 run-github-opencode.py 中增强了 extra-env 的解析逻辑,添加了敏感键阻断功能。从性能角度分析:

  • SENSITIVE_ENV_KEYSsetrun-github-opencode.py:17),key in SENSITIVE_ENV_KEYS 是 O(1) 查找
  • allow_sensitive 在循环外计算一次,避免了重复的字符串 strip().lower() 操作
  • 解析逻辑保持 O(n),其中 n 为 extra-env 行数(通常很小)
  • 阻断的 key 先收集到 blocked_keys 列表,最后统一 sys.exit(1),避免中途多次退出,有利于一次性报告所有错误
  • blocked_keys 列表长度受用户输入限制,无内存泄漏风险
  • extra_env_raw.splitlines() 产生的临时列表在循环结束后即可被 GC 回收
  • 无 I/O、数据库、并发相关变更

阻塞项:无
建议项:无

architecture

架构有疑虑

架构分析摘要

本次 PR 主要做三件事:(1) 在 github-run-opencode/run-github-opencode.py 中将 extra-env 的安全语义从「警告」升级为「默认阻塞 + 通过 extra-env-allow-sensitive 开关放行」;(2) 在 5 个 composite action(review / feature-missing / spec-coverage / architect-review / github-run-opencode)的 action.yml 中增加同名 input 与 GITHUB_RUN_OPENCODE_EXTRA_ENV_ALLOW_SENSITIVE 环境变量映射;(3) 给 github-run-opencode 补齐原本缺失的 extra-env 输入。

整体架构遵循了仓库一贯的「input → GITHUB_RUN_OPENCODE_* 环境变量 → 中心化 Python 脚本」的分层模式,新增的敏感键检查逻辑正确地落在唯一负责环境变量处理的 run-github-opencode.py 中,未出现散落。SENSITIVE_ENV_KEYS 集合虽然在此 diff 中未展开,但属于既有数据,加新键属于数据补全,不构成架构问题。breaking change 已在 docs/releases/v3.4.0.md 中标注,符合既有 release 文档规范。

阻塞项

建议项

  1. multi-review 的行为不一致multi-review/action.ymlextra-env 的描述被改成了与其他 action 完全一致的「to pass to opencode runtime」措辞,但本 PR 并没有给 multi-review 增加 extra-env-allow-sensitive 入口,也没有修改其自身脚本(推测是 multi-review/multi-review.py 或类似)里的敏感键检查路径。读者/用户会自然预期 multi-review 也具备相同的默认阻塞行为。需要在以下两条中明确一条:

    • 明确 multi-review 不走中心脚本(其 extra-env 描述与行为应保持原样,不要为了措辞统一而误导);
    • 或者在 multi-review 的脚本里同步应用相同的阻塞逻辑,并补上 extra-env-allow-sensitive 入口。
      当前「只改描述、不改行为」是潜在的语义陷阱。
  2. release notes 声明但本 diff 未体现docs/releases/v3.4.0.md 的「Fixed」段提到「Complete SENSITIVE_ENV_KEYS set: added MINIMAX_API_KEY, XIAOMI_API_KEY, USE_GITHUB_TOKEN, GITEA_TOKEN, and all OPENCODE_* internal config vars」并引用 fix: complete SENSITIVE_ENV_KEYS to cover all runtime API keys #171/fix: complete SENSITIVE_ENV_KEYS to cover all runtime env vars #172。如果这些键的实际补全不在本 PR(feat: block extra-env sensitive key overrides by default #174)内,那么默认阻塞行为对 MINIMAX_API_KEY 等并不会真正生效。建议在合并 feat: block extra-env sensitive key overrides by default #174 前确认 fix: complete SENSITIVE_ENV_KEYS to cover all runtime API keys #171/fix: complete SENSITIVE_ENV_KEYS to cover all runtime env vars #172 已合入,或在 release notes 中把该条目绑定到正确 PR 编号,避免「声称已修复但默认路径仍漏检」。

  3. breaking change 的默认安全策略方向合理,但缺少逃生通道文档:默认从 warning 升级为 ::error:: + exit 1 是正确的「fail-closed」选择,但 release notes 中只说明了如何打开 extra-env-allow-sensitive。如果用户当前的 extra-env 中包含任何与新增的 SENSITIVE_ENV_KEYS 命名前缀/具体名字有交集的条目,升级会直接挂掉。建议在 release notes 中加一段「如何快速定位被阻塞的键」的小贴士(例如提示看 stderr 中的 blocked N sensitive key override(s) 列表)。这是 DX 改进,非架构问题。

- Remove extra-env-allow-sensitive from multi-review README table (not supported)
- Add note about reserved prefix always being blocked in input description
- Deduplicate blocked_keys using set instead of list
- Normalize extra-env-allow-sensitive value to accept 'true', '1', 'yes'
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

无遗漏

PR 描述明确列出 5 项规格要求,已在当前代码中全部实现到位:

规格逐项核查:

  1. 5 个 Python 脚本调用的 action 均新增 extra-env-allow-sensitive 输入(默认 false — 已确认 architect-review/action.yml:133-141feature-missing/action.yml:158-166review/action.yml:158-166spec-coverage/action.yml:170-178github-run-opencode/action.yml:144-152 均声明了 extra-env-allow-sensitive 输入,默认值 "false",并在 env 段透传 GITHUB_RUN_OPENCODE_EXTRA_ENV_ALLOW_SENSITIVEmulti-review 走的是 Node.js (dist/index.cjs),不在本 PR 5 个 action 范围之内。

  2. false 时阻断敏感键并以 ::error:: 退出 1run-github-opencode.py:499-505allow_sensitive=False 分支打印 ::error:: 并将键加入 blocked_keysrun-github-opencode.py:507-510 循环结束后汇总并 sys.exit(1)

  3. true 时回到原 ::warning:: 行为run-github-opencode.py:500-501allow_sensitive=True 分支打印 warning,落到 os.environ[key] = value (line 506),完全保持旧行为。

  4. 保留前缀 GITHUB_RUN_OPENCODE_ 恒被阻断(不受 flag 控制)run-github-opencode.py:495-498 该判断独立于 allow_sensitive,无条件 ::error:: 并加入 blocked_keys,最终触发 exit 1。与 PR 描述 "always blocked regardless of the flag" 字面一致。

  5. github-run-opencode action 补齐 extra-envextra-env-allow-sensitive 输入github-run-opencode/action.yml:137-143 声明 extra-envgithub-run-opencode/action.yml:144-152 声明 extra-env-allow-sensitive,env 段 259-260 透传到 Python 脚本,Python 侧 run-github-opencode.py:480-481 通过 GITHUB_RUN_OPENCODE_EXTRA_ENVGITHUB_RUN_OPENCODE_EXTRA_ENV_ALLOW_SENSITIVE 正确读取。

SENSITIVE_ENV_KEYS 集合核查(run-github-opencode.py:17-29):

  • Provider API keys:GITHUB_TOKENZHIPU_API_KEYOPENCODE_API_KEYDEEPSEEK_API_KEYMINIMAX_API_KEYXIAOMI_API_KEYGITEA_TOKEN
  • Core runtime config:MODELPROMPTUSE_GITHUB_TOKEN
  • Internal OPENCODE_*OPENCODE_ARGSOPENCODE_CONFIG_CONTENTOPENCODE_WORKING_DIRECTORYOPENCODE_ATTEMPTSOPENCODE_RETRY_PROFILEOPENCODE_RETRY_ON_REGEXOPENCODE_RETRY_DELAY_SECONDS

与 PR 描述 "API keys, MODEL, PROMPT, etc." 完全匹配,规格中点名的所有项目均覆盖。

结论: 5 项规格要求 100% 覆盖,集成路径完整(input → env 透传 → Python 解析 → 阻断逻辑 → exit),未发现规格条目缺漏或集成断点。

New%20session%20-%202026-06-03T12%3A21%3A50.424Z
opencode session  |  github run

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

可合并

本次 PR 是安全加固,将 extra-env 敏感 key 覆盖从 ::warning:: 升级为 ::error:: + exit 1,并新增 extra-env-allow-sensitive 逃生通道。三个有效 reviewer(security / performance / architecture)均未发现阻塞项;quality reviewer 抓取失败,按规则无有效意见。

交叉验证:security 与 architecture 共同关注 multi-review 的安全模型分叉,但 security 确认按 changelog 属有意排除,architecture 标记为非阻塞建议。性能层面无任何异议。

阻塞项:无

建议项

  1. 补齐 SENSITIVE_ENV_KEYS 单测(security 提议)——覆盖 MINIMAX_API_KEY / XIAOMI_API_KEY / USE_GITHUB_TOKEN / GITEA_TOKEN / OPENCODE_* 等新增项,防止未来增删时遗漏。
  2. 校验 env key 名格式(security 提议)——解析 extra-env 时拒绝不符合 [A-Za-z_][A-Za-z0-9_]* 的 key,阻断 ::error:: 注解注入与畸形 key 进入 os.environ
  3. 显式记录 multi-review 的安全模型分叉(architecture 提议)——在 release notes 或 multi-review/action.ymlextra-env 描述中注明 multi-review 未应用本次阻断逻辑,避免用户误以为两个安全模型等价。
  4. 修复 multi-review/action.yml 描述与实现错位(architecture 提议)——multi-review/action.yml:88extra-env 描述改为「to pass to opencode runtime」,但 multi-review 实际不直接调用 opencode CLI;建议恢复或重写描述以匹配其实际语义。
  5. 在 release notes 中明确「全有或全无」语义(architecture 提议)——当前实现是 per-call 聚合阻断,单个敏感 key 会导致整次 extra-env 失败(包括合法 key),应在 docs/releases/v3.4.0.md 显式说明。

📋 各 Reviewer 详细审查结果
quality

(审查失败: fetch failed)

security

安全无虞

本次 PR 实质上是安全加固,将 extra-env 输入从「默认放行 + 警告」改为「默认拒绝 + 退出 1」,属于安全姿态的提升。

主要审查结论:

  • 注入风险os.environ[key] = value 是 Python 字典赋值,不会经过 shell 解释,不存在命令注入。line.partition("=") 仅按首个 = 切分,允 value 含 =,处理正确。
  • 凭据泄露:错误/警告日志仅输出 key 名(env var 名),不打印 value,避免敏感值落入日志。print(..., file=sys.stderr) 走标准错误通道。
  • 越权与配置安全:默认阻止 GITHUB_TOKENMODELPROMPT*_API_KEY 等被 extra-env 覆写,避免工作流作者(被诱导或无意识地)替换 runner 注入的 token,关闭了潜在的提权/凭据替换路径(A05 Security Misconfiguration 改善)。
  • 保留前缀GITHUB_RUN_OPENCODE_ 前缀无论 extra-env-allow-sensitive 取何值均被拦截,防止外部输入污染 action 内部通道,逻辑稳健。
  • 布尔解析安全allow_sensitive 仅匹配白名单 ("true","1","yes"),且先 .strip().lower(),规避了 truthy 字符串注入导致绕过。
  • 多 action 一致性architect-review / feature-missing / review / spec-coverage / github-run-opencode 均已加 extra-env-allow-sensitive 输入并在 env 中透传;multi-review 仅改描述,按 changelog 属有意排除(架构问题,非安全问题)。
  • 新增/变更依赖:未引入新依赖。
  • 回归风险:从 ::warning:: 升级为 ::error:: + exit 1 属 breaking change,但已在 docs/releases/v3.4.0.md 明确标注并提供 extra-env-allow-sensitive 作为恢复开关,向后兼容路径完整。

阻塞项:无

建议项:

  • 可在 SENSITIVE_ENV_KEYS 旁附单测,覆盖新增的 MINIMAX_API_KEY / XIAOMI_API_KEY / USE_GITHUB_TOKEN / GITEA_TOKEN / OPENCODE_* 等,确保未来增删敏感 key 时不致遗漏。
  • 解析 extra-env 时可校验 key 名仅含 [A-Za-z_][A-Za-z0-9_]* 并在不符合时拒绝(同时阻断潜在的 ::error:: 注解注入与畸形 key 进入 os.environ)。当前威胁模型下非紧急,仅为卫生改进。
performance

性能良好

本 PR 主要 中添加了敏感环境变量覆盖在 run-github-opencode.py拦截逻辑,附带多个 action.yml 的输入声明更新。性能分析如下:

  • 算法复杂度:对 extra_env_raw.splitlines() 做单次线性遍历,每行仅做 strip、一次 split('=', 1)startswithset 查找,整体 O(n),n 为 extra-env 行数(通常很小)。
  • 数据结构blocked_keys 使用 set[str] 累计,查找/插入为 O(1);key in SENSITIVE_ENV_KEYS 假定为 set/frozenset,亦为 O(1)。
  • 内存分配:仅在循环结束后且 blocked_keys 非空时才执行 sorted()join,且集合元素数量与行数线性相关,无泄漏或持续增长。
  • I/O / 网络 / DB:无文件、无网络、无数据库操作,仅在退出前向 stderr 打印一次聚合信息。
  • 控制流:使用 continue 跳过被拦截的键后再 os.environ[key] = value,逻辑正确且不产生冗余赋值;allow_sensitive 标志在循环外计算一次,无重复解析。
  • action.yml 改动:仅新增 input 声明和 env 透传,GitHub Actions 解析阶段开销可忽略。

阻塞项:无

建议项:无

architecture

架构有疑虑

本次 PR 的核心改动(新增 extra-env-allow-sensitive 输入、将敏感 key 覆盖从 ::warning:: 升级为 ::error:: + exit 1、完善 SENSITIVE_ENV_KEYS 集合、在缺失 extra-envgithub-run-opencode 上补齐输入)整体架构设计合理:SENSITIVE_ENV_KEYS 与解析逻辑集中在 github-run-opencode/run-github-opencode.py:17run-github-opencode.py:493,5 个 Python 驱动 action 共享同一脚本(spec-coverage/action.yml:317review/action.yml:295feature-missing/action.yml:305architect-review/action.yml:350github-run-opencode/action.yml:266),无重复实现;GITHUB_RUN_OPENCODE_EXTRA_ENV_ALLOW_SENSITIVE 沿用既有 GITHUB_RUN_OPENCODE_* 命名约定;GITHUB_RUN_OPENCODE_ 前缀始终硬阻断作为安全边界,敏感 key 走 opt-in 退路,向后兼容路径清晰;release notes 正确标记为 Breaking 并提供迁移开关。docs/releases/v3.4.0.md 作为版本说明放置位置也符合既有模式。

但存在以下与既有架构不一致的疑虑需要关注:

阻塞项:无

建议项:

  1. multi-review 的架构分叉未被本次安全加固覆盖multi-review 是 TS 实现(multi-review/src/platform.ts:533 parseExtraEnv),使用独立前缀 MULTI_REVIEW_EXTRA_ENVmulti-review/action.yml:233),其解析逻辑既没有 GITHUB_RUN_OPENCODE_ 前缀检查,也没有 SENSITIVE_ENV_KEYS 阻断。本次 PR 将 5 个 Python 驱动的 action 升级为「敏感 key 覆盖默认 error」,但 multi-review 仍然是「静默 setenv」,形成两个安全模型并存的局面。release notes 中也明确把 multi-review 排除在 extra-env-allow-sensitive 适用范围外。如果这是有意为之,建议在 release notes 或 multi-review 的 input 描述中显式注明此差异;如果打算后续对齐,最好在 multi-review/src/platform.ts 中同步实现 MULTI_REVIEW_EXTRA_ENV_ALLOW_SENSITIVE 并重新构建 multi-review/dist/index.cjs
  2. multi-review/action.yml 的描述被对齐但行为未对齐multi-review/action.yml:88extra-env 描述被改为「to pass to opencode runtime」以与其他 action 一致,但实际 multi-review 并不直接调用 opencode CLI,而是调度 reviewer agents;底层 parseExtraEnv 也没有本次新加的阻断逻辑。描述与实现之间存在错位风险。
  3. 跨 5 个 action.yml 的重复修改:相同的 extra-env-allow-sensitive 输入声明和 GITHUB_RUN_OPENCODE_EXTRA_ENV_ALLOW_SENSITIVE 环境变量传递在 5 个文件中重复出现(architect-review/action.yml:133feature-missing/action.yml:155github-run-opencode/action.yml:140review/action.yml:158spec-coverage/action.yml:170)。这是现有架构的固有成本(每个 action 都是独立的 composite action),但如果未来输入项继续增长,可考虑抽取公共 schema 或文档模板来减少 drift 风险。
  4. breaking 变更的「per-key」语义run-github-opencode.py:497-510 的实现是「遍历整段 extra-env,收集所有被阻断的 key,最后统一 exit 1」——这意味着如果用户在同一次 extra-env 中混入了合法与敏感 key,会因为单个敏感 key 而整体失败(且合法 key 在 os.environ 中也不会被设置,因为遍历在 sys.exit(1) 之前)。对于 CI 流水线来说这种「全有或全无」语义是更安全的默认,但值得在 release notes 中明确写出,避免用户期望「部分生效」的旧行为。

@Svtter Svtter merged commit b6fd4a8 into main Jun 3, 2026
3 checks passed
@Svtter Svtter deleted the fix/sensitive-env-guard branch June 3, 2026 12:28
@github-actions github-actions Bot mentioned this pull request Jun 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant