---
name: bug-setup
description: bug-workflow 首次設定引導 —— 自動偵測 Notion 資料庫、建立設定檔、設定專案對應。當使用者提到 /bug-setup、「設定 bug workflow」、「初始化 bug workflow」時觸發此 Skill。
---
# bug-setup — Bug Workflow 首次設定
互動式引導使用者完成 Bug Workflow Plugin 的初始設定,產出設定檔供其他 Skill 使用。
---
## 前置條件
- 已安裝 Notion MCP Server(Claude Code 可使用 `notion-search`、`notion-fetch` 等工具)
- 擁有 Notion Workspace 存取權限
---
## 流程
### 1. 透過 portable resolver 檢查既有設定並決定寫入位置
不要自行判斷 Host-specific 實體路徑。讀取與寫入都透過 `bug/config` logical key:
```bash
CREW_PLUGIN_ROOT="${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}"
BUG_CONFIG_READ_PATH="$(python3 "${CREW_PLUGIN_ROOT}/scripts/crew-config.py" resolve \
--key bug/config \
--mode read \
--format path)"
BUG_CONFIG_WRITE_PATH="$(python3 "${CREW_PLUGIN_ROOT}/scripts/crew-config.py" resolve \
--key bug/config \
--mode write \
--format path)"
```
- `[ -f "$BUG_CONFIG_READ_PATH" ]` → 讀取既有設定,詢問使用者要「重新設定」還是「更新專案對應」。
- 既有設定可能由 resolver 的 read fallback 找到;它只作為**讀取來源**。若 `BUG_CONFIG_READ_PATH != BUG_CONFIG_WRITE_PATH`,不得修改或搬移該 legacy 檔。
- 既有設定不存在 → 直接進入首次設定。
- 所有本次新建/更新的設定一律寫入 `BUG_CONFIG_WRITE_PATH`;`--mode write` 永遠回 canonical portable path。
- resolver 本身無副作用;實體 root / fallback 規則以 `../../references/config-contract.md` 為權威。
### 2. 偵測 Notion 資料庫
#### 2-0. 決定工作區位置(CREW 工作區頁面)
使用 `notion-search` 搜尋 Workspace 中是否已有「CREW 工作區」頁面。
**情境 A:找到現有工作區頁面**
直接使用,記錄 `workspace_page_id`。
**情境 B:未找到工作區頁面**
詢問使用者一次:
```
請選擇 CREW 工作區的位置:
1. 建立在 Workspace 頂層(推薦)
2. 選擇現有頁面作為 parent
```
使用 `notion-create-pages` 建立「🚀 CREW 工作區」頁面(先建空頁面),icon 設為「🚀」,記錄 `workspace_page_id`。
> 此步驟讓使用者**只需選擇一次位置**,後續所有新建資料庫都自動放在此頁面下。
#### 2-1. 搜尋「任務追蹤工具」
使用 `notion-search` 搜尋 Workspace 中包含「任務追蹤」的資料庫。
**情境 A:找到現有資料庫**
用 `notion-fetch` 取得該資料庫的 data-source URL(`collection://...`),擷取 Data Source ID。
驗證欄位是否齊全(任務名稱、狀態、任務類型、優先順序、環境、根因分類、修復分支、專案資料庫):
- 齊全 → 記錄 ID,繼續
- 缺少欄位 → 列出缺少的欄位,詢問使用者是否要自動新增(使用 `notion-update-data-source`)
> **不移動既有資料庫**,僅記錄 Data Source ID。
**情境 B:找不到任務追蹤工具**
詢問使用者:
```
未找到「任務追蹤工具」資料庫,請選擇:
1. 建立新的「任務追蹤工具」(推薦,含標準欄位 + 4 個看板 View)
2. 指定一個現有資料庫
3. 跳過(無法使用 Bug Workflow)
```
若選擇建立:
1. **parent 設為工作區頁面**(`workspace_page_id`,不再個別詢問位置)
2. 參照 plugin 根目錄 `references/db-templates.md`(相對 SKILL.md 為 `../../references/`)「B. 任務追蹤工具」模版
3. 使用 `notion-create-database` 建立(**不含 Relation 欄位**,Relation 在『補齊 Relation 欄位』一節統一補齊)
4. **立即使用 `notion-update-data-source` 設定 `is_inline: true`**(否則資料庫會以子頁面模式顯示)
5. 使用 `notion-create-view` 依序建立 4 個 Views:所有任務(table)、依狀態(board)、我的任務(table)、核對清單(list)
6. 記錄 Data Source ID
#### 2-2. 搜尋「Bug 知識庫」
搜尋包含「bug」、「處理方式」的資料庫。
**情境 A:找到現有資料庫**
同樣擷取 Data Source ID 並驗證欄位。不移動既有資料庫。
**情境 B:找不到 Bug 知識庫**
詢問使用者:
```
未找到「Bug 知識庫」資料庫,請選擇:
1. 建立新的「Bug 知識庫」(推薦,含標準欄位)
2. 指定一個現有資料庫作為知識庫
3. 跳過知識庫(/bug-close 結案時不同步知識庫)
```
若選擇建立:
1. **parent 設為工作區頁面**(`workspace_page_id`,不再個別詢問位置)
2. 參照 plugin 根目錄 `references/db-templates.md`(相對 SKILL.md 為 `../../references/`)「C. Bug 知識庫」模版
3. 使用 `notion-create-database` 建立(**不含 Relation 欄位**)
4. **立即使用 `notion-update-data-source` 設定 `is_inline: true`**(否則資料庫會以子頁面模式顯示)
5. 記錄 Data Source ID
#### 2-3. 偵測或建立「專案資料庫」
使用 `notion-search` 搜尋包含「專案」的資料庫。
**情境 A:找到現有資料庫**
用 `notion-fetch` 取得資料庫結構,驗證並補齊欄位。
完整欄位清單、型態與 Select/Multi-Select 選項參照 plugin 根目錄 `references/db-templates.md`(相對 SKILL.md 為 `../../references/`)「A. 專案資料庫」Schema(權威來源)。以此對照時的必要性分級:
- **必要**(Name、Git Repo):缺少 → 自動新增(使用 `notion-update-data-source`)
- **建議**(技術棧、狀態):缺少 → 詢問使用者是否新增
- **選用**(其餘欄位:程式版本、SIT/UAT/正式環境主機、部署方式、本機路徑、JIRA、地址、說明、Created、上次編輯時間):缺少 → 列出可新增的欄位讓使用者勾選
> 不移動既有資料庫。
**情境 B:找不到專案資料庫**
詢問使用者:
```
未找到專案資料庫,請選擇:
1. 建立新的「專案資料庫」(推薦,含標準欄位)
2. 指定一個現有資料庫
3. 跳過(無法自動關聯專案,需手動操作)
```
若選擇建立:
1. **parent 設為工作區頁面**(`workspace_page_id`,不再個別詢問位置)
2. 參照 plugin 根目錄 `references/db-templates.md`(相對 SKILL.md 為 `../../references/`)「A. 專案資料庫」模版
3. 使用 `notion-create-database` 建立資料庫,名稱為「專案資料庫」,包含該模版 Schema 所有欄位
4. **立即使用 `notion-update-data-source` 設定 `is_inline: true`**(否則資料庫會以子頁面模式顯示)
5. 使用 `notion-create-view` 建立 2 個 Views:預設 Table View(Name 降序 + 狀態篩選)、List View
6. 記錄 Data Source ID
#### 2-4. 補齊 Relation 欄位
若本次有**新建**任何資料庫,需在所有資料庫建立完成後補上跨庫 Relation。
參照 plugin 根目錄 `references/db-templates.md`(相對 SKILL.md 為 `../../references/`)「第二輪:補上 Relation 欄位」,使用 `notion-update-data-source` 執行:
1. **任務追蹤工具** → 專案資料庫:若任務追蹤工具缺少「專案資料庫」Relation
```
ADD COLUMN "專案資料庫" RELATION({專案DS_ID})
```
2. **Bug 知識庫** → 專案資料庫:若 Bug 知識庫缺少「專案資料庫」Relation
```
ADD COLUMN "專案資料庫" RELATION({專案DS_ID})
```
3. **專案資料庫** → 任務追蹤工具:雙向 Relation
```
ADD COLUMN "任務追蹤工具" RELATION({任務DS_ID}, DUAL)
```
4. **專案資料庫** → Bug 知識庫:雙向 Relation
```
ADD COLUMN "bug處理方式" RELATION({BugDS_ID}, DUAL)
```
> **注意**:僅對本次新建的資料庫補 Relation。若資料庫是既有的且已有 Relation 欄位,跳過該步驟。
> 若某個資料庫被跳過(使用者選擇「跳過」),則不建立與該資料庫的 Relation。
5. **任務追蹤工具** → 自我關聯(self-relation):若任務追蹤工具缺少「相關任務」欄位
```
ADD COLUMN "相關任務" RELATION({任務DS_ID}, DUAL)
```
> DUAL 自動產生反向欄位「被關聯任務」。建立後用 `notion-fetch` 確認反向欄位名稱正確,若 Notion 自動命名不符預期,使用 RENAME COLUMN 修正為「被關聯任務」。
> 此欄位用於 Bug ↔ Feature / Bug ↔ Bug 的任務間關聯,供 `/bug-start` 自動關聯來源 Feature 使用。
#### 2-5. 建立/更新工作區總覽頁面
所有資料庫建立完成後,更新工作區頁面內容,將所有資料庫以 inline linked view 嵌入。
參照 plugin 根目錄 `references/db-templates.md`(相對 SKILL.md 為 `../../references/`)「E. CREW 工作區頁面」模板,使用 `notion-update-page` 的 `replace_content` 寫入:
```markdown
任務追蹤工具
Bug 知識庫
專案資料庫
```
**注意**:
- 將模板中的 `{任務DS_ID}`、`{BugKB_DS_ID}`、`{專案DS_ID}` 替換為實際的 Data Source ID
- 若某個資料庫被跳過,則不包含該資料庫的 linked view
- 無論資料庫是既有的(情境 A)還是新建的(情境 B),都使用 `data-source-url` 建立 linked view
- 功能設計庫的位置預留在任務追蹤工具與 Bug 知識庫之間(由 plan-setup 追加)
### 3. 設定專案資訊
取得 Git 遠端 URL 並解析為識別碼:
```bash
# Git remote URL(自動偵測)
git remote get-url origin 2>/dev/null || echo ""
# 分支名稱
git branch --show-current 2>/dev/null || echo ""
# 當前工作目錄(備用,非 Git repo 時使用)
pwd
```
**Git Repo 識別碼解析規則**:
1. 執行 `git remote get-url origin`
2. 解析為 Git Repo 識別碼:
- host 含 `intumit`(公司 GitLab)→ `{group}/{repo}`(如 `ORG01P2401/PushAPIService`)
- 其他(GitHub 等)→ `{host}/{group}/{repo}`(如 `github.com/org/repo`)
- 自動去除 `.git` 後綴,支援 HTTPS / SSH 格式
3. 在設定檔「專案對應」表中精確匹配「Git Repo」欄位
4. 若不在 Git repo 或匹配失敗 → 進入互動式選擇
搜尋專案資料庫中的所有專案,檢查是否已有對應的專案條目。
**情境 A:專案資料庫中已有匹配的專案**(Git Repo 欄位精確匹配識別碼)
```
偵測到 Git Repo:ORG01P2401/sample-app
已匹配到 Notion 專案:範例機關-ORG01P2401
是否更新專案資訊?[Y/n]
```
若選擇更新 → 進入專案資訊填寫流程(僅更新空白欄位)。
**情境 B:專案資料庫中有專案但未匹配**
```
偵測到 Git Repo:ORG01P2401/sample-app
請選擇要對應的 Notion 專案(或輸入 0 建立新專案):
0. 建立新專案
1. 專案 A(Git Repo:未設定)
2. 專案 B(Git Repo:ORG01P2401/PushAPIService)
3. 專案 C(Git Repo:未設定)
```
選擇現有專案 → 將識別碼寫入「Git Repo」欄位,並進入專案資訊填寫流程。
選擇建立新專案 → 進入情境 C。
**情境 C:建立新專案條目**
使用 `notion-create-pages` 在專案資料庫建立新條目,引導填寫:
```
建立新專案,請填寫以下資訊:
專案名稱:(必填)
Git Repo:ORG01P2401/sample-app(已自動偵測,Enter 確認或修改)
狀態:進行中(預設)
```
其餘欄位(SIT 主機/UAT 主機/正式環境主機/部署方式/說明)為通用欄位引導,參照 plugin 根目錄 `references/project-page-templates.md`(相對 SKILL.md 為 `../../references/`)「建立新專案條目-通用欄位引導」一節。
自動偵測的欄位:
- **Git Repo**:從 `git remote get-url origin` 解析為識別碼
- 使用者可直接 Enter 確認或手動修改
選用欄位允許留空,使用者可稍後在 Notion 頁面直接編輯。
### 4. 產出設定檔
以 plugin 根目錄 `references/config.template.md`(相對 SKILL.md 為 `../../references/`)為模板,填入偵測到的 ID 與對應資訊,寫入 Step 1 的 canonical `BUG_CONFIG_WRITE_PATH`。
寫入前由 Skill 建立 parent directory;resolver 不負責 mkdir:
```bash
mkdir -p "$(dirname "$BUG_CONFIG_WRITE_PATH")"
```
即使 Step 1 是從 legacy fallback 讀到既有設定,更新結果也只寫 canonical portable path,不覆寫 legacy source。
**新增欄位**:在設定檔中填入「CREW 工作區」區段:
```markdown
## CREW 工作區
| 項目 | 值 |
|------|-----|
| 工作區頁面 ID | `{workspace_page_id}` |
| 工作區頁面 URL | `https://www.notion.so/{workspace_page_id}` |
```
### 5. 回傳結果
### Agent availability(Host-dependent)
`bug-workflow` plugin bundle 內含 `bug-intake-refiner` named Agent 定義。它**不是 Slash Skill**,使用者不需要手動呼叫:
- Host 支援 named sub-agent / `delegate_readonly` → `/bug-start` 自動使用 `bug-intake-refiner`。
- Host 不支援 → 主 Agent inline 執行相同 `references/intake-refinement.md` contract。
- `/bug-investigate --resume` 與既有 Bug 不重新跑 intake。
向使用者顯示:
```
Bug Workflow 設定完成!
已偵測到的資料庫:
✅ 任務追蹤工具:1d8a401b-...
✅ Bug 知識庫:bd132aa4-...
✅ 專案資料庫:f67699b6-...
🚀 CREW 工作區:https://www.notion.so/{workspace_page_id}
已設定的專案對應:
• 範例機關-ORG01P2401 → ORG01P2401/sample-app
設定檔位置:{BUG_CONFIG_WRITE_PATH}
現在可以使用:
/bug-start <問題簡述> — 建立 Bug 條目
/bug-update <內容> — 更新調查資訊
/bug-close — 結案並同步知識庫
/bug-investigate <關鍵字> — 假說驅動調查(含比對 Bug 知識庫過往解法)
/bug-update reopen — 重新開啟已結案 Bug
```
---
## 何時不用
- 想一鍵完成 bug + feature 全部設定 → 用 /crew-init
- 只設定 feature 側 → 用 /plan-setup
- 初始化程式專案 / git repo / 專案指令 → Codex 建立 `AGENTS.md`;Claude Code 可用 `/init`;Git 初始化照常用 git
- 註冊專案到 Notion 專案庫 → 用 /project-add
---
## Gotchas
- **notion-search 回傳多個同名資料庫**:搜尋「任務追蹤」可能命中使用者自建的同名資料庫。務必用 `notion-fetch` 驗證欄位結構(至少含「任務名稱」Title + 「狀態」Status),才能確認是正確的目標資料庫。
- **Relation 不能在 create 時加**:`notion-create-database` 不支援直接建立 Relation 欄位,必須先建好所有資料庫(記錄 Data Source ID),再用 `notion-update-data-source` 的 `ADD COLUMN ... RELATION` 語法補上。忘記這點會導致建庫失敗。
- **data-source-url 格式**:從 `notion-fetch` 取得的 `data-source-url` 是 `collection://` 開頭的 UUID,不是 database ID(database ID 是頁面 URL 中的那串)。兩者不可混用。
- **DUAL Relation 方向**:`RELATION({DS_ID}, DUAL)` 是從「當前資料庫」指向「目標資料庫」建立雙向關聯。如果方向搞反(在專案資料庫建 DUAL 指向任務追蹤工具),雙向欄位名稱會不如預期。
- **notion-create-view 順序敏感**:Views 在 Notion UI 中的顯示順序等於建立順序,第一個建立的會成為預設 View。所以「所有任務」要最先建。
- **資料庫建立後必須設定 inline**:`notion-create-database` 預設 `inline=false`(子頁面模式),資料庫會以連結形式顯示,使用者需要點進去才看得到列表。每個資料庫建立後,必須立即使用 `notion-update-data-source` 設定 `is_inline: true`,才能在父頁面直接展開顯示列表。忘記這步會導致使用者體驗完全不符預期。
---
## 邊界情況
- **Notion MCP 未安裝**:提示使用者先安裝 Notion Plugin(`claude plugin install notion`)
- **Workspace 中有多個類似資料庫**:列出候選讓使用者選擇
- **使用者想新增更多專案對應**:可重複執行 `/bug-setup`,選擇「更新專案對應」
- **設定檔被意外刪除**:重新執行 `/bug-setup` 即可重建
- **專案資料庫已有欄位但名稱不同**(如「Repo」vs「Git Repo」):列出現有欄位讓使用者選擇對應
- **不在 Git repo 中**:無法自動偵測識別碼,進入互動式選擇流程讓使用者手動指定專案
- **Git remote 不存在**:Git Repo 欄位留空,使用者可稍後補填