ClaudeClaude Code系列第 9 / 9 篇

Claude Code 的 routine、桌面版定时任务和云端环境:让它按时间、按事件自己跑,云端那台机器怎么配

三种让 Claude Code 定时干活的办法怎么选;云端的 routine 怎么建,定时、API、GitHub 事件三种触发各怎么配;桌面版的本地定时任务错过了怎么补;云端环境的网络级别、环境变量、网络密钥和启动脚本怎么设。整理自官方文档,这些功能要 claude.ai 订阅。

发布 · 约 20 分钟读完 · 经人工审核()· 本站的内容怎么来的

本文根据公开分享整理,本站尚未实测。操作前请对照文末的原始来源。

本页目录(6 节)
  1. 一、三种定时的办法
  2. 二、云端的 routine
  3. 三、桌面版定时任务
  4. 四、云端环境
  5. 五、用不了的读者怎么办
  6. 这篇没有实测的

这篇解决三个问题:

  1. 想让 Claude Code 定时或者在某件事发生时自己跑,有哪几种办法,怎么选?
  2. 云端的 routine 怎么建,三种触发方式各怎么配? 桌面版的本地定时任务又是怎么回事?
  3. 云端会话跑在一台什么样的机器上? 网络、环境变量、密钥、要装的依赖怎么配?

这三样都要用 claude.ai 账号登录。 用 API key、云厂商或者中转站的会话里没有 /schedule,也开不了云端会话。本站的实测环境走的是中转站,所以这篇整理自官方文档,没有实测。用不了的读者,文末有替代的办法。

云端会话本身怎么用,见《Claude Code 云端会话怎么用》;会话里的 /loop,见《Harness 工程和 Loop 工程是什么》。

一、三种定时的办法

云端的 routine 桌面版定时任务 /loop
跑在哪 云端,默认由 Anthropic 托管 你的电脑 你的电脑
电脑要开着吗 不用 要 要
要开着会话吗 不用 不用 要
重启之后还在吗 在 在 用 --resume 恢复,有例外
能碰本地文件吗 不能,每次重新克隆仓库 能 能
MCP 服务器 每个任务单独配连接器 配置文件和连接器 沿用会话的
会停下来问权限吗 不会,自己跑到底 每个任务可以单独设 沿用会话的
最短间隔 1 小时 1 分钟 1 分钟

一句话的选法:

  • 不管电脑开没开都要可靠地跑,用云端的 routine。
  • 要用到本地的文件和工具,用桌面版定时任务。
  • 会话开着的时候顺手轮询一下,用 /loop。

二、云端的 routine

它是什么

一个 routine 是一份保存下来的 Claude Code 配置:一段提示词、一个或几个仓库、一组连接器。打包一次,之后自动运行。它跑在 Anthropic 托管的云端机器上,所以合上电脑之后照样干活。

官方举的几种用法:每个工作日晚上整理一遍 issue;监控系统报警时调接口让它排查并开一个草稿 PR;每个新 PR 按团队自己的清单审一遍;每次上线之后跑冒烟检查;每周扫一遍合并了的 PR,找出过时的文档。共同点是无人值守、重复、结果明确。

它现在是研究预览,行为、限制和接口都可能变。

四件要先知道的事

  • 谁能用。 Pro、Max、Team、Enterprise 套餐。Team 和 Enterprise 的 Owner 可以给所有成员关掉,关掉之后已有的 routine 停止运行。
  • 它属于你个人的账号,不和同事共享,用量算在你的账号上。
  • 它以你的身份行动。 通过你连接的 GitHub 做的提交和 PR 署的是你的用户名;通过连接器发的 Slack 消息、建的工单,用的是你关联的那些账号。
  • 它不停下来问。 routine 是完整的云端会话,没有权限模式可选,跑 shell 命令、用仓库里的 skill、调你带上的连接器,都不等批准。

最后一条决定了怎么配:routine 够得着什么,由你选的仓库、环境的网络和变量、带上的连接器这三样决定。每一样都只给它实际需要的。

建一个

可以在三个地方建:网页(claude.ai/code/routines)、桌面应用、命令行。三处写的是同一个云端账号,一处建了,另外两处马上看得到。

网页上的步骤:

  1. 点 New routine。
  2. 起名字,写提示词。 提示词是最要紧的部分:它自己跑,所以提示词要自成一体,写清楚做什么、怎样算做成。提示词的输入框里可以选模型,每次运行都用这个模型。
  3. 选仓库。 一个或几个 GitHub 仓库,每次运行开头都重新克隆。
  4. 选环境。 环境决定网络访问、环境变量和启动脚本,见第四节。默认的 Default 环境只放行常用的包仓库等域名。
  5. 选触发方式。 可以只选一种,也可以几种一起。
  6. 检查连接器。 你已经连接的所有连接器默认都带上了。把用不到的删掉:带上的连接器里的每个工具 Claude 都能用,包括写操作,运行时不会问你。
  7. 点 Create。想马上跑一次,在详情页点 Run now。

每次运行会新建一个会话,和你别的会话列在一起,可以进去看它做了什么、审改动、开 PR。

命令行里,在任意会话里输入 /schedule,用对话的方式建。也可以直接带上描述:

/schedule daily PR review at 9am

正常的情况是 Claude 接着问你时间、仓库和提示词,问完保存。如果它回答说需要登录,或者连不上你的 claude.ai 账号,那就是没建成。/routines 是同一个命令的别名。

命令行里的 /schedule 建的是定时的 routine。API 触发只能在网页上加。

触发方式一:定时

在表单里选一个预设的频率:每小时、每天、工作日、每周。时间按你本地的时区填,会自动换算。

  • 整点的任务可能晚几分钟开始。 想让它贴近设定的时间,选整点过几分钟,比如 9:07。
  • 想要预设里没有的间隔(每两小时、每月一号),先选一个最接近的,再在命令行里用 /schedule update 设一个具体的 cron 表达式。
  • 最短间隔是一小时,更密的表达式会被拒绝。

也可以只跑一次。在命令行里用自然语言说时间,Claude 会换算成确切的时间并和你确认:

/schedule in 2 weeks, open a cleanup PR that removes the feature flag

一次性的 routine 跑完之后自动停用,网页上标成 Ran。

触发方式二:API

给 routine 一个专属的 HTTP 地址。带上它的令牌发一个 POST,就新开一个会话,并返回会话的网址。适合接报警系统、发布流水线、内部工具。

在网页上给一个已有的 routine 加:编辑它,在触发方式那里点 Add another trigger,选 API。弹窗里有这个 routine 的地址和一条示例命令。点 Generate token 之后马上把令牌复制走,它只显示一次。每个 routine 有自己的令牌,只能用来触发这一个 routine。

调用的样子(地址和令牌是占位的):

curl -X POST https://api.anthropic.com/v1/claude_code/routines/trig_01ABCDEFGHJKLMNOPQRSTUVW/fire \
  -H "Authorization: Bearer sk-ant-oat01-xxxxx" \
  -H "anthropic-beta: experimental-cc-routine-2026-04-01" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"text": "Sentry alert SEN-4521 fired in prod. Stack trace attached."}'

成功时返回新会话的编号和网址。

请求体里的 text 是可选的,用来带这一次运行的上下文,比如报警的内容。它有一条容易忽略的规则:

text 不会被当成指令。 它被包在一个 <routine-fire-payload> 块里交给 Claude,标明是不可信的数据,并且告诉 Claude 不要照里面的指示做,除非 routine 自己的提示词说可以。所以提示词里要明确提到它,比如写“排查 routine-fire-payload 块里描述的那条报警”。不这样写,传进来的文字只是一段放在那里的背景。这样设计的原因是:拿到令牌的任何人都能发 text,令牌泄露了,别人发来的内容也只是带着“不可信”标记的数据。

text 是原样的文字,不解析。你发 JSON 过去,routine 收到的是一个字符串。

这个接口在一个 beta 请求头下面提供,请求和响应的格式、频率限制都可能变。它只对 claude.ai 用户开放,不是 Claude 开发平台 API 的一部分。

触发方式三:GitHub 事件

仓库里发生匹配的事件时自动新开一个会话。每个事件一个独立的会话,同一个 PR 更新两次就是两个会话。

前提是在这个仓库上装了 Claude GitHub App。 在网页上配的时候,没装会提示你装。有一处容易混:命令行里的 /web-setup 只是授权克隆仓库,不会装这个 App,也不会开启事件推送。

支持两类事件:

事件 什么时候触发
Pull request PR 被打开、关闭、指派、打标签、同步,或者有其他更新
Release 发布被创建、发布、编辑或删除

可以选某一个具体的动作(比如 pull_request.opened),也可以对这一类的所有动作都反应。

PR 可以再加过滤条件,所有条件都满足才触发:

过滤项 匹配什么
Author PR 作者的 GitHub 用户名
Title 标题
Body 描述
Base branch 目标分支
Head branch 来源分支
Labels 标签
Is draft 是不是草稿
Is merged 有没有合并

每个过滤项配一个操作符:等于、包含、开头是、是其中之一、不是其中之一、匹配正则。

正则匹配的是整个字段,不是其中一段。 想匹配标题里含 hotfix 的 PR,要写 .*hotfix.*。只写 hotfix,只有标题恰好就是这个词才匹配。只想按字面找一段文字,用“包含”。

GitHub 事件有按 routine 和按账号的每小时上限,超出的事件会被丢掉,等下一个时间窗口。

看运行结果

点 routine 进详情页,能看到它的仓库、连接器、提示词、时间表、令牌、GitHub 触发和过去的运行记录。点一条记录,就是一个完整的会话。

运行列表里的绿色,只表示会话启动了、退出时没有基础设施层面的错误,不表示提示词里的任务做成了。 被拦掉的网络请求、缺少的连接器工具、任务本身的失败,都要打开会话看记录才知道。

详情页上还能做这些:

  • Run now:马上跑一次,可以附一段文字,它和 API 的 text 一样被包起来。
  • 顶上的开关:暂停或恢复。暂停的 routine 配置还在。
  • Edit:改名字、提示词、仓库、环境、连接器和触发方式。
  • Delete:删除。

命令行里:/schedule list 列出全部,/schedule update 改一个,/schedule run 马上触发。还可以直接问它某次运行的情况,比如问今天早上那次为什么什么都没做,Claude 会列出最近的运行,读日志给你解释。

仓库、分支和连接器

  • 每个仓库每次运行都重新克隆,从默认分支开始,除非提示词里另有说明。
  • Claude 把改动推到 claude/ 开头的分支上,除非提示词让它推到别处。想限制它能推哪些分支,用 GitHub 的分支保护规则。
  • GitHub 连接断了或者过期了:到点的运行会被跳过,最多持续 72 小时。这期间重新连上,routine 自己恢复。超过 72 小时,routine 被关掉,重连之后要你手动打开。
  • 连接器是你 claude.ai 账号上的集成。 你在命令行里用 claude mcp add 加的 MCP 服务器存在本机,不在这个列表里。想在 routine 里用,要到 claude.ai 上把它加成连接器。

用量和限制

routine 和交互式会话一样消耗订阅的用量。此外每种启动方式各有每小时的上限:

动作 上限 按什么算 超了会怎样
定时运行(包括一次性的) 每小时 100 次 账号 等到上限重置再跑
Run now、API 调用、让一次性的 routine 再跑一次 每小时 30 次 每个 routine,三种合计 这次动作失败
Run now 和让一次性的 routine 再跑一次 每小时 100 次 账号 同上
API 调用 每小时 100 次 账号,和 Run now 分开算 同上

这些上限都不能加钱超出。订阅暂停期间,routine 也暂停。

/schedule 显示 Unknown command

命令行在条件不满足时会把 /schedule 藏起来。常见的原因:

情况 会看到什么
用 Console 的 API key 或 profile 认证 提示这个功能随 Claude for Enterprise 提供,让你找管理员从 API key 迁过去
用云厂商认证 Unknown command: /schedule
完全没有登录 提示要 claude.ai 订阅,让你运行 /login
在云端会话里面 提示这个环境里用不了,到网页上管理
组织的策略关了云端会话 提示云端会话被组织策略关闭
Owner 关了 routine 命令被隐藏

只要组织没有关掉 routine 和云端会话,不管命令行怎么配,都可以在网页上建和管理。

三、桌面版定时任务

桌面应用的 Routines 页面里,本地的定时任务和云端的 routine 都能建。新建时选 Local 是本地任务,选 Cloud 是云端的 routine。

本地任务跑在你的电脑上,能直接用你的文件和工具。代价是:只有应用开着、电脑醒着的时候才会触发。

建一个

在 Code 页签的侧栏里点 Routines,再点 New routine,选 Local。桌面应用 1.1.5368 之前的版本没有本地定时任务。

字段 说明
Name 任务的标识。会转成小写加连字符,用作磁盘上的目录名,不能和别的任务重名
Description 列表里显示的一句说明
Instructions 任务运行时让 Claude 做什么,和平时在提示框里写消息一样。这里可以选权限模式和模型,下面选工作目录、要不要用独立的 worktree
Schedule 多久跑一次

必须先选一个目录才能保存,没有信任过的目录会先让你确认信任。

也可以在任意会话里直接说。说“每天早上 9 点做一次代码审查”,会建一个重复的任务;说“明天下午 3 点提醒我看一下部署”,会建一个一次性的任务,触发之后自己停用。

时间的预设有五种:Manual(不定时,只在点 Run now 时跑)、Hourly、Daily、Weekdays、Weekly。预设里没有的,比如每 15 分钟、每月一号,直接用大白话让 Claude 设。

它怎么跑

  • 应用开着的时候,每分钟检查一次时间表,到点了就新开一个会话,和你手动开的会话互不影响。
  • 每个任务在设定的时间之后有几分钟的延迟,用来错开请求。同一个任务的延迟是固定的。
  • 触发时有桌面通知,新会话出现在侧栏的 Scheduled 分组里。
  • 默认情况下,任务面对的是工作目录当时的样子,包括没提交的改动。建任务时打开 worktree 的开关,每次运行就有自己独立的 worktree。

电脑睡着的时候到点了,这次运行就跳过了。想防止空闲时睡眠,在设置里打开 Keep computer awake;合上笔记本的盖子仍然会睡。

错过的运行只补一次

应用启动或者电脑醒来时,桌面应用会检查每个任务在过去七天里有没有错过。有的话,只补最近错过的那一次,更早的都丢掉。一个每天跑的任务错过了六天,醒来时只跑一次。

这对写提示词有影响:设在早上 9 点的任务,可能因为电脑睡了一整天,到晚上 11 点才跑。时间要紧的话,在提示词里自己加条件,比如“只审今天的提交;如果已经过了下午 5 点,就不审了,只发一条说明”。

权限:别让它卡在那

每个任务有自己的权限模式。~/.claude/settings.json 里的 allow 规则对定时任务的会话同样有效。

任务在 Manual 模式下跑,遇到没有权限的工具,这次运行就停在那里,等你批准。会话留在侧栏里,你可以晚点再回。

避免卡住的办法:建好之后先点一次 Run now,盯着它,每个权限询问都选“always allow”。之后这个任务再用到同样的工具就不问了。这些批准可以在任务的详情页里查看和撤销。

有一种例外:标了 requiresUserInteraction 的 MCP 工具每次调用都要问,没有“always allow”可选,用到它的运行每次都会停。

管理

详情页上可以立即运行、暂停和恢复、编辑、看历史、看和撤销已保存的批准、删除。历史里包括被跳过的运行,鼠标移上去能看到原因:电脑睡着了、上一次还没跑完,或者别的定时任务正在跑。

任务的提示词存在磁盘上的一个文件里,开头是 name 和 description,正文是提示词,改了下次运行生效:

~/.claude/scheduled-tasks/<任务名>/SKILL.md

时间表、目录、模型、启用状态不在这个文件里,要在编辑表单里改,或者让 Claude 改。

任务还可以在运行当中改自己的时间表和提示词,比如发现建了发布分支,就把下一次审查提前。

四、云端环境

每个云端会话都跑在一个云端环境里。同一套环境对所有入口有效:桌面应用、手机应用、浏览器里的 claude.ai/code、命令行的 claude --cloud、routine。

Remote Control 不在此列:它连的是你自己电脑上的会话,用的是你电脑的网络和文件。

默认的环境

还没有环境时,引导流程会建一个叫 Default 的。它没有任何自己的配置:网络是 Trusted 级别,没有环境变量,没有启动脚本。

出现下面三种需要时再去配:要访问默认清单之外的域名;要给会话设环境变量;要在 Claude 开始干活之前装好依赖。

在哪配。 在 claude.ai/code 的消息框上面那一行,点显示着当前环境名字的云朵图标。没有单独的设置页,也没有直达的网址。桌面应用里从提示框进。你建的环境是你个人的;Team 和 Enterprise 的 Owner 可以建全组织共享的环境。环境不能删除,只能归档。

命令行里用 /remote-env 选从命令行开云端会话时默认用哪个环境。它只能选,不能新建和编辑。

网络访问

每个环境设一个级别:

级别 能连出去的地方
None 会话的网络不能连出去
Trusted(默认) 只有默认清单里的域名:包仓库、GitHub、云厂商的 SDK 等
Full 任何域名
Custom 你自己的清单,可以选择把默认清单也包含进来

不管选哪一级,下面四样都还能连,因为它们走的不是会话网络的那张清单:

  • GitHub,走单独的代理。
  • 你启用的 MCP 连接器,流量经过 Anthropic 的服务器。
  • 你在网络密钥里列的主机。
  • Anthropic API,Claude Code 自己的请求用,None 级别下也通。

要放行默认清单之外的域名,选 Custom,一行写一个:

api.example.com
*.internal.example.com
registry.example.com

改了网络级别,已有的会话大约一分钟之内跟上,不用新开。

访问清单之外的主机,请求会失败,状态码 403,响应头里有 x-deny-reason: host_not_allowed。routine 跑完显示绿色但什么都没做成,先查这个。

每个环境有自己的清单。没有组织级的清单可以推给每个成员的环境;想让团队用同一份,由 Owner 建一个共享环境。

环境变量

用 .env 的格式,一行一个 KEY=value:

NODE_ENV=development
LOG_LEVEL=debug
DATABASE_URL=postgres://localhost:5432/myapp

值里有 # 或者跨多行,要加引号。不加引号时,# 后面的内容会被当成注释丢掉。

两条要点:

  • 用这个环境的任何人都能读到这些值。 不要把密钥放在这里。
  • 改了之后不是马上生效。 已有的会话继续用它上次读到的值,等它的虚拟机下次恢复或重建时才换成新的。想马上用新值,让 Claude 直接在命令前面带上,或者新开一个会话。

网络密钥(Pro 和 Max)

网络密钥是存在环境上的 API key 或令牌。Claude 在这个环境的会话里可以调那个 API,但看不到 key:Anthropic 的代理在请求离开会话的虚拟机之后,才给你列出的主机加上它。

  • 目前只有 Pro 和 Max 有,Team 和 Enterprise 还没有。
  • 一次加一个,加了之后不能改。要改主机或者值,删掉重加。保存之后值不能再看。
  • 要验证它起作用了:开一个会话,让 Claude 用 curl 调那个 API。API 像带了 key 一样回应,而 key 不出现在会话的环境变量和任何文件里。

这些请求不会带上密钥:发给 GitHub 的(由 GitHub 代理负责认证);发给 Anthropic API 和公共包仓库的;启动脚本里发的(代理是在脚本跑完之后才接上的)。

GitHub 代理

在 Anthropic 托管的环境里,所有 GitHub 操作都经过一个专门的代理,你真实的 GitHub 凭据不进会话的虚拟机。它有几条限制,写提示词时要知道:

  • 拒绝删除分支,也拒绝推送分支以外的东西(比如标签)。它不限制能更新哪些分支,那要用 GitHub 的分支保护规则。
  • 只服务这个会话挂的仓库。 对别的仓库的 API 请求返回 403。
  • 拒绝 GraphQL。 所以 gh pr、gh issue 这类用 GraphQL 的子命令都会收到 403。要用 gh api repos/{owner}/{repo}/... 这种 REST 的写法,或者用会话内置的 GitHub 工具。

哪些东西带得过去

云端会话从你仓库的一份新克隆开始。提交进仓库的都在,只装在或配在你自己电脑上的都不在。

云端会话里有吗
仓库里的 CLAUDE.md、.claude/rules/ 有
仓库里的 .claude/skills/、.claude/agents/、.claude/commands/ 有
仓库的 .claude/settings.json 里的 hook 和权限规则 有,限只挂一个仓库的会话
仓库的 .mcp.json 里的 MCP 服务器 有,限只挂一个仓库的会话
仓库设置里声明的插件和市场 没有,云端会话不装它们
组织的服务器托管设置 有
你自己的 ~/.claude/CLAUDE.md 没有
你自己的 ~/.claude/ 下面的 skill、子代理、命令 没有,提交到仓库的 .claude/ 里才有
只在用户设置里启用的插件 没有
用 claude mcp add 按默认范围加的 MCP 服务器 没有。加的时候带 --scope project,再把 .mcp.json 提交
AWS SSO 这类要交互的登录 不支持

个人的偏好不想提交进共享的仓库,可以在自己的环境里用启动脚本写一个 ~/.claude/CLAUDE.md:

#!/bin/bash
mkdir -p ~/.claude
cat > ~/.claude/CLAUDE.md <<'EOF'
Use conventional commit messages.
EOF

那台机器上有什么

在 Anthropic 托管的环境里,每个会话拿到一台新的虚拟机:Ubuntu 24.04,x86_64,和你自己的系统、芯片无关。

类别 预装的
Python Python 3.x,pip、poetry、uv、black、mypy、pytest、ruff
Node.js 20、21、22,npm、yarn、pnpm、bun、eslint、prettier、chromedriver
Ruby 3.1、3.2、3.3,gem、bundler、rbenv
PHP 8.3,Composer
Java OpenJDK 21,Maven、Gradle
Go、Rust Go;rustc 和 cargo
C/C++ GCC、Clang、cmake、ninja、conan
Docker docker、dockerd、docker compose
数据库 PostgreSQL 16、Redis 7.0
工具 git、gh、jq、yq、ripgrep、tmux、vim、nano

几处要留意:

  • 你进不了这台机器的 shell。 所有命令都是 Claude 替你跑的,要做什么写在提示词里。想知道各工具的版本,让 Claude 运行 check-tools。
  • PostgreSQL 和 Redis 装了但默认没启动。 要用就让 Claude 启动。
  • Node.js 默认是 22。 要用别的版本,让 Claude 把那个版本的 bin 目录加到 PATH 前面。
  • bun 装了,但走代理取包有已知的兼容问题。
  • 不在表里的工具链(比如 .NET SDK)没有预装,用启动脚本装。

资源的上限大约是 4 个 vCPU、16 GB 内存、30 GB 磁盘,可能调整。明显超出的任务(大型构建、吃内存的测试)可能被停掉,这种活改用 Remote Control 在自己的机器上跑。

时间上:Claude 跑一条前台命令默认等 2 分钟,最多可以要到 10 分钟,超时的命令会被转到后台继续跑。想调长,在环境变量里加 BASH_DEFAULT_TIMEOUT_MS 和 BASH_MAX_TIMEOUT_MS,单位是毫秒。会话闲置几分钟之后虚拟机会暂停,文件保留;暂停的虚拟机之后可能被回收。

启动脚本

启动脚本是一段 Bash 脚本,在新会话启动时、Claude Code 运行之前执行。用来装依赖、配工具。它以 root 身份跑,apt install 和大多数语言的包管理器都能用。

#!/bin/bash
apt update && apt install -y shellcheck

三条约束:

  • 必须以 0 退出。 脚本退出码不是 0,会话就启动失败。不要紧的命令后面加 || true,免得一次偶然的安装失败把会话卡死。
  • 大约五分钟之内跑完。 超过了,环境就不缓存。互不依赖的安装用 & 和 wait 并行跑。
  • 装东西要有网。 默认的 Trusted 级别覆盖了 npm、PyPI、RubyGems、crates.io 这些常用的包仓库;None 级别下安装会失败。

缓存是这么回事: 第一次在一个环境里开会话时跑启动脚本。脚本在大约五分钟内跑完,Anthropic 就给文件系统拍一个快照,之后的会话从快照起步,依赖、工具和 Docker 镜像已经在磁盘上。

快照只存文件,不存正在运行的进程。装的包、拉的镜像、写的文件都留着;脚本里启动的数据库、docker compose up 起来的服务都不在,每个会话要让 Claude 重新启动。

改了启动脚本或者放行的域名,缓存会重建;缓存大约七天过期。

启动脚本,还是 SessionStart hook

启动脚本 SessionStart hook
在哪配 环境的设置对话框 设置文件,比如仓库的 .claude/settings.json
什么时候跑 Claude Code 启动之前;有缓存时跳过 Claude Code 启动之后;每次会话都跑,包括恢复的
在哪跑 只在云端会话 本地和云端都跑

分工是:装虚拟机本身缺的东西(工具链、命令行工具)用启动脚本;到处都该跑的项目准备(比如 npm install)用 SessionStart hook。

hook 没法只限定在云端。想让它在本地不执行,在脚本开头判断一个环境变量,云端的虚拟机里它是 true,本地永远不是:

#!/bin/bash
if [ "$CLAUDE_CODE_REMOTE" != "true" ]; then
  exit 0
fi

npm install
pip install -r requirements.txt
exit 0

另外两条:用户级 ~/.claude/settings.json 里的 hook 到不了云端;挂了好几个仓库的会话不读任何一个仓库的设置文件里的 hook,这种会话的依赖用启动脚本装。

把结果和会话对上

每个云端会话有一个记录的网址。Claude 在云端会话里建的提交会带一行 Claude-Session: <网址>,PR 的描述里也有会话的网址,审的人可以点回去看这次运行。不想要,把 attribution.sessionUrl 设成 false。

五、用不了的读者怎么办

这三样都绑着 claude.ai 的订阅登录。通过中转站或者用 API key 的读者:

想要的 可以改用
定时重复做一件事,电脑开着就行 会话里的 /loop,见《Harness 工程和 Loop 工程是什么》
电脑关着也要定时跑 系统的定时任务(cron 之类)加 claude -p,见《把 Claude Code 接进脚本和 CI》
仓库里有事件时触发 GitHub Actions,见《用 GitHub Actions 让 Claude Code 审 PR、修 issue》

第二行的做法是本站的建议,不是这三页文档里写的;前后两行是官方文档给的替代。

这篇没有实测的

  • 整篇没有实测。 实测环境走的是中转站,没有 claude.ai 账号,routine、桌面版定时任务和云端环境都用不了。
  • 表格里的数字(每小时的上限、资源的上限、缓存的时间)照文档写,文档自己也说可能调整。
  • routine 是研究预览,/fire 接口在 beta 请求头下面,格式可能变。用之前看官方那一页的最新内容。
  • 自托管环境、Claude Tag 频道用的环境没有展开。

来源

通过 API 中转站使用这些模型?到 Veridrop 免费检测中转站给你的是不是它声称的模型,或者看看中转站排行榜前 100 名。

相关文章