Use this skill when you want to sync GitHub activity with Jira — create tickets from issues, link PRs to tickets, update status from commits, or generate sprint summaries.
77%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./external/goose-recipes/jira-sync/SKILL.mdBidirectional sync between GitHub and Jira: create Jira tickets from GitHub issues, link PRs to tickets, auto-update status from branch names/commits, and generate AI-powered sprint summaries.
pip install jira PyGithub anthropic
export JIRA_URL=https://yourorg.atlassian.net
export JIRA_EMAIL=you@yourorg.com
export JIRA_API_TOKEN=... # from id.atlassian.com/manage-profile/security/api-tokens
export GITHUB_TOKEN=ghp_...from jira import JIRA
import os
jira = JIRA(
server=os.environ["JIRA_URL"],
basic_auth=(os.environ["JIRA_EMAIL"], os.environ["JIRA_API_TOKEN"])
)
def create_ticket(project_key: str, summary: str, description: str,
issue_type: str = "Bug", priority: str = "Medium") -> str:
issue = jira.create_issue(
project=project_key,
summary=summary,
description=description,
issuetype={"name": issue_type},
priority={"name": priority},
)
return issue.key # e.g., "PROJ-123"
def transition_ticket(ticket_key: str, status: str) -> None:
"""Move ticket to a new status."""
issue = jira.issue(ticket_key)
transitions = jira.transitions(issue)
target = next((t for t in transitions if t["name"].lower() == status.lower()), None)
if target:
jira.transition_issue(issue, target["id"])from github import Github
import anthropic
gh = Github(os.environ["GITHUB_TOKEN"])
client = anthropic.Anthropic()
def sync_github_issue_to_jira(repo_name: str, issue_number: int,
project_key: str) -> str:
repo = gh.get_repo(repo_name)
issue = repo.get_issue(issue_number)
# Use Claude to write a better Jira description
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=512,
system="Convert GitHub issues to Jira tickets. Use Jira markdown. Include: Summary, Steps to Reproduce (if bug), Expected vs Actual, Environment.",
messages=[{"role": "user", "content": f"Title: {issue.title}\n\n{issue.body or ''}"}]
)
jira_description = response.content[0].text
# Determine issue type from labels
labels = [l.name for l in issue.labels]
issue_type = "Bug" if "bug" in labels else "Story" if "feature" in labels else "Task"
# Create Jira ticket
ticket_key = create_ticket(project_key, issue.title, jira_description, issue_type)
# Link back to GitHub issue
issue.create_comment(f"Jira ticket created: [{ticket_key}]({os.environ['JIRA_URL']}/browse/{ticket_key})")
return ticket_keydef generate_sprint_summary(project_key: str, sprint_name: str) -> str:
# Get completed issues this sprint
issues = jira.search_issues(
f'project={project_key} AND sprint="{sprint_name}" AND status=Done',
maxResults=100
)
issue_list = "\n".join([f"- [{i.key}] {i.fields.summary}" for i in issues])
response = client.messages.create(
model="claude-opus-4-6",
max_tokens=512,
system="Write sprint summaries for engineering teams. Be specific about what shipped. Group by theme.",
messages=[{"role": "user", "content": f"Sprint: {sprint_name}\n\nCompleted:\n{issue_list}"}]
)
return response.content[0].text| Feature | Description |
|---|---|
| Create ticket | GitHub issue → Jira ticket |
| Transition | Move ticket through workflow |
| Sprint summary | AI-generated what-shipped summary |
| PR linking | Commit message PROJ-123 → auto-link |
ProwlrBot/prowlr-marketplace
32f0050
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.