From 5c288d317731991ce50e81d98e030ff95072721c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?batuhan=20i=C3=A7=C3=B6z?= Date: Sun, 8 Nov 2026 03:00:18 +0100 Subject: [PATCH 1/4] Rename Space sharing to Spacefast Share --- content/(account)/api-keys.mdx | 2 +- content/(concepts)/spaces.mdx | 6 +- content/(concepts)/teams.mdx | 2 +- content/(dynamic)/wordpress.mdx | 2 +- content/(dynamic)/zero-runtime.mdx | 2 +- content/(reference)/config-file.mdx | 6 +- content/(reference)/glossary.mdx | 2 +- content/(serve)/meta.ts | 2 +- content/(serve)/routing.mdx | 2 +- content/(serve)/{access.mdx => share.mdx} | 16 +- content/(serve)/urls.mdx | 2 +- content/agents/share-claude-artifact.mdx | 4 +- content/cli/publish.mdx | 4 +- content/cli/share.mdx | 2 +- content/cli/spaces.mdx | 2 +- generated/cli/index.md | 8064 ++++++++++++--------- generated/manifest.json | 6 +- redirects.ts | 5 +- scripts/docs-experience.test.mjs | 2 +- scripts/redirect-rules.test.mjs | 3 + scripts/verify-public-safety.mjs | 5 +- scripts/verify-public-safety.test.mjs | 7 +- 22 files changed, 4883 insertions(+), 3265 deletions(-) rename content/(serve)/{access.mdx => share.mdx} (95%) diff --git a/content/(account)/api-keys.mdx b/content/(account)/api-keys.mdx index 1a2fa46b..506283b6 100644 --- a/content/(account)/api-keys.mdx +++ b/content/(account)/api-keys.mdx @@ -117,7 +117,7 @@ Lifetimes differ by kind: | Space key for an unclaimed Space | Matches that Space's unclaimed window. If you claim with **Claim & keep access**, it keeps working for another 7 days | | Continuation token | 30 minutes at most | -Share links, passwords, and machine credentials are the Space access model. They are covered in [access and share links](/access). +Share links, passwords, and machine credentials are the Space access model. They are covered in [Spacefast Share](/share). :::warning[Treat every one of these as a password] They go in a secret manager or an environment variable, never in a repository, a screenshot, or a chat message. A key pasted anywhere public should be revoked, not rotated later. diff --git a/content/(concepts)/spaces.mdx b/content/(concepts)/spaces.mdx index c85abcff..d76f4e69 100644 --- a/content/(concepts)/spaces.mdx +++ b/content/(concepts)/spaces.mdx @@ -66,7 +66,9 @@ The owner depends on how the Space was created: To move a Space to another team, run `sf spaces transfer --space docs`, or open **Space settings → General → Transfer this space → Transfer space…**. If you are an owner or admin of both teams, the move is instant. The Space keeps serving at its current address. Otherwise the target team has 7 days to accept, and nothing changes until they do. Roles and membership are on [Teams](/teams). -## Access when you create one + + +## Sharing when you create one A new team-owned Space starts at one of two presets. A Space published without an account has no owning team. Its space key and claim link open it until the claim window ends; see [Publish without an account](/anonymous-and-claim). @@ -79,7 +81,7 @@ The API still accepts `team` and treats it as `private`. Set it on the request that creates the Space, with `sf publish --access public` or the `access` field on `createPublish` and [`createSpace`](/api/reference/spaces/createspace). Sending `access` together with a `spaceId` is a validation error, because the field only applies at creation. Omit it and the Space takes the owning team's default for new Spaces. -Everything after that, including people, share links, passwords, and access requests, is on [Access and sharing](/access). +Everything after that, including people, share links, passwords, and access requests, is on [Spacefast Share](/share). ## Find your Spaces diff --git a/content/(concepts)/teams.mdx b/content/(concepts)/teams.mdx index cc6242f2..3ff06ec4 100644 --- a/content/(concepts)/teams.mdx +++ b/content/(concepts)/teams.mdx @@ -104,7 +104,7 @@ To hand the team over, use **Team settings → Danger zone → Transfer ownershi | `private` | Access for the owning team | | `public` | Access for the owning team, plus view access for anyone on the web | -The default is `private`. The API accepts `team` as a legacy spelling of `private`. From a terminal, `sf teams defaults` prints the current value and `sf teams defaults public` sets it. Per-Space access, share links, and passwords are covered in [access and share links](/access). +The default is `private`. The API accepts `team` as a legacy spelling of `private`. From a terminal, `sf teams defaults` prints the current value and `sf teams defaults public` sets it. Per-Space access, share links, and passwords are covered in [Spacefast Share](/share). ## Move a Space to another team diff --git a/content/(dynamic)/wordpress.mdx b/content/(dynamic)/wordpress.mdx index f1f28c51..8457f5ee 100644 --- a/content/(dynamic)/wordpress.mdx +++ b/content/(dynamic)/wordpress.mdx @@ -94,7 +94,7 @@ Five Abilities in the `zero-storage` category are registered by the runtime, so | `zero/storage-move` | write | Moves a file into a folder, creating the folder path if needed | `edit_post` | | `zero/storage-delete` | write | Trashes a file. It leaves every listing and stays recoverable | `delete_post` | -The "Needs" column is a WordPress capability. The Space projects it from the calling credential's Grant, so what a credential may do is decided per request against the path it asked for. See [Access and sharing](/access). +The "Needs" column is a WordPress capability. The Space projects it from the calling credential's Grant, so what a credential may do is decided per request against the path it asked for. See [Spacefast Share](/share). WordPress decides which file types `zero/storage-upload` accepts. diff --git a/content/(dynamic)/zero-runtime.mdx b/content/(dynamic)/zero-runtime.mdx index 572cf1c6..f3998ae0 100644 --- a/content/(dynamic)/zero-runtime.mdx +++ b/content/(dynamic)/zero-runtime.mdx @@ -199,7 +199,7 @@ Outbound access has nothing to do with who can open your space. Calling an API d ### Example: invite People from your app -There is no `ctx.people`. To invite someone to a private space, or resend their invite, call the People API from an action with a [machine credential](/access#machine-credentials). +There is no `ctx.people`. To invite someone to a private space, or resend their invite, call the People API from an action with a [machine credential](/share#machine-credentials). ```bash sf share token create --name invites --path '/**' --role manager --show-secret --json \ diff --git a/content/(reference)/config-file.mdx b/content/(reference)/config-file.mdx index cbc05dc4..de5d0263 100644 --- a/content/(reference)/config-file.mdx +++ b/content/(reference)/config-file.mdx @@ -208,13 +208,15 @@ See [Functions](/functions). `sf.jsonc` is the only writer. See [Crons](/crons) for the schedule grammar. -## Access + + +## Sharing | Key | Type | Default | What it does | | --- | --- | --- | --- | | `access` | `"public"` or `{ public: string[] }` | none | Live paths that stay public whatever the Space's access setting is | -`"public"` is shorthand for `{ "public": ["/**"] }`. Prefix a pattern with `!` to exclude it, and use `*` and `**` as whole-segment wildcards. Patterns must be unique, and a non-empty list needs at least one inclusion. The declaration is inactive until the Space is claimed. See [Access](/access). +`"public"` is shorthand for `{ "public": ["/**"] }`. Prefix a pattern with `!` to exclude it, and use `*` and `**` as whole-segment wildcards. Patterns must be unique, and a non-empty list needs at least one inclusion. The declaration is inactive until the Space is claimed. See [Spacefast Share](/share). ## Routing diff --git a/content/(reference)/glossary.mdx b/content/(reference)/glossary.mdx index c7682bcd..038fb617 100644 --- a/content/(reference)/glossary.mdx +++ b/content/(reference)/glossary.mdx @@ -33,7 +33,7 @@ The runtime for shipping a worker alongside your site — npm packages, framewor ## Grant -One rule in a Space's access list: it names an audience (public, team, one person, a link, a password, a machine, or an external identity) and what that audience can do. A Space has no public-or-private flag — its access is just the sum of its grants. See [Access and sharing](/access). +One rule in a Space's access list: it names an audience (public, team, one person, a link, a password, a machine, or an external identity) and what that audience can do. A Space has no public-or-private flag — its access is just the sum of its grants. See [Spacefast Share](/share). ## Live (the live channel) diff --git a/content/(serve)/meta.ts b/content/(serve)/meta.ts index c3778f38..19a81121 100644 --- a/content/(serve)/meta.ts +++ b/content/(serve)/meta.ts @@ -10,7 +10,7 @@ export default defineMeta({ "routing", "caching", "stats", - "access", + "share", "customization", "site-pages", ], diff --git a/content/(serve)/routing.mdx b/content/(serve)/routing.mdx index 3e2344cc..a1fcc871 100644 --- a/content/(serve)/routing.mdx +++ b/content/(serve)/routing.mdx @@ -83,7 +83,7 @@ Header names must match `^[A-Za-z0-9-]+$`. Some names are owned by the platform | `cdn-cache-control`, `cloudflare-cdn-cache-control`, `netlify-cdn-cache-control`, `surrogate-control` | `header_cdn_cache_unsupported` | | `Basic-Auth` | `header_basic_auth_unsupported` | -`Basic-Auth` is rejected before anything else. The offending line is redacted from the diagnostics and stripped from the compiled bytes, so the credential never reaches a log. For real access control, see [Access and sharing](/access). +`Basic-Auth` is rejected before anything else. The offending line is redacted from the diagnostics and stripped from the compiled bytes, so the credential never reaches a log. For real access control, see [Spacefast Share](/share). `Cache-Control` is allowed and warns with `header_cache_control_platform_managed`. It applies to browser responses; shared caching is managed for you. See [Caching](/caching). diff --git a/content/(serve)/access.mdx b/content/(serve)/share.mdx similarity index 95% rename from content/(serve)/access.mdx rename to content/(serve)/share.mdx index 3e73de81..480dc3ec 100644 --- a/content/(serve)/access.mdx +++ b/content/(serve)/share.mdx @@ -1,12 +1,14 @@ --- -title: Access and sharing +title: Spacefast Share description: Make a Space public, hand out scoped share links or a password, invite people, and revoke any of it sidebar: { order: 5 } --- -Visitor access comes from additive grants. Removing a public grant closes that route to the public only if no other public grant matches; links, people, and team access can remain. +Spacefast Share (formerly Spacefast Access) decides who can open a Space. Visitor access comes from additive grants. Removing a public grant closes that route to the public only if no other public grant matches; links, people, and team access can remain. -## Access is a list, not a switch + + +## Sharing uses grants Access is a set of additive **grants**, each one naming an audience, a set of capabilities, the paths it covers, and which published target it applies to. A matching grant admits a visitor. Revoking one grant does not revoke other matching grants or remove the owning team's permissions. @@ -39,7 +41,7 @@ Share links and passwords are forwardable secrets, so they cap at `viewer` or `c ## In the dashboard -Open the Space and go to **Access**. The page is titled **Manage access**. +Open the Space and go to **Share**. The **General access** card holds a segmented control with two options: @@ -188,9 +190,11 @@ sf share token revoke mch_xxxxxxxx --space my-site The token is shown once, right after creation. The dashboard says it plainly: "Copy it now. It won't be shown again." Rotating keeps the grant and its scope and invalidates the old token immediately. -## Access requests + + +## Share requests -A visitor who lands on a Space they cannot open can ask for access. Requests show up in the **Access requests** card and in the CLI: +A visitor who lands on a Space they cannot open can ask for access. Requests show up in the **Share requests** card and in the CLI: ```bash sf share request ls --space my-site diff --git a/content/(serve)/urls.mdx b/content/(serve)/urls.mdx index 179859d1..67b27e35 100644 --- a/content/(serve)/urls.mdx +++ b/content/(serve)/urls.mdx @@ -86,7 +86,7 @@ A share link is the page you want with the secret in the query string: https://my-site.space.fast/docs?__=sfl_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ``` -At the current hostname, one request returns that page without an access redirect or interstitial, so `curl` and an agent get the same document a browser does. Creating, scoping, and revoking them is on [Access and sharing](/access). +At the current hostname, one request returns that page without an access redirect or interstitial, so `curl` and an agent get the same document a browser does. Creating, scoping, and revoking them is on [Spacefast Share](/share). ## Hostnames you cannot claim diff --git a/content/agents/share-claude-artifact.mdx b/content/agents/share-claude-artifact.mdx index 6e63274c..738d88d6 100644 --- a/content/agents/share-claude-artifact.mdx +++ b/content/agents/share-claude-artifact.mdx @@ -27,9 +27,9 @@ See [Claude Code setup](/agents/claude-code) or [Claude Desktop setup](/agents/c ## Choose who can open it -New personal Spaces are private by default, and a bare URL to a private Space does not grant access. To let anyone on the web open it, set **General access** to **Public** in the Space's **Access** settings. +New personal Spaces are private by default, and a bare URL to a private Space does not grant access. To let anyone on the web open it, set **General access** to **Public** in the Space's **Share** settings. -For a restricted audience, keep the Space private and create a share link on the **Share link** card instead. Anyone with the share link can open the Space without an account. [Access and sharing](/access) explains the choices and how to revoke access. +For a restricted audience, keep the Space private and create a share link on the **Share link** card instead. Anyone with the share link can open the Space without an account. [Spacefast Share](/share) explains the choices and how to revoke access. ## Update the same link diff --git a/content/cli/publish.mdx b/content/cli/publish.mdx index 78bc0420..30f90323 100644 --- a/content/cli/publish.mdx +++ b/content/cli/publish.mdx @@ -151,7 +151,9 @@ sf publish ./dist --prebuilt # you built it, upload it unchanged `--remote` creates a build you can follow with [`sf builds logs`](/cli/builds). -## Access for a new Space + + +## Sharing a new Space `--access` sets root access at creation time only. diff --git a/content/cli/share.mdx b/content/cli/share.mdx index 2c83c807..66229e6a 100644 --- a/content/cli/share.mdx +++ b/content/cli/share.mdx @@ -17,7 +17,7 @@ Access is a list of **Grants**. Each Grant says who (audience), what they may do Credential-backed audiences get their own commands (`link`, `password`, `token`, `identity`) so the proof and its Grant are created in one write. `sf share grant` is for the two audiences that need no proof: `public` and `team`. -See [Access and sharing](/access) for the concepts. +See [Spacefast Share](/share) for the concepts. ## Space selection flags diff --git a/content/cli/spaces.mdx b/content/cli/spaces.mdx index 3fef0ad3..8dde9053 100644 --- a/content/cli/spaces.mdx +++ b/content/cli/spaces.mdx @@ -116,7 +116,7 @@ sf spaces add --name docs ### Output -The Space summary. `--json` returns the created Space with its state entry. A new team-owned Space has no automatic share link, so the receipt can omit `access`. The owning team signs in at the live URL. Create a [share link](/access#share-links) when you need one. Any access URL or claim link in a receipt is masked unless you pass `--show-secret`. +The Space summary. `--json` returns the created Space with its state entry. A new team-owned Space has no automatic share link, so the receipt can omit `access`. The owning team signs in at the live URL. Create a [share link](/share#share-links) when you need one. Any access URL or claim link in a receipt is masked unless you pass `--show-secret`. ## sf spaces update diff --git a/generated/cli/index.md b/generated/cli/index.md index f29ae69a..150cb708 100644 --- a/generated/cli/index.md +++ b/generated/cli/index.md @@ -20,7 +20,7 @@ Tell your agent to pick the smallest lane that does the job: $ npm install -g spacefast $ sf COMMAND running command... -$ sf (--version) +$ sf (--version|-v) spacefast/0.8.1 $ sf --help [COMMAND] USAGE @@ -48,15 +48,15 @@ GLOBAL FLAGS ## Commands - [`sf access`](#sf-access) -- [`sf access logout-all`](#sf-access-logout-all) +- [`sf access sessions revoke`](#sf-access-sessions-revoke) - [`sf activity`](#sf-activity) - [`sf agents init [DIRECTORY]`](#sf-agents-init-directory) - [`sf analytics`](#sf-analytics) -- [`sf api METHODORPATH [PATH]`](#sf-api-methodorpath-path) +- [`sf api METHOD [PATH]`](#sf-api-method-path) - [`sf api-keys`](#sf-api-keys) - [`sf api-keys create`](#sf-api-keys-create) - [`sf api-keys list`](#sf-api-keys-list) -- [`sf api-keys revoke ID`](#sf-api-keys-revoke-id) +- [`sf api-keys revoke KEY`](#sf-api-keys-revoke-key) - [`sf apply`](#sf-apply) - [`sf auth`](#sf-auth) - [`sf auth as NAME`](#sf-auth-as-name) @@ -64,23 +64,23 @@ GLOBAL FLAGS - [`sf autocomplete [SHELL]`](#sf-autocomplete-shell) - [`sf build [DIR]`](#sf-build-dir) - [`sf builds cancel BUILD`](#sf-builds-cancel-build) -- [`sf builds detect`](#sf-builds-detect) -- [`sf builds get BUILD`](#sf-builds-get-build) +- [`sf builds detect [DIR]`](#sf-builds-detect-dir) +- [`sf builds inspect BUILD`](#sf-builds-inspect-build) +- [`sf builds list`](#sf-builds-list) - [`sf builds logs BUILD`](#sf-builds-logs-build) -- [`sf builds ls`](#sf-builds-ls) -- [`sf builds refresh-upload BUILD`](#sf-builds-refresh-upload-build) - [`sf builds retry BUILD`](#sf-builds-retry-build) +- [`sf builds upload refresh BUILD`](#sf-builds-upload-refresh-build) - [`sf channels`](#sf-channels) - [`sf channels history [NAME]`](#sf-channels-history-name) -- [`sf channels ls`](#sf-channels-ls) +- [`sf channels list`](#sf-channels-list) - [`sf channels set NAME`](#sf-channels-set-name) - [`sf comments`](#sf-comments) - [`sf comments create`](#sf-comments-create) - [`sf comments export`](#sf-comments-export) -- [`sf comments get COMMENT`](#sf-comments-get-comment) +- [`sf comments inspect COMMENT`](#sf-comments-inspect-comment) - [`sf comments list`](#sf-comments-list) -- [`sf comments mark-read COMMENT`](#sf-comments-mark-read-comment) - [`sf comments react COMMENT EMOJI`](#sf-comments-react-comment-emoji) +- [`sf comments read COMMENT`](#sf-comments-read-comment) - [`sf comments reopen COMMENT`](#sf-comments-reopen-comment) - [`sf comments reply COMMENT`](#sf-comments-reply-comment) - [`sf comments resolve COMMENT`](#sf-comments-resolve-comment) @@ -88,35 +88,35 @@ GLOBAL FLAGS - [`sf comments settings set`](#sf-comments-settings-set) - [`sf comments unreact COMMENT EMOJI`](#sf-comments-unreact-comment-emoji) - [`sf connectors`](#sf-connectors) -- [`sf connectors add TARGET`](#sf-connectors-add-target) - [`sf connectors bind ROLE CONNECTION`](#sf-connectors-bind-role-connection) - [`sf connectors bindings`](#sf-connectors-bindings) - [`sf connectors connections`](#sf-connectors-connections) -- [`sf connectors connections add CONNECTOR`](#sf-connectors-connections-add-connector) -- [`sf connectors connections edit CONNECTION`](#sf-connectors-connections-edit-connection) +- [`sf connectors connections connect CONNECTOR`](#sf-connectors-connections-connect-connector) +- [`sf connectors connections disconnect CONNECTION`](#sf-connectors-connections-disconnect-connection) - [`sf connectors connections health CONNECTION`](#sf-connectors-connections-health-connection) -- [`sf connectors connections ls`](#sf-connectors-connections-ls) +- [`sf connectors connections list`](#sf-connectors-connections-list) - [`sf connectors connections reconnect CONNECTION`](#sf-connectors-connections-reconnect-connection) - [`sf connectors connections refresh CONNECTION`](#sf-connectors-connections-refresh-connection) -- [`sf connectors connections rm CONNECTION`](#sf-connectors-connections-rm-connection) +- [`sf connectors connections update CONNECTION`](#sf-connectors-connections-update-connection) +- [`sf connectors create TARGET`](#sf-connectors-create-target) +- [`sf connectors delete CONNECTOR`](#sf-connectors-delete-connector) - [`sf connectors detect URL`](#sf-connectors-detect-url) -- [`sf connectors ls`](#sf-connectors-ls) +- [`sf connectors list`](#sf-connectors-list) - [`sf connectors policies`](#sf-connectors-policies) - [`sf connectors policies add PATTERN`](#sf-connectors-policies-add-pattern) - [`sf connectors policies explain ADDRESS`](#sf-connectors-policies-explain-address) -- [`sf connectors policies ls`](#sf-connectors-policies-ls) -- [`sf connectors policies rm RULE`](#sf-connectors-policies-rm-rule) +- [`sf connectors policies list`](#sf-connectors-policies-list) +- [`sf connectors policies remove RULE`](#sf-connectors-policies-remove-rule) - [`sf connectors policies set RULE`](#sf-connectors-policies-set-rule) -- [`sf connectors rm CONNECTOR`](#sf-connectors-rm-connector) - [`sf connectors run [CODE]`](#sf-connectors-run-code) -- [`sf connectors run get RUN`](#sf-connectors-run-get-run) +- [`sf connectors run inspect RUN`](#sf-connectors-run-inspect-run) - [`sf connectors run list`](#sf-connectors-run-list) - [`sf connectors run resume RUN`](#sf-connectors-run-resume-run) - [`sf connectors unbind ROLE`](#sf-connectors-unbind-role) - [`sf content dashboard [TARGET]`](#sf-content-dashboard-target) - [`sf continue`](#sf-continue) - [`sf crons`](#sf-crons) -- [`sf crons ls`](#sf-crons-ls) +- [`sf crons list`](#sf-crons-list) - [`sf crons run TARGET`](#sf-crons-run-target) - [`sf db [TARGET]`](#sf-db-target) - [`sf db console [TARGET]`](#sf-db-console-target) @@ -127,7 +127,7 @@ GLOBAL FLAGS - [`sf design`](#sf-design) - [`sf design generate`](#sf-design-generate) - [`sf dev`](#sf-dev) -- [`sf dev run-many`](#sf-dev-run-many) +- [`sf dev instances`](#sf-dev-instances) - [`sf docs [QUERY]`](#sf-docs-query) - [`sf doctor`](#sf-doctor) - [`sf domains`](#sf-domains) @@ -135,36 +135,36 @@ GLOBAL FLAGS - [`sf domains check DOMAIN`](#sf-domains-check-domain) - [`sf domains contacts`](#sf-domains-contacts) - [`sf domains contacts add`](#sf-domains-contacts-add) -- [`sf domains contacts ls`](#sf-domains-contacts-ls) +- [`sf domains contacts list`](#sf-domains-contacts-list) - [`sf domains diagnostics DOMAIN`](#sf-domains-diagnostics-domain) - [`sf domains dns`](#sf-domains-dns) - [`sf domains dns add DOMAIN`](#sf-domains-dns-add-domain) - [`sf domains dns batch DOMAIN`](#sf-domains-dns-batch-domain) - [`sf domains dns capabilities DOMAIN`](#sf-domains-dns-capabilities-domain) - [`sf domains dns export DOMAIN`](#sf-domains-dns-export-domain) -- [`sf domains dns ls DOMAIN`](#sf-domains-dns-ls-domain) +- [`sf domains dns list DOMAIN`](#sf-domains-dns-list-domain) - [`sf domains dns refresh DOMAIN`](#sf-domains-dns-refresh-domain) +- [`sf domains dns remove DOMAIN RECORD`](#sf-domains-dns-remove-domain-record) - [`sf domains dns replace DOMAIN`](#sf-domains-dns-replace-domain) -- [`sf domains dns rm DOMAIN RECORD`](#sf-domains-dns-rm-domain-record) - [`sf domains dns update DOMAIN RECORD`](#sf-domains-dns-update-domain-record) -- [`sf domains ls`](#sf-domains-ls) +- [`sf domains list`](#sf-domains-list) - [`sf domains nameservers DOMAIN`](#sf-domains-nameservers-domain) - [`sf domains nameservers set DOMAIN NAMESERVERS`](#sf-domains-nameservers-set-domain-nameservers) - [`sf domains registration DOMAIN`](#sf-domains-registration-domain) - [`sf domains registration purchase DOMAIN... [flags]`](#sf-domains-registration-purchase-domain-flags) - [`sf domains registration renew DOMAIN`](#sf-domains-registration-renew-domain) -- [`sf domains rm DOMAIN`](#sf-domains-rm-domain) +- [`sf domains remove DOMAIN`](#sf-domains-remove-domain) - [`sf domains search [QUERY]`](#sf-domains-search-query) - [`sf domains update DOMAIN`](#sf-domains-update-domain) - [`sf env`](#sf-env) -- [`sf env export-template [DIR]`](#sf-env-export-template-dir) - [`sf env import FILE`](#sf-env-import-file) -- [`sf env ls`](#sf-env-ls) +- [`sf env list`](#sf-env-list) - [`sf env pull [FILE]`](#sf-env-pull-file) -- [`sf env rm NAME`](#sf-env-rm-name) +- [`sf env remove NAME`](#sf-env-remove-name) - [`sf env set NAME [VALUE]`](#sf-env-set-name-value) +- [`sf env template [DIR]`](#sf-env-template-dir) - [`sf feedback`](#sf-feedback) -- [`sf feedback get REF`](#sf-feedback-get-ref) +- [`sf feedback inspect REF`](#sf-feedback-inspect-ref) - [`sf feedback list`](#sf-feedback-list) - [`sf fetch [PATH]`](#sf-fetch-path) - [`sf functions`](#sf-functions) @@ -175,7 +175,7 @@ GLOBAL FLAGS - [`sf git github`](#sf-git-github) - [`sf git github installations`](#sf-git-github-installations) - [`sf git github repos [INSTALLATION]`](#sf-git-github-repos-installation) -- [`sf git ls`](#sf-git-ls) +- [`sf git inspect`](#sf-git-inspect) - [`sf git origin`](#sf-git-origin) - [`sf git sync`](#sf-git-sync) - [`sf git update`](#sf-git-update) @@ -191,14 +191,21 @@ GLOBAL FLAGS - [`sf mcp install`](#sf-mcp-install) - [`sf mcp proxy`](#sf-mcp-proxy) - [`sf migrate URL`](#sf-migrate-url) +- [`sf oauth-apps`](#sf-oauth-apps) +- [`sf oauth-apps create`](#sf-oauth-apps-create) +- [`sf oauth-apps delete APP`](#sf-oauth-apps-delete-app) +- [`sf oauth-apps inspect APP`](#sf-oauth-apps-inspect-app) +- [`sf oauth-apps list`](#sf-oauth-apps-list) +- [`sf oauth-apps secret rotate APP`](#sf-oauth-apps-secret-rotate-app) +- [`sf oauth-apps update APP`](#sf-oauth-apps-update-app) - [`sf open [TARGET]`](#sf-open-target) -- [`sf operations [ID]`](#sf-operations-id) +- [`sf operations [OPERATION]`](#sf-operations-operation) - [`sf pages`](#sf-pages) - [`sf pages pull [TARGET]`](#sf-pages-pull-target) - [`sf pages validate`](#sf-pages-validate) - [`sf plugins`](#sf-plugins) - [`sf profiles`](#sf-profiles) -- [`sf profiles rm NAME`](#sf-profiles-rm-name) +- [`sf profiles remove NAME`](#sf-profiles-remove-name) - [`sf profiles set NAME`](#sf-profiles-set-name) - [`sf profiles use NAME`](#sf-profiles-use-name) - [`sf promote [VERSION]`](#sf-promote-version) @@ -210,10 +217,10 @@ GLOBAL FLAGS - [`sf routing inspect`](#sf-routing-inspect) - [`sf rules`](#sf-rules) - [`sf rules add`](#sf-rules-add) -- [`sf rules ls`](#sf-rules-ls) +- [`sf rules list`](#sf-rules-list) - [`sf rules pause`](#sf-rules-pause) +- [`sf rules remove NAME`](#sf-rules-remove-name) - [`sf rules resume`](#sf-rules-resume) -- [`sf rules rm NAME`](#sf-rules-rm-name) - [`sf rules test URL`](#sf-rules-test-url) - [`sf rules validate`](#sf-rules-validate) - [`sf runtime`](#sf-runtime) @@ -221,13 +228,13 @@ GLOBAL FLAGS - [`sf sell activate`](#sf-sell-activate) - [`sf sell demo`](#sf-sell-demo) - [`sf sell onboard`](#sf-sell-onboard) -- [`sf sell orders get SESSIONID`](#sf-sell-orders-get-sessionid) -- [`sf sell orders ls`](#sf-sell-orders-ls) -- [`sf sell orders resend SESSIONID`](#sf-sell-orders-resend-sessionid) -- [`sf sell orders ship SESSIONID`](#sf-sell-orders-ship-sessionid) +- [`sf sell orders inspect ORDER`](#sf-sell-orders-inspect-order) +- [`sf sell orders list`](#sf-sell-orders-list) +- [`sf sell orders resend ORDER`](#sf-sell-orders-resend-order) +- [`sf sell orders ship ORDER`](#sf-sell-orders-ship-order) - [`sf sell products archive KEY`](#sf-sell-products-archive-key) - [`sf sell products create`](#sf-sell-products-create) -- [`sf sell products ls`](#sf-sell-products-ls) +- [`sf sell products list`](#sf-sell-products-list) - [`sf sell products update KEY`](#sf-sell-products-update-key) - [`sf sell refresh`](#sf-sell-refresh) - [`sf sell status`](#sf-sell-status) @@ -236,42 +243,43 @@ GLOBAL FLAGS - [`sf share`](#sf-share) - [`sf share check`](#sf-share-check) - [`sf share grant`](#sf-share-grant) -- [`sf share grant edit ID`](#sf-share-grant-edit-id) +- [`sf share grant update GRANT`](#sf-share-grant-update-grant) - [`sf share identity`](#sf-share-identity) - [`sf share identity create`](#sf-share-identity-create) - [`sf share identity grant`](#sf-share-identity-grant) -- [`sf share identity ls`](#sf-share-identity-ls) +- [`sf share identity list`](#sf-share-identity-list) - [`sf share identity revoke CONNECTION`](#sf-share-identity-revoke-connection) - [`sf share identity update CONNECTION`](#sf-share-identity-update-connection) - [`sf share link`](#sf-share-link) -- [`sf share link copy ID`](#sf-share-link-copy-id) +- [`sf share link copy LINK`](#sf-share-link-copy-link) - [`sf share link create`](#sf-share-link-create) -- [`sf share link edit ID`](#sf-share-link-edit-id) -- [`sf share link ls`](#sf-share-link-ls) -- [`sf share link revoke ID`](#sf-share-link-revoke-id) +- [`sf share link list`](#sf-share-link-list) +- [`sf share link revoke LINK`](#sf-share-link-revoke-link) +- [`sf share link update LINK`](#sf-share-link-update-link) - [`sf share list`](#sf-share-list) - [`sf share password`](#sf-share-password) - [`sf share password create`](#sf-share-password-create) -- [`sf share password ls`](#sf-share-password-ls) -- [`sf share password revoke ID`](#sf-share-password-revoke-id) -- [`sf share password rotate ID`](#sf-share-password-rotate-id) +- [`sf share password list`](#sf-share-password-list) +- [`sf share password revoke CREDENTIAL`](#sf-share-password-revoke-credential) +- [`sf share password rotate CREDENTIAL`](#sf-share-password-rotate-credential) - [`sf share people`](#sf-share-people) -- [`sf share people edit PERSON`](#sf-share-people-edit-person) - [`sf share people invite EMAIL`](#sf-share-people-invite-email) -- [`sf share people ls`](#sf-share-people-ls) +- [`sf share people list`](#sf-share-people-list) - [`sf share people remove PERSON`](#sf-share-people-remove-person) - [`sf share people resend PERSON`](#sf-share-people-resend-person) +- [`sf share people update PERSON`](#sf-share-people-update-person) - [`sf share request`](#sf-share-request) -- [`sf share request approve ID`](#sf-share-request-approve-id) -- [`sf share request deny ID`](#sf-share-request-deny-id) -- [`sf share request ls`](#sf-share-request-ls) -- [`sf share revoke ID`](#sf-share-revoke-id) +- [`sf share request approve REQUEST`](#sf-share-request-approve-request) +- [`sf share request deny REQUEST`](#sf-share-request-deny-request) +- [`sf share request list`](#sf-share-request-list) +- [`sf share revoke GRANT`](#sf-share-revoke-grant) - [`sf share token`](#sf-share-token) - [`sf share token create`](#sf-share-token-create) -- [`sf share token ls`](#sf-share-token-ls) -- [`sf share token revoke ID`](#sf-share-token-revoke-id) -- [`sf share token rotate ID`](#sf-share-token-rotate-id) +- [`sf share token list`](#sf-share-token-list) +- [`sf share token revoke CREDENTIAL`](#sf-share-token-revoke-credential) +- [`sf share token rotate CREDENTIAL`](#sf-share-token-rotate-credential) - [`sf skills`](#sf-skills) +- [`sf skills install`](#sf-skills-install) - [`sf skills remove`](#sf-skills-remove) - [`sf skills status`](#sf-skills-status) - [`sf source archive`](#sf-source-archive) @@ -280,41 +288,41 @@ GLOBAL FLAGS - [`sf source cat PATH`](#sf-source-cat-path) - [`sf source commits apply`](#sf-source-commits-apply) - [`sf source commits create`](#sf-source-commits-create) -- [`sf source commits get SHA`](#sf-source-commits-get-sha) -- [`sf source commits ls`](#sf-source-commits-ls) +- [`sf source commits inspect SHA`](#sf-source-commits-inspect-sha) +- [`sf source commits list`](#sf-source-commits-list) - [`sf source diff`](#sf-source-diff) - [`sf source import`](#sf-source-import) -- [`sf source ls`](#sf-source-ls) +- [`sf source list`](#sf-source-list) - [`sf source merge SOURCE TARGET`](#sf-source-merge-source-target) - [`sf source search PATTERN`](#sf-source-search-pattern) - [`sf source tags create NAME`](#sf-source-tags-create-name) -- [`sf source tags ls`](#sf-source-tags-ls) +- [`sf source tags list`](#sf-source-tags-list) - [`sf spaces`](#sf-spaces) -- [`sf spaces add`](#sf-spaces-add) - [`sf spaces archive`](#sf-spaces-archive) - [`sf spaces check NAME`](#sf-spaces-check-name) - [`sf spaces claim`](#sf-spaces-claim) +- [`sf spaces create`](#sf-spaces-create) +- [`sf spaces delete`](#sf-spaces-delete) - [`sf spaces download`](#sf-spaces-download) - [`sf spaces duplicate`](#sf-spaces-duplicate) -- [`sf spaces get`](#sf-spaces-get) -- [`sf spaces ls`](#sf-spaces-ls) +- [`sf spaces inspect`](#sf-spaces-inspect) +- [`sf spaces key rotate`](#sf-spaces-key-rotate) +- [`sf spaces list`](#sf-spaces-list) - [`sf spaces restore`](#sf-spaces-restore) -- [`sf spaces rm`](#sf-spaces-rm) -- [`sf spaces rotate-claim`](#sf-spaces-rotate-claim) - [`sf spaces transfer TEAM`](#sf-spaces-transfer-team) - [`sf spaces update`](#sf-spaces-update) - [`sf status`](#sf-status) - [`sf storage [TARGET]`](#sf-storage-target) -- [`sf storage get ID`](#sf-storage-get-id) -- [`sf storage ls [TARGET]`](#sf-storage-ls-target) +- [`sf storage delete [OBJECT]`](#sf-storage-delete-object) +- [`sf storage download OBJECT`](#sf-storage-download-object) +- [`sf storage list [TARGET]`](#sf-storage-list-target) - [`sf storage put FILE`](#sf-storage-put-file) -- [`sf storage rm [ID]`](#sf-storage-rm-id) - [`sf switch [TEAM]`](#sf-switch-team) - [`sf tags`](#sf-tags) - [`sf tags apply FILE`](#sf-tags-apply-file) - [`sf tags debug`](#sf-tags-debug) - [`sf tags releases`](#sf-tags-releases) -- [`sf tags releases get ENVIRONMENT`](#sf-tags-releases-get-environment) +- [`sf tags releases inspect ENVIRONMENT`](#sf-tags-releases-inspect-environment) - [`sf tags releases rollback ENVIRONMENT REVISION`](#sf-tags-releases-rollback-environment-revision) - [`sf tags releases set ENVIRONMENT REVISION`](#sf-tags-releases-set-environment-revision) - [`sf tags revisions`](#sf-tags-revisions) @@ -328,56 +336,61 @@ GLOBAL FLAGS - [`sf teams`](#sf-teams) - [`sf teams accept INVITATION`](#sf-teams-accept-invitation) - [`sf teams create NAME`](#sf-teams-create-name) -- [`sf teams defaults [ROOTACCESS]`](#sf-teams-defaults-rootaccess) +- [`sf teams defaults [ACCESS]`](#sf-teams-defaults-access) - [`sf teams domains`](#sf-teams-domains) - [`sf teams domains add DOMAIN`](#sf-teams-domains-add-domain) -- [`sf teams domains ls`](#sf-teams-domains-ls) -- [`sf teams domains rm DOMAIN`](#sf-teams-domains-rm-domain) +- [`sf teams domains list`](#sf-teams-domains-list) +- [`sf teams domains remove DOMAIN`](#sf-teams-domains-remove-domain) - [`sf teams invitations`](#sf-teams-invitations) -- [`sf teams invitations add EMAILS`](#sf-teams-invitations-add-emails) - [`sf teams invitations cancel INVITATION`](#sf-teams-invitations-cancel-invitation) -- [`sf teams invitations ls`](#sf-teams-invitations-ls) +- [`sf teams invitations list`](#sf-teams-invitations-list) - [`sf teams invitations resend INVITATION`](#sf-teams-invitations-resend-invitation) - [`sf teams join [TEAM]`](#sf-teams-join-team) - [`sf teams join-link`](#sf-teams-join-link) -- [`sf teams ls`](#sf-teams-ls) +- [`sf teams list`](#sf-teams-list) - [`sf teams members`](#sf-teams-members) -- [`sf teams members ls`](#sf-teams-members-ls) -- [`sf teams members rm MEMBER`](#sf-teams-members-rm-member) +- [`sf teams members invite EMAILS`](#sf-teams-members-invite-emails) +- [`sf teams members list`](#sf-teams-members-list) +- [`sf teams members remove MEMBER`](#sf-teams-members-remove-member) - [`sf teams subteams`](#sf-teams-subteams) - [`sf teams subteams create NAME`](#sf-teams-subteams-create-name) -- [`sf teams subteams ls`](#sf-teams-subteams-ls) +- [`sf teams subteams delete SUBTEAM`](#sf-teams-subteams-delete-subteam) +- [`sf teams subteams list`](#sf-teams-subteams-list) - [`sf teams subteams members`](#sf-teams-subteams-members) - [`sf teams subteams members add SUBTEAM USER`](#sf-teams-subteams-members-add-subteam-user) -- [`sf teams subteams members ls SUBTEAM`](#sf-teams-subteams-members-ls-subteam) -- [`sf teams subteams members rm SUBTEAM USER`](#sf-teams-subteams-members-rm-subteam-user) +- [`sf teams subteams members list SUBTEAM`](#sf-teams-subteams-members-list-subteam) +- [`sf teams subteams members remove SUBTEAM USER`](#sf-teams-subteams-members-remove-subteam-user) - [`sf teams subteams rename SUBTEAM NAME`](#sf-teams-subteams-rename-subteam-name) -- [`sf teams subteams rm SUBTEAM`](#sf-teams-subteams-rm-subteam) - [`sf teams switch [TEAM]`](#sf-teams-switch-team) -- [`sf transfers accept ID`](#sf-transfers-accept-id) -- [`sf transfers cancel ID`](#sf-transfers-cancel-id) -- [`sf transfers get ID`](#sf-transfers-get-id) -- [`sf transfers ls`](#sf-transfers-ls) +- [`sf transfers accept TRANSFER`](#sf-transfers-accept-transfer) +- [`sf transfers cancel TRANSFER`](#sf-transfers-cancel-transfer) +- [`sf transfers inspect TRANSFER`](#sf-transfers-inspect-transfer) +- [`sf transfers list`](#sf-transfers-list) - [`sf unlink`](#sf-unlink) - [`sf users`](#sf-users) - [`sf users delete USER`](#sf-users-delete-user) -- [`sf users get USER`](#sf-users-get-user) -- [`sf users ls`](#sf-users-ls) +- [`sf users inspect USER`](#sf-users-inspect-user) +- [`sf users list`](#sf-users-list) - [`sf users reactivate USER`](#sf-users-reactivate-user) - [`sf users revoke USER`](#sf-users-revoke-user) - [`sf users sessions USER`](#sf-users-sessions-user) - [`sf users settings`](#sf-users-settings) - [`sf users suspend USER`](#sf-users-suspend-user) - [`sf versions`](#sf-versions) -- [`sf versions get [VERSION]`](#sf-versions-get-version) -- [`sf versions ls`](#sf-versions-ls) -- [`sf versions rm [VERSION]`](#sf-versions-rm-version) +- [`sf versions delete [VERSION]`](#sf-versions-delete-version) +- [`sf versions inspect [VERSION]`](#sf-versions-inspect-version) +- [`sf versions list`](#sf-versions-list) - [`sf whoami`](#sf-whoami) - [`sf wp`](#sf-wp) - [`sf zero`](#sf-zero) - [`sf zero abilities`](#sf-zero-abilities) +- [`sf zero build`](#sf-zero-build) - [`sf zero call ABILITY`](#sf-zero-call-ability) -- [`sf zero import SOURCE DIRECTORY`](#sf-zero-import-source-directory) +- [`sf zero check`](#sf-zero-check) +- [`sf zero dev`](#sf-zero-dev) +- [`sf zero import SOURCE INPUT`](#sf-zero-import-source-input) +- [`sf zero init [NAME]`](#sf-zero-init-name) +- [`sf zero migrate`](#sf-zero-migrate) - [`sf zero queries`](#sf-zero-queries) - [`sf zero types`](#sf-zero-types) @@ -387,39 +400,43 @@ Revoke visitor sessions. ```text USAGE - $ sf access [--profile ] [-y] + $ sf access [--api-url ] [--cwd ] [-d] [--no-color] [--non-interactive] [--profile + ] [--token ] [-y] GLOBAL FLAGS + -d, --debug Print redacted diagnostic detail on stderr (SPACEFAST_DEBUG). -y, --yes [env: SPACEFAST_YES] Skip confirmation prompts. - --api-url= [env: SPACEFAST_API_URL] Spacefast API base URL. - --json Format output as json. - --profile= [env: SPACEFAST_PROFILE] Named provider profile from `sf profiles`. + --api-url= [env: SPACEFAST_API_URL] Spacefast API base URL. + --cwd= Working directory for this invocation. + --[no-]json Print the result as JSON. + --no-color Disable color (NO_COLOR). + --non-interactive Never prompt; fail with the required inputs instead (SPACEFAST_NON_INTERACTIVE). + --profile= [env: SPACEFAST_PROFILE] Named provider profile from `sf profiles`. DESCRIPTION Revoke visitor sessions. Revoke active visitor sessions. Use `sf share` to manage who can open a space. - -EXAMPLES - Revoke visitor sessions. - - $ sf access ``` -## `sf access logout-all` +## `sf access sessions revoke` Revoke all visitor sessions. ```text USAGE - $ sf access logout-all [--profile ] [-y] [--claim-token - ] [-o ] [--space ] + $ sf access sessions revoke [--api-url ] [--cwd ] [-d] [--no-color] [--non-interactive] [--profile + ] [--token ] [-y] [-T ] [--space ] GLOBAL FLAGS + -d, --debug Print redacted diagnostic detail on stderr (SPACEFAST_DEBUG). -y, --yes [env: SPACEFAST_YES] Skip confirmation prompts. - --api-url= [env: SPACEFAST_API_URL] Spacefast API base URL. - --json Format output as json. - --profile= [env: SPACEFAST_PROFILE] Named provider profile from `sf profiles`. + --api-url= [env: SPACEFAST_API_URL] Spacefast API base URL. + --cwd= Working directory for this invocation. + --[no-]json Print the result as JSON. + --no-color Disable color (NO_COLOR). + --non-interactive Never prompt; fail with the required inputs instead (SPACEFAST_NON_INTERACTIVE). + --profile= [env: SPACEFAST_PROFILE] Named provider profile from `sf profiles`. DESCRIPTION Revoke all visitor sessions. @@ -429,7 +446,7 @@ DESCRIPTION EXAMPLES Revoke every visitor session on the space. - $ sf access logout-all --space docs + $ sf access sessions revoke --space docs ``` ## `sf activity` @@ -438,23 +455,27 @@ Show activity events. ```text USAGE - $ sf activity [--profile ] [-y] [--claim-token - ] [-o ] [--space ] [--all] [--code ] [--since ] [--until ] [--limit - ] [--cursor ] + $ sf activity [--api-url ] [--cwd ] [-d] [--no-color] [--non-interactive] [--profile + ] [--token ] [-y] [-T ] [--space ] [--all] [--code ] + [--since ] [--until ] [--limit ] [--cursor ] FLAGS - --all Read account-wide activity instead of a single space. - --code= Filter by activity taxonomy code, for example version.promoted. - --cursor= Pagination cursor from a previous response. - --limit= Maximum number of events to return (default 50, max 100). - --since= Only events at or after this ISO timestamp. - --until= Only events before this ISO timestamp. + --all Read account-wide activity instead of a single space. + --code= Filter by activity taxonomy code, for example version.promoted. + --cursor= Pagination cursor from a previous response. + --limit= Maximum number of events to return (default 50, max 100). + --since= Only events at or after this ISO timestamp. + --until= Only events before this ISO timestamp. GLOBAL FLAGS + -d, --debug Print redacted diagnostic detail on stderr (SPACEFAST_DEBUG). -y, --yes [env: SPACEFAST_YES] Skip confirmation prompts. - --api-url= [env: SPACEFAST_API_URL] Spacefast API base URL. - --json Format output as json. - --profile= [env: SPACEFAST_PROFILE] Named provider profile from `sf profiles`. + --api-url= [env: SPACEFAST_API_URL] Spacefast API base URL. + --cwd= Working directory for this invocation. + --[no-]json Print the result as JSON. + --no-color Disable color (NO_COLOR). + --non-interactive Never prompt; fail with the required inputs instead (SPACEFAST_NON_INTERACTIVE). + --profile= [env: SPACEFAST_PROFILE] Named provider profile from `sf profiles`. DESCRIPTION Show activity events. @@ -475,8 +496,8 @@ Write Spacefast agent instructions. ```text USAGE - $ sf agents init [DIRECTORY] [--profile ] [-y] [--agent - generic|claude-code] + $ sf agents init [DIRECTORY] [--api-url ] [--cwd ] [-d] [--no-color] [--non-interactive] + [--profile ] [--token ] [-y] [--agent generic|claude-code] ARGUMENTS [DIRECTORY] Directory that will contain AGENTS.md and CLAUDE.md. Defaults to the current directory. @@ -486,10 +507,14 @@ FLAGS GLOBAL FLAGS + -d, --debug Print redacted diagnostic detail on stderr (SPACEFAST_DEBUG). -y, --yes [env: SPACEFAST_YES] Skip confirmation prompts. - --api-url= [env: SPACEFAST_API_URL] Spacefast API base URL. - --json Format output as json. - --profile= [env: SPACEFAST_PROFILE] Named provider profile from `sf profiles`. + --api-url= [env: SPACEFAST_API_URL] Spacefast API base URL. + --cwd= Working directory for this invocation. + --[no-]json Print the result as JSON. + --no-color Disable color (NO_COLOR). + --non-interactive Never prompt; fail with the required inputs instead (SPACEFAST_NON_INTERACTIVE). + --profile= [env: SPACEFAST_PROFILE] Named provider profile from `sf profiles`. DESCRIPTION Write Spacefast agent instructions. @@ -512,18 +537,22 @@ Print runtime analytics. ```text USAGE - $ sf analytics [--profile ] [-y] [--claim-token - ] [-o ] [--space ] [--window 48h|7d|30d] + $ sf analytics [--api-url ] [--cwd ] [-d] [--no-color] [--non-interactive] [--profile + ] [--token ] [-y] [-T ] [--space ] [--window 48h|7d|30d] FLAGS --window=