こんにちは。この界隈でスキルといえばAIエージェントのスキルを指すようになった今日この頃、皆さんいかがお過ごしでしょうか。
弊社でも主にClaude Codeの活用が進んでおり、開発効率の改善を職務とする筆者もスキルの実装などに力を注いでいます。
今回の題材
今回は、マージリクエスト (MR) を出した後の対応を全部やってくれるスキルを作ったときの話です。これまでの作業でMRができた後でこのスキルを起動することで、AIは以下のことを行います。
- CIが通るのを待つ
- (CIが通らなかったら修正してpushする)
- CIが通ったらレビュー依頼を出す
- レビューが通るかコメントが来るのを待つ
- (コメントが来たら対応する)
- レビューが通ってマージできる状態になったらユーザーに報告
自立したエージェント的な動きを手元のClaude Codeにやらせるイメージですね。
ポイントは、2回ある待つフェーズをどうするかです。
CLI + ポーリングで待つ
AIはCLIを使うのが得意なので、CLIを使って現在のマージリクエストの情報を取得してもらいます。弊社はGitLabを使用しているので、GitLabのCLIであるglabを用います。
例えば、CIの状況を取得するには以下のコマンドを使用できます(プロジェクトとブランチから対象のコミットを自動判定してくれます)。
glab ci status --compact
ぼく「じゃあこのコマンドを使ってCIの完了を待ってください!」
「 sleep 60 && glab ci status --compact」
「まだCIが実行中です。引き続き待機します。」
「 sleep 60 && glab ci status --compact」
「まだCIが実行中です。引き続き待機します。」
「 sleep 90 && glab ci status --compact」
「 sleep 90 && glab ci status --compact」(だんだん無言になっていく)
「 sleep 120 && glab ci status --compact」
「CIが通りました! レビューを依頼します。」
(以下略)
ちょっと問題がありますね。
ポーリングを1回するたびにコンテキストを消費し、経済的ではありません。
また、経験上このように進捗のないポーリング作業はAIが飽きる問題があります。上の例のようにちょっと sleep の時間を細かく変えてくるとか、効率化を狙ったのか複雑なシェルスクリプトを組んできて毎回毎回実行を許可しないといけないとか、あるいは飽きて途中で作業をやめてしまうといった問題が発生します。
この記事ではこの問題に対処し、AIを飽きさせずコンテキスト効率も良いポーリングを実現するために使用したテクニックを紹介します。
ポーリング用シェルスクリプト
一言で言うと、ポーリングを行うためのラッパーシェルスクリプトを用意しました。
使い方は単純で、初回実行はこうします。名前はkaopollingとしています。弊社では社内向けのものにkao云々という名付けをしがちです。
kaopolling <command>...
例えば、date -Iminues (現在時刻を分まで返すコマンド)をポーリングしてみましょう。初回コマンドを実行するとこうなります。
% kaopolling date -Iminutes
2026-01-29T15:56+09:00
---
To continue polling, run:
kaopolling --hash 23d2bdc date -Iminutes
初回は即座にコマンドが終了します。そして、コマンドの出力の下にTo continue polling, run: というAI向けの指示が書かれています。
2回目以降の実行では--hashを与える必要があります。上記の出力にあるハッシュは、コマンドの実行結果の文字列をハッシュ化したものです。
お分かりですね。kaopollingは、--hashが与えられた場合に出力結果が前回と変わるまで何も出力せずにポーリングを続けます。そして、違う結果が得られたときにその結果を出力して終了します。
kaopolling --hash 23d2bdc date -Iminutes
2026-01-29T15:57+09:00
---
Change detected!
To continue polling with the new state, run:
kaopolling --hash 777d110 date -Iminutes
ポーリング用スクリプトの効果
このようなコマンドをAIに使わせることで、以下の効果が得られます。
コンテキストの節約: AIから見れば、変化が検知されるまでコマンドが返らないことにより、「1回の変化検知=1回のコマンド実行」となります。そのため、変化があるまではコンテキストが消費されません。
AIが飽きない: 前述の通り、進歩がないまま同じことを繰り返させるとAIがすぐ飽きます。一方、このコマンドであれば、AIが動くのは前回と変化があったときであり、「着実に進んでいる」という文脈が自然と形成されます。
以下は実際のClaude codeの実行ログの一部です。
⏺ Bash(kaopolling --hash 7908b3c glab ci status --compact)
(結果省略)
⎿ (timeout 10m)
⏺ Excellent! lint_react passed! Let me continue polling to confirm final success.
⏺ Bash(kaopolling --hash fae1b45 glab ci status --compact)
(結果省略)
⎿ (timeout 5m)
⏺ All lint and test jobs passed. Storybook test is running now. Let me continue polling.
⏺ Bash(kaopolling --hash dd9f3e2 glab ci status --compact)
(結果省略)
⎿ (timeout 10m)
⏺ 🎉 CI passed! All jobs successful. Now let me add the review labels.
進歩的な文脈が形成され、最後は「🎉 CI passed!」と喜んでいますね。
簡単な説明をスキルに含めておけば、AIはこのkaopollingをうまく使いこなしてくれることが分かっています。
また、Claude Codeの場合、bashスクリプトのタイムアウトは最大10分です(環境変数で調整可能)。
レビューを待つ場合などは10分では足りないですが、実は問題ありません。
10分を超えても終了しなかったbashスクリプトを、Claude Codeは自動的にバックグラウンドに移行させることができます。こうすれば、Claude Codeは一旦停止しますが、数時間後にレビューが返ってきたら自動的にClaude Codeが作業を再開します。
スキルであらかじめ「レビューが返ってくるには数時間かかることもある」旨を言い含めておくことで、Claude Codeは特に違和感を持たずにこの挙動を選択してくれるようです。
スクリプトをスキルに同梱するときの工夫
Claude Codeによるスキルのドキュメントによれば、このようなスクリプトをスキルに同梱するときは、このような構成が望ましいとされます。
|
+-- SKILL.md
|
+-- scripts
|
+-- kaopolling.sh
こうすれば、「./scripts/kaopolling.shを実行して」のような指示で実行してくれます。
ただ、今回、このような単純な構成では問題がありました。このような場合、実際にはAIは以下のようなコマンドを実行します。
cd path/to/skill && ./scripts/kaopolling.sh glab ci status --compact
./scripts/kaopolling.shがスキルのディレクトリからの相対パスであることを理解して実行するのは賢いのですが、今回はglabの結果がカレントディレクトリに依存しているため、こうされては困るのです。
それに対する対策として、今回はちょっと無理矢理ですが、スキルの実行開始時にコマンドをPATHにインストールしちゃう方法を選びました。
|
+-- SKILL.md
|
+-- packages
|
+-- kaopolling
|
+-- package.json
|
+-- kaopolling.sh
このようにして、スキルに「実行開始時に、毎回 npm i -g ./packages/kaopolling して kaopolling をインストールすること」という指示にしています。
こうすることで、カレントディレクトリを移動せずに kaopolling glab ci status --compact を実行可能です。
npmを使用していますが、中身はシェルスクリプトです。弊社の開発環境だとNode.jsがよく普及しているのでこうしているだけです。
このやり方により、安定してkaopollingをAIに実行してもらうことが可能になりました。
まとめ
この記事では、開発作業効率化のためのスキルで、効率良いポーリングをAIにさせる方法を紹介しました。
スキルはプロンプト芸だけで成り立つのではなく、AIに適したツールを用意してあげることが重要です。この記事がスキル開発の発想のきっかけになれば幸いです。
今回kaopollingのソースコードは公開していませんが、この記事の情報があれば同等のものをAIに実装してもらうことができるでしょう。
ちなみに、GitHub CLI (gh) であればCIが通るまで何も出力しない機能が備え付けられていますので、CIに関しては自前でポーリングする必要は無さそうです。このようなAIフレンドリーなインターフェースがCLIに備え付けるのが今後のトレンドになるかもしれません。
とはいえ、kaopollingは汎用的に使えるコマンドとしてデザインしたので、きっと今後も何かに役立つでしょう。