Files
system-dev-template/scripts/install.sh
T
Leo 39783cccc8 feat: 接關 hook + SDD 強制 hook(實作 wishlist 兩項)
§1 接關機制(雙保險):
- session-start-recall.sh:SessionStart 自動注入 status 重點 + 快照核實提醒
- /wiki-recall:fallback 命令,hook 失效時手動接關

§2 軟規範 → 硬攔截:
- sdd-guard.sh:動 code 檔但無 SDD → exit 2 擋(/sdd-check 自動版)
- pre-write-guard.sh:專案自訂禁令骨架(預設停用)
- settings.json:掛 SessionStart + PreToolUse

配套:install.sh 下載 hooks/settings(settings 比照 CLAUDE.md 不覆蓋);
README/CLAUDE.md 補文件 + 誠實限制聲明。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 16:04:58 +08:00

144 lines
5.2 KiB
Bash

#!/bin/bash
# system-dev-template installer
# 已有專案接入腳本——只建立缺少的東西,已有的一律不動
set -e
REPO_URL="https://raw.githubusercontent.com/uncle6me-web/system-dev-template/main/template"
CREATED=()
SKIPPED=()
echo ""
echo "🔧 system-dev-template installer"
echo "================================="
echo "只建立缺少的目錄和檔案,已有的不動。"
echo ""
# ── 目錄 ──────────────────────────────────────────
create_dir() {
if [ ! -d "$1" ]; then
mkdir -p "$1"
CREATED+=("$1/")
else
SKIPPED+=("$1/ (已存在)")
fi
}
create_dir "docs/1-vision"
create_dir "docs/2-architecture/decisions"
create_dir "docs/3-specs"
create_dir "docs/4-guides"
create_dir "docs/5-records/incidents"
create_dir "docs/5-records/test-reports"
create_dir "docs/6-user"
create_dir ".claude/wiki"
create_dir ".claude/commands"
create_dir ".claude/hooks"
# ── 檔案(從 repo 下載,只在不存在時)──────────────
download_if_missing() {
local dest="$1"
local src="$2"
if [ ! -f "$dest" ]; then
curl -sSL "$src" -o "$dest"
CREATED+=("$dest")
else
SKIPPED+=("$dest (已存在,跳過)")
fi
}
# wiki 核心檔案
download_if_missing ".claude/wiki/INDEX.md" "$REPO_URL/.claude/wiki/INDEX.md"
download_if_missing ".claude/wiki/status.md" "$REPO_URL/.claude/wiki/status.md"
download_if_missing ".claude/wiki/mistakes.md" "$REPO_URL/.claude/wiki/mistakes.md"
download_if_missing ".claude/wiki/decisions-summary.md" "$REPO_URL/.claude/wiki/decisions-summary.md"
# slash commands
download_if_missing ".claude/commands/wiki-init.md" "$REPO_URL/.claude/commands/wiki-init.md"
download_if_missing ".claude/commands/wiki-capture.md" "$REPO_URL/.claude/commands/wiki-capture.md"
download_if_missing ".claude/commands/wiki-update.md" "$REPO_URL/.claude/commands/wiki-update.md"
download_if_missing ".claude/commands/wiki-recall.md" "$REPO_URL/.claude/commands/wiki-recall.md"
download_if_missing ".claude/commands/sdd-check.md" "$REPO_URL/.claude/commands/sdd-check.md"
# hooks(軟規範 → 硬攔截。下載後補執行權限)
download_if_missing ".claude/hooks/session-start-recall.sh" "$REPO_URL/.claude/hooks/session-start-recall.sh"
download_if_missing ".claude/hooks/sdd-guard.sh" "$REPO_URL/.claude/hooks/sdd-guard.sh"
download_if_missing ".claude/hooks/pre-write-guard.sh" "$REPO_URL/.claude/hooks/pre-write-guard.sh"
chmod +x .claude/hooks/*.sh 2>/dev/null || true
# docs/README.md(分類地圖)
download_if_missing "docs/README.md" "$REPO_URL/docs/README.md"
# CLAUDE.md:只在完全不存在時建立
if [ ! -f "CLAUDE.md" ]; then
download_if_missing "CLAUDE.md" "$REPO_URL/CLAUDE.md"
else
SKIPPED+=("CLAUDE.md (已存在,請手動加入 wiki 讀取順序區塊)")
fi
# .claude/settings.json:只在完全不存在時建立(比照 CLAUDE.md,不覆蓋既有設定)
if [ ! -f ".claude/settings.json" ]; then
download_if_missing ".claude/settings.json" "$REPO_URL/.claude/settings.json"
else
SKIPPED+=(".claude/settings.json (已存在,請手動加入 hooks 區塊)")
fi
# ── 輸出結果 ──────────────────────────────────────
echo ""
echo "✅ 建立了:"
for item in "${CREATED[@]}"; do
echo " + $item"
done
if [ ${#SKIPPED[@]} -gt 0 ]; then
echo ""
echo "⚠️ 跳過(已存在):"
for item in "${SKIPPED[@]}"; do
echo " - $item"
done
fi
echo ""
echo "─────────────────────────────────"
# 如果 CLAUDE.md 已存在,提醒手動加入 wiki 區塊
if [ -f "CLAUDE.md" ]; then
if ! grep -q "wiki/status.md" CLAUDE.md; then
echo ""
echo "📌 CLAUDE.md 已存在但缺少 wiki 讀取順序。"
echo " 請手動加入以下區塊:"
echo ""
echo ' ## Wiki 讀取順序'
echo ' | 檔案 | 時機 | 用途 |'
echo ' |------|------|------|'
echo ' | `.claude/wiki/status.md` | session 開始第一件事 | 當前進度 |'
echo ' | `.claude/wiki/mistakes.md` | 做新功能前 | 已知誤解 |'
echo ' | `.claude/wiki/decisions-summary.md` | 設計判斷時 | 架構決策 |'
fi
fi
# 如果 settings.json 已存在,提醒手動加入 hooks 區塊
if [ -f ".claude/settings.json" ]; then
if ! grep -q "session-start-recall.sh" .claude/settings.json; then
echo ""
echo "📌 .claude/settings.json 已存在但缺少 hooks。"
echo " 請手動把以下 hooks 合併進去(已有設定請保留):"
echo ""
echo ' "SessionStart": [{ "matcher": "startup|resume|clear",'
echo ' "hooks": [{ "type": "command", "command": ".claude/hooks/session-start-recall.sh" }] }],'
echo ' "PreToolUse": [{ "matcher": "Write|Edit",'
echo ' "hooks": [{ "type": "command", "command": ".claude/hooks/sdd-guard.sh" },'
echo ' { "type": "command", "command": ".claude/hooks/pre-write-guard.sh" }] }]'
fi
fi
echo ""
echo "🚀 下一步:在 Claude Code 對話裡執行:"
echo " /wiki-init"
echo ""
echo " CC 會掃描現有文件、建立 wiki、整理 docs 結構。"
echo ""