繰り返し作業をClaude Codeのカスタムコマンドにした。
「次何するんだっけ」がなくなった話

はじめに

前回の記事では、AIに仕様書(スペックMD)を先に書かせることで、コードの手戻りを減らす話をしました。

今回はその続きです。仕様書を挟む流れが定着してきたころ、別の問題が出てきました。

「毎回同じ説明をClaudeにしている」問題です。

シリーズ4本目です。

悩んでいたこと

このサイトでは、UIコンポーネントの事例ページを1件ずつ追加していく作業が繰り返し発生します。

1件追加するには、だいたい次のような流れが必要です。

  1. 仕様書(スペックMD)を読み込む
  2. デザインルールや実装ルールを確認する
  3. HTML / CSS / JS を作る
  4. サイト全体のデータファイルにエントリを追加する
  5. ブラウザで動作を確認する
  6. サンプルコードの整合性チェックを実行する
  7. サイトマップを更新する
  8. リリース前のチェックリストを確認する

8ステップある。多い。

しかも作業量によっては「HTMLまで作ったところで今日は終わり、続きは明日」ということも起きる。次の日に再開するとき「あと何が残ってたっけ」ってなる。

Claudeに毎回「今日は仕様書ができているので、HTMLを作って、そのあとデータファイルも更新してください」と説明するのも地味に面倒でした。もっと言えば、説明し忘れてステップが飛ぶこともある。

具体的に困ったこと①:修正に気づいても忘れて公開してしまう

チャットでやり取りしながら作業していると、途中で「あ、ここ直した方がいいな」と気づく瞬間がある。でもそのままチャットの流れで作業を続けて、修正を忘れたまま公開してしまうことがあった。後日ページを見て「あ、直してなかった」と気づいて再修正。公開後の修正は地味にストレスでした。

具体的に困ったこと②:やることが揃ったり揃わなかったりする

「HTMLを作って」と依頼したとき、あるときはデータファイルもサイトマップも一緒に作ってくれる。あるときはHTMLだけで終わる。Claudeの気分次第(?)で結果がバラバラでした。

データファイルの更新が抜けていると、トップページのカード一覧に表示されないため、ブラウザで動作確認するときに「あれ、カードが出ない」となってその都度対処が必要でした。

コアの問題:作業フローが頭の中にしかない

仕様はファイルに書いてある。デザインルールもファイルに書いてある。でも「何をどの順番で実行するか」は毎回自分が覚えていないといけなかった。

Claudeへの指示の粒度によって、やってくれることとやってくれないことが変わる。その不安定さが積み重なって、毎回の作業に微妙なストレスがありました。

「カスタムコマンド」という機能を使うことにした

Claude Codeには「カスタムコマンド」という機能があります。

ひとことで言うと、「よく使う指示をファイルに保存しておいて、短い一言で呼び出せる仕組み」です。

仕組みはシンプルで、プロジェクト内の .claude/commands/ というフォルダにMarkdownファイルを置くだけ。たとえば create-example.md というファイルを置けば、チャットで「/create-example を実行して」と伝えるだけで、そのファイルに書いた手順をClaudeが読んで実行してくれます。

「スラッシュ(/)コマンド」とも呼ばれますが、言葉を聞いてもよくわからなかったので補足します。Slack や Discord に「/announce」みたいな命令がありますよね。あのイメージです。自分でオリジナルの命令を追加できて、使うときは「/命令名」と伝えるだけ。

大事なのは、コードを一行も書かなくてよいところです。ファイルの中身は普通の日本語の文章です。「まずこれをやって、次にこれをやって」という手順を書くだけで動きます。

もう一つ大事なことがあります。このコマンドファイル自体、自分で一から書かなくてよいということです。

「こういう作業を繰り返しているんだけど、コマンドにできる?」とClaudeに聞いて、一緒に作ってもらいました。自分の作業フローを説明すると、「それはこう整理できますね」「この順番の方がよくないですか」「このステップは失敗したときどうしますか」と、考えていなかった観点まで出してくれます。

「AIで作業を自動化するツールを、AIと一緒に作る」という構図が面白いなと思いました。仕様書(スペックMD)を先に詰めてからコードを作る流れと全く同じです。ファイルの中身が固まってから「では書いて」とお願いするだけ。

実際に作った2つのコマンド

作業の途中で中断することがあるので(HTMLを作ったら一度確認してから続ける)、2つに分けることにしました。

作成コマンド(/create-example)

このコマンドを呼ぶと、仕様書を読み込み → 実装ルールを確認 → HTML / CSS / JS を生成 → データファイルを更新、という流れで進みます。完了後は「ブラウザで確認して、問題なければ /release-example を実行して」と自動で案内してくれます。

リリースコマンド(/release-example)

このコマンドを呼ぶと、サンプルコードの整合性チェックを実行 → 「ブラウザで確認してOKと入力してください」と表示して一時停止 → 「OK」を受け取ったらサイトマップを更新 → リリース前チェックリストを全項目確認して ✅ / ❌ で結果を表示、という流れになります。

コマンドファイルの中身はこんなもの

実際のファイルを見せます。作成コマンドのファイルの冒頭部分です。

以下の手順で作業を進めてください。対象IDは「$ARGUMENTS」です。

作業開始時にチェックリストを全項目表示し、
各ステップ完了のたびにリストを更新してください。

## チェックリスト

- [ ] 1. 仕様書(スペックMD)読み込み
- [ ] 2. 参照ドキュメント確認
- [ ] 3. データファイルの順番確認
- [ ] 4. HTML 作成
- [ ] 5. CSS 作成
- [ ] 6. JS 作成
- [ ] 7. データファイル更新

$ARGUMENTS というのは、コマンドを呼ぶときに渡した引数に置き換わります。たとえば「/create-example を実行して。対象IDは form-textbox-5」と伝えると、$ARGUMENTSform-textbox-5 に変わります。

チェックリストは作業が進むたびに ✅ に更新されていきます。「今どこにいるか」が視覚的に一目でわかる。

ファイルの残りは各ステップの詳細な手順が書いてあります。「このファイルを読み込め」「この形式でエントリを追加しろ」という指示を、普通の日本語で書いたものです。

自分の繰り返し作業に置き換えるなら、たとえばこういうイメージです。

毎週のレポート作成なら

必要なステップを書き出すだけでいい。「データを確認して」「グラフを作って」「本文を書いて」という手順がそのままコマンドになる。

お客様への返信フローなら

確認すべき項目をリスト化するだけ。「件名を確認して」「過去のやり取りを見て」「返信案を3パターン出して」という手順を書けばいい。

コードのレビュー作業なら

確認観点をチェックリストにするだけ。毎回「セキュリティ、パフォーマンス、可読性を見て」と打つ代わりに、コマンドを呼ぶだけになる。

「毎回同じことをClaudeに説明している作業」があれば、それがコマンド化の候補です。

なぜ全自動にしなかったか

リリースコマンドが途中で止まる設計にしたのは、意図的なものです。

サンプルコードのブラウザ確認だけは、人間の目が必要だと思っていました。「動くか動かないか」は機械で確認できる。でも「意図した動きになっているか」「見た目がおかしくないか」は、自分の目で見ないとわからない。

全部自動で流してしまうと、このチェックが省略されやすくなる。あえて止まる設計にすることで、確認のタイミングが自然に生まれます。

全自動にできるのにあえてしない。どこを人間が判断するかを最初から決めておくと、作業の安心感が違います。

バイブコーディングに慣れてきたころに気づいた感覚ですが、AIに任せすぎると後からのリカバリーが大変になる場面がある。自動化の範囲は意識的に決めた方がいいと思っています。

コマンド自体もチャットで設計した

面白いのは、このコマンドを作る過程もチャットで行ったところです。

自分がやっていた作業フローを説明して(「まず仕様書を確認して、次にHTMLを作って、最後にデータファイルを更新して...」)、「どこをコマンドにするか」「2つに分けるのはどうか」という話を一緒に詰めました。それをもとにコマンドファイルを作ってもらいました。

仕様書(スペックMD)を書く前にチャットで詰める作業と同じ構図です。「何をどう作るか」を先に言語化してから、ファイルに落とす。

バイブコーディングでありがちな「気づいたら思ってたものと違うものができてた」問題を、コマンド作成でも同じ方法で避けました。

実際に使ってみて

事例ページを1件追加する作業で実際にこのコマンドを使ってみました。

全体の感触は「思った以上によかった」というのが正直な感想です。毎回チャットで数回やり取りして進めていた作業が、コマンドを呼ぶだけで流れが分かりやすくなりました。

チェックリストの効果が特に大きかったです。各ステップが終わるたびにリストが更新されるので、「今どこにいるか」が視覚的にわかる。これまでは「次何するんだっけ」と自分で確認していた部分がなくなりました。

リリースコマンドの「ブラウザで確認してOKと入力」という一時停止も、実際に機能しました。確認 → フィードバック → 続行という流れが自然でストレスがなかったです。

コマンド外の修正依頼も普通にチャットでできるので、「コマンドに縛られて融通が効かない」感覚は一切ありませんでした。途中でデモの内容に不足があると気づいたときも、そのままチャットで「ここを直してほしい」と伝えて対応してもらいました。

一点だけ補足すると、「/create-example と入力すれば動く」というよりは「/create-example を実行してと伝えるとClaudeが代わりに動かしてくれる」というイメージが正確です。最初に少し戸惑ったので先に書いておきます。

まとめ

繰り返し作業のフローをカスタムコマンドに焼き付けた話でした。

やったことはシンプルです。「毎回Claudeに説明していた手順」を、Markdownファイルに書き出した。それだけです。コードは一行も書いていません。

この仕組みが嬉しいのは、ファイルが「作業マニュアル」として残ることです。自分の頭の中にしかなかったフローが、ファイルになって見える。明日また再開するときも、チームの誰かに引き継ぐときも、このファイルを渡せばいい。

バイブコーディングで開発を続けていると、「点」の作業をずっとやっていることに気づきます。「このページを作って」「この機能を追加して」と1つずつ頼む。でも実際の開発は「流れ」があって、決まった手順が繰り返されています。

その流れをコマンドという形で定義すると、3つのことが変わります。

Claudeの動きが安定する

毎回の指示の粒度に関係なく、同じ手順で動いてくれます。「今日は説明が雑だったから抜けが出た」ということがなくなります。

自分が「流れを管理する人」になれる

細かい手順を覚える必要がなくなり、「次は何を作るか」「ここの仕様はどうするか」という判断に集中できます。

積み上がっていく

コマンドファイルはプロジェクトに残り続けます。フローを改善したくなったらファイルを更新する。作業のやり方がどんどん洗練されていきます。

「同じことをClaudeに毎回説明しているな」と感じる作業があれば、それがコマンド化のサインです。

最後まで読んでいただきありがとうございました。