Claude Code 無人值守:怎麼讓 AI 在你不在時繼續幹活
AI 落地實戰·12 分鐘

Claude Code 無人值守:怎麼讓 AI 在你不在時繼續幹活

你不在電腦前,Claude Code 能不能自己接著做?能不能做到一半斷了自動回來?這篇拆解三層架構:不停機、不歸零、不失控

Y
Young

開門見山講一個場景:

你叫 Claude Code 重構一個模組,做到一半你要去開會。回來的時候 session 斷了,context 清了,它忘記自己在幹嘛。你重新解釋一次需求,它重新讀一次 code,又花了十五分鐘回到剛才的進度——然後你又要去接小孩了

這個問題的本質不是「怎麼讓 Claude Code 一直跑」,而是三件事:

  1. 不停機 — 你不在,它繼續做
  2. 不歸零 — 就算斷了,接回來不用從頭開始
  3. 不失控 — 沒人盯的時候,它不會亂搞

這三層各有不同的技術手段,搭配起來才是完整的無人值守架構


第一層:不停機

讓 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 — 最簡單的進度文件

# 重構計畫## 進行中[x] 拆分 auth.tsauth-core.ts + auth-middleware.ts[ ] 更新所有 import paths(剩 12 個檔案) ← 做到這裡[ ] 補 API contract tests## 筆記auth-middleware.ts:L45 有個 edge case 要處理測試跑過 npm test -- --grep</tspan> <tspan x="380" dy="18"> auth 全過

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 擋掉所有危險操作

最保險的架構

你離開了tmux session 繼續跑/loop 每 N 分鐘讀 TODO.md / Plan 找進度執行下一步git commit 存進度hooks 擋危險操作失敗 → 停止 + 寫報告萬一 session 斷了:crontab 定時重啟claude --resume 或讀 TODO.md 接回來你回來了:/catchup 看進度review commitspush

常見的坑

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 工程師——只是偶爾需要你回來看一眼,確認方向沒跑偏

Claude CodeAI 開發自動化持久化開發者工具