|
| 1 | +# Task Checker 优先级设置指南 |
| 2 | + |
| 3 | +## 概述 |
| 4 | + |
| 5 | +Task Checker 支持两种方式识别 Issue 的优先级: |
| 6 | + |
| 7 | +1. **GitHub Labels(标签)** - 简单直接 |
| 8 | +2. **GitHub Projects V2 字段** - 功能强大但需要额外配置 |
| 9 | + |
| 10 | +## 方法 1: 使用 Labels(推荐用于简单场景) |
| 11 | + |
| 12 | +### 设置步骤 |
| 13 | + |
| 14 | +1. **创建优先级标签** |
| 15 | + |
| 16 | + 在仓库中创建以下标签: |
| 17 | + - `P0` - 最高优先级(紧急) |
| 18 | + - `P1` - 重要优先级 |
| 19 | + - `P2` - 一般优先级 |
| 20 | + |
| 21 | +2. **给 Issue 添加标签** |
| 22 | + |
| 23 | + 为需要检查的 Task Issue 添加对应的优先级标签。 |
| 24 | + |
| 25 | +3. **配置文件** |
| 26 | + |
| 27 | + 在 `config/task-checker.yml` 中配置: |
| 28 | + ```yaml |
| 29 | + priority_pattern: "^P([012])$" # 匹配 P0, P1, P2 标签 |
| 30 | + ``` |
| 31 | +
|
| 32 | +### 优点 |
| 33 | +- ✅ 简单直接,易于设置 |
| 34 | +- ✅ 无需额外 API 权限 |
| 35 | +- ✅ 在 Issue 列表中可见 |
| 36 | +
|
| 37 | +### 缺点 |
| 38 | +- ❌ 标签会显示在 Issue 上,可能造成视觉混乱 |
| 39 | +- ❌ 无法使用 Projects 的高级功能(看板、视图等) |
| 40 | +
|
| 41 | +## 方法 2: 使用 GitHub Projects V2 字段 |
| 42 | +
|
| 43 | +### 设置步骤 |
| 44 | +
|
| 45 | +1. **创建 GitHub Project** |
| 46 | +
|
| 47 | + - 进入组织或仓库 |
| 48 | + - 创建一个新的 Project (Projects V2) |
| 49 | +
|
| 50 | +2. **添加优先级字段** |
| 51 | +
|
| 52 | + 在 Project 中添加一个 **Single Select** 类型的自定义字段: |
| 53 | + - 字段名称:`Priority` 或 `优先级` |
| 54 | + - 选项值: |
| 55 | + - `P0` - 紧急 |
| 56 | + - `P1` - 重要 |
| 57 | + - `P2` - 一般 |
| 58 | + |
| 59 | +3. **添加 Issues 到 Project** |
| 60 | + |
| 61 | + - 将需要检查的 Task Issues 添加到 Project |
| 62 | + - 为每个 Issue 设置优先级字段 |
| 63 | + |
| 64 | +4. **配置 GitHub Token 权限** |
| 65 | + |
| 66 | + **重要:** 使用 Projects V2 需要特殊的 API 权限。 |
| 67 | + |
| 68 | + 目前 GitHub 的 REST API Search 不返回 Projects V2 数据,需要使用 **GraphQL API**。 |
| 69 | + |
| 70 | +### 当前限制 |
| 71 | + |
| 72 | +⚠️ **注意:** 当前版本的 `get_priority_from_project()` 函数期望 Issue 对象包含 `projectItems` 字段,但标准的 REST API Search 不会返回这个字段。 |
| 73 | + |
| 74 | +要使用 Project 字段功能,需要: |
| 75 | + |
| 76 | +#### 选项 A: 使用 GraphQL API(需要代码修改) |
| 77 | + |
| 78 | +修改 `search_issues()` 函数使用 GraphQL API 查询: |
| 79 | + |
| 80 | +```graphql |
| 81 | +query { |
| 82 | + search(query: "repo:owner/name is:issue is:open label:Task", type: ISSUE, first: 100) { |
| 83 | + nodes { |
| 84 | + ... on Issue { |
| 85 | + number |
| 86 | + title |
| 87 | + url |
| 88 | + updatedAt |
| 89 | + projectItems(first: 10) { |
| 90 | + nodes { |
| 91 | + fieldValues(first: 20) { |
| 92 | + nodes { |
| 93 | + ... on ProjectV2ItemFieldSingleSelectValue { |
| 94 | + field { |
| 95 | + ... on ProjectV2FieldCommon { |
| 96 | + name |
| 97 | + } |
| 98 | + } |
| 99 | + name |
| 100 | + } |
| 101 | + } |
| 102 | + } |
| 103 | + } |
| 104 | + } |
| 105 | + } |
| 106 | + } |
| 107 | + } |
| 108 | +} |
| 109 | +``` |
| 110 | + |
| 111 | +#### 选项 B: 暂时使用 Labels |
| 112 | + |
| 113 | +在 Projects V2 完全支持之前,建议使用 **Labels** 方式设置优先级。 |
| 114 | + |
| 115 | +## 混合使用 |
| 116 | + |
| 117 | +Bot 会自动尝试两种方式: |
| 118 | +1. 首先检查 Labels |
| 119 | +2. 如果没有找到,尝试检查 Project 字段 |
| 120 | + |
| 121 | +这样可以同时支持两种方式,灵活使用。 |
| 122 | + |
| 123 | +## 检查优先级设置是否生效 |
| 124 | + |
| 125 | +### 运行 verbose 模式 |
| 126 | + |
| 127 | +```bash |
| 128 | +python src/main.py task-checker --verbose |
| 129 | +``` |
| 130 | + |
| 131 | +### 查看输出 |
| 132 | + |
| 133 | +``` |
| 134 | +找到 15 个 Task 标签的 Issue |
| 135 | + |
| 136 | +检查 Issue #123: 修复登录问题 |
| 137 | + ⊘ 跳过: 未设置优先级(无标签或Project字段) |
| 138 | + |
| 139 | +检查 Issue #124: 性能优化 |
| 140 | + 优先级: P1, 超时阈值: 48h, 距上次更新: 50.2h |
| 141 | + ✓ 发送超时提醒 |
| 142 | +``` |
| 143 | +
|
| 144 | +### 查看摘要报告 |
| 145 | +
|
| 146 | +摘要会显示详细的统计信息: |
| 147 | +
|
| 148 | +```markdown |
| 149 | +### ⏰ 任务检查器 (Task Checker) |
| 150 | +- **问题总数 (Task标签):** 15 |
| 151 | +- **检查的问题 (有优先级):** 10 |
| 152 | +- **发送提醒:** 3 📬 |
| 153 | +- **跳过的问题:** 5 |
| 154 | + - 未设置优先级 (无Project/标签): 5 |
| 155 | +``` |
| 156 | + |
| 157 | +**解读:** |
| 158 | +- 找到 15 个有 Task 标签的 Issue |
| 159 | +- 其中 10 个设置了优先级(通过 Label 或 Project) |
| 160 | +- 5 个没有设置优先级,被跳过 |
| 161 | + |
| 162 | +## 故障排除 |
| 163 | + |
| 164 | +### 问题:检查的问题为 0 |
| 165 | + |
| 166 | +**原因:** 所有 Issue 都没有设置优先级。 |
| 167 | + |
| 168 | +**解决方案:** |
| 169 | +1. 检查是否创建了 P0/P1/P2 标签 |
| 170 | +2. 检查 Issue 是否添加了这些标签 |
| 171 | +3. 如果使用 Projects,确认: |
| 172 | + - Issue 已添加到 Project |
| 173 | + - Priority 字段已设置 |
| 174 | + - API 返回了 `projectItems` 数据(当前可能不支持) |
| 175 | + |
| 176 | +### 问题:使用 Project 但优先级识别失败 |
| 177 | + |
| 178 | +**原因:** REST API Search 不返回 Projects V2 数据。 |
| 179 | + |
| 180 | +**解决方案:** |
| 181 | +1. 临时使用 Labels 方式 |
| 182 | +2. 等待代码更新支持 GraphQL API |
| 183 | +3. 或者自行修改代码使用 GraphQL |
| 184 | + |
| 185 | +### 问题:部分 Issue 被跳过 |
| 186 | + |
| 187 | +查看 verbose 输出和摘要报告的详细统计: |
| 188 | +- **未设置优先级**: 没有 Label 也没有 Project 字段 |
| 189 | +- **优先级不在检查范围**: 比如设置了 P3,但配置只检查 P0/P1/P2 |
| 190 | +- **未配置超时**: 比如设置了 P1,但配置文件中没有 P1 的 `timeout_hours` |
| 191 | +- **未超时**: 有优先级且距上次更新时间未超过阈值 |
| 192 | + |
| 193 | +## 推荐配置 |
| 194 | + |
| 195 | +### 简单场景(小团队/少量仓库) |
| 196 | + |
| 197 | +使用 **Labels** 方式: |
| 198 | + |
| 199 | +```yaml |
| 200 | +# config/task-checker.yml |
| 201 | +task_label: Task |
| 202 | +priority_pattern: "^P([012])$" |
| 203 | + |
| 204 | +priorities_to_check: |
| 205 | + - P0 |
| 206 | + - P1 |
| 207 | + - P2 |
| 208 | + |
| 209 | +timeout_hours: |
| 210 | + P0: 24 # 24小时 |
| 211 | + P1: 48 # 48小时 |
| 212 | + P2: 120 # 5天 |
| 213 | +``` |
| 214 | +
|
| 215 | +### 复杂场景(大团队/多仓库) |
| 216 | +
|
| 217 | +未来支持 Projects V2 后: |
| 218 | +
|
| 219 | +```yaml |
| 220 | +# config/task-checker.yml |
| 221 | +task_label: Task |
| 222 | +use_project_priority: true # 优先使用 Project 字段 |
| 223 | +priority_pattern: "^P([012])$" # 作为备用 |
| 224 | + |
| 225 | +priorities_to_check: |
| 226 | + - P0 |
| 227 | + - P1 |
| 228 | + - P2 |
| 229 | + |
| 230 | +timeout_hours: |
| 231 | + P0: 12 # 12小时(紧急) |
| 232 | + P1: 48 # 48小时(重要) |
| 233 | + P2: 168 # 7天(一般) |
| 234 | +``` |
| 235 | +
|
| 236 | +## 相关配置 |
| 237 | +
|
| 238 | +### task-checker.yml 完整示例 |
| 239 | +
|
| 240 | +```yaml |
| 241 | +# 扫描模式: "repo" 或 "org" |
| 242 | +scan_mode: org |
| 243 | + |
| 244 | +# 组织名称(scan_mode=org 时使用) |
| 245 | +org: mcpp-community |
| 246 | + |
| 247 | +# 仓库名称(scan_mode=repo 时使用) |
| 248 | +# repo: mcpp-community/mcpp-bot |
| 249 | + |
| 250 | +# 任务标签 |
| 251 | +task_label: Task |
| 252 | + |
| 253 | +# 优先级标签匹配模式 |
| 254 | +priority_pattern: "^P([012])$" |
| 255 | + |
| 256 | +# 需要检查的优先级 |
| 257 | +priorities_to_check: |
| 258 | + - P0 |
| 259 | + - P1 |
| 260 | + - P2 |
| 261 | + |
| 262 | +# 超时时间配置(小时) |
| 263 | +timeout_hours: |
| 264 | + P0: 24 # 24小时 |
| 265 | + P1: 48 # 48小时 |
| 266 | + P2: 120 # 5天 |
| 267 | + |
| 268 | +# 排除的仓库(可选) |
| 269 | +exclude_repos: |
| 270 | + - mcpp-community/archived-repo |
| 271 | + - test-repo |
| 272 | + |
| 273 | +# 提醒消息模板(可选) |
| 274 | +reminder_template: | |
| 275 | + ⏰ **任务提醒** |
| 276 | +
|
| 277 | + {assignees} 这个 {priority} 优先级的任务已经 {hours:.1f} 小时没有更新了。 |
| 278 | +
|
| 279 | + 请及时更新进度或状态。 |
| 280 | +
|
| 281 | + **Issue:** {title} |
| 282 | + **超时阈值:** {timeout} 小时 |
| 283 | +
|
| 284 | +# 是否提醒未分配的任务(可选) |
| 285 | +notify_unassigned: false |
| 286 | + |
| 287 | +# 未分配任务的默认提及(可选) |
| 288 | +default_mention: "@team" |
| 289 | +``` |
| 290 | +
|
| 291 | +## 总结 |
| 292 | +
|
| 293 | +- ✅ **现在推荐**:使用 Labels (P0, P1, P2) 方式 |
| 294 | +- 🚧 **未来支持**:GitHub Projects V2 字段(需要 GraphQL API) |
| 295 | +- 📊 **新增功能**:详细的跳过原因统计 |
| 296 | +- 🔍 **调试工具**:verbose 模式显示每个 issue 的处理过程 |
0 commit comments