@cavelang/cli 0.27.14 → 0.29.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/Authors.md +5 -0
- package/License.md +6 -0
- package/README.md +122 -24
- package/dist/internal/act/action.d.ts +69 -0
- package/dist/internal/act/action.d.ts.map +1 -0
- package/dist/internal/act/action.js +201 -0
- package/dist/internal/act/action.js.map +1 -0
- package/dist/internal/act/declare.d.ts +102 -0
- package/dist/internal/act/declare.d.ts.map +1 -0
- package/dist/internal/act/declare.js +270 -0
- package/dist/internal/act/declare.js.map +1 -0
- package/dist/internal/act/engine.d.ts +103 -0
- package/dist/internal/act/engine.d.ts.map +1 -0
- package/dist/internal/act/engine.js +298 -0
- package/dist/internal/act/engine.js.map +1 -0
- package/dist/internal/act/index.d.ts +27 -0
- package/dist/internal/act/index.d.ts.map +1 -0
- package/dist/internal/act/index.js +25 -0
- package/dist/internal/act/index.js.map +1 -0
- package/dist/internal/automate/automation.d.ts +78 -0
- package/dist/internal/automate/automation.d.ts.map +1 -0
- package/dist/internal/automate/automation.js +135 -0
- package/dist/internal/automate/automation.js.map +1 -0
- package/dist/internal/automate/declare.d.ts +84 -0
- package/dist/internal/automate/declare.d.ts.map +1 -0
- package/dist/internal/automate/declare.js +233 -0
- package/dist/internal/automate/declare.js.map +1 -0
- package/dist/internal/automate/engine.d.ts +125 -0
- package/dist/internal/automate/engine.d.ts.map +1 -0
- package/dist/internal/automate/engine.js +388 -0
- package/dist/internal/automate/engine.js.map +1 -0
- package/dist/internal/automate/index.d.ts +28 -0
- package/dist/internal/automate/index.d.ts.map +1 -0
- package/dist/internal/automate/index.js +26 -0
- package/dist/internal/automate/index.js.map +1 -0
- package/dist/internal/automate/main.d.ts +26 -0
- package/dist/internal/automate/main.d.ts.map +1 -0
- package/dist/internal/automate/main.js +298 -0
- package/dist/internal/automate/main.js.map +1 -0
- package/dist/internal/connect/index.d.ts +26 -0
- package/dist/internal/connect/index.d.ts.map +1 -0
- package/dist/internal/connect/index.js +24 -0
- package/dist/internal/connect/index.js.map +1 -0
- package/dist/internal/connect/main.d.ts +23 -0
- package/dist/internal/connect/main.d.ts.map +1 -0
- package/dist/internal/connect/main.js +330 -0
- package/dist/internal/connect/main.js.map +1 -0
- package/dist/internal/connect/run.d.ts +85 -0
- package/dist/internal/connect/run.d.ts.map +1 -0
- package/dist/internal/connect/run.js +242 -0
- package/dist/internal/connect/run.js.map +1 -0
- package/dist/internal/connect/source.d.ts +44 -0
- package/dist/internal/connect/source.d.ts.map +1 -0
- package/dist/internal/connect/source.js +215 -0
- package/dist/internal/connect/source.js.map +1 -0
- package/dist/internal/connect/template.d.ts +69 -0
- package/dist/internal/connect/template.d.ts.map +1 -0
- package/dist/internal/connect/template.js +221 -0
- package/dist/internal/connect/template.js.map +1 -0
- package/dist/internal/eval/index.d.ts +28 -0
- package/dist/internal/eval/index.d.ts.map +1 -0
- package/dist/internal/eval/index.js +27 -0
- package/dist/internal/eval/index.js.map +1 -0
- package/dist/internal/eval/judge.d.ts +30 -0
- package/dist/internal/eval/judge.d.ts.map +1 -0
- package/dist/internal/eval/judge.js +101 -0
- package/dist/internal/eval/judge.js.map +1 -0
- package/dist/internal/eval/loop.d.ts +64 -0
- package/dist/internal/eval/loop.d.ts.map +1 -0
- package/dist/internal/eval/loop.js +123 -0
- package/dist/internal/eval/loop.js.map +1 -0
- package/dist/internal/eval/main.d.ts +17 -0
- package/dist/internal/eval/main.d.ts.map +1 -0
- package/dist/internal/eval/main.js +236 -0
- package/dist/internal/eval/main.js.map +1 -0
- package/dist/internal/eval/queries.d.ts +74 -0
- package/dist/internal/eval/queries.d.ts.map +1 -0
- package/dist/internal/eval/queries.js +161 -0
- package/dist/internal/eval/queries.js.map +1 -0
- package/dist/internal/eval/run.d.ts +143 -0
- package/dist/internal/eval/run.d.ts.map +1 -0
- package/dist/internal/eval/run.js +376 -0
- package/dist/internal/eval/run.js.map +1 -0
- package/dist/internal/eval/score.d.ts +81 -0
- package/dist/internal/eval/score.d.ts.map +1 -0
- package/dist/internal/eval/score.js +126 -0
- package/dist/internal/eval/score.js.map +1 -0
- package/dist/internal/eval/suite.d.ts +66 -0
- package/dist/internal/eval/suite.d.ts.map +1 -0
- package/dist/internal/eval/suite.js +130 -0
- package/dist/internal/eval/suite.js.map +1 -0
- package/dist/internal/ingest/context.d.ts +20 -0
- package/dist/internal/ingest/context.d.ts.map +1 -0
- package/dist/internal/ingest/context.js +59 -0
- package/dist/internal/ingest/context.js.map +1 -0
- package/dist/internal/ingest/files.d.ts +46 -0
- package/dist/internal/ingest/files.d.ts.map +1 -0
- package/dist/internal/ingest/files.js +115 -0
- package/dist/internal/ingest/files.js.map +1 -0
- package/dist/internal/ingest/index.d.ts +31 -0
- package/dist/internal/ingest/index.d.ts.map +1 -0
- package/dist/internal/ingest/index.js +29 -0
- package/dist/internal/ingest/index.js.map +1 -0
- package/dist/internal/ingest/main.d.ts +12 -0
- package/dist/internal/ingest/main.d.ts.map +1 -0
- package/dist/internal/ingest/main.js +180 -0
- package/dist/internal/ingest/main.js.map +1 -0
- package/dist/internal/ingest/prompt.d.ts +32 -0
- package/dist/internal/ingest/prompt.d.ts.map +1 -0
- package/dist/internal/ingest/prompt.js +75 -0
- package/dist/internal/ingest/prompt.js.map +1 -0
- package/dist/internal/ingest/run.d.ts +142 -0
- package/dist/internal/ingest/run.d.ts.map +1 -0
- package/dist/internal/ingest/run.js +350 -0
- package/dist/internal/ingest/run.js.map +1 -0
- package/dist/internal/ingest/web.d.ts +48 -0
- package/dist/internal/ingest/web.d.ts.map +1 -0
- package/dist/internal/ingest/web.js +140 -0
- package/dist/internal/ingest/web.js.map +1 -0
- package/dist/internal/loop/demo.d.ts +22 -0
- package/dist/internal/loop/demo.d.ts.map +1 -0
- package/dist/internal/loop/demo.js +67 -0
- package/dist/internal/loop/demo.js.map +1 -0
- package/dist/internal/loop/index.d.ts +20 -0
- package/dist/internal/loop/index.d.ts.map +1 -0
- package/dist/internal/loop/index.js +17 -0
- package/dist/internal/loop/index.js.map +1 -0
- package/dist/internal/loop/llm.d.ts +99 -0
- package/dist/internal/loop/llm.d.ts.map +1 -0
- package/dist/internal/loop/llm.js +231 -0
- package/dist/internal/loop/llm.js.map +1 -0
- package/dist/internal/loop/reconstruct.d.ts +87 -0
- package/dist/internal/loop/reconstruct.d.ts.map +1 -0
- package/dist/internal/loop/reconstruct.js +157 -0
- package/dist/internal/loop/reconstruct.js.map +1 -0
- package/dist/internal/loop/sqlite.d.ts +13 -0
- package/dist/internal/loop/sqlite.d.ts.map +1 -0
- package/dist/internal/loop/sqlite.js +33 -0
- package/dist/internal/loop/sqlite.js.map +1 -0
- package/dist/internal/loop/store.d.ts +50 -0
- package/dist/internal/loop/store.d.ts.map +1 -0
- package/dist/internal/loop/store.js +100 -0
- package/dist/internal/loop/store.js.map +1 -0
- package/dist/internal/mcp/bin.d.ts +7 -0
- package/dist/internal/mcp/bin.d.ts.map +1 -0
- package/dist/internal/mcp/bin.js +8 -0
- package/dist/internal/mcp/bin.js.map +1 -0
- package/dist/internal/mcp/index.d.ts +25 -0
- package/dist/internal/mcp/index.d.ts.map +1 -0
- package/dist/internal/mcp/index.js +23 -0
- package/dist/internal/mcp/index.js.map +1 -0
- package/dist/internal/mcp/main.d.ts +23 -0
- package/dist/internal/mcp/main.d.ts.map +1 -0
- package/dist/internal/mcp/main.js +156 -0
- package/dist/internal/mcp/main.js.map +1 -0
- package/dist/internal/mcp/server.d.ts +92 -0
- package/dist/internal/mcp/server.d.ts.map +1 -0
- package/dist/internal/mcp/server.js +251 -0
- package/dist/internal/mcp/server.js.map +1 -0
- package/dist/internal/mcp/tools.d.ts +91 -0
- package/dist/internal/mcp/tools.d.ts.map +1 -0
- package/dist/internal/mcp/tools.js +584 -0
- package/dist/internal/mcp/tools.js.map +1 -0
- package/dist/internal/rules/declare.d.ts +58 -0
- package/dist/internal/rules/declare.d.ts.map +1 -0
- package/dist/internal/rules/declare.js +152 -0
- package/dist/internal/rules/declare.js.map +1 -0
- package/dist/internal/rules/engine.d.ts +125 -0
- package/dist/internal/rules/engine.d.ts.map +1 -0
- package/dist/internal/rules/engine.js +575 -0
- package/dist/internal/rules/engine.js.map +1 -0
- package/dist/internal/rules/index.d.ts +23 -0
- package/dist/internal/rules/index.d.ts.map +1 -0
- package/dist/internal/rules/index.js +21 -0
- package/dist/internal/rules/index.js.map +1 -0
- package/dist/internal/rules/rule.d.ts +88 -0
- package/dist/internal/rules/rule.d.ts.map +1 -0
- package/dist/internal/rules/rule.js +221 -0
- package/dist/internal/rules/rule.js.map +1 -0
- package/dist/internal/shape/check.d.ts +118 -0
- package/dist/internal/shape/check.d.ts.map +1 -0
- package/dist/internal/shape/check.js +331 -0
- package/dist/internal/shape/check.js.map +1 -0
- package/dist/internal/shape/client.d.ts +31 -0
- package/dist/internal/shape/client.d.ts.map +1 -0
- package/dist/internal/shape/client.js +170 -0
- package/dist/internal/shape/client.js.map +1 -0
- package/dist/internal/shape/gate.d.ts +33 -0
- package/dist/internal/shape/gate.d.ts.map +1 -0
- package/dist/internal/shape/gate.js +0 -0
- package/dist/internal/shape/gate.js.map +1 -0
- package/dist/internal/shape/index.d.ts +27 -0
- package/dist/internal/shape/index.d.ts.map +1 -0
- package/dist/internal/shape/index.js +23 -0
- package/dist/internal/shape/index.js.map +1 -0
- package/dist/internal/shape/suggest.d.ts +82 -0
- package/dist/internal/shape/suggest.d.ts.map +1 -0
- package/dist/internal/shape/suggest.js +374 -0
- package/dist/internal/shape/suggest.js.map +1 -0
- package/dist/internal/sync/index.d.ts +22 -0
- package/dist/internal/sync/index.d.ts.map +1 -0
- package/dist/internal/sync/index.js +21 -0
- package/dist/internal/sync/index.js.map +1 -0
- package/dist/internal/sync/sync.d.ts +95 -0
- package/dist/internal/sync/sync.d.ts.map +1 -0
- package/dist/internal/sync/sync.js +342 -0
- package/dist/internal/sync/sync.js.map +1 -0
- package/dist/internal/view/api.d.ts +196 -0
- package/dist/internal/view/api.d.ts.map +1 -0
- package/dist/internal/view/api.js +189 -0
- package/dist/internal/view/api.js.map +1 -0
- package/dist/internal/view/index.d.ts +33 -0
- package/dist/internal/view/index.d.ts.map +1 -0
- package/dist/internal/view/index.js +30 -0
- package/dist/internal/view/index.js.map +1 -0
- package/dist/internal/view/main.d.ts +11 -0
- package/dist/internal/view/main.d.ts.map +1 -0
- package/dist/internal/view/main.js +98 -0
- package/dist/internal/view/main.js.map +1 -0
- package/dist/internal/view/page.d.ts +14 -0
- package/dist/internal/view/page.d.ts.map +1 -0
- package/dist/internal/view/page.js +370 -0
- package/dist/internal/view/page.js.map +1 -0
- package/dist/internal/view/report.d.ts +52 -0
- package/dist/internal/view/report.d.ts.map +1 -0
- package/dist/internal/view/report.js +367 -0
- package/dist/internal/view/report.js.map +1 -0
- package/dist/internal/view/scope.d.ts +11 -0
- package/dist/internal/view/scope.d.ts.map +1 -0
- package/dist/internal/view/scope.js +41 -0
- package/dist/internal/view/scope.js.map +1 -0
- package/dist/internal/view/server.d.ts +35 -0
- package/dist/internal/view/server.d.ts.map +1 -0
- package/dist/internal/view/server.js +141 -0
- package/dist/internal/view/server.js.map +1 -0
- package/dist/src/act.d.ts +3 -0
- package/dist/src/act.d.ts.map +1 -0
- package/dist/src/act.js +3 -0
- package/dist/src/act.js.map +1 -0
- package/dist/src/automate.d.ts +3 -0
- package/dist/src/automate.d.ts.map +1 -0
- package/dist/src/automate.js +3 -0
- package/dist/src/automate.js.map +1 -0
- package/dist/src/cli.d.ts +24 -17
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +408 -107
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands.d.ts +104 -0
- package/dist/src/commands.d.ts.map +1 -0
- package/dist/src/commands.js +33 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/connect.d.ts +3 -0
- package/dist/src/connect.d.ts.map +1 -0
- package/dist/src/connect.js +3 -0
- package/dist/src/connect.js.map +1 -0
- package/dist/src/dispatch.d.ts +14 -0
- package/dist/src/dispatch.d.ts.map +1 -0
- package/dist/src/dispatch.js +116 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/doctor.d.ts +45 -0
- package/dist/src/doctor.d.ts.map +1 -0
- package/dist/src/doctor.js +284 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/eval.d.ts +3 -0
- package/dist/src/eval.d.ts.map +1 -0
- package/dist/src/eval.js +3 -0
- package/dist/src/eval.js.map +1 -0
- package/dist/src/index.d.ts +9 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/ingest.d.ts +3 -0
- package/dist/src/ingest.d.ts.map +1 -0
- package/dist/src/ingest.js +3 -0
- package/dist/src/ingest.js.map +1 -0
- package/dist/src/loop.d.ts +3 -0
- package/dist/src/loop.d.ts.map +1 -0
- package/dist/src/loop.js +3 -0
- package/dist/src/loop.js.map +1 -0
- package/dist/src/main.d.ts +1 -1
- package/dist/src/main.d.ts.map +1 -1
- package/dist/src/main.js +3 -75
- package/dist/src/main.js.map +1 -1
- package/dist/src/mcp.d.ts +3 -0
- package/dist/src/mcp.d.ts.map +1 -0
- package/dist/src/mcp.js +3 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/rules.d.ts +3 -0
- package/dist/src/rules.d.ts.map +1 -0
- package/dist/src/rules.js +3 -0
- package/dist/src/rules.js.map +1 -0
- package/dist/src/shape.d.ts +3 -0
- package/dist/src/shape.d.ts.map +1 -0
- package/dist/src/shape.js +3 -0
- package/dist/src/shape.js.map +1 -0
- package/dist/src/sync.d.ts +3 -0
- package/dist/src/sync.d.ts.map +1 -0
- package/dist/src/sync.js +3 -0
- package/dist/src/sync.js.map +1 -0
- package/dist/src/view.d.ts +3 -0
- package/dist/src/view.d.ts.map +1 -0
- package/dist/src/view.js +3 -0
- package/dist/src/view.js.map +1 -0
- package/package.json +81 -21
- package/src/act.ts +2 -0
- package/src/automate.ts +2 -0
- package/src/cli.ts +416 -102
- package/src/commands.ts +48 -0
- package/src/connect.ts +2 -0
- package/src/dispatch.ts +141 -0
- package/src/doctor.ts +370 -0
- package/src/eval.ts +2 -0
- package/src/index.ts +9 -2
- package/src/ingest.ts +2 -0
- package/src/loop.ts +2 -0
- package/src/main.ts +3 -66
- package/src/mcp.ts +2 -0
- package/src/rules.ts +2 -0
- package/src/shape.ts +2 -0
- package/src/sync.ts +2 -0
- package/src/view.ts +2 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE3K,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule parsing (spec §24.1) — the Draft §17.4 `=>` line, proven out:
|
|
3
|
+
*
|
|
4
|
+
* ```cave
|
|
5
|
+
* ?x NEEDS ?y, ?y NEEDS ?z => ?x NEEDS ?z
|
|
6
|
+
* ?x HAS age: ?a, ?a < 18 => ?x NEEDS guardian
|
|
7
|
+
* ?x PRECEDES ?e, ?x CONTAINS ?c => ?c CAUSE ?e @ 50%
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* The left side is a comma-separated conjunction of **premises**: CAVE-Q
|
|
11
|
+
* patterns (spec §12.1 — the same parser, so inverse verbs, `VERB+`
|
|
12
|
+
* transitive hops, `NOT`, `@ctx` and `#tag` filters all work) and value
|
|
13
|
+
* **constraints** (`?a < 18`). The right side is one ordinary CAVE claim
|
|
14
|
+
* line whose `?var` slots must be bound by pattern premises; its own
|
|
15
|
+
* metadata rides along, and its `@ N%` is the rule's confidence factor.
|
|
16
|
+
*
|
|
17
|
+
* `=>` is the only rule-specific token. A rule's identity is the first 12
|
|
18
|
+
* hex chars of SHA-256 over its *normalized* text (tokens single-spaced,
|
|
19
|
+
* comment dropped) — whitespace variants of one rule share a digest.
|
|
20
|
+
*/
|
|
21
|
+
import { Value } from '@cavelang/core';
|
|
22
|
+
import { type Ast } from '@cavelang/parser';
|
|
23
|
+
import { Pattern } from '@cavelang/query';
|
|
24
|
+
export type ConstraintOp = '=' | '!=' | '>' | '>=' | '<' | '<=';
|
|
25
|
+
export type Premise = {
|
|
26
|
+
readonly kind: 'pattern';
|
|
27
|
+
readonly pattern: Pattern.t;
|
|
28
|
+
readonly text: string;
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: 'constraint';
|
|
31
|
+
readonly variable: string;
|
|
32
|
+
readonly op: ConstraintOp;
|
|
33
|
+
readonly value: Value.t;
|
|
34
|
+
readonly text: string;
|
|
35
|
+
};
|
|
36
|
+
export type Rule = {
|
|
37
|
+
/** Normalized rule text — single-spaced tokens, comment dropped. */
|
|
38
|
+
readonly text: string;
|
|
39
|
+
/** First 12 hex chars of SHA-256 over `text` — the rule's identity. */
|
|
40
|
+
readonly digest: string;
|
|
41
|
+
readonly premises: readonly Premise[];
|
|
42
|
+
/** Conclusion template — an ordinary claim whose terms may be `?var`s. */
|
|
43
|
+
readonly conclusion: Ast.Full;
|
|
44
|
+
/** The conclusion's own `@ N%` — the rule confidence factor (§24.2). */
|
|
45
|
+
readonly conf: number;
|
|
46
|
+
/** Trailing `; comment` — a human label for reports and `--list`. */
|
|
47
|
+
readonly label?: string;
|
|
48
|
+
};
|
|
49
|
+
export type t = Rule;
|
|
50
|
+
export type Parsed = {
|
|
51
|
+
readonly ok: true;
|
|
52
|
+
readonly rule: Rule;
|
|
53
|
+
} | {
|
|
54
|
+
readonly ok: false;
|
|
55
|
+
readonly problems: readonly string[];
|
|
56
|
+
};
|
|
57
|
+
/** First 12 hex chars of SHA-256 — the digest convention of §9.5 sources. */
|
|
58
|
+
export declare const digestOf: (content: string) => string;
|
|
59
|
+
/**
|
|
60
|
+
* Positions of `needle` occurrences that sit outside `"…"` and `` `…` ``
|
|
61
|
+
* literals — `=>` or `,` inside a quoted term never split the rule.
|
|
62
|
+
* Shared with `@cavelang/cli/act`, whose action bodies split the same way
|
|
63
|
+
* (spec §25.1).
|
|
64
|
+
*/
|
|
65
|
+
export declare const topLevel: (text: string, needle: string) => number[];
|
|
66
|
+
/** @returns `true` when the line contains a top-level `=>` — a rule line. */
|
|
67
|
+
export declare const isRuleLine: (line: string) => boolean;
|
|
68
|
+
/** Single-spaced token text of one rule segment — the normalization unit. */
|
|
69
|
+
export declare const normalizeSegment: (segment: string) => string;
|
|
70
|
+
/** Variables a pattern binds — the names its slots introduce. */
|
|
71
|
+
export declare const patternVariables: (pattern: Pattern.t) => string[];
|
|
72
|
+
/**
|
|
73
|
+
* Parses one premise segment against the variables bound so far — a
|
|
74
|
+
* constraint (`?var op value`) or a CAVE-Q pattern. Shared with
|
|
75
|
+
* `@cavelang/cli/act`, whose premises are §24.1 premises verbatim (spec
|
|
76
|
+
* §25.1); action parsing passes parameters in as already-bound.
|
|
77
|
+
*/
|
|
78
|
+
export declare const parsePremise: (segment: string, bound: ReadonlySet<string>) => {
|
|
79
|
+
premise?: Premise;
|
|
80
|
+
problem?: string;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Parses one rule line. Problems are returned, never thrown — a stored
|
|
84
|
+
* rule that fails to parse is reported and skipped, mirroring the lenient
|
|
85
|
+
* ingest surfaces (spec §1.6).
|
|
86
|
+
*/
|
|
87
|
+
export declare const parse: (line: string) => Parsed;
|
|
88
|
+
//# sourceMappingURL=rule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../src/rule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAS,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAwB,KAAK,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,MAAM,MAAM,YAAY,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAA;AAI/D,MAAM,MAAM,OAAO,GACf;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzI,MAAM,MAAM,IAAI,GAAG;IACjB,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAA;IACrC,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAA;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,CAAC,GAAG,IAAI,CAAA;AAEpB,MAAM,MAAM,MAAM,GACd;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC1C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAEhE,6EAA6E;AAC7E,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,KAAG,MACsB,CAAA;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,KAAG,MAAM,EAqB7D,CAAA;AAED,6EAA6E;AAC7E,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,OACgB,CAAA;AAa1D,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG,MACC,CAAA;AAKpD,iEAAiE;AACjE,eAAO,MAAM,gBAAgB,GAAI,SAAS,OAAO,CAAC,CAAC,KAAG,MAAM,EAe3D,CAAA;AA6BD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CA4B/G,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,KAAG,MAsEpC,CAAA"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule parsing (spec §24.1) — the Draft §17.4 `=>` line, proven out:
|
|
3
|
+
*
|
|
4
|
+
* ```cave
|
|
5
|
+
* ?x NEEDS ?y, ?y NEEDS ?z => ?x NEEDS ?z
|
|
6
|
+
* ?x HAS age: ?a, ?a < 18 => ?x NEEDS guardian
|
|
7
|
+
* ?x PRECEDES ?e, ?x CONTAINS ?c => ?c CAUSE ?e @ 50%
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* The left side is a comma-separated conjunction of **premises**: CAVE-Q
|
|
11
|
+
* patterns (spec §12.1 — the same parser, so inverse verbs, `VERB+`
|
|
12
|
+
* transitive hops, `NOT`, `@ctx` and `#tag` filters all work) and value
|
|
13
|
+
* **constraints** (`?a < 18`). The right side is one ordinary CAVE claim
|
|
14
|
+
* line whose `?var` slots must be bound by pattern premises; its own
|
|
15
|
+
* metadata rides along, and its `@ N%` is the rule's confidence factor.
|
|
16
|
+
*
|
|
17
|
+
* `=>` is the only rule-specific token. A rule's identity is the first 12
|
|
18
|
+
* hex chars of SHA-256 over its *normalized* text (tokens single-spaced,
|
|
19
|
+
* comment dropped) — whitespace variants of one rule share a digest.
|
|
20
|
+
*/
|
|
21
|
+
import { createHash } from 'node:crypto';
|
|
22
|
+
import { Claim, Value } from '@cavelang/core';
|
|
23
|
+
import { parseDocument, Token } from '@cavelang/parser';
|
|
24
|
+
import { Pattern } from '@cavelang/query';
|
|
25
|
+
const constraintOps = ['>=', '<=', '!=', '=', '>', '<'];
|
|
26
|
+
/** First 12 hex chars of SHA-256 — the digest convention of §9.5 sources. */
|
|
27
|
+
export const digestOf = (content) => createHash('sha256').update(content).digest('hex').slice(0, 12);
|
|
28
|
+
/**
|
|
29
|
+
* Positions of `needle` occurrences that sit outside `"…"` and `` `…` ``
|
|
30
|
+
* literals — `=>` or `,` inside a quoted term never split the rule.
|
|
31
|
+
* Shared with `@cavelang/cli/act`, whose action bodies split the same way
|
|
32
|
+
* (spec §25.1).
|
|
33
|
+
*/
|
|
34
|
+
export const topLevel = (text, needle) => {
|
|
35
|
+
const positions = [];
|
|
36
|
+
let quote;
|
|
37
|
+
for (let i = 0; i < text.length; i++) {
|
|
38
|
+
const char = text[i];
|
|
39
|
+
if (quote !== undefined) {
|
|
40
|
+
if (char === quote) {
|
|
41
|
+
quote = undefined;
|
|
42
|
+
}
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (char === '"' || char === '`') {
|
|
46
|
+
quote = char;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (text.startsWith(needle, i)) {
|
|
50
|
+
positions.push(i);
|
|
51
|
+
i += needle.length - 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return positions;
|
|
55
|
+
};
|
|
56
|
+
/** @returns `true` when the line contains a top-level `=>` — a rule line. */
|
|
57
|
+
export const isRuleLine = (line) => topLevel(Token.splitComment(line).head, '=>').length > 0;
|
|
58
|
+
const formatToken = (token) => {
|
|
59
|
+
switch (token.kind) {
|
|
60
|
+
case 'text':
|
|
61
|
+
return `"${token.text}"`;
|
|
62
|
+
case 'code':
|
|
63
|
+
return `\`${token.text}\``;
|
|
64
|
+
default:
|
|
65
|
+
return token.text;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
/** Single-spaced token text of one rule segment — the normalization unit. */
|
|
69
|
+
export const normalizeSegment = (segment) => Token.tokenize(segment).map(formatToken).join(' ');
|
|
70
|
+
const isVariableToken = (text) => text.startsWith('?') && text.length > 1;
|
|
71
|
+
/** Variables a pattern binds — the names its slots introduce. */
|
|
72
|
+
export const patternVariables = (pattern) => {
|
|
73
|
+
const names = [];
|
|
74
|
+
if (pattern.subject.kind === 'var') {
|
|
75
|
+
names.push(pattern.subject.name);
|
|
76
|
+
}
|
|
77
|
+
if (pattern.verb.kind === 'var') {
|
|
78
|
+
names.push(pattern.verb.name);
|
|
79
|
+
}
|
|
80
|
+
if (pattern.payload.kind === 'object' && pattern.payload.object.kind === 'var') {
|
|
81
|
+
names.push(pattern.payload.object.name);
|
|
82
|
+
}
|
|
83
|
+
if (pattern.payload.kind === 'attribute' && pattern.payload.value.kind === 'var') {
|
|
84
|
+
names.push(pattern.payload.value.name);
|
|
85
|
+
}
|
|
86
|
+
return names;
|
|
87
|
+
};
|
|
88
|
+
/** Variables the conclusion template references (subject/object/value slots). */
|
|
89
|
+
const conclusionVariables = (conclusion) => {
|
|
90
|
+
const names = [];
|
|
91
|
+
const term = (candidate) => {
|
|
92
|
+
if (candidate.kind === 'entity' && isVariableToken(candidate.text)) {
|
|
93
|
+
names.push(candidate.text.slice(1));
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
term(conclusion.subject);
|
|
97
|
+
switch (conclusion.payload.kind) {
|
|
98
|
+
case 'relation':
|
|
99
|
+
term(conclusion.payload.object);
|
|
100
|
+
break;
|
|
101
|
+
case 'attribute':
|
|
102
|
+
case 'metric': {
|
|
103
|
+
const value = conclusion.payload.value;
|
|
104
|
+
if (value.kind === 'atom' && isVariableToken(value.raw)) {
|
|
105
|
+
names.push(value.raw.slice(1));
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
default:
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
return names;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Parses one premise segment against the variables bound so far — a
|
|
116
|
+
* constraint (`?var op value`) or a CAVE-Q pattern. Shared with
|
|
117
|
+
* `@cavelang/cli/act`, whose premises are §24.1 premises verbatim (spec
|
|
118
|
+
* §25.1); action parsing passes parameters in as already-bound.
|
|
119
|
+
*/
|
|
120
|
+
export const parsePremise = (segment, bound) => {
|
|
121
|
+
const text = normalizeSegment(segment);
|
|
122
|
+
if (text === '') {
|
|
123
|
+
return { problem: 'empty premise — remove the extra comma' };
|
|
124
|
+
}
|
|
125
|
+
const tokens = Token.tokenize(segment);
|
|
126
|
+
const [first, second, ...rest] = tokens;
|
|
127
|
+
// A constraint is `?var op value` — no CAVE-Q pattern puts an operator
|
|
128
|
+
// symbol in verb position, so the shapes never collide.
|
|
129
|
+
if (first?.kind === 'word' && isVariableToken(first.text) &&
|
|
130
|
+
second?.kind === 'word' && constraintOps.includes(second.text)) {
|
|
131
|
+
if (rest.length === 0) {
|
|
132
|
+
return { problem: `constraint ${JSON.stringify(text)} is missing a value` };
|
|
133
|
+
}
|
|
134
|
+
const variable = first.text.slice(1);
|
|
135
|
+
if (!bound.has(variable)) {
|
|
136
|
+
return { problem: `constraint on ?${variable} before any pattern premise binds it — reorder the premises` };
|
|
137
|
+
}
|
|
138
|
+
const value = Value.parse(rest.map(token => token.text).join(' '));
|
|
139
|
+
return { premise: { kind: 'constraint', variable, op: second.text, value, text } };
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
return { premise: { kind: 'pattern', pattern: Pattern.parse(segment), text } };
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return { problem: error instanceof Error ? error.message : String(error) };
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Parses one rule line. Problems are returned, never thrown — a stored
|
|
150
|
+
* rule that fails to parse is reported and skipped, mirroring the lenient
|
|
151
|
+
* ingest surfaces (spec §1.6).
|
|
152
|
+
*/
|
|
153
|
+
export const parse = (line) => {
|
|
154
|
+
const problems = [];
|
|
155
|
+
const { head, comment } = Token.splitComment(line);
|
|
156
|
+
const arrows = topLevel(head, '=>');
|
|
157
|
+
if (arrows.length === 0) {
|
|
158
|
+
return { ok: false, problems: ['not a rule — no top-level "=>" (spec §24.1)'] };
|
|
159
|
+
}
|
|
160
|
+
if (arrows.length > 1) {
|
|
161
|
+
return { ok: false, problems: ['a rule has exactly one "=>" (spec §24.1)'] };
|
|
162
|
+
}
|
|
163
|
+
const leftText = head.slice(0, arrows[0]);
|
|
164
|
+
const rightText = head.slice(arrows[0] + 2);
|
|
165
|
+
const premises = [];
|
|
166
|
+
const bound = new Set();
|
|
167
|
+
let cursor = 0;
|
|
168
|
+
const segments = [];
|
|
169
|
+
for (const at of topLevel(leftText, ',')) {
|
|
170
|
+
segments.push(leftText.slice(cursor, at));
|
|
171
|
+
cursor = at + 1;
|
|
172
|
+
}
|
|
173
|
+
segments.push(leftText.slice(cursor));
|
|
174
|
+
for (const segment of segments) {
|
|
175
|
+
const { premise, problem } = parsePremise(segment, bound);
|
|
176
|
+
if (problem !== undefined) {
|
|
177
|
+
problems.push(problem);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
premises.push(premise);
|
|
181
|
+
if (premise.kind === 'pattern') {
|
|
182
|
+
patternVariables(premise.pattern).forEach(name => bound.add(name));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (!premises.some(premise => premise.kind === 'pattern')) {
|
|
186
|
+
problems.push('a rule needs at least one pattern premise (spec §24.1)');
|
|
187
|
+
}
|
|
188
|
+
const conclusionText = normalizeSegment(rightText);
|
|
189
|
+
const document = parseDocument(conclusionText);
|
|
190
|
+
const claimLine = document.lines.find(entry => entry.kind === 'claim');
|
|
191
|
+
if (document.diagnostics.length > 0 || claimLine === undefined || claimLine.kind !== 'claim') {
|
|
192
|
+
problems.push(`cannot parse conclusion ${JSON.stringify(conclusionText)} as a claim` +
|
|
193
|
+
document.diagnostics.map(diagnostic => ` — ${diagnostic.message}`).join(''));
|
|
194
|
+
return { ok: false, problems };
|
|
195
|
+
}
|
|
196
|
+
const conclusion = claimLine.claim;
|
|
197
|
+
if (Token.tokenize(rightText).some(token => token.kind === 'word' && token.text === '_')) {
|
|
198
|
+
problems.push('conclusion slots must be bound — "_" is not allowed on the right side (spec §24.1)');
|
|
199
|
+
}
|
|
200
|
+
for (const name of conclusionVariables(conclusion)) {
|
|
201
|
+
if (!bound.has(name)) {
|
|
202
|
+
problems.push(`conclusion variable ?${name} is not bound by any pattern premise (spec §24.1)`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (problems.length > 0) {
|
|
206
|
+
return { ok: false, problems };
|
|
207
|
+
}
|
|
208
|
+
const text = `${premises.map(premise => premise.text).join(', ')} => ${conclusionText}`;
|
|
209
|
+
return {
|
|
210
|
+
ok: true,
|
|
211
|
+
rule: {
|
|
212
|
+
text,
|
|
213
|
+
digest: digestOf(text),
|
|
214
|
+
premises,
|
|
215
|
+
conclusion,
|
|
216
|
+
conf: conclusion.meta.conf ?? 1,
|
|
217
|
+
...comment === undefined ? {} : { label: comment }
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule.js","sourceRoot":"","sources":["../../src/rule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge health checks (spec §20).
|
|
3
|
+
*
|
|
4
|
+
* Everything here is a *read* over a store: expectations come from current
|
|
5
|
+
* positive `EXPECTS` claims (§20.1), targets bind through the `EXTENDS`
|
|
6
|
+
* taxonomy, and the report (§20.2) lists shape violations, stale beliefs,
|
|
7
|
+
* review candidates, alias disagreements and coverage stats. Nothing is
|
|
8
|
+
* written — enforcement is the opt-in gate in `gate.ts` (§20.3).
|
|
9
|
+
*/
|
|
10
|
+
import type { Row, Store } from '@cavelang/store';
|
|
11
|
+
/** One in-band shape declaration — `type EXPECTS name` (spec §20.1). */
|
|
12
|
+
export type Expectation = {
|
|
13
|
+
/** The type entity the shape targets. */
|
|
14
|
+
readonly type: string;
|
|
15
|
+
/** UPPERCASE object → relation expectation; otherwise attribute. */
|
|
16
|
+
readonly kind: 'attribute' | 'relation';
|
|
17
|
+
/** Expected attribute name or verb. */
|
|
18
|
+
readonly name: string;
|
|
19
|
+
/** `some` preserves the original one-or-more presence check; `one` requires exactly one current value. */
|
|
20
|
+
readonly cardinality: 'some' | 'one';
|
|
21
|
+
/** Exact normalized unit required on attribute values; absent means units are unconstrained. */
|
|
22
|
+
readonly unit?: string;
|
|
23
|
+
/** The declaring row. */
|
|
24
|
+
readonly row: Row.t;
|
|
25
|
+
};
|
|
26
|
+
/** One unsatisfied (instance, expectation) pair (spec §20.2). */
|
|
27
|
+
export type Violation = {
|
|
28
|
+
readonly entity: string;
|
|
29
|
+
/** The type the entity `IS`-ed into — `expectation.type` or an `EXTENDS+` descendant. */
|
|
30
|
+
readonly via: string;
|
|
31
|
+
readonly expectation: Expectation;
|
|
32
|
+
/** Number of current positive values or relation endpoints observed in the expected slot. */
|
|
33
|
+
readonly actualCount: number;
|
|
34
|
+
/** Distinct normalized units observed on attribute values; `null` denotes no unit. */
|
|
35
|
+
readonly actualUnits: readonly (string | null)[];
|
|
36
|
+
};
|
|
37
|
+
/** A current belief older than the staleness horizon (spec §20.2). */
|
|
38
|
+
export type Stale = {
|
|
39
|
+
readonly row: Row.t;
|
|
40
|
+
readonly ageDays: number;
|
|
41
|
+
};
|
|
42
|
+
/** A cross-series conflict inside one alias closure group (spec §20.2). */
|
|
43
|
+
export type Disagreement = {
|
|
44
|
+
/** `value`: same verb+attribute, different values. `polarity`: same verb+object, asserted and negated. */
|
|
45
|
+
readonly kind: 'value' | 'polarity';
|
|
46
|
+
/** What the series disagree about — `HAS version` / `IS production`. */
|
|
47
|
+
readonly about: string;
|
|
48
|
+
/** The aliased names carrying the disagreeing series, sorted. */
|
|
49
|
+
readonly entities: readonly string[];
|
|
50
|
+
readonly rows: readonly Row.t[];
|
|
51
|
+
};
|
|
52
|
+
/** Aggregate knowledge-quality stats — the §17.6 precursor (spec §20.2). */
|
|
53
|
+
export type Coverage = {
|
|
54
|
+
/** All appended rows. */
|
|
55
|
+
readonly rows: number;
|
|
56
|
+
/** Distinct claim keys — facts with a belief series. */
|
|
57
|
+
readonly facts: number;
|
|
58
|
+
/** Current positive beliefs (`conf > 0`, not negated). */
|
|
59
|
+
readonly current: number;
|
|
60
|
+
/** Facts whose current belief is retracted (`conf = 0`). */
|
|
61
|
+
readonly retracted: number;
|
|
62
|
+
/** Current negative facts (`VERB NOT` at `conf > 0`). */
|
|
63
|
+
readonly negated: number;
|
|
64
|
+
/** Mean confidence over current believed rows, `null` on an empty store. */
|
|
65
|
+
readonly averageConfidence: null | number;
|
|
66
|
+
/** Current believed rows below `conf 0.3`. */
|
|
67
|
+
readonly lowConfidence: number;
|
|
68
|
+
/** Distinct entity names in current believed claims (negated included). */
|
|
69
|
+
readonly entities: number;
|
|
70
|
+
/** Entities carrying a current positive `IS` claim. */
|
|
71
|
+
readonly typedEntities: number;
|
|
72
|
+
readonly expectations: number;
|
|
73
|
+
/** Distinct entities targeted by at least one expectation. */
|
|
74
|
+
readonly instances: number;
|
|
75
|
+
/** (instance, expectation) pairs checked. */
|
|
76
|
+
readonly checks: number;
|
|
77
|
+
readonly satisfied: number;
|
|
78
|
+
};
|
|
79
|
+
export type Report = {
|
|
80
|
+
readonly expectations: readonly Expectation[];
|
|
81
|
+
readonly violations: readonly Violation[];
|
|
82
|
+
readonly stale: readonly Stale[];
|
|
83
|
+
readonly review: readonly Row.t[];
|
|
84
|
+
readonly disagreements: readonly Disagreement[];
|
|
85
|
+
readonly coverage: Coverage;
|
|
86
|
+
};
|
|
87
|
+
export type Options = {
|
|
88
|
+
/** Staleness horizon in days (spec §20.2), default {@link defaultStaleDays}. */
|
|
89
|
+
readonly staleDays?: number;
|
|
90
|
+
/** Clock, injectable for tests. */
|
|
91
|
+
readonly now?: () => number;
|
|
92
|
+
};
|
|
93
|
+
export declare const defaultStaleDays = 90;
|
|
94
|
+
/**
|
|
95
|
+
* Current positive `EXPECTS` declarations (spec §20.1), oldest first.
|
|
96
|
+
* Qualifier condition rows never declare, mirroring the registry's
|
|
97
|
+
* treatment of in-band declarations; verb-token and literal subjects are
|
|
98
|
+
* not types.
|
|
99
|
+
*/
|
|
100
|
+
export declare const expectations: (store: Store) => Expectation[];
|
|
101
|
+
/** Shape evaluation — expectations, targets and violations in one pass. */
|
|
102
|
+
export type Evaluation = {
|
|
103
|
+
readonly expectations: readonly Expectation[];
|
|
104
|
+
readonly violations: readonly Violation[];
|
|
105
|
+
/** Distinct entities targeted by at least one expectation. */
|
|
106
|
+
readonly instances: number;
|
|
107
|
+
/** (instance, expectation) pairs checked. */
|
|
108
|
+
readonly checks: number;
|
|
109
|
+
};
|
|
110
|
+
/** Evaluates every declared expectation against its instances (spec §20.2). */
|
|
111
|
+
export declare const evaluate: (store: Store) => Evaluation;
|
|
112
|
+
/**
|
|
113
|
+
* The knowledge-health report (spec §20.2): shape violations, stale
|
|
114
|
+
* beliefs, review candidates (`conf 0.3–0.7`, §13.5), alias disagreements
|
|
115
|
+
* and coverage. Violations are the failing section; the rest is advisory.
|
|
116
|
+
*/
|
|
117
|
+
export declare const check: (store: Store, options?: Options) => Report;
|
|
118
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/check.ts"],"names":[],"mappings":"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"}
|