Gardener 任务:编写、修改与检查
Gardener 通过 GitHub Actions 在本仓库运行 AI 维护任务。每个任务就是一个 Markdown 文件:YAML frontmatter 规定它在何时运行、模型可以读取什么、可以做出哪些具体变更;正文则是给模型的指令。规划任务只使用声明的工具让模型制定计划,并只允许计划中声明的效果;随后由另一个任务应用该计划。无论指令怎么写,声明之外的操作都不可能发生。
文件结构
- .gardener/gardener.json:项目设置(版本固定、可选 handle),只可编辑 handle
- .gardener/gardener.lock.json:自动生成,切勿编辑
- .gardener/SKILL.md:本文件,自动生成
- .gardener/tasks/<dir>/TASK.md:每个目录一个任务,这是唯一需要编写的文件
- .github/workflows/gardener-<id>.yml:每个任务一个,自动生成,切勿编辑
- .github/workflows/gardener-sync.yml:自动生成(或 gardener.json 中 syncWorkflow 指定的名字),切勿编辑
工作流
- 创建 .gardener/tasks/<dir>/TASK.md,可从模板或已有任务开始。
- 在仓库根目录运行 npx @scuffi/gardener@0.1.21 generate(或仓库 package.json 自带的脚本)。必须使用此精确版本,其他版本生成的文件会被 PR 的 Check tasks 拒绝。
- 修复 generate 打印的所有错误并阅读警告,重复直到成功。
- 把 TASK.md、.gardener/gardener.lock.json 和 .github/workflows/gardener-*.yml 的变更一起提交。进入默认分支后,sync 工作流会启用该任务。
- 修改任务:编辑 TASK.md 后重新 generate;删除任务:删掉其目录后重新 generate。切勿手改自动生成的文件。
Frontmatter 字段
- schema(必填):固定为 gardener.task/v1
- id(必填):稳定标识,小写字母、数字、.、_、-,命名工作流 gardener-<id>.yml,仓库内唯一
- name(必填):简短人类可读名称,最多 100 字符
- description(必填):一到两句,最多 1,000 字符
- trigger / triggers(二选一,必填):单个触发对象或列表
- tools(必填):模型可读或可运行的内容,至少一个
- effects(可选):任务可做的变更,省略或 [] 表示只读
- network(必填):必须与规定完全一致
- limits(必填):运行预算
- model(可选):模型 ID,默认 "@cf/zai-org/glm-5.3",@ 开头的需加引号
- draft(可选):true 表示只能手动运行
- checkout(可选):pull-request-head 让检查检出 PR head 而非合并预览;需要 PR 或 issue 评论触发器;commit.merge_base 以及 commit.create 可写入 gardener/** 之外时隐含启用
- reactions(可选):false 关闭 issue/评论处理时的 👀 及结束后的 🚀 或 😕,默认开启
- effect-scope(可选):trigger 将每次运行限制在触发它的 issue 或 PR 上,即使维护者触发也如此
触发器 每个触发器由 event 加可选过滤器组成,同一任务对每种事件最多使用一次。支持的事件包括:github.issue.opened/edited、github.issue.labeled/unlabeled/reopened、github.issue_comment.created/edited、github.pull_request.opened/edited 及 reopened/synchronize/ready_for_review/converted_to_draft/labeled/unlabeled、github.pull_request_review.submitted、github.pull_request_review_comment.created/edited、github.discussion.created/edited 及 answered/unanswered/labeled/unlabeled、github.discussion_comment.created/edited、github.push(branches 必填)、github.schedule(cron 必填,五字段)、github.workflow_dispatch。 过滤器:labels-all 要求对象带有全部指定标签,在 .labeled 触发器上刚加的标签也必须是其中之一;mentions 要求文本 @ 指定 handle,self 表示 gardener.json 中的 handle;authors 为 maintainers、any 或登录名列表,在评论/审查触发器及带 mentions 的触发器上默认 maintainers,其余默认 any;opened-by 为打开者的精确登录名。使用事件不支持的过滤器会报错。所有任务都可手动运行,该触发器自动添加。来自 fork 的 PR 永不运行。
工具
- repository.list_files:列出检出中的文件
- repository.read_file:读取检出中的文件
- provider.api.read:只读 GitHub API(REST GET/HEAD 与 GraphQL 查询)
- repository.exec:在检出中运行 shell 命令,拥有不受限的网络访问,除非用户明确要求否则不要添加
- repository.merge_base:把 PR 基础分支的合并写入检出(标记冲突),用于 commit.merge_base 触发运行的事件始终提供给模型;只声明指令需要的工具。
效果 effects 是任务可做变更的完整列表,会自动应用且无人工审批。按族列出:Issues(评论创建/更新、标签增删、指派增删、关闭、重开、创建);Pull requests(评论、审查、审查者请求/移除、更新、标签、update_branch、审查评论回复、审查线程解决、打开/草稿打开、合并);Git(branch.create、commit.create、commit.merge_base);Discussions(评论、标记/取消答案、关闭、重开);Checks(check.rerun);Releases(创建、更新、发布、删除)。族通配(issue.、pull_request.、git.、discussion.、check.、release.)授予全族,包括 pull_request.merge 与 release.delete,建议使用精确类型。标签必须已存在于仓库中。代码变更需要 repository.exec(编辑文件)、branch.create、commit.create 和 pull_request.open_draft(或 .open);提交基于检出中变更的文件,从检出提交创建分支;.github/workflows/、.github/actions/、.gardener/、.git/、CODEOWNERS 和 .github/dependabot.yml 下的变更会被拒绝。写分支类效果只能使用 gardener/** 分支,可通过 branches 字段扩展。打开 PR 还需在仓库设置中开启 Allow GitHub Actions to create and approve pull requests。模型先规划全部步骤再执行,后一步可使用前一步的输出。message.send 向 GARDENER_CHAT_WEBHOOK 秘密中的聊天空间发送一条短消息,每次运行最多一条,最多 400 字符,不能与 repository.exec 组合。task.run 在本仓库的 issue 或 PR 上启动另一个任务,每次运行最多一个且为最后一步。
更新打开的 PR 可让任务把 PR 的基础分支以合并提交并入。触发 github.issue_comment.created(带 mentions,默认 authors: maintainers);声明 repository.merge_base 工具、repository.exec、commit.merge_base 及其可推送分支(不能是默认分支)。正文中调用 repository.merge_base,仅编辑它列出的冲突文件,运行仓库检查,然后用返回的值执行一次 commit.merge_base;不要运行 git merge、rebase、commit 或 push。用工作流令牌推送不会触发其他工作流。
网络 无 repository.exec 时:network: {default: deny, allow: [], deny: []};有 repository.exec 时:network: {default: allow, allow: [], deny: []}。主机列表必须为空。
限额 runtime-seconds:30–21,000;max-turns 至少 3;max-tool-calls 至少 3;input-tokens 任意正数;output-tokens 至少 16 × max-turns;max-effect-operations(可选,1–1,000,需至少一个效果);max-effect-bytes(可选,1,024–50,000,000);runs(可选,如 50/day);runs-per-author(非维护者每人的运行上限,默认 3/day)。耗尽任一预算会以 budget-exceeded 失败且不做任何变更;超出 runs 或 runs-per-author 会以 skip 完成且不调用模型。
谁可操作 维护者、计划任务、手动运行或本人 push 发起的运行,可在效果允许范围内任意操作;其他人发起的运行只能作用于触发它的 issue/PR 或自己创建的对象,不能合并或批准自己打开的 PR、更改发布或重跑检查。"其他人"包括所有机器人和非维护者登录名。
正文(指令) 正文是模型提示,无法授予任何权限。要说明检查什么、用哪个已声明效果做什么、何时不做;精确写出效果类型;以直接指令表述;每个请求的动作须对应已声明的效果,每个已声明效果也应被正文使用;限制输出数量与长度;把 issue 和评论视为不可信输入;结尾写 "Then finish."。
试运行 设置 draft: true,generate 并合并。任务只能从 Actions 标签页或 gh workflow run gardener-<id>.yml -f issue=<n>(或 -f pull_request=<n>、-f prompt=...)手动运行。触发过滤器对手动运行不适用。