void 0.10.2 → 0.10.4

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 (69) hide show
  1. package/dist/{auth-cmd-DLvXvN-0.mjs → auth-cmd-CblKzAdD.mjs} +2 -2
  2. package/dist/{better-auth-shared-a7H3wk9J.d.mts → better-auth-shared-jkksALri.d.mts} +2 -2
  3. package/dist/build-cmd-CJQSRupz.mjs +140 -0
  4. package/dist/{cache-CHFZmqa5.mjs → cache-CMzjhxHh.mjs} +1 -1
  5. package/dist/{cancel-deploy-BwpT4U4a.mjs → cancel-deploy-S2N8NSv6.mjs} +1 -1
  6. package/dist/cli/cli.mjs +203 -42
  7. package/dist/{client-CTHvucDv.mjs → client-YIzxv2ZO.mjs} +12 -0
  8. package/dist/{create-project-CruTH_TQ.mjs → create-project-pLQdzEPe.mjs} +1 -1
  9. package/dist/{db-BxnfKs7f.mjs → db-hAmBumot.mjs} +3 -3
  10. package/dist/{delete-IQe1O4Re.mjs → delete-CfSe3EJO.mjs} +1 -1
  11. package/dist/{deploy-CuxXxVgz.mjs → deploy-DpOdwtla.mjs} +3 -3
  12. package/dist/{domain-Bq6kzr_T.mjs → domain-CkowysQx.mjs} +1 -1
  13. package/dist/{env-BD3U_0Av.mjs → env-CIwG2y7G.mjs} +1 -1
  14. package/dist/{env-helpers-ZatKyjen.d.mts → env-helpers-B_ks681T.d.mts} +1 -1
  15. package/dist/{gen-Dgi4D7GC.mjs → gen-q6McxXgE.mjs} +1 -1
  16. package/dist/{github-cmd-CD0Z8KCF.mjs → github-cmd-BvEKQmcD.mjs} +169 -8
  17. package/dist/{handler-DczZlaXR.d.mts → handler-B7rCOy21.d.mts} +3 -3
  18. package/dist/index.d.mts +3 -3
  19. package/dist/index.mjs +5 -5
  20. package/dist/{init-CTe46nIr.mjs → init-CZP69LJu.mjs} +5 -5
  21. package/dist/{link-BGFW4pHD.mjs → link-BKLElphS.mjs} +2 -2
  22. package/dist/{list-CbGxdbe7.mjs → list-B7qXBBjo.mjs} +1 -1
  23. package/dist/{login-v4wle1vn.mjs → login-B3l_sDwT.mjs} +1 -1
  24. package/dist/{logs-BFgY5Vqc.mjs → logs-AXm660MB.mjs} +1 -1
  25. package/dist/{mcp-STKL-uWs.mjs → mcp-D2plINxM.mjs} +1 -1
  26. package/dist/pages/client.d.mts +1 -1
  27. package/dist/pages/head-client.d.mts +1 -1
  28. package/dist/pages/head.d.mts +1 -1
  29. package/dist/pages/index.d.mts +2 -2
  30. package/dist/pages/islands-plugin.d.mts +1 -1
  31. package/dist/pages/protocol.d.mts +2 -2
  32. package/dist/{project-cmd-DZh-vbEL.mjs → project-cmd-InegJruy.mjs} +8 -8
  33. package/dist/{protocol-63PHtCHS.d.mts → protocol-6UZCowS1.d.mts} +3 -3
  34. package/dist/{rollback-o0M0Qo_n.mjs → rollback-CHVE-DeT.mjs} +1 -1
  35. package/dist/runtime/auth.d.mts +1 -1
  36. package/dist/runtime/better-auth-pg.d.mts +1 -1
  37. package/dist/runtime/better-auth.d.mts +1 -1
  38. package/dist/runtime/client-react.d.mts +2 -2
  39. package/dist/runtime/client-solid.d.mts +2 -2
  40. package/dist/runtime/client-svelte.d.mts +2 -2
  41. package/dist/runtime/client-vue.d.mts +2 -2
  42. package/dist/runtime/client.d.mts +2 -2
  43. package/dist/runtime/env-helpers.d.mts +1 -1
  44. package/dist/runtime/env-public-client.d.mts +1 -1
  45. package/dist/runtime/env-public.d.mts +2 -2
  46. package/dist/runtime/fetch-stream.d.mts +1 -1
  47. package/dist/runtime/fetch.d.mts +1 -1
  48. package/dist/runtime/handler.d.mts +1 -1
  49. package/dist/runtime/live.d.mts +2 -2
  50. package/dist/runtime/validator.d.mts +1 -1
  51. package/dist/runtime/ws-server.d.mts +2 -2
  52. package/dist/runtime/ws.d.mts +3 -3
  53. package/dist/{secret-gs_yyGZL.mjs → secret-CVKwIOm3.mjs} +1 -1
  54. package/package.json +2 -2
  55. package/skills/void/docs/guide/pages-routing/markdown.md +12 -0
  56. package/skills/void/docs/node_modules/void/node_modules/@void/md/README.md +2 -1
  57. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-footnote/README.md +135 -0
  58. package/skills/void/docs/reference/cli.md +75 -14
  59. /package/dist/{auth-nEUVHuFI.d.mts → auth-Dz2CCn4T.d.mts} +0 -0
  60. /package/dist/{fetch-error-BQMdPvge.d.mts → fetch-error-B6RaJ-eZ.d.mts} +0 -0
  61. /package/dist/{head-JAH2l3fg.d.mts → head-eOUCWUNy.d.mts} +0 -0
  62. /package/dist/{prepare-DH2WnEpD.mjs → prepare-DRRboRqH.mjs} +0 -0
  63. /package/dist/{providers-BkiAlEad.d.mts → providers-BJIoduK9.d.mts} +0 -0
  64. /package/dist/{runner-pg-BAheiT6v.mjs → runner-pg-EuhrFW3D.mjs} +0 -0
  65. /package/dist/{skills--OMgLmXW.mjs → skills-Dl3u05da.mjs} +0 -0
  66. /package/dist/{standard-schema-BCBv-QaP.d.mts → standard-schema-Cy0lfeWv.d.mts} +0 -0
  67. /package/dist/{subcommand-prompt-ClwpLlKD.mjs → subcommand-prompt-B8ng0FTS.mjs} +0 -0
  68. /package/dist/{types-BnHMXezo.d.mts → types-BodZGegX.d.mts} +0 -0
  69. /package/dist/{yarn-pnp-DhCHHLAz.mjs → yarn-pnp-WLW2IHUY.mjs} +0 -0
@@ -1,6 +1,6 @@
1
- import { n as AuthState, r as AuthUser, t as AuthSession } from "../auth-nEUVHuFI.mjs";
1
+ import { n as AuthState, r as AuthUser, t as AuthSession } from "../auth-Dz2CCn4T.mjs";
2
2
  import { auth, createAuthClient } from "./auth-client-vue.mjs";
3
- import { t as FetchError } from "../fetch-error-BQMdPvge.mjs";
3
+ import { t as FetchError } from "../fetch-error-B6RaJ-eZ.mjs";
4
4
  import { fetch } from "./fetch.mjs";
5
5
  import { fetchStream } from "./fetch-stream.mjs";
6
6
  export { type AuthSession, type AuthState, type AuthUser, FetchError, FetchError as StreamError, auth, createAuthClient, fetch, fetchStream };
@@ -1,6 +1,6 @@
1
- import { n as AuthState, r as AuthUser, t as AuthSession } from "../auth-nEUVHuFI.mjs";
1
+ import { n as AuthState, r as AuthUser, t as AuthSession } from "../auth-Dz2CCn4T.mjs";
2
2
  import { auth, createAuthClient } from "./auth-client.mjs";
3
- import { t as FetchError } from "../fetch-error-BQMdPvge.mjs";
3
+ import { t as FetchError } from "../fetch-error-B6RaJ-eZ.mjs";
4
4
  import { fetch } from "./fetch.mjs";
5
5
  import { fetchStream } from "./fetch-stream.mjs";
6
6
  export { type AuthSession, type AuthState, type AuthUser, FetchError, FetchError as StreamError, auth, createAuthClient, fetch, fetchStream };
@@ -1,2 +1,2 @@
1
- import { a as getSecretOverride, c as oneOf, i as email, l as string, n as SECRET_OVERRIDE_SYMBOL, o as json, r as boolean, s as number, t as EnvSchema, u as url } from "../env-helpers-ZatKyjen.mjs";
1
+ import { a as getSecretOverride, c as oneOf, i as email, l as string, n as SECRET_OVERRIDE_SYMBOL, o as json, r as boolean, s as number, t as EnvSchema, u as url } from "../env-helpers-B_ks681T.mjs";
2
2
  export { EnvSchema, SECRET_OVERRIDE_SYMBOL, boolean, email, getSecretOverride, json, number, oneOf, string, url };
@@ -1,4 +1,4 @@
1
- import { c as oneOf, i as email, l as string, o as json, r as boolean, s as number, t as EnvSchema, u as url } from "../env-helpers-ZatKyjen.mjs";
1
+ import { c as oneOf, i as email, l as string, o as json, r as boolean, s as number, t as EnvSchema, u as url } from "../env-helpers-B_ks681T.mjs";
2
2
 
3
3
  //#region src/runtime/env-public-client.d.ts
4
4
  declare const env: Record<string, unknown>;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="@cloudflare/workers-types" />
2
- import { t as StandardSchemaV1 } from "../standard-schema-BCBv-QaP.mjs";
3
- import { c as oneOf, i as email, l as string, o as json, r as boolean, s as number, t as EnvSchema, u as url } from "../env-helpers-ZatKyjen.mjs";
2
+ import { t as StandardSchemaV1 } from "../standard-schema-Cy0lfeWv.mjs";
3
+ import { c as oneOf, i as email, l as string, o as json, r as boolean, s as number, t as EnvSchema, u as url } from "../env-helpers-B_ks681T.mjs";
4
4
  import * as _$_cloudflare_sandbox0 from "@cloudflare/sandbox";
5
5
 
6
6
  //#region src/runtime/env-public.d.ts
@@ -1,4 +1,4 @@
1
- import { t as FetchError } from "../fetch-error-BQMdPvge.mjs";
1
+ import { t as FetchError } from "../fetch-error-B6RaJ-eZ.mjs";
2
2
  import { RouteMap } from "void/routes";
3
3
 
4
4
  //#region src/runtime/fetch-stream.d.ts
@@ -1,4 +1,4 @@
1
- import { t as FetchError } from "../fetch-error-BQMdPvge.mjs";
1
+ import { t as FetchError } from "../fetch-error-B6RaJ-eZ.mjs";
2
2
  import { RouteMap } from "void/routes";
3
3
 
4
4
  //#region src/runtime/fetch.d.ts
@@ -1,3 +1,3 @@
1
1
  /// <reference types="@cloudflare/workers-types" />
2
- import { C as defer, E as ValidatorSlots, S as InferProps, T as HandlerInput, _ as defineQueue, a as CloudEnv, b as Deferred, c as QueueRetryOptions, d as TypedQueueHandler, f as VoidAssetRewriteError, g as defineMiddleware, h as defineHead, i as CloudContextVariables, l as RenderAssetTags, m as defineHandler, n as CloudBindings, o as QueueBatch, p as basicAuth, r as CloudContext, s as QueueMessage, t as BasicAuthOptions, u as TypedHandler, v as defineRender, w as ValidationError, y as defineScheduled } from "../handler-DczZlaXR.mjs";
2
+ import { C as defer, E as ValidatorSlots, S as InferProps, T as HandlerInput, _ as defineQueue, a as CloudEnv, b as Deferred, c as QueueRetryOptions, d as TypedQueueHandler, f as VoidAssetRewriteError, g as defineMiddleware, h as defineHead, i as CloudContextVariables, l as RenderAssetTags, m as defineHandler, n as CloudBindings, o as QueueBatch, p as basicAuth, r as CloudContext, s as QueueMessage, t as BasicAuthOptions, u as TypedHandler, v as defineRender, w as ValidationError, y as defineScheduled } from "../handler-B7rCOy21.mjs";
3
3
  export { BasicAuthOptions, CloudBindings, CloudContext, CloudContextVariables, CloudEnv, Deferred, HandlerInput, InferProps, QueueBatch, QueueMessage, QueueRetryOptions, RenderAssetTags, TypedHandler, TypedQueueHandler, ValidationError, ValidatorSlots, VoidAssetRewriteError, basicAuth, defer, defineHandler, defineHead, defineMiddleware, defineQueue, defineRender, defineScheduled };
@@ -1,6 +1,6 @@
1
1
  /// <reference types="@cloudflare/workers-types" />
2
- import { r as AuthUser } from "../auth-nEUVHuFI.mjs";
3
- import { a as CloudEnv, r as CloudContext } from "../handler-DczZlaXR.mjs";
2
+ import { r as AuthUser } from "../auth-Dz2CCn4T.mjs";
3
+ import { a as CloudEnv, r as CloudContext } from "../handler-B7rCOy21.mjs";
4
4
 
5
5
  //#region src/runtime/live.d.ts
6
6
  type MaybePromise<T> = T | Promise<T>;
@@ -1,2 +1,2 @@
1
- import { D as runValidation, E as ValidatorSlots, T as HandlerInput } from "../handler-DczZlaXR.mjs";
1
+ import { D as runValidation, E as ValidatorSlots, T as HandlerInput } from "../handler-B7rCOy21.mjs";
2
2
  export { HandlerInput, ValidatorSlots, runValidation };
@@ -1,5 +1,5 @@
1
- import { n as AuthState } from "../auth-nEUVHuFI.mjs";
2
- import { i as VoidAuthRuntimeOptions, n as VoidAuthEnv } from "../better-auth-shared-a7H3wk9J.mjs";
1
+ import { n as AuthState } from "../auth-Dz2CCn4T.mjs";
2
+ import { i as VoidAuthRuntimeOptions, n as VoidAuthEnv } from "../better-auth-shared-jkksALri.mjs";
3
3
  import { AnyWebSocketDefinition } from "./ws.mjs";
4
4
 
5
5
  //#region src/runtime/ws-server.d.ts
@@ -1,6 +1,6 @@
1
- import { r as AuthUser } from "../auth-nEUVHuFI.mjs";
2
- import { t as StandardSchemaV1 } from "../standard-schema-BCBv-QaP.mjs";
3
- import { a as CloudEnv } from "../handler-DczZlaXR.mjs";
1
+ import { r as AuthUser } from "../auth-Dz2CCn4T.mjs";
2
+ import { t as StandardSchemaV1 } from "../standard-schema-Cy0lfeWv.mjs";
3
+ import { a as CloudEnv } from "../handler-B7rCOy21.mjs";
4
4
  import { WebSocketRouteMap } from "void/routes";
5
5
 
6
6
  //#region src/runtime/ws.d.ts
@@ -1,5 +1,5 @@
1
1
  import { n as cliTitle } from "./output-DeiS4oEX.mjs";
2
- import { f as getToken, n as PlatformClient } from "./client-CTHvucDv.mjs";
2
+ import { f as getToken, n as PlatformClient } from "./client-YIzxv2ZO.mjs";
3
3
  import { _ as me, c as R, g as ge, n as Ce, u as Se, 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
  import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-D4O1_fZz.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "void",
3
- "version": "0.10.2",
3
+ "version": "0.10.4",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/voidzero-dev/void.git",
@@ -353,7 +353,7 @@
353
353
  "valibot": ">=1.0.0-beta.7",
354
354
  "vite": "^8.0.0",
355
355
  "zod": "^3.25.0 || ^4.0.0",
356
- "@void/md": "0.10.2"
356
+ "@void/md": "0.10.4"
357
357
  },
358
358
  "peerDependenciesMeta": {
359
359
  "@void/md": {
@@ -437,6 +437,18 @@ Import code from external files:
437
437
 
438
438
  Shortcodes convert to unicode: `:tada:` becomes :tada:, `:rocket:` becomes :rocket:.
439
439
 
440
+ ### Footnotes
441
+
442
+ Reference a footnote inline and define it anywhere in the document:
443
+
444
+ ```md
445
+ Here is a statement with a footnote.[^1]
446
+
447
+ [^1]: And here is the footnote body.
448
+ ```
449
+
450
+ The references and definitions render into a linked footnote list at the end of the content.
451
+
440
452
  ### Attributes
441
453
 
442
454
  Add classes, IDs, or attributes to any element:
@@ -115,6 +115,7 @@ Full VitePress-parity feature set:
115
115
  - **Custom containers** — `:::tip`, `:::info`, `:::warning`, `:::danger`, `:::details`
116
116
  - **GitHub alerts** — `> [!NOTE]`, `> [!TIP]`, `> [!WARNING]`, `> [!IMPORTANT]`, `> [!CAUTION]`
117
117
  - **Emoji** — `:emoji_name:` shortcodes
118
+ - **Footnotes** — `text[^1]` refs with matching `[^1]: definition` blocks
118
119
  - **Attributes** — `{.class #id}` on elements via `markdown-it-attrs`
119
120
  - **Anchor links** — auto-generated heading anchors
120
121
  - **Table of contents** — `[[toc]]` directive
@@ -143,7 +144,7 @@ import '@void/md/theme.css'; // or theme-content.css
143
144
 
144
145
  ## Tests
145
146
 
146
- - `test/unit/compile.test.ts` — compilation pipeline: basic, frontmatter, title extraction, headings, Shiki, emoji, anchors
147
+ - `test/unit/compile.test.ts` — compilation pipeline: basic, frontmatter, title extraction, headings, Shiki, emoji, footnotes, anchors
147
148
  - `test/unit/extract-script.test.ts` — script extraction: island imports, client code, edge cases
148
149
  - `test/unit/plugins.test.ts` — markdown-it plugins: containers, GitHub alerts, links, images, line numbers, emoji, TOC
149
150
  - `test/unit/emit-vue.test.ts` — Vue component emission with and without islands
@@ -0,0 +1,135 @@
1
+ # markdown-it-footnote
2
+
3
+ [![CI](https://github.com/markdown-it/markdown-it-footnote/actions/workflows/ci.yml/badge.svg)](https://github.com/markdown-it/markdown-it-footnote/actions/workflows/ci.yml)
4
+ [![NPM version](https://img.shields.io/npm/v/markdown-it-footnote.svg?style=flat)](https://www.npmjs.org/package/markdown-it-footnote)
5
+ [![Coverage Status](https://img.shields.io/coveralls/markdown-it/markdown-it-footnote/master.svg?style=flat)](https://coveralls.io/r/markdown-it/markdown-it-footnote?branch=master)
6
+
7
+ > Footnotes plugin for [markdown-it](https://github.com/markdown-it/markdown-it) markdown parser.
8
+
9
+ __v2.+ requires `markdown-it` v5.+, see changelog.__
10
+
11
+ Markup is based on [pandoc](http://johnmacfarlane.net/pandoc/README.html#footnotes) definition.
12
+
13
+ __Normal footnote__:
14
+
15
+ ```
16
+ Here is a footnote reference,[^1] and another.[^longnote]
17
+
18
+ [^1]: Here is the footnote.
19
+
20
+ [^longnote]: Here's one with multiple blocks.
21
+
22
+ Subsequent paragraphs are indented to show that they
23
+ belong to the previous footnote.
24
+ ```
25
+
26
+ html:
27
+
28
+ ```html
29
+ <p>Here is a footnote reference,<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> and another.<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup></p>
30
+ <p>This paragraph won’t be part of the note, because it
31
+ isn’t indented.</p>
32
+ <hr class="footnotes-sep">
33
+ <section class="footnotes">
34
+ <ol class="footnotes-list">
35
+ <li id="fn1" class="footnote-item"><p>Here is the footnote. <a href="#fnref1" class="footnote-backref">↩</a></p>
36
+ </li>
37
+ <li id="fn2" class="footnote-item"><p>Here’s one with multiple blocks.</p>
38
+ <p>Subsequent paragraphs are indented to show that they
39
+ belong to the previous footnote. <a href="#fnref2" class="footnote-backref">↩</a></p>
40
+ </li>
41
+ </ol>
42
+ </section>
43
+ ```
44
+
45
+ __Inline footnote__:
46
+
47
+ ```
48
+ Here is an inline note.^[Inlines notes are easier to write, since
49
+ you don't have to pick an identifier and move down to type the
50
+ note.]
51
+ ```
52
+
53
+ html:
54
+
55
+ ```html
56
+ <p>Here is an inline note.<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup></p>
57
+ <hr class="footnotes-sep">
58
+ <section class="footnotes">
59
+ <ol class="footnotes-list">
60
+ <li id="fn1" class="footnote-item"><p>Inlines notes are easier to write, since
61
+ you don’t have to pick an identifier and move down to type the
62
+ note. <a href="#fnref1" class="footnote-backref">↩</a></p>
63
+ </li>
64
+ </ol>
65
+ </section>
66
+ ```
67
+
68
+
69
+ ## Install
70
+
71
+ node.js, browser:
72
+
73
+ ```bash
74
+ npm install markdown-it-footnote --save
75
+ bower install markdown-it-footnote --save
76
+ ```
77
+
78
+ ## Use
79
+
80
+ ```js
81
+ var md = require('markdown-it')()
82
+ .use(require('markdown-it-footnote'));
83
+
84
+ md.render(/*...*/) // See examples above
85
+ ```
86
+
87
+ _Differences in browser._ If you load script directly into the page, without
88
+ package system, module will add itself globally as `window.markdownitFootnote`.
89
+
90
+
91
+ ### Customize
92
+
93
+ If you want to customize the output, you'll need to replace the template
94
+ functions. To see which templates exist and their default implementations,
95
+ look in [`index.js`](index.js). The API of these template functions is out of
96
+ scope for this plugin's documentation; you can read more about it [in the
97
+ markdown-it
98
+ documentation](https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer).
99
+
100
+ To demonstrate with an example, here is how you might replace the `<hr>` that
101
+ this plugin emits by default with an `<h4>` emitted by your own template
102
+ function override:
103
+
104
+ ```js
105
+ const md = require('markdown-it')().use(require('markdown-it-footnote'));
106
+
107
+ md.renderer.rules.footnote_block_open = () => (
108
+ '<h4 class="mt-3">Footnotes</h4>\n' +
109
+ '<section class="footnotes">\n' +
110
+ '<ol class="footnotes-list">\n'
111
+ );
112
+ ```
113
+
114
+ Here's another example that customizes footnotes for epub books:
115
+
116
+ ```js
117
+ const backrefLabel = 'back to text';
118
+
119
+ const epubRules = {
120
+ footnote_ref: ['<a', '<a epub:type="noteref"'],
121
+ footnote_open: ['<li', '<li epub:type="footnote"'],
122
+ footnote_anchor: ['<a', `<a aria-label="${backrefLabel}"`],
123
+ }
124
+
125
+ Object.keys(epubRules).map(rule => {
126
+ let defaultRender = md.renderer.rules[rule];
127
+ md.renderer.rules[rule] = (tokens, idx, options, env, self) => {
128
+ return defaultRender(tokens, idx, options, env, self).replace(...epubRules[rule]);
129
+ }
130
+ })
131
+ ```
132
+
133
+ ## License
134
+
135
+ [MIT](https://github.com/markdown-it/markdown-it-footnote/blob/master/LICENSE)
@@ -35,6 +35,7 @@ Use this page as a command reference. If you are setting up a project for the fi
35
35
  | `void project rollback` | Roll back to a previous deployment |
36
36
  | `void project cancel` | Cancel an active deployment |
37
37
  | `void project purge-cache` | Purge all cached pages |
38
+ | `void build logs` | Stream, tail, or download build logs |
38
39
  | `void mcp` | Start the Void MCP server |
39
40
  | `void init` | Setup wizard for new or existing projects |
40
41
 
@@ -606,13 +607,18 @@ Connect a GitHub repository to a Void project for automatic deploys. On every pu
606
607
 
607
608
  **Options**
608
609
 
609
- | Flag | Description |
610
- | --------------------- | ------------------------------------------------------------------------------- |
611
- | `--project <name>` | Project name (alias for the positional argument) |
612
- | `--installation <id>` | GitHub App installation ID (required when you have multiple installations) |
613
- | `--repo <owner/repo>` | Repository full name — required unless the installation grants exactly one repo |
614
- | `--branch <name>` | Branch to deploy from — **required in non-interactive mode** |
615
- | `--executor <type>` | Build executor: `container` (default) or `github_actions` |
610
+ | Flag | Description |
611
+ | --------------------- | --------------------------------------------------------------------------------- |
612
+ | `--project <name>` | Project name (alias for the positional argument) |
613
+ | `--installation <id>` | GitHub App installation ID (required when you have multiple installations) |
614
+ | `--repo <owner/repo>` | Repository full name — required unless the installation grants exactly one repo |
615
+ | `--branch <name>` | Branch to deploy from — **required in non-interactive mode** |
616
+ | `--executor <type>` | Build executor: `container` (default) or `github_actions` |
617
+ | `--workflow <path>` | Authorized deploy workflow file — defaults to `.github/workflows/void-deploy.yml` |
618
+
619
+ The `--workflow` path is the workflow file the GitHub OIDC exchange authorizes to mint this project's deploy token. It defaults to the scaffolded `.github/workflows/void-deploy.yml`; set it only if your deploy step lives in a different workflow file (it must be under `.github/workflows/` and end in `.yml`/`.yaml`). Because the exchange is secretless, **only this one workflow** can mint a deploy token — any other workflow in the repo (including an unsafe `pull_request_target`) is rejected. Pointing it at a broad, multi-purpose workflow widens that trust, so prefer a dedicated file.
620
+
621
+ Interactively (TTY), after resolving the repository and branch, `void github connect` prompts for the **build executor** (defaulting to `container`). If you pick `github_actions`, it then prompts for the **deploy workflow file**, defaulting to `.github/workflows/void-deploy.yml` and validated locally before it is sent. Pass `--executor` and/or `--workflow` to skip the respective prompt. The workflow prompt is skipped entirely for the `container` executor, which does not use a workflow file.
616
622
 
617
623
  **Non-interactive use (CI)**
618
624
 
@@ -633,17 +639,18 @@ void github connect my-app \
633
639
  void github update [project] [options]
634
640
  ```
635
641
 
636
- Update an existing connection's deploy **branch** and/or **build executor**. Use this to change settings on a project that is already connected — for example, flipping the executor from `container` to `github_actions` for a monorepo whose Void app lives in a subdirectory, or moving the deploy branch. The project must already be connected (run `void github connect` first); the repository and installation are not changed.
642
+ Update an existing connection's deploy **branch**, **build executor**, and/or authorized **workflow file**. Use this to change settings on a project that is already connected — for example, flipping the executor from `container` to `github_actions` for a monorepo whose Void app lives in a subdirectory, moving the deploy branch, or pointing the OIDC trust at a different workflow file. The project must already be connected (run `void github connect` first); the repository and installation are not changed.
637
643
 
638
644
  **Options**
639
645
 
640
- | Flag | Description |
641
- | ------------------- | --------------------------------------------------- |
642
- | `--project <name>` | Project name (alias for the positional argument) |
643
- | `--branch <name>` | New branch to deploy from |
644
- | `--executor <type>` | New build executor: `container` or `github_actions` |
646
+ | Flag | Description |
647
+ | ------------------- | ---------------------------------------------------------------- |
648
+ | `--project <name>` | Project name (alias for the positional argument) |
649
+ | `--branch <name>` | New branch to deploy from |
650
+ | `--executor <type>` | New build executor: `container` or `github_actions` |
651
+ | `--workflow <path>` | New authorized deploy workflow file (under `.github/workflows/`) |
645
652
 
646
- Interactively (TTY), `void github update` shows the current branch and executor and prompts for new values, defaulting each to the current setting. When stdin is not a TTY, it never prompts: pass at least one of `--branch` / `--executor`, or it fails closed. If nothing actually changes, the command reports "no changes" and does not call the API.
653
+ Interactively (TTY), `void github update` shows the current branch and executor and prompts for new values, defaulting each to the current setting. If the resulting executor is `github_actions`, it then prompts for the **deploy workflow file**, defaulting to the current path and validated locally; pass `--workflow` to skip that prompt. The workflow prompt is skipped when the executor is `container`, which does not use a workflow file. When stdin is not a TTY, it never prompts: pass at least one of `--branch` / `--executor` / `--workflow`, or it fails closed. If nothing actually changes, the command reports "no changes" and does not call the API.
647
654
 
648
655
  ```
649
656
  void github update my-app --executor github_actions
@@ -651,6 +658,60 @@ void github update my-app --executor github_actions
651
658
 
652
659
  **Project resolution** follows the same order as deploy: positional / `--project`, `VOID_PROJECT`, linked project (`.void/project.json`).
653
660
 
661
+ ### `void github status`
662
+
663
+ ```
664
+ void github status [project]
665
+ ```
666
+
667
+ Show a project's current GitHub connection: the connected **repository**, the deploy **branch**, the **build executor** (`container` or `github_actions`), and the authorized **deploy workflow file**. Read-only — it never changes anything. The workflow file is the OIDC pin used only for `github_actions` builds; on a `container` connection it is still shown but marked unused. The project must already be connected (run `void github connect` first, otherwise it reports that and exits).
668
+
669
+ **Options**
670
+
671
+ | Flag | Description |
672
+ | ------------------ | ------------------------------------------------ |
673
+ | `--project <name>` | Project name (alias for the positional argument) |
674
+
675
+ ```
676
+ void github status my-app
677
+ ```
678
+
679
+ **Project resolution** follows the same order as deploy: positional / `--project`, `VOID_PROJECT`, linked project (`.void/project.json`).
680
+
681
+ ## Build
682
+
683
+ Inspect Deploy-on-GitHub builds.
684
+
685
+ ### `void build logs`
686
+
687
+ ```
688
+ void build logs [build] [--follow] [--output <file>] [--project <slug>]
689
+ ```
690
+
691
+ Stream, tail, or download the build logs for a **container** build. With no
692
+ `[build]` argument, targets the project's most recent build.
693
+
694
+ | Flag | Purpose | Default |
695
+ | ------------------------ | ----------------------------------------------------------------- | ------- |
696
+ | `--follow`, `-f` | Live-tail: poll until the build reaches a terminal status. | off |
697
+ | `--output <file>`, `-o` | Write logs to a file instead of stdout (appends while following). | stdout |
698
+ | `--project <slug>`, `-p` | Target project. | linked |
699
+
700
+ **Project resolution** follows the same order as deploy: positional / `--project`,
701
+ `VOID_PROJECT`, linked project (`.void/project.json`).
702
+
703
+ Builds run on **GitHub Actions** keep their logs on GitHub — the command prints
704
+ the Actions run URL instead of streaming. Only the last 10,000 log lines of a
705
+ container build are retained.
706
+
707
+ Examples:
708
+
709
+ ```
710
+ void build logs # print the latest build's logs
711
+ void build logs -f # follow the latest build until it finishes
712
+ void build logs bld_123 -o build.log # download a specific build's logs
713
+ ```
714
+
654
715
  ## Custom Domains
655
716
 
656
717
  ### `void domain add`