我的好朋友 Claude
第 108 期|Claude Code|創作者、打工仔|

Claude Code 唔使開 terminal 都跑得:headless + cron 起夜貓自動化 workflow

Claude Code 唔淨係 interactive。Headless mode 可以入 cron、launchd、GitHub Actions、npm script,凌晨自動跑 code health、dep 審查、PR review。教 4 個真實設定 + 3 個部署變化。

難度 ★★★時間 45 分鐘用具 Claude Code CLI、cron 或 launchd (Mac/Linux)、Anthropic API key
【編者撰】一個香港人

情境

你 install 咗 Claude Code 兩個月,interactive session 用到出神入化。但你開始留意到一啲規律:

呢啲動作有個共通點:重複、有規律、唔需要即時對話。你開緊 Claude Code、揼緊 prompt、等緊 output——但其實全部都可以喺你訓緊覺嘅時候做完。

Claude Code 有個 mode 叫 headlessclaude -p "task" 直接畀任務、唔開 interactive session、做完即 exit、出入 stdout。呢個 mode 就係專門畀 cron、launchd、GitHub Actions、npm script 入面跑。

呢篇拆 4 個真實 headless 設定:

撐住,會技術啲。但行完一次,你會明點解 senior dev 個 laptop 凌晨 3 點仍然「咁勤力」。

跟住做

1. Headless mode 基本

Headless 嘅入口就一句:

claude -p "讀 README.md 同 summarize 3 句"

-p = print mode(即係 non-interactive / headless)。Claude 收 prompt → 做 → 出 stdout → 收工。冇對話、冇等你按 Y/N。

關鍵 flags:

# Output 做 JSON,方便落腳本 parse
claude -p "任務" --output-format json

# 明確限制 tools(headless 安全大原則)
claude -p "任務" --allowed-tools "Read,Grep,Bash(git diff:*,git log:*)"

# 完全唔問權限(小心用,只喺 CI / 你控制嘅環境)
claude -p "任務" --dangerously-skip-permissions

# 揀模型
claude -p "任務" --model claude-haiku-4-5

⚠️ 點樣理解 --dangerously-skip-permissions:headless mode 預設仍然會問你攞權限(但因為冇 TTY,會卡住)。呢個 flag 等於話「我已經用 --allowed-tools 鎖死範圍,唔好再問」。永遠配 --allowed-tools 一齊用,唔好淨係跳過權限但唔限 tools。

試一個無害嘅 baseline:

claude -p "用 1 句講 current directory 入面有咩 file" \
  --allowed-tools "Bash(ls:*)" \
  --dangerously-skip-permissions

出到一句 → 你已經有 headless 嘅基本積木。

2. 每日 code health 報告(cron)

目標:每朝 7:00,Claude 自動讀 main branch 嘅最新改動、寫一段「健康摘要」入 file,你食早餐睇。

建立 script ~/scripts/daily-health.sh

#!/usr/bin/env bash
set -euo pipefail

REPO=~/work/my-app
REPORT=~/reports/health-$(date +%Y-%m-%d).md

cd "$REPO"
git fetch origin main --quiet
git checkout main --quiet
git pull --quiet

claude -p "睇過去 24 小時 main branch 嘅 commit (git log --since='24 hours ago')。
為每個重要 commit 出:
1. 一句總結改動
2. 風險等級(低/中/高)
3. 需唔需要 follow up

最後出一段 3 句嘅 daily summary。" \
  --output-format text \
  --allowed-tools "Bash(git log:*,git diff:*,git show:*),Read,Grep" \
  --dangerously-skip-permissions \
  > "$REPORT"

echo "Report ready: $REPORT"

chmod +x ~/scripts/daily-health.sh 後加落 crontab:

crontab -e

入面加:

0 7 * * * /bin/bash ~/scripts/daily-health.sh >> ~/reports/cron.log 2>&1

每朝 7:00 自動跑。你訓醒已經有當日報告喺 ~/reports/health-2026-05-27.md

⚠️ API key:cron 環境唔會載入你個 .zshrc,要喺 crontab 開頭明確 export:

ANTHROPIC_API_KEY=sk-ant-xxx
0 7 * * * /bin/bash ~/scripts/daily-health.sh

或者喺 script 入面 source ~/.env

3. 每週 dep 審查(加安全閘)

目標:每個禮拜一凌晨 2 點,Claude 跑 pnpm outdated、評估邊啲升得安全、自動開 PR。

~/scripts/weekly-deps.sh

#!/usr/bin/env bash
set -euo pipefail

cd ~/work/my-app
git checkout main && git pull --quiet

BRANCH="bot/deps-$(date +%Y-%m-%d)"
git checkout -b "$BRANCH"

claude -p "你係 dep update bot。

步驟:
1. 跑 'pnpm outdated --format json' 攞 outdated list
2. 只升 patch 同 minor(major 列出但唔好升)
3. 跑 'pnpm update <pkg>' 逐個升安全嘅
4. 跑 'pnpm test' 確保唔 break
5. 如果 test fail,rollback 嗰個 dep
6. 最後出一個 markdown summary:升咗咩、跳過咩、原因

絕對唔好 commit。我會 review。" \
  --allowed-tools "Bash(pnpm:*,git diff:*,git status:*),Read,Edit" \
  --dangerously-skip-permissions \
  > /tmp/dep-summary.md

git add -A
git commit -m "chore(deps): weekly automated update $(date +%Y-%m-%d)"
git push origin "$BRANCH"

gh pr create --title "chore(deps): weekly update" --body-file /tmp/dep-summary.md

Crontab:

0 2 * * 1 /bin/bash ~/scripts/weekly-deps.sh

禮拜一返工已經有條 PR 等你 review。測試 pass、摘要清楚、major 版本升級列咗出嚟畀你揀。

呢個設定嘅安全閘:Claude 唔可以 git push --force、唔可以合併、唔可以郁 major 版本。你保留最終決定權。

4. GitHub Actions PR 自動 review

目標:每條 PR 開出嚟,Claude 自動覆檢、留低意見。

.github/workflows/claude-review.yml

name: Claude PR Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
      contents: read
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Run review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude -p "Review the diff between origin/main and HEAD.
          Focus on: bugs, security, error handling.
          Output 3-5 specific findings, each with file:line.
          If no issues, just say 'LGTM'." \
            --allowed-tools "Bash(git diff:*,git log:*),Read,Grep" \
            --dangerously-skip-permissions \
            > review.md

      - name: Post review comment
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const body = fs.readFileSync('review.md', 'utf8');
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: '## Claude Review\n\n' + body,
            });

ANTHROPIC_API_KEY 加落 GitHub repo secrets。Push → 每條 PR 自動有第一輪 review,真人 reviewer 慳返 15 分鐘第一遍掃描。

⚠️ 成本:每條 PR 一次 review,月 100 條 PR、用 Sonnet,大約 USD $5-15。先用 --model claude-haiku-4-5 封住成本,發覺漏嘢先升 Sonnet。

變化

變化 1:macOS launchd 取代 cron

Mac 用家:cron 用得,但 Apple 官方推 launchd(更穩、log 更靚、識重新啟動)。

建立 ~/Library/LaunchAgents/com.you.daily-health.plist

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.you.daily-health</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/bash</string>
    <string>/Users/you/scripts/daily-health.sh</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Hour</key><integer>7</integer>
    <key>Minute</key><integer>0</integer>
  </dict>
  <key>StandardOutPath</key>
  <string>/Users/you/reports/cron.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/you/reports/cron.err</string>
  <key>EnvironmentVariables</key>
  <dict>
    <key>ANTHROPIC_API_KEY</key>
    <string>sk-ant-xxx</string>
  </dict>
</dict>
</plist>

Load:

launchctl load ~/Library/LaunchAgents/com.you.daily-health.plist

開關更可控、laptop 訓覺醒返會自動補跑(如果你設 RunAtLoad)。

變化 2:Output 直推 Slack / Discord webhook

唔想讀 file,想改睇手機通知?將 Claude output 接駁入 webhook:

SUMMARY=$(claude -p "summarize PR queue" \
  --allowed-tools "Bash(gh pr list:*)" \
  --dangerously-skip-permissions)

curl -X POST "$SLACK_WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -d "$(jq -n --arg text "$SUMMARY" '{text: $text}')"

每朝個 Slack channel 自動有「今日 PR 狀況」摘要。Discord 寫法一樣,淨係換埋個 webhook URL。

變化 3:Claude Agent SDK(TypeScript wrapper)

claude -p 簡單,但如果你想喺 output parsing、重試、成本記錄方面控制得細啲,就用 Claude Agent SDK:

import { query } from "@anthropic-ai/claude-agent-sdk"

const result = await query({
  prompt: "Review git diff and output JSON of findings",
  options: {
    allowedTools: ["Read", "Bash(git diff:*)"],
    permissionMode: "bypassPermissions",
    model: "claude-sonnet-4-6",
  },
})

for await (const message of result) {
  if (message.type === "result") {
    console.error(JSON.stringify(message, null, 2))
  }
}

包入 npm script,放落 package.json

{
  "scripts": {
    "review": "tsx scripts/review.ts",
    "deps:audit": "tsx scripts/deps-audit.ts"
  }
}

Solo dev 唔需要。Agency / startup 跑 5 條以上 automation workflow 嗰陣,SDK 嘅重試、錯誤處理、成本記錄就抵返成本。

拆解:點解 work,同邊度會仆街

跟到上面就已經跑得起。下面呢段係畀想由「跑一次靚仔」做到「跑足半年都唔出事」嘅人——初學者可以跳過,唔影響你跟住做。

Headless automation 最陰公嘅地方係:冇人睇住。Interactive 你會即刻見到出錯、即刻 Ctrl-C;headless 喺凌晨 3 點靜雞雞做嘢,做錯咗都冇人知,直到你某朝發現條 PR 一早合咗、又或者三個禮拜冇出過報告。呢幾個位,就係 headless 真實會仆街嘅地方,你要預咗:

1. 靜默失敗,跑咗等於冇跑 cron 跑你個 script,就算 Claude 中途死咗、API timeout、quota 爆咗,cron 都唔會嘈——佢只係照樣 schedule 下一次。你以為日日有報告,其實個 file 兩個禮拜前已經停咗喺度。

2. --dangerously-skip-permissions 配錯 --allowed-tools 範圍 個 flag 個名已經叫你小心。Headless 冇 TTY,冇人撳 Y/N,所以 Claude 喺你開放嘅 tool 範圍內可以為所欲為。如果你 Bash(git:*) 開太闊,理論上 git push --forcegit reset --hard 都喺範圍內。

3. LLM 唔係 deterministic,同一個 prompt 唔保證同一個結果 你今日試 review prompt 出到 3 個準確 finding,唔代表下次同一條 PR 都出返一樣。Headless 跑落去,有時會多嘢、漏嘢、format 走樣。如果你下游靠 parse 佢個 output(例如當「LGTM」做 pass 訊號去自動合併),格式一變就會出事。

4. 個 repo state 唔係你 script 預期嗰個 你個 dep script 假設一開波喺乾淨嘅 main。但如果上次跑到一半死咗,留低咗條 bot/deps-xxx branch 未清、或者 working tree 有未 commit 嘅嘢,今次 git checkout -b 就會撞名失敗,成個 script 連鎖爆煲。

5. 成本同 quota,跑得越密蝕得越靜 Headless 嘅 bill 唔似你坐喺度睇住跳。一條 cron 每 5 分鐘跑一次、又或者你 schedule 咗一個大 refactor 批次跑到失控,個數會喺你訓覺嗰陣一路堆上去。撞到 rate limit / quota,輕則靜默失敗(見第 1 點),重則一個月嘅 budget 一個禮拜燒晒。

呢幾個位,就係「跑一次 demo 靚仔」同「跑足半年、你訓得安樂」之間嘅距離。Headless 唔係叫你撒手不管,係叫你預先諗定「佢出事嗰陣,我點樣即刻知」。

一個心態

Headless 嘅深層體會:你嘅產出唔再受你個鐘頭數限制

之前:每日 8 個有生產力嘅鐘頭,你親手敲 prompt 攞 output。 而家:8 個鐘 interactive + 16 個鐘 cron 跑緊嘢。每日報告、每週審查、PR review 全部喺你訓覺嘅時候做晒。

呢個改變對 3 類人特別顯著:

最後提醒:

今晚加一條 cron,聽朝 7 點睇佢嘅 output。一個禮拜後你會問自己:「點解之前所有嘢都要手動跑?」

文中工具 · 連結

睇完想同 Claude 一齊行一次?

撳一撳,就將成段 tutor 指示(連埋成篇文嘅內容)抄入剪貼簿。 貼入 Claude.ai 或 Claude Desktop,佢會用廣東話帶你一步一步行, 每步問你填關鍵位,最後畀返一個專為你情況寫嘅 prompt 帶走。

下期預告 · 相關情境
訂閱本副刊

每週日早上,
一道新菜送到你 inbox。

一篇 use case、一個香港情境、一個跟得到嘅做法。 冇 sell course、冇話你「再唔學就會失業」。

訂閱通道執緊緊
newsletter service 仲未接通。想第一時間收到新文章——
直接 email 我哋寫一句「訂閱」就得。

Email 「訂閱」畀我