db-migrationlisted
Install: claude install-skill YuDefine/nuxt-supabase-starter
<!--
🔒 LOCKED — managed by clade
Source: plugins/hub-core/commands/db-migration.md
Edit at: <clade-central-repo>
Local edits will be reverted by the next sync.
-->
## User Input
```text
$ARGUMENTS
```
## Outline
建立新的 Supabase migration,確保符合 AGENTS.md 中的所有規範。
### Step 1: 確認需求
詢問使用者要建立什麼樣的 migration:
- 新增表格?
- 修改欄位?
- 建立函式?
- 新增 RLS 政策?
### Step 2: 建立 Migration 檔案
使用 Supabase CLI 建立 migration(**禁止手動建立 .sql 檔案**):
```bash
supabase migration new <description_in_snake_case>
```
### Step 3: 撰寫 Migration 內容
根據需求撰寫 SQL,**必須遵守以下規範**:
#### 函式規範(CRITICAL)
```sql
-- ✅ 正確:search_path 必須是空字串
CREATE OR REPLACE FUNCTION schema_name.function_name()
RETURNS return_type
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = '' -- 必須是空字串!
AS $$
BEGIN
-- 使用完整路徑:schema_name.table_name
SELECT * FROM core.users WHERE id = auth.uid();
END;
$$;
```
```sql
-- ❌ 禁止:任何其他 search_path 值
SET search_path = public, pg_temp -- 絕對禁止!
SET search_path = public -- 禁止!
```
#### Schema 規範
- 使用正確的 schema 前綴(如 `public.`、`core.`,或專案自訂業務 schema)
- 所有表格/函式引用使用完整路徑(避免裸表名觸發 `search_path` resolution)
### Step 4: 本地測試與類型產生(自動)
依序執行以下步驟,任何步驟失敗則停止並顯示錯誤。**MUST** 透過 package.json 偵測 consumer 是用本機 Docker Supabase 還是遠端 LXC(via `pnpm db:*` wrapper)。
```bash
# 從 package.json 讀 types 路徑(若有自訂);fallback 到 conventional locations
# 避開頂層 return(Node script 不允許)— 用 if/else 與 .find()
TYPES=$(node -e "
const fs = require('fs');
const pkg = require('./package.json');
const custom = pkg.config && pkg.con