void 0.21.1 → 0.21.2

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 (52) hide show
  1. package/README.md +3 -2
  2. package/dist/{auth-cmd-g_ymMkUe.mjs → account-cmd-D8OC-U7y.mjs} +8 -8
  3. package/dist/{auth-link-DFvxIyZi.mjs → auth-link-BYFeMJAp.mjs} +3 -3
  4. package/dist/auth-router-OHZNmrb_.mjs +74 -0
  5. package/dist/{build-cmd-wJAv808h.mjs → build-cmd-Bft7EY51.mjs} +1 -1
  6. package/dist/{cache-Be0Fu5Ka.mjs → cache-CKV1Gz2w.mjs} +1 -1
  7. package/dist/{cancel-deploy-BgmyOwhe.mjs → cancel-deploy-BAKmkX4f.mjs} +1 -1
  8. package/dist/cli/cli.mjs +104 -52
  9. package/dist/{connect-LnvW4HKx.mjs → connect-DLx1pRYk.mjs} +3 -3
  10. package/dist/{db-Mzv88E1C.mjs → db-B98_UV4H.mjs} +6 -6
  11. package/dist/{delete-Ri6JemSU.mjs → delete-BEEyqlwd.mjs} +1 -1
  12. package/dist/{deploy-DEsMVrCY.mjs → deploy-Bsymb0_c.mjs} +3 -3
  13. package/dist/{deploy-DAH2-m_-.mjs → deploy-CsjbRNyv.mjs} +1 -1
  14. package/dist/{domain-BA37Ye7T.mjs → domain-Av2AkLQP.mjs} +1 -1
  15. package/dist/{email-C5NsxrQG.mjs → email-CUqa6TtH.mjs} +2 -2
  16. package/dist/{env-U_ohASB0.mjs → env-D4RIGEzz.mjs} +1 -1
  17. package/dist/{github-cmd-DsrkweIl.mjs → github-cmd-BEK4VprE.mjs} +3 -3
  18. package/dist/{help-sBhFH6pi.mjs → help-iQOt7WHk.mjs} +39 -8
  19. package/dist/help-r_vrpH_d.mjs +2 -0
  20. package/dist/index.mjs +3 -3
  21. package/dist/{init-C--Yyj1b.mjs → init-D5niUPAz.mjs} +2 -2
  22. package/dist/{link-BC-mNG9-.mjs → link-3lGrfXzd.mjs} +1 -1
  23. package/dist/{list-DHU1Wj6c.mjs → list-CVjGr_C6.mjs} +1 -1
  24. package/dist/{login-jKe_0QZL.mjs → login-BgQJzxAl.mjs} +2 -2
  25. package/dist/login-Bz0zEPoy.mjs +2 -0
  26. package/dist/{logs-BG11f5PR.mjs → logs-DbzD-QDf.mjs} +1 -1
  27. package/dist/{operator-cmd-BwAS2XZt.mjs → operator-cmd-CR6Lxzt0.mjs} +3 -3
  28. package/dist/{platform-auth-config-C-hv-_Ok.mjs → platform-auth-config-De7BqRJm.mjs} +2 -2
  29. package/dist/{platform-auth-protection-DjTE5Hj-.mjs → platform-auth-protection-Dcat-6zu.mjs} +2 -2
  30. package/dist/{platform-auth-recovery-Cr0r8TEb.mjs → platform-auth-recovery-C9gsM640.mjs} +2 -2
  31. package/dist/{platform-cmd-DE6dw45v.mjs → platform-cmd-Cl9Uhzru.mjs} +1 -1
  32. package/dist/{platform-cmd-0tEh2ZtA.mjs → platform-cmd-CudokNIg.mjs} +3 -3
  33. package/dist/{platform-domain-B_7x6Iqx.mjs → platform-domain-Ckpd2kXw.mjs} +2 -2
  34. package/dist/{platform-lifecycle-Di0LbhPM.mjs → platform-lifecycle-DVzM2T4j.mjs} +7 -7
  35. package/dist/{platform-lifecycle-Dhx9Pnub.mjs → platform-lifecycle-DlpiGcjr.mjs} +1 -1
  36. package/dist/{platform-management-B9LUtMt9.mjs → platform-management-44Bxd3YC.mjs} +1 -1
  37. package/dist/{platform-management-eaiaU3uM.mjs → platform-management-ibuS1as0.mjs} +1 -1
  38. package/dist/{platform-recovery-BxfA8E5C.mjs → platform-recovery-D_KmvdSk.mjs} +2 -2
  39. package/dist/{project-cmd-DrnRJdep.mjs → project-cmd-BuF9doku.mjs} +12 -12
  40. package/dist/{project-team-CzRbO_kA.mjs → project-team-B1Tia8vd.mjs} +2 -2
  41. package/dist/{requests-DwrqUQZ8.mjs → requests-CphRF98D.mjs} +1 -1
  42. package/dist/{rollback-B4tFWmkN.mjs → rollback-BYHJV2yD.mjs} +1 -1
  43. package/dist/{secret-UtrRjhEO.mjs → secret-Rt9c4Ttw.mjs} +1 -1
  44. package/package.json +7 -7
  45. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +1 -1
  46. package/skills/void/SKILL.md +4 -2
  47. package/skills/void/docs/guide/platform/administration/access.md +1 -1
  48. package/skills/void/docs/guide/project-collaboration.md +1 -1
  49. package/skills/void/docs/reference/cli.md +25 -10
  50. package/skills/void/docs/reference/config.md +1 -1
  51. package/dist/help-B403BLBB.mjs +0 -2
  52. package/dist/login-BwiopVdg.mjs +0 -2
@@ -772,8 +772,35 @@ const HELP_TREE = {
772
772
  ]
773
773
  },
774
774
  auth: {
775
- summary: "Log in, link login methods, log out, and inspect local auth state.",
776
- usage: ["void auth <command>"],
775
+ summary: "Authenticate with this project’s saved Cloudflare or Void destination. Without one, choose interactively or pass --platform.",
776
+ usage: ["void auth <login|status|logout> [--platform cloudflare|void]"],
777
+ commands: [
778
+ {
779
+ command: "login",
780
+ description: "Sign in to the selected destination"
781
+ },
782
+ {
783
+ command: "status",
784
+ description: "Show the selected destination’s identity"
785
+ },
786
+ {
787
+ command: "logout",
788
+ description: "Sign out of the selected destination"
789
+ }
790
+ ],
791
+ options: [{
792
+ command: "--platform <cloudflare|void>",
793
+ description: "Choose the destination explicitly"
794
+ }],
795
+ children: {
796
+ login: basicSubcommand("Sign in to the selected destination.", "void auth login [--platform cloudflare|void]"),
797
+ status: basicSubcommand("Show the selected destination’s identity.", "void auth status [--platform cloudflare|void]"),
798
+ logout: basicSubcommand("Sign out of the selected destination.", "void auth logout [--platform cloudflare|void]")
799
+ }
800
+ },
801
+ account: {
802
+ summary: "Manage your Void platform account.",
803
+ usage: ["void account <command>"],
777
804
  commands: [
778
805
  {
779
806
  command: "login",
@@ -797,11 +824,11 @@ const HELP_TREE = {
797
824
  }
798
825
  ],
799
826
  children: {
800
- login: basicSubcommand("Log in with an enabled platform login method.", "void auth login"),
801
- link: basicSubcommand("Sign in again, then verify and link another login method to your existing account.", "void auth link [connection-id]"),
802
- logout: basicSubcommand("Log out and remove credentials.", "void auth logout"),
803
- whoami: basicSubcommand("Show the logged-in username.", "void auth whoami"),
804
- token: basicSubcommand("Copy auth token to clipboard.", "void auth token")
827
+ login: basicSubcommand("Log in with an enabled platform login method.", "void account login"),
828
+ link: basicSubcommand("Sign in again, then verify and link another login method to your existing account.", "void account link [connection-id]"),
829
+ logout: basicSubcommand("Log out and remove credentials.", "void account logout"),
830
+ whoami: basicSubcommand("Show the logged-in username.", "void account whoami"),
831
+ token: basicSubcommand("Copy auth token to clipboard.", "void account token")
805
832
  }
806
833
  },
807
834
  cloudflare: {
@@ -2086,6 +2113,10 @@ function printGlobalHelp() {
2086
2113
  "",
2087
2114
  ...globalCommandGroup("auth"),
2088
2115
  "",
2116
+ ...globalCommandGroup("account"),
2117
+ "",
2118
+ ...globalCommandGroup("cloudflare"),
2119
+ "",
2089
2120
  ...globalCommandGroup("platform"),
2090
2121
  "",
2091
2122
  ...globalCommandGroup("project"),
@@ -2124,7 +2155,7 @@ function printGlobalHelp() {
2124
2155
  helpLine("void help <command>", "Show command-specific help"),
2125
2156
  helpLine("void <command> --help", "Show command-specific help")
2126
2157
  ].join("\n"), sectionTitle("Commands"));
2127
- note([helpLine("VOID_TOKEN", "Auth token (or use `void auth login`)"), helpLine("VOID_PROJECT", "Deploy target project name override")].join("\n"), sectionTitle("Environment"));
2158
+ note([helpLine("VOID_TOKEN", "Auth token (or use `void account login`)"), helpLine("VOID_PROJECT", "Deploy target project name override")].join("\n"), sectionTitle("Environment"));
2128
2159
  outro("https://void.cloud");
2129
2160
  }
2130
2161
  function printVoidHeader() {
@@ -0,0 +1,2 @@
1
+ import { r as printHelpPage } from "./help-iQOt7WHk.mjs";
2
+ export { printHelpPage };
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { n as __toESM } from "./rolldown-runtime-DXIUcv95.mjs";
2
2
  import { a as join, l as relative, n as dirname, u as resolve } from "./dist-4WkAWhWx.mjs";
3
3
  import { d as require_picocolors } from "./output-CCH48AMM.mjs";
4
- import { B as resolveDistDir, Ct as resolveAssetRoutingPolicy, W as resolveWorkerDirName, at as generateQueueResolverSource, bt as hasApiRoutes, dt as hasRevalidate, ft as scanDurableObjectModules, lt as collectPages, ot as prerenderPages, pt as SEND_EMAIL_BINDING, st as prerenderPagesNode, ut as collectRevalidate, xt as hasDocumentRoutes } from "./deploy-DEsMVrCY.mjs";
4
+ import { B as resolveDistDir, Ct as resolveAssetRoutingPolicy, W as resolveWorkerDirName, at as generateQueueResolverSource, bt as hasApiRoutes, dt as hasRevalidate, ft as scanDurableObjectModules, lt as collectPages, ot as prerenderPages, pt as SEND_EMAIL_BINDING, st as prerenderPagesNode, ut as collectRevalidate, xt as hasDocumentRoutes } from "./deploy-Bsymb0_c.mjs";
5
5
  import { i as resolveProjectPaths, n as readProjectPaths, t as assertNoRootSourceConventionConflicts } from "./project-paths-CKQ-Q5JS.mjs";
6
6
  import { n as loadVoidAuthConfig, t as findVoidAuthConfig } from "./config-uP7ZDtVZ.mjs";
7
7
  import { r as scopedAccessCredentials } from "./cf-access-DRsQRe6k.mjs";
@@ -6196,7 +6196,7 @@ function voidPlugin(options) {
6196
6196
  });
6197
6197
  } else if (credentials.status === "no-token") afterReady(() => {
6198
6198
  console.log();
6199
- voidWarn("Remote mode requires authentication. Run `void auth login`, then restart.");
6199
+ voidWarn("Remote mode requires authentication. Run `void account login`, then restart.");
6200
6200
  voidWarn("Falling back to local bindings.");
6201
6201
  });
6202
6202
  else afterReady(() => {
@@ -6209,7 +6209,7 @@ function voidPlugin(options) {
6209
6209
  const credentials = readVoidDevCredentials(root);
6210
6210
  if (credentials.status === "no-token") afterReady(() => {
6211
6211
  console.log();
6212
- voidWarn("AI requires authentication. Run `void auth login`, then restart the dev server.");
6212
+ voidWarn("AI requires authentication. Run `void account login`, then restart the dev server.");
6213
6213
  });
6214
6214
  else if (credentials.status === "no-project") {
6215
6215
  if (process.stdin.isTTY) afterReady(() => {
@@ -17,8 +17,8 @@ import { r as formatProjectCommand } from "./preset-Dowh9tTt.mjs";
17
17
  import { n as writeVoidProjectConfig, t as canRewriteVoidProjectConfig } from "./config-write-y3CBI_ux.mjs";
18
18
  import { i as migrateFrameworkAdapterPaths, t as migrateLegacyVoidConfig } from "./migrate-BV8qHiCb.mjs";
19
19
  import { i as promptProjectSelection, r as promptAndCreateProject } from "./create-project-BZBl_gQ0.mjs";
20
- import { t as promptForLoginToken } from "./login-jKe_0QZL.mjs";
21
- import { i as saveDiscoveredPlatform, t as discoverPlatform } from "./platform-cmd-0tEh2ZtA.mjs";
20
+ import { t as promptForLoginToken } from "./login-BgQJzxAl.mjs";
21
+ import { i as saveDiscoveredPlatform, t as discoverPlatform } from "./platform-cmd-CudokNIg.mjs";
22
22
  import { t as connectCloudflare } from "./cloudflare-connect-DloREDlc.mjs";
23
23
  import { n as findInstalledYarnPnpRuntime, r as hasLocalLockfile, t as buildDrizzleKitSpawnEnv } from "./yarn-pnp-CVEc3gE7.mjs";
24
24
  import { createRequire } from "node:module";
@@ -22,7 +22,7 @@ async function runLink(root, slug) {
22
22
  }
23
23
  const token = getToken(root);
24
24
  if (!token) {
25
- cancel("No auth token found. Run `void auth login` first.");
25
+ cancel("No auth token found. Run `void account login` first.");
26
26
  process.exit(1);
27
27
  }
28
28
  const client = new PlatformClient(token, { root });
@@ -13,7 +13,7 @@ async function runListCommand(root, slug) {
13
13
  if (platform === "none") throw new Error("project: Deployment is disabled. Run `void init` to choose a platform.");
14
14
  const token = getToken(root);
15
15
  if (!token) {
16
- log.error("Not logged in. Run `void auth login` first.");
16
+ log.error("Not logged in. Run `void account login` first.");
17
17
  process.exit(1);
18
18
  }
19
19
  let projectId;
@@ -29,7 +29,7 @@ async function selectPlatformLoginMethod(platform, requestedId) {
29
29
  return methods.find((method) => method.id === provider);
30
30
  }
31
31
  async function promptForLoginToken(root = process.cwd(), platform) {
32
- const { id: provider, label: providerName } = await selectPlatformLoginMethod(platform ?? await import("./platform-cmd-DE6dw45v.mjs").then(({ discoverPlatform }) => discoverPlatform(getApiUrl(root))));
32
+ const { id: provider, label: providerName } = await selectPlatformLoginMethod(platform ?? await import("./platform-cmd-Cl9Uhzru.mjs").then(({ discoverPlatform }) => discoverPlatform(getApiUrl(root))));
33
33
  const s = createSpinner();
34
34
  s.start(`Opening browser for ${providerName} login...`);
35
35
  try {
@@ -62,7 +62,7 @@ async function runLoginCommand(root = process.cwd()) {
62
62
  return;
63
63
  }
64
64
  log.warn("Already logged in.");
65
- outro("To re-login, run `void auth logout` first.");
65
+ outro("To re-login, run `void account logout` first.");
66
66
  return;
67
67
  } catch (error) {
68
68
  if (!isExpiredTokenError(error)) throw error;
@@ -0,0 +1,2 @@
1
+ import { r as selectPlatformLoginMethod } from "./login-BgQJzxAl.mjs";
2
+ export { selectPlatformLoginMethod };
@@ -22,7 +22,7 @@ async function runLogsCommand(root, filter, range, deployment, level) {
22
22
  if (platform === "none") throw new Error("logs: Deployment is disabled. Run `void init` to choose a platform.");
23
23
  const token = getToken(root);
24
24
  if (!token) {
25
- log.error("Not logged in. Run `void auth login` first.");
25
+ log.error("Not logged in. Run `void account login` first.");
26
26
  process.exit(1);
27
27
  }
28
28
  if (!/^\d+(m|h|d)$/.test(range)) {
@@ -137,8 +137,8 @@ async function runAuth(origin, args) {
137
137
  if (args.action === "login" || args.action === "token" && args.tokenStdin) {
138
138
  if (!args.tokenStdin && !process.stdin.isTTY) throw new OperatorClientError("Browser login requires an interactive terminal. Use --token-stdin to exchange an API session.", "interactive_login_required");
139
139
  const apiToken = args.tokenStdin ? await readOperatorApiTokenStdin() : await (async () => {
140
- const { discoverPlatform } = await import("./platform-cmd-DE6dw45v.mjs");
141
- const { selectPlatformLoginMethod } = await import("./login-BwiopVdg.mjs");
140
+ const { discoverPlatform } = await import("./platform-cmd-Cl9Uhzru.mjs");
141
+ const { selectPlatformLoginMethod } = await import("./login-Bz0zEPoy.mjs");
142
142
  const { runPlatformLogin } = await import("./auth-CAw7zHqj.mjs");
143
143
  return runPlatformLogin(origin, (await selectPlatformLoginMethod(await discoverPlatform(origin), args.providerExplicit ? args.provider : void 0)).id, (url) => process.stderr.write(`Sign in at ${url}\n`));
144
144
  })();
@@ -279,7 +279,7 @@ async function followOperatorLogs(client, args, signal, pollIntervalMs = 2e3) {
279
279
  }
280
280
  async function runOperatorCommand(args) {
281
281
  if (!args.action) {
282
- const { printHelpPage } = await import("./help-B403BLBB.mjs");
282
+ const { printHelpPage } = await import("./help-r_vrpH_d.mjs");
283
283
  printHelpPage(["platform", args.group]);
284
284
  return;
285
285
  }
@@ -140,11 +140,11 @@ async function configurationInput(args, existing) {
140
140
  }
141
141
  async function runPlatformAuthConfig(args) {
142
142
  if (args.action === "recover") {
143
- const { runPlatformAuthRecovery } = await import("./platform-auth-recovery-Cr0r8TEb.mjs");
143
+ const { runPlatformAuthRecovery } = await import("./platform-auth-recovery-C9gsM640.mjs");
144
144
  return runPlatformAuthRecovery(args);
145
145
  }
146
146
  if (args.action === "protection") {
147
- const { runPlatformProtectionConfig } = await import("./platform-auth-protection-DjTE5Hj-.mjs");
147
+ const { runPlatformProtectionConfig } = await import("./platform-auth-protection-Dcat-6zu.mjs");
148
148
  return runPlatformProtectionConfig(args);
149
149
  }
150
150
  const origin = resolveOperatorOrigin(args.connection);
@@ -4,8 +4,8 @@ import { n as ensurePlatformAccessToken } from "./cf-access-rAZxzMkL.mjs";
4
4
  import { E as confirm, W as isCancel } from "./dist-Dn6nn2IU.mjs";
5
5
  import { n as OperatorClient } from "./operator-client-A0iex2yi.mjs";
6
6
  import { a as resolveOperatorOrigin, r as readOperatorToken } from "./operator-auth-BkVgJqv-.mjs";
7
- import { D as preparePlatformAccessSetup, E as parsePlatformAccessSetupSpec, O as PlatformCloudflareClient, T as checkpointPlatformAccessResources, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock, w as resolvePlatformCloudflareCredential } from "./platform-lifecycle-Di0LbhPM.mjs";
8
- import { c as selectAuthoritativePlatformManifest, u as verifyPlatformInstallationOwnership } from "./platform-management-eaiaU3uM.mjs";
7
+ import { D as preparePlatformAccessSetup, E as parsePlatformAccessSetupSpec, O as PlatformCloudflareClient, T as checkpointPlatformAccessResources, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock, w as resolvePlatformCloudflareCredential } from "./platform-lifecycle-DVzM2T4j.mjs";
8
+ import { c as selectAuthoritativePlatformManifest, u as verifyPlatformInstallationOwnership } from "./platform-management-ibuS1as0.mjs";
9
9
  import { createHmac } from "node:crypto";
10
10
  import { parsePlatformAccessProtection, platformProtectionProofMessage } from "@void/platform";
11
11
  import { readFile } from "node:fs/promises";
@@ -2,8 +2,8 @@ import { d as openBrowser } from "./auth-B9_D6ygs.mjs";
2
2
  import { d as readInstallationRecoverySecrets, h as resolveInstallationManifest, t as acquirePlatformLifecycleLock } from "./platform-registry-BJbgZLS1.mjs";
3
3
  import { E as confirm, W as isCancel } from "./dist-Dn6nn2IU.mjs";
4
4
  import { a as resolveOperatorOrigin } from "./operator-auth-BkVgJqv-.mjs";
5
- import { O as PlatformCloudflareClient, f as platformDatabaseClientUrl, n as resolvePlatformInstallDatabaseUrl, s as acquirePlatformDatabaseLifecycleLockConnection, w as resolvePlatformCloudflareCredential } from "./platform-lifecycle-Di0LbhPM.mjs";
6
- import { c as selectAuthoritativePlatformManifest, u as verifyPlatformInstallationOwnership } from "./platform-management-eaiaU3uM.mjs";
5
+ import { O as PlatformCloudflareClient, f as platformDatabaseClientUrl, n as resolvePlatformInstallDatabaseUrl, s as acquirePlatformDatabaseLifecycleLockConnection, w as resolvePlatformCloudflareCredential } from "./platform-lifecycle-DVzM2T4j.mjs";
6
+ import { c as selectAuthoritativePlatformManifest, u as verifyPlatformInstallationOwnership } from "./platform-management-ibuS1as0.mjs";
7
7
  import { createCipheriv, createDecipheriv, createHash, createHmac, hkdfSync, randomBytes, randomUUID } from "node:crypto";
8
8
  import { execFile } from "node:child_process";
9
9
  import { parsePlatformAccessProtection, parsePlatformAdmissionPolicy, parsePlatformLoginConfiguration, platformAuthenticationRecoveryMessage, validatePlatformAdmissionPolicy } from "@void/platform";
@@ -1,2 +1,2 @@
1
- import { r as runPlatformCommand, t as discoverPlatform } from "./platform-cmd-0tEh2ZtA.mjs";
1
+ import { r as runPlatformCommand, t as discoverPlatform } from "./platform-cmd-CudokNIg.mjs";
2
2
  export { discoverPlatform, runPlatformCommand };
@@ -92,12 +92,12 @@ function saveDiscoveredPlatform(discovery) {
92
92
  }
93
93
  async function runPlatformCommand(_root, args) {
94
94
  if (args.subcommand === "config") {
95
- const { runPlatformAuthConfig } = await import("./platform-auth-config-C-hv-_Ok.mjs");
95
+ const { runPlatformAuthConfig } = await import("./platform-auth-config-De7BqRJm.mjs");
96
96
  await runPlatformAuthConfig(args);
97
97
  return;
98
98
  }
99
99
  if (args.subcommand === "operator") {
100
- const { runOperatorCommand } = await import("./operator-cmd-BwAS2XZt.mjs");
100
+ const { runOperatorCommand } = await import("./operator-cmd-CR6Lxzt0.mjs");
101
101
  await runOperatorCommand(args);
102
102
  return;
103
103
  }
@@ -129,7 +129,7 @@ async function runPlatformCommand(_root, args) {
129
129
  console.log(`Capabilities: ${Object.entries(discovery.capabilities).filter(([, enabled]) => enabled).map(([name]) => name).join(", ")}`);
130
130
  return;
131
131
  }
132
- const { runPlatformLifecycleCommand } = await import("./platform-lifecycle-Dhx9Pnub.mjs");
132
+ const { runPlatformLifecycleCommand } = await import("./platform-lifecycle-DlpiGcjr.mjs");
133
133
  await runPlatformLifecycleCommand(args);
134
134
  }
135
135
  //#endregion
@@ -1,8 +1,8 @@
1
1
  import { t as cfAccessHeaders } from "./cf-access-DRsQRe6k.mjs";
2
2
  import { d as readInstallationRecoverySecrets, g as savePlatformConnection, t as acquirePlatformLifecycleLock, v as writeInstallationManifest } from "./platform-registry-BJbgZLS1.mjs";
3
3
  import { B as text, E as confirm, N as note, W as isCancel, j as log } from "./dist-Dn6nn2IU.mjs";
4
- import { C as assertPlatformOperatorCredentialCanApplyPlan, O as PlatformCloudflareClient, _ as createPlatformInstallPlan, c as createPlatformHealthProbeToken, h as recordPlatformWorkerTraffic, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock, p as recordResource, t as assertNoninteractivePlatformMutationAcknowledged, w as resolvePlatformCloudflareCredential } from "./platform-lifecycle-Di0LbhPM.mjs";
5
- import { a as resolveInstalledPlatformManifest, c as selectAuthoritativePlatformManifest, u as verifyPlatformInstallationOwnership } from "./platform-management-eaiaU3uM.mjs";
4
+ import { C as assertPlatformOperatorCredentialCanApplyPlan, O as PlatformCloudflareClient, _ as createPlatformInstallPlan, c as createPlatformHealthProbeToken, h as recordPlatformWorkerTraffic, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock, p as recordResource, t as assertNoninteractivePlatformMutationAcknowledged, w as resolvePlatformCloudflareCredential } from "./platform-lifecycle-DVzM2T4j.mjs";
5
+ import { a as resolveInstalledPlatformManifest, c as selectAuthoritativePlatformManifest, u as verifyPlatformInstallationOwnership } from "./platform-management-ibuS1as0.mjs";
6
6
  import { randomUUID } from "node:crypto";
7
7
  import { PLATFORM_APPLICATION_KEY, PLATFORM_REMOTE_INSTALLATION_MANIFEST_KEY, createApplicationRoutes, createPlatformDeploymentManifest, normalizeApplicationDomain } from "@void/platform";
8
8
  //#region src/cli/platform-domain.ts
@@ -1499,7 +1499,7 @@ async function verifyInstalledPlatformAccessProtection(input) {
1499
1499
  }
1500
1500
  const existingWorkers = input.plan.actions.filter((action) => action.kind === "worker" && action.action === "update").map((action) => action.name);
1501
1501
  if (existingWorkers.length) {
1502
- const { verifyProtectionWorkerOrigins } = await import("./platform-auth-protection-DjTE5Hj-.mjs");
1502
+ const { verifyProtectionWorkerOrigins } = await import("./platform-auth-protection-Dcat-6zu.mjs");
1503
1503
  await verifyProtectionWorkerOrigins({
1504
1504
  request: input.client.request.bind(input.client),
1505
1505
  listWorkerDomains: input.client.listWorkerDomains.bind(input.client),
@@ -5532,14 +5532,14 @@ function resolvePlatformInstallDatabaseUrl(checkpoint, manifest = null) {
5532
5532
  }
5533
5533
  async function runPlatformLifecycleCommand(args) {
5534
5534
  if (args.subcommand === "domain") {
5535
- const { runPlatformDomainCommand } = await import("./platform-domain-B_7x6Iqx.mjs");
5535
+ const { runPlatformDomainCommand } = await import("./platform-domain-Ckpd2kXw.mjs");
5536
5536
  await runPlatformDomainCommand(args);
5537
5537
  return;
5538
5538
  }
5539
5539
  if (args.subcommand === "discover") {
5540
5540
  const client = new PlatformCloudflareClient((await resolvePlatformCloudflareCredential()).token);
5541
5541
  const accountId = await selectAccount(await readAccounts(client), args.account);
5542
- const { recoverPlatformInstallations } = await import("./platform-recovery-BxfA8E5C.mjs");
5542
+ const { recoverPlatformInstallations } = await import("./platform-recovery-D_KmvdSk.mjs");
5543
5543
  const recovered = await recoverPlatformInstallations(client, accountId, void 0, args.selector);
5544
5544
  if (recovered.length === 0) {
5545
5545
  log.info(`No recoverable Void platform installations were found in ${accountId}.`);
@@ -5549,7 +5549,7 @@ async function runPlatformLifecycleCommand(args) {
5549
5549
  return;
5550
5550
  }
5551
5551
  if (args.subcommand !== "install") {
5552
- const { runInstalledPlatformCommand } = await import("./platform-management-B9LUtMt9.mjs");
5552
+ const { runInstalledPlatformCommand } = await import("./platform-management-44Bxd3YC.mjs");
5553
5553
  await runInstalledPlatformCommand(args);
5554
5554
  return;
5555
5555
  }
@@ -5761,7 +5761,7 @@ async function runPlatformLifecycleCommand(args) {
5761
5761
  progress?.stop("Read the saved installation.");
5762
5762
  progress = void 0;
5763
5763
  if (authoritative) {
5764
- const { selectAuthoritativePlatformManifest } = await import("./platform-management-B9LUtMt9.mjs");
5764
+ const { selectAuthoritativePlatformManifest } = await import("./platform-management-44Bxd3YC.mjs");
5765
5765
  const selected = selectAuthoritativePlatformManifest(existing, authoritative);
5766
5766
  authoritativeProvisionIntents = true;
5767
5767
  if (!args.plan && JSON.stringify(selected) !== JSON.stringify(existing)) writeInstallationManifest(selected);
@@ -5990,7 +5990,7 @@ async function runPlatformLifecycleCommand(args) {
5990
5990
  })).actions.filter((action) => action.kind === "worker"),
5991
5991
  revalidateBeforeWorkerDeploy: (manifest, action) => revalidatePlatformInstallAction(client, plan, manifest, action),
5992
5992
  verifyExistingOwnership: async (manifest, databaseCheckpointExists) => {
5993
- const { verifyPlatformInstallationOwnership } = await import("./platform-management-B9LUtMt9.mjs");
5993
+ const { verifyPlatformInstallationOwnership } = await import("./platform-management-44Bxd3YC.mjs");
5994
5994
  const retainedReplacementKeys = new Set(plan.actions.filter((action) => {
5995
5995
  const previous = manifest.resources.find((resource) => resource.key === action.key);
5996
5996
  return action.action === "create" && previous && previous.name !== action.name;
@@ -6024,7 +6024,7 @@ async function runPlatformLifecycleCommand(args) {
6024
6024
  log.info("Confirm your identity in the browser, then test and enable any additional login methods in Settings.");
6025
6025
  }
6026
6026
  if (!plan.deployment.application.zoneName) log.info("Apps will use workers.dev addresses. When your domain is ready: void platform domain set <domain>");
6027
- outro("Run `void auth login`, then deploy an app with `void deploy --platform void`.");
6027
+ outro("Run `void account login`, then deploy an app with `void deploy --platform void`.");
6028
6028
  } catch (error) {
6029
6029
  progress?.error("Platform installation failed.");
6030
6030
  progress = void 0;
@@ -1,2 +1,2 @@
1
- import { r as runPlatformLifecycleCommand } from "./platform-lifecycle-Di0LbhPM.mjs";
1
+ import { r as runPlatformLifecycleCommand } from "./platform-lifecycle-DVzM2T4j.mjs";
2
2
  export { runPlatformLifecycleCommand };
@@ -1,2 +1,2 @@
1
- import { c as selectAuthoritativePlatformManifest, s as runInstalledPlatformCommand, u as verifyPlatformInstallationOwnership } from "./platform-management-eaiaU3uM.mjs";
1
+ import { c as selectAuthoritativePlatformManifest, s as runInstalledPlatformCommand, u as verifyPlatformInstallationOwnership } from "./platform-management-ibuS1as0.mjs";
2
2
  export { runInstalledPlatformCommand, selectAuthoritativePlatformManifest, verifyPlatformInstallationOwnership };
@@ -1,7 +1,7 @@
1
1
  import { i as createSpinner } from "./output-CCH48AMM.mjs";
2
2
  import { a as listInstallationManifests, d as readInstallationRecoverySecrets, h as resolveInstallationManifest, m as removePlatformConnectionForInstallation, p as removeInstallationRecoverySecrets, t as acquirePlatformLifecycleLock, v as writeInstallationManifest } from "./platform-registry-BJbgZLS1.mjs";
3
3
  import { E as confirm, I as select, N as note, P as outro, W as isCancel, j as log } from "./dist-Dn6nn2IU.mjs";
4
- import { A as hyperdriveOriginFromConnectionString, C as assertPlatformOperatorCredentialCanApplyPlan, M as verifyPlatformRuntimeTokenPermissions, O as PlatformCloudflareClient, S as platformDatabaseNameFromOwnerUrl, _ as createPlatformInstallPlan, a as REMOTE_INSTALLATION_MANIFEST_KEY, b as platformProvisionIntentHash, d as loadPlatformRuntime, g as trackedPlatformWorkerTraffic, j as hyperdriveOriginMatches, k as hyperdriveOriginConfigHash, l as createPlatformInstallationSecrets, m as resolveBootstrapGitHubId, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock, t as assertNoninteractivePlatformMutationAcknowledged, u as installPlatform, v as formatPlatformInstallPlan, w as resolvePlatformCloudflareCredential, x as revalidatePlatformInstallAction, y as platformAdoptionIntentHash } from "./platform-lifecycle-Di0LbhPM.mjs";
4
+ import { A as hyperdriveOriginFromConnectionString, C as assertPlatformOperatorCredentialCanApplyPlan, M as verifyPlatformRuntimeTokenPermissions, O as PlatformCloudflareClient, S as platformDatabaseNameFromOwnerUrl, _ as createPlatformInstallPlan, a as REMOTE_INSTALLATION_MANIFEST_KEY, b as platformProvisionIntentHash, d as loadPlatformRuntime, g as trackedPlatformWorkerTraffic, j as hyperdriveOriginMatches, k as hyperdriveOriginConfigHash, l as createPlatformInstallationSecrets, m as resolveBootstrapGitHubId, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock, t as assertNoninteractivePlatformMutationAcknowledged, u as installPlatform, v as formatPlatformInstallPlan, w as resolvePlatformCloudflareCredential, x as revalidatePlatformInstallAction, y as platformAdoptionIntentHash } from "./platform-lifecycle-DVzM2T4j.mjs";
5
5
  import { createHash } from "node:crypto";
6
6
  import { PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE, PLATFORM_R2_OWNERSHIP_MARKER_KEY, createPlatformResourceOwnershipMarker, parsePlatformInstallationManifest, parsePlatformResourceOwnershipMarker, recordInstallationResource, recordInstallationStep, setInstallationDesiredState, transitionInstallation } from "@void/platform";
7
7
  //#region src/cli/platform-management.ts
@@ -1,7 +1,7 @@
1
1
  import { t as cfAccessHeaders } from "./cf-access-DRsQRe6k.mjs";
2
2
  import { a as listInstallationManifests, g as savePlatformConnection, t as acquirePlatformLifecycleLock, v as writeInstallationManifest } from "./platform-registry-BJbgZLS1.mjs";
3
- import { _ as createPlatformInstallPlan, a as REMOTE_INSTALLATION_MANIFEST_KEY } from "./platform-lifecycle-Di0LbhPM.mjs";
4
- import { i as recoverDurablyMarkedProvisionIntents, r as isPlatformManifestMonotonicExtension, u as verifyPlatformInstallationOwnership } from "./platform-management-eaiaU3uM.mjs";
3
+ import { _ as createPlatformInstallPlan, a as REMOTE_INSTALLATION_MANIFEST_KEY } from "./platform-lifecycle-DVzM2T4j.mjs";
4
+ import { i as recoverDurablyMarkedProvisionIntents, r as isPlatformManifestMonotonicExtension, u as verifyPlatformInstallationOwnership } from "./platform-management-ibuS1as0.mjs";
5
5
  import { parsePlatformInstallationManifest, setInstallationEndpoints } from "@void/platform";
6
6
  //#region src/cli/platform-recovery.ts
7
7
  async function recoverPlatformInstallations(client, accountId, verifyEndpoint = verifyInstallationEndpoint, selector = "") {
@@ -9,7 +9,7 @@ async function runProjectsCommand(root) {
9
9
  intro(cliTitle("project list"));
10
10
  const token = getToken(root);
11
11
  if (!token) {
12
- log.error("Not logged in. Run `void auth login` first.");
12
+ log.error("Not logged in. Run `void account login` first.");
13
13
  process.exit(1);
14
14
  }
15
15
  const projects = await new PlatformClient(token, { root }).listProjects();
@@ -39,17 +39,17 @@ async function runProjectsCommand(root) {
39
39
  async function runProjectCommand(root, args) {
40
40
  const cloudflare = readDeploymentPlatform(root) === "cloudflare";
41
41
  if (args.subcommand === "status") {
42
- const { runListCommand } = await import("./list-DHU1Wj6c.mjs");
42
+ const { runListCommand } = await import("./list-CVjGr_C6.mjs");
43
43
  return runListCommand(root, args.name || void 0);
44
44
  }
45
45
  if (args.subcommand === "link") {
46
46
  if (cloudflare) throw new Error("project: Direct Cloudflare apps are identified by cloudflare.name in void.config.ts and do not need linking.");
47
- const { runLink } = await import("./link-BC-mNG9-.mjs");
47
+ const { runLink } = await import("./link-3lGrfXzd.mjs");
48
48
  return runLink(root, args.name || void 0);
49
49
  }
50
50
  if (args.subcommand === "list") {
51
51
  if (cloudflare) {
52
- const { runListCommand } = await import("./list-DHU1Wj6c.mjs");
52
+ const { runListCommand } = await import("./list-CVjGr_C6.mjs");
53
53
  return runListCommand(root);
54
54
  }
55
55
  return runProjectsCommand(root);
@@ -61,41 +61,41 @@ async function runProjectCommand(root, args) {
61
61
  }
62
62
  if (args.subcommand === "team") {
63
63
  if (args.action === "") {
64
- const { printHelpPage } = await import("./help-B403BLBB.mjs");
64
+ const { printHelpPage } = await import("./help-r_vrpH_d.mjs");
65
65
  printHelpPage(["project", "team"]);
66
66
  return;
67
67
  }
68
68
  const accountInvitationAction = args.action === "pending" || args.action === "accept" || args.action === "decline";
69
69
  if (cloudflare && !accountInvitationAction) throw new Error("project: Teams are available only for projects hosted on a Void platform, not direct Cloudflare deployments.");
70
- const { runProjectTeamCommand } = await import("./project-team-CzRbO_kA.mjs");
70
+ const { runProjectTeamCommand } = await import("./project-team-B1Tia8vd.mjs");
71
71
  return runProjectTeamCommand(root, args);
72
72
  }
73
73
  if (args.subcommand === "logs") {
74
- const { runLogsCommand } = await import("./logs-BG11f5PR.mjs");
74
+ const { runLogsCommand } = await import("./logs-DbzD-QDf.mjs");
75
75
  return runLogsCommand(root, args.filter, args.range, args.deployment || void 0, args.level || void 0);
76
76
  }
77
77
  if (args.subcommand === "requests") {
78
78
  if (cloudflare) throw new Error("project: Historical request analytics require the Void platform. Use `void project logs` for a live Cloudflare tail.");
79
- const { runRequestsCommand } = await import("./requests-DwrqUQZ8.mjs");
79
+ const { runRequestsCommand } = await import("./requests-CphRF98D.mjs");
80
80
  return runRequestsCommand(root, args.range, args.status || void 0);
81
81
  }
82
82
  if (args.subcommand === "rollback") {
83
- const { runRollbackCommand } = await import("./rollback-B4tFWmkN.mjs");
83
+ const { runRollbackCommand } = await import("./rollback-BYHJV2yD.mjs");
84
84
  return runRollbackCommand(root, args.deployId || void 0);
85
85
  }
86
86
  if (args.subcommand === "cancel") {
87
87
  if (cloudflare) throw new Error("project: Direct Cloudflare deploys activate only after readiness succeeds, so there is no remote build to cancel.");
88
- const { runCancelDeployCommand } = await import("./cancel-deploy-BgmyOwhe.mjs");
88
+ const { runCancelDeployCommand } = await import("./cancel-deploy-BAKmkX4f.mjs");
89
89
  return runCancelDeployCommand(root, args.deployId || void 0);
90
90
  }
91
91
  if (args.subcommand === "delete") {
92
92
  if (cloudflare) throw new Error("project: Refusing to delete Cloudflare resources through this command. Direct deployments are additive and existing resources may be shared.");
93
- const { runDeleteCommand } = await import("./delete-Ri6JemSU.mjs");
93
+ const { runDeleteCommand } = await import("./delete-BEEyqlwd.mjs");
94
94
  return runDeleteCommand(root, args.name || void 0, { force: args.force });
95
95
  }
96
96
  if (args.subcommand === "purge-cache") {
97
97
  if (cloudflare) throw new Error("project: Direct Cloudflare ISR cache purge is not available yet; redeploy or purge the configured KV namespace explicitly.");
98
- const { runPurgeCacheCommand } = await import("./cache-Be0Fu5Ka.mjs");
98
+ const { runPurgeCacheCommand } = await import("./cache-CKV1Gz2w.mjs");
99
99
  return runPurgeCacheCommand(root, args.projectSlug || void 0);
100
100
  }
101
101
  }
@@ -47,7 +47,7 @@ function invitationResponseError(error, apiUrl) {
47
47
  if (platformErrorMessage(parsePlatformErrorBody(error.body))) return error;
48
48
  let message;
49
49
  if (error.code === "project invitation not found") message = `Invitation not found on ${apiUrl}. Check VOID_API_URL if set, connect to the platform in your invitation with \`void connect <url>\`, then run \`void project team pending\` to check the invitation ID. If it is missing, ask a project administrator for a new invitation.`;
50
- else if (error.code === "forbidden") message = `Your account cannot respond to this invitation on ${apiUrl}. Sign in with the account whose registered email received the invitation. To switch accounts, set VOID_API_URL to ${apiUrl}, unset VOID_TOKEN if present, then run \`void auth logout\` and \`void auth login\`. Run \`void project team pending\` to see that account's invitations.`;
50
+ else if (error.code === "forbidden") message = `Your account cannot respond to this invitation on ${apiUrl}. Sign in with the account whose registered email received the invitation. To switch accounts, set VOID_API_URL to ${apiUrl}, unset VOID_TOKEN if present, then run \`void account logout\` and \`void account login\`. Run \`void project team pending\` to see that account's invitations.`;
51
51
  else if (error.code === "project invitation has expired") message = "This invitation has expired. Ask a project administrator to invite you again, then run `void project team pending`.";
52
52
  else if (error.code === "project invitation is no longer pending") message = "This invitation has already been answered or revoked. Run `void project team pending` to see invitations awaiting your response, or ask a project administrator to check your access.";
53
53
  else return error;
@@ -63,7 +63,7 @@ async function runProjectTeamCommand(root, args) {
63
63
  };
64
64
  if (apiUrl) log.info(`Platform: ${apiUrl}`);
65
65
  if (!token) {
66
- log.error(apiUrl ? `Not logged in to ${apiUrl}. Run \`void connect ${apiUrl}\` to sign in.` : "Not logged in. Run `void auth login` first.");
66
+ log.error(apiUrl ? `Not logged in to ${apiUrl}. Run \`void connect ${apiUrl}\` to sign in.` : "Not logged in. Run `void account login` first.");
67
67
  process.exit(1);
68
68
  }
69
69
  const client = new PlatformClient(token, apiUrl ? { apiUrl } : { root });
@@ -9,7 +9,7 @@ async function runRequestsCommand(root, range, status) {
9
9
  intro(cliTitle("project requests"));
10
10
  const token = getToken(root);
11
11
  if (!token) {
12
- log.error("Not logged in. Run `void auth login` first.");
12
+ log.error("Not logged in. Run `void account login` first.");
13
13
  process.exit(1);
14
14
  }
15
15
  if (!/^\d+(m|h|d)$/.test(range)) {
@@ -12,7 +12,7 @@ async function runRollbackCommand(root, deployId) {
12
12
  if (platform === "none") throw new Error("rollback: Deployment is disabled. Run `void init` to choose a platform.");
13
13
  const token = getToken(root);
14
14
  if (!token) {
15
- log.error("Not logged in. Run `void auth login` first.");
15
+ log.error("Not logged in. Run `void account login` first.");
16
16
  process.exit(1);
17
17
  }
18
18
  const linked = readProjectConfig(root);
@@ -15,7 +15,7 @@ async function runSecretCommand(root, args) {
15
15
  if (platform === "none") throw new Error("secret: Deployment is disabled. Run `void init` to choose a platform.");
16
16
  const token = getToken(root);
17
17
  if (!token) {
18
- log.error("Not logged in. Run `void auth login` first.");
18
+ log.error("Not logged in. Run `void account login` first.");
19
19
  process.exit(1);
20
20
  }
21
21
  const client = new PlatformClient(token, { root });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "void",
3
- "version": "0.21.1",
3
+ "version": "0.21.2",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/voidzero-dev/void.git",
@@ -325,11 +325,11 @@
325
325
  "@cloudflare/vite-plugin": "1.54.7",
326
326
  "@cloudflare/workers-types": "^4.20260702.1",
327
327
  "@napi-rs/keyring": "2.0.0",
328
- "@void/deploy-cloudflare": "0.21.1",
329
- "@void/deploy-core": "0.21.1",
330
- "@void/edge": "0.21.1",
331
- "@void/isr": "0.21.1",
332
- "@void/platform": "0.21.1",
328
+ "@void/deploy-cloudflare": "0.21.2",
329
+ "@void/deploy-core": "0.21.2",
330
+ "@void/edge": "0.21.2",
331
+ "@void/isr": "0.21.2",
332
+ "@void/platform": "0.21.2",
333
333
  "acorn": "^8.15.0",
334
334
  "better-auth": "^1.7.3",
335
335
  "better-sqlite3": "^13.0.3",
@@ -379,7 +379,7 @@
379
379
  "zod": "^4.6.1"
380
380
  },
381
381
  "peerDependencies": {
382
- "@void/md": "0.21.1",
382
+ "@void/md": "0.21.2",
383
383
  "arktype": ">=2.0.0",
384
384
  "valibot": ">=1.0.0-beta.7",
385
385
  "vite": "^8.0.0",
@@ -83,7 +83,7 @@ export default defineConfig({
83
83
  7. Deploy workflow migration
84
84
 
85
85
  - Replace old deploy instructions with:
86
- - `void auth login`
86
+ - `void account login`
87
87
  - `void deploy`
88
88
  - If CI must target a specific project, use:
89
89
  - `void deploy --project <slug>`
@@ -59,7 +59,7 @@ dedicated Access applications or connect existing ones, including a separate
59
59
  identity account. Protection setup verifies API/proxy coverage and uses scoped
60
60
  service credentials for installation and CI. Use `platform config auth protection`
61
61
  to show, enable, or disable protection; retain the company gate when probes fail.
62
- Users link another enabled method with `void auth link [connection-id]` after
62
+ Users link another enabled method with `void account link [connection-id]` after
63
63
  recent sign-in and explicit browser identity confirmation. For expired first-admin
64
64
  codes, resume installation or repair completed provisioning. Lost-provider recovery
65
65
  uses `platform config auth recover` with installation ownership, original recovery
@@ -79,6 +79,8 @@ For Void platform project access, use `void project team`: invite only an email
79
79
 
80
80
  Use Void commands for every user-facing workflow. Never ask the user to install, authenticate, or run Wrangler directly. Say Cloudflare or Void instead, except when naming literal `wrangler.jsonc` / `wrangler.json` files or `WRANGLER_*` environment variables the user must inspect.
81
81
 
82
+ `void auth login|status|logout` follows the saved deploy destination or asks the user to choose; `void account` explicitly manages a Void platform account.
83
+
82
84
  Use `void` in examples and commands in this skill. For first-time setup, prefer `void init` followed by `void deploy`; in an empty directory, install `void` first and let `void init` add the matching Pages adapter and starter dependencies with Vite+ as the default scaffold toolchain. In an existing app, `void init` configures Void in place by adding missing Vite scripts and creating or patching `vite.config.*` with `voidPlugin()`. For Cloudflare deployment, Void uses bundled tooling and secure browser OAuth; init or the first deploy saves the selected `account_id`, and `void cloudflare login|status|logout` manages the session; Void-managed deployment requires an explicitly connected platform. Use `void connect <url>` for an existing platform or `void platform install --plan` to preview a company control plane in the user's Cloudflare account. The core self-hosted platform excludes the dashboard, GitHub App, and build Containers; lifecycle commands are resumable and verify remote, Worker, and R2 ownership before mutations. `void platform disable` gates traffic through installation-owned routing storage and remains disabled through repair or upgrade; `void platform enable` explicitly restores traffic. Safe uninstall retains name-addressed Workers, R2, AI Gateway, external PostgreSQL, and zones for explicit manual cleanup. Direct Cloudflare deploys support native Void apps, static/SPA/SSG output, and Cloudflare builds from TanStack Start, React Router, vinext, SvelteKit, Nuxt, Analog, and Astro. They provision inferred resources, validate and apply migrations, require schema-declared server values in encrypted remote secret storage, upload and probe an immutable Worker Version, then activate and synchronize triggers. Native Void features are Workers Free-compatible by default; `void/sandbox` is an explicit exception because it uses Cloudflare Containers and therefore requires Workers Paid. A Sandbox deploy checks Containers access before provisioning/building, while apps without Sandbox perform no entitlement probe. Versions without preview URLs are staged at 0% and probed through workers.dev using a version override; the same safe fallback applies when Access blocks a generated preview alias but admits the stable Worker hostname. Set `CLOUDFLARE_WORKERS_SUBDOMAIN` in a fresh CI checkout, while local deploys cache it automatically. When Cloudflare Access protects `workers.dev`, use an admitted `CF_ACCESS_CLIENT_ID` / `CF_ACCESS_CLIENT_SECRET` service-token pair for CI, or a short-lived `CF_ACCESS_TOKEN` from `cloudflared` for an interactive local readiness probe. With Cloudflare saved in `.void/project.json`, secret, domain, project status/log/rollback, and remote database commands operate directly on the pinned Worker/account. Logs are a live tail. Rollback restores the selected version's saved schedules, queues, workflows, routes, and domains but never reverses database migrations; versions without complete trigger snapshots use code-only rollback and keep the current routes and schedules. On either deployment platform, auth-enabled `void deploy` preserves an existing `BETTER_AUTH_SECRET` or creates a persistent encrypted secret when missing; always use Void's deployment flow so it can manage that secret safely.
83
85
 
84
86
  Use `void` and `@void/*` in code examples and package manifests.
@@ -110,7 +112,7 @@ If invoked without a concrete task, do a brief app status check and report:
110
112
  3. Runtime signals (`void/db`, `void/kv`, `void/storage`, queue usage).
111
113
  4. Auth signals (`void/auth`, `auth` client imports, OAuth env vars).
112
114
  5. Deployment platform and optional Void project linkage (`.void/project.json`), plus config readiness (`void.config.ts`, Cloudflare `account_id`, tsconfig extends).
113
- 6. Optional health checks (`void auth whoami`, `void db status` when relevant).
115
+ 6. Optional health checks (`void account whoami`, `void db status` when relevant).
114
116
 
115
117
  Then ask what to do next.
116
118
 
@@ -107,7 +107,7 @@ Cloudflare applications for deliberate cleanup. Disabling an Access login method
107
107
  does not remove the gate.
108
108
 
109
109
  Users can add another enabled login to their existing account with
110
- `void auth link <connection-id>` or **Account** in the optional
110
+ `void account link <connection-id>` or **Account** in the optional
111
111
  dashboard. Sign in again first if prompted, then authenticate with the additional
112
112
  provider and confirm the identity shown. Matching email addresses alone do not
113
113
  link accounts.
@@ -77,7 +77,7 @@ and run `void project link`.
77
77
 
78
78
  If the invitation is missing, check the platform and signed-in account. To
79
79
  switch accounts, set `VOID_API_URL` to the invitation's platform URL, unset
80
- `VOID_TOKEN` if present, then run `void auth logout` and `void auth login` using
80
+ `VOID_TOKEN` if present, then run `void account logout` and `void account login` using
81
81
  the invited email address. For an expired or revoked invitation, ask a project
82
82
  administrator to invite you again.
83
83