void 0.9.3 → 0.10.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 (104) hide show
  1. package/dist/{auth-cmd-CPkWrQR9.mjs → auth-cmd-DLvXvN-0.mjs} +2 -2
  2. package/dist/{better-auth-shared-CmEQZs1T.d.mts → better-auth-shared-a7H3wk9J.d.mts} +2 -2
  3. package/dist/{cache-1SVxZ7BK.mjs → cache-CHFZmqa5.mjs} +1 -1
  4. package/dist/{cancel-deploy-JaFClLr7.mjs → cancel-deploy-BwpT4U4a.mjs} +1 -1
  5. package/dist/cli/cli.mjs +273 -36
  6. package/dist/{client-DIfOFf1W.mjs → client-CTHvucDv.mjs} +166 -45
  7. package/dist/{create-project-DCUrFJxa.mjs → create-project-CruTH_TQ.mjs} +1 -1
  8. package/dist/{db-UW4IYQFw.mjs → db-BxnfKs7f.mjs} +14 -14
  9. package/dist/{delete-CYknzwXU.mjs → delete-IQe1O4Re.mjs} +1 -1
  10. package/dist/{deploy-RQXpVBL-.mjs → deploy-CuxXxVgz.mjs} +195 -89
  11. package/dist/{domain-B7RntQ1r.mjs → domain-Bq6kzr_T.mjs} +1 -1
  12. package/dist/{env-C_ZcxxED.mjs → env-BD3U_0Av.mjs} +1 -1
  13. package/dist/{env-helpers-Bd2wVdxz.d.mts → env-helpers-ZatKyjen.d.mts} +1 -1
  14. package/dist/{gen-O5mXZ76K.mjs → gen-Dgi4D7GC.mjs} +1 -1
  15. package/dist/git-metadata-Ce0AtSZL.mjs +82 -0
  16. package/dist/github-cmd-CD0Z8KCF.mjs +441 -0
  17. package/dist/{handler-hm9KldPP.d.mts → handler-DczZlaXR.d.mts} +3 -3
  18. package/dist/index.d.mts +3 -3
  19. package/dist/index.mjs +18 -18
  20. package/dist/{init-DGrLx2ls.mjs → init-CTe46nIr.mjs} +113 -77
  21. package/dist/{link-7MoXUMaI.mjs → link-BGFW4pHD.mjs} +2 -2
  22. package/dist/{list-N2mCHv8q.mjs → list-CbGxdbe7.mjs} +1 -1
  23. package/dist/{login-tt1OmNVg.mjs → login-v4wle1vn.mjs} +1 -1
  24. package/dist/{logs-Cl7q2CjZ.mjs → logs-BFgY5Vqc.mjs} +1 -1
  25. package/dist/{mcp-BXD35N2J.mjs → mcp-STKL-uWs.mjs} +1 -1
  26. package/dist/{node-Df8UjQ2H.mjs → node-B07cZs0d.mjs} +3 -3
  27. package/dist/pages/client.d.mts +1 -1
  28. package/dist/pages/client.mjs +1 -0
  29. package/dist/pages/head-client.d.mts +1 -1
  30. package/dist/pages/head.d.mts +1 -1
  31. package/dist/pages/index.d.mts +2 -2
  32. package/dist/pages/index.mjs +1 -1
  33. package/dist/pages/islands-plugin.d.mts +1 -1
  34. package/dist/pages/protocol.d.mts +2 -2
  35. package/dist/pages/protocol.mjs +1 -1
  36. package/dist/{plugin-inference--7geW5Z2.mjs → plugin-inference-C3fLzFvP.mjs} +2 -0
  37. package/dist/{prepare-DT-7QII_.mjs → prepare-DH2WnEpD.mjs} +3 -3
  38. package/dist/{preset-2aBxMfY1.mjs → preset-B7ZQZn0u.mjs} +2 -2
  39. package/dist/{project-cmd-CLrqSbqj.mjs → project-cmd-DZh-vbEL.mjs} +8 -8
  40. package/dist/{protocol-B9GZA4Bn.d.mts → protocol-63PHtCHS.d.mts} +3 -3
  41. package/dist/{rollback-CEbAwbHK.mjs → rollback-o0M0Qo_n.mjs} +1 -1
  42. package/dist/{runner-DLZ9E_cX.mjs → runner-BQyKUqAL.mjs} +1 -1
  43. package/dist/runtime/ai.mjs +1 -1
  44. package/dist/runtime/auth.d.mts +1 -1
  45. package/dist/runtime/better-auth-pg.d.mts +1 -1
  46. package/dist/runtime/better-auth-pg.mjs +3 -3
  47. package/dist/runtime/better-auth.d.mts +1 -1
  48. package/dist/runtime/better-auth.mjs +2 -2
  49. package/dist/runtime/client-react.d.mts +2 -2
  50. package/dist/runtime/client-react.mjs +1 -1
  51. package/dist/runtime/client-solid.d.mts +2 -2
  52. package/dist/runtime/client-solid.mjs +1 -1
  53. package/dist/runtime/client-svelte.d.mts +2 -2
  54. package/dist/runtime/client-svelte.mjs +1 -1
  55. package/dist/runtime/client-vue.d.mts +2 -2
  56. package/dist/runtime/client-vue.mjs +1 -1
  57. package/dist/runtime/client.d.mts +2 -2
  58. package/dist/runtime/client.mjs +1 -1
  59. package/dist/runtime/env-helpers.d.mts +1 -1
  60. package/dist/runtime/env-public-client.d.mts +1 -1
  61. package/dist/runtime/env-public.d.mts +2 -2
  62. package/dist/runtime/env-public.mjs +1 -1
  63. package/dist/runtime/env.mjs +1 -1
  64. package/dist/runtime/fetch-stream.d.mts +1 -1
  65. package/dist/runtime/fetch-stream.mjs +1 -1
  66. package/dist/runtime/fetch.d.mts +1 -1
  67. package/dist/runtime/fetch.mjs +1 -1
  68. package/dist/runtime/handler.d.mts +1 -1
  69. package/dist/runtime/handler.mjs +1 -1
  70. package/dist/runtime/isr.mjs +1 -1
  71. package/dist/runtime/live.d.mts +2 -2
  72. package/dist/runtime/live.mjs +1 -1
  73. package/dist/runtime/migration-handler-pg.mjs +1 -1
  74. package/dist/runtime/sandbox.mjs +1 -1
  75. package/dist/runtime/validator.d.mts +1 -1
  76. package/dist/runtime/ws-server.d.mts +2 -2
  77. package/dist/runtime/ws.d.mts +3 -3
  78. package/dist/{scan-B2H1Vo2C.mjs → scan-DGEp1-1Q.mjs} +17 -9
  79. package/dist/{secret-C_uTY7xx.mjs → secret-gs_yyGZL.mjs} +1 -1
  80. package/package.json +2 -2
  81. package/schema.json +3 -3
  82. package/skills/void/docs/guide/deployment.md +26 -11
  83. package/skills/void/docs/guide/edge/headers.md +10 -3
  84. package/skills/void/docs/guide/edge/rewrites.md +5 -5
  85. package/skills/void/docs/reference/cli.md +89 -2
  86. /package/dist/{auth-migrations-CuQkjjWE.mjs → auth-migrations-BP-hMzYl.mjs} +0 -0
  87. /package/dist/{auth-CDeb2XAl.d.mts → auth-nEUVHuFI.d.mts} +0 -0
  88. /package/dist/{better-auth-shared-QAfk8CAS.mjs → better-auth-shared-D0Mbmx5V.mjs} +0 -0
  89. /package/dist/{defer-CouVukrf.mjs → defer-C-bdSM_b.mjs} +0 -0
  90. /package/dist/{drizzle-DYstYz0j.mjs → drizzle-DqstQTGq.mjs} +0 -0
  91. /package/dist/{env-raw-RDkMnSTC.mjs → env-raw-Dtj1UAoK.mjs} +0 -0
  92. /package/dist/{fetch-error-CimrygMq.d.mts → fetch-error-BQMdPvge.d.mts} +0 -0
  93. /package/dist/{fetch-error-BFIoojjf.mjs → fetch-error-C6qffTl2.mjs} +0 -0
  94. /package/dist/{head-BsSTGnIe.d.mts → head-JAH2l3fg.d.mts} +0 -0
  95. /package/dist/{headers-VkAnACKX.mjs → headers-BNWymgnH.mjs} +0 -0
  96. /package/dist/{package-json-B2TD0JLu.mjs → package-json-Bg_GJdJB.mjs} +0 -0
  97. /package/dist/{pg-CMZ_5wsC.mjs → pg-CempqvEJ.mjs} +0 -0
  98. /package/dist/{providers-3Kkv63Ha.d.mts → providers-BkiAlEad.d.mts} +0 -0
  99. /package/dist/{runner-pg-Cv9V7ydr.mjs → runner-pg-BAheiT6v.mjs} +0 -0
  100. /package/dist/{skills-BRKc--As.mjs → skills--OMgLmXW.mjs} +0 -0
  101. /package/dist/{standard-schema-Dnsh2vnl.d.mts → standard-schema-BCBv-QaP.d.mts} +0 -0
  102. /package/dist/{subcommand-prompt-OD-x_Tsm.mjs → subcommand-prompt-ClwpLlKD.mjs} +0 -0
  103. /package/dist/{types-DEWCqHtl.d.mts → types-BnHMXezo.d.mts} +0 -0
  104. /package/dist/{yarn-pnp-0SwYgQxx.mjs → yarn-pnp-DhCHHLAz.mjs} +0 -0
@@ -1,6 +1,6 @@
1
- import { c as getToken, d as removeToken, n as PlatformClient } from "./client-DIfOFf1W.mjs";
1
+ import { f as getToken, g as removeToken, n as PlatformClient } from "./client-CTHvucDv.mjs";
2
2
  import { c as R } from "./dist-abzUneor.mjs";
3
- import { n as runLoginCommand } from "./login-tt1OmNVg.mjs";
3
+ import { n as runLoginCommand } from "./login-v4wle1vn.mjs";
4
4
  import { execSync } from "node:child_process";
5
5
  //#region src/cli/auth-cmd.ts
6
6
  async function runAuthCommand(root, args) {
@@ -1,5 +1,5 @@
1
- import { i as VoidAuthConfig, n as AuthState } from "./auth-CDeb2XAl.mjs";
2
- import { t as VoidAuthProvider } from "./providers-3Kkv63Ha.mjs";
1
+ import { i as VoidAuthConfig, n as AuthState } from "./auth-nEUVHuFI.mjs";
2
+ import { t as VoidAuthProvider } from "./providers-BkiAlEad.mjs";
3
3
  import { DBFieldAttribute } from "better-auth/db";
4
4
  import { BetterAuthOptions, betterAuth } from "better-auth";
5
5
  import { Context } from "hono";
@@ -1,5 +1,5 @@
1
1
  import { i as dim, n as cliTitle, r as createSpinner } from "./output-DeiS4oEX.mjs";
2
- import { c as getToken, n as PlatformClient } from "./client-DIfOFf1W.mjs";
2
+ import { f as getToken, n as PlatformClient } from "./client-CTHvucDv.mjs";
3
3
  import { c as R, g as ge, y as ye } from "./dist-abzUneor.mjs";
4
4
  import { r as readProjectConfig } from "./project-CH9pdo16.mjs";
5
5
  import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-D4O1_fZz.mjs";
@@ -1,5 +1,5 @@
1
1
  import { n as cliTitle } from "./output-DeiS4oEX.mjs";
2
- import { c as getToken, n as PlatformClient } from "./client-DIfOFf1W.mjs";
2
+ import { f as getToken, n as PlatformClient } from "./client-CTHvucDv.mjs";
3
3
  import { c as R, g as ge, v as ue, x as q, y as ye } from "./dist-abzUneor.mjs";
4
4
  import { r as readProjectConfig } from "./project-CH9pdo16.mjs";
5
5
  //#region src/cli/cancel-deploy.ts
package/dist/cli/cli.mjs CHANGED
@@ -282,6 +282,7 @@ function parseDomainArgs(args) {
282
282
  const rest = args.slice(1);
283
283
  for (let i = 0; i < rest.length; i++) if (rest[i] === "--project" && rest[i + 1]) projectSlug = rest[++i];
284
284
  else if (rest[i] === "--verbose") verbose = true;
285
+ else if (rest[i].startsWith("-")) throw new Error(`domain: Unknown flag '${rest[i]}'.`);
285
286
  else if (!hostname) hostname = rest[i];
286
287
  if ((subcommand === "add" || subcommand === "delete" || subcommand === "status") && !hostname) throw new Error(`domain: Usage: void domain ${subcommand} <hostname> [--project <name>].`);
287
288
  return {
@@ -452,10 +453,12 @@ const VALID_METHODS = new Set([
452
453
  "patch",
453
454
  "delete"
454
455
  ]);
456
+ const NAME_RE = /^[a-z_][a-z0-9_]*$/;
457
+ const NAME_WITH_HYPHENS_RE = /^[a-z_][a-z0-9_-]*$/;
455
458
  function parseModelArgs(args) {
456
459
  const [name, ...rest] = args;
457
460
  if (!name) throw new Error("gen: Usage: void gen model <name> [columns...].");
458
- if (!/^[a-z_][a-z0-9_]*$/.test(name)) throw new Error("gen: Model name must be lowercase alphanumeric with underscores and no leading digits.");
461
+ if (!NAME_RE.test(name)) throw new Error("gen: Model name must be lowercase alphanumeric with underscores and no leading digits.");
459
462
  const columns = [];
460
463
  for (const col of rest) {
461
464
  const match = col.match(/^([a-z_][a-z0-9_]*):([a-z]+)(\?)?$/);
@@ -478,7 +481,7 @@ function parseMigrationArgs(args) {
478
481
  const [name, extra] = args;
479
482
  if (!name) throw new Error("gen: Usage: void gen migration <name>.");
480
483
  if (extra) throw new Error(`gen: Unexpected argument '${extra}'.`);
481
- if (!/^[a-z_][a-z0-9_]*$/.test(name)) throw new Error("gen: Migration name must be lowercase alphanumeric with underscores and no leading digits.");
484
+ if (!NAME_RE.test(name)) throw new Error("gen: Migration name must be lowercase alphanumeric with underscores and no leading digits.");
482
485
  return {
483
486
  subcommand: "migration",
484
487
  name
@@ -509,6 +512,7 @@ function parseMiddlewareArgs(args) {
509
512
  const [name, extra] = args;
510
513
  if (!name) throw new Error("gen: Usage: void gen middleware <name>.");
511
514
  if (extra) throw new Error(`gen: Unexpected argument '${extra}'.`);
515
+ if (!NAME_WITH_HYPHENS_RE.test(name)) throw new Error("gen: Middleware name must be lowercase alphanumeric with underscores or hyphens and no leading digits.");
512
516
  return {
513
517
  subcommand: "middleware",
514
518
  name
@@ -543,7 +547,7 @@ function parseCronArgs(args) {
543
547
  const [name, extra] = args;
544
548
  if (!name) throw new Error("gen: Usage: void gen cron <name>.");
545
549
  if (extra) throw new Error(`gen: Unexpected argument '${extra}'.`);
546
- if (!/^[a-z_][a-z0-9_-]*$/.test(name)) throw new Error("gen: Cron name must be lowercase alphanumeric with underscores or hyphens and no leading digits.");
550
+ if (!NAME_WITH_HYPHENS_RE.test(name)) throw new Error("gen: Cron name must be lowercase alphanumeric with underscores or hyphens and no leading digits.");
547
551
  return {
548
552
  subcommand: "cron",
549
553
  name
@@ -553,7 +557,7 @@ function parseQueueArgs(args) {
553
557
  const [name, extra] = args;
554
558
  if (!name) throw new Error("gen: Usage: void gen queue <name>.");
555
559
  if (extra) throw new Error(`gen: Unexpected argument '${extra}'.`);
556
- if (!/^[a-z_][a-z0-9_-]*$/.test(name)) throw new Error("gen: Queue name must be lowercase alphanumeric with underscores or hyphens and no leading digits.");
560
+ if (!NAME_WITH_HYPHENS_RE.test(name)) throw new Error("gen: Queue name must be lowercase alphanumeric with underscores or hyphens and no leading digits.");
557
561
  return {
558
562
  subcommand: "queue",
559
563
  name
@@ -571,6 +575,130 @@ function parseGenArgs(args) {
571
575
  throw new Error("gen: Usage: void gen <model|migration|route|middleware|ssr|cron|queue>.");
572
576
  }
573
577
  //#endregion
578
+ //#region src/cli/github-args.ts
579
+ const githubSubcommands = [
580
+ {
581
+ name: "install",
582
+ description: "Open the GitHub App install page in your browser"
583
+ },
584
+ {
585
+ name: "installations",
586
+ description: "List your GitHub App installations"
587
+ },
588
+ {
589
+ name: "connect",
590
+ arg: "[project]",
591
+ description: "Connect a repository to a project for auto-deploy"
592
+ },
593
+ {
594
+ name: "update",
595
+ arg: "[project]",
596
+ description: "Update an existing connection's branch or build executor"
597
+ },
598
+ {
599
+ name: "link",
600
+ description: "Link your GitHub account to Void"
601
+ }
602
+ ];
603
+ function parseGithubArgs(args) {
604
+ const [subcommand, ...rest] = args;
605
+ if (subcommand === "install") {
606
+ if (rest.length > 0) throw new Error(`github: Unexpected argument '${rest[0]}'.`);
607
+ return { subcommand };
608
+ }
609
+ if (subcommand === "installations") {
610
+ if (rest.length > 0) throw new Error(`github: Unexpected argument '${rest[0]}'.`);
611
+ return { subcommand };
612
+ }
613
+ if (subcommand === "link") {
614
+ if (rest.length > 0) throw new Error(`github: Unexpected argument '${rest[0]}'.`);
615
+ return { subcommand };
616
+ }
617
+ if (subcommand === "connect") {
618
+ let projectName = "";
619
+ let installationId;
620
+ let repo;
621
+ let branch;
622
+ let executor;
623
+ for (let i = 0; i < rest.length; i++) {
624
+ const arg = rest[i];
625
+ if (arg === "--installation") {
626
+ if (i + 1 >= rest.length) throw new Error("github: --installation requires a value.");
627
+ const value = rest[++i];
628
+ if (value.trim() === "") throw new Error("github: --installation requires a value.");
629
+ installationId = value;
630
+ } else if (arg === "--repo") {
631
+ if (i + 1 >= rest.length) throw new Error("github: --repo requires a value.");
632
+ const value = rest[++i];
633
+ if (value.trim() === "") throw new Error("github: --repo requires a value.");
634
+ repo = value;
635
+ } else if (arg === "--branch") {
636
+ if (i + 1 >= rest.length) throw new Error("github: --branch requires a value.");
637
+ const value = rest[++i];
638
+ if (value.trim() === "") throw new Error("github: --branch requires a value.");
639
+ branch = value;
640
+ } else if (arg === "--project") {
641
+ if (i + 1 >= rest.length) throw new Error("github: --project requires a value.");
642
+ const value = rest[++i];
643
+ if (value.trim() === "") throw new Error("github: --project requires a value.");
644
+ if (projectName) throw new Error(`github: Unexpected argument '${value}'.`);
645
+ projectName = value;
646
+ } else if (arg === "--executor") {
647
+ if (i + 1 >= rest.length) throw new Error("github: --executor requires a value.");
648
+ const value = rest[++i];
649
+ if (value.trim() === "") throw new Error("github: --executor requires a value.");
650
+ if (value !== "container" && value !== "github_actions") throw new Error("github: invalid --executor (expected container|github_actions).");
651
+ executor = value;
652
+ } else if (arg.startsWith("-")) throw new Error(`github: Unexpected argument '${arg}'.`);
653
+ else if (projectName) throw new Error(`github: Unexpected argument '${arg}'.`);
654
+ else projectName = arg;
655
+ }
656
+ return {
657
+ subcommand,
658
+ projectName,
659
+ installationId,
660
+ repo,
661
+ branch,
662
+ executor
663
+ };
664
+ }
665
+ if (subcommand === "update") {
666
+ let projectName = "";
667
+ let branch;
668
+ let executor;
669
+ for (let i = 0; i < rest.length; i++) {
670
+ const arg = rest[i];
671
+ if (arg === "--branch") {
672
+ if (i + 1 >= rest.length) throw new Error("github: --branch requires a value.");
673
+ const value = rest[++i];
674
+ if (value.trim() === "") throw new Error("github: --branch requires a value.");
675
+ branch = value.trim();
676
+ } else if (arg === "--project") {
677
+ if (i + 1 >= rest.length) throw new Error("github: --project requires a value.");
678
+ const value = rest[++i];
679
+ if (value.trim() === "") throw new Error("github: --project requires a value.");
680
+ if (projectName) throw new Error(`github: Unexpected argument '${value}'.`);
681
+ projectName = value;
682
+ } else if (arg === "--executor") {
683
+ if (i + 1 >= rest.length) throw new Error("github: --executor requires a value.");
684
+ const value = rest[++i];
685
+ if (value.trim() === "") throw new Error("github: --executor requires a value.");
686
+ if (value !== "container" && value !== "github_actions") throw new Error("github: invalid --executor (expected container|github_actions).");
687
+ executor = value;
688
+ } else if (arg.startsWith("-")) throw new Error(`github: Unexpected argument '${arg}'.`);
689
+ else if (projectName) throw new Error(`github: Unexpected argument '${arg}'.`);
690
+ else projectName = arg;
691
+ }
692
+ return {
693
+ subcommand,
694
+ projectName,
695
+ branch,
696
+ executor
697
+ };
698
+ }
699
+ throw new Error("github: Usage: void github <install|installations|connect|update|link>.");
700
+ }
701
+ //#endregion
574
702
  //#region src/cli/ascii.ts
575
703
  const asciiArts = [
576
704
  `
@@ -609,16 +737,23 @@ const HELP_TREE = {
609
737
  },
610
738
  {
611
739
  command: "--github",
612
- description: "Only create GitHub Actions workflow"
740
+ description: "Only create the GitHub Actions deploy workflow (OIDC, no stored token)"
613
741
  }
614
742
  ],
615
- examples: [{
616
- command: "void init",
617
- description: "Scaffold or configure the current project"
618
- }, {
619
- command: "void init --agents",
620
- description: "Install agent instructions and MCP config"
621
- }]
743
+ examples: [
744
+ {
745
+ command: "void init",
746
+ description: "Scaffold or configure the current project"
747
+ },
748
+ {
749
+ command: "void init --agents",
750
+ description: "Install agent instructions and MCP config"
751
+ },
752
+ {
753
+ command: "void init --github",
754
+ description: "Scaffold the GitHub Actions deploy workflow"
755
+ }
756
+ ]
622
757
  },
623
758
  deploy: {
624
759
  summary: "Build and deploy the current project to Void.",
@@ -855,6 +990,95 @@ const HELP_TREE = {
855
990
  }
856
991
  }
857
992
  },
993
+ github: {
994
+ summary: "Connect a GitHub repository for automatic deploys.",
995
+ usage: ["void github <command>"],
996
+ commands: [
997
+ {
998
+ command: "install",
999
+ description: "Open the GitHub App install page in your browser"
1000
+ },
1001
+ {
1002
+ command: "installations",
1003
+ description: "List your GitHub App installations"
1004
+ },
1005
+ {
1006
+ command: "connect [project]",
1007
+ description: "Connect a repository to a project for auto-deploy"
1008
+ },
1009
+ {
1010
+ command: "update [project]",
1011
+ description: "Update an existing connection's branch or build executor"
1012
+ },
1013
+ {
1014
+ command: "link",
1015
+ description: "Link your GitHub account to Void"
1016
+ }
1017
+ ],
1018
+ children: {
1019
+ install: basicSubcommand("Open the GitHub App install page in your browser.", "void github install"),
1020
+ installations: basicSubcommand("List your GitHub App installations.", "void github installations"),
1021
+ link: basicSubcommand("Link your GitHub account to Void.", "void github link"),
1022
+ connect: {
1023
+ summary: "Connect a repository to a project for automatic deploys.",
1024
+ usage: ["void github connect [project] [options]"],
1025
+ options: [
1026
+ {
1027
+ command: "--project <name>",
1028
+ description: "Project name (alias for positional)"
1029
+ },
1030
+ {
1031
+ command: "--installation <id>",
1032
+ description: "GitHub App installation ID"
1033
+ },
1034
+ {
1035
+ command: "--repo <owner/repo>",
1036
+ description: "Repository full name (owner/repo)"
1037
+ },
1038
+ {
1039
+ command: "--branch <name>",
1040
+ description: "Branch to deploy from (required in non-interactive mode)"
1041
+ },
1042
+ {
1043
+ command: "--executor <type>",
1044
+ description: "Build executor: container (default) | github_actions"
1045
+ }
1046
+ ],
1047
+ examples: [{
1048
+ command: "void github connect [project]",
1049
+ description: "Connect a repository to a project"
1050
+ }, {
1051
+ command: "void github connect my-app --installation 42 --repo owner/repo --branch main",
1052
+ description: "Non-interactive connect (all flags explicit)"
1053
+ }]
1054
+ },
1055
+ update: {
1056
+ summary: "Update an existing connection's branch or build executor.",
1057
+ usage: ["void github update [project] [options]"],
1058
+ options: [
1059
+ {
1060
+ command: "--project <name>",
1061
+ description: "Project name (alias for positional)"
1062
+ },
1063
+ {
1064
+ command: "--branch <name>",
1065
+ description: "New branch to deploy from"
1066
+ },
1067
+ {
1068
+ command: "--executor <type>",
1069
+ description: "New build executor: container | github_actions"
1070
+ }
1071
+ ],
1072
+ examples: [{
1073
+ command: "void github update my-app --executor github_actions",
1074
+ description: "Switch an existing connection to the GitHub Actions executor"
1075
+ }, {
1076
+ command: "void github update my-app --branch release",
1077
+ description: "Change the deploy branch"
1078
+ }]
1079
+ }
1080
+ }
1081
+ },
858
1082
  db: {
859
1083
  summary: "Manage local and remote database state.",
860
1084
  usage: ["void db <command>"],
@@ -1161,6 +1385,8 @@ function printGlobalHelp() {
1161
1385
  "",
1162
1386
  ...globalCommandGroup("domain"),
1163
1387
  "",
1388
+ ...globalCommandGroup("github"),
1389
+ "",
1164
1390
  categoryTitle("database"),
1165
1391
  ...globalCommandLines("db", {
1166
1392
  execute: "execute <sql>",
@@ -1344,6 +1570,7 @@ function parseProjectArgs(args) {
1344
1570
  const [subcommand, ...rest] = args;
1345
1571
  if (subcommand === "status") {
1346
1572
  const [name, extra] = rest;
1573
+ if (name?.startsWith("-")) throw new Error(`project: Unknown flag '${name}'.`);
1347
1574
  if (extra) throw new Error(`project: Unexpected argument '${extra}'.`);
1348
1575
  return {
1349
1576
  subcommand,
@@ -1352,6 +1579,7 @@ function parseProjectArgs(args) {
1352
1579
  }
1353
1580
  if (subcommand === "link") {
1354
1581
  const [name, extra] = rest;
1582
+ if (name?.startsWith("-")) throw new Error(`project: Unknown flag '${name}'.`);
1355
1583
  if (extra) throw new Error(`project: Unexpected argument '${extra}'.`);
1356
1584
  return {
1357
1585
  subcommand,
@@ -1385,6 +1613,7 @@ function parseProjectArgs(args) {
1385
1613
  }
1386
1614
  if (subcommand === "rollback") {
1387
1615
  const [deployId, extra] = rest;
1616
+ if (deployId?.startsWith("-")) throw new Error(`project: Unknown flag '${deployId}'.`);
1388
1617
  if (extra) throw new Error(`project: Unexpected argument '${extra}'.`);
1389
1618
  return {
1390
1619
  subcommand,
@@ -1393,6 +1622,7 @@ function parseProjectArgs(args) {
1393
1622
  }
1394
1623
  if (subcommand === "cancel") {
1395
1624
  const [deployId, extra] = rest;
1625
+ if (deployId?.startsWith("-")) throw new Error(`project: Unknown flag '${deployId}'.`);
1396
1626
  if (extra) throw new Error(`project: Unexpected argument '${extra}'.`);
1397
1627
  return {
1398
1628
  subcommand,
@@ -1524,7 +1754,7 @@ async function runSubcommandGroup(command, subcommands, parse, run) {
1524
1754
  const sub = args[1];
1525
1755
  try {
1526
1756
  if ((!sub || sub.startsWith("-")) && process.stdin.isTTY) {
1527
- const { promptSubcommand } = await import("../subcommand-prompt-OD-x_Tsm.mjs");
1757
+ const { promptSubcommand } = await import("../subcommand-prompt-ClwpLlKD.mjs");
1528
1758
  const result = await promptSubcommand(command, subcommands);
1529
1759
  if (!result) process.exit(0);
1530
1760
  await run(root, parse(buildArgs(result, args.slice(1))));
@@ -1553,7 +1783,7 @@ else if (command === "deploy") {
1553
1783
  R.error(err instanceof Error ? err.message : String(err));
1554
1784
  process.exit(1);
1555
1785
  }
1556
- import("../deploy-RQXpVBL-.mjs").then((n) => n.t).then(({ runDeploy }) => {
1786
+ import("../deploy-CuxXxVgz.mjs").then((n) => n.t).then(({ runDeploy }) => {
1557
1787
  runDeploy(root, {
1558
1788
  projectSlug: deployArgs.projectSlug,
1559
1789
  dir: deployArgs.dir,
@@ -1565,13 +1795,14 @@ else if (command === "deploy") {
1565
1795
  process.exit(1);
1566
1796
  });
1567
1797
  });
1568
- } else if (command === "auth") runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (root, parsed) => import("../auth-cmd-CPkWrQR9.mjs").then(({ runAuthCommand }) => runAuthCommand(root, parsed)));
1569
- else if (command === "project") runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (root, parsed) => import("../project-cmd-CLrqSbqj.mjs").then(({ runProjectCommand }) => runProjectCommand(root, parsed)));
1570
- else if (command === "secret") runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (root, parsed) => import("../secret-C_uTY7xx.mjs").then(({ runSecretCommand }) => runSecretCommand(root, parsed)));
1571
- else if (command === "domain") runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (root, parsed) => import("../domain-B7RntQ1r.mjs").then(({ runDomainCommand }) => runDomainCommand(root, parsed)));
1572
- else if (command === "db") runSubcommandGroup("db", dbSubcommands, parseDbArgs, (root, parsed) => import("../db-UW4IYQFw.mjs").then(({ runDbCommand }) => runDbCommand(root, parsed)));
1573
- else if (command === "env") runSubcommandGroup("env", envSubcommands, parseEnvArgs, (root, parsed) => import("../env-C_ZcxxED.mjs").then(({ runEnvCommand }) => runEnvCommand(root, parsed)));
1574
- else if (command === "gen") runSubcommandGroup("gen", genSubcommands, parseGenArgs, (root, parsed) => import("../gen-O5mXZ76K.mjs").then(({ runGenCommand }) => runGenCommand(root, parsed)));
1798
+ } else if (command === "auth") runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (root, parsed) => import("../auth-cmd-DLvXvN-0.mjs").then(({ runAuthCommand }) => runAuthCommand(root, parsed)));
1799
+ else if (command === "project") runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (root, parsed) => import("../project-cmd-DZh-vbEL.mjs").then(({ runProjectCommand }) => runProjectCommand(root, parsed)));
1800
+ else if (command === "secret") runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (root, parsed) => import("../secret-gs_yyGZL.mjs").then(({ runSecretCommand }) => runSecretCommand(root, parsed)));
1801
+ else if (command === "domain") runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (root, parsed) => import("../domain-Bq6kzr_T.mjs").then(({ runDomainCommand }) => runDomainCommand(root, parsed)));
1802
+ else if (command === "db") runSubcommandGroup("db", dbSubcommands, parseDbArgs, (root, parsed) => import("../db-BxnfKs7f.mjs").then(({ runDbCommand }) => runDbCommand(root, parsed)));
1803
+ else if (command === "env") runSubcommandGroup("env", envSubcommands, parseEnvArgs, (root, parsed) => import("../env-BD3U_0Av.mjs").then(({ runEnvCommand }) => runEnvCommand(root, parsed)));
1804
+ else if (command === "gen") runSubcommandGroup("gen", genSubcommands, parseGenArgs, (root, parsed) => import("../gen-Dgi4D7GC.mjs").then(({ runGenCommand }) => runGenCommand(root, parsed)));
1805
+ else if (command === "github") runSubcommandGroup("github", githubSubcommands, parseGithubArgs, (root, parsed) => import("../github-cmd-CD0Z8KCF.mjs").then(({ runGithubCommand }) => runGithubCommand(root, parsed)));
1575
1806
  else if (command === "prepare") {
1576
1807
  const root = process.cwd();
1577
1808
  let prepareArgs;
@@ -1581,7 +1812,7 @@ else if (command === "prepare") {
1581
1812
  R.error(err instanceof Error ? err.message : String(err));
1582
1813
  process.exit(1);
1583
1814
  }
1584
- import("../prepare-DT-7QII_.mjs").then(({ runPrepareCommand }) => {
1815
+ import("../prepare-DH2WnEpD.mjs").then(({ runPrepareCommand }) => {
1585
1816
  runPrepareCommand(root, prepareArgs).catch((err) => {
1586
1817
  R.error(err.message ?? err);
1587
1818
  process.exit(1);
@@ -1589,7 +1820,7 @@ else if (command === "prepare") {
1589
1820
  });
1590
1821
  } else if (command === "init") {
1591
1822
  const root = process.cwd();
1592
- import("../init-DGrLx2ls.mjs").then(({ runInitCommand, parseInitArgs }) => {
1823
+ import("../init-CTe46nIr.mjs").then(({ runInitCommand, parseInitArgs }) => {
1593
1824
  let initArgs;
1594
1825
  try {
1595
1826
  initArgs = parseInitArgs(args.slice(1));
@@ -1602,7 +1833,7 @@ else if (command === "prepare") {
1602
1833
  process.exit(1);
1603
1834
  });
1604
1835
  });
1605
- } else if (command === "mcp") import("../mcp-BXD35N2J.mjs").then(({ runMcp }) => {
1836
+ } else if (command === "mcp") import("../mcp-STKL-uWs.mjs").then(({ runMcp }) => {
1606
1837
  runMcp();
1607
1838
  });
1608
1839
  else if (command === "-v" || command === "--version") {
@@ -1641,6 +1872,11 @@ else if (command === "-v" || command === "--version") {
1641
1872
  hint: "add | delete | list | status",
1642
1873
  description: "Configure custom domains"
1643
1874
  },
1875
+ {
1876
+ name: "github",
1877
+ hint: "install | installations | connect | update | link",
1878
+ description: "Connect a GitHub repository for automatic deploys"
1879
+ },
1644
1880
  {
1645
1881
  name: "db",
1646
1882
  hint: "status | reset | seed | execute | migrate | studio | export | rename-migrations",
@@ -1671,36 +1907,37 @@ else if (command === "-v" || command === "--version") {
1671
1907
  ];
1672
1908
  (async () => {
1673
1909
  printVoidHeader();
1674
- const { promptSubcommand } = await import("../subcommand-prompt-OD-x_Tsm.mjs");
1910
+ const { promptSubcommand } = await import("../subcommand-prompt-ClwpLlKD.mjs");
1675
1911
  const result = await promptSubcommand("", topLevelCommands);
1676
1912
  if (!result) process.exit(0);
1677
1913
  const cmd = result.subcommand;
1678
1914
  const root = process.cwd();
1679
1915
  switch (cmd) {
1680
1916
  case "init": {
1681
- const { runInitCommand, parseInitArgs } = await import("../init-DGrLx2ls.mjs");
1917
+ const { runInitCommand, parseInitArgs } = await import("../init-CTe46nIr.mjs");
1682
1918
  await runInitCommand(root, parseInitArgs([]));
1683
1919
  return;
1684
1920
  }
1685
1921
  case "deploy": {
1686
- const { runDeploy } = await import("../deploy-RQXpVBL-.mjs").then((n) => n.t);
1922
+ const { runDeploy } = await import("../deploy-CuxXxVgz.mjs").then((n) => n.t);
1687
1923
  await runDeploy(root);
1688
1924
  return;
1689
1925
  }
1690
1926
  case "mcp": {
1691
- const { runMcp } = await import("../mcp-BXD35N2J.mjs");
1927
+ const { runMcp } = await import("../mcp-STKL-uWs.mjs");
1692
1928
  runMcp();
1693
1929
  return;
1694
1930
  }
1695
- case "auth": return runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (r, p) => import("../auth-cmd-CPkWrQR9.mjs").then(({ runAuthCommand }) => runAuthCommand(r, p)));
1696
- case "project": return runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (r, p) => import("../project-cmd-CLrqSbqj.mjs").then(({ runProjectCommand }) => runProjectCommand(r, p)));
1697
- case "secret": return runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (r, p) => import("../secret-C_uTY7xx.mjs").then(({ runSecretCommand }) => runSecretCommand(r, p)));
1698
- case "domain": return runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (r, p) => import("../domain-B7RntQ1r.mjs").then(({ runDomainCommand }) => runDomainCommand(r, p)));
1699
- case "db": return runSubcommandGroup("db", dbSubcommands, parseDbArgs, (r, p) => import("../db-UW4IYQFw.mjs").then(({ runDbCommand }) => runDbCommand(r, p)));
1700
- case "env": return runSubcommandGroup("env", envSubcommands, parseEnvArgs, (r, p) => import("../env-C_ZcxxED.mjs").then(({ runEnvCommand }) => runEnvCommand(r, p)));
1701
- case "gen": return runSubcommandGroup("gen", genSubcommands, parseGenArgs, (r, p) => import("../gen-O5mXZ76K.mjs").then(({ runGenCommand }) => runGenCommand(r, p)));
1931
+ case "auth": return runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (r, p) => import("../auth-cmd-DLvXvN-0.mjs").then(({ runAuthCommand }) => runAuthCommand(r, p)));
1932
+ case "project": return runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (r, p) => import("../project-cmd-DZh-vbEL.mjs").then(({ runProjectCommand }) => runProjectCommand(r, p)));
1933
+ case "secret": return runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (r, p) => import("../secret-gs_yyGZL.mjs").then(({ runSecretCommand }) => runSecretCommand(r, p)));
1934
+ case "domain": return runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (r, p) => import("../domain-Bq6kzr_T.mjs").then(({ runDomainCommand }) => runDomainCommand(r, p)));
1935
+ case "github": return runSubcommandGroup("github", githubSubcommands, parseGithubArgs, (r, p) => import("../github-cmd-CD0Z8KCF.mjs").then(({ runGithubCommand }) => runGithubCommand(r, p)));
1936
+ case "db": return runSubcommandGroup("db", dbSubcommands, parseDbArgs, (r, p) => import("../db-BxnfKs7f.mjs").then(({ runDbCommand }) => runDbCommand(r, p)));
1937
+ case "env": return runSubcommandGroup("env", envSubcommands, parseEnvArgs, (r, p) => import("../env-BD3U_0Av.mjs").then(({ runEnvCommand }) => runEnvCommand(r, p)));
1938
+ case "gen": return runSubcommandGroup("gen", genSubcommands, parseGenArgs, (r, p) => import("../gen-Dgi4D7GC.mjs").then(({ runGenCommand }) => runGenCommand(r, p)));
1702
1939
  case "prepare": {
1703
- const { runPrepareCommand } = await import("../prepare-DT-7QII_.mjs");
1940
+ const { runPrepareCommand } = await import("../prepare-DH2WnEpD.mjs");
1704
1941
  await runPrepareCommand(root, parsePrepareArgs([]));
1705
1942
  return;
1706
1943
  }