Hwip Auto — 限時自主工作模式
在固定的時間預算內自主工作:探索 → 規劃 → 實作 → 驗證 → 提交,一次一個單元。使用者可透過手機上的 hwip_ask 按鈕進行引導;若使用者未回應,你將依據明確的安全預設選項繼續執行,而非停滯整個工作。整個過程在單一回應內完成——結束你的回合即結束此模式。
啟動前置條件——不符合則拒絕啟動
- 已設定 hook id —
~/.hwip/config.json中的hookId(由hwip install寫入),或HWIP_HOOK_ID環境變數覆蓋值。SessionStart 上下文結尾若顯示Mode: two-way (notify + ask),表示已設定;若顯示Mode: one-way,表示缺少引導通道——請拒絕啟動,並引導使用者執行/hwip-config。 - 未靜音。若
/hwip-mode回報NOTIFICATIONS: muted,請拒絕啟動:在無通知的情況下啟用自主模式,等同於無人監督且無法引導的工作。建議使用者執行/hwip-mode unmute。 - 使用者明確呼叫。絕對不要因為某項任務「看起來很長」而自行觸發此模式。使用者需透過
/hwip-auto ...主動選擇啟用。
參數
/hwip-auto [duration] [task description...]
- duration —
2h、90m、1h30m,或單純的數字代表分鐘數。 預設值:1h。限制範圍為 10 分鐘至 8 小時。 - task — duration 之後的所有內容。若省略,則根據目前對話推斷任務;若無相關對話,則在啟動詢問中提議 2–3 個候選任務(例如:修復失敗的測試、清除 lint 警告、清理 TODO)。
設定
-
記錄截止時間(狀態檔案可抵抗上下文壓縮——當你不確定剩餘時間時,重新讀取它):
HASH=$(printf '%s' "${CLAUDE_PROJECT_DIR:-$(pwd)}" | cksum | cut -d' ' -f1) STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/hwip" mkdir -p "$STATE_DIR" MINUTES=120 # 從 duration 參數解析 DEADLINE=$(( $(date +%s) + MINUTES * 60 )) printf '%s %s\n' "$DEADLINE" "$MINUTES" > "$STATE_DIR/auto-$HASH" date -r "$DEADLINE" 2>/dev/null || date -d "@$DEADLINE" # macOS | Linux -
保護分支守衛——絕不直接在
main/master/develop分支上工作:BRANCH=$(git branch --show-current 2>/dev/null) case "$BRANCH" in main|master|develop) git checkout -b "auto/$(date +%Y%m%d)-<task-slug>" ;; esac -
在撰寫任何程式碼之前,先找出驗證工具:專案的確定性檢查(來自 package.json、Makefile、CI 設定的測試 / lint / typecheck / 建置指令)。這些檢查是每次提交的關卡。若專案沒有這類檢查,請在啟動詢問中說明,並將「程式碼能編譯/執行」視為最低關卡。
-
啟動詢問——在進行任何操作前,執行一次
hwip_ask:title:"Auto mode: ()"body:2–3 行計劃 + 哪些驗證工具把關提交 + 分支名稱actions:[{id:"start", label:"Start", style:"primary"}, {id:"stop", label:"Cancel"}](若任務不明確,請將 "Start" 替換為 2–3 個候選任務按鈕)placeholder:"adjust the plan or scope..."timeout:180,fallback:"start"(或建議的候選任務)
自由文字回覆會修改計劃;
stop則取消此模式(刪除狀態檔案)。
循環
將任務拆分為單元:最小的、可獨立驗證且可提交的區塊(每個約 15–45 分鐘)。接著對每個單元執行:
-
時間檢查(在開始每個單元之前):
HASH=$(printf '%s' "${CLAUDE_PROJECT_DIR:-$(pwd)}" | cksum | cut -d' ' -f1) read -r DEADLINE MINUTES < "${XDG_STATE_HOME:-$HOME/.local/state}/hwip/auto-$HASH" echo "remaining: $(( (DEADLINE - $(date +%s)) / 60 ))m of ${MINUTES}m"若剩餘時間低於結束門檻——預算的 10%,至少 5 分鐘——則不要開始新單元;直接進入結束階段。
-
探索 → 規劃該單元(先閱讀相關程式碼;不要盲目編輯)。
-
實作該單元。
-
驗證使用確定性檢查。綠色是唯一的通過訊號——「看起來正確」不是驗證工具,且絕不要為了達到綠色而弱化或刪除一個失敗的測試。若失敗,修正並重新驗證,最多 3 次嘗試;若仍然為紅色,則還原該單元的變更(
git checkout -- <files>/git stash),保持工作目錄乾淨,記錄該單元為已跳過,然後繼續。 -
提交通過驗證的單元,使用清晰的約定式提交訊息。不要推送。
-
心跳通知——提交後,發送簡短的
hwip_notify("✅ — m left"),但每約 15 分鐘最多一次;批次處理小型單元。阻塞問題是例外:一旦出現,立即發送priority: "high"的通知。
重複上述步驟,直到所有單元完成或達到結束門檻。
問題協議——絕不停滯,絕不破壞
執行過程中的問題透過 hwip_ask 提出(絕不使用 AskUserQuestion,絕不使用純文字——CORE_RULES 規則 3/10 適用):
- 將建議的預設選項放在第一位,並在內文中說明超時後將自動繼續執行,設定
timeout: 180(對於真正重大的決策,最多可設為 600)並將fallback設為該預設選項的 id。 - 記錄每一個透過回退機制決定的項目——最終報告中需列出它們,以便使用者審核在他們缺席時所做的決策。
- 任何回覆都是直接指令:立即執行。
stop回覆(或任何結束會話的自由文字)意味著立即結束。 - 不可逆或對外的操作絕不能作為回退選項:推送、PR/發布、部署、資料刪除、結構刪除、強制操作、工作目錄以外的任何操作。對於這些操作,回退值必須是
skip——超時時你跳過該操作並記錄它,而不是執行它。只有明確的按鈕點擊才能授權。
結束階段
- 完成或還原正在進行的單元(同樣適用 3 次嘗試規則——絕不留下紅色或骯髒的樹)。
- 刪除狀態檔案:
rm -f "${XDG_STATE_HOME:-$HOME/.local/state}/hwip/auto-$HASH"。 - 最終報告在你的回覆文字中:完成的單元(附提交哈希值)、跳過的單元及原因、每個透過回退機制解決的決策,以及剩餘事項。
- 最終詢問:
actions:[{id:"extend", label:"+30m"}, {id:"review", label:"Review"}, {id:"done", label:"Done", style:"primary"}]timeout:300,fallback:"done"extend→ 將新的截止時間(+30 分鐘)寫入狀態檔案並重新進入循環;review→ 檢視差異;done→ 結束。
若出現問題
- 無 hook id(
Mode: one-way)——雙向工具不可用;無法執行自動模式。 請執行/hwip-config進行設定。 - 執行過程中狀態檔案遺失(例如狀態目錄被清除):將截止時間視為現在——立即結束,而不是猜測剩餘預算。
- 使用者在執行過程中於終端機輸入內容:該訊息等同於引導輸入,與
hwip_ask回覆相同。執行該指令並繼續循環。 - 驗證工具不穩定(相同指令在沒有變更的情況下交替出現綠色/紅色):不要將嘗試次數浪費在重新執行上——透過
hwip_notify(priority: "high")將其報告為阻塞問題,並移動到下一個單元。