@spacefast/common 0.0.3 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/agents/connect-targets.d.ts +133 -0
  2. package/dist/agents/connect-targets.js +224 -0
  3. package/dist/brand.d.ts +1 -0
  4. package/dist/brand.js +5 -0
  5. package/dist/config/domains.d.ts +12 -6
  6. package/dist/config/domains.js +30 -38
  7. package/dist/contracts/access.d.ts +829 -129
  8. package/dist/contracts/access.js +771 -148
  9. package/dist/contracts/activity.d.ts +5 -5
  10. package/dist/contracts/activity.js +28 -2
  11. package/dist/contracts/annotations.d.ts +3 -5
  12. package/dist/contracts/api-keys.d.ts +9 -10
  13. package/dist/contracts/api-keys.js +9 -6
  14. package/dist/contracts/archives.d.ts +22 -16
  15. package/dist/contracts/archives.js +11 -4
  16. package/dist/contracts/billing.d.ts +21 -30
  17. package/dist/contracts/builds.d.ts +21 -17
  18. package/dist/contracts/builds.js +12 -0
  19. package/dist/contracts/channels.d.ts +2 -2
  20. package/dist/contracts/common.d.ts +7 -5
  21. package/dist/contracts/common.js +4 -0
  22. package/dist/contracts/continuation.d.ts +63 -0
  23. package/dist/contracts/continuation.js +91 -0
  24. package/dist/contracts/countries.d.ts +2 -0
  25. package/dist/contracts/countries.js +261 -0
  26. package/dist/contracts/deployments.d.ts +34 -34
  27. package/dist/contracts/device-auth.d.ts +4 -11
  28. package/dist/contracts/device-auth.js +4 -0
  29. package/dist/contracts/docs.d.ts +119 -0
  30. package/dist/contracts/docs.js +51 -0
  31. package/dist/contracts/domains.d.ts +295 -253
  32. package/dist/contracts/domains.js +26 -4
  33. package/dist/contracts/enums.d.ts +17 -18
  34. package/dist/contracts/enums.js +25 -14
  35. package/dist/contracts/error-code-meta.d.ts +84 -0
  36. package/dist/contracts/error-code-meta.js +99 -10
  37. package/dist/contracts/error-codes.d.ts +1 -1
  38. package/dist/contracts/error-codes.js +17 -0
  39. package/dist/contracts/events.d.ts +13 -13
  40. package/dist/contracts/features.d.ts +93 -23
  41. package/dist/contracts/features.js +178 -13
  42. package/dist/contracts/git.d.ts +3 -9
  43. package/dist/contracts/ids.d.ts +5 -0
  44. package/dist/contracts/ids.js +5 -0
  45. package/dist/contracts/internal.d.ts +3 -3
  46. package/dist/contracts/mcp.d.ts +34 -36
  47. package/dist/contracts/me.d.ts +8 -8
  48. package/dist/contracts/me.js +1 -1
  49. package/dist/contracts/oauth-resources.d.ts +19 -8
  50. package/dist/contracts/oauth-resources.js +44 -13
  51. package/dist/contracts/operations.d.ts +2 -2
  52. package/dist/contracts/plan-policy.d.ts +4 -4
  53. package/dist/contracts/platform.d.ts +3 -105
  54. package/dist/contracts/platform.js +0 -50
  55. package/dist/contracts/push-new.d.ts +4 -4
  56. package/dist/contracts/quotas.d.ts +2 -0
  57. package/dist/contracts/quotas.js +8 -0
  58. package/dist/contracts/repository-connections.d.ts +1 -3
  59. package/dist/contracts/resources.d.ts +112 -28
  60. package/dist/contracts/resources.js +26 -2
  61. package/dist/contracts/routes.d.ts +0 -2
  62. package/dist/contracts/runtime-api.d.ts +365 -43
  63. package/dist/contracts/runtime-api.js +275 -6
  64. package/dist/contracts/sites.d.ts +45 -28
  65. package/dist/contracts/sites.js +21 -0
  66. package/dist/contracts/space-config.d.ts +201 -2
  67. package/dist/contracts/space-config.js +135 -5
  68. package/dist/contracts/spaces.d.ts +423 -162
  69. package/dist/contracts/spaces.js +94 -8
  70. package/dist/contracts/superadmin-emails.d.ts +7 -5
  71. package/dist/contracts/superadmin-emails.js +8 -0
  72. package/dist/contracts/superadmin-queues.d.ts +32 -32
  73. package/dist/contracts/superadmin-spaces.d.ts +418 -24
  74. package/dist/contracts/superadmin-spaces.js +24 -0
  75. package/dist/contracts/superadmin-tenants.d.ts +8 -8
  76. package/dist/contracts/superadmin.d.ts +17 -104
  77. package/dist/contracts/superadmin.js +6 -14
  78. package/dist/contracts/tags.d.ts +42 -41
  79. package/dist/contracts/tags.js +2 -1
  80. package/dist/contracts/teams.d.ts +40 -23
  81. package/dist/contracts/teams.js +20 -1
  82. package/dist/contracts/theme-json.d.ts +30 -0
  83. package/dist/contracts/theme-json.js +48 -0
  84. package/dist/contracts/transfers.d.ts +9 -9
  85. package/dist/contracts/variables.d.ts +14 -16
  86. package/dist/contracts/variables.js +0 -5
  87. package/dist/contracts/webhooks.d.ts +6 -4
  88. package/dist/contracts/webhooks.js +1 -1
  89. package/dist/contracts/zero.d.ts +13 -18
  90. package/dist/docs/agent-prose.d.ts +43 -3
  91. package/dist/docs/agent-prose.js +153 -10
  92. package/dist/docs/agent-setup.js +48 -15
  93. package/dist/docs/agent-solutions.d.ts +5 -5
  94. package/dist/docs/agent-solutions.js +2 -2
  95. package/dist/docs/catalog.d.ts +650 -0
  96. package/dist/docs/catalog.js +758 -0
  97. package/dist/docs/error-docs.d.ts +0 -2
  98. package/dist/docs/error-docs.js +89 -35
  99. package/dist/docs/index-build.d.ts +17 -0
  100. package/dist/docs/index-build.js +24 -0
  101. package/dist/docs/search.d.ts +54 -0
  102. package/dist/docs/search.js +96 -0
  103. package/dist/docs/skill-distribution.d.ts +5 -3
  104. package/dist/docs/skill-distribution.js +8 -8
  105. package/dist/utils/access-match.d.ts +39 -0
  106. package/dist/utils/access-match.js +296 -0
  107. package/dist/utils/auth-redirect.d.ts +3 -1
  108. package/dist/utils/auth-redirect.js +21 -1
  109. package/dist/utils/build-settings.d.ts +6 -0
  110. package/dist/utils/build-settings.js +429 -46
  111. package/dist/utils/claim-token.d.ts +8 -0
  112. package/dist/utils/claim-token.js +23 -2
  113. package/dist/utils/content-type.d.ts +1 -0
  114. package/dist/utils/content-type.js +1 -1
  115. package/dist/utils/credential-policy.d.ts +54 -0
  116. package/dist/utils/{access-policy.js → credential-policy.js} +28 -2
  117. package/dist/utils/gate-theme.d.ts +61 -0
  118. package/dist/utils/gate-theme.js +217 -0
  119. package/dist/utils/git-repository.d.ts +0 -1
  120. package/dist/utils/git-repository.js +0 -3
  121. package/dist/utils/id-hints.d.ts +8 -0
  122. package/dist/utils/id-hints.js +61 -0
  123. package/dist/utils/local-space-state.d.ts +91 -0
  124. package/dist/utils/local-space-state.js +251 -0
  125. package/dist/utils/oauth-signed-query.d.ts +8 -0
  126. package/dist/utils/oauth-signed-query.js +26 -0
  127. package/dist/utils/publish-detection.d.ts +0 -8
  128. package/dist/utils/publish-detection.js +0 -93
  129. package/dist/utils/publish-policy.d.ts +6 -5
  130. package/dist/utils/publish-policy.js +71 -7
  131. package/dist/utils/query-keys.d.ts +17 -6
  132. package/dist/utils/query-keys.js +27 -4
  133. package/dist/utils/runtime-paths.d.ts +0 -1
  134. package/dist/utils/runtime-paths.js +0 -1
  135. package/dist/utils/runtime-upload-batch.d.ts +18 -0
  136. package/dist/utils/runtime-upload-batch.js +90 -0
  137. package/dist/utils/runtime-upload.d.ts +2 -0
  138. package/dist/utils/runtime-upload.js +5 -0
  139. package/dist/utils/space-config.d.ts +4 -0
  140. package/dist/utils/space-config.js +10 -1
  141. package/dist/utils/space-theme.d.ts +2 -0
  142. package/dist/utils/space-theme.js +9 -0
  143. package/dist/utils/static-runtime-policy.d.ts +1 -1
  144. package/dist/utils/static-runtime-policy.js +47 -15
  145. package/dist/utils/upload-session.d.ts +1 -1
  146. package/dist/utils/wpcom-auth-redirects.d.ts +32 -2
  147. package/dist/utils/wpcom-auth-redirects.js +26 -10
  148. package/dist/vocabulary.d.ts +130 -30
  149. package/dist/vocabulary.js +77 -36
  150. package/package.json +16 -1
  151. package/dist/contracts/account.d.ts +0 -28
  152. package/dist/contracts/account.js +0 -54
  153. package/dist/contracts/intercom.d.ts +0 -6
  154. package/dist/contracts/intercom.js +0 -5
  155. package/dist/contracts/telemetry.d.ts +0 -2
  156. package/dist/contracts/telemetry.js +0 -1
  157. package/dist/utils/access-policy.d.ts +0 -39
  158. package/dist/utils/error-display.d.ts +0 -7
  159. package/dist/utils/error-display.js +0 -42
@@ -0,0 +1,650 @@
1
+ import type { CliDisclosureTier } from "../vocabulary.js";
2
+ /** Which part of the docs a page belongs to (runtime list + derived type). */
3
+ export declare const DOC_KINDS: readonly ["guide", "cli", "api", "recipe", "workflow", "error"];
4
+ /** Which part of the docs a page belongs to. */
5
+ export type DocKind = (typeof DOC_KINDS)[number];
6
+ /** One searchable documentation page. */
7
+ export interface DocEntry {
8
+ /** Stable, lowercase topic id used by `sf docs <topic>` (e.g. "publish", "api/spaces"). */
9
+ readonly slug: string;
10
+ /** Human title shown in results. */
11
+ readonly title: string;
12
+ /** Which docs area this page lives in. */
13
+ readonly kind: DocKind;
14
+ /** Disclosure tier that gates the page in `sf docs` listings. */
15
+ readonly tier: CliDisclosureTier;
16
+ /** One-line summary printed alongside the title. */
17
+ readonly summary: string;
18
+ /** Extra search terms that should match this page. */
19
+ readonly keywords: readonly string[];
20
+ /** Canonical docs URL. */
21
+ readonly url: string;
22
+ /** Short printable body shown by `sf docs <topic>`. */
23
+ readonly body: string;
24
+ }
25
+ /** Base URL all bundled docs links resolve against. */
26
+ export declare const DOCS_BASE_URL = "https://spacefast.com/docs";
27
+ /** Base URL for the standalone recipe pages (served at /recipes, not /docs). */
28
+ export declare const RECIPES_BASE_URL = "https://spacefast.com/recipes";
29
+ export declare const DOCS_CATALOG: readonly [{
30
+ readonly slug: "quickstart";
31
+ readonly title: "Quickstart";
32
+ readonly kind: "guide";
33
+ readonly tier: "essential";
34
+ readonly summary: "Publish your first space in under two minutes.";
35
+ readonly keywords: readonly ["start", "getting started", "first", "new", "setup", "hello world"];
36
+ readonly url: "https://spacefast.com/docs/quickstart";
37
+ readonly body: "Install the CLI, run `sf init` in your working directory, then `sf publish` to take the current build live on a new space.";
38
+ }, {
39
+ readonly slug: "publishing";
40
+ readonly title: "Publishing a space";
41
+ readonly kind: "guide";
42
+ readonly tier: "essential";
43
+ readonly summary: "How `sf publish` builds, uploads, and goes live.";
44
+ readonly keywords: readonly ["publish", "go live", "upload", "release", "static"];
45
+ readonly url: "https://spacefast.com/docs/publishing";
46
+ readonly body: "`sf publish` snapshots your output directory into an immutable version and promotes it to the production channel. Use `--no-wait` to return before serving finishes.";
47
+ }, {
48
+ readonly slug: "versions-and-rollback";
49
+ readonly title: "Versions and rollback";
50
+ readonly kind: "guide";
51
+ readonly tier: "essential";
52
+ readonly summary: "Every publish is an immutable version you can roll back to.";
53
+ readonly keywords: readonly ["version", "rollback", "history", "revert", "channel", "promote"];
54
+ readonly url: "https://spacefast.com/docs/rollback";
55
+ readonly body: "List versions with `sf versions`, promote one to a channel, and undo a bad publish instantly with `sf rollback`.";
56
+ }, {
57
+ readonly slug: "anonymous-publish";
58
+ readonly title: "Anonymous publish and claim";
59
+ readonly kind: "guide";
60
+ readonly tier: "essential";
61
+ readonly summary: "Publish without an account, then claim the space with its token.";
62
+ readonly keywords: readonly ["anonymous", "claim", "unclaimed", "agent", "token", "adopt"];
63
+ readonly url: "https://spacefast.com/docs/anonymous-publish";
64
+ readonly body: "Publish without logging in to get an instant URL and a claim token; run `sf spaces claim` with that token to bind the space to your account.";
65
+ }, {
66
+ readonly slug: "agents";
67
+ readonly title: "Agents and MCP";
68
+ readonly kind: "guide";
69
+ readonly tier: "essential";
70
+ readonly summary: "Let an AI agent publish and operate spaces via the CLI, API, or MCP.";
71
+ readonly keywords: readonly ["agent", "ai", "mcp", "model context protocol", "automation", "assistant"];
72
+ readonly url: "https://spacefast.com/docs/agents";
73
+ readonly body: "Agents use the same REST API and CLI as humans. Install the MCP server with `sf mcp install` so an assistant can publish, inspect, and manage spaces with structured tools.";
74
+ }, {
75
+ readonly slug: "workflow/publish-curl";
76
+ readonly title: "No-install publish with curl";
77
+ readonly kind: "workflow";
78
+ readonly tier: "full";
79
+ readonly summary: "Publish a file or zipped output folder directly to /v1/publish. No account, CLI install, or MCP setup is required for anonymous publishes.";
80
+ readonly keywords: readonly ["publish", "curl", "anonymous", "no install", "claim"];
81
+ readonly url: "https://spacefast.com/docs/agents#publish-with-curl";
82
+ readonly body: "curl publish static file folder archive zip anonymous no account no install live URL immutable version claim link /v1/publish";
83
+ }, {
84
+ readonly slug: "workflow/publish-receipt";
85
+ readonly title: "Publish receipt fields";
86
+ readonly kind: "workflow";
87
+ readonly tier: "full";
88
+ readonly summary: "Use the receipt as the source of truth: space.liveUrl, version.immutableUrl, shareBlurb, claim.url, claim.expiresAt, links, diagnostics, and errors.";
89
+ readonly keywords: readonly ["receipt", "share", "claim", "diagnostics"];
90
+ readonly url: "https://spacefast.com/docs/api#publish";
91
+ readonly body: "receipt liveUrl immutableUrl shareBlurb claim url expiresAt diagnostics links finalize promote upload errors docsUrl";
92
+ }, {
93
+ readonly slug: "workflow/continue-after-claim";
94
+ readonly title: "Keep publishing after the user claims";
95
+ readonly kind: "workflow";
96
+ readonly tier: "full";
97
+ readonly summary: "After the owner claims an anonymous space with continuation enabled, exchange the saved claim token once for a durable space-scoped access token, save it over the claim token, and keep publishing.";
98
+ readonly keywords: readonly ["continue", "exchange", "claim token", "space_claimed_credential_available", "continuation"];
99
+ readonly url: "https://spacefast.com/docs/agents#continue-after-claim";
100
+ readonly body: "continue continuation claim token exchange voucher continue_space POST /v1/anonymous-claim/exchange space_claimed_credential_available continuation_used continuation_unavailable durable access token state.json update after claim claim_status";
101
+ }, {
102
+ readonly slug: "workflow/secret-handling";
103
+ readonly title: "Secret handling rules";
104
+ readonly kind: "workflow";
105
+ readonly tier: "full";
106
+ readonly summary: "Treat claim tokens, upload tokens, device codes, API keys, auth files, and .spacefast state as credentials. Do not print, commit, archive, or log them.";
107
+ readonly keywords: readonly ["secret", "token", "claim token", "redact"];
108
+ readonly url: "https://spacefast.com/docs/agents#secret-handling";
109
+ readonly body: "secret handling claim token upload token device code API key auth file .spacefast state redact logs transcripts archive";
110
+ }, {
111
+ readonly slug: "workflow/cli-surface";
112
+ readonly title: "CLI command surface";
113
+ readonly kind: "workflow";
114
+ readonly tier: "full";
115
+ readonly summary: "Use sf for repeat work: publish, versions, rollback, logs, domains, passwords, teams, API calls, and On-Device MCP serving.";
116
+ readonly keywords: readonly ["sf", "cli", "spacefast", "mcp", "json"];
117
+ readonly url: "https://spacefast.com/docs/cli";
118
+ readonly body: "sf spacefast CLI publish versions rollback logs domains passwords teams api mcp setup profile login --json";
119
+ }, {
120
+ readonly slug: "workflow/mcp-local";
121
+ readonly title: "On-Device MCP through the CLI";
122
+ readonly kind: "workflow";
123
+ readonly tier: "full";
124
+ readonly summary: "Run sf mcp for stdio or sf mcp http --host 127.0.0.1 --port 3945 --path /mcp for On-Device Streamable HTTP.";
125
+ readonly keywords: readonly ["mcp", "stdio", "streamable http", "on-device", "local"];
126
+ readonly url: "https://spacefast.com/docs/agents#mcp";
127
+ readonly body: "MCP on-device local CLI stdio streamable HTTP sf mcp roots files workspace tool calls structuredContent apps";
128
+ }, {
129
+ readonly slug: "workflow/workspace-files";
130
+ readonly title: "Agent workspace files";
131
+ readonly kind: "workflow";
132
+ readonly tier: "full";
133
+ readonly summary: "Hosted MCP workspace tools edit, import, export, and publish a durable virtual workspace; On-Device MCP workspace tools edit the bounded local root.";
134
+ readonly keywords: readonly ["workspace", "files", "patch", "diff", "virtual workspace", "workspace import", "workspace export", "just-bash"];
135
+ readonly url: "https://spacefast.com/docs/agents#workspace-files";
136
+ readonly body: "workspace file editing read write patch diff list manifest import export import_url hosted virtual workspace just-bash shell handoff on-device root SPACEFAST_MCP_WORKSPACE_ROOT secret scanning bounded files";
137
+ }, {
138
+ readonly slug: "workflow/mcp-resources";
139
+ readonly title: "MCP resources for account, teams, spaces, and policy";
140
+ readonly kind: "workflow";
141
+ readonly tier: "full";
142
+ readonly summary: "Use read-only resources for bounded context before tools: account/current, teams/current, spaces/recent, space detail, recent versions, policy/current, and workspace/manifest.";
143
+ readonly keywords: readonly ["resources", "account", "teams", "spaces", "policy", "context"];
144
+ readonly url: "https://spacefast.com/docs/agents#mcp-resources";
145
+ readonly body: "MCP resources account current teams current list spaces recent space detail versions recent domains logs summary policy current workspace manifest tools catalog read-only context redacted";
146
+ }, {
147
+ readonly slug: "workflow/space-files";
148
+ readonly title: "Space file conventions";
149
+ readonly kind: "workflow";
150
+ readonly tier: "full";
151
+ readonly summary: "Spacefast recognizes _redirects, _headers, nearest 404.html, and sf.jsonc. Static artifacts are served as files; server code is not executed.";
152
+ readonly keywords: readonly ["_redirects", "_headers", "sf.jsonc", "spacefast.jsonc", "404"];
153
+ readonly url: "https://spacefast.com/docs/configuration";
154
+ readonly body: "_redirects _headers 404.html sf.jsonc static artifact server code not executed proxy rewrite headers basic auth";
155
+ }, {
156
+ readonly slug: "workflow/domains-diagnostics";
157
+ readonly title: "Domains and DNS diagnostics";
158
+ readonly kind: "workflow";
159
+ readonly tier: "full";
160
+ readonly summary: "Use domain diagnostics for attach, verification, DNS, nameserver, and rollback-safe recovery steps.";
161
+ readonly keywords: readonly ["domain", "dns", "verification"];
162
+ readonly url: "https://spacefast.com/docs/domains";
163
+ readonly body: "domains DNS diagnostics attach verification nameservers custom domain certificate recovery instructions";
164
+ }, {
165
+ readonly slug: "workflow/logs-diagnostics";
166
+ readonly title: "Logs and diagnostics";
167
+ readonly kind: "workflow";
168
+ readonly tier: "full";
169
+ readonly summary: "Use access logs for traffic questions, runtime logs for serving diagnostics, and build logs for publish/finalize failures.";
170
+ readonly keywords: readonly ["logs", "diagnostics", "build logs"];
171
+ readonly url: "https://spacefast.com/docs/builds#watch-and-manage-builds";
172
+ readonly body: "logs access runtime build diagnostics publish finalize failures request id docsUrl suggestions recovery";
173
+ }, {
174
+ readonly slug: "workflow/agent-auth";
175
+ readonly title: "Agent accounts and OAuth";
176
+ readonly kind: "workflow";
177
+ readonly tier: "full";
178
+ readonly summary: "Prefer OAuth agent accounts with private_key_jwt and SPACEFAST_AGENT_CONFIG for On-Device MCP and automation instead of broad shared API keys.";
179
+ readonly keywords: readonly ["oauth", "agent account", "private_key_jwt", "SPACEFAST_AGENT_CONFIG"];
180
+ readonly url: "https://spacefast.com/docs/agents#agent-accounts";
181
+ readonly body: "OAuth agent account private_key_jwt SPACEFAST_AGENT_CONFIG client credentials scoped token mcp automation teams";
182
+ }, {
183
+ readonly slug: "custom-domains";
184
+ readonly title: "Custom domains";
185
+ readonly kind: "guide";
186
+ readonly tier: "full";
187
+ readonly summary: "Attach your own domain and let Spacefast manage TLS.";
188
+ readonly keywords: readonly ["domain", "dns", "https", "tls", "certificate", "cname", "nameserver"];
189
+ readonly url: "https://spacefast.com/docs/domains";
190
+ readonly body: "Add a domain with `sf domains add`, point DNS at Spacefast, and a certificate is issued automatically. Inspect status with `sf domains check`.";
191
+ }, {
192
+ readonly slug: "configuration";
193
+ readonly title: "Configuration (sf.jsonc)";
194
+ readonly kind: "guide";
195
+ readonly tier: "full";
196
+ readonly summary: "Ship space metadata and SPA settings alongside your files.";
197
+ readonly keywords: readonly ["config", "sf.jsonc", "spacefast.jsonc", "metadata", "spa", "schema", "settings"];
198
+ readonly url: "https://spacefast.com/docs/configuration";
199
+ readonly body: "Add `sf.jsonc` at your publish root so configuration travels with each version and rolls back with it. `sf init` scaffolds it with a `$schema` pointer for autocomplete.";
200
+ }, {
201
+ readonly slug: "environment-variables";
202
+ readonly title: "Environment variables";
203
+ readonly kind: "guide";
204
+ readonly tier: "full";
205
+ readonly summary: "Set build-time configuration and secrets per space.";
206
+ readonly keywords: readonly ["env", "environment", "secrets", "config", "variables", "dotenv"];
207
+ readonly url: "https://spacefast.com/docs/configuration";
208
+ readonly body: "Manage a space's variables with `sf env set` / `sf env ls`, or import a dotenv file with `sf env import`. Secret values are masked in `--json` output.";
209
+ }, {
210
+ readonly slug: "access-control";
211
+ readonly title: "Access control";
212
+ readonly kind: "guide";
213
+ readonly tier: "full";
214
+ readonly summary: "Password-protect a space or grant access to specific people.";
215
+ readonly keywords: readonly ["access", "password", "grant", "ban", "private", "audience", "auth"];
216
+ readonly url: "https://spacefast.com/docs/access";
217
+ readonly body: "Gate a space with `sf password set`, grant individuals with `sf access grant`, and review effective rules with `sf access effective`.";
218
+ }, {
219
+ readonly slug: "redirects";
220
+ readonly title: "Redirects";
221
+ readonly kind: "guide";
222
+ readonly tier: "full";
223
+ readonly summary: "Declare redirect rules that travel with each version.";
224
+ readonly keywords: readonly ["redirect", "rewrite", "routing", "301", "302", "_redirects"];
225
+ readonly url: "https://spacefast.com/docs/redirects";
226
+ readonly body: "Add a `_redirects` file at your publish root to redirect, rewrite, or proxy; it compiles at finalize and rolls back with the version. Inspect resolution with `sf routing inspect`.";
227
+ }, {
228
+ readonly slug: "headers";
229
+ readonly title: "Custom headers";
230
+ readonly kind: "guide";
231
+ readonly tier: "full";
232
+ readonly summary: "Attach response headers and path-scoped Basic Auth.";
233
+ readonly keywords: readonly ["headers", "cache", "security", "basic auth", "_headers", "cors"];
234
+ readonly url: "https://spacefast.com/docs/headers";
235
+ readonly body: "Add a `_headers` file at your publish root to set or remove response headers per path. Path-scoped Basic Auth credentials travel with the publish.";
236
+ }, {
237
+ readonly slug: "builds";
238
+ readonly title: "Build from Git";
239
+ readonly kind: "guide";
240
+ readonly tier: "full";
241
+ readonly summary: "Connect a repository so pushes build and publish automatically.";
242
+ readonly keywords: readonly ["build", "git", "github", "ci", "push", "connect", "preview"];
243
+ readonly url: "https://spacefast.com/docs/builds";
244
+ readonly body: "Connect a repository with `sf git connect`; each push runs your build on Spacefast and publishes a version, with branches and pull requests getting preview URLs.";
245
+ }, {
246
+ readonly slug: "collab";
247
+ readonly title: "Collaboration and annotations";
248
+ readonly kind: "guide";
249
+ readonly tier: "full";
250
+ readonly summary: "Leave review comments on a published space.";
251
+ readonly keywords: readonly ["collab", "annotations", "comments", "review", "feedback", "annotate"];
252
+ readonly url: "https://spacefast.com/docs/collab";
253
+ readonly body: "Annotate a live space with review comments and resolve them from the CLI with `sf annotations` or in the dashboard.";
254
+ }, {
255
+ readonly slug: "analytics";
256
+ readonly title: "Analytics";
257
+ readonly kind: "guide";
258
+ readonly tier: "full";
259
+ readonly summary: "See traffic and visitor counts for a space.";
260
+ readonly keywords: readonly ["analytics", "traffic", "visitors", "stats", "metrics", "pageviews"];
261
+ readonly url: "https://spacefast.com/docs/cli";
262
+ readonly body: "Inspect a space's traffic with `sf analytics`; history depth and granularity depend on the team's plan.";
263
+ }, {
264
+ readonly slug: "proxy-routes";
265
+ readonly title: "Proxy routes";
266
+ readonly kind: "guide";
267
+ readonly tier: "reference";
268
+ readonly summary: "Proxy selected paths to an upstream origin.";
269
+ readonly keywords: readonly ["proxy", "upstream", "route", "api", "backend", "rewrite"];
270
+ readonly url: "https://spacefast.com/docs/proxy-routes";
271
+ readonly body: "Forward specific path prefixes to an external upstream so a static space can front a dynamic API without exposing the origin.";
272
+ }, {
273
+ readonly slug: "image-acceleration";
274
+ readonly title: "Image acceleration";
275
+ readonly kind: "guide";
276
+ readonly tier: "reference";
277
+ readonly summary: "Serve optimized, resized images from your space.";
278
+ readonly keywords: readonly ["image", "images", "optimization", "resize", "cdn", "acceleration"];
279
+ readonly url: "https://spacefast.com/docs/image-acceleration";
280
+ readonly body: "Spacefast can resize and re-encode images on the fly so you ship one source asset and serve device-appropriate variants.";
281
+ }, {
282
+ readonly slug: "integrations/nextjs";
283
+ readonly title: "Next.js integration";
284
+ readonly kind: "guide";
285
+ readonly tier: "reference";
286
+ readonly summary: "Publish a Next.js static export to a space.";
287
+ readonly keywords: readonly ["nextjs", "next", "react", "framework", "integration", "export"];
288
+ readonly url: "https://spacefast.com/docs/integrations/nextjs";
289
+ readonly body: "Build your Next.js static export and publish the output directory with `sf publish`; `sf init` detects the framework and sets the output path.";
290
+ }, {
291
+ readonly slug: "integrations/vite";
292
+ readonly title: "Vite integration";
293
+ readonly kind: "guide";
294
+ readonly tier: "reference";
295
+ readonly summary: "Publish a Vite build to a space.";
296
+ readonly keywords: readonly ["vite", "react", "vue", "svelte", "framework", "integration", "build"];
297
+ readonly url: "https://spacefast.com/docs/integrations/vite";
298
+ readonly body: "Run your Vite build and publish `dist/` with `sf publish`; `sf init` detects Vite and preconfigures the output directory.";
299
+ }, {
300
+ readonly slug: "limits";
301
+ readonly title: "Limits and quotas";
302
+ readonly kind: "guide";
303
+ readonly tier: "reference";
304
+ readonly summary: "File counts, sizes, and rate limits per plan.";
305
+ readonly keywords: readonly ["limits", "quota", "size", "rate limit", "plan", "storage"];
306
+ readonly url: "https://spacefast.com/docs/limits";
307
+ readonly body: "Reference for per-space file counts, archive and file size ceilings, version retention, and rate limits, which vary by plan.";
308
+ }, {
309
+ readonly slug: "troubleshooting";
310
+ readonly title: "Troubleshooting";
311
+ readonly kind: "guide";
312
+ readonly tier: "reference";
313
+ readonly summary: "Diagnose failed publishes, builds, and domains.";
314
+ readonly keywords: readonly ["troubleshoot", "debug", "error", "doctor", "diagnose", "fix"];
315
+ readonly url: "https://spacefast.com/docs/troubleshooting";
316
+ readonly body: "Common publish, build, and domain failures and how to resolve them. Run `sf doctor` to check your local setup and auth state.";
317
+ }, {
318
+ readonly slug: "migrate-from";
319
+ readonly title: "Migrate to Spacefast";
320
+ readonly kind: "guide";
321
+ readonly tier: "reference";
322
+ readonly summary: "Move from Netlify, Vercel, and other hosts.";
323
+ readonly keywords: readonly ["migrate", "netlify", "vercel", "cloudflare", "github pages", "here.now", "import"];
324
+ readonly url: "https://spacefast.com/docs/migrate-from";
325
+ readonly body: "Step-by-step migrations that map another host's build output, redirects, and headers onto a Spacefast space.";
326
+ }, {
327
+ readonly slug: "cli";
328
+ readonly title: "CLI overview";
329
+ readonly kind: "cli";
330
+ readonly tier: "essential";
331
+ readonly summary: "Install, authenticate, and the first-publish command path.";
332
+ readonly keywords: readonly ["cli", "sf", "command", "install", "overview", "help"];
333
+ readonly url: "https://spacefast.com/docs/cli";
334
+ readonly body: "Run `sf help` for the essential commands, `sf help --full` for everything. The CLI emits a `{ data }` / `{ error }` JSON envelope under `--json`.";
335
+ }, {
336
+ readonly slug: "cli/publish";
337
+ readonly title: "sf publish";
338
+ readonly kind: "cli";
339
+ readonly tier: "essential";
340
+ readonly summary: "Build, upload, and take the current output live on a space.";
341
+ readonly keywords: readonly ["publish", "sf publish", "go live", "upload", "release"];
342
+ readonly url: "https://spacefast.com/docs/cli";
343
+ readonly body: "`sf publish [DIR]` snapshots a directory into an immutable version and promotes it to the production channel. Add `--no-wait` to return before serving finishes.";
344
+ }, {
345
+ readonly slug: "login";
346
+ readonly title: "sf login";
347
+ readonly kind: "cli";
348
+ readonly tier: "essential";
349
+ readonly summary: "Authenticate the CLI with your Spacefast account.";
350
+ readonly keywords: readonly ["login", "auth", "authenticate", "token", "device", "signin"];
351
+ readonly url: "https://spacefast.com/docs/cli";
352
+ readonly body: "`sf login` starts the device-authorization flow; for non-interactive use pass `--token` or set `SPACEFAST_TOKEN`.";
353
+ }, {
354
+ readonly slug: "init";
355
+ readonly title: "sf init";
356
+ readonly kind: "cli";
357
+ readonly tier: "essential";
358
+ readonly summary: "Scaffold an sf.jsonc config in the current directory.";
359
+ readonly keywords: readonly ["init", "config", "scaffold", "sf.jsonc", "setup"];
360
+ readonly url: "https://spacefast.com/docs/cli";
361
+ readonly body: "`sf init` detects your framework and writes a starter `sf.jsonc` so subsequent `sf publish` runs are zero-config.";
362
+ }, {
363
+ readonly slug: "claim";
364
+ readonly title: "sf spaces claim";
365
+ readonly kind: "cli";
366
+ readonly tier: "essential";
367
+ readonly summary: "Attach an anonymously-published space to your account.";
368
+ readonly keywords: readonly ["claim", "anonymous", "attach", "token", "adopt", "spaces"];
369
+ readonly url: "https://spacefast.com/docs/cli";
370
+ readonly body: "After an agent publishes anonymously, run `sf spaces claim` with the claim token to bind the space to your account.";
371
+ }, {
372
+ readonly slug: "cli/spaces";
373
+ readonly title: "sf spaces";
374
+ readonly kind: "cli";
375
+ readonly tier: "full";
376
+ readonly summary: "List, inspect, transfer, import, and remove spaces.";
377
+ readonly keywords: readonly ["spaces", "space", "ls", "get", "rm", "transfer", "import", "export"];
378
+ readonly url: "https://spacefast.com/docs/cli";
379
+ readonly body: "The `sf spaces` group manages spaces: `ls`, `get`, `claim`, `transfer`, `duplicate`, `import`/`export`, and `rm`.";
380
+ }, {
381
+ readonly slug: "cli/versions";
382
+ readonly title: "sf versions";
383
+ readonly kind: "cli";
384
+ readonly tier: "full";
385
+ readonly summary: "List, inspect, download, and remove immutable versions.";
386
+ readonly keywords: readonly ["versions", "version", "ls", "get", "download", "rollback", "history"];
387
+ readonly url: "https://spacefast.com/docs/cli";
388
+ readonly body: "`sf versions ls` shows a space's history; `sf versions get` inspects one and `sf rollback` promotes an earlier version back to live.";
389
+ }, {
390
+ readonly slug: "cli/channels";
391
+ readonly title: "sf channels";
392
+ readonly kind: "cli";
393
+ readonly tier: "full";
394
+ readonly summary: "List channels and see which version each points at.";
395
+ readonly keywords: readonly ["channels", "channel", "promote", "production", "preview", "history"];
396
+ readonly url: "https://spacefast.com/docs/cli";
397
+ readonly body: "`sf channels ls` lists a space's channels and their current version; `sf channels history` shows past pointer moves. Move a channel with `sf promote`.";
398
+ }, {
399
+ readonly slug: "cli/domains";
400
+ readonly title: "sf domains";
401
+ readonly kind: "cli";
402
+ readonly tier: "full";
403
+ readonly summary: "Add, check, and manage custom domains and DNS.";
404
+ readonly keywords: readonly ["domains", "domain", "dns", "add", "check", "nameservers", "diagnostics"];
405
+ readonly url: "https://spacefast.com/docs/cli";
406
+ readonly body: "The `sf domains` group covers `add`, `check`, `diagnostics`, `ls`, `rm`, and a full `dns` subtree for managing records and nameservers.";
407
+ }, {
408
+ readonly slug: "cli/env";
409
+ readonly title: "sf env";
410
+ readonly kind: "cli";
411
+ readonly tier: "full";
412
+ readonly summary: "Set, list, import, and pull a space's variables.";
413
+ readonly keywords: readonly ["env", "environment", "variables", "secrets", "set", "import", "pull"];
414
+ readonly url: "https://spacefast.com/docs/cli";
415
+ readonly body: "`sf env set` / `sf env ls` manage a space's variables; `sf env import` loads a dotenv file and `sf env pull` writes them back out.";
416
+ }, {
417
+ readonly slug: "cli/builds";
418
+ readonly title: "sf builds";
419
+ readonly kind: "cli";
420
+ readonly tier: "full";
421
+ readonly summary: "List, inspect, and retry cloud builds.";
422
+ readonly keywords: readonly ["builds", "build", "ls", "logs", "retry", "cancel", "ci"];
423
+ readonly url: "https://spacefast.com/docs/cli";
424
+ readonly body: "`sf builds ls` lists cloud builds; `sf builds logs`, `sf builds retry`, and `sf builds cancel` operate on a single build.";
425
+ }, {
426
+ readonly slug: "cli/git";
427
+ readonly title: "sf git";
428
+ readonly kind: "cli";
429
+ readonly tier: "full";
430
+ readonly summary: "Connect a repository for push-to-publish builds.";
431
+ readonly keywords: readonly ["git", "github", "connect", "repository", "ci", "sync", "disconnect"];
432
+ readonly url: "https://spacefast.com/docs/cli";
433
+ readonly body: "`sf git connect` links a repository so pushes build and publish automatically; `sf git ls`, `sf git sync`, and `sf git disconnect` manage the connection.";
434
+ }, {
435
+ readonly slug: "cli/access";
436
+ readonly title: "sf access";
437
+ readonly kind: "cli";
438
+ readonly tier: "full";
439
+ readonly summary: "Grant, ban, and inspect who can view a space.";
440
+ readonly keywords: readonly ["access", "grant", "ban", "password", "effective", "rules", "policy"];
441
+ readonly url: "https://spacefast.com/docs/cli";
442
+ readonly body: "`sf access grant` / `sf access ban` edit access rules; `sf access effective` shows the resolved policy. Use `sf password set` for a shared password.";
443
+ }, {
444
+ readonly slug: "cli/teams";
445
+ readonly title: "sf teams";
446
+ readonly kind: "cli";
447
+ readonly tier: "full";
448
+ readonly summary: "Create teams, invite members, and switch context.";
449
+ readonly keywords: readonly ["teams", "team", "members", "invitations", "switch", "create"];
450
+ readonly url: "https://spacefast.com/docs/cli";
451
+ readonly body: "`sf teams create` makes a team, `sf teams invitations add` invites people, `sf teams members ls` lists them, and `sf teams switch` sets the active team.";
452
+ }, {
453
+ readonly slug: "cli/api-keys";
454
+ readonly title: "sf api-keys";
455
+ readonly kind: "cli";
456
+ readonly tier: "full";
457
+ readonly summary: "Create and revoke API keys for the platform API.";
458
+ readonly keywords: readonly ["api-keys", "api key", "token", "create", "revoke", "list", "credential"];
459
+ readonly url: "https://spacefast.com/docs/cli";
460
+ readonly body: "`sf api-keys create` mints a bearer key (shown once, masked in `--json`); `sf api-keys list` and `sf api-keys revoke` manage existing keys.";
461
+ }, {
462
+ readonly slug: "cli/analytics";
463
+ readonly title: "sf analytics";
464
+ readonly kind: "cli";
465
+ readonly tier: "full";
466
+ readonly summary: "Print traffic and visitor counts for a space.";
467
+ readonly keywords: readonly ["analytics", "traffic", "visitors", "stats", "metrics"];
468
+ readonly url: "https://spacefast.com/docs/cli";
469
+ readonly body: "`sf analytics` reports a space's traffic; history depth and granularity depend on the team's plan.";
470
+ }, {
471
+ readonly slug: "cli/api";
472
+ readonly title: "sf api";
473
+ readonly kind: "cli";
474
+ readonly tier: "full";
475
+ readonly summary: "Make an authenticated raw call to the platform API.";
476
+ readonly keywords: readonly ["api", "sf api", "http", "raw", "request", "curl", "endpoint"];
477
+ readonly url: "https://spacefast.com/docs/cli";
478
+ readonly body: "`sf api <METHOD> <PATH>` sends an authenticated request against the platform API and prints the `{ data }` / `{ error }` envelope — handy for endpoints without a dedicated command.";
479
+ }, {
480
+ readonly slug: "cli/mcp";
481
+ readonly title: "sf mcp";
482
+ readonly kind: "cli";
483
+ readonly tier: "full";
484
+ readonly summary: "Run and install the Spacefast MCP server.";
485
+ readonly keywords: readonly ["mcp", "model context protocol", "agent", "install", "server", "tools"];
486
+ readonly url: "https://spacefast.com/docs/cli";
487
+ readonly body: "`sf mcp` runs the MCP server so an AI assistant can call Spacefast tools; `sf mcp install` wires it into a supported client's config.";
488
+ }, {
489
+ readonly slug: "cli/docs";
490
+ readonly title: "sf docs";
491
+ readonly kind: "cli";
492
+ readonly tier: "full";
493
+ readonly summary: "Search the offline documentation index from the CLI.";
494
+ readonly keywords: readonly ["docs", "search", "help", "reference", "offline", "topic"];
495
+ readonly url: "https://spacefast.com/docs/cli";
496
+ readonly body: "`sf docs` lists documentation topics and `sf docs <topic>` prints a page. The index ships with the CLI and mirrors the machine-readable `GET /v1/docs` API.";
497
+ }, {
498
+ readonly slug: "json-output";
499
+ readonly title: "JSON output and exit codes";
500
+ readonly kind: "cli";
501
+ readonly tier: "full";
502
+ readonly summary: "Machine-readable envelopes and stable exit codes for scripts.";
503
+ readonly keywords: readonly ["json", "exit code", "scripting", "envelope", "automation", "ci", "agent"];
504
+ readonly url: "https://spacefast.com/docs/cli";
505
+ readonly body: "Pass `--json` for a `{ data }` success or `{ error }` failure envelope on stdout/stderr. Exit codes are stable so scripts and agents can branch on them.";
506
+ }, {
507
+ readonly slug: "api";
508
+ readonly title: "Platform API overview";
509
+ readonly kind: "api";
510
+ readonly tier: "full";
511
+ readonly summary: "Authenticate and call the Spacefast platform API.";
512
+ readonly keywords: readonly ["api", "rest", "http", "platform", "endpoint", "openapi", "bearer"];
513
+ readonly url: "https://spacefast.com/docs/api";
514
+ readonly body: "The platform API uses bearer API keys and returns the same `{ data }` / `{ error }` envelope as the CLI. Create a key with `sf api-keys create`.";
515
+ }, {
516
+ readonly slug: "api/publish";
517
+ readonly title: "Publish API";
518
+ readonly kind: "api";
519
+ readonly tier: "full";
520
+ readonly summary: "Publish a version in a single authenticated request.";
521
+ readonly keywords: readonly ["api", "publish", "upload", "version", "archive", "http"];
522
+ readonly url: "https://spacefast.com/docs/api";
523
+ readonly body: "Send your files in one authenticated publish request to create an immutable version and take it live; the response carries the space and live URL.";
524
+ }, {
525
+ readonly slug: "api/spaces";
526
+ readonly title: "Spaces API";
527
+ readonly kind: "api";
528
+ readonly tier: "full";
529
+ readonly summary: "Create, list, and update spaces over HTTP.";
530
+ readonly keywords: readonly ["api", "spaces", "space", "create", "list", "endpoint"];
531
+ readonly url: "https://spacefast.com/docs/api";
532
+ readonly body: "`GET /v1/spaces` lists spaces; `POST /v1/spaces` creates one. Responses carry the space id, slug, and live URL.";
533
+ }, {
534
+ readonly slug: "api/versions";
535
+ readonly title: "Versions API";
536
+ readonly kind: "api";
537
+ readonly tier: "full";
538
+ readonly summary: "List versions and promote them to channels over HTTP.";
539
+ readonly keywords: readonly ["api", "versions", "publish", "channel", "promote", "rollback"];
540
+ readonly url: "https://spacefast.com/docs/api";
541
+ readonly body: "List a space's versions, then promote one to a channel to move traffic. Rolling back is promoting an earlier version.";
542
+ }, {
543
+ readonly slug: "api/domains";
544
+ readonly title: "Domains API";
545
+ readonly kind: "api";
546
+ readonly tier: "reference";
547
+ readonly summary: "Attach and inspect custom domains over HTTP.";
548
+ readonly keywords: readonly ["api", "domains", "domain", "dns", "certificate", "endpoint"];
549
+ readonly url: "https://spacefast.com/docs/api";
550
+ readonly body: "Add a custom domain, read its verification and certificate status, and manage DNS records through the platform API.";
551
+ }, {
552
+ readonly slug: "api/teams";
553
+ readonly title: "Teams API";
554
+ readonly kind: "api";
555
+ readonly tier: "reference";
556
+ readonly summary: "Manage teams, members, and invitations over HTTP.";
557
+ readonly keywords: readonly ["api", "teams", "team", "members", "invitations", "endpoint"];
558
+ readonly url: "https://spacefast.com/docs/api";
559
+ readonly body: "Create teams, list members, and manage invitations programmatically. Webhooks and API keys are team-scoped.";
560
+ }, {
561
+ readonly slug: "api/docs";
562
+ readonly title: "Docs API (GET /v1/docs)";
563
+ readonly kind: "api";
564
+ readonly tier: "reference";
565
+ readonly summary: "Fetch the machine-readable documentation index.";
566
+ readonly keywords: readonly ["api", "docs", "index", "discovery", "machine-readable", "v1/docs"];
567
+ readonly url: "https://spacefast.com/docs/api";
568
+ readonly body: "`GET /v1/docs` returns the tier-aware docs index (filter with `q` and `category`); `GET /v1/docs/{slug}` returns one page. It mirrors the CLI's offline `sf docs`.";
569
+ }, {
570
+ readonly slug: "api/webhooks";
571
+ readonly title: "Webhooks";
572
+ readonly kind: "api";
573
+ readonly tier: "reference";
574
+ readonly summary: "Subscribe to version, build, and domain lifecycle events.";
575
+ readonly keywords: readonly ["api", "webhook", "events", "callback", "notifications", "build", "signature"];
576
+ readonly url: "https://spacefast.com/docs/webhooks";
577
+ readonly body: "Register a team-scoped, signed webhook to receive version, build, domain, and transfer events. Verify the signature header before trusting a payload.";
578
+ }, {
579
+ readonly slug: "api/platform";
580
+ readonly title: "Platform (tenant) API";
581
+ readonly kind: "api";
582
+ readonly tier: "reference";
583
+ readonly summary: "The tenant-facing platform API for running Spacefast as infra.";
584
+ readonly keywords: readonly ["api", "platform", "tenant", "infra", "openapi", "multi-tenant"];
585
+ readonly url: "https://spacefast.com/docs/platforms";
586
+ readonly body: "The platform API is the tenant-facing surface for operating Spacefast as hosting infra. It shares the `{ data }` / `{ error }` envelope and is documented via OpenAPI.";
587
+ }, {
588
+ readonly slug: "recipes/github-deploys";
589
+ readonly title: "Publish from GitHub";
590
+ readonly kind: "recipe";
591
+ readonly tier: "full";
592
+ readonly summary: "Connect a repository so pushes publish automatically.";
593
+ readonly keywords: readonly ["github", "git", "ci", "push", "connect", "automatic", "recipe"];
594
+ readonly url: "https://spacefast.com/docs/builds";
595
+ readonly body: "Connect a repository with `sf git connect`; each push builds on Spacefast and publishes a version, with pull requests getting preview URLs.";
596
+ }, {
597
+ readonly slug: "recipes/preview-channels";
598
+ readonly title: "Preview channels for pull requests";
599
+ readonly kind: "recipe";
600
+ readonly tier: "full";
601
+ readonly summary: "Give every branch a shareable preview URL.";
602
+ readonly keywords: readonly ["preview", "channel", "branch", "pull request", "staging", "recipe"];
603
+ readonly url: "https://spacefast.com/docs/builds";
604
+ readonly body: "Push a branch or open a pull request on a connected repository, or publish to a named channel, to get an isolated preview URL without touching production.";
605
+ }, {
606
+ readonly slug: "recipes/agent-publish";
607
+ readonly title: "Let an agent publish for you";
608
+ readonly kind: "recipe";
609
+ readonly tier: "full";
610
+ readonly summary: "Drive a first publish from an AI agent, then claim it.";
611
+ readonly keywords: readonly ["agent", "ai", "mcp", "anonymous", "claim", "automation", "recipe"];
612
+ readonly url: "https://spacefast.com/docs/anonymous-publish";
613
+ readonly body: "Let an agent publish anonymously for an instant URL and a claim token, then hand the token to a human who runs `sf spaces claim`.";
614
+ }, {
615
+ readonly slug: "recipes/custom-domain";
616
+ readonly title: "Add a custom domain";
617
+ readonly kind: "recipe";
618
+ readonly tier: "full";
619
+ readonly summary: "Point your own domain at a space with automatic TLS.";
620
+ readonly keywords: readonly ["domain", "custom domain", "dns", "tls", "https", "recipe"];
621
+ readonly url: "https://spacefast.com/recipes/custom-domain";
622
+ readonly body: "Add the domain with `sf domains add`, set the DNS records Spacefast prints, and wait for `sf domains check` to report a ready certificate.";
623
+ }, {
624
+ readonly slug: "recipes/password-protect";
625
+ readonly title: "Password-protect a space";
626
+ readonly kind: "recipe";
627
+ readonly tier: "full";
628
+ readonly summary: "Put one shared password in front of a whole space.";
629
+ readonly keywords: readonly ["password", "protect", "private", "access", "gate", "recipe"];
630
+ readonly url: "https://spacefast.com/recipes/password-protect-a-space";
631
+ readonly body: "Run `sf password set` to gate a space behind a single shared secret; clear it later with `sf password clear`.";
632
+ }, {
633
+ readonly slug: "recipes/redirects";
634
+ readonly title: "Set up redirects";
635
+ readonly kind: "recipe";
636
+ readonly tier: "reference";
637
+ readonly summary: "Add redirect rules that ship and roll back with a version.";
638
+ readonly keywords: readonly ["redirect", "rewrite", "routing", "301", "recipe"];
639
+ readonly url: "https://spacefast.com/recipes/redirects";
640
+ readonly body: "Add redirect rules to a `_redirects` file at your publish root so they publish as part of the version and roll back with it.";
641
+ }, {
642
+ readonly slug: "recipes/migrate-dns";
643
+ readonly title: "Migrate DNS to a custom domain";
644
+ readonly kind: "recipe";
645
+ readonly tier: "reference";
646
+ readonly summary: "Cut traffic over to a Spacefast-served domain safely.";
647
+ readonly keywords: readonly ["dns", "migrate", "cutover", "domain", "nameserver", "recipe"];
648
+ readonly url: "https://spacefast.com/recipes/custom-domain";
649
+ readonly body: "Pre-stage the domain with `sf domains add`, verify the certificate is ready with `sf domains check`, then update DNS to flip traffic with zero downtime.";
650
+ }, ...DocEntry[]];