news 2026/9/17 5:32:18

Cloudflare Agents 单体仓库的 AGENTS.md:从目录结构到代码规范与 CI 流程的工程实践全解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cloudflare Agents 单体仓库的 AGENTS.md:从目录结构到代码规范与 CI 流程的工程实践全解

Cloudflare Agents 单体仓库的 AGENTS.md:从目录结构到代码规范与 CI 流程的工程实践全解

【免费下载链接】agentsBuild and deploy AI Agents on Cloudflare项目地址: https://gitcode.com/GitHub_Trending/agents1/agents

本文围绕 Cloudflare Agents 仓库(构建并部署于 Cloudflare Workers 上的有状态 AI Agent 框架)根目录的 AGENTS.md 展开,系统讲解这个 monorepo 的目录组织、环境搭建、常用命令、TypeScript/Oxlint/Oxfmt/Workers 编码规范、测试体系以及 Changesets 发布流程。读完本文,你能够独立克隆并跑通该仓库的任意 example,理解每个 CI 检查项背后的实现,并掌握向packages/贡献代码时必须遵循的版本化与边界约束。

仓库定位与目录结构

Cloudflare Agents 是一个 monorepo,核心 SDK 包、示例应用、指南、官网与文档全部集中管理。根目录AGENTS.md给出了如下结构总览(路径均以仓库根目录为起点):

目录职责
packages/发布到 npm 的包,改动需 Changesets 配合
packages/agents/核心 SDK(另有 packages/agents/AGENTS.md 讲解导出、源码布局、构建与架构)
packages/ai-chat/@cloudflare/ai-chat,更高层的 AI 聊天 Agent
packages/hono-agents/Hono 框架集成
packages/codemode/@cloudflare/codemode,实验性代码生成运行时
examples/自包含演示应用,约 20 个(约定见 examples/AGENTS.md)
examples/playground/主展示应用,在单一 UI 中集成全部 SDK 能力(使用 Kumo 设计系统)
experimental/进行中的实验,不发布、无稳定性保证
site/已部署站点,如 agents.cloudflare.com(Astro)
guides/带叙事性 README 的深度模式教程(约定见 guides/AGENTS.md)
openai-sdk/使用@openai/agentsSDK 的示例(basic、chess-app、handoffs 等)
docs/面向 developers.cloudflare.com 的 Markdown 文档(写作规范见 docs/AGENTS.md)
design/架构与设计决策记录(RFC 格式与流程见 design/AGENTS.md)
scripts/仓库级工具脚本(typecheck、导出检查、更新检查)

实际工作区定义在 pnpm-workspace.yaml 中,可确认的包范围包括packages/*examples/*(排除examples/next主包、按子目录纳入examples/next/*)、voice-providers/*guides/*experimental/*openai-sdk/*site/*等;其中还通过patchedDependencies@chonkiejs/chunkvitest-browser-react打了本地补丁(对应patches/目录),并用allowBuilds精确控制了哪些依赖允许执行安装脚本(如workerdesbuild允许,@google/genaimsw禁止)。

嵌套 AGENTS.md 文件体系

该仓库的一个显著工程实践是"AGENTS.md 分级":根文件负责全局约束,子目录文件负责局部细节。AGENTS.md中列出的五份嵌套文件均确实存在:

文件作用域
packages/agents/AGENTS.md核心 SDK 内部——导出、源码布局、构建、测试、架构
examples/AGENTS.md示例约定——必需结构、一致性规则、已知问题
guides/AGENTS.md指南约定——guide 与 example 的差异、README 期望
docs/AGENTS.md面向用户的文档写作——Diátaxis 框架、上游同步、风格
design/AGENTS.md设计记录与 RFC——格式、流程、与 docs 的关系

对 LLM 编码 Agent 与人类协作者来说,这套分层文档相当于把"在哪个目录该守什么规矩"写进了目录本身,是仓库级 Agent 提示词(agent prompt)组织方式的典型范例。

环境搭建

pnpm install # 安装所有 workspace

前置条件是Node 24+。仓库使用 pnpm workspaces 组织多包,并用 Nx 做任务编排、缓存与 affected 检测——这一点可从 nx.json 得到印证:build目标声明了dependsOn: ["^build"](先构建上游依赖包)与outputs: ["{projectRoot}/dist"]cache: true(产物缓存);test依赖build且同样开启缓存;test:e2e不缓存。namedInputs.production中还显式排除了测试与评测目录(src/tests/**src/react-tests/**evals/**vitest.config.*等),保证构建缓存键只由生产代码驱动。

根 package.json 锁定了packageManager: pnpm@11.9.0,并声明了仓库级关键依赖:nxoxfmtoxlintsherif@cloudflare/vite-plugin@cloudflare/vitest-pool-workerswranglertypescript等——这些正是下文各命令背后实际执行的引擎。

常用命令总览

以下命令均在仓库根目录执行,与 package.json 中scripts字段一一对应:

命令作用
pnpm run build通过 Nx 构建所有包(nx run-many -t build,缓存、按依赖顺序)
pnpm run check完整 CI 检查:sherif && pnpm run check:exports && oxfmt --check . && oxlint . && pnpm run typecheck
pnpm run test通过 Nx 运行全部测试(nx run-many -t test,缓存)
pnpm run test:react运行 agents 包基于 Playwright 的 React Hook 测试
pnpm run typecheck全仓库 TypeScript 类型检查(自定义脚本 scripts/typecheck.ts)
pnpm run formatOxfmt 格式化全部文件
pnpm run check:exports校验各包package.json的 exports 与实际构建产物一致(scripts/check-exports.ts)
pnpm exec nx affected -t build只构建受当前变更影响的包
pnpm exec nx affected -t test只测试受当前变更影响的包
pnpm exec nx run <project>:build构建单个项目(及其依赖)

两个值得注意的实现细节:

  • typecheck并非直接跑tsc,而是 scripts/typecheck.ts 这个自定义脚本:它用fast-glob递归收集所有tsconfig.json,按 CPU 核数并发地对每个项目执行tsgo -p <tsconfig>(TypeScript 原生预览编译器),单项目失败最多重试 3 次,并支持传入路径过滤参数。
  • check是 CI 的"总闸",其中sherif用于检查包导入边界,check:exports防止声明的导出面与dist/实际产物脱节。

本地运行示例应用

cd examples/playground # 或任意 example pnpm dev # 启动 Vite 开发服务器 + 经 @cloudflare/vite-plugin 接入的 Workers 运行时

pnpm dev背后是@cloudflare/vite-plugin(根package.json中声明为^1.48.0),它把 Vite 开发服务器与本地 Workers 运行时(workerd)打通,使示例可以在真实 Workers 环境中热重载。AGENTS.md特别提示:dev server 运行期间,改动packages/下的包后要重新执行pnpm run build,让运行中的应用看到新构建的产物。这与nx.jsonbuild的缓存行为一致——示例应用消费的是packages/*/dist,而非包源码。

代码规范

TypeScript 基线

仓库统一使用严格模式,共享配置为agents/tsconfig,其实际内容见 packages/agents/agents.tsconfig.json:

  • target: ES2021module: ES2022moduleResolution: bundler
  • strict: trueisolatedModules: true
  • verbatimModuleSyntax: true——类型导入必须写import type
  • jsx: react-jsx
  • types固定为node@cloudflare/workers-typesvite/client

静态检查:Oxlint

配置位于 .oxlintrc.json,启用reactjsx-a11ytypescript三个插件,关键规则:

  • no-explicit-any: "error"——禁止any,应使用unknown再收窄;
  • no-unused-vars: "error"varsIgnorePattern/argsIgnorePattern/caughtErrorsIgnorePattern均为^_,即以下划线开头的变量/参数/捕获错误可豁免;
  • categories.correctness: "error"——正确性类目全部升为错误级;
  • react-hooks/exhaustive-deps: "warn"——Hook 依赖缺失仅告警;
  • ignorePatterns排除**/env.d.ts(wrangler 生成物,见下文"生成文件"一节)与**/routeTree.gen.ts

Oxlint 不做格式化,格式化由 Oxfmt 负责,职责分离清晰。

格式化:Oxfmt

  • 全量格式化:pnpm run format(即oxfmt --write .),CI 侧对应format:checkoxfmt --check .);
  • 配置在 .oxfmtrc.json:trailingComma: "none"printWidth: 80,并显式忽略packages/agents/CHANGELOG.md(由 Changesets 生成)、site/agents/.astro等目录。

Workers 工程约定

AGENTS.md对运行在 Workers 运行时代码约定了四条硬性规范:

  1. 始终 TypeScript、始终 ES Modules——仓库边界一节也明确"Never: Use CommonJS or Service Worker format";
  2. 配置文件用wrangler.jsonc而非.toml;抽查 examples/playground/wrangler.jsonc 可确认全仓库统一compatibility_date: "2026-06-11"
  3. 所有 wrangler 配置使用compatibility_date: "2026-06-11"compatibility_flags: ["nodejs_compat"]
  4. 绝不硬编码密钥——用wrangler secret put.env;且不得引入 native/FFI 依赖(必须能在 Workers 运行时执行)。

测试体系

测试采用vitest +@cloudflare/vitest-pool-workers,即测试代码直接运行在真实的 Workers 运行时(workerd)内,而非普通 Node 环境:

pnpm run test # agents + ai-chat 的单元/集成测试 pnpm run test:react # agents 包基于 Playwright 的 React Hook 测试

测试位置与职责划分(以下目录均已确认存在):

目录内容
packages/agents/src/tests/核心 SDK 测试
packages/agents/src/react-tests/React Hook 测试(Playwright + vitest-browser-react)
packages/ai-chat/src/tests/AI Chat 包测试
packages/agents/src/tests-d/类型级测试(.test-d.ts

每个测试目录各自持有独立的vitest.config.ts,Workers 测试目录还配有独立wrangler.jsonc,以便按包定制 D1/KV/Durable Objects 等资源。此外,AGENTS.md指向 design/test-coverage-matrix.md——一份仓库级"测试证据矩阵",记录"某功能 X 由哪一层的测试证明、哪条 CI 流水线守护"以及被跟踪的 skip/quarantine 技术债,是理解测试分层设计的良好入口。

贡献流程:Changesets 与 CI

Changesets 版本化

packages/影响公共 API 或修复缺陷的改动必须附 changeset:

pnpm exec changeset # 交互式:选择包、semver 提升级别、填写描述

命令会在.changeset/下生成一个 Markdown 文件,发布时被消费。示例、指南与站点不需要 changeset。实际配置见 .changeset/config.json:changelog 生成器使用@changesets/changelog-githubaccess: "public"baseBranch: "main",并且ignore@cloudflare/agents-*(非 SDK 的附属包)。

CI 与发布流水线

PR 流水线定义在 .github/workflows/pullrequest.yml:对仅改动design/***.md.changeset/**的 PR 直接跳过(paths-ignore);对代码 PR 依次执行安装 →pnpm run buildpnpm run check→ 安装 Playwright 浏览器 →CI=true pnpm exec nx affected -t test→ 用pkg-pr-new publish --peerDeps ./packages/*发预发布包供评审验证。这与AGENTS.md描述的"CI 在每次 PR 上运行 install + build + check + affected test"完全一致,且nx affected依赖 PR 分支与maindefaultBase)的差异来裁剪测试范围。

推送到main时由 Release 流水线(.github/workflows/release.yml)接管:执行同样的检查步骤,但用nx run-many -t test作为安全网,防止 affected 计算漏报项目,最后通过 changesets 完成正式发布。所有检查必须通过才可合并。

生成文件

以下文件属于生成物,禁止手工编辑:

  • env.d.ts——由wrangler types生成,需在相应 example/package 内执行pnpm exec wrangler types重新生成(这也是.oxlintrc.json.oxfmtrc.json均忽略**/env.d.ts的原因);
  • pnpm-lock.yaml——由pnpm install重新生成。

工作区已知事实与行为边界

AGENTS.md末尾沉淀了两类对后续协作者(含 AI Agent)至关重要的"记忆"。

Learned Workspace Facts(工作区事实)

  • packages/shell/@cloudflare/shell发布——一个面向 Agent 的实验性沙箱 JS 执行与文件系统运行时,与@cloudflare/codemode共用同一套动态 Worker 加载机制;
  • 要在Workspace上执行代码的接线方式是:从@cloudflare/shell/workers导入stateTools,从@cloudflare/codemode导入DynamicWorkerExecutor/resolveProvider,然后调用executor.execute(code, [resolveProvider(stateTools(workspace))])

边界(Boundaries),按强制级别分三层:

  • Always:收工前必须跑pnpm run check;类型导入一律import type;示例保持简单自包含(它们是面向用户的学习材料);优先使用 Workers 原生 API(KV、D1、R2、Durable Objects 等)而非第三方等价物;示例中的 LLM 调用一律使用 Workers AI,不用第三方 API;
  • Ask first:给packages/新增依赖(会随包发布给用户)、跨仓库变更 wranglercompatibility_date、修改 CI 工作流;
  • Never:硬编码密钥;引入 native/FFI/C 绑定依赖;使用any(Oxlint 会拒绝);使用 CommonJS 或 Service Worker 格式(仅 ES Modules);修改node_modules/dist/;向 main 强推。

这些"Always/Ask first/Never"条款与上文各检查工具形成闭环:any被 Oxlint 拦截、CommonJS 被 Workers 运行时与module: ES2022配置拦截、导出面漂移被check:exports拦截、未跑检查就被check流水线拦截——仓库把规范条文与自动执法机制一一对应,这正是该 monorepo 工程规范最值得借鉴之处。

小结

根目录 AGENTS.md 用不到两百行完成了四件事:给出与 pnpm-workspace.yaml、nx.json 相互印证的可执行目录地图;定义了从pnpm installpnpm dev的完整本地回路;以 agents.tsconfig.json、.oxlintrc.json、.oxfmtrc.json 为依据固化了 TypeScript、静态检查与格式化基线;并以 Changesets + 双工作流(pullrequest.yml / release.yml)约束了从 PR 到 npm 发布的每一步。对希望在该仓库贡献代码,或想在自己的 monorepo 中落地"Agent 友好工程规范"的团队,这份文件与它背后每个可验证的配置、脚本、工作流,构成了一个完整的参考实现。

【免费下载链接】agentsBuild and deploy AI Agents on Cloudflare项目地址: https://gitcode.com/GitHub_Trending/agents1/agents

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 5:31:24

Python网络舆情分析系统搭建:从爬虫采集到情感可视化的完整实践

简介&#xff1a;这是一套基于Python与Django的网络舆情分析系统毕业设计项目&#xff0c;完整包含项目源码、数据库脚本、毕业论文文档与答辩PPT。项目面向计算机专业毕业生、有Python基础的开发者&#xff0c;以及需要快速搭建舆情分析演示系统的学习者&#xff0c;帮助理解真…

作者头像 李华
网站建设 2026/9/17 5:30:11

提示词工程实战:10个技巧与模板,从上下文工程到稳定输出

我最早开始用大模型的时候&#xff0c;特别迷信网上的“神秘咒语”&#xff0c;总觉得只要找到某个神奇的说法&#xff0c;AI 就能点石成金。后来自己天天在生产环境里调 Prompt&#xff0c;才慢慢承认一个事实&#xff1a;提示词工程不是“咒语学”&#xff0c;它是把人的意图…

作者头像 李华
网站建设 2026/9/17 5:30:06

MySQL 8.0内存飙高?从performance_schema到会话缓冲的排查实战

上周接了一台 MySQL 8.0 服务器的内存告警&#xff0c;free -h一看 used 已经冲到 91%&#xff0c;mysqld 一个进程的 RSS 就占了 4.7GB&#xff0c;机器是 8G 内存的小规格&#xff0c;OOM Killer 随时可能动手。查 MySQL 占用内存过大这类问题&#xff0c;我处理过不止一二十…

作者头像 李华
网站建设 2026/9/17 5:27:54

高校后勤报修系统开发:Python+Django全栈实践

1. 项目背景与需求分析高校后勤报修系统是校园信息化建设中的重要组成部分。传统报修方式存在诸多痛点&#xff1a;电话报修容易占线、纸质登记易丢失、维修进度不透明、数据统计困难等。我们团队开发的这套系统正是为了解决这些实际问题。从技术角度看&#xff0c;这个系统需要…

作者头像 李华
网站建设 2026/9/17 5:27:40

无代码AI智能体落地指南:从选型到全托管PaaS实践

直接说结论&#xff1a;现在的企业做 AI 智能体&#xff0c;早就不是技术竞赛&#xff0c;而是选型竞赛。你团队里有没有专职算法工程师&#xff1f;没有的话&#xff0c;无代码方案就是你的主力路线&#xff1b;你有没有时间和精力去维护 GPU、向量库、推理服务、限流、监控一…

作者头像 李华
网站建设 2026/9/17 5:27:37

CANN挑战赛赛题解析:算子开发与模型迁移实操指南

9月10日下午4点那场CANN挑战赛的赛题解析直播&#xff0c;我蹲完了全程&#xff0c;边看边记了不少东西。说实话&#xff0c;赛题刚放出来的时候&#xff0c;很多人第一反应是"这题看着不难啊"&#xff0c;但真动手做起来&#xff0c;才发现坑比想象中多。我自己前后…

作者头像 李华