Claude Code のカスタムスラッシュコマンドで GitHub Issue 作成を自動化した

Claude Code

こんにちは、白々さじきです。

飲み会の日程調整ツールをCloudflare Workers + Hono + D1で作るこの検証プロジェクト。今回は開発中の雑談から生まれた「Issue 作成を /issue の一言で済ませる仕組み」を作りました。

なぜ Issue 作成を自動化したかったのか

きっかけはちょっとした出来事でした。

Claude Code とやり取りしている最中に「あ、これ別タスクに切り出したほうがいいな」と気づくことがあります。そのとき「じゃあ Issue 作って」と頼んだところ、こんな返事が来ました。

gh CLI がインストールされていないため、GitHub Issue を直接作成できません。

その瞬間に逆転の発想が生まれます。「gh CLI さえあれば Claude が Issue を作れる」

もう一つ、Issue の質がバラバラになる問題もありました。手で書くと「背景」を省いたり「完了条件」を忘れたり、Issue によって粒度がバラバラになります。Claude に任せればフォーマットを統一できます。

整理するとこういう課題でした。

  • gh CLI が未インストールで Claude が Issue を作れない
  • Issue の書き方の粒度が毎回ブレる
  • 「別タスクだな」と気づいた瞬間に即切り出せない

gh CLI のセットアップ

Windows なので winget でインストールします。

winget install GitHub.cli

インストール後、認証を通します。

gh auth login

GitHub.comHTTPS → ブラウザで認証、の流れです。成功するとこう表示されます。

✓ Authentication complete.
✓ Configured git protocol
✓ Logged in as sirajirasajiki

これで Claude に「gh issue create してください」と頼める状態になりました。実際にいくつか手動で依頼して Issue を作った後、「毎回頼むのも面倒だな」と思い自動化を検討します。

自動化の方法を3案検討した

案A:メモリに保存する

Claude Code にはセッションをまたいで記憶を保持する「メモリ」機能があります。Issue フォーマットをメモリに書いておく方法です。

却下理由:メモリは忘れる可能性があります。別の情報で上書きされたり、将来のセッションで読み込まれなかったりすると、フォーマットが崩れます。

案B:フックを使う

Claude Code には hooks という設定があり、ツール実行などのイベントに応じてシェルコマンドを実行できます。

却下理由:hooks はシェルコマンドを実行するものです。「この会話の内容を読んで Issue の本文を生成する」という動的な処理には使えません。フォーマットが固定された単純な操作には向きますが、今回はやりたいことと噛み合いません。

案C:カスタムスラッシュコマンドを作る(採用)

Claude Code には .claude/commands/ 配下に Markdown ファイルを置くことで、独自の /コマンド名 を定義できます。ファイルの中身はClaude への指示文です。つまりシェルコマンドではなく Claude のプロンプトとして動作します。

これなら「会話を読んで Issue を推測して、確認後に gh issue create を実行する」という流れが書けます。

カスタムスラッシュコマンド /issue の実装

配置場所によってスコープが変わる

配置場所 スコープ
~/.claude/commands/issue.md すべてのリポジトリで使えるグローバル版
.claude/commands/issue.md そのプロジェクト限定のプロジェクト版

同名コマンドが両方に存在する場合、プロジェクト版が優先されます。エラーにはならず、プロジェクト内ではプロジェクト版が使われ、他リポジトリではグローバル版が使われます。

今回はブログ記事の比較用として両方作り、プロジェクト版に差分を持たせました。

グローバル版(~/.claude/commands/issue.md)

会話の流れからバグ・課題・改善案を読み取り、GitHub Issue の下書きを作成してください。

## 手順

1. 直近の会話を読んで、Issue にすべき内容を特定する
2. 以下のフォーマットで下書きを作成し、ユーザーに提示する
3. ユーザーが確認・承認したら `gh issue create` で作成する

## Issue フォーマット

**タイトル:** (端的に課題を表す一文)

**本文:**
## 背景
(なぜこの課題が生まれたか・どんな問題が起きているか)

## やること
(具体的な対応内容を箇条書き)

## 完了条件
(何ができていれば完了とみなすか)

## 注意事項

- 下書きを提示した後、必ずユーザーの承認を待ってから `gh issue create` を実行すること
- リポジトリは現在の git リポジトリから自動判定する
- タイトル・本文が会話から読み取れない場合はユーザーに質問する

実際にこれでやってみるとこんなIssueが作成されます。

プロジェクト版(.claude/commands/issue.md)との差分

グローバル版から2点変えています。

① タスク概要セクションを追加
背景の前に概要を1段はさむことで、Issue を一覧で見たときに内容がすぐ分かります。

② アサインを自分に固定
個人プロジェクトなので常に自分がアサインされます。--assignee sirajirasajiki を毎回指定する手間がなくなります。

実際に使ってみる

会話の途中で /issue と打つだけです。Claude が会話を読んで下書きを生成します。

## タスク概要
この記事のブログ下書きを作成する

## 背景
gh CLI の導入と Claude Code のカスタムスラッシュコマンド機能を使って、
会話の流れから GitHub Issue を自動作成する仕組みを構築した。
この内容をテックブログ記事としてまとめる。

## やること
- 記事の構成を決める
- 下書きを2ファイルセットで作成する
  - drafts/weekly/2026-05-03/{記事名}.md
  - drafts/weekly/2026-05-03/wordpress/{記事名}-wp.html

## 完了条件
- .md と wordpress/*.html の2ファイルが作成されている
- 読者が同じ手順を再現できる内容になっている

「OK」と返すと gh issue create が実行されます。Issue #11 として作成されました。

おまけ:Issue の編集も gh CLI でできる

gh CLI には gh issue edit というコマンドもあります。今回、Issue #10 にフォルダ命名規則の追記が必要になったとき、ブラウザを開かずそのまま Claude に編集を依頼できました。

gh issue edit 10 --body "新しい本文"

--title でタイトル変更、--add-label でラベル追加なども可能です。

gh CLI を入れておくと Issue の作成だけでなく編集・閲覧・クローズまで Claude との会話の中で完結します。

何が解決できたか

  • 摩擦がほぼゼロになった:「別タスクだな」と思った瞬間に /issue を打てば切り出せます。ブラウザを開く必要がありません
  • フォーマットが自動で統一される:背景・タスク概要・やること・完了条件が毎回揃います
  • 会話の流れを中断しない:Issue を作るために別の画面に移る必要がなく、会話の文脈がそのまま使われます

つまずき・教訓

① コマンド追加後は新しいスレッドが必要

.claude/commands/ にファイルを追加しても、すでに開いているスレッドでは /issue が認識されません。Claude Code はスレッドの起動時にコマンドを読み込むためです。

新しいスレッドを開始すれば使えます。ただし新スレッドで以前の会話履歴を呼び出せば、文脈を引き継いだまま /issue を使えます。

教訓:カスタムスラッシュコマンドを追加したら、一度スレッドを開き直す。

② hooks は動的コンテンツの生成に使えない

hooks はシェルコマンドを実行するものです。「会話を読んで Issue の内容を推測する」といった動的な処理はできません。「特定のファイルが保存されたら自動フォーマット」のような静的な操作に向いています。

教訓:hooks は静的な自動化、カスタムスラッシュコマンドは Claude に考えさせたい自動化、と使い分ける。

③ この記事を書かせたら Claude がフォルダを間違えた

記事の下書き作成を依頼したところ、drafts/weekly/2026-05-03/ という新しいフォルダを作ってしまいました。実際には 5/2(金)と 5/3(土)は同じ週なので、drafts/weekly/2026-05-02/ に入れるべきでした。

原因は drafts/weekly/ のフォルダ命名規則が CLAUDE.md に書かれていなかったことです。Claude は「今日の日付でフォルダを作る」という判断をしましたが、このプロジェクトの慣習は「週単位でフォルダを切り、同じ週の記事は同じフォルダに入れる」です。

手動でファイルを移動し、Issue #10(CLAUDE.md へのルール追記)にフォルダ命名規則の追記も含めることにしました。

教訓:ファイルの配置ルールは CLAUDE.md に書かないと Claude が毎回違う判断をする。「暗黙の慣習」はゼロにする。

まとめ

gh CLI のインストールという偶然の気づきから、カスタムスラッシュコマンドによる Issue 自動化まで一気に作りました。

.claude/commands/ に Markdown を置くだけでコマンドが作れるのは想像より手軽でした。「Claude に考えさせてから実行する」処理はスラッシュコマンドとの相性が良く、他にも応用できそうです。

今回の仕組みはグローバルに置いているので、このプロジェクト以外でも使えます。

次にやること

  • Issue #9「トップに戻る」リンクの改善:管理ページ・参加者ページから来た場合に元のページに戻るようにする
  • Issue #10:CLAUDE.md にブログ下書きの成果物ルールを追記する

サポートのお願い

下記リンクからお買い物いただけると、ブログ運営のための費用が増え、有料サービスを利用した記事作成が可能になります。ご協力よろしくお願いします!



コメント

タイトルとURLをコピーしました