已关闭
feat(lark): 集成 lark-cli 支持飞书群消息与 issue/PR 通知 #493
aflyingto创建于  8月4日关闭于  8月4日
aflyingto成员
8月4日 创建

Background

GitCode CLI(gc)目前只覆盖 GitCode 平台侧能力(issue/pr/release/actions 等),缺少向飞书群推送通知的渠道。团队已在本地验证官方 lark-cli(larksuite/cli,MIT,Go 实现)可用并完成 OAuth 登录,覆盖 IM/日历/文档/多维表格等 18 个域、200+ 命令,自带 OS keychain 凭证管理与令牌刷新。

希望让 gc 与 lark-cli 协同:用户安装 gc 后即可低门槛向飞书群发送消息,并在提交 issue/PR/CI 时可选地把结果回推到指定飞书群,供 AI 代理与脚本统一消费。

Proposal

采用子进程委托模型:gc 通过 exec 调用已安装的 lark-cli,复用其 OAuth/keychain/令牌刷新,不在 Go 侧重写飞书 OpenAPI 与认证。lark-cli 缺失时采用首次运行 lazy 检测并提示安装,不绑定到 gc 的安装流程。

新增 gc lark 命令域:

命令 作用
gc lark send --chat-id oc_xxx --text "..." 向飞书群/用户发送消息,支持 --text/--markdown/--file/--body-file,委托 lark-cli im +messages-send
gc lark auth status 查看 lark-cli 登录状态(委托 lark-cli auth status --json)
gc lark install 运行官方安装器 npx @larksuite/cli@latest install
gc lark doctor 检测 lark-cli 是否安装 + 登录是否就绪
gc lark config get/set --default-chat oc_xxx 管理默认飞书群

默认群路由:环境变量 GC_LARK_DEFAULT_CHAT_ID > ~/.config/gc/lark.json 的 default_chat_id > 命令行 --chat-id 覆盖。凭证不入 gc 配置(由 lark-cli keychain 管理)。

挂载通知 hook:在 gc issue create 与 gc pr create 增加 --notify-lark <chat-id> flag,创建成功后把 issue/PR 标题与链接回推到指定群(缺省时用默认群)。CI 类通知由通用 gc lark send 承载,不改动 actions 命令。

安全:gc lark send 的消息正文在提交前经 cmdutil.ScanContentForSecrets 扫描,避免 GC_TOKEN 等被推入飞书;飞书令牌始终由 lark-cli 管理,gc 不接触。

Acceptance Criteria

Alternatives

  • Go 原生实现飞书 OpenAPI:自包含但需重做 OAuth/令牌刷新/凭证存储,工作量大且与 lark-cli 配置不互通,放弃。
  • 打包阶段强依赖安装 lark-cli(PyPI wheel / deb postinst):耦合打包流程、跨平台复杂,改用首次运行 lazy 检测,降低耦合。
  • 命令命名 gc feishu:最终选 gc lark 与官方 lark-cli 品牌一致。
likedislike
Aaflyingto成员
8月4日 添加了label:agent-friendlyfeaturepriority:mediumrisk/lowscope/cli
aflyingto成员
8月4日 评论:

验证记录

  • 当前验证版本/分支:origin/main(commit 无 lark/feishu 集成)+ 本地分支 feat/lark-integration
  • 需求确认:用户已确认要在 gc 中适配 lark-cli,支持发送飞书群消息并在 issue/PR 创建时回推通知
  • 复现/核查命令:
    • git grep -il "lark-cli\|feishu\|飞书" origin/main -- 'pkg/**' 'api/**' → 空(无现存实现)
    • lark-cli --version → lark-cli version 1.0.82(官方工具可用)
    • lark-cli auth status → user 身份 ready,token valid(OAuth 链路通)
  • 结论:需求真实,无重复实现,设计方案(子进程委托 lark-cli + lazy 安装检测 + 默认群配置)可行。进入开发。
likedislike
Aaflyingto成员
8月4日 添加了label:status/in-progress, status/verified
aflyingto成员
8月4日 评论:

范围调整

经讨论,把「issue/pr create 挂载 --notify-lark 通知 hook」拆分到独立 Issue #494 跟踪,控制本期评审范围。

本期 #493 只交付独立的飞书发送与配套能力:

  • gc lark send(发送消息,支持 --text/--markdown/--file/--body-file,默认群路由)
  • gc lark auth status(登录状态)
  • gc lark install(lazy 安装)
  • gc lark doctor(安装+登录检测)
  • gc lark config get/set --default-chat(默认群管理)
  • 消息正文敏感信息扫描
  • pkg/larkcli 子进程委托包 + 单元测试

验收标准中「issue create --notify-lark」「pr create --notify-lark」两项移至 #494。其余验收项保持不变。

likedislike
Aaflyingto成员
8月4日 关联了pull request:feat(lark): 集成 lark-cli 支持飞书消息(含 --to-self 自通知)(#493)
aflyingto成员
8月4日 评论:

PR 已提交

PR #428: https://gitcode.com/gitcode-cli/cli/merge_requests/428
分支: feat/lark-integration | Base: main | Closes #493

交付内容

  • pkg/larkcli/ 子进程委托包(detect/run/install/config)+ 单测
  • pkg/cmd/lark/ 命令域:send(--chat-id/--user-id/--to-self 互斥 + 默认群回退,--text/--markdown/--file/--body-file,secret 扫描,--dry-run/--json)、auth status、install、doctor、config set|get + 单测
  • pkg/config/SecureWriteFile 导出复用
  • docs/COMMANDS.md lark 章节 + 环境变量
  • 真实命令验证:gc lark send --to-self(bot→user P2P 自通知,text/markdown/json 全通)、群消息、auth status、doctor、config 均通过

通知 hook 拆分

issue/pr --notify-lark 挂载 hook 已拆到 #494 跟踪。

待办(合并前)

  • 第一轮多角色评审(代码/安全/测试/文档)——需独立执行主体,非作者自检
  • 远端 CI(GitCode 原生 Linux + GitHub 镜像跨平台)
  • risk/high 改动需人工最终确认

工具问题(非本 PR 范围)

gc pr label 命令声称成功添加标签但 PR 实际标签未变,疑似 gc 自身 bug,另议。

likedislike
aflyingto成员
8月4日 评论:

最终状态(合并前门禁)

已完成

  • ✅ 作者自检(结构化,见 PR body)
  • ✅ 第一轮独立多角色评审:CHANGES-REQUESTED → 3 个 P1 + P2 全部修复(见 PR #428 评审修复评论)
    • exit 4 映射实现、openId 防御性兼容、覆盖率 64.1%→78.6%/78.2%
    • env 剥离 GC_TOKEN、stdin 不继承、复用 cmdutil、删死代码
  • ✅ 真实命令验证:gc lark send --to-self(exit 0)、成员权限错误→exit 4
  • ✅ 远端 CI(GitCode 原生 Linux):run 50 head a925660,Lint/Test/Build/Package 全 COMPLETED,无失败

剩余(合并前)

  • ⏳ risk/high 改动需人工最终确认(spec §5.8)—— 本改动为新增命令域+导出包装,未改写既有认证/配置路径,提请人工裁定是否可降为 risk/medium 后合并
  • ⏳ 可选:评审者对修复的复核(P1 已修,按 spec P1 非阻塞,第二轮评审按需)

CI 证据

  • GitCode Actions run 50: 81454db5055340febd85fe83e78052cb,head_sha a925660eb0caf671d91b7b0a352c38041f6a6b59
  • GitHub 镜像跨平台 CI:本仓库 PR 未镜像到 GitHub,无跨平台 run(如需可补)
likedislike
Aaflyingto成员
8月4日 关闭了 issue
Aaflyingto成员
8月4日 关联了pull request:docs: 飞书/Lark 通知首次使用指南 (LARK.md)