Webhook受信
repository.created / repository.deleted をorg全体から受信し、対象がcoffiso配下かを検証します。
実装:src/repository-webhook.ts
Pull Request #29 · Change Guide
coffiso org内でリポジトリが増減するたびに、.github-privateのprofile/README.mdにあるリポジトリ一覧テーブルを、Workers AIによる自動分類つきで最新化するCloudflare Workerを追加しました。
新規Workerアプリ apps/github-private-readme-updater を追加し、リポジトリのライフサイクルイベントとREADMEの自動更新を仲介します。
repository.created / repository.deleted をorg全体から受信し、対象がcoffiso配下かを検証します。
実装:src/repository-webhook.ts
Workers AIがリポジトリ名・説明から既存のREADMEセクションへ分類し、短い説明文をJSON schema制約付きで生成します。
実装:src/services/categorizer.ts
カタログ(Markdownテーブル)を解析・更新し、専用GitHub App経由で.github-privateへコミットします。
実装:src/services/repository-catalog-sync.ts
1つのAppにWebhook受信と書き込みを両方持たせず、役割ごとに最小権限のAppへ分割しました。
repository_selection: all)repository Webhookの受信のみ、リポジトリへの書き込み権限なし.github-private リポジトリのみにインストール(repository_selection: selected)contents: write(README更新に必要な最小権限)single_file権限は2024年2月以降、新規Appでは非推奨のため、当初案からcontents: write+インストール先の限定に設計変更しました。
削除時(repository.deleted)は同じ経路で該当行を除去します。既存の行が無い場合は何もしません(冪等)。
| 項目 | 内容 |
|---|---|
| モデル | @cf/meta/llama-3.3-70b-instruct-fp8-fast(Cloudflare Workers AIバインディング経由) |
| 入力 | リポジトリ名・説明・既存READMEのセクション見出し一覧 |
| 出力 | JSON schemaでheading(既存セクションのいずれか)とdescription(短文)に制約 |
| ログ | Cloudflareダッシュボードの Workers AI ログに、モデル・プロンプト・レイテンシ等がバインディング利用時点で自動記録される(追加設定不要) |
署名検証(HMAC)を必ず行い、失敗時は処理を中断。Webhook secretは平文でログ・引数に出さない方針を徹底。
Writer Appは.github-private単体にのみインストールし、他リポジトリへの書き込み経路を作らない。
秘密鍵・Webhook secretはコード・リポジトリに一切含めず、2箇所にバックアップしています。
GITHUB_APP_ID / GITHUB_PRIVATE_KEY / GITHUB_WEBHOOK_SECRET(watcher)、README_GITHUB_APP_ID / README_GITHUB_PRIVATE_KEY(writer)をWorker Secretsへ設定。
/engineering-automations/github-private-readme-updater/{watcher,writer}/* にSecureStringとしてバックアップ(KMS: alias/aws/ssm)。