開門見山講一個場景:
你叫 Claude Code 重構一個模組,做到一半你要去開會。回來的時候 session 斷了,context 清了,它忘記自己在幹嘛。你重新解釋一次需求,它重新讀一次 code,又花了十五分鐘回到剛才的進度——然後你又要去接小孩了
這個問題的本質不是「怎麼讓 Claude Code 一直跑」,而是三件事:
- 不停機 — 你不在,它繼續做
- 不歸零 — 就算斷了,接回來不用從頭開始
- 不失控 — 沒人盯的時候,它不會亂搞
這三層各有不同的技術手段,搭配起來才是完整的無人值守架構
第一層:不停機
讓 Claude Code 在你離開後繼續執行
tmux 保活(最基本)
最簡單的方式,用 tmux 讓 terminal session 活著:
tmux new -s work
claude
# 要離開了
# Ctrl+B 然後按 D(detach)
# session 繼續跑,你可以關掉筆電
# 回來的時候
tmux attach -t work
Claude Code 不知道你離開了,它會繼續做手上的事。適合「我出門買個咖啡」等級的離開
限制:電腦不能關機、不能斷網。筆電蓋上去如果會 sleep 就斷了
/loop — Session 內的定時循環
Claude Code 內建的 /loop 可以讓一個 prompt 每隔固定時間自動執行:
/loop 10m 檢查 CI 狀態,如果有失敗就修
這不只是定時器。搭配對的 prompt,它可以是一個自動巡邏員:
/loop 15m 讀 TODO.md,挑下一個未完成的項目繼續做。做完一個就更新狀態
關鍵設計:loop 的 prompt 不能只說「繼續做」,要告訴它去哪裡找進度、怎麼判斷做完沒有。後面會細講
系統 crontab + claude -p(跨 session)
如果你要的是「關掉電腦明天再回來,它半夜自己跑」,那需要系統層的排程:
# crontab -e
0 */4 * * * cd ~/project && claude -p "讀 TODO.md,執行下一個待辦" --bare >> /tmp/claude-auto.log 2>&1
--bare 讓 Claude Code 跳過完整的 context 載入(CLAUDE.md、MCP servers),啟動快十倍。適合定時任務,不適合需要完整 context 的複雜開發
進階版:搭配 --resume 接回上一個 session
# 儲存 session ID
claude -p "開始重構 auth 模組" --output-format json | jq -r '.session_id' > /tmp/session-id.txt
# 四小時後接回來繼續
claude --resume $(cat /tmp/session-id.txt) -p "接著做"
GitHub Actions(真正的 24/7)
如果你連伺服器都不想顧:
name: Claude Auto Work
on:
schedule:
- cron: '0 */6 * * *' # 每六小時
workflow_dispatch: # 也能手動觸發
jobs:
work:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Claude
run: |
npx @anthropic-ai/claude-code -p "
讀 TODO.md,挑優先度最高的未完成項目。
做完後更新 TODO.md,commit 並 push。
" --bare
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GitHub 的機器永遠醒著,你睡覺它幹活。但這層最容易失控,所以第三層的防護很重要
第二層:不歸零
這是最多人忽略的一層。Claude Code 能跑不代表它知道自己在幹嘛——每次新 session 預設是空白開始
讓它「接著做」的核心是:把進度寫在 Claude Code 之外的地方
TODO.md — 最簡單的進度文件
loop prompt 這樣寫:
讀 TODO.md。找到標記「做到這裡」的項目,從那裡繼續。
做完一個就打勾,把「做到這裡」移到下一個未完成項目。
如果全部完成,停止 loop
這樣就算 session 斷了重啟,它讀 TODO.md 就知道從哪裡接
/checkpoint — 結構化的狀態存檔
Claude Code 有內建的 /checkpoint 功能,會存下:
- 當前 git 狀態
- 做了哪些決策
- 還剩什麼工作
/checkpoint 存檔:auth 重構做到一半,import paths 改了 8/20 個
下次用 /catchup 回復:
/catchup
它會讀取上一次的 checkpoint,給你一份 briefing,然後你可以說「繼續」
Memory 系統 — 跨 session 的長期記憶
Claude Code 的 memory 是寫在檔案系統的持久化記憶。進度類的東西可以存成 project memory:
---
name: auth-refactor-progress
description: auth 模組重構進度追蹤
type: project
---
Auth 重構已完成 Phase 1(拆分檔案),Phase 2(更新 imports)做到第 8 個檔案
**Why:** 原本 auth.ts 1200 行,需要拆成三個模組
**How to apply:** 下次提到 auth 重構時,從 Phase 2 第 9 個檔案開始
Memory 的好處是它被自動載入,不需要你提醒 Claude Code 去讀
Plan Mode — 大型任務的進度追蹤
如果任務夠大(改動超過三個檔案),先進 Plan Mode:
/plan 重構 auth 模組
Claude Code 會列出步驟,你核可後它開始執行。Plan 本身就是進度記錄——哪些步驟完成了、哪些還沒,都存在 plan 裡
loop 搭配 plan 的威力:
/loop 10m 檢查當前 plan 的進度,繼續執行下一個未完成的步驟。每完成一步就更新 plan 狀態
Git Commit 當作 Checkpoint
每完成一個小單元就 commit,commit message 寫清楚進度:
feat: auth refactor phase 2 - updated imports (8/20 files)
這樣就算什麼機制都壞了,git log 就是你的進度表。Claude Code 讀 git log 就能判斷做到哪裡
第三層:不失控
無人值守最怕的不是停機,是它在沒人看的時候做了不該做的事
Hooks — 硬性護欄
Claude Code 的 hook 系統是確定性控制,不靠模型判斷:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hook": "echo '禁止 rm -rf 和 force push' && [[ ! \"$TOOL_INPUT\" =~ (rm -rf|--force|--hard) ]]",
"description": "擋危險指令"
}
]
}
}
無人值守時建議加嚴格的 hooks:
- 禁止
git push --force - 禁止刪除超過 5 個檔案
- 禁止修改
.env和 credentials - 限制只能改特定目錄(
/freeze)
/freeze — 限制編輯範圍
/freeze src/auth/
Claude Code 只能改 src/auth/ 底下的檔案。就算 loop 跑到別的地方去,它也碰不到
commit 而不是 push
無人值守的任務,建議改成「commit but don't push」。讓它本地做完,你回來 review 再 push:
做完每個項目後 git commit,但不要 push。等我回來確認
這樣最糟的情況就是 git reset,不會影響到 remote
失敗就停
在 loop prompt 裡加明確的停止條件:
/loop 10m 執行 TODO.md 下一個項目。
如果遇到以下情況,停止 loop 並寫一份報告到 REPORT.md:
- 測試連續失敗兩次
- 需要我做決定的設計問題
- 碰到你沒見過的錯誤
不要猜,不要繞過,停下來等我
實戰組合:我怎麼搭的
我同時管十個專案,不可能每個都盯著。我的配置是這樣:
日常開發(人在電腦前但會離開)
tmux + /loop 15m + TODO.md + /freeze
tmux 保活,/loop 每十五分鐘推進一步,TODO.md 記進度,/freeze 限制它只能改我正在做的模組。我去開會回來,它已經多做了兩三個 TODO
跨 session 大任務(今天做不完明天接)
Plan Mode + /checkpoint + Memory + git commit
先用 Plan Mode 定好步驟,做到一半 /checkpoint 存檔。明天開新 session 用 /catchup 回復,它就知道做到哪了。每一步都 commit,commit message 就是進度紀錄
無人值守巡邏(CI 監控、狀態同步)
crontab + claude -p --bare + hooks
系統層 crontab 每幾小時叫一次 Claude Code,用 --bare 快速啟動,跑完就結束。hooks 擋掉所有危險操作
最保險的架構
常見的坑
loop prompt 太模糊
# 不好
/loop 10m 繼續做
# 好
/loop 10m 讀 TODO.md,找「做到這裡」標記,執行該項目。完成後打勾並移動標記。全部完成就停止
Claude Code 每次 loop 回來是一個「接近全新」的狀態。你的 prompt 必須包含「去哪裡找進度」和「怎麼判斷該做什麼」,不能假設它記得上一輪做了什麼
沒有停止條件
沒有明確停止條件的 loop 會一直跑到 token 用完或做出蠢事。永遠寫清楚什麼時候該停
進度只存在 context 裡
Claude Code 的對話 context 會被 compact(壓縮)或清除。任何重要的進度必須寫到檔案系統——TODO.md、plan、memory、git commit。存在 context 裡的東西預設會消失
無人值守 + push = 風險
除非你的 CI/CD 很完善(測試覆蓋率高、有 staging 環境),否則不要讓無人值守的 Claude Code 直接 push 到 remote。本地 commit 就好,你回來再 push
一句話總結
Claude Code 持久運行的關鍵不是「讓它一直開著」,而是讓它每次醒來都知道自己該做什麼
tmux 讓它不斷線,TODO.md 讓它不失憶,hooks 讓它不暴走,/loop 把這些串起來。搭好這個架構,你就有了一個會自己接著做的 AI 工程師——只是偶爾需要你回來看一眼,確認方向沒跑偏
