Skills

/sync-jira-github

Jira チケットと GitHub PR/ブランチのステータス同期チェック。不整合を検出し修正を提案・実行する。

About

Jira チケットと GitHub PR/ブランチのステータス同期チェック。不整合を検出し修正を提案・実行する。

Category:Management
Scope:universal

Usage

Use when user says "sync jira", "jira sync", "jira github sync", "ステータス同期", "チケット同期", "sync-jira-github".

Requirements

MCP SERVERS

Atlassian

CLI TOOLS

gh

Install

Agent:
curl -sf /api/skills/sync-jira-github/download | tar xz -C .claude/skills/

Download / Upload

ZIP でダウンロード

→ Claude.ai: Customize > Skills にアップロード

Source

Sync Jira ↔ GitHub

Jira チケットと GitHub PR のステータス整合性をチェックし、不整合を修正します。

入力

  • $ARGUMENTS: プロジェクトキーや対象範囲の指定(任意)
  • プロジェクトキーが指定されない場合は LLAM を使用する

手順

1. データ収集(並列実行)

1a. GitHub のオープン/最近マージされた PR を取得

# オープンPR
gh pr list --state open --limit 50 --json number,title,author,headRefName,state,createdAt \
  --jq '.[] | {number, title, author: .author.login, branch: .headRefName, state, createdAt: .createdAt[:10]}'

# 直近マージされたPR(1週間以内)
gh pr list --state merged --limit 30 --json number,title,author,headRefName,mergedAt \
  --jq '.[] | {number, title, author: .author.login, branch: .headRefName, mergedAt: .mergedAt[:10]}'

1b. Jira のオープンスプリントのチケットを取得

Atlassian MCP を使用:

  • getAccessibleAtlassianResources で cloudId を取得
  • searchJiraIssuesUsingJql で以下の JQL を実行:
    project = <PROJECT_KEY> AND sprint in openSprints() ORDER BY key ASC
    
  • 取得フィールド: summary, status, assignee
  • jq で必要フィールドのみ抽出: {key, summary, status, assignee}

2. PR からチケットキーを抽出

PR とチケットの紐付けを以下の優先順で試みる(最初にマッチした時点で確定):

  1. ブランチ名(LLAM-\d+) を正規表現で抽出(大文字小文字不問)
    • feat/LLAM-951-sms-authLLAM-951
    • LLAM-900-page-componentLLAM-900
    • feat/llam-905-926-xxxLLAM-905, LLAM-926(複数マッチ)
  2. PR タイトル(LLAM-\d+) を抽出
    • feat(api): SMS認証 (LLAM-951, LLAM-953)LLAM-951, LLAM-953
  3. PR body(先頭500文字) — タイトルにもブランチにもない場合のフォールバック
    • gh pr view <number> --json body --jq '.body[:500]' で取得して抽出

どの方法でもチケットキーが見つからない PR は「紐付けなし」として報告する。 GitHub 先行で作られた PR(チケット未作成)のケースを想定し、これらは不整合ではなく情報提供として扱う。

3. 整合性チェック

以下のルールで不整合を検出する:

ステータス不整合

GitHub PR 状態期待する Jira ステータス不整合の場合
OPEN (draft)進行中 or BacklogOK(作業開始前の可能性)
OPEN進行中Backlog/完了 なら不整合
MERGED完了 or Ready For QA進行中/Backlog なら不整合
CLOSED (not merged)-チェック不要

その他のチェック

  • 孤立PR: ブランチ名にチケットキーがない PR(renovate/bot は除外)
  • アサイン不一致: PR の author と Jira の assignee が異なる
  • 進行中だが PR がない: Jira が「進行中」なのに対応する PR がオープンでない

4. 結果出力

4a. 同期状況サマリテーブル

チケットJira ステータスGitHub PRPR 状態判定
LLAM-XXX進行中#1234OPENOK
LLAM-YYYBacklog#1235OPEN:warning: 不整合
LLAM-ZZZ進行中--:question: PR なし

判定アイコン:

  • OK — 整合している
  • :warning: — ステータス不整合
  • :question: — PR が見つからない / 孤立PR
  • :white_check_mark: — マージ済み & Jira 完了

4b. 不整合の詳細と修正提案

各不整合について:

  • 現在の状態(Jira / GitHub)
  • 推奨アクション(Jira ステータス変更 / PR 作成 / 確認依頼)
  • 修正コマンド例

4c. 修正実行(ユーザー確認後)

ユーザーの承認を得てから、以下を実行:

  • transitionJiraIssue で Jira ステータスを更新
  • 対応する transition を getTransitionsForJiraIssue で取得してから実行
  • ただし、1つのPRから複数チケットキーが抽出された場合は自動更新しない(提案のみ表示し、個別に確認する)

5. Slack 投稿(任意)

同期結果の出力後、ユーザーに「Slack に投稿しますか?」と確認する。 投稿する場合は投稿先チャンネルも確認する(デフォルト: #sdh-clinic-dev)。

投稿フォーマット(mrkdwn)

1メッセージにまとめる:

*:arrows_counterclockwise: Jira ↔ GitHub 同期チェック*

*OK* (N件) / *:warning: 不整合* (N件) / *:question: PR なし* (N件)

:warning: *不整合:*
> LLAM-XXX: Jira=Backlog だが PR #1234 がオープン → 進行中 に変更推奨
> LLAM-YYY: PR #1235 マージ済みだが Jira=進行中 → 完了 に変更推奨

:question: *PR なし:*
> LLAM-ZZZ: 進行中 だが対応PR が見つからない

注意事項

  • renovate / bot の PR は同期チェックから除外する
  • Jira ステータスの自動変更はユーザー承認後のみ実行する
  • GitHub → Jira の方向のみ同期する(Jira → GitHub のブランチ作成は行わない)
  • メンバー名の紐付け:
    • GitHub login と Jira displayName のマッピングは、PR ブランチ名などの命名規則から動的に推測する
      • 例: feat/LLAM-1234/taro → GitHub login=taro に対応する Jira displayName を検索
    • 命名規則から推測できない場合は、ユーザーに対応表を確認し、そのセッション中はメモリ上で再利用する