From issue-flow
GitHub Issue を 1 件処理する実装オーケストレーション。Issue 番号を引数に受け取り、GitHub MCP (`mcp__github__get_issue`) で内容を取得してから planner → implementer → implementation-reviewer → security-reviewer の順にサブエージェントを呼ぶ。1 回の起動で 1 Issue だけ処理し、完了後に PR を作成して終了する。プラン / レビュー / PR サマリ / Issue 候補をすべて単一 HTML として `.claude/plan/` に書き出し、ブラウザで自動オープンしてユーザー確認に使う。
How this skill is triggered — by the user, by Claude, or both
Slash command
/issue-flow:issue-nextThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
このスキルは **Issue 1 件を完了させたら止まる**。次の Issue に進むかはユーザーが判断する。
このスキルは Issue 1 件を完了させたら止まる。次の Issue に進むかはユーザーが判断する。
ユーザーが画面で確認するもの(Open Issue 候補 / プラン / 実装レビュー / セキュリティレビュー / PR 前サマリ)は テキストでだらだら出さず、すべて単一 HTML ファイルとして .claude/plan/ 配下に書き出し、open コマンドでブラウザ表示する。これがこのスキルの一貫した方針。
gh CLI がインストールされ、対象リポジトリで認証済みであることmcp__github__list_issues / mcp__github__get_issue / mcp__github__create_issue / mcp__github__add_issue_comment / mcp__github__create_pull_request)が利用可能であることpnpm format / pnpm lint / pnpm test などが定義されていること)。pnpm 以外の場合は各 Step の pnpm コマンドを読み替えるCLAUDE.md が置かれており、load-bearing rules / 設計ドキュメントへのポインタがあること(推奨)open コマンドが使える環境(Linux なら xdg-open、WSL なら explorer.exe を読み替える).claude/plan/plan-{番号}.html が存在するか確認する。
<!--PROGRESS_STATE ... PROGRESS_STATE--> ブロック内の JSON から各ステップの status(pending / in_progress / done)を読み取って状況をユーザーに提示し、「未完了のステップから再開しますか?」を確認する。Yes なら Step 4 から再開(Step 2・3 はスキップ)。あわせて open .claude/plan/plan-{番号}.html でブラウザを開き直す(自動リロードで最新進捗が見える)。mcp__github__list_issues を呼ぶ(owner / repo / state: "open" / sort: "created" / direction: "asc" / perPage: 30)。owner / repo はカレントリポジトリの remote から判断する。pull_request フィールドが付いているものは外す)。priority:high / bug などの優先度シグナルがあるものを上に.claude/plan/issue-list.htmlprefers-color-scheme 自動切替)。<details> で「他 N 件を見る」を折りたたんで全件埋め込み{番号}」ヒントopen .claude/plan/issue-list.html を実行。.claude/plan/issue-list.html で開きました。推薦は #{番号}(理由: …)。番号を指定してください」とターミナルで一言伝え、応答を待つ。応答された番号でステップ 2 以降を進める。.claude/plan/plan-{確定番号}.html が存在すれば再開可否を確認する。mcp__github__get_issue で Issue を取得する(owner / repo / issue_number を渡す。owner / repo はカレントリポジトリの remote から判断)。返却の state / title / body / labels / assignees / milestone を後続ステップで使う。main)を最新にする:
git checkout main && git pull origin main
git checkout -b issue-{番号}-{kebab-case-summary}
ブランチ名の {kebab-case-summary} は Issue タイトルから 3〜5 語程度の英語 kebab-case で付ける。事前検証チェックリスト(必須): Issue の内容を確認する前に、参照する予定のファイルをすべてリストアップし、Read してから進む。この Session で Read していないファイルの内容を根拠にした技術的な主張を Issue・PR・ドキュメントに書かない。
state: closed の場合は警告を出してユーザー確認。docs/implementation-status.md)があれば Read して、Issue が既存の実装済み範囲・対象外範囲と衝突していないか確認する。衝突がある場合はユーザーに提示して判断を仰ぐ。Agent ツールで subagent_type: "planner" を呼び出す。プロンプトには以下を含める:
CLAUDE.md と設計ドキュメントの load-bearing rules を守ることplanner のプランが返ってきたら、実装に着手する前にスコープの大きさを評価する。
以下の基準のいずれかに該当する場合は「スコープが大きい」と判断する:
スコープが大きい場合の手順:
mcp__github__add_issue_comment を使用(owner / repo / issue_number: {元番号} / body を渡す)。body の内容例:
スコープが大きいため以下のサブ Issue に分割します:
- [ ] #{サブ1番号} {タイトル1}
- [ ] #{サブ2番号} {タイトル2}
...
mcp__github__create_issue で作成(owner / repo / title / body を渡す)。body には Parent: #{元番号} を含める。先に作成したサブ Issue から番号が払い出されるので、Step 3 のコメントは番号確定後に投稿する。git checkout -b issue-{サブ1番号}-{kebab-case-summary}
スコープが適切な場合: 評価結果をユーザーに一言伝えてそのまま Step 3.6 へ。
確定プラン(スコープ評価後の対象 Issue 用プラン)を、視覚的に確認できる単一 HTML として書き出し、ブラウザで自動オープンしたうえでユーザーから最終承認を取る。この HTML は実装中の進捗状態の唯一の永続記録も兼ねる(Markdown チェックリストは作らない)。
.claude/plan/plan-{番号}.html(番号は対象 Issue の番号。サブ Issue 分割後は最初のサブ Issue の番号)。<script src="https://cdn.tailwindcss.com"></script><script type="module">import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs'; mermaid.initialize({ startOnLoad: true, theme: window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'default' });</script>done / in_progress / pending の件数と割合をプログレスバーで表示。PROGRESS_STATE から動的に算出(後述)。flowchart LR または graph TD): ステップ間の依存関係。並列実行可能なステップは並列に並べる。クリティカルパス上のノードは色を変えて強調する。gantt または HTML/CSS の番号付きタイムライン UI): ステップ実行順を時系列で。graph のディレクトリツリー、または HTML/CSS の折りたたみツリー): 触るファイルをディレクトリ階層で視覚化。新規 / 編集 / 削除をバッジで色分け。<details> 要素。各カードのルート要素に data-step-id="{N}" を付ける): 各ステップの説明 / 対象ファイル / 受け入れ基準 / 関連 doc・Issue リンク。PROGRESS_STATE の status に応じてバッジ(灰=pending / 青パルス=in_progress / 緑✓=done)と縦線カラーを切り替える。CLAUDE.md / 設計ドキュメントに記載された load-bearing rules のうち本プランに関連するものをチェックボックス UI で並べ、「該当(守るべき)」「非該当」を視覚化。違反候補があれば赤バッジで警告。<body> 末尾に以下のフォーマットで JSON コメントブロックを 1 個だけ埋め込む。これが進捗状態の単一の真実ソース。<!--PROGRESS_STATE、終了タグは PROGRESS_STATE-->。両タグともそれぞれ単独行に置く(implementer の Edit ターゲットを安定させるため)。steps[].id は 1 始まりの連番、status は "pending" / "in_progress" / "done" のいずれか。初回生成時は全ステップ "pending"。<!--PROGRESS_STATE
{
"issue": 42,
"title": "...",
"branch": "issue-42-...",
"steps": [
{ "id": 1, "title": "X を Y に変更", "files": ["src/a.ts"], "status": "pending" },
{ "id": 2, "title": "Z のテストを追加", "files": ["src/a.test.ts"], "status": "pending" }
]
}
PROGRESS_STATE-->
<body> の最後(PROGRESS_STATE ブロックより前)に以下と同等の <script> を埋め込む。PROGRESS_STATE を抽出 → 各ステップカードと進捗サマリーバーに status を反映 → 全 done でない限り 3 秒後に location.reload() で自動リロード。<script>
(() => {
const html = document.documentElement.outerHTML;
const m = html.match(/<!--PROGRESS_STATE\n([\s\S]*?)\nPROGRESS_STATE-->/);
if (!m) return;
let state;
try { state = JSON.parse(m[1]); } catch { return; }
const counts = { pending: 0, in_progress: 0, done: 0 };
for (const step of state.steps) {
counts[step.status] = (counts[step.status] || 0) + 1;
const el = document.querySelector(`[data-step-id="${step.id}"]`);
if (el) el.dataset.status = step.status;
}
const bar = document.getElementById("progress-summary");
if (bar) bar.dataset.counts = JSON.stringify(counts);
const allDone = state.steps.length > 0 && counts.done === state.steps.length;
if (!allDone) setTimeout(() => location.reload(), 3000);
})();
</script>
[data-step-id][data-status="pending"] / [data-status="in_progress"] / [data-status="done"] に対応する見た目(色・バッジ・パルスアニメ)を Tailwind ユーティリティ + 軽い <style> で定義する。#progress-summary) は dataset.counts を読んで描画する小さなインライン JS をもう一段書いて構わない(同じ <script> 内でまとめても良い)。prefers-color-scheme でライト / ダーク自動切替。Tailwind の dark: バリアントと mermaid テーマ(default / dark)を連動させる。<div class="overflow-x-auto"> でラップ。open .claude/plan/plan-{番号}.html を実行し、デフォルトブラウザで開く。.claude/plan/plan-{番号}.html をブラウザで開きました。プレビューを確認してください」と一言伝える。open で開き直す。確定するまでループ。PROGRESS_STATE がそのまま実装フェーズの進捗管理ソースになる)。着手前に、プランの性質を見てどちらの実装者を呼ぶか決める:
implementer(haiku, デフォルト) — 機械的な編集、明確に一直線で書ける実装、コメント修正、ファイル名変更、簡単なテスト追加など。安くて速い。implementer-sonnet(sonnet) — 以下のいずれかを含む場合:
infer / mapped types を組み立てる)as any で逃げず精緻型で実装する」が成否のクリティカルパスになるタスク判断に迷ったら sonnet を選ぶ(コスト差より失敗→再実行のロスの方が大きい)。プラン承認時にユーザーに「この実装は sonnet で進めます」と一言伝えること。
Agent ツールで subagent_type: "implementer" または subagent_type: "implementer-sonnet" を呼ぶ。プロンプトには以下を含める:
.claude/plan/plan-{番号}.html実装を開始する前に
.claude/plan/plan-{番号}.htmlを Read し、<!--PROGRESS_STATEからPROGRESS_STATE-->までの JSON ブロックを抽出して未完了(statusが"pending"または"in_progress")のステップを確認すること。進捗の更新はステップごとにリアルタイムで行うこと(必須):
- 各ステップに着手する直前に、そのステップの
"status": "pending"→"status": "in_progress"に Edit する(コード変更を 1 行も書き始める前)。- そのステップのコード変更が完了したら、即座に
"status": "in_progress"→"status": "done"に Edit する(次のステップに移る前)。- つまり「N 個のステップで合計 2N 回の Edit を PROGRESS_STATE に対して行う」のが正しい動作。
禁止事項:
- 全ステップ完了後にまとめて status を更新するバッチ更新は禁止。ユーザーは HTML をブラウザで開いており、3 秒ごとの自動リロードでリアルタイム進捗を確認している。バッチ更新ではフィードバックループが壊れる。
- status の巻き戻し(一度
doneにしたものをpending/in_progressに戻す)は禁止。- status 値の独自拡張(
"skipped"/"failed"等)は禁止。"pending"/"in_progress"/"done"のみ。Edit の書き方: old_string は ステップ ID を含む 1 行の塊 を狙うこと。例えば id=3 を done にする場合:
old_string: { "id": 3, "title": "Z のテストを追加", "files": ["src/a.test.ts"], "status": "in_progress" } new_string: { "id": 3, "title": "Z のテストを追加", "files": ["src/a.test.ts"], "status": "done" }status だけを置換して title / files は変更しないこと。JSON の他のフィールド・他のステップを壊さないよう細心の注意を払う。
途中で中断・再起動した場合も
.claude/plan/plan-{番号}.htmlを Read すれば現在地がわかる。完了報告フォーマット(必須): 全ステップ完了後、最終報告に「PROGRESS_STATE 反映済み: id=1 done, id=2 done, ...」の 1 行サマリを必ず含める。これによりオーケストレータが整合チェックできる。
any にスタブして「完了」と報告したgit checkout などで巻き戻したimplementer の完了報告を受け取ったら、オーケストレータ自身が PROGRESS_STATE の整合性を確認する。implementer の更新を信用しきらず、最終状態をオーケストレータが保証する。
.claude/plan/plan-{番号}.html を Read して PROGRESS_STATE JSON を抽出。git diff --stat の出力と一致するか"done" になっているか"in_progress" のまま残っているステップがないか"done" に同期。Agent ツールで subagent_type: "implementation-reviewer" を呼ぶ。プロンプトには:
CLAUDE.mdレビュー結果を視覚化した単一 HTML として書き出す。プラン HTML と同じく、ユーザーが画面で確認できる形にする。「ユーザーが確認する画面はとことん HTML」がこのスキルの一貫した方針。
.claude/plan/review-impl-{番号}.html<script src="https://cdn.tailwindcss.com"></script>prefers-color-scheme でライト/ダーク自動切替。PROGRESS_STATE のような可変ブロックは入れない。open .claude/plan/review-impl-{番号}.html を実行。.claude/plan/review-impl-{番号}.html で開きました」と一言伝える。.claude/plan/review-impl-{番号}.html を上書き Write → open で再表示)。Critical / Major がゼロになるまで繰り返す。以下のいずれかに触れる変更がある場合のみ実行:
判断に迷ったら実行する。
Agent ツールで subagent_type: "security-reviewer" を呼ぶ。プロンプトには変更ファイル一覧と Issue 概要を伝える。agent の返答原文を保持する。
.claude/plan/review-security-{番号}.htmlsecurity review にして紫系のアクセント、Critical の表示をより目立たせる等)。graph または色分けバッジ)open .claude/plan/review-security-{番号}.html を実行し、ユーザーに「セキュリティレビュー結果を .claude/plan/review-security-{番号}.html で開きました」と伝える。
.claude/plan/plan-{番号}.html を Read し、PROGRESS_STATE JSON ブロック内の全ステップが "status": "done" になっていることを確認する。未完了(pending / in_progress)が残っている場合は implementer を呼んで対応させる。全 done 確認後、プラン / レビュー / Issue 候補 / PR サマリの HTML をすべてまとめて削除する(PR 作成完了後に実行する場合は順序を Step 7-7 に回す。テキスト確認だけ取って削除を最後にしても良い):
rm -f .claude/plan/plan-{番号}.html \
.claude/plan/review-impl-{番号}.html \
.claude/plan/review-security-{番号}.html \
.claude/plan/pr-summary-{番号}.html \
.claude/plan/issue-list.html
docs/implementation-status.md)がある場合、変更が反映すべき内容があれば更新する(shipped API 変更・新機能追加時など)。llms.txt / CHANGELOG.md 等)がある場合、API の追加・変更・削除・挙動変更が反映されているかチェックする。未反映があれば更新してからコミットに含める。pnpm format
pnpm lint
# プロジェクトに typecheck スクリプトがあれば
pnpm typecheck # または pnpm -C <package> typecheck
package.json を変更した場合は pnpm install を実行してロックファイルを更新し、コミットに含める。mcp__github__create_pull_request → format & lint)が PR 作成直前にも走るため、本ステップの実行は二重チェック。早期エラー検知のための意図的な冗長性。.claude/plan/pr-summary-{番号}.htmlready-to-merge 緑 / needs-attention 黄 / blocked 赤)git diff --stat を視覚化(+追加 -削除 の横棒バー、ファイル種別バッジ)CHANGELOG.md / README.md などの各更新有無を緑チェック / 灰未更新で視覚化open .claude/plan/pr-summary-{番号}.html を実行。.claude/plan/pr-summary-{番号}.html で開きました。PR を作成してよいですか?」とターミナルで確認。git add <変更ファイル>
git commit -m "feat/fix/...: {タイトル} (#{番号})"
git push -u origin {ブランチ名}
mcp__github__create_pull_request を使う(owner / repo / title / body / head: {ブランチ名} / base: main を渡す)。body には Closes #{番号} を含める。Closes #番号 による)。次の Issue に進むかはユーザーが判断する。open で表示してから確認)graph / gantt / 変更ファイルマップなどはマストで含める)。.claude/plan/ 配下の単一 HTML ファイルとして書き出し、open でブラウザ表示する。テキストでだらだら出力して終わらせない。すべての HTML は Step 7 でまとめて削除する(plan-{N}.html / review-impl-{N}.html / review-security-{N}.html / pr-summary-{N}.html / issue-list.html)。PROGRESS_STATE JSON コメントが進捗状態の単一の真実ソース。Markdown チェックリストは作らない。implementer は status を pending → in_progress → done の順でのみ進め、巻き戻さない。PROGRESS_STATE の JSON フォーマットを壊さない(タグの単独行配置、status 値の列挙、ステップ ID の連番を維持)。CLAUDE.md / 設計ドキュメント記載)に反する変更を検知したらブロックしてユーザーに確認。/issue-flow:issue-next {番号} の形式で Issue 番号を直接渡せる。番号を省略した場合、Step 1 で Open Issue 一覧を取得し、優先度順に並べて HTML カードでユーザーに候補を提示する。
例:
/issue-flow:issue-next 42 — Issue #42 を処理/issue-flow:issue-next — Open Issue 一覧から候補を HTML で提示し、ユーザーに選んでもらうnpx claudepluginhub a-1ro/issue-flow --plugin issue-flowGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.