@holydeck/cli 2026.9.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 (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/dist/BrowserWebSocketTransport-H3D6MINS.js +12 -0
  4. package/dist/BrowserWebSocketTransport-H3D6MINS.js.map +1 -0
  5. package/dist/LaunchOptions-42ZS55HH.js +12 -0
  6. package/dist/LaunchOptions-42ZS55HH.js.map +1 -0
  7. package/dist/NodeWebSocketTransport-BXHQGXRM.js +15 -0
  8. package/dist/NodeWebSocketTransport-BXHQGXRM.js.map +1 -0
  9. package/dist/bidi-25S23FWJ.js +18358 -0
  10. package/dist/bidi-25S23FWJ.js.map +1 -0
  11. package/dist/chunk-2BLOYUSF.js +795 -0
  12. package/dist/chunk-2BLOYUSF.js.map +1 -0
  13. package/dist/chunk-43CZTS57.js +38 -0
  14. package/dist/chunk-43CZTS57.js.map +1 -0
  15. package/dist/chunk-DIBLSFAG.js +34 -0
  16. package/dist/chunk-DIBLSFAG.js.map +1 -0
  17. package/dist/chunk-IEJ3OX3N.js +52 -0
  18. package/dist/chunk-IEJ3OX3N.js.map +1 -0
  19. package/dist/chunk-JM4YIWBN.js +3796 -0
  20. package/dist/chunk-JM4YIWBN.js.map +1 -0
  21. package/dist/chunk-NP3DTWF7.js +23282 -0
  22. package/dist/chunk-NP3DTWF7.js.map +1 -0
  23. package/dist/chunk-SWG4X375.js +51 -0
  24. package/dist/chunk-SWG4X375.js.map +1 -0
  25. package/dist/chunk-UC6TFXMD.js +2821 -0
  26. package/dist/chunk-UC6TFXMD.js.map +1 -0
  27. package/dist/chunk-V4BIHFVZ.js +2287 -0
  28. package/dist/chunk-V4BIHFVZ.js.map +1 -0
  29. package/dist/chunk-V77AQPDK.js +20 -0
  30. package/dist/chunk-V77AQPDK.js.map +1 -0
  31. package/dist/chunk-XAENXL52.js +101 -0
  32. package/dist/chunk-XAENXL52.js.map +1 -0
  33. package/dist/cli.js +64101 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/dist-3ZE2HBJQ.js +20447 -0
  36. package/dist/dist-3ZE2HBJQ.js.map +1 -0
  37. package/dist/dist-575AQY5L.js +1161 -0
  38. package/dist/dist-575AQY5L.js.map +1 -0
  39. package/dist/dist-DL5M2SDJ.js +117 -0
  40. package/dist/dist-DL5M2SDJ.js.map +1 -0
  41. package/dist/dist-OMWR53J4.js +4713 -0
  42. package/dist/dist-OMWR53J4.js.map +1 -0
  43. package/dist/dist-UT6HKKCD.js +281 -0
  44. package/dist/dist-UT6HKKCD.js.map +1 -0
  45. package/dist/fs-P6GYHPGZ.js +1685 -0
  46. package/dist/fs-P6GYHPGZ.js.map +1 -0
  47. package/dist/helpers-64DWIL6C.js +21 -0
  48. package/dist/helpers-64DWIL6C.js.map +1 -0
  49. package/dist/main-IQ64YDOJ.js +61 -0
  50. package/dist/main-IQ64YDOJ.js.map +1 -0
  51. package/dist/puppeteer-RDWY6FSG.js +2386 -0
  52. package/dist/puppeteer-RDWY6FSG.js.map +1 -0
  53. package/dist/yargs-KMQWKLG6.js +3264 -0
  54. package/dist/yargs-KMQWKLG6.js.map +1 -0
  55. package/dist/yauzl-7KG7KPPF.js +1355 -0
  56. package/dist/yauzl-7KG7KPPF.js.map +1 -0
  57. package/package.json +44 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 HolyDeck contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,234 @@
1
+ # @holydeck/cli
2
+
3
+ Bible verses for sermons and presentations, from a local revisioned datastore.
4
+
5
+ `holydeck` turns a dated sermon file (the verses for a service) into clean,
6
+ ready-to-paste slide text for any number of translations. Verses live in a
7
+ local datastore on your machine, so Sunday never depends on the internet
8
+ being up.
9
+
10
+ ## Requirements
11
+
12
+ - Node.js 24 or newer
13
+ - A headless Chromium for downloading translations — installed automatically with the
14
+ optional `puppeteer` dependency, see [Fetching from bible.com](#fetching-from-biblecom)
15
+
16
+ ## Install
17
+
18
+ ```sh
19
+ npm install -g @holydeck/cli
20
+ # or run it without installing
21
+ npx @holydeck/cli --help
22
+ ```
23
+
24
+ ## Quick start
25
+
26
+ ```sh
27
+ # write a commented starter config (default translations, data directory, …)
28
+ holydeck config init
29
+
30
+ # download the translations you use into the local datastore
31
+ holydeck sync KJV WEB
32
+
33
+ # render a single reference ad hoc
34
+ holydeck get "PSA 118:24"
35
+
36
+ # scaffold a dated sermon file, check it, render it
37
+ holydeck new
38
+ holydeck preflight --last
39
+ holydeck get-verses --last
40
+ ```
41
+
42
+ ## Commands
43
+
44
+ | Command | What it does |
45
+ | --- | --- |
46
+ | `new` | Scaffold a dated sermon file and open it in `$EDITOR` |
47
+ | `preflight` | Verify every passage of a sermon file is available, fetching what is missing |
48
+ | `get-verses` | Render a sermon file to text output |
49
+ | `get` | Render a single reference ad hoc, e.g. `holydeck get "PSA 118:24"` |
50
+ | `sync` | Download or update whole translations in the local datastore |
51
+ | `translations` | List known translations (local) or the translations a server offers |
52
+ | `stats` | Show what the local datastore holds: coverage, revisions, size on disk |
53
+ | `revisions` | List or diff the stored revisions of a chapter |
54
+ | `offsets` | Compare verse counts between two stored translations to find versification offsets |
55
+ | `import` | Merge an exported translation store file into the local datastore |
56
+ | `config` | Manage the HolyDeck config file |
57
+ | `auth` | Log in to, inspect, or log out from an OIDC-protected server |
58
+ | `info` | Show the effective configuration and where each value came from |
59
+ | `doctor` | Check config, datastore, network, and server health |
60
+ | `completion` | Print a shell completion script (zsh or bash) |
61
+
62
+ Run `holydeck <command> --help` for the full options of any command.
63
+
64
+ ## Shell completion
65
+
66
+ ```sh
67
+ # zsh
68
+ echo 'source <(holydeck completion zsh)' >> ~/.zshrc
69
+
70
+ # bash
71
+ echo 'source <(holydeck completion bash)' >> ~/.bashrc
72
+ ```
73
+
74
+ Restart your shell to pick it up. Completions are fetched live from the
75
+ installed CLI, so they stay in sync automatically as commands are added —
76
+ nothing to regenerate or update. Commands, `--flags`, and Bible book codes
77
+ complete with a description alongside each candidate (zsh shows these
78
+ inline; bash just completes the value).
79
+
80
+ > **zsh:** `compinit` should only run once per shell, after this line runs.
81
+ > Some tools (Docker Desktop's completion snippet, for example) add a
82
+ > second `compinit` call later in `.zshrc`, which silently un-registers
83
+ > completions sourced above it — move those calls earlier if completion
84
+ > stops working.
85
+
86
+ If you're running via `npx` instead of a global install, wrap it in a
87
+ function first so `holydeck` resolves on your `$PATH`:
88
+
89
+ ```sh
90
+ holydeck() { npx --yes @holydeck/cli@latest "$@"; }
91
+ source <(holydeck completion zsh)
92
+ ```
93
+
94
+ (This adds `npx` startup latency to every completion trigger.)
95
+
96
+ ## Fetching from bible.com
97
+
98
+ bible.com answers plain HTTP clients with a JavaScript challenge page, so `sync`,
99
+ `preflight` and an ad-hoc `get` of an unstored chapter need a real browser to run it.
100
+ Pass `--browser-fetch` (or set `browserFetch: true` in the config file, or
101
+ `HOLYDECK_BROWSER_FETCH=1`) and the fetch goes through a headless Chromium instead:
102
+
103
+ ```sh
104
+ holydeck sync KJV --browser-fetch
105
+ ```
106
+
107
+ The browser starts once per command and is reused for the whole run. Chromium comes
108
+ from the optional `puppeteer` dependency; if you only render from an already-populated
109
+ datastore you can skip the download with `npm install -g @holydeck/cli --omit=optional`.
110
+
111
+ `holydeck doctor` reports which transport it reached bible.com with, so run it first
112
+ when a sync stops returning content.
113
+
114
+ ## Book names
115
+
116
+ A book can be named by its USFM code or by its name in English, German or Tamil —
117
+ anywhere a book is accepted: sermon files, `get`, `revisions` and `offsets`.
118
+ Case, spacing and punctuation do not matter, and a leading ordinal may be written
119
+ any way you like:
120
+
121
+ ```sh
122
+ holydeck get "GEN 30:5-7,9"
123
+ holydeck get "1. Mose 30:5-7,9"
124
+ holydeck get "2nd Samuel 1:6" # or "2 Samuel", "II Samuel", "2. Samuel"
125
+ holydeck get "சங்கீதம் 118:24"
126
+ ```
127
+
128
+ ## Passages that are not synced yet
129
+
130
+ `get` and `get-verses` do not stop at a chapter the datastore lacks: they fetch it,
131
+ store it, and render from the stored copy, so an ad-hoc reference works without syncing
132
+ a whole translation first. A run that had to fetch says so on stderr in one line; add
133
+ `--verbose` and every chapter names its own source instead — `source: cache` with the
134
+ revision date, or `source: live · … · fetched just now` for one this run went and got.
135
+
136
+ ```sh
137
+ holydeck get "GEN 30:5-7,9" # fetches GEN 30 if it is not stored yet
138
+ holydeck get "GEN 30:5-7,9" --verbose # names the source of every chapter
139
+ holydeck get "GEN 30:5-7,9" --no-fetch-missing # fails instead, leaving the datastore alone
140
+ ```
141
+
142
+ Book names come from the translation's own canon, which the datastore learns on the first run
143
+ that may fetch — so citations read in the translation's language (`3. Mose`, `லேவியராகமம்`)
144
+ rather than in English. A store written before that, or imported without a canon, repairs
145
+ itself the same way; a run that cannot reach bible.com says so once and renders with English
146
+ names rather than failing.
147
+
148
+ Use `--no-fetch-missing` when a run must not reach the network, or to check what the
149
+ datastore really holds.
150
+
151
+ The server behaves the same way: `GET /api/v1/translations/:abbr/verses` and
152
+ `POST /api/v1/render` fetch a missing chapter unless the request passes
153
+ `?fetchMissing=false`. In server mode (`--server-url`) the CLI forwards the flag, so the
154
+ same command gives the same result wherever the data lives.
155
+
156
+ ## Interrupting a sync
157
+
158
+ A whole translation is more than a thousand chapters, so `sync` is built to be stopped
159
+ and picked up again. Press Ctrl-C once: the run finishes the chapters already in
160
+ flight, saves them, releases the datastore lock and prints how far it got. Run the same
161
+ command again to continue with what is still missing. A second Ctrl-C quits at once,
162
+ which drops up to the last ten fetched chapters.
163
+
164
+ Each translation is locked while it is being written, so a second `sync` of the same
165
+ one waits for the first to finish rather than writing over it, and says which process
166
+ it is waiting for. A run that is killed outright leaves its lock behind; the next run
167
+ sees that the owning process is gone and takes the lock over, so there is nothing to
168
+ clean up by hand.
169
+
170
+ Steps with nothing to print — starting the browser, fetching the canon, waiting for a
171
+ lock — show a spinner on a terminal, so a slow command never looks like a hung one.
172
+ Progress and status go to stderr, leaving piped output clean.
173
+
174
+ ## Server mode
175
+
176
+ Every command works against the local datastore by default. Pass
177
+ `--server-url <url>` (or set it in the config file) to use a self-hosted
178
+ HolyDeck server instead — the server ships as a container image at
179
+ `ghcr.io/holydeck/server`.
180
+
181
+ If the server is protected by an OpenID Connect provider, log in once before
182
+ using it:
183
+
184
+ ```sh
185
+ holydeck --server-url https://bible.example.com auth login \
186
+ --issuer https://auth.example.com \
187
+ --client-id holydeck-cli \
188
+ --resource https://bible.example.com
189
+ ```
190
+
191
+ HolyDeck opens the provider's login page and listens for the authorization
192
+ callback on `127.0.0.1:53682`. The provider must allow that loopback redirect
193
+ URI, authorization-code flow, and PKCE `S256`. The default scopes are
194
+ `openid offline_access`. HolyDeck uses pushed authorization requests (PAR) when
195
+ the provider advertises them and otherwise uses a regular authorization request.
196
+
197
+ For a server protected by Authelia's bearer-token authorization, request its
198
+ special scope and the server URL as a resource prefix:
199
+
200
+ ```sh
201
+ holydeck --server-url https://bible.example.com auth login \
202
+ --issuer https://auth.example.com \
203
+ --client-id holydeck-cli \
204
+ --resource https://bible.example.com \
205
+ --scope "offline_access authelia.bearer.authz"
206
+ ```
207
+
208
+ That Authelia client must enforce PAR, PKCE `S256`, explicit consent and
209
+ `form_post`, and allow the server URL in its audience list. `--audience` remains
210
+ available for providers that need an exact audience request, but Authelia's
211
+ `resource` grant is what authorizes every API path below the server URL.
212
+
213
+ The login is stored per server in the platform config directory with permissions
214
+ limited to the current user. HolyDeck refreshes expired access tokens and retries
215
+ one request after a `401`. Use `holydeck auth status` to inspect the login without
216
+ printing tokens, or `holydeck auth logout` to remove it.
217
+
218
+ For unattended configuration, the required login options can also be supplied as
219
+ `HOLYDECK_OIDC_ISSUER` and `HOLYDECK_OIDC_CLIENT_ID`; optional values are
220
+ `HOLYDECK_OIDC_AUDIENCE`, `HOLYDECK_OIDC_RESOURCE`, and
221
+ `HOLYDECK_OIDC_SCOPE`, plus `HOLYDECK_OIDC_CALLBACK_PORT` when the default
222
+ port is unavailable. To make later logins just `holydeck auth login`, save
223
+ the same values as `serverUrl`, `oidcIssuer`, `oidcClientId`, `oidcAudience`,
224
+ `oidcResource`, `oidcScope`, and `oidcCallbackPort` in `config.yaml`. Run
225
+ `holydeck config init` to generate a commented template containing every key.
226
+
227
+ ## Links
228
+
229
+ - Website: [holydeck.faith](https://holydeck.faith)
230
+ - Source and issues: [github.com/holydeck/holydeck](https://github.com/holydeck/holydeck)
231
+
232
+ ## License
233
+
234
+ [MIT](https://github.com/holydeck/holydeck/blob/main/LICENSE)
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __holydeckCreateRequire } from 'node:module';
3
+ const require = __holydeckCreateRequire(import.meta.url);
4
+ import {
5
+ BrowserWebSocketTransport
6
+ } from "./chunk-SWG4X375.js";
7
+ import "./chunk-XAENXL52.js";
8
+ import "./chunk-IEJ3OX3N.js";
9
+ export {
10
+ BrowserWebSocketTransport
11
+ };
12
+ //# sourceMappingURL=BrowserWebSocketTransport-H3D6MINS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __holydeckCreateRequire } from 'node:module';
3
+ const require = __holydeckCreateRequire(import.meta.url);
4
+ import {
5
+ convertPuppeteerChannelToBrowsersChannel
6
+ } from "./chunk-DIBLSFAG.js";
7
+ import "./chunk-UC6TFXMD.js";
8
+ import "./chunk-IEJ3OX3N.js";
9
+ export {
10
+ convertPuppeteerChannelToBrowsersChannel
11
+ };
12
+ //# sourceMappingURL=LaunchOptions-42ZS55HH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __holydeckCreateRequire } from 'node:module';
3
+ const require = __holydeckCreateRequire(import.meta.url);
4
+ import {
5
+ DEFAULT_KEEP_ALIVE_INTERVAL_MS,
6
+ NodeWebSocketTransport
7
+ } from "./chunk-JM4YIWBN.js";
8
+ import "./chunk-V77AQPDK.js";
9
+ import "./chunk-XAENXL52.js";
10
+ import "./chunk-IEJ3OX3N.js";
11
+ export {
12
+ DEFAULT_KEEP_ALIVE_INTERVAL_MS,
13
+ NodeWebSocketTransport
14
+ };
15
+ //# sourceMappingURL=NodeWebSocketTransport-BXHQGXRM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}