💬

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)

基本的な動作

  1. Claude が AskUserQuestion を呼び出す
  2. CLI に選択肢が表示される
  3. ユーザーが選択する
  4. 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 さんが以下のツイートで紹介されたアイデアです。

https://x.com/dannypostma/status/2017864243895538012

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>

活用例

実際のワークフローは以下の通りです。

  1. /interview [何を作るかの説明] で仕様を固める
  2. Plan mode で実装計画を立てる
  3. 実装を進める

「何を作るか」だけを伝えると、Claude がトレードオフや実装の詳細まで質問してくれるので、曖昧な要件を仕様書に変換できます。

まとめ

AskUserQuestion と skills を組み合わせると、危険な操作の前に確認を挟んだり、コミットや PR 作成のような繰り返し作業を効率化したりできます。固定の選択肢と自由入力の両方に対応しているのも便利です。

skill のプロンプトに「AskUserQuestion を使って確認する」と書いておけば、Claude が適切なタイミングで質問してくれます。自分のワークフローに合わせて skill を作ってみてください。

Discussion