rv-bible-cli 0.1.0 → 0.1.1
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/README.md +35 -33
- package/dist/index.js +35 -35
- package/dist/ui/Pager.js +3 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
#
|
|
1
|
+
# rvb — Recovery Version Bible CLI
|
|
2
2
|
|
|
3
3
|
A fast, study-grade terminal Bible reader for the Recovery Version. Offline-first, footnote-aware, cross-reference deep-linking, clipboard-friendly.
|
|
4
4
|
|
|
5
5
|
```
|
|
6
6
|
npm install -g rv-bible-cli
|
|
7
|
-
|
|
7
|
+
rvb
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
+
> **Note:** `rv` also works as an alias on Mac/Linux.
|
|
11
|
+
|
|
10
12
|
## Quick Start
|
|
11
13
|
|
|
12
14
|
```bash
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
rvb john 3 # read a chapter (interactive pager)
|
|
16
|
+
rvb john 3:16 # read a single verse
|
|
17
|
+
rvb search grace # concordance search (1,129 curated words)
|
|
18
|
+
rvb help # see all commands and shortcuts
|
|
17
19
|
```
|
|
18
20
|
|
|
19
21
|
## Features
|
|
@@ -21,24 +23,24 @@ rv help # see all commands and shortcuts
|
|
|
21
23
|
### Reading
|
|
22
24
|
|
|
23
25
|
```bash
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
rvb john 3 # chapter mode — opens full-screen pager
|
|
27
|
+
rvb john 3:16 # single verse
|
|
28
|
+
rvb john 3:16-18 # verse range
|
|
29
|
+
rvb john 3:16,18,20 # specific verses
|
|
30
|
+
rvb john 3:16 rom 8:28 # verses across books
|
|
31
|
+
rvb jn 3 # fuzzy book names (jn, gen, rm, eph, rev, etc.)
|
|
32
|
+
rvb john 3 --notes # inline footnote markers + footnote block
|
|
33
|
+
rvb john 3 --outline # section headers inline
|
|
34
|
+
rvb john 3 --full # both notes and outline
|
|
35
|
+
rvb john 3 --raw # plain text, no pager (also auto when piped)
|
|
34
36
|
```
|
|
35
37
|
|
|
36
38
|
### Footnotes
|
|
37
39
|
|
|
38
40
|
```bash
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
rvb note john 3:16 # all footnotes for a verse
|
|
42
|
+
rvb note john 3:16 2d # specific footnote by marker
|
|
43
|
+
rvb note john 3:14-16 # footnotes for a range
|
|
42
44
|
```
|
|
43
45
|
|
|
44
46
|
### Search
|
|
@@ -46,12 +48,12 @@ rv note john 3:14-16 # footnotes for a range
|
|
|
46
48
|
Concordance-first for known words (1,129 curated entries), FTS5 full-text for everything else.
|
|
47
49
|
|
|
48
50
|
```bash
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
rvb search grace # concordance lookup
|
|
52
|
+
rvb search grace in romans # scoped to a book
|
|
53
|
+
rvb search "only begotten" # phrase match
|
|
54
|
+
rvb search eternal life # multi-word AND
|
|
55
|
+
rvb search grace --fts # force raw FTS5
|
|
56
|
+
rvb search grace --all # show all results (default: 20/page)
|
|
55
57
|
```
|
|
56
58
|
|
|
57
59
|
### Copy to Clipboard
|
|
@@ -59,18 +61,18 @@ rv search grace --all # show all results (default: 20/page)
|
|
|
59
61
|
Add `--copy` to any read command. Output displays normally AND goes to clipboard.
|
|
60
62
|
|
|
61
63
|
```bash
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
rvb john 3:16 --copy # "John 3:16 For God so loved..."
|
|
65
|
+
rvb john 3:16 --copy --no-ref # plain text only
|
|
66
|
+
rvb john 3:16 --copy --numbered # "16 For God so loved..."
|
|
67
|
+
rvb john 3:16 --copy --md # markdown block quote
|
|
68
|
+
rvb search grace --copy # copy all results
|
|
67
69
|
```
|
|
68
70
|
|
|
69
71
|
### Navigation
|
|
70
72
|
|
|
71
73
|
```bash
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
rvb # home screen — browse books, pick chapters
|
|
75
|
+
rvb continue # resume last-read chapter
|
|
74
76
|
```
|
|
75
77
|
|
|
76
78
|
## Pager
|
|
@@ -124,7 +126,7 @@ Study mode persists across navigation — follow a cross-ref and you stay in stu
|
|
|
124
126
|
|
|
125
127
|
### Home Screen
|
|
126
128
|
|
|
127
|
-
Press `H` from the pager or run `
|
|
129
|
+
Press `H` from the pager or run `rvb` with no arguments.
|
|
128
130
|
|
|
129
131
|
| Key | Action |
|
|
130
132
|
|-----|--------|
|
package/dist/index.js
CHANGED
|
@@ -85,10 +85,10 @@ function renderHomepage() {
|
|
|
85
85
|
if (last) {
|
|
86
86
|
const bookName = getBookInfo(last.book)?.full_name ?? last.book;
|
|
87
87
|
lines.push(chalk.dim(` Last read: ${bookName} ${last.chapter}`));
|
|
88
|
-
lines.push(chalk.dim(' ›
|
|
88
|
+
lines.push(chalk.dim(' › rvb continue'));
|
|
89
89
|
}
|
|
90
90
|
else {
|
|
91
|
-
lines.push(chalk.dim(' Get started:
|
|
91
|
+
lines.push(chalk.dim(' Get started: rvb john 1'));
|
|
92
92
|
}
|
|
93
93
|
lines.push('');
|
|
94
94
|
// Book grid
|
|
@@ -110,7 +110,7 @@ function renderHomepage() {
|
|
|
110
110
|
lines.push(...renderGrid(nt));
|
|
111
111
|
lines.push('');
|
|
112
112
|
// Hints
|
|
113
|
-
lines.push(chalk.dim('
|
|
113
|
+
lines.push(chalk.dim(' rvb <book> <chapter> rvb search <query> rvb continue'));
|
|
114
114
|
lines.push('');
|
|
115
115
|
console.log(lines.join('\n'));
|
|
116
116
|
}
|
|
@@ -229,7 +229,7 @@ program
|
|
|
229
229
|
.option('--copy', 'copy displayed output to clipboard')
|
|
230
230
|
.action(async (args, opts) => {
|
|
231
231
|
if (args.length === 0) {
|
|
232
|
-
console.error('Usage:
|
|
232
|
+
console.error('Usage: rvb note <ref> [marker] (e.g. rvb note john 3:16 or rvb note john 3:16 1a)');
|
|
233
233
|
process.exit(1);
|
|
234
234
|
}
|
|
235
235
|
// Try no-marker mode: parse all args as verse refs (every ref must have verses).
|
|
@@ -263,7 +263,7 @@ program
|
|
|
263
263
|
}
|
|
264
264
|
// Marker mode: last token is the marker, everything before is the ref.
|
|
265
265
|
if (args.length < 2) {
|
|
266
|
-
console.error('Usage:
|
|
266
|
+
console.error('Usage: rvb note <ref> <marker> (e.g. rvb note john 3:16 1a)');
|
|
267
267
|
process.exit(1);
|
|
268
268
|
}
|
|
269
269
|
const marker = args[args.length - 1];
|
|
@@ -351,7 +351,7 @@ program
|
|
|
351
351
|
.action(async (queryArgs, opts) => {
|
|
352
352
|
const { queryTokens, book } = parseScope(queryArgs);
|
|
353
353
|
if (queryTokens.length === 0) {
|
|
354
|
-
console.error('Usage:
|
|
354
|
+
console.error('Usage: rvb search <query> [in <book>]');
|
|
355
355
|
process.exit(1);
|
|
356
356
|
}
|
|
357
357
|
const word = queryTokens.join(' ');
|
|
@@ -428,7 +428,7 @@ program
|
|
|
428
428
|
if (!isTTY) {
|
|
429
429
|
// Non-interactive: show "showing N of M" hint and stop
|
|
430
430
|
const ftsFlag = opts.fts ? ' --fts' : '';
|
|
431
|
-
const cmd = `
|
|
431
|
+
const cmd = `rvb search ${word}${book ? ` in ${(getBookInfo(book)?.full_name ?? book).toLowerCase()}` : ''}${ftsFlag}`;
|
|
432
432
|
console.log('');
|
|
433
433
|
console.log(chalk.dim(` showing ${offset} of ${all.length} · ${cmd} --all to show all`));
|
|
434
434
|
break;
|
|
@@ -457,7 +457,7 @@ program
|
|
|
457
457
|
.action(async (opts) => {
|
|
458
458
|
const last = getLastRead();
|
|
459
459
|
if (!last) {
|
|
460
|
-
console.log(chalk.dim(' Nothing read yet — try:
|
|
460
|
+
console.log(chalk.dim(' Nothing read yet — try: rvb john 1'));
|
|
461
461
|
return;
|
|
462
462
|
}
|
|
463
463
|
if (opts.full) {
|
|
@@ -504,43 +504,43 @@ program
|
|
|
504
504
|
const b = chalk.bold;
|
|
505
505
|
const c = chalk.cyan;
|
|
506
506
|
console.log(`
|
|
507
|
-
${b('
|
|
507
|
+
${b('rvb — Recovery Version Bible CLI')}
|
|
508
508
|
|
|
509
509
|
${b('READING')}
|
|
510
|
-
${c('
|
|
511
|
-
${c('
|
|
512
|
-
${c('
|
|
513
|
-
${c('
|
|
514
|
-
${c('
|
|
515
|
-
${c('
|
|
516
|
-
${c('
|
|
517
|
-
${c('
|
|
518
|
-
${c('
|
|
519
|
-
${c('
|
|
510
|
+
${c('rvb john 3')} Read a chapter (opens pager in terminal)
|
|
511
|
+
${c('rvb john 3:16')} Read a single verse
|
|
512
|
+
${c('rvb john 3:16-18')} Read a verse range
|
|
513
|
+
${c('rvb john 3:16,18,20')} Multiple specific verses
|
|
514
|
+
${c('rvb john 3:16 rom 8:28')} Verses across books
|
|
515
|
+
${c('rvb jn 3')} Fuzzy book names ${d('(jn → John, gen → Genesis, rm → Romans)')}
|
|
516
|
+
${c('rvb john 3 --notes')} Show footnote markers + footnote block
|
|
517
|
+
${c('rvb john 3 --outline')} Show section headers inline
|
|
518
|
+
${c('rvb john 3 --full')} Both notes and outline
|
|
519
|
+
${c('rvb john 3 --raw')} Plain text, no pager ${d('(also auto when piped)')}
|
|
520
520
|
|
|
521
521
|
${b('FOOTNOTES')}
|
|
522
|
-
${c('
|
|
523
|
-
${c('
|
|
524
|
-
${c('
|
|
522
|
+
${c('rvb note john 3:16')} All footnotes for a verse
|
|
523
|
+
${c('rvb note john 3:16 2d')} Specific footnote by marker
|
|
524
|
+
${c('rvb note john 3:14-16')} Footnotes for a range
|
|
525
525
|
|
|
526
526
|
${b('SEARCH')} ${d('concordance-first for known words, FTS5 for everything else')}
|
|
527
|
-
${c('
|
|
528
|
-
${c('
|
|
529
|
-
${c('
|
|
530
|
-
${c('
|
|
531
|
-
${c('
|
|
532
|
-
${c('
|
|
527
|
+
${c('rvb search grace')} Concordance lookup ${d('(1,129 curated words)')}
|
|
528
|
+
${c('rvb search grace in rom')} Scoped to a book
|
|
529
|
+
${c('rvb search "only begotten"')} Phrase match via FTS5
|
|
530
|
+
${c('rvb search eternal life')} Multi-word AND match
|
|
531
|
+
${c('rvb search grace --fts')} Force raw FTS5
|
|
532
|
+
${c('rvb search grace --all')} Show all results ${d('(default: 20 per page)')}
|
|
533
533
|
|
|
534
534
|
${b('NAVIGATION')}
|
|
535
|
-
${c('
|
|
536
|
-
${c('
|
|
535
|
+
${c('rvb')} Home screen — browse books, pick chapters
|
|
536
|
+
${c('rvb continue')} Resume last-read chapter
|
|
537
537
|
|
|
538
538
|
${b('COPY')} ${d('add --copy to any read command')}
|
|
539
|
-
${c('
|
|
540
|
-
${c('
|
|
541
|
-
${c('
|
|
542
|
-
${c('
|
|
543
|
-
${c('
|
|
539
|
+
${c('rvb john 3:16 --copy')} Copy with reference prefix
|
|
540
|
+
${c('rvb john 3:16 --copy --no-ref')} Plain text only
|
|
541
|
+
${c('rvb john 3:16 --copy --numbered')} Verse number prefix
|
|
542
|
+
${c('rvb john 3:16 --copy --md')} Markdown block quote
|
|
543
|
+
${c('rvb search grace --copy')} Copy all search results
|
|
544
544
|
|
|
545
545
|
${b('PAGER SHORTCUTS')} ${d('chapter mode in terminal')}
|
|
546
546
|
${d('Scroll')} ↑↓ or j/k line · Space/b page · g top · G bottom
|
package/dist/ui/Pager.js
CHANGED
|
@@ -931,8 +931,10 @@ function Pager({ initialBook, initialChapter, initialNotes, initialOutline, star
|
|
|
931
931
|
MajorProphets: 'Major Prophets', MinorProphets: 'Minor Prophets',
|
|
932
932
|
Gospels: 'Gospels', Paul: 'Epistles of Paul', Others: 'General Epistles & Prophecy',
|
|
933
933
|
};
|
|
934
|
+
// Acts is miscategorized as "Gospels" in the DB — override it
|
|
935
|
+
const BOOK_OVERRIDES = { Act: 'History of the Church' };
|
|
934
936
|
const bookInfo = getBookInfo(book);
|
|
935
|
-
const categoryLabel = CATEGORY_LABELS[bookInfo?.category ?? ''] ?? '';
|
|
937
|
+
const categoryLabel = BOOK_OVERRIDES[book] ?? CATEGORY_LABELS[bookInfo?.category ?? ''] ?? '';
|
|
936
938
|
const topVerseIdx = verseAtLine(verseMap, scrollOffset) + 1;
|
|
937
939
|
const title = `${bookName} ${chapter}`;
|
|
938
940
|
const position = `${topVerseIdx}/${verses.length}`;
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rv-bible-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Fast, offline terminal Bible reader for the Recovery Version. Footnotes, cross-references, concordance search, interactive pager.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
8
|
-
"rv": "dist/index.js"
|
|
8
|
+
"rv": "dist/index.js",
|
|
9
|
+
"rvb": "dist/index.js"
|
|
9
10
|
},
|
|
10
11
|
"files": [
|
|
11
12
|
"dist/",
|