🤖

[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キーだけです。
私が開発していますので、フィードバック大歓迎です。

Get started

Discussion