Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions .github/workflows/ai-issue-analysis-cursor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: AI Issue Analysis (Cursor)

on:
workflow_dispatch:
inputs:
issue_number:
description: "Issue number to analyze"
required: true
type: number

jobs:
cursor-analysis:
runs-on: ubuntu-latest
permissions:
contents: read
issues: write
steps:
# 本仓库 CI 使用本地 action;接入方请改为 MistEO/ai-issue-analysis@main
- name: Analyze issue with Cursor
id: analysis
uses: ./
with:
ai-provider: cursor
cursor-api-key: ${{ secrets.CURSOR_API_KEY }}
github-token: ${{ secrets.GITHUB_TOKEN }}
bot-name: "@github-actions"

- name: Print outputs
if: always()
env:
ANALYSIS_PROMPT: ${{ steps.analysis.outputs.analysis-prompt }}
ISSUE_NUMBER: ${{ steps.analysis.outputs.issue-number }}
COMMENT_ID: ${{ steps.analysis.outputs.comment-id }}
COMMENT_URL: ${{ steps.analysis.outputs.comment-url }}
COPILOT_OUTPUT: ${{ steps.analysis.outputs.copilot-output }}
FINAL_CONCLUSION: ${{ steps.analysis.outputs.final-conclusion }}
run: |
printf '%s\n' "$ANALYSIS_PROMPT"
echo "issue_number=$ISSUE_NUMBER"
echo "comment_id=$COMMENT_ID"
echo "comment_url=$COMMENT_URL"
printf '%s\n' "$COPILOT_OUTPUT"
printf '%s\n' "$FINAL_CONCLUSION"
2 changes: 1 addition & 1 deletion .github/workflows/ai-issue-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
# - .claude/skills/generic-issue-log-analysis/SKILL.md
- name: Analyze issue with AI
id: analysis
uses: Misteo/ai-issue-analysis@main
uses: MistEO/ai-issue-analysis@main
with:
# 请在 https://github.com/settings/personal-access-tokens 添加一个token,填写到仓库 secret 里(请确保你有 Copilot Pro)
copilot-github-token: ${{ secrets.COPILOT_GITHUB_TOKEN }}
Expand Down
48 changes: 35 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# ai-issue-analysis

一个通用的 GitHub composite action,用来在 Issue 打开或被评论时调用 Copilot CLI 做分析,并把分析过程和最终结论持续回写到同一条评论里。
一个通用的 GitHub composite action,用来在 Issue 打开或被评论时调用 **Copilot CLI** 或 **Cursor CLI** 做分析,并把分析过程和最终结论持续回写到同一条评论里。

实战效果展示:

Expand All @@ -9,7 +9,9 @@

## 快速接入

1. 请确保你有 Copilot Pro (当前仅支持 Copilot,以后可能适配 codex 等更多工具,欢迎 ISSUE 催更~)
### 使用 GitHub Copilot

1. 请确保你有 Copilot Pro
2. 前往 [GitHub PAT](https://github.com/settings/personal-access-tokens) 新增一个 token

- Expiration (过期时间): 设为一年以内(太长反而会报错)
Expand All @@ -21,12 +23,28 @@
- Name: `COPILOT_GITHUB_TOKEN`
- Secret: 上一步中生成的那个

5. 把下面两个文件拷贝到你的仓库里,文件夹不要变
4. 把下面两个文件拷贝到你的仓库里,文件夹不要变

- [`.github/workflows/ai-issue-analysis.yml`](.github/workflows/ai-issue-analysis.yml)
- [`.claude/skills/generic-issue-log-analysis/SKILL.md`](.claude/skills/generic-issue-log-analysis/SKILL.md)

6. 新提个 issue 测试下能否正常运行了,或者在以前的 issue 里 `@github-actions`
5. 新提个 issue 测试下能否正常运行了,或者在以前的 issue 里 `@github-actions`

### 使用 Cursor CLI(可选)

1. 前往 [Cursor Dashboard](https://cursor.com/dashboard/integrations) 创建 API Key
2. 在仓库 Secrets 中添加 `CURSOR_API_KEY`
3. 调用 action 时指定 `ai-provider: cursor` 并传入 `cursor-api-key`:

```yaml
- uses: MistEO/ai-issue-analysis@main
with:
ai-provider: cursor
github-token: ${{ secrets.GITHUB_TOKEN }}
cursor-api-key: ${{ secrets.CURSOR_API_KEY }}
```

> 不传 `ai-provider` 时默认使用 Copilot,现有 workflow 无需改动。

> [!TIP]
>
Expand All @@ -44,7 +62,10 @@
如果你的 workflow_dispatch 输入名不是 `issue_number`,或者你在其他事件里调用这个 action,就显式传 `issue-number`。

- `github-token`: 用于创建和更新 Issue 评论
- `copilot-github-token`: Copilot CLI 使用的 Fine-grained token,支持传多个 token,每行一个,action 会随机选择一个使用
- `copilot-github-token`: Copilot CLI 使用的 Fine-grained token;`ai-provider=copilot` 时在运行时必填,支持传多个 token,每行一个,action 会随机选择一个使用
- `ai-provider`: AI 后端,`copilot`(默认)或 `cursor`
- `cursor-api-key`: Cursor CLI 使用的 API Key;`ai-provider=cursor` 时在运行时必填,支持多 key 换行随机选择
- `cursor-model`: Cursor CLI 模型名,默认 `composer-2.5`
- `bot-name`: 从 `issue_comment` 正文中剥离掉的 bot mention,比如 `@YourBot`
- `initial-comment-body`: 开始分析时先发出的评论正文
- `action-link-text`: 评论里展示的运行链接文字
Expand All @@ -62,19 +83,19 @@
- `issue-number`: 本次运行实际解析出的 Issue 编号
- `comment-id`: 创建并持续更新的评论 ID
- `comment-url`: 创建并持续更新的评论 URL
- `analysis-prompt`: 本次最终传给 Copilot 的 prompt
- `copilot-output`: 完整执行日志,包含 Copilot 启动前的参数打印、prompt 正文,以及 Copilot CLI 输出
- `final-conclusion`: Copilot 写入 `copilot-answer-file` 的最终结论
- `analysis-prompt`: 本次最终传给 AI 后端的 prompt
- `copilot-output`: 完整执行日志,包含启动前参数、prompt 正文,以及 Copilot CLI / Cursor CLI 输出
- `final-conclusion`: 写入 `copilot-answer-file` 的最终结论
- `analysis-prompt`、`copilot-output` 和 `final-conclusion` 在过长时会为适配 GitHub Actions output 大小限制而被截断;完整内容优先从 artifacts 读取

## 上传产物

- `copilot-output-issue-<issue-number>-comment-<comment-id>`: 完整执行日志,包含启动前参数、prompt 正文和 Copilot CLI 输出
- `copilot-output-issue-<issue-number>-comment-<comment-id>`: 完整执行日志,包含启动前参数、prompt 正文和 AI CLI 输出
- `final-conclusion-issue-<issue-number>-comment-<comment-id>`: 最终结论文本

## Skill 配合

- 这个 action 只负责 GitHub Actions 编排、评论更新、Copilot CLI 调用和 prompt 拼接,不内置项目领域知识
- 这个 action 只负责 GitHub Actions 编排、评论更新、AI CLI 调用和 prompt 拼接,不内置项目领域知识
- 对需要分析 issue 附件、日志包、运行时配置、跨仓库代码路径的项目,建议配套提供项目自己的 issue 分析 skill
- 一个可行的 skill 一般至少会覆盖这些步骤:读取 issue 正文和评论、定位并下载日志附件、先建立时间线再筛证据、最后回溯到代码和文档做归因
- 如果没有这层 skill,action 仍然能运行,但对日志包、截图、跨模块调用链这类问题,分析质量通常会明显下降
Expand All @@ -93,11 +114,12 @@

- action 内部会自动 `checkout` 调用方仓库
- 如果调用方已经自己 checkout,或者前置步骤会生成工作区文件,可以把 `checkout-repository` 设为 `false`
- 会自动安装 `@github/copilot`
- `ai-provider` 省略时默认 `copilot`,会自动安装 `@github/copilot`
- `ai-provider=cursor` 时会通过官方 [cursor.com/install](https://cursor.com/install) 安装 Cursor CLI 并调用 `cursor-agent`
- 会先创建一条评论,然后持续更新这条评论
- 会导出 `comment-id`、`comment-url`、`analysis-prompt`、`copilot-output`、`final-conclusion` 等 action outputs
- `copilot-output` 会包含 Copilot 启动前的参数打印和 prompt 正文,不再只是 Copilot 进程本身的 stdout/stderr
- 会上传 Copilot 原始输出和最终结论两个 artifacts
- `copilot-output` 会包含启动前的参数打印和 prompt 正文,不再只是 AI CLI 进程本身的 stdout/stderr
- 会上传 AI 原始输出和最终结论两个 artifacts
- 最终评论会包含最终结论、完整分析过程折叠块,以及当前 Actions 运行链接
- `copilot-github-token` 兼容单个 token,也兼容多个 token 按行填写;传多个时每次运行会随机选一个

Loading
Loading