skills/github-investigator/SKILL.md
GitHub上の特定トピックに関するIssue・PR・コードの議論を調査し、要約レポートを作成するスキル。 ghコマンドを使用する。ユーザーがGitHubリポジトリでの議論の調査、Issue/PRの横断的な分析、 特定の機能・バグ・コンポーネントに関する経緯の把握、GitHubでの意思決定の追跡を求めた場合に使用すること。 「このリポジトリで○○についてどんな議論がある?」「○○の経緯を調べて」「関連するIssueやPRをまとめて」 「○○はなぜこういう設計になった?」といったリクエストにも対応する。 既存の調査レポート(md)があり「この調査の続き」「○○の調査を更新して」「再調査して」のように継続調査が 依頼された場合も、このスキルが対応する(既存レポートを読み込んで差分を追記する)。 明示的にGitHubと言及していなくても、OSSの機能議論や設計経緯の調査であればこのスキルを使う。 ただし、機能の使い方・APIリファレンス・一般的な解説など、ドキュメントやコードを直接読めば 分かる質問にはこのスキルを使わない(このスキルは「議論の経緯」「設計判断の背景」の調査用)。
npx skillsauth add range3/agent-skills github-investigatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
GitHub上である事柄(機能名、バグ、コンポーネント名など)についてどのような議論がされているかを gh CLI で調査し、要約レポートを生成する。
gh の出力を加工する際は、必ず gh に組み込まれた --jq フラグを使う。| jq や | python3 -c ... などのパイプは原則として使わない。
理由: このスキルは gh * を中心とした permission allowlist で動作する前提のため、パイプを含むコマンドは permission prompt で止まる可能性がある。Bash(jq *) も frontmatter に入れているが、現時点では Claude Code のパイプ判定にバグが残っており確実に通る保証がない。--jq 一発で完結させれば gh * パターンにそのままマッチして安定動作する。
# 良い例: --jq フラグを使う
gh issue view 123 --repo OWNER/REPO --json comments --jq '.comments | length'
gh issue view 123 --repo OWNER/REPO --json title,state --jq '"\(.title) [\(.state)]"'
# 悪い例(やらないこと)
gh issue view 123 --repo OWNER/REPO --json comments | jq '.comments | length'
gh issue view 123 --repo OWNER/REPO --json comments | python3 -c "import json, sys; ..."
--jq 一発では難しいと感じても、次の順で対処する。パイプには逃げない。
--jq には def(関数定義)、reduce、group_by、複数行式など jq のほぼ全機能が使える。複雑な変換も1つの式で書けることが多い(具体例は末尾の補足リファレンス参照)。gh 呼び出しを組み立てる。中間結果は RESULT=$(gh ... --jq '...') でシェル変数に格納できる(gh * パターンに合致する形を保てる)。注記: このルールは allowed-tools で gh と jq のみを許可していることに依存する。将来 allowlist を変更する場合はこのセクションも見直すこと。
gh CLI がインストール・認証済みであることgh auth status で認証状態を確認し、未認証ならユーザーに案内する依頼が継続調査を示唆する場合(「○○ の調査の続き」「このレポートを更新して」「再調査して」「最新の状況を反映して」など)、まず既存のレポート md を探す。既存レポートが見つかったら新規調査フロー(Step 1〜5)ではなく、継続調査モード(Step 6)に進む。
ユーザーがファイルを提示している場合: チャットに添付されている、@path/to/file.md のようにパスが明示されている、エディタで開いていることが言及されているなどの場合、そのファイルを読む。
トピック名で参照されている場合(例: 「ECConnector の調査の続き」「vLLM のメモリリーク調査どうなった?」):
find . -maxdepth 3 -name "*.md" -type f 2>/dev/null
head -10 候補ファイル.md
継続を示唆する語がない場合: 通常の新規調査として Step 1 へ進む。
見つかったレポートからは次を抽出する(詳細は Step 6 参照):
ユーザーの依頼文から以下を推測し、不明な点だけ確認する。毎回すべてを聞く必要はない。
ECConnector, authentication, memory leak)次の順で判断する。ほとんどのケースは 1〜3 のいずれかで解決する。
https://github.com/owner/repo)、owner/repo 形式、org/repo 形式が依頼文に含まれていれば、そのまま使う。nodejs, vllm, rust, kubernetes, react など、名前からリポジトリ位置が一意に決まるものは自分の知識で解決する(例: vllm → vllm-project/vllm、rust → rust-lang/rust)。LMCache/LMCache を特定 → 以降の gh コマンドはこのリポジトリを対象に実行)。リポジトリと検索キーワードが揃ったら、スコープは Issue + PR の両方で始める。曖昧な場合のみユーザーに確認する。
いきなり個別の Issue に潜ると、重要な議論を見落としたり、特定の視点に偏ったりしやすい。最初に件数と傾向をつかんでから深掘りに移ることで、調査の網羅性と効率が上がる。
# Issue 検索
gh search issues "KEYWORD" --repo OWNER/REPO --limit 30 --sort updated --order desc
# PR 検索
gh search prs "KEYWORD" --repo OWNER/REPO --limit 30 --sort updated --order desc
レート制限への配慮: GitHub Search API は認証済みで 30 requests/min。1回の調査で複数キーワードを連続検索する場合や、Step 3 で多数の Issue/PR を詳細取得する場合は、sleep 2 等で間隔を空ける。エラーになってから対処するより事前に間隔を空けた方が結果的に速い。
結果が0件の場合: キーワードが具体的すぎる可能性がある。類義語や上位概念に広げて再検索する(例: ECConnector → connector, EC)。それでも0件なら、そのトピックについてリポジトリ上で議論が行われていない旨を報告する。
結果が多すぎる場合(50件超): ラベルや期間で絞り込む。label:bug や created:>2024-01-01 などの修飾子を活用する(修飾子一覧は末尾の補足リファレンス参照)。
ここで一覧を眺め、以下のパターンを探す:
Step 2 で関連性の高い Issue/PR を特定したら、詳細を取得する。議論の全容を把握するにはコメントまで読む必要があるが、すべてを読む必要はない。関連性の高いものから優先的に読み、通常は 5〜10件 程度の詳細取得で主要な論点はカバーできる。
# Issue 詳細
gh issue view NUMBER --repo OWNER/REPO \
--json title,body,state,author,labels,comments,createdAt,closedAt,url
# PR 詳細(reviews にコードレビューの議論、files に影響範囲が含まれる)
gh pr view NUMBER --repo OWNER/REPO \
--json title,body,state,author,labels,comments,reviews,files,commits,mergedAt,url
コメントが大量にある場合(30件超): まずコメント数を確認(--json comments --jq '.comments | length')し、すべてを処理しようとしない。最新の10件と、リアクションが多いコメントを優先して読む。古い議論は結論部分だけ拾えば十分なことが多い。
コンテキスト節約: 本文やコメントが非常に長い場合(例: 1万文字超)は --jq '.body[0:3000]' のように先頭を切り出して読み、必要なら追加で読む。JSON 全文をそのまま処理せず、必要な部分だけ取り出すこと(自分のコンテキストを圧迫しないため)。
PR の差分: 差分が大きい場合は、まず files で影響範囲の概要を把握してから、必要なファイルだけ diff を確認する。1000行を超える差分は全体を読む前に必ず files JSON で範囲を確認すること。
# 差分が必要な場合
gh pr diff NUMBER --repo OWNER/REPO
議論の経緯を正確に追うために、タイムラインや関連リソースが有用な場合がある。特に「なぜこの設計判断がなされたか」を追うときは複数のソースを組み合わせる。
# Issue / PR のタイムライン(クロスリファレンスやラベル変更が含まれる)
gh api repos/OWNER/REPO/issues/NUMBER/timeline --paginate
gh issue view --json には linked PRs が含まれない。確実に取得するにはタイムライン経由か GraphQL を使う。GraphQL のほうがノイズが少ない:
gh api graphql -f query='
query($owner:String!, $repo:String!, $num:Int!) {
repository(owner:$owner, name:$repo) {
issue(number:$num) {
title
url
timelineItems(itemTypes:[CROSS_REFERENCED_EVENT, CONNECTED_EVENT], first:20) {
nodes {
__typename
... on CrossReferencedEvent {
willCloseTarget
source { ... on PullRequest { number title state url } }
}
... on ConnectedEvent {
subject { ... on PullRequest { number title state url } }
}
}
}
}
}
}' -f owner=OWNER -f repo=REPO -F num=NUMBER
フィールドの読み方:
__typename: イベント種別。CrossReferencedEvent は PR/Issue 本文での #123 参照、ConnectedEvent は GitHub UI の「Development」サイドバーから手動で link した場合に発生するwillCloseTarget (CrossReferencedEvent のみ): true なら Closes #X / Fixes #X のように Issue を閉じる宣言付きの参照、false は単なる言及。レポートで「直接の解決関係」と「単なる言及」を区別したい時に使う-F num=NUMBER は Int として渡す必要がある(-f だと文字列扱いになり Int! の型チェックでエラーになる)。逆に owner / repo のような文字列引数は -f のほうが安全(リポジトリ名が数字に見える場合に -F だと誤って数値変換される)# 議論の前提となるコードの場所や使われ方を把握したいときに使う
gh search code "KEYWORD" --repo OWNER/REPO --limit 10
リポジトリによっては設計議論が Issue/PR ではなく別の場所で行われている。次のいずれかが有効な場合がある。
gh api repos/OWNER/REPO/discussions
gh search commits "KEYWORD" --repo OWNER/REPO --limit 10
gh release list --repo OWNER/REPO --limit 20
gh release view TAG --repo OWNER/REPO
コメントや本文中の #123 や他リポジトリへの参照は、関連性が高ければ追跡する。特に以下のパターンに注目:
Closes #XX / Fixes #XX — 直接の解決関係Related to #XX — 関連する議論Depends on #XX / Blocked by #XX — 依存関係ただし、すべての参照を追う必要はない。調査目的に直結するものだけを選ぶ。
調査結果の規模に応じて適切なフォーマットを選ぶ。少数の Issue/PR しかない場合に大仰なレポートを作ると冗長になり、逆に多数の議論がある場合に簡潔すぎると情報が失われる。判断の目安は「ユーザーが結果を頭に入れられる量か」。
各項目(特に「進行中の議論」)には、調査の深さを示すマーカーを付ける:
これは「次回の継続調査で何を深掘りすべきか」の指針にもなる。すべての項目を [VERIFIED] にする必要はない。むしろ [SHALLOW] を残して優先度を伝えるほうが誠実。
小規模(該当 3 件以下、またはユーザーが一覧を一目で把握できる量): 散文で簡潔にまとめる。テンプレートを使わず、概要 + 関連リンクだけで十分。継続調査の枠組みも不要。
中規模(4〜10 件程度): 下記テンプレートの章 1〜3 と章 5 のみ使う。章 4(タイムライン)と章 6(コントリビューター)は省略可。
大規模(10 件超 / 設計判断が複数絡む): フルテンプレートを使う。
# [トピック名] GitHub 議論調査レポート
**最終更新**: YYYY-MM-DD HH:MM JST
**対象トピック**: [自然文で1〜2行。何を調べているのか、読者が一読して理解できるレベル]
**主リポジトリ**: owner/repo
**関連リポジトリ**: [本トピックに関連する他リポジトリがあれば列挙。fork、plugin、依存ライブラリ、上流など]
**検索キーワード**: `keyword1`, `keyword2`, ...
**確度マーカー凡例**: [VERIFIED] 本体を読んで確認 / [INFERRED] 複数情報源から推測 / [SHALLOW] 表面的にしか調査していない
## 1. 概要
[2〜4 段落の散文。次の3点を含める:
・このトピックは何か(読者が一読して理解できるレベルで)
・なぜ存在するか / 何を解決するためのものか
・現在の主要な論点と方向性(決着済み vs 進行中の議論)
リード段落は記事の見出しのように、興味を引き、要点を含む]
## 2. マージ済み PR / 確定した設計
[時系列または論理順で並べる]
### 2.1 [タイトル] (#番号) — YYYY-MM-DD マージ [VERIFIED]
**主導**: 名前 (handle) [複数なら列挙]
[本文: 何を変えたか、なぜそうしたか、どんな制約・トレードオフがあったか。
具体的な数値(メモリ・性能・行数)、ファイルパス、命名変更の経緯など、
後から「これはどこに実装されたのか」を辿るための錨を必ず埋め込む]
**参照**: 具体的なファイルパス、関連 RFC、コミットなど
### 2.2 ...
## 3. 進行中の議論
### 3.1 [論点タイトル] [INFERRED]
**関連 PR/Issue**: [#番号](url) (open) など
[本文: 論点の構造、誰が何を主張しているか、対立点はどこか、
技術的な背景や制約があれば併記。引用は短く・必要なときだけ]
### 3.2 ...
## 4. タイムライン
\`\`\`mermaid
gantt
title [トピック名] 開発タイムライン
dateFormat YYYY-MM-DD
section [カテゴリ1]
[項目名] (#番号) :done, YYYY-MM-DD, YYYY-MM-DD
section [カテゴリ2]
[項目名] (#番号) :active, YYYY-MM-DD, YYYY-MM-DD
\`\`\`
[mermaid を使わない場合は箇条書きでも可。視覚的に時系列が見えることが目的]
## 5. 未解決の課題一覧
| 課題 | Issue/PR | 状態 | 備考 |
|------|---------|------|------|
| [課題名] | [#番号](url) | [方向性議論中 / 作業中 / 未着手 / RFC / stale] | [短いコメント] |
## 6. 主要コントリビューター
| 名前 | GitHub | 役割 |
|------|--------|------|
| [名前] | [handle] | [このトピックでの役割を1行で] |
---
# 調査履歴
[継続調査のたびに、ここに新しいエントリを **上から(新しい順に)** 追記する。
既存のエントリは消さない。本セクションは Step 6 で更新される]
## YYYY-MM-DD の初回調査
**主要な発見**: [簡潔に、初回調査時点で何を発見したか・現状の要点]
**確認した主要 Issue/PR**: #XXX, #XXX, ...
[topic-slug]-investigation.md を提案(例: ecconnector-vllm-investigation.md)。保存場所はカレントディレクトリをデフォルトとし、ユーザー指定があればそれに従う。複数リポジトリにまたがるトピック(例: vLLM のプラグイン機構と上流の HuggingFace、fork で進行中の機能、依存ライブラリでの議論など)の場合:
owner/repo#番号 形式で書く(同じリポジトリなら #番号 のままで OK)Step 0 で既存レポートを見つけた場合は、新規調査の Step 1〜5 を踏まず、ここに来る。新規調査と異なり、既存レポートを土台にして差分だけを効率的に把握する。
レポートを読み込み、次を取得する:
抽出した PR/Issue 番号それぞれについて、現在の state と最終更新日を取得する:
# Issue
gh issue view NUMBER --repo OWNER/REPO --json number,title,state,updatedAt,closedAt
# PR
gh pr view NUMBER --repo OWNER/REPO --json number,title,state,updatedAt,mergedAt,closedAt
20件超なら sleep 2 を挟む。前回時点の state と比較して次のカテゴリに分類:
updatedAt が前回最終更新日より新しいupdatedAt が動いていない(前回 active だったもの)既存の検索キーワードで Step 2 と同様の検索を実行する。ただし updated:>YYYY-MM-DD を付けて前回最終更新日以降に絞る:
gh search issues "KEYWORD updated:>YYYY-MM-DD" --repo OWNER/REPO --limit 30
gh search prs "KEYWORD updated:>YYYY-MM-DD" --repo OWNER/REPO --limit 30
ヒットしたうち、既存レポートにない番号が新規項目。中身を Step 3 と同様に深掘りする。
本体(章 1〜6)を完全に再生成する。前回の本体を上書きする形で、最新状態を反映したフル版を作る。
確度マーカーは引き続き付ける。前回 [SHALLOW] だった項目で今回深掘りしたものは [VERIFIED] に昇格。
既存の履歴は消さず、新しいエントリを上(新しい順)に追加する。テンプレート:
## YYYY-MM-DD の更新
**前回更新**: YYYY-MM-DD
### 決着した項目
- **#XXXX (タイトル)**: [何が決着したか、いつマージ/クローズされたか]
### 動きがあった項目
- **#XXXX (タイトル)**: [どんな進展があったか、新たな議論があれば要点]
### 新規に登場した項目
- **#XXXX (タイトル)**: [概要、作成日、現在の状態]
### 静かになった項目
- **#XXXX (タイトル)**: [前回どうだったか、何日経過したか]
### 深掘りした [SHALLOW] 項目(あれば)
- **#XXXX**: [VERIFIED] に昇格。[何が分かったか]
すべてのサブセクションを毎回書く必要はない。該当がないサブセクションは省略してよい。
既存レポートと同じパスに保存する。バックアップは作らない(ファイル1つで完結する設計)。ユーザーが別の場所に保存したい場合のみ確認する。
| 状況 | 対処 |
|------|------|
| gh auth status が未認証 | gh auth login の実行を案内する |
| リポジトリへのアクセス拒否 | リポジトリの公開設定や権限を確認するよう案内する |
| 検索結果が0件 | キーワードを広げて再検索(類義語・上位概念)。それでも0件なら報告 |
| レート制限エラー (HTTP 403/429) | GitHub Search API は認証済みで 30 req/min が上限。403/429 が返ったら 30 秒以上待ってからリトライ。連続で発生する場合はユーザーに報告 |
| コメントが100件超 | 全件読まない。最新10件 + リアクション上位を優先 |
| diff が巨大(1000行超) | files で概要を先に把握し、関連ファイルだけ diff を見る |
この調査では多くの情報を統合する必要があるため、結論を急がず、収集した情報を体系的に整理してからレポートを作成すること。
本文のステップでは主要なコマンドをインラインで示している。ここでは本文に書ききれなかった補足情報をまとめる。
gh search issues と gh search prs で使える絞り込み修飾子。
| 修飾子 | 例 | 用途 |
|--------|-----|------|
| ラベル | gh search issues "KEYWORD label:bug" --repo OWNER/REPO | 特定ラベルに絞り込み |
| 著者 | gh search issues "KEYWORD author:USERNAME" --repo OWNER/REPO | 特定ユーザーの投稿に絞り込み |
| 状態 | gh search issues "KEYWORD state:open" --repo OWNER/REPO | open/closed で絞り込み |
| 作成日 | gh search issues "KEYWORD created:>2024-01-01" --repo OWNER/REPO | 特定期間に絞り込み |
| コメント数 | gh search issues "KEYWORD comments:>10" --repo OWNER/REPO | 議論が活発なものに絞り込み |
--jq で使える典型的なフィルタ式。複雑な変換が必要な場合も、原則として --jq 一発で完結させる。
# コメント数だけ取得
gh issue view 123 --repo OWNER/REPO --json comments --jq '.comments | length'
# コメントの著者一覧(重複排除)
gh issue view 123 --repo OWNER/REPO --json comments --jq '[.comments[].author.login] | unique'
# PR で変更されたファイル名の一覧
gh pr view 456 --repo OWNER/REPO --json files --jq '.files[].path'
# 変更行数が多い順にファイルを表示
gh pr view 456 --repo OWNER/REPO --json files --jq '.files | sort_by(.additions + .deletions) | reverse | .[:5] | .[] | "\(.path) (+\(.additions)/-\(.deletions))"'
# 最新5件のコメント本文だけ取得
gh issue view 123 --repo OWNER/REPO --json comments --jq '.comments | .[-5:] | .[].body'
# 関数定義を含む複雑な変換(--jq でも def や reduce が使える)
gh pr view 456 --repo OWNER/REPO --json reviews --jq '
def state_label: if . == "APPROVED" then "✓" elif . == "CHANGES_REQUESTED" then "✗" else "·" end;
.reviews | group_by(.author.login) | map({user: .[0].author.login, last: .[-1].state | state_label})
'
通常の調査は REST API(gh search / gh issue view 等)で十分だが、Issue にひもづく PR の取得や、複数オブジェクトの関連を一度に取得したいケースは gh api graphql を使う(具体例は Step 4 を参照)。
testing
Fetch subtitles/transcripts from YouTube videos and use them as context for summarization, analysis, translation, or Q&A. Use this skill whenever a user shares a YouTube URL and asks to summarize, explain, or discuss the video content, or when they explicitly ask for subtitles or a transcript. Trigger on any youtube.com, youtu.be, or YouTube Shorts link that appears in conversation where understanding the video content is needed.
testing
Capture architectural decisions made during a coding session and append them as ADR (Architecture Decision Record) files to the project's docs/decisions/ directory, following MADR 4.0.0. Use this skill whenever the user asks to write ADRs, record decisions, document design choices, save session rationale, summarize a session's design output, or wraps up a session that produced non-trivial technology, structural, or process choices. Triggers on phrases like "ADR", "decision record", "意思決定", "設計判断を記録", "セッションをまとめて", "決定事項を残して", "ADR書いて" — and at the end of sessions with notable architectural changes, even when the user does not say "ADR" explicitly.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.