@cavelang/cli 0.5.0 → 0.12.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
@@ -28,11 +28,12 @@ Every command answers `--help` with its options and examples (also
28
28
  | Command | Flags | Behavior |
29
29
  |---|---|---|
30
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. |
31
+ | `add [--db p] [file…]` | `--strict`, `--check`, `--no-prelude`, `--no-src` | Ingest. Lenient by default (problems on stderr, valid lines land); `--strict` rolls back on any problem; `--check` is the shape gate (spec §20.3) — the append rolls back if it introduces new expectation violations; `--no-prelude` starts from an empty registry instead of the standard §5.5 pairs. Claims without a `@src:` context are stamped `@src:cli` (spec §9.5); `--no-src` opts out. |
32
+ | `import [--db p] [file…]` | `--strict`, `--no-prelude` | Restore/merge a database from CAVE text — `add` minus provenance stamping, because canonical text *is* the interchange format and replayed claims must keep their exported claim keys (spec §9.5). |
33
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
+ | `check [--db p]` | `--stale <days>`, `--json`, `--no-prelude` | Knowledge health report (spec §20, see [`@cavelang/shape`](../shape)): shape violations against in-band `EXPECTS` declarations, stale current beliefs (default horizon 90 days), review candidates (conf 0.3–0.7), alias disagreements, coverage stats. Exit 1 on violations; everything else is advisory. |
34
35
  | `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
+ | `mcp [--db p]` | `--read-only`, `--tools <list>`, `--no-prelude`, `--src <ctx>`, `--no-src` | 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. `--read-only` / `--tools <list>` narrow the served tool surface (the agent permission boundary), composing by intersection. Appends are stamped `@src:agent/<client-name>` (spec §9.5); `--src` replaces the stamp, `--no-src` disables it. |
36
37
  | `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. |
37
38
  | `demo` | | The cave-loop multi-hop recovery demo (§18). |
38
39
  | `version` | | Print the cave version. |
package/dist/src/cli.d.ts CHANGED
@@ -7,9 +7,12 @@
7
7
  *
8
8
  * - `cave parse [file]` — lint / dump the AST (`--json`)
9
9
  * - `cave highlight [file]` — ANSI syntax colors (async, routed in `main.ts`)
10
- * - `cave add [--db <path>] [file…]` — ingest into a store (`--strict`)
11
- * - `cave query [--db <path>] '<pattern>'` — CAVE-Q (`--json`, `--all`)
10
+ * - `cave add [--db <path>] [file…]` — ingest into a store (`--strict`, `--check`)
11
+ * - `cave query [--db <path>] '<pattern>'` — CAVE-Q (`--json`, `--all`, `--aliases`, `--as-of`)
12
+ * - `cave derive [--db <path>] [rules.cave…]` — fire rules (`--dry-run`, `--full`, `--list`, `--retract`)
13
+ * - `cave check [--db <path>]` — knowledge health report (`--stale`, `--json`)
12
14
  * - `cave export [--db <path>]` — canonical text out (`--current`)
15
+ * - `cave connect [--db <path>] <source>` — deterministic structured ingestion (async, routed in `main.ts`)
13
16
  * - `cave demo` — the cave-loop multi-hop recovery demo
14
17
  * - `cave version` — print the cave version
15
18
  * - `cave help [command]` — overview, or one command's help
@@ -22,7 +25,7 @@ export type Output = {
22
25
  readonly out: string;
23
26
  readonly err: string;
24
27
  };
25
- 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 highlight [file...] print CAVE text with ANSI syntax colors\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).";
28
+ 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 highlight [file...] print CAVE text with ANSI syntax colors\n cave add [--db <path>] [file...] ingest into a store [--strict] [--check] [--no-prelude] [--no-src]\n cave import [--db <path>] [file...] restore/merge from CAVE text (add without @src: stamping)\n cave query [--db <path>] <pattern> run a CAVE-Q pattern [--json] [--all] [--aliases] [--as-of <t>] [--no-prelude]\n cave derive [--db <path>] [rules.cave..] declare + fire rules (spec \u00A724) [--dry-run] [--full] [--list] [--retract <rule>]\n cave check [--db <path>] knowledge health report (spec \u00A720) [--stale <days>] [--json]\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 connect <source> --map <file> deterministic structured ingestion (CSV/JSON/SQLite/URL, spec \u00A723)\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).";
26
29
  /** Per-command help, printed for \`cave <command> --help\` and \`cave help <command>\`. */
27
30
  export declare const commandHelp: Record<string, string>;
28
31
  export declare const parseCommand: (argv: readonly string[]) => Output;
@@ -35,16 +38,20 @@ export declare const highlightCommand: (argv: readonly string[]) => Promise<Outp
35
38
  export declare const addCommand: (argv: readonly string[]) => Output;
36
39
  /**
37
40
  * `cave import` — restore/merge a knowledge database from CAVE text files.
38
- * Identical to `add` by design: canonical CAVE text *is* the interchange
41
+ * `add` minus provenance stamping: canonical CAVE text *is* the interchange
39
42
  * format (spec §2.2), so importing a file exported with `cave export`
40
- * replays its claims append-only. What the text round trip preserves:
41
- * every claim with metadata, full belief-series order (rows export in tx
42
- * order and re-ingest with fresh monotonic tx ids), qualifier/grouping
43
- * edges, and in-band registry declarations. Original tx timestamps are
44
- * re-minted — the text format carries no transaction identity.
43
+ * replays its claims append-only — and because contexts are part of claim
44
+ * identity, replay must not add a `@src:` stamp (spec §9.5). What the text
45
+ * round trip preserves: every claim with metadata, full belief-series order
46
+ * (rows export in tx order and re-ingest with fresh monotonic tx ids),
47
+ * qualifier/grouping edges, and in-band registry declarations. Original tx
48
+ * timestamps are re-minted — the text format carries no transaction
49
+ * identity.
45
50
  */
46
51
  export declare const importCommand: (argv: readonly string[]) => Output;
47
52
  export declare const queryCommand: (argv: readonly string[]) => Output;
53
+ export declare const deriveCommand: (argv: readonly string[]) => Output;
54
+ export declare const checkCommand: (argv: readonly string[]) => Output;
48
55
  export declare const exportCommand: (argv: readonly string[]) => Output;
49
56
  export declare const demoCommand: () => Output;
50
57
  export declare const versionCommand: () => Output;
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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,2sCAiBgC,CAAA;AAIlD,2FAA2F;AAC3F,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAsH9C,CAAA;AAOD,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAyBtD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAU,MAAM,SAAS,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAM9E,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"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAeH,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,6mDAoBgC,CAAA;AAIlD,2FAA2F;AAC3F,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiM9C,CAAA;AAOD,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAyBtD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAU,MAAM,SAAS,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAM9E,CAAA;AAuDD,eAAO,MAAM,UAAU,SA1CkC,SAAS,MAAM,EAAE,KAAG,MA0C/B,CAAA;AAE9C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,SAxD+B,SAAS,MAAM,EAAE,KAAG,MAwDzB,CAAA;AAEpD,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MA4CtD,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAsHvD,CAAA;AAqCD,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MA0BtD,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,MAyC9C,CAAA"}
package/dist/src/cli.js CHANGED
@@ -7,9 +7,12 @@
7
7
  *
8
8
  * - `cave parse [file]` — lint / dump the AST (`--json`)
9
9
  * - `cave highlight [file]` — ANSI syntax colors (async, routed in `main.ts`)
10
- * - `cave add [--db <path>] [file…]` — ingest into a store (`--strict`)
11
- * - `cave query [--db <path>] '<pattern>'` — CAVE-Q (`--json`, `--all`)
10
+ * - `cave add [--db <path>] [file…]` — ingest into a store (`--strict`, `--check`)
11
+ * - `cave query [--db <path>] '<pattern>'` — CAVE-Q (`--json`, `--all`, `--aliases`, `--as-of`)
12
+ * - `cave derive [--db <path>] [rules.cave…]` — fire rules (`--dry-run`, `--full`, `--list`, `--retract`)
13
+ * - `cave check [--db <path>]` — knowledge health report (`--stale`, `--json`)
12
14
  * - `cave export [--db <path>]` — canonical text out (`--current`)
15
+ * - `cave connect [--db <path>] <source>` — deterministic structured ingestion (async, routed in `main.ts`)
13
16
  * - `cave demo` — the cave-loop multi-hop recovery demo
14
17
  * - `cave version` — print the cave version
15
18
  * - `cave help [command]` — overview, or one command's help
@@ -24,6 +27,8 @@ import { parseDocument } from '@cavelang/parser';
24
27
  import { Registry, standardRegistry } from '@cavelang/canonical';
25
28
  import { defaultDbPath, open } from '@cavelang/store';
26
29
  import { query as caveQuery } from '@cavelang/query';
30
+ import { check as caveCheck, defaultStaleDays, gatedIngest } from '@cavelang/shape';
31
+ import { declareRules, defaultMaxPasses, defaultMinConf, derive, listRules, retractRule } from '@cavelang/rules';
27
32
  import { Demo } from '@cavelang/loop';
28
33
  const ok = (out) => ({ code: 0, out, err: '' });
29
34
  const fail = (err, code = 1) => ({ code, out: '', err });
@@ -32,12 +37,15 @@ export const usage = `cave — Compressed Atomic Verb Expressions
32
37
  Usage:
33
38
  cave parse [file...] [--json] lint CAVE text (stdin when no file)
34
39
  cave highlight [file...] print CAVE text with ANSI syntax colors
35
- cave add [--db <path>] [file...] ingest into a store [--strict] [--no-prelude]
36
- cave import [--db <path>] [file...] restore/merge from CAVE text (same as add)
37
- cave query [--db <path>] <pattern> run a CAVE-Q pattern [--json] [--all] [--no-prelude]
40
+ cave add [--db <path>] [file...] ingest into a store [--strict] [--check] [--no-prelude] [--no-src]
41
+ cave import [--db <path>] [file...] restore/merge from CAVE text (add without @src: stamping)
42
+ cave query [--db <path>] <pattern> run a CAVE-Q pattern [--json] [--all] [--aliases] [--as-of <t>] [--no-prelude]
43
+ cave derive [--db <path>] [rules.cave..] declare + fire rules (spec §24) [--dry-run] [--full] [--list] [--retract <rule>]
44
+ cave check [--db <path>] knowledge health report (spec §20) [--stale <days>] [--json]
38
45
  cave export [--db <path>] [--out <file>] emit canonical CAVE text [--current] [--no-prelude]
39
46
  cave mcp [--db <path>] serve the engine as an MCP server on stdio [--no-prelude]
40
47
  cave ingest [--db <path>] <globs/urls..> LLM-driven ingestion of files and web pages
48
+ cave connect <source> --map <file> deterministic structured ingestion (CSV/JSON/SQLite/URL, spec §23)
41
49
  cave demo run the cave-loop reconstruction demo
42
50
  cave version print the cave version
43
51
  cave help [command] this text, or one command's options and examples
@@ -81,20 +89,26 @@ Examples:
81
89
  add: `cave add — ingest CAVE text into a knowledge database
82
90
 
83
91
  Usage:
84
- cave add [--db <path>] [file...] [--strict] [--no-prelude]
92
+ cave add [--db <path>] [file...] [--strict] [--check] [--no-prelude] [--no-src]
85
93
 
86
94
  Options:
87
95
  ${dbHelp}
88
96
  --strict reject the whole ingest on any problem
97
+ --check shape gate (spec §20.3): roll the append back if it
98
+ introduces new expectation violations
89
99
  --no-prelude open the store without the standard verb registry
100
+ --no-src do not stamp actor provenance on appended claims
90
101
 
91
- Reads stdin when no file (or \`-\`) is given.
102
+ Reads stdin when no file (or \`-\`) is given. Claims that carry no @src:
103
+ context are stamped @src:cli (spec §9.5); use \`cave import\` to replay
104
+ exported text without stamping.
92
105
 
93
106
  Examples:
94
107
  cave add --db k.db notes.cave
95
108
  echo 'auth USES jwt @ 90%' | cave add
96
- cave add --db k.db --strict reviewed.cave`,
97
- import: `cave import — restore/merge a database from CAVE text (same as add)
109
+ cave add --db k.db --strict reviewed.cave
110
+ cave add --db k.db --check new-services.cave`,
111
+ import: `cave import — restore/merge a database from CAVE text (add without @src: stamping)
98
112
 
99
113
  Usage:
100
114
  cave import [--db <path>] [file...] [--strict] [--no-prelude]
@@ -106,7 +120,9 @@ Options:
106
120
 
107
121
  Canonical CAVE text is the interchange format (spec §2.2): importing a
108
122
  file written by \`cave export\` replays its claims append-only, preserving
109
- the belief series, qualifier edges and in-band declarations.
123
+ the belief series, qualifier edges and in-band declarations. Unlike
124
+ \`cave add\`, import never stamps actor provenance — replayed claims must
125
+ keep the claim keys they were exported with (spec §9.5).
110
126
 
111
127
  Examples:
112
128
  cave export --db old.db --out backup.cave
@@ -114,12 +130,16 @@ Examples:
114
130
  query: `cave query — run a CAVE-Q pattern against a store
115
131
 
116
132
  Usage:
117
- cave query [--db <path>] <pattern> [WHERE <filter>] [--json] [--all] [--no-prelude]
133
+ cave query [--db <path>] <pattern> [WHERE <filter>] [--json] [--all] [--aliases] [--as-of <t>] [--no-prelude]
118
134
 
119
135
  Options:
120
136
  ${dbHelp}
121
137
  --json emit matches as JSON
122
138
  --all match all beliefs, not just current ones
139
+ --aliases resolve entities through current ALIAS claims (spec §13.6)
140
+ --as-of <t> resolve beliefs as of a past moment (spec §12.3): a date
141
+ (whole day included), a timestamp (whole second), or a
142
+ transaction id — rows recorded later are invisible
123
143
  --no-prelude open the store without the standard verb registry
124
144
 
125
145
  Patterns are claim triples with ?variables and optional metadata filters
@@ -131,7 +151,68 @@ Examples:
131
151
  cave query --db k.db '?x HAS bug: ?bug #security'
132
152
  cave query --db k.db '?cause CAUSE app/crash' 'WHERE conf >= 0.5'
133
153
  cave query --db k.db 'terrier EXTENDS+ animal'
154
+ cave query --db k.db '?x USES postgres' --aliases
155
+ cave query --db k.db 'server IS compromised' --as-of 2026-01-15
134
156
  cave query --db k.db '?x ?verb ?y @production' --json`,
157
+ derive: `cave derive — declare and fire rules (spec §24)
158
+
159
+ Usage:
160
+ cave derive [--db <path>] [rules.cave...] [--dry-run] [--full] [--aliases]
161
+ [--min-conf <p>] [--max-passes <n>] [--json] [--no-prelude]
162
+ cave derive [--db <path>] --list
163
+ cave derive [--db <path>] --retract <digest|subject>
164
+
165
+ Options:
166
+ ${dbHelp}
167
+ --dry-run compute and report inside a rolled-back transaction
168
+ --full ignore stored watermarks — re-fire every rule (spec §24.4)
169
+ --aliases premises match through the alias closure (spec §13.6)
170
+ --min-conf <p> do not assert conclusions below this confidence
171
+ (0..1 or N%, default ${defaultMinConf})
172
+ --max-passes <n> fixpoint guard (default ${defaultMaxPasses})
173
+ --list print the store's current rules and exit
174
+ --retract <r> retract a rule (digest, unambiguous prefix, or subject)
175
+ together with everything it derived, and exit
176
+ --json emit the report as JSON
177
+ --no-prelude open the store without the standard verb registry
178
+
179
+ Rule files are CAVE documents whose \`premises => conclusion\` lines are
180
+ rules (spec §24.1); other lines — verb declarations the rules need — are
181
+ prelude, ingested first. Rules are stored in-band as
182
+ \`rule/<digest> HAS rule: \\\`…\\\`\` claims, so \`cave derive\` with no file
183
+ fires whatever the store already knows. Derived claims are stamped
184
+ @src:rule/<digest>, carry BECAUSE edges to their premise rows and a VIA
185
+ edge to the rule, and update append-only: re-runs are idempotent and
186
+ watermark-incremental, and conclusions whose premises no longer hold are
187
+ retracted (spec §24.2–§24.5).
188
+
189
+ Examples:
190
+ cave derive --db k.db rules.cave
191
+ cave derive --db k.db
192
+ echo '?x NEEDS ?y, ?y NEEDS ?z => ?x NEEDS ?z' | cave derive --db k.db -
193
+ cave derive --db k.db --dry-run --json
194
+ cave derive --db k.db --list
195
+ cave derive --db k.db --retract 4a0bb974f43c`,
196
+ check: `cave check — knowledge health report (spec §20)
197
+
198
+ Usage:
199
+ cave check [--db <path>] [--stale <days>] [--json] [--no-prelude]
200
+
201
+ Options:
202
+ ${dbHelp}
203
+ --stale <days> staleness horizon (default: ${defaultStaleDays})
204
+ --json emit the full report as JSON
205
+ --no-prelude open the store without the standard verb registry
206
+
207
+ Reads the store against its own in-band EXPECTS declarations (spec §20.1)
208
+ and reports shape violations, stale current beliefs, review candidates
209
+ (conf 0.3–0.7), alias disagreements (spec §13.6) and coverage stats.
210
+ Exits 1 when violations exist; everything else is advisory.
211
+
212
+ Examples:
213
+ cave check --db k.db
214
+ cave check --db k.db --stale 30
215
+ cave check --db k.db --json | jq '.violations'`,
135
216
  export: `cave export — emit canonical CAVE text from a store
136
217
 
137
218
  Usage:
@@ -200,26 +281,48 @@ export const highlightCommand = async (argv) => {
200
281
  const { ansi } = await highlighter();
201
282
  return ok(ansi(input));
202
283
  };
284
+ /**
285
+ * Shared by `add` and `import`; the difference is actor provenance
286
+ * (spec §9.5). `add` records knowledge authored now, so claims without a
287
+ * `@src:` context are stamped `@src:cli` (`--no-src` opts out); `import`
288
+ * replays interchange text, which must preserve claim keys as exported,
289
+ * so it never stamps.
290
+ */
291
+ const formatViolation = (violation) => `${violation.entity} missing ${violation.expectation.kind} ${violation.expectation.name} ` +
292
+ `(${violation.entity} IS ${violation.via}; ${violation.expectation.type} EXPECTS ${violation.expectation.name})`;
203
293
  const ingestCommand = (name) => (argv) => {
204
294
  const { values, positionals } = parseArgs({
205
295
  args: [...argv],
206
296
  options: {
207
297
  db: { type: 'string' },
208
298
  strict: { type: 'boolean' },
209
- 'no-prelude': { type: 'boolean' }
299
+ 'no-prelude': { type: 'boolean' },
300
+ ...name === 'add' ? { 'no-src': { type: 'boolean' }, check: { type: 'boolean' } } : {}
210
301
  },
211
302
  allowPositionals: true
212
303
  });
213
304
  const input = readInput(positionals);
214
305
  const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {});
215
306
  try {
216
- const result = store.ingest(input, { strict: values.strict === true });
217
- const problems = result.problems
307
+ const options = {
308
+ strict: values.strict === true,
309
+ ...name === 'add' && values['no-src'] !== true ? { source: 'cli' } : {}
310
+ };
311
+ // The shape gate (spec §20.3): append + check in one transaction,
312
+ // rolled back when the append introduces new expectation violations.
313
+ const outcome = name === 'add' && values.check === true ?
314
+ gatedIngest(store, input, options) :
315
+ { ok: true, result: store.ingest(input, options) };
316
+ if (!outcome.ok) {
317
+ const detail = outcome.violations.map(violation => ` ${formatViolation(violation)}`).join('\n');
318
+ return fail(`rejected: ${outcome.violations.length} new violation(s), nothing added (spec §20.3)\n${detail}\n`);
319
+ }
320
+ const problems = outcome.result.problems
218
321
  .map(problem => `line ${problem.line}: ${problem.message}`)
219
322
  .join('\n');
220
323
  return {
221
324
  code: 0,
222
- out: `added ${result.ids.length} claim(s), ${result.edges} edge(s)\n`,
325
+ out: `added ${outcome.result.ids.length} claim(s), ${outcome.result.edges} edge(s)\n`,
223
326
  err: problems === '' ? '' : `${problems}\n`
224
327
  };
225
328
  }
@@ -233,13 +336,15 @@ const ingestCommand = (name) => (argv) => {
233
336
  export const addCommand = ingestCommand('add');
234
337
  /**
235
338
  * `cave import` — restore/merge a knowledge database from CAVE text files.
236
- * Identical to `add` by design: canonical CAVE text *is* the interchange
339
+ * `add` minus provenance stamping: canonical CAVE text *is* the interchange
237
340
  * format (spec §2.2), so importing a file exported with `cave export`
238
- * replays its claims append-only. What the text round trip preserves:
239
- * every claim with metadata, full belief-series order (rows export in tx
240
- * order and re-ingest with fresh monotonic tx ids), qualifier/grouping
241
- * edges, and in-band registry declarations. Original tx timestamps are
242
- * re-minted — the text format carries no transaction identity.
341
+ * replays its claims append-only — and because contexts are part of claim
342
+ * identity, replay must not add a `@src:` stamp (spec §9.5). What the text
343
+ * round trip preserves: every claim with metadata, full belief-series order
344
+ * (rows export in tx order and re-ingest with fresh monotonic tx ids),
345
+ * qualifier/grouping edges, and in-band registry declarations. Original tx
346
+ * timestamps are re-minted — the text format carries no transaction
347
+ * identity.
243
348
  */
244
349
  export const importCommand = ingestCommand('import');
245
350
  export const queryCommand = (argv) => {
@@ -249,6 +354,8 @@ export const queryCommand = (argv) => {
249
354
  db: { type: 'string' },
250
355
  json: { type: 'boolean' },
251
356
  all: { type: 'boolean' },
357
+ aliases: { type: 'boolean' },
358
+ 'as-of': { type: 'string' },
252
359
  'no-prelude': { type: 'boolean' }
253
360
  },
254
361
  allowPositionals: true
@@ -259,7 +366,11 @@ export const queryCommand = (argv) => {
259
366
  const pattern = positionals.join('\n');
260
367
  const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {});
261
368
  try {
262
- const matches = caveQuery(store, pattern, { all: values.all === true });
369
+ const matches = caveQuery(store, pattern, {
370
+ all: values.all === true,
371
+ aliases: values.aliases === true,
372
+ ...values['as-of'] === undefined ? {} : { asOf: values['as-of'] }
373
+ });
263
374
  if (values.json === true) {
264
375
  return ok(`${JSON.stringify(matches, undefined, 2)}\n`);
265
376
  }
@@ -283,6 +394,186 @@ export const queryCommand = (argv) => {
283
394
  store.close();
284
395
  }
285
396
  };
397
+ export const deriveCommand = (argv) => {
398
+ const { values, positionals } = parseArgs({
399
+ args: [...argv],
400
+ options: {
401
+ db: { type: 'string' },
402
+ 'dry-run': { type: 'boolean' },
403
+ full: { type: 'boolean' },
404
+ aliases: { type: 'boolean' },
405
+ 'min-conf': { type: 'string' },
406
+ 'max-passes': { type: 'string' },
407
+ list: { type: 'boolean' },
408
+ retract: { type: 'string' },
409
+ json: { type: 'boolean' },
410
+ 'no-prelude': { type: 'boolean' }
411
+ },
412
+ allowPositionals: true
413
+ });
414
+ const minConf = values['min-conf'] === undefined ?
415
+ undefined :
416
+ values['min-conf'].endsWith('%') ? Number(values['min-conf'].slice(0, -1)) / 100 : Number(values['min-conf']);
417
+ if (minConf !== undefined && (!Number.isFinite(minConf) || minConf < 0 || minConf > 1)) {
418
+ return fail(`cave derive: --min-conf expects a confidence in 0..1 or N%, got ${JSON.stringify(values['min-conf'])}\n`);
419
+ }
420
+ const maxPasses = values['max-passes'] === undefined ? undefined : Number(values['max-passes']);
421
+ if (maxPasses !== undefined && (!Number.isInteger(maxPasses) || maxPasses < 1)) {
422
+ return fail(`cave derive: --max-passes expects a positive integer, got ${JSON.stringify(values['max-passes'])}\n`);
423
+ }
424
+ const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {});
425
+ try {
426
+ if (values.list === true) {
427
+ const rules = listRules(store);
428
+ if (values.json === true) {
429
+ return ok(`${JSON.stringify(rules, undefined, 2)}\n`);
430
+ }
431
+ if (rules.length === 0) {
432
+ return ok('no rules\n');
433
+ }
434
+ const lines = rules.map(rule => `${rule.subject} \`${rule.text}\`${rule.label === undefined ? '' : ` ; ${rule.label}`}` +
435
+ (rule.ok ? '' : `\n problems: ${rule.problems.join('; ')}`));
436
+ return ok(`${lines.join('\n')}\n`);
437
+ }
438
+ if (values.retract !== undefined) {
439
+ const outcome = retractRule(store, values.retract);
440
+ if (!outcome.ok) {
441
+ return fail(`cave derive: ${outcome.error}\n`);
442
+ }
443
+ return ok(`retracted ${outcome.subjects.join(', ')} and ${outcome.derived} derived claim(s)\n`);
444
+ }
445
+ const err = [];
446
+ const out = [];
447
+ // Unlike parse/add, no positional means "fire the stored rules", never
448
+ // stdin — pass `-` to read a rule file from stdin explicitly.
449
+ const input = positionals.length > 0 ? readInput(positionals) : undefined;
450
+ const options = {
451
+ full: values.full === true,
452
+ aliases: values.aliases === true,
453
+ ...minConf === undefined ? {} : { minConf },
454
+ ...maxPasses === undefined ? {} : { maxPasses }
455
+ };
456
+ let declaration;
457
+ let report;
458
+ if (values['dry-run'] === true) {
459
+ // A dry run persists nothing — rule declarations from the file
460
+ // included, so declare + fire share one rolled-back transaction.
461
+ const rolledBack = Symbol('cave derive --dry-run');
462
+ let outcome;
463
+ try {
464
+ store.transaction(() => {
465
+ outcome = {
466
+ ...input === undefined ? {} : { declaration: declareRules(store, input) },
467
+ report: derive(store, options)
468
+ };
469
+ throw rolledBack;
470
+ });
471
+ }
472
+ catch (error) {
473
+ if (error !== rolledBack) {
474
+ throw error;
475
+ }
476
+ }
477
+ declaration = outcome.declaration;
478
+ report = outcome.report;
479
+ }
480
+ else {
481
+ declaration = input === undefined ? undefined : declareRules(store, input);
482
+ report = derive(store, options);
483
+ }
484
+ if (declaration !== undefined) {
485
+ err.push(...declaration.problems.map(problem => `rules line ${problem.line}: ${problem.message}`));
486
+ out.push(`declared ${declaration.declared} rule(s)` +
487
+ (declaration.unchanged > 0 ? `, ${declaration.unchanged} unchanged` : '') +
488
+ (declaration.prelude > 0 ? `, +${declaration.prelude} prelude claim(s)` : ''));
489
+ }
490
+ if (values.json === true) {
491
+ return { code: report.problems.length > 0 ? 1 : 0, out: `${JSON.stringify(report, undefined, 2)}\n`, err: err.join('\n') + (err.length > 0 ? '\n' : '') };
492
+ }
493
+ for (const problem of report.problems) {
494
+ err.push(`${problem.subject}: ${problem.problems.join('; ')}`);
495
+ }
496
+ for (const rule of report.rules) {
497
+ const state = rule.fired ?
498
+ `${rule.solutions} solution(s), +${rule.appended} appended, ${rule.updated} updated, ${rule.retracted} retracted, ${rule.unchanged} unchanged` :
499
+ 'unchanged premises, skipped';
500
+ out.push(`${rule.subject}: ${state}${rule.label === undefined ? '' : ` ; ${rule.label}`}`);
501
+ err.push(...rule.problems.map(problem => `${rule.subject}: ${problem}`));
502
+ }
503
+ out.push(...report.notes.map(note => `note: ${note}`));
504
+ out.push(`derived${values['dry-run'] === true ? ' (dry run)' : ''}: ` +
505
+ `+${report.appended} appended, ${report.updated} updated, ${report.retracted} retracted, ` +
506
+ `${report.unchanged} unchanged (${report.passes} pass(es))`);
507
+ const hasProblems = report.problems.length > 0 || report.rules.some(rule => rule.problems.length > 0);
508
+ return { code: hasProblems ? 1 : 0, out: `${out.join('\n')}\n`, err: err.length === 0 ? '' : `${err.join('\n')}\n` };
509
+ }
510
+ catch (error) {
511
+ return fail(`${error instanceof Error ? error.message : String(error)}\n`);
512
+ }
513
+ finally {
514
+ store.close();
515
+ }
516
+ };
517
+ /** Text rendering of the §20.2 report: always shape + coverage, non-empty advisory sections. */
518
+ const renderReport = (report, staleDays) => {
519
+ const lines = [];
520
+ const { coverage } = report;
521
+ lines.push(`shape: ${coverage.expectations} expectation(s), ${coverage.instances} instance(s), ${coverage.satisfied}/${coverage.checks} satisfied`);
522
+ if (report.violations.length > 0) {
523
+ lines.push(`violations (${report.violations.length}):`);
524
+ lines.push(...report.violations.map(violation => ` ${formatViolation(violation)}`));
525
+ }
526
+ if (report.stale.length > 0) {
527
+ lines.push(`stale (${report.stale.length}, older than ${staleDays} day(s)):`);
528
+ lines.push(...report.stale.map(({ row, ageDays }) => ` ${row.raw_line} (${ageDays}d)`));
529
+ }
530
+ if (report.review.length > 0) {
531
+ lines.push(`review candidates (${report.review.length}, conf 0.3-0.7):`);
532
+ lines.push(...report.review.map(row => ` ${row.raw_line}`));
533
+ }
534
+ if (report.disagreements.length > 0) {
535
+ lines.push(`alias disagreements (${report.disagreements.length}):`);
536
+ for (const disagreement of report.disagreements) {
537
+ lines.push(` ${disagreement.about} across ${disagreement.entities.join(', ')}:`);
538
+ lines.push(...disagreement.rows.map(row => ` ${row.raw_line}`));
539
+ }
540
+ }
541
+ const confidence = coverage.averageConfidence === null ?
542
+ '' :
543
+ `; avg conf ${Math.round(coverage.averageConfidence * 100)}%, ${coverage.lowConfidence} low (< 0.3)`;
544
+ lines.push(`coverage: ${coverage.rows} row(s), ${coverage.facts} fact(s) — ` +
545
+ `${coverage.current} current, ${coverage.retracted} retracted, ${coverage.negated} negated` +
546
+ `${confidence}; ${coverage.entities} entities, ${coverage.typedEntities} typed`);
547
+ return `${lines.join('\n')}\n`;
548
+ };
549
+ export const checkCommand = (argv) => {
550
+ const { values } = parseArgs({
551
+ args: [...argv],
552
+ options: {
553
+ db: { type: 'string' },
554
+ stale: { type: 'string' },
555
+ json: { type: 'boolean' },
556
+ 'no-prelude': { type: 'boolean' }
557
+ },
558
+ allowPositionals: false
559
+ });
560
+ const staleDays = values.stale === undefined ? defaultStaleDays : Number(values.stale);
561
+ if (!Number.isFinite(staleDays) || staleDays < 0) {
562
+ return fail(`cave check: --stale expects a non-negative number of days, got ${JSON.stringify(values.stale)}\n`);
563
+ }
564
+ const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {});
565
+ try {
566
+ const report = caveCheck(store, { staleDays });
567
+ const out = values.json === true ?
568
+ `${JSON.stringify(report, undefined, 2)}\n` :
569
+ renderReport(report, staleDays);
570
+ // Violations fail the check (spec §20.2); the other sections are advisory.
571
+ return { code: report.violations.length > 0 ? 1 : 0, out, err: '' };
572
+ }
573
+ finally {
574
+ store.close();
575
+ }
576
+ };
286
577
  export const exportCommand = (argv) => {
287
578
  const { values } = parseArgs({
288
579
  args: [...argv],
@@ -320,8 +611,8 @@ export const helpCommand = (argv) => {
320
611
  if (text !== undefined) {
321
612
  return ok(`${text}\n`);
322
613
  }
323
- // mcp and ingest own their help (main.ts forwards `help X` to `X --help`).
324
- if (topic === 'mcp' || topic === 'ingest') {
614
+ // mcp, ingest and connect own their help (main.ts forwards `help X` to `X --help`).
615
+ if (topic === 'mcp' || topic === 'ingest' || topic === 'connect') {
325
616
  return ok(`see: cave ${topic} --help\n`);
326
617
  }
327
618
  return fail(`cave help: unknown command ${JSON.stringify(topic)}\n\n${usage}\n`, 2);
@@ -344,6 +635,10 @@ export const cave = (argv) => {
344
635
  return importCommand(rest);
345
636
  case 'query':
346
637
  return queryCommand(rest);
638
+ case 'derive':
639
+ return deriveCommand(rest);
640
+ case 'check':
641
+ return checkCommand(rest);
347
642
  case 'export':
348
643
  return exportCommand(rest);
349
644
  case 'demo':
@@ -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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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * `@cavelang/cli` — the `cave` command (parse / add / query / export / demo).
2
+ * `@cavelang/cli` — the `cave` command (parse / add / query / derive / check / export / demo).
3
3
  * Programmatic access to the same implementations lives here.
4
4
  */
5
- export { addCommand, cave, commandHelp, demoCommand, exportCommand, helpCommand, highlightCommand, importCommand, parseCommand, queryCommand, usage, versionCommand } from './cli.ts';
5
+ export { addCommand, cave, checkCommand, commandHelp, demoCommand, deriveCommand, exportCommand, helpCommand, highlightCommand, 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,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACrL,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,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAClN,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA"}
package/dist/src/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
- * `@cavelang/cli` — the `cave` command (parse / add / query / export / demo).
2
+ * `@cavelang/cli` — the `cave` command (parse / add / query / derive / check / export / demo).
3
3
  * Programmatic access to the same implementations lives here.
4
4
  */
5
- export { addCommand, cave, commandHelp, demoCommand, exportCommand, helpCommand, highlightCommand, importCommand, parseCommand, queryCommand, usage, versionCommand } from "./cli.js";
5
+ export { addCommand, cave, checkCommand, commandHelp, demoCommand, deriveCommand, exportCommand, helpCommand, highlightCommand, 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,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,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,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA"}
package/dist/src/main.js CHANGED
@@ -10,9 +10,9 @@ const write = (code, out, err) => {
10
10
  }
11
11
  process.exitCode = code;
12
12
  };
13
- // mcp and ingest own their help text, so `cave help X` becomes `cave X --help`.
13
+ // mcp, ingest and connect own their help text, so `cave help X` becomes `cave X --help`.
14
14
  const raw = process.argv.slice(2);
15
- const argv = raw[0] === 'help' && (raw[1] === 'mcp' || raw[1] === 'ingest') ?
15
+ const argv = raw[0] === 'help' && (raw[1] === 'mcp' || raw[1] === 'ingest' || raw[1] === 'connect') ?
16
16
  [raw[1], '--help'] :
17
17
  raw;
18
18
  if (argv[0] === 'mcp') {
@@ -25,6 +25,11 @@ else if (argv[0] === 'ingest') {
25
25
  const { runIngest } = await import('@cavelang/ingest');
26
26
  process.exitCode = await runIngest(argv.slice(1));
27
27
  }
28
+ else if (argv[0] === 'connect') {
29
+ // Async (URL sources fetch) and potentially long-running (--watch).
30
+ const { runConnect } = await import('@cavelang/connect');
31
+ process.exitCode = await runConnect(argv.slice(1));
32
+ }
28
33
  else if (argv[0] === 'highlight' && !argv.includes('--help') && !argv.includes('-h')) {
29
34
  // Async (grammar WASM loads on first use); --help stays on the sync path.
30
35
  const { code, out, err } = await highlightCommand(argv.slice(1));
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AACA,gFAAgF;AAEhF,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEjD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,GAAW,EAAQ,EAAE;IAC7D,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,CAAA;AAED,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,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACvF,0EAA0E;IAC1E,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AACvB,CAAC;KAAM,CAAC;IACN,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IACrC,2EAA2E;IAC3E,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC5E,GAAG,KAAK,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,CAAA;IACtF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;QAC3D,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IACnD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACvB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cavelang/cli",
3
- "version": "0.5.0",
3
+ "version": "0.12.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,15 +39,18 @@
39
39
  "access": "public"
40
40
  },
41
41
  "dependencies": {
42
- "@cavelang/canonical": "0.5.0",
43
- "@cavelang/core": "0.5.0",
44
- "@cavelang/ingest": "0.5.0",
45
- "@cavelang/highlight": "0.5.0",
46
- "@cavelang/loop": "0.5.0",
47
- "@cavelang/mcp": "0.5.0",
48
- "@cavelang/parser": "0.5.0",
49
- "@cavelang/query": "0.5.0",
50
- "@cavelang/store": "0.5.0"
42
+ "@cavelang/canonical": "0.12.0",
43
+ "@cavelang/connect": "0.12.0",
44
+ "@cavelang/core": "0.12.0",
45
+ "@cavelang/ingest": "0.12.0",
46
+ "@cavelang/highlight": "0.12.0",
47
+ "@cavelang/loop": "0.12.0",
48
+ "@cavelang/query": "0.12.0",
49
+ "@cavelang/parser": "0.12.0",
50
+ "@cavelang/mcp": "0.12.0",
51
+ "@cavelang/shape": "0.12.0",
52
+ "@cavelang/rules": "0.12.0",
53
+ "@cavelang/store": "0.12.0"
51
54
  },
52
55
  "scripts": {
53
56
  "build": "tsc -b",
package/src/cli.ts CHANGED
@@ -7,9 +7,12 @@
7
7
  *
8
8
  * - `cave parse [file]` — lint / dump the AST (`--json`)
9
9
  * - `cave highlight [file]` — ANSI syntax colors (async, routed in `main.ts`)
10
- * - `cave add [--db <path>] [file…]` — ingest into a store (`--strict`)
11
- * - `cave query [--db <path>] '<pattern>'` — CAVE-Q (`--json`, `--all`)
10
+ * - `cave add [--db <path>] [file…]` — ingest into a store (`--strict`, `--check`)
11
+ * - `cave query [--db <path>] '<pattern>'` — CAVE-Q (`--json`, `--all`, `--aliases`, `--as-of`)
12
+ * - `cave derive [--db <path>] [rules.cave…]` — fire rules (`--dry-run`, `--full`, `--list`, `--retract`)
13
+ * - `cave check [--db <path>]` — knowledge health report (`--stale`, `--json`)
12
14
  * - `cave export [--db <path>]` — canonical text out (`--current`)
15
+ * - `cave connect [--db <path>] <source>` — deterministic structured ingestion (async, routed in `main.ts`)
13
16
  * - `cave demo` — the cave-loop multi-hop recovery demo
14
17
  * - `cave version` — print the cave version
15
18
  * - `cave help [command]` — overview, or one command's help
@@ -25,6 +28,10 @@ import { parseDocument } from '@cavelang/parser'
25
28
  import { Registry, standardRegistry } from '@cavelang/canonical'
26
29
  import { defaultDbPath, open } from '@cavelang/store'
27
30
  import { query as caveQuery } from '@cavelang/query'
31
+ import { check as caveCheck, defaultStaleDays, gatedIngest } from '@cavelang/shape'
32
+ import type { Report, Violation } from '@cavelang/shape'
33
+ import { declareRules, defaultMaxPasses, defaultMinConf, derive, listRules, retractRule } from '@cavelang/rules'
34
+ import type { Declaration, DeriveReport } from '@cavelang/rules'
28
35
  import { Demo } from '@cavelang/loop'
29
36
 
30
37
  export type Output = {
@@ -44,12 +51,15 @@ export const usage = `cave — Compressed Atomic Verb Expressions
44
51
  Usage:
45
52
  cave parse [file...] [--json] lint CAVE text (stdin when no file)
46
53
  cave highlight [file...] print CAVE text with ANSI syntax colors
47
- cave add [--db <path>] [file...] ingest into a store [--strict] [--no-prelude]
48
- cave import [--db <path>] [file...] restore/merge from CAVE text (same as add)
49
- cave query [--db <path>] <pattern> run a CAVE-Q pattern [--json] [--all] [--no-prelude]
54
+ cave add [--db <path>] [file...] ingest into a store [--strict] [--check] [--no-prelude] [--no-src]
55
+ cave import [--db <path>] [file...] restore/merge from CAVE text (add without @src: stamping)
56
+ cave query [--db <path>] <pattern> run a CAVE-Q pattern [--json] [--all] [--aliases] [--as-of <t>] [--no-prelude]
57
+ cave derive [--db <path>] [rules.cave..] declare + fire rules (spec §24) [--dry-run] [--full] [--list] [--retract <rule>]
58
+ cave check [--db <path>] knowledge health report (spec §20) [--stale <days>] [--json]
50
59
  cave export [--db <path>] [--out <file>] emit canonical CAVE text [--current] [--no-prelude]
51
60
  cave mcp [--db <path>] serve the engine as an MCP server on stdio [--no-prelude]
52
61
  cave ingest [--db <path>] <globs/urls..> LLM-driven ingestion of files and web pages
62
+ cave connect <source> --map <file> deterministic structured ingestion (CSV/JSON/SQLite/URL, spec §23)
53
63
  cave demo run the cave-loop reconstruction demo
54
64
  cave version print the cave version
55
65
  cave help [command] this text, or one command's options and examples
@@ -97,21 +107,27 @@ Examples:
97
107
  add: `cave add — ingest CAVE text into a knowledge database
98
108
 
99
109
  Usage:
100
- cave add [--db <path>] [file...] [--strict] [--no-prelude]
110
+ cave add [--db <path>] [file...] [--strict] [--check] [--no-prelude] [--no-src]
101
111
 
102
112
  Options:
103
113
  ${dbHelp}
104
114
  --strict reject the whole ingest on any problem
115
+ --check shape gate (spec §20.3): roll the append back if it
116
+ introduces new expectation violations
105
117
  --no-prelude open the store without the standard verb registry
118
+ --no-src do not stamp actor provenance on appended claims
106
119
 
107
- Reads stdin when no file (or \`-\`) is given.
120
+ Reads stdin when no file (or \`-\`) is given. Claims that carry no @src:
121
+ context are stamped @src:cli (spec §9.5); use \`cave import\` to replay
122
+ exported text without stamping.
108
123
 
109
124
  Examples:
110
125
  cave add --db k.db notes.cave
111
126
  echo 'auth USES jwt @ 90%' | cave add
112
- cave add --db k.db --strict reviewed.cave`,
127
+ cave add --db k.db --strict reviewed.cave
128
+ cave add --db k.db --check new-services.cave`,
113
129
 
114
- import: `cave import — restore/merge a database from CAVE text (same as add)
130
+ import: `cave import — restore/merge a database from CAVE text (add without @src: stamping)
115
131
 
116
132
  Usage:
117
133
  cave import [--db <path>] [file...] [--strict] [--no-prelude]
@@ -123,7 +139,9 @@ Options:
123
139
 
124
140
  Canonical CAVE text is the interchange format (spec §2.2): importing a
125
141
  file written by \`cave export\` replays its claims append-only, preserving
126
- the belief series, qualifier edges and in-band declarations.
142
+ the belief series, qualifier edges and in-band declarations. Unlike
143
+ \`cave add\`, import never stamps actor provenance — replayed claims must
144
+ keep the claim keys they were exported with (spec §9.5).
127
145
 
128
146
  Examples:
129
147
  cave export --db old.db --out backup.cave
@@ -132,12 +150,16 @@ Examples:
132
150
  query: `cave query — run a CAVE-Q pattern against a store
133
151
 
134
152
  Usage:
135
- cave query [--db <path>] <pattern> [WHERE <filter>] [--json] [--all] [--no-prelude]
153
+ cave query [--db <path>] <pattern> [WHERE <filter>] [--json] [--all] [--aliases] [--as-of <t>] [--no-prelude]
136
154
 
137
155
  Options:
138
156
  ${dbHelp}
139
157
  --json emit matches as JSON
140
158
  --all match all beliefs, not just current ones
159
+ --aliases resolve entities through current ALIAS claims (spec §13.6)
160
+ --as-of <t> resolve beliefs as of a past moment (spec §12.3): a date
161
+ (whole day included), a timestamp (whole second), or a
162
+ transaction id — rows recorded later are invisible
141
163
  --no-prelude open the store without the standard verb registry
142
164
 
143
165
  Patterns are claim triples with ?variables and optional metadata filters
@@ -149,8 +171,71 @@ Examples:
149
171
  cave query --db k.db '?x HAS bug: ?bug #security'
150
172
  cave query --db k.db '?cause CAUSE app/crash' 'WHERE conf >= 0.5'
151
173
  cave query --db k.db 'terrier EXTENDS+ animal'
174
+ cave query --db k.db '?x USES postgres' --aliases
175
+ cave query --db k.db 'server IS compromised' --as-of 2026-01-15
152
176
  cave query --db k.db '?x ?verb ?y @production' --json`,
153
177
 
178
+ derive: `cave derive — declare and fire rules (spec §24)
179
+
180
+ Usage:
181
+ cave derive [--db <path>] [rules.cave...] [--dry-run] [--full] [--aliases]
182
+ [--min-conf <p>] [--max-passes <n>] [--json] [--no-prelude]
183
+ cave derive [--db <path>] --list
184
+ cave derive [--db <path>] --retract <digest|subject>
185
+
186
+ Options:
187
+ ${dbHelp}
188
+ --dry-run compute and report inside a rolled-back transaction
189
+ --full ignore stored watermarks — re-fire every rule (spec §24.4)
190
+ --aliases premises match through the alias closure (spec §13.6)
191
+ --min-conf <p> do not assert conclusions below this confidence
192
+ (0..1 or N%, default ${defaultMinConf})
193
+ --max-passes <n> fixpoint guard (default ${defaultMaxPasses})
194
+ --list print the store's current rules and exit
195
+ --retract <r> retract a rule (digest, unambiguous prefix, or subject)
196
+ together with everything it derived, and exit
197
+ --json emit the report as JSON
198
+ --no-prelude open the store without the standard verb registry
199
+
200
+ Rule files are CAVE documents whose \`premises => conclusion\` lines are
201
+ rules (spec §24.1); other lines — verb declarations the rules need — are
202
+ prelude, ingested first. Rules are stored in-band as
203
+ \`rule/<digest> HAS rule: \\\`…\\\`\` claims, so \`cave derive\` with no file
204
+ fires whatever the store already knows. Derived claims are stamped
205
+ @src:rule/<digest>, carry BECAUSE edges to their premise rows and a VIA
206
+ edge to the rule, and update append-only: re-runs are idempotent and
207
+ watermark-incremental, and conclusions whose premises no longer hold are
208
+ retracted (spec §24.2–§24.5).
209
+
210
+ Examples:
211
+ cave derive --db k.db rules.cave
212
+ cave derive --db k.db
213
+ echo '?x NEEDS ?y, ?y NEEDS ?z => ?x NEEDS ?z' | cave derive --db k.db -
214
+ cave derive --db k.db --dry-run --json
215
+ cave derive --db k.db --list
216
+ cave derive --db k.db --retract 4a0bb974f43c`,
217
+
218
+ check: `cave check — knowledge health report (spec §20)
219
+
220
+ Usage:
221
+ cave check [--db <path>] [--stale <days>] [--json] [--no-prelude]
222
+
223
+ Options:
224
+ ${dbHelp}
225
+ --stale <days> staleness horizon (default: ${defaultStaleDays})
226
+ --json emit the full report as JSON
227
+ --no-prelude open the store without the standard verb registry
228
+
229
+ Reads the store against its own in-band EXPECTS declarations (spec §20.1)
230
+ and reports shape violations, stale current beliefs, review candidates
231
+ (conf 0.3–0.7), alias disagreements (spec §13.6) and coverage stats.
232
+ Exits 1 when violations exist; everything else is advisory.
233
+
234
+ Examples:
235
+ cave check --db k.db
236
+ cave check --db k.db --stale 30
237
+ cave check --db k.db --json | jq '.violations'`,
238
+
154
239
  export: `cave export — emit canonical CAVE text from a store
155
240
 
156
241
  Usage:
@@ -226,26 +311,50 @@ export const highlightCommand = async (argv: readonly string[]): Promise<Output>
226
311
  return ok(ansi(input))
227
312
  }
228
313
 
229
- const ingestCommand = (name: string) => (argv: readonly string[]): Output => {
314
+ /**
315
+ * Shared by `add` and `import`; the difference is actor provenance
316
+ * (spec §9.5). `add` records knowledge authored now, so claims without a
317
+ * `@src:` context are stamped `@src:cli` (`--no-src` opts out); `import`
318
+ * replays interchange text, which must preserve claim keys as exported,
319
+ * so it never stamps.
320
+ */
321
+ const formatViolation = (violation: Violation): string =>
322
+ `${violation.entity} missing ${violation.expectation.kind} ${violation.expectation.name} ` +
323
+ `(${violation.entity} IS ${violation.via}; ${violation.expectation.type} EXPECTS ${violation.expectation.name})`
324
+
325
+ const ingestCommand = (name: 'add' | 'import') => (argv: readonly string[]): Output => {
230
326
  const { values, positionals } = parseArgs({
231
327
  args: [...argv],
232
328
  options: {
233
329
  db: { type: 'string' },
234
330
  strict: { type: 'boolean' },
235
- 'no-prelude': { type: 'boolean' }
331
+ 'no-prelude': { type: 'boolean' },
332
+ ...name === 'add' ? { 'no-src': { type: 'boolean' }, check: { type: 'boolean' } } : {}
236
333
  },
237
334
  allowPositionals: true
238
335
  })
239
336
  const input = readInput(positionals)
240
337
  const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {})
241
338
  try {
242
- const result = store.ingest(input, { strict: values.strict === true })
243
- const problems = result.problems
339
+ const options = {
340
+ strict: values.strict === true,
341
+ ...name === 'add' && values['no-src'] !== true ? { source: 'cli' } : {}
342
+ }
343
+ // The shape gate (spec §20.3): append + check in one transaction,
344
+ // rolled back when the append introduces new expectation violations.
345
+ const outcome = name === 'add' && values.check === true ?
346
+ gatedIngest(store, input, options) :
347
+ { ok: true as const, result: store.ingest(input, options) }
348
+ if (!outcome.ok) {
349
+ const detail = outcome.violations.map(violation => ` ${formatViolation(violation)}`).join('\n')
350
+ return fail(`rejected: ${outcome.violations.length} new violation(s), nothing added (spec §20.3)\n${detail}\n`)
351
+ }
352
+ const problems = outcome.result.problems
244
353
  .map(problem => `line ${problem.line}: ${problem.message}`)
245
354
  .join('\n')
246
355
  return {
247
356
  code: 0,
248
- out: `added ${result.ids.length} claim(s), ${result.edges} edge(s)\n`,
357
+ out: `added ${outcome.result.ids.length} claim(s), ${outcome.result.edges} edge(s)\n`,
249
358
  err: problems === '' ? '' : `${problems}\n`
250
359
  }
251
360
  } catch (error) {
@@ -259,13 +368,15 @@ export const addCommand = ingestCommand('add')
259
368
 
260
369
  /**
261
370
  * `cave import` — restore/merge a knowledge database from CAVE text files.
262
- * Identical to `add` by design: canonical CAVE text *is* the interchange
371
+ * `add` minus provenance stamping: canonical CAVE text *is* the interchange
263
372
  * format (spec §2.2), so importing a file exported with `cave export`
264
- * replays its claims append-only. What the text round trip preserves:
265
- * every claim with metadata, full belief-series order (rows export in tx
266
- * order and re-ingest with fresh monotonic tx ids), qualifier/grouping
267
- * edges, and in-band registry declarations. Original tx timestamps are
268
- * re-minted — the text format carries no transaction identity.
373
+ * replays its claims append-only — and because contexts are part of claim
374
+ * identity, replay must not add a `@src:` stamp (spec §9.5). What the text
375
+ * round trip preserves: every claim with metadata, full belief-series order
376
+ * (rows export in tx order and re-ingest with fresh monotonic tx ids),
377
+ * qualifier/grouping edges, and in-band registry declarations. Original tx
378
+ * timestamps are re-minted — the text format carries no transaction
379
+ * identity.
269
380
  */
270
381
  export const importCommand = ingestCommand('import')
271
382
 
@@ -276,6 +387,8 @@ export const queryCommand = (argv: readonly string[]): Output => {
276
387
  db: { type: 'string' },
277
388
  json: { type: 'boolean' },
278
389
  all: { type: 'boolean' },
390
+ aliases: { type: 'boolean' },
391
+ 'as-of': { type: 'string' },
279
392
  'no-prelude': { type: 'boolean' }
280
393
  },
281
394
  allowPositionals: true
@@ -286,7 +399,11 @@ export const queryCommand = (argv: readonly string[]): Output => {
286
399
  const pattern = positionals.join('\n')
287
400
  const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {})
288
401
  try {
289
- const matches = caveQuery(store, pattern, { all: values.all === true })
402
+ const matches = caveQuery(store, pattern, {
403
+ all: values.all === true,
404
+ aliases: values.aliases === true,
405
+ ...values['as-of'] === undefined ? {} : { asOf: values['as-of'] }
406
+ })
290
407
  if (values.json === true) {
291
408
  return ok(`${JSON.stringify(matches, undefined, 2)}\n`)
292
409
  }
@@ -309,6 +426,189 @@ export const queryCommand = (argv: readonly string[]): Output => {
309
426
  }
310
427
  }
311
428
 
429
+ export const deriveCommand = (argv: readonly string[]): Output => {
430
+ const { values, positionals } = parseArgs({
431
+ args: [...argv],
432
+ options: {
433
+ db: { type: 'string' },
434
+ 'dry-run': { type: 'boolean' },
435
+ full: { type: 'boolean' },
436
+ aliases: { type: 'boolean' },
437
+ 'min-conf': { type: 'string' },
438
+ 'max-passes': { type: 'string' },
439
+ list: { type: 'boolean' },
440
+ retract: { type: 'string' },
441
+ json: { type: 'boolean' },
442
+ 'no-prelude': { type: 'boolean' }
443
+ },
444
+ allowPositionals: true
445
+ })
446
+ const minConf = values['min-conf'] === undefined ?
447
+ undefined :
448
+ values['min-conf'].endsWith('%') ? Number(values['min-conf'].slice(0, -1)) / 100 : Number(values['min-conf'])
449
+ if (minConf !== undefined && (!Number.isFinite(minConf) || minConf < 0 || minConf > 1)) {
450
+ return fail(`cave derive: --min-conf expects a confidence in 0..1 or N%, got ${JSON.stringify(values['min-conf'])}\n`)
451
+ }
452
+ const maxPasses = values['max-passes'] === undefined ? undefined : Number(values['max-passes'])
453
+ if (maxPasses !== undefined && (!Number.isInteger(maxPasses) || maxPasses < 1)) {
454
+ return fail(`cave derive: --max-passes expects a positive integer, got ${JSON.stringify(values['max-passes'])}\n`)
455
+ }
456
+ const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {})
457
+ try {
458
+ if (values.list === true) {
459
+ const rules = listRules(store)
460
+ if (values.json === true) {
461
+ return ok(`${JSON.stringify(rules, undefined, 2)}\n`)
462
+ }
463
+ if (rules.length === 0) {
464
+ return ok('no rules\n')
465
+ }
466
+ const lines = rules.map(rule =>
467
+ `${rule.subject} \`${rule.text}\`${rule.label === undefined ? '' : ` ; ${rule.label}`}` +
468
+ (rule.ok ? '' : `\n problems: ${rule.problems.join('; ')}`))
469
+ return ok(`${lines.join('\n')}\n`)
470
+ }
471
+ if (values.retract !== undefined) {
472
+ const outcome = retractRule(store, values.retract)
473
+ if (!outcome.ok) {
474
+ return fail(`cave derive: ${outcome.error}\n`)
475
+ }
476
+ return ok(`retracted ${outcome.subjects.join(', ')} and ${outcome.derived} derived claim(s)\n`)
477
+ }
478
+
479
+ const err: string[] = []
480
+ const out: string[] = []
481
+ // Unlike parse/add, no positional means "fire the stored rules", never
482
+ // stdin — pass `-` to read a rule file from stdin explicitly.
483
+ const input = positionals.length > 0 ? readInput(positionals) : undefined
484
+ const options = {
485
+ full: values.full === true,
486
+ aliases: values.aliases === true,
487
+ ...minConf === undefined ? {} : { minConf },
488
+ ...maxPasses === undefined ? {} : { maxPasses }
489
+ }
490
+ let declaration: undefined | Declaration
491
+ let report: DeriveReport
492
+ if (values['dry-run'] === true) {
493
+ // A dry run persists nothing — rule declarations from the file
494
+ // included, so declare + fire share one rolled-back transaction.
495
+ const rolledBack = Symbol('cave derive --dry-run')
496
+ let outcome: undefined | { declaration?: Declaration, report: DeriveReport }
497
+ try {
498
+ store.transaction(() => {
499
+ outcome = {
500
+ ...input === undefined ? {} : { declaration: declareRules(store, input) },
501
+ report: derive(store, options)
502
+ }
503
+ throw rolledBack
504
+ })
505
+ } catch (error) {
506
+ if (error !== rolledBack) {
507
+ throw error
508
+ }
509
+ }
510
+ declaration = outcome!.declaration
511
+ report = outcome!.report
512
+ } else {
513
+ declaration = input === undefined ? undefined : declareRules(store, input)
514
+ report = derive(store, options)
515
+ }
516
+ if (declaration !== undefined) {
517
+ err.push(...declaration.problems.map(problem => `rules line ${problem.line}: ${problem.message}`))
518
+ out.push(`declared ${declaration.declared} rule(s)` +
519
+ (declaration.unchanged > 0 ? `, ${declaration.unchanged} unchanged` : '') +
520
+ (declaration.prelude > 0 ? `, +${declaration.prelude} prelude claim(s)` : ''))
521
+ }
522
+ if (values.json === true) {
523
+ return { code: report.problems.length > 0 ? 1 : 0, out: `${JSON.stringify(report, undefined, 2)}\n`, err: err.join('\n') + (err.length > 0 ? '\n' : '') }
524
+ }
525
+ for (const problem of report.problems) {
526
+ err.push(`${problem.subject}: ${problem.problems.join('; ')}`)
527
+ }
528
+ for (const rule of report.rules) {
529
+ const state = rule.fired ?
530
+ `${rule.solutions} solution(s), +${rule.appended} appended, ${rule.updated} updated, ${rule.retracted} retracted, ${rule.unchanged} unchanged` :
531
+ 'unchanged premises, skipped'
532
+ out.push(`${rule.subject}: ${state}${rule.label === undefined ? '' : ` ; ${rule.label}`}`)
533
+ err.push(...rule.problems.map(problem => `${rule.subject}: ${problem}`))
534
+ }
535
+ out.push(...report.notes.map(note => `note: ${note}`))
536
+ out.push(
537
+ `derived${values['dry-run'] === true ? ' (dry run)' : ''}: ` +
538
+ `+${report.appended} appended, ${report.updated} updated, ${report.retracted} retracted, ` +
539
+ `${report.unchanged} unchanged (${report.passes} pass(es))`)
540
+ const hasProblems = report.problems.length > 0 || report.rules.some(rule => rule.problems.length > 0)
541
+ return { code: hasProblems ? 1 : 0, out: `${out.join('\n')}\n`, err: err.length === 0 ? '' : `${err.join('\n')}\n` }
542
+ } catch (error) {
543
+ return fail(`${error instanceof Error ? error.message : String(error)}\n`)
544
+ } finally {
545
+ store.close()
546
+ }
547
+ }
548
+
549
+ /** Text rendering of the §20.2 report: always shape + coverage, non-empty advisory sections. */
550
+ const renderReport = (report: Report, staleDays: number): string => {
551
+ const lines: string[] = []
552
+ const { coverage } = report
553
+ lines.push(`shape: ${coverage.expectations} expectation(s), ${coverage.instances} instance(s), ${coverage.satisfied}/${coverage.checks} satisfied`)
554
+ if (report.violations.length > 0) {
555
+ lines.push(`violations (${report.violations.length}):`)
556
+ lines.push(...report.violations.map(violation => ` ${formatViolation(violation)}`))
557
+ }
558
+ if (report.stale.length > 0) {
559
+ lines.push(`stale (${report.stale.length}, older than ${staleDays} day(s)):`)
560
+ lines.push(...report.stale.map(({ row, ageDays }) => ` ${row.raw_line} (${ageDays}d)`))
561
+ }
562
+ if (report.review.length > 0) {
563
+ lines.push(`review candidates (${report.review.length}, conf 0.3-0.7):`)
564
+ lines.push(...report.review.map(row => ` ${row.raw_line}`))
565
+ }
566
+ if (report.disagreements.length > 0) {
567
+ lines.push(`alias disagreements (${report.disagreements.length}):`)
568
+ for (const disagreement of report.disagreements) {
569
+ lines.push(` ${disagreement.about} across ${disagreement.entities.join(', ')}:`)
570
+ lines.push(...disagreement.rows.map(row => ` ${row.raw_line}`))
571
+ }
572
+ }
573
+ const confidence = coverage.averageConfidence === null ?
574
+ '' :
575
+ `; avg conf ${Math.round(coverage.averageConfidence * 100)}%, ${coverage.lowConfidence} low (< 0.3)`
576
+ lines.push(
577
+ `coverage: ${coverage.rows} row(s), ${coverage.facts} fact(s) — ` +
578
+ `${coverage.current} current, ${coverage.retracted} retracted, ${coverage.negated} negated` +
579
+ `${confidence}; ${coverage.entities} entities, ${coverage.typedEntities} typed`
580
+ )
581
+ return `${lines.join('\n')}\n`
582
+ }
583
+
584
+ export const checkCommand = (argv: readonly string[]): Output => {
585
+ const { values } = parseArgs({
586
+ args: [...argv],
587
+ options: {
588
+ db: { type: 'string' },
589
+ stale: { type: 'string' },
590
+ json: { type: 'boolean' },
591
+ 'no-prelude': { type: 'boolean' }
592
+ },
593
+ allowPositionals: false
594
+ })
595
+ const staleDays = values.stale === undefined ? defaultStaleDays : Number(values.stale)
596
+ if (!Number.isFinite(staleDays) || staleDays < 0) {
597
+ return fail(`cave check: --stale expects a non-negative number of days, got ${JSON.stringify(values.stale)}\n`)
598
+ }
599
+ const store = open(values.db ?? defaultDbPath(), values['no-prelude'] === true ? { registry: Registry.empty } : {})
600
+ try {
601
+ const report = caveCheck(store, { staleDays })
602
+ const out = values.json === true ?
603
+ `${JSON.stringify(report, undefined, 2)}\n` :
604
+ renderReport(report, staleDays)
605
+ // Violations fail the check (spec §20.2); the other sections are advisory.
606
+ return { code: report.violations.length > 0 ? 1 : 0, out, err: '' }
607
+ } finally {
608
+ store.close()
609
+ }
610
+ }
611
+
312
612
  export const exportCommand = (argv: readonly string[]): Output => {
313
613
  const { values } = parseArgs({
314
614
  args: [...argv],
@@ -350,8 +650,8 @@ export const helpCommand = (argv: readonly string[]): Output => {
350
650
  if (text !== undefined) {
351
651
  return ok(`${text}\n`)
352
652
  }
353
- // mcp and ingest own their help (main.ts forwards `help X` to `X --help`).
354
- if (topic === 'mcp' || topic === 'ingest') {
653
+ // mcp, ingest and connect own their help (main.ts forwards `help X` to `X --help`).
654
+ if (topic === 'mcp' || topic === 'ingest' || topic === 'connect') {
355
655
  return ok(`see: cave ${topic} --help\n`)
356
656
  }
357
657
  return fail(`cave help: unknown command ${JSON.stringify(topic)}\n\n${usage}\n`, 2)
@@ -375,6 +675,10 @@ export const cave = (argv: readonly string[]): Output => {
375
675
  return importCommand(rest)
376
676
  case 'query':
377
677
  return queryCommand(rest)
678
+ case 'derive':
679
+ return deriveCommand(rest)
680
+ case 'check':
681
+ return checkCommand(rest)
378
682
  case 'export':
379
683
  return exportCommand(rest)
380
684
  case 'demo':
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
- * `@cavelang/cli` — the `cave` command (parse / add / query / export / demo).
2
+ * `@cavelang/cli` — the `cave` command (parse / add / query / derive / check / export / demo).
3
3
  * Programmatic access to the same implementations lives here.
4
4
  */
5
5
 
6
- export { addCommand, cave, commandHelp, demoCommand, exportCommand, helpCommand, highlightCommand, importCommand, parseCommand, queryCommand, usage, versionCommand } from './cli.ts'
6
+ export { addCommand, cave, checkCommand, commandHelp, demoCommand, deriveCommand, exportCommand, helpCommand, highlightCommand, importCommand, parseCommand, queryCommand, usage, versionCommand } from './cli.ts'
7
7
  export type { Output } from './cli.ts'
package/src/main.ts CHANGED
@@ -13,9 +13,9 @@ const write = (code: number, out: string, err: string): void => {
13
13
  process.exitCode = code
14
14
  }
15
15
 
16
- // mcp and ingest own their help text, so `cave help X` becomes `cave X --help`.
16
+ // mcp, ingest and connect own their help text, so `cave help X` becomes `cave X --help`.
17
17
  const raw = process.argv.slice(2)
18
- const argv = raw[0] === 'help' && (raw[1] === 'mcp' || raw[1] === 'ingest') ?
18
+ const argv = raw[0] === 'help' && (raw[1] === 'mcp' || raw[1] === 'ingest' || raw[1] === 'connect') ?
19
19
  [raw[1], '--help'] :
20
20
  raw
21
21
  if (argv[0] === 'mcp') {
@@ -26,6 +26,10 @@ if (argv[0] === 'mcp') {
26
26
  // Long-running: drives an LLM agent over batches of files.
27
27
  const { runIngest } = await import('@cavelang/ingest')
28
28
  process.exitCode = await runIngest(argv.slice(1))
29
+ } else if (argv[0] === 'connect') {
30
+ // Async (URL sources fetch) and potentially long-running (--watch).
31
+ const { runConnect } = await import('@cavelang/connect')
32
+ process.exitCode = await runConnect(argv.slice(1))
29
33
  } else if (argv[0] === 'highlight' && !argv.includes('--help') && !argv.includes('-h')) {
30
34
  // Async (grammar WASM loads on first use); --help stays on the sync path.
31
35
  const { code, out, err } = await highlightCommand(argv.slice(1))