@cavelang/cli 0.3.0 → 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 +11 -5
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +148 -51
- 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 +158 -53
- 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,20 +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
13
|
* - `cave version` — print the cave version
|
|
14
|
+
* - `cave help [command]` — overview, or one command's help
|
|
14
15
|
*
|
|
15
|
-
* `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.
|
|
16
18
|
*/
|
|
17
19
|
export type Output = {
|
|
18
20
|
readonly code: number;
|
|
19
21
|
readonly out: string;
|
|
20
22
|
readonly err: string;
|
|
21
23
|
};
|
|
22
|
-
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>;
|
|
23
27
|
export declare const parseCommand: (argv: readonly string[]) => Output;
|
|
24
28
|
export declare const addCommand: (argv: readonly string[]) => Output;
|
|
25
29
|
/**
|
|
@@ -37,6 +41,8 @@ export declare const queryCommand: (argv: readonly string[]) => Output;
|
|
|
37
41
|
export declare const exportCommand: (argv: readonly string[]) => Output;
|
|
38
42
|
export declare const demoCommand: () => Output;
|
|
39
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;
|
|
40
46
|
/** Dispatches one invocation. */
|
|
41
47
|
export declare const cave: (argv: readonly string[]) => Output;
|
|
42
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,21 +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
13
|
* - `cave version` — print the cave version
|
|
14
|
+
* - `cave help [command]` — overview, or one command's help
|
|
14
15
|
*
|
|
15
|
-
* `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.
|
|
16
18
|
*/
|
|
17
|
-
import {
|
|
18
|
-
import { dirname, join } from 'node:path';
|
|
19
|
-
import { fileURLToPath } from 'node:url';
|
|
19
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
20
20
|
import { parseArgs } from 'node:util';
|
|
21
|
+
import { Version } from '@cavelang/core';
|
|
21
22
|
import { parseDocument } from '@cavelang/parser';
|
|
22
23
|
import { Registry, standardRegistry } from '@cavelang/canonical';
|
|
23
|
-
import { open } from '@cavelang/store';
|
|
24
|
+
import { defaultDbPath, open } from '@cavelang/store';
|
|
24
25
|
import { query as caveQuery } from '@cavelang/query';
|
|
25
26
|
import { Demo } from '@cavelang/loop';
|
|
26
27
|
const ok = (out) => ({ code: 0, out, err: '' });
|
|
@@ -28,19 +29,119 @@ const fail = (err, code = 1) => ({ code, out: '', err });
|
|
|
28
29
|
export const usage = `cave — Compressed Atomic Verb Expressions
|
|
29
30
|
|
|
30
31
|
Usage:
|
|
31
|
-
cave parse [file] [--json]
|
|
32
|
-
cave add [
|
|
33
|
-
cave import [
|
|
34
|
-
cave query
|
|
35
|
-
cave export --db <path> [--out <file>] emit canonical CAVE text [--current] [--no-prelude]
|
|
36
|
-
cave mcp --db <path> serve the engine as an MCP server on stdio [--no-prelude]
|
|
37
|
-
cave ingest
|
|
38
|
-
cave demo
|
|
39
|
-
cave version
|
|
40
|
-
cave help
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
+
};
|
|
44
145
|
const readInput = (files) => files.length === 0 || (files.length === 1 && files[0] === '-') ?
|
|
45
146
|
readFileSync(0, 'utf8') :
|
|
46
147
|
files.map(file => readFileSync(file, 'utf8')).join('\n');
|
|
@@ -80,11 +181,8 @@ const ingestCommand = (name) => (argv) => {
|
|
|
80
181
|
},
|
|
81
182
|
allowPositionals: true
|
|
82
183
|
});
|
|
83
|
-
if (values.db === undefined) {
|
|
84
|
-
return fail(`cave ${name}: --db <path> is required\n`);
|
|
85
|
-
}
|
|
86
184
|
const input = readInput(positionals);
|
|
87
|
-
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 } : {});
|
|
88
186
|
try {
|
|
89
187
|
const result = store.ingest(input, { strict: values.strict === true });
|
|
90
188
|
const problems = result.problems
|
|
@@ -126,14 +224,11 @@ export const queryCommand = (argv) => {
|
|
|
126
224
|
},
|
|
127
225
|
allowPositionals: true
|
|
128
226
|
});
|
|
129
|
-
if (values.db === undefined) {
|
|
130
|
-
return fail('cave query: --db <path> is required\n');
|
|
131
|
-
}
|
|
132
227
|
if (positionals.length === 0) {
|
|
133
228
|
return fail('cave query: a pattern is required (spec §12.1)\n');
|
|
134
229
|
}
|
|
135
230
|
const pattern = positionals.join('\n');
|
|
136
|
-
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 } : {});
|
|
137
232
|
try {
|
|
138
233
|
const matches = caveQuery(store, pattern, { all: values.all === true });
|
|
139
234
|
if (values.json === true) {
|
|
@@ -170,10 +265,7 @@ export const exportCommand = (argv) => {
|
|
|
170
265
|
},
|
|
171
266
|
allowPositionals: false
|
|
172
267
|
});
|
|
173
|
-
|
|
174
|
-
return fail('cave export: --db <path> is required\n');
|
|
175
|
-
}
|
|
176
|
-
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 } : {});
|
|
177
269
|
try {
|
|
178
270
|
const text = store.exportText({ current: values.current === true });
|
|
179
271
|
if (values.out === undefined) {
|
|
@@ -188,28 +280,33 @@ export const exportCommand = (argv) => {
|
|
|
188
280
|
}
|
|
189
281
|
};
|
|
190
282
|
export const demoCommand = () => ok(`${Demo.run().lines.join('\n')}\n`);
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
for (let dir = dirname(fileURLToPath(import.meta.url));; dir = dirname(dir)) {
|
|
198
|
-
const candidate = join(dir, 'package.json');
|
|
199
|
-
if (existsSync(candidate)) {
|
|
200
|
-
return JSON.parse(readFileSync(candidate, 'utf8')).version;
|
|
201
|
-
}
|
|
202
|
-
if (dir === dirname(dir)) {
|
|
203
|
-
return 'unknown';
|
|
204
|
-
}
|
|
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`);
|
|
205
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);
|
|
206
299
|
};
|
|
207
|
-
export const versionCommand = () => ok(`${packageVersion()}\n`);
|
|
208
300
|
/** Dispatches one invocation. */
|
|
209
301
|
export const cave = (argv) => {
|
|
210
302
|
const [command, ...rest] = argv;
|
|
303
|
+
const canonical = command === 'q' ? 'query' : command;
|
|
211
304
|
try {
|
|
212
|
-
|
|
305
|
+
if (canonical !== undefined && canonical in commandHelp &&
|
|
306
|
+
(rest.includes('--help') || rest.includes('-h'))) {
|
|
307
|
+
return ok(`${commandHelp[canonical]}\n`);
|
|
308
|
+
}
|
|
309
|
+
switch (canonical) {
|
|
213
310
|
case 'parse':
|
|
214
311
|
return parseCommand(rest);
|
|
215
312
|
case 'add':
|
|
@@ -217,7 +314,6 @@ export const cave = (argv) => {
|
|
|
217
314
|
case 'import':
|
|
218
315
|
return importCommand(rest);
|
|
219
316
|
case 'query':
|
|
220
|
-
case 'q':
|
|
221
317
|
return queryCommand(rest);
|
|
222
318
|
case 'export':
|
|
223
319
|
return exportCommand(rest);
|
|
@@ -227,8 +323,9 @@ export const cave = (argv) => {
|
|
|
227
323
|
case '--version':
|
|
228
324
|
case '-v':
|
|
229
325
|
return versionCommand();
|
|
230
|
-
case undefined:
|
|
231
326
|
case 'help':
|
|
327
|
+
return helpCommand(rest);
|
|
328
|
+
case undefined:
|
|
232
329
|
case '--help':
|
|
233
330
|
case '-h':
|
|
234
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, versionCommand } 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,cAAc,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, versionCommand } 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,cAAc,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/
|
|
45
|
-
"@cavelang/
|
|
46
|
-
"@cavelang/
|
|
47
|
-
"@cavelang/
|
|
48
|
-
"@cavelang/
|
|
49
|
-
"@cavelang/store": "0.
|
|
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,22 +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
13
|
* - `cave version` — print the cave version
|
|
14
|
+
* - `cave help [command]` — overview, or one command's help
|
|
14
15
|
*
|
|
15
|
-
* `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.
|
|
16
18
|
*/
|
|
17
19
|
|
|
18
|
-
import {
|
|
19
|
-
import { dirname, join } from 'node:path'
|
|
20
|
-
import { fileURLToPath } from 'node:url'
|
|
20
|
+
import { readFileSync, writeFileSync } from 'node:fs'
|
|
21
21
|
import { parseArgs } from 'node:util'
|
|
22
|
+
import { Version } from '@cavelang/core'
|
|
22
23
|
import { parseDocument } from '@cavelang/parser'
|
|
23
24
|
import { Registry, standardRegistry } from '@cavelang/canonical'
|
|
24
|
-
import { open } from '@cavelang/store'
|
|
25
|
+
import { defaultDbPath, open } from '@cavelang/store'
|
|
25
26
|
import { query as caveQuery } from '@cavelang/query'
|
|
26
27
|
import { Demo } from '@cavelang/loop'
|
|
27
28
|
|
|
@@ -40,19 +41,127 @@ const fail = (err: string, code = 1): Output =>
|
|
|
40
41
|
export const usage = `cave — Compressed Atomic Verb Expressions
|
|
41
42
|
|
|
42
43
|
Usage:
|
|
43
|
-
cave parse [file] [--json]
|
|
44
|
-
cave add [
|
|
45
|
-
cave import [
|
|
46
|
-
cave query
|
|
47
|
-
cave export --db <path> [--out <file>] emit canonical CAVE text [--current] [--no-prelude]
|
|
48
|
-
cave mcp --db <path> serve the engine as an MCP server on stdio [--no-prelude]
|
|
49
|
-
cave ingest
|
|
50
|
-
cave demo
|
|
51
|
-
cave version
|
|
52
|
-
cave help
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
+
}
|
|
56
165
|
|
|
57
166
|
const readInput = (files: readonly string[]): string =>
|
|
58
167
|
files.length === 0 || (files.length === 1 && files[0] === '-') ?
|
|
@@ -96,11 +205,8 @@ const ingestCommand = (name: string) => (argv: readonly string[]): Output => {
|
|
|
96
205
|
},
|
|
97
206
|
allowPositionals: true
|
|
98
207
|
})
|
|
99
|
-
if (values.db === undefined) {
|
|
100
|
-
return fail(`cave ${name}: --db <path> is required\n`)
|
|
101
|
-
}
|
|
102
208
|
const input = readInput(positionals)
|
|
103
|
-
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 } : {})
|
|
104
210
|
try {
|
|
105
211
|
const result = store.ingest(input, { strict: values.strict === true })
|
|
106
212
|
const problems = result.problems
|
|
@@ -143,14 +249,11 @@ export const queryCommand = (argv: readonly string[]): Output => {
|
|
|
143
249
|
},
|
|
144
250
|
allowPositionals: true
|
|
145
251
|
})
|
|
146
|
-
if (values.db === undefined) {
|
|
147
|
-
return fail('cave query: --db <path> is required\n')
|
|
148
|
-
}
|
|
149
252
|
if (positionals.length === 0) {
|
|
150
253
|
return fail('cave query: a pattern is required (spec §12.1)\n')
|
|
151
254
|
}
|
|
152
255
|
const pattern = positionals.join('\n')
|
|
153
|
-
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 } : {})
|
|
154
257
|
try {
|
|
155
258
|
const matches = caveQuery(store, pattern, { all: values.all === true })
|
|
156
259
|
if (values.json === true) {
|
|
@@ -186,10 +289,7 @@ export const exportCommand = (argv: readonly string[]): Output => {
|
|
|
186
289
|
},
|
|
187
290
|
allowPositionals: false
|
|
188
291
|
})
|
|
189
|
-
|
|
190
|
-
return fail('cave export: --db <path> is required\n')
|
|
191
|
-
}
|
|
192
|
-
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 } : {})
|
|
193
293
|
try {
|
|
194
294
|
const text = store.exportText({ current: values.current === true })
|
|
195
295
|
if (values.out === undefined) {
|
|
@@ -206,31 +306,36 @@ export const exportCommand = (argv: readonly string[]): Output => {
|
|
|
206
306
|
export const demoCommand = (): Output =>
|
|
207
307
|
ok(`${Demo.run().lines.join('\n')}\n`)
|
|
208
308
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
return 'unknown'
|
|
222
|
-
}
|
|
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`)
|
|
223
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)
|
|
224
327
|
}
|
|
225
328
|
|
|
226
|
-
export const versionCommand = (): Output =>
|
|
227
|
-
ok(`${packageVersion()}\n`)
|
|
228
|
-
|
|
229
329
|
/** Dispatches one invocation. */
|
|
230
330
|
export const cave = (argv: readonly string[]): Output => {
|
|
231
331
|
const [command, ...rest] = argv
|
|
332
|
+
const canonical = command === 'q' ? 'query' : command
|
|
232
333
|
try {
|
|
233
|
-
|
|
334
|
+
if (canonical !== undefined && canonical in commandHelp &&
|
|
335
|
+
(rest.includes('--help') || rest.includes('-h'))) {
|
|
336
|
+
return ok(`${commandHelp[canonical]}\n`)
|
|
337
|
+
}
|
|
338
|
+
switch (canonical) {
|
|
234
339
|
case 'parse':
|
|
235
340
|
return parseCommand(rest)
|
|
236
341
|
case 'add':
|
|
@@ -238,7 +343,6 @@ export const cave = (argv: readonly string[]): Output => {
|
|
|
238
343
|
case 'import':
|
|
239
344
|
return importCommand(rest)
|
|
240
345
|
case 'query':
|
|
241
|
-
case 'q':
|
|
242
346
|
return queryCommand(rest)
|
|
243
347
|
case 'export':
|
|
244
348
|
return exportCommand(rest)
|
|
@@ -248,8 +352,9 @@ export const cave = (argv: readonly string[]): Output => {
|
|
|
248
352
|
case '--version':
|
|
249
353
|
case '-v':
|
|
250
354
|
return versionCommand()
|
|
251
|
-
case undefined:
|
|
252
355
|
case 'help':
|
|
356
|
+
return helpCommand(rest)
|
|
357
|
+
case undefined:
|
|
253
358
|
case '--help':
|
|
254
359
|
case '-h':
|
|
255
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, versionCommand } 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')
|