@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.
- package/LICENSE +21 -0
- package/README.md +234 -0
- package/dist/BrowserWebSocketTransport-H3D6MINS.js +12 -0
- package/dist/BrowserWebSocketTransport-H3D6MINS.js.map +1 -0
- package/dist/LaunchOptions-42ZS55HH.js +12 -0
- package/dist/LaunchOptions-42ZS55HH.js.map +1 -0
- package/dist/NodeWebSocketTransport-BXHQGXRM.js +15 -0
- package/dist/NodeWebSocketTransport-BXHQGXRM.js.map +1 -0
- package/dist/bidi-25S23FWJ.js +18358 -0
- package/dist/bidi-25S23FWJ.js.map +1 -0
- package/dist/chunk-2BLOYUSF.js +795 -0
- package/dist/chunk-2BLOYUSF.js.map +1 -0
- package/dist/chunk-43CZTS57.js +38 -0
- package/dist/chunk-43CZTS57.js.map +1 -0
- package/dist/chunk-DIBLSFAG.js +34 -0
- package/dist/chunk-DIBLSFAG.js.map +1 -0
- package/dist/chunk-IEJ3OX3N.js +52 -0
- package/dist/chunk-IEJ3OX3N.js.map +1 -0
- package/dist/chunk-JM4YIWBN.js +3796 -0
- package/dist/chunk-JM4YIWBN.js.map +1 -0
- package/dist/chunk-NP3DTWF7.js +23282 -0
- package/dist/chunk-NP3DTWF7.js.map +1 -0
- package/dist/chunk-SWG4X375.js +51 -0
- package/dist/chunk-SWG4X375.js.map +1 -0
- package/dist/chunk-UC6TFXMD.js +2821 -0
- package/dist/chunk-UC6TFXMD.js.map +1 -0
- package/dist/chunk-V4BIHFVZ.js +2287 -0
- package/dist/chunk-V4BIHFVZ.js.map +1 -0
- package/dist/chunk-V77AQPDK.js +20 -0
- package/dist/chunk-V77AQPDK.js.map +1 -0
- package/dist/chunk-XAENXL52.js +101 -0
- package/dist/chunk-XAENXL52.js.map +1 -0
- package/dist/cli.js +64101 -0
- package/dist/cli.js.map +1 -0
- package/dist/dist-3ZE2HBJQ.js +20447 -0
- package/dist/dist-3ZE2HBJQ.js.map +1 -0
- package/dist/dist-575AQY5L.js +1161 -0
- package/dist/dist-575AQY5L.js.map +1 -0
- package/dist/dist-DL5M2SDJ.js +117 -0
- package/dist/dist-DL5M2SDJ.js.map +1 -0
- package/dist/dist-OMWR53J4.js +4713 -0
- package/dist/dist-OMWR53J4.js.map +1 -0
- package/dist/dist-UT6HKKCD.js +281 -0
- package/dist/dist-UT6HKKCD.js.map +1 -0
- package/dist/fs-P6GYHPGZ.js +1685 -0
- package/dist/fs-P6GYHPGZ.js.map +1 -0
- package/dist/helpers-64DWIL6C.js +21 -0
- package/dist/helpers-64DWIL6C.js.map +1 -0
- package/dist/main-IQ64YDOJ.js +61 -0
- package/dist/main-IQ64YDOJ.js.map +1 -0
- package/dist/puppeteer-RDWY6FSG.js +2386 -0
- package/dist/puppeteer-RDWY6FSG.js.map +1 -0
- package/dist/yargs-KMQWKLG6.js +3264 -0
- package/dist/yargs-KMQWKLG6.js.map +1 -0
- package/dist/yauzl-7KG7KPPF.js +1355 -0
- package/dist/yauzl-7KG7KPPF.js.map +1 -0
- 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":[]}
|