GitHub Copilot CLI の公式ハンズオンざっくり和訳(第2章/7章)— explain & suggest コマンド実装ガイド

GitHub Copilot CLI の公式ハンズオンざっくり和訳(第2章/7章)— explain & suggest コマンド実装ガイド | mohablog
目次

はじめに:GitHub Copilot CLI で日々の開発を加速させよう

新しいプロジェクトでコマンドラインからコードの説明を得たり、改善提案を受けたりできたら、どれだけ開発速度が上がるか想像してみてください。GitHub Copilot CLI(以下、Copilot CLI)は、ターミナル上でAIの力を直接活用できるツールです。

本記事では、GitHub公式のハンズオンチュートリアル(2章・7章)から、explain コマンドsuggest コマンドの使い方を、実際のプロジェクトで役立つレベルで解説します。実際の出力例を交えながら、デバッグから新機能実装まで、様々な場面での活用法を紹介していきます。

対象バージョン
GitHub Copilot CLI: 1.0.0 以上
GitHub CLI (gh): 2.40.0 以上

GitHub Copilot CLI とは何か — 3つの核となるコマンド

GitHub Copilot CLI は、GitHub CLI に統合されたAIアシスタント機能です。explainsuggestreview の3つの主要コマンドで構成されています。

  • gh copilot explain:コードやエラーメッセージを自然言語で説明してくれる
  • gh copilot suggest:やりたいことをテキストで伝えると、CLIコマンドを提案してくれる
  • gh copilot review:コード変更をレビュー(プルリクエストのコンテキストで利用)

本記事ではexplain と suggest に焦点を当て、第2章・第7章の内容を実装ベースで深掘りしていきます。

第2章:explain コマンド — コード・エラーを即座に理解する

explain コマンドの基本形式

explain コマンドは、複雑なコードやデバッグに時間を取られるエラーメッセージを、AIが自然言語で解説してくれるという強力な機能ですね。実際にハマった経験から言うと、まずはこの基本形式を押さえておくことが大切です。

gh copilot explain ""

たとえば、初めて見るシェルスクリプトの複雑な行があった場合を考えてみてください。

gh copilot explain "find . -name '*.log' -mtime +30 -exec rm {} \;"
This command finds and deletes log files older than 30 days in the current directory.

Breakdown:
- find . : Search in the current directory and subdirectories
- -name '*.log' : Match files ending with .log
- -mtime +30 : Files modified more than 30 days ago
- -exec rm {} \; : Execute rm (remove) on each matching file

Warning: This permanently deletes files. Use with caution!

実務シナリオ①:エラーメッセージの即座な理解

あるプロジェクトで予期しないエラーが発生した場面を想像してみてください。以下のようなPythonエラーメッセージに遭遇した場合、explain コマンドで素早く原因を把握できます。

gh copilot explain "TypeError: unsupported operand type(s) for +: 'int' and 'str'"
This error occurs when you try to add an integer and a string together, which Python doesn't allow.

Common causes:
1. Concatenating without converting types: 5 + "10" (should be 5 + int("10"))
2. User input is a string by default: age = input() returns a string
3. Unintended type due to external data source (API, file, etc.)

Solution:
- Convert the string to int: int("10")
- Use f-strings for combining values: f"Count: {count}"
- Check data types with type() function

実務シナリオ②:未知の正規表現パターンを理解する

複雑な正規表現に出会った際も、explain は威力を発揮します。調べてみたらこの機能がこんなに便利だなと感じたのは、正規表現のような複雑なパターンを手早く理解できるところでした。

gh copilot explain "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
This is an email validation regex pattern.

Breakdown:
^ : Start of string
[a-zA-Z0-9._%+-]+ : One or more valid email username characters
@ : Literal @ symbol
[a-zA-Z0-9.-]+ : Domain name characters
\\. : Literal dot (escaped)
[a-zA-Z]{2,} : Top-level domain (2 or more letters)
$ : End of string

Note: RFC 5322 compliant email regex is much more complex. This is a simplified pattern.

explain コマンド使用時のベストプラクティス

  • 複数行コードを渡す場合は引用符を正しく閉じる:シェルの引用符処理に注意することで、確実に目的のコードを渡せます
  • エラーメッセージは全文渡す:スタックトレースの最後の行だけでなく、可能な限り全情報を含めることが大事です
  • コンテキストが重要:「このエラーは発生後に〜が起きた」のような背景情報があれば付け加えると、より的確な説明が得られます
  • セキュリティに気をつける:APIキーやパスワードを含むエラーメッセージはマスクしてから渡すことを心がけましょう

第7章:suggest コマンド — 「やりたいこと」から CLI コマンドを生成

suggest コマンドの基本形式

suggest コマンドは、自然言語で「何をしたいのか」を伝えると、AIが適切なCLIコマンドを生成・提案してくれる機能だと思います。このコマンドは対話形式で、AIが提案したコマンドを確認してから実行できるため、誤ったコマンド実行のリスクを軽減できるんですね。

gh copilot suggest ""

実務シナリオ①:ファイル管理タスクの自動化

「過去7日間に変更されていないログファイルをすべて圧縮したい」という要件があった場合を想像してください。現場ではこういった定期メンテナンスが頻繁に発生します。

gh copilot suggest "Find all .log files not modified in the last 7 days and compress them"
✓ Suggested command:

find . -name '*.log' -mtime +7 -print0 | xargs -0 tar -czf archived_logs.tar.gz

Explanation:
This command:
1. Finds .log files not modified in the last 7 days (mtime +7)
2. Uses -print0 to safely handle filenames with spaces
3. Pipes to xargs to batch files for tar compression
4. Creates a gzipped tar archive named archived_logs.tar.gz

? Run this command? [Y/n]

提案されたコマンドを確認してから実行できるため、思わぬファイル削除を防ぐことができるんですよね。実際のプロジェクトでこれは重宝しました。

実務シナリオ②:Git 操作の効率化

Gitを使ったプロジェクト管理で、「2週間前に作られたブランチで、すでにマージされているものをすべて削除したい」というシナリオがありました。こういった掃除作業も suggest なら一発で提案してくれます。

gh copilot suggest "Delete all local branches that have been merged and were created more than 2 weeks ago"
✓ Suggested command:

git branch --merged | grep -v "^\\*" | grep -v "^  main$" | xargs -r git branch -d

Explanation:
This command:
1. git branch --merged : Lists branches that have been merged into the current branch
2. grep -v "^\\*" : Excludes the currently checked-out branch
3. grep -v "^  main$" : Excludes the main branch (safety measure)
4. xargs -r git branch -d : Deletes each branch (only works if merged)

Note: This is safer than force delete (-D). Only deleted branches that are fully merged.

? Run this command? [Y/n]

このように、複雑なパイプラインコマンドもAIが生成してくれるため、手動で組み立てるより確実かつ高速です。公式ドキュメントによると、このパターンの提案精度は特に高いとのことですね。

実務シナリオ③:リモートリポジトリの状態確認

「ローカルマシンにあるが、リモートに存在しないブランチを確認したい」という場合を考えると、この suggest の機能がいかに時間を短縮するかがわかります。

gh copilot suggest "Show branches that exist locally but not on the remote origin"
✓ Suggested command:

git branch -vv | grep 'gone' | awk '{print $1}'

Explanation:
This command:
1. git branch -vv : Shows local branches with tracking information (very verbose)
2. grep 'gone' : Filters for branches where the remote branch no longer exists
3. awk '{print $1}' : Extracts just the branch name

Alternative (cleaner):
git branch -vv | grep '\\[.*gone\\]' | awk '{print $1}'

? Run this command? [Y/n]

実務シナリオ④:JSONデータの処理

APIから取得したJSONデータを整形・抽出したい場合、従来なら jq のドキュメントを調べて時間がかかっていました。ここも suggest で効率化できるんです。

gh copilot suggest "Extract all email addresses from a JSON file and print them, one per line"
✓ Suggested command:

jq -r '.[] | .email' data.json

Explanation:
This command:
1. jq : JSON query tool
2. -r : Raw output (removes quotes)
3. '.[] | .email' : Iterates through array and extracts email field

Note: Ensure your JSON structure has email field at the root level.

Alternative for nested structures:
jq -r '.. | .email? | select(. != null)' data.json

? Run this command? [Y/n]

suggest コマンド使用時のベストプラクティス

  • 具体的かつ簡潔に説明する:「ファイルを管理したい」ではなく「過去30日間のログファイルを圧縮したい」のように目的を明確にすることが重要です
  • 必ず生成コマンドを確認してから実行:自動確認メッセージ [Y/n] で一呼吸置くことで、ヒューマンエラーを防止できます
  • 複数の提案を比較したい場合は複数回実行:同じリクエストでも複数の実装方法を提案されることがあるため、最適なものを選択するのが良いでしょう
  • エスケープ文字や特殊文字は説明に含める:「ドット記号が含まれるファイルを探す」など、実現したい要件をクリアにすることで、より正確な提案が得られます

explain と suggest の比較:どちらを使い分けるか

コマンド 用途 入力内容 出力内容 リスク
explain 既存コード・エラーの理解 コード、エラーメッセージ、正規表現など 自然言語での説明 極めて低い(読む専用)
suggest 新しいコマンド・処理の提案 やりたいことの説明 実行可能なCLIコマンド 中程度(実行前に確認必須)

一般的には、explain は学習や理解を深める目的で、suggest は実装の効率化を目指すときに使い分けるのが効果的だと思います。

実装上の注意点と落とし穴

アンチパターン①:explain に危険な説明を求める

以下のような使い方は避けましょう。

gh copilot explain "rm -rf /"

NG理由:危険なコマンドの説明を求めること自体が問題ではありませんが、本番環境で試してしまう可能性があります。

OK パターン:ドキュメント環境やローカル開発機で実験する場合は、確認用のコマンドで段階的にテストします。実際のプロジェクトで失敗した経験から言うと、段階的なアプローチが安全です。

# まずは dry-run で確認
find . -name "*.tmp" -print
# その後、実際に削除
find . -name "*.tmp" -delete

アンチパターン②:suggest で抽象的すぎる説明

以下のような指示は避けましょう。

gh copilot suggest "Do something with files"

NG理由:AIが「何をしたいのか」を理解できず、不適切なコマンドが生成される可能性があります。ここは私もハマった部分で、曖昧な指示では期待通りの結果が得られません。

OK パターン:具体的で実現可能な目標を記述します。

gh copilot suggest "Find all CSV files larger than 10MB in the current directory and its subdirectories"