额外内容 — 自定义代理与代码审查¶
📎 额外实验 — 不属于 Copilot SDK。 此内容涵盖
.agent.md文件、一个 Copilot CLI 功能,而不是 Copilot SDK。它确实很有用,但属于选修,且与编号的 SDK 技术路线彼此独立。如果您是为了 SDK 而来,请从 实验 01 开始。
目标: 使用仓库中的自定义代理找出四个刻意保留的代码异味,并了解代理、指令和技能如何协同落实团队的代码审查标准。
时间: 约 20 分钟
先决条件: 实验 02 完成。您需要已登录的 GitHub Copilot CLI,或具有 Copilot Chat 的 VS Code。
⚠️ 请先阅读本节¶
您即将找到的问题是 刻意保留。它们的存在,是为了让审查确实有话可说。 请勿修正它们 — 实验 05 与审查指示文件都假设它们仍然存在。
您在此处的任务是 检测并描述,而不是修复。
步骤 1 — 查看已签入的内容¶
每个代理都是包含 YAML 前置字段的 Markdown 文件:
---
name: dotnet-reviewer
description: Senior .NET code reviewer specializing in C# best practices, security, and performance
tools: ['agent', 'read', 'search']
model: claude-sonnet-4.6
---
name— 调用代理时使用的名称description— 告诉 Copilot 何时使用此代理tools— 允许使用的能力;这些代理只具备只读工具,因此没有edit或bashmodel— 可选的指定模型
此处随附四个代理程序:
| 代理 | 用途 |
|---|---|
dotnet-reviewer |
C# 最佳实践、安全、性能 |
security-scanner |
漏洞与合规性问题 |
pr-summary |
根据差异生成 PR 描述 |
accessibility-auditor |
UI 程序代码的 WCAG 合规 |
步骤 2 — 了解共享内容¶
代理不会各自孤立运行。有两个配置文件会应用于整个仓库:
copilot-instructions.md— 每个代理程序都会遵循的编程标准(文件范围命名空间、非同步惯例、Result<T>而不是异常,依此类推)copilot-review-instructions.md— 审查专用内容:SDK 命名空间变更、SSE 清空缓冲区需求,以及刻意保留之代码异味的明确列表,避免审查者将它们误报为新错误
这种分层正是重点:标准存放在版本控制中,因此每位审查者 — 无论是人员还是代理程序 — 都会应用相同标准。
步骤 3 — 使用代理检查服务¶
针对包含大多数问题的文件运行 .NET 审查代理:
copilot --agent dotnet-reviewer -p "Review src/AgentOrchestrator/AgentHQDemo.Api/Services/RetailAnalyticsService.cs for performance and correctness issues. List each with severity and a suggested fix, but do not modify any files." --allow-all-tools
在 VS Code Copilot Chat 中,对等做法是:
步骤 4 — 对照答案检查发现¶
良好的审查应该找出全部四个问题。答案如下:
| # | 问题 | 位置 | 重要性 |
|---|---|---|---|
| 1 | N+1 查询 | GetTransactionsWithSegmentsAsync |
会加载所有交易,再针对每一行调用 PredictSegmentAsync — 每列多一次往返。10 笔种子数据尚可接受,1,000 万笔数据时则会造成严重问题 |
| 2 | 缺少空值检查 | GetTransactionAsync |
未防范标识符不存在的情况便直接返回,因此调用端可能对 null 进行取值。 |
| 3 | 未验证输入 | AddTransactionAsync |
接受未验证的输入 — 负数金额、空白客户标识符与不合理数值都会被持久保存。 |
| 4 | 硬编码的临界值 | PredictSegmentAsync |
某个神奇数字决定客户细分群体归属。变更商务规则时必须重新部署。 |
N+1 问题直接在代码中清晰可见 — 甚至已特别标注注释:
foreach (var txn in transactions)
{
// N+1: querying segments for every single transaction
var segment = await PredictSegmentAsync(txn.CustomerId);
...
}
💡 代理找到了几项?代理具有一定的非确定性,一次运行只找出四项中的三项并不罕见。这也说明:代理可以加快审查速度,但不能取代人工审查。
步骤 5 — 接着使用安全扫描器¶
不同代理会采用不同视角。安全扫描器应重点关注问题 3:
copilot --agent security-scanner -p "Scan src/AgentOrchestrator/AgentHQDemo.Api/Controllers/TransactionsController.cs and the service it calls for input validation and injection risks. Report findings only, make no edits." --allow-all-tools
比较两份输出。.NET 审查工具注重效率;安全扫描器注重信任边界。同一份代码,不同的优先级 — 这正是它们应该成为两个独立代理而不是一个通用代理的原因。
步骤 6 — 审核 UI 的无障碍功能¶
copilot --agent accessibility-auditor -p "Audit src/AgentOrchestrator/AgentHQDemo.Web/Components/ChatInput.razor and Header.razor for WCAG issues. Report only." --allow-all-tools
检查标签关联、键盘操作能力和流式消息区域的焦点管理。
步骤 7 — 生成 PR 摘要¶
存在未提交的更改时,pr-summary 会起草说明:
copilot --agent pr-summary -p "Summarise the current git diff as a pull request description." --allow-all-tools
✅ 检查点¶
- [x] 您能说明
.agent.mdfrontmatter 字段 - [x] 您已找到四个刻意保留的问题 — 并将它们保留在原处
- [x] 您已看到两个代理程序对相同代码得出不同结论
- [x] 您已了解指示文件如何为每个代理程序提供共享标准
💡 加分练习¶
编写第五个代理程序。创建 .github/agents/test-writer.agent.md ,并搭配
description ,用来说明应在何时触发,以及 tools: ['read', 'search']。请它针对以下项目提出(但不要编写)测试: PredictSegmentAsync.