Back to skills
SkillHub ClubShip Full StackFull Stack

gh-issue-search-advanced

Builds and executes complex issue queries using GitHub's advanced search syntax with AND/OR boolean operators and nested queries up to 5 levels deep. Use when finding specific issue sets with complex criteria, searching across states/labels/assignees/dates/issue-types, building custom reports, or exporting results to CSV/JSON/markdown.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
1
Hot score
77
Updated
March 20, 2026
Overall rating
C2.9
Composite score
2.9
Best-practice grade
C61.2

Install command

npx @skill-hub/cli install kynoptic-markdownlint-trap-gh-issue-search-advanced

Repository

kynoptic/markdownlint-trap

Skill path: .claude/skills/gh-issue-search-advanced

Builds and executes complex issue queries using GitHub's advanced search syntax with AND/OR boolean operators and nested queries up to 5 levels deep. Use when finding specific issue sets with complex criteria, searching across states/labels/assignees/dates/issue-types, building custom reports, or exporting results to CSV/JSON/markdown.

Open repository

Best for

Primary workflow: Ship Full Stack.

Technical facets: Full Stack.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: kynoptic.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install gh-issue-search-advanced into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/kynoptic/markdownlint-trap before adding gh-issue-search-advanced to shared team environments
  • Use gh-issue-search-advanced for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: Building Advanced GitHub Issue Searches
description: Builds and executes complex issue queries using GitHub's advanced search syntax with AND/OR boolean operators and nested queries up to 5 levels deep. Use when finding specific issue sets with complex criteria, searching across states/labels/assignees/dates/issue-types, building custom reports, or exporting results to CSV/JSON/markdown.
---

# GitHub Advanced Issue Search

Build and execute complex issue queries using GitHub's advanced search syntax with AND/OR operators and nested queries.

## What you should do

When invoked, help the user build and execute advanced issue searches by:

1. **Understanding the search request** - Determine what the user wants to find:
   - Specific issue states, labels, assignees, authors
   - Date ranges and time-based filters
   - Issue types, milestones, projects
   - Complex combinations with AND/OR logic
   - Nested queries with parentheses

2. **Build the query** - Construct the search using:
   - Boolean operators: AND, OR
   - Nested queries: up to 5 levels of parentheses
   - All available issue fields
   - Proper escaping and syntax

3. **Execute and format results** - Run the query and present results:
   - Via GraphQL API with `advanced_search: true`
   - Via REST API with `advanced_search` parameter
   - Via web UI search
   - Format output (table, JSON, CSV, markdown)

4. **Refine if needed** - Help iterate on queries to get desired results

## Advanced search syntax

### Boolean operators

**AND (implicit):**
```
is:issue state:open author:alice
# All conditions must match (AND is implicit with space)
```

**AND (explicit):**
```
is:issue AND state:open AND author:alice
# Same as above, but explicit
```

**OR:**
```
is:issue (label:bug OR label:security)
# Matches issues with bug OR security label
```

**Complex combinations:**
```
is:issue state:open (label:bug OR label:security) assignee:alice
# Open issues with (bug OR security) label AND assigned to alice
```

### Nested queries

**Up to 5 levels deep:**
```
is:issue state:open (
  (type:Bug OR type:Security) AND
  (assignee:alice OR assignee:bob)
)
```

**Real-world example:**
```
is:issue state:open (
  (label:P0 OR label:P1) AND
  (assignee:@me OR no:assignee) AND
  (milestone:"Q1 2025" OR no:milestone)
)
# High-priority issues that are either assigned to me or unassigned,
# in Q1 milestone or no milestone
```

## Available search qualifiers

### Basic filters
- `is:issue` - Issues only
- `is:pr` - Pull requests only
- `is:open` / `is:closed` - State
- `state:open` / `state:closed` - Alternative state syntax

### People
- `author:USERNAME` - Issue creator
- `assignee:USERNAME` - Assigned user
- `assignee:@me` - Assigned to you
- `mentions:USERNAME` - Mentioned user
- `commenter:USERNAME` - Commented on issue
- `involves:USERNAME` - Any involvement
- `no:assignee` - Unassigned

### Labels
- `label:bug` - Has bug label
- `-label:wontfix` - Does NOT have wontfix label
- `no:label` - No labels

### Milestones and projects
- `milestone:"v2.0"` - In milestone
- `milestone:v2.0` - Alternative (no quotes if no spaces)
- `no:milestone` - No milestone
- `project:BOARD_NAME` - In project

### Issue types (new in 2025)
- `type:Bug` - Bug type
- `type:Epic` - Epic type
- `type:Feature` - Feature type
- `type:Task` - Task type

### Dates
- `created:>2025-01-01` - Created after date
- `created:<2025-12-31` - Created before date
- `created:2025-01-01..2025-12-31` - Date range
- `updated:>2025-10-01` - Updated after date
- `closed:2025-10-01..2025-10-15` - Closed in range

### Text search
- `in:title` - Search in title only
- `in:body` - Search in body only
- `in:comments` - Search in comments
- `security in:title` - Title contains "security"

### Counts and limits
- `comments:>10` - More than 10 comments
- `comments:<5` - Fewer than 5 comments
- `comments:0` - No comments

### Repository and organization
- `repo:owner/name` - Specific repository
- `org:organization` - Organization
- `user:username` - User's repositories

## Execution methods

### Method 1: GraphQL API (recommended)

```bash
gh api graphql -f query='
query {
  search(
    query: "is:issue state:open (type:Bug OR type:Security) assignee:@me"
    type: ISSUE
    first: 100
  ) {
    issueCount
    edges {
      node {
        ... on Issue {
          number
          title
          state
          labels(first: 10) {
            nodes {
              name
            }
          }
          assignees(first: 5) {
            nodes {
              login
            }
          }
        }
      }
    }
  }
}'
```

**Note:** Advanced search is enabled by default in GraphQL search queries.

### Method 2: REST API

```bash
# Will become default on September 4, 2025
gh api "search/issues?q=is:issue+state:open+(type:Bug+OR+type:Security)" \
  --jq '.items[] | {number, title, state}'

# Explicit advanced search (before Sept 2025)
gh api "search/issues?q=is:issue+state:open+(type:Bug+OR+type:Security)&advanced_search=true" \
  --jq '.items[] | {number, title, state}'
```

**URL encoding:**
- Spaces → `+` or `%20`
- Parentheses → `(` and `)` (usually don't need encoding)
- Quotes → `%22`
- Colons → `:` (don't encode)

### Method 3: Web UI

```bash
# Open search in browser
gh issue list --web --search "is:issue state:open (type:Bug OR type:Security)"
```

## Query templates

### Template 1: My open high-priority work
```
is:issue state:open assignee:@me (label:P0 OR label:P1 OR label:critical)
```

### Template 2: Stale issues needing triage
```
is:issue state:open no:assignee no:milestone updated:<2025-09-01
```

### Template 3: Recent bugs and security issues
```
is:issue state:open (type:Bug OR type:Security) created:>2025-10-01
```

### Template 4: Release blockers
```
is:issue state:open (
  (label:blocker OR label:critical) AND
  (milestone:"v2.0" OR milestone:"v2.1")
)
```

### Template 5: Unassigned work ready to pick up
```
is:issue state:open label:ready no:assignee (
  label:good-first-issue OR label:help-wanted
)
```

### Template 6: Issues blocked or blocking others
```
is:issue state:open (has:blocked-issues OR has:blocking-issues)
```

### Template 7: Parent issues with incomplete sub-issues
```
is:issue state:open has:sub-issues -label:all-sub-issues-complete
```

### Template 8: Epic/Feature breakdown
```
is:issue (type:Epic OR type:Feature) (
  state:open OR
  (state:closed AND closed:>2025-10-01)
)
```

## Complete workflow examples

### Example 1: Find my work for the week

```bash
QUERY="is:issue state:open assignee:@me (
  (label:P0 OR label:P1) OR
  (milestone:\"Sprint 42\" AND -label:blocked)
)"

gh api graphql -f query='
query {
  search(query: "'"$QUERY"'", type: ISSUE, first: 50) {
    issueCount
    edges {
      node {
        ... on Issue {
          number
          title
          labels(first: 5) {
            nodes {
              name
            }
          }
        }
      }
    }
  }
}' --jq '.data.search |
  "Found \(.issueCount) issues:\n" +
  (.edges | map(.node | "  #\(.number): \(.title)") | join("\n"))'
```

### Example 2: Export stale issues to CSV

```bash
QUERY="is:issue state:open no:assignee updated:<2025-09-01"

gh api graphql -f query='
query {
  search(query: "'"$QUERY"'", type: ISSUE, first: 100) {
    edges {
      node {
        ... on Issue {
          number
          title
          createdAt
          updatedAt
          author {
            login
          }
        }
      }
    }
  }
}' --jq -r '
["Number","Title","Author","Created","Updated"],
(.data.search.edges[] | [
  .node.number,
  .node.title,
  .node.author.login,
  .node.createdAt,
  .node.updatedAt
]) | @csv' > stale-issues.csv

echo "✅ Exported to stale-issues.csv"
```

### Example 3: Count issues by type

```bash
for type in Bug Epic Feature Task; do
  COUNT=$(gh api "search/issues?q=is:issue+state:open+type:$type" \
    --jq '.total_count')
  echo "$type: $COUNT"
done
```

### Example 4: Interactive query builder

```bash
# Prompt user for filters
echo "Build your issue search:"
read -p "State (open/closed/all): " state
read -p "Labels (comma-separated, or empty): " labels
read -p "Assignee (username or @me, or empty): " assignee
read -p "Issue type (Bug/Epic/Feature/Task, or empty): " type

# Build query
QUERY="is:issue"
[[ "$state" != "all" ]] && QUERY="$QUERY state:$state"

if [[ -n "$labels" ]]; then
  IFS=',' read -ra LABEL_ARRAY <<< "$labels"
  LABEL_QUERY=$(printf "label:%s OR " "${LABEL_ARRAY[@]}")
  LABEL_QUERY=${LABEL_QUERY% OR }
  QUERY="$QUERY ($LABEL_QUERY)"
fi

[[ -n "$assignee" ]] && QUERY="$QUERY assignee:$assignee"
[[ -n "$type" ]] && QUERY="$QUERY type:$type"

echo "Query: $QUERY"
echo ""

# Execute
gh api "search/issues?q=$(echo "$QUERY" | sed 's/ /+/g')" \
  --jq '.items[] | "#\(.number): \(.title)"'
```

### Example 5: Save common searches

```bash
# Create search library
mkdir -p ~/.gh-searches

cat > ~/.gh-searches/my-work.sh <<'EOF'
#!/bin/bash
gh api graphql -f query='
query {
  search(
    query: "is:issue state:open assignee:@me (label:P0 OR label:P1)"
    type: ISSUE
    first: 50
  ) {
    edges {
      node {
        ... on Issue {
          number
          title
        }
      }
    }
  }
}' --jq '.data.search.edges[] | "#\(.node.number): \(.node.title)"'
EOF

chmod +x ~/.gh-searches/my-work.sh

# Use saved search
~/.gh-searches/my-work.sh
```

## Output formatting

### Table format

```bash
gh api graphql -f query='...' --jq -r '
["Number","Title","State","Labels"],
["------","-----","-----","------"],
(.data.search.edges[] | [
  .node.number,
  .node.title,
  .node.state,
  (.node.labels.nodes | map(.name) | join(", "))
]) | @tsv' | column -t -s $'\t'
```

### JSON export

```bash
gh api graphql -f query='...' --jq '.data.search.edges[] | .node' > results.json
```

### Markdown checklist

```bash
gh api graphql -f query='...' --jq -r '
.data.search.edges[] |
"- [ ] #\(.node.number): \(.node.title)"
' > checklist.md
```

## Important notes

### Limitations

1. **Repo/org/user fields** - Currently work as OR filters when space-separated (not AND)
2. **Not in nested queries** - repo, org, user cannot be used in nested parentheses yet
3. **Default date** - Sept 4, 2025: Advanced search becomes default (no parameter needed)
4. **Rate limits** - Search API has lower rate limits than other endpoints

### Performance tips

- Use specific qualifiers to narrow results (repo, milestone, etc.)
- Limit results with `first: N` in GraphQL
- Cache common query results
- Use pagination for large result sets

## Error handling

**Common issues:**

1. **"Syntax error in query"**
   - Check parentheses are balanced
   - Verify operator spelling (AND, OR in caps)
   - Check for invalid qualifiers

2. **"Too many parentheses"**
   - Max 5 levels of nesting
   - Simplify query or break into multiple searches

3. **"Invalid qualifier"**
   - Ensure qualifier is supported (check docs)
   - Some fields only work outside nested queries

4. **"Rate limit exceeded"**
   - Search API has stricter limits
   - Add delays between requests
   - Use authentication to increase limits

## Integration with workflows

**Works well with:**
- `gh-issue-hierarchy` skill - Find parent issues with sub-issues
- `gh-issue-dependencies` skill - Search for blocked/blocking issues
- `gh-issue-types` skill - Filter by issue types
- `gh-project-manage` skill - Find issues to add to projects

**Automation ideas:**
- Daily digest of priority work
- Stale issue cleanup scripts
- Release blocker reports
- Team workload analysis
- Automated triage based on search results

## Example usage patterns

### Common project searches

**High-value work to prioritize:**
```
is:issue state:open label:essential (label:enhancement OR label:bug)
```

**Blocked work needing attention:**
```
is:issue state:open has:blocked-issues
```

**Ready to work (unassigned and ready):**
```
is:issue state:open no:assignee label:ready
```

**Stale backlog items:**
```
is:issue state:open label:backlog updated:<2025-09-01
```

**Recently completed work:**
```
is:issue state:closed closed:>2025-10-01 (label:config OR label:pipeline)
```
gh-issue-search-advanced | SkillHub