Skip to content

feat: add bilingual (zh/en) language support#170

Merged
Svtter merged 3 commits into
mainfrom
feat/bilingual-support-v2
Jun 3, 2026
Merged

feat: add bilingual (zh/en) language support#170
Svtter merged 3 commits into
mainfrom
feat/bilingual-support-v2

Conversation

@Svtter

@Svtter Svtter commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

Re-implementation of #74 from a clean main base.

Changes

  • Add language input (default zh) to review, feature-missing, spec-coverage, and github-run-opencode
  • Python script appends language-specific instruction to PROMPT (en → English instruction, zh → Chinese instruction)
  • Remove hardcoded Please respond in Chinese from all prompt templates — language is now controlled by the language input
  • Make verdict keywords bilingual (e.g. 可合并 / CAN MERGE, 无遗漏 / NO GAPS, 无需审计 / SKIP)
  • Add language validation with ::warning:: for unsupported values
  • Update README with language input docs and Chinese documentation section
  • Fix extra escape >\\/dev/null>/dev/null in feature-missing
  • Add extra-env sensitive key warnings and permission dict validation

Usage

- name: Run OpenCode review (English)
  uses: sun-praise/opencode-actions/review@v3
  with:
    github-token: ${{ secrets.GITHUB_TOKEN }}
    language: en

- Add 'language' input (default 'zh') to review, feature-missing, spec-coverage, and github-run-opencode
- Python script appends language-specific instruction to PROMPT based on language value
- Remove hardcoded 'Please respond in Chinese' from prompt templates
- Make verdict keywords bilingual (e.g. '可合并 / CAN MERGE', '无遗漏 / NO GAPS')
- Add language validation with warning for unsupported values
- Update README with language config docs and Chinese documentation section
- Fix extra escape in feature-missing dev/null redirect
- Add extra-env sensitive key warnings and permission dict validation
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

发现遗漏

摘要

PR 自身描述中有一项明确要求 "Remove hardcoded Please respond in Chinese from all prompt templates"("所有" prompt 模板),但实现范围被显式限制为 4 个 action。导致仓库中另外 2 个具有 agent/prompt 的 action 仍保留硬编码的中文指令和中文判定关键词,且未获得 language 输入支持。这与 PR 描述本身及关联 issue #74 中"all actions / 所有 prompt"的描述存在明显不一致。

详细对比

PR 自身列出的范围(已全部实现):

  • language 输入已添加到 github-run-opencodereviewfeature-missingspec-coverage 四个 action(action.yml 均可查到 language: 段及 GITHUB_RUN_OPENCODE_LANGUAGE 环境变量传递)。
  • run-github-opencode.py:444-472 实现了按 language 追加指令、::warning:: 校验、空 PROMPT 跳过。
  • 上述 4 个 action 的 prompt 中硬编码 Please respond in Chinese 已移除,判定关键词已双语化。
  • README.md 第 376-399 行新增 ## 语言配置 与第 344 行 # 中文文档 章节完整。

CRITICAL

PR 描述 "Remove hardcoded Please respond in Chinese from all prompt templates" 与实际不一致

  • 以下 prompt 模板仍保留硬编码 Please respond in Chinese,PR 并未触及:
    • architect-review/action.yml:259 — "Please respond in Chinese. DO NOT modify any code, only provide architecture review comments."
    • multi-review/reviewers/quality.yaml:11
    • multi-review/reviewers/architecture.yaml:13
    • multi-review/reviewers/security.yaml:13
    • multi-review/reviewers/performance.yaml:14
    • multi-review/src/orchestrator.ts:6-25DEFAULT_COORDINATOR_PROMPT 整段为中文,并包含 "输出格式(中文)"
  • 这些模板中的判定关键词仍为纯中文(未做"双语化"):
    • architect-review/action.yml:261-263架构合理 / 架构有疑虑 / 架构有问题
    • multi-review/reviewers/quality.yaml:13-15可合并 / 有条件合并 / 不可合并
    • multi-review/reviewers/architecture.yaml:15-17架构合理 / 架构有疑虑 / 架构有问题
    • multi-review/reviewers/security.yaml:15-17安全无虞 / 存在风险 / 高危漏洞
    • multi-review/reviewers/performance.yaml:16-18性能良好 / 性能有疑虑 / 性能问题严重
    • multi-review/src/orchestrator.ts:22可合并 / 有条件合并 / 不可合并
  • 关联 issue feat: add bilingual (zh/en) language support #74 明确说 "All actions 新增 language 输入参数" 和 "所有 prompt 的判定关键词已更新为双语格式",但 architect-reviewmulti-review 两个 action 既无 language 输入,prompt 也未清理。
  • 影响:当用户对 architect-reviewmulti-review 设置 language: en 时,Python 脚本会在 prompt 末尾追加英文指令,但 prompt 主体仍要求中文回复并使用中文判定关键词,行为不可预期,与本次 PR 设计的双语支持目标冲突。

建议修复:把本次 language 输入、双语关键词、移除硬编码中文指令的处理同样应用到 architect-review/action.ymlmulti-review/action.yml(新增 language 入参并透传 GITHUB_RUN_OPENCODE_LANGUAGE),以及 multi-review/reviewers/*.yamlmulti-review/src/orchestrator.ts

MEDIUM

README 语言文档未明确范围

  • README.md:376-399 的"## 语言配置"小节以"所有 action 均支持 language 输入参数"开头,但仓库中 architect-reviewmulti-review 实际并未获得该输入。README 该陈述与代码现状不符,容易误导用户。建议在 README 中明确说明哪些 action 支持 language,或把这两个 action 一并实现以匹配文档描述。

New%20session%20-%202026-06-03T09%3A58%3A43.833Z
opencode session  |  github run

…lit README

- Remove unreachable 'elif language in SUPPORTED_LANGUAGES' branch
- Extract zh_instruction variable to eliminate duplicate string
- Add extra-env input to feature-missing action (consistency with review/spec-coverage)
- Unify os.environ['MODEL'] assignments to set_env() for consistent style
- Split Chinese README into separate README.zh-CN.md file
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

可合并

PR 主要新增 language 输入(zh/en)、敏感 env 覆盖告警、extra-env/permission 的防御性校验,整体质量、性能、架构、安全均无阻塞问题。跨 reviewer 交叉验证未发现多人标记的严重问题。

阻塞项:无

建议项:

  • 已确认(性能 + 架构):elif language in SUPPORTED_LANGUAGES: passSUPPORTED_LANGUAGES = {"zh", "en"} 现状下不可达,且作为 future-extension 钩子缺乏文档说明。建议在 SUPPORTED_LANGUAGES 定义处补注释,说明添加新语言时需同步更新 prompt 注入分支。
  • (性能)当 language == "zh"(默认值)时仍会向 prompt 追加中文指令,浪费约 50 token;可在 zh 分支跳过追加,或仅在用户显式传入 language: en 时追加。
  • (安全)SENSITIVE_ENV_KEYSGITHUB_RUN_OPENCODE_ 前缀覆盖目前仅 ::warning::,仍允许覆盖;若希望更强防护可改为 sys.exit(1)(属策略选择)。
  • (安全)permission_raw 解析失败时将原值写入 stderr;建议仅记录类型与长度,避免把配置原值落日志。
  • (架构)默认值 zh 在 4 个 action.yml、run-github-opencode.py:441get_env 调用、warning 文案三处重复声明,建议收敛为单一常量。
  • (架构)双语判定关键词(可合并 / CAN MERGE 等)占用 token 且可能让模型在双语间犹豫;建议未来按 language 选择单语 prompt 模板,模板与 code 解耦。
  • (架构)语言指令追加到 PROMPT 末尾权重较低;可考虑注入到 prompt 顶部或提供配置开关。
  • (架构)SENSITIVE_ENV_KEYS 若需文档化,建议抽到独立小模块;README.md 双语结构随规模增长维护成本上升,未来可拆分为 docs/i18n/<lang>/README.md

📋 各 Reviewer 详细审查结果
quality

(审查失败: fetch failed)

security

安全无虞

本 PR 主要新增 language 输入(zh/en)用于控制 agent 回复语言,并附带对敏感 env 覆盖和 permission 解析的防御性加固,未引入新的安全风险。

关键审查点:

  • language 输入经 .strip().lower() 后仅与硬编码集合 {"zh", "en"} 比对,匹配结果只用于选择固定的中/英指令文本追加到 PROMPT,语言原始值未拼入 prompt,无 prompt 注入风险。
  • permission_raw 增加 isinstance(parsed, dict) 校验,拒絕列表/字符串等类型,防止后续逻辑因类型混淆出错。
  • 新增 SENSITIVE_ENV_KEYS 集合,在 extra-env 覆盖 GITHUB_TOKEN/*_API_KEY 等敏感变量时输出 ::warning::,提升可见性。
  • README.md 示例使用 ${{ vars.OPENCODE_LANGUAGE }} 而非 PR 作者可控的输入,避免恶意 PR 操纵审查语言;${{ secrets.GITHUB_TOKEN }} 的使用方式与之前一致,无回退 PR 风险。
  • action.ymllanguage 输入有默认值 zh 且无 required 限制,consumer 显式提供时无校验失败风险。
  • 文档 v2v3 升级仅为版本号更新,不影响供应链安全模型。
  • 取消 \/dev/null 转义为 /dev/null 是良性的 YAML 字符串处理,不引入命令注入。

阻塞项:无

建议项:

  • SENSITIVE_ENV_KEYSGITHUB_RUN_OPENCODE_ 前缀的覆盖目前仅打印 ::warning::,仍允许覆盖。如希望更强防护,可考虑在覆盖这些键时直接 sys.exit(1)(属策略选择,非必修复)。
  • permission 解析失败时将 permission_raw 原样写入 stderr;若未来该输入可能来自非受信源,建议只记录类型与长度,避免把配置原值写入日志。
performance

性能良好

本 PR 主要改动为:

  1. 在多个 action 中新增 language 输入参数(默认 zh),并在 run-github-opencode.py 中将语言指令拼接到 PROMPT 环境变量末尾;
  2. 新增 extra-env 键的合法性校验(保留前缀 GITHUB_RUN_OPENCODE_ 与敏感键检测);
  3. GITHUB_RUN_OPENCODE_PERMISSION 的 JSON 解析增加了类型校验(必须为 object);
  4. 文档与 prompt 模板的更新(增加中英双语 verdict 关键词)。

性能分析:

  • SUPPORTED_LANGUAGESSENSITIVE_ENV_KEYS 在模块顶层定义,每次调用 _main() 不会重建,是好的做法。
  • 语言处理路径为 O(1) 字符串拼接(仅几十字节的指令追加),不构成显著开销;sorted(SUPPORTED_LANGUAGES) 仅在 unsupported 分支触发(错误路径),影响可忽略。
  • extra-env 解析中每个键只做 startswithset 成员判定,复杂度 O(n) 且 n 很小。
  • permission JSON 解析仅做一次 json.loads + isinstance 校验,无额外 I/O 或重试。
  • 没有数据库/网络调用被新增或重复,token 数量增加约 50 量级,对 LLM 推理无明显影响。
  • 没有并发、锁或资源泄漏相关问题;模块级常量、局部变量使用合理。

阻塞项:无

建议项:

  • elif language in SUPPORTED_LANGUAGES: pass 分支在当前 SUPPORTED_LANGUAGES = {"zh", "en"} 下是不可达代码,未来扩展语言时可考虑改为 elif language not in ("zh", "en"): ... 的形式以避免静默跳过(与注释 "Future language" 的意图更一致,且不影响性能,仅是代码可读性)。
  • language == "zh"(默认值)时,仍会向已经是中文的 prompt 追加一段中文指令,建议在 zh 分支跳过追加(或仅在用户显式传入 language: en 时追加),以省去约 50 token 的提示词开销;这是非阻塞的微优化。
architecture

架构合理

架构分析

本次 PR 主要引入了 language 输入参数(zh/en),同时附带了几项加固性改动。整体改动遵循了现有架构模式,未引入跨模块的不必要耦合。

关注点分析:

  • 耦合度language 输入通过 GITHUB_RUN_OPENCODE_LANGUAGE 环境变量统一传递到 run-github-opencode.py:440-471 处理,避免了在每个 action.yml 中重复实现。所有四个 action(review / feature-missing / spec-coverage / github-run-opencode)共享同一个底层脚本,符合既有分层。
  • 模块放置:语言切换逻辑集中在 run-github-opencode.py(执行层),配置层(action.yml)只负责透传 input 与 env,分层清晰。
  • 接口设计language 输入的描述、required、default 模式与现有 input 完全一致。SUPPORTED_LANGUAGES 集合作为模块级常量被集中声明,扩展新语言时只需修改一处。
  • 一致性:双语判定关键词(可合并 / CAN MERGE 等)的形式在三个 action 中保持一致;默认值 zh 也保持了原有默认行为(v2 时强制中文,v3 通过 input 暴露,可保持向后兼容)。
  • 范围控制(shotgun surgery):v2 → v3 升级号、README 双语化、language 支持、extra-env 校验(GITHUB_RUN_OPENCODE_ 前缀与 SENSITIVE_ENV_KEYS)、permission JSON 类型校验——这些改动是同一 PR 的"复合发布"。从架构角度,校验改动是独立的小幅硬化,作用域都局限在 run-github-opencode.py 内,没有跨模块扩散,scope creep 程度可接受。
  • 小修复feature-missing/action.yml:281>\/dev/null> /dev/null 是 shell 转义清理,与本次 PR 主题无关但合理。

阻塞项

阻塞项:无

建议项

  1. 默认值重复声明zh 这个默认值在 4 个 action.yml 的 default:run-github-opencode.py:441get_env("GITHUB_RUN_OPENCODE_LANGUAGE", "zh") 以及 warning 文案 defaulting to Chinese 中重复出现。建议将语言默认值收敛到一个常量(例如通过环境变量 GITHUB_RUN_OPENCODE_DEFAULT_LANGUAGE),未来调整默认语言时只需改一处。

  2. 提示语追加位置:语言指令目前以 \n\n 追加到 PROMPT 末尾(run-github-opencode.py:451-466)。对于部分模型而言,指令放在 prompt 开头(system 区域)权重更高。可考虑在 prompt 顶部注入语言指令,或提供配置开关让用户选择注入位置。

  3. prompt 双语关键词引入噪声:双语判定词(如 可合并 / CAN MERGE)会占用 token 且可能让模型在两者间犹豫。如果未来支持更多语言,prompt 会持续膨胀。建议改为按 language 选择单一语言的 prompt 模板,模板文件与 code 解耦。

  4. SENSITIVE_ENV_KEYS 的位置run-github-opencode.py:16 将其声明为模块级常量,但只用于 _main() 内的 extra-env 校验。如果未来要在文档中说明哪些 key 是敏感的,建议把它放到一个独立的小模块或文档化。

  5. 多语言支持的未来扩展点run-github-opencode.py:466elif language in SUPPORTED_LANGUAGES: pass 显式留了 future-extension 钩子,但没有任何文档/注释说明如何添加新语言。建议在 SUPPORTED_LANGUAGES 定义处加一条注释,说明添加新语言时需同时更新 prompt 注入分支。

  6. README 双语结构:双语内容放在同一 README.md 中并用 anchor 跳转。当文档继续增长时维护成本上升;如果未来要支持更多语言,建议拆分到 docs/i18n/<lang>/README.md。当前规模可接受,但值得记入后续重构。

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

发现遗漏

摘要

PR 描述与关联的 issue #74 都使用了 "all prompt templates" / "All actions" / "所有 prompt" 的措辞,但实际实现只覆盖了 reviewfeature-missingspec-coveragegithub-run-opencode 4 个 action。仓库中另外 2 个携带 prompt/agent 的 action(architect-reviewmulti-review)在当前 HEAD 仍保留硬编码的中文指令与纯中文判定关键词,且未获得 language 输入支持。新增的 README.zh-CN.md 又显式声称"所有 action 均支持 language 输入参数",与代码现状不符。

PR 自身列出的 4 个 action 的 language 输入、env 透传、Python 脚本指令追加、::warning:: 校验、双语判定关键词、extra-env 敏感键告警等均已落实,可视为局部完成。

CRITICAL

spec 要求"从所有 prompt 模板移除硬编码 Please respond in Chinese"未完成

  • 关联 issue feat: add bilingual (zh/en) language support #74 明确写明 "All actions 新增 language 输入参数" 与 "所有 prompt 的判定关键词已更新为双语格式";PR 描述也写明 "Remove hardcoded Please respond in Chinese from all prompt templates"。
  • 当前 HEAD 仍硬编码 Please respond in Chinese 的文件(均未在本 PR 改动):
    • architect-review/action.yml:259
    • multi-review/reviewers/quality.yaml:11
    • multi-review/reviewers/architecture.yaml:13
    • multi-review/reviewers/security.yaml:13
    • multi-review/reviewers/performance.yaml:14
  • 判定关键词仍为纯中文(未双语化):
    • architect-review/action.yml:261-263架构合理 / 架构有疑虑 / 架构有问题
    • multi-review/reviewers/quality.yaml:13-15可合并 / 有条件合并 / 不可合并
    • multi-review/reviewers/architecture.yaml:15-17
    • multi-review/reviewers/security.yaml:15-17
    • multi-review/reviewers/performance.yaml:16-18
    • multi-review/src/orchestrator.ts:6-25DEFAULT_COORDINATOR_PROMPT 整段中文 + 输出格式(中文) + :22可合并 / 有条件合并 / 不可合并
  • 建议:在 architect-review/action.ymlmulti-review/action.yml 添加 language 输入并透传 GITHUB_RUN_OPENCODE_LANGUAGE,同步清理上述 6 个 prompt 文件中的硬编码中文指令、把判定关键词改为双语。对于 multi-review,由于 prompt 由 TS 协调器组合,还需在 multi-review/src/orchestrator.ts 中根据 language 选择 DEFAULT_COORDINATOR_PROMPT 的中/英版本。

architect-reviewmulti-review 没有 language 输入

  • architect-review/action.ymlmulti-review/action.yml 全文未出现 language: 输入段,也未导出 GITHUB_RUN_OPENCODE_LANGUAGE 环境变量。
  • 这意味着即使用户在工作流中传入 language: enarchitect-reviewmulti-review 也无法识别;而其 prompt 主体仍要求中文回复,运行结果与 language 设计目标冲突。
  • 建议修复位置:architect-review/action.yml(与本 PR 在 review/action.yml:165-169:279 完全相同的方式新增 inputs + env 透传);multi-review/action.yml(同样新增 inputs,并把语言透传到协调器/各 reviewer 进程)。

MEDIUM

README.zh-CN.md:42-44 "所有 action 均支持 language" 与现实不符

  • 新增的 README.zh-CN.md:44 开篇即称:"所有 action 均支持 language 输入参数,用于控制 agent 的回复语言"。
  • 但仓库中 architect-reviewmulti-review 两个 action 当前并不支持 language(见上文 CRITICAL)。
  • 建议要么将该段改为明确列出支持 language 的 action 范围(reviewfeature-missingspec-coveragegithub-run-opencode),要么把 language 一并落实到 architect-reviewmulti-review 以匹配文档断言。

New%20session%20-%202026-06-03T10%3A04%3A06.801Z
opencode session  |  github run

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

综合审查报告

最终决策:有条件合并

总结

本 PR 为 action 矩阵引入 language 输入与 v3 主版本号,并新增 extra-envpermission 类型校验。language 白名单校验、permission 类型校验、set_env 封装统一等加固是积极改进。但存在一个安全阻塞项extra-env 可静默覆盖敏感运行时变量),以及 v3 特性覆盖不一致问题(architect-review / multi-review 仍硬编码中文且未声明 language input,与 README 声明不符)。建议在解决阻塞项后合并。


阻塞项

  1. extra-env 可覆盖敏感运行时变量但未阻断(已确认 - 安全域专有发现)

    • 位置:github-run-opencode/run-github-opencode.py:478-484
    • SENSITIVE_ENV_KEYS 中的 GITHUB_TOKENMODELPROMPTZHIPU_API_KEYOPENCODE_API_KEYDEEPSEEK_API_KEYextra-env 覆盖时仅打印 ::warning::,流程继续。
    • 风险:覆盖 PROMPT 实施提示词注入(在 agent 启动前已生效,permission 拦截不到);覆盖 MODEL 绕过计费/合规;覆盖 API key 替换凭据。
    • 建议:默认阻断覆盖敏感键,或要求显式 allow-sensitive-override: "true" 输入确认。
  2. v3 特性覆盖不一致(架构 + 文档声明)

    • 位置:architect-review/action.yml:259multi-review/reviewers/{quality,performance,security,architecture}.yamlmulti-review/action.yml
    • 这些 action 仍硬编码 Please respond in Chinese... 且未声明 language input;但 README.md / README.zh-CN.md 把它们列入 v3 行列,并声称"所有 action 均支持 language"。
    • 风险:用户配置 language: en 后部分 action 仍返回中文,构成对外契约与实现脱节。
    • 建议:要么在合并前补齐这两个 action 的 language 支持;要么在 README 显式声明它们当前仅支持中文。

建议项

  1. extra-env key 缺少 POSIX 环境变量命名格式校验

    • 位置:github-run-opencode/run-github-opencode.py:475-484
    • 建议增加 ^[A-Za-z_][A-Za-z0-9_]*$ 正则校验。
  2. extra-env value 缺少长度/总大小限制

    • 位置:github-run-opencode/run-github-opencode.py:481
    • 建议限制单行长度(如 4KB)和总大小,避免 OOM 或子进程异常。
  3. SENSITIVE_ENV_KEYS 黑名单策略不完整(安全 + 架构交叉验证)

    • 位置:github-run-opencode/run-github-opencode.py:15
    • 安全 reviewer:黑名单易遗漏(如 ANTHROPIC_API_KEYOPENAI_API_KEYHTTP_PROXY),建议改白名单(特定前缀如 OC_)或文档化完整列表。
    • 架构 reviewer:当前集合遗漏了 _main() 内部 set_env 写入的 OPENCODE_ARGSMINIMAX_API_KEYXIAOMI_API_KEYUSE_GITHUB_TOKEN 等,告警边界与实际可被静默覆盖的键集合不一致。
    • 建议:合并两份意见,补齐缺失键并考虑改用白名单策略。
  4. warning 中回显 key 名可能泄露含敏感字段的命名

    • 位置:github-run-opencode/run-github-opencode.py:481-482
    • 建议对包含 TOKEN / SECRET / KEY / PASSWORD 的 key 名做脱敏(如 MY***TOKEN)。
  5. extra-env 文档未明确安全风险与推荐用法

    • 位置:feature-missing/action.yml:148-156
    • 建议在 README"高级配置"章节补充:避免在 extra-env 传递 secrets,敏感配置使用 GitHub secrets 注入。
  6. language 提示词追加位置可能干扰既有强约束 prompt

    • 位置:github-run-opencode/run-github-opencode.py:441-466
    • 建议在文档中说明"语言指令追加到 PROMPT 末尾"这一行为。
  7. prompt 模板与语言层职责重叠

    • 位置:review / feature-missing / spec-coverage 的默认 prompt
    • 模板内嵌双语判定关键词(可合并 / CAN MERGE),Python 层又追加语言指令,存在语义重复。建议由 Python 层根据 language 注入完整关键词集,模板仅保留中性占位。
  8. 语言常量硬编码在 _main() 内部

    • 位置:github-run-opencode/run-github-opencode.py:443
    • 建议抽出模块级 LANGUAGE_INSTRUCTIONS: dict[str, str],与 SUPPORTED_LANGUAGES 对齐,表驱动 dispatch,便于扩展 ja/ko
  9. set_env 在 MODEL 解析中的语义副作用

    • 位置:github-run-opencode/run-github-opencode.py:425-430
    • 全部改用 set_env("MODEL", ...) 后,行为从"无条件赋值"变为"空值跳过"。当前调用均为非空,暂无 bug,但建议在 set_env 上注释说明"空值跳过"语义,或在 MODEL 等必须有值场景使用直接赋值。
  10. 中文 zh_instruction 未包含判定关键词与英文版的对应说明

    • 位置:github-run-opencode/run-github-opencode.py:443
    • 性能 reviewer 提出,命名上不会误导;可考虑补全以便中英文行为一致。无性能影响。

跨 reviewer 状态

  • 质量(quality): 数据缺失(fetch failed),未参与交叉验证。
  • 已确认(≥2 reviewer): 无完全独立来源的同一发现;但 SENSITIVE_ENV_KEYS 完整性问题由安全与架构 reviewer 从不同角度提出,已合并。
  • 领域专有(单源): extra-env 覆盖敏感变量的提示词注入 / 凭据替换风险(仅安全 reviewer 能定性)。
  • 冲突解决: 安全 reviewer 将 extra-env 覆盖敏感变量列为阻塞,架构 reviewer 未将其列为阻塞。依据规则 5(取最严重),保留为阻塞项。

📋 各 Reviewer 详细审查结果
quality

(审查失败: fetch failed)

security

存在风险

安全分析摘要

本 PR 主要变更包括:

  1. 添加中文 README 文档
  2. 版本号从 v2 升级到 v3(添加了 language 输入参数)
  3. 新增 language 输入参数(zh/en),并在 Python 脚本中进行白名单校验和提示词追加
  4. 新增 extra-env 输入参数,允许用户传入任意环境变量
  5. permission JSON 输入增加了类型校验(必须为 object)
  6. 更新 review/feature-missing/spec-coverage 的 prompt 模板以支持中英文双语输出

正面发现:

  • language 输入有完整的白名单校验({"zh", "en"}),未知值会发出 warning 并安全回退到中文
  • permission JSON 现在校验类型,防止非对象类型注入
  • set_env() 函数封装使用一致,避免了直接操作 os.environ 的不一致
  • language 提示词使用硬编码字符串拼接,不存在提示词注入风险
  • README 明确建议从 vars(非 secrets)读取 OPENCODE_LANGUAGE

主要风险点:
extra-env 功能允许在运行时覆盖敏感环境变量(包括 GITHUB_TOKENMODELPROMPT、各 API key),且仅发出 ::warning:: 而非阻断,存在以下隐患。


阻塞项:

  1. extra-env 可覆盖敏感变量无强制阻断(github-run-opencode/run-github-opencode.py:478-484
    SENSITIVE_ENV_KEYS 中的 GITHUB_TOKENMODELPROMPTZHIPU_API_KEYOPENCODE_API_KEYDEEPSEEK_API_KEY 被覆盖时仅打印 warning,流程继续执行。攻击者/误配置可通过此通道:
    • 覆盖 PROMPT 实施针对 LLM agent 的提示词注入(即使 permission 为 deny,环境变量在 agent 启动前已生效)
    • 覆盖 MODEL 改变后端模型,绕过计费/合规策略
    • 覆盖 API key 窃取/替换凭据
      建议:默认阻断覆盖敏感键,或要求显式 allow-sensitive-override: "true" 输入确认。

建议项:

  1. extra-env 的 key 缺少格式校验(github-run-opencode/run-github-opencode.py:475-484
    key 仅做 strip 处理,未校验是否符合 POSIX 环境变量命名(^[A-Za-z_][A-Za-z0-9_]*$)。恶意/异常 key 可能导致子进程行为异常或注入分隔符。建议增加正则校验。

  2. extra-env 的 value 未做校验或长度限制(github-run-opencode/run-github-opencode.py:481
    任意长度的 value 会直接写入 os.environ,可能影响子进程或触发 OOM。建议限制单行长度(如 4KB)和总大小。

  3. SENSITIVE_ENV_KEYS 采用黑名单策略且为硬编码(github-run-opencode/run-github-opencode.py:15
    黑名单容易遗漏(如 ANTHROPIC_API_KEYOPENAI_API_KEYGIT_CONFIG_*、代理相关 HTTP_PROXY 等)。建议改用白名单(仅允许特定前缀如 OC_)或在文档中明确列出所有受保护变量。

  4. warning 中回显了 key 名称(github-run-opencode/run-github-opencode.py:481-482
    当 key 名含敏感信息(如 MY_PROD_TOKEN=...)时,warning 仍只打印 key 名,通常无 PII 泄露,但若用户将 secret 名用作 key 名则会进入 CI 日志(GitHub Actions 日志对有 repo 读权限的人可见)。建议对包含 TOKENSECRETKEYPASSWORD 的 key 名做脱敏(如 MY***TOKEN)。

  5. extra-env 文档未说明安全风险(feature-missing/action.yml:148-156
    现有 description 已提到"may override sensitive runtime settings",但未给出推荐的安全用法(例如"避免在 extra-env 中传递 secrets,使用 GitHub secrets 注入")。建议在 README 的"语言配置"或新增"高级配置"章节补充安全提示。

  6. language 提示词追加位置固定(github-run-opencode/run-github-opencode.py:441-466
    当前将语言指令追加到 PROMPT 末尾。若上游 PROMPT 包含强约束的输出格式或最后一行指令(如"First line MUST be ..."),追加内容可能干扰既有协议。当前实现是末尾追加且使用 \n\n 分隔,影响较小,但建议文档说明此行为。

performance

性能良好

本 PR 主要新增了 languageextra-env 输入参数,以及对应的中文文档。运行时新增的开销仅限于:在 run-github-opencode.py:444-463 中追加少量语言指令到 prompt(约 100 字节),以及在解析 extra-env 时做两次 O(1) 集合查找(SENSITIVE_ENV_KEYS、前缀判断)并打印 ::warning::。这些都是一次性、O(1) 的操作,prompt 增量对 LLM token 消耗的影响也可忽略。GITHUB_RUN_OPENCODE_PERMISSION 的 JSON 类型校验也是单次判断。脚本依然是单进程顺序执行,未引入新的 I/O、网络或并发路径。

阻塞项:无

建议项:

  • run-github-opencode.py:443 zh_instruction 字符串中实际并未包含 "For any verdict keywords..." 这部分(仅中文指令),命名上不会误导,但若希望中文 prompt 也显式提示关键词与英文版的对应关系,可考虑补全以便行为一致。无性能影响。
  • prompt 长度轻微增加(每个调用多 ~100 字节),若未来语言指令扩展,建议改为模板渲染或固定常量集中维护,避免在多处拼接。
architecture

架构有疑虑

整体设计合理:language 处理逻辑集中在 github-run-opencode/run-github-opencode.py,叶子 action(review/feature-missing/spec-coverage)只声明 input 并通过 GITHUB_RUN_OPENCODE_LANGUAGE 环境变量透传到中枢脚本,分层清晰、单点维护,与现有 extra-env/enable-thinking 等参数的传递模式完全一致。feature-missing 补齐 extra-envset_env("MODEL", ...) 统一调用方式、SENSITIVE_ENV_KEYS 警告、permission_raw 类型校验等都属于在既有架构内的局部加固,没有引入新的耦合。

但本次 v3 主版本号同时上提了 8 个 action,"语言可配置" 被定位为 v3 的核心能力,却存在覆盖不一致:

  • architect-review/action.yml:259 仍硬编码 Please respond in Chinese...,且未新增 language input;
  • multi-review/reviewers/{quality,performance,security,architecture}.yaml 全部硬编码 Please respond in Chinese...multi-review/action.yml 也未新增 language input;
  • README.md 与新建的 README.zh-CN.md 都把 architect-review@v3multi-review@v3 列入 v3 行列,且 README.zh-CN.md 明确声称"所有 action 均支持 language 输入参数",与实际能力不符。

这是模块覆盖/一致性问题而非结构性违规——架构骨架是对的,只是新特性没有在所有同层叶子 action 上对齐铺开,存在用户配置后部分 action 仍返回中文的"惊讶行为"。建议在合并前或紧随其后的 PR 中补齐,否则 v3 的对外契约会与实现脱节。

阻塞项:无

建议项:

  1. 特性覆盖一致性:在 architect-review/action.ymlmulti-review/action.yml(包括 multi-review/reviewers/*.yaml 默认 prompt 与 multi-review/src/ 子流程对 PROMPT 的拼装路径)上补齐 language input 与同样的 prompt 拼接逻辑,让"v3 = 语言可配置"在整个 action 矩阵上成立;若短期内不打算扩展,至少在 README 中显式声明这两个 action 当前仅支持中文。
  2. prompt 模板与语言层的职责分离:当前 review/feature-missing/spec-coverage 的默认 prompt 直接内嵌 可合并 / CAN MERGE阻塞项 / Blocking Issues 这类双语判定关键词,再由 Python 层追加一段语言指令。两层都在处理"语言",存在轻度的语义重复——用户自定义 prompt 时也不得不照搬这种双语写法。可考虑由 Python 层根据 language 注入完整的判定关键词集,prompt 模板只保留中性占位(或单语原文),让"语言"完全归属 run-github-opencode.py 单点。
  3. 语言常量的硬编码位置zh_instruction 字符串硬编码在 _main() 内部,未来若再加 ja/ko 等语言会触发函数体内的散弹式修改。可抽出 LANGUAGE_INSTRUCTIONS: dict[str, str] 常量表,与顶部的 SUPPORTED_LANGUAGES 对齐放在模块级,并改为表驱动 dispatch,便于扩展。
  4. SENSITIVE_ENV_KEYS 完整性:当前集合缺少 OPENCODE_ARGSMINIMAX_API_KEYXIAOMI_API_KEYUSE_GITHUB_TOKEN 等同样会被 _main() 内部 set_env 写入的键,作为"敏感运行时变量"覆盖告警应覆盖全部内部托管的键,否则告警边界与实际可被静默覆盖的键集合不一致。
  5. set_env 在 MODEL 解析中的副作用:第 425–430 行把 os.environ["MODEL"] = ... 全部改为 set_env("MODEL", ...),而 set_env 在 value 为空时不写入。由于三个分支的值都是非空字符串,目前没有问题,但语义从"无条件赋值"悄悄变为"非空才赋值"。建议在 set_env 上加注释说明"空值跳过"的语义,或在 MODEL 这种必须有值的场景使用直接赋值,避免后续维护者误以为可以传空字符串清空 MODEL。

- architect-review: add language input, bilingual verdict keywords (架构合理/SOUND etc.)
- multi-review: add language input, pass MULTI_REVIEW_LANGUAGE env var
- multi-review reviewers: bilingual verdict keywords in all 4 YAML templates
- multi-review orchestrator: bilingual DEFAULT_COORDINATOR_PROMPT
- multi-review reviewers.ts: append language instruction based on MULTI_REVIEW_LANGUAGE
- README.zh-CN.md: fix scope description to list all supported actions
@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

无遗漏

分析摘要

本次 PR 完整实现了 issue #74(双语支持)的全部需求,并在原 issue 基础上进一步扩展:

关联 issue #74 需求(已全部实现)

  1. All actions 新增 language 输入参数(默认 zh

    • review/action.yml:165-169
    • feature-missing/action.yml:179-183
    • spec-coverage/action.yml:189-193
    • github-run-opencode/action.yml:131-136
    • 还扩展到 architect-review/action.yml:140-144multi-review/action.yml:99-103(超越 issue 范围)
  2. Python 脚本在 PROMPT 末尾追加语言指令run-github-opencode.py:441-465 完整处理 en / zh / 非法值(含 ::warning:: 告警回退)三种分支,且空 PROMPT 跳过追加

  3. 所有 prompt 判定关键词更新为双语格式 — 已验证:

    • review/action.yml:可合并/CAN MERGE、有条件合并/CONDITIONAL MERGE、不可合并/CANNOT MERGE
    • feature-missing/action.yml:无遗漏/NO GAPS、发现遗漏/GAPS FOUND
    • spec-coverage/action.yml:无需审计/SKIP、全覆盖/FULL COVERAGE、发现遗漏/GAPS FOUND
    • architect-review/action.yml:架构合理/SOUND、架构有疑虑/CONCERNS、架构有问题/PROBLEMATIC
    • multi-review/reviewers/*.yaml:4 个 reviewer 文件均已双语化
    • multi-review/src/orchestrator.ts:25:DEFAULT_COORDINATOR_PROMPT 含 可合并 / CAN MERGE 等双语关键词
  4. README 中英文档并列README.md(英文,340 行)+ README.zh-CN.md(中文,138 行)并互相链接

PR body 中其他变更(已全部实现)

  • ✓ 移除所有 prompt 模板的硬编码 Please respond in Chinese(仓库内已无残留)
  • multi-review/src/reviewers.ts:44-47, 59 通过 TS 层为每个 reviewer 追加语言指令
  • feature-missing/action.yml:293>/dev/null 多余转义已修复
  • run-github-opencode.py:481-484 新增 GITHUB_RUN_OPENCODE_ 前缀 + SENSITIVE_ENV_KEYS 敏感键告警
  • run-github-opencode.py:496-498 新增 permission dict 类型校验
  • multi-review/src/orchestrator.ts:6-28 协调器 prompt 已双语化

验证结果

所有 spec 条目(issue #74 的 4 项需求 + PR body 列出的全部 8 类变更)均已在当前 HEAD 中完整实现,无遗漏。multi-review 协调器虽未对自定义 coordinatorPrompt 显式追加语言指令,但默认 DEFAULT_COORDINATOR_PROMPT 已是双语(包含中英双语段),且 spec 仅要求"判定关键词双语化",未要求对用户自定义 prompt 强制追加语言。

New%20session%20-%202026-06-03T10%3A12%3A05.016Z
opencode session  |  github run

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

可合并

本 PR 进行 v2→v3 多语言(中/英)支持改造、统一 language 输入参数与双语 verdict 关键词,并为 feature-missing 单独增加 extra-env 输入。security、performance 均给出正面结论,architecture 提出"架构有疑虑"但所列均为非阻塞的一致性 / 抽象层冗余问题;三名 reviewer 均未提出阻塞项。

阻塞项:无

建议项:

  1. [已确认] run-github-opencode.py:15SENSITIVE_ENV_KEYS 集合不完整(security + architecture 一致提出):遗漏 MINIMAX_API_KEYXIAOMI_API_KEY,以及 OPENCODE_GO_API_KEY 等同级密钥;同文件已处理但黑名单未对齐,导致覆盖告警语义不一致。建议从既有的 GITHUB_RUN_OPENCODE_*_API_KEY 列表集中派生,避免手工维护漂移。也可考虑加入权限相关 key(如 OPENCODE_PERMISSIONUSE_GITHUB_TOKEN),防止被 extra-env 静默覆盖。

  2. [已确认] extra-env 在各 action 入口暴露不对称(security + architecture 从不同角度指出):github-run-opencode.py 共享层已支持 GITHUB_RUN_OPENCODE_EXTRA_ENV,但本 PR 只在 feature-missing/action.yml 暴露 extra-env 输入;reviewspec-coveragearchitect-review 等同走该 Python 入口的 action 仍未暴露,存在"runtime 支持 / input 缺位"的不对称。安全层面建议同时在文档或脚本侧明示"extra-env 无法绕过本 action 锁定的 edit/bash deny 权限",或对权限相关 env 直接拒绝覆盖。

  3. [已确认] 语言指令冗余 / token 成本(performance + architecture 一致提出):

    • multi-review/src/reviewers.ts:46-58 对每个 reviewer 都附加约 200 字符 langInstruction,与 run-github-opencode.py:444-455 中的指令完全相同(dist/index.cjs 再次硬编码),存在三处文本同步问题
    • 所有 action 的 prompt 模板已显式列出中英文 verdict 关键词(如 架构合理 / SOUND),但 Python 脚本又在 prompt 末尾追加"使用关键词的其中文/英文版本"指令,职责重叠
    • 即使用户明确选择单语,每次调用仍同时携带两套关键词
      建议将语言指令收敛到单一来源(共享 yaml/json snippet 或常量模块),并根据 language 动态拼接单语种 prompt 以降低 token 成本。
  4. [安全建议] GITHUB_RUN_OPENCODE_PERMISSION 结构校验:已增加 dict 类型校验,建议进一步对 key(仅允许 edit/bash 等已知项)与值(仅允许 allow/deny/ask)做白名单校验,防止意外配置或被 extra-env 注入异常结构。

  5. [安全建议] 未来 prompt-injection 防御:当前语言指令通过字符串拼接追加到 PROMPTlanguage 已白名单约束属安全。若未来支持从 PR/issue 正文构造 prompt,需保留"PROMPT 为空时不追加"的短路逻辑,避免附加内容放大注入风险。

  6. [架构建议] GITHUB_RUN_OPENCODE_LANGUAGE 在五个 action.ymlenv: 块中重复声明:未来默认值或命名变更需逐处修改,建议集中到 setup-opencode / 共享 composite step,或在文档中明确"复制粘贴模式"是有意为之。

  7. [架构建议] 语言抽象层不一致:multi-review 在 TypeScript 层构造 reviewer prompt,其他 action 在 Python 层 prompt 末尾追加,两者抽象边界不同。短期可接受,长期建议统一到可被两端复用的语言指令 snippet。

  8. [性能建议-低优先级] run-github-opencode.py:425-432GITHUB_RUN_OPENCODE_MODEL / MODEL_NAME 各自调用了两次 get_env(),hot path 之外影响可忽略,仅作风格建议。


📋 各 Reviewer 详细审查结果
quality

(审查失败: fetch failed)

security

安全无虞

本次 PR 主要进行多语言支持的国际化改造(中文/英文),以及给 feature-missing 添加 extra-env 输入。整体未引入新的注入面、敏感数据外泄或鉴权绕过风险。语言开关由代码侧白名单 {"zh","en"} 控制并有 fallback,未拼接用户可控数据到 prompt 的执行路径;扩展的 extra-env 与已有其他 action 的处理保持一致,且来源是 workflow YAML(仓库写权限可控),并不放大攻击面。新增对 GITHUB_RUN_OPENCODE_PERMISSION 必须为 JSON 对象的类型校验、对覆盖敏感变量的 ::warning:: 提示属于防御性改进。

阻塞项:无

建议项:

  • github-run-opencode/run-github-opencode.py 中的 SENSITIVE_ENV_KEYS 列表不完整,遗漏了同文件已处理的 MINIMAX_API_KEYXIAOMI_API_KEY,建议补齐以让覆盖告警语义一致;同时可以考虑加入和权限相关的 key(如 OPENCODE_PERMISSIONUSE_GITHUB_TOKEN),避免静默被 extra-env 覆盖时无任何警示。
  • feature-missing/action.yml 在步骤 env 里硬编码了 GITHUB_RUN_OPENCODE_PERMISSION: {"edit":"deny","bash":"deny"},但新接入的 extra-env 允许后续覆盖任意环境变量。虽然输入受工作流文件控制,仍建议在文档/输入描述里明示"extra-env 无法绕过本 action 锁定的 edit/bash deny 权限"或在脚本侧对覆盖权限相关 env 直接拒绝,避免使用者无意中放开写权限造成供应链风险。
  • 语言指令通过字符串拼接追加到 PROMPT,目前 language 值已被白名单约束,安全。但当 PROMPT 来自外部输入(如未来支持从 PR/issue 正文构造 prompt)时,要继续注意 prompt-injection 不会被附加的语言指令"放大",建议保留当前"PROMPT 为空时不追加"的短路逻辑并在重构时维持。
  • run-github-opencode.py 中对 GITHUB_RUN_OPENCODE_PERMISSION 已增加 dict 类型校验,建议进一步对其值结构(key 仅允许 edit/bash 等已知项、值仅允许 allow/deny/ask)做白名单校验,防止意外配置或后续被 extra-env 注入异常结构。
performance

性能良好

本 PR 主要新增了 language 输入参数(zh/en)以支持中英双语 prompt,并为多个 action 添加了 README 中文文档与版本号升级(v2 → v3)。从性能角度看,所有变更均属于功能/文案层面的增量,未引入算法复杂度、内存、并发或 I/O 方面的回归。

阻塞项:无

建议项:

  • multi-review/src/reviewers.ts:46-58langInstruction 对每个 reviewer 都附加了一次(约 200 字符)。当用户配置较大的 review team 时(例如 8-10 个 reviewer),同一指令会被重复发送到 LLM 多次。可考虑把语言指令注入到共享上下文或仅注入一次以减少 token 成本(影响很小,非阻塞)。
  • 所有 action 的 prompt 模板现在以双语并列形式存在(例如 可合并 / CAN MERGE阻塞项" / "Blocking Issues"),即便用户明确选择单一语言也会同时携带两套关键词。每次调用都会多消耗几十个 token;功能上合理但可优化为根据 language 动态拼接单语种 prompt 以降低 token 成本。
  • github-run-opencode/run-github-opencode.py:425-432 的模型解析分支中,对 GITHUB_RUN_OPENCODE_MODEL / MODEL_NAME 各自调用了两次 get_env(),启动期 hot path 之外的影响可忽略,仅作风格建议。
  • loadReviewers 中的 langInstruction 在循环外计算(仅一次),prompt 拼接在循环内进行——这是正确做法;后续如需进一步减少分配,可预拼接 persona.prompt + langInstruction 后再 push,但收益极小,无需改动。
architecture

架构有疑虑

整体看这是一个 v2 → v3 的版本升级,统一增加 language 输入参数、双语 verdict 关键词、配套中文文档,主要在六个 action 入口和共享的 github-run-opencode.py 中落地。改动模式(输入声明 → 环境变量传递 → Python 端 prompt 拼接)与现有 model-timeout-seconds / cleanup-error-comments 等参数的处理路径一致。但存在若干非阻塞的一致性 / 抽象层冗余问题。

阻塞项:无

建议项:

  1. extra-env 输入覆盖不全(一致性 / Shotgun surgery)github-run-opencode.py 已经在共享层支持 GITHUB_RUN_OPENCODE_EXTRA_ENV,但本 PR 只在 feature-missing/action.yml 增加了 extra-env 输入;reviewspec-coveragearchitect-review 等同样走该 Python 入口的 action 仍未暴露该输入。如果意图是让 feature-missing 优先落地,建议在同一 PR 同步对齐其他入口,避免后续再次出现“runtime 支持 / input 缺位”的不对称。

  2. SENSITIVE_ENV_KEYS 集合不完整run-github-opencode.py:15SENSITIVE_ENV_KEYS 漏掉了 XIAOMI_API_KEYMINIMAX_API_KEYOPENCODE_GO_API_KEYOPENCODE_GO_API_KEY 等同等级的密钥(其他 API key 已在 env 拼接路径中处理)。建议从既有的 GITHUB_RUN_OPENCODE_*_API_KEY 列表中集中派生,而不是手工维护黑名单。

  3. 语言指令职责冗余(Layering):所有 action.yml 的 prompt 模板已经显式列出了中英文 verdict 关键词(如 架构合理 / SOUND无遗漏 / NO GAPS),但 run-github-opencode.py:444-466 又在 prompt 末尾追加了一段“使用关键词的其中文/英文版本”指令,两处职责重叠。建议把“关键词语言版本”的责任统一收敛到 action.yml 的 prompt 模板,Python 脚本只追加通用语言约束(不使用关键词的语言版本相关句子)。

  4. 跨层语言指令文本重复:multi-review 在 src/reviewers.ts:46-49 硬编码了与 run-github-opencode.py:444-455 完全相同的中英文指令串,且 dist/index.cjs 也再次硬编码(仅以转义形式)。一旦措辞调整需同步三处,建议抽到 multi-review 的常量模块或共享 yaml,与 Python 侧的指令统一来源。

  5. github-run-opencode 与 multi-review 的语言抽象层不一致:multi-review 通过 TypeScript 层构造 reviewer prompt;其他 action 走 Python 层在 prompt 末尾追加。两者都把“语言”视作 prompt 修饰,但抽象边界不同。短期可接受,长期建议把语言指令放到一个可被两端复用的 yaml / json snippet 中。

  6. GITHUB_RUN_OPENCODE_LANGUAGE 重复声明:同一环境变量在 architect-reviewreviewfeature-missingspec-coveragegithub-run-opencode 五个 action.ymlenv: 块中重复声明。如未来默认值或命名变更需逐处修改,建议集中到 setup-opencode / 共享 composite step,或在文档中明确“复制粘贴模式”是有意为之。

@Svtter Svtter merged commit 30d116c into main Jun 3, 2026
3 checks passed
@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