Skip to content

重构copilot会话 #191

@WhiteElephant-abc

Description

@WhiteElephant-abc

当前项目依旧处在无机密隔离,服务端单个脚本,负责全部的上下文、task构建和触发鉴权,GitHub Actions几乎仅负责跑Claude Code,另外,GitHub Actions会在每次运行Claude Code前创建issue当日志

我现在的目的:

对llm访问gh做完整的限制,从允许的写操作、允许的只读操作频率等,对llm的一切gh活动进行追溯:issue、comment、review、pr,对comment、pr等进行次数限制

另外,构建完整的上下文,格式markdown,包含触发处issue/pr上下文+pr关联issue上下文+llm自己账户对应fork仓库上下文+对应上游仓库上下文(等)

还包括llm陷入循环的识别,通过实时监听Claude Code输出实现(今天就因为陷入循环,编辑了我的review几十次)

对日志issue进行完整升级,触发时issue包含task和context,触发后comment对llm的issue、comment、pr、review的引用,comment完整的Claude Code会话记录,若出错(Claude Code报错或检测到循环),comment错误信息并给issue添加bug标记,若安全完成workflow,关闭issue为已完成(对了,这个issue有workflow标签,这是已经实现的机制,便于过滤日志issue)

完整的调用流程:

服务器:监听通知(@中可带上权限配置,如agent后续仅可对当前issue写comment,仅可对特定仓库写等等,下文均为默认限制)

推算触发节点(@智能体的那条消息)

触发者鉴权

获取完整上下文

分片传workflow

workflow:拿到完整数据

筛选

创建issue

创建用户:与机密隔离

配置Claude Code(新用户)

运行Claude Code

另一个进程:运行mcp(此进程可直接在runner用户跑,实际上是一个py脚本管理两个进程)

mcp监听Claude Code的gh调用

若两次写comment、pr、issue调用完全一致:拒绝

创建comment:同一issue、pr限制两次

创建issue:限制数量(默认同仓库1

创建pr:同仓库1次

gh api:使用专用的全站只读token并限制请求频率

禁止修改他人消息

默认禁止删库、非同会话评论不可删

llm发送的消息添加标记:

  • 指向对应日志issue的链接

  • 输入@WhiteElephantIsNotARobot go away以将WhiteElephantIsNotARobot从此仓库(若你是此仓库协作者)以及您的全部仓库屏蔽,并关闭WhiteElephantIsNotARobot创建的Pull Request、删除WhiteElephantIsNotARobot创建的comment

屏蔽消息同样由服务器匹配,识别触发者权限

屏蔽的仓库,agent的写操作在mcp侧被拒绝

屏蔽后,删除对应仓库的fork(这会关闭开放pr),删除对应仓库下issue/pr的comment(review不可删,故禁止llm发布review)

对了,discussion我一直没提,因为discussion较为复杂,最多接收discussion中的触发并获取上下文,agent是否允许写discussion待定

agent工作完成后,当前逻辑是发送两次消息,让Claude Code确认是否在GitHub留下回复、代码是否推送,现在可以直接根据mcp调用判断是否留下评论(或创建issue、pr等),若无,发送消息要求创建

接下来发送消息让agent确认更改是否推送,pr是否存在

最后,在issue留下指向agent创建的所有消息、issue、pr的链接供追溯

在issue留下Claude Code的会话记录(根据Claude Code输出的jsonl事件流进行markdown格式化解析)

若中途无报错,关闭issue

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions