Issues 2.0 CLI Design
Covering: Issue type support for gh CLI — create, edit, view, and list with --type flag, Sub-issues and parent relationship support — create, edit, and view with parent/sub-issue flags, Issue relationship support (blocked-by/blocking) — create, edit, and view, Combined Issues 2.0 scenarios — cross-feature interactions, full views, and regressions
Table of Contents
gh issue create
gh issue edit
gh issue view
gh issue list
gh issue create
What is changing
- Issue types: Create an issue with --type flag
- Issue types: Interactive issue creation with type picker (repo has issue types configured)
- Errors: Error when type name doesn't match any configured type in the repository
- Sub-issues: Create an issue as a sub-issue of a parent
- Sub-issues: Create a sub-issue with a cross-repo parent URL
- Relationships: Create an issue with --blocked-by and --blocking flags (comma-separated)
- Errors: Error when issue relationships are not supported on the target GHES version
- Relationships: Create an issue blocked by an issue in another repository (via URL)
- Combined: Create an issue with all new flags combined (type, parent, blocked-by, blocking)
With --type flag
Input:
$ gh issue create --title "Login broken" --type Bug --body "Can't log in"
Output:

Source & reproduction
printf 'Creating issue in {{repo:cli/cli}}
{{url:https://github.com/cli/cli/issues/127}}
' > create-with-type.ans
freeze create-with-type.ans --output create-with-type.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Created issue has issueType.name matching the --type argument
- Created issue has title matching the --title argument
Interactive mode — type picker
Input:
Input:
Output:

Source & reproduction
printf '\033[1;92m?\033[0m \033[1mIssue type\033[0m \033[0;36m[Use arrows to move, type to filter]\033[0m
\033[1;36m>\033[0m Bug
Feature
Task
' > create-interactive-type-step4.ans
freeze create-interactive-type-step4.ans --output create-interactive-type-step4.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Output:

Source & reproduction
printf 'Creating issue in {{repo:cli/cli}}
{{url:https://github.com/cli/cli/issues/130}}
' > create-interactive-type-step6.ans
freeze create-interactive-type-step6.ans --output create-interactive-type-step6.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Created issue has issueType.name matching the --type argument
Error: invalid type name
Input:
$ gh issue create --title "Oops" --type Bugz
Output:

Source & reproduction
printf 'type "Bugz" not found; available types: {{type_list:Bug, Feature, Task}}
' > create-error-invalid-type.ans
freeze create-error-invalid-type.ans --output create-error-invalid-type.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
With --parent flag
Input:
$ gh issue create --title "Implement parser" --body "Parse the thing" --parent 100
Output:

Source & reproduction
printf 'Creating issue in {{repo:cli/cli}}
{{url:https://github.com/cli/cli/issues/126}}
' > create-with-parent.ans
freeze create-with-parent.ans --output create-with-parent.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Issue was created successfully
- Created issue has parent matching the --parent argument
With --parent using cross-repo URL
Input:
$ gh issue create --title "Fix dependency" --parent https://github.com/cli/go-gh/issues/42
Output:

Source & reproduction
printf 'Creating issue in {{repo:cli/cli}}
{{url:https://github.com/cli/cli/issues/129}}
' > create-with-parent-url.ans
freeze create-with-parent-url.ans --output create-with-parent-url.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
With --blocked-by and --blocking
Input:
$ gh issue create --title "Deploy v2" --blocked-by 200,201 --blocking 300
Output:

Source & reproduction
printf 'Creating issue in {{repo:cli/cli}}
{{url:https://github.com/cli/cli/issues/128}}
' > create-with-relationships.ans
freeze create-with-relationships.ans --output create-with-relationships.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Issue was created successfully
- Created issue has blockedBy list matching the --blocked-by arguments
- Created issue has blocking list matching the --blocking argument
Error: GHES unsupported for relationships
Input:
$ gh issue create --title "Test" --blocked-by 200
Output:

Source & reproduction
printf 'issue relationships are not supported on this GitHub Enterprise Server version
' > create-error-ghes-relationships.ans
freeze create-error-ghes-relationships.ans --output create-error-ghes-relationships.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Blocked by cross-repo issue (URL)
Input:
$ gh issue create --title "Blocked by upstream" --blocked-by https://github.com/cli/go-gh/issues/42
Output:

Source & reproduction
printf 'Creating issue in {{repo:cli/cli}}
{{url:https://github.com/cli/cli/issues/131}}
' > create-with-cross-repo-blocking.ans
freeze create-with-cross-repo-blocking.ans --output create-with-cross-repo-blocking.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Created issue has blockedBy list including the cross-repo issue specified by URL
All new flags together
Input:
$ gh issue create --title "Deploy v2" --type Task --parent 100 --blocked-by 200 --blocking 300
Output:

Source & reproduction
printf 'Creating issue in {{repo:cli/cli}}
{{url:https://github.com/cli/cli/issues/130}}
' > create-all-flags.ans
freeze create-all-flags.ans --output create-all-flags.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Created issue has issueType, parent, blockedBy, and blocking fields matching the flag arguments
- Created issue has parent matching the --parent argument
- Created issue has blockedBy list matching the --blocked-by argument
- Created issue has blocking list matching the --blocking argument
gh issue edit
What is changing
- Issue types: Set issue type with --set-type flag
- Issue types: Remove issue type with --remove-type flag
- Errors: Error when both --set-type and --remove-type are specified
- Sub-issues: Set or replace the parent issue
- Sub-issues: Remove the parent issue
- Sub-issues: Add multiple sub-issues using comma-separated values
- Sub-issues: Remove a sub-issue
- Errors: Error when --set-parent and --remove-parent are used together
- Relationships: Add and remove blocked-by relationships in one call
- Relationships: Add blocking relationships with comma-separated values
- Relationships: Remove a blocking relationship
- Interactive: Interactive metadata picker showing all new fields (Type, Parent)
- Combined: Batch edit — set type on multiple issues in one call
Set issue type
Input:
$ gh issue edit 123 --set-type Feature
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/123}}
' > edit-change-type.ans
freeze edit-change-type.ans --output edit-change-type.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Issue issueType.name is updated to match the --set-type argument
Remove issue type
Input:
$ gh issue edit 123 --remove-type
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/123}}
' > edit-remove-type.ans
freeze edit-remove-type.ans --output edit-remove-type.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Issue issueType is null after removal
Error: --set-type and --remove-type mutually exclusive
Input:
$ gh issue edit 123 --set-type Bug --remove-type
Output:

Source & reproduction
printf 'specify only one of --set-type or --remove-type
' > edit-error-mutual-type.ans
freeze edit-error-mutual-type.ans --output edit-error-mutual-type.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Set parent issue
Input:
$ gh issue edit 123 --set-parent 100
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/123}}
' > edit-set-parent.ans
freeze edit-set-parent.ans --output edit-set-parent.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Issue parent field matches the --set-parent argument
Remove parent
Input:
$ gh issue edit 123 --remove-parent
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/123}}
' > edit-remove-parent.ans
freeze edit-remove-parent.ans --output edit-remove-parent.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Issue parent field is null
Add sub-issues (comma-separated)
Input:
$ gh issue edit 100 --add-sub-issue 123,124,125
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/100}}
' > edit-add-sub-issues.ans
freeze edit-add-sub-issues.ans --output edit-add-sub-issues.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- All specified issues appear in the target issue's subIssues list
Remove sub-issue
Input:
$ gh issue edit 100 --remove-sub-issue 123
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/100}}
' > edit-remove-sub-issue.ans
freeze edit-remove-sub-issue.ans --output edit-remove-sub-issue.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Specified issue no longer appears in the target issue's subIssues list
Error: --set-parent and --remove-parent mutually exclusive
Input:
$ gh issue edit 123 --set-parent 100 --remove-parent
Output:

Source & reproduction
printf 'specify only one of --set-parent or --remove-parent
' > edit-error-mutual-parent.ans
freeze edit-error-mutual-parent.ans --output edit-error-mutual-parent.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Add and remove --blocked-by
Input:
$ gh issue edit 123 --add-blocked-by 200 --remove-blocked-by 201
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/123}}
' > edit-add-remove-blocked-by.ans
freeze edit-add-remove-blocked-by.ans --output edit-add-remove-blocked-by.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Issue blockedBy list includes the issues specified by --add-blocked-by
- Removed issue no longer appears in blockedBy list; added issue does appear
Add --blocking (comma-separated)
Input:
$ gh issue edit 123 --add-blocking 300,301
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/123}}
' > edit-add-blocking.ans
freeze edit-add-blocking.ans --output edit-add-blocking.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Issue blocking list includes the issues specified by --add-blocking
Remove --blocking
Input:
$ gh issue edit 123 --remove-blocking 300
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/123}}
' > edit-remove-blocking.ans
freeze edit-remove-blocking.ans --output edit-remove-blocking.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- Specified issue no longer appears in this issue's blocking list
Interactive metadata picker with new fields
Input:
Input:
$ {down}{down}{down}{down} {down}
Output:

Source & reproduction
printf '\033[1;92m?\033[0m \033[1mWhat would you like to edit?\033[0m \033[0;36m[Use arrows to move, space to select, type to filter]\033[0m
[ ] Title
[ ] Body
[ ] Assignees
[ ] Labels
[ ] Type
[ ] Parent
[ ] Projects
[ ] Milestone
' > edit-interactive-step2.ans
freeze edit-interactive-step2.ans --output edit-interactive-step2.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Output:

Source & reproduction
printf '\033[1;92m?\033[0m \033[1mType\033[0m \033[0;36m[Use arrows to move, type to filter]\033[0m
\033[1;36m>\033[0m Bug
Feature
Task
' > edit-interactive-step3.ans
freeze edit-interactive-step3.ans --output edit-interactive-step3.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Input:
Output:

Source & reproduction
printf '\033[1;92m?\033[0m \033[1mParent issue number or URL\033[0m
' > edit-interactive-step4.ans
freeze edit-interactive-step4.ans --output edit-interactive-step4.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/123}}
' > edit-interactive-step5.ans
freeze edit-interactive-step5.ans --output edit-interactive-step5.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
Batch edit with --set-type
Input:
$ gh issue edit 123 124 125 --set-type Bug
Output:

Source & reproduction
printf '{{url:https://github.com/cli/cli/issues/123}}
{{url:https://github.com/cli/cli/issues/124}}
{{url:https://github.com/cli/cli/issues/125}}
' > edit-batch-type.ans
freeze edit-batch-type.ans --output edit-batch-type.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Expected effects
- All specified issues have issueType.name matching the --set-type argument
gh issue view
What is changing
- TTY: Issue view showing type on state line and in metadata
- JSON: JSON output for issueType field
- TTY: Issue view showing parent in metadata
- TTY: Issue view with a cross-repo parent showing full owner/repo prefix
- TTY: Epic issue view with multiple sub-issues and no parent
- JSON: JSON output for parent, subIssues, and subIssuesSummary fields
- TTY: Issue view showing blocked-by and blocking metadata
- JSON: JSON output for blockedBy and blocking fields
- TTY: Issue view with ALL new fields populated (type, parent, blocked-by, blocking, sub-issues)
- TTY: Issue view with no new fields set — proves no regression from today's output
- TTY: Closed sub-issue view — parent shown, no sub-issues section
View with issue type
Input:
Output:

Source & reproduction
printf '\033[1m{{title:Login broken}}\033[0m {{repo_ref:cli/cli#123}}
\033[0;90m{{issue_type:Bug}}\033[0m · \033[0;32m{{state:Open}}\033[0m · {{author:user1}} opened {{time_ago:about 2 hours ago}} · {{count:0}} comments
\033[1mLabels:\033[0m {{labels:bug}}
\033[1mType:\033[0m {{issue_type:Bug}}
\033[38;5;252m{{body_text:Something is broken when users try to log in.}}\033[0m
\033[0;90mView this issue on GitHub: {{url:https://github.com/cli/cli/issues/123}}\033[0m
' > view-with-type.ans
freeze view-with-type.ans --output view-with-type.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Issue type (--json)
Input:
$ gh issue view 123 --json issueType
Output:

Source & reproduction
printf '{
"issueType": {
"id": "{{title:IT_kwDOABCD12}}",
"name": "{{issue_type:Bug}}",
"description": "{{title:Something isn'\''t working}}",
"color": "{{title:d73a4a}}"
}
}
' > view-json-issue-type.ans
freeze view-json-issue-type.ans --output view-json-issue-type.png --language json --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
View with parent
Input:
Output:

Source & reproduction
printf '\033[1m{{title:Implement OAuth flow}}\033[0m {{repo_ref:cli/cli#123}}
\033[0;32m{{state:Open}}\033[0m · {{author:user1}} opened {{time_ago:about 2 hours ago}} · {{count:2}} comments
\033[1mParent:\033[0m \033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#100}} {{title:Epic: Authentication overhaul}}
\033[38;5;252m{{body_text:Implementing the OAuth flow as described in the parent issue.}}\033[0m
\033[0;90mView this issue on GitHub: {{url:https://github.com/cli/cli/issues/123}}\033[0m
' > view-with-parent.ans
freeze view-with-parent.ans --output view-with-parent.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
View with cross-repo parent
Input:
Output:

Source & reproduction
printf '\033[1m{{title:Fix go-gh dependency}}\033[0m {{repo_ref:cli/cli#129}}
\033[0;32m{{state:Open}}\033[0m · {{author:user1}} opened {{time_ago:about 1 hour ago}} · {{count:0}} comments
\033[1mParent:\033[0m \033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/go-gh#42}} {{title:Refactor auth module}}
\033[38;5;252m{{body_text:The }}\033[38;5;203;48;5;236m{{code:go-gh}}\033[0m\033[38;5;252m{{body_text: auth module changed its API in v2. We need}}\033[0m
\033[38;5;252m{{body_text:to update our usage to match.}}\033[0m
\033[0;90mView this issue on GitHub: {{url:https://github.com/cli/cli/issues/129}}\033[0m
' > view-cross-repo-parent.ans
freeze view-cross-repo-parent.ans --output view-cross-repo-parent.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Epic view — sub-issues with no parent
Input:
Output:

Source & reproduction
printf '\033[1m{{title:Authentication overhaul}}\033[0m {{repo_ref:cli/cli#100}}
\033[0;32m{{state:Open}}\033[0m · {{author:user1}} opened {{time_ago:about 1 week ago}} · {{count:12}} comments
\033[1mAssignees:\033[0m {{assignees:user1, user2}}
\033[1mLabels:\033[0m {{labels:epic, auth}}
\033[1mType:\033[0m {{issue_type:Task}}
\033[1mProjects:\033[0m {{project:Auth Overhaul (In Progress)}}
\033[1mMilestone:\033[0m {{milestone:v2.0}}
\033[38;5;252m{{body_text:This epic tracks the full authentication overhaul for v2.0.}}\033[0m
\033[38;5;252m{{body_text:All sub-issues must be completed before release.}}\033[0m
\033[1mSub-issues\033[0m · {{count:3}}/{{count:5}} ({{percent:60%%}})
\033[0;35m{{state:Closed}}\033[0m {{issue_ref:cli/cli#101}} {{title:Design auth module API}}
\033[0;35m{{state:Closed}}\033[0m {{issue_ref:cli/cli#102}} {{title:Implement OAuth token exchange}}
\033[0;35m{{state:Closed}}\033[0m {{issue_ref:cli/cli#103}} {{title:Add SSO support}}
\033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#104}} {{title:Token refresh logic}}
\033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#105}} {{title:Migration guide}}
\033[0;90mView this issue on GitHub: {{url:https://github.com/cli/cli/issues/100}}\033[0m
' > view-epic.ans
freeze view-epic.ans --output view-epic.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Parent and sub-issues (--json)
Input:
$ gh issue view 123 --json parent,subIssues,subIssuesSummary
Output:

Source & reproduction
printf '{
"parent": {
"number": {{number:100}},
"title": "{{title:Epic: Authentication overhaul}}",
"url": "{{url:https://github.com/cli/cli/issues/100}}",
"state": "{{state:OPEN}}"
},
"subIssues": [
{
"number": {{number:124}},
"title": "{{title:Implement OAuth flow}}",
"url": "{{url:https://github.com/cli/cli/issues/124}}",
"state": "{{state:CLOSED}}"
},
{
"number": {{number:125}},
"title": "{{title:Add token refresh}}",
"url": "{{url:https://github.com/cli/cli/issues/125}}",
"state": "{{state:OPEN}}"
}
],
"subIssuesSummary": {
"total": {{count:2}},
"completed": {{count:1}},
"percentCompleted": {{count:50}}.0
}
}
' > view-json-parent-subissues.ans
freeze view-json-parent-subissues.ans --output view-json-parent-subissues.png --language json --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
View with relationships
Input:
Output:

Source & reproduction
printf '\033[1m{{title:Deploy v2}}\033[0m {{repo_ref:cli/cli#123}}
\033[0;32m{{state:Open}}\033[0m · {{author:user1}} opened {{time_ago:about 1 hour ago}} · {{count:0}} comments
\033[1mBlocked by:\033[0m
\033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#200}} {{title:API rate limiting}}
\033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#201}} {{title:Fix auth tokens}}
\033[1mBlocking:\033[0m
\033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#300}} {{title:Release v2.0}}
\033[38;5;252m{{body_text:Deploy the v2.0 release once all blockers are resolved.}}\033[0m
\033[0;90mView this issue on GitHub: {{url:https://github.com/cli/cli/issues/123}}\033[0m
' > view-with-relationships.ans
freeze view-with-relationships.ans --output view-with-relationships.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Blocked-by and blocking (--json)
Input:
$ gh issue view 123 --json blockedBy,blocking
Output:

Source & reproduction
printf '{
"blockedBy": [
{
"number": {{number:200}},
"title": "{{title:API rate limiting}}",
"url": "{{url:https://github.com/cli/cli/issues/200}}",
"state": "{{state:OPEN}}"
},
{
"number": {{number:201}},
"title": "{{title:Fix auth tokens}}",
"url": "{{url:https://github.com/cli/cli/issues/201}}",
"state": "{{state:OPEN}}"
}
],
"blocking": [
{
"number": {{number:300}},
"title": "{{title:Release v2.0}}",
"url": "{{url:https://github.com/cli/cli/issues/300}}",
"state": "{{state:OPEN}}"
}
]
}
' > view-json-relationships.ans
freeze view-json-relationships.ans --output view-json-relationships.png --language json --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Full view with all new fields populated
Input:
Output:

Source & reproduction
printf '\033[1m{{title:Implement OAuth flow}}\033[0m {{repo_ref:cli/cli#123}}
\033[0;90m{{issue_type:Bug}}\033[0m · \033[0;32m{{state:Open}}\033[0m · {{author:user1}} opened {{time_ago:about 2 hours ago}} · {{count:5}} comments
\033[1mAssignees:\033[0m {{assignees:user1, user2}}
\033[1mLabels:\033[0m {{labels:enhancement, auth}}
\033[1mType:\033[0m {{issue_type:Bug}}
\033[1mParent:\033[0m \033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#100}} {{title:Epic: Authentication overhaul}}
\033[1mBlocked by:\033[0m
\033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#200}} {{title:API rate limiting}}
\033[1mBlocking:\033[0m
\033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#300}} {{title:Release v2.0}}
\033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#301}} {{title:Update docs}}
\033[1mProjects:\033[0m {{project:Auth Overhaul (In Progress)}}
\033[1mMilestone:\033[0m {{milestone:v2.0}}
\033[38;5;252m{{body_text:The OAuth flow is currently broken when users attempt to log in}}\033[0m
\033[38;5;252m{{body_text:with SSO-enabled organizations. This needs to be fixed before}}\033[0m
\033[38;5;252m{{body_text:the v2.0 release.}}\033[0m
\033[38;5;39;1m## {{heading:Steps to reproduce}}\033[0m
\033[38;5;252m1. Log in with an SSO-enabled org\033[0m
\033[38;5;252m2. Attempt to authorize the OAuth app\033[0m
\033[38;5;252m3. Observe the \033[38;5;203;48;5;236m{{code:403}}\033[0m\033[38;5;252m error\033[0m
\033[1mSub-issues\033[0m · {{count:1}}/{{count:2}} ({{percent:50%%}})
\033[0;35m{{state:Closed}}\033[0m {{issue_ref:cli/cli#124}} {{title:Implement OAuth flow}}
\033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#125}} {{title:Add token refresh}}
\033[0;90mView this issue on GitHub: {{url:https://github.com/cli/cli/issues/123}}\033[0m
' > view-full.ans
freeze view-full.ans --output view-full.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Minimal view — unchanged from today
Input:
Output:

Source & reproduction
printf '\033[1m{{title:Simple bug report}}\033[0m {{repo_ref:cli/cli#456}}
\033[0;32m{{state:Open}}\033[0m · {{author:user1}} opened {{time_ago:about 1 day ago}} · {{count:0}} comments
\033[1mLabels:\033[0m {{labels:bug}}
\033[38;5;252m{{body_text:Something is broken when running }}\033[38;5;203;48;5;236m{{code:gh issue list}}\033[0m\033[38;5;252m{{body_text: with the}}\033[0m
\033[38;5;203;48;5;236m{{code:--assignee}}\033[0m\033[38;5;252m{{body_text: flag. It returns an empty list even when there}}\033[0m
\033[38;5;252m{{body_text:are assigned issues.}}\033[0m
\033[0;90mView this issue on GitHub: {{url:https://github.com/cli/cli/issues/456}}\033[0m
' > view-minimal.ans
freeze view-minimal.ans --output view-minimal.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Closed sub-issue with parent
Input:
Output:

Source & reproduction
printf '\033[1m{{title:Implement OAuth flow}}\033[0m {{repo_ref:cli/cli#124}}
\033[0;35m{{state:Closed}}\033[0m · {{author:user1}} opened {{time_ago:about 3 days ago}} · {{count:2}} comments
\033[1mParent:\033[0m \033[0;32m{{state:Open}}\033[0m {{issue_ref:cli/cli#100}} {{title:Epic: Authentication overhaul}}
\033[38;5;252m{{body_text:Implemented the OAuth flow as described in the parent issue.}}\033[0m
\033[38;5;252m{{body_text:See cli/cli#100 for the full design.}}\033[0m
\033[38;5;39;1m## {{heading:Changes}}\033[0m
\033[38;5;252m{{body_text:• Added OAuth token exchange in }}\033[38;5;203;48;5;236m{{code:pkg/auth/oauth.go}}\033[0m
\033[38;5;252m{{body_text:• Updated login command to use new flow}}\033[0m
\033[0;90mView this issue on GitHub: {{url:https://github.com/cli/cli/issues/124}}\033[0m
' > view-closed-sub-issue.ans
freeze view-closed-sub-issue.ans --output view-closed-sub-issue.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
gh issue list
What is changing
- Issue types: Filter issue list by type
- Issue types: Combine --type with --state and --label filters
Filter by issue type
Input:
$ gh issue list --type Bug
Output:

Source & reproduction
printf 'Showing {{count:1}} of {{count:15}} issues in {{repo:cli/cli}}
\033[0;32m#{{number:123}}\033[0m {{title:Implement OAuth flow}} \033[0;90m{{labels:auth, enhancement}}\033[0m \033[0;90m{{time_ago:about 2 hours ago}}\033[0m
' > list-filter-by-type.ans
freeze list-filter-by-type.ans --output list-filter-by-type.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Combine --type with other filters
Input:
$ gh issue list --type Bug --state closed --label p1
Output:

Source & reproduction
printf 'Showing {{count:2}} of {{count:8}} issues in {{repo:cli/cli}}
\033[0;35m#{{number:89}}\033[0m {{title:Login crash on Safari}} \033[0;90m{{labels:p1, bug}}\033[0m \033[0;90m{{time_ago:about 1 week ago}}\033[0m
\033[0;35m#{{number:67}}\033[0m {{title:Memory leak in auth}} \033[0;90m{{labels:p1, bug}}\033[0m \033[0;90m{{time_ago:about 2 weeks ago}}\033[0m
' > list-type-with-filters.ans
freeze list-type-with-filters.ans --output list-type-with-filters.png --language ansi --font.family 'JetBrains Mono,SF Mono,Menlo,monospace' --font.size 12 --line-height 1.4 --window --padding '20,40,20,20' --background '#2b3037' --margin 20 --shadow.blur 6 --border.radius 8 --width 1360
Issues 2.0 CLI Design
Covering: Issue type support for gh CLI — create, edit, view, and list with --type flag, Sub-issues and parent relationship support — create, edit, and view with parent/sub-issue flags, Issue relationship support (blocked-by/blocking) — create, edit, and view, Combined Issues 2.0 scenarios — cross-feature interactions, full views, and regressions
Table of Contents
gh issue create--typeflag--parentflag--parentusing cross-repo URL--blocked-byand--blockinggh issue edit--set-typeand--remove-typemutually exclusive--set-parentand--remove-parentmutually exclusive--blocked-by--blocking(comma-separated)--blocking--set-typegh issue viewgh issue list--typewith other filtersgh issue createWhat is changing
With
--typeflagInput:
Output:
Source & reproduction
Expected effects
Interactive mode — type picker
Input:
Input:
Output:
Source & reproduction
Output:
Source & reproduction
Expected effects
Error: invalid type name
Input:
$ gh issue create --title "Oops" --type BugzOutput:
Source & reproduction
With
--parentflagInput:
Output:
Source & reproduction
Expected effects
With
--parentusing cross-repo URLInput:
$ gh issue create --title "Fix dependency" --parent https://github.com/cli/go-gh/issues/42Output:
Source & reproduction
Expected effects
With
--blocked-byand--blockingInput:
$ gh issue create --title "Deploy v2" --blocked-by 200,201 --blocking 300Output:
Source & reproduction
Expected effects
Error: GHES unsupported for relationships
Input:
$ gh issue create --title "Test" --blocked-by 200Output:
Source & reproduction
Blocked by cross-repo issue (URL)
Input:
$ gh issue create --title "Blocked by upstream" --blocked-by https://github.com/cli/go-gh/issues/42Output:
Source & reproduction
Expected effects
All new flags together
Input:
$ gh issue create --title "Deploy v2" --type Task --parent 100 --blocked-by 200 --blocking 300Output:
Source & reproduction
Expected effects
gh issue editWhat is changing
Set issue type
Input:
Output:
Source & reproduction
Expected effects
Remove issue type
Input:
Output:
Source & reproduction
Expected effects
Error:
--set-typeand--remove-typemutually exclusiveInput:
Output:
Source & reproduction
Set parent issue
Input:
Output:
Source & reproduction
Expected effects
Remove parent
Input:
Output:
Source & reproduction
Expected effects
Add sub-issues (comma-separated)
Input:
Output:
Source & reproduction
Expected effects
Remove sub-issue
Input:
Output:
Source & reproduction
Expected effects
Error:
--set-parentand--remove-parentmutually exclusiveInput:
Output:
Source & reproduction
Add and remove
--blocked-byInput:
Output:
Source & reproduction
Expected effects
Add
--blocking(comma-separated)Input:
Output:
Source & reproduction
Expected effects
Remove
--blockingInput:
Output:
Source & reproduction
Expected effects
Interactive metadata picker with new fields
Input:
Input:
$ {down}{down}{down}{down} {down}Output:
Source & reproduction
Output:
Source & reproduction
Input:
Output:
Source & reproduction
Output:
Source & reproduction
Expected effects
Batch edit with
--set-typeInput:
Output:
Source & reproduction
Expected effects
gh issue viewWhat is changing
View with issue type
Input:
Output:
Source & reproduction
Issue type (--json)
Input:
Output:
Source & reproduction
View with parent
Input:
Output:
Source & reproduction
View with cross-repo parent
Input:
Output:
Source & reproduction
Epic view — sub-issues with no parent
Input:
Output:
Source & reproduction
Parent and sub-issues (--json)
Input:
Output:
Source & reproduction
View with relationships
Input:
Output:
Source & reproduction
Blocked-by and blocking (--json)
Input:
Output:
Source & reproduction
Full view with all new fields populated
Input:
Output:
Source & reproduction
Minimal view — unchanged from today
Input:
Output:
Source & reproduction
Closed sub-issue with parent
Input:
Output:
Source & reproduction
gh issue listWhat is changing
Filter by issue type
Input:
Output:
Source & reproduction
Combine
--typewith other filtersInput:
Output:
Source & reproduction