[Perstack] コードを読んで回答するAI GitHub Issues Botを自作しよう
GitHub Issueに自動回答するAIボット、見たことありますよね。でもほとんどがアカウント作らされたり、課金必須だったり。
LLM APIキーだけで自作できたら?
Perstack使えばできます。ファイル2つコピー、シークレット1つ追加、終わり。
動いてるやつ: このIssue、ボットが実際にコード読んで回答してます。
注意: コードをLLMに読ませるかどうかは自己判断でお願いします。
何ができるか
- 👀 処理中はリアクションで通知
- 🔍 コードベースを実際に読んで回答(推測じゃない)
- 💬 アクティビティログ付きで回答
- 💰 コストはLLM API使った分だけ
アクティビティログ:
💭 I need to understand how the runtime state machine works...
📁 Listing: packages/runtime/src
📖 Reading: runtime-state-machine.ts
💭 Found the state transitions...
✅ Done
セットアップ(5分)
Step 1: ファイルをコピー
exampleリポジトリからコピー:
your-repo/
├── .github/workflows/issue-bot.yml ← ワークフロー
└── scripts/checkpoint-filter.ts ← 出力整形
ワークフローが動くタイミング:
- 新しいIssueが作成されたとき
-
@perstack-issue-botを含むコメントが投稿されたとき
Step 2: シークレット追加
Settings → Secrets → Actions → ANTHROPIC_API_KEY
以上。Issueを作成して動作確認してみてください。
カスタマイズ
独自ルールでボットを作ることもできます。
1. perstack.tomlを作成
model = "claude-sonnet-4-5"
[provider]
providerName = "anthropic"
[experts."my-issue-bot"]
description = "Custom issue bot for my project"
instruction = """
You are an issue bot for the Acme project.
## Rules
- Always check docs/ directory first
- Add labels: use `gh issue edit --add-label`
- "bug" for bug reports
- "feature" for feature requests
- "question" for questions
- If the issue is about authentication, mention @security-team
- Keep answers under 500 words
"""
[experts."my-issue-bot".skills."@perstack/base"]
type = "mcpStdioSkill"
command = "npx"
packageName = "@perstack/base"
requiredEnv = ["GH_TOKEN", "GITHUB_REPO", "ISSUE_NUMBER"]
2. perstack startでローカルテスト
前提: GitHub CLIがインストールされて認証済みであること。
export ANTHROPIC_API_KEY=your-key
export GH_TOKEN=$(gh auth token)
export GITHUB_REPO=owner/repo
export ISSUE_NUMBER=123
npx perstack start my-issue-bot "Answer issue #$ISSUE_NUMBER"
対話的なTUIが開いて、ボットが考えて、ファイル読んで、回答を生成する。
動作確認をしたらまた定義を変更し、また実行。の繰り返し。
3. 満足したらpush
ワークフローを更新:
run: npx perstack run --config ./path/to/perstack.toml my-issue-bot "Answer issue #$ISSUE_NUMBER"
ブランチにpushしたら、カスタムボット完成。
これがagent-first development — テキストで振る舞いを定義、対話的にテスト、準備できたらデプロイ。コード変更なし、プロンプトだけ。
仕組み
なぜagent-firstができるのか
Perstack Runtimeがキモです。Expert定義(TOMLファイル、要はただのテキスト)をランタイムが実行する。コードにコンパイルされるわけではない。
つまり:
- どこでも同じ動作: ローカル、CI、本番 — Expertは同じように動く
- リビルド不要: プロンプト変えて、また実行、それだけ
- ポータブル: ブランチにpushすれば動く
ランタイムが全部やってくれます。
LLM接続、ツールコール管理、イベントストリーミング。あなたはExpertが何をするかを定義するだけ。
Skills & MCP
ExpertはSkillsを通じて外部と連携します。ツールはMCPサーバーを使うのがデフォルトです。
@perstack/baseはファイル操作(readTextFile, listDirectory)、コマンド実行(exec)などを提供します。ランタイムがMCPサーバーを起動して、環境変数を渡して、ツールコールをルーティングします。
[experts."my-bot".skills."@perstack/base"]
requiredEnv = ["GH_TOKEN"] # ランタイムがMCPサーバーに渡す環境変数
Event Stream
Observableです。ランタイムはJSON eventをstdoutに出力します。
{"type":"callTool","toolCall":{"toolName":"readTextFile","args":{"path":"src/index.ts"}}}
{"type":"completeRun","text":"Here's the answer..."}
スクリプトにパイプすれば、リアルタイムUI、ロギング、システム連携など、様々な形で使えます。
checkpoint-filter.tsを参考にしてください。
Perstackとは
AIエージェント版npmです。モジュラーなエージェントを定義、レジストリに公開、パッケージみたいに組み合わせることができます。
ベンダーロックインなし。サブスクなし。コードとAPIキーだけです。
私が開発していますので、フィードバック大歓迎です。
Discussion