skills/c0ntr0lledcha0s/managing-relationships/SKILL.md
Expert at managing GitHub issue relationships including parent/sub-issues, blocking dependencies, and tracking links using the GraphQL API. Auto-invokes when creating issue hierarchies, setting parent-child relationships, managing dependencies, or linking related issues.
npx skillsauth add aiskillstore/marketplace managing-relationshipsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are an expert at managing GitHub issue relationships using the GraphQL API. This skill provides capabilities beyond the standard gh issue CLI, enabling proper parent-child hierarchies, dependency tracking, and issue linking.
Auto-invoke this skill when the conversation involves:
Create explicit parent-child relationships using GitHub's sub-issues feature.
Add Sub-Issue:
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue \
--parent 67 \
--child 68
Remove Sub-Issue:
python3 {baseDir}/scripts/manage-relationships.py remove-sub-issue \
--parent 67 \
--child 68
List Sub-Issues:
python3 {baseDir}/scripts/manage-relationships.py list-sub-issues --issue 67
Track blocking dependencies between issues.
View Dependencies:
python3 {baseDir}/scripts/manage-relationships.py show-dependencies --issue 68
Query complex relationship graphs.
Get Parent:
python3 {baseDir}/scripts/manage-relationships.py get-parent --issue 68
Get All Relationships:
python3 {baseDir}/scripts/manage-relationships.py show-all --issue 67
Creates a parent-child relationship.
mutation {
addSubIssue(input: {
issueId: "PARENT_NODE_ID",
subIssueId: "CHILD_NODE_ID"
}) {
issue { number title }
subIssue { number title }
}
}
Input Fields:
issueId (required): Parent issue node IDsubIssueId: Child issue node IDsubIssueUrl: Alternative - child issue URLreplaceParent: Boolean to replace existing parentRemoves a parent-child relationship.
mutation {
removeSubIssue(input: {
issueId: "PARENT_NODE_ID",
subIssueId: "CHILD_NODE_ID"
}) {
issue { number }
subIssue { number }
}
}
Reorders sub-issues within a parent.
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-child
parent { number title }
subIssues(first: 50) {
nodes { number title state }
}
subIssuesSummary {
total
completed
percentCompleted
}
# Dependencies
blockedBy(first: 10) {
nodes { number title }
}
blocking(first: 10) {
nodes { number title }
}
# Tracking (from task lists)
trackedInIssues(first: 10) {
nodes { number title }
}
trackedIssues(first: 10) {
nodes { number title }
}
trackedIssuesCount
}
}
}
For operations not covered by scripts, use gh api graphql directly:
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 }
}
}
}
}
}
}'
When creating a parent issue with children:
# Step 1: Get IDs
python3 {baseDir}/scripts/manage-relationships.py get-ids --issues 67,68,69,70
# Step 2: Add relationships
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
# Step 3: Verify
python3 {baseDir}/scripts/manage-relationships.py list-sub-issues --issue 67
For complex hierarchies:
Epic (#1)
├── Feature A (#2)
│ ├── Task A1 (#5)
│ └── Task A2 (#6)
└── Feature B (#3)
└── Task B1 (#7)
# Top-level children
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
# Nested children
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
# Use replaceParent flag
python3 {baseDir}/scripts/manage-relationships.py add-sub-issue \
--parent 100 \
--child 68 \
--replace-parent
"Issue may not contain duplicate sub-issues"
"Sub issue may only have one parent"
--replace-parent flag or remove from current parent first"Issue not found"
# Check if issue has parent
python3 {baseDir}/scripts/manage-relationships.py get-parent --issue 68
# List all relationships
python3 {baseDir}/scripts/manage-relationships.py show-all --issue 68
This skill requires:
gh CLI authenticated with appropriate permissionstype:epic label for parent issues❌ WRONG - Task lists create "tracked" relationships, not parent-child:
## Child Issues
- [ ] #68
- [ ] #69
- [ ] #70
✅ CORRECT - Use GraphQL addSubIssue mutation:
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
Why it matters:
❌ WRONG - Using issue numbers directly in GraphQL:
mutation {
addSubIssue(input: {issueId: "67", subIssueId: "68"}) { ... }
}
✅ CORRECT - Get node IDs first, then use them:
# Step 1: Get node IDs
python manage-relationships.py get-ids --issues 67,68
# Step 2: Use node IDs in mutation
mutation {
addSubIssue(input: {
issueId: "I_kwDOQTQw6c7Z4spt",
subIssueId: "I_kwDOQTQw6c7Z4swL"
}) { ... }
}
Why it matters: GraphQL uses node IDs (not issue numbers). The script handles this automatically, but direct API calls require the conversion.
❌ WRONG - Adding sub-issue without checking existing parent:
python manage-relationships.py add-sub-issue --parent 100 --child 68
# Error: Sub issue may only have one parent
✅ CORRECT - Check first, then use --replace-parent if needed:
# Check existing parent
python manage-relationships.py get-parent --issue 68
# If has parent, use replace flag
python manage-relationships.py add-sub-issue --parent 100 --child 68 --replace-parent
Why it matters: Each issue can only have one parent. Attempting to add to a new parent without the replace flag will fail.
❌ WRONG - Creating cycles in hierarchy:
# A is parent of B
python manage-relationships.py add-sub-issue --parent A --child B
# Then trying to make B parent of A
python manage-relationships.py add-sub-issue --parent B --child A
# Error: Cannot create circular reference
✅ CORRECT - Plan hierarchy before creating:
Epic (#1)
├── Feature A (#2)
│ └── Task A1 (#5)
└── Feature B (#3)
└── Task B1 (#7)
Why it matters: GitHub prevents circular references. Plan your hierarchy structure before creating relationships.
❌ WRONG - Adding relationships without verification:
python manage-relationships.py add-sub-issue --parent 67 --child 68
# Just assume it worked
✅ CORRECT - Verify relationships were created:
python manage-relationships.py add-sub-issue --parent 67 --child 68
python manage-relationships.py list-sub-issues --issue 67
# Confirms: Sub-issues (4): #68, #69, #70, #71
Why it matters: API calls can fail silently or partially. Always verify the result matches expectations.
❌ WRONG - Too many levels of nesting:
Epic
└── Theme
└── Feature
└── Story
└── Task
└── Subtask (6 levels!)
✅ CORRECT - Keep hierarchy shallow (2-3 levels):
Epic
├── Feature A
│ ├── Task A1
│ └── Task A2
└── Feature B
└── Task B1
Why it matters: Deep nesting becomes hard to manage and navigate. Most projects work well with 2-3 levels maximum.
gh issue CLI does NOT support relationship managementgh api graphql for relationships- [ ] #68) create "tracked" relationships, not parent-childdevelopment
Apple Human Interface Guidelines for content display components. Use this skill when the user asks about charts component, collection view, image view, web view, color well, image well, activity view, lockup, data visualization, content display, displaying images, rendering web content, color pickers, or presenting collections of items in Apple apps. Also use when the user says how should I display charts, what's the best way to show images, should I use a web view, how do I build a grid of items, what component shows media, or how do I present a share sheet. Cross-references: hig-foundations for color/typography/accessibility, hig-patterns for data visualization patterns, hig-components-layout for structural containers, hig-platforms for platform-specific component behavior.
tools
Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for current schemas.
testing
Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.
tools
GraphQL gives clients exactly the data they need - no more, no less. One endpoint, typed schema, introspection. But the flexibility that makes it powerful also makes it dangerous. Without proper controls, clients can craft queries that bring down your server. This skill covers schema design, resolvers, DataLoader for N+1 prevention, federation for microservices, and client integration with Apollo/urql. Key insight: GraphQL is a contract. The schema is the API documentation. Design it carefully.