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
ghInstall
Agent:
curl -sf /api/skills/sync-jira-github/download | tar xz -C .claude/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 とチケットの紐付けを以下の優先順で試みる(最初にマッチした時点で確定):
- ブランチ名 —
(LLAM-\d+)を正規表現で抽出(大文字小文字不問)feat/LLAM-951-sms-auth→LLAM-951LLAM-900-page-component→LLAM-900feat/llam-905-926-xxx→LLAM-905,LLAM-926(複数マッチ)
- PR タイトル —
(LLAM-\d+)を抽出feat(api): SMS認証 (LLAM-951, LLAM-953)→LLAM-951,LLAM-953
- PR body(先頭500文字) — タイトルにもブランチにもない場合のフォールバック
gh pr view <number> --json body --jq '.body[:500]'で取得して抽出
どの方法でもチケットキーが見つからない PR は「紐付けなし」として報告する。 GitHub 先行で作られた PR(チケット未作成)のケースを想定し、これらは不整合ではなく情報提供として扱う。
3. 整合性チェック
以下のルールで不整合を検出する:
ステータス不整合
| GitHub PR 状態 | 期待する Jira ステータス | 不整合の場合 |
|---|---|---|
| OPEN (draft) | 進行中 or Backlog | OK(作業開始前の可能性) |
| 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 PR | PR 状態 | 判定 |
|---|---|---|---|---|
| LLAM-XXX | 進行中 | #1234 | OPEN | OK |
| LLAM-YYY | Backlog | #1235 | OPEN | :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 を検索
- 例:
- 命名規則から推測できない場合は、ユーザーに対応表を確認し、そのセッション中はメモリ上で再利用する
- GitHub login と Jira displayName のマッピングは、PR ブランチ名などの命名規則から動的に推測する