Files
gh-resolve-io-prism/skills/jira/reference/api-reference.md
2025-11-30 08:51:34 +08:00

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/)