418 lines
9.2 KiB
Markdown
418 lines
9.2 KiB
Markdown
# Jira REST API Reference
|
|
|
|
## Overview
|
|
|
|
This document provides detailed information about using the Jira REST API v3 for fetching issue context in PRISM workflows.
|
|
|
|
## Base Configuration
|
|
|
|
From [core-config.yaml](../../../core-config.yaml):
|
|
|
|
```yaml
|
|
jira:
|
|
enabled: true
|
|
baseUrl: https://resolvesys.atlassian.net
|
|
email: ${JIRA_EMAIL}
|
|
token: ${JIRA_API_TOKEN}
|
|
defaultProject: PLAT
|
|
issueKeyPattern: "[A-Z]+-\\d+"
|
|
```
|
|
|
|
## Authentication
|
|
|
|
All API requests require Basic Authentication:
|
|
|
|
```
|
|
Authorization: Basic base64(email:token)
|
|
```
|
|
|
|
Where:
|
|
- `email`: Your Atlassian account email (from `JIRA_EMAIL` env var)
|
|
- `token`: Your Jira API token (from `JIRA_API_TOKEN` env var)
|
|
|
|
**Security Notes:**
|
|
- Never hardcode credentials in code
|
|
- Never embed credentials in URLs
|
|
- WebFetch tool handles authentication securely
|
|
- Credentials are read from environment variables via core-config.yaml
|
|
|
|
## API Endpoints
|
|
|
|
### 1. Get Issue Details
|
|
|
|
**Endpoint:**
|
|
```
|
|
GET /rest/api/3/issue/{issueKey}
|
|
```
|
|
|
|
**URL Example:**
|
|
```
|
|
https://resolvesys.atlassian.net/rest/api/3/issue/PLAT-123
|
|
```
|
|
|
|
**Response Fields:**
|
|
- `key`: Issue key (e.g., "PLAT-123")
|
|
- `fields.summary`: Issue title
|
|
- `fields.description`: Full description (Atlassian Document Format)
|
|
- `fields.issuetype.name`: Type (Epic, Story, Bug, Task, Subtask)
|
|
- `fields.status.name`: Current status
|
|
- `fields.priority.name`: Priority level
|
|
- `fields.assignee`: Assignee details
|
|
- `fields.reporter`: Reporter details
|
|
- `fields.parent`: Parent issue (for Subtasks)
|
|
- `fields.customfield_xxxxx`: Epic Link (custom field ID varies)
|
|
- `fields.timetracking`: Original/remaining estimates
|
|
- `fields.customfield_xxxxx`: Story Points (custom field ID varies)
|
|
- `fields.comment.comments[]`: Array of comments
|
|
- `fields.issuelinks[]`: Linked issues
|
|
- `fields.labels[]`: Labels
|
|
- `fields.components[]`: Components
|
|
- `fields.fixVersions[]`: Fix versions
|
|
|
|
**Usage with WebFetch:**
|
|
```
|
|
WebFetch:
|
|
url: https://resolvesys.atlassian.net/rest/api/3/issue/PLAT-123
|
|
prompt: |
|
|
Extract and format the following information from this Jira issue:
|
|
- Issue Key and Type (Epic/Story/Bug/Task)
|
|
- Summary and Description
|
|
- Status and Priority
|
|
- Assignee and Reporter
|
|
- Epic Link (if applicable)
|
|
- Story Points (if applicable)
|
|
- Acceptance Criteria (from description or custom field)
|
|
- Comments (last 3 most recent)
|
|
- Linked Issues (blocks, is blocked by, relates to)
|
|
- Labels and Components
|
|
|
|
Format as a clear, structured summary for development context.
|
|
```
|
|
|
|
### 2. Search Issues (JQL)
|
|
|
|
**Endpoint:**
|
|
```
|
|
GET /rest/api/3/search?jql={query}
|
|
```
|
|
|
|
**URL Example:**
|
|
```
|
|
https://resolvesys.atlassian.net/rest/api/3/search?jql=project=PLAT+AND+type=Epic
|
|
```
|
|
|
|
**Common JQL Queries:**
|
|
|
|
**Get all epics in project:**
|
|
```jql
|
|
project = PLAT AND type = Epic
|
|
```
|
|
|
|
**Get all child stories of an epic:**
|
|
```jql
|
|
parent = PLAT-789
|
|
```
|
|
|
|
**Get all open bugs:**
|
|
```jql
|
|
project = PLAT AND type = Bug AND status != Done
|
|
```
|
|
|
|
**Get issues assigned to me:**
|
|
```jql
|
|
project = PLAT AND assignee = currentUser()
|
|
```
|
|
|
|
**Get recently updated issues:**
|
|
```jql
|
|
project = PLAT AND updated >= -7d
|
|
```
|
|
|
|
**Response Structure:**
|
|
```json
|
|
{
|
|
"total": 25,
|
|
"maxResults": 50,
|
|
"startAt": 0,
|
|
"issues": [
|
|
{
|
|
"key": "PLAT-123",
|
|
"fields": { ... }
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Usage with WebFetch:**
|
|
```
|
|
WebFetch:
|
|
url: https://resolvesys.atlassian.net/rest/api/3/search?jql=parent=PLAT-789
|
|
prompt: |
|
|
List all issues returned from this search.
|
|
For each issue, extract:
|
|
- Issue Key
|
|
- Type
|
|
- Summary
|
|
- Status
|
|
- Assignee
|
|
|
|
Format as a numbered list.
|
|
```
|
|
|
|
### 3. Get Epic Issues
|
|
|
|
**Endpoint:**
|
|
```
|
|
GET /rest/api/3/search?jql=parent={epicKey}
|
|
```
|
|
|
|
**URL Example:**
|
|
```
|
|
https://resolvesys.atlassian.net/rest/api/3/search?jql=parent=PLAT-789
|
|
```
|
|
|
|
**Purpose:**
|
|
Retrieves all Stories, Tasks, and Subtasks that belong to a specific Epic.
|
|
|
|
**Usage:**
|
|
Essential for Story Master when decomposing epics to:
|
|
- See existing child stories
|
|
- Avoid duplication
|
|
- Understand epic scope
|
|
- Identify gaps in decomposition
|
|
|
|
**Usage with WebFetch:**
|
|
```
|
|
WebFetch:
|
|
url: https://resolvesys.atlassian.net/rest/api/3/search?jql=parent=PLAT-789
|
|
prompt: |
|
|
List all child stories/tasks for this epic.
|
|
For each, extract:
|
|
- Issue Key
|
|
- Summary
|
|
- Status
|
|
- Story Points (if available)
|
|
|
|
Calculate total story points across all children.
|
|
```
|
|
|
|
### 4. Get Issue Comments
|
|
|
|
**Endpoint:**
|
|
```
|
|
GET /rest/api/3/issue/{issueKey}/comment
|
|
```
|
|
|
|
**URL Example:**
|
|
```
|
|
https://resolvesys.atlassian.net/rest/api/3/issue/PLAT-123/comment
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"comments": [
|
|
{
|
|
"id": "12345",
|
|
"author": {
|
|
"displayName": "John Doe",
|
|
"emailAddress": "john@example.com"
|
|
},
|
|
"body": { ... },
|
|
"created": "2025-01-15T10:30:00.000+0000",
|
|
"updated": "2025-01-15T10:30:00.000+0000"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Note:** Comments are included in issue details response by default. Use this endpoint only if you need ALL comments (issue details returns recent comments only).
|
|
|
|
### 5. Get Issue Transitions
|
|
|
|
**Endpoint:**
|
|
```
|
|
GET /rest/api/3/issue/{issueKey}/transitions
|
|
```
|
|
|
|
**Note:** This is a read-only integration. We do not modify issues, so transition endpoints are informational only.
|
|
|
|
## Rate Limiting
|
|
|
|
Jira Cloud enforces rate limits:
|
|
|
|
**Limits:**
|
|
- **Per-user**: 300 requests per minute
|
|
- **Per-app**: Based on your plan
|
|
|
|
**Best Practices:**
|
|
- Cache issue data for the conversation session
|
|
- Avoid fetching same issue multiple times
|
|
- Use search queries to fetch multiple issues in one request
|
|
- Batch operations when possible
|
|
|
|
**Handling Rate Limits:**
|
|
If you receive 429 (Too Many Requests):
|
|
```
|
|
Display: "Jira rate limit reached. Please wait a moment before fetching more issues."
|
|
Action: Wait and retry, or proceed without additional Jira data
|
|
```
|
|
|
|
## Custom Fields
|
|
|
|
Many Jira fields are custom and vary by instance:
|
|
|
|
**Common Custom Fields:**
|
|
- **Epic Link**: `customfield_10014` (varies by instance)
|
|
- **Story Points**: `customfield_10016` (varies by instance)
|
|
- **Sprint**: `customfield_10020` (varies by instance)
|
|
- **Epic Name**: `customfield_10011` (for Epic issues)
|
|
|
|
**Finding Custom Field IDs:**
|
|
1. Fetch any issue and examine the response
|
|
2. Look for `customfield_*` entries
|
|
3. Match field names to IDs in your instance
|
|
|
|
**Usage Tip:**
|
|
Use the WebFetch extraction prompt to handle custom fields generically:
|
|
```
|
|
Extract story points if available (may be in customfield_10016 or similar)
|
|
```
|
|
|
|
The AI extraction will find the relevant field without hardcoding IDs.
|
|
|
|
## Response Formats
|
|
|
|
### Atlassian Document Format (ADF)
|
|
|
|
Jira descriptions and comments use ADF (JSON structure):
|
|
|
|
```json
|
|
{
|
|
"type": "doc",
|
|
"version": 1,
|
|
"content": [
|
|
{
|
|
"type": "paragraph",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "This is the description"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Handling ADF:**
|
|
Use WebFetch's AI extraction to convert ADF to readable text:
|
|
```
|
|
prompt: "Extract the description text from this issue and format as plain markdown"
|
|
```
|
|
|
|
## Error Codes
|
|
|
|
**400 Bad Request:**
|
|
- Invalid JQL syntax
|
|
- Malformed request
|
|
|
|
**401 Unauthorized:**
|
|
- Missing or invalid credentials
|
|
- Expired API token
|
|
|
|
**403 Forbidden:**
|
|
- User lacks permission to view issue
|
|
- Issue is in restricted project
|
|
|
|
**404 Not Found:**
|
|
- Issue key does not exist
|
|
- Issue was deleted
|
|
|
|
**429 Too Many Requests:**
|
|
- Rate limit exceeded
|
|
- Wait and retry
|
|
|
|
**500 Internal Server Error:**
|
|
- Jira service issue
|
|
- Retry or proceed without Jira data
|
|
|
|
## Example WebFetch Usage
|
|
|
|
### Fetch Single Issue
|
|
|
|
```javascript
|
|
// In Claude Code workflow
|
|
WebFetch({
|
|
url: "https://resolvesys.atlassian.net/rest/api/3/issue/PLAT-123",
|
|
prompt: `
|
|
Extract and format this Jira issue:
|
|
|
|
**[PLAT-123]**: {summary}
|
|
|
|
**Type**: {type}
|
|
**Status**: {status}
|
|
**Priority**: {priority}
|
|
|
|
**Description**:
|
|
{description as markdown}
|
|
|
|
**Acceptance Criteria**:
|
|
{extract AC from description if present}
|
|
|
|
**Assignee**: {assignee name}
|
|
**Reporter**: {reporter name}
|
|
|
|
**Linked Issues**:
|
|
- {list linked issues with relationship type}
|
|
|
|
**Comments** (last 3):
|
|
- {author}: {comment text}
|
|
`
|
|
})
|
|
```
|
|
|
|
### Search for Epic Children
|
|
|
|
```javascript
|
|
WebFetch({
|
|
url: "https://resolvesys.atlassian.net/rest/api/3/search?jql=parent=PLAT-789",
|
|
prompt: `
|
|
List all child stories for this epic:
|
|
|
|
1. [PLAT-XXX] {summary} - {status} - {story points}
|
|
2. [PLAT-YYY] {summary} - {status} - {story points}
|
|
|
|
Total Story Points: {sum of all story points}
|
|
Completed: {count of Done stories}
|
|
In Progress: {count of In Progress stories}
|
|
Todo: {count of To Do stories}
|
|
`
|
|
})
|
|
```
|
|
|
|
## Testing
|
|
|
|
**Verify Configuration:**
|
|
```bash
|
|
# Check environment variables
|
|
echo $JIRA_EMAIL
|
|
echo $JIRA_API_TOKEN
|
|
|
|
# Test API connection
|
|
curl -u $JIRA_EMAIL:$JIRA_API_TOKEN \
|
|
https://resolvesys.atlassian.net/rest/api/3/myself
|
|
```
|
|
|
|
**Test Issue Fetch:**
|
|
```bash
|
|
curl -u $JIRA_EMAIL:$JIRA_API_TOKEN \
|
|
https://resolvesys.atlassian.net/rest/api/3/issue/PLAT-123
|
|
```
|
|
|
|
## References
|
|
|
|
- [Jira REST API v3 Documentation](https://developer.atlassian.com/cloud/jira/platform/rest/v3/intro/)
|
|
- [JQL (Jira Query Language)](https://support.atlassian.com/jira-service-management-cloud/docs/use-advanced-search-with-jira-query-language-jql/)
|
|
- [Atlassian Document Format](https://developer.atlassian.com/cloud/jira/platform/apis/document/structure/)
|