diff --git a/.changeset/sites-public-preview.md b/.changeset/sites-public-preview.md new file mode 100644 index 00000000..22a5b48a --- /dev/null +++ b/.changeset/sites-public-preview.md @@ -0,0 +1,5 @@ +--- +"@bunny.net/cli": minor +--- + +`bunny sites` is now in public preview and listed in `bunny --help`: create a static site, deploy any folder or framework build with instant rollbacks, attach custom domains with SSL, and deploy from GitHub with `bunny sites ci init` diff --git a/AGENTS.md b/AGENTS.md index de3ae7fd..3488d94d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -379,7 +379,7 @@ The CLI must be fully usable by agents, scripts, and pipelines. - **Symlink escapes are refused**, so a checkout cannot plant links that make the installer overwrite unrelated files. Symlinks resolving inside the project are followed. - **`SKILL.md` is a completion sentinel**: boundary-checked, removed first and written last per root, and the installed check requires every global root. Partial installs and failed refreshes therefore re-offer. - **Single source of truth**: `commands/skills/content.ts` embeds `skills/bunny-cli/**` at bundle time via Bun text imports, so the installed skill is always the shipped one. `content.test.ts` fails if `SKILL.md` routes to a reference that is not embedded. -- **Experimental namespaces stay out** of the skill and the AGENTS.md section (`apps`, `registry`); add them back when they graduate to the visible command list in `cli.ts`. `sites` is the exception: hidden from help but documented, since agents deploy with it. +- **Experimental namespaces stay out** of the skill and the AGENTS.md section (`apps`, `registry`); add them back when they graduate to the visible command list in `cli.ts`. - **Onboarding nudges**: `bunny login` makes a one-time interactive offer (`--install-skill` / `--no-install-skill` decide it without prompting). Users who authenticate another way get a one-time passive stderr hint instead. Both share one marker file in the XDG cache dir, so users see at most one. The marker is written on a decline or a successful install only, so an interrupted prompt re-offers. --- diff --git a/packages/cli/README.md b/packages/cli/README.md index a57b3560..f87bd5ce 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -1031,7 +1031,7 @@ bunny scripts docs ### `bunny sites` -> **Experimental**: hidden from `--help` and the landing page while it stabilizes. +> **Preview**: `bunny sites` is in public preview; commands and flags may still change. Host static sites on bunny.net. Each site is two resources provisioned and wired together for you: a **storage zone** holding the files and a **pull zone** serving them over the CDN, with edge rules that route requests to the deploy that should answer them. Zones are named `sites--` (the prefix groups them in the dashboard; the suffix is because zone names are global across bunny.net) while commands take the clean site name. diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index b5e41ea5..c5555329 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -36,6 +36,7 @@ const commands: CommandModule[] = [ scriptsNamespace, sandboxNamespace, storageNamespace, + sitesNamespace, configNamespace, skillsNamespace, docsCommand, @@ -47,7 +48,6 @@ const commands: CommandModule[] = [ const experimentalCommands: CommandModule[] = [ appsNamespace, registryNamespace, - sitesNamespace, streamNamespace, authNamespace, pzNamespace, @@ -184,7 +184,7 @@ export const cli = instance ["Create an edge script", "bunny scripts init"], ["Add a domain to manage DNS", "bunny dns zones create example.com"], ["Create a dev sandbox", "bunny sandbox create my-sandbox"], - // ["Deploy a static site", "bunny sites deploy"], + ["Deploy a static site", "bunny sites deploy"], // ["Deploy an app", "bunny apps deploy"], ]; diff --git a/packages/cli/src/commands/sites/index.ts b/packages/cli/src/commands/sites/index.ts index 810c6032..cd5978d4 100644 --- a/packages/cli/src/commands/sites/index.ts +++ b/packages/cli/src/commands/sites/index.ts @@ -13,18 +13,22 @@ import { sitesShowCommand } from "./show.ts"; import { sitesSslCommand } from "./ssl.ts"; import { sitesUnlinkCommand } from "./unlink.ts"; -export const sitesNamespace = defineNamespace("sites", false, [ - sitesCreateCommand, - sitesListCommand, - sitesShowCommand, - sitesOpenCommand, - sitesDeployCommand, - sitesDeploymentsNamespace, - ...sitesDomainsCommands, - sitesSslCommand, - sitesCiNamespace, - sitesLinkCommand, - sitesUnlinkCommand, - sitesDeleteCommand, - sitesMigrateCommand, -]); +export const sitesNamespace = defineNamespace( + "sites", + "Host static sites (preview).", + [ + sitesCreateCommand, + sitesListCommand, + sitesShowCommand, + sitesOpenCommand, + sitesDeployCommand, + sitesDeploymentsNamespace, + ...sitesDomainsCommands, + sitesSslCommand, + sitesCiNamespace, + sitesLinkCommand, + sitesUnlinkCommand, + sitesDeleteCommand, + sitesMigrateCommand, + ], +);