Help us improve
Share bugs, ideas, or general feedback.
From jira
JQL syntax reference and natural language query translation patterns for intelligent JIRA search
npx claudepluginhub rhuss/cc-jira --plugin jiraHow this skill is triggered — by the user, by Claude, or both
Slash command
/jira:jira-jqlThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
When users search JIRA with natural language queries, use this skill to generate appropriate JQL (JIRA Query Language) queries that are syntactically correct, semantically meaningful, and performant.
Queries JIRA issues using JQL by status, assignee, priority; creates and manages filters, exports results to CSV/JSON, performs bulk updates. For reporting, automation, and bulk operations.
Searches Jira Cloud issues by assignee, status, label, project, type, component, reporter, parent, or free text using structured flags for safe JQL. Renders paginated summary tables.
Searches Jira tickets using JQL queries or text across summary, description, and comments. Displays top 20 results in a table with key, summary, status, assignee, priority, and updated.
Share bugs, ideas, or general feedback.
When users search JIRA with natural language queries, use this skill to generate appropriate JQL (JIRA Query Language) queries that are syntactically correct, semantically meaningful, and performant.
Users rarely know exact status names. Apply intelligent fuzzy matching:
"open" / "opened" / "active" / "not done":
status IN (Open, 'To Do', 'In Progress', 'Refinement In Progress', New, Blocked)
"closed" / "done" / "finished" / "completed":
status IN (Closed, Done, Resolved, 'Refinement Complete')
"in progress" / "working on" / "active development":
status IN ('In Progress', 'Code Review', Testing, 'Refinement In Progress')
"blocked" / "stuck" / "waiting":
status IN (Blocked, Waiting, 'Pending Review', 'Pending Approval')
"needs review" / "ready for review":
status IN ('Code Review', 'Pending Review', 'Ready for QA')
Teams use both fixVersion field AND labels inconsistently. Always check both automatically:
"release-3.2" / "version 3.2" / "3.2 release":
(fixVersion = 'release-3.2' OR labels = 'release-3.2')
"targeted to X" / "planned for X":
(fixVersion = 'X' OR labels = 'X')
Pattern: Always use OR to check both fixVersion and labels for any version/release query.
"linked to RHAISTRAT-123" / "related to RHAI-456":
issue IN linkedIssues(RHAISTRAT-123)
"blocks RHAIENG-789" / "blocking KEY":
issue IN linkedIssues(RHAIENG-789, "blocks")
"blocked by KEY":
issue IN linkedIssues(KEY, "is blocked by")
"depends on KEY":
issue IN linkedIssues(KEY, "depends on")
Common link types: Relates, Blocks, Clones, Duplicates, Causes, Depends on
"my issues" / "assigned to me" / "mine":
assignee = currentUser()
"created by me" / "I created" / "I reported":
reporter = currentUser()
"unassigned" / "no assignee" / "needs owner":
assignee IS EMPTY
"assigned to john" / "john's issues":
assignee = john
Note: Usernames in JIRA are typically lowercase, without spaces.
"high priority" / "urgent" / "critical":
priority IN (Highest, High, Critical)
"low priority":
priority IN (Lowest, Low)
"medium priority" / "normal":
priority = Medium
"bugs" / "defects":
issuetype = Bug
"features" / "stories" / "user stories":
issuetype IN (Feature, Story, 'User Story')
"tasks" / "chores":
issuetype = Task
"epics":
issuetype = Epic
"subtasks" / "sub-tasks":
issuetype IN subTaskIssueTypes()
"last week" / "past week" / "this week":
updated >= -7d
"yesterday" / "last 24 hours":
updated >= -1d
"last month":
updated >= -30d
"today" / "updated today":
updated >= startOfDay()
"created this month":
created >= startOfMonth()
"overdue":
due < now() AND resolution = Unresolved
"current sprint" / "active sprint":
sprint IN openSprints()
"no sprint" / "backlog" / "not in any sprint":
sprint IS EMPTY
"sprint 25" / "sprint X":
sprint = X
"assigned to the QA team" / "QA's issues":
assignee IN membersOf("qa") OR assignee IN membersOf("quality-assurance")
"created by the dev team":
reporter IN membersOf("developers")
"labeled X" / "tagged X" / "with label X":
labels = X
"requires architecture review":
labels = requires_architecture_review
Note: Labels are typically lowercase with underscores or hyphens.
"unresolved" / "not done" / "still open":
resolution = Unresolved
"resolved" / "fixed":
resolution IS NOT EMPTY
| Operator | Usage | Example |
|---|---|---|
= | Equals (exact match) | status = Open |
!= | Not equals | priority != Low |
> | Greater than | votes > 10 |
>= | Greater or equal | created >= -7d |
< | Less than | votes < 5 |
<= | Less or equal | duedate <= now() |
IN | Matches any value in list | status IN (Open, 'In Progress') |
NOT IN | Excludes all values in list | status NOT IN (Closed, Done) |
~ | Contains (text search) | summary ~ "authentication" |
!~ | Does not contain | summary !~ "deprecated" |
IS EMPTY | Field has no value | assignee IS EMPTY |
IS NOT EMPTY | Field has a value | labels IS NOT EMPTY |
IS NULL | Same as IS EMPTY | fixVersion IS NULL |
IS NOT NULL | Same as IS NOT EMPTY | component IS NOT NULL |
WAS | Had value in the past | status WAS 'In Progress' |
WAS IN | Was any of values | status WAS IN (Open, New) |
WAS NOT | Was not value | assignee WAS NOT john |
CHANGED | Field value changed | priority CHANGED |
| Function | Description | Example |
|---|---|---|
currentUser() | Currently logged-in user | assignee = currentUser() |
linkedIssues(key) | All issues linked to key | issue IN linkedIssues(RHAI-123) |
linkedIssues(key, linkType) | Issues with specific link type | issue IN linkedIssues(RHAI-123, "blocks") |
membersOf(group) | Users in a group | assignee IN membersOf("developers") |
now() | Current date/time | created > now(-1h) |
startOfDay([offset]) | Start of today (or offset) | created >= startOfDay() |
endOfDay([offset]) | End of today (or offset) | due <= endOfDay() |
startOfWeek([offset]) | Start of week | created >= startOfWeek() |
endOfWeek([offset]) | End of week | due <= endOfWeek() |
startOfMonth([offset]) | Start of month | created >= startOfMonth() |
endOfMonth([offset]) | End of month | due <= endOfMonth() |
startOfYear([offset]) | Start of year | created >= startOfYear() |
endOfYear([offset]) | End of year | resolved <= endOfYear() |
openSprints() | All active sprints | sprint IN openSprints() |
closedSprints() | All completed sprints | sprint IN closedSprints() |
futureSprints() | All future sprints | sprint IN futureSprints() |
subTaskIssueTypes() | All subtask types | issuetype IN subTaskIssueTypes() |
issueHistory() | Search issue history | Advanced usage |
Time offset examples:
now(-1h) - 1 hour agostartOfDay(-7) - Start of day 7 days agostartOfMonth(1) - Start of next month| Field | Description | Example Values |
|---|---|---|
project | Project key | RHAISTRAT, RHAIENG, RHAIRFE |
summary | Issue title | "Add authentication support" |
description | Issue description | Free text |
issuetype | Type of issue | Bug, Feature, Story, Task, Epic |
status | Current status | Open, 'In Progress', Done, Closed |
priority | Priority level | Highest, High, Medium, Low, Lowest |
assignee | Assigned user | jdoe, currentUser() |
reporter | Created by | jsmith, currentUser() |
created | Creation date | "2025-01-15", -7d |
updated | Last updated | -1d, startOfDay() |
resolved | Resolution date | -30d, now() |
due | Due date | "2025-02-01", endOfWeek() |
labels | Tags/labels | documentation, security |
component | Component | Authentication, UXD, API |
fixVersion | Target version | 1.5.0, release-3.2 |
affectsVersion | Found in version | 1.4.0 |
resolution | Resolution status | Unresolved, Fixed, Won't Fix |
sprint | Sprint | Sprint 25, openSprints() |
comment | Issue comments | Free text search |
votes | Number of votes | 10, >5 |
watchers | Number of watchers | 3, >=1 |
text | All text fields | Searches summary, description, comments |
| Operator | Usage | Example |
|---|---|---|
AND | All conditions must be true | project = RHAI AND status = Open |
OR | Any condition must be true | priority = High OR priority = Highest |
NOT | Negates a condition | NOT status = Closed |
Parentheses for grouping:
(priority = High OR priority = Highest) AND status = Open
ORDER BY sorts results:
ORDER BY priority DESC
ORDER BY created ASC
ORDER BY priority DESC, updated DESC
Directions: ASC (ascending), DESC (descending)
Quote multi-word values with single or double quotes:
status = 'In Progress'
status = "Code Review"
project IN (RHAI, RHAIENG) # Single-word values don't need quotes
Quote special characters:
summary ~ "user's authentication"
Relative dates:
-1d - 1 day ago-2w - 2 weeks ago-3M - 3 months ago-1y - 1 year ago-30m - 30 minutes ago-2h - 2 hours agoAbsolute dates:
"2025-01-15""2025/01/15""15/Jan/25"Functions:
now()startOfDay(), endOfDay()startOfWeek(), endOfWeek()User Intent: Find bugs assigned to me that aren't finished yet, in a specific project
Generated JQL:
project = RHAIENG
AND issuetype = Bug
AND assignee = currentUser()
AND status IN (Open, 'To Do', 'In Progress', New, Blocked)
ORDER BY priority DESC, updated DESC
Why:
User Intent: Find features planned for a release that aren't done yet
Generated JQL:
issuetype IN (Feature, Story, 'User Story')
AND (fixVersion = 'release-3.2' OR labels = 'release-3.2')
AND status NOT IN (Done, Closed, Resolved, 'Refinement Complete')
ORDER BY priority DESC
Why:
User Intent: Find all issues with any link to a specific issue
Generated JQL:
issue IN linkedIssues(RHAISTRAT-123)
ORDER BY type ASC, key ASC
Why:
User Intent: Find my issues with recent activity
Generated JQL:
assignee = currentUser()
AND updated >= -7d
ORDER BY updated DESC
Why:
User Intent: Find urgent bugs that need an owner
Generated JQL:
project = RHAIENG
AND issuetype = Bug
AND priority IN (Highest, High, Critical)
AND assignee IS EMPTY
ORDER BY priority DESC, created DESC
Why:
User Intent: Find bugs I reported that are blockers
Generated JQL:
issuetype = Bug
AND reporter = currentUser()
AND issue IN linkedIssues(*, "blocks")
ORDER BY created DESC
Note: The * wildcard with linkedIssues may not work in all JIRA versions. Alternative approach:
issuetype = Bug
AND reporter = currentUser()
ORDER BY created DESC
Then filter manually for blockers.
User Intent: Find features in active sprint assigned to QA
Generated JQL:
issuetype IN (Feature, Story)
AND sprint IN openSprints()
AND (assignee IN membersOf("qa") OR assignee IN membersOf("quality-assurance"))
ORDER BY rank ASC
Why:
User Intent: Find tasks assigned to me that are past due date
Generated JQL:
assignee = currentUser()
AND due < now()
AND resolution = Unresolved
ORDER BY due ASC
Why:
User Intent: Find recent issues that haven't been tagged yet
Generated JQL:
project = RHAISTRAT
AND created >= startOfMonth()
AND labels IS EMPTY
ORDER BY created DESC
Why:
User Intent: Find regressions in a specific release
Generated JQL:
issuetype = Bug
AND (fixVersion = 'release-2.5' OR labels = 'release-2.5')
AND status WAS Closed
AND status = Open
ORDER BY updated DESC
Why:
Bad (slow, searches all issues):
assignee = currentUser() AND status = Open
Good (fast, limits scope):
project = RHAIENG AND assignee = currentUser() AND status = Open
Performance: 10-100x faster with project filter.
Don't require users to know exact status names. Map common terms to multiple statuses:
Check both fixVersion AND labels automatically:
(fixVersion = 'X' OR labels = 'X')
Don't return unordered results. Choose ordering based on intent:
ORDER BY priority DESCORDER BY updated DESC or ORDER BY created DESCORDER BY due ASCORDER BY rank ASCstatus = 'In Progress' # Correct
status = In Progress # Wrong (syntax error)
Less clear:
NOT status = Closed
More clear:
status IN (Open, 'In Progress', 'To Do')
Static (becomes outdated):
assignee = jdoe
Dynamic (works for any user):
assignee = currentUser()
Verbose:
status = Open OR status = 'In Progress' OR status = 'To Do'
Concise:
status IN (Open, 'In Progress', 'To Do')
If user says "my bugs", include:
If query is vague like "issues", default to:
assignee = currentUser() AND resolution = Unresolved
ORDER BY updated DESC
Assume user wants their own open issues.
| User Says | Generate JQL |
|---|---|
| "my issues" | assignee = currentUser() AND resolution = Unresolved |
| "my bugs" | issuetype = Bug AND assignee = currentUser() AND status IN (...) |
| "my open bugs" | Above + fuzzy status |
| "bugs in PROJECT" | project = PROJECT AND issuetype = Bug |
| "high priority" | priority IN (Highest, High, Critical) |
| "release-X" | (fixVersion = 'release-X' OR labels = 'release-X') |
| "last week" | updated >= -7d |
| "today" | updated >= startOfDay() |
| "unassigned" | assignee IS EMPTY |
| "created by me" | reporter = currentUser() |
| "overdue" | due < now() AND resolution = Unresolved |
| "current sprint" | sprint IN openSprints() |
| "linked to KEY" | issue IN linkedIssues(KEY) |
| "no labels" | labels IS EMPTY |
Always include project in queries when possible.
Slow:
summary ~ "authentication" OR description ~ "authentication"
Faster:
text ~ "authentication" # Searches summary, description, comments
Even better (if possible):
labels = authentication # Field match is fastest
Slower:
project = A OR project = B OR project = C OR ... # Many ORs
Faster:
project IN (A, B, C, ...) # Single IN clause
Prefer these (indexed in most JIRA instances):
Avoid heavy reliance on:
~ operator)1. Missing Quotes:
status = In Progress # WRONG (syntax error)
status = 'In Progress' # CORRECT
2. Wrong Operator for Field Type:
created ~ "2025-01-15" # WRONG (~ is for text)
created = "2025-01-15" # CORRECT (= for dates)
3. Using != with Text Fields:
summary != "test" # NOT SUPPORTED
NOT summary ~ "test" # Use this instead
4. Case Sensitivity:
status = Status = STATUS)status = Open ≠ status = open)5. Reserved Words: Don't use these as unquoted values: AND, OR, NOT, EMPTY, NULL, ORDER, BY
For the most up-to-date JQL documentation:
When the /jira:search command invokes this skill, you should:
The command will show the JQL to the user with an explanation before execution.
Example workflow:
User query: "my open bugs in RHAIENG"
Your thought process:
Generated JQL:
project = RHAIENG AND issuetype = Bug AND assignee = currentUser() AND status IN (Open, 'To Do', 'In Progress', New, Blocked) ORDER BY priority DESC, updated DESC
Remember: Your goal is to translate user intent into powerful, correct, performant JQL. Be smart, be helpful, and always think about what the user really wants to find.