以下是内容的中文翻译,保持原有格式不变:
name: managing-relationships description: 擅长使用 GraphQL API 管理 GitHub 问题关系,包括父子问题、阻塞依赖关系和跟踪链接。在创建问题层级、设置父子关系、管理依赖关系或链接相关问题时自动调用。 version: 1.0.0 allowed-tools: 读权限,Bash,Grep,Glob
管理关系技能
你是使用 GraphQL API 管理 GitHub 问题关系的专家。这项技能提供了标准 gh issue CLI 之外的能力,能够正确地建立父子层级、依赖跟踪和问题链接。
何时使用此技能
自动调用此技能时涉及以下内容:
- 创建父子问题关系(子问题)
- 设置问题层级或史诗
- 管理阻塞/被阻塞依赖关系
- 链接相关问题
- 查询问题关系图
- 关键词:“父问题”, “子问题”, “子问题”, “被阻塞”, “阻塞”, “依赖于”, “史诗”, “层级”
你的能力
1. 子问题管理(父子)
使用 GitHub 的子问题功能创建明确的父子关系。
添加子问题:
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue \
--parent 67 \
--child 68
移除子问题:
python3 {baseDir}/scripts/manage-relationships.py remove-sub-issue \
--parent 67 \
--child 68
列出子问题:
python3 {baseDir}/scripts/manage-relationships.py list-sub-issues --issue 67
2. 依赖关系管理(阻塞)
跟踪问题之间的阻塞依赖关系。
查看依赖关系:
python3 {baseDir}/scripts/manage-relationships.py show-dependencies --issue 68
3. 关系查询
查询复杂关系图。
获取父问题:
python3 {baseDir}/scripts/manage-relationships.py get-parent --issue 68
获取所有关系:
python3 {baseDir}/scripts/manage-relationships.py show-all --issue 67
GraphQL API 参考
关键突变
addSubIssue
创建父子关系。
mutation {
addSubIssue(input: {
issueId: "PARENT_NODE_ID",
subIssueId: "CHILD_NODE_ID"
}) {
issue { number title }
subIssue { number title }
}
}
输入字段:
issueId(必需): 父问题节点 IDsubIssueId: 子问题节点 IDsubIssueUrl: 替代 - 子问题 URLreplaceParent: 布尔值替换现有父问题
removeSubIssue
移除父子关系。
mutation {
removeSubIssue(input: {
issueId: "PARENT_NODE_ID",
subIssueId: "CHILD_NODE_ID"
}) {
issue { number }
subIssue { number }
}
}
reprioritizeSubIssue
重新排序父问题内的子问题。
mutation {
reprioritizeSubIssue(input: {
issueId: "PARENT_NODE_ID",
subIssueId: "CHILD_NODE_ID",
afterId: "SIBLING_NODE_ID"
}) {
issue { number }
}
}
关键查询字段
问题关系
query {
repository(owner: "OWNER", name: "REPO") {
issue(number: 67) {
# 父子
parent { number title }
subIssues(first: 50) {
nodes { number title state }
}
subIssuesSummary {
total
completed
percentCompleted
}
# 依赖关系
blockedBy(first: 10) {
nodes { number title }
}
blocking(first: 10) {
nodes { number title }
}
# 跟踪(来自任务列表)
trackedInIssues(first: 10) {
nodes { number title }
}
trackedIssues(first: 10) {
nodes { number title }
}
trackedIssuesCount
}
}
}
直接 GraphQL 使用
对于脚本未覆盖的操作,直接使用 gh api graphql:
获取问题节点 ID
gh api graphql -f query=
query {
repository(owner: "OWNER", name: "REPO") {
issue(number: 67) { id }
}
}
添加多个子问题
gh api graphql -f query=
mutation {
add1: addSubIssue(input: {issueId: "PARENT_ID", subIssueId: "CHILD1_ID"}) {
subIssue { number }
}
add2: addSubIssue(input: {issueId: "PARENT_ID", subIssueId: "CHILD2_ID"}) {
subIssue { number }
}
}
查询完整层级
gh api graphql -f query=
query {
repository(owner: "OWNER", name: "REPO") {
issue(number: 67) {
number
title
subIssues(first: 100) {
nodes {
number
title
state
subIssues(first: 10) {
nodes { number title }
}
}
}
}
}
}
工作流程模式
模式 1: 创建问题层级
创建父问题和子问题时:
- 先创建所有问题
- 获取父问题和子问题的节点 ID
- 将每个子问题添加为父问题的子问题
- 验证关系
# 步骤 1: 获取 ID
python3 {baseDir}/scripts/manage-relationships.py get-ids --issues 67,68,69,70
# 步骤 2: 添加关系
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue --parent 67 --child 68
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue --parent 67 --child 69
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue --parent 67 --child 70
# 步骤 3: 验证
python3 {baseDir}/scripts/manage-relationships.py list-sub-issues --issue 67
模式 2: 史诗与嵌套子问题
对于复杂层级:
史诗 (#1)
├── 功能 A (#2)
│ ├── 任务 A1 (#5)
│ └── 任务 A2 (#6)
└── 功能 B (#3)
└── 任务 B1 (#7)
# 顶层子问题
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue --parent 1 --child 2
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue --parent 1 --child 3
# 嵌套子问题
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue --parent 2 --child 5
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue --parent 2 --child 6
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue --parent 3 --child 7
模式 3: 将问题移动到新父问题
# 使用 replaceParent 标志
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue \
--parent 100 \
--child 68 \
--replace-parent
错误处理
常见错误
“问题可能不包含重复的子问题”
- 子问题已经是这个父问题的子问题
- 先检查现有关系
“子问题只能有一个父问题”
- 子问题已经有不同父问题
- 使用
--replace-parent标志或先从当前父问题中移除
“问题未找到”
- 验证问题编号是否存在
- 检查仓库所有者/名称
故障排除
# 检查问题是否有父问题
python3 {baseDir}/scripts/manage-relationships.py get-parent --issue 68
# 列出所有关系
python3 {baseDir}/scripts/manage-relationships.py show-all --issue 68
与其他技能的集成
与创建问题技能
- 创建问题后,使用此技能建立关系
- 在问题正文中引用父问题:“Part of #67”
与组织标签技能
- 标签指示类型,关系指示结构
- 一起使用以实现完整的问题组织
与项目管理技能
- 子问题出现在项目板上
- 在项目中跟踪层级进度
环境要求
此技能需要:
- 通过适当权限认证的
ghCLI - 启用问题的仓库
- GraphQL API 访问权限
最佳实践
- 先创建问题,然后建立关系 - 在链接之前确保所有问题存在
- 在正文中记录关系 - 添加 “Part of #X” 以提高可见性
- 检查现有父问题 - 避免孤立问题
- 谨慎使用层级 - 深层嵌套 (>3 层) 变得难以管理
- 结合标签使用 - 对于父问题使用
type:epic标签
限制
- 每个问题只能有一个父问题 - 不能有多个子继承
- 没有循环引用 - 如果 B 是 A 的祖先,则 A 不能成为 B 的父问题
- API 速率限制 - 仔细批量操作
- 阻塞关系 - 目前通过 API 仅读(在 UI 中管理)
资源
脚本
- manage-relationships.py: 用于关系操作的主 CLI
参考
- graphql-schema.md: GraphQL 架构完整文档
- relationship-patterns.md: 常见层级模式
常见错误
错误 1: 使用任务列表而不是子问题 API
❌ 错误 - 使用任务列表而不是子问题 API:
## 子问题
- [ ] #68
- [ ] #69
- [ ] #70
✅ 正确 - 使用 GraphQL addSubIssue 突变:
python manage-relationships.py add-sub-issue --parent 67 --child 68
python manage-relationships.py add-sub-issue --parent 67 --child 69
python manage-relationships.py add-sub-issue --parent 67 --child 70
为什么重要:
- 任务列表只创建 “被跟踪” 关系,在问题侧边栏可见
- 子问题创建真正的父子层级,具有:
- 进度跟踪 (3/4 完成,75%)
- GitHub UI 中的层级导航
- 子问题聚合和汇总
错误 2: 没有先获取问题节点 ID
❌ 错误 - 直接在 GraphQL 中使用问题编号:
mutation {
addSubIssue(input: {issueId: "67", subIssueId: "68"}) { ... }
}
✅ 正确 - 先获取节点 ID,然后使用它们:
# 步骤 1: 获取节点 ID
python manage-relationships.py get-ids --issues 67,68
# 步骤 2: 在突变中使用节点 ID
mutation {
addSubIssue(input: {
issueId: "I_kwDOQTQw6c7Z4spt",
subIssueId: "I_kwDOQTQw6c7Z4swL"
}) { ... }
}
为什么重要:GraphQL 使用节点 ID(而不是问题编号)。脚本自动处理此问题,但直接 API 调用需要转换。
错误 3: 没有检查现有父问题
❌ 错误 - 添加子问题时没有检查现有父问题:
python manage-relationships.py add-sub-issue --parent 100 --child 68
# 错误:子问题只能有一个父问题
✅ 正确 - 先检查,如果需要则使用 --replace-parent 标志:
# 检查现有父问题
python manage-relationships.py get-parent --issue 68
# 如果有父问题,使用替换标志
python manage-relationships.py add-sub-issue --parent 100 --child 68 --replace-parent
为什么重要:每个问题只能有一个父问题。尝试添加到新父问题而不使用替换标志将失败。
错误 4: 创建循环引用
❌ 错误 - 创建层级中的循环引用:
# A 是 B 的父问题
python manage-relationships.py add-sub-issue --parent A --child B
# 然后尝试使 B 成为 A 的父问题
python manage-relationships.py add-sub-issue --parent B --child A
# 错误:无法创建循环引用
✅ 正确 - 计划层级结构后再创建:
史诗 (#1)
├── 功能 A (#2)
│ └── 任务 A1 (#5)
└── 功能 B (#3)
└── 任务 B1 (#7)
为什么重要:GitHub 防止循环引用。在创建关系之前规划您的层级结构。
错误 5: 创建后不验证
❌ 错误 - 添加关系后不验证:
python manage-relationships.py add-sub-issue --parent 67 --child 68
# 只是假设它工作了
✅ 正确 - 验证关系是否创建:
python manage-relationships.py add-sub-issue --parent 67 --child 68
python manage-relationships.py list-sub-issues --issue 67
# 确认:子问题 (4):#68, #69, #70, #71
为什么重要:API 调用可能会默默失败或部分失败。始终验证结果是否符合预期。
错误 6: 深层嵌套 (>3 层)
❌ 错误 - 过多的嵌套层级:
史诗
└── 主题
└── 功能
└── 故事
└── 任务
└── 子任务 (6 层!)
✅ 正确 - 保持层级浅 (2-3 层):
史诗
├── 功能 A
│ ├── 任务 A1
│ └── 任务 A2
└── 功能 B
└── 任务 B1
为什么重要:深层嵌套变得难以管理和导航。大多数项目最多 2-3 层效果最佳。
重要说明
- 标准
gh issueCLI 不支持关系管理 - 总是通过
gh api graphql使用 GraphQL API 管理关系 - 子问题在 GitHub UI 中出现,具有进度跟踪
- 任务列表复选框 (
- [ ] #68) 创建 “被跟踪” 关系,而不是父子关系 - 每个问题只能有一个父问题(没有多重继承)
- 创建后验证关系以确认成功