Pull Request #29 · Change Guide

リポジトリの作成・削除を検知し
.github-privateのREADMEをAIで自動更新

coffiso org内でリポジトリが増減するたびに、.github-privateprofile/README.mdにあるリポジトリ一覧テーブルを、Workers AIによる自動分類つきで最新化するCloudflare Workerを追加しました。

main ← feat/github-private-readme-updater commit 1785e92 34 files changed 1094 additions / 1 deletion Workers AI 使用

何が変わったか

新規Workerアプリ apps/github-private-readme-updater を追加し、リポジトリのライフサイクルイベントとREADMEの自動更新を仲介します。

1

Webhook受信

repository.created / repository.deleted をorg全体から受信し、対象がcoffiso配下かを検証します。

実装:src/repository-webhook.ts

2

AIによる分類

Workers AIがリポジトリ名・説明から既存のREADMEセクションへ分類し、短い説明文をJSON schema制約付きで生成します。

実装:src/services/categorizer.ts

3

README同期

カタログ(Markdownテーブル)を解析・更新し、専用GitHub App経由で.github-privateへコミットします。

実装:src/services/repository-catalog-sync.ts

権限を分離した2つのGitHub App

1つのAppにWebhook受信と書き込みを両方持たせず、役割ごとに最小権限のAppへ分割しました。

Coffiso Repo Watcher

  • coffiso org全体にインストール(repository_selection: all
  • 権限:repository Webhookの受信のみ、リポジトリへの書き込み権限なし
  • 役割:新規/削除イベントを検知してWorkerへ通知するだけ

Coffiso Private Profile Writer

  • .github-private リポジトリのみにインストール(repository_selection: selected
  • 権限:contents: write(README更新に必要な最小権限)
  • 役割:README.mdの読み取り・コミットのみを行う
GitHubのsingle_file権限は2024年2月以降、新規Appでは非推奨のため、当初案からcontents: write+インストール先の限定に設計変更しました。

リポジトリ作成時の実行フロー

01 Webhookrepository.created受信
02 README取得writer Appでprofile/README.mdを読む
03 AI分類Workers AIでセクション・説明を生成
04 コミットテーブルへ行を追加してpush

削除時(repository.deleted)は同じ経路で該当行を除去します。既存の行が無い場合は何もしません(冪等)。

AIによるカテゴリ分類

項目内容
モデル @cf/meta/llama-3.3-70b-instruct-fp8-fast(Cloudflare Workers AIバインディング経由)
入力 リポジトリ名・説明・既存READMEのセクション見出し一覧
出力 JSON schemaでheading(既存セクションのいずれか)とdescription(短文)に制約
ログ Cloudflareダッシュボードの Workers AI ログに、モデル・プロンプト・レイテンシ等がバインディング利用時点で自動記録される(追加設定不要)

権限設計のポイント

Webhook検証

署名検証(HMAC)を必ず行い、失敗時は処理を中断。Webhook secretは平文でログ・引数に出さない方針を徹底。

最小インストール範囲

Writer Appは.github-private単体にのみインストールし、他リポジトリへの書き込み経路を作らない。

資格情報の保管

秘密鍵・Webhook secretはコード・リポジトリに一切含めず、2箇所にバックアップしています。

Cloudflare Secrets

GITHUB_APP_ID / GITHUB_PRIVATE_KEY / GITHUB_WEBHOOK_SECRET(watcher)、README_GITHUB_APP_ID / README_GITHUB_PRIVATE_KEY(writer)をWorker Secretsへ設定。

AWS Parameter Store

/engineering-automations/github-private-readme-updater/{watcher,writer}/* にSecureStringとしてバックアップ(KMS: alias/aws/ssm)。

検証結果

pnpm checkformat / lint / typecheck / knip / duplicates / skills 全通過
80%+line/branch/function/statement カバレッジ
実リポジトリE2E作成→AI分類→README更新を実環境で確認
deleted E2Eユーザー判断で見送り(ユニットテストで代替)