关于 webflow-cli:cloud
webflow-cli:cloud 是使用 Webflow CLI 初始化项目、部署应用并管理 Webflow Cloud 的技能。它会根据项目状态指导 Agent 选择流程及所需的非交互参数。
主要功能
- 01从模板或 GitHub 初始化项目
- 02部署站点关联或独立应用
- 03管理应用、环境、日志和部署
- 04设置环境变量
- 05指导非交互式 CLI 流程
适用场景
- 01部署本地 Next.js 或 Astro 项目
- 02连接 GitHub 仓库进行部署
- 03查看应用日志和部署状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ webflow/ webflow-skills --skill webflow-cli:cloud安装后在 Claude Code 中输入/webflow-cli:cloud确认已加载。
详细介绍
Webflow Cloud
从模板或现有 GitHub 仓库初始化新项目,部署到 Webflow Cloud,并管理现有应用(列表、检查、日志、部署、环境、环境变量)。部署支持两种模式:关联站点(部署到现有 Webflow 站点)和项目应用(作为独立应用部署,无需现有站点)。
命名空间:apps(规范)与 cloud(已弃用的别名)
webflow apps <command> 是 Webflow Cloud 的规范命名空间。webflow cloud <command> 仍可使用——其 init / deploy 形式是同一处理程序的别名——但已弃用,建议改用 apps。
| 规范命令 | 已弃用的 cloud 别名 | 说明 |
|---|---|---|
webflow apps init | webflow cloud init | 选项和处理程序相同——但 --import 及其仓库导入选项仅适用于 apps init。 |
webflow apps deploy | webflow cloud deploy | 处理程序相同——但 --json 和 --dry-run 仅适用于 apps deploy。 |
| — | webflow cloud create <name> | 即将移除,现已弃用;建议改用 apps init(如果继续使用旧版命名空间,也可用 cloud init)。 |
| — | webflow cloud list | 列出的是脚手架模板,而非应用。该命令仍保留在 cloud 下;没有对应的 apps 命令。不要与列出工作区应用的 apps list 混淆。 |
webflow apps list / get / domains / link / update / delete / environments … / deployments … / logs … / env-vars … | — | **没有对应的 cloud 命令。**仅限规范命名空间。 |
通过 cloud init / cloud deploy 运行命令时,会在 stderr 上输出一次性弃用提示,指向对应的 apps 命令形式(使用 --json 时不显示)。
所有新工作都应优先使用 apps 命令形式。本指南始终使用 apps 命令;每个 apps init / apps deploy 调用都可使用带有相同标志的 cloud init / cloud deploy 替代,但 --import(init)和 --json / --dry-run(deploy)除外。
说明
步骤 0:确认 CLI 已安装
webflow --version
如果找不到该命令,请安装:
npm install -g @webflow/webflow-cli@latest
# or yarn global add @webflow/webflow-cli@latest
# or pnpm add -g @webflow/webflow-cli@latest
然后继续检测状态。
步骤 1:检测项目状态
在决定采用哪条路径之前,先运行这两项检查:
# Is this project already set up on Webflow Cloud?
cat webflow.json
# Is there a git remote?
git remote get-url origin 2>/dev/null
快速参考(CLI 现在会写入 cloud.app_id;旧版清单可能包含旧字段 cloud.project_id,读取时仍会将其作为备用字段):
webflow.json 中的 cloud.app_id(或旧版 cloud.project_id) | git remote | → 路径 |
|---|---|---|
| 否 | — | A — 新项目 |
| 是 | 否 | B — 现有项目,无 git |
| 是 | 是 | C — 理想状态 |
你在没有 TTY 的环境中运行。 只有当
process.stdin.isTTY为 true 时,CLI 的交互式提示才会触发。作为通过子进程调用 CLI 的 Agent,你没有 TTY——所有提示都会被静默跳过,而任何未通过标志传入的必填值都会触发硬错误,例如--app-name cannot be empty。此技能中的每条命令都遵循以下规则: 显式传入所有必需的标志。绝不要依赖提示。当 CLI 接受
--no-input时,请传入该标志,以明确遵循此约定。各命令所需的标志如下:
命令 始终传入 apps init(关联站点)--no-input --app-name <3–39 chars> --framework <astro|nextjs|vite> --mount <path> --site-id <id>apps init --new(应用)--no-input --app-name <3–39 chars> --framework <astro|nextjs|vite|static> --workspace-id <id>apps init --import(关联站点)--no-input --import <repo-url> --site-id <id> --mount <non-root path> --idempotency-key <key>apps init --import --new(项目应用)--no-input --import <repo-url> --new --idempotency-key <key>— 不要传入--mountapps deploy(关联站点)--no-input --mount <path> --environment <env> --site-id <id>,首次部署时还需传入--app-nameapps deploy(项目应用,首次部署)--no-input --mount <path> --environment <env> --workspace-id <id> --app-name <name>
apps deploy上的--site-id、--app-id、--framework和--workspace-id可让 Agent 在部署时覆盖webflow.json中的值。多工作区令牌曾导致 Agent 致命挂起,因为工作区选择没有非 TTY 操作路径。现在传入
--workspace-id即可跳过选择器。Webflow 控制面板 UI 中不会显示工作区 ID——用户无法手动查到。如果 Agent 没有该 ID,请让用户在项目目录中交互式运行一次webflow apps deploy。预检会提示用户选择工作区,并将cloud.workspace_id写入webflow.json;此后,Agent 就可以从清单中读取该值,并在后续运行时传入--workspace-id。不要建议使用apps init --new来发现 ID——在现有项目中运行它会创建一个随后被丢弃的临时目录。**例外:**在 Path A2(空目录)中,可以安全地尝试不带--workspace-id运行apps init --new,以自动解析仅含单个工作区的令牌——请参阅 Path A2。控制面板中可以查看站点 ID。 如果需要
--site-id但不知道其值,请不要向用户索要原始的site_XXXX值——使用webflow sites list获取其站点,并根据显示名称提供选择器。用户也可以在控制面板中查看并获取该值。读取/管理命令不需要
--workspace-id。apps list/get/domains/environments/deployments/logs/env-vars命令会在服务端根据 OAuth 令牌推导工作区——它们没有--workspace-id标志,也不会提示选择工作区。请参阅管理应用。
路径 A:没有 app_id — 新项目
项目尚未部署。开始任何操作之前,先问用户两个问题:
- “你已经有这个项目的源代码(现有的 Next.js 或 Astro 代码库),还是要从空目录开始,并希望使用 Webflow starter 脚手架?”
- 如果用户已有代码:“代码已经推送到 GitHub 仓库了吗?你希望 Webflow 从该仓库构建(而不是使用本地文件)吗?”
用户的回答决定了分支——这三种情况有实质区别:
| 用户拥有…… | 分支 | 初始化步骤 |
|---|---|---|
| 现有代码,从本地文件部署 | 路径 A1 | 跳过 apps init。 它会在仓库内创建 ./<app-name>/ 子目录,并在其中放入一个 hello-world 脚手架,而用户并不需要这个。 |
| 空目录,或希望使用 Webflow starter | 路径 A2 | 运行 apps init,从 Webflow-Examples/hello-world-* 搭建脚手架。 |
| 现有代码已在 GitHub 上,希望 Webflow 从仓库构建 | 路径 A3 | 运行 apps init --import <repo-url> — 创建一个连接到 GitHub、绑定到该仓库的应用。仅适用于 apps;没有 cloud init --import。 |
选择 A1 还是 A3 并非表面差异——它决定了应用之后能做什么。 连接到 GitHub 的应用(A3)可以使用 apps deployments trigger / redeploy,也是唯一符合控制面板推送即部署条件的应用。通过本地 apps deploy 首次创建的应用(A1)没有连接到 GitHub,因此 trigger / redeploy 会拒绝处理。如果用户的代码已经在 GitHub 上,并且提到 CI、自动部署、回滚或“我推送时就部署”,应选择 A3,而不是 A1。
无论选择哪种方式,都可以补救:之后可以通过 apps update --github-source <repo-url> 将 A1 应用指向某个仓库(参见 apps update)——但一开始就选择 A3 可以省去这一步。
确定分支后,还要询问是关联到站点还是作为独立应用(仅在首次部署前相关):
| 用户表示…… | 模式 | 结果 |
|---|---|---|
“部署到我的 Webflow 站点 <name>”、“关联到站点”,提及现有站点 | 关联到站点 | 应用绑定到现有 Webflow 站点;站点 URL 会在选定的挂载路径托管此应用。需要 --site-id。 |
| “项目应用”、“仅作为应用”、“不需要站点”,或未提及现有站点 | 独立应用 | 首次部署会配置一个全新的 Webflow 站点(<app-name>-<hash>.webflow.io)。 |
如果用户对任一问题的回答含糊,请进一步询问。不要自行默认。
路径 A1:已有代码库,从本地文件部署
如果代码在 GitHub 上,请先查看路径 A3。 此路径会上传并构建本地文件,生成的应用不会连接到 GitHub——
apps deployments trigger/redeploy和仪表板中的推送部署都会拒绝处理。如果代码库在 GitHub 上,且用户希望 Webflow 从中构建,请改用路径 A3。
用户已有可用的源代码。apps deploy 会处理所有事情——它会根据 package.json 检测框架,预检阶段则会从标志解析身份信息,或提示用户输入。无需运行 apps init,也无需预先手动编写 webflow.json。
步骤 1:一次性身份验证(仅限人工操作)。 告知用户在本地运行此命令;Agent 无法操作浏览器流程:
webflow auth login
步骤 2:部署。 具体命令形式取决于 Agent 已知的信息。
A1-a — 关联到站点,已知 --site-id:
webflow apps deploy --no-input \
--site-id site_abc123 \
--app-name my-app \
--framework nextjs \
--mount /app \
--environment main \
--skip-mount-path-check \
--skip-update-check
如果 package.json 中存在可检测的信号,则 --framework 为可选项:nextjs / astro 对应 Cloudflare 适配器(@opennextjs/cloudflare、@astrojs/cloudflare),vite 则对应 vite 包本身。对于 monorepo,或自动检测不可靠的情况,请显式传入此参数。
如果 Agent 不知道用户的 --site-id,不要询问原始的 site_XXXX 值;请使用 webflow sites list 获取用户的站点,并提供易读的显示名称供其选择。
A1-b — 项目应用,已知 --workspace-id:
webflow apps deploy --no-input \
--workspace-id ws_abc123 \
--app-name my-app \
--framework nextjs \
--mount / \
--environment main \
--skip-mount-path-check \
--skip-update-check
A1-c — 项目应用,不知道 workspace ID(常见的缺失信息):
Webflow 仪表板 UI 中的任何位置都看不到 workspace ID。 用户无法手动查找——发现它的唯一方法是运行 CLI。因此,操作流程如下:
请用户在本地交互式运行一次部署。 在其项目目录中运行:
webflow apps deploy
不传入 --no-input 或任何身份标志时,预检会提示:"此项目尚未针对 Webflow Cloud 初始化。您希望如何部署?" → 用户选择“创建新应用” → 选择工作区 → 完成。经过这次由用户操作的部署后,cloud.workspace_id 和 siteId 会写入 webflow.json,WEBFLOW_SITE_ID 会写入 .env。之后 Agent 就可以使用 --site-id(新配置的站点)运行所有后续部署。
不要让用户运行
apps init --new来“发现”其 workspace ID。在已有项目中,这会在用户的代码库内创建一个弃用的./<app-name>/临时目录,并在其中生成 hello-world 脚手架。请使用上述交互式apps deploy流程——它能在同一步骤中发现 workspace ID 并完成首次部署。
步骤 3:设置 git(如果尚未设置)——与下文路径 A2 的步骤 3 相同。
路径 A2:空目录,从头搭建脚手架
-
搭建项目脚手架——选择符合用户意图的形式:
# Project app (no site attachment). --workspace-id avoids the multi-workspace hang. webflow apps init --new --no-input \ --app-name my-app \ --framework astro \ --workspace-id ws_abc123# Site-attached (connect to an existing Webflow site). Requires --site-id. webflow apps init --no-input \ --app-name my-app \ --framework astro \ --mount /app \ --site-id site_abc123所有标志请参阅
apps init。仅适用于路径 A2 中项目应用的工作区 ID 发现:由于路径 A2 从空目录开始,
apps init --new无论如何都会创建全新的脚手架,不会造成任何污染。因此,如果 Agent 没有--workspace-id,可以先尝试不带该参数运行apps init --new:# Try this first if --workspace-id is unknown (Path A2 only — empty dir) webflow apps init --new --no-input \ --app-name my-app \ --framework astro- **单工作区令牌:**CLI 会自动选择唯一的工作区,将
cloud.workspace_id写入webflow.json,然后以状态码 0 退出。从清单中读取该值,并在第 2 步运行apps deploy时将其作为--workspace-id传入。 - **多工作区令牌:**工作区选择器会启动,而命令会一直挂起(没有 TTY)。为 Bash 调用设置 30 秒超时(或使用
timeout 30s ...包装命令)——单工作区初始化成功需要 10–20 秒(OAuth 检查 +GET /v2/workspaces+ 从 GitHub 下载脚手架),因此超过 30 秒仍无输出,就表示选择器已挂起。超时后,直接向用户询问工作区 ID,并使用--workspace-id重新运行。
对于路径 A2 中的关联站点,没有等效的自动发现方式——必须预先提供
--site-id。请使用下方的站点选择器模式帮助用户选择。**路径 A1(现有代码库)不适用此方法。**在现有项目中运行
apps init --new会创建一个随后被丢弃的临时子目录。路径 A1 的工作区 ID 发现方式仍按路径 A1-c 中的说明进行。 - **单工作区令牌:**CLI 会自动选择唯一的工作区,将
路径 A3:现有 GitHub 仓库,已连接 GitHub 的应用
用户的代码已在 GitHub 上,并且希望 Webflow 从仓库构建,而不是从本地文件构建。apps init --import <repo-url> 会创建绑定到该仓库的应用,并将其克隆到本地。
仅适用于
apps。--import仅适用于apps init,刻意不提供cloud init --import。如果用户因其他原因使用cloud命名空间,请改用路径 A1,稍后再通过apps update --github-source关联仓库。
步骤 0:前置条件——Webflow GitHub App。 必须将其安装到仓库所有者名下,并连接到工作区。CLI 无法完成此操作;这需要在控制面板/GitHub 端进行设置。如果导入因权限问题失败,首先应检查这一点。
步骤 1:一次性身份验证(仅限人工操作)。 与 A1 相同——Agent 无法执行浏览器流程:
webflow auth login
步骤 2:导入。 必须且只能指定 --site-id 或 --new 其中之一——CLI 不会根据仓库中的任何内容推断目标。
A3-a——关联到站点(必须指定 --mount,且不能是根路径):
webflow apps init --import https://github.com/acme/site \
--site-id 6234abc --mount /app --dry-run
webflow apps init --import https://github.com/acme/site \
--site-id 6234abc --mount /app
A3-b——项目应用(不允许指定 --mount——项目应用独占其自身域名的根路径):
webflow apps init --import https://github.com/acme/site --new
A3-c——非交互式 / CI。 此处必须指定 --idempotency-key。使用一个在重试时保持不变、且对该仓库和目标唯一的密钥(例如 $GITHUB_RUN_ID-$REPOSITORY-$SITE_ID),这样重试时会复用原有应用,而不是创建第二个:
webflow apps init --import https://github.com/acme/site --new --no-input \
--idempotency-key "$GITHUB_RUN_ID-acme-site" \
--branch main --json
添加 --skip-clone,即可注册应用而不在文件系统中写入任何内容——此时会输出应用和环境 ID。适用于仓库已检出,或运行环境不适合进行克隆的情况。
--branch 用于选择构建所用的分支;默认使用仓库的默认分支。
步骤 3:启用推送部署(控制面板,手动操作)。 导入会将应用连接到仓库,但完成控制面板配置之前,推送不会触发部署——请参阅完整工作流示例的第 3 步及后续步骤。在此之前,可按需构建:
webflow apps deployments trigger --json
不要对 A3 应用运行 apps deploy 来“推送更新”。 该命令会上传本地文件,属于 A1 模式;对于已连接 GitHub 的应用,对应的操作是 deployments trigger(构建当前 HEAD)和 deployments redeploy <depId>(重新运行之前的提交,即回滚)。
从列表中选择 --site-id
在需要 --site-id 时(Path A1 关联站点、Path A2 关联站点或其他情况),如果用户没有提供,请使用 webflow sites list --json 枚举令牌可访问的站点,然后向用户展示简短的可读名称列表供其选择。站点 ID 可在 Webflow 控制面板的 URL 配置中查看,但要求用户输入数字 ID 的体验很差;除非用户要求查看 ID,否则应展示名称。
# Returns a JSON array of sites with id, displayName, lastPublished, etc.
webflow sites list --json
工作流:
-
运行
webflow sites list --json。CLI 会以 JSON 数组形式返回,退出码为 0。 -
解析输出。向用户展示以
displayName为键的简短列表(如果用户有很多站点,则同时显示lastPublished)。示例:Which site should this project deploy to? 1. Acme Marketing (last published 2 days ago) 2. Acme Docs (last published 3 weeks ago) 3. Acme Internal (never published) -
将用户的选择映射回对应的
id字段,并将其作为--site-id传入。
如果 webflow sites list 出错(缺少认证或认证已过期),请向用户展示错误,并让用户在本地运行 webflow auth login;不要尝试通过 Agent 操作。
-
部署: 选择与上述初始化形式匹配的形式。传入
--site-id(如果是项目应用的首次部署,则传入--workspace-id),以免在清单文件部分写入时导致部署误读清单。# Project-app first deploy — provisions the Cloud site/app/env webflow apps deploy \ --no-input \ --app-name my-app \ --workspace-id ws_abc123 \ --mount / \ --environment main \ --skip-mount-path-check \ --skip-update-check# Site-attached first deploy — uses the existing Webflow site webflow apps deploy \ --no-input \ --app-name my-app \ --site-id site_abc123 \ --mount /app \ --environment main \ --skip-mount-path-check \ --skip-update-check这会在 Webflow Cloud 上创建应用,并在
webflow.json中设置cloud.app_id。提交更新后的webflow.json。 -
设置 git(如果尚未设置):
git init && git add . && git commit -m "init" git remote add origin https://github.com/your-org/my-app.git git push -u origin main -
(可选)通过 Webflow 控制面板启用推送部署。 仅推送到 GitHub 不会触发部署——相关设置位于 Webflow 控制面板中,不在 CLI 或代码库中。告知用户:
- 打开 Webflow 控制面板 → 他们的 Cloud 应用 → Settings → Git
- 连接他们的 GitHub 账户,然后选择代码库和分支
- 确认——控制面板会自动运行一次初始部署,以验证连接
- 从此之后,每次推送到已连接的分支都会触发部署
CLI 无法执行上述任何步骤。如果用户跳过此操作,则每次部署都必须手动运行
webflow apps deploy(类似 Path B 的方式),或使用 CI/CD 流水线。
如果第 2 步出现部署认证错误:运行
webflow auth login,完成浏览器流程,然后重试。
Path B:app_id 已存在,没有 git 远程仓库——已有项目,没有 git
项目已在 Webflow Cloud 上,但没有 git 仓库。直接部署,并建议用户设置 git。
-
部署: 先读取
webflow.json。如果设置了siteId,则传入与其匹配的--site-id。如果只设置了cloud.workspace_id,则传入与其匹配的--workspace-id。webflow apps deploy \ --no-input \ --site-id site_abc123 \ --mount / \ --environment main \ --skip-mount-path-check \ --skip-update-check -
建议启用推送部署: 建议用户初始化 git 仓库、推送到 GitHub,然后在 Webflow 控制面板中连接该仓库(应用 → Settings → Git)。控制面板中的这一步才会启用推送部署——CLI 无法执行此操作。请参阅 Path A 的第 3–4 步。
如果出现部署认证错误:运行
webflow auth login,完成浏览器流程,然后重试第 1 步。
路径 C:存在 app_id 和 git remote — 可能是理想情况
项目已部署且有 git remote,但存在 remote 并不能证明已配置好推送即部署。 这项连接是在仪表板端配置的,CLI 无法查看。提出建议前,请先确认。
务必询问用户: “此仓库是否已在仪表板中连接到你的 Webflow Cloud 应用(应用 → Settings → Git,并已选择分支)?” 答案会影响建议:
- 是,已连接 — 推送即部署已启用。唯一需要执行的操作是
git push。不要建议重新关联或重新部署。- 否,未连接 —
git push在 Webflow 端不会执行任何操作。可以立即手动部署,也可以先让用户在仪表板中连接仓库,以便为后续提交启用推送即部署。- 不知道 — 假设尚未连接,并建议在仪表板中进行连接(一次性设置,之后推送即部署将持续生效)。
-
如果已连接 — 只需提交并推送:
git add . git commit -m "your message" git pushWebflow Cloud 会检测到推送并自动部署。连接后的首次部署由仪表板本身执行;之后的推送都会自动触发部署。
-
如果尚未连接 — 有两种方式:
- 为后续提交启用推送即部署(推荐)。告知用户打开 Webflow 仪表板 → 自己的 Cloud 应用 → Settings → Git,连接仓库并选择分支。仪表板会自动执行首次部署,以验证连接。从此以后,向该分支执行的每次
git push都会触发部署。 - 立即进行一次手动部署,不启用推送即部署。传入与
webflow.json中siteId匹配的--site-id:
这会部署当前状态,但不会配置推送即部署。下一次webflow apps deploy \ --no-input \ --site-id site_abc123 \ --mount / \ --environment main \ --skip-mount-path-check \ --skip-update-checkgit push在 Webflow 端仍然不会执行任何操作。
- 为后续提交启用推送即部署(推荐)。告知用户打开 Webflow 仪表板 → 自己的 Cloud 应用 → Settings → Git,连接仓库并选择分支。仪表板会自动执行首次部署,以验证连接。从此以后,向该分支执行的每次
如果出现部署身份验证错误:运行
webflow auth login,完成浏览器流程,然后重试。
工具使用
- 所有
webflow apps/webflow cloud命令都使用 Bash 工具 - 使用 Read 工具检查
webflow.json、package.json— 不要直接修改这些文件 - 使用 Glob 工具查找项目文件
- 不要将 Webflow MCP 工具用于 CLI 工作流
身份验证
# Interactive — local-only, opens a browser. NOT for agents or CI.
webflow auth login
webflow auth login会在用户的浏览器中执行 OAuth 流程,然后将令牌写入.env。使用--no-input时,该命令会拒绝运行(并退出,提示No-input mode enabled. Aborting OAuth authentication)。Agent 无法执行此命令。 如果需要运行webflow auth login(令牌缺失或已过期),请让用户在本地运行一次,并在完成后告知你。
CLI 在两种模式下都会写入相同的令牌环境变量,不会针对不同模式分别设置。
webflow auth login 会写入 .env:
| 变量 | 始终写入? | 描述 |
|---|---|---|
WEBFLOW_API_TOKEN | 是(两种模式下均会写入) | OAuth 访问令牌。规范的令牌环境变量。由 webflow auth login 设置。 |
WEBFLOW_SITE_ID | 仅限绑定站点的项目(或首次部署项目应用后) | 站点 ID。对于绑定站点的项目,由 apps init 写入;对于项目应用,在首次部署配置站点后,由 apps deploy 写入。 |
首次部署项目应用后,CLI 会在后端配置一个站点,并将 WEBFLOW_SITE_ID 写入 .env。从那时起,该项目的行为就与绑定站点的项目相同,但令牌环境变量仍为 WEBFLOW_API_TOKEN。
已弃用的旧变量: WEBFLOW_SITE_API_TOKEN(以及 WEBFLOW_WORKSPACE_API_TOKEN)是只读的旧版回退变量。CLI 不会写入这些变量;但如果未设置 WEBFLOW_API_TOKEN,且发现环境中设置了其中一个变量,就会使用旧版变量的值,并且每次运行都会打印弃用警告。新项目不要将 WEBFLOW_SITE_API_TOKEN 写入 .env 或 CI 密钥,应使用 WEBFLOW_API_TOKEN。
其他环境变量(适用于任何模式):
| 变量 | 描述 |
|---|---|
DO_NOT_TRACK | 设置为 1 可选择退出遥测。 |
WEBFLOW_SKIP_UPDATE_CHECKS | 设置为 true 可跳过 @webflow package 更新检查。 |
WEBFLOW_SITE_ID环境变量为只读。 如果未设置标志或清单值,它会在运行时使用,但不会写回webflow.json。在.env中设置WEBFLOW_SITE_ID=X不会更新清单——只有apps init、apps deploy和清单本身可以设置该值。
GitHub Secrets: 在所有模式下,令牌都使用
WEBFLOW_API_TOKEN。对于绑定站点的项目,以及已完成首次部署的项目应用,还应设置WEBFLOW_SITE_ID。切勿提交.env文件。如果现有 CI 使用WEBFLOW_SITE_API_TOKEN,请将其重命名——部署仍会成功,但在切换之前,每次运行都会打印弃用警告。
配置 — webflow.json
{
"siteId": "site_abc123",
"cloud": {
"app_id": "app_xyz",
"environment_id": "env_xyz",
"workspace_id": "ws_xyz",
"framework": "nextjs",
"skipMountPathCheck": false
}
}
所有 cloud.* 键均采用 snake_case(app_id,而非 appId)。
| 键 | 设置时机 | 说明 |
|---|---|---|
siteId | 关联站点的应用:在 apps init 时。项目应用:首次部署后(CLI 会配置一个站点)。 | 尚未部署的项目应用中不存在此项。 |
cloud.framework | 在 apps init 时。 | 部署解析必需 — 见下文。 |
cloud.app_id | 首次部署后。 | 规范字段。 自动写入。取代旧版 cloud.project_id。 |
cloud.project_id | 仅旧版使用。 | 已弃用。 当 cloud.app_id 不存在时,作为回退值读取(适用于 Project → App 更名之前创建的清单)。新部署不再写入此字段;未来的主版本中将移除。 |
cloud.environment_id | 首次项目应用部署后。 | 由 createCloudApp 自动写入。 |
cloud.workspace_id | 在项目应用的 apps init 时(--new)。 | 首次部署时用于配置站点。 |
cloud.skipMountPathCheck | 由用户管理。 | 等同于 --skip-mount-path-check。 |
CLI 还会在构建时将 cloud.deployment_type("ssr" | "ssg" | "spa")、cloud.entrypoint_path 和 cloud.framework_version 写入打包后的 webflow.json(这些字段供 cosmic deployer 的 wrangler 配置和遥测使用)。它们是构建时输出 — 如果在源 webflow.json 中发现这些字段,请勿将其删除;缺少这些值会导致 Next.js 服务端部署静默失败。
ID 解析与环境变量
共享解析器会按严格的优先级顺序解析 siteId、appId、environmentId 和 workspaceId:
explicit flag / positional arg > env var > webflow.json manifest > interactive prompt > error
| 资源 | 标志 / 参数 | 环境变量(只读) | webflow.json |
|---|---|---|---|
| App ID | --app-id / [appId] 参数 | WEBFLOW_APP_ID | cloud.app_id(回退到旧版 cloud.project_id) |
| 环境 ID | --environment-id / [envId] 参数 | WEBFLOW_APP_ENVIRONMENT_ID | cloud.environment_id |
| Site ID | --site-id | WEBFLOW_SITE_ID | siteId |
| Workspace ID | --workspace-id | WEBFLOW_WORKSPACE_ID | cloud.workspace_id |
环境变量为只读,永远不会被写回清单文件。当值来自清单文件时,CLI 会记录一行 Using <resource> from webflow.json(使用 --json 时会抑制此信息)。如果没有解析到值,且命令无法提示用户(--no-input、CI=true 或没有 TTY),则会以错误中可供机器读取的 missingFlag 退出;请参阅管理应用中的 --no-input 约定。
部署时解析 cloud.framework:
- 存在包含
cloud.framework的webflow.json— 按原值使用。值无效时以代码 1 退出。 - 存在
webflow.json,但没有cloud.framework— 回退到从package.json检测。 - 不存在
webflow.json— 自动从package.json检测。成功后,CLI 会写入新的webflow.json。
通过 apps init 创建的项目始终属于情况 1。
命令
webflow cloud list
webflow cloud list
列出可用的脚手架模板(供 init 使用)。在执行 apps init --framework 前检查此列表,以确认有效的脚手架 ID。此命令不同于 apps list(后者会列出已部署的应用),且仅位于 cloud 命名空间下。该命令已弃用,即将移除——目前仍可使用,但会打印警告;建议使用 apps init --framework <bad-value> 或 --help 查看有效的脚手架 ID。
webflow apps init
在本地引导创建新应用。支持两种模式:关联 Site 和 应用。(webflow cloud init 是使用相同标志的弃用别名。)
关联 Site(连接到现有 Webflow Site):
# Agent / non-TTY — always pass every flag
webflow apps init \
--no-input \
--app-name my-app \
--framework nextjs \
--mount /app \
--site-id site_abc123
# Human at a real terminal — interactive prompts will fill in any missing flag
webflow apps init
标志:
| 标志 | 简写 | 描述 |
|---|---|---|
--app-name <name> | -n | 应用名称。必须为 3–39 个字符——CLI 会在初始化和首次部署项目应用时拒绝超出此范围的名称。 |
--project-name <name> | — | --app-name 的已弃用别名。仍可使用。 |
--framework <framework> | -f | 必须与 cloud list 中的脚手架 ID 相匹配。目前支持:nextjs、astro、vite、static(static 仅适用于独立模式——参见框架)。 |
--mount <path> | -m | 挂载路径(新域名默认为 /,现有站点默认为 /app)。在生成脚手架时替换配置文件中的对应内容。不存储在 webflow.json 中。 |
--site-id <id> | -s | 在非交互式站点关联模式下必需。不能与 --workspace-id 同时使用。 |
--workspace-id <id> | -w | 在 --new(应用模式)下跳过工作区选择器。不能与 --site-id 同时使用。 |
--new | — | 项目应用模式(不关联站点)。 |
--no-input | — | CI 模式。需要 --app-name 和 --framework。如果没有 --new,则默认为应用行为。 |
--no-input 站点关联模式下的凭据解析顺序:--site-id 标志 → webflow.json 中的 siteId → WEBFLOW_SITE_ID 环境变量 → 报错。
生成站点关联项目的脚手架后,CLI 会自动运行 DevLink 同步。
项目应用(不关联站点):
# Agent / non-TTY — always pass --workspace-id to skip the workspace picker
webflow apps init --new --no-input \
--app-name my-app \
--framework nextjs \
--workspace-id ws_abc123
# Human at a real terminal — prompts for workspace if not passed
webflow apps init --new
如果令牌可访问多个工作区,而 Agent 没有工作区 ID,请让用户在项目目录中以交互方式运行
webflow apps deploy——预检提示会选择一个工作区,并将cloud.workspace_id写入webflow.json,供后续由 Agent 驱动的运行使用。Webflow 控制面板 UI 不会显示工作区 ID,因此交互式 CLI 运行是获取该 ID 唯一实用的方法。
| 站点关联 | 项目应用(--new) | |
|---|---|---|
| OAuth / 站点选择 | 初始化时必需 | 跳过(改为选择工作区) |
.env 中的 WEBFLOW_SITE_ID | 初始化时写入 | 仅在首次部署后写入 |
.env 中的 WEBFLOW_API_TOKEN | 写入 | 写入 |
webflow.json 中的 cloud.workspace_id | 不设置 | 初始化时设置(首次部署时使用) |
| 脚手架 | astro、nextjs、vite | astro、nextjs、vite、static |
| 挂载路径 | 可配置(默认为 /app) | 始终为 / |
| DevLink 同步 | 初始化后运行 | 跳过 |
**工作区选择(仅限 project-app 模式):**如果未传入 --workspace-id,CLI 会调用 GET /v2/workspaces,列出令牌有权访问的工作区。只有一个工作区时会自动选中;有多个工作区时则会显示交互式选择器。传入 --workspace-id 后会跳过 API 请求,CLI 会信任该标志;如果 ID 无效,稍后会通过 createCloudApp 返回 404。选中的 ID 会作为 cloud.workspace_id 持久化到 webflow.json 中。 |
**Agent 注意事项:**如果用户的令牌可访问多个工作区,而 Agent 无法传入 --workspace-id,选择器就会启动,并在非 TTY 环境中挂起。Webflow 仪表板界面不会显示工作区 ID,因此解决方法是:**请用户在项目目录中交互式运行一次 webflow apps deploy。**预检提示会让用户选择工作区、完成首次部署,并将 cloud.workspace_id(以及 siteId、app_id、environment_id)写入 webflow.json。之后,Agent 可以从清单中读取工作区 ID,并在后续运行时传入 --workspace-id(或者在站点创建后传入 --site-id)。若之后要部署到其他工作区,请删除 cloud.workspace_id,并让用户再次交互式部署。
webflow apps init --import <repo-url>(仅限 apps)
从现有 GitHub 仓库创建 Cloud 应用,并将其克隆到本地,而不是使用起始模板。此路径用于接入已存在于 GitHub 上的代码库——不会生成脚手架,也不会选择框架。
**此标志仅适用于 apps init。**有意不提供 cloud init --import:仓库接入路径会创建真正的应用,因此仍归属规范命名空间,而不是已弃用的别名。
**前提条件:**必须在仓库上安装 **Webflow GitHub App,并将其连接到你的工作区。**如果未完成,创建操作就会失败——CLI 无法替你安装该应用;此项设置必须在仪表板中完成。
| Flag | 说明 |
|---|---|
--import <repo-url> | https://github.com/<owner>/<repo。不能为空。 |
--site-id <siteId> | 关联到现有站点。不能与 --new 同时使用,且必须指定其中一个。 |
--new | 创建项目应用,而不是关联到站点。 |
--mount <path> | 使用 --site-id 时必填(且不能是根路径)。不能与 --new 同时使用——项目应用拥有自己域名的根路径,因此始终挂载在 /。 |
--branch <branch> | 要构建的分支。默认为仓库的默认分支。 |
--idempotency-key <key> | 非交互式运行(CI、--no-input)时必填。请使用对重试稳定且对该仓库和目标唯一的键,例如 $GITHUB_RUN_ID-$REPOSITORY-$SITE_ID,这样重试会重放原始应用,而不是创建第二个应用。 |
--skip-clone | 创建应用但不在本地克隆。不会写入文件系统;而是打印应用和环境 ID。 |
--json | 仅适用于导入路径——脚手架路径没有可序列化的单一响应对象。 |
--dry-run | 与脚手架路径共用:验证并预览,不产生副作用。 |
即使仓库中存在 siteId,也绝不会用它来选择目标——必须明确指定 --site-id 或 --new。
如果未指定 --import,则导入专用标志(--branch、--idempotency-key、--skip-clone、--json)会被拒绝,而非忽略;同样,使用 --import 时会拒绝 --framework / --workspace-id / --project-name(仓库会携带自己的代码,工作区则根据令牌确定)。每次拒绝都会通过 missingFlag 以机器可读的方式指出不兼容的标志,因此 Agent 无需解析说明文字即可修正调用。
# Attach an existing repo to an existing site at /app
webflow apps init --import https://github.com/acme/site \
--site-id 6234abc --mount /app --dry-run
webflow apps init --import https://github.com/acme/site \
--site-id 6234abc --mount /app
# Project app from a repo, CI-safe (note: --idempotency-key required, no --mount)
webflow apps init --import https://github.com/acme/site --new --no-input \
--idempotency-key "$GITHUB_RUN_ID-acme-site" \
--branch main --json
# Register the app without touching the local filesystem
webflow apps init --import https://github.com/acme/site --new --skip-clone --json
webflow cloud create(已弃用)
webflow cloud create <name> 仍可使用,但会发出弃用警告,并将在未来的主版本中移除。在关联到站点的模式下,它会将挂载路径硬编码为 /app,且仅提供 apps init 的部分功能。请始终优先使用 apps init(或在应用模式下使用 apps init --new)。
webflow apps deploy
webflow cloud deploy 是 apps deploy 的已弃用别名,标志和处理程序均相同。
预检阶段:身份解析。 在任何后端调用之前,apps deploy 都会运行预检步骤,确定这是站点关联部署还是项目应用的首次部署。解析顺序如下(以第一个匹配项为准):
| # | 来源 | 结果 |
|---|---|---|
| 1 | --site-id <id> 标志 | 站点关联部署,优先于环境变量和清单 |
| 2 | --workspace-id <id> 标志 | 项目应用首次部署,优先于环境变量和清单。不能与 --site-id 同时使用 |
| 3 | WEBFLOW_SITE_ID 环境变量 | 站点关联部署(只读;不会写回 webflow.json) |
| 4 | manifest.siteId(来自 webflow.json) | 站点关联部署 |
| 5 | WEBFLOW_WORKSPACE_ID 环境变量 | 项目应用首次部署(只读;不会持久化) |
| 6 | manifest.cloud.workspace_id | 项目应用首次部署 |
| 7 | 无匹配项 + --no-input | 硬错误,列出必需的标志 |
| 8 | 无匹配项,交互模式 | 选择器:创建新应用 / 关联现有站点 / 取消 |
环境变量优先于清单,站点优先于工作区。 两方面都很重要:已导出的
WEBFLOW_SITE_ID会覆盖manifest.siteId,而且一旦解析出站点,就不会再尝试解析工作区——因此,环境中残留的WEBFLOW_SITE_ID会悄然优先于配置为项目应用部署的清单。如果这不是你想要的结果,请取消设置该变量,或显式传入--workspace-id。
此预检阶段旨在防止项目应用部署路径在身份确定之前运行并创建 Cloud 应用——早期版本可能会在后续步骤失败时留下一个孤立的 Webflow 站点。
尽可能显式传入
--site-id或--workspace-id。 这能避免清单只写入了一部分的情况,也能避免依赖apps init留下的状态。若用户需要站点关联部署,请传入--site-id。若要进行项目应用首次部署,请传入--workspace-id。
项目应用首次部署(由 --workspace-id 标志或 manifest.cloud.workspace_id 触发)会调用 POST /cosmic/workspaces/:workspace_id/cloudApps,以原子方式创建站点、应用和环境。成功后,它会将 siteId、cloud.app_id 和 cloud.environment_id 写入 webflow.json,将 WEBFLOW_SITE_ID 写入 .env,并在此次部署中强制使用 --skip-mount-path-check。后续部署的行为与常规站点关联部署相同。
如果项目应用首次部署时未指定 --app-name,CLI 会使用当前工作目录文件夹名称(长度为 3–39 个字符时),否则使用 "Cloud App"。在 CI 中请显式指定 --app-name,以免出现意外。
未初始化的项目(没有 siteId、workspace_id 或标志):CLI 会提示用户创建新的项目应用、关联现有站点或取消。使用 --no-input 时会触发硬错误并列出必需的标志。使用 --no-input 运行的 Agent 在未初始化项目的首次部署时,必须始终提供 --site-id 或 --workspace-id。
有两种部署方式。推荐使用 GitHub 关联部署——它不需要配置 CI。完成一次性仪表板设置(CLI 无法执行)后,连接分支上的每次推送都会触发部署。
选项 1(推荐):GitHub 关联部署 完成一次性仪表板设置后,推送到已连接分支的每次提交都会触发部署——无需 CLI 命令,也无需工作流文件。**此设置只能在仪表板中完成——CLI 无法独自完成此操作。**仅将代码库推送到 GitHub 并不会自动启用推送部署。
- 将项目推送到 GitHub(用户至少需要推送一次提交)
- 告知用户打开 Webflow 仪表板 → 他们的 Cloud 应用 → Settings → Git,如果尚未连接 GitHub 帐户,则连接该帐户
- 选择代码库,然后选择要部署的分支(例如
main) - 确认——仪表板会自动运行初始部署,以验证连接
- 此后:向已连接的分支执行
git push= 部署
步骤 2–4 无法通过脚本完成。如果用户想要推送部署,就必须在仪表板中手动点击完成一次。之后,该项目的 Agent 基本上就完成任务了——后续部署会在推送时自动进行。
向用户建议部署设置时,始终优先推荐此选项。只有当用户需要原生 GitHub 集成不支持的自定义前置/后置步骤、密钥注入或多环境逻辑时,才建议使用 GitHub Actions。
选项 2:GitHub Actions(手动 CI/CD)
当你需要自定义构建步骤、特定环境的密钥,或原生 GitHub 集成不支持的部署门控时使用。请参阅示例部分中的 GitHub Actions 示例。
选项 3:本地/手动部署
用于开发和临时部署:
webflow apps deploy \
--no-input \
--mount / \
--environment main \
--skip-mount-path-check \
--skip-update-check
所有 apps deploy 标志:
| 标志 | 简写 | 描述 |
|---|---|---|
--no-input | — | CI 模式。禁用大多数提示,但不会禁用项目选择提示——见下方说明。 |
--mount <path> | -m | 挂载路径。**务必与 --no-input 一起传入——不会强制要求。**省略此项不会报错;系统会静默地部署到根路径(/)。不会自动从 webflow.json 中读取。见下方警告。 |
--environment <env> | -e | 环境名称。如果不存在则创建。必须与 --mount 一起传入。 |
--app-name <name> | -n | 使用 --no-input 首次部署,且 webflow.json 中没有 cloud.app_id 时必填。项目应用首次部署时,长度必须为 3–39 个字符。 |
--project-name <name> | — | --app-name 的已弃用别名。仍可使用。 |
--site-id <id> | -s | 用于关联站点的部署的 Webflow 站点 ID。会覆盖 webflow.json 中的 siteId。不能与 --workspace-id 同时使用。可用于在不编辑 JSON 的情况下,从写入不完整的清单中恢复。 |
--workspace-id <id> | -w | 用于项目应用首次部署的工作区 ID。会覆盖 webflow.json 中的 cloud.workspace_id。不能与 --site-id 同时使用。 |
--app-id <id> | -a | Cloud 应用 ID。跳过应用选择器。会覆盖 webflow.json 中的 cloud.app_id。 |
--project-id <id> | — | --app-id 的已弃用别名。仍可使用。 |
--framework <fw> | -f | 覆盖框架检测结果。必须为 nextjs、astro、vite 或 static。会将该值写回 webflow.json。当根据 package.json 自动检测不可靠时(如单体仓库、缺少依赖等),可使用此项。 |
--directory <path> | -d | 应用目录(默认值:cwd)。用于单体仓库。 |
--description <text> | — | 首次部署时的应用描述。 |
--skip-mount-path-check | — | 跳过域名清单验证。CI 中必需。也可在 webflow.json 中设置为 cloud.skipMountPathCheck: true。 |
--auto-publish | — | 发布 Webflow 站点以同步挂载路径路由。不影响应用部署。 |
--skip-update-check | — | 跳过 @webflow 软件包更新检查。 |
--dry-run | — | **仅适用于 apps deploy——不适用于 cloud deploy 别名。**从标志、环境变量和 webflow.json 中解析所有信息,不进行网络调用,并报告实际运行将执行 create、select 还是 deploy。 |
--json | — | **仅适用于 apps deploy——不适用于 cloud deploy 别名。**输出单个文档,而非构建/上传进度文本:成功时输出 {appId, environmentId, deploymentId, deployUrl}(较旧的后端中 deployUrl 为 null);失败时输出错误文档;与 --dry-run 一起使用时则输出试运行计划。 |
# Preview what a deploy would do, no side effects
webflow apps deploy --no-input --mount /app --environment main --site-id site_abc123 --dry-run --json
# Deploy and parse the result instead of scraping progress output
webflow apps deploy --no-input --mount /app --environment main --site-id site_abc123 --json
Agent:每次都要同时传入
--mount和--environment。 部署提示(选择现有应用、为新应用命名、选择环境)是否出现,取决于是否_同时_设置了--mount和--environment,而非是否设置了--no-input。如果不同时传入这两个参数就使用--no-input,应用选择提示仍会出现,并在非 TTY 环境中卡住。对 Agent 安全的最低部署参数集为--no-input --mount <path> --environment <env> --site-id <id>(如果是项目应用的首次部署,则使用--workspace-id <id>),此外,当webflow.json中没有cloud.app_id时,还要传入--app-name。
⚠️ 在
--no-input下省略--mount会静默部署到根目录。 这是部署错误风险,而非硬性失败——不会报错,也不会警告。挂载提示提供了/app默认值,但没有验证器;而无输入路径只会返回通过验证的默认值;没有验证器时,则什么都不返回,随后会被规范化为/。根目录是有效挂载点,因此部署会继续执行。在非交互式运行中,绝不要依赖/app默认值——每次都要显式传入--mount。这也是为什么下文将“假定使用默认挂载点”列为ENVIRONMENT_MOUNT_MISMATCH的一个原因:失败会在稍后、不同的层级显现,与导致问题的参数相距甚远。
管理应用
用于检查和操作现有 Cloud 应用的命令。它们与 init / deploy 互为补充:
-
工作区位于服务端。 每条读取命令都从 OAuth 令牌中获取工作区——它们都没有
--workspace-id参数,也绝不会提示选择工作区。 -
ID 解析。
appId和envId通过共享解析器解析:显式参数/标志 → 环境变量(WEBFLOW_APP_ID/WEBFLOW_APP_ENVIRONMENT_ID)→webflow.json(cloud.app_id/cloud.environment_id,旧版cloud.project_id作为回退)→ 交互式 TTY 提示。在应用目录中运行(以便通过webflow.json解析 ID)是常见做法,但不是必需条件。 -
自动选择与
--no-input约定。 未提供 ID 时,选择器会自动选择工作区中唯一的应用,或应用中唯一的环境,因此单应用/单环境配置可在非交互模式下运行(包括 CI)。如果存在多个选项,且命令无法提示(--no-input、CI=true、没有 TTY 或使用--json),命令会以非零状态退出,并在错误中提供机器可读的missingFlag,让 Agent 可以通过重新运行命令并传入该标志来恢复。人类可读形式例如:Missing required appId. Pass --app-id, set WEBFLOW_APP_ID, or add it to webflow.json.missingFlag有两种形式——两种都要匹配。 解析器错误使用裸键(appId、environmentId、depId、yes);apps init上的标志兼容性拒绝则使用标志写法(--import、--site-id、--mount、--new)。匹配前请先规范化(去掉前导--,并忽略大小写),不要假定只有一种形式。两种情况下,该值都表示要添加或移除的标志——对于互斥标志对,它表示要移除的那个,因此如果按错误提示添加标志后重试,就会陷入无限循环。 -
--json。 每条命令都支持--json,会输出原始 API 响应并忽略--fields。可用它进行程序化解析。--json也会抑制Using … from webflow.json信息行。 -
--fields <comma-list>。 读取命令会渲染表格;--fields用于指定显示哪些列(无效字段名会在网络请求前立即报错)。下文列出了每条命令的默认字段和完整字段集。
筛选语义(list 命令)
apps list、apps environments list 和 apps env-vars list 使用同一套筛选模型:
- 精确筛选(
--name、--branch、--key、--site、--status)进行精确且区分大小写的匹配。 --q仅对相应资源的主要名称字段进行不区分大小写的子串(包含)匹配——应用名称、环境分支或变量键。它不会搜索 ID,也不会搜索变量值。用它来发现项目;用精确筛选来定位单个项目。- 多个筛选条件以 AND 组合。 精确筛选条件与不匹配的
--q一起使用时,会返回空页面——这表示没有项目满足所有筛选条件,并不表示资源不存在。 不要仅凭筛选后的空页面就断定应用或变量不存在;在报告其不存在之前,请使用更少的筛选条件重新运行。 - 每个筛选值都必须非空(
--q ""属于用法错误,而不是不执行任何操作)。
apps list
列出工作区中的所有应用。--fields 默认值为 id,name,siteId,createdAt(全部字段:id,name,description,siteId,appPath,sourceUrl,createdAt,siteName,shortName)。
筛选条件:--site <site-id>(精确匹配站点 ID)、--name <name>(精确且区分大小写)、--q <text>(对应用名称进行不区分大小写的子串匹配)。
应用名称仅在同一站点内唯一。 单独使用 --name 可能会匹配多个站点中的应用,而单独使用 --site 可能会匹配多个应用——请同时传入 --site 和 --name,以将结果限定为至多一个应用。
--site 不会默认从 webflow.json 获取:不带筛选条件的 apps list 会返回令牌可见的所有应用,而不会悄悄缩小到清单文件中指定的站点。
webflow apps list --json
# Resolve one app by name within a known site
webflow apps list --site 6234abc --name "Marketing" --json
# Discover apps whose name contains "mark" (case-insensitive)
webflow apps list --q mark --json
apps get [appId]
获取单个应用的详情。appId 默认为 webflow.json / WEBFLOW_APP_ID。--fields 默认值为 id,name,description,siteId,appPath,createdAt(全部字段:id,name,description,siteId,appPath,sourceUrl,createdAt,siteName,shortName——与 apps list 的字段集相同)。sourceUrl 是已连接的 GitHub 仓库(如有;请参阅 apps update --github-source)。
webflow apps get app_abc123 --json
apps domains [appId]
获取应用的域名和线上 URL。--fields 默认值为 id,url,lastPublished(全部字段另加 fullSiteCompiledAt)。
支持分页:--limit <n>(服务端上限为 100)以及从之前的 nextCursor 获取的 --cursor <cursor>。分页时,每一页都要重新传入相同的 --limit 和所有非默认的 --fields。
webflow apps domains app_abc123 --json
webflow apps domains app_abc123 --limit 50 --cursor "$NEXT_CURSOR" --json
apps environments list [appId]
列出应用的环境。--fields 默认值为 id,branch,publicUrl,latestDeploymentStatus,createdAt(全部字段:id,branch,mount,publicUrl,latestDeploymentStatus,lastDeploymentSucceededAt,lastVariableModifiedAt,createdAt,updatedAt)。
表格默认字段不包含
mount。 要读取环境的挂载路径,可以使用--json(它会返回完整的 API 结构,并忽略--fields),也可以通过--fields id,branch,mount显式指定。默认的environments list表格不会显示该字段。
筛选条件:--branch <branch>(精确且区分大小写——由于分支在单个应用内唯一,因此最多匹配一个环境)和 --q <text>(对分支进行不区分大小写的子串匹配,用于发现项目)。
webflow apps environments list app_abc123 --json
# Resolve the environment that builds `main`
webflow apps environments list --branch main --fields id,branch,publicUrl --json
apps deployments list
列出某个环境最近的部署,按从新到旧排序。不接受 appId 参数——它会从 WEBFLOW_APP_ID / WEBFLOW_APP_ENVIRONMENT_ID、webflow.json 或选择器解析应用和环境。--limit 默认为 20。--fields 默认为 id,status,sourceType,commitHash,buildStartedAt。
筛选:--status <status>(精确匹配以下枚举值之一——如果值无效,CLI 会在发起任何网络请求前拒绝)。通过上一次响应中的 nextCursor 使用 --cursor 分页;每一页都要重新传入相同的 --limit、--status 和非默认的 --fields。
webflow apps deployments list --limit 20 --json
# Most recent failed build
webflow apps deployments list --status failed --limit 1 --json
部署状态枚举: starting | building | deploying | success | failed | canceled | unstaged。请注意,构建完成/部署进行中对应 deploying(只有达到 success 后,才算部署成功;没有单独的“已部署”状态)。终态包括 success、failed、canceled 和 unstaged。
apps deployments get <depId>
查看单个部署的详细信息(必须提供位置参数 <depId>)。与 deployments list 一样解析应用和环境。--fields 默认为 id,status,sourceType,commitHash,buildStartedAt。
--wait 会阻塞,直到部署达到终态(success / failed / canceled / unstaged)或超时,然后成功时退出码为 0,否则为 1——因此无需自行编写轮询循环,即可将其用作 CI 检查门禁。--interval <seconds> 设置轮询间隔(最低为 5s),--timeout <seconds> 限制等待时长(最长为 30 分钟)。
webflow apps deployments get dep_abc123 --json
# Block until the build finishes; non-zero exit fails the CI step
webflow apps deployments get dep_abc123 --wait --interval 10 --timeout 900 --json
apps deployments redeploy <depId>
在相同的提交上重新运行现有部署,并排入一个新的构建。**如需回滚,请重新部署较早的成功部署 ID。**与 deployments list 一样解析应用和环境。--dry-run 可预览操作。
**需要连接到 GitHub 的应用。**通过 apps deploy 从本地文件部署的应用不符合条件——没有可重新运行的提交。
--idempotency-key <key> 会发送 Idempotency-Key 标头,以便对重试的入队请求去重,避免排入第二次构建。传入的值必须是非空的可打印 ASCII 字符(不能包含控制字符、换行符或非 ASCII 字符);如需不去重地运行,请完全省略此标志。
**--wait(与 deployments get --wait 的行为相同)。**排入构建只会返回 202,不会返回可供轮询的部署 ID,因此 --wait 会先通过对比入队前后的环境部署列表,找到新部署,然后阻塞等待其达到终态;成功时退出码为 0,否则为 1。--interval <seconds>(最低为 5s)和 --timeout <seconds>(最长为 30 分钟)用于调整轮询,行为与 get 相同。使用此选项,可通过一条命令根据重新部署的结果设置 CI 门禁,无需先排入构建,再单独轮询 deployments get。
webflow apps deployments redeploy dep_abc123 --dry-run --json
webflow apps deployments redeploy dep_abc123 --idempotency-key "$GITHUB_RUN_ID-redeploy" --json
# Roll back and block until the new build finishes; non-zero exit fails the CI step
webflow apps deployments redeploy dep_abc123 --wait --interval 10 --timeout 900 --json
# Roll back: find the last success, then redeploy it
webflow apps deployments list --status success --limit 1 --fields id --json
apps deployments trigger
按需构建所解析环境的当前 HEAD——与 redeploy 相同,但不需要 <depId>:没有先前的部署可供重新运行,它只会构建环境当前配置的分支所指向的内容。--dry-run 可预览操作。--idempotency-key 的行为与 redeploy 相同。
需要连接到 GitHub 的应用,与 redeploy 相同。
它构建的是环境配置的分支,而不是你当前检出的分支。如果二者不同,CLI 会发出警告,但不会阻止操作——如果不确定实际会构建哪个分支,请先检查 apps environments list --fields id,branch。
--wait / --interval / --timeout 的行为与 redeploy 和 deployments get 相同——由于 trigger 也只会返回 202,--wait 会先找到排入队列的部署,再轮询直到其达到终态。
webflow apps deployments trigger --dry-run --json
webflow apps deployments trigger --json
# Build current HEAD and block until it finishes; non-zero exit fails the CI step
webflow apps deployments trigger --wait --interval 10 --timeout 900 --json
apps logs build <depId>
查看部署的构建日志。必须提供 depId——CLI 不会回退到最新部署。省略该参数会立即失败(在身份验证之前),并返回机器可读的 missingFlag: "depId";请先运行 apps deployments list 查找 ID。--fields 默认为 timestamp,message(全部字段:timestamp,message,phase)。
筛选条件:--since <iso>(仅显示指定 ISO 日期时间及之后的日志)、--q <substr>(按消息进行子字符串匹配)、--limit <n>(默认为 100)、--cursor <cursor>(来自上一次响应中 nextCursor 的分页游标)。没有 --level 筛选条件。分页时,每一页都要重新传入相同的 --limit、非默认的 --fields、--since 和 --q。
# Find a deployment ID first — `logs build` will not guess one
webflow apps deployments list --limit 1 --fields id --json
webflow apps logs build dep_abc123 --since 2026-07-14T00:00:00Z --q error --limit 100 --json
apps logs runtime [envId]
查看某个环境的运行时日志。[envId] 默认为应用的唯一环境。如果应用有多个环境且未指定环境,CLI 会在 TTY 中提示选择;无法提示时则会报错并返回 missingFlag: "environmentId"(例如使用 --no-input、CI=true、没有 TTY 或使用 --json 时)——此时请显式传入 env(通过参数、WEBFLOW_APP_ENVIRONMENT_ID 或 cloud.environment_id)。筛选条件与 logs build 相同(--since、--q、--limit、--cursor;没有 --level),并且分页时也必须在每一页重新传入这些参数。
webflow apps logs runtime env_abc123 --q timeout --json
这两个日志命令都支持分页:响应中包含 nextCursor(base64url;没有更多结果时为 null)。将其原样通过 --cursor 传回,即可获取下一页。
apps env-vars
以非交互方式管理 Cloud 应用环境变量。所有四个子命令都接受 --app-id 和 --environment-id(默认通过共享解析器从 webflow.json 获取),以及 --json。绝不会在输出、日志或遥测中打印密钥值——服务器在每次读取时都会对密钥进行掩码处理,CLI 也绝不会解除掩码。
apps env-vars list — --fields 默认为 key,isSecret(全部字段:key,isSecret,value,id,environmentId)。默认不包含 value;即使使用 --fields value,密钥值仍会被掩码。
筛选条件:--key <key>(区分大小写的精确匹配——最多匹配一个变量;仍不会返回其值)和 --q <text>(对键进行不区分大小写的子字符串匹配)。--q 绝不会搜索值——按设计,无法搜索环境变量的内容。
webflow apps env-vars list --json
# Check whether one key is set, and whether it's a secret
webflow apps env-vars list --key API_KEY --json
apps env-vars set <key> [value] — 创建或更新一个变量。[value] 为可选参数:省略后,可从管道标准输入读取或通过提示输入(建议用于密钥,以免内容留在 shell 历史记录中)。--secret 会加密该值(省略时会保留该键已有的密钥属性)。--dry-run 可预览但不写入。
webflow apps env-vars set API_URL https://api.example.com --json
# secret — value read from stdin/prompt, never echoed:
printf '%s' "$TOKEN" | webflow apps env-vars set API_KEY --secret --json
apps env-vars delete <key> — 删除一个变量。--dry-run 可预览。
webflow apps env-vars delete API_KEY --json
apps env-vars import <file> — 从 .env(KEY=value)文件批量新增或更新变量。--secret 会将文件中的所有键标记为密钥。--dry-run 可预览(值会显示为 KEY=********,绝不显示明文)。每个键的失败情况都会报告,并导致非零退出状态。
webflow apps env-vars import .env.production --secret --json
apps environments create [appId]
在应用上创建一个环境,并将其绑定到一个分支,且通过挂载路径提供服务。必须提供 --branch 和 --mount。--dry-run 可预览。
此命令不会部署——环境创建后为空。 随后运行 apps deployments trigger 以构建该环境。
--branch <branch>— 此环境用于构建的 Git 分支。必须是有效的分支名称,且未被此应用的其他环境使用。--mount <path>— 环境提供服务时使用的 URL 路径(例如/app)。在整个站点中必须唯一。--idempotency-key <key>— 可选的重试稳定键(作为请求的requestId发送),用于对重试的创建操作去重。与deployments redeploy使用相同的可打印 ASCII 规则。
webflow apps environments create --branch staging --mount /staging --dry-run --json
webflow apps environments create --branch staging --mount /staging --json
webflow apps deployments trigger --json # the environment is empty until you do this
apps environments update [appId] [envId]
更新环境的 --branch 和/或 --mount(至少需要一个)。唯一性规则与 create 相同。通过位置参数、WEBFLOW_APP_ID / WEBFLOW_APP_ENVIRONMENT_ID、webflow.json 或选择器解析应用和环境;也可以通过显式的 --app-id / --environment-id 标志指定。--dry-run 可预览。
**此命令不会部署。**更改 --branch 后,运行 apps deployments trigger 来构建新分支;在此之前,环境仍会提供旧构建。
webflow apps environments update --branch release --dry-run --json
webflow apps environments update env_abc123 --mount /v2 --json
apps environments delete [appId] [envId]
从应用中删除环境。应用和环境的解析方式与 environments update 相同。需要确认:传入 --yes 可跳过提示;非交互模式下若未传入该标志,命令会因 missingFlag: "yes" 而拒绝删除。--dry-run 可预览。
webflow apps environments delete env_abc123 --dry-run --json
webflow apps environments delete env_abc123 --yes --json
apps link [appId]
通过写入 webflow.json,将当前目录指向现有应用和环境。此命令会验证应用,但不会创建或部署任何内容——可用于从全新克隆中接入应用,或将目录重新指向其他应用/环境。--dry-run 可预览清单变更。
位置参数 [appId] 的优先级高于 --app-id、WEBFLOW_APP_ID 和 webflow.json。--environment-id 用于选择环境。
只有显式传入 --workspace-id 时,才会保存工作区 ID——无法从应用推导或验证该 ID,因此 CLI 会按原样写入,不会猜测。
webflow apps link app_abc123 --environment-id env_abc123 --dry-run --json
webflow apps link app_abc123 --environment-id env_abc123 --json
apps update [appId]
更新应用的 --name、--description 和/或 --github-source(至少需要一个)。--dry-run 可预览。appId 默认取自 webflow.json / WEBFLOW_APP_ID。
--github-source <repo-url> 可将仓库关联到尚未关联仓库的应用,或将已有应用重新指向其他仓库。传入格式为 https://github.com/<owner>/<repo>,并请注意:
- **此命令不会部署。**之后运行
apps deployments trigger,从新关联的仓库进行构建。 - 需要在仓库所有者的账号中安装 Webflow GitHub App,并将其连接到此工作区——这与
apps init --import的前提相同。 - 若要更改环境构建的分支,请使用
apps environments update --branch,而不是此标志。--github-source用于选择仓库;环境用于选择分支。
--json 输出:在 --dry-run 时输出计划——仅包含实际要更改的键,以及 dryRun: true——因此仅更新名称的计划完全不会包含 githubSource 键(而不是设为 null);实际运行时则输出完整的更新后应用对象(结构与 apps get --json 相同)。
webflow apps update app_abc123 --name "New Name" --description "Marketing site app" --json
# Attach a repo, then build it
webflow apps update app_abc123 --github-source https://github.com/acme/site --json
webflow apps deployments trigger --json
apps delete [appId]
删除(或归档——由服务端根据站点类型决定)应用。需要确认:传入 --yes 可跳过提示。非交互模式(--no-input / --json)下若未传入 --yes,命令会因 missingFlag: "yes" 而拒绝删除。--dry-run 可预览影响,但不会执行删除。
--json 输出:无论是试运行还是真实运行,输出文档结构都相同——{ appId, name, action: "archive" | "hard_delete", siteId, siteName, permanent, dryRun, message }——因此两种情况都可由同一个解析器处理。试运行会先读取应用,以填充 name / siteId / siteName / action / permanent;真实的 --json 运行始终需要 --yes(见上文),并会完全跳过读取,因此真实运行时 name、siteId 和 siteName 始终为 null,而 action 则取自删除响应本身。试运行时 message 为 null,实际完成删除后才会填充。
webflow apps delete app_abc123 --dry-run --json
webflow apps delete app_abc123 --yes --json
框架
| 框架 | 初始化脚手架 | 部署支持 | 通过软件包检测 |
|---|---|---|---|
nextjs | ✓(独立 + 关联站点) | ✓ | @opennextjs/cloudflare |
astro | ✓(独立 + 关联站点) | ✓ | @astrojs/cloudflare |
vite | ✓(独立 + 关联站点) | ✓ | vite |
static | ✓(仅独立) | ✓ | 不适用 — 见下文 |
cloud.framework 中的任何其他值都会导致 apps deploy 以代码 1 退出。
static 只会生成独立应用的脚手架 — apps init --new --framework static 可用;apps init --site-id ... --framework static(关联站点)不可用,因为没有关联站点的静态脚手架。对于现有静态项目(已构建或手写),部署时检测无需脚手架:根目录中有 index.html 且没有 package.json 的目录会被自动检测为静态项目(仅资源,无构建、无 worker);在 webflow.json 中显式指定 { "cloud": { "framework": "static" } } 也会选择静态项目,即使存在构建/运行时文件,该设置始终优先。如果目录中有 index.html 以及构建/运行时标识,但未显式指定 framework,则会被拒绝,而不会猜测 — 请显式声明 cloud.framework 以强制采用某种解释。
脚手架会在初始化时从 GitHub 获取。 CLI 会从
Webflow-Examples/hello-world-{astro,nextjs,vite,static-app}*下载脚手架压缩包(关联站点的脚手架来自对应的*-devlink仓库),每个压缩包都固定到已安装 CLI 所需的带版本号(vN)分支。因此,apps init需要访问网络以连接github.com。旧版 CLI 安装仍可正常工作,因为每个版本都会固定到兼容的脚手架分支。
全局标志
| 标志 | 说明 |
|---|---|
--no-input | 禁用所有交互式提示。CI/自动化必需。当 CI=true 或检测不到 TTY 时会自动启用。 |
--manifest <path> | webflow.json 的自定义路径。适用于 monorepo。 |
--skip-update-check | 跳过 @webflow 软件包更新检查。也可设置 WEBFLOW_SKIP_UPDATE_CHECKS=true。 |
--verbose | 显示更多信息以便调试。 |
输出
apps deploy 成功后,CLI 会打印两项输出。
1. 部署面板 URL — 成功时始终显示:
https://webflow.com/dashboard/sites/{siteId}/webflow-cloud/projects/{appId}/environments/{environmentId}/deployments/{deploymentId}
始终向用户显示此 URL。用户可在此查看构建日志、部署状态、历史记录和环境设置。
2. 应用实时 URL — 有条件显示:
🌐 Your cloud app will soon be available at:
https://{your-site}.webflow.io/{mount-path}
如果打印了真实 URL,请将其作为应用实时链接显示给用户。域名是其 Webflow 站点的域名,路径则是部署时使用的 --mount 值(例如 /、/app 或用户选择的其他路径)。之后也可以通过 webflow apps domains --json 以编程方式获取实时 URL。
如果输出内容为 No domains found with the correct mount path configuration yet.,则不要显示实时 URL — 请引导用户通过上方的部署面板链接查看状态并配置域名。
不要获取或 curl 任一 URL 来验证部署 — 只需返回 CLI 打印的内容。若要以编程方式确认状态,请改用 webflow apps deployments list --json 或 webflow apps logs build --json。
示例
完整工作流:搭建脚手架 → GitHub → 连接仪表板 → 推送部署(推荐)
CLI 负责步骤 1 和 2。**步骤 3 必须在 Webflow 仪表板中完成 — CLI 无法执行此操作。**如果不执行步骤 3,推送到 GitHub 并不会触发部署。
# 1. Scaffold locally (CLI)
webflow apps init --new --no-input \
--app-name my-app \
--framework nextjs \
--workspace-id ws_abc123
# 2. Push to GitHub (CLI / git)
git init && git add . && git commit -m "init"
git remote add origin https://github.com/your-org/my-app.git
git push -u origin main
# 3. Connect in the Webflow dashboard (manual, dashboard-only):
# a. Open the Cloud app → Settings → Git
# b. Connect the GitHub account (if not already), pick the repo
# c. Pick the branch to deploy from (e.g. main)
# d. Confirm — the dashboard runs an initial deploy to verify the wiring
#
# After step 3, every push to the selected branch triggers a deploy automatically.
# Skip step 3 and push-to-deploy is NOT active — deploys must be manual or CI-driven.
项目应用工作流:初始化 → 首次部署时配置站点
# Agent-safe init — assumes the token sees a single workspace.
# If the token sees multiple workspaces, ask the user to run this command locally first.
webflow apps init --new --no-input \
--app-name my-app \
--framework astro
# First deploy creates site + app + environment on the backend,
# writes siteId / app_id / environment_id back to webflow.json,
# and writes WEBFLOW_SITE_ID to .env. Subsequent deploys are normal.
cd my-app
webflow apps deploy --no-input \
--app-name my-app \
--mount / \
--environment main \
--skip-update-check
在本地搭建关联站点的 Astro 应用脚手架
webflow apps init \
--no-input \
--app-name my-site-app \
--framework astro \
--mount /app \
--site-id site_abc123
检查现有应用及其最新部署
# Which apps can this token see?
webflow apps list --json
# Details + live URLs for one app (or omit the ID inside the app dir)
webflow apps get app_abc123 --json
webflow apps domains app_abc123 --json
# Most recent deployments (newest first), then drill into one
webflow apps deployments list --limit 5 --json
webflow apps deployments get dep_abc123 --json
# Block until a build reaches a terminal status (exit 0 = success, 1 = not)
webflow apps deployments get dep_abc123 --wait --interval 10 --timeout 900 --json
# Read that deployment's build log, filtered. `logs build` requires the ID —
# it will not fall back to the latest deployment.
webflow apps logs build dep_abc123 --q error --json
管理环境变量
# Non-secret value inline
webflow apps env-vars set PUBLIC_API_URL https://api.example.com
# Secret value piped from stdin (stays out of shell history / logs)
printf '%s' "$DB_PASSWORD" | webflow apps env-vars set DB_PASSWORD --secret
# Bulk import a .env file, all keys secret; preview first
webflow apps env-vars import .env.production --secret --dry-run
webflow apps env-vars import .env.production --secret
# List (secrets shown masked) and delete
webflow apps env-vars list --json
webflow apps env-vars delete OLD_KEY
GitHub Actions CI/CD 流水线(需要自定义步骤时)
name: Deploy to Webflow Cloud
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
# Pin an exact version in CI: the @latest tag moves without notice.
- name: Install Webflow CLI
run: npm install -g @webflow/webflow-cli@latest
- name: Deploy
run: |
webflow apps deploy \
--no-input \
--mount / \
--environment main \
--skip-mount-path-check \
--skip-update-check
env:
WEBFLOW_API_TOKEN: ${{ secrets.WEBFLOW_API_TOKEN }}
WEBFLOW_SITE_ID: ${{ secrets.WEBFLOW_SITE_ID }}
# For project apps pre-first-deploy, omit WEBFLOW_SITE_ID
手动部署(本地 / 单次)
webflow apps deploy \
--no-input \
--app-name my-app \
--mount / \
--environment main \
--skip-mount-path-check \
--skip-update-check
手动部署并处理错误
webflow apps deploy --no-input --mount / --skip-mount-path-check --skip-update-check
if [ $? -ne 0 ]; then
echo "Deploy failed. Log file:"
webflow log
exit 1
fi
指南
CI 中的 Init 与 Deploy
- **
apps init用于在本地进行一次性项目设置 — 切勿在 CI 中运行。**关联站点模式会打开浏览器窗口;没有无头 OAuth 流程。请在本地运行一次apps init,提交结果,然后在 CI 中使用apps deploy。
挂载路径
- 使用
--no-input时,始终必须指定--mount。CLI 不会从webflow.json读取已保存的挂载路径。 - **切勿假设存在默认值。**假设路径为
/或/app,如果应用使用了其他路径,就会导致ENVIRONMENT_MOUNT_MISMATCH。请在 Webflow 仪表板的环境设置中查看,或运行webflow apps environments list --json并读取mount字段(默认表格会省略mount— 使用--fields时必须指定该字段:--fields id,branch,mount)。
不要添加确认步骤
设置 --no-input 后,不要在 apps deploy 之前添加人工确认步骤。这会阻塞无人值守的 CI 运行,而且没有必要 — 部署流程没有内置提示需要绕过。(apps delete 是例外:按设计,非交互模式下必须指定 --yes。)
机器读取时优先使用 --json
对于任何读取或管理命令(list、get、domains、environments、deployments、logs、env-vars),请传入 --json 并解析结构化输出,而不是抓取表格内容。--json 会忽略 --fields 并返回完整的 API 数据结构。
包管理器
无论存在什么锁文件,CLI 只使用 npm。pnpm 和 yarn 锁文件会被忽略 — 这些项目会静默地执行 npm install。
构建时文件管理
在执行 apps deploy 期间,CLI 会临时替换两个文件,并在成功或失败后恢复:
- 框架配置(
next.config.ts/astro.config.mjs)— 重命名为clouduser.*,替换为 CLI 模板,然后恢复。 wrangler.json— 替换为 CLI 模板(原文件保存为clouduser.wrangler.json),然后恢复。部署期间不要修改wrangler.json。
如果框架是 Astro 且缺少 @astrojs/react,CLI 会在不提示的情况下运行 npm install --save @astrojs/react。
Cloudflare 绑定(D1 / KV / R2)
CLI 会在构建时合并 wrangler.json 中的绑定。每种类型都没有固定数量上限 — 存储容量由工作区的云存储权益决定,而非 CLI 中的硬编码数量限制。对于 D1,请在绑定中设置 migrations_dir — CLI 会自动复制迁移文件。
错误处理
- CLI 遇到任何错误都会以代码 1 退出。请检查退出代码 — 不要根据 stdout 中的表情符号或文本模式进行匹配。
- 对于管理命令,(JSON)错误中的
missingFlag会指出需要重新运行命令并提供的标志(appId、environmentId、yes)。 - 发生任何故障后,使用
webflow log获取完整的错误跟踪信息。
部署版本控制
| 情况 | 发送的版本标签 |
|---|---|
| 工作树干净 | git@{40-char-hash} |
| 存在未提交的更改 | git@{40-char-hash}+dirty |
| 不在 git 仓库中 | noversion@{ISO-timestamp} |
部署到生产环境之前,请提交所有更改。
已知限制
apps deploy支持--dry-run和--json,但仅限apps形式——已弃用的别名cloud deploy两者都不支持。确切的输出格式请参见部署标志表。其他所有写入操作也都支持--dry-run:apps init(两种路径——脚手架和--import)、link、update、delete、environments create/update/delete、deployments redeploy/trigger,以及全部四个env-vars子命令。请注意,init上的--dry-run仅注册在apps init,不适用于别名cloud init。- 日志不支持
--watch——日志端点可以轮询,但不会流式传输;要跟踪构建,请按间隔轮询。部署是例外:apps deployments get/redeploy/trigger都支持--wait,可阻塞命令,直到进入终态。 apps logs build需要部署 ID——不会默认使用最新部署。请先通过apps deployments list获取 ID。deployments redeploy/trigger需要已连接 GitHub 的应用——通过apps deploy从本地文件部署的应用不符合条件。--q永远不会搜索值或 ID——只搜索资源的主要名称字段(应用名称、环境分支、变量键)。- 没有回滚命令。
- 构建大小上限为 100 MB——超过 104,857,600 字节的构建会在上传时失败。
故障排除
apps init 上出现 --app-name cannot be empty(或任何必填标志错误)
CLI 会根据 process.stdin.isTTY 判断是否显示交互式提示。Agent 会在没有 TTY 的子进程中调用 CLI,因此整个提示区块会被跳过,并立即针对第一个缺失的必填值触发验证错误。
**解决方法:**显式传入所有必填标志。对于 apps init:
webflow apps init --new --no-input --app-name my-app --framework astro
# or, site-attached:
webflow apps init --no-input --app-name my-app --framework astro --mount /app --site-id site_abc123
严格来说,无需传入 --no-input 也会跳过提示——没有 TTY 已足以实现这一点——但这样可以明确表达约定,并与本技能顶部的必填标志矩阵保持一致。
apps init --new 一直挂起 / 始终无法返回
在项目应用模式下,如果令牌关联了多个工作区,工作区选择会无条件显示提示。传入 --workspace-id 可跳过选择器;如果不传,在非 TTY 环境中 CLI 会挂在提示处。
**解决方法:**向 apps init --new 传入 --workspace-id <id>。Webflow 控制台 UI 中不会显示工作区 ID,因此如果 Agent 没有该 ID,请让用户在现有项目目录中交互式运行 webflow apps deploy。预检提示会选择一个工作区,并将 cloud.workspace_id 写入 webflow.json——之后 Agent 可以读取该值,并在后续运行时传入 --workspace-id。单工作区令牌不受影响——系统会自动跳过选择步骤。
管理命令挂起或因缺少 ID 而报错
读取/管理命令会依次从参数/标志、WEBFLOW_APP_ID / WEBFLOW_APP_ENVIRONMENT_ID、webflow.json 中解析 appId / envId,最后才显示提示。在非 TTY 环境中,如果存在多个应用/环境且未传入任何值,命令会以机器可读的 missingFlag 退出。
**解决方法:**在应用目录中运行命令(这样就能从 webflow.json 解析 ID),或显式传入 ID——apps get <appId>、apps env-vars list --app-id <id> --environment-id <id>、apps logs runtime <envId>。单应用 / 单环境设置会自动选择,无需额外参数。
当我预期部署到关联站点时,却新建了一个已预配站点
症状: 用户想要部署到现有的 Webflow 站点,但 apps deploy 输出了 Creating Cloud app... / Cloud app created: <name>,生成的线上 URL 是 <name>-<hash>.webflow.io(一个刚创建的站点),而不是用户指定的站点。
原因: webflow.json 处于项目应用初始化状态——已设置 cloud.workspace_id,但未设置 siteId——通常是因为该项目之前使用 apps init --new 搭建。预检阶段会优先采用显式标志,但如果未传入任何标志,仍会回退到清单中的值。
预防(主要修复方法): 为 apps deploy 传入 --site-id <existing-site-id>。预检阶段会优先根据标志解析站点身份,因此此参数会覆盖 webflow.json 中的值,并将部署指向预期的 Webflow 站点。已知需要部署到关联站点时,技能应始终传入 --site-id。
webflow apps deploy --no-input \
--site-id site_abc123 \
--mount /app --environment main \
--skip-mount-path-check --skip-update-check
如果新站点已创建,如何恢复:
- 保留部署刚创建的新项目应用站点——无需操作;后续部署会继续指向同一站点(如有歧义,也可以传入新站点的
--site-id)。 - 改为指向现有的 Webflow 站点。 自动预配的站点创建后,无法重新绑定到现有站点。可选方案:
- 从 Webflow 仪表板中删除项目应用(及其自动预配的站点),或运行
webflow apps delete <appId> --yes。 - 编辑
webflow.json(移除cloud.workspace_id、cloud.app_id、cloud.environment_id、siteId)并使用--site-id <existing-site-id>重新运行apps init;或者跳过编辑清单,直接运行apps deploy --site-id <existing-site-id>——预检会将其视为全新的关联站点部署。
- 从 Webflow 仪表板中删除项目应用(及其自动预配的站点),或运行
部署时出现身份验证错误
运行 webflow auth login 并完成浏览器身份验证流程。CLI 会将新的 WEBFLOW_API_TOKEN 写入 .env。登录后重试部署。
在 CI 中无法进行浏览器身份验证——出现身份验证错误意味着密钥中的 WEBFLOW_API_TOKEN 缺失或已过期。请修复密钥,不要尝试运行 webflow auth login。如果 CI 使用旧版 WEBFLOW_SITE_API_TOKEN,部署仍会成功,但运行日志会显示弃用警告;请将密钥重命名为 WEBFLOW_API_TOKEN 以消除警告。
部署到其他工作区
对于项目应用(--new):为 apps init 或 apps deploy 传入 --workspace-id <new-id>,以覆盖 webflow.json 中的 cloud.workspace_id。或者,从 webflow.json 中删除 cloud.workspace_id 并重新运行 init(或在现有项目中交互式部署),重新设置该值。
对于关联站点项目,工作区上下文由身份验证令牌隐式确定。重新运行 webflow auth login,并在浏览器中选择目标工作区;新令牌会替换 .env 中的旧令牌。
首次部署项目应用时出现 missing_scopes 错误
保存到 .env 的令牌不包含创建 Cloud 应用所需的权限范围。重新运行 webflow auth login 并重新批准所需权限范围,然后重试部署。
首次部署项目应用时失败:“your workspace has reached its app limit”
所选工作区(cloud.workspace_id)已达到应用数量上限。请升级工作区套餐,或从 Webflow 仪表板中删除未使用的应用(也可以运行 webflow apps delete <appId> --yes),然后重试。
首次部署项目应用时出现 workspace-not-found / 404 错误
工作区 ID(来自 --workspace-id 标志或 webflow.json 中的 cloud.workspace_id)已无法解析——工作区已删除,或令牌无权访问。CLI 不会预先验证该标志,而是信任其值,并显示来自 createCloudApp 的 404 错误。修复方法:
- 为
apps init或apps deploy传入--workspace-id <correct-id>。 - 或者,从
webflow.json中删除cloud.workspace_id,然后在空目录中重新运行apps init --new --workspace-id <id>,或在现有项目中以交互方式运行webflow apps deploy,让预检提示重新设置工作区 ID。
ENVIRONMENT_MOUNT_MISMATCH
--mount 值与该环境注册的路径不匹配。请通过 webflow apps environments list --json 查看正确的挂载路径(读取 mount 字段),或通过 --fields id,branch,mount 查看表格形式的输出——mount 不在默认字段集中;也可以查看 Webflow 控制面板,然后显式传入该路径。
无法检测框架/必须显式指定框架
包含 cloud 块但没有 framework 键的 webflow.json 不会报错——CLI 会回退到从 package.json 检测框架。只有在显式将 cloud.framework 设置为不受支持的值时,才会触发旧版错误 “webflow.json exists but doesn't contain valid framework information”。
如果仍然无法检测框架(例如 monorepo、缺少框架依赖或设置不明确),请在 apps deploy 中使用 --framework 标志进行修复:
webflow apps deploy --no-input --framework nextjs --mount /app --environment main ...
这会将 cloud.framework 写回 webflow.json,以便后续部署无需再使用该标志。或者直接手动编辑清单文件:
{
"cloud": {
"framework": "nextjs"
}
}
有效值:nextjs、astro、vite、static。任何其他值都会以代码 1 退出。
构建失败,需要完整追踪信息
webflow log
打印包含完整错误追踪信息的最新日志文件路径。