建置設定技能
生成 SETUP.md — 使用者在匯入後的配置與內容取代指南 — 並更新 build.json 以加入自然語言相關元資料。此技能在 build-content 之後、zip 封裝之前執行。
輸入變數 (由 build-theme 和 build-content 設定):
| 變數 | 來源 | 描述 |
|---|---|---|
BUILD_DIR | build-scaffold | 建置工作目錄的絕對路徑 |
NL_PROMPT | COMMAND.md 第 1 節 | 原始自然語言網站描述 |
THEME_SLUG | build-theme | 已安裝的主題縮寫 |
THEME_NAME | build-theme | 人類可讀的主題名稱 |
THEME_VERSION | build-theme | 已安裝的主題版本字串 |
THEME_INSTALLED | build-theme | 布林值 — 若主題安裝成功則為 true |
INSTALLED_PLUGINS | build-content | 成功安裝的外掛陣列,格式為 slug:name:version |
FAILED_PLUGINS | build-content | 安裝或啟用失敗的外掛縮寫陣列 |
PAGES_CREATED | build-content | 已建立的頁面整數數量 |
POSTS_CREATED | build-content | 已建立的文章整數數量 |
MENU_ASSIGNED | build-content | 布林值 — 若導覽選單已指派至主題位置則為 true |
MENU_LOCATION | build-content | 使用的主題位置名稱(若未指派則為空字串) |
第 1 節:SETUP.md 生成
利用完整的可用上下文(已安裝的外掛、主題、頁面數量及自然語言提示)來撰寫 $BUILD_DIR/SETUP.md,產生一份優先順序排列的設定指南,讓使用者在將網站匯入 Local WP 後可立即遵循。
echo "[Build] 正在生成 SETUP.md..."
# ── 建置「已安裝項目」區段 ────────────────────────────────────────
SETUP_FILE="$BUILD_DIR/SETUP.md"
# 開始撰寫 SETUP.md
cat > "$SETUP_FILE" << 'SETUP_HEADER'
# 設定指南
本指南引導您在將 WordPress 網站匯入 Local WP 後進行配置。項目依優先級排列 — 請先完成「關鍵」步驟,再依自己的節奏處理「重要」與「選用」項目。
---
## 已安裝項目
SETUP_HEADER
# 主題條目
echo "- **主題:** ${THEME_NAME}(v${THEME_VERSION})" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
# 外掛列表
if [ ${#INSTALLED_PLUGINS[@]} -gt 0 ]; then
echo "- **外掛:**" >> "$SETUP_FILE"
for plugin_entry in "${INSTALLED_PLUGINS[@]}"; do
# 格式:slug:name:version
PLUGIN_SLUG=$(echo "$plugin_entry" | cut -d: -f1)
PLUGIN_NAME=$(echo "$plugin_entry" | cut -d: -f2)
PLUGIN_VER=$(echo "$plugin_entry" | cut -d: -f3)
# Claude 會根據外掛縮寫與名稱生成一行用途說明
PLUGIN_PURPOSE="<${PLUGIN_NAME} 功能的一行描述 — 由 Claude 根據外掛知識生成>"
echo " - **${PLUGIN_NAME}**(v${PLUGIN_VER})— ${PLUGIN_PURPOSE}" >> "$SETUP_FILE"
done
echo "" >> "$SETUP_FILE"
fi
# 失敗的外掛(若有的話)
if [ ${#FAILED_PLUGINS[@]} -gt 0 ]; then
echo "- **安裝失敗的外掛:**" >> "$SETUP_FILE"
for slug in "${FAILED_PLUGINS[@]}"; do
echo " - ${slug} — 已嘗試安裝,但在建置過程中失敗" >> "$SETUP_FILE"
done
echo "" >> "$SETUP_FILE"
fi
接下來,撰寫優先順序排列的操作清單。這是一項 AI 判斷任務 — Claude 會根據對該外掛設定工作流程的知識,並參考自然語言提示上下文來判斷此特定網站最需要什麼,從而為每個外掛生成實際的逐步說明。
# ── 建置「下一步該做什麼」區段 ────────────────────────────────────────
cat >> "$SETUP_FILE" << 'SETUP_NEXT'
---
## 下一步該做什麼(優先順序排列)
SETUP_NEXT
# ── 關鍵項目 ────────────────────────────────────────────────────────────
echo "### 關鍵" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
STEP_NUM=1
# 對於每個需要配置的已安裝外掛,Claude 會生成含有完整 WordPress 管理後台導覽路徑的逐步說明。
# 例如 WPForms Lite 的模式:
#
# echo "${STEP_NUM}. **配置 WPForms — 建立您的聯絡表單**" >> "$SETUP_FILE"
# cat >> "$SETUP_FILE" << 'EOF'
# 前往:**WPForms > 新增**
# 步驟:
# 1. 點選「選擇範本」並選取 **簡易聯絡表單**
# 2. 點選「使用範本」— 表單建置器會開啟
# 3. (選用)從左側面板拖曳來新增或移除欄位
# 4. 點選右上角的 **儲存**
# 5. 前往 **頁面 > 聯絡我們 > 編輯**
# 6. 新增一個區塊,搜尋「WPForms」,然後選取 WPForms 區塊
# 7. 從下拉選單中選擇您剛剛建立的表單
# 8. 點選 **更新** 以儲存頁面
# EOF
# STEP_NUM=$((STEP_NUM + 1))
# Claude 會為 INSTALLED_PLUGINS 中每個需要使用者配置的外掛生成等效的區塊。
# 無需設定即可運作的外掛(例如,可靜默啟用的快取外掛)可歸類至「重要」或若無需操作則省略。
# ── 聯絡頁面佔位內容取代(始終為關鍵) ────────────────────
echo "${STEP_NUM}. **取代聯絡頁面的佔位資訊**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'CONTACT_STEP'
前往:**頁面 > 聯絡我們 > 編輯**
將下列佔位內容替換為您的真實詳細資料:
- 頁面標題中的虛構商業名稱
- 虛構的街道地址(例如「123 Example Street, Sample City」)
- 虛構的電話號碼
- 虛構的電子郵件地址
- 任何虛構的營業時間或地點詳細資料
CONTACT_STEP
STEP_NUM=$((STEP_NUM + 1))
# ── 重要項目 ───────────────────────────────────────────────────────────
echo "" >> "$SETUP_FILE"
echo "### 重要" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
# 關於頁面內容取代
echo "${STEP_NUM}. **更新關於頁面的內容**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'ABOUT_STEP'
前往:**頁面 > 關於我們 > 編輯**
取代下列佔位內容:
- 虛構的商業/個人名稱與簡介
- 任何虛構的團隊成員描述
- 佔位的頭像或個人圖片(透過媒體區塊上傳您自己的圖片)
- 任何虛構的資歷、歷史或起源故事
ABOUT_STEP
STEP_NUM=$((STEP_NUM + 1))
# 首頁內容取代
echo "${STEP_NUM}. **更新首頁的標題區與介紹內容**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'HOME_STEP'
前往:**頁面 > 首頁 > 編輯**
取代下列佔位內容:
- 標題區的標題與標語(請具體針對您的業務或優惠)
- 標題區的背景或精選圖片(透過封面/圖片區塊上傳)
- 描述您服務的介紹段落
- 任何行動呼籲按鈕的標籤與連結
HOME_STEP
STEP_NUM=$((STEP_NUM + 1))
# 根據網站類型而定的其他頁面 — Claude 會為 PAGES_CREATED 中首頁、關於、聯絡以外的每個頁面生成針對該頁面的具體指引。
# 例如:
#
# 作品集頁面:
# echo "${STEP_NUM}. **將您的真實作品加入作品集頁面**" >> "$SETUP_FILE"
# ...
# STEP_NUM=$((STEP_NUM + 1))
#
# 服務頁面:
# echo "${STEP_NUM}. **以您實際的服務更新服務頁面**" >> "$SETUP_FILE"
# ...
# STEP_NUM=$((STEP_NUM + 1))
#
# Claude 會使用 NL_PROMPT 上下文來確定存在哪些額外頁面及其包含的佔位內容,然後撰寫有針對性的指引。
# 任何屬於「重要」(非關鍵)的其他外掛配置
# Claude 會在此處為需要設定但若不設定也不會破壞網站的外掛新增步驟(例如 SEO 外掛配置、相簿設定)
# ── 選用項目 ────────────────────────────────────────────────────────────
echo "" >> "$SETUP_FILE"
echo "### 選用" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
# 範例文章取代
echo "${STEP_NUM}. **新增您自己的部落格文章以取代範例內容**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'POSTS_STEP'
這些範例文章展示了您的主題如何呈現部落格內容。它們使用與您網站主題相關但虛構的主題。
前往:**文章 > 所有文章** 來編輯現有的範例或新增文章。
一旦您發佈了自己的內容,即可刪除這些範例文章。
POSTS_STEP
STEP_NUM=$((STEP_NUM + 1))
# 佔位圖片取代
echo "${STEP_NUM}. **使用您自己的照片取代佔位圖片**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'IMAGES_STEP'
在建置過程中生成了純色佔位圖片以顯示版面意圖。請用您自己的圖片取代它們:
前往:**媒體 > 新增** 來上傳您的照片
然後編輯每個頁面/文章,並將佔位圖片區塊替換為您的上傳項目。
IMAGES_STEP
STEP_NUM=$((STEP_NUM + 1))
# 若未自動指派選單(區塊主題邊緣情況)
if [ "$MENU_ASSIGNED" = "false" ] || [ "$MENU_ASSIGNED" = "" ]; then
echo "${STEP_NUM}. **在網站編輯器中指派導覽選單**" >> "$SETUP_FILE"
cat >> "$SETUP_FILE" << 'MENU_STEP'
您的導覽選單已在建置過程中建立,但無法自動指派給主題位置(這對於區塊主題是預期行為)。
前往:**外觀 > 編輯器 > 導覽**
選取「主選單」並將其放置在您的頁首導覽區域中。
MENU_STEP
STEP_NUM=$((STEP_NUM + 1))
fi
# 完成 SETUP.md
echo "---" >> "$SETUP_FILE"
echo "" >> "$SETUP_FILE"
echo "*由 WordPress 專家外掛 — CoWork 建置系統生成*" >> "$SETUP_FILE"
SETUP_ITEM_COUNT=$((STEP_NUM - 1))
echo "[Build] SETUP.md 已生成(${SETUP_ITEM_COUNT} 個設定項目)"
給 Claude 的實作注意事項:
- 外掛說明是一項 AI 判斷任務。 對於
INSTALLED_PLUGINS中的每個外掛,Claude 會利用其對該外掛設定工作流程的知識,生成詳細的逐步說明。說明必須包含完整的 WP 管理後台導覽路徑(例如「前往 WPForms > 新增 > 選擇聯絡表單範本 > 儲存 > 複製短代碼 > 編輯聯絡頁面 > 新增短代碼區塊」)。 - 上下文決定優先級。 Claude 會讀取
NL_PROMPT來判斷哪些設定項目是「關鍵」或「重要」。對於攝影作品集網站,取代作品集圖片是關鍵項目。對於餐廳,配置預約外掛是關鍵項目。 - 逐頁覆蓋。 由 build-content 建立的每個頁面都會獲得一個專屬條目,並針對其包含的佔位內容提供具體指引。
- 無通用說明。 所有指引都針對特定外掛和網站類型,而非泛泛的「配置您的外掛」建議。
第 2 節:build.json 自然語言元資料更新
讀取現有的 build.json(由 build-scaffold 第 6 節建立)並加入自然語言特定的欄位。使用與 build-mcp 第 4 節相同的 Python3 JSON 解析模式。
echo "[Build] 正在以自然語言元資料更新 build.json..."
BUILD_JSON="$BUILD_DIR/build.json"
# 為 JSON 序列化建立陣列
INSTALLED_JSON=""
for plugin_entry in "${INSTALLED_PLUGINS[@]}"; do
PLUGIN_SLUG=$(echo "$plugin_entry" | cut -d: -f1)
PLUGIN_NAME=$(echo "$plugin_entry" | cut -d: -f2)
PLUGIN_VER=$(echo "$plugin_entry" | cut -d: -f3)
if [ -n "$INSTALLED_JSON" ]; then
INSTALLED_JSON="${INSTALLED_JSON},"
fi
INSTALLED_JSON="${INSTALLED_JSON}{\"slug\":\"${PLUGIN_SLUG}\",\"name\":\"${PLUGIN_NAME}\",\"version\":\"${PLUGIN_VER}\",\"installed\":true}"
done
FAILED_JSON=""
for slug in "${FAILED_PLUGINS[@]}"; do
if [ -n "$FAILED_JSON" ]; then
FAILED_JSON="${FAILED_JSON},"
fi
FAILED_JSON="${FAILED_JSON}\"${slug}\""
done
# 將 Python 腳本寫入暫存檔案(與 build-content 圖片生成器相同模式)
NL_META_SCRIPT="/tmp/update_build_json_$$.py"
cat > "$NL_META_SCRIPT" << PYEOF
import json, sys
build_file = sys.argv[1]
nl_prompt = sys.argv[2]
theme_slug = sys.argv[3]
theme_name = sys.argv[4]
theme_version = sys.argv[5]
theme_installed = sys.argv[6] == 'true'
pages_created = int(sys.argv[7])
posts_created = int(sys.argv[8])
menu_assigned = sys.argv[9] == 'true'
installed_json = sys.argv[10]
failed_json = sys.argv[11]
with open(build_file) as f:
data = json.load(f)
data['mode'] = 'nl'
data['nl_prompt'] = nl_prompt
data['theme'] = {
'slug': theme_slug,
'name': theme_name,
'version': theme_version,
'installed': theme_installed
}
data['plugins'] = json.loads('[' + installed_json + ']') if installed_json else []
data['content'] = {
'pages_created': pages_created,
'posts_created': posts_created,
'menu_assigned': menu_assigned
}
if failed_json:
data['failed_plugins'] = json.loads('[' + failed_json + ']')
with open(build_file, 'w') as f:
json.dump(data, f, indent=2)
print('[Build] build.json 已以自然語言元資料更新')
PYEOF
python3 "$NL_META_SCRIPT" \
"$BUILD_JSON" \
"$NL_PROMPT" \
"$THEME_SLUG" \
"$THEME_NAME" \
"$THEME_VERSION" \
"${THEME_INSTALLED:-true}" \
"$PAGES_CREATED" \
"$POSTS_CREATED" \
"${MENU_ASSIGNED:-false}" \
"$INSTALLED_JSON" \
"$FAILED_JSON"
# 清理暫存腳本
rm -f "$NL_META_SCRIPT"
更新自然語言元資料後的 build.json:
{
"build_id": "nl-photography-portfolio-20260220-143022",
"mode": "nl",
"nl_prompt": "a portfolio site for a freelance photographer",
"wp_version": "6.7",
"php_version": "8.2",
"site_url": "http://localhost",
"site_title": "a portfolio site for a freelance photographer",
"created_at": "2026-02-20T14:30:22Z",
"theme": {
"slug": "blocksy",
"name": "Blocksy",
"version": "2.0.50",
"installed": true
},
"plugins": [
{ "slug": "envira-gallery-lite", "name": "Envira Gallery Lite", "version": "1.9.0", "installed": true },
{ "slug": "wpforms-lite", "name": "WPForms Lite", "version": "1.9.0", "installed": true }
],
"content": {
"pages_created": 4,
"posts_created": 3,
"menu_assigned": false
},
"failed_plugins": [],
"mcp_adapter": {
„included": true,
„activated": true,
„version": "0.4.1"
}
}
第 3 節:建置摘要擴展
附加
…
[翻譯截斷]