mcpField
W
webly

webly

github.com/webly-ai云与 DevOps294 次安装2 天前更新
代码仓库

关于 webly

Webly 是供 Agent 发布网站或分享文件的技能及辅助命令行工具。无需账户即可匿名发布;登录用户可通过 Webly 的 MCP 工具管理网站,包括草稿、回滚、自定义域名、表单和分析。

主要功能

  1. 01使用辅助命令行部署和更新网站
  2. 02无需账户即可匿名发布
  3. 03将项目文件夹关联到网站
  4. 04通过 MCP 工具管理登录账户的网站
  5. 05通过临时链接分享文件

适用场景

  1. 01发布小型静态网站
  2. 02更新与项目文件夹关联的网站
  3. 03通过 MCP 管理已认领的网站
  4. 04分享视频、文档或数据集

MCP 相关

Webly 的 MCP 工具供登录用户管理网站,包括编辑和部署流程。该技能会先检查工具是否已配置并加载,再选择 MCP 或命令行操作。

安装

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

$npx skills add https://github.com/webly-ai/webly-plugin --skill webly

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

附带文件scripts/webly.mjs

详细介绍

Webly

Webly 托管 Agent 发布的网站以及共享文件和文件夹。无需账户,只需一条命令即可发布网站;网站上线 24 小时,并可在 7 天内认领。同一台机器也可以共享文件(链接数量不限,总大小不超过 500 MiB,包含网站;每个链接有效 24 小时),同时保留网站。用户登录后(通过 MCP 使用 OAuth),网站就归其所有:永久有效,可通过 Webly 的 MCP 工具编辑,并支持草稿、质量门禁、回滚、自定义域名、表单和分析。

{api}/llms.txt 是完整的接口规范,其中 {api} 是 webly.mjs doctor 报告的 api(除非设置了 WEBLY_API_URL,否则为 https://api.webly.ai)。在构建框架(React)网站、表单或域名之前,在修改已使用 CMS 或托管博客的网站之前,以及在告知用户某项功能不受支持之前,请先阅读。如果此文件与实时 API 不一致,以 API 为准。

负责执行所有确定性步骤的辅助工具是此技能文件夹中的 scripts/webly.mjs(零依赖,Node 20+)。下文中,webly 指 node <this skill's folder>/scripts/webly.mjs。

语言

使用用户的语言回复。URL、命令、工具名称和错误原因必须与返回内容完全一致。

步骤 0:了解当前情况(每次都先执行)

新会话、/clear 或重启都会清除对话,因此所有状态都保存在磁盘和 API 上。开始任何操作前,先重新获取这些状态:

  1. 运行 webly doctor。此命令只读,绝不会创建令牌。它会报告:
    • credential:如果此机器上保存了匿名令牌,则为 present。
    • site:该网站的 status、urls、liveUntil、claimUntil 和 next(API 表示当前允许执行的操作)。
    • mcp:Webly MCP 服务是否已为 Claude Code(via: plugin | user | project)和 Codex 配置。
    • project:当前文件夹中的项目关联的网站(.webly/project.json,参见关联文件夹);如果无法读取该文件,则为 error。
    • signedIn:如果 webly login 为此 API 保存了登录信息,则为 true。
    • pending:之前的会话要求你完成的步骤,例如 claim。
    • updatedFrom:在此技能更新后的首次运行时设置。用一行告诉用户当前使用的版本。
    • update:发布了此技能的更新版本时设置。运行其中的 command(与此副本的安装方式相对应),用一行告知用户,然后继续使用此副本执行任务。新版本会在下一个会话中加载。
  2. 检查自己的工具列表,查找 Webly MCP 工具:list_websites、whoami、 create_claim_code,这些工具位于 webly 服务下(在 Claude Code 中,名称为 mcp__webly__…,或来自插件时为 mcp__plugin_webly_webly__…)。已配置但未出现在工具列表中的服务尚未加载。 在判定工具缺失之前,请先通过工具搜索解析延迟加载的工具。 已加载工具不一定意味着已使用 OAuth:API 密钥连接可以管理网站,但不会提供 create_claim_code(只有已登录的用户才能认领)。
  3. 优先使用文件夹的关联网站。 如果 project.sites 指定了网站,该网站就是此项目要更新的网站:请在该网站上操作;除非用户要求创建新网站,否则不要为此文件夹创建或认领其他网站。如果这是此机器上的匿名网站,则使用 webly deploy 更新。如果不是,它属于某个账户:通过 MCP 更新(通过 MCP 操作)。
  4. 选择对应的行并按其操作: | # | 已保存 Token | 已加载 Webly MCP 工具 | 适用情况 | 操作 | |---|---|---|---|---| | 1 | 否 | 否 | 刚开始使用 Webly,或工具尚未加载 | 如果 mcp 显示 Webly 已配置,或 signedIn 为 true,说明他们有账户:不要匿名发布。配置了 Webly MCP 时,请他们开始新会话(或输入 /reload-plugins),以加载工具。如果只有 signedIn(没有可加载的 Webly MCP),不要等待重新加载:通过辅助工具以他们的身份操作:使用 webly api GET /websites 查找此项目的网站(或使用 webly api POST /websites --data '{"name":"…","kind":"static"}' 创建一个),然后运行 webly link <websiteId>、webly api POST /websites/<websiteId>/deploy/tickets,再运行 webly deploy <folder> --ticket <ticket>。例外:如果已保存的登录信息不再有效(webly api 提示已过期或已撤销),不要让他们等待:匿名发布,提供链接,然后再提出登录并将网站认领到其账户中。否则,匿名发布(见下文);只有在他们想保留网站时,才设置 MCP。 | | 2 | 是 | 否 | 之前发布过;从未设置 MCP 或 MCP 未加载 | 查看 site.next。只要其中列出 update,就继续使用 webly deploy 发布。如果其中只列出 claim,或对方想保留网站,则运行保留网站。 | | 3 | 否 | 是 | 已登录 | 使用通过 MCP 操作。他们匿名部署的任何内容都已认领。 | | 4 | 是 | 是 | 已连接,但仍有网站未认领 | 先调用 list_websites。如果此文件夹已关联到其他网站,或账户中已有此项目的网站(名称或文件夹相同),不要认领:告知对方,并在该网站上操作;只有对方提出要求时,才认领匿名副本。否则,认领该网站:保留网站,第 5 步。切勿自行读取 credentialFile。认领后,继续通过 MCP 操作。 |

是否有账户。 只有在有证据表明对方拥有 Webly 账户时才登录: 已加载或配置 Webly MCP 工具、signedIn、此文件夹已关联到某个账户中的网站、Webly 的 /connect 答复表明提示词来自已登录的控制面板(其连接码验证通过),或对方明确告知你。设置提示中的措辞绝不是证据,“发布这个”或“用 Webly 部署”也不是证据:没有证据时,匿名发布,并提出等网站上线后再保留网站。已过期的已保存登录信息也是证据,但不必让他们等待:先发布,然后提出登录并认领(认领会将网站转移到其账户中)。

如果对方要求连接、登录或使用其 Webly 账户,说明他们已经有账户:无论属于哪一行,都转到保留网站。如果已保存 Token,就全部运行。如果没有 Token,就没有可认领的内容:运行第 1 步,然后在工具已加载时运行第 4 步;如果工具尚未加载,请对方输入 /reload-plugins(Claude Code)或开始新会话,因为登录需要 MCP 工具。不要替他们匿名发布。

如果 pending 为 claim 且认领工具可用,现在就完成认领(第 4 行,包括其中的 list_websites 检查),无需再次询问:对方在重启前已经提出过要求。如果 pending 为 claim 且认领工具不可用,则转到保留网站,第 2 步。

无需账号即可发布

  1. 将网站放在一个文件夹中,例如 ./site,并在根目录中放置 index.html。 纯 HTML、CSS 和 JS 最适合在这里使用。限制:25 个文件,每个文件 1 MiB,总计 5 MiB;隐藏文件和 node_modules 会被跳过。对于更大的网站或 React 网站,请先登录(保留网站),然后通过 MCP 构建。 为每个 HTML 页面在 <head> 中添加分享预览标签,让链接能在 Slack、iMessage 和 X 中展开:<title>、<meta name="description">、og:title、og:description、og:image(指向网站中一张 1200×630 图片的绝对 URL,例如 /og.png;首次部署后才能知道 URL,因此请届时设置并再次部署)、twitter:card = summary_large_image,以及网站图标(<link rel="icon">)。
  2. 运行 webly deploy ./site(单个 .html 文件也可以)。首次运行时会创建网站,之后会更新同一个网站,使用相同的 URL。它会等待构建完成并输出网站 JSON。若项目文件夹中的 package.json 包含 build 脚本(Vite、Astro、CRA 等),则会先进行构建,再部署其输出文件夹(dist、build、out 等),因此 webly deploy . 也能正常使用。网站名称取自 package.json 中的 name 或项目文件夹名;如需指定名称,请传入 --name "…"。如果名称没有实际意义,例如 dist,首次部署会停止并要求提供名称:询问对方项目叫什么,并说明这只是其控制面板和认领页面上的标签,不是网址(网址会自动分配)。匿名部署会自动上线(JSON 中的 live 行会显示这一点):无需单独发布,因此不要询问对方是否要发布。
  3. 若要在最初的 24 小时内更换网站并使用新 URL 重新开始: webly replace ./site。仅在对方要求创建新网站时执行;旧网站会下线。

对方要求你发布、托管或部署,即表示已批准:匿名网站上线后会立即公开。

已关联的文件夹

首次从项目进行部署时,会在项目根目录(最近的一个包含 package.json 或 .git 的文件夹,不会位于 dist/ 内)写入 .webly/project.json:

{ "sites": { "default": { "websiteId": "ws_…", "name": "…", "url": "https://….webly.site/" } } }

其中不包含机密信息(令牌保存在 ~/.webly);请告知对方提交此文件,以便每个克隆都部署到同一网站。重新部署已关联的文件夹会更新该网站,而不会创建新网站。遇到以下情况时,webly deploy 会停止发布并说明原因:

  • 已关联的网站不是此机器上的匿名网站(该网站已被认领,或关联来自他人)。使用部署票据更新:调用 begin_deploy 并传入网站 ID,然后运行 webly deploy <folder> --ticket <ticket>(通过 MCP 操作)。如果 begin_deploy 返回 404(分叉项目、其他账户或已删除的网站),请询问对方是否要创建新网站;切勿自行创建。
  • **文件夹尚未关联,且此机器已连接到账户。**调用 list_websites。如果有网站名称与项目匹配,请询问“要更新 X,还是创建新网站?”(默认:更新),切勿自行从相似名称中作出选择。然后运行 webly link <websiteId>。若要创建新网站,则调用 create_website 并关联该网站。--anonymous 无论如何都会发布一个临时匿名网站;仅在对方提出要求时使用。它绝不会覆盖此机器上现有的匿名网站。webly replace <folder> --anonymous 会丢弃该网站并使用新的 URL:运行前,请说出已有网站及其 URL,说明替换会使其下线,并取得对方明确同意。询问是否要再创建一个匿名网站不算明确同意。
  • 自此机器上次部署后,网站已发生更改(有人在控制面板中或从另一个克隆编辑了网站):部署仍会继续,结果中会包含 replaced(源版本和目标版本)。请告知对方,先前的版本已被替换,但可以回滚。

同一项目的第二个网站(例如暂存网站或客户副本)会作为额外条目:调用 create_website,然后运行 webly link <websiteId> --as staging;--to staging 可选择该网站。未登录账户时,一台机器只有一个匿名网站,因此额外条目需要登录。如果文件丢失,请以同样方式重新关联:调用 list_websites,与对方确认,然后运行 webly link。助手无法读取的文件绝不会被覆盖:请修复或删除该文件。

分享文件(不创建网站)

当对方想要发送或分享文件(视频、PDF、数据集、照片),而不是发布网站时:

  1. 如果文件不止一个,请询问他们想要每个文件一个链接 还是一个文件夹链接(一个列出所有文件的页面,提供 Download all 下载为 .zip)。无论哪种方式,都会返回两者;你只需选择显示哪一种。
  2. 无需账户:webly upload <file|folder>… [--folder name]。它会打印 每个文件的链接、folderUrl 和 zipUrl。--folder 名称会附加一个随机后缀(demobowling-3f9a2c1b5e7d90a1c2b4),因此无法猜出链接:请分享打印出的链接,切勿使用根据名称自行构造的链接。文件夹会保留其子文件夹和隐藏文件(src/main.cpp、.gitignore);只有 .DS_Store 会被排除。超过 500 个文件时,会将它们上传为一个 zip 压缩包,并作为文件夹提供。每次运行都会创建一个有独立链接的新文件夹,因此链接数量没有限制:每台机器的总存储空间上限为 500 MiB,包括网站占用的空间(status 会显示 storage.usedBytes 和 limitBytes),每个文件上限为 100 MiB。无论这台机器是否已有网站,都可以分享文件,且不会影响现有网站。链接有效期为 24 小时,且必须在这 24 小时内认领(选择 Keep the site,即可将网站和文件一并保留),否则文件会被删除;之后重新分享会重新开始计算 24 小时。
  3. 已登录(MCP):先调用一次 create_website 并设置 kind: "storage",然后针对每个文件调用 begin_object_upload,传入文件名和准确的字节数;设置 FILE=./path; 后运行每条返回的 command(内联的 FILE=… command 不起作用:shell 会先展开 $FILE),然后调用 finalize_object_upload。为保留文件夹结构,请将每个文件命名为其在文件夹中的路径(src/main.cpp),并包含隐藏文件(.gitignore、.idea/…);切勿将文件夹拍平或省略隐藏文件。文件超过 1000 个时,请再次调用 begin_object_upload,并传入第一次调用返回的 folder。Free 可将文件保留最多 7 天(1 GB,每个文件 100 MB);Hobby 和 Pro 可永久保留文件(分别为 50 / 200 GB,每个文件 2 GB)。 切勿在工具调用中传入文件字节数据。

只有图片、视频、音频、PDF 和纯文本会在浏览器中打开;其他内容都会下载。请告知对方链接何时失效(expiresAt)。

通过 MCP 管理共享文件(仪表板的 Files 页面也有相同功能):

  • list_objects 会列出文件及其 folder 和 folderLabel。
  • rename_object / label_folder 只会更改显示的名称;链接保持不变,因此始终安全。
  • move_object 会将文件移到另一个文件夹(或在不指定文件夹时,为其创建独立链接)。链接会改变,旧链接将失效:先说明这一点,然后分享新的 url。
  • delete_object / delete_folder 会永久删除。请先确认。
  • 密码(Hobby 和 Pro),仅在对方提出要求时设置。set_folder_password(或在 begin_object_upload 中使用 password)会保护文件夹链接、其中的文件、子文件夹和 zip;set_website_password 会保护整个网站的所有地址,包括草稿。Webly 只保存哈希值,因此请将密码和链接一并告知对方;null 会移除密码。遇到 402 plan_required 时,提供 details.upgradeUrl。
  • email_link 会将文件夹或文件的链接(或网站已发布版本或草稿的链接)通过电子邮件发送给最多 10 位收件人,并可附上纯文本消息(Hobby 和 Pro)。Webly 会生成链接;请先与对方确认收件人。对于受密码保护的链接,只有对方希望在邮件中附上密码时,才传入 password。
  • **大型文件夹(超过 500 个文件):将整个文件夹压缩成一个 zip 文件上传。**将文件夹压缩为 zip(zip 中的路径将成为文件夹的路径),然后使用这个单独的文件调用 begin_object_upload 并设置 archive: true,运行其 command,再调用 finalize_object_upload。文件夹链接、子文件夹页面、每个文件的链接和 Download all 都和普通文件夹一样可用,文件会直接从 zip 中提供,无需解压(Download all 下载的就是 zip 文件)。list_objects 会将其显示为一个条目,并包含 archive: { files };list_archive_entries 会列出文件及其链接。归档文件夹为只读:不能再添加文件,也不能逐个重命名、移动或删除其中的文件(请改为删除整个文件夹)。Zip 文件必须使用 stored 或 deflate 条目,且不得加密。
  • 如果上传中断(连接断开,或某个分块反复失败),resume_object_upload 会返回已上传的内容以及仅对应缺失分块的 URL;运行这些分块的命令,然后调用 finalize_object_upload。请在一小时内完成:无活动一小时后,未完成的上传会被清除。
  • list_uploads_in_progress 会显示未完成的上传及其进度;clear_uploads_in_progress 会取消这些上传,以释放正在上传容量限额(Free 1 GB、Hobby 5 GB、Pro 10 GB)。请先征求同意。
  • 反复重新上传同一个文件会受到限制(短时间内 5 次,然后每小时 5 次,触发 429 upload_retries):请恢复上传,而不是重新开始。
  • get_billing 会显示 storage.used(已完成的文件,包括网站资源)和 storage.uploading,以及各自的限额,与控制面板中的进度条类似。

网站资源(网站使用的照片和文件,不属于存储文件):其 url 通过网站提供,路径为 /_webly/img/{assetId};请在页面中使用此路径。delete_asset 会将资源归档(链接仍然有效,且仍计入存储空间);delete_asset 加上 permanent: true 会永久删除资源并释放空间,仍在使用该资源的页面也会失效,因此请先确认。

告知对方的内容

将 URL 单独放在一行,后面不加任何内容,以确保其保持可点击。然后告知 JSON 中的截止时间;如果知道对方所在时区,请使用其时区:

你的网站已上线:

https://anon-….webly.site/

网站会在线保留 24 小时(直到 {liveUntil}),在此期间我可以继续修改。要永久保留网站,请在 {claimUntil} 前登录 Webly 并认领;逾期后网站将被删除。现在要我帮你设置吗?

每个网站只提供一次认领选项,不要在每次编辑后都再次提供。绝不要展示令牌或 ~/.webly/ 的内容。

错误(details.reason)
原因含义操作
site_already_created此令牌已有一个站点webly deploy 会更新该站点;只有在使用新 URL 时才使用 replace
edit_window_closed (410)24 小时已过;站点离线,但仍可认领保留该站点
build_failed (400)替换操作中的新站点构建失败;旧站点未受影响修复文件后重试
network_limit (409)此网络上已有 50 个在线匿名站点等待 details.retryAfterSeconds 指定的时间,或登录
credential_consumed / credential_expired令牌已失效(已被认领,或已超过 7 天)辅助程序已将其删除;下次部署会从头开始
invite_only (503)已关闭匿名发布功能请改为登录
HTTP 429请求受限等待 Retry-After 指定的时间
anonymous_storage_limit (413)已用尽 500 MiB(网站和文件合计)认领(保留该站点)以获取免费账户的 1 GB 空间
HTTP 413超出大小限制精简文件,或登录

保留该站点:登录并认领

当用户想要保留该站点、创建账户或登录,或者 next.actions 仅为 ["claim"] 时,请运行此操作。说明接下来会发生什么:系统会打开一个浏览器页面,用户登录(Google)并批准访问权限,然后该站点会迁移到他们自己的工作区。

  1. 为此主机注册 MCP 服务,并设为用户级别,以便在新会话和其他文件夹中继续使用:
    • Claude Code:webly connect claude(安装 Webly 插件,或回退到 claude mcp add --scope user)。
    • Codex:webly connect codex。
    • 其他主机:按照 https://webly.ai/agent.md 中的第 2 阶段操作。
    • 这里没有浏览器(例如手机或 Muse 这类托管助手):如果应用有自己的连接器页面,让用户在其中添加 https://api.webly.ai/v1/mcp 并通过该页面登录。如果应用只接受 API 密钥:让用户在控制面板中打开 Connect agent 并粘贴其提示词;你打开它的 /connect/<code> 链接,返回内容中会包含你的密钥,且只显示一次:将它保存到安全凭据中,切勿放在聊天中(agent.md,第 3b 阶段)。过期了?把返回的续期链接发给用户。若要在没有浏览器的情况下认领,请运行 webly claim-link(不带 --open),让用户在手机上打开:密钥无法用于认领。 connect 还会记录 pending: claim,因此由第一个加载工具的会话完成认领。其 next 字段会说明下一步操作。
  2. 如果 MCP 工具已可调用,就使用 MCP;否则立即在浏览器中认领。 检查本会话中是否可以调用 Webly 的 create_claim_code 工具(搜索延迟加载的工具)。如果可以,前往第 4 步。如果不可以(首次运行 connect 后通常会如此),不要让用户重新加载或重启。立即运行 webly claim-link --open。它会打开 app.webly.ai/claim,并将令牌放在 URL 片段中(绝不会发送到服务器,也不会打印出来)。请用户登录并点击 Claim website。如果页面显示了错误的 Google 账号,点击 Not you? Use a different account 即可切换。 仅打开页面或登录并不会认领网站。API 密钥无法用于认领;不要重试缺失的工具,也不要替换用户的 MCP 配置。
  3. 确认浏览器认领。 用户表示操作完成后,运行 webly doctor:只有 siteError.reason: credential_consumed 才能确认令牌已被认领(doctor 会移除已用令牌并清除待处理步骤)。如果仍未认领、浏览器已关闭或状态不可用,请保留令牌和待处理步骤,以便用户重试。切勿仅仅因为浏览器已打开就运行 forget。MCP 会在下一个会话中自行加载(Codex:先运行 codex mcp login webly)。到此为止;第 4 至第 5 步是 MCP 路径。
  4. 工具加载后:
    • Claude Code:调用服务端的 authenticate 工具 (mcp__plugin_webly_webly__authenticate 或 mcp__webly__authenticate; 如果该工具延迟加载,请通过工具搜索加载)。它会返回授权 URL。为用户打开该 URL(macOS 上运行 open "<url>",Linux 上运行 xdg-open "<url>",Windows 上运行 start "<url>"),并将 URL 打印出来作为备用方式。回调会自动完成。
    • 其他主机:调用 whoami;401 会启动主机自身的登录流程。
    • 用户首先选择你可以在哪些工作区中操作:All my workspaces(默认选项;告诉用户除非想把你的权限限制在一个工作区,否则请保留此选项),或单个工作区。无论选择哪种方式,你在每个工作区中都只能访问其角色允许的内容。
    • 授权页面提供 webly:content、webly:edit 和 webly:admin,默认选择 webly:admin,创建网站需要此权限。告诉用户保留此选项,除非他们只想让你编辑现有网站(webly:edit)。
  5. **认领:**调用 create_claim_code,然后运行 webly claim <code>。该辅助程序会将代码和已保存的令牌发送给 Webly 本身,因此你无需读取令牌;成功后,它会删除令牌和待处理步骤。告诉用户迁移了哪个网站,并提供打印出的 dashboardUrl。同一用户重试是安全的(alreadyClaimed: true)。代码有效期为 10 分钟;如果已过期,请重新获取(claim_code_invalid)。 认领后:关闭计费,或使用付费方案且有免费名额时,网站会永久保留。使用免费方案且开启计费时,网站处于暂存状态:在原定的 24 小时期限前可以编辑,之后会下线,直到升级方案(402 claim_held)。请说明响应显示的是哪种状态(website.claimHeld);不要承诺网站会永久保留。

通过 MCP 操作(已登录)

先调用 whoami 和 list_websites,然后继续使用现有网站(如果 doctor 显示文件夹已关联网站,就使用该网站),不要再创建第二个网站。在磁盘上的项目中调用 create_website 后,在项目文件夹中运行 webly link <websiteId>,以便后续会话能找到该网站。

工作区。 whoami → workspaces: "all" 表示此连接可用于你所属的所有工作区。list_workspaces 会列出这些工作区及你在每个工作区中的角色。网站 ID 可在任何工作区中使用,因此网站工具无需其他信息。作用于整个工作区的工具(create_website、list_websites、 get_billing……)需要将工作区的 slug 作为 workspace 参数。如果有多个工作区,创建网站前请询问要使用哪一个;遇到 400 workspace_required 时也要询问,绝不要猜测。workspaces: "one" 表示此连接仅限于一个工作区。如果他们需要使用其他工作区(list_workspaces 显示 canUse: false),则需要重新连接:在 Claude Code 中依次选择 /mcp → webly → 重新认证,然后选择 All my workspaces。当所有者请求设置团队工作区照片时,set_workspace_photo 可接受公开图片的 url 或文件的 base64(PNG、JPEG、WebP 或 GIF,2 MB);remove_workspace_photo 可将其清除。个人工作区会显示此人的个人资料照片,可在控制面板中更改。

不使用 MCP 的 REST(脚本、不支持 MCP 的主机):webly login 会打开浏览器,进入同一登录和工作区选择流程;随后运行 webly api GET /websites --workspace <slug>(或任何 /v1 路径;使用 --data 传入 JSON 请求体),即可通过 API 以此人的身份发起调用。令牌会保留在辅助工具中;绝不要索要或打印令牌。 webly logout 会撤销令牌。

  1. 框架站点(默认采用 typed React):使用 put_source_file / str_replace(无需租约)。静态站点:对于小型文本修改,使用 search_source 和 str_replace,并传入 { path, edits };只有少量小型完整文件时才使用 deploy_files, 并将 expectedHeadVersion 设为 read_source_files 返回的版本 (不提供时会返回 400 base_required)。如果有人在此期间写入了更改,你的修改会合并到对方的更改上(响应中会显示 merged); 409 merge_conflict 表示你们修改了相同的行:告知修改内容所属的人(theirsBy),重新读取、重新应用,然后重发。只有对方提出要求时才使用 force。对于磁盘上的文件夹(构建产物的 dist/、任何包含捆绑文件或图片的文件夹),调用 begin_deploy 并传入站点 ID,然后立即运行 webly deploy <folder> --ticket <ticket> --message "<what changed>"(票据有效期为 5 分钟且只能用于一次部署;绝不要把票据回显给对方)。消息用一行说明更改内容(“按钮文字改为 Start here”);站点的 History 会显示此消息,以便共享该站点的人区分你的版本和其他人的版本。如果需要,助手会先构建项目,然后上传文件(最多 2000 个;超过 1 MiB 的图片和视频会直接上传到存储空间,单个文件大小不得超过套餐限制),关联该文件夹并打印草稿 URL。绝不要在工具调用中传入捆绑文件的字节,也不要在 shell 命令中放入 API 密钥。如果操作因 would_revert 而停止,表示部署会撤销自该文件夹上次部署以来对站点所做的更改(会列出相关路径):使用 read_source_files 读取这些文件,将其合并到本地项目中,重新构建,并使用新票据再次部署;或者告知对方哪些更改会被撤销,并且只有在对方同意后,才使用新票据和 --force 部署。如果操作因 would_remove 而停止,表示站点包含该文件夹中没有的文件(会列出这些文件):将它们添加到文件夹中;或者只有在对方同意后,才使用 --force 部署。通过站点 git 镜像的克隆(get_git_access)部署方式相同:助手会保留 .webly/media.json 中列出的图片,并以 git 历史记录为基准;如果提示克隆版本落后,请先运行 git pull。如果结果中包含 replaced,请告知对方站点已在其他地方发生更改,且旧版本仍会保留。每次写入都会创建一个新的草稿版本;线上站点不会发生变化。写入内容会经过 Prettier 格式化,因此应从 read_source_file 复制 str_replace 文本。
  2. check_head 会运行质量门禁(lint、类型检查、打包、渲染)。修复所有诊断问题。
  3. 向对方展示草稿 URL(https://draft--{subdomain}.webly.site,不会公开,也不会被索引)。
  4. 只有在对方明确同意发布该确切站点和版本后,才使用 publish_website。 如果有正在运行的构建,该操作会等待;返回 202 且 status: "building" 表示 Webly 仍在构建(并非失败):约 15 秒后再次发布该版本,并告知对方仍在构建中。 如果线上出现问题,请使用 rollback_website / unpublish_website。 新站点会获得一个自动生成的短地址(zen-wreath-y76r.webly.site);除非用户要求特定地址,否则不要传入 subdomain(最多 56 个字符;如果已被占用,会返回 409,不会提供变体)。在 Free 方案中,每个站点只能更改一次 webly.site 地址(rename_subdomain;Hobby 和 Pro 不限次数),因此请先运行 check_subdomain,并且只改为用户明确要求的名称。在 Hobby 和 Pro 方案中,工作区还有一个命名空间,每个已发布的站点都可通过 urls.vanity 访问(https://fall-out-boy.kev.webly.site,标签取自站点名称,仅在该命名空间内唯一)。请分享 urls.primary:主地址(自定义域名已生效时使用自定义域名,否则使用 vanity 地址,再否则使用扁平地址;但如果所有者将某个 webly.site 地址设为主地址,则使用该地址);urls.all 列出站点可访问的所有地址。rename_vanity 用于更改站点标签;get_namespace / check_namespace / rename_namespace 用于管理命名空间。重命名次数有限(Hobby 终身 5 次,Pro 终身 10 次),因此只改为用户明确要求的名称,并告知他们旧的 vanity 地址将停止工作。新地址的 HTTPS 证书需要约一分钟才能生效:请检查 get_namespace,直到 certificate 为 active,然后告知他们地址已生效。遇到 402 时,向他们提供 details.upgradeUrl。

团队工作区只有一位所有者(whoami → owner)。工作区本身的所有权(而非迁移网站)只能由所有者在控制面板的 People 页面中更改;你无法代为操作,因此请引导他们前往该页面。付款卡和订阅仍归工作区所有。

新内容,包括博客文章和重复内容(产品、团队、常见问题),都应放在站点的源文件中;不要创建集合或博客文章,CMS 已弃用。已经读取集合或托管博客内容的站点,会继续使用这些工具管理相应内容,直到所有者要求迁移为止。表单应使用 formAction('name') 提交,绝不能使用 mailto:,也绝不能询问银行卡号、密码、身份证号或健康详情(提交内容为纯文本)。如果所有者希望每次提交都收到一封邮件,请使用 set_form_notifications 开启此功能(默认关闭)。Hobby 和 Pro 方案会发送邮件;Free 方案会保存该设置:请向所有者提供 upgradeUrl。请将邮件字段命名为 email,这样回复提醒邮件时就能回复访客。Free 方案下,每个工作区每月可接收 1,000 条提交(Hobby 为 10,000 条,Pro 为 100,000 条);超出后,提交内容会被保留但隐藏,不发送提醒,并在每月重置时删除,除非所有者升级方案。当 list_forms 显示 quota.held 时,请告知所有者并提供 upgradeUrl。 详情请参阅 llms.txt。

403 会在 details.capability 中指出缺少的权限:授予的权限范围不足以完成任务,因此请告知他们需要哪种访问级别。遇到 401 / invalid_token 时,请再次调用 Webly 工具以重新触发登录;如果已有登录尝试正在等待,不要再发起第二次尝试。其他用户和 Agent 可能会同时编辑同一站点。小幅修改优先使用 str_replace。调用 put_source_file / delete_source_file 时,请传入 baseVersion(读取结果中的 version):对方对其他行所做的修改会与你的修改合并;409 merge_conflict 表示你们修改了相同的行——请重新读取文件,在保留对方修改的基础上重新应用你的修改,并使用新版本重新发送。wait_for_changes 会显示自某个版本以来其他人所做的修改。发布时,请将 version 设为用户预览过的版本。历史记录为线性,因此上次发布版本与该版本之间的版本会一并上线(更新的版本仍不会发布);响应中的 alsoPublishes 会列出其他用户或 Agent 编写的内容(作者、应用、消息)。请告知用户哪些内容已由他们发布上线。发布较旧版本不会上线任何新内容,且 alsoPublishes 为空。 Git:get_git_access 会提供已登录网站的源代码及历史记录的只读克隆(每个版本对应一次提交)。令牌有效期为 1 分钟,因此请立即运行其 clone(或在克隆目录内运行 pull),格式为 WEBLY_GIT_TOKEN=<token> <clone>,切勿将令牌放在 URL 中。再次请求前,先用 get_website 检查 headVersion。切勿运行 git push;请通过工具写入。

复制或移动网站

适用于 Hobby 和 Pro,且适用于两个工作区(否则返回 402 plan_required:将 details.upgradeUrl 提供给用户)。duplicate_website 会原样复制网站:包括所有版本、媒体、CMS、表单提交和设置,以及密码;如果原网站已发布,副本也会发布,并获得自己的地址;自定义域名仍属于原网站。move_website 会立即将网站移至用户担任管理员的另一个工作区:所有内容都会一并迁移,网站会获得该工作区的一个新 webly.site 地址,旧地址将停止工作,因此请先确认,并分享新的 urls.primary。list_move_destinations 会列出用户担任管理员的工作区,以及网站是否符合迁移条件(reason:site_limit、storage_limit、plan_required);请询问用户想选择哪个工作区。要访问另一个工作区,这两项操作都需要已登录用户(OAuth)。如果是其他人的工作区,start_website_transfer 会返回一个代码,由该工作区的管理员通过 accept_website_transfer 兑换。

自定义域名

需要使用已登录账户(MCP),并订阅 Hobby(5 个域名)或 Pro(25 个域名)。使用 Free 套餐时,add_domain 会返回 402 domain_limit:将 details.upgradeUrl 提供给所有者。“将 example.com 连接到我的网站”:

  1. 使用 list_websites 选择网站。切勿根据主机名猜测。
  2. 对于裸域名,请先询问:
    • www.example.com(推荐)。 适用于所有 DNS 服务商。 然后让对方在域名注册商处将 example.com 转发到该地址,免费且只需一分钟。
    • 直接使用 example.com。 仅当对方的 DNS 服务商支持根域名上的 CNAME 扁平化或 ALIAS 时才使用(Cloudflare、Namecheap、Porkbun 等)。 对于 shop.example.com 这样的子域名,直接添加即可。
  3. 调用 add_domain,然后调用 connect_domain。如果返回了 url,先把该链接发给对方:他们登录自己的 DNS 服务商(任何主机名都可使用 Cloudflare;GoDaddy 等服务商支持后也可用于 www),然后批准操作,记录便会自动设置。让他们在使用 Webly 的浏览器中打开链接。使用 Cloudflare(method: "oauth")时,如果对方在 Cloudflare 页面允许重定向,且裸域名目前尚未托管任何内容,Webly 也会转发 www 域名的裸域名(如果验证后 apexForward 不正常,把它发给对方)。如果对方已有记录阻碍设置,在对方登录后批准屏幕上显示的确切更改之前,不会替换任何记录;批准后会立即切换该主机名,因此如果网站今天已在线,请提供手动记录(先添加 TXT),以便无停机迁移。调用 remove_domain 后,如果响应中包含 dnsCleanup,请询问对方是否也要删除 Webly 添加的记录;如果要,请提供 dnsCleanup.url。 否则,或作为备用方案,请将所需的 dns.records 按返回内容原样提供,并整理为 Type / Name / Value 表格。对于 www 域名,还要提供 apexForward 转发规则。服务商提示:
    • 只填写显示的 Name(www,根域名则为 @)。GoDaddy 和 Namecheap 会自动添加域名。
    • 在 Cloudflare 上,将记录设置为“DNS only”(灰色云朵)。
    • 要迁移目前已在其他地方上线的域名?保留其现有记录,只添加可选的 TXT 记录。然后:
      1. 轮询 verify_domain,直到域名状态为 active。这表示所有权已验证且证书已部署。仅完成第 2 步还不够。由于旧主机仍在响应,domain-watch 暂时无法显示这一状态。
      2. 请对方切换 CNAME。
      3. 运行 webly domain-watch <hostname>,确认流量现在已到达 Webly。
  4. 立即在后台开始监控。不要等对方说已经完成: 将 webly domain-watch <hostname> 作为后台任务运行。每当相应步骤完成时,它都会输出 dns、https 和 live;域名上线后任务会退出。 如果没有 shell,请每隔 next.checkAgainSeconds 调用一次 verify_domain。每个域名响应都包含 next,其中有当前步骤(1 DNS 记录、2 HTTPS 证书、3 上线)以及相应操作说明。每一步完成时都告知对方。
  5. 上线后:确认 https://<hostname> 可以加载。网站上第一个上线的域名会自动成为其主地址(isPrimary),除非之前已选定主地址(另一个域名,或通过 set_primary_address 选定的 webly.site 地址);其他所有地址都会重定向到主地址。如果另一个域名已经是主地址,请提供 set_primary_domain 以切换主地址;如果对方想将 webly.site 地址设为主地址,则提供 set_primary_address(并说明其自定义域名之后会重定向到该地址)。如果状态为 failed,请转达 failureMessage,让对方修复记录,然后再次调用 verify_domain。如果域名状态为 active,但对方在删除后重新添加域名后立即看到浏览器提示服务器“无法找到”,则是 DNS 缓存了这段间隔期间的结果:缓存会在该区域的负缓存时间内清除(Cloudflare 默认 30 分钟);如果过时的响应缓存在设备上(而非路由器或 ISP),清除 DNS 缓存后也会更快恢复。

添加域名不会发布任何内容,也不会导致任何服务下线。*.webly.site 地址会继续正常工作。

规则

  • Token 是证明所有权的秘密信息。切勿打印、记录、提交它,也不要将它放入 URL,除非通过 webly claim-link。
  • 只陈述命令或工具实际返回的 URL、网站和数量。
  • 如果对方只想要一个快捷链接,就不要为其设置 MCP;如果他们想保留或发展网站,再提供 MCP。
  • 每台机器只能有一个匿名网站。如果他们想保留第二个网站,请先认领第一个,然后通过 MCP 创建第二个网站并使用 webly link 将其关联。
  • 文件夹归属于其 .webly/project.json 中指定的网站。除非对方提出要求,否则切勿将其部署到其他网站,也不要认领其他网站。

评论

支持 Markdown