Skip to content

Query Language Cookbook

This cookbook provides practical examples of Gira Query Language (GQL) queries for common project management scenarios.

🍳 Basic Recipes

Finding Your Work

# Everything assigned to you
gira ticket list --query "assignee:me()"

# Everything you created
gira ticket list --query "reporter:me()"

# Everything you're involved with
gira ticket list --query "assignee:me() OR reporter:me()"

# Your work that's not done
gira ticket list --query "assignee:me() AND status:!=done"

Status-Based Queries

# Ready to start
gira ticket list --query "status:todo"

# Work in progress
gira ticket list --query "status:in_progress"

# Needs review
gira ticket list --query "status:review"

# Recently completed
gira ticket list --query "status:done AND updated_at:>=days_ago(7)"

Priority-Based Queries

# Critical work
gira ticket list --query "priority:critical"

# High priority work not done
gira ticket list --query "priority:high AND status:!=done"

# Low priority backlog
gira ticket list --query "priority:low AND status:backlog"

🔥 Daily Standups

What did I work on yesterday?

# Your tickets updated yesterday
gira ticket list --query "assignee:me() AND updated_at:>=days_ago(1) AND updated_at:<today()"

# Your tickets moved to done recently
gira ticket list --query "assignee:me() AND status:done AND updated_at:>=days_ago(1)"

What am I working on today?

# Your active work
gira ticket list --query "assignee:me() AND status:in_progress"

# Your high priority todo items
gira ticket list --query "assignee:me() AND status:todo AND priority:high"

What's blocking me?

# Your blocked tickets
gira ticket list --query "assignee:me() AND blocked_by:not_empty"

# Tickets you're waiting on
gira ticket list --query "assignee:me() AND status:review"

🏃‍♂️ Sprint Management

Current Sprint Work

# All tickets in current sprint
gira ticket list --query "sprint_id:current_sprint()"

# Your current sprint work
gira ticket list --query "sprint_id:current_sprint() AND assignee:me()"

# Sprint work not started
gira ticket list --query "sprint_id:current_sprint() AND status:todo"

# Sprint work in progress
gira ticket list --query "sprint_id:current_sprint() AND status:in_progress"

Sprint Planning

# Unestimated tickets
gira ticket list --query "story_points:is_null AND type:!=subtask"

# Large tickets (might need breaking down)
gira ticket list --query "story_points:>=13"

# Tickets without epics
gira ticket list --query "epic_id:is_null AND type:!=subtask"

# Ready for sprint (estimated, not blocked)
gira ticket list --query "story_points:not_null AND blocked_by:empty AND status:todo"

Sprint Progress

# Completed this sprint
gira ticket list --query "sprint_id:current_sprint() AND status:done"

# Sprint burn-down (remaining work)
gira ticket list --query "sprint_id:current_sprint() AND status:!=done"

# Sprint risks (blocked or overdue)
gira ticket list --query "sprint_id:current_sprint() AND (blocked_by:not_empty OR due_date:<today())"

🎯 Epic Management

Epic Progress

# All tickets in an epic
gira ticket list --query "epic_id:EPIC-123"

# Epic work not started
gira ticket list --query "epic_id:EPIC-123 AND status:todo"

# Epic work in progress
gira ticket list --query "epic_id:EPIC-123 AND status:in_progress"

# Epic completion status
gira ticket list --query "epic_id:EPIC-123 AND status:done"

Epic Planning

# Active epics
gira epic list --query "status:active"

# Epics with no tickets
gira epic list --query "tickets:empty"

# Epics assigned to you
gira epic list --query "owner:me()"

# Epics due this month
gira epic list --query "target_date:<=end_of_month()"

🐛 Bug Management

Bug Triage

# All bugs
gira ticket list --query "type:bug"

# Critical bugs
gira ticket list --query "type:bug AND priority:critical"

# Unassigned bugs
gira ticket list --query "type:bug AND assignee:is_null"

# New bugs (last 7 days)
gira ticket list --query "type:bug AND created_at:>=days_ago(7)"

Bug Resolution

# Bugs in progress
gira ticket list --query "type:bug AND status:in_progress"

# Bugs ready for testing
gira ticket list --query "type:bug AND status:review"

# Fixed bugs
gira ticket list --query "type:bug AND status:done"

# Bugs assigned to you
gira ticket list --query "type:bug AND assignee:me()"

📊 Quality Assurance

Testing Queries

# Tickets ready for testing
gira ticket list --query "status:review"

# Tickets with attachments (might have test data)
gira ticket list --query "attachment_count:>0"

# Tickets with many comments (might indicate issues)
gira ticket list --query "comment_count:>=5"

# Recently updated tickets (might need retesting)
gira ticket list --query "updated_at:>=days_ago(3) AND status:review"

Quality Metrics

# Bug ratio: bugs vs features
gira ticket list --query "type:bug" --format json | jq length
gira ticket list --query "type:feature" --format json | jq length

# Rework: tickets moved back to todo
gira ticket list --query "status:todo AND updated_at:>=days_ago(7)"

# Velocity: tickets completed this week
gira ticket list --query "status:done AND updated_at:>=start_of_week()"

🔍 Advanced Searches

# Search in title
gira ticket list --query "title:~'authentication'"

# Search in description
gira ticket list --query "description:contains('API')"

# Combined text search
gira ticket list --query "title:~'login' OR description:contains('user')"

# Exact title match
gira ticket list --query "title:'Fix login bug'"

Label-Based Queries

# Tickets with specific label
gira ticket list --query "labels:contains(urgent)"

# Tickets with multiple labels
gira ticket list --query "labels:contains(frontend) AND labels:contains(bug)"

# Tickets with no labels
gira ticket list --query "labels:empty"

# Tickets with many labels
gira ticket list --query "labels:not_empty"

Date Range Queries

# This week's work
gira ticket list --query "updated_at:>=start_of_week() AND updated_at:<=end_of_week()"

# This month's created tickets
gira ticket list --query "created_at:>=start_of_month()"

# Overdue tickets
gira ticket list --query "due_date:<today() AND status:!=done"

# Recently updated
gira ticket list --query "updated_at:>=days_ago(3)"

🔄 Workflow Queries

Code Review

# Ready for code review
gira ticket list --query "status:review AND type:!=bug"

# Your reviews
gira ticket list --query "status:review AND assignee:me()"

# Stale reviews (in review for >3 days)
gira ticket list --query "status:review AND updated_at:<=days_ago(3)"

Deployment Tracking

# Ready for deployment
gira ticket list --query "status:done AND updated_at:>=start_of_week()"

# Features completed this sprint
gira ticket list --query "type:feature AND status:done AND sprint_id:current_sprint()"

# Bug fixes ready for hotfix
gira ticket list --query "type:bug AND status:done AND priority:high"

🤝 Team Coordination

Team Workload

# Tickets assigned to team member
gira ticket list --query "assignee:john@example.com"

# Unassigned work
gira ticket list --query "assignee:is_null AND status:todo"

# Overloaded assignees (>10 tickets)
gira ticket list --query "assignee:not_null" --format json | jq 'group_by(.assignee) | map(select(length > 10))'

Dependencies

# Blocked tickets
gira ticket list --query "blocked_by:not_empty"

# Tickets blocking others
gira ticket list --query "blocks:not_empty"

# Dependency chains
gira ticket list --query "blocked_by:contains(GIRA-100)"

# Ready to unblock
gira ticket list --query "status:done AND blocks:not_empty"

📈 Reporting Queries

Velocity Metrics

# Completed this week
gira ticket list --query "status:done AND updated_at:>=start_of_week()"

# Completed last week
gira ticket list --query "status:done AND updated_at:>=weeks_ago(1) AND updated_at:<start_of_week()"

# Story points completed
gira ticket list --query "status:done AND story_points:not_null AND updated_at:>=start_of_week()"

Aging Reports

# Old tickets (>30 days)
gira ticket list --query "created_at:<=days_ago(30) AND status:!=done"

# Stale in-progress (>7 days)
gira ticket list --query "status:in_progress AND updated_at:<=days_ago(7)"

# Long-running epics
gira epic list --query "status:active AND created_at:<=days_ago(60)"

Quality Reports

# Bug creation rate
gira ticket list --query "type:bug AND created_at:>=days_ago(7)"

# Bug resolution rate
gira ticket list --query "type:bug AND status:done AND updated_at:>=days_ago(7)"

# Rework rate (moved back to todo)
gira ticket list --query "status:todo AND updated_at:>=days_ago(7)"

🎨 Output Formatting

JSON for Processing

# Get JSON data for further processing
gira ticket list --query "status:todo" --format json > todo_tickets.json

# Extract specific fields
gira ticket list --query "assignee:me()" --format json | jq '.[] | {id, title, status}'

# Count results
gira ticket list --query "type:bug" --format json | jq length

IDs Only

# Get just ticket IDs
gira ticket list --query "status:todo" --ids-only

# Use with other commands
gira ticket list --query "priority:high" --ids-only | xargs -I {} gira ticket show {}

🔧 Complex Combinations

Multi-Condition Queries

# High priority bugs assigned to you, not done
gira ticket list --query "priority:high AND type:bug AND assignee:me() AND status:!=done"

# Recent work in current sprint
gira ticket list --query "sprint_id:current_sprint() AND updated_at:>=days_ago(3)"

# Overdue high priority work
gira ticket list --query "due_date:<today() AND priority:high AND status:!=done"

Nested Conditions

# Bugs or critical features
gira ticket list --query "type:bug OR (type:feature AND priority:critical)"

# Your work that's either blocked or in review
gira ticket list --query "assignee:me() AND (blocked_by:not_empty OR status:review)"

# Recent updates to important work
gira ticket list --query "updated_at:>=days_ago(1) AND (priority:high OR priority:critical)"

💡 Pro Tips

Query Optimization

# Use specific fields for better performance
gira ticket list --query "status:todo" --limit 50

# Combine with sorting
gira ticket list --query "assignee:me()" --sort priority

# Use pagination for large results
gira ticket list --query "status:!=done" --limit 25 --offset 0

Saved Queries (using shell aliases)

# Add to your shell profile
alias my-work='gira ticket list --query "assignee:me() AND status:!=done"'
alias my-bugs='gira ticket list --query "assignee:me() AND type:bug"'
alias ready-for-review='gira ticket list --query "status:review"'
alias blocked='gira ticket list --query "blocked_by:not_empty"'

Query Building

# Start simple
gira ticket list --query "status:todo"

# Add conditions incrementally
gira ticket list --query "status:todo AND priority:high"

# Test with verbose output
gira ticket list --query "complex query here" --verbose

This cookbook provides patterns for most common project management scenarios. Combine these patterns and adapt them to your specific workflow and team needs.