f9071d153b
前一 commit message 提及 hook 但實際因 Edit old_string 不匹配未寫入。本 commit 補上: - pre-bash-guard 偵測 acr push / acr recipe push 無 --confirm-exposure/--suppress-warning → exit 2 - 精準排除 acr creds push(上傳加密 cred 是保護非暴露)、acr run/list 不誤擋 - 驗證:push/recipe push 無旗標=2、帶旗標=0、creds push/run/list=0 e2e(wrangler dev --local)三態全綠:webhook 無consent→403 / 帶consent→201 / 同wf再部署→201(首次問記住);recipe push 無consent→403 + 保護入口訊息。 tasks V3/V4/V6 標記。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
105 lines
6.0 KiB
Bash
Executable File
105 lines
6.0 KiB
Bash
Executable File
#!/bin/bash
|
||
# .claude/hooks/pre-bash-guard.sh
|
||
# arcrun PreToolUse guard for Bash
|
||
#
|
||
# 職責:擋下會違反 CLAUDE rules 的 shell 指令
|
||
# 退出 code:
|
||
# 0 = 允許
|
||
# 2 = 擋下(stderr 訊息會回傳給 CC)
|
||
|
||
set -o pipefail
|
||
|
||
INPUT=$(cat)
|
||
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // ""')
|
||
|
||
block() {
|
||
local rule="$1"
|
||
local reason="$2"
|
||
local fix="$3"
|
||
cat >&2 <<EOF
|
||
❌ BLOCKED by arcrun CLAUDE rules
|
||
違反項:${rule}
|
||
指令:${CMD}
|
||
原因:${reason}
|
||
正確做法:${fix}
|
||
參考:.claude/rules/02-forbidden.md
|
||
EOF
|
||
exit 2
|
||
}
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
# 規則 1.2 / 3.3:禁止用 mkdir 建立違規的 auth/credential worker 目錄
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
if echo "$CMD" | grep -qE "mkdir.*((auth|credential|jwt|oauth)[-_]worker|new[-_](auth|credential|jwt|oauth))"; then
|
||
block "1.2/3.3" \
|
||
"偵測到嘗試建立新的 auth/credential/jwt/oauth Worker 目錄" \
|
||
"auth primitive 放在 registry/components/auth_*/;不需要另建 worker 目錄"
|
||
fi
|
||
|
||
# 禁止建立同名零件的平行目錄
|
||
if echo "$CMD" | grep -qE "mkdir.*/(gmail|telegram|google[-_]sheets|line[-_]notify|http[-_]request)[-_](v2|v3|new|worker|backup)"; then
|
||
block "3.3" \
|
||
"禁止為既有零件建立平行目錄(v2/new/worker/backup)" \
|
||
"直接改 registry/components/<n>/main.go"
|
||
fi
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
# 規則 1.3:禁止 wrangler init / generate auth-* credential-* jwt-*
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
if echo "$CMD" | grep -qE "wrangler[[:space:]]+(init|generate).*[[:space:]](auth|credential|jwt|oauth)[-_]"; then
|
||
block "1.3" \
|
||
"禁止用 wrangler init/generate 建立 auth/credential/jwt Worker" \
|
||
"auth primitive 透過 component-worker-template/ 搭配 WASM binary 部署,不要 wrangler init"
|
||
fi
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
# 規則 3.1:Service Binding 新增警示
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
# 偵測在 wrangler.toml 新增 [[services]] 的 echo/cat/sed 操作(非 100% 準確,但夠用)
|
||
if echo "$CMD" | grep -qE "echo.*\[\[services\]\].*>>"; then
|
||
block "3.1" \
|
||
"偵測到要在 wrangler.toml 新增 [[services]] binding" \
|
||
"零件串接一律走 HTTP URL(cypher binding),不新增 service binding。若有特殊需求,先與 richblack 確認"
|
||
fi
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
# 一般性危險指令
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
if echo "$CMD" | grep -qE "rm[[:space:]]+-rf[[:space:]]+(/|/\*|~|\\\$HOME|\.)"; then
|
||
block "general" \
|
||
"偵測到危險的 rm -rf 指令" \
|
||
"明確指定要刪的目錄,不要對根目錄 / home / 當前目錄遞迴刪除"
|
||
fi
|
||
|
||
# 禁止 force push 到 main
|
||
if echo "$CMD" | grep -qE "git[[:space:]]+push.*--force.*(main|master)"; then
|
||
block "general" \
|
||
"禁止 force push 到 main/master" \
|
||
"用 feature branch,或和 richblack 確認後手動操作"
|
||
fi
|
||
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
# 資料外流警示(data-exfil-warning SDD R2):AI 動手把資料變成可被外部呼叫前先擋
|
||
# `acr push`(部署 webhook)/ `acr recipe push`(定義資料去向)= 暴露面動作。
|
||
# 不含 `acr creds push`(上傳加密 credential 是保護,非暴露)。
|
||
# 已帶 --confirm-exposure / --suppress-warning(人類已明示)→ 放行。
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
if echo "$CMD" | grep -qE "\bacr[[:space:]]+(recipe[[:space:]]+)?push\b" \
|
||
&& ! echo "$CMD" | grep -qE "\bacr[[:space:]]+creds[[:space:]]+push\b"; then
|
||
if ! echo "$CMD" | grep -qE "\-\-(confirm-exposure|suppress-warning)"; then
|
||
cat >&2 <<'EOF'
|
||
❌ BLOCKED:資料外流警示(arcrun data-exfil-warning)
|
||
原因:acr push / acr recipe push 會把資料/workflow 變成「可被外部呼叫」(暴露面)。
|
||
這種動作不該由 AI 自行執行——需人類明示知情同意(法律憑證)。
|
||
正確做法:
|
||
- 由人類在終端機親自執行(會跳互動警示、要你輸入資源名確認、並提供保護選項)
|
||
- 或人類確認後加 --confirm-exposure(你已知悉暴露風險)
|
||
- 確定要公開且不再提醒:--suppress-warning
|
||
參考:.agents/specs/data-exfil-warning/
|
||
EOF
|
||
exit 2
|
||
fi
|
||
fi
|
||
|
||
exit 0
|