人間が休んでる時こそClaude Code Actionの出番ですね
Claude Code Actions(CCA)がMaxプランで使えるようになりました。
さて、Claude Code ActionsがMaxプランで利用できることになったのはとても喜ばしいですが、問題は利用制限です。
CCAまで動かしたら、あっという間に日中に制限が来てしまい、それ以上開発を行うことができない存在になってしまうことが予想されます。
寝てる間に動かす?
寝てる間に動かす ことが少しでもできたら、多少解決しそうです。
これで日中は今まで通りに利用しつつ、夜間にも開発が勝手に進みます。
これが不労コード生活かもしれません。思い立ったら吉日と言うので、気分よく就寝するために突貫ではありますが、寝ている間にClaude Code Actionにタスクを依頼してくれる仕組みを作ることにします。
Claude Code ActionsのMaxプランでの利用対応はこちらの記事を参考にさせていただきました..!
夜間に定期でissueを拾うActions
ということで夜間に定期でissueを優先度順に拾って、CCAに投げてくれるだけのワークフローを作りました(もちろんこれもClaude Codeが)
- 夜間(23時〜6時)に30分ごとにGitHub Actionsが起動
- 優先度順(high → middle → low)で未処理のIssueを1つ選択
- 選択したIssueに @claudeメンションを含むコメント を自動投稿
- Claude Code Actionが起動し、AIがコードの修正を実行
今回はv0.1なので、既存のissueを探して、ルールに応じて、@claudeメンションを含むコメントを行うだけの簡単実装です。
30分毎というのは動作確認と実行数のバランスを雰囲気で考えた結果です、強い理由や背景はありません。
Github Actionsとn8nの両方のパターンで実装検討しましたが、今回はGithub Actionsで作ります(n8nに移行したい but GithubノードのIssueアクションにListはなかったので取り急ぎ)
Github AppからのコメントにClaude Code Actionが反応しないため、取り急ぎPATを利用しています。
name: Auto Issue Resolver
on:
schedule:
# JST 23:00-06:00の間、30分ごとに実行
# JST = UTC + 9時間
# JST 23:00 = UTC 14:00, JST 06:00 = UTC 21:00
- cron: '0,30 14-20 * * *' # UTC 14:00-20:30 (JST 23:00-05:30)
- cron: '0 21 * * *' # UTC 21:00 (JST 06:00)
workflow_dispatch: # 手動実行も可能
jobs:
process-issue:
runs-on: ubuntu-latest
steps:
- name: Find and process highest priority issue
uses: actions/github-script@v7
with:
# Personal Access Tokenを使用(設定されていない場合はGITHUB_TOKENを使用)
github-token: ${{ secrets.PERSONAL_ACCESS_TOKEN || secrets.GITHUB_TOKEN }}
script: |
// 優先度順にissueを探す
const priorities = ['high', 'middle', 'low'];
const processedLabel = 'claude-code-requested';
for (const priority of priorities) {
// 優先度ラベルがついたissueを取得(作成日時の降順)
const issues = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
labels: priority,
state: 'open',
sort: 'created',
direction: 'desc',
per_page: 100
});
// 未処理のissueを探す
const unprocessedIssue = issues.data.find(issue =>
!issue.labels.some(label => label.name === processedLabel)
);
if (unprocessedIssue) {
// @claudeメンションコメントを投稿
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: unprocessedIssue.number,
body: [
`@claude このIssue #${unprocessedIssue.number} を解決してください。`,
'',
'以下の内容に基づいて、具体的な実装方針と必要なコード変更を提案してください:',
'',
`**タイトル**: ${unprocessedIssue.title}`,
'',
'**説明**:',
unprocessedIssue.body || '説明なし',
'',
`優先度: ${priority}`
].join('\n')
});
// 処理済みラベルを追加
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: unprocessedIssue.number,
labels: [processedLabel]
});
console.log('Claude Code Action will be triggered by the mention');
return; // 1つのissueのみ処理して終了
}
}
console.log('No unprocessed issues found');
# ... (省略)
バイブスでClaude Codeに作成してもらったので、細かいところは見てもいないですが、動いてそうなのでまずはよしとします。
そして待つこと数十分。実際に定期実行が動くことも確認できました!🎉
これでissueを事前に作成・ラベルを付与することで、後は寝ている間に自動的にClaude Code Actionに依頼が行われるようになりました。
claude-code-requested
ラベルもちゃんと付与されています。
Slackのログを拾ってissueを作成
次に考えるのはissueの作成です。寝る前に事前にIssueを作成しておくべきと言われるとその通りなのですが、どうにか仕組みで解決したいところ。
そこで特定のSlackチャンネルのメッセージを定期的に拾い、自動でissueを作成するワークフローも作ってみました。
issueはLLMで解析・分解させた上で作成することにします。
今回は適当にSlackに残したメッセージ履歴から勝手にissueを作成するようにしていますが、エラーログのチャンネルと連携したら、エラーが勝手に修正される世界になりますね(明日やる)
まとめ
これで夜中に自動的にIssueを解決するシステムが生まれました。
Devin APIの時も似たようなものを作っていましたが、個人開発で定額で計算できないのは継続が難しく、止めてしまっていたので改めてClaude Code Actionで実現ができて嬉しいです。
ここまでClaude Code頼りで一気に作りましたが、もっとリッチな仕組みに育てたい気持ちが沸き起こっています。
個人開発のリポジトリはPRプレビュー環境も用意しているので、朝起きたら動作確認して、その場でマージすることもタスクによっては出来るでしょう。
(Unit Testで動作が担保されているなど)
勢いで実装・記事まで書きましたが、とりあえず朝起きたらany型が残っているという悲しい問題を解消してくれるのを心待ちにして、今日は就寝します。
今回は以上です!
Discussion
レビューでめっちゃ忙しくなりそうですね笑
笑笑ですね笑
次はレビューと動作確認の自動化です笑
githubにいくらぐらい課金しそうになりそうですか
めっちゃやりたい!!!でも、技術力というか、Issueに詳細の記載をかなり頑張らないといけなさそうなのとMaxっていう点なのが今の自分には課題かもしれないです 😢
全部AIでやりましょう!gh コマンドでタスク分解してもらったものをイシューに起票でOKです
まじか、すげーーーーーー!!!
日中利用しつつ夜間もMaxプランで1セッション使うと
月間50セッション制限に引っ掛かりやすくなりませんか?
厳密な制限ではないらしいですが