用途:为 Boring 应用(能力提供者)新增或修改一项能力,包括智能体、任务、聊天、工具、视图或页面,并决定是否在 boring.json 中声明,使 hub 可以调用。每个能力文件夹都是可选的,boring.json 声明 hub 可使用的内容;未声明的定义属于内部能力,仅在应用内可用,不出现在清单中。
主要能力与创建方式:单次带契约的模型调用用 agents/<name>/agent.md(可加 rules.md、tool.json);多个智能体带生命周期(由部分产出结果)用 agents/<name>/JOB.md 加 index.mjs;带历史的聊天用 agents/<name>/CHAT.md(可选 index.mjs 上下文);纯函数工具用 tools/<name>/tool.json(runtime: sandbox)加 index.js;需要数据库、网络或密钥的工具用 tools/<name>/tool.json(runtime: server)加 server/src/tools/<name>.ts;绑定数据、可由 hub 框住的组件用 web/src/views/<name>/index.tsx 并在 web/src/main.tsx 注册;应用自身屏幕用 web/src/pages/<name>/index.tsx。多数功能仅需一个智能体;仅当功能协调多个带生命周期的智能体时才加 job,仅当人们多轮对话时才加 chat。名称在 agents/ 内唯一。
用法要点:agent.md 的 front matter 包含 name、title、description、model(openai-codex/<model>)、effort、max_tokens、output(tool 或 markdown)、helper_tools(仅已声明工具)、inputs。声明式(无 index.mjs)时消息即规则与输入;markdown 输出必须非空,tool 输出必须带 tool.json 的必填字段。带代码时 validate(output) 是运行时存储前应用的契约,可用 agents/_shared/validate.mjs 的 fail("…") 拒绝。假模型(server/src/fake-models.ts)回答 markdown 智能体;tool 智能体需加脚本化回复,否则测试无法运行。Cloudflare 应用(project.md runtime: cloudflare)不运行智能体运行时,其智能体保持声明式并由 hub 运行,不允许 index.mjs 或 job,verify check 会拒绝。
工具与数据:sandbox 工具 index.js 定义 run(input, ops),纯 JavaScript,无 import、无 Node 或网络 API,仅能用 tool.json 中 operations 列出的 ops。<name>。server 工具导出 handler(input, { db }),用 zod 校验输入,每个查询都要 await(同一代码在 SQLite 与 D1 上运行),Cloudflare 应用不使用 Node API。tool.json 含 description、runtime、input 与 output JSON schema。表在 server/src/db/schema.ts,然后 npm run db:generate,提交 server/drizzle/(不要用 drizzle-kit push)。路由在 server/src/routes/<name>.ts(Hono + zValidator),挂载于 server/src/app.ts。Web 仅通过 web/src/lib/api.ts 访问服务器。
测试与验证:单元测试 npm test 覆盖路由与工具(test/unit/app.test.mjs)及带代码智能体的契约;端到端测试(test/e2e/journey.spec.mjs)用于用户可见的新功能。运行 node scripts/verify.mjs check,再用 verify-app 技能驱动。功能地图见 docs/verify/ 中的区域文件。
限制与禁止:不要意外暴露能力,要么声明要么保持内部;不要在运行时之外调用模型;不要给 sandbox 工具加 import;不要编辑 vendor/。