c2638668e3
leo 2026-08-20:「同一個 plugin 你用,薄殼也用,保證兩邊同步」
「我要你幫雲端做薄殼,永遠都有問題,你要做的就是這組設定
你自己可以 dogfooding」
搬進來:41 支 hook(51 條註冊)/7 支 command/2 支 skill/23 支腳本。
不搬 .env、wiki、docs——那些是知識不是環境。
51 條 hook 路徑全部從 $CLAUDE_PROJECT_DIR/.claude/hooks/ 改成 ${CLAUDE_PLUGIN_ROOT}/hooks/,
零漏網。那正是薄殼一直壞掉的根:雲端 cwd 不是真身,寫死路徑就斷。
尚未驗證:Claude Code 能不能從私有 Gitea repo 裝 marketplace(要憑證)。
下一步就是在本機實際裝一次,通了才動雲端 bootstrap.sh。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
83 lines
4.6 KiB
Bash
Executable File
83 lines
4.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# claim-verify-police.sh — 待驗工作單還在,就不准收工(Stop;leo 2026-08-18 立)
|
||
#
|
||
# 這支是 subagent-claim-worksheet.sh 的另一半。
|
||
# 那支在 SubagentStop 時把 subagent 的宣稱寫成一張檔案;這支在我要停下時檢查:
|
||
#
|
||
# **那張檔還在不在?**
|
||
#
|
||
# ── 為什麼判準是「檔案存不存在」 ────────────────────────────────────
|
||
# leo 2026-08-17:「你在**文字層**封路⋯⋯自然語言的變體是無限的,blacklist 永遠追不完。
|
||
# 封路哲學之所以有效,是因為它封的是**動作**——動作有限且可枚舉。」
|
||
# ⇒ 「我驗過了」這句話可以有無限種寫法,但**檔案只能被動作刪掉**。
|
||
# 所以這支不讀我的措辭,只看磁碟。
|
||
#
|
||
# ── 怎麼過這道閘(都是動作,都留痕)─────────────────────────────────
|
||
# ① 真的驗了 → 把證據寫進回覆/票,然後刪掉那個檔
|
||
# ② 有幾條不需要驗 → 在檔裡寫下理由,再刪掉(理由留在 git 或票上)
|
||
# ③ 是人閘 → 走三件機械動作(Human + 指派 + 它自己的票),再刪掉
|
||
#
|
||
# 🔴 **不准為了過閘而直接 rm 掉卻什麼都沒做。** 那等於自己拆掉自己的閘——
|
||
# 而這正是 leo 2026-08-10 說的「規則早就存在,但沒有任何機制驗證有沒有照做」。
|
||
#
|
||
# ── 迴圈安全 ────────────────────────────────────────────────────
|
||
# stop_hook_active 為真 ⇒ 已經擋過一次,放行。至多提醒一次,不卡死。
|
||
#
|
||
# ── 留痕 ────────────────────────────────────────────────────────
|
||
INPUT=$(cat)
|
||
DIR="$CLAUDE_PROJECT_DIR/.claude/pending-verification"
|
||
LOG="$CLAUDE_PROJECT_DIR/.claude/hooks/claim-verify-police.log"
|
||
|
||
ACTIVE=$(printf '%s' "$INPUT" | python3 -c '
|
||
import json,sys
|
||
try: print("1" if json.load(sys.stdin).get("stop_hook_active") else "0")
|
||
except Exception: print("0")
|
||
' 2>/dev/null)
|
||
|
||
if [ "$ACTIVE" = "1" ]; then
|
||
printf '%s\tSKIP:already-nudged\n' "$(date +%FT%T)" >> "$LOG" 2>/dev/null
|
||
exit 0
|
||
fi
|
||
|
||
# 只算「今天以內」的單子——放太久的(跨 session 殘留)不該無限期卡住新工作,
|
||
# 但仍會被列出來提醒。
|
||
FILES=$(ls -1 "$DIR"/claims-*.md 2>/dev/null)
|
||
if [ -z "$FILES" ]; then
|
||
printf '%s\tSKIP:no-pending\n' "$(date +%FT%T)" >> "$LOG" 2>/dev/null
|
||
exit 0
|
||
fi
|
||
|
||
N=$(printf '%s\n' "$FILES" | grep -c . )
|
||
printf '%s\tBLOCK:%s-pending\n' "$(date +%FT%T)" "$N" >> "$LOG" 2>/dev/null
|
||
|
||
{
|
||
echo "🔍 查證警察:有 $N 張**待驗工作單**還沒處理掉,不准收工。"
|
||
echo
|
||
echo "【leo 2026-08-18 的規格】"
|
||
echo " 「subagent 做完事⋯⋯**它說可以,你去驗證;它說不行,你想辦法,不行再報告**,"
|
||
echo " 這解決一半的未查證。你常常直接把 subagent 說的不經查證就回報,"
|
||
echo " **它視野小,它說的你有更多資訊去檢驗。**」"
|
||
echo
|
||
echo "━━ 還沒處理的單子 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
printf '%s\n' "$FILES" | while read -r f; do
|
||
[ -n "$f" ] || continue
|
||
OKN=$(grep -c '^- \[ \]' "$f" 2>/dev/null)
|
||
echo " · ${f#"$CLAUDE_PROJECT_DIR"/} ($OKN 條待處理)"
|
||
done
|
||
echo
|
||
echo "━━ 怎麼過這道閘(三選一,都是動作)━━━━━━━━━━━━━━━━━━"
|
||
echo " ① **它說可以** → 你自己跑一次(測試/curl/瀏覽器/git),把證據貼出來,再刪掉那個檔"
|
||
echo " ② **它說不行** → 先換路徑、查憑證地圖;要說「被擋」就得**自己撞一次並貼拒絕原文**"
|
||
echo " ③ **真的是人閘** → 三件機械動作:\`Human\` 標籤 + 指派給 Leo + **一張它自己的票**"
|
||
echo " (leo 08-18:「要進入人閘,標示 human 叫我去開,**不是默默塞進錯的地方**」)"
|
||
echo
|
||
echo "🔴 **不准只是 rm 掉了事。** 那是自己拆掉自己的閘——"
|
||
echo " 正是 leo 08-10 講的「規則早就存在,但沒有任何機制驗證有沒有照做」。"
|
||
echo
|
||
echo "📌 為什麼有這道閘:2026-08-18 總管連續三次把**沒驗過的判斷**當成情報交出去,"
|
||
echo " 其中第二次還是為了「更正」第一次而發明的新猜測。"
|
||
echo " leo:「你給我不正確的資訊⋯⋯subagent 說不通你沒有驗。」"
|
||
} >&2
|
||
|
||
exit 2
|