name: supabase-sync
description: Verify and synchronize Supabase resources (migrations + Edge Functions) between the local repository and the linked remote project for ai_coordinate. Use this skill when the user wants to apply pending migrations, deploy an Edge Function, check drift between local and remote state, or confirm DB / Function readiness before/after a release. Triggers include "マイグレーション適用", "マイグレーション同期", "リモートと一致してる?", "drift チェック", "db push", "supabase migration apply", "Edge Function デプロイ", "supabase functions deploy", "image-gen-worker デプロイ", "supabase 周り整えて", "次の開発に進める状態か確認して".
Supabase Sync
このリポジトリの本番 Supabase プロジェクトは AI coordinate(ref: hnrccaxrvhtbuihfvitc, Sydney)。
supabase/migrations/*.sql(DB スキーマ)と supabase/functions/*/(Edge Function コード)が
ローカル正本で、リモートとの整合性を保つことが「次の開発に支障が出ない」最低条件。
このスキルは、マイグレーション同期と Edge Function デプロイの両方を一つのチェック動線で扱う。
トリガー
- マイグレーション系: 「マイグレーション適用して」「db push」「drift チェック」「リモートとローカル揃ってる?」
- Edge Function 系: 「functions deploy」「image-gen-worker デプロイ」「Edge Function 反映」
- 総合: 「supabase 周り整えて」「次の開発に進める状態か確認して」「リリース前にチェック」
- 開発開始時の起点確認(「データベースと関数最新?」など)
プロジェクトガードレール
- Active プロジェクトは 必ず
AI coordinate(ref: hnrccaxrvhtbuihfvitc) であること。- 同じ Supabase アカウントに
katakanahanashi(ref: dqdjabblnuvkblqjwwbg, Tokyo)が存在する。Active がそちらになっていたら 即停止してユーザー確認。
- 同じ Supabase アカウントに
- CLAUDE.md の規約に従う:
- 破壊的操作(
DROP TABLE,TRUNCATE,DELETE without WHERE等)は事前にユーザー承認を得ること - rollback / down マイグレーションはユーザー承認なしに実行しない
- Edge Function の削除はユーザー承認なしに実行しない
- 認証情報をチャット出力やコミットメッセージに残さない
- 破壊的操作(
.env.localの Supabase 以外の秘密情報(OpenAI / Gemini / Stripe / Resend)には触れない- main / master ブランチへの直接 push は行わない(git 操作は別物として扱う)
0. 事前確認(必須、両ワークフロー共通)
supabase projects list
- Active 行(
●)が AI coordinate か確認 - 別プロジェクトが Active なら以下で対処してユーザーに報告:
supabase link --project-ref hnrccaxrvhtbuihfvitc
Part 1: マイグレーション同期
1.1. Drift チェック
supabase migration list
出力フォーマット:
Local | Remote | Time (UTC)
20260517110000 | 20260517110000 | 2026-05-17 11:00:00
ローカルファイル数も比較:
ls supabase/migrations/*.sql | wc -l
supabase migration list | grep -cE "^[[:space:]]+[0-9]"
drift の機械的判定:
supabase migration list 2>&1 | awk -F'|' '/^[[:space:]]+[0-9]/ {
local=$1; remote=$2;
gsub(/ /,"",local); gsub(/ /,"",remote);
if (local != remote) print "MISMATCH: local=["local"] remote=["remote"]"
}'
1.2. ケース別の対応
1.2a. 完全同期(Local == Remote 全行)
正常。次のステップ(Edge Function チェック等)に進む。
1.2b. Local-only(未適用マイグレーションあり)
- 未適用ファイルの SQL を
cat supabase/migrations/<timestamp>_*.sqlで確認 - 破壊的キーワードの検査:
何かヒットしたらユーザー承認を得るまで進めない。grep -iE "DROP TABLE|TRUNCATE|DELETE FROM [^;]+;|ALTER .+ DROP COLUMN" supabase/migrations/<timestamp>_*.sql - ユーザーに SQL 内容と影響範囲を見せて承認を得る
- 適用:
supabase db push - 適用後再度
supabase migration listで同期確認
1.2c. Remote-only(ローカルに無いマイグレーションがリモートで適用済み)
勝手に migration repair で履歴を書き換えない。以下のいずれかをユーザーに提案:
- 推奨:
supabase db pullでローカルにマイグレーションファイルを取り込む(履歴を破壊しない) - 必要時:
supabase migration repair --status reverted <timestamp>(履歴書き換え、承認必須)
1.2d. 順序の不整合(履歴のあいだに割り込み)
危険な状態。即停止し、ユーザーに状況報告。
1.3. 適用後の検証
supabase migration list全件で local == remote を確認- 重要テーブルに変更が入った場合は
supabase db remote query "SELECT ... FROM information_schema.columns WHERE table_name='...'"で列を確認
Part 2: Edge Function デプロイ
このリポジトリには複数の Edge Function があり、変更内容によって必要な再デプロイ対象が変わる。
2.1. デプロイ対象の特定
自明なケース
supabase/functions/<name>/*を直接変更 → その関数を再デプロイ
shared/ 配下を変更した場合
shared/ 配下のファイルは複数の Edge Function から import されている。変更時は依存関数すべてを再デプロイする必要がある。
# 例: shared/generation/openai-image-model.ts を変更した場合
grep -rln "shared/generation/openai-image-model" supabase/functions/
主な共有モジュールと依存関数の対応(変更時の参考):
| 共有ファイル | 影響する Edge Function |
|---|---|
shared/generation/openai-image-model.ts |
image-gen-worker |
shared/generation/prompt-core.ts |
image-gen-worker |
shared/generation/errors.ts |
image-gen-worker |
shared/generation/style-prompts.ts |
image-gen-worker |
shared/generation/one-tap-style-metadata.ts |
image-gen-worker |
迷ったら grep -rln "<shared-file-path>" supabase/functions/ で確認する。
2.2. デプロイ実行
supabase functions deploy <function-name>
例:
supabase functions deploy image-gen-worker
出力の読み方
Uploading asset (...)行:アップロードされたファイル群(shared/ 配下も含まれる)Deployed Functions on project hnrccaxrvhtbuihfvitc: <name>→ 成功WARNING: Docker is not running→ ローカル開発専用の警告で、リモートデプロイには影響しない。無視して可
失敗時
- 認証エラー →
supabase loginを再実行 - ファイルが見つからない → カレントディレクトリがリポジトリルートか確認
- 関数名タイポ →
supabase functions listで正式名を確認
2.3. デプロイ後の検証
supabase functions list 2>&1 | grep -E "<function-name>|NAME"
確認項目:
STATUS = ACTIVEVERSIONが前回より +1(または +N)増えていることUPDATED_ATが現在時刻に近いこと
2.4. デプロイしないと起きる問題
- マイグレーションは適用済み・コードは push 済みでも、Edge Function を再デプロイしないと挙動が変わらない
- 例:
shared/generation/openai-image-model.tsの出力サイズ計算ロジックを変更しても、関数を再デプロイするまで実行時には旧ロジックが使われる - リリース前にこの乖離を必ず潰す
Part 3: 影響範囲の連動チェック(DB 変更時)
DB スキーマが変わった場合、以下の場所にも影響が出る可能性がある。タスクに応じて該当部分を確認する。
- Edge Function(
supabase/functions/*/index.ts): 列名や RPC 名を直接参照していないか- 変更があれば Part 2 のフローで
supabase functions deploy <function-name>を実施
- 変更があれば Part 2 のフローで
- 型定義(
features/**/types.tsなど): 列名・enum を反映 - RPC / トリガー: マイグレーションで関数定義が更新されている場合、依存関数も同マイグレーションで
CREATE OR REPLACE済みか確認 - RLS ポリシー: 列追加でポリシー漏れが起きていないか
レポート(必須)
実行内容に応じて以下を報告:
| 状態 | 報告内容 |
|---|---|
| ✅ 同期済み・デプロイ済み | 適用件数、最終 timestamp、最新 function バージョン |
| 🔧 マイグレーション適用済み | 適用したファイル一覧、SQL の主要変更点 |
| 🚀 関数デプロイ済み | 関数名、新バージョン、ダッシュボード URL |
| ⚠️ Drift / 未デプロイ残あり | 状態と推奨対処、ユーザー判断待ちであること |
| 📌 連動が必要な箇所 | 残りの関数再デプロイ、型再生成など |
危険シグナル(即停止してユーザーに確認)
| シグナル | 対処 |
|---|---|
Active プロジェクトが AI coordinate 以外 |
リンク切り替えをユーザーに確認 |
| Remote にあるが Local に無いマイグレーション | supabase db pull か migration repair のどちらかをユーザーに選択させる |
| マイグレーション timestamp が現在時刻より未来 | 入力ミス疑い。ユーザーに確認 |
SQL に DROP TABLE / TRUNCATE / DELETE FROM x;(WHERE なし) / ALTER … DROP COLUMN |
影響範囲をユーザーに見せて承認待ち |
down.sql や revert 系のファイル / コメント |
rollback はユーザー承認なしに実行しない |
| 同じ timestamp のマイグレーションが複数 | 衝突。ファイル名 rename をユーザーに提案 |
関数デプロイで STATUS != ACTIVE |
エラーログを取得しユーザーに報告 |
| 関数の 削除 操作 | ユーザー承認必須 |
参考コマンド一覧
| 用途 | コマンド |
|---|---|
| プロジェクト一覧(Active 確認) | supabase projects list |
| プロジェクト切り替え | supabase link --project-ref hnrccaxrvhtbuihfvitc |
| マイグレーション差分 | supabase migration list |
| 未適用マイグレーションを適用 | supabase db push |
| リモートから取り込み | supabase db pull |
| 履歴修復(要承認) | supabase migration repair --status [applied|reverted] <timestamp> |
| 新規マイグレーション作成 | supabase migration new <name> |
| ローカル schema diff(参考) | supabase db diff |
| リモートクエリ(読取) | supabase db remote query "<SQL>" |
| 関数一覧 | supabase functions list |
| 関数デプロイ | supabase functions deploy <function-name> |
| 関数ログ参照 | supabase functions logs <function-name> |
「次の開発に支障を出さない」運用チェックリスト
開発開始時 / リリース前 / 機能ブランチを切る前に:
supabase projects listで Active が AI coordinate かsupabase migration listで Local == Remote 全件- ローカル
supabase/migrations/*.sqlの件数と remote 件数が一致 - 直近 5 件の timestamp が連続して見える(飛び番がない)
- 未コミットの
supabase/migrations/*.sqlが残っていない(git status supabase/migrations) shared/配下の最近の変更があるなら、依存する Edge Function を再デプロイ済みかsupabase functions listで全関数 STATUS=ACTIVE、最終更新時刻が想定どおり
すべて OK なら、新規開発を始められる状態。
失敗時の戻し方
supabase db pushが中断した場合:再実行で続行(Supabase 側で per-file トランザクション)- 適用済みマイグレーションを取り消したい場合:手動で
migration repair --status reverted <ts>を実行する前に必ずユーザーに状況と意図を確認 - リモート側でしか reflect されていない変更がある場合は
supabase db pullで履歴を取り込む - Edge Function デプロイで意図しない挙動になった場合:前バージョンを再デプロイするか、ダッシュボードの旧バージョンに切り替え(ユーザー承認のうえで)