用 Cline 定时 Agent 搭建性能基线监控:解析 performance-baseline.cron.md 自动化模板
Cline 以 Markdown 文件(.cron.md)作为"定时 Agent 自动化规范"(Automation Spec)的载体,让开发者可以用纯文本定义一个"每天凌晨自动测量构建耗时、bundle 体积与冷启动时间、并按阈值检测性能回退"的无人值守任务。performance-baseline.cron.md 正是仓库中针对**性能敏感型项目(CLI、库、服务)**提供的开箱即用示例。读完本文,你将掌握这份 spec 的逐字段含义、性能回归判定策略、把它部署到 ~/.cline/cron/ 并接入 Hub / SDK / CLI 的完整流程,以及其背后解析、存储、调度、执行的源码机制。
一、这份 spec 是什么:从示例文件定位其角色
在 sdk/examples/cron/README.md 的自动化示例总表中,performance-baseline 被标注为:
| 目标 | Spec 文件 | 计划 | 模式 |
|---|---|---|---|
| ⚡ 跟踪性能 | performance-baseline |
每天凌晨 2 点 | act |
README 对其适用场景给出了精确定位:"Best for: CLI tools, libraries, or services where performance is critical."(最适合 CLI 工具、库或对性能要求苛刻的服务),并在"团队分工"一栏中分别建议:后端团队用它观测"构建时间、API 响应时间",前端团队用它盯"bundle 体积、冷启动"。在 sdk/ARCHITECTURE.md 的自动化架构介绍中,这类文件被称为"文件驱动与事件驱动自动化(ClineCore / CronService)"子系统下以 .cron.md 结尾的定时(schedule)型 spec。
整份 spec 由两部分组成:开头的 YAML frontmatter(元数据,配置"何时跑、用什么模型跑、跑多久、允许用哪些工具"),以及正文 Markdown body(即真正的任务 prompt,告诉 Agent"具体要测量什么、记录什么、如何判定回退")。下面逐层拆解。
二、frontmatter 逐字段解读:让定时任务"可配置、可约束"
原文件头部的 YAML frontmatter 是理解整个自动化运行模型的关键,全文复制并逐项注解如下:
---
id: performance-baseline # 全局唯一标识(字母数字与连字符);未显式声明时解析器回退到相对路径
title: Track Performance Metrics # 人类可读的标题
workspaceRoot: /absolute/path/to/repo # 必填:Agent 的工作目录(即构建命令的执行 cwd)
schedule: "0 2 * * *" # cron 表达式:每天凌晨 2:00
tools: run_commands,read_files,editor # 白名单:本次运行仅允许这三种工具
mode: act # 运行模式:act(可执行命令并修改文件)
enabled: false # 默认停用,复制后按需开启
modelSelection: # 为本次运行覆盖默认模型
providerId: cline
modelId: anthropic/claude-opus-4.7
timeoutSeconds: 2400 # 单次运行最长 2400 秒(40 分钟)
maxIterations: 20 # Agent 最大迭代轮次,防止失控循环
tags:
- automation # 任意标签,用于分组检索
- performance
- monitoring
metadata: # 任意自定义元数据,原样随 spec 存储
owner: platform
metricsFile: .perf-baseline.json # 团队自定义:记录结果文件的路径
---
1. 触发类型由文件名推断:.cron.md 即定时任务
这些字段并不是随意解析的。类型定义位于 sdk/packages/shared/src/cron/cron-spec-types.ts,其中 CronTriggerKind = "one_off" | "schedule" | "event",而"走哪种触发"由文件路径约定决定:*.cron.md → 定时;events/*.event.md → 事件驱动;.cline/cron/ 下其它 *.md → 一次性任务。解析函数 inferTriggerKindFromPath 的实现见 sdk/packages/core/src/cron/specs/cron-spec-parser.ts。因此,本文件的调度字段只有放在 .cron.md 后缀下才合法——解析器会强制校验:"schedule is required for *.cron.md specs",而把 schedule/timezone 写在事件或一次性 spec 中会被判定为非法(见同文件 SCHEDULE_ONLY_FIELDS 校验逻辑)。
2. 关键字段的约束与默认值(来自解析器源码)
对照 cron-spec-parser.ts 的实现,可得到以下经过校验的事实:
workspaceRoot必填:缺省即返回workspaceRoot is required错误;同时旧字段cwd已被移除,注释明确指出"cron specs use workspaceRoot as cwd"。prompt来源:frontmatter 中的prompt字段或 Markdown body 二选一,二者皆缺则解析失败。本文件未声明prompt,因此正文内容就是任务 prompt。mode默认yolo,合法值为act/plan/yolo;本文件显式使用act(可执行构建命令并落盘结果文件)。tools为空字符串/空数组会禁用全部工作工具;声明工具名必须在默认工具集内,否则报unknown tool(s): ...。本文件限定了run_commands(跑构建)、read_files(读历史基线)、editor(更新 JSON 结果)三种。maxIterations/timeoutSeconds按正整数取整,非正数会被忽略并回退为默认。enabled为布尔值,未声明时默认true;示例文件刻意写成false,让用户复制后再显式开启,避免误启用写死的工作区路径。metadata是任意Record<string, unknown>,会被原样保留——示例里用metricsFile: .perf-baseline.json记录结果落盘位置,是一种值得借鉴的团队约定。
3. schedule 表达式的校验与可用值
schedule 为五段 cron(分、时、日、月、星期),解析时会调用 validateCronSchedule(schedule, timezone)(见 sdk/packages/core/src/cron/specs/cron-spec-parser.ts)做合法性校验,非法表达式直接记为解析错误。timezone 可选,缺省使用系统时区。常见的等价调度写法可参考 docs/sdk/guides/scheduled-agents.mdx 中的 cron 速查表:0 9 * * MON-FRI(工作日 9 点)、0 */6 * * *(每 6 小时)、0 0 1 * *(每月 1 日零点)等。若希望"每个工作日清晨跑一次基线",把示例改为 schedule: "0 9 * * MON-FRI" 即可。
三、任务主体:一份"性能测量 + 回归判定"的 Agent prompt
frontmatter 之下的正文没有代码,而是一段面向 Agent 的结构化指令(performance-baseline.cron.md)。它把"性能基线巡检"拆成了四个可执行动作与三组判定规则:
1. 采集四类指标
1. 构建项目并计时:npm run build
2. Bundle 体积分析(如适用):运行带体积报告的 bundler
3. 若为 CLI/服务端工具,测量冷启动时间
4. 运行仓库中已有的性能基准测试(若存在)
2. 落盘基准 JSON
Create or update `.perf-baseline.json` with:
{
"timestamp": "ISO-8601",
"buildTime": "milliseconds",
"bundleSize": "bytes",
"coldStart": "milliseconds",
"metrics": {...}
}
这是一个约定俗成的数据契约:timestamp 用 ISO-8601 时间戳标识"这一次测量的快照时间",buildTime / coldStart 以毫秒为单位,bundleSize 以字节为单位,metrics 作为扩展对象收纳仓库自定义的其它性能指标。该文件被命名为 .perf-baseline.json(点号开头),通常应加入 .gitignore,因为它是机器产生的运行时状态而非源码。
3. 按阈值做回归判定
- 构建时间较前一日基线增幅 >10% → 标记为
warning(警告); - bundle 体积增幅 >5% → 标记为
concern(需关注); - 判定基准是"与前一天基线对比"(Compare to previous day's baseline)。
4. 输出结论
若检测到回归,给出发现与优化建议(Report findings with recommendations for optimization)。这正是把 Cline 当作"夜间值班性能工程师"的价值所在:Agent 不仅测数,还会结合 read_files 读历史、run_commands 复现、editor 更新基线,最终交付一份带建议的报告。
四、它是如何被定时执行的:CronService 运行链路
从 sdk/ARCHITECTURE.md 可梳理出这条 spec 从"文件"到"运行"的完整链路:
- Spec 解析:
cron/specs/cron-spec-parser.ts把 YAML frontmatter + body 解析为CronSpec判别联合(one_off | schedule | event),类型定义在@cline/shared的src/cron/cron-spec-types.ts。 - 持久化存储:
cron/store/sqlite-cron-store.ts把解析结果写入cron.db(默认位置.cline/data/db/cron.db),连解析失败的 spec 也会以parse_status='invalid'被持久记录,绝不静默丢弃状态。 - Reconciler 对账:
cron/specs/cron-reconciler.ts扫描配置的 spec 目录(默认全局~/.cline/cron/,也可通过 workspace 作用域配置),增量同步文件与 DB。 - Watcher 监听:
cron/specs/cron-watcher.ts用node:fs递归 watch 该目录——把 spec 文件放进目录后无需重启,启动时与运行期都会自动对账,下一次运行自动入队。 - Materializer 物化:
cron/runner/cron-materializer.ts把文件触发的 spec 转成排队中的cron_runs,定时型按 timezone 感知的getNextCronTime计算下一次触发。 - Runner 执行:
cron/runner/cron-runner.ts轮询cron.db、原子抢占待运行任务、新建会话执行 prompt(自动化运行会显式以mode: "automation"持久化每一次运行记录与触发来源)。 - 报告输出:
cron/reports/cron-report-writer.ts把完成的运行写入.cline/cron/reports/<run-id>.md,包含运行 ID、状态、耗时、token 用量、工作摘要与工具调用记录——也就是你查"昨晚 2 点那次基线巡检到底发现了什么"的地方。 - 服务编排:
cron/service/cron-service.ts统管以上各组件;SDK 侧由ClineCore.create({ automation })持有生命周期并暴露cline.automation.*方法。
需要注意:本模板属于定时任务(schedule),与 events/*.event.md(如 PR 打开时触发评审)是两条不同触发路径,两者通过 sdk/examples/cron/README.md 中的字段速查表区分——定时型额外要求 schedule,事件型额外要求 event 与 debounceSeconds/dedupeWindowSeconds/cooldownSeconds/maxParallel 等限流字段。
五、部署与运行:三种启用方式
1. 放置 spec 文件(通用前提)
官方推荐把 spec 放入用户级自动化目录:
mkdir -p ~/.cline/cron
cp sdk/examples/cron/performance-baseline.cron.md ~/.cline/cron/
然后编辑副本,至少要完成三件事:把 workspaceRoot 改为项目绝对路径;把 enabled 改为 true;按需把 modelSelection 换成你有权限调用的模型。随后 spec 会在启动时被 reconcile,下一次 cron 触发即自动入队执行(参考 sdk/examples/cron/README.md)。若只想跑一次临时巡检,可另存为 .cline/cron/<name>.md(去掉 .cron 中缀)并省略 schedule 字段,它会被推断为一次性任务。
2. 分别在 Hub / SDK / CLI 中开启自动化
根据 sdk/examples/cron/README.md 与 docs/sdk/guides/scheduled-agents.mdx,三种运行载体启用方式如下:
Hub(自建调度服务):构造时传入 cron 工作区:
new HubWebSocketServer({
cronOptions: { workspaceRoot: "/absolute/workspace" }
});
SDK(程序化接入):创建 ClineCore 时打开 automation 并启动调度:
import { ClineCore } from "@cline/sdk";
const cline = await ClineCore.create({
clientName: "perf-baseline-runner",
automation: true,
});
await cline.automation.start();
// cline.automation 提供 reconcile、事件摄取、运行列表等入口
CLI(命令行一键启用):
cline --enable-automation
适用范围提醒:该定时 Agent 能力目前覆盖 Cline SDK、CLI 与 Kanban,VSCode / JetBrains 扩展尚不适用(见 docs/cli/scheduling.mdx 的 Warning)。
3. 另一种等效方式:cline schedule create
若不喜欢维护 spec 文件,也可用 CLI 调度命令创建等效任务。参照 docs/cli/scheduling.mdx,等价于本模板的调度可以这样创建:
cline schedule create "Performance baseline" \
--cron "0 2 * * *" \
--prompt "构建项目并计时(npm run build),做 bundle 体积与冷启动分析,
更新 .perf-baseline.json,若相对前一日基线构建时间增幅超10%
或 bundle 增幅超5% 则给出优化建议" \
--workspace /path/to/repo
随后用 cline schedule list / cline schedule trigger <id> / cline schedule executions <id> 等命令管理运行与历史。两种方式殊途同归:程序化 hub 调度同样落入 cron_specs(source 为 hub-schedule),并经由同一套 cron_runs 管线执行。
六、把模板落地到真实项目的实战建议
结合本模板与仓库实践,给出几条可直接照做的工程化建议:
- 先验证 build 命令可被无人值守执行:
npm run build必须在无 TTY 环境下稳定、幂等地完成。若你的构建需要环境变量,应保证运行 Hub 的常驻进程环境里已就绪,或在 spec 的 body 中写明前置步骤。 - 为 bundle 体积配好稳定测量口径:模板第 2 步要求"bundler 带 size 报告"。仓库自身就大量依赖构建产物(如 vscode/esbuild.mjs、vscode-rollout/esbuild.mjs),实际项目可改用
esbuild --metafile、Vite/Rollup 的 size 插件等固定工具,保证每天产出的是同口径字节数,否则 5% 阈值判定会失真。 - 冷启动测量只对 CLI/Server 有意义:若项目是纯 Web 应用,第 3 步可从 body 中删去,避免 Agent 无谓消耗迭代次数。
- 把
metadata.metricsFile与 body 中的路径保持一致:示例约定结果统一写在.perf-baseline.json,Agent 依据 body 描述"与前一天对比",意味着该文件必须在多次运行间持久存在——确保.cline工作区没有把.perf-baseline.json当临时产物清理掉。 - 先手工触发验证再开放调度:初次接入时用
cline schedule trigger <id>(或直接跑一次 body 里的步骤)确认.perf-baseline.json结构与阈值逻辑符合预期,再放心让它每天凌晨 2 点自动执行;毕竟mode: act意味着 Agent 有执行命令并修改文件的权限,tools白名单(run_commands,read_files,editor)与maxIterations: 20是防失控的重要护栏。 - 与其他巡检任务编排成"开发自动化套件":sdk/examples/cron/README.md 给出了典型编排:
Daily 2 AM → performance-baseline负责指标、Daily 10 PM → test-coverage-report负责覆盖率、Daily 6 AM → type-check-strict负责类型安全——凌晨低谷期集中执行,早上团队到岗即可看到昨夜巡检报告(.cline/cron/reports/<run-id>.md)。
七、结语
performance-baseline.cron.md 虽只有不足 50 行,却完整示范了 Cline 定时自动化三大设计要点:YAML frontmatter 表达运行约束(调度、模型、工具白名单、超时与迭代上限)、Markdown body 表达任务意图(测什么、怎么测、如何判定)、结果文件表达状态(跨运行的性能基线)。把它复制进 ~/.cline/cron/ 并开启 automation,即可获得一个长期值守、自动比对昨日基线、按 >10% / >5% 阈值告警并给出优化建议的"夜间性能巡检员"——对 CLI 工具、库与对性能敏感的服务而言,这是一种几乎零维护成本的持续性能回归防线。
延伸阅读
- sdk/examples/cron/README.md — 全部定时/事件自动化模板总览、字段速查与启用步骤
- sdk/packages/shared/src/cron/cron-spec-types.ts —
CronSpec判别联合与全部字段类型定义 - sdk/packages/core/src/cron/specs/cron-spec-parser.ts — frontmatter 解析、字段校验与默认值逻辑
- sdk/ARCHITECTURE.md — CronService 九大组件的架构说明
- docs/sdk/guides/scheduled-agents.mdx — SDK 中定时 Agent 的编程式用法与 cron 速查表
- docs/cli/scheduling.mdx —
cline schedule系列命令与执行历史/统计查看
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00