@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 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 notes.cave --db knowledge.db
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' --db knowledge.db
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' --db knowledge.db
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 [file…] --db p` | `--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. |
28
- | `import [file…] --db p` | `--strict`, `--no-prelude` | Restore/merge a database from CAVE text — same operation as `add`, because canonical text *is* the interchange format. |
29
- | `query <pattern…> --db p` | `--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`. |
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…> --db p` | 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. |
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 backup.cave --db restored.db
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 [file…] --db <path>` — ingest into a store (`--strict`)
10
- * - `cave query '<pattern>' --db <path>` — CAVE-Q (`--json`, `--all`)
11
- * - `cave export --db <path>` — canonical text out (`--current`)
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] lint CAVE text (stdin when no file)\n cave add [file...] --db <path> ingest into a store [--strict] [--no-prelude]\n cave import [file...] --db <path> restore/merge a database from CAVE text (same as add)\n cave query <pattern> --db <path> 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 <globs/urls...> --db <path> LLM-driven ingestion of files and web pages (cave ingest --help)\n cave demo run the cave-loop reconstruction demo\n cave help this text\n\nThe spec lives in the .claude/skills/ directory at the repository root\n(section index in README.md).";
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
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,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,87BAcY,CAAA;AAO9B,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAyBtD,CAAA;AAkCD,eAAO,MAAM,UAAU,SAhCwB,SAAS,MAAM,EAAE,KAAG,MAgCrB,CAAA;AAE9C;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,SA5CqB,SAAS,MAAM,EAAE,KAAG,MA4Cf,CAAA;AAEpD,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAyCtD,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MA0BvD,CAAA;AAED,eAAO,MAAM,WAAW,QAAO,MACS,CAAA;AAExC,iCAAiC;AACjC,eAAO,MAAM,IAAI,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MA4B9C,CAAA"}
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 [file…] --db <path>` — ingest into a store (`--strict`)
10
- * - `cave query '<pattern>' --db <path>` — CAVE-Q (`--json`, `--all`)
11
- * - `cave export --db <path>` — canonical text out (`--current`)
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] lint CAVE text (stdin when no file)
29
- cave add [file...] --db <path> ingest into a store [--strict] [--no-prelude]
30
- cave import [file...] --db <path> restore/merge a database from CAVE text (same as add)
31
- cave query <pattern> --db <path> run a CAVE-Q pattern [--json] [--all] [--no-prelude]
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 <globs/urls...> --db <path> LLM-driven ingestion of files and web pages (cave ingest --help)
35
- cave demo run the cave-loop reconstruction demo
36
- cave help this text
37
-
38
- The spec lives in the .claude/skills/ directory at the repository root
39
- (section index in README.md).`;
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
- if (values.db === undefined) {
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
- switch (command) {
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 undefined:
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`);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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;AACzH,YAAY,EAAE,MAAM,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
@@ -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
- const argv = process.argv.slice(2);
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');
@@ -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,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,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"}
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.2.1",
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/canonical": "0.2.1",
43
- "@cavelang/core": "0.2.1",
44
- "@cavelang/ingest": "0.2.1",
45
- "@cavelang/mcp": "0.2.1",
46
- "@cavelang/loop": "0.2.1",
47
- "@cavelang/parser": "0.2.1",
48
- "@cavelang/store": "0.2.1",
49
- "@cavelang/query": "0.2.1"
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 [file…] --db <path>` — ingest into a store (`--strict`)
10
- * - `cave query '<pattern>' --db <path>` — CAVE-Q (`--json`, `--all`)
11
- * - `cave export --db <path>` — canonical text out (`--current`)
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] lint CAVE text (stdin when no file)
41
- cave add [file...] --db <path> ingest into a store [--strict] [--no-prelude]
42
- cave import [file...] --db <path> restore/merge a database from CAVE text (same as add)
43
- cave query <pattern> --db <path> run a CAVE-Q pattern [--json] [--all] [--no-prelude]
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 <globs/urls...> --db <path> LLM-driven ingestion of files and web pages (cave ingest --help)
47
- cave demo run the cave-loop reconstruction demo
48
- cave help this text
49
-
50
- The spec lives in the .claude/skills/ directory at the repository root
51
- (section index in README.md).`
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
- if (values.db === undefined) {
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
- switch (command) {
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 undefined:
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
- const argv = process.argv.slice(2)
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')