mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-04-08 18:33:28 +08:00
294 lines
8.8 KiB
Markdown
294 lines
8.8 KiB
Markdown
---
|
|
name: jira-integration
|
|
description: Use this skill when retrieving Jira tickets, analyzing requirements, updating ticket status, adding comments, or transitioning issues. Provides Jira API patterns via MCP or direct REST calls.
|
|
origin: ECC
|
|
---
|
|
|
|
# Jira Integration Skill
|
|
|
|
Retrieve, analyze, and update Jira tickets directly from your AI coding workflow. Supports both **MCP-based** (recommended) and **direct REST API** approaches.
|
|
|
|
## When to Activate
|
|
|
|
- Fetching a Jira ticket to understand requirements
|
|
- Extracting testable acceptance criteria from a ticket
|
|
- Adding progress comments to a Jira issue
|
|
- Transitioning a ticket status (To Do → In Progress → Done)
|
|
- Linking merge requests or branches to a Jira issue
|
|
- Searching for issues by JQL query
|
|
|
|
## Prerequisites
|
|
|
|
### Option A: MCP Server (Recommended)
|
|
|
|
Install the `mcp-atlassian` MCP server. This exposes Jira tools directly to your AI agent.
|
|
|
|
**Requirements:**
|
|
- Python 3.10+
|
|
- `uvx` (from `uv`), installed via your package manager or the official `uv` installation documentation
|
|
|
|
**Add to your MCP config** (e.g., `~/.claude.json` → `mcpServers`):
|
|
|
|
```json
|
|
{
|
|
"jira": {
|
|
"command": "uvx",
|
|
"args": ["mcp-atlassian==0.21.0"],
|
|
"env": {
|
|
"JIRA_URL": "https://YOUR_ORG.atlassian.net",
|
|
"JIRA_EMAIL": "your.email@example.com",
|
|
"JIRA_API_TOKEN": "your-api-token"
|
|
},
|
|
"description": "Jira issue tracking — search, create, update, comment, transition"
|
|
}
|
|
}
|
|
```
|
|
|
|
> **Security:** Never hardcode secrets. Prefer setting `JIRA_URL`, `JIRA_EMAIL`, and `JIRA_API_TOKEN` in your system environment (or a secrets manager). Only use the MCP `env` block for local, uncommitted config files.
|
|
|
|
**To get a Jira API token:**
|
|
1. Go to <https://id.atlassian.com/manage-profile/security/api-tokens>
|
|
2. Click **Create API token**
|
|
3. Copy the token — store it in your environment, never in source code
|
|
|
|
### Option B: Direct REST API
|
|
|
|
If MCP is not available, use the Jira REST API v3 directly via `curl` or a helper script.
|
|
|
|
**Required environment variables:**
|
|
|
|
| Variable | Description |
|
|
|----------|-------------|
|
|
| `JIRA_URL` | Your Jira instance URL (e.g., `https://yourorg.atlassian.net`) |
|
|
| `JIRA_EMAIL` | Your Atlassian account email |
|
|
| `JIRA_API_TOKEN` | API token from id.atlassian.com |
|
|
|
|
Store these in your shell environment, secrets manager, or an untracked local env file. Do not commit them to the repo.
|
|
|
|
## MCP Tools Reference
|
|
|
|
When the `mcp-atlassian` MCP server is configured, these tools are available:
|
|
|
|
| Tool | Purpose | Example |
|
|
|------|---------|---------|
|
|
| `jira_search` | JQL queries | `project = PROJ AND status = "In Progress"` |
|
|
| `jira_get_issue` | Fetch full issue details by key | `PROJ-1234` |
|
|
| `jira_create_issue` | Create issues (Task, Bug, Story, Epic) | New bug report |
|
|
| `jira_update_issue` | Update fields (summary, description, assignee) | Change assignee |
|
|
| `jira_transition_issue` | Change status | Move to "In Review" |
|
|
| `jira_add_comment` | Add comments | Progress update |
|
|
| `jira_get_sprint_issues` | List issues in a sprint | Active sprint review |
|
|
| `jira_create_issue_link` | Link issues (Blocks, Relates to) | Dependency tracking |
|
|
| `jira_get_issue_development_info` | See linked PRs, branches, commits | Dev context |
|
|
|
|
> **Tip:** Always call `jira_get_transitions` before transitioning — transition IDs vary per project workflow.
|
|
|
|
## Direct REST API Reference
|
|
|
|
### Fetch a Ticket
|
|
|
|
```bash
|
|
curl -s -u "$JIRA_EMAIL:$JIRA_API_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
"$JIRA_URL/rest/api/3/issue/PROJ-1234" | jq '{
|
|
key: .key,
|
|
summary: .fields.summary,
|
|
status: .fields.status.name,
|
|
priority: .fields.priority.name,
|
|
type: .fields.issuetype.name,
|
|
assignee: .fields.assignee.displayName,
|
|
labels: .fields.labels,
|
|
description: .fields.description
|
|
}'
|
|
```
|
|
|
|
### Fetch Comments
|
|
|
|
```bash
|
|
curl -s -u "$JIRA_EMAIL:$JIRA_API_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
"$JIRA_URL/rest/api/3/issue/PROJ-1234?fields=comment" | jq '.fields.comment.comments[] | {
|
|
author: .author.displayName,
|
|
created: .created[:10],
|
|
body: .body
|
|
}'
|
|
```
|
|
|
|
### Add a Comment
|
|
|
|
```bash
|
|
curl -s -X POST -u "$JIRA_EMAIL:$JIRA_API_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"body": {
|
|
"version": 1,
|
|
"type": "doc",
|
|
"content": [{
|
|
"type": "paragraph",
|
|
"content": [{"type": "text", "text": "Your comment here"}]
|
|
}]
|
|
}
|
|
}' \
|
|
"$JIRA_URL/rest/api/3/issue/PROJ-1234/comment"
|
|
```
|
|
|
|
### Transition a Ticket
|
|
|
|
```bash
|
|
# 1. Get available transitions
|
|
curl -s -u "$JIRA_EMAIL:$JIRA_API_TOKEN" \
|
|
"$JIRA_URL/rest/api/3/issue/PROJ-1234/transitions" | jq '.transitions[] | {id, name: .name}'
|
|
|
|
# 2. Execute transition (replace TRANSITION_ID)
|
|
curl -s -X POST -u "$JIRA_EMAIL:$JIRA_API_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"transition": {"id": "TRANSITION_ID"}}' \
|
|
"$JIRA_URL/rest/api/3/issue/PROJ-1234/transitions"
|
|
```
|
|
|
|
### Search with JQL
|
|
|
|
```bash
|
|
curl -s -G -u "$JIRA_EMAIL:$JIRA_API_TOKEN" \
|
|
--data-urlencode "jql=project = PROJ AND status = 'In Progress'" \
|
|
"$JIRA_URL/rest/api/3/search"
|
|
```
|
|
|
|
## Analyzing a Ticket
|
|
|
|
When retrieving a ticket for development or test automation, extract:
|
|
|
|
### 1. Testable Requirements
|
|
- **Functional requirements** — What the feature does
|
|
- **Acceptance criteria** — Conditions that must be met
|
|
- **Testable behaviors** — Specific actions and expected outcomes
|
|
- **User roles** — Who uses this feature and their permissions
|
|
- **Data requirements** — What data is needed
|
|
- **Integration points** — APIs, services, or systems involved
|
|
|
|
### 2. Test Types Needed
|
|
- **Unit tests** — Individual functions and utilities
|
|
- **Integration tests** — API endpoints and service interactions
|
|
- **E2E tests** — User-facing UI flows
|
|
- **API tests** — Endpoint contracts and error handling
|
|
|
|
### 3. Edge Cases & Error Scenarios
|
|
- Invalid inputs (empty, too long, special characters)
|
|
- Unauthorized access
|
|
- Network failures or timeouts
|
|
- Concurrent users or race conditions
|
|
- Boundary conditions
|
|
- Missing or null data
|
|
- State transitions (back navigation, refresh, etc.)
|
|
|
|
### 4. Structured Analysis Output
|
|
|
|
```
|
|
Ticket: PROJ-1234
|
|
Summary: [ticket title]
|
|
Status: [current status]
|
|
Priority: [High/Medium/Low]
|
|
Test Types: Unit, Integration, E2E
|
|
|
|
Requirements:
|
|
1. [requirement 1]
|
|
2. [requirement 2]
|
|
|
|
Acceptance Criteria:
|
|
- [ ] [criterion 1]
|
|
- [ ] [criterion 2]
|
|
|
|
Test Scenarios:
|
|
- Happy Path: [description]
|
|
- Error Case: [description]
|
|
- Edge Case: [description]
|
|
|
|
Test Data Needed:
|
|
- [data item 1]
|
|
- [data item 2]
|
|
|
|
Dependencies:
|
|
- [dependency 1]
|
|
- [dependency 2]
|
|
```
|
|
|
|
## Updating Tickets
|
|
|
|
### When to Update
|
|
|
|
| Workflow Step | Jira Update |
|
|
|---|---|
|
|
| Start work | Transition to "In Progress" |
|
|
| Tests written | Comment with test coverage summary |
|
|
| Branch created | Comment with branch name |
|
|
| PR/MR created | Comment with link, link issue |
|
|
| Tests passing | Comment with results summary |
|
|
| PR/MR merged | Transition to "Done" or "In Review" |
|
|
|
|
### Comment Templates
|
|
|
|
**Starting Work:**
|
|
```
|
|
Starting implementation for this ticket.
|
|
Branch: feat/PROJ-1234-feature-name
|
|
```
|
|
|
|
**Tests Implemented:**
|
|
```
|
|
Automated tests implemented:
|
|
|
|
Unit Tests:
|
|
- [test file 1] — [what it covers]
|
|
- [test file 2] — [what it covers]
|
|
|
|
Integration Tests:
|
|
- [test file] — [endpoints/flows covered]
|
|
|
|
All tests passing locally. Coverage: XX%
|
|
```
|
|
|
|
**PR Created:**
|
|
```
|
|
Pull request created:
|
|
[PR Title](https://github.com/org/repo/pull/XXX)
|
|
|
|
Ready for review.
|
|
```
|
|
|
|
**Work Complete:**
|
|
```
|
|
Implementation complete.
|
|
|
|
PR merged: [link]
|
|
Test results: All passing (X/Y)
|
|
Coverage: XX%
|
|
```
|
|
|
|
## Security Guidelines
|
|
|
|
- **Never hardcode** Jira API tokens in source code or skill files
|
|
- **Always use** environment variables or a secrets manager
|
|
- **Add `.env`** to `.gitignore` in every project
|
|
- **Rotate tokens** immediately if exposed in git history
|
|
- **Use least-privilege** API tokens scoped to required projects
|
|
- **Validate** that credentials are set before making API calls — fail fast with a clear message
|
|
|
|
## Troubleshooting
|
|
|
|
| Error | Cause | Fix |
|
|
|---|---|---|
|
|
| `401 Unauthorized` | Invalid or expired API token | Regenerate at id.atlassian.com |
|
|
| `403 Forbidden` | Token lacks project permissions | Check token scopes and project access |
|
|
| `404 Not Found` | Wrong ticket key or base URL | Verify `JIRA_URL` and ticket key |
|
|
| `spawn uvx ENOENT` | IDE cannot find `uvx` on PATH | Use full path (e.g., `~/.local/bin/uvx`) or set PATH in `~/.zprofile` |
|
|
| Connection timeout | Network/VPN issue | Check VPN connection and firewall rules |
|
|
|
|
## Best Practices
|
|
|
|
- Update Jira as you go, not all at once at the end
|
|
- Keep comments concise but informative
|
|
- Link rather than copy — point to PRs, test reports, and dashboards
|
|
- Use @mentions if you need input from others
|
|
- Check linked issues to understand full feature scope before starting
|
|
- If acceptance criteria are vague, ask for clarification before writing code
|