@cavelang/cli 0.2.1 → 0.4.0
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 +17 -11
- package/dist/src/cli.d.ts +13 -5
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +154 -32
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/main.js +5 -1
- package/dist/src/main.js.map +1 -1
- package/package.json +9 -9
- package/src/cli.ts +165 -32
- package/src/index.ts +1 -1
- package/src/main.ts +5 -1
package/README.md
CHANGED
|
@@ -7,30 +7,36 @@ TypeScript sources via Node's type stripping; no build step.
|
|
|
7
7
|
$ echo 'auth USES jwt @ 90%' | pnpm exec cave parse
|
|
8
8
|
ok: 1 claim
|
|
9
9
|
|
|
10
|
-
$ pnpm exec cave add
|
|
10
|
+
$ pnpm exec cave add --db knowledge.db notes.cave
|
|
11
11
|
added 12 claim(s), 3 edge(s)
|
|
12
12
|
|
|
13
|
-
$ pnpm exec cave query '?x USES jwt'
|
|
13
|
+
$ pnpm exec cave query --db knowledge.db '?x USES jwt'
|
|
14
14
|
?x = auth/middleware
|
|
15
15
|
?x = api/gateway
|
|
16
16
|
|
|
17
|
-
$ pnpm exec cave query '?cause CAUSE app/crash' 'WHERE conf >= 0.7'
|
|
17
|
+
$ pnpm exec cave query --db knowledge.db '?cause CAUSE app/crash' 'WHERE conf >= 0.7'
|
|
18
18
|
$ pnpm exec cave export --db knowledge.db --current
|
|
19
19
|
$ pnpm exec cave demo
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
## Commands
|
|
23
23
|
|
|
24
|
+
Every command answers `--help` with its options and examples (also
|
|
25
|
+
`cave help <command>`). `--db` is optional everywhere: it defaults to
|
|
26
|
+
`$CAVE_DB`, or `cave.db` in the current directory.
|
|
27
|
+
|
|
24
28
|
| Command | Flags | Behavior |
|
|
25
29
|
|---|---|---|
|
|
26
|
-
| `parse [file]` | `--json` | Lint (stdin by default). Exit 1 when diagnostics exist; `--json` dumps the AST document. |
|
|
27
|
-
| `add [
|
|
28
|
-
| `import [
|
|
29
|
-
| `query
|
|
30
|
-
| `export --db p` | `--out <file>`, `--current`, `--no-prelude` | Canonical CAVE text — all rows in tx order, or current beliefs only. Stdout by default; `--out` writes a file and reports the claim count. |
|
|
31
|
-
| `mcp --db p` | `--no-prelude` | Serve the engine as an MCP server on stdio (see [`@cavelang/mcp`](../mcp)) — tools for add/query/search/about/neighbors/reconstruct/export/lint, with the §22 spec card as server instructions. |
|
|
32
|
-
| `ingest <globs/urls
|
|
30
|
+
| `parse [file…]` | `--json` | Lint (stdin by default). Exit 1 when diagnostics exist; `--json` dumps the AST document. |
|
|
31
|
+
| `add [--db p] [file…]` | `--strict`, `--no-prelude` | Ingest. Lenient by default (problems on stderr, valid lines land); `--strict` rolls back on any problem; `--no-prelude` starts from an empty registry instead of the standard §5.5 pairs. |
|
|
32
|
+
| `import [--db p] [file…]` | `--strict`, `--no-prelude` | Restore/merge a database from CAVE text — same operation as `add`, because canonical text *is* the interchange format. |
|
|
33
|
+
| `query [--db p] <pattern…>` | `--json`, `--all`, `--no-prelude` | CAVE-Q. Extra positionals join as lines, so `WHERE` filters ride as separate arguments. Bindings print as `?x = value`; fully bound patterns print the matched raw line (or the pattern itself for transitive matches, which carry no row). `--no-prelude` aligns the read-time registry with a store written via `add --no-prelude`. |
|
|
34
|
+
| `export [--db p]` | `--out <file>`, `--current`, `--no-prelude` | Canonical CAVE text — all rows in tx order, or current beliefs only. Stdout by default; `--out` writes a file and reports the claim count. |
|
|
35
|
+
| `mcp [--db p]` | `--no-prelude` | Serve the engine as an MCP server on stdio (see [`@cavelang/mcp`](../mcp)) — tools for add/query/search/about/neighbors/reconstruct/export/lint, with the §22 spec card as server instructions. |
|
|
36
|
+
| `ingest [--db p] <globs/urls…>` | see `cave ingest --help` | LLM-driven ingestion of files and web pages (fetched and readability-extracted) through any headless agent (see [`@cavelang/ingest`](../ingest)): batching, instructions markdown, hybrid knowledge context, MCP or stdout agents, incremental digests, `--plan` NDJSON for SDK drivers. |
|
|
33
37
|
| `demo` | | The cave-loop multi-hop recovery demo (§18). |
|
|
38
|
+
| `version` | | Print the cave version. |
|
|
39
|
+
| `help [command]` | | The overview, or one command's options and examples. |
|
|
34
40
|
|
|
35
41
|
## Text backup / interchange
|
|
36
42
|
|
|
@@ -38,7 +44,7 @@ $ pnpm exec cave demo
|
|
|
38
44
|
$ cave export --db knowledge.db --out backup.cave
|
|
39
45
|
exported 812 claim(s) to backup.cave
|
|
40
46
|
|
|
41
|
-
$ cave import
|
|
47
|
+
$ cave import --db restored.db backup.cave
|
|
42
48
|
added 812 claim(s), 37 edge(s)
|
|
43
49
|
```
|
|
44
50
|
|
package/dist/src/cli.d.ts
CHANGED
|
@@ -6,19 +6,24 @@
|
|
|
6
6
|
* Commands:
|
|
7
7
|
*
|
|
8
8
|
* - `cave parse [file]` — lint / dump the AST (`--json`)
|
|
9
|
-
* - `cave add [
|
|
10
|
-
* - `cave query '<pattern>'
|
|
11
|
-
* - `cave export --db <path
|
|
9
|
+
* - `cave add [--db <path>] [file…]` — ingest into a store (`--strict`)
|
|
10
|
+
* - `cave query [--db <path>] '<pattern>'` — CAVE-Q (`--json`, `--all`)
|
|
11
|
+
* - `cave export [--db <path>]` — canonical text out (`--current`)
|
|
12
12
|
* - `cave demo` — the cave-loop multi-hop recovery demo
|
|
13
|
+
* - `cave version` — print the cave version
|
|
14
|
+
* - `cave help [command]` — overview, or one command's help
|
|
13
15
|
*
|
|
14
|
-
* `file` defaults to stdin (`-`)
|
|
16
|
+
* `file` defaults to stdin (`-`); `--db` defaults to `$CAVE_DB`, then
|
|
17
|
+
* `cave.db`. Every command answers `--help` with options and examples.
|
|
15
18
|
*/
|
|
16
19
|
export type Output = {
|
|
17
20
|
readonly code: number;
|
|
18
21
|
readonly out: string;
|
|
19
22
|
readonly err: string;
|
|
20
23
|
};
|
|
21
|
-
export declare const usage = "cave \u2014 Compressed Atomic Verb Expressions\n\nUsage:\n cave parse [file] [--json]
|
|
24
|
+
export declare const usage = "cave \u2014 Compressed Atomic Verb Expressions\n\nUsage:\n cave parse [file...] [--json] lint CAVE text (stdin when no file)\n cave add [--db <path>] [file...] ingest into a store [--strict] [--no-prelude]\n cave import [--db <path>] [file...] restore/merge from CAVE text (same as add)\n cave query [--db <path>] <pattern> run a CAVE-Q pattern [--json] [--all] [--no-prelude]\n cave export [--db <path>] [--out <file>] emit canonical CAVE text [--current] [--no-prelude]\n cave mcp [--db <path>] serve the engine as an MCP server on stdio [--no-prelude]\n cave ingest [--db <path>] <globs/urls..> LLM-driven ingestion of files and web pages\n cave demo run the cave-loop reconstruction demo\n cave version print the cave version\n cave help [command] this text, or one command's options and examples\n\nEvery command answers --help. --db defaults to $CAVE_DB, or cave.db in\nthe current directory. The spec lives in the .claude/skills/ directory at\nthe repository root (section index in README.md).";
|
|
25
|
+
/** Per-command help, printed for \`cave <command> --help\` and \`cave help <command>\`. */
|
|
26
|
+
export declare const commandHelp: Record<string, string>;
|
|
22
27
|
export declare const parseCommand: (argv: readonly string[]) => Output;
|
|
23
28
|
export declare const addCommand: (argv: readonly string[]) => Output;
|
|
24
29
|
/**
|
|
@@ -35,6 +40,9 @@ export declare const importCommand: (argv: readonly string[]) => Output;
|
|
|
35
40
|
export declare const queryCommand: (argv: readonly string[]) => Output;
|
|
36
41
|
export declare const exportCommand: (argv: readonly string[]) => Output;
|
|
37
42
|
export declare const demoCommand: () => Output;
|
|
43
|
+
export declare const versionCommand: () => Output;
|
|
44
|
+
/** `cave help [command]` — the overview, or one command's help text. */
|
|
45
|
+
export declare const helpCommand: (argv: readonly string[]) => Output;
|
|
38
46
|
/** Dispatches one invocation. */
|
|
39
47
|
export declare const cave: (argv: readonly string[]) => Output;
|
|
40
48
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/src/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAWH,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB,CAAA;AAQD,eAAO,MAAM,KAAK,unCAgBgC,CAAA;AAIlD,2FAA2F;AAC3F,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAsG9C,CAAA;AAOD,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAyBtD,CAAA;AA+BD,eAAO,MAAM,UAAU,SA7BwB,SAAS,MAAM,EAAE,KAAG,MA6BrB,CAAA;AAE9C;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,SAzCqB,SAAS,MAAM,EAAE,KAAG,MAyCf,CAAA;AAEpD,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAsCtD,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAuBvD,CAAA;AAED,eAAO,MAAM,WAAW,QAAO,MACS,CAAA;AAExC,eAAO,MAAM,cAAc,QAAO,MACJ,CAAA;AAE9B,wEAAwE;AACxE,eAAO,MAAM,WAAW,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAcrD,CAAA;AAED,iCAAiC;AACjC,eAAO,MAAM,IAAI,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAqC9C,CAAA"}
|
package/dist/src/cli.js
CHANGED
|
@@ -6,18 +6,22 @@
|
|
|
6
6
|
* Commands:
|
|
7
7
|
*
|
|
8
8
|
* - `cave parse [file]` — lint / dump the AST (`--json`)
|
|
9
|
-
* - `cave add [
|
|
10
|
-
* - `cave query '<pattern>'
|
|
11
|
-
* - `cave export --db <path
|
|
9
|
+
* - `cave add [--db <path>] [file…]` — ingest into a store (`--strict`)
|
|
10
|
+
* - `cave query [--db <path>] '<pattern>'` — CAVE-Q (`--json`, `--all`)
|
|
11
|
+
* - `cave export [--db <path>]` — canonical text out (`--current`)
|
|
12
12
|
* - `cave demo` — the cave-loop multi-hop recovery demo
|
|
13
|
+
* - `cave version` — print the cave version
|
|
14
|
+
* - `cave help [command]` — overview, or one command's help
|
|
13
15
|
*
|
|
14
|
-
* `file` defaults to stdin (`-`)
|
|
16
|
+
* `file` defaults to stdin (`-`); `--db` defaults to `$CAVE_DB`, then
|
|
17
|
+
* `cave.db`. Every command answers `--help` with options and examples.
|
|
15
18
|
*/
|
|
16
19
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
17
20
|
import { parseArgs } from 'node:util';
|
|
21
|
+
import { Version } from '@cavelang/core';
|
|
18
22
|
import { parseDocument } from '@cavelang/parser';
|
|
19
23
|
import { Registry, standardRegistry } from '@cavelang/canonical';
|
|
20
|
-
import { open } from '@cavelang/store';
|
|
24
|
+
import { defaultDbPath, open } from '@cavelang/store';
|
|
21
25
|
import { query as caveQuery } from '@cavelang/query';
|
|
22
26
|
import { Demo } from '@cavelang/loop';
|
|
23
27
|
const ok = (out) => ({ code: 0, out, err: '' });
|
|
@@ -25,18 +29,119 @@ const fail = (err, code = 1) => ({ code, out: '', err });
|
|
|
25
29
|
export const usage = `cave — Compressed Atomic Verb Expressions
|
|
26
30
|
|
|
27
31
|
Usage:
|
|
28
|
-
cave parse [file] [--json]
|
|
29
|
-
cave add [
|
|
30
|
-
cave import [
|
|
31
|
-
cave query
|
|
32
|
-
cave export --db <path> [--out <file>] emit canonical CAVE text [--current] [--no-prelude]
|
|
33
|
-
cave mcp --db <path> serve the engine as an MCP server on stdio [--no-prelude]
|
|
34
|
-
cave ingest
|
|
35
|
-
cave demo
|
|
36
|
-
cave
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
cave parse [file...] [--json] lint CAVE text (stdin when no file)
|
|
33
|
+
cave add [--db <path>] [file...] ingest into a store [--strict] [--no-prelude]
|
|
34
|
+
cave import [--db <path>] [file...] restore/merge from CAVE text (same as add)
|
|
35
|
+
cave query [--db <path>] <pattern> run a CAVE-Q pattern [--json] [--all] [--no-prelude]
|
|
36
|
+
cave export [--db <path>] [--out <file>] emit canonical CAVE text [--current] [--no-prelude]
|
|
37
|
+
cave mcp [--db <path>] serve the engine as an MCP server on stdio [--no-prelude]
|
|
38
|
+
cave ingest [--db <path>] <globs/urls..> LLM-driven ingestion of files and web pages
|
|
39
|
+
cave demo run the cave-loop reconstruction demo
|
|
40
|
+
cave version print the cave version
|
|
41
|
+
cave help [command] this text, or one command's options and examples
|
|
42
|
+
|
|
43
|
+
Every command answers --help. --db defaults to $CAVE_DB, or cave.db in
|
|
44
|
+
the current directory. The spec lives in the .claude/skills/ directory at
|
|
45
|
+
the repository root (section index in README.md).`;
|
|
46
|
+
const dbHelp = `--db <path> database file (default: $CAVE_DB, or cave.db)`;
|
|
47
|
+
/** Per-command help, printed for \`cave <command> --help\` and \`cave help <command>\`. */
|
|
48
|
+
export const commandHelp = {
|
|
49
|
+
parse: `cave parse — lint CAVE text, or dump the parsed document
|
|
50
|
+
|
|
51
|
+
Usage:
|
|
52
|
+
cave parse [file...] [--json]
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
--json dump the parsed document as JSON instead of a summary
|
|
56
|
+
|
|
57
|
+
Reads stdin when no file (or \`-\`) is given. Exits 1 when the text has
|
|
58
|
+
diagnostics, printing them one per line to stderr.
|
|
59
|
+
|
|
60
|
+
Examples:
|
|
61
|
+
cave parse notes.cave
|
|
62
|
+
echo 'auth USES jwt @ 90%' | cave parse
|
|
63
|
+
cave parse notes.cave --json | jq '.lines[0]'`,
|
|
64
|
+
add: `cave add — ingest CAVE text into a knowledge database
|
|
65
|
+
|
|
66
|
+
Usage:
|
|
67
|
+
cave add [--db <path>] [file...] [--strict] [--no-prelude]
|
|
68
|
+
|
|
69
|
+
Options:
|
|
70
|
+
${dbHelp}
|
|
71
|
+
--strict reject the whole ingest on any problem
|
|
72
|
+
--no-prelude open the store without the standard verb registry
|
|
73
|
+
|
|
74
|
+
Reads stdin when no file (or \`-\`) is given.
|
|
75
|
+
|
|
76
|
+
Examples:
|
|
77
|
+
cave add --db k.db notes.cave
|
|
78
|
+
echo 'auth USES jwt @ 90%' | cave add
|
|
79
|
+
cave add --db k.db --strict reviewed.cave`,
|
|
80
|
+
import: `cave import — restore/merge a database from CAVE text (same as add)
|
|
81
|
+
|
|
82
|
+
Usage:
|
|
83
|
+
cave import [--db <path>] [file...] [--strict] [--no-prelude]
|
|
84
|
+
|
|
85
|
+
Options:
|
|
86
|
+
${dbHelp}
|
|
87
|
+
--strict reject the whole import on any problem
|
|
88
|
+
--no-prelude open the store without the standard verb registry
|
|
89
|
+
|
|
90
|
+
Canonical CAVE text is the interchange format (spec §2.2): importing a
|
|
91
|
+
file written by \`cave export\` replays its claims append-only, preserving
|
|
92
|
+
the belief series, qualifier edges and in-band declarations.
|
|
93
|
+
|
|
94
|
+
Examples:
|
|
95
|
+
cave export --db old.db --out backup.cave
|
|
96
|
+
cave import --db new.db backup.cave`,
|
|
97
|
+
query: `cave query — run a CAVE-Q pattern against a store
|
|
98
|
+
|
|
99
|
+
Usage:
|
|
100
|
+
cave query [--db <path>] <pattern> [WHERE <filter>] [--json] [--all] [--no-prelude]
|
|
101
|
+
|
|
102
|
+
Options:
|
|
103
|
+
${dbHelp}
|
|
104
|
+
--json emit matches as JSON
|
|
105
|
+
--all match all beliefs, not just current ones
|
|
106
|
+
--no-prelude open the store without the standard verb registry
|
|
107
|
+
|
|
108
|
+
Patterns are claim triples with ?variables and optional metadata filters
|
|
109
|
+
(spec §12). A second positional starting with WHERE filters on conf,
|
|
110
|
+
value or tx.
|
|
111
|
+
|
|
112
|
+
Examples:
|
|
113
|
+
cave query '?x USES jwt'
|
|
114
|
+
cave query --db k.db '?x HAS bug: ?bug #security'
|
|
115
|
+
cave query --db k.db '?cause CAUSE app/crash' 'WHERE conf >= 0.5'
|
|
116
|
+
cave query --db k.db 'terrier EXTENDS+ animal'
|
|
117
|
+
cave query --db k.db '?x ?verb ?y @production' --json`,
|
|
118
|
+
export: `cave export — emit canonical CAVE text from a store
|
|
119
|
+
|
|
120
|
+
Usage:
|
|
121
|
+
cave export [--db <path>] [--out <file>] [--current] [--no-prelude]
|
|
122
|
+
|
|
123
|
+
Options:
|
|
124
|
+
${dbHelp}
|
|
125
|
+
--out <file> write to a file instead of stdout
|
|
126
|
+
--current current beliefs only (skip superseded rows)
|
|
127
|
+
--no-prelude open the store without the standard verb registry
|
|
128
|
+
|
|
129
|
+
Examples:
|
|
130
|
+
cave export --db k.db
|
|
131
|
+
cave export --db k.db --out backup.cave
|
|
132
|
+
cave export --db k.db --current --out snapshot.cave`,
|
|
133
|
+
demo: `cave demo — run the cave-loop multi-hop reconstruction demo
|
|
134
|
+
|
|
135
|
+
Usage:
|
|
136
|
+
cave demo
|
|
137
|
+
|
|
138
|
+
Narrates the spec §18 recovery: seed cues expand symptom → cause →
|
|
139
|
+
topic → fix over a small in-memory store.`,
|
|
140
|
+
version: `cave version — print the cave version
|
|
141
|
+
|
|
142
|
+
Usage:
|
|
143
|
+
cave version`
|
|
144
|
+
};
|
|
40
145
|
const readInput = (files) => files.length === 0 || (files.length === 1 && files[0] === '-') ?
|
|
41
146
|
readFileSync(0, 'utf8') :
|
|
42
147
|
files.map(file => readFileSync(file, 'utf8')).join('\n');
|
|
@@ -76,11 +181,8 @@ const ingestCommand = (name) => (argv) => {
|
|
|
76
181
|
},
|
|
77
182
|
allowPositionals: true
|
|
78
183
|
});
|
|
79
|
-
if (values.db === undefined) {
|
|
80
|
-
return fail(`cave ${name}: --db <path> is required\n`);
|
|
81
|
-
}
|
|
82
184
|
const input = readInput(positionals);
|
|
83
|
-
const store = open(values.db, values['no-prelude'] === true ? { registry: Registry.empty } : {});
|
|
185
|
+
const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {});
|
|
84
186
|
try {
|
|
85
187
|
const result = store.ingest(input, { strict: values.strict === true });
|
|
86
188
|
const problems = result.problems
|
|
@@ -122,14 +224,11 @@ export const queryCommand = (argv) => {
|
|
|
122
224
|
},
|
|
123
225
|
allowPositionals: true
|
|
124
226
|
});
|
|
125
|
-
if (values.db === undefined) {
|
|
126
|
-
return fail('cave query: --db <path> is required\n');
|
|
127
|
-
}
|
|
128
227
|
if (positionals.length === 0) {
|
|
129
228
|
return fail('cave query: a pattern is required (spec §12.1)\n');
|
|
130
229
|
}
|
|
131
230
|
const pattern = positionals.join('\n');
|
|
132
|
-
const store = open(values.db, values['no-prelude'] === true ? { registry: Registry.empty } : {});
|
|
231
|
+
const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {});
|
|
133
232
|
try {
|
|
134
233
|
const matches = caveQuery(store, pattern, { all: values.all === true });
|
|
135
234
|
if (values.json === true) {
|
|
@@ -166,10 +265,7 @@ export const exportCommand = (argv) => {
|
|
|
166
265
|
},
|
|
167
266
|
allowPositionals: false
|
|
168
267
|
});
|
|
169
|
-
|
|
170
|
-
return fail('cave export: --db <path> is required\n');
|
|
171
|
-
}
|
|
172
|
-
const store = open(values.db, values['no-prelude'] === true ? { registry: Registry.empty } : {});
|
|
268
|
+
const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {});
|
|
173
269
|
try {
|
|
174
270
|
const text = store.exportText({ current: values.current === true });
|
|
175
271
|
if (values.out === undefined) {
|
|
@@ -184,11 +280,33 @@ export const exportCommand = (argv) => {
|
|
|
184
280
|
}
|
|
185
281
|
};
|
|
186
282
|
export const demoCommand = () => ok(`${Demo.run().lines.join('\n')}\n`);
|
|
283
|
+
export const versionCommand = () => ok(`${Version.current()}\n`);
|
|
284
|
+
/** `cave help [command]` — the overview, or one command's help text. */
|
|
285
|
+
export const helpCommand = (argv) => {
|
|
286
|
+
const [topic] = argv;
|
|
287
|
+
if (topic === undefined) {
|
|
288
|
+
return ok(`${usage}\n`);
|
|
289
|
+
}
|
|
290
|
+
const text = commandHelp[topic === 'q' ? 'query' : topic];
|
|
291
|
+
if (text !== undefined) {
|
|
292
|
+
return ok(`${text}\n`);
|
|
293
|
+
}
|
|
294
|
+
// mcp and ingest own their help (main.ts forwards `help X` to `X --help`).
|
|
295
|
+
if (topic === 'mcp' || topic === 'ingest') {
|
|
296
|
+
return ok(`see: cave ${topic} --help\n`);
|
|
297
|
+
}
|
|
298
|
+
return fail(`cave help: unknown command ${JSON.stringify(topic)}\n\n${usage}\n`, 2);
|
|
299
|
+
};
|
|
187
300
|
/** Dispatches one invocation. */
|
|
188
301
|
export const cave = (argv) => {
|
|
189
302
|
const [command, ...rest] = argv;
|
|
303
|
+
const canonical = command === 'q' ? 'query' : command;
|
|
190
304
|
try {
|
|
191
|
-
|
|
305
|
+
if (canonical !== undefined && canonical in commandHelp &&
|
|
306
|
+
(rest.includes('--help') || rest.includes('-h'))) {
|
|
307
|
+
return ok(`${commandHelp[canonical]}\n`);
|
|
308
|
+
}
|
|
309
|
+
switch (canonical) {
|
|
192
310
|
case 'parse':
|
|
193
311
|
return parseCommand(rest);
|
|
194
312
|
case 'add':
|
|
@@ -196,14 +314,18 @@ export const cave = (argv) => {
|
|
|
196
314
|
case 'import':
|
|
197
315
|
return importCommand(rest);
|
|
198
316
|
case 'query':
|
|
199
|
-
case 'q':
|
|
200
317
|
return queryCommand(rest);
|
|
201
318
|
case 'export':
|
|
202
319
|
return exportCommand(rest);
|
|
203
320
|
case 'demo':
|
|
204
321
|
return demoCommand();
|
|
205
|
-
case
|
|
322
|
+
case 'version':
|
|
323
|
+
case '--version':
|
|
324
|
+
case '-v':
|
|
325
|
+
return versionCommand();
|
|
206
326
|
case 'help':
|
|
327
|
+
return helpCommand(rest);
|
|
328
|
+
case undefined:
|
|
207
329
|
case '--help':
|
|
208
330
|
case '-h':
|
|
209
331
|
return ok(`${usage}\n`);
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* `@cavelang/cli` — the `cave` command (parse / add / query / export / demo).
|
|
3
3
|
* Programmatic access to the same implementations lives here.
|
|
4
4
|
*/
|
|
5
|
-
export { addCommand, cave, demoCommand, exportCommand, importCommand, parseCommand, queryCommand, usage } from './cli.ts';
|
|
5
|
+
export { addCommand, cave, commandHelp, demoCommand, exportCommand, helpCommand, importCommand, parseCommand, queryCommand, usage, versionCommand } from './cli.ts';
|
|
6
6
|
export type { Output } from './cli.ts';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACnK,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/src/index.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* `@cavelang/cli` — the `cave` command (parse / add / query / export / demo).
|
|
3
3
|
* Programmatic access to the same implementations lives here.
|
|
4
4
|
*/
|
|
5
|
-
export { addCommand, cave, demoCommand, exportCommand, importCommand, parseCommand, queryCommand, usage } from "./cli.js";
|
|
5
|
+
export { addCommand, cave, commandHelp, demoCommand, exportCommand, helpCommand, importCommand, parseCommand, queryCommand, usage, versionCommand } from "./cli.js";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
|
package/dist/src/main.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/** `cave` binary entry point — see `cli.ts` for the command implementations. */
|
|
3
3
|
import { cave } from "./cli.js";
|
|
4
|
-
|
|
4
|
+
// mcp and ingest own their help text, so `cave help X` becomes `cave X --help`.
|
|
5
|
+
const raw = process.argv.slice(2);
|
|
6
|
+
const argv = raw[0] === 'help' && (raw[1] === 'mcp' || raw[1] === 'ingest') ?
|
|
7
|
+
[raw[1], '--help'] :
|
|
8
|
+
raw;
|
|
5
9
|
if (argv[0] === 'mcp') {
|
|
6
10
|
// Long-running: serves MCP on stdio until the client disconnects.
|
|
7
11
|
const { runMcp } = await import('@cavelang/mcp');
|
package/dist/src/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AACA,gFAAgF;AAEhF,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,MAAM,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AACA,gFAAgF;AAEhF,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,gFAAgF;AAChF,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACjC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;IAC3E,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpB,GAAG,CAAA;AACL,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;IACtB,kEAAkE;IAClE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAA;IAChD,OAAO,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAChD,CAAC;KAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;IAChC,2DAA2D;IAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAA;IACtD,OAAO,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACnD,CAAC;KAAM,CAAC;IACN,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IACD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;AACzB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cavelang/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "cave — CLI for parsing, storing, querying and exporting CAVE knowledge.",
|
|
6
6
|
"license": "CC0-1.0",
|
|
@@ -39,14 +39,14 @@
|
|
|
39
39
|
"access": "public"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@cavelang/
|
|
43
|
-
"@cavelang/
|
|
44
|
-
"@cavelang/ingest": "0.
|
|
45
|
-
"@cavelang/
|
|
46
|
-
"@cavelang/
|
|
47
|
-
"@cavelang/parser": "0.
|
|
48
|
-
"@cavelang/
|
|
49
|
-
"@cavelang/
|
|
42
|
+
"@cavelang/core": "0.4.0",
|
|
43
|
+
"@cavelang/canonical": "0.4.0",
|
|
44
|
+
"@cavelang/ingest": "0.4.0",
|
|
45
|
+
"@cavelang/loop": "0.4.0",
|
|
46
|
+
"@cavelang/mcp": "0.4.0",
|
|
47
|
+
"@cavelang/parser": "0.4.0",
|
|
48
|
+
"@cavelang/query": "0.4.0",
|
|
49
|
+
"@cavelang/store": "0.4.0"
|
|
50
50
|
},
|
|
51
51
|
"scripts": {
|
|
52
52
|
"build": "tsc -b",
|
package/src/cli.ts
CHANGED
|
@@ -6,19 +6,23 @@
|
|
|
6
6
|
* Commands:
|
|
7
7
|
*
|
|
8
8
|
* - `cave parse [file]` — lint / dump the AST (`--json`)
|
|
9
|
-
* - `cave add [
|
|
10
|
-
* - `cave query '<pattern>'
|
|
11
|
-
* - `cave export --db <path
|
|
9
|
+
* - `cave add [--db <path>] [file…]` — ingest into a store (`--strict`)
|
|
10
|
+
* - `cave query [--db <path>] '<pattern>'` — CAVE-Q (`--json`, `--all`)
|
|
11
|
+
* - `cave export [--db <path>]` — canonical text out (`--current`)
|
|
12
12
|
* - `cave demo` — the cave-loop multi-hop recovery demo
|
|
13
|
+
* - `cave version` — print the cave version
|
|
14
|
+
* - `cave help [command]` — overview, or one command's help
|
|
13
15
|
*
|
|
14
|
-
* `file` defaults to stdin (`-`)
|
|
16
|
+
* `file` defaults to stdin (`-`); `--db` defaults to `$CAVE_DB`, then
|
|
17
|
+
* `cave.db`. Every command answers `--help` with options and examples.
|
|
15
18
|
*/
|
|
16
19
|
|
|
17
20
|
import { readFileSync, writeFileSync } from 'node:fs'
|
|
18
21
|
import { parseArgs } from 'node:util'
|
|
22
|
+
import { Version } from '@cavelang/core'
|
|
19
23
|
import { parseDocument } from '@cavelang/parser'
|
|
20
24
|
import { Registry, standardRegistry } from '@cavelang/canonical'
|
|
21
|
-
import { open } from '@cavelang/store'
|
|
25
|
+
import { defaultDbPath, open } from '@cavelang/store'
|
|
22
26
|
import { query as caveQuery } from '@cavelang/query'
|
|
23
27
|
import { Demo } from '@cavelang/loop'
|
|
24
28
|
|
|
@@ -37,18 +41,127 @@ const fail = (err: string, code = 1): Output =>
|
|
|
37
41
|
export const usage = `cave — Compressed Atomic Verb Expressions
|
|
38
42
|
|
|
39
43
|
Usage:
|
|
40
|
-
cave parse [file] [--json]
|
|
41
|
-
cave add [
|
|
42
|
-
cave import [
|
|
43
|
-
cave query
|
|
44
|
-
cave export --db <path> [--out <file>] emit canonical CAVE text [--current] [--no-prelude]
|
|
45
|
-
cave mcp --db <path> serve the engine as an MCP server on stdio [--no-prelude]
|
|
46
|
-
cave ingest
|
|
47
|
-
cave demo
|
|
48
|
-
cave
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
cave parse [file...] [--json] lint CAVE text (stdin when no file)
|
|
45
|
+
cave add [--db <path>] [file...] ingest into a store [--strict] [--no-prelude]
|
|
46
|
+
cave import [--db <path>] [file...] restore/merge from CAVE text (same as add)
|
|
47
|
+
cave query [--db <path>] <pattern> run a CAVE-Q pattern [--json] [--all] [--no-prelude]
|
|
48
|
+
cave export [--db <path>] [--out <file>] emit canonical CAVE text [--current] [--no-prelude]
|
|
49
|
+
cave mcp [--db <path>] serve the engine as an MCP server on stdio [--no-prelude]
|
|
50
|
+
cave ingest [--db <path>] <globs/urls..> LLM-driven ingestion of files and web pages
|
|
51
|
+
cave demo run the cave-loop reconstruction demo
|
|
52
|
+
cave version print the cave version
|
|
53
|
+
cave help [command] this text, or one command's options and examples
|
|
54
|
+
|
|
55
|
+
Every command answers --help. --db defaults to $CAVE_DB, or cave.db in
|
|
56
|
+
the current directory. The spec lives in the .claude/skills/ directory at
|
|
57
|
+
the repository root (section index in README.md).`
|
|
58
|
+
|
|
59
|
+
const dbHelp = `--db <path> database file (default: $CAVE_DB, or cave.db)`
|
|
60
|
+
|
|
61
|
+
/** Per-command help, printed for \`cave <command> --help\` and \`cave help <command>\`. */
|
|
62
|
+
export const commandHelp: Record<string, string> = {
|
|
63
|
+
parse: `cave parse — lint CAVE text, or dump the parsed document
|
|
64
|
+
|
|
65
|
+
Usage:
|
|
66
|
+
cave parse [file...] [--json]
|
|
67
|
+
|
|
68
|
+
Options:
|
|
69
|
+
--json dump the parsed document as JSON instead of a summary
|
|
70
|
+
|
|
71
|
+
Reads stdin when no file (or \`-\`) is given. Exits 1 when the text has
|
|
72
|
+
diagnostics, printing them one per line to stderr.
|
|
73
|
+
|
|
74
|
+
Examples:
|
|
75
|
+
cave parse notes.cave
|
|
76
|
+
echo 'auth USES jwt @ 90%' | cave parse
|
|
77
|
+
cave parse notes.cave --json | jq '.lines[0]'`,
|
|
78
|
+
|
|
79
|
+
add: `cave add — ingest CAVE text into a knowledge database
|
|
80
|
+
|
|
81
|
+
Usage:
|
|
82
|
+
cave add [--db <path>] [file...] [--strict] [--no-prelude]
|
|
83
|
+
|
|
84
|
+
Options:
|
|
85
|
+
${dbHelp}
|
|
86
|
+
--strict reject the whole ingest on any problem
|
|
87
|
+
--no-prelude open the store without the standard verb registry
|
|
88
|
+
|
|
89
|
+
Reads stdin when no file (or \`-\`) is given.
|
|
90
|
+
|
|
91
|
+
Examples:
|
|
92
|
+
cave add --db k.db notes.cave
|
|
93
|
+
echo 'auth USES jwt @ 90%' | cave add
|
|
94
|
+
cave add --db k.db --strict reviewed.cave`,
|
|
95
|
+
|
|
96
|
+
import: `cave import — restore/merge a database from CAVE text (same as add)
|
|
97
|
+
|
|
98
|
+
Usage:
|
|
99
|
+
cave import [--db <path>] [file...] [--strict] [--no-prelude]
|
|
100
|
+
|
|
101
|
+
Options:
|
|
102
|
+
${dbHelp}
|
|
103
|
+
--strict reject the whole import on any problem
|
|
104
|
+
--no-prelude open the store without the standard verb registry
|
|
105
|
+
|
|
106
|
+
Canonical CAVE text is the interchange format (spec §2.2): importing a
|
|
107
|
+
file written by \`cave export\` replays its claims append-only, preserving
|
|
108
|
+
the belief series, qualifier edges and in-band declarations.
|
|
109
|
+
|
|
110
|
+
Examples:
|
|
111
|
+
cave export --db old.db --out backup.cave
|
|
112
|
+
cave import --db new.db backup.cave`,
|
|
113
|
+
|
|
114
|
+
query: `cave query — run a CAVE-Q pattern against a store
|
|
115
|
+
|
|
116
|
+
Usage:
|
|
117
|
+
cave query [--db <path>] <pattern> [WHERE <filter>] [--json] [--all] [--no-prelude]
|
|
118
|
+
|
|
119
|
+
Options:
|
|
120
|
+
${dbHelp}
|
|
121
|
+
--json emit matches as JSON
|
|
122
|
+
--all match all beliefs, not just current ones
|
|
123
|
+
--no-prelude open the store without the standard verb registry
|
|
124
|
+
|
|
125
|
+
Patterns are claim triples with ?variables and optional metadata filters
|
|
126
|
+
(spec §12). A second positional starting with WHERE filters on conf,
|
|
127
|
+
value or tx.
|
|
128
|
+
|
|
129
|
+
Examples:
|
|
130
|
+
cave query '?x USES jwt'
|
|
131
|
+
cave query --db k.db '?x HAS bug: ?bug #security'
|
|
132
|
+
cave query --db k.db '?cause CAUSE app/crash' 'WHERE conf >= 0.5'
|
|
133
|
+
cave query --db k.db 'terrier EXTENDS+ animal'
|
|
134
|
+
cave query --db k.db '?x ?verb ?y @production' --json`,
|
|
135
|
+
|
|
136
|
+
export: `cave export — emit canonical CAVE text from a store
|
|
137
|
+
|
|
138
|
+
Usage:
|
|
139
|
+
cave export [--db <path>] [--out <file>] [--current] [--no-prelude]
|
|
140
|
+
|
|
141
|
+
Options:
|
|
142
|
+
${dbHelp}
|
|
143
|
+
--out <file> write to a file instead of stdout
|
|
144
|
+
--current current beliefs only (skip superseded rows)
|
|
145
|
+
--no-prelude open the store without the standard verb registry
|
|
146
|
+
|
|
147
|
+
Examples:
|
|
148
|
+
cave export --db k.db
|
|
149
|
+
cave export --db k.db --out backup.cave
|
|
150
|
+
cave export --db k.db --current --out snapshot.cave`,
|
|
151
|
+
|
|
152
|
+
demo: `cave demo — run the cave-loop multi-hop reconstruction demo
|
|
153
|
+
|
|
154
|
+
Usage:
|
|
155
|
+
cave demo
|
|
156
|
+
|
|
157
|
+
Narrates the spec §18 recovery: seed cues expand symptom → cause →
|
|
158
|
+
topic → fix over a small in-memory store.`,
|
|
159
|
+
|
|
160
|
+
version: `cave version — print the cave version
|
|
161
|
+
|
|
162
|
+
Usage:
|
|
163
|
+
cave version`
|
|
164
|
+
}
|
|
52
165
|
|
|
53
166
|
const readInput = (files: readonly string[]): string =>
|
|
54
167
|
files.length === 0 || (files.length === 1 && files[0] === '-') ?
|
|
@@ -92,11 +205,8 @@ const ingestCommand = (name: string) => (argv: readonly string[]): Output => {
|
|
|
92
205
|
},
|
|
93
206
|
allowPositionals: true
|
|
94
207
|
})
|
|
95
|
-
if (values.db === undefined) {
|
|
96
|
-
return fail(`cave ${name}: --db <path> is required\n`)
|
|
97
|
-
}
|
|
98
208
|
const input = readInput(positionals)
|
|
99
|
-
const store = open(values.db, values['no-prelude'] === true ? { registry: Registry.empty } : {})
|
|
209
|
+
const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {})
|
|
100
210
|
try {
|
|
101
211
|
const result = store.ingest(input, { strict: values.strict === true })
|
|
102
212
|
const problems = result.problems
|
|
@@ -139,14 +249,11 @@ export const queryCommand = (argv: readonly string[]): Output => {
|
|
|
139
249
|
},
|
|
140
250
|
allowPositionals: true
|
|
141
251
|
})
|
|
142
|
-
if (values.db === undefined) {
|
|
143
|
-
return fail('cave query: --db <path> is required\n')
|
|
144
|
-
}
|
|
145
252
|
if (positionals.length === 0) {
|
|
146
253
|
return fail('cave query: a pattern is required (spec §12.1)\n')
|
|
147
254
|
}
|
|
148
255
|
const pattern = positionals.join('\n')
|
|
149
|
-
const store = open(values.db, values['no-prelude'] === true ? { registry: Registry.empty } : {})
|
|
256
|
+
const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {})
|
|
150
257
|
try {
|
|
151
258
|
const matches = caveQuery(store, pattern, { all: values.all === true })
|
|
152
259
|
if (values.json === true) {
|
|
@@ -182,10 +289,7 @@ export const exportCommand = (argv: readonly string[]): Output => {
|
|
|
182
289
|
},
|
|
183
290
|
allowPositionals: false
|
|
184
291
|
})
|
|
185
|
-
|
|
186
|
-
return fail('cave export: --db <path> is required\n')
|
|
187
|
-
}
|
|
188
|
-
const store = open(values.db, values['no-prelude'] === true ? { registry: Registry.empty } : {})
|
|
292
|
+
const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {})
|
|
189
293
|
try {
|
|
190
294
|
const text = store.exportText({ current: values.current === true })
|
|
191
295
|
if (values.out === undefined) {
|
|
@@ -202,11 +306,36 @@ export const exportCommand = (argv: readonly string[]): Output => {
|
|
|
202
306
|
export const demoCommand = (): Output =>
|
|
203
307
|
ok(`${Demo.run().lines.join('\n')}\n`)
|
|
204
308
|
|
|
309
|
+
export const versionCommand = (): Output =>
|
|
310
|
+
ok(`${Version.current()}\n`)
|
|
311
|
+
|
|
312
|
+
/** `cave help [command]` — the overview, or one command's help text. */
|
|
313
|
+
export const helpCommand = (argv: readonly string[]): Output => {
|
|
314
|
+
const [topic] = argv
|
|
315
|
+
if (topic === undefined) {
|
|
316
|
+
return ok(`${usage}\n`)
|
|
317
|
+
}
|
|
318
|
+
const text = commandHelp[topic === 'q' ? 'query' : topic]
|
|
319
|
+
if (text !== undefined) {
|
|
320
|
+
return ok(`${text}\n`)
|
|
321
|
+
}
|
|
322
|
+
// mcp and ingest own their help (main.ts forwards `help X` to `X --help`).
|
|
323
|
+
if (topic === 'mcp' || topic === 'ingest') {
|
|
324
|
+
return ok(`see: cave ${topic} --help\n`)
|
|
325
|
+
}
|
|
326
|
+
return fail(`cave help: unknown command ${JSON.stringify(topic)}\n\n${usage}\n`, 2)
|
|
327
|
+
}
|
|
328
|
+
|
|
205
329
|
/** Dispatches one invocation. */
|
|
206
330
|
export const cave = (argv: readonly string[]): Output => {
|
|
207
331
|
const [command, ...rest] = argv
|
|
332
|
+
const canonical = command === 'q' ? 'query' : command
|
|
208
333
|
try {
|
|
209
|
-
|
|
334
|
+
if (canonical !== undefined && canonical in commandHelp &&
|
|
335
|
+
(rest.includes('--help') || rest.includes('-h'))) {
|
|
336
|
+
return ok(`${commandHelp[canonical]}\n`)
|
|
337
|
+
}
|
|
338
|
+
switch (canonical) {
|
|
210
339
|
case 'parse':
|
|
211
340
|
return parseCommand(rest)
|
|
212
341
|
case 'add':
|
|
@@ -214,14 +343,18 @@ export const cave = (argv: readonly string[]): Output => {
|
|
|
214
343
|
case 'import':
|
|
215
344
|
return importCommand(rest)
|
|
216
345
|
case 'query':
|
|
217
|
-
case 'q':
|
|
218
346
|
return queryCommand(rest)
|
|
219
347
|
case 'export':
|
|
220
348
|
return exportCommand(rest)
|
|
221
349
|
case 'demo':
|
|
222
350
|
return demoCommand()
|
|
223
|
-
case
|
|
351
|
+
case 'version':
|
|
352
|
+
case '--version':
|
|
353
|
+
case '-v':
|
|
354
|
+
return versionCommand()
|
|
224
355
|
case 'help':
|
|
356
|
+
return helpCommand(rest)
|
|
357
|
+
case undefined:
|
|
225
358
|
case '--help':
|
|
226
359
|
case '-h':
|
|
227
360
|
return ok(`${usage}\n`)
|
package/src/index.ts
CHANGED
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* Programmatic access to the same implementations lives here.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export { addCommand, cave, demoCommand, exportCommand, importCommand, parseCommand, queryCommand, usage } from './cli.ts'
|
|
6
|
+
export { addCommand, cave, commandHelp, demoCommand, exportCommand, helpCommand, importCommand, parseCommand, queryCommand, usage, versionCommand } from './cli.ts'
|
|
7
7
|
export type { Output } from './cli.ts'
|
package/src/main.ts
CHANGED
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
|
|
4
4
|
import { cave } from './cli.ts'
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
// mcp and ingest own their help text, so `cave help X` becomes `cave X --help`.
|
|
7
|
+
const raw = process.argv.slice(2)
|
|
8
|
+
const argv = raw[0] === 'help' && (raw[1] === 'mcp' || raw[1] === 'ingest') ?
|
|
9
|
+
[raw[1], '--help'] :
|
|
10
|
+
raw
|
|
7
11
|
if (argv[0] === 'mcp') {
|
|
8
12
|
// Long-running: serves MCP on stdio until the client disconnects.
|
|
9
13
|
const { runMcp } = await import('@cavelang/mcp')
|