规则文件和工作流仅适用于VSCode编辑器的Pro外网模型版本。
工作流程就是创建一个带有明确指令的文件,并定义一系列步骤和要求都写在 .md
文档中。以便指导CopilotCodePro完成任务;例如部署服务或提交PR。
在使用工作流程时,在聊天中键入/[workflow-name.md]
,让AI根据工作流程的描述自动完成工作。
工作流的魅力在于它们完全可以根据您的需求进行定制。您可以为各种重复性任务创建工作流,有了工作流,您的想象力将无限可能。所以将某件事描述为“我先做 X,然后做 Y,最后做 Z”这样就是一个完美的工作流程,所以可以从从困扰你的小事入手,将其转化为工作流程,并不断完善,来提升工作效率。比如以下场景:
- 发布流程:创建工作流自动提取已合并 PR、生成变更日志并处理版本更新。
- 项目初始化:新项目特别适合工作流程模式,初始化项目只需一条命令,即可完成目录构建、依赖安装与配置初始化。
- 报告生成:创建一个工作流聚合多源数据,并按照您喜欢的格式生成报告;结合图表库可视化,并可集成如 Slidev 等工具输出演示文稿。
- 消息通知:在提交 PR 后,工作流自动生成消息草稿并通过 Slack 或 WhatsApp 等 MCP 服务器发送给团队。
一、如何创建工作流程?
CopilotCodePro工作流程的创建方式和规则一样,均采用markdown的语法编写。
新增工作流程分为全局工作流和当前工作区的工作流,可以根据需要选择创建全局工作流还是当前工作区的工作流。
您可以通过单击 管理CopilotCodePro规则和工作流的图标,进入规则选项卡,点击中的 + 按钮来创建工作流。这将在您的 IDE 中打开一个新文件,您可以使用它来编写工作流。保存工作流文件后,您可以在工作流选项卡中看到它。
- 全局工作流:将会存储在本地安装的
Documents/CopilotCodePro/workflow/
目录中,对使用插件的所有项目生效。 - 当前工作区工作流:将会存储在当前工作区的
.CopilotCodeProrules/workflow/
目录中,只对当前工作区的项目生效。

添加完成后,可在工作流文件中填写内容,详情见pr-review.md的DEMO示例。
二、如何使用和管理工作流程?
在使用时,只需要在聊天中键入/[workflow-name.md]
,然后结合你的提示词,智效代码就会根据工作流程的描述和提示词自动完成工作。
比如,我们在执行pr-review这个工作流时,用/
选中pr-review.md
,同时告知要评审的pr(如#27),即:/pr-review.md d对#27进行review

您可以通过单击 管理CopilotCodePro规则和工作流的图标,进入工作流选项卡,选中某个工作流文件右侧的开关,进行切换上下文和管理不同工作流的操作;

三、DEMO示例
pr-review.md文件内容如下:
# GitHub PR 审查流程(Git + API 替代方案)
此工作流使用 Git 命令和 GitHub API(通过 curl)来替代 `gh` 命令。并用 GitHub token 来访问 API。请使用它来审查您要求我审查的 PR。
## 前置条件
1. 设置 GitHub Personal Access Token:
```bash
# 将 GitHub token 设置为环境变量 {/*将-github-token-设置为环境变量*/}
export GITHUB_TOKEN="your_github_token_here"
# 或在项目根目录创建 .env 文件 {/*或在项目根目录创建-env-文件*/}
echo "GITHUB_TOKEN=your_github_token_here" >> .env
```
2. 获取仓库信息:
```bash
# 获取当前仓库信息 {/*获取当前仓库信息*/}
REPO_OWNER=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\1/')
REPO_NAME=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\2/')
echo "仓库: $REPO_OWNER/$REPO_NAME"
```
<详细步骤序列>
## 1. 收集 PR 信息
1. 获取 PR 基本信息(标题、描述、状态):
```bash
PR_NUMBER=<PR-编号>
# 通过 GitHub API 获取 PR 详情 {/*通过-github-api-获取-pr-详情*/}
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER" | \
jq '{title: .title, body: .body, state: .state, user: .user.login, head: .head.ref, base: .base.ref}'
```
2. 获取 PR 评论:
```bash
# 获取一般评论 {/*获取一般评论*/}
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/issues/$PR_NUMBER/comments" | \
jq '.[] | {user: .user.login, body: .body, created_at: .created_at}'
# 获取代码审查评论(特定行评论) {/*获取代码审查评论特定行评论*/}
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER/comments" | \
jq '.[] | {user: .user.login, body: .body, path: .path, line: .line}'
```
3. 获取 PR 文件和差异:
```bash
# 获取 PR 中变更的文件列表 {/*获取-pr-中变更的文件列表*/}
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER/files" | \
jq '.[] | {filename: .filename, status: .status, additions: .additions, deletions: .deletions}'
# 使用 git 获取差异 {/*使用-git-获取差异*/}
git fetch origin pull/$PR_NUMBER/head:pr-$PR_NUMBER
git diff $(git merge-base origin/main pr-$PR_NUMBER)..pr-$PR_NUMBER
# 替代方案:通过 API 获取差异 {/*替代方案通过-api-获取差异*/}
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3.diff" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER" > pr-$PR_NUMBER.diff
```
## 2. 理解上下文
1. 使用 git 识别修改的文件:
```bash
# 获取修改文件列表 {/*获取修改文件列表*/}
git diff --name-only $(git merge-base origin/main pr-$PR_NUMBER)..pr-$PR_NUMBER
# 获取详细文件变更统计 {/*获取详细文件变更统计*/}
git diff --stat $(git merge-base origin/main pr-$PR_NUMBER)..pr-$PR_NUMBER
```
2. 检查主分支中的原始文件:
```xml
<read_file>
<path>文件路径</path>
</read_file>
```
3. 检查特定文件变更:
```bash
# 显示特定文件的变更 {/*显示特定文件的变更*/}
git diff $(git merge-base origin/main pr-$PR_NUMBER)..pr-$PR_NUMBER -- 文件路径
# 显示不同时间点的文件内容 {/*显示不同时间点的文件内容*/}
git show origin/main:文件路径 # 主分支版本
git show pr-$PR_NUMBER:文件路径 # PR 版本
```
4. 使用 search_files 进行深入分析:
```xml
<search_files>
<path>目录路径</path>
<regex>搜索词</regex>
<file_pattern>*.ts</file_pattern>
</search_files>
```
## 3. 检查 PR 状态和审查
1. 获取 PR 审查:
```bash
# 获取现有审查 {/*获取现有审查*/}
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER/reviews" | \
jq '.[] | {user: .user.login, state: .state, body: .body, submitted_at: .submitted_at}'
```
2. 获取 CI/CD 状态:
```bash
# 获取状态检查 {/*获取状态检查*/}
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/commits/$(git rev-parse pr-$PR_NUMBER)/status" | \
jq '{state: .state, total_count: .total_count, statuses: .statuses}'
# 获取检查运行(用于 GitHub Actions) {/*获取检查运行用于-github-actions*/}
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/commits/$(git rev-parse pr-$PR_NUMBER)/check-runs" | \
jq '.check_runs[] | {name: .name, status: .status, conclusion: .conclusion}'
```
## 4. 分析变更
1. 对于每个修改的文件,了解:
- **变更内容** - 具体修改了什么
- **变更原因** - 基于 PR 描述分析为什么要修改
- **影响范围** - 对代码库的影响
- **潜在副作用** - 可能引起的问题
2. 重点检查:
- **代码质量问题** - 代码风格、架构设计
- **潜在错误** - 逻辑错误、边界条件
- **性能影响** - 性能优化或劣化
- **安全问题** - 安全漏洞或风险
- **测试覆盖率** - 是否有足够的测试
3. 运行代码分析(如果可用):
```xml
<use_mcp_tool>
<server_name>qihoo-code-security</server_name>
<tool_name>qihoo_code_security_scan</tool_name>
<arguments>
{
"filename": "相对路径",
"content": "文件内容",
"language": "编程语言"
}
</arguments>
</use_mcp_tool>
```
## 5. 寻求用户确认
```xml
<ask_followup_question>
<question>基于我对 PR #<PR-编号> 的审查,我建议 [批准/请求修改]。理由如下:
[详细的理由,包含 PR 质量、实现方式和任何关注点的要点]
您希望我继续执行这个建议吗?</question>
<options>["是的,批准 PR", "是的,请求修改", "不,我想进一步讨论"]</options>
</ask_followup_question>
```
## 6. 询问用户是否需要起草评论
```xml
<ask_followup_question>
<question>您希望我为这个 PR 起草一个您可以复制粘贴的评论吗?</question>
<options>["是的,请起草评论", "不用,我自己处理评论"]</options>
</ask_followup_question>
```
## 7. 通过 GitHub API 提交审查
1. 批准 PR:
```bash
# 创建批准审查 {/*创建批准审查*/}
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER/reviews" \
-d '{
"event": "APPROVE",
"body": "感谢这个 PR!实现看起来不错。\n\n我特别喜欢您处理 X 和 Y 的方式。\n\n很棒的工作!"
}'
```
2. 请求修改:
```bash
# 创建请求修改审查 {/*创建请求修改审查*/}
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER/reviews" \
-d '{
"event": "REQUEST_CHANGES",
"body": "感谢这个 PR!\n\n实现看起来很有前景,但有几个问题需要解决:\n\n1. 问题一\n2. 问题二\n\n请做这些修改,然后我们可以合并。"
}'
```
3. 添加一般评论:
```bash
# 添加不带审查的评论 {/*添加不带审查的评论*/}
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/issues/$PR_NUMBER/comments" \
-d '{
"body": "您的评论内容"
}'
```
4. 添加特定行的审查评论:
```bash
# 在特定行添加审查评论 {/*在特定行添加审查评论*/}
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/pulls/$PR_NUMBER/comments" \
-d '{
"body": "您的特定行评论",
"commit_id": "'"$(git rev-parse pr-$PR_NUMBER)"'",
"path": "文件路径",
"line": 42
}'
```
## 8. 清理
```bash
# 删除临时 PR 分支 {/*删除临时-pr-分支*/}
git branch -D pr-$PR_NUMBER
# 移除创建的差异文件 {/*移除创建的差异文件*/}
rm -f pr-$PR_NUMBER.diff
```
</详细步骤序列>
## 辅助函数
您可以在 shell 配置文件中创建这些辅助函数:
```bash
# 获取 PR 信息的函数 {/*获取-pr-信息的函数*/}
get_pr_info() {
local pr_number=$1
local repo_owner=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\1/')
local repo_name=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\2/')
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$repo_owner/$repo_name/pulls/$pr_number"
}
# 批准 PR 的函数 {/*批准-pr-的函数*/}
approve_pr() {
local pr_number=$1
local message="${2:-看起来不错!批准这个 PR。}"
local repo_owner=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\1/')
local repo_name=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\2/')
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$repo_owner/$repo_name/pulls/$pr_number/reviews" \
-d "{\"event\": \"APPROVE\", \"body\": \"$message\"}"
}
# 请求修改的函数 {/*请求修改的函数*/}
request_changes() {
local pr_number=$1
local message="${2:-请解决审查中提到的问题。}"
local repo_owner=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\1/')
local repo_name=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\2/')
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$repo_owner/$repo_name/pulls/$pr_number/reviews" \
-d "{\"event\": \"REQUEST_CHANGES\", \"body\": \"$message\"}"
}
# 获取 PR 文件变更的函数 {/*获取-pr-文件变更的函数*/}
get_pr_files() {
local pr_number=$1
local repo_owner=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\1/')
local repo_name=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\2/')
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$repo_owner/$repo_name/pulls/$pr_number/files" | \
jq '.[] | {filename: .filename, status: .status, additions: .additions, deletions: .deletions}'
}
# 获取 PR 差异的函数 {/*获取-pr-差异的函数*/}
get_pr_diff() {
local pr_number=$1
local repo_owner=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\1/')
local repo_name=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\2/')
curl -H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3.diff" \
"https://api.github.com/repos/$repo_owner/$repo_name/pulls/$pr_number"
}
```
## 示例用法
```bash
# 设置 PR 审查环境 {/*设置-pr-审查环境*/}
export GITHUB_TOKEN="your_token"
PR_NUMBER=123
# 获取 PR 信息 {/*获取-pr-信息*/}
get_pr_info $PR_NUMBER | jq '{title: .title, state: .state, user: .user.login}'
# 获取变更的文件 {/*获取变更的文件*/}
get_pr_files $PR_NUMBER
# 拉取 PR 分支 {/*拉取-pr-分支*/}
git fetch origin pull/$PR_NUMBER/head:pr-$PR_NUMBER
# 审查变更 {/*审查变更*/}
git diff $(git merge-base origin/main pr-$PR_NUMBER)..pr-$PR_NUMBER
# 分析完成后,批准或请求修改 {/*分析完成后批准或请求修改*/}
approve_pr $PR_NUMBER "很棒的工作!这个实现很扎实。"
# 或 {/*或*/}
request_changes $PR_NUMBER "请为新功能添加单元测试。"
```
## 高级用法
### 批量审查多个 PR
```bash
# 审查多个 PR {/*审查多个-pr*/}
review_multiple_prs() {
local pr_numbers=("$@")
for pr in "${pr_numbers[@]}"; do
echo "审查 PR #$pr..."
get_pr_info $pr | jq '{title: .title, state: .state}'
git fetch origin pull/$pr/head:pr-$pr
git diff --stat $(git merge-base origin/main pr-$pr)..pr-$pr
echo "---"
done
}
# 使用示例 {/*使用示例*/}
review_multiple_prs 123 124 125
```
### 自动化安全检查
```bash
# 检查 PR 中的敏感信息 {/*检查-pr-中的敏感信息*/}
check_pr_security() {
local pr_number=$1
git fetch origin pull/$pr_number/head:pr-$pr_number
# 检查是否有敏感文件
git diff --name-only $(git merge-base origin/main pr-$pr_number)..pr-$pr_number | \
grep -E '\.(key|pem|p12|pfx)$' && echo "警告:发现潜在的敏感文件"
# 检查是否有硬编码的密码或密钥
git diff $(git merge-base origin/main pr-$pr_number)..pr-$pr_number | \
grep -i -E '(password|secret|key|token).*=.*["'"'"'][^"'"'"']*["'"'"']' && echo "警告:发现潜在的硬编码凭据"
}
```
### 生成审查报告
```bash
# 生成 PR 审查报告 {/*生成-pr-审查报告*/}
generate_pr_report() {
local pr_number=$1
local repo_owner=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\1/')
local repo_name=$(git remote get-url origin | sed 's/.*github\.com[:/]\([^/]*\)\/\([^./]*\).*/\2/')
echo "# PR #$pr_number 审查报告"
echo
echo "## 基本信息"
get_pr_info $pr_number | jq -r '"标题: " + .title, "作者: " + .user.login, "状态: " + .state'
echo
echo "## 文件变更"
get_pr_files $pr_number | jq -r '"- " + .filename + " (" + (.additions|tostring) + " 增加, " + (.deletions|tostring) + " 删除)"'
echo
echo "## 代码统计"
git fetch origin pull/$pr_number/head:pr-$pr_number
git diff --stat $(git merge-base origin/main pr-$pr_number)..pr-$pr_number
}
```
这些优化版本提供了完整的 PR 审查功能,无需依赖 `gh` 命令,而是使用标准的 Git 命令和 GitHub API。