read-only · source connector framework

agilab-source-connectors の俯瞰

AGIラボの運営データソース(agi-backend / Discord / note / X / Instagram / Cloudflare / Supabase / Drive)を read-only で 1 ソースずつ aggregate snapshot 化していくための connector フレームワーク。 万能アダプタを 1 個書くのではなく、 「1 source = 1 connector」 の小さなアダプタを揃え、上位のレポートやスコアカード側で組み合わせる設計。

Repository
github.com/tempi-tech/agilab-source-connectors
Workspace
/Users/kai/Develop/airi-source-connectors
Default mode
read-only · 書き込みは明示指示時のみ
Build cadence
1 connector ずつ / aggregate snapshot first
01

目的とスコープ

AGIラボには既に backend / Discord / note / X / vault / Cloudflare / Supabase など、データを持っている場所が散らばっている。 それぞれに API・CLI・vault skill・OSS が既にある。 このワークスペースは、その 「読む側のインターフェース」 を 1 ヶ所に揃える役割を持つ。 新しいデータ源を作るのではなく、既存ソースを compact / 一定の形 / 安全な経路 でアクセスできるようにすることが目的。

In scope

  • ·外部ソースの read-only ラッパ
  • ·aggregate snapshot 生成(count / rate / median / latest)
  • ·health check スクリプト
  • ·credential 取り扱いの境界線

Out of scope

  • ·書き込み系 API(deploy / DB write / production post)
  • ·新しいデータプラットフォームの自作
  • ·credentials を workspace 内に保存すること
  • ·connector に分析ロジックを詰め込むこと
02

Workspace の構造

connectors/ がソース別アダプタの本体、sources/ は参照用の外部 repo checkout、state/ は生成 snapshot、logs/tmp/ はランタイム作業領域。 書き込み可能なのは connectors/ と state/ のみで、それ以外は read-only の慣習。

agilab-source-connectors/ ├── connectors/ # source 別アダプタ — ここに書き込む │ ├── agi-backend/ # 最初の connector (setup 中) │ │ ├── README.md # purpose / safe commands / KPI 候補 │ │ ├── manifest.json # default_mode / safe_commands / blocked actions │ │ └── scripts/check.sh # head + status + wrangler のヘルスチェック │ ├── README.md # connector 設計原則 │ └── source-catalog.md # 全 8 ソースの build plan ├── sources/ # 外部 repo の checkout (read-only) │ └── agi-backend/ # github.com/tempi-tech/agi-backend ├── state/ # 生成 snapshot 専用 — secrets 禁止 │ └── agi-backend/ # 例: aggregate JSON ├── logs/ # 連結ログ — 生 transcript 禁止 ├── tmp/ # 使い捨て作業 ├── README.md # Layout / Boundaries / First Sources ├── HANDOVER.md # Source Policy / Known Sources / Safe Checks └── .gitignore # .env / node_modules / .wrangler 等を除外
.gitignore の secrets 規律
  • .env / .env.* — Workspace 外(machine-level env file)に保管する。
  • sources/*/.dev.vars — 外部 repo の secrets も commit しない。
  • state/* と logs/* と tmp/* — README 以外は ignore(生成物は再生成可能なものだけ残す)。
  • sources/* / node_modules / .wrangler — 外部 checkout と dependency は repo に入れない。
03

Connector の解剖

Connector は 1 source = 1 connector の原則で作る。 1 つの connector に全てを知らせず、上位レイヤで複数 connector の出力を組み合わせる方針。 CLI 風のインターフェース(実装が API ラッパでも script でも)を共通化することで、呼び出し側のコードを安定させる。

README.md
目的・ソース・credentials policy・safe commands・KPI 候補を 1 枚にまとめる。 connector の 「契約書」 の役割。
manifest.json
scheduling と discovery のための machine-readable メタ。 default_mode / safe_commands / blocked_without_explicit_instruction など。
scripts/
小さな collector / health check。 書き込み系は default mode から除外する。 1 ファイル = 1 用途。
state/
connector ローカル snapshot を置く場所(必要時のみ)。 基本は global /state を使い、connector 配下に閉じる必要がある時だけ作る。
04

Build 原則 — 4 つ

全ソースを同時に着手するのではなく、 1 つずつ 「最初に役に立つ snapshot」 まで持っていく。 これを破ると、 connector が中途半端な状態で並んで、 どれも使えない状況になりがち。

1 connector ずつ追加する
全部同時に作らない。 最初の 1 つが「useful な aggregate snapshot」を返すまで次に進まない。 ここを守るとデッドストック connector が増えない。
read-only から始める
書き込み系(deploy / DB write / production post)は明示指示があるまで実装しない。 default mode で安全に呼べるものだけが safe_commands に並ぶ。
既存資産を再利用する
既存 API / CLI / OSS / vault skill が先。 言語選択を目的化しない(Go / TypeScript / Python / shell — ソース側のスタックに合わせる)。
aggregate を返す
raw dump を呼び出し側に渡さず、 count / rate / median / latest の形に縮約してから返す。 上位レイヤが軽くなる。
05

ソース catalog — 8 sources

全 8 ソースの推奨 build order と、各ソースで最初に達成する「役に立つ snapshot」の定義。 Discord は vault 側に既に強い資産があるので 「rebuild せず wrap する」 のが規律。 Instagram は最後に着手して、 X / note の出力 schema が固まってから合流する。

# Source Status Existing assets First useful snapshot Gap / note
1 agi-backend setup Cloudflare Worker / Supabase schema / D1 worker tables / note sync / X OAuth / Discord webhook Membership・subscription・app activity の aggregate backend を 「source」として使う。 万能 connector の置き場にしない。
2 Discord planned vault skill: discord-log-export / discord-project-search / agi-lab-discord-context / agi-lab-discord-post コミュニティ activity サマリ 既に資産があるので wrap して normalize。 新規ツールは書かない。
3 note planned agi-backend/note-extract によるメンバー抽出、 vault に note baseline 会員数と sync 状態 → 後に記事 analytics 記事 analytics(PV / 読了率 等)の取得経路が 未確定。 手動 CSV ingest も視野。
4 X planned agi-backend の X OAuth routes、 vault の note-x-promo account public metrics snapshot posting / automation は read 経路が信頼できるまで out of scope
5 Instagram blocked 確認済みのローカル connector なし account / media public metrics or campaign response 公式 API / CLI / OSS のどれを採るか、 auth 境界も含めて 意思決定が必要
6 Cloudflare planned agi-backend が Wrangler と Workers config を持っている Worker deploy / cron / log の health サマリ read 系 Wrangler / API のみ。 default では deploy しない。
7 Supabase planned agi-backend の schema と client コード read-only な aggregate クエリ backend API が安全な aggregate を出せない箇所 だけ 使う。
8 Google Drive / Docs / Sheets planned Codex 側の Google Drive connector、 vault に canonical doc canonical ops file の鮮度 + campaign sheet サマリ connector がローカルコードではなく app 経由になる可能性が高い。

Current Priority — 4 ステップ

agi-backend を read-only source として安定化
aggregate JSON snapshot を state/agi-backend/ に最初に書く。 これが他 connector の参照雛形になる。
既存 Discord 資産を connector に wrap
vault skill 群を再実装せず、 出力形を normalize するだけ。 重複した収集ツールを作らない。
note analytics の gap を定義
記事 analytics をどこから取るか、 v0 は手動 CSV で十分か、 どちらか早く確定する側に倒す。
Instagram は最後
X / note が共通の output schema を持ってから着手。 先に作ると、 後から schema を揃え直す手戻りが大きい。
06

実例 — agi-backend connector

最初に組み立てた connector。 connectors/agi-backend/ 配下に README / manifest / check スクリプトが揃っている。 まだ aggregate snapshot 出力は実装されておらず、 ローカルテストの状況を見ながら次に進む段階。

Source
github.com/tempi-tech/agi-backend
checkout: sources/agi-backend
Default mode
read-only
credential policy: 既存の machine-level env のみ参照、 workspace 内には保存しない。
Safe commands
  • git status --short
  • git pull --ff-only
  • npm test -- --run
  • ./node_modules/.bin/wrangler --version
Blocked without instruction
  • wrangler deploy
  • remote database writes
  • KV writes
  • member sync writes
  • Discord production posts
KPI domains
  • membership
  • subscription
  • app_activity
  • worker_runs
  • note_sync
Local setup status
  • repo cloned, npm install 済
  • 17 / 19 test files pass
  • 108 tests pass / 1 fail / 2 isolated-storage errors
  • failure: connections.match_mode NOT NULL constraint

Health check スクリプト — scripts/check.sh

bash connectors/agi-backend/scripts/check.sh
#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WORKSPACE_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
REPO="${AGI_BACKEND_REPO:-$WORKSPACE_ROOT/sources/agi-backend}"

if [[ ! -d "$REPO/.git" ]]; then
  echo "missing_repo path=$REPO"
  exit 1
fi

cd "$REPO"
echo "repo=$REPO"
echo "head=$(git rev-parse --short HEAD)"
echo "status=$(git status --short | wc -l | tr -d ' ') changed_files"

if [[ -x ./node_modules/.bin/wrangler ]]; then
  echo "wrangler=$(./node_modules/.bin/wrangler --version)"
else
  echo "wrangler=missing"
fi

if [[ "${1:-}" == "--test" ]]; then
  npm test -- --run
fi

Next useful step

Next implementation
  • read-only な集計スクリプトを 1 本作る — 既存 env を読み、 aggregate counts のみを問い合わせる。
  • 出力先は state/agi-backend/*.json — 1 ファイル 1 snapshot、 再生成可能な形に縮約する。
  • Discord log export はここに追加しない — vault 側の skill が既に強いので分離維持。
  • 万能 note connector にしない — note 専用 connector で別に扱う。
07

運用規律

connector を増やしていく途中で、 ここを甘くすると 1 ヶ月後に「何を信じていいか分からない workspace」になりがち。 4 つの境界線を最低限維持する。

Connector discipline
  • 1 source per connector。 万能 connector を作らない。 上位レイヤで組み合わせる。
  • aggregate snapshot first。 raw dump を呼び出し側に渡さない(count / rate / median / latest のみ)。
  • credentials は workspace 外。 machine-level env か upstream secret store を使う。 .env を repo に置かない。
  • 外部 checkout は読み専。 sources/ 配下の repo を変更指示なく書き換えない。 deploy も default では行わない。
  • 既存資産が先。 既存 CLI / API / OSS / vault skill を wrap してから新規実装を考える。
  • 言語は source に合わせる。 Go / TypeScript / Python / shell — 言語選択そのものを目的化しない。
08

探索方法

このページから何を読み始めればよいか、 役割別の最短ルート。 ローカルに repo がある場合のコマンド例も載せている。

「全体像を知りたい」
README.mdHANDOVER.mdconnectors/source-catalog.md
「設計原則を知りたい」
connectors/README.md → このページの 03 / 04 / 07 セクション
「connector を 1 つ書いてみたい」
connectors/agi-backend/ を雛形にコピー → manifest.jsonREADME.md から書く → 最後に scripts/ を作る
「現状の health を見たい」
connectors/agi-backend/scripts/check.sh を実行 → head / status / wrangler version が返る
shell safe quick-look
# 1. ワークスペースに移動
cd /Users/kai/Develop/airi-source-connectors

# 2. agi-backend connector の health check (read-only)
connectors/agi-backend/scripts/check.sh

# 3. オプション: upstream tests を流す
connectors/agi-backend/scripts/check.sh --test

# 4. 設計を眺める
cat connectors/README.md
cat connectors/source-catalog.md
cat HANDOVER.md