Claude Code の AskUserQuestion を skills と組み合わせて対話的ワークフローを作る
Claude Code には AskUserQuestion という、ユーザーに選択肢付きの質問を投げかけるツールがあります。これを skills と組み合わせると、対話的なワークフローが作れます。
この記事では AskUserQuestion の概要と、実際に使っている skill の例を紹介します。
AskUserQuestion の概要
AskUserQuestion は、Claude Code がユーザーに選択式の質問を表示するツールです。CLI 上に選択肢が出て、矢印キーで選べます。
主要パラメータ
| パラメータ | 説明 |
|---|---|
questions |
1〜4つの質問を配列で指定 |
question |
質問文 |
header |
短いラベル(UI表示用、12文字以内) |
options |
2〜4つの選択肢(label + description) |
multiSelect |
複数選択を許可するか(デフォルト: false) |
基本的な動作
- Claude が
AskUserQuestionを呼び出す - CLI に選択肢が表示される
- ユーザーが選択する
- Claude が選択結果を受け取り、次の処理を行う
提示された選択肢以外に「Other」を選んで自由入力もできます。
skills の基本
skills は .claude/skills/ に Markdown ファイルとして置きます。YAML フロントマターで name を指定すると、スラッシュコマンドで呼び出せます。
---
name: my-skill
description: このskillの説明
---
# My Skill
ここに skill の説明を書きます。
Claude はこの指示に従って動作します。
これを .claude/skills/my-skill/SKILL.md として保存すれば、/my-skill で呼び出せます。
skill 内で「ユーザーに確認してから進める」「選択肢を提示する」といった指示を書いておくと、Claude が AskUserQuestion を使って対話的に処理を進めてくれます。
詳しくは公式ドキュメントを見てください。
実践例1: コミット&プッシュ skill
ステージされた変更から Conventional Commit 形式のメッセージ候補を生成して、選択→コミット→プッシュまで行う /commit-push skill です。
AskUserQuestion の使いどころ
- コミットメッセージ候補(3つ)からの選択
- プッシュするかどうかの確認
skill ファイル
.claude/skills/commit-push/SKILL.md として保存してください。
---
name: commit-push
description: ステージされた変更から日本語のConventional Commitメッセージ候補を3つ生成し、ユーザーに選択させてコミット・プッシュを実行する。
---
# commit & push
ステージされた変更内容を分析し、日本語のConventional Commit形式でコミットメッセージ候補を生成してユーザーに選択させ、リモートへのプッシュまで行う。
## ワークフロー
### 1. ステージされた変更の確認
以下のコマンドを実行する。
- `git diff --cached --stat` - 変更ファイル一覧
- `git diff --cached` - 詳細な差分
変更がない場合は「ステージされた変更がありません。`git add` で変更をステージしてから再度実行してください。」と通知して終了。
### 2. コミットメッセージ候補の生成
変更内容を分析し、**Conventional Commit形式**で**3つ**の日本語コミットメッセージを生成。
**フォーマット**: `type(scope): 説明`
- `type`: feat, fix, docs, style, refactor, test, chore
- `scope`: 変更対象のモジュール/機能名(任意)
- `説明`: 日本語で簡潔に(50文字以内推奨)
**候補の多様性**
- 候補1: 最も具体的で詳細な説明
- 候補2: やや抽象的・簡潔な説明
- 候補3: 異なる観点(別のtype/scopeの可能性)
### 3. ユーザーへの選択肢提示
AskUserQuestionツールを使用する。
- `header`: "コミット"
- `question`: "コミットメッセージを選択してください"
- `options`: 生成した3つの候補(labelにメッセージ、descriptionに補足説明)
### 4. コミットの実行
選択されたメッセージ(または「その他」で入力されたカスタムメッセージ)でコミット実行。
### 5. プッシュの確認
AskUserQuestionツールを使用する。
- `header`: "プッシュ"
- `question`: "リモートにプッシュしますか?"
- `options`:
- `label`: "プッシュする" / `description`: "現在のブランチをoriginにプッシュ"
- `label`: "プッシュしない" / `description`: "コミットのみで終了"
「プッシュする」が選択された場合は以下を実行する。
1. `git rev-parse --abbrev-ref HEAD` で現在のブランチ名を取得
2. `git push -u origin <ブランチ名>` でプッシュ実行
実践例2: PR 作成 skill
PR テンプレートと変更差分から下書きを自動生成して、確認後に gh コマンドで PR を作る /pr-generator skill です。
AskUserQuestion の使いどころ
- コミット範囲の選択(ブランチ全体/最新1件/カスタム)
- ベースブランチの選択
- 下書き内容の確認
- マージ先ブランチの選択
skill ファイル
.claude/skills/pr-generator/SKILL.md として保存してください。
---
name: pr-generator
description: PRテンプレートと変更差分を元にPRの下書きを自動生成し、確認後ghコマンドでPRを作成する。
---
# PR作成
PRテンプレートと変更差分を元に下書きを生成し、確認後PRを作成する。
## ワークフロー
### 1. PRテンプレートの読み込み
以下の順序でPRテンプレートを探索し、最初に見つかったものを読み込む。
1. `.github/pull_request_template.md`
2. `pull_request_template.md`
3. `docs/pull_request_template.md`
テンプレートが見つかった場合、その構造に従って下書きを生成。
### 2. コミット範囲の選択
AskUserQuestionツールを使用する。
- `header`: "範囲"
- `question`: "PRに含めるコミット範囲を選択してください"
- `options`:
- `label`: "ブランチ全体(ベースブランチからの差分)" / `description`: "現在のブランチの全コミットを含める"
- `label`: "最新コミット1件" / `description`: "直近1件のコミットを対象"
- `label`: "カスタム" / `description`: "直近N件、コミットハッシュ、ブランチ名などを指定"
「ブランチ全体」を選択した場合、AskUserQuestionでベースブランチを確認する。
- `header`: "ベース"
- `question`: "どのブランチからの差分を取得しますか?"
- `options`:
- `label`: "develop" / `description`: "developブランチからの差分"
- `label`: "main" / `description`: "mainブランチからの差分"
- `label`: "その他" / `description`: "別のブランチを指定"
### 3. 差分の取得
選択に応じてgit diffを実行する。
- **ブランチ全体**: `git diff <ベースブランチ>...HEAD` と `git log <ベースブランチ>..HEAD --oneline`
- **最新コミット1件**: `git diff HEAD~1..HEAD` と `git log -1 --oneline`
- **カスタム**: ユーザーに詳細を確認(例: 直近N件 → `HEAD~N..HEAD`、特定ハッシュ → `abc123..HEAD`)
### 4. 下書きの生成
テンプレートの各セクションに対応する内容を生成し、@tmp/pr フォルダに出力。
下書きファイル生成後、ユーザーにファイルの絶対パスを明示的に表示。
### 5. ユーザー確認
下書き内容を表示し、AskUserQuestionで確認する。
- `header`: "確認"
- `question`: "この内容でPRを作成しますか?"
- `options`:
- `label`: "このまま作成" / `description`: "現在の内容でPRを作成"
- `label`: "修正が必要" / `description`: "修正箇所を指示"
「修正が必要」の場合はユーザーの指示に従って修正し、再度確認。
### 6. ベースブランチの確認
AskUserQuestionツールを使用する。
- `header`: "ベース"
- `question`: "マージ先のブランチを選択してください"
- `options`:
- `label`: "develop" / `description`: "developブランチにマージ"
- `label`: "main" / `description`: "mainブランチにマージ"
- `label`: "その他" / `description`: "別のブランチを指定"
### 7. PR作成
確認OKが出たら、ghコマンドでPRを作成。
```bash
gh pr create --draft --assignee @me --title "変更内容の要約" --body-file tmp/pr/XXXX.md --base <選択したブランチ>
```
作成後、PRのURLを表示。
実践例3: インタビュー skill
仕様を固める前にユーザーに質問を繰り返し、詳細な仕様書を生成する /interview skill です。Danny Postma さんが以下のツイートで紹介されたアイデアです。
AskUserQuestion の使いどころ
前の2つの例は「決めたことを実行する」タイプの skill でした。この skill は逆に「何を作るかを決める」タイプです。AskUserQuestion を何度も呼び出し続け、技術的な実装の詳細や UI/UX の方針、トレードオフなど、あらゆる角度から質問していきます。インタビューが終わると仕様書をファイルとして書き出します。
allowed-tools: AskUserQuestion, Write で使えるツールを制限しているのも重要なポイントです。Claude が実装や検索に走らず、ひたすら質問に徹してくれます。
skill ファイル
---
name: interview
argument-hint: [instructions]
description: ユーザーに詳細なインタビューを行い、仕様書を生成する。
allowed-tools: AskUserQuestion, Write
---
# インタビュー
ユーザーの指示に基づき、AskUserQuestion ツールを使って詳細なインタビューを行う。技術的な実装、UI/UX、懸念事項、トレードオフなど、あらゆる方面について深く質問を続ける。明白な質問は避け、実装に直結する深い質問を優先する。インタビューが完了したら、仕様書をファイルに書き出す。
<instructions>$ARGUMENTS</instructions>
活用例
実際のワークフローは以下の通りです。
-
/interview [何を作るかの説明]で仕様を固める - Plan mode で実装計画を立てる
- 実装を進める
「何を作るか」だけを伝えると、Claude がトレードオフや実装の詳細まで質問してくれるので、曖昧な要件を仕様書に変換できます。
まとめ
AskUserQuestion と skills を組み合わせると、危険な操作の前に確認を挟んだり、コミットや PR 作成のような繰り返し作業を効率化したりできます。固定の選択肢と自由入力の両方に対応しているのも便利です。
skill のプロンプトに「AskUserQuestion を使って確認する」と書いておけば、Claude が適切なタイミングで質問してくれます。自分のワークフローに合わせて skill を作ってみてください。
Discussion