Skip to content

[Design] RFC Advanced Issue Support #13120

@BagToad

Description

@BagToad

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

Category Scenario
Issue types With --type flag
Issue types Interactive mode — type picker
Errors Error: invalid type name
Sub-issues With --parent flag
Sub-issues With --parent using cross-repo URL
Relationships With --blocked-by and --blocking
Errors Error: GHES unsupported for relationships
Relationships Blocked by cross-repo issue (URL)
Combined All new flags together

gh issue edit

Category Scenario
Issue types Set issue type
Issue types Remove issue type
Errors Error: --set-type and --remove-type mutually exclusive
Sub-issues Set parent issue
Sub-issues Remove parent
Sub-issues Add sub-issues (comma-separated)
Sub-issues Remove sub-issue
Errors Error: --set-parent and --remove-parent mutually exclusive
Relationships Add and remove --blocked-by
Relationships Add --blocking (comma-separated)
Relationships Remove --blocking
Interactive Interactive metadata picker with new fields
Combined Batch edit with --set-type

gh issue view

Category Scenario
TTY View with issue type
JSON Issue type (--json)
TTY View with parent
TTY View with cross-repo parent
TTY Epic view — sub-issues with no parent
JSON Parent and sub-issues (--json)
TTY View with relationships
JSON Blocked-by and blocking (--json)
TTY Full view with all new fields populated
TTY Minimal view — unchanged from today
TTY Closed sub-issue with parent

gh issue list

Category Scenario
Issue types Filter by issue type
Issue types Combine --type with other filters

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:

$ gh issue create

Input:

$ My new issue

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:

$ gh issue edit 123

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:

$ 100

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:

$ gh issue view 123

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:

$ gh issue view 123

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:

$ gh issue view 129

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:

$ gh issue view 100

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:

$ gh issue view 123

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:

$ gh issue view 123

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:

$ gh issue view 456

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:

$ gh issue view 124

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementa request to improve CLIgh-issuerelating to the gh issue command

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions