Repository navigation
feat(skills): document webflow apps commands - #37
Conversation
Document the canonical `webflow apps` namespace in the Webflow Cloud skill and refresh stale `cloud`-namespace content. - Add a "Managing apps" section covering apps list/get/domains, environments list, deployments list/get (with the status enum + polling note), logs build/runtime, env-vars list/set/delete/import, and update/delete — each with a --json example, --fields defaults, the appId/envId resolver precedence, and the --no-input missingFlag contract. Read commands derive the workspace server-side (no --workspace-id). - Present `apps init`/`apps deploy` and `--app-name`/`--app-id` as canonical; mark `cloud init`/`deploy`/`create` and `--project-name`/`--project-id` as deprecated aliases. - Switch detection/config to `cloud.app_id` (legacy `cloud.project_id` still read as a fallback) and document env vars + the CLD-1960 resolver. - Correct the scaffold ref note (Astro v2 + astro7 betaRef, Next.js v1). Co-authored-by: Cursor <cursoragent@cursor.com>
- Simplify the scaffold-fetch note to avoid exposing internal versioning/beta roadmap details publicly. - Remove the "standalone" wording in favor of the existing "project app" term. Co-authored-by: Cursor <cursoragent@cursor.com>
jallegretti-webflow
left a comment
There was a problem hiding this comment.
LGTM, all mentions of standalone, beta and @next are removed as this will be released once CLI hits GA 👍
| --- | ||
| name: webflow-cli:cloud | ||
| description: Initialize, build, and deploy full-stack Webflow applications to Webflow Cloud hosting. Supports site-attached deploys (linked to an existing Webflow site) and project app deploys (independent project, no existing site required). Use when creating new projects, deploying existing ones, or setting up CI/CD pipelines for Webflow Cloud. | ||
| description: Manage full-stack Webflow Cloud apps from the CLI. Initialize, build, and deploy apps (site-attached or project apps), and manage existing apps — list/get apps, view domains and live URLs, inspect environments and deployments, read build and runtime logs, and manage environment variables. Use when creating, deploying, inspecting, or operating Webflow Cloud apps, listing apps, checking deployment status, reading logs, managing env vars, or setting up CI/CD pipelines. |
There was a problem hiding this comment.
This is NIT-picking from my side but it has several repeated connectors. Can we give it another pass on claude/codex to improve the wording ?
ie draft:
description: Create, build, and deploy Webflow Cloud apps from the CLI (site-attached or project apps), and manage existing ones — apps, domains, environments, deployments, build/runtime logs, and environment variables including secrets. Use when initializing or deploying a Cloud app, setting up CI/CD (GitHub Actions or GitHub-linked deploys), setting or importing secrets, retrying or rolling back a deployment, diagnosing a failed build, or resolving app/environment/workspace IDs from webflow.json or env vars.
The `apps` namespace ships only on the CLI's `@next` channel, so document it as beta throughout rather than as generally available. A follow-up PR will flip this once the namespace is promoted to stable. - Add a beta banner, `@next` install instructions, and a gating-tiers table separating the namespace gate from the second gate that independently holds back link/update/delete and environments create/update/delete. - Document commands added since the first draft: `apps init --import` (repo intake), `apps link`, `apps environments create/update/delete`, `apps deployments redeploy/trigger`, and `apps update --github-source`. - Document the list filters (`--site`/`--name`/`--branch`/`--key`/`--q`, `deployments list --status`) and their AND/empty-page semantics, plus `apps domains` pagination. - Correct three stale claims: `deployments get` now has `--wait` (`--interval`/`--timeout`), `logs build` requires a deployment ID rather than defaulting to the latest, and the `--dry-run` support list was missing seven commands. - Fix the GitHub Actions example, which installed `@latest` but invoked `webflow apps deploy`. - Adopt the reviewer's frontmatter description rewrite. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Refreshed this against @jallegretti-webflow flagging directly, since this reverses the basis of your approval ("all mentions of standalone, beta and Why the change: rather than hold the PR until the beta gate is removed, we're documenting the current Why it needed a refresh regardless: the previous commit was from 2026-07-15 and the CLI moved a lot since. Eight commands were missing entirely ( Two things worth a look during review:
@nbverboven-webflow — #44 adds an MCP-side |
Path A only branched on "existing code" vs "empty directory", so a repo already on GitHub was always routed to a local `apps deploy` — producing an app that is not GitHub-connected, and that `deployments trigger`/`redeploy` and dashboard push-to-deploy all refuse. `apps init --import` was documented only as reference material further down, so an agent following the tree never reached it. - Add Path A3 (existing GitHub repository → GitHub-connected app) with site-attached / project-app / CI variants, the GitHub App prerequisite, and the `deployments trigger` follow-up instead of `apps deploy`. - Add the second routing question and an A1 → A3 pointer, and note the `apps update --github-source` recovery for an app created the A1 way. - Add both `--import` forms to the non-TTY required-flag table. Also close three completeness gaps: - `--dry-run` works on the scaffold `apps init`, not just `--import`. - `missingFlag` carries two shapes (bare key from resolvers, flag spelling from `apps init` compatibility refusals) — say so, and note it names the flag to drop for mutually-exclusive pairs. - `mount` is absent from the `environments list` table default; document the full field set and how to request it. Fix two pre-existing broken intra-doc anchors. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The channel-detection examples cited 1.14.0-next.3 / 1.13.1, a major behind the published tags (next 2.8.0-next.0, latest 2.7.0). Update both and say explicitly that the check is the `-next.` suffix, not the numbers, so the example going stale again does not make the guidance wrong. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The MCP skill only references this one, never specific commands. It does so as "use the so there's no drift to worry about. |
jallegretti-webflow
left a comment
There was a problem hiding this comment.
issue (blocking): The apps deploy preflight identity-resolution table has the wrong precedence order and is missing a row.
Actual order per apps/webflow-cli/src/cloud/preflight.ts:67-104: --site-id flag → --workspace-id flag → WEBFLOW_SITE_ID env → manifest.siteId → WEBFLOW_WORKSPACE_ID env → manifest.cloud.workspace_id → (hard error under --no-input, else picker). The doc has manifest values resolving before any env var, and omits WEBFLOW_WORKSPACE_ID from the table entirely. Env vars actually win over the manifest for both site and workspace.
issue (non-blocking): The apps deploy flags table says --mount is "Always required with --no-input," but it isn't — it silently falls back to a /app default instead of erroring.
deployCloudHandler.ts only hard-throws under no-input for the app-name/app-id resolution; --mount goes through input() in inquirer-wrapper.ts:287-301, which under isNoInput() just returns its default ("/app") rather than throwing. Worth calling out explicitly, since the doc elsewhere warns that assuming a default mount causes ENVIRONMENT_MOUNT_MISMATCH — the real risk here is a silent wrong deploy, not the hard failure the flag table implies.
|
Correction to my earlier review comment: I said the silent
So the real silent fallback is root ( |
… claim Addresses review feedback on the apps deploy section. The preflight identity table had env vars resolving after the manifest. `resolveIdentity` in cloud/preflight.ts uses the shared resolver, whose order is flag > env var > manifest, and `WEBFLOW_WORKSPACE_ID` was missing from the table entirely. Reorder, add the missing row, and note the short-circuit: any resolved site wins before workspace resolution is attempted, so a stale WEBFLOW_SITE_ID silently overrides a manifest set up for a project-app deploy. The flags table also called `--mount` "always required with --no-input". It is not enforced. The mount prompt supplies a `/app` default but no validator; the no-input branch of `input()` only returns a default that validates, so it returns null, which `normalizeMountPath` turns into `/`. Root is a valid mount, so the deploy silently lands there. Document it as a wrong-deploy risk rather than a hard failure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Both findings verified against Blocking — precedence order. Confirmed exactly as you described. I also added the consequence that follows from the same code and wasn't called out: Non-blocking —
Net: silent deploy at root, no error and no warning. Flags table no longer says "always required"; it now says to always pass it while stating plainly that it isn't enforced, with a warning giving the mechanism and tying it to the Worth noting this is arguably a CLI bug rather than a docs bug — a prompt default that silently becomes something other than the default under The same @nbverboven-webflow — understood on #44, thanks for checking. Generic reference means no drift risk; dropping that concern. |
Summary
Documents the
webflow appsnamespace in the Webflow Cloud CLI skill (plugins/webflow-skills/skills/webflow-cloud-command/SKILL.md) as beta, and refreshes stalecloud-namespace content. Command surface mirrorsapps.ts/registerAppCommands.tsonwebflow-climain.This PR now describes
appsas@next-only rather than as GA. A follow-up PR will flip the framing to stable once the namespace is promoted — see Follow-up below. This reverses the earlier direction on this PR; details in the approach-change comment.Beta framing
appsnamespace ships only on@webflow/webflow-cli@next; on@latestit doesn't exist and every invocation fails as an unknown command. Includes how to tell the channels apart (a beta install carries a-next.version suffix — there is no public channel flag;__internal-build-channelis hidden and explicitly not public surface).@next, with a note that@latestsuffices forcloud init/cloud deployalone.apps= canonical but beta,cloud= what stable users have today. Records that thecloud init/cloud deploydeprecation notice fires only on beta builds — the CLI never advertises a namespace the user doesn't have.> Beta — @next onlycallout on the whole "Managing apps" section.Commands added since the first draft
apps init --import(repo intake, incl. the--site-idxor--newrule,--mountconditionality,--branch/--idempotency-key/--skip-clone, and the flag-compatibility refusals),apps link,apps environments create/update/delete,apps deployments redeploy/trigger, andapps update --github-source.Also documents the list filters (
--site/--name/--branch/--key/--q,deployments list --status) with their AND-combined / empty-page-≠-absence semantics, andapps domainspagination.Corrections to the earlier draft
deployments gethas--wait(with--interval, floored 5s, and--timeout, capped 30min; exits 0/1 on terminal status). The draft said there was no--watchand gave a manual polling recipe in three places.apps logs buildrequires a deployment ID. The draft said it defaults to the latest deployment; it fails fast, before authenticating, withmissingFlag: "depId". The draft's example would have errored.--dry-runsupport list was missing seven commands.@latestbut invokedwebflow apps deploy— it would have failed with an unknown-command error.descriptionrewrite.CLD-*reference from a section heading — a ticket ID carries no meaning for an agent reading the skill.Follow-up
The
appscommands sit behind two independent gates, and the GA PR needs to account for both:if (isBetaBuild()) initApps(program)incli/webflow.ts)init(incl.--import),deploy,list,get,domains,environments list,deployments list/get/redeploy/trigger,logs build/runtime,env-vars×4isBetaBuild()inapps.ts)link,update,delete,environments create/update/deleteThis PR no longer blocks on the gate removal — it's accurate as written for today's
@next.Test plan
name:/description:present)Notes for reviewers
cms-best-practicesis 2110), and a split would churn the whole diff on an already-reviewed PR. Worth doing as its own PR if we want to start enforcing the limit.WEBFLOW_APP_ENVIRONMENT_ID(the actual name inresolveResourceId.ts).cloud listis documented as the scaffold-template lister (distinct fromapps list), sincecreate/listremaincloud-only.