@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 +4 -3
- package/dist/src/cli.d.ts +16 -9
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +319 -24
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/main.js +7 -2
- package/dist/src/main.js.map +1 -1
- package/package.json +13 -10
- package/src/cli.ts +329 -25
- package/src/index.ts +2 -2
- package/src/main.ts +6 -2
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 —
|
|
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 (
|
|
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
|
-
*
|
|
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
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
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;
|
package/dist/src/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;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 (
|
|
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
|
-
|
|
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
|
|
217
|
-
|
|
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
|
-
*
|
|
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
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
*
|
|
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, {
|
|
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
|
|
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':
|
package/dist/src/cli.js.map
CHANGED
|
@@ -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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"}
|
package/dist/src/index.d.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
|
-
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
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,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.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
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,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
|
|
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));
|
package/dist/src/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AACA,gFAAgF;AAEhF,OAAO,EAAE,IAAI,EAAE,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,
|
|
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.
|
|
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.
|
|
43
|
-
"@cavelang/
|
|
44
|
-
"@cavelang/
|
|
45
|
-
"@cavelang/
|
|
46
|
-
"@cavelang/
|
|
47
|
-
"@cavelang/
|
|
48
|
-
"@cavelang/
|
|
49
|
-
"@cavelang/
|
|
50
|
-
"@cavelang/
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
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
|
|
243
|
-
|
|
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
|
-
*
|
|
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
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
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, {
|
|
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
|
|
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
|
|
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))
|