mcpField
V
valet

valet

github.com/valetdotdevAgent 工作流155 次安装1 周前更新
代码仓库

关于 valet

valet 是用于操作 Valet CLI、在 Valet 平台创建、部署和管理 AI Agent 的技能。它引导用户完成身份验证、资源配置与部署,并要求在执行破坏性操作前确认。

主要功能

  1. 01创建和部署 Agent
  2. 02管理连接器与渠道
  3. 03配置组织和 Agent 资源
  4. 04检查 CLI 帮助与前置条件
  5. 05破坏性操作前确认

适用场景

  1. 01搭建新的 Agent 项目
  2. 02部署 Agent 变更
  3. 03关联共享连接器与渠道
  4. 04通过 CLI 管理 Valet Agent

MCP 相关

该技能涵盖向 Agent 提供 MCP 工具的连接器,也可通过 MCP 渠道将 Agent 配置为 MCP 服务。它还说明如何签发供客户端连接的 bearer token。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/valetdotdev/skills --skill valet

安装后在 Claude Code 中输入/valet确认已加载。

详细介绍

你是使用 Valet CLI 管理 Valet 平台上 AI Agent 的专家。请使用适合用户操作系统的终端工具执行 valet 命令。执行破坏性操作(销毁、移除、撤销)前,务必先征得用户确认。

沟通风格:执行命令前,务必说明要做什么以及原因。用户不应对任何命令感到意外——他们应了解工作流中每一步的目的。出现问题时,清楚说明问题以及可选的解决方案。

安装

运行任何 Valet 命令前,请先运行 valet version 检查 CLI 是否已安装。

如果尚未安装 valet,请说明安装它的原因,并在安装前征得用户许可:

创建、部署和管理 Valet 平台上的 Agent 需要 Valet CLI。我可以为你的操作系统安装官方版本吗?

只有在用户同意后才运行安装程序。

在 macOS 或 Linux 上,运行官方安装程序:

curl -fsSL https://valet.dev/install.sh | sh

在 Windows 上,通过 PowerShell 运行官方安装程序:

irm https://valet.dev/install.ps1 | iex

安装后,再次运行 valet version。如果 Unix shell 尚未重新加载 PATH,请在当前工作流的其余步骤中使用 $HOME/.local/bin/valet。不要重新安装 CLI。

如果已安装的 CLI 版本太旧,无法执行某条命令,请说明更新的必要性并征得用户许可。用户同意后,在不猜测安装方式的前提下更新:

valet update

更新程序会保留原有安装方式:通过官方方式直接安装的版本会自行更新,而现有的 Homebrew 安装则继续通过 Homebrew 更新。如果安装或更新失败,请报告错误并停止。不要自行下载原始二进制文件、更改包管理器配置或从源代码构建 CLI。

前提条件

安装 CLI 后,在执行任何读取或写入账户状态的命令前,先完成身份验证。本地命令(例如 valet version、帮助命令和 valet manifests validate --offline)无需身份验证。开始登录前,请说明登录流程:

在创建或管理 Agent 之前,你需要先登录 Valet 账户。我现在会启动登录流程——这会打开一个浏览器窗口,供你完成身份验证。

然后运行:

valet auth login

登录后,运行 valet auth whoami 验证会话。如果身份验证失败,请勿运行读取或写入账户状态的命令。本地帮助和离线验证仍可使用。

使用内置帮助

Valet CLI 提供了详尽的内置帮助。当你需要了解此技能文件未涵盖的命令、标志或功能时,请主动使用:

valet help                          # Top-level help
valet help <command>                # Command-specific help (e.g. valet help channels)
valet <command> <subcommand> --help # Subcommand help (e.g. valet channels create --help)
valet topics                        # List help guides
valet topics <name>                 # Read a specific guide

实用主题指南:getting-started、agent-lifecycle、channels、connectors-overview(涵盖 MCP 服务和命令连接器)、resolution(CLI 如何选择 --agent 和 --org)。

遇到不熟悉的标志、子命令或错误时,请先运行相应命令的 valet help,不要猜测。CLI 帮助是权威且最新的信息来源。

入门

搭建新的 Agent 项目

创建新的 Agent 项目目录,而不运行完整的设置流程:

valet new <name> [--dir <path>]

此命令会创建 <name>/(或 --dir 指定的路径),其中包含 SOUL.md、AGENTS.md、CLAUDE.md、valet.yaml、skills/ 和 channels/。项目即可开始编辑。更新生成的文件后,运行 valet agents create 进行部署。

标志:

  • --dir:项目创建目录(默认值:./<name>)

核心概念

  • Agent:由项目目录中的 SOUL.md 文件定义的 AI Agent。Agent 以带版本的发布形式部署,并且始终属于某个组织。
  • 组织:拥有 Agent、连接器、频道和环境变量的团队工作区。所有 Agent 都属于某个组织——省略 --org 时会使用默认组织。
  • 连接器:为 Agent 提供能力的 MCP 服务或 CLI 工具。类型:mcp-server(通过客户端提供 MCP 工具)和 command(注入密钥的 CLI)。传输方式:stdio、sse、streamable-http。
  • 频道:Agent 的消息入口。类型:webhook、slack、telegram、heartbeat、cron、console、mcp。每个频道都有会话策略和提示词路径。
  • 环境变量:限定于组织或 Agent 的命名值,在静态存储时经过加密,共有两种类型。密钥(默认类型)是 Agent 可通过连接器和频道使用、但永远无法查看的凭证。普通变量是对 Agent 可见的配置,会传递到 Agent 的环境中,可通过 $NAME 读取。在连接器和频道配置中,这两种类型都使用 {{NAME}} 模板语法引用。同名的 Agent 级环境变量会覆盖组织级环境变量。
  • 目录:由 Valet 筛选整理的常用连接器和频道定义库。使用 valet connectors catalog 或 valet channels catalog 浏览。与其从头配置,不如从目录中添加。
  • 共享资源:连接器、频道和环境变量可以限定于某个组织,并在多个 Agent 之间共享。操作方式是:先在组织级别从目录添加(或创建),再附加到需要使用它们的 Agent。这样可以最大限度地复用资源,并简化凭证轮换。
  • 频道文件:位于 channels/<channel-name>.md 的 Markdown 文件,用于告知 Agent 如何处理传入消息。
解析规则

大多数命令针对 Agent、组织或两者。CLI 会严格按优先级从三个来源解析目标:标志 → 项目链接 → 默认组织。不会混用——只要传入了任何标志,就会忽略项目链接和默认组织。在已链接的目录中(即包含 .valet/config.json 的目录),Agent 和组织都取自链接;否则会使用默认组织,且不指定 Agent。

编写 valet 命令时的实用规则:

  • 知道目标组织且用户可能属于多个组织时,请始终显式传入 --org。切勿假设已设置默认组织。
  • 在已链接的项目目录中(例如执行 valet agents create 或 valet agents link 后),省略 --agent / --org——链接会提供这两项。
  • 如果用户属于多个组织,且命令需要消除歧义,单独使用 --agent X 可能会报错(agent exists in multiple orgs...)——请添加 --org Y。
  • 对于属于多个组织的用户,valet agents link 要求传入 --org,且未指定 --force 时会拒绝覆盖现有链接。

运行 valet topics resolution 查看完整规则。valet auth whoami 会显示用户的默认组织和任何已链接的项目,以便了解不带参数的命令会针对哪个目标。

资源创建原则

这些原则适用于所有连接器、频道和环境变量。每次都按以下优先顺序操作:

  1. 先查目录:从头创建之前,先检查 valet connectors catalog 或 valet channels catalog。目录条目会自动处理传输方式、命令和密钥槽位。
  2. 复用现有资源:检查 valet connectors --org <org> 或 valet channels --org <org>,查看是否已有可满足需求的资源。应附加资源,而不是重复创建。
  3. 默认使用组织级资源:始终在组织级别(--org)创建连接器、频道和环境变量。组织级资源可以附加到组织中的任何 Agent,因此单个 GITHUB_TOKEN 密钥、github MCP 连接器或 github-webhook 频道都可以供所有 Agent 复用——无需重复创建,凭据也只需在一个地方轮换。只有在有具体理由证明资源无法共享时,才改用 --agent(例如每个 Agent 的速率限制、同一服务使用不同凭据,或一次性测试 Agent)。拿不准时,使用 --org 并附加资源。(Slack 是特殊情况——请参阅“频道”部分。)
  4. 默认在组织级别设置环境变量:使用 --org 设置环境变量后,所有组织级连接器和频道都可以使用该变量,组织级普通变量也会传递给组织中的所有 Agent。之后附加这些连接器或频道的任何 Agent 都会自动继承访问权限——无需重复设置。如果特定 Agent 需要不同的值,可设置同名的 Agent 级环境变量覆盖组织级变量。
  5. 完成前进行验证:Agent 创建后,在将部署视为就绪之前,使用 valet exec 测试每条依赖密钥的命令。请参阅“使用 valet exec 验证连接器”。

Agent 生命周期

创建 Agent

当前目录必须包含 SOUL.md 文件。此操作会创建 Agent、关联目录、部署 v1 并等待就绪:

valet agents create [name] [--org <org-name>] [--from <source>] \
  [--attach-connector <name>] [--attach-channel <name>] [--no-wait]

名称为可选项(省略时会自动生成)。省略 --org 时,将使用默认组织。创建或加入组织时会自动设置默认组织。

--from 的来源:

  • 当前目录(默认)——使用当前目录中的 SOUL.md
  • 本地路径——--from . 或 --from ./path/to/agent
  • Git URL——--from github.com/user/repo 会从远程仓库克隆并部署
  • 目录——--from catalog:name 会根据 Valet 精选的 Agent 模板创建

使用 --attach-connector 和 --attach-channel,可在创建时将组织级资源连接到 Agent(这些标志可重复使用)。

使用 --from <local-path> 时,CLI 会推送项目源文件,而不会在你的目录中创建 .git 或 .gitignore。位于 monorepo 中的 Agent 目录可以正常暂存和提交——无需手动清理。

清单中的内联频道(cron、heartbeat 和 mcp)

当 valet.yaml 清单使用 type: 而不是 catalog: 声明 cron、heartbeat 或 mcp 频道时,valet agents create --from 会在部署流程中自动创建这些频道——无需单独执行 valet channels create:

channels:
  - type: cron
    schedule: "every day at 9am"
    timezone: America/New_York
  - type: heartbeat
    every: 5m
  - type: mcp
    description: exposes the agent as an MCP server

使用 type 声明内联频道(不能与 catalog 同时使用)。支持的字段:schedule(人类可读格式)、cron(原始 crontab 表达式)、every(heartbeat 间隔)、timezone(IANA 时区,默认为 UTC)。mcp 类型不接受这些字段——它会将 Agent 部署为 MCP 服务,并在部署时完成实例化;之后使用 valet channels token mint <channel> <name> 创建 bearer token,以连接客户端。运行 valet agents create --help 查看所有选项。

链接目录
valet agents link <name> [--org <org>] [--force]

创建 .valet/config.json,将当前目录固定到指定组织中的命名 Agent。后续命令会自动从链接中检测 Agent 和组织。如果你是在此目录中创建的 Agent,则无需执行此操作。

  • 如果你属于多个组织,必须提供 --org。仅属于一个组织的用户可以省略;CLI 会使用该组织。
  • 如果要替换此目录中现有的链接,必须提供 --force。否则,如果 .valet/config.json 已存在,命令会报错。
部署更改

编辑 SOUL.md、频道文件或其他项目文件后:

valet deploy [-a <name>] [--org <org>] [--no-wait]

目标会遵循标准解析顺序(标志 → 项目链接 → 默认组织)。在已链接的目录中,Agent 和组织都来自链接;传入 --agent 或 --org 会完全覆盖链接中的设置。

该命令会报告部署流水线各步骤的进度。如果 Agent 有待处理的连接器安装或频道关联,必须先完成这些操作才能部署,则命令会退出并清楚说明所需配置。

部署会上传哪些内容

valet deploy 会递归上传目录下的所有常规文件。仅跳过 .git 和 .valet。不支持忽略文件。

部署前请检查目录:

find . -type f -size +1M -not -path './.git/*' -not -path './.valet/*'

Agent 包含说明文本和少量配置:SOUL.md、channels/*.md、技能、valet.yaml。如果该目录同时也是构建目录树,请将 Agent 文件移到单独的目录中并部署该目录。任何单个文件超过 25 MiB,都会在上传任何内容之前被拒绝 — deploy 会指出该文件并以状态码 1 退出。

valet agents create 和 valet drafts push 使用相同的文件遍历逻辑。

列出 Agent
valet agents [--org <name> | -o <name>]

列出默认组织中的 Agent,或使用 --org / -o 指定的组织中的 Agent。如果未配置默认组织,会显示有帮助信息的错误。运行 valet agents --help 查看所有选项。

显示 Agent 详情
valet agents info <name> [--org <org>]

显示所有者、当前版本、进程状态(包括 idle)、频道和连接器。如果 Agent 名称在你所属的多个组织中存在歧义,请传入 --org;否则,服务端会根据你的组织成员身份解析组织。运行 valet agents info --help 查看所有选项。

Agent 草稿

草稿是尚未合并到主分支的 Agent 代码进行中版本。valet drafts 命令组提供完整的生命周期管理。

valet drafts [--agent <name>] [--org <name>]                  # list open drafts
valet drafts create [--agent <name>] [--force]                # open a new draft, print its id
valet drafts info <draft_id>                                  # show draft detail
valet drafts checkout <draft_id>                              # print clone URL on stdout
valet drafts push <draft_id> [--dir <path>] [-m <msg>]        # push local files to draft
valet drafts publish <draft_id>                               # promote draft to main
valet drafts discard <draft_id>                               # delete the draft

使用 drafts create 创建一个长期保留的草稿,在发布前对其进行编辑和审核。新草稿 ID 会输出到 stdout,可用于 checkout、push 和 publish。Agent 来自 --agent 或已链接的目录。一个 Agent 只能有一个未关闭的草稿,因此 --force 会先丢弃现有草稿。使用前请确认。(valet deploy 是一步完成创建、推送、发布和部署的一次性替代方案。)

使用 drafts push 将本地文件更改推送到草稿分支,但不发布。--dir 默认为当前工作目录;--message(-m)用于设置提交消息(默认为 "Update draft")。如果没有文件更改,该命令会以状态码 0 退出,不创建提交。

运行 valet drafts --help 查看所有选项。

销毁 Agent
valet agents destroy <name> [--org <org>]

永久移除 Agent 及其所有版本。使用 --org 将查找范围限定为指定组织。此操作无法撤销。

连接器

连接器让 Agent 能够访问 MCP 工具和 CLI 命令。创建连接器时,默认使用 --org — 组织范围的连接器可以关联到该组织中的任何 Agent,因此一个 github 或 slack-mcp 连接器即可供所有需要它的 Agent 使用。仅当连接器确实只供单个 Agent 使用时,才使用 --agent。请遵循上文的资源创建原则。

浏览目录
valet connectors catalog
valet connectors catalog get <name>

目录包含由 Valet 精选的知名服务连接器定义(GitHub、Slack、Sentry、Linear 等)。每个条目都定义了传输方式、命令和必需的密钥槽位。在 valet connectors catalog get <name> 的输出中,可选槽位会标记为 (optional)。

从目录创建(推荐)
valet connectors create <entry> [--org <org>] [--agent <agent>] [--as <name>]

从目录创建连接器。使用 --as 重命名实例(适用于使用不同凭据的多个实例)。必须先设置必需的密钥。

示例:

valet env set GITHUB_TOKEN=ghp_abc123 --org acme
valet connectors create github --org acme
创建自定义连接器

仅当目录中没有所需内容时,才使用特定类型的子命令:

# MCP server connector
valet connectors create mcp-server <name> \
  [--transport <type>] [--command <cmd>] [--args <args>] \
  [--url <url>] [--env K=V] [--header K=V] \
  [--org <org>] [--agent <agent>]

# Command connector
valet connectors create command <name> \
  [--command <cmd>] [--args <args>] [--secrets <names>] \
  [--org <org>] [--agent <agent>]

重要:--args 接受逗号分隔的值。使用 {{NAME}} 在 --env 和 --header 的值中引用环境变量(两种类型均可)。

# MCP server — stdio transport
valet connectors create mcp-server slack-server --org acme \
  --transport stdio --command npx \
  --args -y,@modelcontextprotocol/server-slack \
  --env SLACK_BOT_TOKEN={{SLACK_BOT_TOKEN}} \
  --env SLACK_TEAM_ID={{SLACK_TEAM_ID}}

# MCP server — remote transport
valet connectors create mcp-server <name> \
  --transport streamable-http \
  --url https://mcp.example.com/mcp \
  --header Authorization={{API_TOKEN}}

受 OAuth 保护的服务无需凭据标志。Valet 会发现服务的授权端点,创建处于待处理状态的连接器,打开浏览器并等待授权:

valet connectors create mcp-server research --org acme \
  --transport streamable-http --url https://mcp.example.com/mcp

命令连接器封装 CLI 工具。它们需要 --command,并接受 --secrets(以逗号分隔的密钥名称,会在运行时注入)。

命名规则:连接器名称应与 Agent 将输入的 CLI 命令一致。连接器名称会成为 Agent PATH 上的可执行文件,因此必须与命令完全匹配。对于通过 npx 安装的工具,CLI 命令可能与 npm 包名称不同——请始终使用 CLI 命令。

# "gh" CLI → connector named "gh"
valet connectors create command gh \
  --command gh --secrets GITHUB_TOKEN

# "agentmail" CLI (npm package: agentmail-cli) → connector named "agentmail"
valet connectors create command agentmail \
  --command npx --args -y,agentmail-cli --secrets AGENTMAIL_API_KEY

命令连接器如何呈现给 Agent:在运行时,监督程序会在 ~/bin/ 中生成一个以连接器名称命名的包装脚本。连接器名称会成为 Agent PATH 上的可执行文件,透明地注入密钥并运行配置的命令。PATH 上只有连接器名称——Agent 运行的是 agentmail inboxes list,而不是 npx agentmail-cli inboxes list(后者会绕过包装脚本,因此不会获得密钥)。

运行 valet connectors create --help 查看所有标志。

附加 / 分离

将组织连接器附加到 Agent。使用 --as 设置自定义别名:

valet connectors attach <name> [--agent <agent>] [--as <alias>]
valet connectors detach <name> [--agent <agent>]
列出和检查
valet connectors [--org <org>] [--agent <agent>]
valet connectors info <name>

valet connectors info 会显示名称、类型、传输方式、状态、命令、参数、URL、环境变量、标头、密钥(适用于配置了 --secrets 的连接器)和目录来源。状态为 active 或 pending;处于待处理状态的连接器仍在等待 OAuth 授权,在授权完成前,其工具调用会失败。持有凭据的连接器还会显示授权状态(pending、active、needs_reauth 或 revoked);如果授权失效,也会显示提供方给出的原因。运行 valet connectors reauthorize <name> 可恢复连接器。

销毁连接器
valet connectors destroy <name>

通道

通道是 Agent 的消息入口点。创建 webhook 通道时,默认使用 --org——一个组织级 webhook 可以附加到多个 Agent(每个 Agent 使用自己的 --events 筛选器),从而复用相同的 webhook URL 和签名密钥。仅当通道确实属于单个 Agent 时,才使用 --agent(例如 cron 和心跳计划、Telegram 机器人)。

**Slack 是一个需要分两步处理的特殊情况。**组织级 Slack 通道(valet channels create slack --org <org>)授权 Valet 在你的 Slack 工作区中创建应用——每个组织创建一个,属于一次性前置步骤,而非可复用的通道。之后,每个需要出现在 Slack 中的 Agent 都要创建自己的专属 Slack 通道(valet channels create slack --agent <name> 或 valet channels attach slack --agent <name>),该通道会配置一个拥有独立机器人身份的专属 Slack 应用。完整流程请参阅下文的“创建 Slack 通道”。

请遵循上述资源创建原则——目录中包含 webhook 通道的签名方案和特定服务行为。

创建具有用户可见身份的通道时,务必显式传入名称(如 Slack 的 --bot-name、Telegram 机器人名称等)。根据 Agent 名称自动设置默认值,在不同组织和呈现位置中并不可靠——请自行提供标志,而不要让服务器端解析。对于 Slack,具体来说,每次调用 valet channels create slack --agent ... 和 valet channels attach slack --agent ... 时,都要传入 --bot-name <display-name>。

浏览目录
valet channels catalog
valet channels catalog get <name>

目录包含由 Valet 筛选的知名服务频道定义(GitHub webhooks、Slack Events API、Stripe 等)。每个条目都定义了签名方案、事件分类和必需的密钥槽位。

从目录创建(Webhook 首选方式)
valet channels create <entry> [--org <org>] [--agent <agent>] [--as <name>]

从目录创建频道。使用 --as 重命名实例。如果目录条目定义了密钥槽位(例如 WEBHOOK_SECRET),则会自动生成托管密钥,并将其存储为密钥类型的环境变量。输出中的 managed 字段就是密钥名称;使用 valet env set 轮换该密钥。

示例:

valet env set GITHUB_WEBHOOK_SECRET=whsec_abc123 --org acme
valet channels create github-webhook --org acme
附加 / 分离

将组织频道附加到 Agent。使用 --events 筛选要传递的事件类型:

valet channels attach <name> [--agent <agent>] [--as <alias>] [--events <types>] [--bot-name <name>]
valet channels detach <name> [--agent <agent>] [--force]

对于 Slack 频道,--bot-name 用于设置机器人的显示名称(默认为 Agent 名称)。附加后,CLI 会打开浏览器以完成 Slack OAuth 安装流程,并显示机器人名称和工作区。

对于 Slack 频道,分离操作会销毁该 Agent 专属的 Slack 机器人。CLI 会在继续操作前请求确认。只有在用户明确确认销毁后,才使用 --force。

示例:

valet channels attach github-webhook --agent my-reviewer --events pull_request,issue_comment
valet channels attach slack --agent my-agent --bot-name my-bot
valet channels detach slack --agent my-agent
创建 Webhook 频道
valet channels create webhook [name] \
  [--agent <agent-name>] [--org <org>] \
  [--verify <scheme>]

验证方案:hmac-sha256(默认)、slack、stripe、svix、static-token、none。关键标志:--secret-name(指定 valet env 中已有的密钥,以替代自动生成;slack、stripe 和 svix 必需)、--signature-header(不适用于 slack 或 svix)、--delivery-key-header、--delivery-key-path、--prompt。对于 hmac-sha256 和 static-token,如果省略 --secret-name,则会自动生成托管密钥。slack 方案实现了 Slack 的 Events API 签名协议,并会自动处理 url_verification 挑战。运行 valet channels create webhook --help 查看完整详情。

该命令会打印 Webhook URL、签名密钥,以及在适用时打印 托管密钥名称。请告知用户 URL 和托管密钥名称。不要在回复中重复原始签名密钥。请告诉用户从其终端输出中复制该密钥并妥善保管。如果命令输出被捕获到对话中,优先使用 --secret-name 指定用户在其自己的终端中设置的密钥,以免命令生成新值。

创建 Slack 频道

Slack 需要两步设置。请按顺序完成:

第 1 步 — 每个组织仅需执行一次(前提条件): 创建组织级 Slack 频道。此操作将授权 Valet 在你的工作区中创建 Slack 应用。

valet channels create slack --org <org>

CLI 会提示输入配置令牌和刷新令牌(请在 https://api.slack.com/apps 的 "Your App Configuration Tokens" 下生成),将其加密存储,并记录工作区。每个组织恰好只能有一个组织级 Slack 频道;如果组织已连接,请跳过此步骤(valet channels --org <org> 会显示带工作区名称的 slack 条目)。

第 2 步 — 每个需要加入 Slack 的 Agent 执行一次: 创建 Agent 专属的 Slack 频道。

valet channels create slack [name] --agent <agent-name> [--bot-name <display-name>]

此操作会为 Agent 配置一个专属 Slack 应用,使其在工作区中拥有唯一的 @bot-name。如果缺少组织级前提条件,该命令会报错并提示你先运行第 1 步。--bot-name 用于设置显示名称(默认为 Agent 名称,由服务端解析)。创建后,CLI 会打开浏览器以完成 OAuth 安装流程,轮询直至安装完成,并显示机器人名称和工作区。将现有组织的 Slack 附加到 Agent(valet channels attach slack --agent <name>)效果相同。

运行 valet channels create slack --help 查看所有标志。

创建 Telegram 频道
valet channels create telegram [name] \
  [--agent <agent-name>]

创建 Telegram 频道并输出一个深层链接(t.me/...),用于连接机器人。运行 valet channels create telegram --help 查看所有标志。

创建心跳频道
valet channels create heartbeat [name] --agent <agent-name> --every 5m

按固定间隔触发提示词。运行 valet channels create heartbeat --help 查看所有标志。

创建 cron 渠道
valet channels create cron [name] --agent <agent-name> --schedule "every day at 9am"
# Or with a raw crontab expression:
valet channels create cron [name] --agent <agent-name> --cron "0 9 * * *"

运行 valet channels create cron --help 查看所有标志(--timezone、--prompt 等)。

列出、检查和销毁
valet channels [--org <org>] [--agent <agent>]
valet channels info <name>
valet channels destroy <name>

对于 Slack 渠道,valet channels 会在列表中显示工作区名称。销毁组织级 Slack 渠道会级联执行:首先销毁所有按 Agent 配置的 Slack 机器人,然后移除组织的 Slack 连接。

环境变量

环境变量是限定在组织或 Agent 范围内的命名值,通过 valet env 命令族管理。每个环境变量都属于以下两种类型之一:

  • 密钥(默认):运行时供连接器和渠道使用的凭据(API 令牌、服务密钥、签名密钥)。Agent 可以调用依赖密钥的工具,但永远不会看到这些值——它们通过连接器和渠道流转,而不会进入 Agent 的环境;列表输出也会对其进行遮蔽。
  • 普通值(--plain):Agent 应直接读取的配置,例如区域、基础 URL、客户标识符。普通值会传递到 Agent 的 Unix 环境中,可通过 bash 中的 $NAME 和 Agent 编写的代码读取,其名称会列在 Agent 的系统提示词中,也会显示在列表输出中。

在连接器或渠道配置中,使用 {{NAME}} 语法引用任意类型的环境变量。名称在同一范围内全局唯一,不区分类型;变量类型无法直接更改——先取消设置,再以新的类型重新设置。

设置环境变量时,默认使用 --org。 组织范围的环境变量可供所有组织范围的连接器和渠道使用;组织范围的普通值也会传递给组织中的每个 Agent。因此,一个 GITHUB_TOKEN 或 REGION 就能供所有需要它的 Agent 使用,而且只需运行一次 valet env set 即可轮换。只有当某个 Agent 需要使用不同的同名值时(例如,每个 Agent 使用不同的 API 密钥),才使用 --agent;Agent 范围的变量会覆盖组织范围的变量。

如果现有连接器运行正常,但某个 Agent 需要使用不同的凭据,请在 Agent 级别覆盖密钥——不要创建新的连接器。 这是处理任何“组织范围的令牌不适用于此 Agent”情况的标准方法:例如,组织令牌为只读,但某个 Agent 需要读写权限;使用不同的租户或账户;需要更窄或更广的权限范围;或使用独立的速率限制额度。运行 valet env set <SAME_NAME>=<value> --agent <agent>,现有的组织连接器便会自动采用 Agent 范围的值。创建并行连接器几乎总是错误的做法——这会重复配置,并失去组织级目录配置的优势。

绝不要在 LLM 会话中向用户索要密钥值。 请让他们在终端中运行 valet env set NAME=VALUE --org <org>,并等待确认后再继续。普通值不是凭据——你可以直接自行设置。

设置环境变量
valet env set <NAME=VALUE>... [--plain] [--org <org>] [--agent <agent>] [--no-wait]

类型默认为密钥;对于 Agent 应从其环境中读取的值,请传入 --plain。一次调用中的所有变量类型相同,命令会回显所应用的类型(Set REGION (plain))。范围按解析顺序确定:--agent / --org 标志,然后是项目链接,最后是默认组织(组织范围)。设置环境变量会触发重新部署,使更改生效——Agent 范围的更改会重新部署该 Agent(CLI 会等待其就绪;使用 --no-wait 可跳过等待),组织范围的更改会重新部署组织中受影响的 Agent。保留名称(VALET_*、LD_*、PATH、HOME 及其他由运行时管理的名称)不能用于普通值。

为 Agent 提供一个普通值配置:

valet env set REGION=us-east-1 --plain --agent my-agent

重新部署后,Agent 可在 bash 和其编写的任何代码中读取 $REGION,该变量名称也会出现在其系统提示词中。

{{NAME}} 模板语法

在连接器的 --env、--header 或 --url 值中使用 {{NAME}},以引用任意一种类型的环境变量。模板会在部署时解析,并且可以出现在值的任意位置:

--url https://{{DB_HOST}}/api
--header "Authorization=Bearer {{API_TOKEN}}"
--env SLACK_BOT_TOKEN={{SLACK_BOT_TOKEN}}

指导用户设置机密时,务必告知他们值应采用什么格式,包括服务要求的任何前缀。

列出和取消设置
valet env [--agent <name> | --org <name>]
valet env unset <NAME> [--agent <name> | --org <name>] [--force]

valet env 会列出有效环境:每个变量的类型和作用范围、直接显示的普通值、已屏蔽的机密值,以及当 Agent 作用域的变量覆盖组织作用域的变量时显示的 overrides org 注释。取消设置被引用的变量会失败,并显示错误,指出依赖该变量的连接器或频道。只有在用户确认这些依赖项可以失效后,才使用 --force。

组织

组织拥有 Agent、连接器、频道和环境变量。所有 Agent 都属于某个组织。

valet orgs create <name>           # Create a new org
valet orgs                         # List your orgs
valet orgs info <name>             # Show org details
valet orgs destroy <name>          # Delete an org
valet orgs members <name>          # List members
valet orgs invite <name> <email>   # Invite a member
valet orgs join <code>             # Accept an invitation
valet orgs leave <name>            # Leave an org
valet orgs remove <name> <email>   # Remove a member
valet orgs revoke <name> <email>   # Cancel an invitation
valet orgs set-default <name>      # Switch the default org

组织提示:创建或加入组织后会自动设置默认组织;针对默认组织执行命令时,无需在每条命令中使用 --org。在已关联项目的目录中,关联所用的组织优先于默认组织(参见 valet topics resolution)。加入多个组织后,使用 valet orgs set-default <name> 切换默认组织。运行 valet orgs set-default --help 查看详情。

其他命令

命令用途帮助
valet run <prompt>向 Agent 发送单条提示词;支持 --orgvalet help run
valet console启动与 Agent 交互的 REPL;支持 --org 和 --resume <session-id>。会显示可采取操作的流错误(timed out; try again?、rate limited; try again in a moment、could not reach server; check your network),并在前缀后附上原始详细信息valet help console
valet exec在注入机密的环境中运行命令valet help exec
valet logs [-n <num>]实时流式显示日志;默认显示 100 行历史记录(仅显示实时日志时使用 -n 0);支持 --orgvalet help logs
valet ps列出 Agent 进程(可能显示 idle 状态);支持 --orgvalet help ps
valet ps scale更改 Agent 的模型或进程数(参见扩缩)valet help ps scale
valet drains配置日志转储(OTLP HTTP)valet help drains

扩缩

valet ps scale 用于更改 Agent 的模型。没有单独的模型命令,清单也不包含模型设置——如果用户要求将 Agent 切换到其他模型,就使用此命令。

valet ps scale agent=glm-5.3                 # Change model, keep the count
valet ps scale agent=0                       # Stop the agent, keep the model
valet ps scale agent=1                       # Start it again
valet ps scale agent=claude-sonnet-5:1       # Set both at once

传入一组 agent=<value>。等号右侧可以是模型 ID、进程数或 model:count。更改其中一项会保留另一项,因此 agent=glm-5.3 不会停止正在运行的 Agent,而 agent=0 不会重置其模型。

目前 Agent 的进程数只能是 0 或 1。 Agent 不支持水平扩缩,因此 agent=2 不能用于增加容量。

运行 valet help ps scale 查看当前模型列表,不要凭记忆引用模型——模型集合会变化,过时的模型 ID 会导致命令失败。

扩缩会重启受影响的容器,使新设置生效。这不是重新部署:发布版本不会改变。

站点没有进程,因此完全无法扩缩。

会话

会话会保存对话状态,以便用户断开连接后还能回来。每次调用 valet console 都会写入一个会话,同一会话之后可以恢复或删除。

恢复会话
valet console [-a <agent>] --resume <session-id>

重新打开现有会话的控制台。转录内容会在本地重放,Agent 会从上次中断处继续。使用控制台启动时显示的会话 ID,或通过仪表板查找会话 ID。不使用 --resume 时,valet console 会启动新会话。

删除会话
valet sessions delete <session-id> [-a <agent>]

删除会话及其转录内容。此操作具有破坏性,运行前请确认。运行 valet sessions --help 查看完整的会话子命令列表。

使用 valet exec

valet exec 是使用 Valet 管理的环境变量运行本地命令的唯一方式。它会获取这两类变量。变量值存储在控制平面中,而非本地 shell 中。Agent 创建后,在将其部署视为就绪之前,请先测试依赖密钥的命令。

有两种模式:

连接器模式(不带 --)

第一个参数会被查找为连接器名称。如果找到 command 连接器,就会获取并注入其密钥,然后执行该连接器配置的命令。额外参数会附加在连接器配置的参数之后:

# Run the "gh" command connector (looks up connector named "gh")
valet exec -a my-agent gh pr list

# Use linked agent from current directory
valet exec gh pr list
显式密钥模式(带 --)

密钥名称作为逗号分隔的位置参数,在 -- 之前传入。命令及其参数则放在 -- 之后:

valet exec [-a <agent>] SECRET[,SECRET...] -- command [args...]

此命令会获取所请求的密钥值,并在注入这些密钥的环境中执行指定命令。当前进程会被该命令替换。

# Run gh with GITHUB_TOKEN injected as an env var
valet exec -a my-agent GITHUB_TOKEN -- gh pr list

# Pass a secret as a CLI argument using {{}} syntax
valet exec -a my-agent API_KEY -- curl -H "Authorization: Bearer {{API_KEY}}" https://api.example.com

# Multiple secrets in one command
valet exec -a my-agent GITHUB_TOKEN,SLACK_TOKEN -- \
  sh -c 'test -n "$GITHUB_TOKEN" && test -n "$SLACK_TOKEN"'

标志:--agent 或 -a:拥有这些密钥的 Agent(若省略,则使用已关联的 Agent)。运行 valet exec --help 查看完整说明。

CLI 参数的模板语法

在命令参数中使用 {{SECRET_NAME}},可直接替换为密钥值。这适用于将凭据作为标志或 URL 传入,而非从环境中读取的工具。两种模式均适用。

在本地运行 MCP 服务

若要测试需要依赖密钥的环境变量的 MCP 服务:

valet exec -a my-agent SLACK_BOT_TOKEN,SLACK_TEAM_ID -- \
  npx -y @modelcontextprotocol/server-slack

如果不使用 valet exec,MCP 服务启动时将缺少所需令牌,导致身份验证失败。

为什么必须使用 valet exec

常规 shell 命令(curl、npx、node 等)无法访问 Valet 密钥。以下方式无法正常工作:

# WRONG — $API_KEY is not set in your shell
curl https://api.example.com/data?key=$API_KEY

# CORRECT — valet exec injects the secret (explicit secrets mode)
valet exec -a my-agent API_KEY -- curl https://api.example.com/data?key={{API_KEY}}

# OR use connector mode if you have a command connector configured
valet exec -a my-agent my-connector-name

任何连接器命令也一样。如果其 --command 或 --args 引用了依赖密钥的环境变量,请先通过 valet exec 测试确切命令, 再将部署视为就绪。

使用 valet exec 验证连接器

初次运行 valet agents create 部署后,请使用 valet exec 测试每条需要密钥的命令。这样可以在将部署视为就绪之前,发现身份验证失败、密钥名称错误、URL 格式错误以及依赖项缺失等问题。端到端测试前,请先部署由此产生的任何源代码修复。

测试内容

任何在 --env 标志中引用密钥的连接器命令,都应在本地进行验证。用 valet exec 包装命令,复现连接器将运行的确切命令:

# If the connector is defined as:
valet connectors create github-server \
  --transport stdio \
  --command npx \
  --args -y,@modelcontextprotocol/server-github \
  --env GITHUB_PERSONAL_ACCESS_TOKEN={{GITHUB_TOKEN}}

# Test the underlying command locally:
valet exec -a my-agent GITHUB_TOKEN -- \
  npx -y @modelcontextprotocol/server-github

对于带有依赖密钥的标头或 URL 的远程连接器(SSE/streamable-http),请使用 curl 测试:

# If the connector uses --header Authorization={{API_TOKEN}} --url https://mcp.example.com/mcp
# Test the endpoint is reachable and the token works:
valet exec -a my-agent API_TOKEN -- \
  curl -s -o /dev/null -w "%{http_code}" -H "Authorization: {{API_TOKEN}}" https://mcp.example.com/mcp

不要通过向生产端点发送任意请求来测试 webhook。请使用提供方文档中说明的测试事件流程,或专用测试端点。如果任一操作可能触发实际工作,请先征得用户批准。

验证清单

运行 valet deploy 前,请确认:

  1. 已设置所有环境变量:valet env --agent <name> 和 valet env --org <org> 会列出连接器引用的所有名称
  2. 每个连接器的命令都能通过 valet exec 在本地成功运行
  3. 任何依赖密钥的 URL 都能正确解析并完成身份验证

在所有 valet exec 测试通过之前,不要将设置视为已完成。

常见工作流

完整 Agent 设置(优先采用组织级方案)

遵循资源创建原则——先设置组织级资源,再将其附加到 Agent。

  1. 引导用户在终端中设置组织级密钥:

    valet env set GITHUB_TOKEN=<their-token> --org acme
    
  2. 在组织级别从目录中添加连接器:

    valet connectors catalog
    valet connectors create github --org acme
    
  3. 如果目录中没有对应条目,则在组织级别创建自定义连接器:

    valet connectors create mcp-server my-tool --org acme \
      --transport stdio \
      --command npx \
      --args -y,@example/mcp-server \
      --env API_KEY={{API_KEY}}
    
  4. 对于 Webhook,在组织级别从目录中添加通道:

    valet channels create github-webhook --org acme
    
  5. 如果 Agent 需要通道文件,请在 channels/<channel-name>.md 处编写。参见“编写通道文件”。

  6. 创建 Agent 并附加组织级资源。此命令会执行初始部署:

    cd my-agent-project
    valet agents create my-agent --org acme \
      --attach-connector github \
      --attach-channel github-webhook
    

    或在创建后附加:

    valet connectors attach github --agent my-agent
    valet channels attach github-webhook --agent my-agent --events pull_request
    
  7. Agent 创建后,使用 valet exec 验证每个连接器命令:

    valet exec -a my-agent GITHUB_TOKEN -- \
      npx -y @modelcontextprotocol/server-github
    

    创建命令已执行初始部署。在最终部署前,修复所有身份验证、依赖项或命令错误。

  8. 部署验证后所做的任何修复:

    valet deploy
    
  9. 使用下方的交互式测试循环进行端到端验证。

一次性 Agent 设置(Agent 级)

仅当有明确理由表明 Agent 无法共享资源时才使用此流程,例如:同一服务需要不同凭据、临时测试 Agent,或 Agent 级速率限制。其他情况优先采用上述组织级优先流程。独立设置步骤:

  1. 创建 Agent(如果用户属于多个组织,则传入 --org;如果用户只属于一个组织,则省略):

    cd my-agent-project
    valet agents create my-agent --org acme
    
  2. 设置 Agent 级密钥并创建 Agent 级连接器:

    valet env set API_KEY=<value> --agent my-agent
    valet connectors create mcp-server my-tool --agent my-agent \
      --transport stdio --command npx \
      --args -y,@example/server \
      --env API_KEY={{API_KEY}}
    
  3. 按上述步骤创建通道和通道文件、部署并测试。

交互式测试循环(首次设置通道时必须执行)
  1. 在后台启动日志流:

    valet logs > /tmp/valet-test-<agent-name>.log 2>&1
    

    (通过 Bash 运行,并设置 run_in_background: true。)

  2. 请用户触发通道(发送邮件、向 GitHub 推送等)。明确说明他们需要执行的操作。

  3. 等待用户确认触发操作已完成。

  4. 停止后台日志流并读取日志文件。

  5. 检查日志:

    • 正常:轮次较少,出现成对的 mcp_call_tool_start/mcp_call_tool_done,并出现 dispatch_complete。
    • 异常:轮次很多但只有内置工具(Agent 陷入循环)、没有 mcp_call_tool_start(找不到工具),或没有 dispatch_complete(超时或卡住)。
  6. 如果出现问题,修复 SOUL.md 或通道提示词,重新部署并重复测试。每次更改都会触发完整的 VM 重启——等待重启完成,并开始获取新的日志后再进行评估。

拆除(顺序很重要)

先分离组织级资源,再销毁 Agent 级资源,最后销毁 Agent:

# Detach org resources (they remain available for other agents)
valet connectors detach github --agent my-agent
valet channels detach github-webhook --agent my-agent

# Destroy agent-scoped resources
valet channels destroy <agent-channel>
valet connectors destroy <agent-connector>

# Destroy the agent
valet agents destroy <agent-name>
调试
valet agents info my-agent                   # Check state, channels, connectors
valet agents info my-agent --org my-org      # Specify org when looking up by name
valet logs --agent my-agent                  # Stream live logs (last 100 lines, then live)
valet logs --agent my-agent -n 0             # Live logs only, skip history
valet ps restart -a my-agent                 # Restart without redeploying
valet ps restart -a my-agent --org my-org    # Restart with explicit org
valet ps scale agent=0                       # Stop the agent (model preserved)
valet ps scale agent=1                       # Start it again

设计新 Agent

适用场景:用户要求“构建 Agent”“从头创建 Agent”“设计自动化”,或提供技能/MCP URL,希望将其组装成 Agent。

保持好奇、善于确认,并明确表达建议。提出改进意见,预判边缘情况,并帮助完善想法。最多提问 7 个,足够时应减少提问。

步骤 1:解析用户输入

用户的提示词可能包含他们的需求描述和/或指向技能、工具或 MCP 服务的 URL。提取两者。

URL 类型格式获取方式
GitHub SKILL.mdgithub.com/.../SKILL.md转换为 raw.githubusercontent.com/...。探索上级目录以查找同级文件。
GitHub 目录github.com/.../tree/...获取目录列表。查找 SKILL.md、README.md。
skills.sh 列表skills.sh/<name>获取页面中的描述和源代码仓库 URL。打开源链接。
MCP 服务 READMEnpmjs.com、GitHub、PyPI提取服务名称、工具、配置/安装说明。

对于每个 URL:使用 WebFetch 获取内容,识别类型,查找完整的软件包,并提取名称、描述、工具、依赖项和配置。使用 ToolSearch 检查是否已有等效工具——始终优先使用现有工具。

如果没有 URL,则直接开始访谈。

步骤 2:访谈

使用 AskUserQuestion 提供结构化选项,开放式问题则通过直接对话提出。记录问题数量——问题足够后就停止并开始构建。

重要:使用 AskUserQuestion 时,question 字段必须是一个完整、清晰且以问号结尾的问题句。 用户会醒目地看到这段问题文本——这是他们理解你在问什么的主要内容。反例:“触发方式”或“触发类型”。正例:“应如何触发这个 Agent?”选项标签应简短(1–5 个词),具体细节放在说明中。

问题 1——确认理解并确定触发类型:

根据你从初始提示中理解的内容,简要总结你将构建的 Agent:

  • 如果提供了 URL:介绍你获取的信息——名称、描述、功能,并结合任何指示,说明建议构建的 Agent。

如果触发方式尚不明确,则询问用户:

  • Webhook——事件驱动(电子邮件、推送、表单提交)
  • Prompt——用户通过 valet run 或控制台发送消息

问题 2–6——自适应深入了解

积极给出建议:提出更好的方案,指出可自动化的手动步骤,并提醒明显的边界情况。如果通过 1–3 个问题已清楚了解用户意图,就提前停止。

你可能需要进一步了解的主题示例:

  • 工具/技能发现(见下文)——如果 URL 已提供工具,则跳过
  • 工作流澄清——决策点、分支逻辑
  • 输出格式——结果发送到哪里/如何发送(Slack 频道、电子邮件、文件等)
  • 边界情况与防护措施——建议考虑可能的故障情况,并询问相关限制
工具发现

当用户提到的功能不在已导入的 URL 中时,请按以下顺序搜索(遵循 Resource Creation Principles):目录(valet connectors catalog)→ 现有组织连接器 → 使用 ToolSearch 搜索本地 MCP 工具 → 使用 WebFetch 搜索 skills.sh → 使用 WebSearch 搜索 PulseMCP/Smithery。如果没有匹配项,Agent 可以使用内置工具,否则该步骤仍需手动完成。

步骤 3:提出计划并确认

完成访谈和工具/技能发现后,先停止并向用户清晰说明计划,再开始构建任何内容。计划应说明将在用户的机器上执行什么、Agent 会自动完成什么,以及用户需要手动完成什么。这样用户可以在开始工作之前调整方向——尤其是在涉及外部设置(API 凭据、第三方配置、云控制台)时,这一点很重要。

按以下格式提出计划:

Here's the plan for your <agent-name> agent:

**What I'll create on your machine:**
- A project directory with SOUL.md defining the agent's identity and behavior
- [Channel files for <channel-type> triggers, if applicable]
- [Skill files for <connector> usage, if applicable]

**What I'll set up on the Valet platform:**
- The agent itself (registered and deployed in org <org-name>)
- [Org connectors: <list each, noting if from catalog or custom>]
- [Org channels: <list each, noting if from catalog or custom>]
- [Agent-scoped resources, if any: <list with reason they're not org-scoped>]

**What you'll need to do:**
- [Set secrets in your terminal (org-scoped by default): <list each secret and what it's for>]
- [External setup: <specific steps, e.g., "Create a Google Cloud project,
  enable the Gmail API, and generate OAuth credentials — I'll walk you
  through this when we get there">]
- [Any other manual steps the user must perform]

[If external setup is complex, call it out explicitly: "The <service>
integration requires some setup on your end — <brief description of
what's involved>. If that feels like too much, we could <alternative
approach> instead."]

Want to proceed with this plan, or would you like to adjust anything?

计划指南:

  • 明确说明用户需要完成的事项。 不要只说“设置 API 凭据”,而要说明“在 api.slack.com 创建 Slack 应用,添加 chat:write 范围,将应用安装到你的工作区,并复制 Bot User OAuth Token”。用户需要知道自己要注册或配置什么。
  • 如实说明复杂性。 如果集成需要操作云控制台、设置 OAuth、在第三方服务上配置 Webhook,或涉及多个外部步骤,请明确说明。用户往往会在此时决定更换方案。
  • 提供可选方案。 如果用户的目标可以通过更简单的方式实现(使用其他服务、减少集成,或采用手动步骤而非自动化),请予以说明。
  • 等待用户明确确认。 在用户表示同意前,不要继续执行步骤 4。如果用户希望修改计划,请修改后再次提出。
步骤 4:生成 Agent
  1. 使用 valet new <agent-name> 搭建项目框架。
  2. 按照下方“编写 SOUL.md”中的指南编写 SOUL.md。
  3. 如果 Agent 使用 Webhook,请编写频道文件。请参阅“编写频道文件”。
  4. 如果 Agent 需要本地流程知识,请在 skills/<name>/SKILL.md 下编写自定义技能。
  5. 填写生成的 valet.yaml 元数据。仅当用户要求使用仪表板或目录工作流时,才添加目录设置字段。
  6. 最后更新生成的 AGENTS.md,确保已知晓所有设置要求。这样可以让已部署版本与后续设置说明保持同步。
  7. 运行验证清单:
    • SOUL.md 存在,且 Purpose 和 Workflow 内容非空
    • Guardrails 同时包含 Always 和 Never 子章节
    • 没有应为 <placeholder> 的硬编码 ID
    • 如果由 Webhook 驱动,频道文件包含 Scope 部分
    • 频道文件包含 Webhook 负载位置说明
    • 所有文件中均不含密钥或 API 密钥
    • AGENTS.md 记录了所有设置步骤,且不包含密钥值
    • valet manifests validate 通过
  8. 引导用户在组织级别(首选)或 Agent 级别设置密钥:
    valet env set SECRET_NAME=<value> --org <org-name>
    
    对于 Agent 应直接读取的非敏感配置(例如区域、基础 URL、团队名称),设置普通变量——部署后,Agent 会通过 $NAME 读取该变量:
    valet env set NAME=<value> --plain --org <org-name>
    
  9. 设置连接器——先检查目录:
    valet connectors catalog
    valet connectors create <entry> --org <org-name>
    
    仅当目录中没有对应条目时,才创建自定义连接器:
    valet connectors create mcp-server <name> --org <org-name> \
      --transport stdio \
      --command <cmd> --args <args> \
      --env KEY={{SECRET_NAME}}
    
  10. 设置频道——对于 Webhook 频道,先检查目录:
valet channels catalog
valet channels create <entry> --org <org-name>

或直接创建:

valet channels create webhook <channel-name> --agent <agent-name>
  1. 创建并部署 Agent,同时附加组织资源:
cd <agent-name>
valet agents create [name] --org <org-name> \
  --attach-connector <connector> \
  --attach-channel <channel>
  1. Agent 存在后,使用 valet exec 在本地验证每条连接器命令:
    valet exec -a <agent-name> SECRET_NAME -- <cmd> <args>
    
    创建命令已执行初始部署。修复所有失败项后,再部署更正后的配置。
  2. 如果验证需要修改源代码,请运行 valet deploy。
  3. 如果 Agent 配置了频道,请运行交互式测试循环。请参阅“常见工作流”下的“交互式测试循环”。
设计边界情况
情况处理方式
只有描述,没有 URL进行标准确认式访谈。
只有 URL,没有描述展示导入的功能,并询问 Agent 应如何使用这些功能。
URL 和描述都有先获取 URL 内容,再基于导入的上下文进行访谈。
URL 无法访问报告错误,并询问用户是否提供其他 URL 或直接粘贴内容。
名称冲突运行 valet agents 进行检查,并请用户选择其他名称。
MCP 服务需要 API 密钥在 SOUL.md 的 Environment Requirements 中说明,并引导用户运行 valet env set。切勿询问实际密钥值。

从当前会话中学习

适用情况:用户说“将此保存为 Agent”“记录此工作流”“从本次会话中学习”或“让这个流程可重复”。

步骤 1:定位会话日志
  1. 将当前工作目录转换为 Claude 项目路径: ~/.claude/projects/-<cwd-with-slashes-replaced-by-dashes>/ 示例:/Users/me/Developer/my-project → ~/.claude/projects/-Users-me-Developer-my-project/
  2. 查找当前活动的会话日志:
    ls -t ~/.claude/projects/-<path>/*.jsonl | head -1
    
第 2 步:解析会话

使用 Read 工具读取 JSONL 文件。每行都是一个 JSON 对象。提取以下内容:

  • 用户提示词:type 为 "user" 且 message.content 是字符串的条目。记录文本(每条最多 500 个字符)。
  • MCP 工具用法:type 为 "assistant" 且 message.content 包含 type: "tool_use" 对象的条目。如果工具的 name 以 mcp__ 开头,则按 __ 拆分以获取服务端和工具名称(例如,mcp__slack__post_message → 服务端:slack,工具:post_message)。
  • 技能调用:name 为 "Skill" 的工具调用——提取 input.skill 作为技能名称。
  • 内置工具:所有其他工具调用名称(Read、Write、Edit、Bash、Glob、Grep 等)。
  • 纠正意见:包含 "no,"、"don't"、"instead"、"actually"、"wrong"、"not that"、"change"、"stop"、"undo"、"revert" 的用户消息——这些表示用户改变了方向。
  • 停止点:遇到 input.skill 与 learn/capture 触发项匹配的 Skill 工具调用时,停止解析。排除之后的所有内容。

对于大型会话(用户提示词超过 20 条):抽取最前面的 3 条和最后面的 3 条用户提示词,以控制上下文规模。

另请检查 ~/.claude/projects/<project-path>/sessions-index.json 中与会话 ID(从 JSONL 文件名推导)匹配的 summary 和 firstPrompt 字段。

如果会话为空(除 learn 触发项外没有用户提示词),请告知用户并停止。

第 3 步:展示分析并进行访谈

展示分析:

Session Analysis:
- Objective: [summary from first prompt or sessions-index]
- User prompts: N messages
- MCP tools used: [server names + tool counts]
- Skills invoked: [names]
- Built-in tools: [names]
- Corrections detected: N

提出澄清问题(会话中已有明确答案的问题可跳过):

  1. 触发方式:应由什么触发此 Agent?根据第一条用户提示词提出初步方案——webhook 还是提示词?
  2. 范围:提取的目标和工具列表是否涵盖了完整范围?是否应缩小或扩大范围?
  3. 纠正意见:列出检测到的每条纠正意见,并询问 Agent 是否应始终遵循修正后的做法。
  4. 名称:提出一个 kebab-case 名称(少于 64 个字符),让用户确认。
第 4 步:展示计划并确认

遵循“设计新 Agent”第 3 步中的相同确认流程。说明将创建哪些内容、将设置哪些平台资源,以及用户需要做什么。等待确认。

第 5 步:生成 Agent

遵循“设计新 Agent”(上文第 4 步)中的相同生成流程,但以会话内容为来源:

  • 用途:根据用户提示词、纠正意见和访谈细化内容确定
  • 工作流阶段:根据工具调用的时间顺序,按逻辑用途分组(例如,“数据收集”“分析”“发布结果”)
  • 始终遵守的护栏:根据成功的会话模式和用户偏好确定
  • 绝不遵守的护栏:根据纠正意见、已观察到的错误和领域规范确定
  • 将特定于会话的值替换为 <placeholder>
  • 将问答交流概括为指导原则(例如,“如果有歧义,优先选择 X”)
  • 最后一步:在项目根目录中写入 AGENTS.md(参见“编写 AGENTS.md”)
边缘情况
情况处理方式
会话为空告知用户:“此会话为空——没有内容可供记录。”停止。
未使用 MCP 工具跳过连接器创建。Agent 仅使用内置工具。
长会话(条目超过 500 条)抽取最前面的 3 条和最后面的 3 条用户提示词。按频率汇总工具用法。
纠正意见较多逐条列出。让用户决定将哪些内容纳入护栏。

编写 SOUL.md

SOUL.md 定义 Agent 的身份和行为。它是唯一必需的文件。

模板
# <Agent Title>

## Purpose

<2-3 sentences: what this agent does and why. Name the specific tools, inputs, and outputs.>

## Personality

<3-4 traits matching the agent's domain. Skip for simple utility agents.>

- **<Trait>**: <Description>

## Workflow

### Phase 1: <Phase Name>

1. <Concrete step referencing specific tool names>
2. <Next step>

### Phase 2: <Phase Name>

1. <Steps>

## Guardrails

### Always
- <Positive constraint>

### Never
- <Negative constraint>
可选章节

按需添加:目标渠道、环境要求、Webhook 范围规则、使用的技能、MEMORY.md 格式。

综合规则
  • 目的:明确说明做什么以及为什么。列出输入、输出和工具。好的示例:“监控 YouTube 频道 X 的新剧集,下载文字稿,并将摘要发布到 Slack 的 #channel。”不好的示例:“处理数据。”
  • 工作流:使用实际工具名称列出具体的编号步骤。按逻辑目的分阶段归类。
  • 始终遵守的护栏:根据 Agent 必须始终遵循的正向模式制定。
  • 绝不违反的护栏:根据必须避免的纠正事项和限制制定。
  • 占位符:将用户专属的值(ID、URL、密钥)替换为 <placeholder-name>。
SOUL.md 中的命令连接器引用

当 Agent 使用命令连接器时,SOUL.md 工作流必须将连接器名称作为命令引用,而不是 npm 包名称、底层传输方式或 npx 调用。连接器名称是 Agent 输入的 CLI 命令,也是 Agent 的 PATH 中唯一的名称。

好的示例:Run agentmail inboxes list to verify the CLI is connected. 不好的示例:Run npx agentmail-cli inboxes list 或 Run agentmail-cli inboxes list

使用错误的名称可能会绕过密钥注入(直接调用 npx),也可能导致命令彻底失败(找不到命令)。创建连接器时,务必使用 CLI 命令为其命名(请参阅 Connectors 部分中的命名规则)。

常见错误
  • 目的为空泛或含糊——务必列出具体的输入、工具和输出
  • 缺少工作流——只有目的而没有步骤,会让 Agent 不知所措
  • 将应设为 <placeholder> 的值硬编码
  • Webhook Agent 未设定范围边界(请参阅 Writing Channel Files)
  • 命令连接器使用了错误的命令名称——连接器必须以 CLI 命令命名(例如,agentmail 而不是 agentmail-cli),且 SOUL.md 必须引用相同名称

编写 Channel 文件

Channel 文件会告知 Agent 收到消息时该怎么做。这些文件是直接写给 Agent 的指令,使用祈使句。

Webhook 负载位置(关键)

JSON Webhook 负载会以内联形式追加在用户消息中的 Channel 文件后。每个 Channel 文件必须以以下内容开头:

The JSON webhook payload is appended directly after these instructions
in the user message. Parse it inline — do not fetch, list, or search
for the payload elsewhere. Do NOT use tools to read the payload.

否则,Agent 会浪费多个回合,通过工具调用搜索负载。

结构
  1. 负载位置——上述指令
  2. 发生了什么——描述事件
  3. 要提取的内容——指出用于识别交易的负载字段(ID、引用)
  4. 范围边界——所有操作都必须限定在这些标识符的范围内
  5. 要执行的操作——逐步说明处理指令
示例
# New Email Received

The JSON webhook payload is appended directly after these instructions
in the user message. Parse it inline — do not fetch, list, or search
for the payload elsewhere. Do NOT use tools to read the payload.

You received a webhook for a single new email.

## Scope

Extract the `thread_id` from the payload. All actions are scoped to
this thread. Do not list, read, or act on any other threads.

## Steps

1. Extract `thread_id`, `from_`, `subject`, and `text` from the payload.
2. [... task-specific steps ...]
在 SOUL.md 中强化范围要求

对于由 Webhook 驱动的 Agent,在 SOUL.md 中添加:

## Webhook Scope Rule

When you receive a webhook, your scope of work is defined by the
identifiers in the payload. Use any tools to fully understand and act
on that specific content, but do not act on unrelated content.

编写 valet.yaml

valet.yaml 是独立 Agent、网站和应用的可选项目元数据。valet new 会为新 Agent 项目创建占位文件。发布到 Valet 目录的 Agent 必须提供完整清单。

项目包含清单时,请及时更新其元数据头部:

name: <resource-name>
display_name: <Human-Readable Name>
description: <One sentence on what this is and who it is for>

当仅凭名称不足以识别资源时,这些字段可用于标识资源。像 webinar-slides-20260810 这样的 DNS 名称无法告诉读者任何信息,因此应填写面向用户的 display_name,以及帮助他人决定是否打开资源的 description。Deploy 会读取该文件,并将这两项信息写入资源。

Agent 还需要 category——一个小写单词(finance、research、developer-tools),用于仪表板的预览卡片。网站和应用没有预览卡片,因此不必填写。

对于独立资源,头部以下的所有内容均为可选项。connectors、channels、story 和 example 会驱动仪表板设置流程。用户要求提供部署按钮、仪表板设置、一键设置或目录发布时,再添加这些内容。发布到目录的 Agent 必须填写下文所述的完整 story 和依赖项字段。

网站和应用只需填写头部,不需要其他内容。在任一类型中添加 connectors 或 channels 块都会在部署时被拒绝:网站没有运行时,而应用运行 Procfile 进程,因此两者都无法使用这些内容。

保持清单为最新状态。 资源用途发生变化时,应在同一次修改中更新 display_name 和 description。过时的描述会一直存在,即使它描述的内容已不复存在;下一次部署就会将其发布。

仅适用于目录项目

清单仅支持 Valet 目录中已有的连接器和频道。自定义连接器和频道无法在 valet.yaml 中表示——仪表板设置流程会查找每个 catalog 值,如果对应条目不存在,就会失败。

编写 valet.yaml 之前,运行 valet connectors catalog 和 valet channels catalog,检查 Agent 使用的连接器和频道是否已收录在目录中。

  • 目录资源与自定义资源混用:仅将目录项目写入 valet.yaml。在 AGENTS.md 中记录自定义资源及其 CLI 设置说明。用户可通过仪表板流程配置目录资源,之后再使用 CLI 手动创建自定义资源。
  • 仅使用自定义资源:仍需编写 valet.yaml,包含四个必需的顶层字段,并省略 connectors 和 channels 数组。仪表板会使用这些元数据显示 Agent 的名称、描述和类别。
  • 目录中缺少条目:如果某个连接器或频道应该收录在目录中但目前没有,请引导用户发送邮件至 [email protected] 申请添加。
模板
name: <agent-name>
display_name: <Human-Readable Name>
description: >-
  <What the agent does — shown in the dashboard
  during setup>
category: <category>
connectors:
  - catalog: <catalog-entry-name>
    description: >-
      <Agent-specific context for this connector>
    slot_descriptions:
      <SLOT_NAME>: <Label shown in the setup flow>
channels:
  - catalog: <catalog-entry-name>
    description: >-
      <Agent-specific context for this channel>
    events:
      - <event_type>
    slot_descriptions:
      <SLOT_NAME>: <Label shown in the setup flow>
规则
  • name 必须与 valet agents create 中使用的 Agent 名称一致。
  • catalog 值必须来自目录。 运行 valet connectors catalog 和 valet channels catalog 进行验证。仅包含目录中已有的连接器和频道——从 yaml 中省略自定义项目,改在 AGENTS.md 中记录。
  • slot_descriptions 的键必须与目录条目中的 slot 名称一致。 运行 valet connectors catalog get <name> 或 valet channels catalog get <name>,以查找 slot 名称。
  • description 应为完整句子,适合在仪表板中显示。
  • category 应为描述性类别(例如 development、ops、utilities、developer-tools、testing)。
  • 如果 Agent 没有连接器和频道,则完全省略 connectors 和 channels 数组。
  • 如果目录默认值足够,则省略可选字段(description、events、slot_descriptions)。
验证清单

写入文件后,请验证:

  1. 四个顶层字段均存在且非空
  2. 每个 catalog 值都已通过运行 valet connectors catalog / valet channels catalog 确认存在
  3. 每个 slot_descriptions 键都与目录条目中定义的插槽相匹配
  4. 自定义(非目录)连接器/渠道未写入 yaml,并已记录在 AGENTS.md 中

编写 AGENTS.md

AGENTS.md 是部署前最后写入的项目文件。它位于 Agent 项目根目录,为之后需要部署该 Agent 的人员提供一份便于人和大模型阅读的设置指南。

切勿在 AGENTS.md 中包含机密值、API 密钥或令牌。 只说明需要什么以及原因。

模板
This folder contains the source for a Skilled Agent originally built for the Valet runtime. Changes should follow the Skilled Agent open standard.

## Setup

### Connectors

- **<connector-name>**: <plain-English description of what it provides and why the agent needs it>
  [Repeat for each connector]

### Channels

- **<channel-name>** (<channel-type>): <what triggers this channel and what the agent does when it fires>
  [Repeat for each channel]

### Secrets

- **<SECRET_NAME>**: <what this secret is for, where to obtain it, and any scopes or permissions required>
  [Repeat for each secret]

### External Setup

[If the agent requires any configuration outside of Valet — third-party service setup, OAuth apps, cloud console steps, DNS records, etc. — describe each step here in plain English. Be specific enough that a person unfamiliar with the project can follow along.]
规则
  • 使用简洁的英语写作——将需求描述为名词,并说明原因,而不是写 CLI 命令
  • 明确说明机密信息——包括所需的作用域/权限及其获取途径
  • 包含外部设置步骤(OAuth 应用、云控制台、Webhook 注册等)
  • 省略不适用的部分。最后编写此文件。

编写 Agent 故事(valet.yaml)

发布到 Valet 目录的 Agent 会附带一个 valet.yaml 清单文件。Valet 控制面板会读取它,以呈现友好的 agents/new 配置向导。独立 Agent(仅通过 valet agents create 部署、未发布到目录的 Agent)不需要此文件。

编写 valet.yaml 时,请填写以下四项:

  1. 顶层元数据——name、display_name、description、category。
  2. story 块——由插槽驱动的叙述文案。
  3. connectors[] 和 channels[]——依赖项及各 Agent 的 UI 覆盖设置。
  4. 目录引用(catalog:)必须与现有的 Valet 目录条目匹配——否则向导无法解析图标或品牌文案。
story 块

故事由三个步骤组成,依次回答:触发条件是什么、 Agent 会做什么、结果是什么。每个字段都有 valet manifests validate 强制执行的长度上限。请勿超出。

story:
  hero: "Let's get AskADev answering questions for your team."
  subheadline: "Watches one Slack channel. Searches GitHub. Replies in-thread."
  steps:
    - role: trigger
      title: "Your team asks a question in Slack."
      body: "Someone posts 'where do we handle the Stripe webhook retry logic?'"
      catalog: slack-webhook
    - role: action
      title: "AskADev reads your code."
      body: "Searches the repo. Finds the handler and surrounding comments."
      catalog: github
    - role: outcome
      title: "And answers — with sources."
      body: "Replies in-thread, linking to the exact file, line, and commit."
      catalog: slack-mcp

角色约定: 顺序必须严格为三个步骤:trigger、action、 outcome。不得包含其他内容。

步骤上的 catalog:: 可选。设置后,必须与此清单的某个 connectors 或 channels 中声明的 catalog: 相匹配。向导会将该服务的图标渲染为步骤标记。 留空则会渲染 Agent 字母标识(适用于没有外部服务的中间“Agent 思考”步骤)。

根据 SOUL.md 起草文案

不要从零编写文案——应以 Agent 的 SOUL.md 为依据。Purpose 和 Workflow 部分已经用文字描述了 Agent 的触发条件、操作和结果;你的工作是将这些文字 提炼成由槽位驱动的格式。

按以下顺序操作(从上到下对应用户在向导中看到的顺序):

  1. 提取三个要点。 打开 SOUL.md。Purpose 句子会说明触发条件、操作和结果——通常按此顺序排列。如果 Purpose 表述模糊,则参考 Workflow 阶段:Phase 1 → 触发条件,Phase 2 → 操作,Phase 3 → 结果。
  2. 找出亮点。 是什么让这个 Agent 与众不同?具体时间(“早上 8 点到来时”)、具体地点(“发布到 #ai-news”),或具体限制(“只有在你批准后”)。记下这个亮点——它是主标题和副标题的锚点,也常常会成为结果正文。
  3. 先起草触发条件、操作和结果步骤。 具体细节比主标题更容易写。遵循下面的语气规则。长度尽量达到下表中的理想范围。
  4. 接着编写结果 done_note。 每条都很短——一行即可。可从第 3 步的内容中提炼出来。
  5. 编写副标题。 用一个具体的句子点明服务和收益。副标题是主标题下方的“电梯演讲”。
  6. 最后编写主标题。 主标题是最精炼、最能体现品牌特色的一句话。在编写步骤后再写主标题,你就有了可供精简的素材。
  7. 运行 valet manifests validate。 这是必须执行的。仪表板会在渲染时拒绝无效的清单。
  8. 大声读出来。 每一行都应听起来像是人可以自然读出来的话。如果读起来像营销页面,就重写。
长度目标(好看的标准,而不只是能通过验证)

上限是 valet manifests validate 强制执行的硬性限制。理想范围才是内容在向导中实际呈现良好的长度——以此为目标,而不是上限。

字段理想范围硬性上限过短过长
hero45–75 个字符80空洞、泛泛而谈在较窄视口中换行不自然
subheadline110–170 个字符200像口号,不像说明内容拥挤,一眼难以读懂
step title25–50 个字符60缺乏吸引力换成两行,打乱节奏
step body80–130 个字符140像是在凑字数标题下方显得过于密集
ui headline30–55 个字符—泛泛而谈(“连接 GitHub”)重复步骤标题
ui blurb80–140 个字符—缺少 Agent 的独特角度像目录描述
ui done_note20–45 个字符—没有具体的“已生效”信号适合放在状态页面

长度上限 > 理想范围:采用理想范围。只有在额外字符承载真实信息时(如频道名称、具体时间、命名产物),才接近上限。绝不要凑字数。

语气与风格

始终:

  • 使用现在时和主动语态。“发布简报”,而不是 “将发布简报” 或 “简报已发布”。
  • 至少在首屏文案中点出 Agent 的名称。用户是第一次认识它。
  • 写出具体事物:服务(Slack、GitHub)、产物(#ai-news、拉取请求)、时间(早上 8 点、每周五)。不要写 “消息平台” 或 “按计划”。
  • 当一个想法有两个节奏点时,使用长破折号(—)。向导字体对它的呈现效果很好。
  • 用 “你” 称呼读者。“你的团队提出问题”、“你粘贴一条消息”。不要用 “用户”。

绝不:

  • 使用行话:无缝、利用、赋能、智能、 尖端、简化流程、解锁、强大、稳健。
  • 描述操作步骤时使用被动语态。“AskADev 读取你的 代码”——不要写 “你的代码由 AskADev 读取”。
  • 结果明了时,不要描述实现机制。*“通过 OAuth 验证”是在描述机制;“使用 OAuth——无需 API 令牌”是在描述结果。“解析有效负载”是在描述机制;“读取 PR”*是在描述结果。
  • 写出换成其他 Agent 也同样适用的文案。如果把 AskADev 换成 Code Reviewer,句子依然通顺,那文案就太泛泛了——要加上特色。
  • 不要使用表情符号,除非这符合 Agent 的个性,并且你已在不同视口上充分测试。
语气规则(按字段)

以下规则优先于其他任何指导。它们针对向导对各字段的呈现方式进行了优化。

  • 首屏文案使用祈使语气或现在时陈述句,并点出 Agent 名称。 写 “让 AskADev 开始为你的团队解答问题吧。”—— 不要写 “AskADev 是一个能回答代码问题的 AI Agent”。
  • 副标题用一个具体句子点出服务和用户能获得的好处。不要列举,也不要用分号。
  • 触发标题以用户行为或频道事件开头: “你的团队提出问题……”、“有人创建了 PR。”、“早上 8 点到了。”
  • 操作标题使用主动语态,并点出 Agent 名称: “AskADev 读取你的代码。”
  • 结果标题点出用户能看到的具体产物: “在讨论串中回复,并附上文件链接。”
好与坏示例
字段❌ 不好✅ 好原因
首屏文案“AskADev 是一个由 AI 驱动的 Slack 助手,能回答代码问题。”“一个会先读取你的代码再回答问题的 Slack 机器人。”不好的示例以类别和行话开头。好的示例先说行为,并点出特色(“回答前”)。
副标题“使用 GitHub MCP 和 Slack MCP,为开发者问题提供智能答复。”“在 Slack 中询问 GitHub 仓库相关问题。AskADev 会研究实际代码和提交历史,然后在讨论串中回复。”不好的示例说的是技术接入。好的示例说清操作和结果。
触发标题“收到 Webhook 事件”“有人创建了 PR。”不好的示例说的是机制。好的示例说清用户实际遇到了什么。
操作标题“差异分析”“Code Reviewer 读取差异内容。”不好的示例只是名词短语。好的示例是包含主语和动词的句子。
结果标题“已提交审查”“行内评论——或者批准。”不好的示例是被动描述机制。好的示例点出了两种具体结果。
步骤正文“Agent 处理收到的 Webhook 有效负载并执行已配置的操作。”“检查正确性、安全性、可维护性和测试覆盖率。上下文重要时会读取完整文件。”不好的示例太泛泛。好的示例列出了具体内容。
界面简介“连接你的 GitHub 账户,让 Agent 访问你的仓库。”“AskADev 回答时会读取你的代码——就像新员工一样。”不好的示例适用于任何 GitHub 连接器。好的示例说明了这个 Agent 如何使用 GitHub。
界面完成提示“已成功连接”“正在 #engineering 中监听”不好的示例只是状态。好的示例说出了用户想要的具体结果。
每个服务的 ui: 块

每个 connectors[] 和 channels[] 条目都可以包含一个 ui: 块,用 Agent 专属文案覆盖通用目录文案:

connectors:
  - catalog: github
    description: "GitHub MCP server for browsing repos and reading files"
    ui:
      headline: "Point AskADev at your repo."
      blurb: "AskADev reads your code when it answers — like a new hire would."
      done_note: "Connected to your repo"

channels:
  - catalog: slack-webhook
    description: "Receives Slack messages and app mentions"
    ui:
      headline: "Let AskADev hear your team in Slack."
      blurb: "We'll add AskADev as a normal Slack app. You pick the channel."
      done_note: "Listening in the channel you invite it to"
  • headline 会替换步骤的默认标题。请写成“动词 + 服务”的祈使句:“让 AskADev 在 Slack 中听取团队的声音。”
  • blurb 是一段摘要,介绍此 Agent如何使用该服务。不要写通用的 Slack/GitHub 说明——那是目录 description 的用途。
  • done_note 是服务连接后,在部署屏幕上显示的一行摘要。请描述用户部署后会看到的内容:“正在 #engineering 中监听”、“已连接到 valetdotdev/ark”。

**ui: 中不要填写的内容:**权限、限制、安全提示标签、“原因”、动词、分钟数。这些是由 Valet 团队填写的目录字段——不要为每个 Agent 重复填写。

保持 valet.yaml 和 README.md 同步

Agent 的 README.md 标语(项目标题下的一句话)和 valet.yaml 中的 subheadline 是同一段营销文案,只是显示在 GitHub 和控制面板向导这两个不同位置。两者必须逐字一致。更新其中一处时,也要在同一次提交中更新另一处。

README.md 项目标题和 display_name 也要保持一致:两者应完全相同。从 GitHub 跳转到向导的用户,应在两个位置看到相同的名称和宣传语——内容不一致最容易让人觉得 Agent 无人维护。


# Deep Researcher

Every morning, Deep Researcher scans the AI news landscape,
summarizes the 5 most important stories, and posts the briefing
to #ai-news.
# valet.yaml
display_name: Deep Researcher
story:
  subheadline: "Every morning, Deep Researcher scans the AI news landscape, summarizes the 5 most important stories, and posts the briefing to #ai-news."
验证

编写或编辑 valet.yaml 后,务必进行验证:

valet manifests validate

也可以指定明确的路径:

valet manifests validate path/to/valet.yaml

valet manifests validate 会检查长度上限、3 步契约以及步骤目录引用规则。如果验证失败,请先修复报告的错误再部署——控制面板向导会拒绝无效的清单。

Agent 项目结构

my-agent/
  AGENTS.md            # Setup guide for future developers (required)
  CLAUDE.md            # Points Claude Code at AGENTS.md
  SOUL.md              # Agent identity and behavior (required)
  valet.yaml           # From valet new; required for catalog publication
  channels/            # Channel files (for webhook/trigger-driven agents)
    <channel-name>.md
  skills/              # Agent-scoped skill documentation (optional)
    <connector-name>/
      SKILL.md
  .valet/
    config.json        # Auto-managed by CLI

所有已部署的文件在运行时均为只读。Agent 可以写入新文件(例如 MEMORY.md),但这些写入的文件不会在重新部署后保留。

执行指南

  • 使用适合操作系统的终端工具运行命令。
  • 说明清楚:运行任何 valet 命令前,先简要告知用户你要做什么,以及为什么要这么做。不要默默执行命令——用户应始终了解每个步骤的目的。
  • 安装注意事项:严格遵循“安装”部分。新安装时使用官方直接安装程序,已有安装则使用 valet update。如果任一操作失败,请停止,不要下载原始二进制文件或从源代码构建。
  • 访问账户前先进行身份验证:运行会读取或写入账户状态的命令前,先运行 valet auth whoami。如果用户已退出登录,说明为什么需要登录,并启动 valet auth login。退出登录时,仍可使用本地版本、帮助和离线清单验证命令。
  • 主动使用 valet help:遇到不确定的命令、标志或功能时,先运行 valet help <command>,不要猜测。CLI 帮助是权威信息来源。
  • 绝不要在 LLM 会话中询问机密值。 引导用户在自己的终端中运行 valet env set NAME=VALUE,并等待确认。普通环境变量(valet env set NAME=VALUE --plain)不是凭据,可以直接设置。
  • 使用 valet exec 验证特权命令。 Agent 创建后,使用 valet exec <names> -- <command> 测试每条底层命令。这是本地运行 Valet 管理的机密信息的唯一方式。在最终部署和端到端测试前修复所有失败。只有当工具要求在参数中提供机密信息时,才使用 {{SECRET_NAME}}。
  • 用户要求从零创建 Agent 时,遵循“设计新 Agent”。
  • 用户要求将当前会话记录为 Agent 时,遵循“从当前会话中学习”。
  • 编写 SOUL.md 时,遵循模板和综合规则。Purpose 和 Workflow 绝不能留空。
  • 为通过目录发布的 Agent 编写 valet.yaml 时,遵循“撰写 Agent 故事”。每次编辑后运行 valet manifests validate——长度上限和 3 步角色顺序不可妥协。
  • 对于破坏性命令(destroy、remove、revoke),务必先向用户确认。
  • 创建 webhook 渠道时,报告 webhook URL 和托管机密名称。不要重复原始签名机密。编写渠道文件时,加入负载位置说明。
  • 首次部署带有渠道的 Agent 后,运行交互式测试循环。
  • 如果命令失败,请阅读错误并排查问题。常见问题包括:未登录、缺少 SOUL.md、未关联或 Agent 崩溃。如果安装程序或更新程序报错,请停止操作,让用户手动处理。

设置

[如果 Agent 需要在 Valet 之外进行任何配置,例如设置第三方服务、OAuth 应用、云控制台步骤、DNS 记录等,请在此处用通俗易懂的语言逐项说明。请提供足够具体的步骤,让不熟悉此项目的人也能照着完成。]

评论

支持 Markdown